Skip to content

Repository files navigation

OpenClau

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 · claude CLI

프로젝트 구조

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로 변경 가능.

사전 준비

  1. Node.js (Next.js 16 호환 버전)
  2. claude CLI — PATH에 있어야 한다.
    # Windows
    irm https://claude.ai/install.ps1 | iex
    # macOS / Linux
    curl -fsSL https://claude.ai/install.sh | bash
    확인: claude --version. PATH에 못 올리면 .env.localCLAUDE_CLI_PATH에 실행 파일 절대경로를 지정한다.
  3. Supabase 프로젝트supabase/schema.sql을 SQL Editor에서 실행해 테이블을 만든다.
  4. GitHub 토큰 — PR 조회용. 게시까지 쓰려면 대상 레포에 Pull requests: write 권한 필요.
  5. 리뷰 프롬프트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

http://localhost:3000 접속.

claude CLI를 설치/PATH 등록한 직후라면, dev 서버가 갱신된 PATH를 상속하도록 터미널(또는 에디터)을 재시작한 뒤 실행한다.

연결 확인: http://localhost:3000/api/health

사용 방법

1. 레포 등록 (/repos)

GitHub 레포 URL 또는 owner/repo를 등록한다. 존재 여부를 GitHub로 검증한다.

2. PR 감지 + 리뷰 (/ 대시보드)

  • 변경 감지 — 등록 레포의 열린 PR을 가져온다.
  • 모델 — Sonnet(기본·저렴) / Opus(고품질) / Haiku(빠름) 선택. 선택값은 localStorage에 유지된다.
  • 요청 — 이번 리뷰 초점(예: 보안 위주)을 입력할 수 있다.
  • 리뷰 — Claude가 분석하고 verdict(APPROVE/REQUEST_CHANGES/COMMENT)와 이슈가 저장된다.
  • 상태 칩✓ 리뷰함, PR 갱신 시 리뷰함 · 변경됨 표시.
  • 집계 — 총 리뷰 수·성공률·비용·추세(전체/30일/7일)를 상단에서 확인한다.

3. 히스토리 + 게시 (/history)

  • 레포 → PR → 리뷰 3단계 접기 (기본 접힘). 검색·verdict/모델/레포/기간 필터·최신/오래된순 정렬.
  • 질문 — 해당 리뷰를 작성한 AI에게 후속 질문 (같은 모델 사용).
  • GitHub에 게시 — diff에 맞는 이슈는 인라인, 나머지는 본문으로 PENDING 초안 리뷰 생성.
  • 삭제 — 불필요한 리뷰 기록 제거.

이후 GitHub에서 리뷰어가 확인하고 Submit 한다.

프롬프트 커스터마이즈

실제 리뷰 규칙은 prompts/review-rules.md(gitignore)에 둔다. 없으면 review-rules.example.md가 폴백으로 사용된다. 팀/레포 특성에 맞게 수정하면 리뷰 품질에 가장 큰 영향을 준다.

DB 스키마

테이블 용도
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" 워크플로를 전제로 한다.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages