/pr-review-check
AI PR 리뷰 코멘트를 triage하고 유효한 것만 안전하게 수정
How it fires
How this command gets triggered: by you, by Claude, or both.
- Fires itselfClaude auto-loads it when your prompt matches the work.
- You can call itInvoke it directly when you want it.
- Slash command
/pr-review-check
Context preview
What this command does when you run it.
AI PR 리뷰 코멘트를 triage하고 유효한 것만 안전하게 수정
Command definition
pr-review-check.mddescription: AI PR 리뷰 코멘트를 triage하고 유효한 것만 안전하게 수정
argument-hint: "[PR 번호 — 생략 시 현재 브랜치의 PR]"
PR 리뷰 코멘트 확인
AI 리뷰어(CodeRabbit, Claude bot, Codex, Gemini, Copilot 등)가 남긴 코멘트를 수집 · 분류 · 영향 분석 후, **승인된 유효 이슈만** 한 건씩 원자적으로 수정한다.
**Absolute rules (MUST follow):**
- MUST produce the triage report and get user approval BEFORE modifying any code.
- MUST NOT copy-paste AI-suggested patches verbatim. Understand the concern, then re-derive the fix from scratch.
- MUST fix one issue at a time. NO drive-by refactors, formatting changes, or style cleanups.
- MUST write GitHub replies in English (user preference).
- MUST NOT auto-resolve review threads. Let the reviewer (or the bot's re-review) close them.
- MUST NOT invoke adversarial CLIs (gemini/codex) without explicit user approval.
입력 인자: `$ARGUMENTS` (PR 번호, 생략 가능)
---
Phase 0 — 수집 (Collect)
1. **PR 번호 결정**: 인자가 있으면 사용, 없으면 `gh pr view --json number -q .number` 로 현재 브랜치의 PR 확인. PR이 없으면 사용자에게 물어본다. 2. **리뷰 데이터 fetch** (REST + GraphQL 조합):
- `gh api repos/{owner}/{repo}/pulls/{N}/comments` — 인라인 코멘트
- `gh api repos/{owner}/{repo}/pulls/{N}/reviews` — 리뷰 레벨 body
- GraphQL로 review threads + resolution 상태:
gh api graphql -f query='
query($owner:String!,$repo:String!,$num:Int!){
repository(owner:$owner,name:$repo){
pullRequest(number:$num){
reviewThreads(first:100){nodes{
id isResolved isOutdated
comments(first:20){nodes{id databaseId author{login} body path line originalLine diffHunk}}
}}
}
}
}' -f owner=... -f repo=... -F num=...3. **AI 봇 필터**: author login이 `coderabbitai`, `coderabbitai[bot]`, `claude[bot]`, `chatgpt-codex-connector`, `gemini-code-assist[bot]`, `copilot-pull-request-reviewer[bot]`, `github-actions[bot]` 중 하나인 것만. 인간 리뷰어 코멘트는 이 워크플로우 대상 아님 — 별도로 보고. 4. **resolved/outdated 스레드 제외** (이미 대응 완료). 5. PR의 변경 파일 목록도 같이 확보: `gh pr diff {N} --name-only` — "in-scope" 판정에 사용.
Phase 1 — 분류 (Triage) — **코드 수정 금지**
각 코멘트에 대해 아래를 판정한다. 결과는 **테이블로 사용자에게 먼저 보고하고 승인 대기**한다.
1-1. 중복 제거
여러 봇이 같은 파일+라인+본질적으로 같은 지적을 하면 하나의 행으로 병합. `Sources` 컬럼에 여러 봇 표시.
1-2. 분류 축 (4개)
| 축 | 값 | |----|-----| | **Severity** | `Critical` (동작 파괴/데이터 유출/롤백 차단) / `Warning` (정확성 위험) / `Suggestion` (개선 제안) / `Nit` (스타일·취향) | | **Validity** | `valid` / `false-positive` / `needs-investigation` | | **Scope** | `in-scope` (이 PR diff에 포함된 파일·라인) / `out-of-scope` (기존 코드, 이 PR이 건드린 적 없음) | | **Action** | `fix-now` / `skip` / `follow-up-issue` / `ask-user` |
1-3. 알려진 false-positive 패턴 → 자동 다운그레이드
아래에 해당하면 기본 `false-positive` 또는 `Nit`으로 분류하고 이유 명시:
- 프로젝트 린터/포매터가 이미 처리하는 스타일·포맷
- 타입 시스템상 non-null 보장된 값에 대한 null 체크 요구
- private/internal 헬퍼에 대한 docstring/주석 요구
- 테스트에 불필요한 mock·assertion 추가 요구
- 사소한 네이밍 취향
**단, 비동기 race condition 지적은 CodeRabbit이 ~75% 놓치지만 지적 자체는 자주 하므로 → 항상 `needs-investigation`으로 두고 수동 검증**.
1-4. 의도 이해 체크 (logic bug 맹점)
AI 리뷰어는 코드 품질에 최적화되어 있고 **기능의 의도는 모른다**. 각 valid 후보에 대해 자문: > "이 코멘트가 이 PR이 달성하려는 기능의 의도를 이해하고 있는가?"
아니라고 판단되면 `needs-investigation` + `ask-user`.
1-5. Scope 정책
- `in-scope` + valid → `fix-now` 후보
- `out-of-scope` + valid → `follow-up-issue` (이 PR에선 절대 수정 안 함, 별도 이슈 생성)
- `out-of-scope` + not-valid → `skip`
1-6. Nit 캡
`Nit`은 최대 5개까지만 개별 행으로 표시. 초과분은 `"plus N similar nits"` 한 줄로 요약.
1-7. Questions batch (의문 제기 · 의도 확인)
AI 리뷰는 **기능 의도 · 저장소 컨벤션 · 숨은 제약**을 모른다. Claude가 판단 못하는 경우를 단발성으로 흩뿌리지 말고, triage 리포트와 **같은 출력 안**에 배치로 모아서 한 번에 묻는다. 아래 카테고리를 빠짐없이 점검:
| 카테고리 | 언제 묻는가 | 질문 예시 | |---------|------------|----------| | **의도성 확인** | 수정 시 관찰 가능한 동작이 바뀌는 경우 (단순 내부 정리가 아님) | "리뷰어는 에러 throw를 요구하는데 현재는 silent fail. 의도된 설계인가요?" | | **숨은 제약 확인** | 리뷰어가 repo 컨벤션·기존 구조를 모를 가능성 | "이 패턴은 코드베이스 전반에서 일관되게 쓰이는데, 정말 바꿔도 되나요?" | | **봇 의견 상충** | 두 AI 리뷰어가 서로 반대 제안 | "CodeRabbit은 A 접근, Gemini는 B 접근 — 어느 쪽으로 갈까요?" | | **범위 경계 애매** | in-scope / out-of-scope 판정 애매 | "이 파일은 한 줄만 바꿨는데 리뷰어는 전체 리팩터 요구. follow-up으로 뺄까요?" | | **AI 제안 자체가 의심스러움** | 리뷰어의 suggested fix가 새 버그를 유발할 가능성 | "제안대로 하면 X 테스트가 깨질 것 같은데, 다른 방법으로 해결할까요?" | | **대적자 불일치** `(adv)` | Phase 1.5 대적자(Gemini/Codex)가 Claude 분류와 다른 의견 | "Gemini는 #3을 valid로 보지만 Claude는 false-positive로 분류. 어느 쪽?" |
**원칙:**
- 질문 없으면 이 섹션 생략.
- 각 질문은 **해당 이슈 번호에 연결** (`Q1 → #2`, `Q2 → #2, #5` 처럼).
- 단답/선택지 형태 선호 — 긴 서술 답변 요구 금지. 가능한 경우 A/B 옵션 제시.
- 대적자 발 질문은 `(adv)` 태그 + 출처(Gemini/Codex) 명시. 두 대적자 모두 반대면 default를 대적자 쪽으로.
- Phase 2 진행 중 **새로운 의문**이 생기면 그 이슈만 단독으로 stop-and-ask (기존 규칙 유지).
1-8. 리포트 포맷 (사용자에게 출력)
## PR #{N} AI 리뷰 Triage
Total: X comments from Y bots → Z unique issues after dedup
| # | Severity | Validity | Scope | Action | File:Line | Sources | Rationale |
|---|----------|----------|-------|--------|-----------|---------|-----------|
| 1 | Critical | valid | in-scope | fix-now | src/a.ts:42 | coderabbit, gemini | null deref on optional field |
| 2 | Warning | needs-investigation | in-scope | ask-user | src/b.ts:10 | claude[bot] | async race — verify manually |
| 3 | Nit | false-positive | in-scope | skip | src/c.ts:5 | coderabbit | style handled by prettier |
| 4 | Warning | valid | out-of-scope | follow-up-issue | src/legacy.ts:200 | coderabbit | pre-existing, not touched by this PR |
| + | plus 3 similar nits summarized |
## Questions for you (선택 사항 — 질문 없으면 생략)
- **Q1 → #2 (의도성)**: 현재 `doWork()`는 에러를 throw 하지 않고 `null`을 반환. 리뷰어는 throw를 요구.
- (A) 의도된 silent fail이다 → skip, 답글로 "intentional" 설명
- (B) 의도 아니었다, throw로 바꿔야 함 → fix-now로 승격
- **Q2 → #5 (봇 상충)**: CodeRabbit은 `useMemo` 추가 권장, Gemini는 불필요하다고 평가. 어느 쪽?
- (A) CodeRabbit (useMemo 추가)
- (B) Gemini (그대로 유지)
- **Q3 → #4 (범위)**: `src/legacy.ts`는 이 PR에서 한 줄만 수정. 리뷰어는 파일 전체 리팩터 요구.
- (A) 이 PR 스코프 밖 → follow-up 이슈 (권장)
- (B) 이번에 같이 수정
## 다음 단계 제안
- fix-now: #1 (1건, 질문 답변 후 추가될 수 있음)
- ask-user: #2, #5 — 위 Q1, Q2 답변 필요
- follow-up-issue: #4 — 위 Q3 확정 후
- skip: #3, nits
위 질문에 답변 주시면 분류를 확정하고 Phase 2로 진행합니다. 테이블 자체를 수정하고 싶은 항목(승격/강등/제외)도 번호로 알려주세요.Read more
description: AI PR 리뷰 코멘트를 triage하고 유효한 것만 안전하게 수정 argument-hint: "[PR 번호 — 생략 시 현재 브랜치의 PR]"
PR 리뷰 코멘트 확인
AI 리뷰어(CodeRabbit, Claude bot, Codex, Gemini, Copilot 등)가 남긴 코멘트를 수집 · 분류 · 영향 분석 후, **승인된 유효 이슈만** 한 건씩 원자적으로 수정한다.
**Absolute rules (MUST follow):**
- MUST produce the triage report and get user approval BEFORE modifying any code.
- MUST NOT copy-paste AI-suggested patches verbatim. Understand the concern, then re-derive the fix from scratch.
- MUST fix one issue at a time. NO drive-by refactors, formatting changes, or style cleanups.
- MUST write GitHub replies in English (user preference).
- MUST NOT auto-resolve review threads. Let the reviewer (or the bot's re-review) close them.
- MUST NOT invoke adversarial CLIs (gemini/codex) without explicit user approval.
입력 인자: `$ARGUMENTS` (PR 번호, 생략 가능)
---
Phase 0 — 수집 (Collect)
1. **PR 번호 결정**: 인자가 있으면 사용, 없으면 `gh pr view --json number -q .number` 로 현재 브랜치의 PR 확인. PR이 없으면 사용자에게 물어본다. 2. **리뷰 데이터 fetch** (REST + GraphQL 조합):
- `gh api repos/{owner}/{repo}/pulls/{N}/comments` — 인라인 코멘트
- `gh api repos/{owner}/{repo}/pulls/{N}/reviews` — 리뷰 레벨 body
- GraphQL로 review threads + resolution 상태:
gh api graphql -f query='
query($owner:String!,$repo:String!,$num:Int!){
repository(owner:$owner,name:$repo){
pullRequest(number:$num){
reviewThreads(first:100){nodes{
id isResolved isOutdated
comments(first:20){nodes{id databaseId author{login} body path line originalLine diffHunk}}
}}
}
}
}' -f owner=... -f repo=... -F num=...3. **AI 봇 필터**: author login이 `coderabbitai`, `coderabbitai[bot]`, `claude[bot]`, `chatgpt-codex-connector`, `gemini-code-assist[bot]`, `copilot-pull-request-reviewer[bot]`, `github-actions[bot]` 중 하나인 것만. 인간 리뷰어 코멘트는 이 워크플로우 대상 아님 — 별도로 보고. 4. **resolved/outdated 스레드 제외** (이미 대응 완료). 5. PR의 변경 파일 목록도 같이 확보: `gh pr diff {N} --name-only` — "in-scope" 판정에 사용.
Phase 1 — 분류 (Triage) — **코드 수정 금지**
각 코멘트에 대해 아래를 판정한다. 결과는 **테이블로 사용자에게 먼저 보고하고 승인 대기**한다.
1-1. 중복 제거
여러 봇이 같은 파일+라인+본질적으로 같은 지적을 하면 하나의 행으로 병합. `Sources` 컬럼에 여러 봇 표시.
1-2. 분류 축 (4개)
| 축 | 값 | |----|-----| | **Severity** | `Critical` (동작 파괴/데이터 유출/롤백 차단) / `Warning` (정확성 위험) / `Suggestion` (개선 제안) / `Nit` (스타일·취향) | | **Validity** | `valid` / `false-positive` / `needs-investigation` | | **Scope** | `in-scope` (이 PR diff에 포함된 파일·라인) / `out-of-scope` (기존 코드, 이 PR이 건드린 적 없음) | | **Action** | `fix-now` / `skip` / `follow-up-issue` / `ask-user` |
1-3. 알려진 false-positive 패턴 → 자동 다운그레이드
아래에 해당하면 기본 `false-positive` 또는 `Nit`으로 분류하고 이유 명시:
- 프로젝트 린터/포매터가 이미 처리하는 스타일·포맷
- 타입 시스템상 non-null 보장된 값에 대한 null 체크 요구
- private/internal 헬퍼에 대한 docstring/주석 요구
- 테스트에 불필요한 mock·assertion 추가 요구
- 사소한 네이밍 취향
**단, 비동기 race condition 지적은 CodeRabbit이 ~75% 놓치지만 지적 자체는 자주 하므로 → 항상 `needs-investigation`으로 두고 수동 검증**.
1-4. 의도 이해 체크 (logic bug 맹점)
AI 리뷰어는 코드 품질에 최적화되어 있고 **기능의 의도는 모른다**. 각 valid 후보에 대해 자문: > "이 코멘트가 이 PR이 달성하려는 기능의 의도를 이해하고 있는가?"
아니라고 판단되면 `needs-investigation` + `ask-user`.
1-5. Scope 정책
- `in-scope` + valid → `fix-now` 후보
- `out-of-scope` + valid → `follow-up-issue` (이 PR에선 절대 수정 안 함, 별도 이슈 생성)
- `out-of-scope` + not-valid → `skip`
1-6. Nit 캡
`Nit`은 최대 5개까지만 개별 행으로 표시. 초과분은 `"plus N similar nits"` 한 줄로 요약.
1-7. Questions batch (의문 제기 · 의도 확인)
AI 리뷰는 **기능 의도 · 저장소 컨벤션 · 숨은 제약**을 모른다. Claude가 판단 못하는 경우를 단발성으로 흩뿌리지 말고, triage 리포트와 **같은 출력 안**에 배치로 모아서 한 번에 묻는다. 아래 카테고리를 빠짐없이 점검:
| 카테고리 | 언제 묻는가 | 질문 예시 | |---------|------------|----------| | **의도성 확인** | 수정 시 관찰 가능한 동작이 바뀌는 경우 (단순 내부 정리가 아님) | "리뷰어는 에러 throw를 요구하는데 현재는 silent fail. 의도된 설계인가요?" | | **숨은 제약 확인** | 리뷰어가 repo 컨벤션·기존 구조를 모를 가능성 | "이 패턴은 코드베이스 전반에서 일관되게 쓰이는데, 정말 바꿔도 되나요?" | | **봇 의견 상충** | 두 AI 리뷰어가 서로 반대 제안 | "CodeRabbit은 A 접근, Gemini는 B 접근 — 어느 쪽으로 갈까요?" | | **범위 경계 애매** | in-scope / out-of-scope 판정 애매 | "이 파일은 한 줄만 바꿨는데 리뷰어는 전체 리팩터 요구. follow-up으로 뺄까요?" | | **AI 제안 자체가 의심스러움** | 리뷰어의 suggested fix가 새 버그를 유발할 가능성 | "제안대로 하면 X 테스트가 깨질 것 같은데, 다른 방법으로 해결할까요?" | | **대적자 불일치** `(adv)` | Phase 1.5 대적자(Gemini/Codex)가 Claude 분류와 다른 의견 | "Gemini는 #3을 valid로 보지만 Claude는 false-positive로 분류. 어느 쪽?" |
**원칙:**
- 질문 없으면 이 섹션 생략.
- 각 질문은 **해당 이슈 번호에 연결** (`Q1 → #2`, `Q2 → #2, #5` 처럼).
- 단답/선택지 형태 선호 — 긴 서술 답변 요구 금지. 가능한 경우 A/B 옵션 제시.
- 대적자 발 질문은 `(adv)` 태그 + 출처(Gemini/Codex) 명시. 두 대적자 모두 반대면 default를 대적자 쪽으로.
- Phase 2 진행 중 **새로운 의문**이 생기면 그 이슈만 단독으로 stop-and-ask (기존 규칙 유지).
1-8. 리포트 포맷 (사용자에게 출력)
## PR #{N} AI 리뷰 Triage
Total: X comments from Y bots → Z unique issues after dedup
| # | Severity | Validity | Scope | Action | File:Line | Sources | Rationale |
|---|----------|----------|-------|--------|-----------|---------|-----------|
| 1 | Critical | valid | in-scope | fix-now | src/a.ts:42 | coderabbit, gemini | null deref on optional field |
| 2 | Warning | needs-investigation | in-scope | ask-user | src/b.ts:10 | claude[bot] | async race — verify manually |
| 3 | Nit | false-positive | in-scope | skip | src/c.ts:5 | coderabbit | style handled by prettier |
| 4 | Warning | valid | out-of-scope | follow-up-issue | src/legacy.ts:200 | coderabbit | pre-existing, not touched by this PR |
| + | plus 3 similar nits summarized |
## Questions for you (선택 사항 — 질문 없으면 생략)
- **Q1 → #2 (의도성)**: 현재 `doWork()`는 에러를 throw 하지 않고 `null`을 반환. 리뷰어는 throw를 요구.
- (A) 의도된 silent fail이다 → skip, 답글로 "intentional" 설명
- (B) 의도 아니었다, throw로 바꿔야 함 → fix-now로 승격
- **Q2 → #5 (봇 상충)**: CodeRabbit은 `useMemo` 추가 권장, Gemini는 불필요하다고 평가. 어느 쪽?
- (A) CodeRabbit (useMemo 추가)
- (B) Gemini (그대로 유지)
- **Q3 → #4 (범위)**: `src/legacy.ts`는 이 PR에서 한 줄만 수정. 리뷰어는 파일 전체 리팩터 요구.
- (A) 이 PR 스코프 밖 → follow-up 이슈 (권장)
- (B) 이번에 같이 수정
## 다음 단계 제안
- fix-now: #1 (1건, 질문 답변 후 추가될 수 있음)
- ask-user: #2, #5 — 위 Q1, Q2 답변 필요
- follow-up-issue: #4 — 위 Q3 확정 후
- skip: #3, nits
위 질문에 답변 주시면 분류를 확정하고 Phase 2로 진행합니다. 테이블 자체를 수정하고 싶은 항목(승격/강등/제외)도 번호로 알려주세요.The unified history viewer for AI coding assistants. Browse, search, and analyze conversations from Claude Code, Gemini CLI, Antigravity, Codex CLI, Cline, Cursor, Aider, OpenCode, ForgeCode, CodeBuddy Code, and Grok CLI — as a desktop app or headless server.
Repo: jhlee0409/claude-code-history-viewer

