Code Maps

地图上的一切,以及它们的含义

Code Maps 只有一个想法:把你本来就在收集的那些代码库指标,全部放到一个你能用手指出来的地方。下面是这样做能得到什么。

城市

一个仓库,画一次。每个含代码的文件夹变成一座建筑;路径中第一个有意义的片段变成一个街区,带自己的底板、颜色和名字。没有任何东西是随机摆放的:同一个仓库永远生成同一座城市,所以你会记住它的天际线。

把指针移到每个元素上,在城市里看它的效果。这和应用绘制的是同一座城市。

建筑
一个装着代码的文件夹。单击看详情卡,双击进去单独查看。
街区
一个分层或顶层目录,带底板、颜色和名称。点名称就能进去。
高度
复杂度,也就是按文件夹汇总的逻辑分支数。高塔会像摩天楼一样逐级收进。
外墙
当前透镜的颜色。越暖越严重。
楼顶
街区的颜色,便于从正上方辨认方位。
角标
带数字的圆点是漏洞和不安全配置;菱形是可能的密钥。
红色桅杆
热点:同一个文件夹既改得多又足够复杂。
连线弧
悬停或选中时:橙色是这个模块引用的对象,蓝色是引用它的对象。相连的建筑会染成同色。

三种主题

Día 读起来像一张地形测绘图;Noche 让地面保持黑暗、只点亮窗户;Neón 打开辉光,干活时毫无用处,放在演示现场非常好看。

openclaw/openclaw 仓库在 Neón 主题下:黑暗的城市,窗户发亮,红色高塔林立。

openclaw/openclaw 的 Neón 主题:578 座建筑,评级 C。菱形标记是可能的密钥;该仓库在 15.000 个文件处被截断。

四种透镜

外墙颜色一次只回答一个问题。切换透镜时每座建筑都停在原地,这正是重点:你是在比较关于同一个地方的四个答案。

在这里试试

把指针移到每个元素上,在城市里看它的效果。这和应用绘制的是同一座城市。

  • 风险漏洞、不安全配置、密钥和热点,按权重合成。决定先修哪一个。
  • 债务估算的清理工时:TODO、超大文件、分支过深的逻辑、热点。安排重构,看清哪个街区正在腐烂。
  • 脉搏根据 git 历史,模块上一次被人动过是多久以前。分清活代码和睡着的代码。又睡着又有风险,是最危险的组合。
  • 流量有多少次提交经过这个模块。找出整个团队天天都要走的那条主干道。

热力层

每座建筑把自己的数值辐射到地面上,每块街区底板按站在上面的建筑的均值和峰值着色。风险不再是清单里的一个数字,而是一片你能看着它扩散的污渍。

2D:热力图

按下 2D,镜头直接升到正上方。天际线消失,热力读起来就是一张干净的仓库热力图,是做幻灯片或截图最快的视角。

同一座城市的 2D 俯视图,像热力图一样:街区从浅黄一路染到深红。

同一个仓库,从正上方看。天际线消失之后,热力层就变成了一张“风险集中在哪里”的热力图。

真实的发现,不是估算

建筑上的每一样东西,要么来自真正跑过的工具,要么来自一条写明了的启发式规则。没有任何模型在猜严重度。

  • 漏洞与不安全配置

    Trivy 扫描清单文件和 lockfile(npm、yarn、pnpm、pip、poetry、go.mod、Cargo、pom、gradle),以及 Dockerfile、compose、Kubernetes 和 Terraform。Java 项目没有 lockfile 时,还会扫描 build/libs 里的 jar。

  • 泄露的密钥

    gitleaks 使用默认规则,排除 buildlogsnode_modulestargetdist.gradle.git。只保留规则名和文件:行号,匹配到的值永远不会离开扫描器。

  • 技术债,不依赖任何工具

    TODO FIXME HACK XXX 记为低;超过 500 行的文件记为中;50 行以上的文件中每行分支数超过 0,25 记为中。工时:中等 1 小时,高 4 小时。

  • 热点

    提交次数 × 复杂度进入全仓库前 5%,记为高。这是最值得立刻处理的一项指标:改动频率和理解难度正好在这里相遇。

建筑详情卡

每条问题都带文件和行号,还有模块的行数、文件数、复杂度和提交次数,它引用的模块和引用它的模块以可点击的标签呈现,以及在 GitHub、Finder 或编辑器里按精确行号打开的按钮。

packages/react-reconciler/src:47,019 行,复杂度 7,473,是热点;每条问题都链到具体的文件和行号。

把你已有的发现带进来

Code Maps 不与你的扫描器竞争:它给它们一张地图。除了自己运行的扫描,它还会读取你已在使用的工具的报告,把每个发现放到对应的建筑上。

内置

