“我们都有过这种经历。”一位开发者聊起自己的新项目时,开头就抛出了一段所有程序员都懂的痛——克隆一个巨大的、没有文档的仓库,跑完 npm install 或者 pip install,打开编辑器,然后只剩下对着几百个文件的目录树发呆。接下来三个小时,你什么正事都没干,全在反向工程那些 import,就为了搞清楚核心逻辑到底藏在哪里。

他说自己实在受够了臃肿的企业工具,想要一个真正快、真正终端原生的东西,直接把项目是怎么拼起来的摊在眼前。于是,codebase-vis 被造了出来。

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

这是一个语言无关的 CLI 工具,它做的事情很直白:解析你的代码,把关系紧密的模块自动聚成一簇一簇,然后给你渲染出一张可以拖拽、点来点去的交互式依赖图。更狠的是,你还能直接在终端里向一个 LLM 提问,让它给你解释整个架构。

整个设计就冲着“零摩擦”去的。装完直接能用,一条命令起步:

npm install -g codebase-viscd my-messy-projectcodebase-vis initcodebase-vis generate

是不是简洁到有点感动?

但别被表面的简单骗了,工具底下藏着一套精心设计的处理管线。我们先从它的核心概念拆起:codebase-vis 本质是把一个“看不懂的巨型目录”,变成一张看得见的模块关系网,然后再让 LLM 帮你读图。

第一步:并发解析,不让 Node 事件循环被拖死

如果你想一口气解析几百个文件,但只靠 Node.js 单线程在那里硬撑,CLI 会变得像十年前的老电脑,卡到你怀疑人生。所以作者造了一个自定义的 WorkerPool,直接拉起子进程去并发处理 TypeScript、Python、Rust、C++ 和 Go 的源文件。每个进程用 Tree-sitter 这把快刀去切语法树,把模块级别的依赖项和实体——比如函数、类——从代码里抽出来,再通过管道送回主线程。

这样一来,即使面对一个大中型项目,命令跑起来也依旧利索。你看到的不再是干瞪眼的文件列表,而是每个文件到底在依赖谁、又被谁依赖的一张关系草图。

第二步:社区检测,把蜘蛛网切成豆腐块

光有依赖关系还不够,真正的大项目如果把所有连线都画出来,那就是一团乱麻,任何美工看了都想辞职。codebase-vis 的解法是上 Louvain 社区检测算法。

打个比方,这个算法就像一个极度理性的城市规划师:它自动扫描整张依赖图,找出那些内部耦合极高、但与外部交互很少的文件群,然后一挥手,把它们划分成一个个“社区”。比如你写的一个 Web 服务,API 路由文件自己抱成一团,数据库模型文件另外凑在一堆,工具函数再单独成村。连社区的命名都直接拿公共根目录当门牌号,看一眼就知道哪个社区大概干的是哪摊事。

经这么一聚类,原本的代码蜘蛛网就变成了几块边界清晰的拼图。你再去看项目结构,不再是几百个文件平铺,而是“认证模块”、“数据层”、“业务逻辑”这样有意义的群组。

第三步:从图到对话,让 LLM 当你的架构导游

图和社区都有了,交互也不能缺席。codebase-vis 的前端目前用的是一个朴素的 HTML 模板,搭配 vis-network 来做图的渲染与拖拽。你可以随意点击节点、放大缩小,手动探索模块之间的调用路径。

但真正让这个工具从“可视化”跨到“可理解”的,是内置的 LLM 对话能力。在终端里,你可以直接对着一坨关系图提问:“整个系统的入口在哪?”“为什么 utils 包看起来被所有模块都依赖了?” LLM 会基于解析出来的依赖结构和实体信息,试图给你一个能读懂的架构解释。

这种体验有点像你刚加入一个项目组,旁边坐了一位已经读了一年代码的前辈,你可以随时拍他肩膀问一句“这模块到底干嘛的”,而不用再一个人苦苦翻 import。

接下来的事情,就看你的了

作者坦承,他自己就是被市面上现有的方案搞得头疼才决定动手写这个工具。现在 codebase-vis 已经完整开源,他希望有更多人能拿自己的项目去试着跑一跑,也欢迎大家把它“弄坏”——因为折腾出来的 bug 就是最好的贡献理由。

如果你恰好也想跳进开源玩一玩,这个项目的架构被刻意设计得非常模块化,有几个几乎不用费太大力气就能参与的“赢一把就跑”任务:

添加一个新的语言解析器:Tree-sitter 这条管线让它变得极其顺手,比如你可以去实现 PHP、Ruby 或者 C#;

打磨交互图的前端:目前用的前端很基础,如果你熟悉可视化库,可以直接帮着让那张图变得更漂亮、更顺手;

文档、测试、CI/CD 的完善,永远少一个你。

工具本身已经证明了一件事:在被未文档化的巨型代码库折磨这件事上,每个程序员都不孤独。而现在,有人给了你一把剪刀,让你可以把那些缠成一团的依赖线理清楚——顺便再让 AI 帮你看两眼。