三个月前我筛过一轮 Skills,当时全生态凑出来 1400 个。
今天再打开收录站,首页写着:63,000+。
好家伙。三个半月,45 倍。
数字膨胀我不奇怪,AI 圈什么都膨胀。让我停下来的是另一件事:我把装机榜前排挨个点开,看了源码。看完的表情,就是那种「啊?」的表情。
装机前三名,没一个是 Skill
agent-skills.cc 是目前收录最全的 Skills 聚合站。装机量排序,第一名 openclaw,15.76 万装机。
点开一看:一个完整的本地 AI 助理应用。Gateway、控制台,macOS、iOS、安卓、Windows、Linux 全端 App,39 万 GitHub star。
它支持 Skills,就像 VS Code 支持插件。但把 VS Code 本体放进插件市场还挂装机第一------相当于把整个商场挂上餐厅热榜第一名。
第二名,awesome-chatgpt-prompts,14.24 万装机。2023 年火起来的 ChatGPT 提示词合集,一个网页项目。我去翻了仓库根目录:配置文件一堆,SKILL.md 没有。
第三名更绝,一个专门收集各家 AI 工具泄露系统提示词的仓库。Cursor 的、Devin 的、Claude 的,全在里面。它是个好东西,但它是个仓库------跟 Skill 的关系,大概等于菜谱跟厨房的关系。
按 Anthropic 的定义,一个 Skill 就是一个带 SKILL.md 的文件夹,教 Agent 怎么完成一类任务。前三名的仓库根目录我挨个核实过:一个应用,一个网页项目,一个收集册。
顺带一提,第四名是 Claude Code 的 CLI 本体。
我自己都愣了一下,又核了一遍。是的,CLI。
整个前排都是这个画风
不服气的可以自己去数。top 20 里:应用和框架 5 个,MCP 服务器 3 个,提示词和资源合集 4 个,CLI 工具 2 个------这就 14 个了。还有俩我到现在没查明白身份。
真正算得上 Skill 的,4 个,撑死 5 个。
肯定有人说:收录站嘛,混点工具进去很正常,别较真。
正常。但这就是问题所在------你看到「63,000 skills」的时候,以为是六万个技能包在互相竞争。实际上是六万个仓库在蹭一个热词。这两个世界的信息量,差很远。
我扒了一个「真 Skill」的源码
榜单第 19 名,claude-code-templates,3.3 万 star,一个给 Claude Code 生成组件的 CLI。它里面有个 code-reviewer,卖相相当好。
SKILL.md 的自我介绍:
Complete toolkit for code reviewer with modern tools and best practices.
功能描述里写着「Automated tool for pr analyzer tasks」------把技能名抄一遍,加个 tasks。
Features 列了四条:Automated scaffolding、Best practices built-in、Configurable templates、Quality checks。这四条放到任何一个 Skill 上都成立。一份 Features 如果说不出「这个 Skill 具体干了什么」,它就是什么都没干。
它声称提供三个脚本:pr_analyzer、code_quality_checker、review_report_generator。听着像三个能力,对吧?
我把源码拉下来 diff 了一下。前两个文件,114 行,只有 5 行不同------全是改名,PrAnalyzer 改成 CodeQualityChecker,docstring 跟着换两个字,剩下 109 行一字不差。
三个「核心能力」,是同一份文件复制了三遍。
更绝的是,逻辑也不在文件里
看 analyze 方法的完整实现:
python
def analyze(self):
"""Perform the main analysis or operation"""
if self.verbose:
print("📊 Analyzing...")
没了。方法体就一句 print。
那句 docstring 翻译过来是「执行主要分析或操作」。它连装都不装,说不出自己在分析什么。
光看源码说人家空,不算数。我把它跑了起来:建了个小项目,一个 React 组件,加一个故意留了 XSS 隐患的文件------document.body.innerHTML 直连的那种。
javascript
// broken.js ------ 故意留的
document.body.innerHTML = "<h1>demo</h1>";
然后运行它自带的 PR 分析器:
bash
python3 pr_analyzer.py /tmp/skill-test-project --verbose
输出原样贴给你:
text
🚀 Running PrAnalyzer...
📁 Target: /tmp/skill-test-project
📊 Analyzing...
✓ Analysis complete: 0 findings
✅ Completed successfully!
对着一个直连 innerHTML 的文件,它的结论是:0 findings,Status: success,末尾还打了个 ✅。
进度条、表情符号、成功提示,一应俱全。它完成了一场完整的代码审查表演,唯独没有审查。
泡沫是怎么吹起来的
供给端:给生态供货的模板生成器 claude-code-templates,3.3 万 star,用它生成一个「Skill」的成本是敲一个名字;收录站无审核,来者不拒。我 7 月筛的时候全生态 1400 个,今天 63000,三个半月 45 倍。
需求端:Agensi 那个有审核的精选市场,装机第一的 code-reviewer,764 次。第二名 232 次,第十名 44 次。
| 数字 | |
|---|---|
| 供给:3.5 个月 | 1,400 → 63,000(45 倍) |
| 生成一个「Skill」的成本 | 敲一个名字 |
| 精选市场装机头名 | 764 次 |
(装机两边口径不同,收录站自报 vs 精选市场统计,不能直接比,但数量级摆在那。)
生成一个「看起来像 Skill」的东西,成本趋近于零,市场照单全收,真实需求三位数。中间的差值,就是泡沫本身。
但真货是存在的,长得完全不一样
说到这容易变成一竿子打翻,得说句公道话。
官方 anthropics/skills 仓库,18.3 万 star。你猜里面有几个 Skill?docx、pdf、pptx、xlsx,几个文档处理技能,加一份模板和规范。一只手数得过来,每一个都能用。官方在这件事上克制得像另一个人。
superpowers,30.3 万 star。我抽查它的代码审查 Skill,里面是完整的方法论:审查的子代理怎么拿到裁剪过的上下文、问题怎么在扩散之前拦住。今天还在提交代码。
还有个真让我意外的:travisjneuman 一个人的仓库,generic-code-reviewer。没有团队没有运营,打开全是真货------技术栈检测表、P0 安全清单,XSS、API key、unknown 类型,条条能落地。
真 Skill 的共同点就一条:解决一个「没它你就得反复写 prompt 描述」的问题,而且内容具体到能抄。
三招,别再踩
装一个 Skill 之前,花两分钟做三件事:
第一,看 SKILL.md 的 Features。写得出一两个具体的技术栈、文件类型、检查项,是真的;全是「Best practices」「Automated」这种放哪都成立的词,假的。
第二,看 scripts 目录。每个脚本该有自己的逻辑,多个文件长得像,就是复制改名。
第三,看数据出自哪。精选市场可查的装机,和收录站自报的数字,不是一回事。
对照着记:
| 检查项 | 真货 | 模板货 |
|---|---|---|
| Features | 具体到技术栈、文件类型、检查项 | 「Best practices」式空话 |
| scripts 目录 | 每个脚本逻辑各异 | 多个文件只差改名 |
| 装机数据 | 精选市场可查 | 只有收录站自报 |
第二招可以自动化。我写了个 50 行的 Node 脚本 skill-xray:把一个 Skill 的目录喂给它,它把每个脚本剥掉注释、字符串、标识符,对剩下的结构算指纹------同一个模板改出来的文件,指纹必然相同。
javascript
// skill-xray.mjs ------ 用法: node skill-xray.mjs <skill目录>
import { readdirSync, readFileSync } from 'node:fs';
import { createHash } from 'node:crypto';
import { join } from 'node:path';
const stripIdentifiers = (code) => code
.replace(/#[^\n]*/g, '') // 注释
.replace(/"""[\s\S]*?"""/g, '""') // 多行 docstring
.replace(/'''[\s\S]*?'''/g, '""')
.replace(/(["'])(?:(?!\1)[^\n])*\1/g, '""') // 单行字符串
.replace(/[A-Za-z_][A-Za-z0-9_]*/g, 'x') // 所有标识符
.replace(/\s+/g, '');
const fingerprint = (code) =>
createHash('sha256').update(stripIdentifiers(code)).digest('hex').slice(0, 12);
const skillDir = process.argv[2];
const scriptsDir = join(skillDir, 'scripts');
const files = readdirSync(scriptsDir).filter((f) => /\.(py|sh|m?js|ts)$/.test(f));
const groups = new Map();
for (const f of files) {
const fp = fingerprint(readFileSync(join(scriptsDir, f), 'utf8'));
groups.set(fp, [...(groups.get(fp) ?? []), f]);
}
let suspicious = 0;
for (const [fp, fs] of groups) {
if (fs.length > 1) {
suspicious++;
console.log(`⚠️ 同一模板: ${fs.join(' 与 ')}(指纹 ${fp})`);
}
}
console.log(
suspicious === 0
? '✅ 每个脚本指纹唯一,未见同模板复制'
: `共 ${files.length} 个脚本,${suspicious} 组疑似同模板`
);
对着榜单第 19 名那个 code-reviewer 跑:
text
⚠️ 同一模板: cqc.py 与 pr_analyzer.py 与 rrg.py(指纹 1285fc480998)
三个脚本,一个指纹,实锤。对我自己写的两个功能不同的脚本,每个指纹唯一,放行。
最后
63000 还会涨。但泡沫不等于赛道完了------提示词合集都挤进来冒充 Skill,恰恰说明「Skill」这个容器是通的。垃圾多,是因为货架空了,不是因为货架不行。
挑 Skill 跟逛 npm 一个道理:star 数和收录量都是噪音,README 和源码才是产品本身。
你装过哪个「装完发现是空壳」的 Skill?或者装到过真的香的?评论区报一下名字,凑一个真实版的好用清单。