Claude代码触发技巧:真实技能评测
驾驭Claude代码:真正能触发的技能
系列之前
- 最基本的设置
- CLAUDE.md 做得好
- 模型、层级与努力
- 情境窗口税
- 保护你代码的钩子
- 值得添加的MCP服务器
简介
技能是Claude代码里看似简单,但真正持续使用时才会发现门道的特性。道理很直白:写个带指令的markdown文件,放到合适的目录里,Claude在需要时加载——或者你用斜杠命令明确调用。但问题在于,“相关时”这三个字才是事情变得有趣的地方,而且有时候并不那么好玩。
这篇文章会从技能的工作原理讲起,说说它们住在哪里,实际控制它们是否触发的因素,以及它们常见的无声失败方式。还会介绍一些真正有用的模式,以及那些只会增加文件杂乱、却没什么实际效益的做法。
什么是技能
所谓技能,本质上是带YAML前置头的Markdown文件,Claude Code会把它加载到上下文中。每个技能都会生成一个斜线命令——比如你写了一个 ~/.claude/skills/security-review/SKILL.md,那么你得到的命令就是 /security-review。你可以直接调用它,或者当对话内容与技能描述相符时,Claude会自动调用。
这种双重调用模型,让技能和早前的 .claude/commands/ 目录划清了界线。合并发生在v2.1.3版本,现在两个目录下的效果终于统一了。如果你已经有命令文件,它们会继续工作——但当名称冲突时,技能优先。
技能的存在有三个层面:
- 个人级(
~/.claude/skills/)——适用于你所有项目 - 项目级(
.claude/skills/)——提交到仓库,与团队共享 - 企业级——托管设置,适用于整个组织
当同一个技能名称在多个层级同时存在时,企业级获胜,然后是个人级,最后才是项目级。这与大多数人的直觉正好相反——你的全局技能会盖过项目层面的技能,而不是反过来。这点咱们后头还会细说。
技能的解剖结构
每个技能都需要两样东西:YAML前置头和说明标记。以 SKILL.md 为例:
name: pr-review
description: Reviews staged changes for correctness, test coverage, and consistency with project conventions. Use when the user asks for a code review or is about to open a PR.
Review the current changes:
1. Run `git diff --staged` to see what's changing.
2. Check that every modified function has a corresponding test change.
3. Flag any hardcoded values that should be environment variables.
4. Confirm the commit message matches the conventional commit format used in this repo.
Return findings as a short numbered list. If nothing to flag, say so explicitly.
name 字段变成了斜线命令。而 description 则是Claude用来判断是否自动加载这项技能的依据——看起来像是给人类看的文档,但实际不是,这个区别很关键。
辅助文件是可选的,但用好了会很顺手。技能目录可以包含模板、示例输出、脚本或参考文档:
.claude/skills/pr-review/
├── SKILL.md
├── examples/good-review.md
└── conventions.md
需要注意的是,得在 SKILL.md 里明确引用这些文件,不然Claude可不知道它们的存在。目录里的文件不会自动加载——你得指出它们的路径。
具体控制自动调用的条件
Claude是否自动加载技能,取决于场景。它会拿 description 的内容和当前对话背景进行匹配,然后做出判断。这是语义匹配,不是关键词匹配——听起来挺灵活,但有个明显的缺点:很难预测或测试。
角色描述是有预算的。所有技能的名称都会加载到上下文中,但描述会被截断,以适应一个动态限制(上下文窗口的1%,默认8000字符)。所以每个描述的长度最好控制在250个字符以内。
这意味着两件事:
- 如果你的描述太长了,就会被截断。所以开头就要把用例写明白——什么任务,什么触发条件。
- 如果你有很多技能,它们会争夺预算。十个平庸的技能,可能会挤掉一个真正重要的技能。
你可以通过 SLASH_COMMAND_TOOL_CHAR_BUDGET 来增加预算,但更实用的办法还是把描述写得紧凑一些,同时控制技能的总数。这和MCP服务器工具数量的压力是同一个道理——它们都在争夺同一个上下文预算,而且会叠加。想象一下,一场对话里塞了十个MCP工具和十五项技能,那在你还没写提示词之前,预算就已经烧光了。
为了防止技能自动调用,可以在前置头里加上 disable-model-invocation: true。部署和其他有破坏性的工作流,应该始终保留这一项——你肯定不希望Claude自己判断:嗯,现在是个发布的好时机。
name: deploy
description: Deploy the application to production
disable-model-invocation: true
陷阱
优先级倒置
前面说过的优先级顺序——企业级 > 个人级 > 项目级——确实会让人措手不及。假设你有一个全局的 ~/.claude/skills/deploy/SKILL.md 技能,团队为这个仓库又加了一个同名的项目级技能,步骤还不一样。结果呢?项目级的会输给全局的。
这和大多数配置的运作方式正好相反(通常是项目层覆盖全局层)。解决方法是:为项目特定的工作流使用不同的名字,别指望那个不存在的覆盖机制能正常工作。
# 别这么干——以为项目级能赢
~/.claude/skills/deploy/SKILL.md # 全局部署技能
.claude/skills/deploy/SKILL.md # 本来想作项目覆盖——但会被忽略
# 应该这样
~/.claude/skills/deploy/SKILL.md # 通用部署模板
.claude/skills/deploy-staging/SKILL.md # 项目特有
.claude/skills/deploy-prod/SKILL.md # 带环境上下文
无声无匹配问题
最让人头疼的是:那些本应自动触发的技能,往往根本不会生效。描述写得太模糊、太长,或者和对话的实际表述对不上。没有任何报错,没有任何预警。Claude根本不会加载技能,除非你特别留意,否则你会以为功能坏了。
典型的失败模式是这样的:
# 太模糊——Claude根本不知道什么时候该用
description: Helps with code quality and reviews
# 这样好多了——触发条件和任务都写清楚了
description: Reviews staged changes for test coverage and conventional commit format. Use before opening a PR.
当技能没触发时,首先要检查的,不是指令本身,而是描述。通过 /skill-name 直接调用技能来测试,确认指令本身是有效的,然后再细化描述,直到自动调用变得可靠。
如果某个工作流你希望保证被调用,可以在 CLAUDE.md 里加个注释,比如“每次PR前使用 /pr-review”。这是一种手动协议,虽然不自动化,但很可靠。自动调用在正常工作时很方便,一旦出了问题,它就是隐形的。
始终加载带来的上下文膨胀
自动调用的技能每次触发时,都会把指令添加到上下文窗口。这意味着,每做一次文件解释、一次代码审查、一次提交——这些任务都会消耗token。长时间下来,开销会不断累积。
/simplify 这个捆绑技能就是个好例子:它会并行生成三个审查袋里,每个袋里都会读取文件。这是针对一次性重构的刻意设计,而不是你想在每次对话时都加载的内容。
要有意识地选择哪些技能可以自动调用,哪些应该明确调用。任务类技能——部署、迁移、PR创建——几乎都应该使用 disable-model-invocation: true。而参考类技能——约定、模式、API文档——则适合自动调用,因为它们的价值就在于无需你主动请求就能拿到。
还有一个值得注意的钩子交互:一个在每次写入文件时运行格式化器的钩子,本身就会增加令牌开销。如果再叠加一个广泛自动调用的技能,在活跃编辑会话中,每轮对话的消耗会迅速攀升。如果你用了 PostToolUse 钩子,对于哪些技能自动触发,要更加保守一些。
值得了解的捆绑技能
Claude Code 内置了几个技能。它们是基于提示的(非硬编码),所以可以读取文件、生成袋里并适应你的代码库:
/batch—— 把大量变更分解成并行单元,在每个孤立的git工作树中生成一个袋里,并为每个单元打开一个PR。需要git仓库。对跨代码库迁移特别有用。/simplify [focus]—— 生成三个并行审查袋里,汇总发现并应用修复。可以指定关注点,比如/simplify focus on memory efficiency。/loop [interval]—— 在会话打开期间,按计划反复运行一个提示。对于监控部署或轮询外部资源很有用。/debug [description]—— 在会话中启用调试日志并读取日志。当工具调用出现意外行为时,这个技能比听起来更有用。/claude-api—— 加载你项目所用语言的API参考材料。当检测到代码里有引入Anthropic SDK时,它还会自动调用。
区分捆绑技能和内置斜线命令(/compact、/clear、/cost)很重要:内置命令执行固定逻辑,无法自定义。而捆绑技能是基于提示的,你可以通过创建一个同名且优先级更高的技能来覆盖它们。
技巧与窍门
- 项目技能要保留在版本控制中。 把
.claude/skills/提交到仓库。这样未来的团队成员无需额外的入职步骤,就能直接使用这些工作流。 - 一项技能,只干一件事。 一个技能既做代码审查,又生成提交信息,还要检查覆盖率,反而不如三个专注的技能好用。分开来。
- 对于长篇参考内容,使用辅助文件。 如果你的技能指令引用了团队的编码规范,把这些规范放进技能目录里,比如
conventions.md,然后从SKILL.md里链接过去。这样说明书更易读。 - 通过直接调用来测试技能指令。 绕过描述匹配。如果技能手动调用时有效但不会自动触发,那问题出在描述上,不是指令本身。
- 给 CLAUDE.md 添加技能清单。 列出所有可用的自定义技能以及使用时机。Claude在会话开始时就会读到它,这不仅强化了自动触发,也增强了团队的整体认知。
摘要
技能很有用,但设置起来需要比文档隐含的要求更刻意。自动调用完全取决于描述质量,而无声失败模式——技能根本不触发——第一次碰到时需要花点时间才能诊断。优先级顺序(全局盖过项目)几乎会让所有人感到意外。
有效的模式是这样:团队工作流用项目级技能,保持专注并明确命名;任何有破坏性的任务都用 disable-model-invocation: true;在可靠性比便利性更重要的情况下,用 CLAUDE.md 里的技能清单来辅助自动调用。
下一篇文章将介绍子袋里——它们与技能的区别,什么时候生成独立袋里值得承担开销,以及为什么它们的隔离模型(每个袋里一个新的上下文窗口,不共享历史)适合那些冗长、不适合在对话中在线处理的任务。
