1. 从装了40个Skill说起为什么大多数人其实只用了Claude Code的皮毛我最初用Claude Code的时候跟绝大多数人一样——把它当成一个能读文件的聊天框。问它问题、让它改代码、偶尔让它跑个命令用完就关。直到有一次我在一个中型项目里连续被同一个问题卡了三天每次让它重构一个模块它都会忘记我前面强调过的命名规范、目录结构和测试约定。我一遍遍重复它一遍遍遗忘效率低得让人抓狂。后来我才意识到问题不在模型而在我从来没认真对待过Skill这个东西。当我真正把40个Skill装进去、并且理解了SKILL.md的frontmatter到底在干什么之后我的感受只有一句话之前那些用法基本等于白用。这篇内容我想聊的不是Skill是什么这种入门科普而是一个真正把Skill用起来的人会怎么设计、怎么组织、怎么避坑。关键词会围绕Claude Code、Skill、SKILL.md、frontmatter、子 agent 这几个核心概念展开同时把agent skill、skill和agent的区别、claude code配置、claude code使用教程这些高频搜索词背后的真实问题讲透。适合谁看三类人一是刚装完 Claude Code、还在聊天框思维里打转的新手二是装了一堆Skill但感觉没生效、不知道哪里出问题的中级用户三是想给团队沉淀一套可复用Skill体系的人。如果你属于这三类中的任何一类下面的内容应该能帮你省下不少试错时间。先说一个反直觉的结论Skill的数量不是越多越好40个是上限而不是目标。我装到第40个的时候明显感觉到上下文开始打架——两个Skill对同一类任务给出了冲突的指令模型在中间摇摆。真正让我效率起飞的反而是把40个精简到28个、并且把每个SKILL.md的frontmatter写清楚之后。所以这篇内容的核心不是教你怎么装40个而是教你怎么让每一个都真正生效。2. SKILL.md 的 frontmatter决定Skill生死的三行字很多人装Skill的方式是从某个仓库clone下来扔进目录重启然后期待它自动生效。结果发现模型根本不理会。问题十有八九出在SKILL.md顶部的frontmatter上。这三行看起来不起眼但它决定了这个Skill什么时候被加载、被谁加载、加载后干什么。2.1 frontmatter 到底写了什么一个标准的SKILL.md开头长这样--- name: vue-best-practices description: 当用户编写或重构 Vue 组件时强制遵循组合式 API、script setup 和目录约定 ---看起来简单但每一行都有讲究。name是Skill的唯一标识不能和已有的重名否则后加载的会覆盖前面的而且覆盖过程是静默的——你不会收到任何报错只会发现怎么没生效。description才是真正的触发器模型是根据这段描述来判断当前任务要不要调用这个Skill的。我踩过最深的坑就在这里早期我写的 description 是Vue 相关的最佳实践。结果模型几乎从不调用它因为Vue 相关太模糊了模型无法判断当前任务算不算相关。改成当用户编写或重构 Vue 组件时之后命中率立刻上来了。description 要写成触发条件而不是功能简介。这是一个思维上的根本转变。2.2 为什么 description 的措辞比内容更重要你可以把frontmatter理解成Skill的门牌号而SKILL.md的正文是屋里的家具。模型每天要处理成百上千个潜在Skill它不会挨个进屋看家具它只看门牌号决定要不要敲门。门牌号写错了屋里装修得再豪华也没人进。我做过一个对比实验同一个Skill正文一字不改只改 description。第一版写帮助处理数据库迁移第二版写当用户需要创建、修改或回滚数据库迁移脚本时。在同样的20个任务里第一版被调用3次第二版被调用17次。差距就是这么夸张。提示description 里尽量包含当……时这样的时间状语以及具体的动作动词创建、修改、重构、审查。避免使用相关有关涉及这类模糊词。2.3 一个容易被忽略的细节frontmatter 的加载顺序Skill的加载是有顺序的。当多个Skill的 description 同时命中一个任务时模型会倾向于选择加载顺序靠前或者描述更具体的那个。这就带来一个实操问题如果你装了vue-best-practices和frontend-general两个Skill前者描述具体、后者描述宽泛那么处理Vue任务时前者会赢。但如果你把顺序搞反了或者两个描述都很宽泛模型就会随机选表现就是时灵时不灵。我的做法是给每个Skill的 description 加上领域限定词。比如frontend-general的 description 写成当任务不涉及具体框架、仅涉及通用前端结构时。这样它就不会和框架专属Skill抢活。这个技巧在装到20个以上Skill之后尤其重要因为冲突概率会指数级上升。3. 子 agent 与主 agentSkill 到底该挂在谁身上这是被问得最多的问题之一skill和agent的区别到底是什么cursor中如何使用子agent和主agent我一开始也糊涂后来想明白了一个类比主 agent 是项目经理子 agent 是专项外包。Skill 是外包手里的作业手册。3.1 主 agent 的上下文是稀缺资源主 agent 负责和你对话、理解整体意图、调度任务。它的上下文窗口是有限的而且随着对话进行会越来越满。如果你把所有Skill都挂在主 agent 上每加载一个就吃掉一块上下文聊到后面模型就开始失忆——不是它笨是它的工作台被Skill手册堆满了没地方放你的实际需求了。我实测过一个极端情况把40个Skill全挂在主 agent 上对话进行到第15轮左右模型开始忘记最初的需求甚至把两个Skill的指令混在一起执行。把其中25个下沉到子 agent 之后同样长度的对话主 agent 依然清醒。3.2 子 agent 的正确用法按任务域切分子 agent 的价值在于隔离。你可以为数据库相关任务建一个子 agent只挂数据库类Skill为前端组件任务建一个子 agent只挂前端类Skill。主 agent 遇到对应任务时把活派给子 agent子 agent 在自己的干净上下文里干活干完把结果交回来。这样做的直接好处有三个主 agent 的上下文不被Skill手册污染对话能撑更久子 agent 的Skill集合更聚焦冲突概率大幅下降每个子 agent 可以有自己的模型配置和工具权限比如数据库子 agent 只给读权限防止误删具体怎么配在 Claude Code 的配置里子 agent 通常通过一个独立的配置文件或目录来定义每个子 agent 指定它加载哪些Skill、用哪个模型、有哪些工具权限。我自己的切分方式是按技术栈而不是按任务类型因为技术栈的边界更清晰不容易出现一个任务同时命中两个子 agent 的情况。3.3 什么Skill必须留在主 agent不是所有Skill都适合下沉。有三类我坚持留在主 agent第一类是全局规范类比如代码风格、提交信息格式、命名约定。这些是贯穿所有任务的下沉了反而要反复调用。第二类是安全审查类比如提交前检查是否包含密钥。这类必须在主 agent 层面拦截不能等派给子 agent 再查。第三类是元Skill也就是管理其他Skill的Skill比如当任务复杂时建议拆分成子任务并派发给对应子 agent。这类本身就是调度逻辑必须在主 agent 上。注意子 agent 不是越多越好。我见过有人建了十几个子 agent结果主 agent 在派发任务时自己先纠结了——到底该派给谁我的经验是子 agent 控制在3到5个每个的职责边界用一句话能说清。4. 40个Skill的取舍我删掉的12个和留下的28个装Skill这件事新手容易犯的错是看到好的就装。我一开始也是这样从各种仓库里扒了40个结果发现真正高频使用的不到10个剩下的要么从不触发要么触发后帮倒忙。下面说说我删掉了哪些、为什么删以及留下的28个是怎么分类的。4.1 被删掉的12个三类看起来很美的Skill第一类是描述过于宽泛的通用Skill。比如有个叫coding-helper的description 写的是帮助编写更好的代码。这种Skill几乎在任何编码任务里都会触发但它给的建议又很泛等于每次都在主 agent 上下文里塞一段废话。删。第二类是功能重叠的Skill。我同时装了三个代码审查类Skill分别来自不同来源。它们对同一段代码给出的建议经常互相矛盾模型在中间来回改。最后只留了一个最贴合我团队规范的另外两个删。第三类是低频且高上下文的Skill。比如有个生成完整项目脚手架的Skill正文特别长但一年用不了几次。这种我把它从常驻Skill里移出来改成需要时手动加载。常驻Skill应该是高频、轻量的。4.2 留下的28个按四个层次组织我把留下的28个Skill分成四层这个分层方式直接对应它们的加载位置层次数量典型Skill加载位置全局规范层5命名约定、提交格式、安全审查主 agent 常驻技术栈层12Vue、React、Python、SQL 最佳实践对应子 agent任务类型层8重构、测试生成、文档撰写按需加载工具集成层3特定CLI工具、特定API调用按需加载这个分层的好处是每一层内部的Skill不会互相冲突层与层之间的调用关系也清晰。全局规范层永远在线技术栈层跟着子 agent 走任务类型层和工具集成层按需拉起。4.3 一个判断Skill该不该留的土办法我后来总结了一个简单的判断标准如果一个Skill连续两周没有被触发过或者触发后我从来没有采纳过它的建议就删。听起来粗暴但非常有效。Skill的价值在于被用到一个从不被用到的Skill占着上下文位置就是负资产。另外还有一个信号如果我发现自己在对话里反复手动纠正某个Skill的输出说明它的指令和我的实际需求不匹配与其每次纠正不如改它的SKILL.md或者直接删掉。我删掉的12个里有5个就是因为每次都要手动纠偏。5. 让Skill真正生效的配置细节从安装到验证的完整链路装Skill不是扔进目录就完事。从下载到真正生效中间有好几个容易断链的环节。这一节我把完整链路拆开讲每一步都标注了容易出问题的地方。5.1 安装位置与目录结构Claude Code 的Skill通常放在一个约定的目录下每个Skill一个子目录目录里至少有一个SKILL.md。有些Skill还会带辅助文件比如示例代码、模板、脚本。目录结构大致是skills/ vue-best-practices/ SKILL.md examples/ sql-migration/ SKILL.md templates/这里最容易出问题的是目录名和frontmatter里的name不一致。有些工具按目录名索引有些按name索引不一致的时候就会出现明明装了却找不到的情况。我的习惯是让两者完全一致省得排查。5.2 手动安装 GitHub 上的 Skill很多人问claude code怎么手动装github上的skills。流程其实不复杂但有几个坑先确认仓库里SKILL.md的位置。有些仓库把Skill放在子目录里你需要把包含SKILL.md的那一层整个拷过来而不是只拷SKILL.md。检查frontmatter是否完整。有些仓库的SKILL.md缺description这种装进去也不会触发。检查是否有依赖。有些Skill的正文里引用了同目录下的脚本或模板只拷SKILL.md会报错。我一般会先在一个测试项目里装跑几个任务验证触发正常再挪到主项目。直接在主项目里试错成本太高。5.3 验证Skill是否真的生效装完之后怎么确认它生效了我的方法是构造一个必然命中的任务。比如装了vue-best-practices就新建一个Vue组件看模型的输出是否遵循了Skill里规定的组合式API写法。如果没遵循说明没触发。排查顺序是这样的先看description是否包含当前任务的关键动作词再看name是否和目录名一致再看加载位置对不对该在主 agent 的挂到了子 agent或者反过来最后看是否有其他Skill的 description 更具体把触发抢走了这个排查顺序能覆盖90%的装了不生效问题。剩下10%通常是配置文件格式错误比如YAML缩进不对这种看日志就能发现。5.4 跨编辑器使用VSCode 与 Cursor 的差异claude code vscode和cursor中如何使用子agent和主agent是高频问题。我的实测体会是Skill 本身是编辑器无关的差异在于子 agent 的调度方式。在 VSCode 里Claude Code 通常以插件形式运行子 agent 的配置走插件设置在 Cursor 里子 agent 的调度可能和 Cursor 自己的 agent 体系有交互需要额外确认优先级。一个通用的建议不管在哪个编辑器里先把主 agent 的Skill跑通再折腾子 agent。很多人一上来就配子 agent结果主 agent 都没配明白排查起来一头雾水。6. 那些没人告诉你的坑Skill冲突、上下文污染与薛定谔的生效这一节是我最想写的部分因为前面那些配置细节官方文档多少能查到但下面这些坑基本只能靠踩出来。6.1 Skill冲突两个Skill给出矛盾指令时会发生什么当两个Skill同时对当前任务生效且指令矛盾时模型不会报错它会尝试同时满足两者结果往往是四不像。我遇到过一次一个Skill要求所有函数必须写类型注解另一个Skill要求保持代码简洁避免冗余。模型给出的结果是——一半函数有注解一半没有。看起来像是随机行为其实是两个Skill在打架。解决办法有两个一是从源头避免让每个Skill的 description 边界清晰不重叠二是在主 agent 上加一条元指令规定当多个Skill指令冲突时以更具体的那个为准。后者是兜底前者才是根本。6.2 上下文污染Skill正文写太长也是错Skill的正文不是越长越好。正文越长加载时占用的上下文越多而且模型在长正文里容易抓错重点。我有个Skill正文写了三千字结果模型每次只记住了开头两句后面的细节全忽略。后来我把它拆成三个短Skill每个聚焦一个点效果反而更好。我的经验值是单个Skill的正文控制在500到800字之间超过就考虑拆分。正文里用列表和短句避免大段叙述。模型对结构化内容的抓取能力明显强于对长段落的理解。6.3 薛定谔的生效为什么同一个Skill时灵时不灵这是最让人抓狂的现象。同一个Skill同样的任务有时候触发有时候不触发。原因通常有三个第一description 的措辞有歧义模型对当前任务是否属于触发条件判断不稳定。解决办法是把 description 写得更具体减少解释空间。第二上下文长度影响判断。对话越长模型对Skill的注意力越分散。这也是为什么要把Skill下沉到子 agent——子 agent 的上下文短判断更稳定。第三多个Skill的 description 相似度高模型在它们之间随机选。解决办法是给每个 description 加上独特的限定词。我处理这个问题的土办法是给每个Skill的 description 加一个唯一标识词比如涉及Vue组合式API时涉及SQL DDL语句时。这样模型在判断时有一个明确的锚点稳定性会好很多。6.4 一个真实案例从装了40个到用好28个的完整过程最后分享一个我自己的完整过程给正在折腾的人一个参照。第一阶段我装了40个Skill全挂主 agent。结果是对话到第10轮左右开始失忆Skill之间频繁冲突我每天花大量时间手动纠偏。第二阶段我开始删。删掉了描述宽泛的、功能重叠的、低频高上下文的剩28个。同时把技术栈类的12个下沉到3个子 agent。第三阶段我重写了所有28个Skill的 description全部改成当……时的触发条件句式并加上唯一标识词。第四阶段我建立了验证机制每装一个新Skill先构造命中任务测试确认生效再留下连续两周不触发的删。走完这四个阶段之后我的实际感受是Claude Code 从一个需要我反复解释的助手变成了一个知道自己在什么场景该做什么的协作者。这个转变的关键不是模型变强了而是Skill体系被理顺了。如果你现在正处于第一阶段别急着装更多先回头看看你已有的Skilldescription 写对了吗该下沉的下沉了吗冲突的删了吗把这三件事做完你会发现之前那些白用的时间其实都花在了没必要的内耗上。
