matrixcode 0.2.4

A smart code agent CLI with multi-model support, context compression, and task planning
Documentation
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
# MatrixCode 项目概览

## 项目简介

**MatrixCode** 是一个基于 Rust 开发的智能代码代理 CLI 工具,核心定位是成为一个具备多模型支持、自动上下文压缩和任务规划能力的 AI 编程助手。

### 核心特性

| 特性 | 说明 |
|------|------|
| 🤖 多模型配置 | 支持 main/plan/compress/fast 四种模型角色分工 |
| 🧠 跨会话记忆 | 自动记住偏好、决策、发现,下次对话自动加载 |
| 🗜️ 智能压缩 | 自动检测并压缩超出阈值的上下文,避免 token 溢出 |
| 📋 任务规划 | 使用规划模型分解复杂任务,自动生成执行步骤 |
| 💾 会话管理 | 支持多会话保存、恢复、命名和交互式选择 |
| 📁 文件操作 | 读写、编辑、多文件编辑、搜索、模式匹配 |
| 🔧 工具系统 | 可扩展的工具架构,支持技能系统 |
| 🌐 Web 能力 | 内置网页搜索和网页抓取能力 |
| 💻 跨平台 | 支持 Linux、macOS、Windows |

---

## 架构概览

```
┌─────────────────────────────────────────────────────────────────┐
│                         CLI Layer (main.rs)                      │
│  参数解析 · 会话管理 · 交互循环 · 信号处理                          │
├─────────────────────────────────────────────────────────────────┤
│                        Agent Layer (agent.rs)                    │
│  对话循环 · 工具调度 · 审批控制 · 压缩触发 · 任务规划                │
├──────────────────────┬──────────────────────────────────────────┤
│    Providers Layer   │              Tools Layer                  │
│  ┌────────────────┐  │  ┌─────────────────────────────────────┐  │
│  │   Anthropic    │  │  │ Read │ Write │ Edit │ MultiEdit │  │  │
│  │   Provider     │  │  │ Bash │ Search │ Glob │ Ls │ Ask   │  │  │
│  ├────────────────┤  │  │ WebSearch │ WebFetch │ Skill │ Todo │  │
│  │    OpenAI      │  │  └─────────────────────────────────────┘  │
│  │   Provider     │  │                                          │
│  └────────────────┘  │                                          │
├──────────────────────┴──────────────────────────────────────────┤
│                    Supporting Systems                            │
│  Session · Memory · Compression · Approval · Cancel · Overview   │
├─────────────────────────────────────────────────────────────────┤
│                      Infrastructure                               │
│  Workspace · UI · Markdown · Prompt · Skills                     │
└─────────────────────────────────────────────────────────────────┘
```

---

## 目录结构详解

```
matrixcode/
├── .github/workflows/          # CI/CD 配置
│   ├── ci.yml                  # 持续集成:测试、构建
│   └── release.yml             # 发布流程:构建二进制、发布到 GitHub/npm
│
├── defaults/prompts/           # 默认提示词配置
│
├── docs/                       # 项目文档
│   ├── CI_CD.md               # CI/CD 说明文档
│   └── MatrixCode_vs_Claude_Code.md  # 产品对比文档
│
├── game/                       # 演示/测试用的小游戏
│   ├── game.js
│   ├── index.html
│   └── style.css
│
├── npm/                        # npm 发布包
│   ├── install.js             # 安装脚本(检测环境、下载二进制)
│   ├── package.json           # npm 包配置
│   └── README.md
│
├── src/                        # 源代码主目录
│   ├── providers/             # LLM 提供者实现
│   │   ├── mod.rs            # Provider trait 定义、消息类型
│   │   ├── anthropic.rs      # Anthropic Claude API 实现
│   │   └── openai.rs         # OpenAI API 实现
│   │
│   ├── tools/                 # 工具实现
│   │   ├── mod.rs            # Tool trait、工具注册
│   │   ├── read.rs           # 文件读取
│   │   ├── write.rs          # 文件写入
│   │   ├── edit.rs           # 单文件编辑
│   │   ├── multi_edit.rs     # 多文件批量编辑
│   │   ├── bash.rs           # Shell 命令执行
│   │   ├── search.rs         # 文件内容搜索
│   │   ├── glob.rs           # 文件名模式匹配
│   │   ├── ls.rs             # 目录列表
│   │   ├── ask.rs            # 用户提问
│   │   ├── websearch.rs      # Web 搜索
│   │   ├── webfetch.rs       # 网页抓取
│   │   ├── skill.rs          # 技能调用
│   │   ├── todo_write.rs     # 待办事项管理
│   │   └── spinner.rs        # UI 加载指示器
│   │
│   ├── agent.rs               # 核心代理实现(主循环)
│   ├── main.rs                # CLI 入口
│   ├── lib.rs                 # 库模块导出
│   ├── session.rs             # 会话持久化管理
│   ├── memory.rs              # 跨会话记忆系统
│   ├── compress.rs           # 上下文压缩策略
│   ├── models.rs             # 模型配置、任务规划
│   ├── approval.rs           # 操作审批机制
│   ├── cancel.rs             # 取消令牌(中断处理)
│   ├── workspace.rs          # 工作目录管理
│   ├── overview.rs           # 项目概览生成
│   ├── prompt.rs             # 系统提示词构建
│   ├── skills.rs             # 技能加载与管理
│   ├── ui.rs                 # 终端 UI 工具
│   └── markdown.rs           # Markdown 渲染
│
├── tests/                      # 集成测试
│   ├── test_bash.rs
│   ├── test_edit.rs
│   ├── test_providers.rs
│   └── ... (其他测试文件)
│
├── Cargo.toml                 # Rust 项目配置
├── .env.example               # 环境变量示例
└── README.md                  # 项目说明
```

