我用过的每个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.goAI立即知道:谁在使用它,它依赖什么,以及它属于哪个模块。无需跳转文件。
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)
运行mimir analyze不仅仅索引你的代码。它还会:
- 在后台启动MCP守护进程
- 写入编辑器MCP配置
- 安装Claude Code钩子(搜索前图增强 + 写入后自动重新索引)
- 将4个方法论技能写入.claude/skills/mimir/(探索、调试、影响分析、重构)
- 生成带有实时索引统计的AGENTS.md和CLAUDE.md
在第一次完整索引之后,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 开源代码智能引擎 - 汇智网
热门跟贴