GitHub Issueが積み重なるのは開発チームの共通課題です。「もう対応済みでは?」「PRを作れば終わるのでは?」という issue が何十件もある状態を放置しがちです。かといって、すべてのissueを手動でトリアージするのも時間がかかります。
Claude Codeを使うと、「閉じてよいか」「小さなPRを作れるか」「人間が決めるべきか」という判断をAIに委譲できます。単純なラベル付けとは違い、関連PR・類似issue・該当コードまで調べたうえで文脈込みで判定させるのがポイントです。
カスタムスラッシュコマンドの基礎はスキル・コマンド完全ガイドを、GitHub Actionsとの連携はGitHub Actions自動化ガイドを参照してください。
AIに任せる判断 vs 人間が判断するべきこと
issue自動化で最初に考えるべきは「何をAIに任せるか」です。すべてを自動化しようとすると失敗します。
| AIが得意な判断 | 人間が判断すべきこと |
|---|---|
| 関連PRがマージ済みかどうかの事実確認 | 暗黙的な仕様変更が必要な修正 |
| コード上で問題が解消されているかの確認 | 影響範囲の見積もりが必要な変更 |
| 設定値や文言のような小規模修正の実施 | ビジネスロジックの判断が必要な実装 |
| 「重複issue」の検出 | issue の行間にある意図・背景の理解 |
| 「これは人間が決めるべき」の撤退判断 | 設計・アーキテクチャに関わる決定 |
重要なのは「わからないなら手を出さない」を明示することです。これをプロンプトに入れないと、AIは無理に判断しようとして誤った自動化を実行します。
カスタムスラッシュコマンドで /triage-issues を作る
Claude Codeのカスタムスラッシュコマンドは、.claude/commands/または~/.claude/skills/にMarkdownファイルを置くだけで作れます。チームで共有するプロジェクト向けなら.claude/commands/をGit管理します。
---
name: triage-issues
description: GitHubのopen issueをトリアージする(close/PR/保留の3択判定)
allowed-tools: Bash
---
以下の手順でopen issueをトリアージしてください。
## 判定基準(この順序で確認する)
### closeしてよいIssue
以下をすべて満たす場合、issueを閉じる:
- 関連するPRがすでにマージされている(gh pr list --search で確認)
- コードを確認して問題が解消されている(gh api / git grep で確認)
- issueのコメントで「解決した」旨の報告がある
### PRを作れるIssue
以下をすべて満たす場合、git worktreeでブランチを作ってPRを出す:
- 設定値の変更、文言修正、軽微なバグ修正レベルの変更
- 影響範囲が明確で、テストで検証できる
- 別リポジトリに同内容のPRがまだ存在しない
### 保留にするIssue(コメントだけ残す)
以下のどれかに該当する場合、コメントだけ残して撤退する:
- 仕様の解釈が必要、または複数の解釈が可能
- 影響範囲が不明確
- 設計判断が必要
- 上記判定基準のどれにも当てはまらない(迷ったら保留)
## 処理フロー
```
for each open issue:
1. gh issue view <id> --comments でissue全体を確認
2. gh pr list --search "<issue title keywords>" で関連PRを検索
3. 上記判定基準を適用
4. 対応を実施:
- close: gh issue close <id> --comment "<理由>"
- PR: git worktreeでブランチ作成 → 修正 → gh pr create
- 保留: gh issue comment <id> --body "/triage-issues: <判断理由・必要な情報>"
5. 次のissueへ
```
## 安全装置
- 一度コメントに "/triage-issues:" を含むissueは再処理しない(無限ループ防止)
- PRを作るときは必ずgit worktreeを使い、現在のブランチを汚さない
- 同内容のPRが別リポジトリに存在する場合はPR作成しない
- issueの数が多い場合は最初の10件だけ処理して結果を報告する
gh CLIで必要な情報を収集する
判断に必要な情報はすべてghコマンドで取得できます。Claude Codeから直接実行させます。
# issue一覧(open状態) gh issue list --state open --limit 50 # issueの詳細+コメント gh issue view 123 --comments # 関連PRを検索(タイトルキーワードで) gh pr list --search "fix login error" --state merged # 同じissueに対するPRが別リポジトリにないか確認 gh pr list --repo owner/other-repo --search "closes #123" # issueのコードを確認 gh api repos/owner/repo/contents/src/auth.ts | base64 -d # 類似issueを検索 gh issue list --search "login error" --state closed --limit 10
git worktreeでPRを作る(現在のブランチを汚さない)
issueのPR作成をClaude Codeに任せるとき、現在作業中のブランチを汚さないようgit worktreeを使うのが重要です。Claude Codeのセッションを維持しながら、別ディレクトリでPRを作成できます。
# 新しいworktreeを作成(別ディレクトリに新ブランチが作られる) git worktree add ../fix-issue-123 -b fix/issue-123 # worktree内で作業 cd ../fix-issue-123 # ... 修正を加える ... # テスト npm test # コミット git add -A git commit -m "fix: issue #123 - ログインエラーの修正" # PR作成(issueに紐付ける) gh pr create --title "fix: ログインエラーを修正 #123" --body "Fixes #123" --base main # worktreeの掃除 cd ../your-main-repo git worktree remove ../fix-issue-123
worktreeを使うと、Claude Codeのセッション(メインの作業ディレクトリ)に影響を与えずに並行してPRを作成できます。git worktreeの詳細はgit worktree完全ガイドを参照してください。
判断基準と撤退条件を言語化する設計論
自動化が失敗する最大の原因は、「人間が暗黙にやっている判断基準をプロンプトに書いていない」ことです。具体的な言語化のパターンを見ていきます。
判断基準の書き方
# NG例 - 何が「対応済み」かを定義していない 「対応済みのissueを閉じてください」 # NG例 - 「小さな修正」の定義がない 「小さな修正なら自動でPRを出してください」
# OK例 - 事実確認できる条件に分解する """ 以下をすべて満たす場合のみcloseする: 1. gh pr list --search で関連PRがマージ済みと確認できる 2. git grep / ファイル確認で問題箇所がコードに存在しない 3. issue本文またはコメントに「解決した」「動いた」などの確認がある → 上記3つを確認できない場合はcloseしない """ # OK例 - 「小さな修正」を具体的に定義する """ 以下のどれかに該当する場合のみPRを作る: - 設定ファイルの値変更(変更量が5行以内) - エラーメッセージ・ログ文言の修正 - コメント・ドキュメントの誤字修正 → ロジック変更が必要な場合はPRを作らない """
撤退条件の書き方
「わからないなら手を出さない」を明示するのが最も重要な安全策です。撤退条件がないと、AIは不確実な状況でも判断しようとします。
# パターン1: 迷ったら保留(最も重要) """ 上記のいずれかの判断基準に当てはまらない場合、 またはどちらか迷う場合は、issueにコメントを残して撤退する。 勝手に判断しない。 """ # パターン2: 影響範囲が不明なら止まる """ 修正の影響が1ファイル・1関数を超える可能性がある場合は、 PRを作らずにissueに調査結果をコメントして保留にする。 """ # パターン3: テストが通らなければ止まる """ 修正後にテストを実行し、失敗した場合は修正を取り消して保留にする。 「多分大丈夫」で進めない。 """ # パターン4: 同内容の作業が既存する場合は止まる """ 別リポジトリに同内容のPRや同じissueが存在する場合、 重複作業を避けるためPR作成を中止してリンクをコメントに残す。 """
AIに任せた後の検証とSlack通知
自動化を信頼するには、何をしたか・しなかったかを確認できる仕組みが必要です。
# .claude/settings.json のStop hookで通知を送る
{
"hooks": {
"Stop": [{
"type": "command",
"command": "bash -c 'INPUT=$(cat); RESULT=$(echo "$INPUT" | jq -r ".last_assistant_message"); curl -s -X POST $SLACK_WEBHOOK -H Content-Type:application/json -d "{\"text\":\"[triage-issues] $RESULT\"}"'"
}]
}
}
# triage-issues コマンドの最後に追加 以下の形式でログを出力してください: ## 処理結果サマリー - 処理したissue数: X件 - closeしたissue: #123, #456 (理由: 関連PRがマージ済み) - PRを作成したissue: #789 (PR: #101) - 保留にしたissue: #234(理由: 仕様の確認が必要), #567(理由: 影響範囲が不明) ログファイル: .claude/triage-log-YYYYMMDD.md に保存してください
段階的に始めるためのステップ
一度にすべてを自動化しようとせず、信頼できる範囲から始めるのが重要です。
| ステップ | 内容 | 判断の複雑さ |
|---|---|---|
| Step 1 | ラベルなしissueに type:/effort:/priority: ラベルを付ける | 低(分類のみ) |
| Step 2 | クローズ候補のissueに「このPRで解決済みでは?」コメントを付ける | 中(確認を促すだけ) |
| Step 3 | 明らかに対応済みのissueを自動close(条件を厳しく設定) | 中(事実確認) |
| Step 4 | 文言修正・設定変更レベルのPRを自動作成 | 高(変更を加える) |
| Step 5 | 上記をScheduled GitHub Actionsで定期実行 | —(自動化) |
Step 1〜2は「提案するだけ・変更しない」ため失敗リスクが低いです。Step 3から「実際に変更を加える」範囲に入るので、判断基準を十分に検証してから移行してください。
GitHub Actionsで定期実行させる方法はGitHub Actions自動化ガイドを参照してください。
よくある質問
/triage-issues:)を残しておき、そのマーカーが含まれているissueはスキップする処理をコマンドに追加します。gh issue listの--searchで-/triage-issues(このテキストを含まないもの)と絞り込むことで実装できます。gh issue reopenで再openできます。また、closeの際にコメントで「自動close理由」を残しておくと、誤closeに気づいたときに確認しやすくなります。ログファイルに処理記録を残すことも有効です。最初の数週間は実際にcloseする前に「closeしてよいか確認コメント」を付けるだけのモードで運用し、精度を確認してから本番のclose自動化に移行するのがおすすめです。.claude/commands/name.mdはプロジェクト固有のコマンドでGitで共有できます。~/.claude/skills/name/SKILL.mdは個人用でどのプロジェクトでも使えます。commands/はレガシー形式で、現在はskills/が推奨されています。チームで共有したいtriage-issuesはcommands/に、個人用の補助コマンドはskills/に置くのが自然な分担です。gh issue list --repo owner/repo1gh issue list --repo owner/repo2のように複数リポジトリから収集します。ただし処理数が多くなるとコンテキストウィンドウを消費するため、リポジトリ数×issue数に応じて1回の処理数を制限するか、リポジトリごとに別々に実行するのが現実的です。

