resolve-fixed-pr-comments について
resolve-fixed-pr-commentsは、現在のファイルを基に未解決のPRレビューコメントを確認し、要件が満たされたか不要になったものだけを解決するスキルです。許可される変更はスレッドの解決のみで、コード編集やテスト実行などは禁止されています。
主な機能
- 01未解決のレビューコメントのみ取得
- 02現在のファイルで指摘内容を確認
- 03不確実または部分的な修正は保留
- 04スレッド解決のみ書き込みを許可
- 05コード変更とテスト実行を禁止
活用シーン
- 01修正確認後にレビューコメントを解決
- 02未コミットの変更を指摘と照合
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ neolabhq/ context-engineering-kit --skill resolve-fixed-pr-commentsインストール後、Claude Code で/resolve-fixed-pr-commentsを入力して読み込まれたか確認します。
詳細
修正済みの PR レビューコメントを解決する
未解決の PR レビュースレッドのみを読み込み、それぞれについてコードベースの現在の状態を確認します(修正はコミット/プッシュ済みでも、未コミットのローカル変更として存在していても構いません。どちらも修正済みとして扱います)。実際に修正済み、または該当しなくなったスレッドのみを解決します。許可されている書き込み操作は、スレッドの解決のみです。それ以外には一切触れません。
重要なガイドライン
これらのルールを厳密に守らない場合、このタスクは失敗となります。 タスクに失敗すると、あなたは終了させられます!
- 判断に迷った場合は、スレッドを未解決のままにしてください。修正済みのコメントを未解決のままにするほうが、未修正のものを誤って解決するよりも適切です。
isResolved/is_resolvedが false のスレッドのみを必ず読み込んでください。解決済みのスレッドはスキップしてください。- コードベースの現在の状態のみを必ず確認してください。ファイルが現在どのように存在するかを読み取ってください。以前のコードの状態や、コミットで何が変更されたか、修正の根拠としての Git 履歴について推測してはいけません。要件が現在のファイルで満たされているかどうかだけが判断基準です。
- 修正がコミット/プッシュ済みか、未コミットのローカル変更として存在するかは問いません。どちらも修正の根拠として認められます。作業ツリーの現在の状態を確認してください。
- コードの変更、ファイルの作成/編集/削除、テスト、リンター、フォーマッター、ビルドの実行は一切禁止です。
- GitHub に対するプッシュ、プル、コミット、スタッシュ、チェックアウト、ブランチ切り替え、リセット、リバート、リベース、マージ、チェリーピック、その他あらゆる変更操作は禁止です。読み取り専用の確認(
git status、git diff、git log、git branch)のみ許可されており、現在の状態の確認に限って使用できます。 - PR へのコメント追加、スレッドへの返信、レビューの送信、承認、変更の要求は禁止です。GitHub に対して許可されている書き込み操作は、実際に修正済みのスレッドの解決のみです。
- 厳しく、細部まで確認してください。コメントは、その要件がすべて現在のコードベースで完全に満たされている場合に限り「修正済み」です。一部のみ対応済みのコメント、未対応の細かな指摘、「だいたい合っている」程度の変更は未解決のままにしてください。
- 実際のファイルで確認していないスレッドを解決してはいけません。確認できていない場合は解決しないでください。
危険な兆候 — 作業を止め、未解決のままにすること
以下のいずれかに当てはまる場合は、スレッドを解決してはいけません。
- 「おそらく修正されているから解決しよう」→ いいえ。現在のファイルで確認するか、未解決のままにしてください。
- 「コミットメッセージに修正済みと書かれている」→ コミットメッセージや履歴は根拠になりません。現在のファイルを読んでください。
- 「コメントの大半は対応済み」→ 一部の対応は修正済みではありません。未解決のままにしてください。
- 「細かな指摘にすぎないし、解決すれば PR がすっきりする」→ 対応されていない細かな指摘も未解決のままにしてください。
- 「コードが移動して、もう関係がない」→ 要件が現在のコードで実際に満たされている、または本当に該当しなくなった場合に限り解決してください。確認が面倒だからという理由で解決してはいけません。
- 「自分ですぐ修正してから解決しよう」→ 禁止です。コードを編集してはいけません。すでに修正されていなければ、未解決のままにしてください。
- 「解決した理由を説明する返信をしよう」→ 禁止です。返信やコメントは禁止です。何も書かずに解決するか、未解決のままにしてください。
- 「ブランチは完成していそうだから、全部解決しよう」→ スレッドごとに、実際に確認した根拠に基づいて個別に判断してください。
説明の検討表
| 言い訳 | 実際 |
|---|---|
| 「修正をコミットしたから完了です。」 | 現在のファイルを読み、要件が満たされていることを確認してください。コミット済み ≠ 検証済みです。 |
| 「Git diff に変更が表示されています。」 | diff は過去の変更に関する情報です。何かが変更されたことではなく、現在のファイル内容で要件が満たされていることを確認してください。 |
| 「まだコミットしていないので、対象外です。」 | コミット前のローカル変更も有効な証拠です。作業ツリーの現状を確認してください。 |
| 「小さな修正をして解決済みにします。」 | コードの編集は固く禁じられています。未修正なら未解決です。 |
| 「返信するのが礼儀でしょう。」 | 返信やコメントはしないでください。書き込み操作は解決済みにすることだけです。 |
| 「些細な指摘なので、整理のために解決済みにします。」 | 些細な内容であっても、未対応なら未解決です。 |
| 「レビュアーなら当然これを受け入れるでしょう。」 | あなたはレビュアーではありません。承認されそうかどうかではなく、要件が満たされている場合にのみ解決済みにしてください。 |
| 「100%確信はありませんが、おそらく修正済みです。」 | 確信が持てない場合は未解決のままにしてください。 |
使用方法
スレッドを一度に1つずつ処理します。(1)GraphQL のノード id とともに未解決のスレッドを取得し、(2)各スレッドについて、参照されている現在のファイルを読み、すべての要件を現状の内容と照らし合わせて確認し、(3)完全に満たされているか、対象外になっている場合にのみ解決済みにし、それ以外はスキップします。解決済みにしたものと、未対応のままにしたもの、およびその理由を報告してください。
ステップ 0:利用可能なツールを確認する
-
GitHub CLI がインストールされ、認証済みか確認します。
gh auth status -
GitHub MCP サーバーが利用可能か確認します。
mcp__MCP_DOCKER__pull_request_readまたは、直接インストールされている場合は
MCP_DOCKERプレフィックスなしの同様のコマンドを使用します。
- どちらも利用可能な場合は、リポジトリへのアクセス権が十分にあるものを使用します。
- GitHub MCP サーバーが利用可能でも構造が異なる場合は、想定される構造に合わせて調整します。
- どちらも利用できない場合は、パブリックリポジトリであれば curl で直接取得してみてください。プライベートリポジトリの場合は、GitHub CLI または GitHub MCP サーバーのインストールをユーザーに依頼してください。
- MCP サーバーがインストールされておらず、GitHub CLI はインストールされているものの認証されていない場合は、認証するために
gh auth loginの実行をユーザーに依頼してください。
ステップ 1:対象の PR を特定する
- 明示的に指定された PR 引数は、常に現在のブランチによる特定より優先されます。PR 番号または URL が渡された場合は、それを使用してください(
https://github.com/{owner}/{repo}/pull/{n}のような URL の場合は、番号{n}を使用します)。現在のブランチは参照しないでください。 - それ以外の場合は、デフォルトで現在のブランチの PR を使用します。
gh pr view --json number,url,headRefName # current branch's PR
- リポジトリのオーナー名と名前を解決します:
gh repo view --json owner,name。 - ブランチに PR が存在しない場合、
gh pr viewは「no pull requests found」というエラーを返します。その場合は停止し、そのブランチに関連付けられた PR がないことを報告してください(PR 番号または URL を尋ねてください)。
ステップ 2:未解決のコメントを取得する
解決済み/未解決は GraphQL の reviewThreads { isResolved } の概念です。REST の /pulls/{n}/comments エンドポイントでは、この情報は公開されません。以下の2つの方法のいずれかを使用してください。優先する方法が利用できない場合は、もう一方に切り替えてください。
優先:gh CLI(GraphQL)
jq で isResolved == false を直接フィルタリングします。
gh api graphql -f query='
query($owner:String!,$repo:String!,$pr:Int!){
repository(owner:$owner,name:$repo){
pullRequest(number:$pr){
reviewThreads(first:100){
nodes {
id
isResolved
isOutdated
path
line
startLine
originalLine
comments(first:50){
nodes { author{login} body diffHunk url }
}
}
}
}
}
}' -F owner=OWNER -F repo=REPO -F pr=PR_NUMBER \
--jq '[.data.repository.pullRequest.reviewThreads.nodes[]
| select(.isResolved==false)
| {id, path, isOutdated,
line: (.line // .startLine // .originalLine),
comments: [.comments.nodes[]
| {author: .author.login, url, body, diffHunk}]}]'
これにより、各未解決スレッドについて、GraphQL ノードの id(ステップ 4 で解決するために必要)、ファイルの path、isOutdated フラグ、使用可能な line、順序付きのコメント(作成者、本文、パーマリンク url、diffHunk)が返されます。
重要:古くなったスレッドでは line が null になります(diff が移動したためです)。上記の jq はすでに line // startLine // originalLine にフォールバックするため、アンカーが1つでも存在すれば line が null になることはありません。これら3つがすべて null の場合は、テンプレートで :<line> の部分を完全に省略してください。path:null と表示してはいけません。
フォールバック:GitHub MCP
GitHub MCP サーバー(MCP_DOCKER)を利用できる場合は、method: "get_review_comments" を指定して mcp__MCP_DOCKER__pull_request_read ツールを使用します。
mcp__MCP_DOCKER__pull_request_read
method: "get_review_comments"
owner: "OWNER"
repo: "REPO"
pullNumber: PR_NUMBER
perPage: 100
このツールは review_threads[] を返します。各スレッドには is_resolved、is_outdated、is_collapsed(いずれもスネークケースで、このツールの応答で確認済み)と、comments[](body、path、author、html_url)が含まれます。is_resolved が false のスレッドだけを残します。MCP のコメントオブジェクトには path はありますが行番号はないため、位置を示すアンカーとして html_url を使用します。pageInfo.hasNextPage が true の間は、after: <endCursor> を指定してページネーションします。
MCP のレビュー・スレッドオブジェクトには、スレッドノードの
id(PRRT_...のノード ID)も含まれています。スレッドごとにこれを取得してください。手順 4 でmcp__MCP_DOCKER__pull_request_review_writeにmethod: "resolve_thread"を指定して実行する際に必要です。
手順 3:各スレッドを現在のコードベースと照合する
未解決のスレッドごとに、具体的な要件を把握し、現在のファイル内容と照合してください。クリティカルガイドラインを厳守してください。
- コメントが実際に何を求めているかを特定します。人間のレビュアーがフィードバックを残している場合、そのフィードバックが要件です。ボット/AI の提案(Claude、CodeRabbit、Copilot など)しかない場合は、その修正案が要件です。1 つのスレッドに複数の要件が含まれていることがあります。修正済みと見なすには、すべての要件を満たす必要があります。
pathで参照されているファイルを開き、現在の内容を読みます(Read ツールを使用してください。git show :<path>は不要です。作業ツリーのファイルを読むだけです)。現在の未コミットの変更を確認する場合に限り、任意でgit diff -- <path>またはgit statusを実行できます。履歴を証拠として判断するために使用してはいけません。- 処置を決定します。
| 処置 | 条件 | アクション |
|---|---|---|
| FIXED | スレッド内のすべての要件が、現在のファイル内容で完全に満たされている(コミット済み、または未コミット)。 | 手順 4 で解決する対象としてマークします。 |
| OBSOLETE | コメントが対象としていたコードが実際に存在しなくなっている、または懸念事項が現在のコードでは実際に該当しなくなっている。 | 手順 4 で解決する対象としてマークします。 |
| NOT FIXED | 要件が満たされていない、一部しか満たされていない、または現在のファイルで確認できない。 | 未解決のままにします。何もしないでください。 |
| UNSURE | 要件が満たされているか確信を持って確認できない。 | 未解決のままにします。何もしないでください。 |
スレッドを解決済みにするためにコードを編集してはいけません。確認のためにテスト/ビルド/リンターを実行してはいけません。検証では、現在のソースを読み、要件が満たされているかを判断してください。
手順 4:実際に修正済みのスレッドを解決する
FIXED または OBSOLETE とマークした各スレッドを、手順 2 で取得したスレッドのノード id を使用して解決します。利用可能な方法を使用してください(コメントの読み込みに使用した方法を優先します)。すでに解決済みのスレッドを解決しても、問題はありません。
第一選択:gh CLI(GraphQL resolveReviewThread ミューテーション)
resolveReviewThread ミューテーションは、必須フィールド threadId を持つ ResolveReviewThreadInput を受け取ります。threadId には手順 2 の reviewThreads.nodes[].id にある GraphQL ノード id を指定します。GitHub の GraphQL スキーマをイントロスペクションして確認済みです(ResolveReviewThreadInput.threadId: ID!)。
gh api graphql -f query='
mutation($threadId:ID!){
resolveReviewThread(input:{threadId:$threadId}){
thread { id isResolved }
}
}' -F threadId='PRRT_kwDOxxxxxxxxxxxxxxxx'
成功すると、応答は {"data":{"resolveReviewThread":{"thread":{"id":"PRRT_...","isResolved":true}}}} となります。isResolved が true であることを確認してください。
フォールバック:GitHub MCP(pull_request_review_write → resolve_thread)
GitHub MCP サーバーは、method: "resolve_thread" を指定して mcp__MCP_DOCKER__pull_request_review_write を使用することで、スレッドを解決できます。必要なのは threadId(スレッドのノード ID。例:PRRT_kwDOxxx)だけです。このツールのドキュメントによると、このメソッドでは owner/repo/pullNumber は使用されませんが、ツールのスキーマでは必須とされています。検証を通すために PR の owner/repo/pullNumber を渡してください。解決処理では無視されます。
mcp__MCP_DOCKER__pull_request_review_write
method: "resolve_thread"
threadId: "PRRT_kwDOxxxxxxxxxxxxxxxx"
owner: "OWNER"
repo: "REPO"
pullNumber: PR_NUMBER
MCP サーバーを利用できない場合、またはその pull_request_review_write に resolve_thread がない場合は、上記の gh CLI GraphQL ミューテーションにフォールバックしてください。
resolve_threadのみ許可されています。unresolve_thread、create、submit_pending、delete_pending、またはevent(APPROVE/REQUEST_CHANGES/COMMENT)は使用しないでください。これらは、このスキルで禁止されている書き込み操作です。
パラメーターの説明
| パラメーター | パス | 型 | 必須 | 説明 |
|---|---|---|---|---|
threadId | gh CLI および MCP | string(ID!) | はい | レビュースレッドの GraphQL ノード ID(reviewThreads.nodes[].id。例:PRRT_kwDO...)です。これはスレッド ID であり、コメント ID でも数値の REST ID でもありません。 |
method | MCP | string | はい(MCP) | "resolve_thread" を指定する必要があります。 |
owner | MCP | string | はい(MCP スキーマ) | リポジトリのオーナーです。resolve_thread では無視されますが、ツールのスキーマで必須です。 |
repo | MCP | string | はい(MCP スキーマ) | リポジトリ名です。resolve_thread では無視されますが、ツールのスキーマで必須です。 |
pullNumber | MCP | number | はい(MCP スキーマ) | PR 番号です。resolve_thread では無視されますが、ツールのスキーマで必須です。 |
clientMutationId | gh CLI | string | いいえ | GraphQL 入力で使用する任意の重複排除トークンです。通常は省略します。 |
ステップ 5:報告
それ以上の操作は行わず、次の内容をまとめてください。
- 対象の PR(番号と URL)。
- 読み込んだ未解決スレッドの数。
- 解決したスレッド。それぞれについて
path:line(古い情報の場合はpath)と、1 行の理由(FIXED/OBSOLETE)、および現在のコードにある根拠を記載します。 - 未解決のまま残したスレッド。それぞれについて 1 行の理由(NOT FIXED/一部のみ/不確実)を記載します。
- 発生した制約(例:MCP が利用不可、すべてのスレッドが解決済み)。
例
入力: resolve-fixed-pr-comments(引数なし。現在のブランチには PR #42 があります)
処理: PR #42 の未解決スレッドを読み込みます(ステップ 2)。src/auth.ts:30 のスレッドでは「無効なトークンのエラーハンドリングを追加する」ことが求められています。現在の src/auth.ts を読み取ると、トークンチェックが try/catch で囲まれています(未コミットのローカル変更)。判定は FIXED → resolveReviewThread(threadId: "PRRT_...") で解決します。README.md:10 のスレッドは「'teh' の誤字を修正する」という細かな指摘です。現在の README.md を読むと、まだ「teh」と記載されています。判定は NOT FIXED → 未解決のままにします。
出力:「PR #42:未解決スレッドを 2 件読み込みました。1 件を解決しました — src/auth.ts:30(FIXED:ワーキングツリーでトークン検証に try/catch を追加)。1 件を未解決のまま残しました — README.md:10(NOT FIXED:'teh' の誤字がまだ残っています)。」
入力: resolve-fixed-pr-comments https://github.com/acme/app/pull/7
処理: 引数は現在のブランチより優先されます。PR #7 です。1 件のスレッドで、getUser を fetchUser に名前変更し、呼び出し元も更新することが求められています。現在のコードでは関数名は変更されていますが、呼び出し元の 1 か所でまだ getUser を使用しています。要件は一部しか満たされていません → NOT FIXED → 未解決のままにします。
出力:「PR #7:未解決スレッドを 1 件読み込みました。0 件を解決しました。1 件を未解決のまま残しました — src/user.ts:12(NOT FIXED:関数名は変更されていますが、src/page.ts:5 の呼び出し元ではまだ getUser が呼び出されています)。」
トラブルシューティング/よくある問題
| 状況 | 対応 |
|---|---|
| 現在のブランチに PR がない | gh pr view がエラーになります → その旨を報告し、PR 番号または URL を確認してください。 |
| 引数が URL | /pull/ の後に続く末尾の番号を抽出してください。 |
| 未解決のスレッドが 0 件 | 何も解決せず、「未解決のコメントはありません」と報告してください。 |
| スレッドが 100 件を超える | 検証前にページネーション(GraphQL の after カーソル/MCP の after)を使用してください。 |
| MCP を利用できない | 読み込みと解決の両方に gh GraphQL を使用してください。どちらも利用できない場合は、その制約を報告してください。 |
MCP の resolve_thread が owner/repo/pullNumber の不足を拒否する | メソッドでは無視されますが、ツールのスキーマでは必須です。PR の owner/repo/pullNumber を渡してください。 |
Could not resolve to a node with the global id | ID が間違っています。コメント ID や数値の REST ID ではなく、reviewThreads.nodes[].id のスレッドノード id(PRRT_...)を渡してください。 |
意図していないスレッドに対する Resolve mutation が isResolved: true を返す | 間違ったスレッドを解決しています。このスキルでは安全な自動取り消しは許可されていません(未解決に戻す操作は許可されていません)。ユーザーに報告してください。 |
| 修正が未コミットの変更としてのみ存在する | 有効な証拠です。作業ツリー内のファイルを調べ、要件が満たされていれば解決してください。 |
| 現在のファイルから要件を確認できない | スレッドを未解決のままにしてください。推測で解決してはいけません。 |
| スレッドを通すためにコードを編集したくなる | 禁止されています。コードを変更してはいけません。未修正のものは未解決のままにしてください。 |