打开网易新闻 查看精彩图片

我用过的每个AI编程助手——Claude、Copilot、Cursor——当你让它们浏览代码库时,做的都差不多:grep搜索、猜测、然后希望结果是对的。

问它"如果我改了UserService会破坏什么?"它会读几个文件,做一些假设,然后给你一个听起来很自信的答案,但错过了一半的爆炸半径。

这不是AI的错。它没有地图。

所以我构建了一个。

1、什么是Mimir?

Mimir是一个基于Go的代码智能引擎,它将你的整个代码仓库索引为一个类型化的知识图谱,并通过MCP(模型上下文协议)将其暴露给AI代理。

可以把它想象成给你的AI助手一个GPS,而不是手绘的草图。

# 安装go install github.com/thuongh2/git-mimir/cmd/mimir@latest# 索引你的项目mimir analyze .# 启动MCP守护进程mimir daemon start# 自动配置你的编辑器mimir setup

就这样。你的AI代理现在有了你代码库的完整知识图谱。

2、工作原理

当你运行mimir analyze时,幕后发生的事情如下:

1. 并行AST解析一个goroutine池遍历你的仓库,并使用go-tree-sitter解析每个文件。支持8种语言:TypeScript、JavaScript、Go、Python、Rust、Java、C、C++。解析工作者是预先分配的(创建tree-sitter解析器很昂贵——约5ms——所以我们重用它们)。

2. 作用域感知解析所有文件解析完毕后,一个两阶段解析器构建跨文件边。第一阶段构建完整的符号表(基于trie)。第二阶段根据它解析调用点。每条边根据解析的确定性得到一个置信度分数(0.60–1.00)。

3. 知识图谱存储所有内容都存储到SQLite中(纯Go,通过modernc.org/sqlite实现无CGO),具有:

  • BM25全文索引用于关键词搜索
  • 通过sqlite-vec实现的HNSW向量索引用于语义搜索
  • Louvain社区检测用于模块聚类

4. MCP服务器一个后台守护进程向任何兼容MCP的AI代理暴露7个工具。

3、7个MCP工具,带真实示例 3.1 query() — 快速查找任何内容

你:"支付处理在哪里进行?"

没有Mimir时,AI会读3–4个它猜测可能相关的文件,却错过了埋在服务层中的实际入口点。

有了Mimir:

query("payment processing")→ ProcessGroup: checkout-flow    entry: OrderController.handleCheckout (api/order.go:42)    → PaymentService.charge (services/payment.go:88)    → stripeGateway.createIntent (gateways/stripe.go:31)    → OrderRepository.markPaid (repo/order.go:120)

AI现在一次往返就知道完整的调用链。无需猜测。

3.2 context() — 360度符号视图

你:"解释Authmiddleware如何工作以及谁调用了它。"

context("AuthMiddleware")→ Symbol: AuthMiddleware (middleware/auth.go:15)   Kind: Function | Package: middleware→ Callers (incoming):   - router.Setup (router/router.go:28)         confidence: 0.95   - router.SetupAdmin (router/admin.go:14)     confidence: 0.95→ Callees (outgoing):   - TokenValidator.Validate (auth/token.go:44) confidence: 0.90   - UserRepository.FindByID (repo/user.go:67)  confidence: 0.85   - logger.Warn (pkg/logger/logger.go:33)      confidence: 0.95→ Cluster: auth-middleware (cohesion: 0.97)   Members: middleware/auth.go, middleware/rate_limit.go, middleware/cors.go

AI立即知道:谁在使用它,它依赖什么,以及它属于哪个模块。无需跳转文件。

3.3 impact() — 在触碰之前知道会破坏什么

这是最重要的工具。每次编辑之前运行它。

场景:你想更改UserRepository.FindByID的签名。

impact("UserRepository.FindByID", "upstream")→ Target: UserRepository.FindByID (repo/user.go:67)→ Depth 1 — WILL BREAK (direct callers):   - AuthMiddleware (middleware/auth.go:55)          confidence: 0.85   - ProfileController.getProfile (api/profile.go:30) confidence: 0.90   - AdminController.getUser (api/admin.go:88)        confidence: 0.90→ Depth 2 — LIKELY AFFECTED:   - router.Setup → AuthMiddleware   - router.SetupAdmin → AdminController   - handleGetUser (api/user.go:22)→ Risk summary: 3 direct callers, 5 total affected symbols across 4 files

现在AI可以准确告诉你:"这个更改会破坏4个文件中的3个函数。以下需要更新。"

不再有"我觉得这个改动应该是安全的。"

3.4 detect_changes() — 提交前风险分析

你已经编码了2个小时。在提交之前:

