forge-address-pr-feedback について
Pull Request の未解決レビューコメントを体系的に処理する開発スキルです。各スレッドを分類し、必要なコード変更とチェックを行って返信します。人の判断が必要な議論は未解決のまま残します。
主な機能
- 01GraphQL による未解決スレッドの取得
- 02レビュー意見の分類
- 03スレッドごとの対応とテスト
- 04適切な返信と解決処理
- 05延期事項の Issue 化
活用シーン
- 01PR のコード修正依頼への対応
- 02レビュアーの質問や議論への返信
- 03延期するフィードバックの Issue 管理
- 04無人モードでのレビュー対応
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ mgratzer/ forge --skill forge-address-pr-feedbackインストール後、Claude Code で/forge-address-pr-feedbackを入力して読み込まれたか確認します。
詳細
PR フィードバックへの対応
プルリクエストの未解決のレビューコメントに体系的に対応します。
入力
PR 番号または URL($ARGUMENTS。省略した場合は現在のブランチから自動検出します)。優先順位の指針を追加する場合は、任意で -- <additional context> を指定します。
無人モード: --unattended を指定した場合、質問は行いません。代わりに、ステップ 2~3 で処理内容を説明します。
プロセス
ステップ 1:未対応のスレッドを取得する
GraphQL を使用します。REST API ではレビュー スレッドの isResolved ステータスを取得できません。最後のコメントがこちらからのものであるスレッドはレビュアーの返信待ちであり、どのモードでもここでは除外されます。forge-guard から呼び出された場合は、$PR と $ME を再取得せず、そのまま使用します。
# Derive owner/repo from the checkout; PR_ARG is the number or URL from $ARGUMENTS, empty when omitted
PR_ARG=""
OWNER=$(gh repo view --json owner --jq .owner.login)
REPO=$(gh repo view --json name --jq .name)
PR_NUMBER=$(gh pr view $PR_ARG --json number --jq .number) # empty PR_ARG → PR for the current branch
ME=$(gh api user --jq .login)
gh api graphql -F owner="$OWNER" -F repo="$REPO" -F pr="$PR_NUMBER" -f query='
query($owner: String!, $repo: String!, $pr: Int!) {
repository(owner: $owner, name: $repo) {
pullRequest(number: $pr) {
reviewThreads(first: 100) {
nodes {
isResolved
isOutdated
path
line
id
comments(last: 20) {
nodes { id body author { login } url }
}
}
}
}
}
}' --jq ".data.repository.pullRequest.reviewThreads.nodes[] | select(.isResolved == false and .comments.nodes[-1].author.login != \"$ME\")"
ステップ 2:各スレッドを処理する
対応が必要なスレッドごとに、ファイルと周辺のコンテキストを確認し、次のように分類します。
- 対応可能 — コードの変更が必要です
- 質問 — 説明を返信します
- 議論 — 変更によってコードが改善するかを判断します
- 対応済み — スレッドは未解決ですが、変更は行われています
- 対応しない — 現在のアプローチが望ましい状態です
- 保留 — 妥当な指摘ですが、対象範囲外です。保留項目として新しい Issue を作成します
議論のスレッドについて、判断がユーザーに委ねられる場合は、決めつけずに AskUserQuestion で確認します。無人モードの場合: コードまたはプロジェクトの規約で判断できるときは、その根拠を説明して決定します。どちらでも判断できない場合は、「判断が必要です: と 。<それぞれのコスト>」と返信し、スレッドを未解決のままにして、要約の人間の判断が必要な項目に記載します。決して解決済みにしたり、Issue に記載して隠したりしないでください。
ステップ 3:各スレッドに個別に対応して返信する
各スレッドに対応してから次へ進み、すべての返信で解決したコミットを参照できるようにします。
各スレッドについて:
- 変更を行う(対応可能な場合)
- lint/format/checks を実行する
- コミットする:
git commit -m "fix: address PR feedback, <brief description>" - 返信し、結果が確定した場合は解決する — 対応可能、対応済み、または保留の場合に行います。質問、議論、対応しない場合は、レビュアーが判断の根拠を確認できるよう、未解決のままにします。1 回の変更で両方を行います(未解決のままにするスレッドでは
resolveReviewThreadを省略します)。返信は GraphQL の変数として標準入力で渡してください。クエリに直接埋め込むと、引用符や改行で問題が起きます。
gh api graphql -f threadId="<THREAD_ID>" -F body=@- -f query='
mutation($threadId: ID!, $body: String!) {
addPullRequestReviewThreadReply(input: {pullRequestReviewThreadId: $threadId, body: $body}) {
comment { id }
}
resolveReviewThread(input: {threadId: $threadId}) {
thread { isResolved }
}
}' <<'REPLY_EOF'
<response>
REPLY_EOF
分類ごとの返信形式:
- 対応可能:「
<sha>で修正しました。<変更内容>」 - 質問:「<コード参照を含む回答>」
- 議論:「<判断とその根拠>」
- 対応済み:「
<sha>で対応済みです。」 - 対応しない:「<理由>のため、現在のアプローチを維持します。」
- 保留:「追跡用の Issue # を作成しました。」
ステップ 4:保留項目の Issue を作成する
各保留項目について、プロジェクトの Issue トラッカーに Issue を作成します(issue-operations を参照)。PR のコンテキストとして、レビュアーのコメント、PR 番号、提案する解決策を含めます。
ステップ 5:プッシュして要約する
git push
報告する内容:対応したスレッド、作成したコミット、作成した保留項目、判断が必要なスレッド。
ガイドライン
- 検出には GraphQL を使用 — REST API では解決ステータスを確認できません
- 対応して返信してから次へ進む — まとめて処理しないでください
- 具体的に記述する — コミット、行番号、コードを参照してください
- 変更をテストする — コミット前にチェックを実行してください
関連スキル
フィードバックに大幅な変更が必要な場合: レビューを再依頼する前に、forge-reflect を使用してもう一度セルフレビューを行います。
呼び出し元: forge-guard はフィードバックの各ラウンドで、このプロセスを無人モードで実行します。
使用例
/forge-address-pr-feedback 123
/forge-address-pr-feedback 123 -- prioritize security comments
/forge-address-pr-feedback --unattended 123
/forge-address-pr-feedback