ๆฌๆๆกฃ่ฏฆ็ป่ฏดๆไบ claude-code-rs ็็ณป็ปๆถๆ่ฎพ่ฎก๏ผ่ฟๆฏ Claude Code ็ Rust ้ๆ็ๆฌใ
- ๅฉ็จ Rust ็ๅผบ็ฑปๅ็ณป็ป
- ็ผ่ฏๆถ้่ฏฏๆฃๆฅ
- ้ฟๅ ่ฟ่กๆถๆๅค
- ไฝฟ็จ
Arc<RwLock>่ฟ่ก็บฟ็จๅฎๅ จ็็ถๆ็ฎก็ - ๅผๆญฅ I/O ๅบไบ Tokio
- ๆ ๆฐๆฎ็ซไบไฟ่ฏ
- ๆธ ๆฐ็ๆจกๅ่พน็
- ๆๅฐๅๆจกๅ้ดไพ่ต
- ๆไบๆต่ฏๅ็ปดๆค
- ้ถๆๆฌๆฝ่ฑก
- ๆๅฐๅๅ ๅญๅ้
- ้ซๆ็ๆฐๆฎ็ปๆ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ CLI ๅ
ฅๅฃๅฑ โ
โ (main.rs - ๅฝไปค่ก่งฃๆๅ่ฐๅบฆ) โ
โโโโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ
โโโโโโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ ๅฝไปคๅฑ (commands/) โ
โ ไบคไบๅผ / ๆฅ่ฏข / ้
็ฝฎ / ่ฎค่ฏ / Bridge / MCP โ
โโโโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ
โโโโโโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ ไธๅก้ป่พๅฑ โ
โ โโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโ โ
โ โ ๅทฅๅ
ท็ณป็ป โ โ ๅคไปฃ็็ณป็ป โ โ ๅๆ็ณป็ป โ โ
โ โ (tools/) โ โ (agents/) โ โ(analytics/) โ โ
โ โโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโ โ
โ โโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโ โ
โ โ Bridge ็ณป็ป โ โ MCP ็ณป็ป โ โ ่ฏญ้ณ็ณป็ป โ โ
โ โ (bridge/) โ โ (mcp/) โ โ (voice/) โ โ
โ โโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโ โ
โโโโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ
โโโโโโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ ๆ ธๅฟๆๅกๅฑ โ
โ โโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโ โ
โ โ ็ถๆ็ฎก็ โ โ ้
็ฝฎ็ณป็ป โ โ ้่ฏฏๅค็ โ โ
โ โ (state.rs) โ โ (config.rs) โ โ (error.rs) โ โ
โ โโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโ โ
โโโโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ
โโโโโโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ ๅบ็ก่ฎพๆฝๅฑ โ
โ Tokio ่ฟ่กๆถ / ็ฝ็ป I/O / ๆไปถ็ณป็ป / ๅบๅๅ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
- ๅคๆบ้ ็ฝฎๅๅนถ
- ็ฑปๅๅฎๅ จ็้ ็ฝฎ่ฎฟ้ฎ
- ่ฟ่กๆถ้ ็ฝฎๆดๆฐ
pub struct Config {
pub project_root: PathBuf,
pub cwd: PathBuf,
pub api: ApiConfig,
pub bridge: BridgeConfig,
pub permissions: PermissionConfig,
pub features: FeatureFlags,
pub theme: ThemeConfig,
// ...
}- ๅ
จๅฑ้
็ฝฎ (
~/.config/claude-code/config.toml) - ้กน็ฎ้
็ฝฎ (
.claude/settings.json) - ็ฏๅขๅ้๏ผๆ้ซไผๅ ็บง๏ผ
- ๅ
้จๅฏๅๆง: ไฝฟ็จ
Arc<RwLock<AppStateInner>> - ็บฟ็จๅฎๅ จ: ๅค็บฟ็จ็ฏๅขไธ็ๅฎๅ จ่ฎฟ้ฎ
- ็ป็ฒๅบฆ้: ่ฏปๅ้ๅ็ฆป๏ผๆ้ซๅนถๅๆง่ฝ
pub struct AppState {
inner: Arc<RwLock<AppStateInner>>,
}
pub struct AppStateInner {
// ไผ่ฏไฟกๆฏ
pub session_id: SessionId,
pub parent_session_id: Option<SessionId>,
// ็ป่ฎกไฟกๆฏ
pub total_cost_usd: f64,
pub total_api_duration: i64,
// ไปฃ็็ณป็ป
pub agent_color_map: HashMap<String, AgentColorName>,
// ... ๆดๅค็ถๆ
}ไฝฟ็จๆไธพ็ปไธๆๆ้่ฏฏ็ฑปๅ๏ผ
pub enum ClaudeError {
Config(String),
Io(std::io::Error),
Network(reqwest::Error),
Serialization(serde_json::Error),
Tool(String),
Command(String),
Auth(String),
Permission(String),
Bridge(String),
Mcp(String),
State(String),
NotImplemented(String),
Other(String),
}ๅฎ็ฐ From trait ไปฅไพฟ่ชๅจ่ฝฌๆข๏ผ
impl From<std::io::Error> for ClaudeError {
fn from(err: std::io::Error) -> Self {
ClaudeError::Io(err)
}
}#[async_trait]
pub trait Tool: Send + Sync {
fn name(&self) -> &str;
fn description(&self) -> &str;
fn input_schema(&self) -> ToolInputSchema;
async fn validate_input(&self, input: &Value) -> Result<()> {
Ok(())
}
async fn can_use(&self, context: &ToolUseContext) -> Result<PermissionResult> {
Ok(PermissionResult::Allowed)
}
async fn execute(&self, input: Value, context: ToolUseContext) -> Result<ToolResult>;
}pub struct ToolRegistry {
tools: HashMap<String, Box<dyn Tool + Send + Sync>>,
}
impl Default for ToolRegistry {
fn default() -> Self {
let mut registry = Self::new();
registry.register(FileReadTool::new());
registry.register(FileEditTool::new());
// ... ๆดๅคๅทฅๅ
ท
registry
}
}| ๅทฅๅ ทๅ | ๆ่ฟฐ | ๆ้็บงๅซ |
|---|---|---|
| file_read | ่ฏปๅๆไปถ | ๅช่ฏป |
| file_edit | ็ผ่พๆไปถ | ๆ ๅ |
| file_write | ๅๅ ฅๆไปถ | ๆ ๅ |
| bash | ๆง่กๅฝไปค | ๅฑ้ฉ |
| glob | ๆไปถๅน้ | ๅช่ฏป |
| grep | ๅ ๅฎนๆ็ดข | ๅช่ฏป |
| git | Git ๅฝไปค | ๆ ๅ |
#[derive(Parser, Debug)]
struct Cli {
#[command(subcommand)]
command: Option<Commands>,
#[arg(short, long, global = true)]
verbose: bool,
}
#[derive(Subcommand, Debug)]
enum Commands {
#[command(alias = "i")]
Interactive,
#[command(alias = "q")]
Query { query: Vec<String> },
Config { key: Option<String>, value: Option<String> },
Login,
Logout,
Version,
Help,
#[cfg(feature = "bridge")]
Bridge,
// ... ๆดๅคๅฝไปค
}ไฝฟ็จ #[cfg(feature = "...")] ๅฎ็ฐๅฏ้ๅ่ฝ๏ผ
#[cfg(feature = "bridge")]
Some(Commands::Bridge) => {
commands::bridge::run(config, state).await?;
}#[async_trait]
pub trait Agent {
fn name(&self) -> &str;
fn agent_type(&self) -> AgentType;
fn description(&self) -> &str;
async fn run(&self, task: &str) -> Result<String>;
}| ไปฃ็็ฑปๅ | ็จ้ | ๅทฅๅ ท้ |
|---|---|---|
| GeneralPurpose | ้็จไปปๅก | ๅ จๅทฅๅ ท |
| Explore | ไปฃ็ ๆข็ดข | ๅช่ฏปๅทฅๅ ท |
| Plan | ่งๅ่ฎพ่ฎก | ๅๆๅทฅๅ ท |
| Verification | ้ช่ฏๆต่ฏ | ๆต่ฏๅทฅๅ ท |
| Bash | ๅฝไปคๆง่ก | Bash + ๆไปถ |
- ๆๅกๅจ: ๆไพๅทฅๅ ทใ่ตๆบๅๅฝไปค็ๅค้จๆๅก
- ๅทฅๅ ท: MCP ๆๅกๅจๆไพ็ๅฏ่ฐ็จๅฝๆฐ
- ่ตๆบ: ๅฏ่ฎฟ้ฎ็ๆฐๆฎ๏ผๆไปถใๆฐๆฎๅบ็ญ๏ผ
- ๅฝไปค: ็จๆทๅฏๆง่ก็้ซ็บงๅฝไปค
pub struct McpManager {
servers: HashMap<String, McpServerInfo>,
state: AppState,
}
impl McpManager {
pub async fn list_servers(&self) -> Vec<McpServerInfo>;
pub async fn enable_server(&mut self, name: String) -> Result<()>;
pub async fn disable_server(&mut self, name: String) -> Result<()>;
pub async fn reconnect_server(&mut self, name: String) -> Result<()>;
}โโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโ
โ ๅฎขๆท็ซฏ โโโโโโโโโบโ ๆๅกๅจ โ
โ (Client) โ ็ฝ็ป โ (Server) โ
โโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโ
- SingleSession: ๅไผ่ฏๆจกๅผ๏ผๅจๅฝๅ็ฎๅฝ
- Worktree: Git ๅทฅไฝๆ ๏ผๆฏไธชไผ่ฏ็ฌ็ซๅทฅไฝๅบ
- SameDir: ๅ ฑไบซ็ฎๅฝ๏ผๆๆไผ่ฏๅ ฑ็จ
็จๆท่พๅ
ฅ
โ
โผ
โโโโโโโโโโโโโโโโโโโโ
โ CLI ่งฃๆๅจ โ
โ (clap) โ
โโโโโโโโโโฌโโโโโโโโโโ
โ
โผ
โโโโโโโโโโโโโโโโโโโโ
โ ้
็ฝฎๅ ่ฝฝ โ
โ (ConfigLoader) โ
โโโโโโโโโโฌโโโโโโโโโโ
โ
โผ
โโโโโโโโโโโโโโโโโโโโ
โ ็ถๆๅๅงๅ โ
โ (AppState) โ
โโโโโโโโโโฌโโโโโโโโโโ
โ
โผ
โโโโโโโโโโโโโโโโโโโโ
โ ๅฝไปคๆง่ก โ
โ (Command) โ
โโโโโโโโโโฌโโโโโโโโโโ
โ
โผ
โโโโโโโโโโโโโโโโโโโโ
โ ๅทฅๅ
ท่ฐ็จ โ
โ (ToolRegistry) โ
โโโโโโโโโโฌโโโโโโโโโโ
โ
โผ
็ปๆ่พๅบ
AI ๆจกๅๅณๅฎ่ฐ็จๅทฅๅ
ท
โ
โผ
โโโโโโโโโโโโโโโโโโโโโโโโ
โ ๅทฅๅ
ทๆฅๆพ โ
โ (ToolRegistry) โ
โโโโโโโโโโโโฌโโโโโโโโโโโโ
โ
โผ
โโโโโโโโโโโโโโโโโโโโโโโโ
โ ๆ้ๆฃๆฅ โ
โ (can_use) โ
โโโโโโโโโโโโฌโโโโโโโโโโโโ
โ
โผ
โโโโโโโโโโโโโโโโโโโโโโโโ
โ ่พๅ
ฅ้ช่ฏ โ
โ (validate_input) โ
โโโโโโโโโโโโฌโโโโโโโโโโโโ
โ
โผ
โโโโโโโโโโโโโโโโโโโโโโโโ
โ ๅทฅๅ
ทๆง่ก โ
โ (execute) โ
โโโโโโโโโโโโฌโโโโโโโโโโโโ
โ
โผ
่ฟๅ็ปๆ
- ๅค็บฟ็จ่ฐๅบฆๅจ: ้ป่ฎคไฝฟ็จๅค็บฟ็จ่ฐๅบฆๅจ
- ๅผๆญฅ I/O: ๆๆ I/O ๆไฝ้ฝๆฏๅผๆญฅ็
- ไปปๅก้็ฆป: ไฝฟ็จ
tokio::spawn้็ฆปไปปๅก
// ่ฏปๆไฝ
let state = app_state.read();
let session_id = &state.session_id;
// ๅๆไฝ
let mut state = app_state.write();
state.total_cost_usd += 0.01;- ไฝฟ็จ
Arcๅ ฑไบซๆฐๆฎ๏ผ้ฟๅ ๅ ้ - ไฝฟ็จ
Cow<'a, str>้ฟๅ ไธๅฟ ่ฆ็ๅ้ - ไฝฟ็จ
Vec::with_capacity้ขๅ้
- ๆกไปถ็ผ่ฏๅๅฐไบ่ฟๅถๅคงๅฐ
- ๆๅ ่ฝฝ้ๅๆจกๅ
- ้ ็ฝฎ็ผๅญ
- ๅฏน่ฑกๆฑ ๅค็จ
- ่ฟๆฅๆฑ ็ฎก็
- ๆน้ๆไฝ
- ๅคๅฑๆ้ๆฃๆฅ
- ็ฝๅๅ/้ปๅๅ่งๅ
- ็จๆท็กฎ่ฎคๆบๅถ
- ๅฝไปคๆง่ก้็ฆป
- ๆไปถ็ณป็ป่ฎฟ้ฎ้ๅถ
- ็ฝ็ป่ฎฟ้ฎๆงๅถ
- ๆๆๅทฅๅ ท่ฐ็จ่ฎฐๅฝ
- ๆ้ๅณ็ญ่ฎฐๅฝ
- ๆไปถๆไฝ่ฎฐๅฝ
- Trait ๅฏน่ฑกๅฎ็ฐๅจๆๅๅ
- ่ฟ่กๆถๆไปถๅ ่ฝฝ
- ๆไปถ้ด้ไฟก
- ๅฎ็ฐ
Tooltrait - ๆณจๅๅฐ
ToolRegistry - ่ชๅจๅ็ฐๅๅ ่ฝฝ
- Cargo features ๆกไปถ็ผ่ฏ
- ่ฟ่กๆถ็นๆงๅผๅ ณ
- GrowthBook ้ๆ
- ๆฏไธชๆจกๅ็ฌ็ซๆต่ฏ
- Mock ๅค้จไพ่ต
- ่ฆ็ๆๆๅ ฌๅ ฑ API
- ็ซฏๅฐ็ซฏๆต็จๆต่ฏ
- ็ๅฎๅทฅๅ ท่ฐ็จๆต่ฏ
- ๅคๆจกๅๅไฝๆต่ฏ
- ๅบๅๆต่ฏ
- ๅ ๅญไฝฟ็จ็ๆง
- ๅนถๅๅๅๆต่ฏ
- Windows (x86_64)
- macOS (x86_64, aarch64)
- Linux (x86_64, aarch64)
- ๅไบ่ฟๅถๆไปถ
- ๆ ๅค้จไพ่ต
- ่ทจๅนณๅฐๅ ผๅฎน
- ๅฎๆด็ AI ๅฏน่ฏ็ณป็ป
- API ๅฎขๆท็ซฏ้ๆ
- ๅฎๅ็้่ฏฏๅค็
- ๆไปถ็ณป็ปๅฎๆดๅฎ็ฐ
- Web ็้ข
- ็งปๅจ็ซฏๆฏๆ
- ๅๅธๅผๆง่ก
- ไผไธ็บงๅ่ฝ
- ๆบๅจๅญฆไน ๆจกๅ้ๆ
ๆฌๆๆกฃๅฐ้็้กน็ฎๅๅฑๆ็ปญๆดๆฐใ