handraw-style 深度评测:6100 Star 的 366 种画风库,自检全绿却有 29 条踩了自己的红线

handraw-style 深度评测:6100 Star 的 366 种画风库,自检全绿却有 29 条踩了自己的红线

让 AI 画一张「手绘风」的图,最烦的不是画不好,是每次都画得不一样。今天给它一句「日系手绘」,明天它给你一个水彩,后天变成铅笔素描。你想要的那个味道,说不清、也锁不住。

handraw-style 就是冲着这件事来的:把画风变成编号。366 个画风各占一个号,你报一个编号,它就把那一款的线条、笔触、上色方式翻译成一段中英双语提示词,喂给生图模型。48 天冲到 6100 Star,配套还有 169 种排版图型、36 种主题色,以及 1 个主技能带 13 个子技能。

我把它拷进隔离沙箱跑了一整轮。先说结论:画风库本身是扎实的:366 张风格单图我逐张打开过,一张不缺、一张没坏。但它自己写的自检脚本在最新代码上是红的,打包命令跟着一起用不了。而它文档里反复强调的那条红线,恰恰没有任何脚本在查——我数出至少 29 条越线。

一、它把「画风」拆成了三样东西

普通人生图,是在跟模型聊天:「再文艺一点」「线条细一点」。这个项目换成填表:画风编号 + 排版编号 + 主题色编号,三样填完,提示词就成型了。

你能选的东西 数量 举例
画风(视觉语言) 366 种 黑色简线、少量暖色腮红
排版图型(画面结构) 169 种 社媒卡、信息图、漫画分镜
主题色 36 种 C-01 克莱因蓝、C-26 柿子橙

这三样是分开的,这是它比同类做得细的地方:画风只管笔触和质感,排版只管信息怎么摆,颜色单独一层。你可以用同一套画风做小红书卡,也可以做长图,味道不散。

真正花心思的是下面这一层。它发现不同生图模型「听话程度」不一样——有的模型听到作者名就知道该画成什么样,有的必须把风格特征一条条念给它,还有的连特征都不管用、必须垫一张参考图。于是它给每个画风配了「该用哪种方式激活」的档案:

生图模型 只报名字就够 名字 + 风格特征 还要额外垫参考图
官方标定的 gpt-image-2 130 种(35.5%) 199 种(54.4%) 37 种(10.1%)
没登记过的第三方模型 0 0 366 种(100%)

换句话说:换个模型它不会装作自己还懂。认不出来就退回最保险的方式,让你传参考图。这份保守在开源项目里不多见,多数项目会假装自己通吃。

二、实测:它的自检脚本,自己在最新代码上是红的

我在一台隔离沙箱里跑完了它的全部检查,没有碰生产机。命令和结果都留在下面,你可以照着复现。

第一件事就跑它的官方自检——作者写明「发布前必须通过」的那个脚本。结果是失败,报错原文:

受版本管理的文件里泄漏了本地磁盘路径:一个生图示例脚本的第 11 行,写死了 `E:\handraw-style\output\…`

一行 Windows 盘符路径,卡住了整个自检。这段代码是昨天(10 月 23 日)随 v1.9.4 一起进来的。

我把这一行改成相对路径,别的什么都没动,再跑一次——通过,366 种画风、169 种图型、36 种颜色全绿,耗时 2.6 秒。

这个对比说明两件事:闸门的设计是有效的,它真的会拦;但它自己也真的会红,而且红了没人发现。

连带后果比这行路径严重。项目的打包脚本第一步就是调这个自检,所以:

我跑的东西 结果
官方自检(改前) 失败,卡在一行盘符路径
官方自检(改那行后) 通过,2.6 秒,366 / 169 / 36 全绿
官方打包命令 退出码 1,dist/ 目录根本没生成
前端逻辑测试 崩溃:断言还写着 331 种画风、166 种图型
发布审计脚本 6 个问题:5 处本机路径 + 1 处硬编码密钥
366 张风格单图逐张打开 0 张缺失、0 张损坏

最后两行值得单独说。

打包命令失败,意味着你按项目说明一步步操作,到最后一步拿不到安装包。不是装错,是根本没做出来。

前端测试崩溃,是因为这套测试写死了「331 种画风、166 种图型」——而库早就长到 366 和 169 了。我把数字跟上,它还是崩:界面里的风格选择器比库多一个条目(多一个「写实」入口),期望值得是 367。也就是说这个测试已经很久没人跑过了。

发布审计报的那条硬编码密钥,是我最意外的一处。审计脚本自己的说明写着「检查本机路径、常见凭据」,而它确实查出来了:一个本地生图服务的调用密钥,明文写在发布脚本里。项目根目录的发布检查记录却写着「无本机路径、常见凭据」。文档和工具在这里各说各话。

三、缺陷注入:闸门守住了什么,又放过了什么

光看全绿没用,我往库里塞了几处错,看它拦不拦。

我改坏了什么 闸门反应
删掉 1 张风格参考图 拦下:提示「366 张单图必须全部就位」
从旧编号映射表里删 1 条 拦下:提示「必须双向覆盖每一种风格」
把技能元数据字段名写错(name → nam3) 拦下:提示「缺少必填的 name 或 description」
把某条风格特征里的否定句改成肯定句 放行,但生成提示词时被自动滤掉,没漏出去
在画廊里删掉一张画风卡片 没报错——因为自检会先重建一遍画廊,我的改动直接被覆盖了

前三条是真拦。第四条是设计得不错:风格特征里如果有人写了「避免画人物」这种否定句,它不会原样塞进提示词,而是过滤掉——这个细节说明作者想过提示词污染的问题。

第五条有意思:它不是防住了,是自愈了。自检在检查之前先把画廊整个重新生成一遍,所以你手改的 HTML 不算数。这既是保护,也意味着「检查」和「生成」这两件事被绑在一起——你没法用这个脚本去验别人给你的、已经生成好的包。

四、它自己写的红线,29 条越过去了

这个项目的说明文档里有一段写得特别硬:

严禁把参考图里的具体画面内容(具体人物、外貌、服饰、动作、道具、具体动植物、具体场景)写进风格特征。只能写纯视觉语言:媒介材质、色彩光影、空间景深。

>

禁止出现的反例:「白色棉麻长裙的年轻女性」「黑色短发」「侧身回眸」「咖啡杯」「雨伞」。

理由很实际:风格特征会被塞进每一条提示词里。如果某条风格里写死了「围巾+小鸟」,那你画「宇航员在月球」时,模型也会给你加一条围巾、一只鸟。风格应该对主题完全透明。

我把 366 条风格特征逐条过了一遍。剔除「避免 / 不要」这类否定句后,仍有至少 29 条写进了具体画面内容,占全部有特征描述的 348 条的 8.3%:

类别 条数
具体服饰(围巾、牛仔裤、鞋带) 12
姿态动作(坐姿、站立、回眸) 6
外貌(黑色长发、卷发、眼镜) 6
具体动植物(猫、鸟、小狗) 5
具体场景(咖啡馆、屋顶、街角) 5
道具(咖啡杯、雨伞) 2

对照着看最清楚。文档点名的反例是「黑色短发」,库里有一条编号写着「黑色长发女性、坐姿、白上衣与蓝色牛仔裤」;文档点名「雨伞」「咖啡杯」,另外两条写的正是「咖啡馆水汽与雨伞街景」和「咖啡馆日常」。一条不差,全在文档亲手列的清单上。

要说明的是,我这是按关键词规则匹配的,判据是文档自己点名的那几类词,所以可能有误伤——比如「帽子」在某些风格里确实属于造型语言。但反过来也可能漏:写的是「人物」「主角」这类抽象词、没落到具体服饰的,我没算进去。29 是个下限,你可以按编号自己复核。

问题不在这些条目本身,而在没人拦它们。自检脚本查了图片有没有、编号连不连续、元数据字段全不全、失败提示里的路径泄没泄漏——唯独没查作者自己反复强调的那条铁律,一个字都没查。这条线是靠人守的,而现在看,人没守住。

五、我的判断

值得装,但要按「素材库」理解它,不要按「质量守门人」。

它最值钱的是那 366 张风格单图。我逐张打开验过:零缺失、零损坏,画廊里 369 处图片引用全部命中本地文件。另外 36 种画风还多配了一张四宫格参考图,生图时垫进去,风格能稳住。光这批图就值回它 226 MB 的体积(其中 110 MB 是 Git 历史)。

模型能力分层那一层同样值得学。它没有对所有模型说同一句话,而是承认「有的模型听不懂」,听不懂就退回最保险的路径。这是工程上的诚实。

但两条得自己盯着:

一,别信「全绿」。它的自检在最新代码上是红的,打包命令跟着失效。你要用,先把那行盘符路径改成本机的相对路径,再看一遍输出。两分钟的事,但这一步 README 不会告诉你。

二,它给画风写的特征不完全可信。至少 29 条把具体画面内容写了进去,而那正是它自己禁止的事。用这些编号出图时,你想要的画面主题会被参考图里的衣服、动物、场景污染。稳妥的做法是:出图前先看一眼这条画风的特征描述,觉得混进了具体物件,就自己删掉再喂给模型。

一句话收尾:一个把「怎么让模型听懂画风」想得很透、把「怎么管住自己」做得还没跟上的项目。素材可以放心用,闸门要自己带着。

关注 AI商业快讯,每天一篇 AI 热点深度解读。

相关阅读:

answer-me-with-html 深度评测:4187 Star 的一页 HTML 技能,安全测试拦得住,卖点数字拦不住