---

## 核心模块分析

### 1. Provider 层 (`src/providers/`)

定义了与 LLM API 交互的统一抽象:

```rust
// 核心类型定义
pub struct Message {
    pub role: Role,           // System, User, Assistant, Tool
    pub content: MessageContent,
}

pub enum ContentBlock {
    Text { text: String },
    ToolUse { id, name, input },
    ToolResult { tool_use_id, content },
    Thinking { thinking, signature },  // Anthropic extended thinking
    ServerToolUse { id, name, input }, // 服务端工具(如 web_search)
    WebSearchResult { tool_use_id, content },
}

#[async_trait]
pub trait Provider: Send + Sync {
    async fn chat(&self, request: ChatRequest) -> Result<ChatResponse>;
    async fn chat_stream(&self, request: ChatRequest, tx: mpsc::Sender<StreamEvent>);
}
```

**支持的 Provider:**
- **Anthropic**: 支持 extended thinking、prompt caching、server-side web search
- **OpenAI**: 标准 chat completions 接口

### 2. Tools 层 (`src/tools/`)

所有工具实现统一的 `Tool` trait:

```rust
#[async_trait]
pub trait Tool: Send + Sync {
    fn definition(&self) -> ToolDefinition;  // 工具定义
    async fn execute(&self, params: Value) -> Result<String>;
    fn risk_level(&self) -> RiskLevel { RiskLevel::Safe }  // 风险等级
}
```

**工具风险等级分类:**

| 风险等级 | 工具 | 说明 |
|---------|------|------|
| Safe | read, ls, glob, search, ask | 只读操作,无需审批 |
| Low | websearch, webfetch, todo_write | 低风险操作 |
| Medium | edit, multi_edit, write, skill | 文件修改,可能需要审批 |
| High | bash | 命令执行,高风险,默认需审批 |

**内置工具列表:**

| 工具 | 功能描述 |
|------|---------|
| `ReadTool` | 读取文件内容,支持行号范围 |
| `WriteTool` | 创建或覆盖文件 |
| `EditTool` | 单文件字符串替换编辑 |
| `MultiEditTool` | 多文件批量编辑 |
| `BashTool` | 执行 Shell 命令 |
| `SearchTool` | 文件内容正则搜索 |
| `GlobTool` | 文件名模式匹配 |
| `LsTool` | 列出目录结构 |
| `AskTool` | 向用户提问 |
| `WebSearchTool` | Web 搜索 |
| `WebFetchTool` | 抓取网页内容 |
| `SkillTool` | 调用已加载的技能 |
| `TodoWriteTool` | 管理待办事项 |

### 3. Agent 核心 (`src/agent.rs`)

Agent 是系统的核心控制器,负责:
- 维护对话消息历史
- 调用 Provider API
- 调度工具执行
- 触发上下文压缩
- 处理用户审批

