<h1 align="center">코드 구루</h1>
<p align="center">
<a href="https://github.com/rios0rios0/code-guru/releases/latest">
<img src="https://img.shields.io/github/release/rios0rios0/code-guru.svg?style=for-the-badge&logo=github" alt="최신 릴리스"/></a>
<a href="https://github.com/rios0rios0/code-guru/blob/main/LICENSE">
<img src="https://img.shields.io/github/license/rios0rios0/code-guru.svg?style=for-the-badge&logo=github" alt="라이선스"/></a>
<a href="https://github.com/rios0rios0/code-guru/actions/workflows/default.yaml">
<img src="https://img.shields.io/github/actions/workflow/status/rios0rios0/code-guru/default.yaml?branch=main&style=for-the-badge&logo=github" alt="빌드 상태"/></a>
<a href="https://sonarcloud.io/summary/overall?id=rios0rios0_code-guru">
<img src="https://img.shields.io/sonar/coverage/rios0rios0_code-guru?server=https%3A%2F%2Fsonarcloud.io&style=for-the-badge&logo=sonarqubecloud" alt="커버리지"/></a>
<a href="https://sonarcloud.io/summary/overall?id=rios0rios0_code-guru">
<img src="https://img.shields.io/sonar/quality_gate/rios0rios0_code-guru?server=https%3A%2F%2Fsonarcloud.io&style=for-the-badge&logo=sonarqubecloud" alt="품질 게이트"/></a>
<a href="https://www.bestpractices.dev/projects/12023">
<img src="https://img.shields.io/cii/level/12023?style=for-the-badge&logo=opensourceinitiative" alt="OpenSSF 모범 사례"/></a>
</p>
A CLI 도구로, AI(Claude Code CLI 또는 OpenAI API)를 활용하여 GitHub 및 Azure DevOps 전반의 풀 리퀘스트를 자동으로 검토하고, 설정 가능한 규칙 파일에서 코딩 표준을 강제합니다.
기능
- [gitforge]를 통한 다중 공급자 지원: GitHub 및 Azure DevOps
- 이중 AI 백엔드: Claude Code CLI (
claude --print) 또는 OpenAI Chat Completions API
- [guide]에서 가져온 마크다운 파일을 사용한 규칙 기반 검토 (또는 임의 디렉토리)
- 파일-글로브(file-glob) 기반 필터링을 위한 규칙 내 YAML
frontmatter (예: paths: ["**/*.go"])
- 프로젝트 인식 검토: 검토 대상 저장소 자체의
AGENTS.md (또는 CLAUDE.md)가 자동으로 로드되어 (어떤 공급자에서도) 프로젝트별 컨텍스트로 AI에 전달되므로, 검토가 프로젝트 문서화된 규칙을 준수합니다 — Project Guidelines 참조
- 의도 인식 검토: PR의 제목, 브랜치 이름, 설명 및 커밋 수가 AI에 전달되어 작성자가 주장하는 내용과 diff가 실제로 일치하는지 판단하고 문서화되지 않은 범위 확대를 플래그 지정할 수 있습니다 — Pull Request Context 참조
- gitforge를 통해 인라인 및 일반 PR 댓글 게시
- 세 가지 모드: 단일 PR 검토, 일괄 검토(review-all), 그리고 검색(open PR 목록 보기)
- 각 PR을 정확히 한 번만 검토합니다 — 이후 푸시는 no-op입니다. 재검토를 요청하려면,
@code-guru (대소문자 무시)를 언급하는 PR 댓글을 게시하거나, 해당 계정이 bot_identities에 나열된 경우 봇이 자체적으로 게시하는 계정을 언급하거나, 또는 — Azure DevOps의 경우 설정 없이도 — 댓글 상자의 @-자동 완성 기능에서 봇을 직접 선택합니다 — Mentioning the bot 참조. GitHub에서는 해당 언급이 PR 전체 댓글과 인라인 검토 스레드 모두에서 작동합니다.
다시 검토할 때, 이 봇은 기존 대화를 읽는 리뷰어 역할을 수행합니다. 즉, 모든 이전 봇 인라인 스레드와 모든 답글을 로드하고, 각각을 resolved / outstanding / outdated로 분류하며, 각 이전 스레드 내부에 짧은 답변 하나를 게시합니다 (제공자(provider)의 ReplyToThread 기능을 통해, 답변이 별도의 같은 줄 댓글이 아닌 작성자의 답글 아래에 배치되어 마치 사람이 리뷰하는 것처럼 보입니다). 그리고 자신이 해결했다고 판단한 스레드는 자동 폐쇄합니다 (Azure DevOps 스레드 상태: fixed). 새로운 발견 사항은 오직 diff가 진정으로 필요로 하고 봇이 이미 다룬 스레드와 중복되지 않을 때만 게시됩니다. 이는 이전에 모든 재검토가 이전 댓글의 수정된 사본을 PR에 범람시키던 실패 모드를 대체합니다. 이 봇은 내장된 code-guru 로그인 형태, PR 전반에 걸쳐 리뷰 주석을 게시한 계정을 자체 감지하는 방식, 그리고 bot_identities (환경 변수 CODE_GURU_BOT_IDENTITIES)에 나열된 모든 식별자를 통해 자신의 이전 댓글을 인식합니다. 따라서 배포가 서비스 계정으로 이루어질 때도 재검토는 여전히 이전 스레드를 읽고 해결할 수 있습니다.
설치 (Installation)
go install github.com/rios0rios0/codeguru/cmd/code-guru@latest
또는 소스에서 빌드합니다:
git clone https://github.com/rios0rios0/code-guru.git
cd code-guru
go build -o code-guru ./cmd/code-guru/
설정 (Configuration)
.code-guru.yaml 파일을 생성합니다 (검색 위치: ., .config, configs, ~, ~/.config):
providers:
- type: 'github'
token: '${GITHUB_TOKEN}'
...
토큰 해상도 (Token Resolution)
토큰은 세 가지 해상도 전략을 지원합니다:
- 환경 변수:
${GITHUB_TOKEN}은 환경 변수에서 확장됩니다.
- 파일 경로: 해상된 문자열이 파일 경로인 경우, 그 내용을 읽습니다.
- 인라인 (Inline): 리터럴 토큰 문자열입니다.
사용법 (Usage)
열린 PR 검색하기 (Discover open PRs)
code-guru discover -c .code-guru.yaml
모든 열린 PR 검토하기 (batch mode)
code-guru review-all -c .code-guru.yaml --dry-run
code-guru review-all -c .code-guru.yaml
단일 PR 검토
code-guru review https://github.com/org/repo/pull/123
code-guru review https://dev.azure.com/org/project/_git/repo/pullrequest/456
플래그
| Flag | Description |
|---|
-c, --config | 설정 파일 경로 (기본값: 자동 감지) |
| ... | |
| :--- | :--- |
지원되는 Provider
| Provider | Type Key | PR Comments | Inline Comments |
|---|
| GitHub | github | 예 | 예 |
| Azure DevOps | azuredevops | 예 | 예 |
AI 백엔드
| Backend | Key | How It Works |
|---|
| Anthropic | anthropic | Go SDK를 통해 Anthropic Messages API에 직접 호출합니다. |
| ... | | |
| :--- | :--- | |
AI 판정 (AI Verdict)
각 검토는 댓글과 함께 판정을 반환합니다:
| Verdict | Meaning |
|---|
approve | 차단하는 문제가 없으며, 병합해도 안전함 |
| ... | |
판정은 기계 파싱을 위해 VERDICT:<value> 형식으로 출력됩니다.
봇 언급하기
PR은 한 번만 검토되며, 이후 푸시는 아무 작업도 하지 않습니다. 재검토를 요청하려면 PR 댓글에 봇을 언급하세요. 다음 세 가지가 언급으로 간주됩니다:
@code-guru — 항상 허용되며, 모든 배포에서 설정 없이 작동합니다.
- 봇이 게시하는 계정 —
bot_identities(env CODE_GURU_BOT_IDENTITIES)의 모든 항목은 사용자가 실제로 입력할 @-언급 형식으로 정규화됩니다. 왜냐하면 PR에서는 code-guru가 아닌 서비스 계정을 보기 때문입니다:
- 자체적으로, Azure DevOps의
@-자동 완성에서 선택 — 설정이 전혀 필요하지 않습니다. 아래 Azure DevOps @-자동 완성을 참조하십시오.
일치 여부는 대소문자를 구분하지 않으며 단어 경계(word boundary)에서 멈추므로, @svc-codeguru-staging은 @svc-codeguru의 언급으로 간주되지 않습니다.
이 봇이 게시하는 계정만 나열하십시오. bot_identities에 있는 항목들은 실시간 재검토 트리거(live re-review triggers)이므로, 공유 자동화 계정을 여기에 추가하면 그 이름을 입력하는 모든 사람이 전체 검토를 시작하게 됩니다. 타사 자동화 계정은 대신 trivial.auto_merge_allowed_authors에 속해야 합니다.
언급이 작동하는 곳. Azure DevOps에서는 모든 PR 댓글에서, GitHub에서는 PR 전반의 댓글과 인라인 리뷰 스레드 내부의 답글 모두에서 가능합니다. 후자는 엔드포인트가 필요합니다. 여러 인라인 댓글에 언급을 포함한 단일 GitHub 검토 제출은 하나의 검토로 중복 제거됩니다.
Azure DevOps @-자동 완성
ADO 댓글 상자는 자동 완성된 언급을 @<identity-guid> 마크업으로 대체하므로, 사용자가 선택한 계정 이름이 웹훅에 도달하는 적은 없으며, 이름 형태의 bot_identities 항목으로는 이를 일치시킬 수 없습니다.
해당 양식은 어쨌든 인식됩니다: 댓글에 @<…> 마크업이 포함되어 있고 다른 어떤 것도 일치하지 않을 때, 봇은 Azure DevOps에게 자신의 PAT가 어떤 ID로 인증되는지(_apis/connectionData, 프로세스 수명 주기 동안 조직별 캐시)를 요청하고 두 가지를 비교합니다. 따라서 자동 완성에서 봇을 선택하는 것은 설정 없이도 작동합니다. 일반 댓글은 조회 비용을 지불하지 않습니다. 이는 본문에 평문 스캔이 이미 실패한, 잘 구성된 @<guid>가 포함되어 있을 때만 실행되며, server.allowed_organizations 외부의 조직에 대해서는 절대 실행되지 않습니다.
조회가 실행될 수 없다면 (PAT 없음, API 연결 불가), 봇은 경고를 기록하고 위에 설정된 두 가지 양식으로 폴백합니다. 평문으로 @code-guru를 입력하는 것은 항상 작동합니다. 다른 누군가에게로 해결되는 @<…> 언급은 발견한 ID를 명시하며 Info 레벨로 기록되므로, 아무도 소환하지 않은 언급은 기본 레벨에서 pod 로그에 표시되고 조용히 사라지지 않습니다.
사소한 PR 감지 (Trivial PR Detection)
사소한 감지가 활성화되었고 CI가 통과했을 때, 내장 어댑터와 일치하는 PR은 LLM을 호출하지 않고 처리되어 토큰을 절약합니다. 웹훅 모드에서는 CI 상태를 웹훅 이벤트에서 제공합니다. CLI 모드에서는 gitforge의 GetPullRequestCheckStatus()를 통해 CI 상태 감지가 계획되고 있습니다 (아직 사용 가능하지 않음).
사소한 어댑터는 두 가지 범주가 있습니다:
업데이트 어댑터 (Update Adapters) (종속성 업데이트)
이들은 종속성 업데이트 PR을 감지하고 자동으로 승인합니다.
| 어댑터 | 일치하는 경우 |
|---|
update-go | go.mod, go.sum, CHANGELOG.md만 변경된 경우 |
| ... | |
펌프 어댑터 (Bump Adapters) (버전 증가 / 릴리스)
이들은 버전 증가(릴리스 의식) PR을 감지합니다. 리포에 .autobump.yaml 설정 파일이 포함되어 있다면, 이 어댑터는 설정에 선언된 모든 버전 파일이 PR에 존재하는지 검증합니다. 누락된 파일은 거부 (reject) 판결을 초래합니다.
| Adapter | Default Files | AutoBump Language Key |
|---|
bump-go | CHANGELOG.md | go |
| ... | | |
Other Adapters
| Adapter | Matches When |
|---|---|---|
| docs-only | Only *.md files changed (excluding a CHANGELOG.md-only change — see note) |
참고 — 변경 로그만 포함된 변경은 버전 번호 증가를 의미합니다. CHANGELOG.md만을 건드리는 PR은 버전 번호 증가/릴리스 세레모니의 특징이므로, 오직 bump-* 어댑터에 의해서만 일치합니다. docs-only와 update-* 어댑터는 이를 거부합니다: 변경 로그가 문서화 또는 종속성 변경을 수반할 수는 있지만, 단독으로 트리거될 수는 없습니다. 이는 bump-* 어댑터를 비활성화하면 버전 번호 증가가 사소한 자동 병합(auto-merge)에서 제외되어, docs-only나 update-*로 조용히 넘어가는 것을 방지한다는 의미입니다.
설정 (Configuration)
.code-guru.yaml에 구성합니다:
trivial:
enabled: true
adapters:
...
또는 환경 변수를 통해 구성합니다:
CODE_GURU_TRIVIAL_ADAPTERS=update-go,bump-go,docs-only
CODE_GURU_TRIVIAL_AUTO_MERGE=true
CODE_GURU_TRIVIAL_MERGE_STRATEGY=squash
...
auto_merge는 기본적으로 의도적으로 꺼져 있습니다 — 이는 인간의 검토를 우회하여 시스템 간에 병합하기 때문에, 게이트(gate)는