使用 Claude Code 一段时间后发现,这个工具确实强大,但有一个问题始终令人困扰:它读取代码文件的方式过于粗放了。
当你让它帮忙修改一个函数时,它会先读取整个文件。发现依赖在另一个文件中,再读取那个文件。接着发现还需要查看某个类的定义,又读取第三个文件。
一个简单的需求,三四个文件全部读完,token 迅速消耗。再加上 OpenAI 近期削减产品、Claude 收紧使用额度,20 美元的官方订阅往往没用几次就耗尽了。
这并非 Claude Code 独有的问题,而是所有 AI 编程 Agent 的通病。
Agent 为什么如此依赖文件读取?
要理解问题本质,先看看人类程序员的工作方式。
人类打开一个新项目,会先看目录结构,然后搜索函数名,跳转到定义处,看几行关键代码就足够了。整个过程高度精准,不会把整个文件从头读到尾。
AI Agent 做不到这一点。它没有编辑器,没有 LSP(语言服务协议),唯一的手段就是读取文件。
cx 的作者分析了 73 个 Claude Code session 的数据,发现:
- 66% 的读取是链式的——读 A 是为了找到 B,读 B 是为了找到 C
- 37% 是重复读取——同一个文件在一次 session 里被读了好几遍
- 平均每次读取消耗约 1200 token,一个 session 平均读取 21 次
这意味着每个 session 光读代码就要消耗两万多 token,什么都没干就已经花费不菲。

cx 是什么?
cx 是一个专门针对这个问题开发的命令行工具,采用 Rust 编写,基于 tree-sitter 进行语义解析。它为 Agent 提供了一套"代价阶梯":
| 命令 | Token 消耗 | 用途 |
|---|---|---|
cx overview src/fees.rs |
约 200 | 了解文件结构 |
cx definition --name calc |
约 200 | 查看特定函数 |
cx symbols --kind fn |
约 70 | 列出项目所有函数 |
cx references --name calc |
极少 | 查找符号引用位置 |
对比直接读取文件(约 1200 token),使用 cx overview 只需 200 token,使用 cx definition 直接获取函数体也只需 200 token。
Agent 使用这套工具后,先用 overview 摸清结构,有需要再用 definition 精准获取函数,大多数情况下无需完整读取文件。
实测数据:58% 的读取调用被减少,token 消耗降低 40-55%。

为什么不用 LSP?
这是个合理的问题。Language Server 也能实现跳转定义、查找引用等功能,为什么要专门开发 cx?
因为 LSP 是为人设计的,不是为 Agent 设计的。
LSP 需要持续运行的后台进程,每个语言需要单独配置,内存占用动辄 1-2GB,还要等待项目编译索引完成后才能使用。
Agent 在一次 session 中可能只使用一次这些功能,启动这套重型设备并不划算。
cx 采用无状态设计:
- 首次运行时用 tree-sitter 解析所有源文件,建立轻量级本地索引(.cx-index.db)
- 之后仅增量更新变化的文件
- 无后台进程,无编译依赖,开箱即用
安装与接入 Claude Code
安装非常简单:
# 方式一:一键安装
curl -sL https://raw.githubusercontent.com/ind-igo/cx/master/install.sh | sh
# 方式二:使用 Cargo
cargo install cx-cli
然后给 Claude Code 添加使用说明:
# 生成 CX 使用说明
cx skill > ~/.claude/CX.md
# 在 CLAUDE.md 中引用
echo "@CX.md" >> ~/.claude/CLAUDE.md
cx skill 会输出一份 prompt,告诉 Claude Code 何时使用 cx overview、何时使用 cx definition,以及在什么情况下才需要完整读取文件。

Claude Code 看到这份说明后,会自动将 cx 命令的优先级排在读取文件之前。
安装语言支持:
cx lang add rust typescript python
cx 会自动检测项目使用的语言,如果未安装对应的 grammar,它会给出提示。
实际使用效果
在一个 Rust 项目上进行了测试。
请求 Claude Code 帮助重构一个模块。过去它会先读取入口文件,再读取依赖文件,读完几个文件后开始编写代码。
现在它的工作流程变为:
- 先运行
cx overview查看整体结构 - 发现目标函数后直接运行
cx definition获取函数体 - 基本上两步之后就开始实际工作
对话中读取文件的调用次数明显减少,session 完成后查看 token 用量,确实降低了不少。
注意事项
cx 依赖 tree-sitter 进行语义解析,理论上支持的语言很多,但需要手动安装对应的 grammar。
cx 解决的问题非常具体:为 AI Agent 提供一套比"读取整个文件"更经济的代码查询接口。工具本身并不复杂,接入也很简单,但效果是实实在在的。
项目信息
GitHub: https://github.com/ind-igo/cx