🐈

Claude Codeを使ってPR を"安全に"自動生成する

に公開

TL;DR

  • PR作成をLLMに任せることで開発フローを高速化できる一方で、LLMの出力のばらつきがリスクになると考えました。

  • LLMにPR作成を全て任せることによるリスクを回避するため、PR作成を安全に行うスクリプトを作成しました。

  • Claude Codeにスクリプトを登録し、/ai-pr-draft コマンドで即座に実行できるようにしました。

  • リポジトリ: https://github.com/taimo3810/ai-pr-draft-tool


背景

  • Devin、Cursor、Claude Code などの AI コーディングツールの登場により、多くのプルリクエスト(PR)作成が短時間でできるようになってきました。コードディングだけでなく、PR の作成も AI に任せたいと感じる場面が増えてきました。

  • しかし、これらのツールに使われている Claude のような LLM(大規模言語モデル)は、同じ入力に対しても毎回同じ出力を返すとは限らず、微妙に異なる PR 文を生成したり、意図しない挙動(例:誤ったマージ先ブランチの選択、曖昧なタイトルや説明など)をすることがあります。100 回中 1 回でもミスが起きると、PR 作成においては十分にリスクだなと感じています。

そのリスクを最小化するために、安全なPR自動生成を提案するための方法を考えてみました。


AIを活用して安全にPRを自動生成する方法を考える

安全を実現するための基本方針

AIを活用したPR自動生成の仕組みを構築するにあたり、以下の基本方針を定めました 。

  1. LLMには「PR文・タイトルの生成」だけを任せる
  2. 定型作業はコマンド実行で行う

スクリプト化

この基本方針に基づき、PR生成のワークフローをスクリプト化しました。

LLM活用のポイント:

  1. コミットログ・差分をプロンプトに埋め込み ⇒ Claude が変更意図を把握
  2. 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の活用部分について

プロンプトの構成

  1. リポジトリ情報 : opt-tech/awesome-repo など
  2. コミットログ : git log で抜粋
  3. 差分 : git diff 最大 1,000 行
  4. 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