answer-me-with-html 深度评测:4187 Star 的一页 HTML 技能,安全测试拦得住,卖点数字拦不住

我往一个 4187 Star 的开源技能里注入了五处缺陷。三处被测试拦下,两处畅通无阻地通过了全部 1317 条测试。

有意思的是被拦下的和被放行的分别是什么。这个技能叫 answer-me-with-html,干的事很朴素:让 AI 别再甩一大段文字,而是交给你一页能点开看懂的网页。它的安全边界守得极严——内容安全策略(也就是浏览器端「只许加载白名单里的东西」那份禁令)、把网页里混进来的脚本当文本显示、本地服务只认本机域名,这三处我逐个改坏,测试立刻亮红灯。

但它的卖点没人守。我把它的写作文风检查里「英文句子最多 25 个词」改成 250 个词,重新打包,24 条相关测试全部通过;我用一篇 100 个词的长句去喂它,它回一句「0 条警告」。我又把 README 里那个「省 8 倍词元」的基准数字改成 10 倍,全量测试照样不动。

这篇要说的就是这条分界线在哪,以及它意味着什么。

它到底是什么

一句话:模型只写一段简短的 Markdown 草稿,剩下的排版、配色、深色模式、示意图坐标,全由随技能打包的一个命令行程序生成。

数字先摆出来,我逐个核过:

项目 数值 我核对的方式
Star / Fork 4187 / 280 GitHub 接口,评测当天
建仓时间 2026 年 10 月 2 日 距今 19 天
许可证 MIT 仓库根目录
合并请求 210 条 搜索接口
发版 17 个,最新 0.5.7 发布列表
未关闭问题 3 个 接口
安装体积 7.2 MB,其中打包好的可执行脚本 944 KB 磁盘实测
运行时要求 Node.js 20 以上,不需要装任何依赖 只拷一个目录就能跑

十九天冲到四千多星,节奏很猛。但真正值得说的不是星数,是它对自己设的规矩——这一点决定了后面所有结论。

它有一整套写作纪律,取自航空维修手册那一类的受控英语标准,核心是:一句话说一件事、不写废话开头、不用「进行优化」这类空词、步骤句不超过 20 个词。出稿时程序会逐句扫,超了就报警告。

还有 95% 的测试覆盖率、432 种组合的渲染快照比对、一个「打包文件必须是最新的」的持续集成检查。这套工程习惯在个人项目里相当罕见。

实测:它守住了什么

我在一台单核、2 GB 内存的隔离沙箱里跑完整套流程,命令和结果都留在下面,方便你复现。

我跑的东西 结果
全量测试 1317 条,1235 通过,1 失败,1 取消,80 跳过
覆盖率 行 95.2%、函数 95.0%、分支 95.4%
432 种组合的渲染比对 0 处差异
渲染一页示例(含两个示意图) 0.5 到 1.2 秒,纯生成函数中位 76 毫秒
成品页面体积 130 KB,压缩后 36 KB
页面里的外部请求 0 个(只有一个指向 GitHub 的文字链接)
官方基准语料复算 手写网页 4893 词元,草稿 612 词元,比值 8.0 倍

那个唯一的失败是它自己的测试超时:有一组测试要串行启动几百个进程、跑约六分钟,而文件级时限设的是两分钟。我在两台机器上各复现了一次,都是卡在 120 秒被掐掉。这不是功能坏了,是测试预算没跟上自己的规模。

再看安全。我挑了三个最关键的边界逐个改坏:

我改坏的地方 测试的反应
内容安全策略:把「默认全禁」改成「默认全放行」 8 条过、1 条挂,拦住
网页正文里的原生标签过滤:放行脚本标签 24 条过、4 条挂,拦住
本地预览服务:不再校验请求域名(防域名重绑定攻击) 0 条过、1 条挂,拦住

再补两句实测细节,说明它不是纸面安全。

往草稿里塞进带事件处理器的图片、内联框架、外发表单,四类危险写法都原样进了页面。但每一类都被那份内容安全策略在浏览器端掐死:策略只认逐条哈希过的自有脚本,而事件处理器需要「允许内联脚本」才能跑,它没开这个口子。

另外,它拒绝引用密钥文件,拒绝读取工作目录之外的路径,也拒绝符号链接逃逸。三种我都试过,全部按预期拒绝,并给出可操作的提示。

这是真功夫。安全这件事,它没有偷懒。

没守住的两处

现在说没被拦住的部分。

第一处:文风检查的阈值。

源代码里那行限制写得很清楚:中文描述句 45 个字、步骤句 35 个字;英文描述句 25 个词、步骤句 20 个词。我把英文描述句那项 25 改成 250,然后重新打包、重新跑测试:

# pass 24
# fail 0

24 条测试全绿。再拿一篇 100 个词的长句去喂命令行,它答:「STE ✓ 0 warnings」。

原因不难理解,但值得说清楚:那 24 条测试验的是「规则引擎能不能识别长句」——它们自己造一句刚好超限的长句,断言「报警了」。至于阈值具体是 25 还是 250,没有一条测试锁住。换句话说,测试守的是「报警器会响」,不守「报警线画在哪」。

第二处:README 上的基准数字。

仓库宣称「同样的问题,模型写草稿只用手写网页的八分之一词元」。这个数字来自九对手稿的语料统计,存在一个基准文件里。我把 README 上的 4893 改成 48093,全库搜索,没有任何测试文件引用过这个数字。测试不会失败。

诚实地说,语料统计本来就不适合进单元测试——它依赖一份不进版本库的外部语料包。但结果是:读者最容易被说服的那个数字,恰好是自动化完全不保护的那个数字。

我顺手还发现三处小裂缝,都属于「文档和实现各走各的」:

  • 对比文档写「12 个组件」,组件注册表里实际是 11 个,第 12 项是「原生网页/矢量图」这个逃生口,不算独立组件;
  • 主题列表在终端里排版错位,长名字会把版本号挤得贴上去,anthropic-clay0.1.10 中间没有空隙;
  • 只有标题、没有任何面板的空草稿,程序照样写出一个零面板的页面并返回成功。

还有一处小落差:README 写「大约 50 毫秒后你就有一页」。我实测纯生成函数中位 76 毫秒,算上进程启动整体 0.5 到 1.2 秒。50 毫秒是生成函数的最好成绩,不是用户感受到的那个数字。这是宣传口径的常见偏差,不影响使用,但和上面那条合起来看,指向同一个习惯。

同类里的位置

这个赛道上,最需要对比的是 Archify。

answer-me-with-html Archify
Star 4187 87118
建仓 2026 年 10 月 2026 年 4 月
起点 一页 HTML 答案 一张可交互的架构图
现在做的 一页 HTML 答案 一张图 + 「解释页」模式:结论先行、一题一屏、表格图表代码
交互 页面上的批注与决策汇总成一条回复 路由追踪、分享卡、导出图片与视频
离线 单文件、零外链 单文件

关键在第四行。Archify 已经把自己的能力从「一张图」扩到「一页解释」,那正是这个新项目的全部地盘。而它的对比文档里,关于竞品的那句话还写着「Archify 从一份 JSON 规格生成一张可交互图」,备注是 10 月 7 日核对的——距今半个月,竞品已经变了。

所以它真正的差异化不在「一页网页」,而在剩下三点:一,任何能跑 shell 命令的编码助手都能用,不绑特定宿主;二,产物完全离线,可以当附件发给别人;三,安全模型比同类更硬。

适合谁:想让 AI 把复杂解释画成页面、又不想装一堆东西的人。它的生成速度快、体积小、离线可用,装上就有产出。

不适合谁:想要交互式图表探索的人(那是 Archify 的地盘);以及指望它的写作检查当质量门的人——那道门的阈值可以随便改,改了没人发现。

我的判断

值得装,但要按「内容工具」理解它,而不是「质量守门人」。

它最值钱的地方是那套工程纪律:95% 的覆盖率、432 种组合的逐字节比对、打包文件必须最新的持续集成检查。这三样东西在两周做出来的项目里几乎见不到,说明作者清楚什么会悄悄坏掉。我注入的安全缺陷三处全被拦住,这正是纪律的成果。

但纪律画出的边界很清晰:安全在自动化里,卖点在自动化外。 这不是疏忽,是个合理的工程取舍——文风阈值和语料统计确实难测。问题在于文档没有把这条边界写出来,读者看到的「13 道检查」和「8 倍省词元」并排站着,会以为它们受同等保护。

真要用来干活,三条建议:

一,别信默认阈值。想让它真的管住文风,把检查模式改成严格模式,否则只是建议。

二,它生成的页面可以放心发给别人——外部请求为零,脚本逐条哈希锁定,这是实测结论。

三,如果你在意「省了多少钱」这笔账,自己拿你常问的三个问题重算一遍,别直接引用 README 的数字。

一句话收尾:一个把安全做扎实、把卖点写漂亮,却没在两者之间画等号的项目。装着用没问题,只是别把宣传单当质保单。

关注 AI商业快讯,每天一篇 AI 热点深度解读。

相关阅读:

见好·旅行规划器深度评测:399 Star 的中文旅行攻略技能,25 项机械验收我实测挖出 4 个洞

见好·旅行规划器深度评测:399 Star 的中文旅行攻略技能,25 项机械验收我实测挖出 4 个洞

让 AI 做一份旅行攻略,最气的不是它不会写,是它写得像那么回事。

十天的行程排得整整齐齐,每天几点去哪、在哪吃、门票多少,一张表给你。你截图存进手机,到了地方才发现:那家店六点就打烊,你的表上写着「晚饭」;两个景点隔着半座城,中间只留了三十分钟;回程那趟车的班次,是搜索摘要编的。