自动在本地运行,无需任何配置。

  • Trivy免费
  • gitleaks免费
  • git免费

通过 SARIF 报告

现已可用。把工具导出的 .sarif 放进 .codemap/ 再重新分析。带 security-severity 的算安全问题,不带的算技术债。

  • Snyk免费和付费
  • Semgrep免费和付费
  • CodeQL免费和付费
  • ESLint免费
  • Checkov免费
  • Bandit免费
  • gosec免费
  • SARIF 2.1.0免费
snyk code test --sarif-file-output=.codemap/snyk.sarif
semgrep scan --sarif -o .codemap/semgrep.sarif

路线图中

直接对接,无需文件中转。目前尚不存在。

  • SonarQube 与 SonarCloud API
  • Strix 渗透测试结果
  • GitHub App:每次 push 分析与 PR 评论
  • Slack、Jira 与 Linear:告警与工单

已用一份 SARIF 2.1.0 示例报告做过端到端测试。密钥的值从不读取:来自密钥扫描器的发现只保留规则名和文件:行号

规则:现成的、团队的,以及你自己的

现已可用

你已熟悉的规则

Trivy 和 gitleaks 的默认规则,加上技术债启发式。其他任何工具的规则,则通过其 SARIF 报告进入。

即将推出

导入团队的规则*

你的 .gitleaks.toml、Semgrep 规则包和抑制清单,从一处应用到所有仓库。

即将推出

编写你自己的规则*

基于地图已有度量的自定义规则:“复杂度超过 40 的建筑必须有测试”、“billing/ 不得从 web/ 导入”。

* 需要 Code Maps Cloud 付费方案,该方案目前尚不存在。 价格 →

星座图:同一座城市的依赖视角

一个模块一个节点,一条仓库内解析成功的 import 一条边,外部包不计入。节点按街区聚成区域。悬停时用箭头显示每条关系的方向;节点大小可以跟随复杂度、行数或风险;连线可以全显示、只显示跨街区的,或者全部隐藏。点街区名称拉近,双击进入。

星座视图:模块是圆点,按街区聚成区域,之间用带方向的依赖连线相连。

langchain-ai/langchain 的星座图:鼠标停在 runnables 上,橙色是它引用的 13 个模块,蓝色是引用它的 99 个。

巡检报告

一个面板,为整个仓库或你当前正在看的那一块打分。按严重度分列的数量、估算的债务工时、带各自问题数的街区列表,以及热点列表。点某一行严重度可以只保留那些建筑;所有问题都能导出成 CSV。

分数是怎么算的

从 100 开始。按 4 × 严重 + 1.5 × 高 + 0.3 × 中 最多扣 50 分,按 0.2 × 密钥数 最多扣 20 分,按 3 × 每千行债务工时 最多扣 30 分。设上限是为了避免某一类灾难性问题把其他所有信息都盖住。它是用来一眼对比仓库的启发式,不是合规标准。

  • A90+
  • B75+
  • C60+
  • D40+
  • E<40

如何评估 →

react/react 的巡检报告:47 分,评级 D,主因是 215 个未修复的严重漏洞。

AI 当向导

对话通过 Anthropic API 运行,带五个工具:get_findings、get_module、read_file、search_code 和 highlight_buildings。AI 会先读真实代码和真实问题,再下结论。

  • Auto 模式会为简短问题选 Sonnet,为需要判断的问题(架构、优先级、安全、重构)选 Opus。你也可以固定模型。
  • 每条回答都会显示是哪个模型回的、用了多久、走了几步工具调用。
  • 建筑详情卡上有两个快捷入口:讲讲这座建筑我该怎么修
  • 密钥的值永远不会出现在模型收到的内容里。

AI 讲解 react/react 的分层,一路点名它真正读过的包和行数。

怎么走动

URL 就是状态
?repo=…&view=…&lens=…&scope=…&sel=…&cam=…&theme=…:刷新或把链接发给别人,看到的视角一模一样。
克隆和分析都有缓存
克隆存放在 .repos/,一个仓库一个目录,分析结果和问题清单就放在旁边。看过的仓库秒开;点重新分析会从头重建。
搜索
/ 按名称或路径搜建筑。结果带着各自的风险颜色,回车打开第一条。
巡检巡游
一个按钮就让镜头依次飞过最紧急的五座建筑,做演示时完全不用手动操作。
清空面板
H 隐藏所有面板,便于截干净的图。Esc 逐级退出:关详情卡、退出当前层、清除选中。
三种主题
Día 像地形图,Noche 只点亮窗户,Neón 打开辉光,适合演示现场。

拿一个你熟悉的仓库试试

react/react、langchain-ai/langchain,或者你自己的本地路径。不上传任何东西,也不需要账号。

打开地图 价格