xCaptaiN09/blueprint

GitHub: xCaptaiN09/blueprint

blueprint 是一个零配置的本地多语言代码依赖图生成工具,通过扫描 import 关系将整个代码库渲染为可交互的独立 HTML 文件。

Stars: 0 | Forks: 0

# blueprint。 ![blueprint 将 kaeru(一个包含 150 个文件的 C 项目)映射为一张图纸:kconfig 核心缠绕在两个中心节点周围,数十个主板设备文件从第三个节点发散开来,角落的芯片里包含三种语言](https://static.pigsec.cn/wp-content/uploads/repos/cas/de/debd75480e61aee5d553c49333c638d0736f504606a84b9d9f342852466953a7.png) _kaeru — 150 个文件 · 50 个内部链接 · c / python / cpp。一条命令输入,一张图纸输出:平移、缩放、拆解。_ 将其指向任何代码库,blueprint 会读取所有的 import,追踪哪个文件依赖于哪个文件,并将整个项目绘制成一张可交互的图纸。小型项目会呈现为平静的力导向布局;大型项目则会折叠成模块 treemap,使得整体结构保持清晰,而不会纠缠成一团乱麻。输出结果是一个独立的 `.html` 文件 —— 无需服务器,无需构建步骤,不会回传数据。 ## 静止状态。 ![blueprint 在 hermes(一个包含 48 个文件的 python 工具包)上的静止状态:两个共享的辅助模块作为黑色中心节点,独立脚本是孤立的点](https://static.pigsec.cn/wp-content/uploads/repos/cas/26/269ac02183176fd171a9293fecf6c39b06b3fd46cde4ffe44f94a1081e9cdb19.png) _hermes — 48 个文件 · python + javascript。共享的“胶水”模块(`_common.py`、`_hermes_home.py`)将其依赖项拉拢成安静的中心节点;其余的则像孤点一样游离。这是一个脚本集合仓库最真实的形态,没有任何布局上的花招来伪装。_ ## 看它如何解答。 ![blueprint 选中了 lkc.h:该节点及其连接变为橙色,规格面板列出了它的两个被包含文件和十三个包含它的文件](https://static.pigsec.cn/wp-content/uploads/repos/cas/d3/d336e3ff99f5b56f70fb0013f2082f9d6249528e6e104101385d544a0f6f3b6d.png) _点击 `lkc.h`,图纸就会给出答案 —— 它包含的两个 header,包含它的十三个文件,每一个都列在右侧的 spec 面板中。在你触碰它之前,它是纯单色的;随后只有一种强调色,精准落在你正在关注的地方。_ ## 安装。 从源码安装 —— 今天就能用,不需要发布步骤: ``` git clone https://github.com/xCaptaiN09/blueprint.git cd blueprint npm install npm run build npm link # puts the `blueprint` command on your path ``` 然后,在任何地方运行: ``` cd path/to/your/project blueprint # writes ./blueprint.html blueprint --open # writes it and opens your browser ``` 一旦它登陆 npm,整个过程就可以简化为 `npm i -g blueprint-cli`。 ## 三种运行方式。 **generate** 会扫描一次代码库并生成一个独立的 `blueprint.html` —— 这就是你可以提交、通过邮件发送,或者在飞机上打开的工件。`-o ` 可以重命名它,`--json` 还会导出原始的依赖图,`--exclude ` 可以跳过特定路径,`--open` 会自动启动浏览器。 **watch** 会先生成图纸,然后在 `http://localhost:4321` 提供服务并保持实时更新:在你的编辑器中保存文件,打开的标签页稍后片刻就会自动重新加载,这样你就可以把它放在工作区旁边,一边写代码一边看着依赖图随之变化。你需要时可以使用 `-p ` 和 `--no-open`。 **serve** 是 `watch` 的别名,适用于那些在你的脑海中“serve”听起来更顺耳的日子。 ## 图纸的功能。 - **悬停**在某个节点上,其连接会亮起橙色,而其他所有内容都会淡出为微弱的背景 —— 动画方向虚线会显示依赖关系的实际流向。 - **点击**节点打开 spec 面板:语言、完整路径、入/出度、它依赖于什么、什么依赖于它,以及一个指示其是否处于循环依赖中的标志。 - 使用 `/` **搜索**以按文件名高亮显示文件;按下回车会自动聚焦到第一个匹配项。 - 使用右上角的标签按语言进行**筛选**;`fit` 会重新调整视图以适应剩下的节点,`layout` 会重新触发物理模拟。 - 在大型仓库中,**缩放**是语义化的 —— 缩小视图时你看到的是带有标签的模块块,中等缩放时网格点会显现出来,放大后文件名会渐渐浮现。 - **空闲时绝对安静。**渲染循环在没有任何移动的瞬间就会停止,因此大型依赖图不会无缘无故地让你的风扇狂转。 ## 支持的语言。 目前已支持解析 —— 提取 import,并在静态分析能够切实做到的情况下,将其解析到本地文件: | 语言 | 扩展名 | | ---------- | --------------------------------- | | javascript | `.js` `.jsx` `.mjs` `.cjs` | | typescript | `.ts` `.tsx` `.mts` `.cts` | | python | `.py` | | c | `.c` `.h` | | c++ | `.cpp` `.cc` `.cxx` `.hpp` `.hxx` | | go | `.go` | | rust | `.rs` | | java | `.java` | | kotlin | `.kt` `.kts` |
ruby · php · swift · c#? 它们会被识别为文件,但尚未被解析 —— 它们会作为节点显示在面板中并带有其 import 列表,但不会绘制出边(edges),因为它们的 import 指定的是包和类而不是文件,我们宁愿如实呈现这一点,也不愿凭空捏造连接。支持它们只需补充一个小巧、独立的解析器;请参阅 `CONTRIBUTING.md`。
## 运作原理。 一个具备 gitignore 感知能力的扫描器会遍历项目树,并按扩展名对文件进行分组;一个小巧的、针对不同语言的解析器会提取 import 语句并解析本地路径;结果会生成一个携带入/出度以及通过 Tarjan 算法检测出的循环依赖的有向图;该图随后被注入到一个独立的 html 模板中,在 canvas 上绘制出所有内容。其布局是自适应的 —— 对中小型项目使用 Barnes–Hut 力导向模拟,超过特定阈值则使用平铺式目录 treemap —— 并且绘制路径基于 dirty-flag 循环实现了细节分级,正是这一点使得它能够从 40 个文件的脚本扩展到 70,000 个文件的内核,而不会导致浏览器标签页崩溃。
调整两个阈值 `LAYOUT_THRESHOLD`(默认 1500 个文件)用于在力导向布局和模块 treemap 之间进行切换;`EDGE_REST_CAP`(默认 1200 条边)用于决定在静止状态下是显示完整的边网,还是仅在悬停/搜索时显示。这两个参数都位于 `templates/graph.html` 的顶部 —— 直接修改它们并重新生成即可,无需重新构建。
## 图纸 01。 | | | | ---------------- | -------------------------------------------------- | | 版本 | 0.1.0 | | 运行环境 | node ≥ 18 | | 解析的语言 | js · ts · py · c · c++ · go · rust · java · kotlin | | 输出 | 一个独立的 `.html` | | 网络 | 无 —— 完全在你的机器上渲染 | | 许可证 | MIT | ## 贡献。 blueprint 有意设计得小巧且易于修改:一个 typescript cli,少量针对不同语言的解析器,一个 html 模板,没有任何繁杂的框架需要你去对抗。添加一门语言是一个很好的入门 issue(first issue)—— 架构图和四步指南都在 [`CONTRIBUTING.md`](CONTRIBUTING.md) 中。 ## 许可证。 MIT — © 2026 Muhammed Dilshad A (xCaptaiN09)。
标签:C/C++, CMS安全, JavaScript, MITM代理, Python, SOC Prime, 事务性I/O, 云安全监控, 代码可视化, 依赖关系分析, 后端开发, 多模态安全, 开发工具, 数据可视化, 无后门, 静态分析