问题不在 AI 会不会查资料,而在没人验收。你收到一份文档,它没有错别字,排版漂亮,你凭什么判断它能不能照走?

GitHub 上有个叫「见好 · 旅行规划器」的中文技能包,专治这件事。它 399 个 Star,9 月 23 日建仓,作者把整整 10 万字的工作流写成一份给 AI 看的使用说明书,里面配了 25 项自动验收检查(用脚本代替人眼逐项打勾)。README 的原话是「你也能一键验收 AI 有没有偷懒」。

我把这个仓库拷进隔离的沙箱跑了一遍。检查确实是真能跑的,但好几处标着「通过」的地方,其实是没检查。这一篇就讲清楚:它哪里值得抄,哪里还不能信。

—

它到底是什么

先说清楚「技能(skill)」是什么:它是一份给 AI 读的工作说明书。你把它放进 Claude Code 这类 AI 工具的技能目录,AI 下次遇到「帮我做个攻略」就会先读这份说明书,按它规定的流程干活。

绝大多数这类说明书只写「怎么做」。这个包不一样,它花了大量篇幅写三件事:

部分 内容 实测数字
工作流主体 从问需求到出成品,分 7 个阶段 阶段 0 到 5,含一个 3.5
硬性约束 8 条不可违反的铁律 如实查、未核实必标注、动线不绕路等
交付验收 一个 Python 脚本,逐项检查成品 25 项检查,1 项需另装浏览器组件

那个验收脚本是它最特别的地方。你让 AI 做完攻略,AI 得跑一遍这个脚本,把输出原文贴给你。脚本会去数你这篇成品里:十个必备板块是不是都写了、每天是不是有早中晚三行饭、有没有留下「【目的地】」这种没填完的模板占位、手机上会不会横向溢出、每天配图是不是 2 张或 4 张、页面里的地图线条有没有画出框外。

这些项不是凭空想的。它每一条后面都挂着一句来源,比如「每天配图 2 或 4 张,禁 3 张」后面写着:配图区是两列网格,3 张就会排成「上二下一」的歪相。

这个思路是对的。把「感觉差不多」变成「机器数得出来的相等」,是这类文档最需要的护栏。

—

实测:25 项里,我挖出 4 个洞

我在沙箱里把仓库拷下来(5.7 MB,8 个 Markdown、5 个 Python),只做了一件事:用它自带的检查去检查它自己。

先给一句公道话:它仓库里那份「基准骨架」是填空模板,不是成品,跑出不合格是正常的,作者自己也在文档里这么说。所以我没拿这一点当罪名。真正的问题在这几处。

我做的事 它报的结果
数它到底有多少项检查 25 项(README 写 11 项,更新日志写 24 项)
把每天的时段卡全部删掉再跑 「时段卡时间线 ✅ 5 天时间戳升序(读到 0 个带时刻的时段卡)」
用关键词查它最新加的出境功能 签证、汇率、领事保护、时区、护照,一个都查不到
用它另一个版式校验脚本查它的基准骨架 不合格,退出码 1
看它的提交闸门允许哪些文件 它自己这版新加的工具不在白名单里
不带参数跑它新加的预抓工具 直接报错崩掉,没有用法提示

拆开说三条最值得注意的。

第一,零样本也算通过。 我把每一天的时段卡整段删掉,只留空的日期区块,再跑检查。它照样给「时段卡时间线」打勾,理由是「读到 0 个带时刻的时段卡」——读到 0 个,就没有乱序,也没有重复,于是通过。

这不算它没想过。它在这个脚本的更新说明里,亲口记着一模一样的翻车:以前删掉全部日期区块,脚本会报「0 天全齐」,它为此专门加了一条前置校验,现在 0 天直接判不合格。它认出了这个病,只治了一处。

第二,它最新、最重磅的升级,验收环节一条都没跟上。 10 月 19 日的版本把「出境能力包」列为本轮最大更新:签证体检卡、出入境双清单、双币种预算、领事保护区块、时差换算、插头制式。整个版本说明里写了六七段。

我在验收脚本里逐个搜这些词,命中 0 次。也就是说,一份出境路书漏掉签证倒排时间线、漏掉领事保护电话,那 25 项检查一项都不会响。

它自己在脚本注释里写过一句诊断,我认为是整份代码里最清醒的一句话:翻车全都发生在「条款有、检查器没有」的形态层。这次它自己也踩进了这句诊断里。

第三,它的校验脚本会判自己不合格。 包里还有一个「版式一致性」校验,拿基准骨架当唯一真值,比对新成品和它是否一致。用它去查基准骨架本身,结果是退出码 1,理由之一是「样式块 1 个,应为 2 个」。根因是那个「第 2 个样式块」被写在了 HTML 注释里,脚本数样式块时会先剥注释,判断「该有几个」时却按整份文件算——两边口径不一致。

还有两处小的:交付给仓库的推送闸门里,允许上传的文件清单只列了旧的三支脚本,这一版新加的预抓工具不在其中,照它自己的规则这个文件推不上主分支;报错提示还让人「先更新 GIT.md 的白名单」,而仓库里根本没有 GIT.md 这个文件。

—

但有一件事,它做得比大项目好

上面这些挖得越细,我越想说另一边。

这个仓库有一份 5.5 万字的「翻车实录」。不是宣传语,是事故档案:哪一版把 93KB 正文压成了摘要、导致条款全丢;哪一版手机端工具条把正文最后一行挡住了;哪一次图片检查因为没滚动触发懒加载,把 10 张图里的 4 张误判成死图;哪一次地图的路线端点在框里、路径却绕出框外 10 像素。

每一条规矩背后都挂着一次真实事故,而且是作者自己写下的、不体面的那种。

对比一下站内刚评过的同类:同样是自带检查的项目,有的 13 道校验跑完全绿,同时打印 409 条警告、一条都不拦;有的 1020 个测试全绿,我复现 6 个基准只对上 5 个。「闸门全绿」这件事本身不值钱,值钱的是闸门敢不敢红。

这个包的闸门是敢红的。它跑自己的基准骨架,25 项里直接判 8 项不合格、退出码 1,还把每一处不合格标出位置和修法。很多项目的验收脚本,出厂设置就是「全绿」,因为红了不好意思。

它还有两个细节看得出是真做过东西:一是给页面样式算了个指纹,派生新稿时样式一改就会被抓出来;二是查占位符之前,先把内嵌图片的二进制数据剥掉——因为图片数据里可能碰巧出现「TODO」这类字符,造成假报警。后者是吃过亏才会想到的。

再加上一组外部数据:作者说这个项目的抖音介绍视频播了 12.6 万次、收藏 2889(他标注截至 9 月 30 日,我无法核实,仅作参考)。

—

谁该用,谁别用

适合你的情况:你自己用 AI 写旅行攻略,写完想有个客观标准判断「能不能照着走」。把这套检查拿过来,改掉里面的城市前缀,就能用在你的成品上。或者你在写自己的技能包,想看一份把「验收」当正事的样本怎么组织。

不适合的情况:你以为装上它,AI 就会自己做出一份能直接出发的攻略。它的定位是流程和验收,真正的信息还是得 AI 联网一个个查,查不到就得如实标「未核实」——这一点它自己也反复强调,而且把「禁编造」写成了铁律第二条。

还有个体量上的提醒:10 万字节的单文件说明书,加上 5.5 万字档案,对 AI 的上下文是真金白银的开销。它在文档里专门立了一条规矩,禁止把这份说明书压缩成摘要,因为压缩就会丢条款。这是诚实的取舍,但代价也要你自己承担。

—

我的判断

值得放进观察清单,不建议直接当生产工具用。

它解决的是这类 AI 产物最缺的一环:验收。25 项机械检查、事故档案、敢判自己不合格,这三样在 399 星的小仓库里出现,质量明显高于星数。

但要真拿它交付,有四件事得自己补:检查项数按脚本实际输出为准,别照文档写;「读到 0 个样本」类的检查要人工复核有没有漏检;出境章节完全靠人眼盯;版式校验脚本跑在自己仓库上会误报,别被它吓到。

关注 AI商业快讯,每天一篇 AI 热点深度解读。

