22
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

はじめに

最近はClaude Codeを使って開発を行っていることが多いです。
以下の記事の通り、Issueを作成→PRの作成までClaude Codeにしてもらっていたのですが、
最近はPRのレビューの指摘内容までClaude Codeにしてもらっているため、その方法を紹介します。

手順

セットアップ

まずはClaude CodeでPRの情報を取得できるようにするため、GitHub CLIをインストールします。
GitHub CLIとはGitHubのコマンドラインツールで、リポジトリ管理やIssue作成などをターミナルから行うことができる便利なツールです。
詳しくは公式のドキュメントをご覧ください。

Claude Codeのコマンドを作成

Claude Codeでは、独自にコマンドを作成できる仕組みがあります。
この機能を使うことで、独自に定義したワークフローを /hogeのような形で簡単に呼び出せるようになります。

今回は以下のようなコマンドを作成します。

  • 現在のブランチのPRの「Resolve」の状態になっていないレビューコメントを取得する
  • 取得したコメントの内容をもとに、コードの修正をする
  • 編集結果をpushする

~/.claude/commands/fix-review-point.md に以下のようなプロンプトを定義します。

~/.claude/commands/fix-review-point.md
Resolveしていないレビューコメントの指摘内容へ対応して下さい。

## 進め方の手順

1. 次項の記載のコマンドを用いて、Resolveしていないレビューコメントを確認する
2. Resolveしていないレビューコメントの内容を理解する
3. 指摘内容を実現するために必要なタスクをTDD(テスト駆動開発)に基づいて遂行する
4. テストとLintを実行し、すべてのテストが通ることを確認する
5. コミットを適切な粒度で作成する
6. 修正内容をすでに作成している適切なコミットにsquashし、pushする
7. PRのdescriptionを更新する

## ghコマンド
以下のコマンドでResolveしていないレビューコメントを取得できます。

```bash
OWNER_REPO=$(gh repo view --json nameWithOwner --jq '.nameWithOwner')
OWNER=$(echo $OWNER_REPO | cut -d'/' -f1)
REPO=$(echo $OWNER_REPO | cut -d'/' -f2)
PR_NUMBER=$(gh pr view --json number --jq '.number')

gh api graphql -f query="
query {
  repository(owner: \"${OWNER}\", name: \"${REPO}\") {
    pullRequest(number: ${PR_NUMBER}) {
      number
      title
      url
      state
      author {
        login
      }
      reviewRequests(first: 20) {
        nodes {
          requestedReviewer {
            ... on User {
              login
            }
          }
        }
      }
      reviewThreads(last: 20) {
        edges {
          node {
            isResolved
            isOutdated
            path
            line
            comments(last: 20) {
              nodes {
                author {
                  login
                }
                body
                url
                createdAt
              }
            }
          }
        }
      }
    }
  }
}" --jq '
  .data.repository.pullRequest as $pr |
  {
    pr_number: $pr.number,
    title: $pr.title,
    url: $pr.url,
    state: $pr.state,
    author: $pr.author.login,
    requested_reviewers: [.data.repository.pullRequest.reviewRequests.nodes[].requestedReviewer.login],
    unresolved_threads: [
      $pr.reviewThreads.edges[] |
      select(.node.isResolved == false) |
      {
        path: .node.path,
        line: .node.line,
        is_outdated: .node.isOutdated,
        comments: [
          .node.comments.nodes[] |
          {
            author: .author.login,
            body: .body,
            url: .url,
            created_at: .createdAt
          }
        ]
      }
    ]
  }
'
```

このコマンドを/fix-review-pointのように実行することで、PRについているResolveしていないレビューコメントを取得できます。

開発の流れ

今回定義したコマンドを用いて僕は普段以下のような開発を行っています。

  • 行いたいタスクをIssueとして定義する
  • /exec-issueコマンドを用いてIssueの内容をClaude Codeで実装、PRを作成する
  • Gemini Code Assistを用いて自動でレビューを行う
  • 自身でもコードのレビューを行う
  • 今回定義した/fix-review-pointを用いてレビュー箇所の修正を行い、PRに反映する
  • コードに問題がなくなるまで以下を繰り返す
    • 修正完了したレビューコメントをResolveする
    • Gemini Code Assistを用いて再度レビューをする
    • 自身でもレビューする
    • /fix-review-pointを用いて修正する

終わりに

で定義した/exec-issueと今回定義した/fix-review-pointを用いると、Claude Code上ではほぼ指示などを出さず、GitHubをインターフェースとしてコードの生成・修正を行うことができます。
個人的にはPlanモードなどを使って最初のアウトプットの質を上げるよりも、実装→レビューのサイクルを回す方が対応の負荷も小さく、改善のサイクルも回しやすいと感じています。

もし似たようなことをしたい方がいれば、是非ご参考ください。

22
7
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
22
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?