项目总览
1. 项目是什么
这是一个“逆向还原 Claude Code CLI”的大型工程化项目。它试图复现官方 Claude Code 的主要形态:
- 在终端中提供交互式 AI 编程助手
- 让模型具有工具调用能力
- 让工具调用具备权限控制与沙箱隔离
- 支持命令、技能、插件、MCP、子代理等扩展
- 支持会话恢复、上下文拼装、memory、成本统计、配置管理
从架构上看,它不是简单的“模型 SDK + 命令行包装”,而是五层叠加:
- 启动与配置层
- 终端 UI 与 REPL 层
- 消息/会话/上下文层
- 工具编排与权限执行层
- 扩展生态层
2. 它能做什么
从源码结构看,这个项目至少具备以下能力:
- 交互式聊天和代码协作
- 执行 shell 命令
- 读取、编辑、写入文件与 Notebook
- 网页抓取与网页搜索
- 生成和管理任务列表
- 进入/退出 plan mode
- 启动子代理和团队代理
- 管理 MCP server,并把 MCP tool 暴露给模型
- 加载 skills、plugins、slash commands
- 维护 memory 目录与
CLAUDE.md - 恢复历史会话、导出会话、压缩上下文
- 做 doctor/health check/config/plugin/mcp 等工程辅助工作
3. 它实际做了什么
如果把一次完整交互简化成一句话,可以描述为:
“把用户输入、项目上下文、系统提示、历史消息、可用工具、权限模式、扩展能力组装到一起,然后驱动模型在多轮循环中持续产出文本或调用工具,直到本轮任务完成。”
更具体一点:
- CLI 启动后先走极轻量入口,处理
--version等快速路径。 - 进入主初始化,加载配置、环境变量、认证、遥测、插件、MCP、命令、技能、工具。
- 打开 REPL UI。
- 用户输入消息或命令。
- 系统拼出 system prompt、user context、system context、历史消息、工具描述。
- 调用模型开始流式响应。
- 如果模型发起 tool_use,就先走权限检查,再真正执行工具。
- 工具结果回写成
tool_result消息,继续下一轮模型推理。 - 直到模型输出最终答复,或者触发压缩、恢复、终止、切换模式等行为。
4. 核心架构图
mermaidflowchart TD A[CLI 入口 src/entrypoints/cli.tsx] --> B[src/main.tsx 主初始化] B --> C[命令/工具/插件/技能/MCP 加载] B --> D[REPL UI 启动] D --> E[用户输入] E --> F[上下文组装 context.ts + prompts] F --> G[query.ts 主循环] G --> H{模型是否调用工具} H -- 否 --> I[直接输出回复] H -- 是 --> J[权限检查 useCanUseTool + permissions] J --> K[工具执行 tools/*] K --> L[tool_result 回写] L --> G
5. 这份源码的工程特点
5.1 体量大,且功能不是单核
从目录看,这不是单一主流程项目,而是“主系统 + 多扩展子系统”的集合。主系统包含:
src/main.tsxsrc/query.tssrc/screens/REPL.tsxsrc/tools.tssrc/commands.tssrc/context.tssrc/QueryEngine.ts
5.2 有明显的条件编译/特性门控
项目大量使用:
feature('...')process.env.USER_TYPE === 'ant'- 各类环境变量
这意味着很多功能不是永远开启,而是按构建目标、平台、内部标识、实验开关动态裁剪。
5.3 有“镜像目录”和历史拆层痕迹
例如:
src/services/...src/src/services/...src/cli/src/...src/bootstrap/src/...
这通常说明作者一边还原源码,一边做模块拆分、兼容转移或避免循环依赖。读代码时应优先认主入口真实引用到的路径,不要被重复目录吓到。
5.4 文档化程度不错
docs/ 并不是摆设,而是比较系统地解释了:
- 架构总览
- 对话循环
- 工具系统
- 上下文构建
- 扩展机制
- 权限和沙箱
所以这个项目很适合“文档 + 源码对照阅读”。
6. 运行与构建方式
6.1 依赖环境
- 运行时以 Bun 为主
- 也兼顾 Node 运行产物
- 使用 Bun workspaces 管理多个本地包
6.2 常用命令
bashbun install bun run dev bun run build bun test
6.3 构建逻辑
根目录 build.ts 会:
- 删除
dist/ - 用
Bun.build以src/entrypoints/cli.tsx为入口打包 - 开启代码分割
- 对产物中的
import.meta.require做兼容处理,让 Node 也能运行
所以它的构建思路不是传统 tsup/esbuild 薄封装,而是 Bun 原生打包后再补兼容层。
7. 最值得先记住的几个文件
src/entrypoints/cli.tsx:最早入口,处理快速分流src/main.tsx:主启动文件,项目的“大脑启动器”src/replLauncher.tsx:REPL 启动封装src/screens/REPL.tsx:交互式终端主界面src/query.ts:模型主循环src/QueryEngine.ts:抽象出来的会话/查询引擎src/context.ts:系统上下文与用户上下文构建src/tools.ts:工具注册中心src/commands.ts:slash 命令注册中心src/utils/permissions/*:权限规则与审批核心src/utils/sandbox/sandbox-adapter.ts:沙箱运行时适配器src/services/mcp/*:MCP 配置、连接、工具接入src/skills/loadSkillsDir.ts:Skills 加载器src/utils/plugins/pluginLoader.ts:插件加载器src/memdir/*:memory 目录体系