CLI
Claw Code는 Claude Code의 아키텍처를 Rust와 Python으로 클린룸 재구현한 에이전트 코딩 CLI 도구다. 소스 유출 사건 이후 "단순 아카이브가 아니라 실제로 동작하는 도구를 만들자"는 목표로 탄생했으며, 역대 최단시간 GitHub 100K+ 스타를 기록했다.
Claude Code의 소스코드가 실수로 공개되자 수천 개의 포크가 생겼습니다. 대부분은 단순 복사본이었지만, Claw Code는 달랐습니다. 원본 레시피(아키텍처)를 보고 더 안전한 재료(Rust + unsafe 금지)로 처음부터 다시 요리한 것입니다.
핵심 차이는 Provider 추상화입니다. Claude Code는 Anthropic API 전용이지만, Claw Code는 전략 패턴으로 Anthropic, OpenAI 호환, Grok을 같은 코드로 다룰 수 있습니다.
2026년 3월 31일 Anthropic이 DMCA 요청을 8,100+개 레포에 보냈다. 단순 복사 포크는 법적으로 삭제됐지만, 클린룸 재구현(rewrite)은 살아남았다.
원본 소스를 직접 참조하지 않고, 공개된 동작/스펙만 보고 처음부터 재구현. MIT 라이선스로 누구나 포크/수정 가능. unsafe 코드 완전 금지로 메모리 안전성 보장.
| 비교 항목 | Claude Code (원본) | OpenAI Codex CLI | Claw Code |
|---|---|---|---|
| 언어 | TypeScript/Shell | Rust | Rust (메모리 안전 + 고성능) |
| 모델 제공자 | Anthropic 전용 | OpenAI 전용 | 다중 제공자 (Anthropic, OpenAI 호환, Grok) |
| 오픈소스 | 비공개 | Apache-2.0 | MIT 라이선스 |
| MCP 지원 | 클라이언트 | 클라이언트+서버 | Stdio, WebSocket, Remote |
| unsafe 정책 | 없음 | 일부 허용 | 완전 금지 (forbid) |
| 요소 | 설명 |
|---|---|
| Python 3.10+ | dataclasses, typing 활용 |
| 목적 | 아키텍처 검증 & 포팅 상태 추적 |
| 패턴 | Frozen Dataclasses, CLI 진입점 |
| 테스트 | unittest discover |
| 요소 | 설명 |
|---|---|
| CI/CD | GitHub Actions |
| 대상 플랫폼 | macOS, Linux (Windows 미완성) |
| 배포 방식 | 소스 빌드 (cargo install) |
| 코드 품질 | clippy (all=warn, pedantic=allow 억제), rustfmt |
path = "../runtime" 같은 로컬 의존성으로 연결. workspace.dependencies로 버전 통일 관리. 순환 참조 방지.api 크레이트의 providers/ 디렉토리에 anthropic.rs와 openai_compat.rs가 분리되어 있다. Grok(xAI)는 별도 파일 없이 openai_compat.rs 내 OpenAiCompatConfig로 처리된다(xAI 전용 URL·env var 포함). 새로운 LLM 제공자를 추가하려면 이 디렉토리에 파일 하나만 추가하면 된다. 전형적인 Strategy 패턴이다.
sandbox.rs가 유일한 public 모듈인 점이 인상적이다. 이는 모든 외부 코드 실행이 샌드박스를 통해야 한다는 설계 의도를 나타낸다. 파일 작업(file_ops.rs)이나 bash 실행(bash.rs)도 샌드박스 컨텍스트 안에서 이루어진다.
hooks.rs의 HookRunner가 도구 실행 전후에 사용자 정의 로직을 주입할 수 있다. Claude Code의 훅 시스템과 동일한 패턴으로, 프리/포스트 실행 단계에서 검증이나 로깅을 수행한다.
| 배울 것 | 어디서 | 왜 중요한가 |
|---|---|---|
| Cargo Workspace 설계 | rust/Cargo.toml | 대규모 Rust 프로젝트의 표준 구조. resolver v2, 공유 의존성 관리 |
| Tokio 비동기 런타임 | runtime 크레이트 전체 | LLM API 호출, MCP 통신 등 모두 async/await 기반 |
| Axum 웹 프레임워크 | server 크레이트 | tower 생태계 위의 현대적 Rust 웹 서버 구축법 |
| Reqwest + SSE | api/src/sse.rs | LLM 스트리밍 응답을 처리하는 실전 패턴 |
| unsafe 금지 정책 | Cargo.toml 린트 설정 | unsafe_code = "forbid" — 프로덕션 안전성 확보 |
| Clippy 린트 설정 | 워크스페이스 린트 | all=warn으로 기본 규칙 강제, pedantic=allow로 과도한 경고 억제 — 실용적 품질 균형 |
| 배울 것 | 어디서 | 왜 중요한가 |
|---|---|---|
| JSON-RPC 프로토콜 | runtime/mcp.rs | MCP의 통신 기반 |
| Stdio 전송 계층 | runtime/mcp_stdio.rs | 프로세스 간 통신(IPC) 구현 |
| 도구 매니페스트 | tools/src/lib.rs | LLM이 도구를 발견하고 호출하는 스키마 |
REPL 구현: claw-cli + Rustyline으로 대화형 CLI 구축 패턴. 터미널 제어: Crossterm으로 색상, 커서, 키 입력 처리. 마크다운 렌더링: pulldown-cmark + Syntect로 터미널에서 코드 구문 강조 출력.
| 항목 | 최소 사양 | 권장 사양 |
|---|---|---|
| OS | Linux (glibc 2.17+) 또는 macOS | macOS (Apple Silicon) 또는 최신 Linux |
| Rust | Stable 툴체인 (1.70+) | 최신 Stable |
| 메모리 | 2GB (빌드 시) | 4GB+ |
| 디스크 | 500MB (빌드 아티팩트) | 1GB |
| 네트워크 | LLM API 접속 필요 | 안정적인 인터넷 |
| API 키 | Anthropic 또는 OpenAI 호환 키 | 여러 제공자 키 |
| Windows | 미완성 (Linux WSL2 권장) | — |
git clone https://github.com/ultraworkers/claw-code.git
cd claw-code/rust
cargo build --release -p claw-cli
./target/release/claw
cd claw-code
python3 -m src.main summary
python3 -m src.main manifest
rust/crates/api/src/providers/ 디렉토리에 ollama_provider.rs를 추가해서 로컬 Ollama 서버와 통신하는 제공자를 구현한다.
commands 크레이트에 /stats 명령어를 추가한다. 현재 세션의 토큰 사용량(usage.rs)을 예쁘게 출력하는 기능이다.
runtime의 MCP 서브시스템을 활용해서 외부 MCP 서버(예: 파일 시스템 서버)를 연결하고, REPL에서 MCP 도구를 호출할 수 있도록 E2E 파이프라인을 완성한다.
The Rust Book 1~10장 (소유권, 라이프타임, 제네릭), rustlings 연습 문제 풀기, 간단한 CLI 도구 하나 만들어보기 (clap 사용).
Tokio 공식 튜토리얼 (mini-redis 예제), async/await 심화 — Pin, Future 트레이트 이해, claw-code의 runtime 크레이트 코드 리딩.
Axum 공식 예제 따라하기, Reqwest로 LLM API 호출하는 미니 프로젝트, SSE(Server-Sent Events) 스트리밍 구현, claw-code의 api, server 크레이트 분석.
MCP 스펙 문서 읽기 (modelcontextprotocol.io), 간단한 MCP 서버/클라이언트 구현, JSON-RPC 2.0 프로토콜 이해, claw-code의 MCP 서브시스템 코드 리딩.
Rust의 동적 디스패치 (dyn Trait) vs 정적 디스패치, 플러그인 레지스트리 패턴 구현, claw-code의 plugins 크레이트 분석 + 자체 플러그인 작성.
배운 것을 합쳐서 "나만의 에이전트 CLI" 제작. Provider 추상화 + MCP 도구 + REPL + 샌드박스 실행. GitHub에 공개하고 README 작성.
| 키워드 | 설명 |
|---|---|
| Clean-room Implementation | 원본 소스를 직접 참조하지 않고, 공개된 동작/스펙만 보고 처음부터 재구현하는 방식. 저작권 분쟁을 피하기 위한 소프트웨어 개발 기법 |
| Agent Harness | AI 에이전트를 "말 끌채"처럼 제어하는 도구. 사용자 입력 → LLM 호출 → 도구 실행 → 결과 반환의 루프를 관리 |
| MCP | Model Context Protocol. LLM이 외부 도구/데이터 소스와 표준화된 방식으로 통신하는 규격. JSON-RPC 2.0 기반 |
| REPL | Read-Eval-Print Loop. 사용자 입력을 읽고(Read), 실행하고(Eval), 결과를 출력(Print)하는 대화형 루프 |
| SSE | Server-Sent Events. 서버에서 클라이언트로 실시간 단방향 스트리밍. LLM의 토큰 단위 스트리밍 응답에 사용 |
| Cargo Workspace | 여러 Rust 크레이트를 하나의 프로젝트로 묶어 관리하는 방식. 의존성과 빌드 설정을 공유 |
| Tokio | Rust의 비동기 런타임. async/await 코드를 멀티스레드에서 효율적으로 실행 |
| Axum | Tower 서비스 위에 구축된 Rust 웹 프레임워크. 타입 안전하고 컴파일 타임에 라우팅 검증 |
| Serde | Rust의 직렬화/역직렬화 프레임워크. #[derive(Serialize, Deserialize)]로 자동 구현 |
| OAuth + PKCE | Proof Key for Code Exchange. 공개 클라이언트(CLI 등)에서 안전하게 OAuth 인증을 수행하는 확장 |
| Strategy 패턴 | 알고리즘을 캡슐화하여 런타임에 교체 가능하게 하는 디자인 패턴. Provider별 구현이 대표적 |
| Clippy | Rust의 정적 분석 도구. all=warn으로 기본 규칙을 강제하고, pedantic은 allow(억제)로 설정해 과도한 경고를 방지하는 실용적 구성 |
| LSP | Language Server Protocol. 에디터와 언어 서버 간 통신 프로토콜. 코드 완성, 정의 이동 등을 표준화 |
| DMCA | Digital Millennium Copyright Act. 저작권 침해 콘텐츠의 삭제를 요청하는 미국 법률 |
| Sandbox | 코드 실행을 격리된 환경에서 수행하여 시스템 안전성을 보장하는 기법 |
| rustfmt | Rust 코드 포매터. 팀 전체의 코드 스타일 통일에 사용 |