用于编码代理的本地代码索引,无需语言服务器即可解析导入(Rust,MIT,可离线运行)
摘要
一个基于 Rust 的本地代码索引,供编码代理使用,无需语言服务器即可解析导入,使用 oxc 处理 JS/TS,使用 stack-graphs 处理 Python/Java,完全离线运行,并返回带注释且不夸大的调用点结果。
上次我在这里发帖时,有人问了一个关键问题:为什么不直接用 rust-analyzer?而且在没有真实语义的情况下如何构建调用图?当时我没有好的答案。现在有了,但附带一个让步。先说让步。这达不到 LSP 的精度。语言服务器有类型检查器;对于泛型、宏、动态分发、DI 容器和猴子补丁,它会在本方案出错的地方保持正确。而你能得到的是:无需构建步骤、无需语言服务器、无需每种语言的后台守护进程。当仓库因为代理编辑到一半而无法编译时,这一点就很重要。解析实际是如何工作的,按层级划分,因为“300+ 语言”是解析数量,而不是理解数量:JavaScript 和 TypeScript 通过 oxc 处理。有真实的作用域树、符号表、导入/导出解析,支持文件内和跨文件,包括 monorepo 中的 tsconfig 路径别名。Python 和 Java 通过 stack-graphs 处理,这是 GitHub 的声明式名称绑定规则,基于 tree-sitter 解析树运行。GitHub 已于 2025 年 9 月将该存档。这里有一个分支并持续维护,修复了四个上游规则 bug,这些 bug 曾导致整个文件的解析在遇到类型化星号参数或链式赋值等情况时静默中止。其他所有语言仅获得文件内词法作用域绑定。371 个语法可以解析。其中约 100 个能提取符号和调用。只有 3 个获得真正的解析。对代理来说,关键在于它拒绝过度声明。查询某个函数的调用者时,会返回名称扫描找到的所有调用点,并标注哪些是解析能够证明的,而不是只返回已证明的子集。这是有意为之:早期版本会过滤到已证明的命中,在一个实际有 172 个调用者的文件上只报告了 2 个,而且没有截断标志。代理没有怀疑少量结果的本能。完全离线运行,无需 API 密钥,无遥测,索引保存在本地缓存中。在 M4 上扫描 TypeScript 编译器(81k 个文件)大约需要 18 秒;git 历史查询无论历史深度如何,都在几十微秒内完成。Rust,MIT:github.com/Goldziher/basemind 欢迎就层级划分提出异议,尤其是那些尝试过 stack-graphs 并放弃的人。另外三个代理项目评估后离开了,所以我知道可能错的是我。
相似文章
一个完全本地、自托管的代码仓库索引,适用于编码智能体(Rust,MIT 协议,离线运行)
Basemind 是一个开源工具,可在本地索引仓库,并通过 MCP 协议向编码智能体提供上下文,包括代码地图、Git 历史记录和文档 RAG,无需依赖云端。
Spy‑code:面向AI智能体的本地代码库图谱(欢迎反馈)
Spy-code 是一款开源工具,利用 tree-sitter 构建本地代码库图谱,提取函数、类和引用关系,为 AI 编码智能体提供代码库的结构化地图,目前支持 Rust、Python、TypeScript/JS 和 Go。
使用本地编码代理
Sebastian Raschka 撰写的教程,讲解如何使用开源工具和开源权重的大语言模型搭建完全本地的编码代理,涵盖动机、搭建过程以及相较于专有服务的优势。
如果你本地的编程代理能与世界各地的机器上运行的代理通信——而无需中间平台,会怎样?
作者正在构建一个实验性连接器,使 Codex、Claude Code 和 Cursor 等本地编程代理能够获得持久身份,并在没有中央平台的情况下跨机器与远程代理通信,未来还计划实现软件共享。
我构建了一个本地控制系统,用于处理代理故障、修复、评估和门控,以使类似自动研究的自我改进循环在实际代理代码库中生效
构建了一个本地控制系统来管理代理改进循环,捕获跟踪,发现重复故障,使用Codex/Claude Code起草修复方案,并仅在通过检查和评估后应用更改。