<img alt="Rust Doctor" src="https://raw.githubusercontent.com/arthjean/rust-doctor/HEAD/assets/rust-doctor-mark.png" width="52" height="36">
version
downloads
에이전트가 잘못된 Rust 코드를 작성하면, 이것이 이를 잡아냅니다.
Rust Doctor는 142개의 엄선된 규칙을 사용하여 Cargo 워크스페이스를 스캔하고 보안(security), 정확성(correctness), 신뢰성(reliability), 성능(performance), 유지보수성(maintainability), 그리고 의존성(dependencies) 전반에 걸쳐 문제를 찾아냅니다. 100점 만점의 점수를 부여하며, 가장 먼저 수정해야 할 세 가지 규칙을 제시합니다.
단일 바이너리 크레이트(binary crate), 라이브러리, 수십 개의 멤버를 가진 가상 워크스페이스 등 모든 Cargo 워크스페이스에서 작동합니다.
모든 것이 로컬에서 실행됩니다: rust-doctor는 네트워크 연결을 열지 않으며, 아무것도 업로드하거나 원격 측정(telemetry) 데이터를 전송하지 않습니다. Cargo가 cargo build를 수행할 때처럼 누락된 의존성을 다운로드하며, CARGO_NET_OFFLINE=true 환경 변수는 이를 금지합니다. Cargo는 컴파일하는 모든 것의 빌드 스크립트와 절차적 매크로(procedural macros)를 실행하므로, 신뢰할 수 있는 로컬 워크스페이스만 검사합니다. 제한 사항 →
웹사이트 →
설치
1. 빠른 시작
워크스페이스 루트에서 다음 명령을 실행하여 감사(audit)를 수행합니다.
또는, 컴파일하는 대신 GitHub Release에 첨부된 아카이브를 다운로드하는 cargo-binstall을 사용하여 미리 빌드된 바이너리를 설치합니다:
cargo binstall rust-doctor
또는 crates.io에서 빌드합니다:
cargo install rust-doctor --locked
--locked 플래그를 사용하면 릴리스가 배포된 Cargo.lock을 기반으로 빌드됩니다. 이 플래그 없이 실행할 경우, Cargo는 그날 가장 최신 버전의 모든 의존성을 선택하게 되는데, 이는 이전에 컴파일에 실패했던 버전일 수 있습니다(#40).
2. 에이전트용 설치
감사(audit)를 완료했다면, 코딩 에이전트가 발견한 문제를 수정하도록 루프를 설정합니다. 이 스킬은 어떤 발견 사항을 먼저 수정해야 하는지, 점수가 어떻게 제한되는지(capped), 그리고 이미 스캔에서 플래그가 지정된 파일에서 무엇을 찾아야 하는지를 에이전트에게 가르칩니다. 후크(hooks)는 각 커밋과 각 에이전트 턴마다 재스캔합니다.
npx rust-doctor@latest setup
이 명령어는 PATH에 있는 Claude Code, Codex, Cursor의 명령 및 프로젝트 디렉토리에서 이를 감지한 다음, 바이너리로부터 각 스킬, git pre-commit 후크, 그리고 Claude Code 또는 Cursor의 턴 종료(end-of-turn) 후크를 작성합니다. 계획을 출력하고 아무것도 쓰기 전에 모든 파일을 확인하며(--dry-run은 여기서 중단), 자신이 생성하지 않은 파일은 절대 덮어쓰지 않고, 기존 에이전트 설정 파일에 턴 종료 후크를 병합하면서 다른 모든 키는 유지합니다. skill install은 스킬만 설치합니다.
턴 종료 후크는 cargo clippy를 실행하므로, 에이전트가 작성한 트리의 빌드 스크립트와 절차적 매크로(procedural macros)가 계정의 권한으로 모든 턴 끝에서 실행됩니다. rust-doctor hook install claude --no-clippy (또는 cursor)는 아무것도 컴파일하지 않는 후크를 설치합니다: rust-doctor.toml에 무엇이 적혀 있든, 모든 Clippy 규칙은 비활성화됩니다.
pre-commit 후크는 커밋이 기록하는 내용을 --scope lines에서 스캔하고, 턴 종료 후크가 차단하는 것과 동일한 레벨의 경고를 추가하는 커밋은 거부합니다. git commit --no-verify는 이를 건너뛰며, 실행할 수 없는 스캔은 "판단되지 않았다"고 말하며 커밋을 통과시킵니다.
대신 일회성 인계(handoff)를 위해서는 보고서가 발견 사항을 규칙, 범위(spans), 스캔 범위를 이미 프롬프트에 작성한 상태로 에이전트에게 직접 전송합니다.
Claude Code, Codex, Cursor 모두와 작동하며, 다른 모든 에이전트를 위해 동일한 컨텍스트를 클립보드에 복사합니다.
3. CI에서 실행하기 (Run in CI)
Rust Doctor는 모든 풀 리퀘스트(pull request)를 검토하고, 사용자의 기존 백로그가 아닌 변경 사항이 도입한 문제점만 보고합니다. 한 명령어로 설정하거나, 보고서 메뉴에서 설정할 수 있습니다.
rust-doctor ci install --comment
이 명령어는 .github/workflows/rust-doctor.yml 파일을 Git 리포지토리 상단에 작성합니다. 이 파일은 Cargo 워크스페이스(예: src-tauri/, backend/)가 존재할 경우 해당 워크스페이스를 스캔하며, 작성된 버전과 검증된 툴체인에 고정됩니다. 또한, 자신이 작성하지 않은 파일은 절대 덮어쓰지 않습니다 (만약 --update 옵션을 사용하면 자신만 재작성합니다). 풀 리퀘스트(Pull request)는 --blocking 레벨에서 설정한 내용에 대해서만 실패하며, 기본 브랜치로의 푸시(push)는 실패하지 않고 보고서가 작성됩니다. --comment를 사용하면 또한 두 번째 작업(job)을 통해 풀 리퀘스트당 하나의 고정 댓글(sticky comment)으로 결과를 게시합니다. 이 두 번째 작업은 pull-requests: write 권한을 가지며, 풀 리퀘스트의 코드를 실행하지 않습니다. 포크된(forked) 풀 리퀘스트의 경우 읽기 전용 토큰이 부여되며 경고 메시지가 표시됩니다.
사용자 지정 워크플로우를 구성하려면 액션(Action) uses: arthjean/rust-doctor@v0을 사용하고, 출력값(score, authoritative, introduced, fixed, exit-code)을 활용하십시오. 이 액션에는 contents: read 권한만 부여하면 됩니다. 이는 풀 리퀘스트의 코드(빌드 스크립트 포함)를 빌드하는 데 필요한 최소한의 권한입니다. 고정 댓글은 두 번째 작업에서 오는 것이며, 이 작업만이 pull-requests: write 권한을 가집니다. 이 작업은 아무것도 체크아웃하지 않고 스캔이 업로드한 보고서를 읽습니다 (comment-on-clean: false를 사용하면 깨끗한 풀 리퀘스트에서는 건너뜁니다):
permissions:
contents: read
...
해당 액션은 오직 발견된 내용에 대해서만 풀 리퀘스트를 실패 처리하며, 푸시는 실패하지 않고 보고합니다. 풀 리퀘스트 스캔에는 베이스(base)의 히스토리가 필요하므로 fetch-depth: 0으로 체크아웃하는 것이 좋습니다. 만약 깊이가 얕은(shallow checkout) 경우에도 토큰이 허용하면 액션이 스스로 베이스를 가져옵니다.
바이너리는 여전히 네트워크 연결을 열지 않습니다. 댓글은 워크플로우 자체의 GitHub 토큰에 의해 게시됩니다.
CI 문서 →
어떤 규칙을 실행할지, 그리고 어떻게 실행할지는 rust-doctor.toml 파일이나 커맨드 라인에서 구성할 수 있습니다.
rust-doctor --rule clippy::unwrap_used=off
rust-doctor --category performance=error
더 알아보기 →
개인정보 보호(Privacy)
CLI는 누구에게도 아무것도 보고하지 않습니다. 자체 네트워크 연결이 없으며, 업로드 기능, 원격 측정(telemetry), 충돌 보고서(crash reporting)가 없고, 거부할 것도 없습니다. 바이너리에는 HTTP 클라이언트나 분석 의존성(analytics dependency)이 포함되어 있지 않습니다.
--json 보고서는 작업 공간 내에 머무르며 다음 내용만을 담고 있습니다:
- 진단(Diagnostics): 규칙 ID(rule id), 카테고리(category), 정책 적용 전후의 심각도(severity), 그리고 해당 범위(span)를 가진 작업 공간 상대 경로
- 점수(Score): 숫자, 그 차원(dimensions), 게이트 판정(gate verdict), 및 순위 지정에서 제외된 규칙들
- 오류(Errors): 어떤 테스트가 실패했고 그 이유, 그리고 언제 발생했는지
절대 경로(absolute path), 환경 변수(environment variable), 사용자 데이터는 포함되지 않습니다.
개인정보 보호 문서 →
기여(Contributing)
이슈 환영합니다!
라이선스(License)
사용자의 선택에 따라 MIT 또는 Apache-2.0입니다. LICENSE-MIT 및 LICENSE-APACHE를 참조하십시오.