```rust
pub struct Agent {
    provider: Box<dyn Provider>,           // 主模型
    compress_provider: Option<Box<dyn Provider>>,  // 压缩模型
    plan_provider: Option<Box<dyn Provider>>,      // 规划模型
    tools: Vec<Box<dyn Tool>>,
    messages: Vec<Message>,                 // 对话历史
    memory_summary: Option<String>,         // 跨会话记忆
    project_overview: Option<String>,       // 项目概览
    compression_config: CompressionConfig,
    approve_mode: ApproveMode,
    // ...
}
```

**Agent 主循环流程:**

```
用户输入 → 构建 Message → 调用 Provider → 接收响应
返回结果给用户 ← 压缩上下文(可选) ← 执行工具 ← 解析 tool_use
```

### 4. 会话与记忆系统

**会话管理 (`src/session.rs`):**
- 持久化对话历史到本地文件
- 支持会话命名、列表、恢复
- 自动保存/加载最近会话

**跨会话记忆 (`src/memory.rs`):**
- 自动累积用户偏好、决策、发现
- 每次启动自动加载记忆摘要
- 记忆存储在 `~/.matrix/memory/` 目录

### 5. 上下文压缩 (`src/compress.rs`)

当对话上下文超过阈值时,自动触发压缩:

```rust
pub struct CompressionConfig {
    pub threshold_tokens: u32,     // 触发压缩的阈值
    pub target_ratio: f32,          // 压缩目标比例
    pub preserve_recent_messages: usize,  // 保留最近 N 条消息
}
```

**压缩策略:**
- 保留系统提示和最近的对话
- 将历史对话总结为摘要
- 可使用专门的压缩模型(如 Haiku)降低成本

### 6. 任务规划 (`src/models.rs`)

支持复杂任务的自动分解:

```rust
pub struct TaskPlan {
    pub steps: Vec<TaskStep>,
    pub complexity: TaskComplexity,
}

pub enum TaskComplexity {
    Simple,      // 单步可完成
    Moderate,    // 2-5 步
    Complex,     // 5 步以上
}
```

**多模型角色配置:**

| 角色 | 用途 | 推荐模型 |
|------|------|---------|
| main | 主要对话和代码生成 | claude-sonnet-4 |
| plan | 任务分解和规划 | claude-sonnet-4 或 claude-opus-4 |
| compress | 上下文压缩 | claude-3-5-haiku |
| fast | 快速分类和提取 | claude-3-5-haiku |

---

## 配置系统

### 环境变量配置

```bash
# 基础配置
PROVIDER=anthropic                    # 提供者:anthropic 或 openai
API_KEY=sk-ant-xxx                   # API 密钥
MODEL_NAME=claude-sonnet-4-20250514  # 主模型名称
BASE_URL=                            # 自定义 API 端点(可选)

# 多模型模式
MULTI_MODEL=false                    # 启用多模型模式
PLAN_MODEL=                          # 规划模型(默认使用 MODEL_NAME)
COMPRESS_MODEL=                      # 压缩模型(推荐 haiku)
FAST_MODEL=                          # 快速模型

# 记忆系统
MEMORY_ENABLED=true                  # 启用跨会话记忆
MEMORY_MAX_ENTRIES=100              # 最大记忆条目数

# 压缩配置
COMPRESSION_THRESHOLD=80000          # 触发压缩的 token 阈值
COMPRESSION_TARGET_RATIO=0.3        # 压缩目标比例

# 审批模式
APPROVE_MODE=suggest                 # suggest(建议)/ auto(自动)/ manual(手动)

# 功能开关
THINK=true                          # 启用 Anthropic extended thinking
MARKDOWN=true                        # Markdown 渲染输出
```

### CLI 参数

```bash
matrixcode [OPTIONS]

选项:
  -p, --provider <NAME>       提供者
  -m, --model <NAME>          模型名称
  --api-key <KEY>            API 密钥
  --base-url <URL>           API 端点
  --think <BOOL>             启用 extended thinking
  --markdown <BOOL>          Markdown 渲染
  -c, --continue             继续上次会话
  --resume [ID]              恢复指定会话
  --list-sessions            列出所有会话
  --skills-dir <DIR>         额外技能目录
  --no-default-skills        禁用默认技能目录
  --profile <NAME>           提示词配置
```

---

## 常用开发命令

### 构建与运行

```bash
# 开发构建
cargo build

# 发布构建(优化)
cargo build --release

# 直接运行
cargo run -- [CLI 参数]

# 安装到系统
cargo install --path .
```

