Skills 虽好,但真别啥都装:我踩过的 Claude Code 技能管理的坑

哈喽,我是飞飞。
前两天整理 Claude Code 的配置,打开全局 skills 文件夹一看,73 个。七十三个。
我自己都愣了。什么时候攒了这么多?
仔细回想了一下,大概是这么来的:先装了 superpowers 插件,一下子多了十几个 skill。觉得不错,又装了 gstack。然后飞书相关的 lark 系列,企业微信的 wecomcli 系列,Obsidian 系列……每个插件包里少则三四个,多则十几个 skill,像滚雪球一样越滚越大。
直到上周,我让 Claude 帮我写一个部署脚本,它居然先去调了 design-review 的 skill——一个检查 UI 设计质量的工具。我当时的表情大概是这样的:???
这件事让我意识到:Skills 装太多,Claude 会懵。
先说清楚:Skill 多了为什么会出问题
Claude Code 的 skill 机制是这样工作的:每个 skill 都有一个 SKILL.md 文件,里面的 description 字段会被加载到系统提示词里。Claude 根据这些描述来判断”当前任务该不该用这个 skill”。
问题来了。如果你装了 73 个 skill,系统提示词里就有 73 条 skill 描述。Claude 每次收到你的指令,都要扫一遍这 73 条,判断哪些相关、哪些不相关。
最直接的影响是上下文窗口被白白浪费了。73 条 skill 描述,每条少说几十个 token,加起来可能吃掉好几千 token。这些 token 本来可以用来理解你的代码、分析你的需求,现在全浪费在”扫描菜单”上了。
然后还有个更烦的事——选择多了,选错的概率也高。这不是 Claude 笨,是信息论的基本原理。73 个选项里挑一个正确的,比 8 个选项里挑一个正确的,出错概率就是高。MindStudio 有篇实测文章的结论很直接:一个项目里,活跃的 skill 控制在 5-8 个最好。超过这个数,模型表现反而下降。
最头疼的是skill 之间会打架。比如 superpowers 里有一个 requesting-code-review 的 skill,gstack 插件里也有类似的代码审查能力。Claude 不知道该听谁的,有时候两个都调一遍,有时候挑了个不太对的。我在社区里看到好几个人吐槽同样的问题。
我自己的翻车现场
说几个我实际遇到的情况。
场景一:写博客触发了安全审计。
我用 /writing-agent 写文章,写到一半,Claude 突然开始跑 cso(Chief Security Officer)skill 的流程——检查 OWASP Top 10 漏洞。一篇 Markdown 博客文章,查什么安全漏洞?
后来我想明白了,cso 的 description 里写的是”performs security review on code”,而我的 writing-agent 里有一步是生成代码块示例。Claude 看到了代码,就觉得应该审计一下。
场景二:部署脚本变成了设计评审。
前面提到的那次。我说”帮我写个 Docker 部署脚本”,Claude 先触发了 design-review。因为 design-review 的描述里包含”review”这个关键词,而我的提示词里可能也有类似的表述,Claude 就匹配上了。
场景三:飞书消息发到了企业微信。
我装了 lark-im(飞书即时通讯)和 wecomcli-get-msg(企业微信消息),两个都是”消息”相关的 skill。有一次我说”帮我查一下最近的消息”,Claude 用了企业微信的接口——但我当时想查的是飞书。
这些问题的根源都一样:skill 太多,描述有交叉,Claude 分不清该用哪个。
全局 Skill vs 项目 Skill:到底怎么分
Claude Code 的 skill 分两个层级:
- 全局 skill:放在
~/.claude/skills/下,所有项目共享 - 项目 skill:放在项目目录的
.claude/skills/下,只对当前项目生效
我之前的做法是把所有 skill 都装在全局。想法很简单——装一次到处用,多省事。
现在回头看,这是个错误。
什么该放全局
全局 skill 适合那些跟具体项目无关、你每天都会用到的通用能力。
我现在全局只保留这几类:
1 | ~/.claude/skills/ |
判断标准很简单:如果这个 skill 换一个项目还能用,放全局。
什么该放项目级
项目 skill 适合那些跟特定项目深度绑定的工作流。
拿我这个博客项目举例:
1 | .claude/skills/ |
这两个 skill 只在写博客的时候有用。放到全局的话,我去写 Python 后端的时候,Claude 的系统提示词里多了两条完全无关的 skill 描述,白白浪费 token。
再举个例子:如果你有一个 React 项目,frontend-design 放项目级合适。如果你同时还在做一个纯后端的 Go 项目,那个项目完全不需要前端设计能力。
一个简单的决策框架
我现在用这个标准来判断一个 skill 该放哪里:
| 问题 | 是 → 全局 | 否 → 项目级 |
|---|---|---|
| 这个 skill 跟编程语言/框架无关吗? | git-commit, investigate | frontend-design, layout-creator |
| 换一个完全不同的项目,还用得上吗? | browse, careful | writing-agent, lark-base |
| 团队成员需要共享这个 skill 吗? | — | 放项目级,提交到 Git |
关于团队共享,有一点很容易忽略:你的全局 skill,队友看不到。 全局配置是你个人的,不会跟着 Git 仓库走。说白了,你在全局装再多花活也只有你自己受益。想让团队统一用的东西,就得放项目里提交到 Git。
插件包的问题:一装就是一打
我踩的最大的坑,就是插件包。
superpowers 一装,多了十几个 skill:brainstorming、writing-plans、executing-plans、test-driven-development、systematic-debugging、code-reviewer、dispatching-parallel-agents……每个听起来都很有用,但你真的每个都用得上吗?
lark 系列更夸张。lark-base、lark-calendar、lark-contact、lark-doc、lark-drive、lark-event、lark-im、lark-mail、lark-minutes、lark-sheets、lark-task、lark-vc、lark-whiteboard、lark-wiki,加上两个 workflow——一共 16 个。但我日常只用 lark-doc 和 lark-im。
插件包的问题在于:它是按”全家桶”逻辑打包的,不是按”你需要什么”来打包的。
这就像你只想装个 VS Code 的 Python 插件,结果它把 Java、Go、Rust 的语言支持全给你装上了。
我的处理办法
目前 Claude Code 还没有”只启用插件包里某几个 skill”的细粒度开关(虽然有 enabledPlugins,但颗粒度是整个插件,不是单个 skill)。
我的折中方案是:
- 插件包只装在全局,但心里有本账——知道哪些 skill 是我真的在用的
- 项目级只放真正需要的 skill——这样项目里的 skill 数量可控
- 定期审计——每隔两三周问自己:过去两周用过哪些 skill?没用过的,考虑要不要卸载整个插件
说实话,这不是最优解。社区里有人在 GitHub 上提了 issue,要求支持插件级别的 skill 开关。等这个功能出来,管理会方便很多。
踩完坑之后,我总结了几个教训
最大的一个教训是——CLAUDE.md 都没写好就急着装 skill,这是本末倒置。
我早期就是这样。CLAUDE.md 空着,先跑去装了一堆花里胡哨的插件。结果 Claude 连我项目用什么框架都不知道,装再多 skill 也白搭。后来我花 20 分钟把 CLAUDE.md 写好了——技术栈、代码规范、哪些文件不能动——Claude 的表现立刻就不一样了。Skill 是锦上添花,CLAUDE.md 才是地基。
第二个教训是自己写的 skill 比装的好用。
Reddit 上有个帖子说得特别实在:”I used to use GSD and SuperPowers. Now I just use my own skills I have built. Those plugins were slowing me down too much.” 我深有同感。自己写的 skill,针对性强,描述精准,Claude 不会误触发。别人写的插件包为了通用性,描述往往比较宽泛,误触发的概率就高。
其实写一个 skill 没多复杂——就是一个 SKILL.md 文件,写清楚什么时候触发、该执行什么步骤。我的 writing-agent 从无到有大概花了一个小时,但之后每次写文章都能省两三个小时。
第三个教训跟 skill 的 description 有关。这个字段决定了 Claude 什么时候触发它,写得越模糊,误触发越多。
举个对比:
1 | # 这么写,Claude 看到任何跟"代码"和"反馈"相关的对话都可能触发 |
差距一目了然。
最后一个习惯是定期做减法。我现在每隔两三周会跑一次 ls ~/.claude/skills/ | wc -l,看看全局 skill 数量。如果超过 15 个就该精简了。判断标准很粗暴:删了这个 skill,我的工作会受到什么影响? 答案是”没什么影响”的,直接删。
最后说几句掏心窝的
我知道看到一个新插件、新 skill,手痒想装是什么感觉。毕竟 Claude Code 的扩展生态确实越来越丰富了——GitHub 上 awesome-claude-code 有 5 万多 star,社区每天都有人在分享新的 skill 和插件。
但我现在的心态变了。装 skill 不是集邮,多不等于好。
我从 73 个全局 skill 的教训里学到的最核心的一点是:Claude 不是人类,它没有”先看看有什么工具、需要的时候再拿”的能力。它是把所有工具描述一次性加载到上下文里,每次决策都要过一遍。你给它的选项越多,它做对的概率反而越低。
少即是多。这话在 skill 管理上,是字面意思。
你的 Claude Code 装了多少个 skill?有没有遇到过 skill 冲突或者误触发的情况?评论区聊聊,我想看看大家都是怎么管理的。