用于编码代理的本地代码索引,无需语言服务器即可解析导入(Rust,MIT,可离线运行)

Reddit r/LocalLLaMA 工具

摘要

一个基于 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 并放弃的人。另外三个代理项目评估后离开了,所以我知道可能错的是我。
查看原文

相似文章

使用本地编码代理

Hacker News Top

Sebastian Raschka 撰写的教程,讲解如何使用开源工具和开源权重的大语言模型搭建完全本地的编码代理,涵盖动机、搭建过程以及相较于专有服务的优势。