Skill
Community

tmux-pr-review-room

Install
1
Install the plugin
$
npx claudepluginhub caphtech/claude-marketplace --plugin tmux-plugin

Want just this skill?

Then install: npx claudepluginhub u/[userId]/[slug]

Description

PR番号を指定してレビュー用worktreeとtmuxレイアウトを構築する。「PRをレビューして」「PR

Tool Access

This skill is limited to using the following tools:

BashRead
Skill Content

tmux-pr-review-room

PR専用のレビュー環境をtmux上に構築する。

概要

<pr-number> → gh pr view → worktree作成 → tmuxレイアウト構築 → レビュー情報表示

前提チェック

スキル実行前に以下を確認:

  1. gitリポジトリ内か
  2. gh CLIが利用可能か
  3. tmux セッション内か($TMUX 変数の存在)— 非tmux時はPR情報の表示のみ
# 前提チェック
if ! git rev-parse --is-inside-work-tree >/dev/null 2>&1; then
  echo "Error: gitリポジトリ内で実行してください"
  exit 1
fi
if ! command -v gh >/dev/null 2>&1; then
  echo "Error: gh CLIがインストールされていません"
  exit 1
fi

メインリポジトリの特定

COMMON_DIR=$(cd "$(git rev-parse --git-common-dir)" && pwd)
ABS_GIT_DIR=$(cd "$(git rev-parse --absolute-git-dir)" && pwd)
if [ "$COMMON_DIR" != "$ABS_GIT_DIR" ]; then
  REPO_ROOT=$(dirname "$COMMON_DIR")
else
  REPO_ROOT=$(git rev-parse --show-toplevel)
fi
REPO_NAME=$(basename "$REPO_ROOT")

手順

1. PR情報の取得

PR_NUMBER="$1"  # 引数から取得。未指定なら質問する
if [ -z "$PR_NUMBER" ] || ! echo "$PR_NUMBER" | grep -qE '^[0-9]+$'; then
  echo "Error: 有効なPR番号を指定してください(例: 123)"
  exit 1
fi

# PR情報をJSON形式で取得
PR_JSON=$(gh pr view "$PR_NUMBER" --json title,headRefName,baseRefName,files,body,author,url)
PR_TITLE=$(echo "$PR_JSON" | python3 -c "import sys,json; print(json.load(sys.stdin)['title'])")
PR_BRANCH=$(echo "$PR_JSON" | python3 -c "import sys,json; print(json.load(sys.stdin)['headRefName'])")
PR_BASE=$(echo "$PR_JSON" | python3 -c "import sys,json; print(json.load(sys.stdin)['baseRefName'])")
PR_URL=$(echo "$PR_JSON" | python3 -c "import sys,json; print(json.load(sys.stdin)['url'])")

# 変更ファイル一覧
CHANGED_FILES=$(echo "$PR_JSON" | python3 -c "
import sys, json
files = json.load(sys.stdin)['files']
for f in files:
    print(f'{f[\"additions\"]:+d}/{f[\"deletions\"]:+d}\t{f[\"path\"]}')
")

2. worktreeの作成

tmux-worktreeスキルと同等のロジックでworktreeを作成する。

WORKTREE_BASE="${CLAUDE_WORKTREE_DIR:-$(dirname "$REPO_ROOT")/${REPO_NAME}.worktrees}"

# ブランチ名からworktreeパスを逆引き
find_worktree_by_branch() {
  git worktree list --porcelain | awk -v branch="$1" '
    /^worktree / { path = substr($0, 10) }
    /^branch refs\/heads\// {
      b = substr($0, 19)
      if (b == branch) { print path; exit }
    }
  '
}

EXISTING_PATH=$(find_worktree_by_branch "$PR_BRANCH")
if [ -n "$EXISTING_PATH" ]; then
  WORKTREE_PATH="$EXISTING_PATH"
else
  # slug生成
  BRANCH_HASH=$(printf '%s' "$PR_BRANCH" | shasum | cut -c1-6)
  BRANCH_SLUG=$(printf '%s' "$PR_BRANCH" | sed 's/[^A-Za-z0-9._-]/-/g; s/--*/-/g; s/^-//; s/-$//' | cut -c1-60)
  case "$BRANCH_SLUG" in
    ""|"."|"..") BRANCH_SLUG="branch" ;;
  esac
  BRANCH_SLUG="${BRANCH_SLUG}-${BRANCH_HASH}"
  WORKTREE_PATH="${WORKTREE_BASE}/${BRANCH_SLUG}"

  # 書き込み権限チェック + フォールバック
  if ! mkdir -p "${WORKTREE_BASE}" 2>/dev/null; then
    WORKTREE_BASE="${TMPDIR:-/tmp}/${REPO_NAME}.worktrees"
    WORKTREE_PATH="${WORKTREE_BASE}/${BRANCH_SLUG}"
    mkdir -p "${WORKTREE_BASE}"
  fi

  # リモートブランチをfetch
  git fetch origin "$PR_BRANCH" 2>/dev/null || true

  if git show-ref --verify --quiet "refs/heads/${PR_BRANCH}"; then
    git worktree add "${WORKTREE_PATH}" "${PR_BRANCH}"
  elif REMOTE_REF=$(git branch -r --list "*/${PR_BRANCH}" | head -1 | xargs); [ -n "$REMOTE_REF" ]; then
    git worktree add --track -b "${PR_BRANCH}" "${WORKTREE_PATH}" "$REMOTE_REF"
  else
    echo "Error: ブランチ '${PR_BRANCH}' が見つかりません"
    exit 1
  fi
fi

3. tmuxレイアウト構築

if [ -n "$TMUX" ]; then
  WINDOW_NAME="pr-${PR_NUMBER}"

  # メインpane: worktreeディレクトリで開く
  tmux new-window -n "${WINDOW_NAME}" -c "${WORKTREE_PATH}"

  # diff表示pane(下部30%)— ブランチ名を安全にエスケープ
  SAFE_BASE=$(printf '%q' "$PR_BASE")
  SAFE_HEAD=$(printf '%q' "$PR_BRANCH")
  tmux split-window -v -p 30 -c "${WORKTREE_PATH}" \
    "git diff ${SAFE_BASE}...${SAFE_HEAD} --stat; echo '---'; echo 'Press q to exit'; read"

  # メインpaneにフォーカス
  tmux select-pane -t 0
else
  echo "Worktree created: ${WORKTREE_PATH}"
  echo "cd ${WORKTREE_PATH}"
fi

4. レビュー情報の表示

tmuxレイアウト構築後、以下の情報をClaudeが表示する:

PR #<number>: <title>
URL: <url>
Branch: <head> → <base>

変更ファイル:
<additions/deletions  filepath>

レビュー推奨順序とリスク分析をClaudeが提案する。

変更ファイルのリスク分析基準:

  • 変更行数が多いファイル → 高リスク
  • 設定ファイル・マイグレーション → 高リスク
  • テストファイル → 低リスク
  • ファイルの依存関係(import先が多いファイルは影響範囲が広い)

クリーンアップ

レビュー完了後は tmux-worktree delete <branch> と同等の操作で環境を削除する。

エラーハンドリング

  • PR番号が無効: gh pr view のエラーメッセージを表示
  • ブランチ取得失敗: fetchリトライ後にエラー表示
  • tmux非実行時: worktree作成とPR情報表示のみ行う
Stats
Stars0
Forks0
Last CommitMar 5, 2026

Similar Skills