最近、Claude CodeよりもCodex CLIを使う機会が増えています。肌感でしかないですが、なんとなくCodex CLIの方がちゃんとしたコードを出力してくれる気がします。
しかし、Claude Codeのコマンドは便利です。Claude Codeで、CodeRabbitのレビューを自動反映するコマンドを作りましたが個人的に便利で、 /pr-fix {PRのID}
が使えなくなっているのが不便でした。
同様のことを感じている方がXにもいらっしゃったので、Codex CLIで同様のことを実現するプロンプトを作成しました。
プロンプトの内容
PRのIDは、書き換えてください。
基本的にはこの内容をコピーして、そのまま貼り付けるだけです。GraphQLはChatGPTに考えてもらいました。プルリクエストのコメントを取得しつつ、 <summary>🤖 Prompt for AI Agents</summary>
にあるものだけを対象としています。
PRのレビューコメントを解析して、AI Agents向けの指示に従ってコードを修正してください。
## 引数
PRのIDは 104
## 実行手順:
1. **PRコメント取得**
対象は現在のリポジトリです。
```bash
set -euo pipefail
PR="PRのID"
OWNER=$(gh repo view --json owner --jq .owner.login)
REPO=$(gh repo view --json name --jq .name)
OUT=.tmp/pr_${PR}_unresolved.tsv
mkdir -p .tmp
: > "$OUT"
CURSOR=""
while :; do
RESP=$(
gh api graphql \
-f owner="$OWNER" -f name="$REPO" -F number="$PR" ${CURSOR:+-F cursor="$CURSOR"} \
-f query='
query($owner:String!, $name:String!, $number:Int!, $cursor:String) {
repository(owner:$owner, name:$name) {
pullRequest(number:$number) {
reviewThreads(first:100, after:$cursor) {
pageInfo { hasNextPage endCursor }
nodes {
isResolved
comments(first:1) {
nodes { url path body }
}
}
}
}
}
}'
)
echo "$RESP" | jq -r '
(.data.repository.pullRequest.reviewThreads.nodes // [])
| map(select(.isResolved==false and (.comments.nodes | length > 0)))
| .[]
| .comments.nodes[0]
| [
.url,
(.path // "-"),
(.body | gsub("\r";" ") | gsub("\n";" ") | gsub("\t";" "))
]
| @tsv
' >> "$OUT"
HAS_NEXT=$(echo "$RESP" | jq -r '.data.repository.pullRequest.reviewThreads.pageInfo.hasNextPage')
if [ "$HAS_NEXT" != "true" ]; then break; fi
CURSOR=$(echo "$RESP" | jq -r '.data.repository.pullRequest.reviewThreads.pageInfo.endCursor')
done
echo "Saved to $OUT"
```
2. **AI Promptsを抽出**
- 取得した内容は `$OUT` のファイルにて保存されている
- コメント内の `<summary>🤖 Prompt for AI Agents</summary>` セクションを見つける
- 各セクション内の指示内容を抽出する
- ファイルパスと修正内容をマッピングする
3. **修正計画チェックリスト表示**
見つかった修正指示を以下の形式でリスト表示:
```
📋 修正予定:
□ ファイルパス: 修正内容の概要
□ ファイルパス: 修正内容の概要
...
```
4. **コード修正実行**
各AI Promptの指示に従って該当ファイルを修正:
- ファイルを読み込み
- 指示内容を解析
- 適切な修正を適用
- ファイルを保存
5. **修正完了レポート**
実施した修正を以下の形式で報告:
```
📋 修正完了レポート:
✅ ファイルパス: 実施した修正内容
✅ ファイルパス: 実施した修正内容
❌ ファイルパス: 修正に失敗した理由(あれば)
```
6. **Git操作**
```bash
git add .
git commit -m "fix: PR #{{PRのID}} のレビューコメントを反映
AI Agents prompts に基づく自動修正"
git push origin $(git rev-parse --abbrev-ref HEAD)
```
7. 不要な作業ファイルを削除
作成した $OUT ファイルは削除して
## 重要な制約:
- `<summary>🤖 Prompt for AI Agents</summary>` で始まるセクションのみを処理対象とする
- HTMLの `<details>` タグ内のコンテンツを正しく抽出する
- 複数ファイルの修正に対応する
- エラーが発生した場合も、可能な限り他の修正を続行する
- 実際にファイルを変更する前に、修正予定の概要を表示する
## 出力形式:
- 各ステップの進行状況を絵文字付きで分かりやすく表示
- 修正前にチェックリスト形式で確認
- 修正後に完了レポートを表示
- エラーがあっても処理を継続し、最終的に結果をまとめて報告
PRコメントの解析から修正・プッシュまでを一貫して実行してください。
実行例
以下は実行例です。
PRのレビューコメントを解析して、AI Agents向けの指示に従ってコードを修正してください。
## 引数
PRのIDは 104
: 省略
codex
PR 104 の未解決レビューコメントを取得し、AI向けプロンプト部分だけ抽出します。続いて修正予定のチェックリストを提示します。
✔ You approved codex to run
codex
進め方を共有します。まずPRコメントからAI向けプロンプトを抽出し、修正予定を提示します。その後に実装・コミット・プッシュまで行います。
🧭 進捗
- ✅ PR #104 の未解決コメント取得
- ✅ AI向けプロンプト抽出(details/summaryセクションのみ)
📋 修正予定:
□ plugins/nodebb-plugin-ogp-embed/library.js: URL抽出の重複検出でfullMatchをキーにしているため位置が異なる同一断片を区別できない。match.index と match[0].length の組み合わせをキーにして seen
を判定・登録するように変更(対象ブロック: 40–51、55–65、69–85 近辺の同様箇所)
これから上記に基づき修正を適用します。
AI向けプロンプトの指示に従い、OGP抽出の重複検出キーを fullMatch から位置キー(match.index + match[0].length)に変更します。3箇所のループすべてに適用します。
✏️ Applying patch to 1 file (+9 -6)
└ /path/to/library.js
46 const fullMatch = match[0];
47 - if (seen.has(fullMatch)) continue;
47 + const posKey = `${match.index}:${fullMatch.length}`;
48 + if (seen.has(posKey)) continue;
49 const url = match[1];
: 省略
84 }
✓ Applied patch
└ Success. Updated the following files:
M /path/to/library.js
>_
✓ 📖 library.js
✓ 📖 library.js
✓ 📖 library.js
✔ You approved codex to run git add plugins/nodebb-plugin-ogp-embed/library.js && git commit -m "fix: PR #104 のレビューコメントを反映\n\nAI Agents prompts に基づく自動修正\n- OGP抽出の
重複検出をfullMatchキーから位置キー(match.index:length)へ変更\n- 3箇所の正規表現ループでseenの判定を位置基準に統一" && git push
以下の手順で実行しました。
- 📥 PRコメント取得: 完了(.tmp/pr_104_unresolved.tsv)
- 🤖 AI Prompts抽出: 完了(details/summary=🤖のみ抽出)
- ✅ 修正予定の提示: 1件
📋 修正予定:
□ plugins/nodebb-plugin-ogp-embed/library.js: URL抽出の重複検出でfullMatch基準だと位置が異なる同一断片を区別できないため、match.index と match[0].length を組み合わせた位置キーで重複判定に変
更(3つの抽出ループすべてに適用)
🛠 実装内容
- ファイル: plugins/nodebb-plugin-ogp-embed/library.js
- 対象関数: extractURLsFromHTML
- 変更点:
- 3つの while ループ(`linkRegex`, `linkWithPrefixRegex`, `genericInParagraphRegex`)で重複検出を以下の通り変更
- 変更前: `seen.has(fullMatch)` / `seen.add(fullMatch)`
- 変更後: `const posKey = \`${match.index}:${fullMatch.length}\`` を生成し、`seen.has(posKey)` / `seen.add(posKey)` に統一
- これにより、全く同一のHTML断片が別位置に複数出現しても、位置で重複を判別可能に
📋 修正完了レポート:
✅ plugins/nodebb-plugin-ogp-embed/library.js: 3箇所の重複検出キーを位置キーに変更(match.index:length)
🧾 Git操作
- コミット: fix: PR #104 のレビューコメントを反映
AI Agents prompts に基づく自動修正
- OGP抽出の重複検出をfullMatchキーから位置キー(match.index:length)へ変更
- 3箇所の正規表現ループでseenの判定を位置基準に統一
- プッシュ: feat/auto-translate-retranslate-on-edit-docs ブランチへプッシュ完了
- 一時ファイル削除: .tmp/pr_104_unresolved.tsv, .tmp/pr_104_ai.tsv を削除済み
追加のレビューコメントがあれば、同じ手順で解析・修正を続行できます。
という感じで、すでに Resolve されたものは無視され、未解決のものだけが対象になっています。
個人的なワークフロー
個人的には、まずドキュメントだけ生成して、一旦PRを作成してCodeRabbitにレビューしてもらっています。その後コードを生成してプッシュするので、すでに適用済のMarkdown向けの指摘は不要になります。
レビューの中で、適用不要なものについては @coderabbit この実装は不要。なぜなら〜
とコメントしておきます。そうすると、CodeRabbitのLearningsに取り込まれるので、リポジトリ特有の学習情報として次回以降のレビューに反映されます。また、 Resolve conversation
しておき、修正の対象外としておきます。
適用したいものだけ残したら、先程のプロンプトを実行すればOKです。
まとめ
Claude Codeのようにコマンドが使えれば手軽なのですが、とりあえずこのプロンプトをCodex CLIに入力すれば、CodeRabbitのレビュー反映が手軽になるかと思います。
問題があったら、ぜひコメントにて教えて下さい。