那个数字我盯了很久:三周,20 万个 GitHub 星。一个开源的 agent harness,2026 年 8 月从零涨到这么多。同一段时间里,它的插件生态冲过了一万三千个仓库。
我当时没什么羡慕感,就一个念头:这背后有多少人,已经说不清自己机器上住过多少个 AI 插件了?
我就是那个人。同桌说「这个 skill 不错,要不要装」,我说好。装了之后它在哪个目录、读什么、有没有网络权限,我从来没想过去看一眼。不是懒得看,是不知道去哪看。我连「看一眼」这个动作该落在哪都不清楚。
所以看到 geiger 的时候,我盯着名字愣了一会儿。
「AI 代理的盖革计数器」。一句话的事:扫一遍你的机器,告诉你有多少 AI 代理、MCP 服务器、插件、扩展住在里面。
挺矛盾的是,我到现在还没真的跑过它。README 倒是从头读完了。读的时候心里冒出个念头:这个工具好像知道我在怕什么。
它先说自己是只读的,只读配置文件和已知目录,正常不写任何东西,除非我明确用 --json 指了个输出路径。不用装,不用注册,不收集遥测。在这个人人都想把你往自家生态里拽的年代,这已经算一种态度了。
然后它给了一段示例输出。一台叫 dev-laptop 的机器,扫出 9 项,分布在 3 个生态里。
9 项里面,7 项是可执行代码。还有 1 项,写着「配置文件中的凭据」。
那行字我看了很久。以前我是真不关心这种事的。后来想了想,不是不关心,是不知道它值得关心。哪天我自己这台机器也扫出这么一行,我大概连那个配置文件叫什么名字都答不上来。
比扫描结果更让我停住的,是它处理密钥的方式。它说得很清楚:一旦碰到可能是密钥的东西,只报键名、所在文件、大概是什么密级,绝不把值本身打出来。我第一反应是这也太保守了,后来又觉得不对——一个扫描器最危险的地方恰恰在它自己。它明明读到了那个值,选择不给你看。机器上凭空多出一个会打印密钥的程序,等于凭空多了一个泄漏口。它拒绝做那个泄漏口,只告诉你「这里有个秘密,然后呢,你自己来」。
它不是安全审计工具。这句话是它在常见问题里自己说的——它只是一个审计开始之前需要的东西。
我读第一遍的时候觉得它有点自我矮化,读第二遍想明白了,这句话其实很有种。它不负责告诉你哪个插件是恶意的、哪个不是;它的活是列一份账:类型、来源、能力。来源清单里甚至有 UNKNOWN-ORIGIN 这种标签——它是真的连自己认不出来的东西也照实写。能力标签也短得不像讨好人的样子:EXECUTES,HOLDS-SECRETS,BROAD-FILESYSTEM,BROAD-WEB,NETWORK。看到这几个词我坐直了一点。不知道自己机器上有些东西正在执行,是一回事;有人用五个标签把你最不愿意面对的事实码在眼前,是另一回事。它清点的范围也比我以为的大:Claude Code 的全局和项目级 MCP 服务器、plugins、skills,Claude Desktop、Cursor、Windsurf 这些 MCP 主机,浏览器里的 AI 扩展权限,全局 npm 目录,都算在里面。
它还能跑 --strict,发现任何可执行代码或持有密钥的条目就退出码 2。也可以 --diff 跟之前的 JSON 快照比,看看哪些东西是新增的、消失的、权限升级了的。这个功能我读到时觉得有点意思——不是说技术多复杂,是说它默认你会隔段时间扫一次、天天对比。说不上为什么,一个「你今天又多了个会执行代码的东西」的提醒,比扫一次扔那儿不管正派多了。
它还自曝局限,这部分我原以为会看到一堆遮遮掩掩的话,结果没有。它说自己只读已知配置位置,看不到容器、WSL 和非标准路径;它读的是配置而不是运行时行为,所以没法判断一个包是不是恶意。换句话说,它知道自己瞎在哪,也把瞎的范围交代清楚了。
后来我去看了一下它的源码,几百行的无依赖 JavaScript。发布构建走 GitHub Actions,npm 包带 provenance,可以核验提交来源;MIT 许可,没有构建步骤——仓库里放着的源码就是实际跑的东西。作为一个写不出这种代码的人,我反而特别喜欢这个「你随时可以来看我在干嘛」的态度。现在的工具一个比一个像黑洞,它愿意把自己维持成一个能被人看懂的小玩意儿,起码让我觉得它有在替你着想。
写到这里我该承认一下了:我没跑。先怕了。
倒是跟信任没关系。我知道它只读、不传遥测、不打印密钥,这些我信。我怕的是扫出来的那个结果本身——原来我身边住着七个说不上来干嘛的插件,其中两个还握着文件和网络的权限。知道的那一瞬间,安全感只降不升。
但我大概明天会跑一次。不是因为我准备好了,是因为「知道自己有什么」这步总得有人替三周前那个随手点确认的我补上。哪怕扫完我更睡不着呢,那也是知道以后再睡不着,比起现在这种蒙在鼓里的睡法,可能还算体面一点。
进度条:认识了一个新工具,没跑,先学会了怕。