### 测试

```bash
# 运行所有测试
cargo test

# 运行特定测试
cargo test test_edit
cargo test test_providers

# 显示测试输出
cargo test -- --nocapture

# 运行单个测试文件
cargo test --test test_bash
```

### 发布流程

```bash
# 本地打包
cargo package

# 发布到 crates.io
cargo publish

# 构建 npm 包
cd npm && npm pack
```

### 调试与日志

```bash
# 启用日志输出
RUST_LOG=debug cargo run

# 指定模块日志
RUST_LOG=matrixcode::agent=trace cargo run
```

---

## 关键设计模式与约定

### 1. Builder 模式

Agent 使用 Builder 模式构建:

```rust
let agent = Agent::builder(provider)
    .think(true)
    .markdown(true)
    .profile(PromptProfile::Default)
    .skills(skills)
    .max_tokens(16384)
    .build();
```

### 2. Trait 抽象

- `Provider` trait:统一不同 LLM API
- `Tool` trait:统一工具接口
- 所有工具实现 `definition()``execute()` 方法

### 3. 异步架构

全异步实现,基于 Tokio:
- 使用 `async_trait` 定义异步 trait
- 流式响应通过 `mpsc` channel 传递
- 支持取消令牌中断长时间操作

### 4. 错误处理

统一使用 `anyhow::Result`,错误传播清晰。

### 5. 配置优先级

```
CLI 参数 > 环境变量 > .env 文件 > 默认值
```

---

## 开发注意事项

### 1. 添加新工具

1. `src/tools/` 创建新文件
2. 实现 `Tool` trait
3.`src/tools/mod.rs``all_tools_with_skills()` 中注册

```rust
// src/tools/my_tool.rs
pub struct MyTool;

#[async_trait]
impl Tool for MyTool {
    fn definition(&self) -> ToolDefinition {
        ToolDefinition {
            name: "my_tool".to_string(),
            description: "工具描述".to_string(),
            parameters: json!({ /* JSON Schema */ }),
        }
    }

    async fn execute(&self, params: Value) -> Result<String> {
        // 实现逻辑
        Ok("结果".to_string())
    }

    fn risk_level(&self) -> RiskLevel {
        RiskLevel::Medium  // 根据风险设置
    }
}
```

### 2. 添加新 Provider

1. `src/providers/` 创建新文件
2. 实现 `Provider` trait
3.`src/providers/mod.rs` 导出并添加创建逻辑

### 3. 测试约定

- 测试文件命名:`test_<功能>.rs`
- 测试函数命名:`test_<场景>_<预期结果>`
- 使用 `mockito` mock HTTP 请求
- 使用 `tempfile` 创建临时测试目录

### 4. 安全考虑

- 高风险操作(bash、文件修改)需要审批
- API 密钥不记录到日志
- 敏感文件(.env、.pem)自动排除在搜索外

### 5. 性能优化

- Anthropic API 支持 prompt caching
- 大上下文自动压缩
- 使用 stream 模式减少首字延迟

---

## 典型工作流程

### 用户交互流程

```
1. 用户输入请求
   2. Agent 构建消息(包含项目概览、记忆摘要)
   3. 调用 Provider API
   4. 接收响应(流式)
   5. 如果有 tool_use:
   a. 检查风险等级
   b. 如需审批,询问用户
   c. 执行工具
   d. 将结果加入消息
   e. 返回步骤 3
   6. 检查上下文大小,必要时压缩
   7. 返回结果给用户
```

### 会话恢复流程

```
1. 检查 --continue 或 --resume 参数
   2.~/.matrix/sessions/ 加载会话
   ↓
3. 恢复消息历史
   4. 加载记忆摘要
   5. 继续对话
```

---

## 技术栈

| 类别 | 技术 |
|------|------|
| 语言 | Rust (Edition 2024) |
| 异步运行时 | Tokio |
| HTTP 客户端 | reqwest |
| 序列化 | serde, serde_json |
| CLI 框架 | clap |
| 终端 UI | rustyline, termimad, indicatif, crossterm |
| 日志 | log, env_logger |
| 测试 | mockito, tempfile, tokio-test |

---

## 版本与发布

- **当前版本**: 0.2.1
- **许可证**: MIT
- **发布渠道**: 
  - GitHub Releases(预编译二进制)
  - crates.io(cargo install)
  - npm(npm install -g matrixcode)