AI 기반 PR 자동 리뷰 시스템. Claude Code(claude CLI)가 PR diff를 분석해 시니어 개발자 수준의 리뷰를 생성하고, 결과를 GitHub PR에 Draft Review(초안) 로 올린다. 로컬 전용 앱.
- PR 변경 감지 — 등록 레포의 열린 PR을 폴링·upsert, 신규/변경 PR 표시
- 구조화된 리뷰 컨텍스트 — diff + imports/exports/symbols/역의존성 + PR 의도 + 연결 이슈(
#N) - 리뷰 실행 — plan mode(읽기 전용), 병렬 실행, 요청사항(
user_request)·모델(Sonnet/Opus/Haiku) 선택 - 메트릭 — 토큰·비용·시간 저장, 대시보드 집계(전체/30일/7일), PR별 스파크라인
- 히스토리 — 레포/PR 그룹, 검색·필터·날짜 정렬, 3단계 접기, 후속 질문 채팅, GitHub 초안 게시
- 사람이 최종 확인 — GitHub에 PENDING 초안으로 올리고, 리뷰어가 Submit
레포 등록 → PR 변경 감지 → git worktree 준비 → diff/context 추출
→ 프롬프트 구성(review-rules + CLAUDE.md) → Claude 리뷰(plan mode)
→ Supabase 저장(메트릭·모델 포함) → 히스토리 조회/채팅
→ GitHub Draft Review 게시(인라인 + 본문)
- 읽기 전용 리뷰: Claude를 plan mode로 실행해 파일을 수정하지 않고 분석만 한다.
- 할루시네이션 최소화: 변경 파일의 정적 메타데이터와 PR/이슈 맥락을 "검증된 사실"로 넘긴다.
- 사람이 최종 확인: 자동 Submit 없이 초안 리뷰만 올린다.
- Next.js 16 (App Router) · TypeScript · Tailwind CSS
- Supabase (Postgres) · Octokit ·
claudeCLI
auto_reviewer/
src/
app/
page.tsx # 대시보드 (PR 목록·변경 감지·리뷰·통계·모델 선택)
repos/page.tsx # 레포 등록/관리
history/page.tsx # 리뷰 히스토리 (검색·필터·접기·채팅·게시)
api/
health/route.ts # Supabase 연결 확인
repos/route.ts # 레포 CRUD
check-prs/route.ts # GitHub PR 폴링/변경 감지
worktree/route.ts # worktree 생성/정리
analyze/route.ts # diff + context 추출 (검증용)
prompt/route.ts # 리뷰 입력 패키지 구성 (검증용)
review/route.ts # 리뷰 실행 + Supabase 저장
review-chat/route.ts # 리뷰 후속 질문 채팅
reviews/route.ts # 리뷰 히스토리 조회/삭제
publish/route.ts # GitHub Draft Review 게시
stats/route.ts # 리뷰 집계 통계
components/
Sidebar.tsx # 좌측 네비게이션
StatStrip.tsx # 대시보드 집계 카드
Sparkline.tsx # 레이턴시 미니 차트
lib/
supabase.ts # 클라이언트용 Supabase
supabase-server.ts # 서버 전용 Supabase (secret 키, RLS 우회)
database.types.ts # DB 타입
github.ts # Octokit + Draft Review 구성
git.ts # worktree + diff
context.ts # 변경 파일 정적 메타데이터
prompt.ts # CLAUDE.md/프롬프트 조합
claude-bridge.ts # claude CLI 실행 + 결과 파싱
review-models.ts # 모델 allowlist (sonnet/opus/haiku)
format.ts # 토큰·비용·시간 포맷
prompts/
review-rules.example.md # 기본 프롬프트 예시 (추적)
review-rules.md # 운영 프롬프트 (gitignore, 직접 생성)
supabase/schema.sql # 테이블 DDL
작업 공간(clone/worktree)은 프로젝트 밖 ~/.openclau/ (repos/, worktrees/)에 둔다. OPENCLAU_WORKSPACE_DIR로 변경 가능.
- Node.js (Next.js 16 호환 버전)
claudeCLI — PATH에 있어야 한다.# Windows irm https://claude.ai/install.ps1 | iex
확인:# macOS / Linux curl -fsSL https://claude.ai/install.sh | bash
claude --version. PATH에 못 올리면.env.local의CLAUDE_CLI_PATH에 실행 파일 절대경로를 지정한다.- Supabase 프로젝트 —
supabase/schema.sql을 SQL Editor에서 실행해 테이블을 만든다. - GitHub 토큰 — PR 조회용. 게시까지 쓰려면 대상 레포에 Pull requests: write 권한 필요.
- 리뷰 프롬프트 —
prompts/review-rules.md를 생성한다 (review-rules.example.md참고).
npm install
cp .env.example .env.local # 값 채우기
cp prompts/review-rules.example.md prompts/review-rules.md # 운영 프롬프트 (선택·커스터마이즈).env.local:
NEXT_PUBLIC_SUPABASE_URL=https://xxxx.supabase.co
NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY=sb_publishable_...
SUPABASE_SECRET_KEY=sb_secret_... # 서버 전용 (RLS 우회)
GITHUB_TOKEN=github_pat_...
CLAUDE_CLI_PATH= # 선택: claude가 PATH에 없을 때만
CLAUDE_REVIEW_MODEL= # 선택: sonnet/opus/haiku (UI 미지정 시 서버 기본값)
모델 선택: 대시보드 UI에서 PR별로 Sonnet/Opus/Haiku를 고를 수 있다. UI에서 선택하지 않으면 CLAUDE_REVIEW_MODEL env → sonnet 순으로 폴백한다.
npm run dev
claudeCLI를 설치/PATH 등록한 직후라면, dev 서버가 갱신된 PATH를 상속하도록 터미널(또는 에디터)을 재시작한 뒤 실행한다.
연결 확인: http://localhost:3000/api/health
GitHub 레포 URL 또는 owner/repo를 등록한다. 존재 여부를 GitHub로 검증한다.
- 변경 감지 — 등록 레포의 열린 PR을 가져온다.
- 모델 — Sonnet(기본·저렴) / Opus(고품질) / Haiku(빠름) 선택. 선택값은 localStorage에 유지된다.
- 요청 — 이번 리뷰 초점(예: 보안 위주)을 입력할 수 있다.
- 리뷰 — Claude가 분석하고
verdict(APPROVE/REQUEST_CHANGES/COMMENT)와 이슈가 저장된다. - 상태 칩 —
✓ 리뷰함, PR 갱신 시리뷰함 · 변경됨표시. - 집계 — 총 리뷰 수·성공률·비용·추세(전체/30일/7일)를 상단에서 확인한다.
- 레포 → PR → 리뷰 3단계 접기 (기본 접힘). 검색·verdict/모델/레포/기간 필터·최신/오래된순 정렬.
- 질문 — 해당 리뷰를 작성한 AI에게 후속 질문 (같은 모델 사용).
- GitHub에 게시 — diff에 맞는 이슈는 인라인, 나머지는 본문으로 PENDING 초안 리뷰 생성.
- 삭제 — 불필요한 리뷰 기록 제거.
이후 GitHub에서 리뷰어가 확인하고 Submit 한다.
실제 리뷰 규칙은 prompts/review-rules.md(gitignore)에 둔다. 없으면 review-rules.example.md가 폴백으로 사용된다. 팀/레포 특성에 맞게 수정하면 리뷰 품질에 가장 큰 영향을 준다.
| 테이블 | 용도 |
|---|---|
repositories |
추적 레포 |
pull_requests |
PR 메타데이터 |
reviews |
리뷰 결과·메트릭·user_request·model |
review_issues |
이슈 상세 |
review_failures |
실행 실패 기록 (에러율 집계) |
review_messages |
리뷰별 후속 질문 채팅 |
기존 DB에 마이그레이션이 필요하면 supabase/schema.sql 하단의 -- migrations 주석을 참고한다.
- 로컬 전용 앱, 외부 배포·인증 없음 (1인/소규모 보조 리뷰어 용도).
- PR push마다 자동 리뷰는 없음 — 변경 감지와 리뷰 버튼을 수동으로 실행한다.
- worktree는 리뷰 후 자동 삭제하지 않는다(in-place 재사용). 디스크는 주로 clone 수에 비례한다.
- GitHub 게시는 토큰에 write 권한이 있는 레포에서만 동작한다.
- 대형 PR은 diff/context 한도·타임아웃(최대 5분)으로 일부 누락될 수 있다.
- 리뷰 품질은
review-rules.md튜닝과 "AI 1차 → 사람 최종 Submit" 워크플로를 전제로 한다.