相关阅读:

  • [laya 深度评测:7 天 2.35 万 Star,6 张基准表逐格复现](https://www.geeyo.com/laya-%e6%b7%b1%e5%ba%a6%e8%af%84%e6%b5%8b%ef%bc%9a7-%e5%a4%a9-2-35-%e4%b8%87-star-%e7%9a%84%e5%86%b3%e7%ad%96%e5%bc%95%e6%93%8e%ef%bc%8c6-%e5%bc%a0%e5%9f%ba%e5%87%86%e8%a1%a8%e6%88%91%e9%80%90/

评测环境:隔离沙箱内克隆仓库(bwrap 命名空间,无宿主家目录),所有检查在沙箱内断网运行。数据截至 2026-10-21。

ECC 深度评测:28.5 万 Star 的 Agent 操作系统,13 道校验全绿却放行 409 条警告,98 篇跨平台副本已漂移

ECC 深度评测:28.5 万 Star 的 Agent 操作系统,13 道校验全绿却放行 409 条警告,98 篇跨平台副本已漂移

GitHub 上有个 28.5 万 Star 的仓库,叫 ECC。它给自己的定位很硬:不是又一个提示词合集,而是「AI 编码助手的操作系统」——71 个子智能体、311 个技能、97 个命令,装一次,让你的编码助手按一套工程流程干活。

仓库的自我要求也硬。它配了 13 道自动检查,提交代码时全部跑一遍。我把它拷进隔离沙箱,先跑了一遍:13 道全绿,45 秒跑完。

然后我开始动手改。按它的贡献指南,每个技能都必须写「什么时候该用我」和「别这么做」两节,我就把一个技能的「什么时候该用」整段删了;又挑了一个技能,把正文全清空,只留文件开头那几行元数据;再把这 311 篇技能里 30 篇的简介全换成一句「A skill.」。

四处改动,13 道闸门一次都没响。

—

它到底是什么

ECC 不是单个技能,更像一个中台。装进 Claude Code、Codex、Cursor 这类编码助手后,它提供四层东西:

层 数量 干什么
子智能体(agents) 71 个 分别负责规划、代码审查、构建报错修复、安全审查、各语言专项
技能(skills) 311 个 按需加载的工作流,从测试驱动开发到 Python、Go、Spring Boot 各框架规范
命令(commands) 97 个 斜杠命令入口,仓库自己标注为「过渡期兼容层」,正在往技能迁移
规则(rules) 122 条 按语言和项目类型挑选的常驻约束

先给一句公道话:这些数字全是真的。我在沙箱里数了一遍目录,71、311、97、122,与 README 写的逐项对得上——很多号称几万 Star 的项目,README 里的数字是上个季度的。ECC 的自检脚本 catalog:check 专门盯这一条,我把 README 里的 311 改成 999,它立刻亮红灯拦下。

它还做了一件同类项目很少做的事:把自己的失败写进文档。仓库里有一份「提问有效性」的实验报告——作者拿 6 个藏了坑的编程任务做对照,四个组跑了 72 次真实会话,结果四组全部满分通过,什么也没测出来。报告里直接写「这次实验没有提供任何信息」,并分析了三个原因:坑都藏在仓库里、实验时关掉了向用户提问的通道、测试用例是按闸门自己的问题分类写的因此注定通过。这份诚实,比大多数评测报告值钱。

—

实测:闸门守的是什么

先说常驻成本,这是装之前最该知道的。

311 个技能的简介会全部塞进助手的上下文,因为助手得先知道有哪些技能,才能决定加载哪个。我实测这 311 条简介合计 10 万字符,按英文四字符一个词元估算,约 2.5 万词元常驻。词元(也就是模型计费时说的那种字数单位)在场的每一轮对话都要重新计费。对一个每天开十几个短任务的人来说,这是纯开销。

如果 311 篇正文全部加载,是 73 万词元——当然设计上不会全加载,但这也说明「311 个技能」不是一个轻量的承诺。

再看内容厚度。311 篇技能里,269 篇的目录里只有一个说明文件,没有任何脚本、模板或附件。真正带可执行脚本的只有 23 篇。这不是罪状——很多技能的价值就是一份写清楚的流程文档——但它解释了为什么 2.9 MB 的正文撑起了 311 这个数字。

13 道闸门实际放了 409 条警告。 这个数字是我跑 npm run test:validators 得到的:退出码 0,同时打印 409 条提示。拆开看,160 篇技能缺「什么时候该用我」这一节,211 篇缺「别这么做」这一节,37 篇正文超过贡献指南规定的 500 行上限。

这些闸门本身写得没问题,问题在于它们的出厂设置:全部按「建议」处理,只有加 --strict-checklist 才升级为「错误」。我加上这个参数再跑一次,同样的 409 条立刻变成 409 个错误,退出码 1。也就是说,仓库自己写下的规矩,默认状态下一条都不会拦人。

于是就有了开头那组注入。五处改动,只有一处被拦:

我改的地方 闸门反应
README 里技能数 311 → 999 拦下(catalog:check 报错)
删掉一个技能的「什么时候该用我」整节 放行
把一个技能正文清空,只留 324 字节元数据 放行(三道检查全绿)
改掉技能的内部名,塞进只在 Claude 下有效的变量 放行
30 篇技能的简介全替换成「A skill.」 放行

被拦的那一处,恰好是「数字」——catalog:check 会拿 README 里的计数和实际目录数比对。它守的是数量和结构,不守内容。一份技能文档是三千字还是一句话,在它眼里没有区别。

这不是疏忽,是个工程取舍:文档写得好不好,没法用脚本判定。但取舍的边界应该写清楚——贡献指南把这四节列为「必填清单」,闸门却全部降级成建议,这中间的落差,读者容易误解成「不写也没事」。

—

更值得说的问题:副本已经漂了

ECC 支持十几种编码助手。它的做法是:仓库根目录的 skills/ 是唯一真源,其他平台的目录(给 Codex 用的 .agents/skills、给 Kiro 用的 .kiro/skills、给 Cursor 用的 .cursor/skills)打包或映射同一批文件。README 写得很明确:「根目录是真源,平台适配器打包或映射这些同样的工作流,而不是维护独立副本。」

我按字节比对了一遍:

副本目录 篇数 与主库逐字节一致
pi/core/skills 132 131
.agents/skills 46 5
.kiro/skills 43 0
.cursor/skills 12 0

pi 那一套几乎完美同步,说明同步机制是存在的、能用的。但另外三套——合计 101 篇——只有 5 篇还对得上。差异不是改几个字,是整节消失:25 篇副本里丢了整节内容,其中 8 处丢的是「不可信来源」这类段落。

举个具体的。主库的深度研究技能里有一节专门写:网页抓回来的内容全部是「攻击者可以控制的东西」,页面里出现「忽略你之前的指令」这类话,只能当引用、不能当命令执行。给 Codex 用的那份副本,这一节没有了。同一个缺失出现在市场研究技能上,给 Cursor 用的副本也一样。内容创作技能的「硬性禁令」一节,在 Cursor 副本里也消失了。

这些段落不是文风问题,是防提示注入的安全约束。三个平台的用户,拿到的是少了这道防线的版本,而没有任何检查会发现这件事——我试着把副本改回和主库一致,闸门毫无反应,因为它根本不比对副本。

还有一个更小的细节,能说明「真源」的边界在哪。日语版本里有 32 篇技能,每篇都是 11 行的占位符,正文写着「翻译进行中」,末尾指向一个本地路径 D:/tmp/ECC/...——那是作者自己电脑上的盘符。仓库有一条检查专门防止这种本地绝对路径泄漏,但它只认 Mac 和 Windows 用户目录两种格式,D:/tmp 这种盘符根部路径不在它的识别范围里。这 32 篇占位符,随包进了 npm 分发包。

—

同类里的位置

这条赛道上,ECC 走的是「大而全」那一头。之前评测过的 mattpocock/skills(27.4 万 Star)是 27 个技能、688 KB,走的是少而精;addyosmani/agent-skills(9.9 万 Star)是 25 个工程技能;i-have-adhd 是单点解决输出样式。ECC 反过来:把你能想到的语言、框架、流程全铺一遍,311 个技能铺满,用「总有一个你用得上」换取覆盖面。

代价就在上面那几组数字里。铺得越宽,单篇被校验的深度就越浅;支持的平台越多,副本漂移的面积就越大。MIT 协议、单月 5.2 万次 npm 下载、1778 次提交的主作者加上 500 多次的第二贡献者——这是一个真在高速迭代的项目,而高速迭代和「每份副本都跟主库一致」天然冲突。

适合谁:刚给编码助手上手一套工程流程的人。它的规划、测试驱动、审查三段式确实成体系,71 个子智能体里挑几个常用的,比自己从零攒提示词快得多。规模是真的,这点不用怀疑。

不适合谁:只想装一个轻量技能的人。2.5 万词元的常驻索引,对偶尔用一次的人是负担。以及,如果你用的是 Codex、Kiro 或 Cursor——你拿到的那份副本,可能比主库少了点什么,而没有任何东西会提醒你。

—

我的判断

值得看,但要按「一套规模很大、质量参差的工程模板」来理解它,而不是「一个自带质量保证的体系」。

它最值钱的地方恰恰不是那 13 道闸门,而是那份把自己实验做失败、然后老实写下来的报告。一个愿意公开「这次什么也没测出来」的团队,比一个宣称「13 道闸门全绿」的团队可信得多——后者只能说明结构和数量没坏。

真要用得踏实,建议补三件事:一是把 --strict-checklist 打开,让那 409 条警告真的变成错误,否则你写的技能可以是一句空话;二是如果你用的是非 Claude 平台,以主库的 skills/ 为准,别信副本;三是装之前先算一笔账,2.5 万词元的常驻索引,值不值。

28 万 Star 买的是覆盖面。而覆盖面这件事,从来不承诺深度。

关注 AI商业快讯,每天一篇 AI 热点深度解读。

相关阅读:

context-mode 深度评测:3.1 万 Star 的上下文插件省 98% 是真的,19 条泄洪命令实测 16 条放行

context-mode 深度评测:3.1 万 Star 的上下文插件省 98% 是真的,19 条泄洪命令实测 16 条放行

你大概撞过这堵墙:用 AI 编码助手干活,聊上半小时它开始「失忆」——刚改过的文件忘了,刚才的任务忘了,你上一条消息也忘了。很多人以为是模型不够聪明,其实更常见的原因是上下文被工具输出撑爆了。一次日志查询、一次跑测试、一个网页抓回来,几十 KB 的原始数据就这么灌进对话窗口。

有个 3.1 万 Star 的开源插件专门堵这个口子,名叫 context-mode(可以理解成「上下文模式」)。它的说法很硬:把大块数据关起门来处理,只让结论回到对话里,能省下 98% 的上下文。我把它拷进隔离沙箱翻了一遍:这个数字是真的,我手里几份样本甚至更省。但同样在这次实测里,它承诺的「自动拦截」只覆盖了 19 条常见命令中的 2 条。

它是什么

context-mode 是装给 AI 编码助手用的插件,Claude Code、Cursor、Codex 这类工具都能装。它主要想解决两件事:

  • 别让原始数据进上下文:给它一段代码,它在单独的子进程里跑,只把打印出来的结果交回来。
  • 别让对话失忆:把每次文件改动、命令、决定记进本地数据库,压缩对话后还能按关键词搜回来。

它还有一路「检索式」用法:先把文档、日志切块存进本地全文索引,需要时按问题搜出相关片段,而不是整篇塞进去。

真正值得看的是它拦什么、放什么:

它想管的事 它的做法
抓网页(curl、wget、WebFetch) 改写成一句提示,让你改用沙箱里的抓取工具
内联发网络请求 同样改写成提示
gradle、maven、sbt 构建 改写,让你把构建放进沙箱跑
读大文件、全文检索、跑测试、看日志 只在你第一次触发时提醒一句

实测:省下的数字站得住,拦下的命令站不住

先说省。它仓库里放了 21 组真实样本——一份 85.5 KB 的埋点表格、一份 45.1 KB 的 nginx 访问日志、一份 58.9 KB 的 GitHub issues 导出。我用它自带的执行器跑了一遍:

样本 原始 进上下文 节省
埋点表格(500 行) 85.5 KB 79 字节 99.9%
nginx 访问日志(500 条) 45.1 KB 92 字节 99.8%
GitHub issues 导出 58.9 KB 17 字节 99.9%
git 提交历史 11.6 KB 11 字节 99.9%

这个方向没得挑。它给你一个子进程,你写几行代码把统计做完,窗口里只留一行结论。我另外试了「检索式」那一路:四份文档共 32.7 KB,三个问题各取回三条片段,进上下文 5.59 KB,省 82.9%,和它文档里给这类用法标的 82% 基本吻合。问文档里根本没有的东西(比如「怎么部署到 k8s」),它会返回零条,不硬凑。

省是真省。问题出在它承诺的另一半:它说装上钩子就会「自动拦截」,之后不用你操心。

我把它的路由逻辑单独抽出来,喂了 19 条最典型的命令,结果是这样:

我喂的命令 它的反应
curl -s https://… 直接把网页打到屏幕 拦下,改写
curl -s -o 文件 https://… 存成文件 放行
tail -n 2000 日志(第一次) 追加一次提示
同一条 tail(同会话第二次起) 放行
grep -rn ERROR src/ 放行
find . -name '*.ts' 放行
ls -R src/ 放行
git log -p -n 200 放行
gh pr view 123 --json body,comments 放行
kubectl logs --tail=5000 放行
docker logs 容器名 放行
cat 一个大文件 放行
npm test / npm run build 放行

19 条里,改写拦下 2 条,只提醒一次 1 条,其余 16 条原样通过。

这不是我挑得刁。它的设计就是这样:只在「结构上一定短小」的命令上主动放行(比如 pwd、git status),其余走一句「建议用沙箱」的提醒,而且每个会话只提醒一次。也就是说,第一次 tail 之后,助手再查多少次日志,它都不再吭声。真正能改变行为的只剩提示词,而提示词管不住它读不读日志。

这里还有一层措辞值得说清。它宣传里的「沙箱」只是另起一个子进程,并没有把文件和网络隔开。我在里面读了系统用户文件、读了家目录下的文件、往临时目录写了东西、还抓了一次公网,全部成功。这本身不算毛病——它要的是「数据不进口上下文」,不是「防住恶意代码」。但读者很容易把「沙箱」理解成后者,文档里「完全隔离」的说法撑不起这个想象。

它自己的文档,九处改动一处没响

一个项目可不可信,最后看它有没有本事守住自己的话。我把它的仓库当成被测对象,做了两组注入。

第一组改代码:把工具名前缀改错、把抓网页的拦截整段拆掉、把函数返回类型改错、让版本号只改一半。四道闸门——类型检查、打包产物断言、插件入口检查、单元测试——四发四中,全红。

第二组改文档,一次只动一处,跑同一套闸门:

我改的地方 闸门反应
首页主标语「98%」改成「99.9%」 全绿
基准报告的总节省 96% 改成 99.9% 全绿
把基准报告里 20 行实测数据整段删掉 全绿
测试总数 125 改成 1250 全绿
安装量徽章 69.97 万改成 990 万 全绿
技能说明里「拿不准就用它」反写成「拿不准就用原始命令」 全绿
平台表里把 Claude Code 从「有钩子、省 98%」改成「无钩子、省 0%」 全绿
隐私段「不上传任何数据」改成「默认采集遥测」 全绿
许可证从 ELv2 改成 MIT(和仓库里的许可文件矛盾) 全绿

九处,零拦截。仓库里没有一条测试或脚本拿基准报告和首页当数据源——它守的是代码能编译、打包没坏、版本号一致,唯独不守「我们宣称自己做到了什么」。

这组数字本身也有松的地方。基准报告开头写「21 个场景」,两张表加起来只有 20 行。总账写「376 KB 变成 16.5 KB,省 96%」,按它自己的分项算出来是 95.6%,四舍五入到 96 需要一点善意。有一行「网络请求」标 13% 节省,按原始字节算是 14.8%。另有两行标着 100%,实际分别还剩 155 字节和 222 字节。都是小账,但一份用来佐证「98%」的报告,小账该更紧一点。

顺带说一句首页。顶部有一排企业徽章——微软、谷歌、Meta、亚马逊等 18 个名字,底下写着「以下团队在用」。那 18 个链接全部指向空锚点,点不动。这不是造假证据,但也不是能点开的证据。

同类里的位置

省上下文这条道上,它站的位置很特别。之前评测过的 caveman(10.8 万 Star)走的是「让 AI 少说废话」:用提示词约束输出,省下的主要是模型自己的啰嗦,官方简介写省 65%、自家文档只认 8.5%。context-mode 不碰说话方式,它搬走的是工具塞进来的数据——这是另一半,也是更硬的一半。

再往前看,Graphify(12.5 万 Star)用代码知识图谱省调用费(也就是模型按字数计的额度),官方宣称 71.5 倍、我复算 38.3 倍;agentmemory(2.9 万 Star)做记忆,官方 95.2% 的「答案找齐」率换成实际评测只剩 81.8%。这条道上的共同点是:省的量级大多能复现,宣称的精度普遍要打折。context-mode 在这一点上算体面——它的 98% 我复出来在 99% 以上,方向没错。

代价也有。装上钩子后,每个会话开头会注入一段约 6800 字符的行为规则(英文约 1700 个词元,也就是模型计费时说的那一种计量单位)。对一次长会话不算什么,对一堆短任务就是纯开销。

适合谁:每天用 AI 编码助手处理大量日志、测试输出、网页抓取的人。子进程和本地检索确实能让窗口干净很多,省下的量我能复现。

不适合谁:指望它「装上就自动管住助手」的人。它真正硬拦的只有抓网页和三种构建工具;其余靠一句每个会话只出现一次的提醒。想让助手老实走沙箱,还得在项目规则里自己写死——这恰恰是它想替你省掉的那件事。

我的判断

值得装,但别按宣传理解它。把它当成「一个更好用的数据处理器加一块本地检索库」,你会很满意:一份 85 KB 的表格进去,79 字节的结论出来,这一手确实漂亮。把它当成「上下文守门员」,你会失望——门装了,大部分时候只是挂在那儿。

真要用得踏实,建议补两件事:一是把「读日志、跑测试、看 diff 必须走沙箱」写进你自己的项目规则,别指望钩子;二是装完后拿它给的那份基准报告,对着手头的真实任务复一遍,看省下的比例还在不在同一量级。

省 98% 是它最好的一张牌,而这张牌恰恰是它自己最没闸门守的一张。

关注 AI商业快讯,每天一篇 AI 热点深度解读。

相关阅读:

humanizer 深度评测:5.8 万 Star 的反 AI 味技能,204 条禁用词我逐一核过,146 行检查脚本却只查打包

humanizer 深度评测:5.8 万 Star 的反 AI 味技能,204 条禁用词我逐一核过,146 行检查脚本却只查打包

你大概见过这种句子:「这不仅仅是一次更新,更是一个时代的开始。」读起来顺,但就是不像人写的。有个 5.8 万 Star 的开源技能专门治这个病,名字叫 humanizer(可以理解成「给机器文字做人味」的写作技能)。它把「AI 味」拆成 26 种可以指认的毛病,一种一种改。我把它拷进隔离沙箱翻了一遍:这份规则清单写得确实漂亮,光是写死的禁用词与短语就有 204 条;但我也顺手测了它唯一的一道自动检查,发现它压根不管句子。

它是什么

humanizer 是一个装给 AI 编码助手用的写作技能。装进 Claude Code 这类工具后,你丢一段文字给它,它按规则找出 AI 痕迹,再改写成更像人写的样子。整个仓库只有 15 个文件、238 KB,几乎全部价值都集中在那一份约 5200 词的说明文档里,外加一份 146 行的打包检查脚本。

真正值得看的是它盯上了哪些毛病:

毛病 它的例子
先扬后抑的对比句 「这不只是一个功能,而是一次升级」
一句一段的收尾句 「这说明了一切。」
假装深刻的短句 「说到底,真正重要的是……」
三段排比、满篇破折号 硬凑三项、把连接号当成万能胶水
夸大的意义、模糊的引用 「标志着关键时刻」「专家们认为」
聊天残留 「好问题!」「希望这能帮到你」

它给 26 条规则各配了一份「盯防词表」(也就是一份写死的禁用词清单)。我把这些词表全部抽出来数了一遍:26 条里有 18 条带表,合计 204 个词或短语。这份表的意思很直白——这些词你在稿子里一用,就等于自报家门。

实测:它的闸门只管打包,不管句子

这里有个缝。词表是写给「读文档的人或模型」看的,不是给机器执行的——仓库里没有任何测试或评测脚本,唯一能跑的程序是那份 146 行的打包检查。它跑得很快,会确认四件事:几个清单文件里的版本号一致、README 和说明文档里的 26 条编号对得上、说明文档没超过 5500 词。做完这些,它就报「包是好的」。

我把它的原版检查拿来当尺子,往仓库里灌了 11 处缺陷,看它抓不抓得住:

我注入的缺陷 检查结果
清单版本号改成 3.1.1,与其它文件不符 抓到
README 里一条规则的名字改了一个词 抓到
说明文档灌到 5619 词 抓到
把一整段 AI 味文字写进说明文档正文 放过
把连接号、弯引号写进说明文档(违反它自己的第 8、21 条) 放过
把「改前改后」里已经改好的句子,改回带连接号 放过

11 处里,它抓到 6 处、放过 5 处。抓到的全是「打包整不整齐」,放过的全是「句子本身违不违规」——而后者恰恰是这个技能存在的理由。

我又用它的尺子量了它自己的示范。它给 26 条规则都写了改后范例,我把这些范例抽出来,拿别的规则的盯防词表去搜,命中 3 处:一条规则的示范改写里,用了另一条规则明令删掉的词。都是小毛病,但方向有意思——连它自己也没法用机器守住自己的词表,因为改稿这件事,最终还是要靠模型读懂规则、照着改。

第三方盲测说了同一件事

仓库里挂着一个志愿者跑的盲测(issue #229),结论和我的观察在同一条线上。让评委在不知道作者的前提下二选一,humanizer 的改写在 16 次对比里全胜;把 AI 常用词清掉的效果很干脆——评委点名的「AI 词汇」从 70 次降到 0 次。但另一组数字没那么好看:句子的节奏反而更齐整,被点名的「节奏类」痕迹从 60 次涨到 101 次。这位志愿者还实测了 100 篇 AI 文本的去检测效果,改完仍被识别出 97.8%。

作者本人在同一个帖子里的回应很干脆:绕过 AI 检测不是这个仓库的目标,它也从没声称能做到。这话是诚实的,网站首页现在也写着「给人类读者改稿,不追求骗过检测器」。

同类里的位置

同类还有几个,位置各不相同。中文圈有一个从它移植的分支,把 26 条缩成 24 条来适配中文(本号此前实测过,当时它还没公开过基准测试);另一个走「极简规则」路线的反 AI 味技能 stop-slop,规则少到能被机器完整执行,代价是停更了很长时间(本号 9 月评测过,它的改后范例自己就违反规则)。humanizer 站在两者之间:规则最全、更新也最勤,上周还有新提交;代价是规则再全,也得靠模型读懂了照着改,没有机器替你验收。

适合谁:经常用 AI 起草、又想让文字读起来像自己写的人。不适合谁:想靠它躲开 AI 检测的人——它自己和第三方实测都说了做不到。

我的判断

把它当一份「写作体检清单」用,很值。204 个盯防词一摆出来,你会立刻认出自己稿子里的 AI 味,这比任何抽象的「别写出 AI 感」都实在。别把它当自动净化器:它没有能力、也没打算替你验证规则有没有被执行。真想让它省事,得自己在流程里补一道闸门——改完再查一遍,用词表当尺子。

关注 AI商业快讯,每天一篇 AI 热点深度解读。

相关阅读:

—

评测数据截至 2026-10-19,取自隔离沙箱内 clone 的 blader/humanizer 主线(版本 3.1.0);第三方的盲测与检测数据来自仓库 issue #229 及其复现仓库,未由本站复跑。

public-apis 深度评测:49 万 Star 的免费 API 清单,自带检查器报 624 条错、落进正文的只有 55 条

public-apis 深度评测:49 万 Star 的免费 API 清单,自带检查器报 624 条错、落进正文的只有 55 条

想给手头的小工具接一个免费数据源,多数人的第一反应都是去 GitHub 搜一份「免费 API 清单」。搜来搜去,基本都会落到同一个仓库:public-apis。近 49 万 Star,2016 年建仓,十年攒下两千多条接口。我把它拷进隔离沙箱翻了一遍,也跑了它自带的检查工具,撞见一处很难忽略的矛盾——这个仓库给自己配了一套格式检查器(也就是专门挑毛病的自动脚本),而这套脚本在仓库自己的主文件上,已经连续红了快一年。

清单就是产品,写代码的地方只有 23 个文件

先说清楚它是个什么。public-apis 不是软件,你没法安装它、也没有一个程序在后台运行。它的全部产品就是一个 Markdown 文件(README.md),一本两千多行的接口黄页。你想找天气、汇率、星座、公开财报、机场信息,翻这本黄页,按分类找到对应的接口,点进它给的官方文档。

去掉版本历史,整个仓库只有 23 个被跟踪的文件。绝大多数是图片和说明文档,真正算「代码」的只有四样:

组成 数量 干什么的
主清单 README.md 1 个,31.5 万字节、2679 行 就是那本黄页,52 个分类、2185 行表格条目
格式检查器 2 个脚本 检查每一条写得合不合规矩
自动检查的配置 3 个 让 GitHub 每次提交都自动跑一遍上面的脚本
脚本自测 2 个文件、31 条用例 验证检查器本身没写坏

所以它是一个「靠规矩维持的清单」。它给每条接口定了硬要求:分类内按字母排序、描述不超过 100 个字符、一次提交只能加一个链接、提交前先搜一遍有没有重复。这些规矩写在给贡献者的说明里,也写成脚本让机器执行。

这套机器分两层。上游是检查脚本,下游是 GitHub 的自动检查服务(CI,也就是每次有人提交代码,服务器自动跑一遍检查并把结果打回提交页)。过去十年,这个仓库的贡献者大多是路过的开发者,改一行加个链接就走。要维持两千条不出错,靠人盯是不现实的,只能靠机器。这是个很聪明的设计——省下的人工编辑,变成了两段脚本。

问题也恰好出在这里。

我跑了它的检查器:624 条报错,91% 跟清单内容无关

在沙箱里,我照着它的配置跑了一遍格式检查,结果是退出码 1,也就是「不通过」:全文件报出 624 条错误,分布在 129 行上。

六百多条听起来很吓人。但我把这 624 条按「报错落在文件的哪一段」摊开之后,结论完全变了:

报错落在哪 条数 占比 是什么
表格分隔行的写法 507 81% 机器没跟上清单的新写法
表头行、MCP 段、赞助段的表结构 62 10% 机器只认一种表格
主清单的条目行 55 9% 这才是清单正文

624 条里,只有 55 条落在清单正文上(9%);其余 569 条(91%)是检查器与清单格式演进之间的脱节。那 55 条也不是都白报——里面 30 条是「分类没按字母序」,真正要改条目文字的只有 25 条:12 条描述写超了 100 字上限,剩下是标题、标点、单元格空格这类小毛病,摊在两千多条里,属于正常磨损。

最能说明问题的是那 507 条,也就是占比八成的最大一块。Markdown 表格的分隔行有两种合法写法:|---| 和 |:---|(后者表示文字靠左排,渲染出来更整齐)。这个仓库近年把分隔行统一改成了带冒号的写法,而检查脚本里负责「跳过分隔行」的那一行判断,认的还是老写法。于是整整 47 行分隔行被当成了数据行去检查,每一行都报 5 条错,507 条错误就这么攒出来了。

中间那 62 条同理:仓库后来加了两张结构不同的表——放 MCP(简称,全称 Model Context Protocol,也就是让 AI 助手直接调用外部工具的一套通用接法)服务器的那张有五列(传输方式、安装入口),开头 APILayer 赞助区那张只有三列——而检查脚本只会按五列的规格去量每张表,量不了的就一路报错。

我做了个对照实验:只把 47 行分隔行改回老写法,其余一个字都不动,再跑一遍检查,报错从 624 条掉到 117 条,一下少了 81%。

顺便说一句,这不是检查器坏了。同一天我跑了它自带的单元测试——31 条全过。也就是说,工具本身的逻辑是好的,只是它对接的清单先演进了一步,脚本没跟着更新。

更值得说的:这个红叉,挂了快一年

一个检查常年失败的项目,为什么没人管?我去看了它的运行记录。

结果是:在 GitHub 的自动检查页面上,这个格式检查在仓库主分支上已经找不到一次成功记录。我把能翻到的记录都拉了一遍——838 次由提交触发的运行,失败 838 次,成功 0 次。GitHub 只保留最近约一年的记录,最早一条失败可回溯到 2025 年 11 月 4 日,更早的已经查不到。

对比之下,同一个仓库的单元测试在那段时间里全绿。

按常理,一个仓库的自动检查挂了,提交就该被拦住。但这里没有。我抽查了最近三个被合并的贡献(编号 #8000、#7999、#7998),合并的那一刻,检查结果全是红叉——红叉并没有挡住任何人。

原因不难猜:这两条检查被设成了「参考」,而不是「必须通过」。对维护者来说,红叉早就成了一种背景噪音,大家心照不宣地绕过去。

这就是整件事最有意思的地方:一套为了「用机器代替人工编辑」而写的检查器,最后变成了一个所有人都在忽略的摆设。它没有失效——它还在每天准点运行,还在输出结果——只是输出了快一年,没人再读。

它还值得用吗?值,但要会用

评价这类清单项目,得把「清单」和「清单的维护机器」分开看。

清单本身依然好用。两千多条里真正有问题的只有二十几条,不到 1.5%。按分类翻找、看有没有认证要求、支不支持 HTTPS 和跨域调用,这些列都在,省下的摸索时间是真的。它也是这套玩法的鼻祖——今天满大街的「Awesome 某某」清单,多半参考过它的表格格式和贡献规矩。

但它是「索引」,不是「保证」。清单只负责告诉你「有这个接口」,接口能不能用、要不要付费、限额多少,它一概不管。链接失效由另一个每天定时跑的脚本负责扫,和上面那个格式检查是两回事。

适合谁:想快速找一批候选数据源、做原型、写 Demo 的开发者;做技术选型时想先看全景的人。

不适合谁:想要「拿来就能上线」的稳定数据源的人——黄页只给电话簿,不保证对方一定接电话。用它找入口,用之前一定自己打一次。

顺着这个思路,站内还有几篇同样「把清单和证据分开看」的评测可以对照:想看成批技能的横评,可以翻 实测 12 款大模型能力增强 Skills;想看清单类内容怎么挑,可以翻 2026 年 8 月最热门 AI Skill 精选;关心成本和额度怎么算的,实测 9 款 Token 节省工具 那篇更直接。

结论:放进你的收藏夹,别放进你的依赖清单。它当好一本地图就够了,指路是它的本分,走路还得你自己迈腿。至于那个挂了快一年的红叉——它真正提醒的是另一件事:任何靠机器执行、靠人忽略的检查,最后都会变成没人读的噪音;检查要么能拦住发布,要么迟早沦为装饰。

关注 AI商业快讯,每天一篇 AI 热点深度解读。

Plugin4Shell 实测:分支名伪装成 SHA,四大 AI 编程助手的插件校验全线失守

Plugin4Shell 实测:分支名伪装成 SHA,四大 AI 编程助手的插件校验全线失守

你什么都没点,插件自己换了。

Claude Code、OpenAI Codex、GitHub Copilot、Gemini CLI——四款最主流的 AI 编程助手,插件市场用的是同一套校验逻辑,也犯了同一个错误。9 月 17 日,安全公司 Air 公开了这处漏洞,取名 Plugin4Shell:不点链接、不装新插件、不改任何设置,只要攻击者控制了你已装插件的上游仓库,恶意代码就会自己走进你的电脑。Air 称它是「AI Agent 生态的第一个供应链漏洞」,受影响的是「数百万个 agent」。

校验通过了,代码为什么还是会被换掉

给 AI 编程助手装插件,走的是包管理器的老路:市场把插件锁在一个具体 commit 的 40 位 SHA 上,这叫 SHA pinning。逻辑很干净——审过的代码就是这一版,谁再改都会露馅,这也是企业敢用第三方插件的前提。

四款 agent 都老老实实执行了「checkout 市场钉下的那个 SHA」,但没有一家检查「checkout 完,工作区里到底是哪个 commit」。这一处缺失就是整个漏洞。git 在解析一个名字时,如果它既能当 ref(分支/标签)又能当对象 id,会优先当成 ref,只在 stderr 打一行 refname '…' is ambiguous。攻击者在自己的插件仓库里建一条名字就是那串 SHA 的分支,把它设为仓库默认分支,agent 的 git checkout 就会把这条分支当成目标——审查、pin、安装流程全部显示正常。

要强调的是,受害者的操作没有任何问题。Air 的原话是:受害者只需要装了一个插件,来自他信任的市场,经过审查、并且「完全按照安全模型的设计」被 pin 住——企业把插件 pin 到审过的 commit 再分发,本来是把风险往下压的做法,这一层也同样被穿透,「所有建立在 pin 上的下游审查流程,都继承了这个失效」。

攻击有两条路。一条是先当好人:往市场里提交一个真良性插件,过审、被装,之后再把它变恶意——这件事 Air 此前已经做过一遍,那个假 skill 拿到了 26,000 个 agent 的控制权。另一条更省事:直接接管别人的仓库,让恶意版本顺着这条路径推给所有已装用户,而 pin 存在的意义本来是拦住这件事。

我把两个变体都跑了一遍

Air 描述了两条路径。我在本地沙盒(git 2.47.3)把它们都复现了一遍。

变体一是 Claude Code、Codex、GitHub Copilot 共用的写法:

git clone <插件仓库> ./
git checkout 59276317d87a72f4396ef9b61b0ba4be3e005e95   # 市场钉下的 SHA

这条 SHA 同时是攻击者建的默认分支名。执行结果:只有一行警告 refname is ambiguous,然后 plugin.txt 的内容是 MALICIOUS PAYLOAD,当前分支显示为那串 SHA。顺带核了一下前提条件,git check-ref-format refs/heads/<40位十六进制> 返回 0——git 自己就接受这种分支名。

我还做了对照组:同样存在一条 SHA 同名分支,但它不是默认分支。这次 clone 下来它只是一条 remote-tracking ref,git checkout 落回了真正的 commit,HEAD 与 pin 完全相等,文件还是良性版本,攻击不成立。也就是说,「把 SHA 同名分支设成默认分支」是攻击的必要条件,不是可选动作。

变体二是 Gemini CLI 的三步写法:

git clone --depth 1 <插件仓库> ./
git fetch origin 41d0bc0a4aeb2fbf797dacea39e876d98c95024b
git checkout FETCH_HEAD

如果仓库的默认分支恰好叫 FETCH_HEAD,第三步同样只打一行 ambiguous 警告,然后落地恶意内容;此时 .git/FETCH_HEAD 文件里躺着的,仍然是那个被正确拉取的 commit——拉回来了,然后被丢掉了。

修复只要一行断言,Air 给的原话是:checkout 之后解析工作区真正的 HEAD,不等于 pin 就中止。

test "$(git rev-parse HEAD)" = "" || abort

这行必须写在 agent 里、不能交给市场,因为 pin 是在客户端解析的。这也正是它叫「零点击」的原因:后台自动更新是 Claude Code 和 Codex 的默认行为,市场一改 pin,所有已装用户会在没有任何提示的情况下被换成恶意版本——攻击者甚至不需要你装任何新东西,只需要那个良性插件本来就在你机器上。

四家的响应,和我在 npm 上核到的版本

厂商 产品 当前状态
Anthropic Claude Code 已修复,2.1.179(2026-06-17 确认)
OpenAI Codex 已修复,0.146.0(2026-08-12 验证)
GitHub / 微软 GitHub Copilot 未发补丁
谷歌 Gemini CLI 不修,直接弃用

Air 给出的时间线是:2026 年 5 月发现并对四款都做出可用 PoC,6 月完成披露,8 月 4 日谷歌确认不修、让用户迁到 Antigravity,9 月 17 日公开。

修复版本是不是真的发出去了,可以直接在 npm 上核:Claude Code 当前 2.1.278、Codex 0.155.1,都已经越过修复线;@github/copilot 停在 1.0.86,仍在更新但没修这个洞。Gemini CLI 更有意思——谷歌 8 月就说弃用,可 npm 上的 nightly 一直发到 0.62.0-nightly.20260919(9 月 19 日),仓库活着,只是这个漏洞不打算修了,已装的每一台都永久暴露。

微软一侧的说法值得单独记一笔。GitHub 发言人对 The Register 表示:为防止 SHA 被滥用,GitHub 不允许创建形似 commit SHA 的分支名或标签名,因此这个漏洞在 GitHub 上无法利用。Air 的回应是这条缓解不够,因为 Claude Code 官方文档明确写着市场可以托管在「任何 git 服务」上——GitLab、Bitbucket、自建服务器都行,而 Bitbucket 和自建 git 都允许 40 位十六进制分支名;微软自家的 Copilot 同样支持这些来源。Air 还补了一句:6 月起就向微软报告过,因为对方披露量太大,没有收到回复。

规模上有一组可查的数字:近 30 天 npm 下载量,Claude Code 6,486 万次、Codex 7,850 万次、GitHub Copilot 1,026 万次、Gemini CLI 139 万次,合计约 1.55 亿次(下载量不等于机器数,CI 会放大,但量级可参考)。这也不是 Air 第一次做这件事——此前它用一个假 skill 拿到过 26,000 个 agent 的控制权,SkillJacking 里发现 925 个在用 skill 的仓库可被接管、波及 134,000 个 agent,8 月又找出 155 个依赖过期域名、可被劫持的 MCP。

需要声明的是,Air 是一家 9 月 1 日刚走出隐身状态的创业公司,卖的产品正是 agent 防护,研究文末还写着「使用我们产品的企业不受此漏洞影响」「数据来源方在卖解药」这件事,读数字时要一起考虑。漏洞本身不受影响,因为上面的复现是我自己跑的。中文圈的报道到 9 月 19 日基本还是快讯:新浪财经、凤凰网各一条,其中凤凰写的是「除 GitHub 外其余三家已修复」——按 Air 的时间线,谷歌是明确不修、直接弃用,不是修复。

这次坏掉的其实是一个假设

Plugin4Shell 里没有一行复杂的利用代码,它打掉的是行业默认的一个安全假设:把 hash 钉死,就等于把代码钉死。

这个假设在包管理世界里早就被拆过一遍——npm 后来补上了包签名和透明日志,因为「内容的哈希」只能证明内容没变,不能证明「你解析到的就是那份内容」。agent 生态正在把插件、skill、MCP 当作基础设施大规模铺开,校验逻辑却还停在「拿到一个 SHA 就 checkout」的水平上。四家实验室写出了同一个 bug,不是巧合,是这一层还没有人认真做过。

你该做什么

  • Claude Code 与 Codex 用户:升级到 2.1.179 / 0.146.0 以上(当前版本已远超),这是唯一完整的修复。
  • GitHub Copilot 用户:官方没有补丁。Air 给出的现实约束是,尽量只从 GitHub 托管的 marketplace 装插件,因为 Bitbucket 和自建 git 托管的市场都能被这种手法打穿。
  • Gemini CLI 用户:官方建议迁到 Antigravity,它没有这套插件 SHA pinning 机制,因此攻击面不存在;留在 Gemini CLI 上就是永久暴露。
  • 所有人:如果你所在团队的内部市场是自己 pin 的 commit,去检查一遍默认分支名有没有 40 位十六进制的;同时考虑关掉插件的后台自动更新,把更新动作变成需要人确认的一步。

一行断言就能修的东西,从披露到公开花了四个月,还有两家没修。Agent 的供应链安全,现在还处在包管理器的 2015 年——插件越多,这个账越难还。

相关阅读:

Spec Kit 深度评测:13.7 万 Star 一年后长成插件市场,169 个社区扩展实测八成已休眠

Spec Kit 深度评测:13.7 万 Star 一年后长成插件市场,169 个社区扩展实测八成已休眠

过去一年,凡是劝人「先写规格再让 AI 动手」的文章,几乎都会引用同一个仓库:GitHub 的 spec-kit。它 2025 年 8 月上线,13 个月涨到 13.7 万星,成了「规格驱动开发(SDD)」这件事的代名词。

我把它从 PyPI 装进沙盒,跑完初始化、把支持的 41 种 coding agent 逐个初始化了一遍,又把社区目录里的扩展抽了两组样本。结论有点分裂:那套写规格的流程还在、也确实能用,但仓库的重心已经换人了——它现在更像一个给 coding agent 用的插件市场,而这个市场里八成的货架已经休眠。

一年后,它已经不是当初那个模板仓库

2025 年 8 月 21 日的第一版命名很直白:把「Specify → Plan → Tasks → Implement」四步做成四段提示词模板,谁都能抄。一年后打开仓库,根目录躺着 src/、extensions/、presets/、bundles/、workflows/、integrations/ 六个子系统,specify --help 里除了 init,还有 extension、preset、bundle、workflow、artifact、event、self 七个命令组。

它现在对外讲的是三条独立入口,而不是一条流水线:

  • 规格驱动开发(核心):constitution → specify → plan → tasks → implement → converge,另加三个可选质量闸门 clarify / analyze / checklist;
  • Bug 修复(扩展):bug-assess → bug-fix → bug-test,产出落到 .specify/bugs//;
  • 想法评估(扩展):intake → research → define → shape → decide,最后给出 go / needs-clarification / kill。

其中 converge 是这一年里补上的一环:它拿现有代码跟 spec、plan、tasks 对一遍,把还没做完的活追加回 tasks.md,解决「实现到一半断了怎么办」。这个命令对应的正是社区呼声最高的一个 issue(可以编辑、迭代已有规格,而不是每次都新开一个分支),它在 2026 年 4 月被关掉。

规模上的变化更直接:这个仓库现在有 59,078 行 Python 源码,测试 117,530 行,而真正承载「方法论」的核心命令模板加起来只有 2,440 行 Markdown——代码和方法的比例是 24 : 1。同一批作者还在用不到 48 小时一版的节奏迭代,从 v0.0.1 到 v1.0.7 一共发了 221 个 release,平均 1.8 天一个版本。

实测:能用,但支撑它的是「结构」而不是「智能」

我把能跑的公开接口都跑了一遍。下面每一条都是沙盒里的真实输出,不是 README 复述。

实测项 结果
specify init(copilot 集成) 一次生成 30 个文件:10 个 SKILL.md + 5 个模板 + 6 个 bash 脚本 + 集成清单
41 种 agent 集成逐个初始化 40 个一次通过;generic 要求显式传 --commands-dir(报错信息给了完整示例,属设计如此)
直接装社区扩展(extension add <名字>) 6 次全部被拒:社区目录是 discovery-only,不可直接安装
贴归档地址装(add <名字> --from ) 5 个真实地址全部成功,每个 4 到 6 秒
30 个随机社区扩展的下载链接 28 个存活(93%),归档中位体积 14 KB
20 个随机社区扩展的仓库活跃度 只有 4 个在 30 天内有提交;15 个停在 1 到 6 个月前;中位最后一次提交距今 136 天
13 个技能文件的上下文占用 总共 157,976 字符,其中常驻上下文的只有开头元信息,3,900 字符,占 2.5%

第 6 行是这次实测最刺眼的一条。169 个挂名社区扩展听起来像生态,抽 20 个查仓库,结果是 20% 还在动、75% 处于 1 到 6 个月的浅休眠、5% 超过 180 天没动,星数中位数只有 6。下载链接活着(因为 GitHub 的归档地址不会烂),但代码从四月起就没再变过——「链接可用」跟「项目在维护」是两件事,这正是扩展市场最容易给人的错觉。

第 7 行则是这一年里一次很成功的自我修补。2025 年 12 月有人统计过:spec-kit 生成的是 slash command,每次开会话都会被完整塞进上下文,约 18.6k token,在 Cursor 默认窗口里能吃掉 93%。现在默认产出的是 SKILL.md(按需加载,只有描述常驻),我实测常驻部分只有 3,900 字符。同一个 issue 至今还开着,但问题事实上已经被架构调整解决了。

翻车点

扩展市场默认是「只能看不能装」。 这对安全是好事(官方目录是任意第三方代码,139 个扩展里 138 个声明自己会读写文件),但对体验是硬门槛:搜索能搜到 173 条结果,点安装会被明确拒绝,提示你「自己贴归档地址,或者自己维护一个可信目录」。想装,得先自己核一遍压缩包、再敲一遍 URL、再输一次 y。这套流程走通 5 次都很快,但它默认假设你会审代码。

装了 preset 或扩展之后,脚本会开始依赖你系统里的 PyYAML。 我复现了三组对照:纯净项目 + 没有 PyYAML 的 python3,setup-plan.sh 正常;同一个项目装上 preset,同一条命令直接报 Error: PyYAML is required to resolve preset template composition,plan.md 不生成,而且错误信息里没有告诉你怎么装。考虑到 uv tool install 会把依赖装进隔离环境、而脚本调用的是 PATH 上的 python3,这个坑大概率会落到真实用户头上。命令本身是 SKILL.md 指示 agent 去跑的,所以翻车现场往往是「agent 说它按流程走了,但文件没出来」。

四条流水线里两条是空货架。官方每个子系统都配了目录,但内容差得很远:

子系统 官方自带 社区贡献
扩展 extensions 4 169
预设 presets 2 36
agent 集成 integrations 41 0
工作流 workflows 1 2
工作流步骤 steps 0 0
整合包 bundles 0 2

扩展和预设是真生态,另外三个基本是刚立起来的架子。工作流的步骤类型目录是空的,而它的 shell 步骤在自己的发布文档里被标成「没有沙箱,可以读环境变量、改项目外的文件、外传数据」——社区要求给 shell 步骤加显式确认的 issue 到现在还开着。

谁该用,谁先别碰

把 spec-kit 和站内评过的同类放在一起,它的位置其实很清楚。

它对标不了一年前宣传的「让 AI 自己想清楚」:create-new-feature.sh 生成的 spec.md 里有 11 处占位符,脚本只保证结构和文件名一致,内容一个字都不是它写的。它也解决不了 mattpocock/skills 那种「拒绝流程绑架」的诉求——后者是 37 个各干一件事的小工具,前者要你先签一份宪法、再按五个阶段走。它甚至不打算解决 Get Shit Done 关心的上下文工程问题,它选择让技能按需加载来避税。

适合谁:要在团队里推行「需求先落地成文档」这件事的人。它的价值不在代码,而在把一套无聊但有用的规矩变成了可版本控制、可审查的文件——spec、plan、tasks 三个产物能进 code review,这比提示词存在谁的收藏夹里强得多。41 种 agent 集成也意味着换工具不用换流程。

不适合谁:一个人的小项目,或者已经有一套自己跑得顺的 agent 工作流的人。再往仓库里塞 169 个扩展,你得到的大概率是 20% 在维护、80% 停在四月的目录,以及一个每次安装都要手工审一遍的安全流程。

判断

一年前它是「四段提示词模板」,现在它是一个有 221 个版本、59,000 行代码、287 位贡献者的 agent 插件平台——顺便还带着那套写规格的流程。这个转向不算失败,因为核心流程确实还在按社区的抱怨逐条修补(上下文税、规格迭代、规格过期这三个最大的坑都动了手),但它的重心已经不在「规格」上了。

要用就只用核心的 10 个技能,扩展市场先别碰:等那 169 个货架里能有一半在三个月内更新过,再回来逛也不迟。

关注 AI商业快讯,每天一篇 AI 热点深度解读。

相关阅读

本文数据截至 2026 年 9 月 17 日:仓库 137,383 星、12,302 fork、MIT 协议;实测均在 Alpine Linux 沙盒中完成,specify-cli 版本 1.0.7。