1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Codex CLIで、CodeRabbitの指摘を自動で反映するには

Posted at

最近、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のレビュー反映が手軽になるかと思います。

問題があったら、ぜひコメントにて教えて下さい。

AI Code Reviews | CodeRabbit | Try for Free

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?