بنقرة واحدة
pr-screenshot
UI変更を含むPRで、agent-browserでスクリーンショットを撮影し、R2にアップロードしてPR本文に貼り付ける
التثبيت باستخدام Codex أو Claude انسخ هذا Prompt والصقه في Codex أو Claude أو مساعد آخر ليراجع صفحة Skill ويثبّتها لك.
القائمة
UI変更を含むPRで、agent-browserでスクリーンショットを撮影し、R2にアップロードしてPR本文に貼り付ける
التثبيت باستخدام Codex أو Claude انسخ هذا Prompt والصقه في Codex أو Claude أو مساعد آخر ليراجع صفحة Skill ويثبّتها لك.
استنادا إلى تصنيف SOC المهني
セッション履歴を根拠およびサマリとして使用し、現在の変更からきちんとした git コミットを作成する。コミット作成、コミットメッセージの準備、または staged な作業のファイナライズを依頼されたときに使用する。
PR をランディングする。コンフリクトを監視・解決し、チェックを待ち、グリーンに なったら squash-merge する。land、merge、PR を完了まで導くことを依頼された ときに使用する。
Linear と対話するためのスキル。Linear MCP サーバー(`mcp__linear__*` ツール)を 優先的に使用し、MCP でカバーされない生の GraphQL 操作(イントロスペクション、 ファイルアップロードなど)は `linear_graphql` クライアントツールにフォールバックする。
最新の origin/main を現在のローカルブランチに pull し、マージコンフリクトを 解決する(別名 update-branch)。Codex が feature ブランチを origin と同期し、 rebase ではなく merge ベースの更新を行い、コンフリクト解決のベストプラクティス に従う必要があるときに使用する。
現在のブランチの変更を origin に push し、対応する pull request を作成 または更新する。push、更新の公開、pull request の作成を依頼されたときに使用する。
コードレビュー・テストガイドラインチェック・コード品質チェックを同時実行する
| name | pr-screenshot |
| description | UI変更を含むPRで、agent-browserでスクリーンショットを撮影し、R2にアップロードしてPR本文に貼り付ける |
UI変更を含むPRのスクリーンショットを自動で撮影・アップロード・PR本文更新するスキル。
/pr-screenshot
/pr-screenshot "ホバー状態も撮って"
引数なしで実行すると、変更差分からUI変更対象ページを自動判断する。
R2の接続情報はローカル設定ファイル .claude/skills/pr-screenshot/config.local.json から読み取る(gitignore対象)。
{
"r2AccountId": "your-cloudflare-account-id",
"r2Bucket": "your-bucket-name",
"r2PublicUrl": "https://pub-xxx.r2.dev"
}
初回セットアップ: このファイルが存在しない場合、スキル実行時にユーザーに値を聞いて作成する。
SCREENSHOT_DIR=/tmp/pr-screenshots
現在のブランチとPR番号を特定する:
git branch --show-current
gh pr list --head "$(git branch --show-current)" --json number --jq '.[0].number'
git diff --name-only develop...HEAD
変更されたファイルパスから、影響を受けるUI画面を推定する:
推定ルール:
web/src/features/{feature}/ → その feature に対応するページweb/src/app/(main)/bills/ → 議案詳細ページ (/bills/{id})web/src/app/(main)/page.tsx → トップページ (/)web/src/app/(main)/kokkai/ → 国会会期ページweb/src/components/ → 影響範囲が広い。トップページ + 議案詳細を撮るadmin/src/features/bills-edit/ → admin 議案編集ページadmin/src/features/bills/ → admin 議案一覧ページweb/src/app/globals.css → トップページ + 議案詳細を撮るadmin/src/app/ 配下 → 対応する admin ページfeature名からページを特定する対応表:
bills → /bills/{id} (議案詳細)interview-config → /bills/{id}/interview (インタビューLP)interview-session → /bills/{id}/interview/chat (チャット)interview-report → /report/{reportId} (レポート)bill-difficulty → /bills/{id} (議案詳細)UIに関係しない変更のみの場合(migration, test, server-only logic等)はスキップして終了。
worktreeのパスを特定し(現在のディレクトリが worktree であることを前提)、devサーバーを起動する:
# Supabase が起動中か確認
npx supabase status 2>&1 | head -5
# シードデータを投入(新カラム等を反映)
pnpm seed
# devサーバー起動(バックグラウンド)
# web のみ: ポート3000
# admin も必要なら: ポート3001
npx dotenv -e .env -- pnpm --filter web run dev &
# admin が必要な場合:
# npx dotenv -e .env -- pnpm --filter admin run dev &
# サーバー起動待ち
sleep 8
サーバーが起動したら、使用するポートを確認する(3000が使用中なら別ポートが割り当てられる):
# 起動ログからポートを確認するか、curl で確認
curl -s -o /dev/null -w "%{http_code}" http://localhost:3000 || curl -s -o /dev/null -w "%{http_code}" http://localhost:3002
seed投入後、DBから議案IDを取得してURLを構築する:
# 公開済み議案のIDを1件取得
npx supabase db query "SELECT id::text FROM bills WHERE publish_status = 'published' LIMIT 1;"
取得したIDを使い、Step 1 で特定したページのURLリストを作る。
admin ページが対象の場合:
# admin にログインが必要(session cookie取得)
# admin は Basic Auth やメールログインが必要なので、URL直アクセスで取れない場合がある
# → admin はログインフローを agent-browser で実行してからスクショを撮る
agent-browser でモバイルビューポート (390x844) でスクリーンショットを撮る。
mkdir -p /tmp/pr-screenshots
# セッション名はPR番号を使う
SESSION="pr-${PR_NUMBER}"
# ビューポートをモバイルに設定
agent-browser --session $SESSION set viewport 390 844
# 各URLを開いてスクショ
agent-browser --session $SESSION open "$URL"
agent-browser --session $SESSION wait 3000
agent-browser --session $SESSION screenshot /tmp/pr-screenshots/screenshot-1.png
注意点:
wait 3000 で安定を待つopen がタイムアウトしたらリトライするhover してから撮るscroll down してから撮るRead ツールで画像を確認し、正しく表示されているか検証するadmin ページのログインフロー:
agent-browser --session $SESSION open "http://localhost:3001/login"
agent-browser --session $SESSION snapshot -i
# メールとパスワードを入力
agent-browser --session $SESSION fill "@eX" "admin@example.com"
agent-browser --session $SESSION fill "@eY" "admin123456"
agent-browser --session $SESSION click "@eZ" # ログインボタン
agent-browser --session $SESSION wait 3000
# ログイン後、目的のページに遷移
まず wrangler の認証状態を確認する:
npx wrangler whoami 2>&1
「Not authenticated」等のエラーが出た場合、ユーザーに ! npx wrangler login の実行を促す(ブラウザでのOAuth認証が必要なため、Claude側では実行できない)。認証が完了するまでこのステップを中断する。
config.local.json から設定を読み取ってアップロードする。
# config.local.json から値を取得(Bash の jq または Read ツールで読む)
R2_ACCOUNT_ID=$(cat .claude/skills/pr-screenshot/config.local.json | jq -r '.r2AccountId')
R2_BUCKET=$(cat .claude/skills/pr-screenshot/config.local.json | jq -r '.r2Bucket')
R2_PUBLIC_URL=$(cat .claude/skills/pr-screenshot/config.local.json | jq -r '.r2PublicUrl')
export CLOUDFLARE_ACCOUNT_ID=$R2_ACCOUNT_ID
# PR番号ベースのパスでアップロード
npx wrangler r2 object put "${R2_BUCKET}/pr-${PR_NUMBER}/screenshot-1.png" \
--file /tmp/pr-screenshots/screenshot-1.png --remote
# 複数ファイルがある場合はそれぞれアップロード
公開URLのパターン:
${R2_PUBLIC_URL}/pr-${PR_NUMBER}/screenshot-1.png
gh pr edit でPR本文を更新する。既存の本文を取得し、スクリーンショットセクションを追加/更新する。
スクリーンショットが3枚以下の場合はテーブルで横並び(33%幅):
## スクリーンショット
| 説明1 | 説明2 | 説明3 |
|:---:|:---:|:---:|
| <img src="URL1" width="250" /> | <img src="URL2" width="250" /> | <img src="URL3" width="250" /> |
4枚以上の場合は2列テーブル:
## スクリーンショット
| 説明1 | 説明2 |
|:---:|:---:|
| <img src="URL1" width="350" /> | <img src="URL2" width="350" /> |
| <img src="URL3" width="350" /> | <img src="URL4" width="350" /> |
既存のPR本文に ## スクリーンショット セクションがある場合は置換する。ない場合は ## Test plan の直前に挿入する。
# devサーバーを停止
pkill -f "next dev.*turbopack" 2>/dev/null
# 一時ファイル削除
rm -rf /tmp/pr-screenshots
agent-browser CLI がインストール済みであることnpx wrangler が認証済みであること(未認証の場合、ユーザーに ! npx wrangler login を促す)npx supabase start)unstable_cache により、seed直後でもキャッシュが効く場合がある。.next フォルダ削除 + サーバー再起動で解決するadmin@example.com / admin123456 でログインする