技能(Skills)已经成为Claude Code中最常用的扩展点之一。它们灵活、易于创建和分发。
但这种灵活性也使得很难知道什么才是最有效的。什么样的技能值得创建?编写一个好的技能的秘诀是什么?什么时候应该与他人分享?
我们在Anthropic公司广泛使用Claude Code技能,拥有数百个正在使用的技能。我们总结了使用技能加速开发的经验教训。
如果你不熟悉技能,我建议阅读我们的文档或观看我们最新的Skilljar课程,介绍Agent技能。本文假设你已经对技能有一定的了解。
关于技能的一个常见误解是,它们只是“Markdown文件”,但技能最有趣的部分在于,它们不仅仅是文本文件。它们是可以包含脚本、资产、数据等的文件夹,代理可以发现、探索和操作。
在Claude Code中,技能还具有多种配置选项,包括注册动态钩子。
我们发现,Claude Code中一些最有趣的技能都创造性地使用了这些配置选项和文件夹结构。
在编目所有技能后,我们注意到它们可以分为几个重复的类别。最好的技能可以清晰地归入一类,而更混乱的技能则跨越了几类。这不是一个权威的清单,但它是一个很好的思考方式,可以检查你的组织是否缺少某些技能。
解释如何正确使用库、CLI或SDK的技能。这些可以是内部库或Claude Code有时难以处理的常见库。这些技能通常包括参考代码片段的文件夹和Claude在编写脚本时应避免的陷阱列表。
示例:
描述如何测试或验证代码是否正常工作的技能。这些通常与外部工具(如playwright、tmux等)配对使用,以进行验证。
验证技能对于确保Claude的输出正确性非常有用。工程师花一周时间制作出色的验证技能是值得的。
考虑采用以下技术:让Claude记录其输出的视频,以便您查看它测试了什么,或者在每个步骤强制执行程序化断言。这些通常通过在技能中包含各种脚本来实现。
示例:
连接到您的数据和监控堆栈的技能。这些技能可能包括使用凭证获取数据的库、特定的仪表板ID等,以及有关常见工作流或获取数据的方法的说明。
示例:
将重复的工作流程自动化为一个命令的技能。这些技能通常是指令简单,但可能依赖于其他技能或MCP。保存日志文件中的先前结果可以帮助模型保持一致,并反映工作流程的先前执行情况。
示例:
为代码库中的特定功能生成框架样板的技能。您可以将这些技能与可以组合的脚本结合使用。它们在脚手架具有自然语言需求而无法完全由代码覆盖时尤其有用。
示例:
在您的组织中强制执行代码质量并帮助审查代码的技能。这些可以包括确定性脚本或工具,以确保最大程度的稳健性。您可能希望在钩子或GitHub操作中自动运行这些技能。
帮助您在代码库中获取、推送和部署代码的技能。这些技能可能引用其他技能来收集数据。
示例:
采用某种症状(例如Slack线程、警报或错误签名),通过多工具调查,最后生成结构化报告的技能。
示例:
执行例行维护和操作程序的技能,其中一些涉及破坏性操作,这些操作受益于防护措施。这些技能使工程师更容易在关键操作中遵循最佳实践。
示例:
一旦您决定要创建的技能,如何编写它?以下是我们发现的最佳实践、技巧和诀窍。
我们最近还发布了技能创建工具,以便在Claude Code中更轻松地创建技能。
Claude Code对您的代码库了解很多,Claude也对编程有许多默认的理解。如果您要发布的技能主要是关于知识的,请尝试关注能让Claude跳出常规思维的信息。
前端设计技能是一个很好的例子 — 它是由Anthropic的一名工程师通过与客户迭代改进Claude的设计品位、避免经典模式(如Inter字体和紫色渐变)而构建的。
任何技能中信号最高的内容是陷阱章节。这些章节应该从Claude在使用您的技能时遇到的常见失败点中建立起来。理想情况下,您将随着时间的推移更新您的技能以捕捉这些陷阱。
如前所述,技能是一个文件夹,而不仅仅是一个Markdown文件。您应该将整个文件系统视为一种上下文工程和渐进式披露。告诉Claude您的技能中有哪些文件,它将在适当的时候读取它们。
渐进式披露的最简单形式是指向其他Markdown文件供Claude使用。例如,您可以将详细的功能签名和用法示例分成references/api.md。
另一个例子:如果您的最终输出是一个Markdown文件,您可能会在assets/中包含一个模板文件以复制和使用。
您可以拥有引用、脚本、示例等文件夹,这有助于Claude更有效地工作。
不要编写引导Claude通过一系列选项做出选择的技能。相反,编写可以探索和适应的技能。
渐进式信息披露的最简单形式是为 Claude 指向其他 Markdown 文件。例如,您可以将详细的函数签名和用法示例分成 references/api.md 的引用。
另一个例子是,如果您的最终输出是一个 Markdown 文件,您可能需要在 assets/ 中包含一个模板文件,以便复制和使用。
您可以拥有引用、脚本、示例等文件夹,这有助于 Claude 更有效地工作。
Claude 通常会尝试遵循您的指示,由于技能(Skills)非常可重复使用,您需要小心不要在指示中过于具体。给 Claude 它需要的信息,但也要给它适应情况的灵活性。例如:
某些技能可能需要根据用户提供上下文。例如,如果您正在制作一个将每日汇报发布到 Slack 的技能,您可能希望 Claude 询问应该发布到哪个 Slack 频道。
一种好的做法是将这些设置信息存储在技能目录中的 config.json 文件中,如上面的示例。如果配置未设置,代理可以向用户询问信息。
如果您希望代理提出结构化、多选的问题,可以指示 Claude 使用 AskUserQuestion 工具。
当 Claude Code 启动会话时,它会建立一个包含每个可用技能及其描述的列表。这个列表是 Claude 扫描以决定“是否有适用于此请求的技能?”的依据。这意味着描述字段不是摘要 - 它是关于何时触发此 PR 的描述。
某些技能可以通过在其中存储数据来包含某种形式的内存。您可以将数据存储在简单的追加日志文件或 JSON 文件中,甚至是 SQLite 数据库中。
例如,daily-standup-post 技能可能会保留一个 standups.log 文件,其中包含它编写的每个帖子,这意味着下次运行时,Claude 可以读取自己的历史记录,并告知自昨天以来发生了什么变化。
存储在技能目录中的数据可能会在您升级技能时被删除,因此您应该将其存储在稳定的文件夹中,目前我们提供 ${CLAUDE_PLUGIN_DATA} 作为每个插件稳定文件夹的数据存储位置。
您可以赋予 Claude 的最强大的工具之一就是代码。给 Claude 脚本和库,让 Claude 可以专注于组合,决定下一步该做什么,而不是重建样板。
例如,在您的数据科学技能中,您可能有一个用于从事件源获取数据的函数库。为了让 Claude 进行复杂的分析,您可以给它一组辅助函数,如下所示:
然后,Claude 可以动态生成脚本,以组合这些功能,以实现更高级的分析,适用于类似“星期二发生了什么?”的提示。
技能可以包含仅在调用技能时激活的钩子,并且仅在会话期间持续。将其用于更具争议性的钩子,您不想一直运行它们,但有时它们非常有用。
例如:
技能的一大优势是可以与团队的其他成员共享。
您可以通过以下两种方式与他人共享技能:
对于跨少数存储库工作的较小团队,将技能检入存储库效果很好。但是,每个检入的技能也会增加模型的上下文。随着扩展,内部插件市场允许您分发技能,并让您的团队决定安装哪些技能。
您如何决定哪些技能进入市场?人们如何提交它们?
我们没有一个集中的团队来做出决定;相反,我们尝试有机地找到最有用的技能。如果您有一个技能想要让人们试用,您可以将其上传到 GitHub 中的一个沙盒文件夹,并通过 Slack 或其他论坛指向它。
一旦技能获得关注(由技能所有者决定),他们就可以提交 PR 以将其移入市场。
注意,创建不良或多余的技能可能很容易,因此在发布前确保您有一些管理方法。
您可能希望拥有相互依赖的技能。例如,您可能有一个文件上传技能来上传文件,以及一个 CSV 生成技能来创建 CSV 并上传它。这种依赖关系管理在市场或技能中尚不原生支持,但您可以按名称引用其他技能,模型将在安装时调用它们。
##衡量技能
为了了解技能的表现如何,我们使用 PreToolUse 钩子来记录公司内的技能使用情况(示例代码)。这意味着我们可以找到受欢迎的技能或根据我们的预期触发不足的技能。
技能是代理非常强大、灵活的工具,但现在仍处于早期阶段,我们都在摸索最佳用法。
与其将其视为权威指南,不如将其视为一个有用的技巧集合,我们认为这些技巧很有效。理解技能的最好方法是开始实验,看看什么适合您。我们的技能大多始于几行代码和一个需要注意的事项,随着 Claude 遇到新的边界情况,人们不断添加内容,技能变得更好。
希望这会有所帮助,如果您有任何问题,请告诉我。