detect_changes()→ Changed files: 3   Modified: services/payment.go, repo/order.go   Added: services/refund.go→ Changed symbols:   - PaymentService.charge — 4 callers affected   - OrderRepository.markPaid — 2 callers affected→ Affected processes:   - checkout-flow (HIGH RISK — 2 of 5 steps changed)   - admin-refund-flow (LOW RISK — 1 of 8 steps changed)→ Recommendation: Review checkout-flow callers before committing.

你的AI在更改离开你的机器之前就能获取完整的风险报告。

3.5 rename() — 安全协调重命名

重命名一个广泛使用的符号在没有工具支持时是可怕的。Mimir让它变得安全。

rename("UserService", "AccountService", dry_run: true)→ Status: dry_run→ Files affected: 12→ Total edits: 34   Graph edits (typed references): 28   Text search edits (string literals, comments): 6→ Preview:   api/user.go:15      — UserService → AccountService   api/user.go:44      — UserService → AccountService   services/auth.go:8  — UserService → AccountService   ... (29 more)

先试运行。确认。然后不带dry_run: true运行以原子性地应用全部34个更改。

3.6 cypher() — 强力查询

当你需要其他工具不直接暴露的答案时:

# Find all exported functions with no callers (dead code candidates)cypher("SELECT n.name, n.file_path FROM nodes n        WHERE n.exported = 1 AND n.kind = 'Function'        AND NOT EXISTS (SELECT 1 FROM edges e WHERE e.to_uid = n.uid)")→ Columns: [name, file_path]→ Rows:   ["generateLegacyToken", "auth/legacy.go"]   ["formatOldResponse", "api/v1/format.go"]   ["debugDumpState", "internal/debug.go"]

"这里有3个没人调用的导出函数。可以安全删除。"

3.7 推荐工作流

1. query()        — 找到相关代码所在位置2. context()      — 在触碰之前深入理解符号3. impact()       — 在编辑任何共享函数之前始终运行4. detect_changes() — 每次提交之前

遵循此模式的代理会少得多地犯"我不小心搞坏了认证流程"的错误。

4、为什么用Go?(以及为什么这很重要)

Mimir的前身是一个叫GitNexus的Node.js工具。它能用,但慢且重。以下是对比:

指标

GitNexus (Node.js)

Mimir (Go)

冷索引,1000个文件

~45秒

< 8秒

增量重新索引

~45秒(全量重新索引)

< 2秒

混合搜索延迟

~300毫秒

< 80毫秒

二进制大小

350 MB

< 20 MB

索引期间内存

~800 MB

< 120 MB

用Go重写不仅仅是为了速度。纯Go的SQLite驱动意味着零CGO——单个静态二进制文件,无需系统库依赖,开箱即用于任何Linux/macOS机器。

5、编辑器支持

mimir setup自动为以下工具配置MCP:

  • Claude Code(~/.claude/mcp.json)
  • VS Code + Copilot(通过github.copilot.mcpServers的settings.json
  • VS Code MCP(通过servers的mcp.json)
  • Cursor(mcp.json)
  • Windsurf(mcp.json)
  • Zed(通过context_servers的settings.json)
  • OpenCode(~/.config/opencode/config.json)
  • Antigravity(通过github.copilot.mcpServers的settings.json)
6、每次分析的自动设置

运行mimir analyze不仅仅索引你的代码。它还会:

  • 在后台启动MCP守护进程
  • 写入编辑器MCP配置
  • 安装Claude Code钩子(搜索前图增强 + 写入后自动重新索引)
  • 将4个方法论技能写入.claude/skills/mimir/(探索、调试、影响分析、重构)
  • 生成带有实时索引统计的AGENTS.md和CLAUDE.md
7、增量索引

在第一次完整索引之后,Mimir只重新处理更改的内容:

git diff HEAD → changed files→ deleted files: remove nodes + cascade-delete edges→ modified files: delete nodes/edges → re-parse + re-resolve→ added files: parse + resolve + insert→ re-cluster affected communities→ re-trace affected execution flows

完整重新索引:~8秒。增量:< 2秒

8、Web界面

不是AI代理?也有可视化界面:

mimir serve# Open http://localhost:7842

基于Sigma.js v2 + Graphology的力导向图。探索聚类、追踪执行流程、可视化检查符号关系。

9、开始使用

# 安装(一行命令)curl -fsSL https://raw.githubusercontent.com/thuongh2/git-mimir/main/install.sh | sh# 或通过Gogo install github.com/thuongh2/git-mimir/cmd/mimir@latest# 索引、启动守护进程、配置编辑器mimir analyze .mimir setup

原文链接:Mimir 开源代码智能引擎 - 汇智网