首页 / 资讯中心 / 文章详情

MEX 代码图谱实现原理:Tree-sitter WASM + SQLite FTS5 如何构建确定性代码图

MEX 代码图谱实现原理:Tree-sitter WASM + SQLite FTS5 如何构建确定性代码图 ★ FEATURED ARTICLE
【免费下载链接】mexTeam memory for engineers and their AI agents. Lives in your repo. Shared through Git.项目地址https://gitcode.com/gh_mirrors/mex2/mex点击查看免费下载MEX 是一款面向工程师及其 AI Agent 的团队记忆工具其核心能力之一是代码图谱Code Graph它用Tree-sitter WASM解析源码、把符号与调用关系写入SQLite FTS5全文索引构建出一张确定性、可复现、不依赖任何 LLM的代码图让mex graph query、mex impact这类命令能像数据库查询一样精确回答谁调用了我这个函数定义在哪。本文带你拆解这套架构的五个关键设计。为什么需要确定性代码图很多代码理解工具把仓库内容直接丢给大模型输出随提示词和随机性漂移而传统 grep 只能做文本匹配无法区分同名的方法还是重载的函数。MEX 的图谱引擎在接口层面就明确了这一原则build 是tree-sitter → SQLite读取是纯 SQL全流程没有 LLM 参与见 src/graph/engine.ts。这意味着同一份代码在任何机器上构建出的图字节级一致读取路径是同步 SQL 查询毫秒级返回图谱本身成为一个可校验的数据契约而不是模型的印象。上图是 MEX Hub 中的 Graph 构建任务从Discover → Stage → Parse → Resolve → Validate → Publish六个阶段逐段推进任何一步失败都不会污染已发布的图谱——这是后文会讲的候选进程 原子发布机制的可视化体现。第一步Tree-sitter WASM 解析源码解析层的核心是 src/graph/extraction/grammars.ts它封装了web-tree-sitter——一个运行在WASM 上的 tree-sitter 运行时。选 WASM 而不是原生模块有三个直接收益免编译安装.wasm文件随包分发见 src/graph/wasm/ 下的 TypeScript、JavaScript、Python、Rust、C# 等语法文件无需 node-gyp 构建按需懒加载只有项目中真实出现的语言才会加载对应 grammar大型仓库不会白白占用 WASM 堆跨平台一致同一份 WASM 字节在任何操作系统上产出同一棵语法树。文件扩展名到语言的映射.ts、.tsx、.py、.rs、.cs等是唯一的事实来源定义在 grammars.ts 第 56-72 行parse()函数则是语法树进入提取器的唯一边界提取器永远不直接触碰 web-tree-sitter。一个容易忽视的细节在 第 164-166 行解析出的树分配在 Emscripten 堆上不会被 JavaScript GC 回收因此每个文件解析完必须显式disposeTree()释放——这是图谱引擎能在巨型仓库上不泄漏内存的关键之一。第二步行无关节点 ID确定性身份的基石确定性最脆弱的地方是身份标识。如果节点 ID 里包含行号那么上方任意一行代码的增删都会让 ID 变化所有引用它的锚点grounding会静默失效。MEX 的解法在 src/graph/extraction/node-id.ts节点 ID ${kind}: sha256(${file_path}:${kind}:${name}…).前 32 位注意哈希输入里没有行号——注释、格式化、上方代码增删都不会改变 ID。这个Tier-1 身份故意保持粗粒度重命名name 变化或移动文件path 变化仍会表现为删除 新增而这正是下一层指纹机制要接管的事。两阶段管线先单文件提取再全局解析图谱构建采用extract → resolve两阶段设计提取阶段每个文件独立、纯函数式地解析产出符号节点和未解析引用unresolved_refs。提取器禁止跨文件查询、禁止读文件系统保证单文件结果可缓存、可复用解析阶段全量索引完成后统一把引用绑定成边edges。框架级知识由可插拔的FrameworkResolver补齐——目前覆盖 Express、Next.js App Router、FastAPI、Flask、NestJS见 docs/code-graph-support.md 的支持矩阵。绑定不上的引用不会被丢弃而是诚实保留在unresolved_refs表中——图谱对自己的盲区是可见的mex graph query who-calls会明确标注这类降级证据。第三步SQLite FTS5 存储与全文检索存储层直接复用 Node.js 内置的node:sqlite要求 Node ≥ 22.5它编译进了完整的WAL FTS5 mmap能力无需任何原生依赖见 src/graph/db/sqlite.ts。MEX 甚至在启动时探测 FTS5 是否可用缺失时给出可操作的报错而不是生硬的no such module: fts5。数据契约是一份冻结的 schemasrc/graph/schema.sql核心表职责清晰表职责nodes代码符号函数/类/方法…带body_hash漂移检测列edges符号关系calls、imports、extends、references…files文件内容哈希与解析健康度驱动增量筛选unresolved_refs解析失败的引用图谱的已知盲区node_fingerprints/lsh_bucketsMinHash 指纹与 LSH 倒排重命名对账全文检索由两张FTS5 虚拟表承担nodes_ftsschema.sql 第 214-222 行索引符号的 name、qualified_name、docstring、signature通过触发器与nodes表自动同步source_chunks_fts第 202-209 行contentless 模式索引源码分块的标识符与注释词命中时源码永远从磁盘重读索引只存坐标。查询侧用BM25 加权排序src/graph/db/store.ts 第 957-960 行name 权重 20、docstring 权重 5、signature 权重 1配合 src/graph/retrieval/query.ts 里的查询规划器——它会剥离停用词、把BudgetLedger拆成budget/ledger词元、对configuration做保守词干变体→config让用自然语言问代码也能命中结构化符号第四步MinHash LSH让图谱在重命名后认得人Tier-1 ID 能扛住行号漂移但扛不住重命名。MEX 为此设计了Tier-2 指纹src/graph/fingerprint.ts对节点归一化 AST 三元组丢弃标识符拼写只保留语法骨架做MinHashK64指纹连同 caller/callee邻域签名一起存入node_fingerprints用LSH 分带索引32 bands × 2 rows加速候选查找分带哈希存入lsh_buckets两指纹只要任一带哈希相同就进入候选集对账器src/graph/reconcile.ts在 Tier-1 未命中时给出三选一裁决MOVED静默重绑、GONE报错、AMBIGUOUS交给人或 Agent 确认。这套机制让 Wiki 中某段说明指向某函数的锚点在函数改名或挪文件后依然能自动找回——而不是静默断链。第五步增量更新与原子发布日常开发中mex graph refresh不会全量重建files表的内容哈希先筛出变更文件file_extraction_cache复用过期的提取结果file_row_digests记录每个文件的派生行摘要只重写过掉文件的行。更重的 rebuild 则在一次性候选进程中完成Hub 侧见上文的 Jobs 管线子进程崩溃、超时、取消都只影响临时工作区父进程校验通过后才原子改名发布新库读者永远只打开最后一次成功发布的不可变快照升级规则见 docs/design/graph-v4-compatibility.md。任何失败都不会让坏数据成为可信图谱。最终效果在 Code 页面查看任意符号Callers/Callees/Impact 都是对 SQLite 索引的确定性查询结果。上手三条命令验证你的代码图mex graph status # 图谱新鲜度与解析健康度 mex graph query who-calls requireSession # 精确的调用关系查询 mex graph scope trace the authentication flow # 按任务取有界证据集如果mex check提示某个 Wiki 断言的 grounding 漂移说明对应节点的body_hash变了——这就是nodes表里那个demo 没有、MEX 独有的列在做的事schema.sql 第 80-86 行核心文件索引语法加载与语言检测src/graph/extraction/grammars.ts行无关节点 IDsrc/graph/extraction/node-id.tsSQLite 数据契约FTS5 虚拟表src/graph/schema.sqlnode:sqlite 适配与 FTS5 探测src/graph/db/sqlite.ts存储与 BM25 查询src/graph/db/store.tsMinHash 指纹与 LSH 分带src/graph/fingerprint.ts重命名/移动对账契约src/graph/reconcile.ts引擎接口build/sync/searchsrc/graph/engine.ts查询规划停用词、词干、标识符拆分src/graph/retrieval/query.ts语言与框架支持矩阵docs/code-graph-support.md一句话总结MEX 的代码图谱 WASM 化的确定性解析Tree-sitter 冻结的 SQLite 契约FTS5 指纹 行无关 ID 与原子发布三者共同把问代码从概率问题变成了数据库问题。赞分享【免费下载链接】mexTeam memory for engineers and their AI agents. Lives in your repo. Shared through Git.项目地址https://gitcode.com/gh_mirrors/mex2/mex点击查看免费下载相关推荐Tree-sitter代码导航与重构Tree sitter代码导航与重构 Tree sitter 提供了强大的语法树遍历和节点定位功能使开发者能够高效地分析和操作抽象语法树AST。通过树游标开发工具Handsontable 仓库的 code-graph 技能用预构建 Tree-sitter 知识图谱取代 GrepRead 的跨文件代码查询Handsontable 仓库的 code graph 技能用预构建 Tree sitter 知识图谱取代 GrepRead 的跨文件代码查询 本篇文章基于前端UI组件揭秘Continue代码理解引擎Tree-sitter如何让AI读懂你的代码揭秘Continue代码理解引擎Tree sitter如何让AI读懂你的代码 在AI辅助编程工具层出不穷的今天开发者们常常面临一个痛点为什么AI总是答非人工智能AI Agent代码智能体开发工具工具调用RAG创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
阅读完成 · 觉得有帮助?
咨询建站