A modular agent runtime extracted from Claude Code, rebuilt in Rust, and still in active development.
English | 简体中文 | 日本語 | 한국어 | Español | Français
🚧Early-stage project under active development — not production-ready yet.
⭐ Star us to follow along — a usable version is coming within a month!
- What is This
- Quick Start
- Why Rebuild in Rust
- Design Goals
- Architecture
- Crate Overview
- Rust vs TypeScript
- Roadmap
- Contributing
- References
- License
This project extracts the core runtime ideas from Claude Code and reorganizes them into a set of reusable Rust crates. It's not a line-by-line TypeScript translation — it's a clean-room redesign of the capabilities an agent truly depends on:
- Message Loop — driving multi-turn conversations
- Tool Execution — orchestrating tool calls with schema validation
- Permission Control — authorization before file/shell/network access
- Long-running Tasks — background execution with lifecycle management
- Context Compaction — keeping long sessions stable under token budgets
- Model Providers — unified interface for streaming LLM backends
- MCP Integration — extending capabilities via Model Context Protocol
Think of it as an agent runtime skeleton:
| Layer | Role |
|---|---|
| Top | A thin CLI that assembles all crates |
| Middle | Core runtime: message loop, tool orchestration, permissions, tasks, model abstraction |
| Bottom | Concrete implementations: built-in tools, MCP client, context management |
If the boundaries are clean enough, this can serve not only Claude-style coding agents, but any agent system that needs a solid runtime foundation.
- Rust 1.75+ (install)
- Model backend — one of the following:
- Ollama (recommended for local development)
- Anthropic API key
git clone <repo-url> && cd rust-clw
cargo buildMake sure Ollama is running and has a model pulled:
# Pull a model (only needed once)
ollama pull qwen3.5:9b
# Single query
cargo run -- --provider ollama -m "qwen3.5:9b" -q "list files in the current directory"
# Interactive REPL
cargo run -- --provider ollama -m "qwen3.5:9b"Any model with tool-calling support works. Larger models produce better tool-use results:
cargo run -- --provider ollama -m "qwen3.5:27b" -q "read Cargo.toml and summarize the workspace"export ANTHROPIC_API_KEY="sk-ant-..."
cargo run -- -q "list files in the current directory"Usage: claw-rs [OPTIONS]
Options:
-m, --model <MODEL> Model name (default: auto per provider)
-s, --system <SYSTEM> System prompt
-p, --permission <MODE> Permission mode: auto, interactive, deny
-q, --query <QUERY> Single query (non-interactive), omit for REPL
--provider <PROVIDER> Provider: anthropic, ollama, openai, stub
--ollama-url <URL> Ollama server URL (default: http://localhost:11434)
--max-turns <N> Max turns per conversation (default: 100)
| Provider | Backend | How to activate |
|---|---|---|
ollama |
Ollama (local) | --provider ollama or auto when no ANTHROPIC_API_KEY |
anthropic |
Anthropic API | Set ANTHROPIC_API_KEY env var |
openai |
Any OpenAI-compatible API | --provider openai + OPENAI_BASE_URL |
stub |
No real model (for testing) | --provider stub |
Claude Code has excellent engineering quality, but it's a complete product, not a reusable runtime library. UI, runtime, tool systems, and state management are deeply intertwined. Reading the source teaches a lot, but extracting parts for reuse is nontrivial.
This project aims to:
- Decompose tightly coupled logic into single-responsibility crates
- Replace runtime constraints with trait and enum boundaries
- Transform "only works inside this project" implementations into reusable agent components
- Runtime first, product later. Prioritize solid foundations for Agent loop, Tool, Task, and Permission.
- Each crate should be self-explanatory. Names reveal responsibility, interfaces reveal boundaries.
- Make replacement natural. Tools, model providers, permission policies, and compaction strategies should all be swappable.
- Learn from Claude Code's experience without replicating its UI or internal features.
| Crate | Purpose | Derived From (Claude Code) |
|---|---|---|
clawcr-core |
Message model, state container, main loop, session | query.ts, QueryEngine.ts, state/store.ts |
clawcr-tools |
Tool trait, registry, execution orchestration, and built-in tools | Tool.ts, tools.ts, tool service layer |
clawcr-tasks |
Long task lifecycle and notification mechanism | Task.ts, tasks.ts |
clawcr-permissions |
Tool call authorization and rule matching | types/permissions.ts, utils/permissions/ |
clawcr-provider |
Unified model interface, streaming, retry | services/api/ |
clawcr-compact |
Context trimming and token budget control | services/compact/, query/tokenBudget.ts |
clawcr-mcp |
MCP client, connection, discovery, reconnect | services/mcp/ |
clawcr-cli |
Executable entry point, assembles all crates | CLI layer |
clawcr-core — The foundation
Manages how a conversation turn starts, continues, and stops. Defines the unified message model, main loop, and session state. This is the bedrock of the entire system.
clawcr-tools — Tools and dispatch
Defines tools, schedules them, and ships the built-in file, shell, search, and edit capabilities in one crate.
clawcr-tasks — Background task runtime
Separating tool calls from runtime tasks is critical for supporting long commands, background agents, and completion notifications fed back into the conversation.
clawcr-permissions — Authorization layer
Controls what the agent can do, when it must ask the user, and when to refuse outright. Essential whenever agents read files, write files, or execute commands.
clawcr-provider — Model abstraction
Shields the system from differences between model backends. Unifies streaming output, retry logic, and error recovery.
clawcr-compact — Context management
Ensures long session stability. Not just "summarization" — applies different compression levels and budget controls based on context to prevent unbounded growth.
clawcr-mcp — MCP integration
Connects to external MCP services, bringing remote tools, resources, and prompts into the unified capability surface.
clawcr-cli — CLI entry point
Packages the executable as claw-rs and wires together the runtime crates for interactive and one-shot use.
- Day 1: Finalize crate boundaries and wire the minimal CLI
- Day 2: Land
Bash,FileRead, andFileWrite - Day 3: Stabilize provider flow, permissions, and session state
- Day 4: Add editing and search tools
- Day 5: Improve long-session handling with tasks and compaction
- Day 6: Start MCP and plugin/skill integration
- Day 7: Run focused testing, fix gaps, and document the next slice
Contributions are welcome! This project is in its early design phase, and there are many ways to help:
- Architecture feedback — Review the crate design and suggest improvements
- RFC discussions — Propose new ideas via issues
- Documentation — Help improve or translate documentation
- Implementation — Pick up crate implementation once designs stabilize
Please feel free to open an issue or submit a pull request.
This project is licensed under the MIT License.
If you find this project useful, please consider giving it a ⭐