はじめに
こんにちは!今回は、PR(プルリクエスト)作成の自動化し、作業時間を5-10分から30秒に短縮した話を共有します。
GitHub CLIとClaude APIを組み合わせることで、コマンド一発で、AIがPRタイトルと本文を自動生成してくれる仕組みを実装しました。
この記事で得られること
- 🚀 Claude APIを使ったPR自動生成の実装方法
- 🤖 Cursor AIとの連携テクニック
- 📋 プロジェクト固有ルールをAIに反映させる方法
対象読者
- PR作成を効率化したい開発者
- AI活用に興味がある方
- チーム開発の生産性を向上させたい方
解決したかった課題
従来のPR作成フロー
所要時間: 10-15分/PR ⏱️
課題
-
時間がかかる
- タイトルや本文を毎回考えるのが面倒
- 変更内容を言語化するのに時間がかかる
-
品質のばらつき
- PRの説明が不十分になりがち
- レビュー観点の漏れが発生
-
心理的ハードル
- 「PRを作るのが面倒」という理由で大きなPRになりがち
- 小さなPRを頻繁に作る文化が育ちにくい
理想のフロー
# コード変更後...
git add .
git commit -m "feat: add new feature"
git push -u origin feature/new-feature
# これだけ!
npm run pr
# ✅ AIがPRを自動作成
# ✅ 所要時間: 30秒
実装した機能
PR自動生成スクリプトの実行例
$ npm run pr
🚀 プルリクエスト自動作成スクリプト
📌 現在のブランチ: feature/test-component
🔍 リモートブランチを確認中...
✅ リモートブランチが存在します
🔍 既存のPRを確認中...
✅ 既存のPRはありません
📊 変更差分を確認中...
✅ 変更差分が見つかりました
🤖 AI がPR内容を生成中...
📊 変更差分を取得中...
📋 プロジェクトルールを読み込み中...
🤖 AI がPR内容を生成中...
✅ PR内容の生成が完了しました
📝 タイトル:
feat: 🧩 タイトルとカウントを表示するTestComponentの追加
📄 本文プレビュー:
## 変更内容
- テスト用の新しいReactコンポーネント `TestComponent` を追加
- タイトルとカウントを表示するシンプルなUIを実装...
📝 プルリクエストを作成中...
✅ プルリクエストの作成が完了しました!
📎 以下のコマンドでPRを確認できます:
gh pr view --web
自動生成されたPR
実際にAIが生成したPR本文:
## 変更内容
- テスト用の新しいReactコンポーネント `TestComponent` を追加
- タイトルとカウントを表示するシンプルなUIを実装
## 変更の背景・目的
開発およびテストでの再利用可能なコンポーネントが必要だったため、
基本的な表示機能を持つコンポーネントを作成しました。
このコンポーネントは今後の機能開発の基礎としても活用できます。
## 実装の詳細
- FCタイプを使用したTypescript Functional Componentとして実装
- 明示的なProps型定義(`TestComponentProps`インターフェース)
- Tailwind CSSを活用したスタイリング
- 適切なJSDocコメントを追加
## テスト内容
- 様々なタイトルとカウント値でのレンダリングを確認
- レスポンシブデザインの確認
- 今後の課題: コンポーネントの単体テストの追加
## 関連Issue
Closes #5
## チェックリスト
- [x] コーディング規約に準拠している
- [x] TypeScriptの型定義が適切
- [x] コンポーネント名がPascalCaseで定義されている
- [x] Props名が命名規則に従っている
- [x] UIのアクセシビリティを考慮している
- [x] 不要なコンソールログが含まれていない
- ✅ 変更内容を正確に理解
- ✅ プロジェクトのコーディング規約を反映
- ✅ 具体的なレビュー観点を列挙
- ✅ 構造化された読みやすい本文
技術選定とアーキテクチャ
使用技術スタック
| 技術 | 用途 |
|---|---|
| Claude API | PR内容の生成 |
| GitHub CLI | PR作成 |
| TypeScript | AI生成スクリプト |
| Bash | メインスクリプト |
システムアーキテクチャ
ディレクトリ構成
Next.js(v16)の場合
app/
├── scripts/
│ ├── create-pr.sh # メインスクリプト
│ ├── generate-pr-content.ts # AI生成ロジック
├── .cursor/
│ └── rules/
│ ├── coding-standards.md # コーディング規約
│ └── code-review.md # レビュー基準
├── .env.local # APIキー
└── package.json # "pr" スクリプト定義
実装の詳細
1. メインスクリプト: create-pr.sh
実行条件のチェック
#!/bin/bash
set -e # エラー時に終了
# 1. 現在のブランチを取得
CURRENT_BRANCH=$(git branch --show-current)
# 2. mainブランチかチェック
if [ "$CURRENT_BRANCH" = "main" ] || [ "$CURRENT_BRANCH" = "master" ]; then
echo "❌ エラー: mainブランチでは実行できません"
echo " feature ブランチを作成してから実行してください"
exit 1
fi
# 3. リモートブランチの存在確認
if ! git ls-remote --heads origin "$CURRENT_BRANCH" | grep -q "$CURRENT_BRANCH"; then
echo "❌ エラー: リモートブランチが存在しません"
echo " git push -u origin $CURRENT_BRANCH"
exit 1
fi
# 4. 既存PRの確認
EXISTING_PR=$(gh pr list --head "$CURRENT_BRANCH" --base main --state open --json number --jq '.[0].number')
if [ -n "$EXISTING_PR" ]; then
echo "❌ エラー: 既にPRが存在します (PR #$EXISTING_PR)"
exit 1
fi
ポイント:
- 人為的ミスを防ぐための3重チェック
- わかりやすいエラーメッセージと解決策の提示
AI生成スクリプトの呼び出し
# AI によるPR内容生成
PR_OUTPUT=$(npx tsx scripts/generate-pr-content.ts 2>&1)
# JSON部分を抽出
PR_JSON=$(echo "$PR_OUTPUT" | sed -n '/__PR_CONTENT_START__/,/__PR_CONTENT_END__/p' | grep -v '__PR_CONTENT')
# title と body を抽出
PR_TITLE=$(echo "$PR_JSON" | jq -r '.title')
PR_BODY=$(echo "$PR_JSON" | jq -r '.body')
# PRの作成
gh pr create \
--base main \
--head "$CURRENT_BRANCH" \
--title "$PR_TITLE" \
--body "$PR_BODY" \
--draft
2. AI生成スクリプト: generate-pr-content.ts
プロジェクトルールの読み込み
// .cursor/rules/ からコーディング規約とレビュー基準を読み込む
const rulesDir = path.join(process.cwd(), ".cursor/rules");
const codingStandards = fs.readFileSync(
path.join(rulesDir, "coding-standards.md"),
"utf-8"
);
const codeReview = fs.readFileSync(
path.join(rulesDir, "code-review.md"),
"utf-8"
);
重要なポイント:
プロジェクト固有のルールをAIに渡すことで、チーム独自の規約やレビュー観点を反映したPRを生成できます。
変更差分とコミット情報の取得
// git diffで変更差分を取得
const diff = execSync("git diff origin/main...HEAD", {
encoding: "utf-8",
maxBuffer: 10 * 1024 * 1024, // 10MB
});
// コミットメッセージを取得
const commits = execSync('git log origin/main..HEAD --pretty=format:"%s"', {
encoding: "utf-8",
});
Claude APIの呼び出し
import Anthropic from "@anthropic-ai/sdk";
const client = new Anthropic({
apiKey: process.env.ANTHROPIC_API_KEY,
});
const message = await client.messages.create({
model: "claude-3-7-sonnet-20250219",
max_tokens: 2048,
messages: [
{
role: "user",
content: `あなたはシニアエンジニアとして、git diffからプルリクエストのタイトルと本文を生成してください。
【プロジェクトのコーディング規約】
${codingStandards}
【プロジェクトのコードレビュー基準】
${codeReview}
【コミットメッセージ】
${commits}
【変更差分(git diff)】
${diff.slice(0, 50000)}
以下の要件に従ってください:
1. タイトルは簡潔で説明的に(50文字以内)
2. 本文は以下の構造で:
- ## 変更内容(何を変更したか)
- ## 変更の背景・目的(なぜ変更したか)
- ## 実装の詳細(どのように実装したか)
- ## テスト内容(どうテストしたか)
- ## 関連Issue(Closes #[番号])
- ## チェックリスト(レビュー観点)
必ず以下のJSON形式で返してください:
{
"title": "タイトル",
"body": "本文(Markdown形式)"
}`,
},
],
});
ポイント:
- プロジェクトルールを明示的に指示
- 構造化された本文フォーマットを要求
- JSON形式で返却させることでパースしやすく
レスポンスの解析
const content = message.content[0];
const jsonMatch = content.text.match(/\{[\s\S]*\}/);
const prContent = JSON.parse(jsonMatch[0]);
console.log("__PR_CONTENT_START__");
console.log(JSON.stringify(prContent));
console.log("__PR_CONTENT_END__");
3. package.json への追加
{
"scripts": {
"pr": "bash scripts/create-pr.sh"
},
"devDependencies": {
"@anthropic-ai/sdk": "^0.69.0",
"dotenv": "^17.2.3",
"tsx": "^4.20.6"
}
}
ポイント3: プロジェクトルールの活用
課題
汎用的なAIでは、プロジェクト固有の規約を反映できない。
解決策
.cursor/rules/ の内容をプロンプトに含める:
const codingStandards = fs.readFileSync(
".cursor/rules/coding-standards.md",
"utf-8"
);
const codeReview = fs.readFileSync(".cursor/rules/code-review.md", "utf-8");
// プロンプトに含める
content: `
【プロジェクトのコーディング規約】
${codingStandards}
【プロジェクトのコードレビュー基準】
${codeReview}
...
`;
効果
生成されたPRに以下が反映される:
- ✅ TypeScript型定義の重要性
- ✅ React Hooksのルール
- ✅ Tailwind CSSの使用方法など
- ✅ プロジェクト固有のチェックリスト
実測効果
時間削減
| 項目 | 従来 | 現在 | 削減率 |
|---|---|---|---|
| PR作成時間 | 5-10分 | 30秒 | 90%削減 |
| タイトル考案 | 1分 | 0秒 | 100%削減 |
| 本文作成 | 3-5分 | 0秒 | 100%削減 |
| レビュー観点整理 | 3-5分 | 0秒 | 100%削減 |
品質向上
- ✅ PRフォーマットの統一
- ✅ レビュー観点の漏れ防止
- ✅ プロジェクト規約への準拠
- ✅ 関連Issueの自動リンク
開発文化の変化
- ✅ 小さなPRを作りやすくなった
- ✅ PR作成の心理的ハードルが下がった
- ✅ コードレビューの効率化
コスト
Claude API使用料:
- 約$0.01-0.05/PR
- 月100回実行しても$1-5程度
- 初回$5の無料クレジットで十分
ROI(投資対効果):
- 時間削減: 1PR = 5-10分節約
- 月100PR = 500-1000分(8-16時間)節約
- コスト: $1-5
- → 圧倒的にコスパが良い!
まとめ
実装して良かったこと
-
劇的な時間削減
- PR作成が10-15分 → 30秒に
- 開発フローがストレスフリーに
-
品質の向上と統一
- 一貫したPRフォーマット
- プロジェクト規約への準拠
- レビュー観点の網羅
-
開発文化の改善
- 小さなPRを作りやすくなった
- PR作成の心理的ハードルが下がった
-
チーム全体への貢献
- コードレビューの効率化
学んだこと
-
Claude APIの実力
- 想像以上に高品質な文章生成
-
プロジェクトルールの重要性
-
.cursor/rules/をAIに渡すことで、チーム固有の知識を反映できる - ドキュメント化された規約が自動化の鍵
-
-
テスト駆動の開発
- 包括的なテストで品質保証
- 異常系のテストも重要
-
モデル名の罠
- Claude APIは頻繁に更新される
- 最新のドキュメントを確認すべき
参考リンク
おわりに
PR作成の自動化は、開発者体験を改善してくれました。
コマンドからレビュアー指定できるようにしたり、ラベル追加などいろいろカスタマイズできるかと思うのでこれをベースにいろいろ拡張していけたらなと思います!
この記事が、皆さんのプロジェクトでの開発効率向上の参考になれば幸いです!
付録: トラブルシューティング
Q1: ANTHROPIC_API_KEY が設定されていません
A: .env.local ファイルを作成してAPIキーを設定してください。
echo 'ANTHROPIC_API_KEY=sk-ant-your-key' > .env.local
Q2: gh: command not found
A: GitHub CLIをインストールしてください。
brew install gh
gh auth login
Q3: モデル名の404エラー
A: 最新のモデル名を確認してください。