在别人的仓库里打开 Claude Code 之前,先看看它的 .claude/skills 文件夹
我们读了 2,427 个活跃公开仓库里的 41,142 个项目级 Claude Code skill:12.6% 的仓库带着预先放行任意 Bash 命令的 skill,16.4% 带着和内置命令同名、会替换它的 skill。
概述
在一个 clone 来的仓库里打开 Claude Code 之前,先看看它的 .claude/skills/ 文件夹:读每个 skill 的 allowed-tools 那一行,搜一下 !`,再把文件夹名和你要敲的命令对一对。
原因很简单。项目 skill 跟着仓库一起来,它有三件事和你信不信任这个文件夹无关:
- 预先放行的工具。 skill 在
allowed-tools里列出的工具,在用到它的那一轮里不弹权限确认就能用。文档说得很直接:Workspace trust never gates a skill’sallowed-toolsin any session。 - 载入时执行的命令。 像
!`git status`这样的一行,会在 skill 载入、Claude 读到它之前就执行;只要你的权限规则或 skill 的allowed-tools放行,就不会问你。 - 同名替换。 和内置命令或自带 skill 同名的项目 skill,在本地终端会话里会替换掉它。文档自己举的例子是 A project
code-reviewskill replaces/code-review。
而且这些 skill 大多 Claude 可以自己调用。我们读的仓库里,98% 都带着没写 disable-model-invocation 的项目 skill,只要你的请求和它的描述对得上,Claude 就可能载入它。
那么实际有多常见?我们把 2,427 个活跃公开仓库里的项目 skill 全读了一遍。
推荐
下面是我们现在在别人写的仓库里打开 Claude Code 之前会做的检查:
- 列出 skill。 在仓库根目录
ls .claude/skills/,嵌套的.claude/skills/也看一下。如果有文件夹和你常用的命令同名,比如review、code-review、security-review、verify、debug,先读那个 skill:你敲这个命令,跑的就是仓库里的版本。 - 读
allowed-tools。 单写一个Bash,意味着那一轮里任何 shell 命令都不问你;Bash(git status *)只放行这一条。也留意Write、Edit和WebFetch。 - 搜
!`。 每一处都是 skill 载入时会执行的命令。大多只是读git状态,做得更多的那几条要读一读。 - 只想看一眼,就不加载项目内容。 无头运行时,文档建议用
claude -p --bare,它不读项目里的 hooks、skill、插件和.mcp.json;--setting-sources user会跳过项目的设置文件和.mcp.json。
怎么测的
- 找项目 skill。 GitHub 代码搜索
filename:SKILL.md path:.claude/skills报 506,880 个文件。每次搜索最多返回 1,000 条,所以我们按文件大小切成 58 段,抽了其中 41 段:最小的 22 段按顺序跑,之后每隔一段跑一段,各个大小区间都有样本。去重后得到 31,272 个文件,约占总数的 6%,来自 16,304 个仓库。 - 筛仓库。 至少 5 星、10 月 7 日以后有推送、不是分叉、没有归档,剩 2,435 个,读到 2,427 个。
- 读这些仓库里的全部项目 skill。 按每个仓库的文件树,读
.claude/skills/下的每个 SKILL.md,以及它点名的脚本,一共 41,142 个 skill。只当文本读,没有安装或运行任何东西。 - 按仓库算。 有个仓库带了 3,132 个项目 skill,而一般的仓库是 7 个,所以我们报三个数。主口径是有至少一个这类 skill 的仓库占多少,因为你 clone 时遇到的就是仓库;另外给每个仓库最多取 10 个 skill 的比例,以及全部 41,142 个的比例作对照。
测试结果
| 仓库里有什么 | 仓库(共 2,427) | skill,每仓最多 10 个 | 全部 skill |
|---|---|---|---|
| Claude 能自己调用的项目 skill | 97.9% | 94.3% | 95.3% |
写了 allowed-tools 的 skill | 22.3% | 12.5% | 10.6% |
| 预先放行任意 Bash 命令的 skill | 12.6% | 6.4% | 5.8% |
| 只放行列出的 Bash 命令的 skill | 10.4% | 3.9% | 2.8% |
| 预先放行 Write 或 Edit 的 skill | 11.5% | 5.0% | 4.9% |
载入时执行命令(!`)的 skill | 2.8% | 0.8% | 0.6% |
两样都有:!` 加任意 Bash | 0.5% | 0.1% | 0.1% |
| 跑附带脚本的 skill | 29.5% | 7.4% | 7.0% |
| 脚本会联网的 skill | 10.9% | 1.6% | 1.6% |
| 根目录 skill 和内置命令或自带 skill 同名 | 16.4% | 2.1% | 1.3% |
根目录 skill 叫 review、code-review 或 security-review | 6.3% | 0.7% | 0.4% |
大家猜猜看,在多少个仓库里,敲一个常用的 review 命令,跑的是仓库作者写的东西?153 个,大约十六分之一,根目录有叫 review、code-review 或 security-review 的 skill。在全部 399 个有重名的仓库里,最常见的名字是 verify、review、code-review、debug 和 plan。这些看起来都是常见名字碰巧撞上。我们抽了 15 个叫 review、code-review、security-review 的 skill,全都是正经的代码审查流程。可它们仍然是仓库作者的审查,用的是作者的规则,有的还预先放行了 Bash。要紧的是机制本身:你敲的命令,跑的是仓库里的 skill。
!` 里的命令大多是无害的读取:git(144 处)、bash(79)、gh(36)、grep、find、cat、ls,有 5 处调用 curl。
大多数 allowed-tools: Bash 看起来是作者在自己的工作流里省掉确认。在你自己的仓库里,这很合理;在别人的仓库里,这意味着在用到它的那一轮,对方的 skill 会在你的会话里不问你就跑 shell 命令。
隐形字符
Claude Code 从 2.1.299(10 月 14 日)开始拒绝文件夹名带隐藏、改方向或空白类字符的 skill,之后几版又修了别的隐形字符问题。所以我们也在这 41,142 个文件里找了隐藏文字:
| 找什么 | 仓库 | skill |
|---|---|---|
| 零宽字符 | 26 | 26 |
| 改方向字符 | 0 | 0 |
| Unicode tag 字符(看不见的文字) | 1 | 1 |
| 按 2.1.299 规则会被拒的文件夹名 | 0 | 0 |
| 超过 40 个字符的 HTML 注释,渲染时看不见 | 344 | 2,087 |
| 其中带「忽略之前的指令」「悄悄地」这类措辞的 | 1 | 1 |
我们读过的零宽字符都无害:emoji 的连接符,以及嵌套代码块里的转义。带这类措辞的那条注释,是一份安全测试指南里的提示词注入样例。
带 Unicode tag 字符的那一个不一样。它藏了一段人看文件时看不见的指令,而这个 skill 同时预先放行了 Bash。它要求执行的命令本身无害,看起来是有意做的概念验证;它说明这种手法今天就出现在公开仓库里。我们不点名这个仓库。想检查一个仓库有没有这种东西,在它的 SKILL.md 里搜 U+E0000 到 U+E007F 范围的字符即可。
该忽略什么
仓库里 skill 的数量。一个带几百个项目 skill 的仓库可能毫无问题,而一个单写 Bash、名字又很眼熟的 skill,更值得你多看一眼。要读的是文件夹名和 frontmatter。
局限
- 是抽样。 约 6% 的匹配文件,来自 5 星以上的活跃仓库,截至 2026 年 11 月 6 日。代码搜索在每段里按相关度返回结果,所以不是随机样本。
- 只看静态文本。 我们用规则读文本,什么也没运行。规则会漏掉运行时拼出来的命令,也会匹配到文档里引用的命令。
- 统计的是能力,不是意图。 这里几乎都是作者在配置自己的工作流。我们数的是一个 skill 能在你的会话里做什么,没有判断它为什么这么做。
- 重名只按文件夹名算。 文档说的替换是在本地终端会话里,其他会话类型我们没有逐一测试。
自己复现
上面三种口径的数字都在 project-skills-2026-11.json 里,仓库名和 skill 名都去掉了。想自己检查一个仓库,在里面打开 Claude Code 之前,按上面四项检查过一遍。
想自己挑 skill 来装的话,AgentCraft skills 目录收录了 5,101 个 Claude Code skill,每个社区 skill 收录前都经过审核。