借鉴 codebase-memory:用工程关系结构改造 vibe coding
/research/codebase-memory-inspired-engineering-graphs-for-vibe-coding.md
你不需要最终渲染出来的大 graph,这个判断是对的。真正值得借鉴的不是图形界面,而是 codebase-memory-mcp 背后的那套做法:把代码库变成可查询、可追溯、可增量更新的工程关系结构,再让 Agent 围绕这个结构做理解、改动、验证和复盘。
更直接地说:图不是给人欣赏的图,图是给 Agent 限制搜索空间、建立影响边界、生成测试清单、减少乱读文件和乱改代码的中间表示。
你补充的那条想法——“图像表达结构化信息,是为了让复杂系统变得可观察、可沟通、可控制”——正好点中了核心:软件工程里的图不是文档装饰,而是控制复杂度的认知工具。尤其在 vibe coding 时代,如果只围绕文字 plans/specs 组织开发,Agent 仍然会被线性文本限制;真正有潜力的是让各种图底层映射到具体代码,成为软件本身的高维操作界面。
这篇是接在前两篇研究后面的继续判断:codebase-memory-mcp 实测与同类项目对比(内部笔记,未公开) 证明它作为“本地代码结构图索引层”确实能用;软件工程地图:从代码可视化到统一工程知识模型 已经提出“底层工程知识图谱 + 多视图投影”的方向。现在要回答的是:能不能把这两者合起来,变成老大自己的 vibe coding 方法论和工具底座。
结论是:可以,而且应该先从“关系结构 + 工作流约束”做起,不要从图形化产品做起。
codebase-memory 真正值得学的地方
codebase-memory-mcp 最有价值的不是它能不能画图,而是它把代码库拆成了一组稳定对象和关系。它的 README 和 MCP tool schema 里列出的节点包括 Project、Package、Folder、File、Module、Class、Function、Method、Interface、Type、Route、Resource 等;边包括 CONTAINS_FILE、DEFINES、IMPORTS、CALLS、HTTP_CALLS、ASYNC_CALLS、IMPLEMENTS、HANDLES、TESTS、USES_TYPE、FILE_CHANGES_WITH 等。
这些名字看起来普通,但它们刚好构成了 Agent 编码最缺的东西:项目的可操作结构。
普通 vibe coding 的问题是,Agent 面对的是文件树和文本。它知道可以 grep、可以读文件、可以猜入口,但它不知道“我现在要改一个页面按钮,会影响哪个 API、哪个 service、哪个 test、哪个状态对象”。于是它会反复探索、读太多上下文、被局部实现带偏。
codebase-memory 的思路是先把代码文本变成关系数据库。Agent 不再从“全仓库搜索”开始,而是先问结构:
这个项目有哪些入口?
这个函数被谁调用?
这个路由背后有哪些 handler?
这个改动会影响哪些测试?
哪些模块是热点?
哪些对象没有入边,可能是 dead code?
这不是知识图谱炫技,而是把软件工程里的“理解、诊断、演进”三个动作变成可查询接口。
对你之前“各种类型图”的直接启发
之前的 软件工程地图 里已经说过,不同工程图不能硬合成一张万能图。功能图、流程图、结构图、数据图、状态图、诊断图、演进图回答的是不同问题。codebase-memory 的启发是:这些图不应该先作为 SVG、Mermaid 或 HTML 存在,而应该先作为同一个底层关系模型的不同查询结果存在。
换成 vibe coding 的语言,就是:不要先让 AI 画图;先让 AI 和工具共同维护一组工程对象与关系,然后按任务投影成不同工作视图。
可以这样对应:
| 视图类型 | 需要回答的问题 | codebase-memory 已有基础 | 还需要补的业务层 |
|---|---|---|---|
| 结构图 | 代码如何组织,模块如何依赖 | File、Module、Class、Function、IMPORTS、CALLS | 模块职责、边界规则 |
| 调用图 | 谁调用谁,入口到实现怎么走 | CALLS、HTTP_CALLS、ASYNC_CALLS、trace_path | 业务动作名称、失败路径 |
| 路由/入口图 | 用户从哪里进入系统 | Route、HANDLES、Entry-like functions | 页面按钮、CLI 命令、定时任务语义 |
| 数据读写图 | 哪些函数读写哪些实体 | WRITES、Resource、Config、部分数据流 | Entity、Table、字段、状态变化 |
| 测试覆盖图 | 哪些测试覆盖哪些实现 | TESTS、TESTS_FILE | 验收场景、真实用户路径 |
| 变更影响图 | 改这个会影响哪里 | detect_changes、CALLS、FILE_CHANGES_WITH | Requirement、Feature、风险等级 |
| 诊断图 | 出问题时沿哪条链路排查 | 调用链、路由、热点、trace ingestion | 日志模式、错误码、最近变更 |
| 架构漂移图 | 文档说的和代码事实是否一致 | get_architecture、query_graph | ADR、设计意图、人工确认 |
这个表里的关键点是:codebase-memory 已经能提供“硬结构”,但它没有完整业务语义。它知道 render_public_markdown_html 是函数,知道谁调用它;但它不知道这个函数属于“公开文章渲染”这个 feature,也不知道它在产品体验里对应“把 BuJo research 分享成博客文章”。这些业务语义需要从 README、测试名、路由名、页面文案、人工标注和 AI 归纳中补出来,并且必须标注置信度。
最适合你的不是“图渲染器”,而是“工程关系底座”
如果按产品形态想,容易走偏成一个很酷的图谱浏览器。但对老大的工作流,第一版应该更朴素:
索引代码关系 → 按任务生成关系摘要 → 喂给 Codex worker → 根据 diff 反查影响 → 生成验证清单 → 写入项目记忆
也就是说,图谱不必出现在屏幕上。它可以只产生这些东西:
- 任务前结构包:当前任务相关的入口、函数、文件、测试、数据对象。
- 变更影响包:这次 diff 影响的调用链、功能、测试和风险点。
- 验证建议包:应该跑哪些 unit/integration/browser smoke,为什么。
- 上下文压缩包:给 Codex worker 的结构化 prompt,不再让它从目录树盲搜。
- 复盘写回包:本次确认过的功能归属、测试覆盖、ADR/设计决策。
这比渲染一张大图更有价值。因为 vibe coding 的瓶颈不是“看不到图”,而是 Agent 在动手前缺少边界,动手后缺少影响分析,验证时缺少测试路径。
可以形成一套新的 vibe coding 流程
现有 vibe-coding skill 已经要求发现、计划、实现、验证、提交。但在代码关系结构加入后,流程可以升级成“图谱辅助的 vibe coding”。
1. 任务进入时,不先让 Agent 写计划,而是先生成上下文子图
用户说“修 BuJo Web 的搜索高亮问题”时,不应直接让 Codex 搜全仓库。先做结构查询:
query: search highlight markdown result
返回:SearchResults.vue、articleRender.ts、search_index.py、相关测试、相关 API
然后把这些结果组织成一个任务结构包:
任务:修搜索高亮
相关入口:/_search?q=...
前端组件:SearchResults.vue、ArticleView.vue
渲染函数:highlightArticleHtml、renderArticleHtml
后端索引:search_index.search / rebuild_index
已有测试:test_frontend_article_render_static、test_backend search cases
风险:Markdown sanitize、occurrence 定位、中文 snippet
Codex worker 拿到的是一个窄上下文,不再靠它自己漫游。
2. 计划阶段必须引用关系,而不是泛泛说“修改前端和后端”
传统 AI 计划常见问题是空泛:改组件、加测试、跑构建。图谱辅助后,计划应该绑定对象:
将 SearchResults.vue 的点击行为保持不变;
只调整 highlightArticleHtml 的 occurrence fallback;
如果改后端 search_index.py,必须同步更新 test_backend 的 search result cases;
不要碰 permissions/share/job_worker,因为结构图未显示相关路径。
这会显著降低“顺手重构旁边代码”的概率。
3. 实现后,用 diff 反查影响范围
代码改完后,不只看 git diff。应该把 diff 中的文件/函数喂回关系结构,问:
这些函数的 callers 是谁?
这些文件有哪些入口?
相关测试有哪些?
改动是否触达 public article/share/render path?
有没有高 fan-in 函数被改?
这一步会把验证从“我猜该跑什么测试”变成“根据关系结构生成测试清单”。
4. 验证后,把人工确认写回工程记忆
如果某次任务确认了“这个函数属于公开文章渲染链路”,这不应该只留在聊天记录里。应该写回项目级关系或 ADR:
Feature: Public Article Rendering
Entry: /public/<slug>
Functions: render_public_markdown_html, strip_frontmatter, read_article_markdown
Tests: public article rendering tests
Decision: public output must not include private BuJo navigation context
Verified at: commit / test run
这部分是 codebase-memory 本身不一定做好的,但它可以启发我们:关系结构应该持续更新,不是一次性索引。
需要补一层“软件工程语义模型”
codebase-memory 的节点和边偏代码层。老大之前想做的“基于软件工程的各种类型图”,需要在它之上补一层工程语义模型。
最小对象模型可以是:
Feature:用户可感知能力
EntryPoint:页面、API、CLI、定时任务、队列消费者
Flow:一次用户动作或系统任务的执行链
Component:前端组件、后端 service、模块、worker
DataObject:表、实体、文件、缓存、状态对象
TestEvidence:测试、fixture、浏览器 smoke、手工验收
Decision:ADR、设计约束、历史取舍
Change:commit、diff、PR、任务记录
Risk:高 fan-in、缺测试、动态调用、敏感路径、公开暴露
关系可以分三类。
第一类是硬事实,来自工具自动抽取:
Function DEFINES_IN File
Function CALLS Function
Route HANDLES Function
Test TESTS Function
File IMPORTS File
Commit CHANGES File
第二类是半自动关系,来自规则和框架解析:
API READS Table
Service WRITES Entity
Component CALLS API
Job EMITS Event
Route BELONGS_TO Feature
第三类是语义关系,来自 AI 或人工确认:
Feature IMPLEMENTED_BY Flow
Decision CONSTRAINS Module
Requirement AFFECTS Feature
Risk REQUIRES TestEvidence
Incident SUSPECTS Component
最重要的约束是:这三类关系不能混在一起。事实关系可以直接用于导航;半自动关系需要可回溯;语义关系必须带置信度和确认状态。否则这套系统会从工程工具变成 AI 幻觉放大器。
各类图应该变成“视图契约”
如果以后真的把这个方向产品化,应该先写视图契约,而不是让 AI 自由生成图。
功能视图
回答:这个系统有哪些用户可感知能力?
允许节点:Feature、Actor、EntryPoint、Flow。
禁止节点:函数级调用、内部 helper、测试细节。
输出用途:给 Agent 做需求定位和范围收缩。
流程视图
回答:一个功能从入口到结果经过哪些步骤?
允许节点:Actor、UI Component、API/Route、Service、DataObject、Event、ExternalDependency。
必须标注:同步/异步、失败路径、事务边界、数据读写点。
输出用途:生成实现计划、测试路径和异常 case。
结构视图
回答:项目模块如何组织,哪些地方耦合高?
允许节点:Package、Module、File、Class、Function、Import。
必须标注:fan-in/fan-out、hotspot、循环依赖、公共 API。
输出用途:控制 AI 不要越界改动,辅助重构。
数据/状态视图
回答:核心数据对象如何变化?
允许节点:Entity、Table、State、Event、Migration、ValidationRule。
必须标注:读写函数、状态转移、非法状态、迁移风险。
输出用途:让 Agent 在改数据模型前知道影响范围。
诊断视图
回答:报错后该沿哪条路径定位?
允许节点:Error、LogPattern、Trace、Route、Service、Function、RecentChange。
必须标注:最近变更、错误频率、可疑路径、需要检查的日志/测试。
输出用途:系统性调试,不让 Agent 随机 patch。
演进视图
回答:这个需求或 diff 会影响哪里?
允许节点:Requirement、Feature、EntryPoint、Function、DataObject、TestEvidence、DeploymentUnit、Risk。
必须标注:高置信影响、推测影响、待确认影响、缺失测试。
输出用途:生成改动计划、测试清单、review checklist。
这些视图契约就是把“软件工程的各种图”变成 vibe coding 的控制工具。图的价值不在于视觉形式,而在于每张视图回答一个明确工程问题。
第一版 MVP 应该怎么做
我建议第一版不要做前端 graph,也不要做 Neo4j、复杂 canvas、力导向布局。先做一个命令行/Markdown 产物就够。
可以叫做 vibe-map-pack 或 engineering-context-pack。输入是 repo 路径和任务描述,输出是一份 Markdown/JSON 结构包。
第一阶段只做四个动作:
1. 索引 repo:调用 codebase-memory 或类似工具,生成结构图数据库。
2. 任务定位:根据自然语言任务,找相关入口、文件、函数、测试。
3. 影响分析:根据候选修改点,列出 callers/callees/tests/routes/hotspots。
4. 生成给 Codex worker 的上下文包:范围、禁止项、建议测试、风险。
对 BuJo Web 这种项目,输出可以长这样:
# Engineering Context Pack: 搜索高亮修复
## 相关功能
- BuJo 全文搜索
- 搜索结果点击后文章定位与高亮
## 入口
- /_search?q=...
- 前端 search box
- SearchResults.vue result click
## 相关代码
- frontend/src/components/SearchResults.vue
- frontend/src/articleRender.ts
- src/bujo_web/search_index.py
- src/bujo_web/server.py
## 相关测试
- tests/test_frontend_article_render_static.py
- tests/test_backend.py search cases
## 风险
- Markdown sanitize 不可破坏
- occurrence fallback 不可导致错误高亮
- 中文 snippet/Org 文件路径要实测
## Codex 约束
- 不改权限/分享/job worker
- 先加失败用例
- 必须跑前端静态测试、后端 unittest、浏览器 smoke
这份东西不是图,但它背后来自图。它是对 vibe coding 最有用的“图投影”。
和 Graphify 的关系
Graphify 研究(内部笔记,未公开) 里说过,Graphify 更像项目级长期记忆索引层,能把代码、文档、schema、脚本、论文、图片、视频都纳入图谱。codebase-memory 更窄,主要强在代码结构图和本地速度。
对老大的方向,二者可以分工:
- codebase-memory 负责“硬代码结构”:符号、调用、路由、测试、影响分析。
- Graphify 负责“项目材料语义”:README、设计文档、schema、业务说明、长文档、多模态材料。
- 你自己的工程语义层负责“功能、需求、风险、验证、决策”。
也就是说,最终不一定选某一个工具,而是吸收它们的架构思想:
代码事实层:codebase-memory
项目材料层:Graphify-like extractor
工程语义层:Feature / Flow / Risk / Decision / TestEvidence
Agent 工作流层:Codex worker context pack + impact review + verification gates
这比“哪个工具更强”重要。工具会换,关系模型和工作流会留下。
对现有 vibe coding skill 的改造建议
如果把这个方向沉淀成以后 vibe coding 的标准动作,我建议加一个“工程关系预检”阶段。
现有流程大致是:发现 repo → 写计划 → 实现 → 验证 → 提交。
升级后变成:
发现 repo
→ 生成/刷新工程关系索引
→ 根据任务投影上下文包
→ 写计划并绑定工程对象
→ Codex worker 实现
→ diff 反查影响范围
→ 根据影响图跑验证
→ 写回确认关系/ADR/测试证据
→ 提交和汇报
这里最关键的是两处。
第一,计划必须绑定对象:不要只说“改搜索模块”,而要说“改 SearchResults.vue 的 result click 和 highlightArticleHtml 的 fallback,不触碰 share/permission/job worker”。
第二,验证必须绑定影响:不要只说“跑测试”,而是根据改动对象反查 tests、routes、UI smoke、风险路径。
这会让 vibe coding 从“自然语言驱动生成”升级成“工程关系约束下的生成”。
风险和边界
这个方向最大的风险,是把图谱当成真相。静态分析必然有盲区:动态语言、框架魔法、依赖注入、反射、配置驱动路由、运行时生成代码、前端事件链都会让关系不完整。
所以每条关系都要带来源和置信度:
source: AST / LSP / route parser / test scan / git history / trace / AI inference / human confirmed
confidence: high / medium / low
last_seen_at: timestamp or commit
locator: file:line or trace id or test id
Agent 使用图谱时也要有规则:
- 高置信事实关系可以直接用于定位。
- 中置信规则关系用于提示,但要读源码确认。
- 低置信 AI 推断只能作为假设,不能直接决定修改。
- 任何改动前仍然必须读目标文件。
- 任何结论都要回到测试、日志、源码或截图验证。
这和你一直要求的“不静默失败”“不要相信 AI 口头跑完”是一回事:工程图谱不是免验证系统,而是降低探索成本、提高验证命中率的系统。
最终建议
可以借鉴,而且我认为这是你前面“软件工程地图”和“更好的 vibe coding”两条线真正合流的地方。
但切入点不要是“做一个图形化工程地图产品”,而是更小更硬的东西:为每次 vibe coding 生成一个可验证的工程关系上下文包。
最小 dogfood 可以这样做:
- 选
~/vibe/bujo-web作为第一目标,因为结构不算大、你熟悉、测试和 Web 验证路径明确。 - 用 codebase-memory 的本地构建版本生成结构索引,不接全局 MCP。
- 写一个脚本包装
get_architecture/search_graph/trace_path/search_code,输入任务描述,输出engineering-context-pack.md。 - 让 Codex worker 在真实小任务上使用这个 pack。
- 对比普通搜索式工作流:是否减少读文件、减少无关修改、测试选择是否更准。
- 如果有效,再把它固化进 vibe-coding skill:任务前生成 context pack,任务后做 impact review。
这条路的价值不是“以后能看到漂亮图”,而是让每次 AI 编码都多一层工程控制:先知道结构,再计划修改;先知道影响,再跑验证;先沉淀证据,再进入下一轮。
如果能做成,它会比单独接入某个 MCP 更重要。它会变成你自己的 Agentic Engineering 方法:用软件工程图谱来约束和放大 vibe coding,而不是让 vibe coding 在文件树里凭感觉漫游。
参考资料
- codebase-memory-mcp 实测与同类项目对比(内部笔记,未公开)
- 软件工程地图:从代码可视化到统一工程知识模型
- 软件可视化研究现状:从“把代码画出来”到可交互的工程地图(内部笔记,未公开)
- 软件工程的主要内容,以及 vibe coding 时代能借鉴什么(内部笔记,未公开)
- 如何更好的 Vibe Coding:缩小 AI 与人的信息差(内部笔记,未公开)
- Graphify 研究:给 Agent 用的项目知识图谱索引层(内部笔记,未公开)
- 关于图像化结构信息与 vibe coding 的原始想法
- DeusData/codebase-memory-mcp GitHub 仓库
- Codebase-Memory arXiv 论文