mcpField
R
reply

reply

github.com/derogab開発4186 回インストール3 日前に更新
リポジトリ

reply について

replyは、現在のブランチのPRレビューコメントを扱うスキルです。会話に関連する未解決スレッドにのみ返信し、PRとコメントの状態を確認したうえで、ファイル変更やスレッド解決は行いません。

主な機能

  1. 01現在のブランチのPRを確認
  2. 02未解決のレビューコメントを抽出
  3. 03会話の文脈との関連性を判定
  4. 04スレッドへの返信のみを投稿
  5. 05ファイル変更やスレッド解決を禁止

活用シーン

  1. 01現在の作業に関するPRレビューへの返信
  2. 02解決済みまたは無関係なコメントのスキップ
  3. 03PRがない場合の操作停止

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/derogab/agent-kit --skill reply

インストール後、Claude Code で/replyを入力して読み込まれたか確認します。

同梱ファイルagents/openai.yaml

詳細

コンテキスト

  • 現在のブランチ:!git branch --show-current
  • このブランチの PR:!gh pr view --json number,url 2>/dev/null || echo "NO_PR"

タスク

現在の PR にある未解決のレビューコメントのうち、この会話で話し合った内容に関連するものに返信してください。それ以外のコメントはすべてスキップしてください。

事前確認
  1. 上記の PR コンテキストが NO_PR の場合は、そこで停止し、このブランチには PR がないことをユーザーに伝えてください。それ以外の操作は行わないでください。
  2. 解決済みのコメントには返信しないでください。
  3. 現在の会話のコンテキストに関連しないコメントには返信しないでください。
  4. スレッドを解決しないでください。ファイルを変更しないでください。このスキルでは返信の投稿のみ行います。
リポジトリの座標を特定する

以下の API 呼び出しに使用する owner、repo、PR 番号を取得します。

OWNER=$(gh repo view --json owner -q .owner.login)
REPO=$(gh repo view --json name -q .name)
PR=$(gh pr view --json number -q .number)
CURRENT_USER=$(gh api user -q .login)
未解決のレビュー スレッドを取得する

GraphQL API を使用して、PR 上のすべてのレビュー スレッドのページを、解決状況とコメントとともに一覧表示します。最初のリクエストでは -F threadsCursor=null を指定します。

gh api graphql \
  -F owner="$OWNER" \
  -F repo="$REPO" \
  -F pr="$PR" \
  -F threadsCursor=null \
  -f query='
query($owner: String!, $repo: String!, $pr: Int!, $threadsCursor: String) {
  repository(owner: $owner, name: $repo) {
    pullRequest(number: $pr) {
      reviewThreads(first: 100, after: $threadsCursor) {
        pageInfo {
          hasNextPage
          endCursor
        }
        nodes {
          id
          isResolved
          comments(first: 100) {
            pageInfo {
              hasNextPage
              endCursor
            }
            nodes {
              databaseId
              author { login }
              body
              path
              line
              url
              createdAt
            }
          }
        }
      }
    }
  }
}'

reviewThreads.pageInfo.hasNextPage が true の場合は、hasNextPage が false になるまで、-F threadsCursor="<endCursor>" を指定して同じクエリを再実行します。フィルタリングする前に、返されたすべてのスレッドノードをまとめてください。

未解決のスレッドに comments.pageInfo.hasNextPage が true に設定されているものがある場合は、返信するかどうかを決める前に残りのコメントを取得してください。

gh api graphql \
  -F thread="$THREAD_ID" \
  -F commentsCursor="<endCursor>" \
  -f query='
query($thread: ID!, $commentsCursor: String) {
  node(id: $thread) {
    ... on PullRequestReviewThread {
      comments(first: 100, after: $commentsCursor) {
        pageInfo {
          hasNextPage
          endCursor
        }
        nodes {
          databaseId
          author { login }
          body
          path
          line
          url
          createdAt
        }
      }
    }
  }
}'

hasNextPage が false になるまで、コメントのページネーションを繰り返してください。

まとめた結果を isResolved が false のスレッドに絞り込みます。各未解決スレッドでは、最初のコメントの databaseId が返信先です。

会話のコンテキストと照合する

未解決のスレッドごとに、次の手順を実行してください。

  1. スレッド内のすべてのコメントを読みます。
  2. スレッドの最後のコメントの投稿者が CURRENT_USER の場合は、そのスレッドをスキップします。返信が必要なのは、別の人が最新のコメントを追加した場合のみです。
  3. トピックがこの会話(編集したファイル、話し合った決定、デバッグしたエラー、一緒に作成したコード)に関連しているかどうかを判断します。
  4. スレッドが無関係な場合はスキップし、返信しないでください。
  5. 関連する場合は、会話で実際に確認された内容に基づいて返信を作成します。例:
    • 「<commit-sha> で対応しました。」
    • 「話し合った理由により、<approach> に変更しました。」
    • 「ご指摘ありがとうございます。<reason discussed> のため、以前の動作を維持しました。」
  6. 関連性に迷う場合はスキップしてください。誤った返信をするより、返信を見送る方が適切です。
返信を投稿する

該当するスレッドごとに、そのスレッドの最初のコメントへのスレッド返信を投稿します。

gh api repos/$OWNER/$REPO/pulls/$PR/comments/<first_comment_databaseId>/replies \
  -X POST \
  -f body="$(cat <<'EOF'
<your reply here>
EOF
)"
ルール
  • isResolved が false のスレッドのみを対象にしてください。
  • 現在の会話で話し合った内容に明確に関連する場合のみ返信してください。
  • 最後のコメントの投稿者が CURRENT_USER のスレッドはスキップしてください。
  • 返信は簡潔かつ事実に基づくものにしてください。コンテキストを作り上げないでください。
  • 1 回の実行中に同じスレッドへ 2 回返信しないでください。
  • スレッドを解決しないでください。コードを編集しないでください。コミットをプッシュしないでください。返信の投稿のみ行ってください。
  • 投稿後、返信したスレッドと、スキップしたスレッド(スキップ理由を各 1 行)をユーザーに簡潔にまとめてください。

コメント