Claude Codeを使ってPR を"安全に"自動生成する
TL;DR
-
PR作成をLLMに任せることで開発フローを高速化できる一方で、LLMの出力のばらつきがリスクになると考えました。
-
LLMにPR作成を全て任せることによるリスクを回避するため、PR作成を安全に行うスクリプトを作成しました。
-
Claude Codeにスクリプトを登録し、
/ai-pr-draft
コマンドで即座に実行できるようにしました。
背景
-
Devin、Cursor、Claude Code などの AI コーディングツールの登場により、多くのプルリクエスト(PR)作成が短時間でできるようになってきました。コードディングだけでなく、PR の作成も AI に任せたいと感じる場面が増えてきました。
-
しかし、これらのツールに使われている Claude のような LLM(大規模言語モデル)は、同じ入力に対しても毎回同じ出力を返すとは限らず、微妙に異なる PR 文を生成したり、意図しない挙動(例:誤ったマージ先ブランチの選択、曖昧なタイトルや説明など)をすることがあります。100 回中 1 回でもミスが起きると、PR 作成においては十分にリスクだなと感じています。
そのリスクを最小化するために、安全なPR自動生成を提案するための方法を考えてみました。
AIを活用して安全にPRを自動生成する方法を考える
安全を実現するための基本方針
AIを活用したPR自動生成の仕組みを構築するにあたり、以下の基本方針を定めました 。
- LLMには「PR文・タイトルの生成」だけを任せる
- 定型作業はコマンド実行で行う
スクリプト化
この基本方針に基づき、PR生成のワークフローをスクリプト化しました。
LLM活用のポイント:
- コミットログ・差分をプロンプトに埋め込み ⇒ Claude が変更意図を把握
- Claude から JSON で
{ title, body }
を受け取る
# 1. 直近コミット & diff を取得
COMMITS=$(git log "$BASE..$HEAD" --pretty=format:"- %s (%an, %ad)" --date=short | jq -Rs '.')
DIFF=$(git diff "$BASE..$HEAD" | head -1000 | jq -Rs '.')
# 2. PR テンプレがあれば読み込み
TPL_CONTENT=$(cat .github/PULL_REQUEST_TEMPLATE.md 2>/dev/null || echo "")
# 3. Claude 用プロンプトを生成
PROMPT=$(cat <<EOF
あなたは日本語で Conventional Commits 準拠の PR を作成するシニアエンジニアです…
EOF
)
# 4. Claude CLI へ送信し JSON を取得
CLAUDE_RESP=$(claude -p "$PROMPT" --output-format json)
# 5. jq / Python / 正規表現で title, body を抽出(多重フェイルセーフ)
TITLE=$(echo "$CLAUDE_RESP" | jq -r '.title')
BODY=$(echo "$CLAUDE_RESP" | jq -r '.body')
# 6. GitHub へ push → Draft PR 作成
git push -u origin "$HEAD"
gh pr create --draft --title "$TITLE" --body "$BODY" --base "$BASE" --head "$HEAD"
見やすさのため、チェック系(依存ツール確認や保護ブランチガード、JSON バリデーション)のロジックは省略しています。
実際のフルスクリプトは ai-pr-draft.sh で公開しています。
Claude Codeの活用部分について
プロンプトの構成
-
リポジトリ情報 :
opt-tech/awesome-repo
など -
コミットログ :
git log
で抜粋 -
差分 :
git diff
最大 1,000 行 -
PR テンプレ :
.github/PULL_REQUEST_TEMPLATE.md
(任意)
送信コマンド
claude -p "$PROMPT" --output-format json
期待される JSON
{
"title": "feat: ユーザー一覧ページに検索機能を追加",
"body": "## 概要 (Overview)\n\nこのPRでは…\n\n## 変更の種類 (Type of change)\n\n- [x] 新機能追加…"
}
Claude からは 1 行 JSON かつコードフェンス付きで返すように指示し、
改行は \n
でエスケープさせることで整形崩れを防ぎます。
実際に生成されたPRの例
実際に自動生成されたPRのサンプルです。
テンプレートに基づいて記載してくれるので、このPRの実装内容もわかりやすいです。
URL: https://github.com/taimo3810/ai-pr-draft-tool/pull/5
Claude Codeで使えるようにする
Claude Code上で毎回スクリプト実行してと命令するのはめんどくさいので、コマンド化もしてみました。
/ai-pr-draft
と入力するだけで Draft PR を生成できるようにしています。
# Command: /ai-pr-draft
# Purpose: AI-powered Pull Request Draft Creation
## Command Execution
- **Execute**: immediate
- **Purpose**: "Create an AI-generated draft PR for the current branch using Japanese prompts"
- **Legend**: Generated based on symbols used in command
## Examples
`/ai-pr-draft`
> Executes `./ai-pr-draft.sh` to create a new draft pull request with Japanese AI prompts.
`/ai-pr-draft --debug`
> Executes `DEBUG=1 ./ai-pr-draft-ja.sh` to run the script in debug mode.
## Core Operation
This command's only function is to execute the `ai-pr-draft-ja.sh` script.
All logic for PR creation, AI communication, and git operations is contained within the script itself. Please refer to the `ai-pr-draft-ja.sh` file for implementation details.
This Japanese version uses Japanese prompts for Claude AI and searches for Japanese PR templates (`PULL_REQUEST_TEMPLATE_JA.md`).
## Flags
### `--debug`
- **Purpose**: Enables debug mode for the `ai-pr-draft-ja.sh` script.
- **Action**: Sets the `DEBUG=1` environment variable before executing the script.
Discussion