1. 从“skills”这个热词说起:它到底在解决什么问题
最近半年,不管是在技术群还是各种开发者社区,“skills”这个词出现的频率高得离谱。你如果只看字面意思,可能会以为是某种技能培训或者游戏里的技能树,但在当前的技术语境下,它特指的是一套围绕 AI 编程助手构建的能力扩展机制。简单说,就是给 Claude Code、Codex 这类命令行 AI 编程工具装上“外挂”,让它们从只会聊天写代码片段,变成能真正理解项目上下文、执行复杂任务链的智能体。
我最早接触这个概念是在一个前端项目里。当时团队在用 Claude Code 做组件库的自动化重构,发现它虽然能写代码,但每次都要手动喂上下文,重复劳动特别多。后来有人丢了一个 skills 配置进来,整个流程就变了——AI 能自己识别项目结构、读取配置文件、按照预设规则批量修改组件,甚至能跑测试用例验证结果。那一刻我才意识到,skills 不是简单的提示词模板,而是一套让 AI 助手具备领域专精能力的工程化方案。
它解决的问题很具体:通用 AI 编程助手在面对特定技术栈、特定项目规范、特定工作流时,表现不稳定、输出不可控、上下文管理混乱。skills 通过结构化的能力定义,把“这个项目该怎么写代码”这件事固化下来,让 AI 每次都能按照同一套标准执行。适合谁来用?我觉得三类人最需要:一是天天跟 AI 编程工具打交道的前端/后端开发者,二是需要批量处理代码迁移或重构的团队,三是想把自己的工作流自动化但不想写复杂脚本的独立开发者。
注意:skills 目前主要围绕 Claude Code 和 Codex 这两个生态展开,不同工具的 skills 格式和加载机制有差异,后面会详细拆解。
2. 核心机制拆解:skills 到底是怎么工作的
2.1 从“提示词”到“能力包”的进化逻辑
很多人第一次听说 skills,会把它理解成高级版的 prompt。这个理解不算错,但太浅了。普通的 prompt 是你问一句 AI 答一句,上下文全靠你手动维护。skills 的本质是一套可加载、可组合、可版本管理的能力包,它包含几个核心要素:触发条件、执行逻辑、工具调用权限、输出规范。
我打个比方:普通 prompt 像是你临时给助理口头交代任务,skills 则是你给助理写了一本岗位操作手册,里面详细规定了什么情况下该做什么、用什么工具、按什么格式交付。助理每次上岗前先读手册,读完就知道该怎么干活了。
具体到技术实现,一个 skill 通常包含以下结构:
- 元数据定义:名称、描述、版本、适用场景,让 AI 知道这个 skill 是干什么的
- 触发规则:什么条件下激活这个 skill,比如检测到特定文件类型、特定命令、特定关键词
- 执行步骤:具体的操作流程,可能是调用外部工具、读取文件、执行命令、生成代码
- 约束条件:不能做什么、必须遵守什么规范,比如“禁止修改配置文件”“必须使用 TypeScript 严格模式”
- 输出模板:结果以什么格式呈现,方便后续流程消费
这套机制的核心价值在于把隐性的领域知识显性化。以前一个资深前端工程师知道“这个项目的组件必须用 hooks 写、样式必须用 CSS Modules、测试必须覆盖 80%”,这些知识在他脑子里,AI 不知道。现在通过 skills 把这些规则写下来,AI 就能按照同样的标准干活,而且不会忘记、不会偷懒。
2.2 Claude Code 与 Codex 的 skills 生态差异
目前 skills 最活跃的两个生态是 Claude Code 和 Codex,它们的设计哲学有明显差异,选哪个取决于你的实际需求。
Claude Code 的 skills 更偏向对话式能力扩展。它的 skill 定义通常是一个 Markdown 文件,里面用自然语言描述能力边界和操作步骤,AI 在对话过程中动态加载。这种设计的好处是灵活,你可以随时修改 skill 内容,AI 下次对话就能感知到变化。缺点是执行确定性稍弱,复杂任务链容易跑偏。
Codex 的 skills 则更偏向工程化任务编排。它的 skill 通常以配置文件或代码模块的形式存在,强调可测试、可复用、可组合。Codex 的 skills 更适合那种“输入固定、输出固定、中间步骤明确”的批处理任务,比如批量重命名文件、自动生成 API 文档、代码格式统一化。
我实测下来的感受是:如果你需要 AI 帮你做探索性的、需要频繁调整的编码任务,Claude Code 的 skills 更顺手;如果你需要 AI 执行重复性的、流程固定的工程任务,Codex 的 skills 更可靠。当然,两者也不是完全割裂的,有些团队会同时用,让 Claude Code 做前期探索,Codex 做后期批量执行。
| 对比维度 | Claude Code skills | Codex skills |
|---|---|---|
| 定义形式 | Markdown 自然语言描述 | 配置文件/代码模块 |
| 加载时机 | 对话中动态加载 | 任务启动时静态加载 |
| 执行确定性 | 中等,依赖 AI 理解 | 高,流程固定 |
| 适用场景 | 探索性编码、上下文敏感任务 | 批处理、重复性工程任务 |
| 修改成本 | 低,改文本即可 | 中,需改配置或代码 |
| 调试难度 | 较难,行为不完全可预测 | 较易,可逐步跟踪 |
2.3 为什么现在 skills 突然火了
skills 这个概念其实不算全新,但最近爆发有几个现实原因。第一,AI 编程工具的使用门槛降低了,Claude Code、Codex 这些工具让普通开发者也能用上 AI 辅助编程,但用起来发现“通用能力不够用”,自然就催生了对专精能力的需求。第二,项目复杂度上来了,一个前端项目可能涉及几十个组件、多种构建工具、多套规范,靠手动喂上下文效率太低。第三,社区开始沉淀最佳实践,有人把自己写的 skills 分享出来,其他人直接拿来用,形成了正向循环。
还有一个容易被忽略的点:skills 让 AI 编程从“个人助手”变成了“团队资产”。以前你调教好的 prompt 只在你自己的对话里有效,换个同事就得重新调。现在 skills 可以提交到代码仓库,团队成员共享,新人入职直接加载,AI 的行为标准就统一了。这对团队协作效率的提升是实打实的。
3. 实操落地:从零搭建一个可用的 skill
3.1 环境准备与工具选型
在动手写 skill 之前,你得先把基础环境搭好。这里以 Claude Code 为例,因为它的 skills 上手最快,对新手最友好。
首先确认你的操作系统和 Node.js 版本。Claude Code 目前对 Windows 的支持是通过 WSL 实现的,如果你在 Windows 上开发,建议直接装 WSL2 加 Ubuntu,省去很多兼容性麻烦。macOS 和 Linux 原生支持,直接装就行。Node.js 版本建议 18 以上,我实测 20 LTS 最稳。
安装 Claude Code 的命令很简单:
npm install -g @anthropic-ai/claude-code装完之后运行claude命令,按照提示完成登录和初始化。如果你在国内,可能会遇到网络问题,这个自己想办法解决,我不展开。初始化完成后,你会看到一个交互式命令行界面,这就是你后续加载 skills 的主战场。
Codex 的安装稍微复杂一点,它更依赖 Python 环境。你需要先装 Python 3.10 以上,然后用 pip 安装:
pip install codex-cliCodex 的 skills 通常放在项目根目录的.codex/skills/文件夹下,每个 skill 一个子目录,里面包含配置文件和执行脚本。Claude Code 的 skills 则放在~/.claude/skills/或者项目级的.claude/skills/目录下,以 Markdown 文件为主。
提示:不管用哪个工具,都建议把 skills 目录纳入版本控制,这样团队成员的 AI 行为标准才能保持一致。
3.2 第一个 skill:自动生成组件文档
我拿一个真实场景来演示:前端项目里有一堆 React 组件,每次改完代码都要手动更新文档,烦得很。我们写一个 skill,让 AI 自动扫描组件文件、提取 props 和注释、生成 Markdown 文档。
先创建 skill 文件:
mkdir -p .claude/skills/component-doc touch .claude/skills/component-doc/SKILL.md然后在SKILL.md里写入以下内容:
--- name: component-doc description: 扫描 src/components 下的 React 组件,自动生成 Markdown 文档 trigger: 当用户提到"生成组件文档"或"更新文档"时激活 --- ## 执行步骤 1. 扫描 `src/components/` 目录下所有 `.tsx` 文件 2. 对每个文件,提取以下信息: - 组件名称(从 export 语句中获取) - Props 接口定义(从 TypeScript interface 中提取) - JSDoc 注释(如果有) - 默认导出方式 3. 按照以下模板生成 Markdown: ## 组件名 **文件路径**:`相对路径` **Props**: | 属性名 | 类型 | 必填 | 说明 | |-------|------|------|------| **示例**: ```tsx // 从组件文件中提取的示例代码- 将生成的内容写入
docs/components/组件名.md - 如果文档已存在,对比差异并提示用户确认后再覆盖
约束条件
- 只处理
.tsx文件,忽略.test.tsx和.stories.tsx - Props 说明优先使用 JSDoc 注释,没有则留空
- 生成的文档必须包含文件路径,方便跳转
这个 skill 写完之后,你在 Claude Code 里说“帮我生成组件文档”,它就会按照这个流程执行。我实测下来,一个 20 个组件的项目,大概 30 秒能跑完,生成的文档格式统一,比手动写快太多了。 ### 3.3 参数配置与触发条件调优 skill 写出来只是第一步,真正影响使用体验的是触发条件和参数配置。触发条件太宽泛,AI 会频繁误触发,干扰正常对话;触发条件太窄,你又得每次手动指定,失去自动化的意义。 我的经验是,触发条件用“关键词 + 上下文”双重判断。比如上面的组件文档 skill,触发关键词是“生成组件文档”或“更新文档”,但同时要求当前工作目录下有 `src/components/` 文件夹。这样既不会在无关项目里误触发,也不会在相关项目里漏触发。 参数配置方面,Claude Code 的 skill 支持在 frontmatter 里定义变量,比如: ```yaml --- name: component-doc variables: source_dir: default: "src/components" description: "组件源码目录" output_dir: default: "docs/components" description: "文档输出目录" ---这样你在调用的时候可以覆盖默认值,比如“生成组件文档,源码目录用src/widgets”,AI 就会用你指定的目录。这种设计让 skill 的复用性大大提升,同一个 skill 可以适配不同项目结构。
Codex 的参数配置更偏向命令行风格,你可以在 skill 的配置文件中定义参数 schema,然后通过命令行参数传入。这种方式更适合集成到 CI/CD 流程里,比如每次合并代码后自动跑一遍文档生成 skill。
注意:参数默认值一定要设得合理,让 skill 在零配置情况下也能跑通。我见过太多 skill 因为默认值没设好,新人拿来根本跑不起来,最后只能弃用。
4. 进阶玩法:把 skills 组合成工作流
4.1 多 skill 串联的执行逻辑
单个 skill 能解决单点问题,但真实工作流往往是多个步骤串联的。比如“代码提交前自动检查”这个场景,就涉及代码格式化、类型检查、单元测试、生成变更日志四个步骤。你可以为每个步骤写一个 skill,然后用一个“编排 skill”把它们串起来。
编排 skill 的写法是在执行步骤里调用其他 skill:
## 执行步骤 1. 调用 `format-code` skill 格式化所有变更文件 2. 调用 `type-check` skill 执行 TypeScript 类型检查 3. 如果类型检查通过,调用 `run-tests` skill 执行单元测试 4. 如果测试通过,调用 `gen-changelog` skill 生成变更日志 5. 如果任何步骤失败,中止流程并输出错误详情这种串联方式的好处是每个 skill 可以独立维护、独立测试,组合起来又能完成复杂任务。我团队里现在有十几个 skill,通过不同的编排组合,覆盖了从代码生成到部署上线的完整流程。
不过要注意,skill 串联会放大错误。如果第一个 skill 的输出格式不对,后面的 skill 可能全部跑偏。所以我在每个 skill 的输出里都加了格式校验,确保下游能正确解析。另外,编排 skill 里一定要有失败中止逻辑,不能一个步骤失败了还继续往下跑,那样只会产生一堆垃圾结果。
4.2 用 skills 实现跨项目复用
skills 最大的价值之一是跨项目复用。你在一个项目里调教好的 skill,可以原样复制到另一个项目,只需要调整少量参数。我现在的做法是维护一个“skill 仓库”,把通用 skill 放在里面,每个项目通过软链接或者 git submodule 引入。
具体操作上,我会把 skill 分成三类:
- 通用 skill:跟技术栈无关,比如“生成变更日志”“检查提交信息格式”,直接复制到任何项目都能用
- 技术栈 skill:跟框架相关,比如“React 组件文档生成”“Vue 组合式函数检查”,需要项目里有对应依赖才能用
- 项目专属 skill:跟业务逻辑强相关,比如“生成 API Mock 数据”“校验业务字段命名规范”,只适用于特定项目
通用 skill 和技术栈 skill 放在共享仓库里,项目专属 skill 放在项目自己的.claude/skills/目录下。这样既保证了复用性,又保留了灵活性。
我踩过的一个坑是:早期把所有 skill 都放在项目里,结果每个项目都有一份副本,改了一个地方其他项目不知道,最后版本混乱。后来改成共享仓库加项目覆盖的机制,才把这个问题解决。具体做法是项目里的 skill 目录优先加载,找不到再去共享仓库找,这样项目可以覆盖通用 skill 的行为,又不会丢失通用能力。
4.3 团队协作中的 skills 管理规范
团队用 skills,最怕的是“各写各的,互不兼容”。我见过一个团队,三个人写了三套代码格式化 skill,规则还不一样,结果 AI 每次格式化出来的代码风格都不同,代码评审的时候吵得不可开交。
后来我们定了一套规范,分享出来供参考:
- 命名规范:skill 名称用 kebab-case,比如
format-code、gen-doc,不要用中文或空格 - 版本管理:每个 skill 在 frontmatter 里标注版本号,修改时递增,方便追踪变更
- 文档要求:每个 skill 必须包含使用示例和参数说明,新人能直接看懂怎么用
- 测试要求:skill 提交前必须在至少一个真实项目里跑通,不能只写不测
- 评审机制:新增或修改 skill 需要至少一个其他成员 review,确保不会破坏现有流程
这套规范执行下来,团队的 skill 库从混乱变得有序,新人入职第二天就能上手用,效率提升很明显。
5. 常见问题与排查技巧实录
5.1 skill 不生效的几种典型情况
这是被问得最多的问题:“我写了 skill,但 AI 好像没反应。”根据我的排查经验,原因通常集中在以下几个方面。
路径问题是最常见的。Claude Code 加载 skill 的路径是~/.claude/skills/或项目根目录的.claude/skills/,如果你放错地方,AI 根本找不到。我建议先用claude --list-skills命令确认 skill 是否被正确加载,如果列表里没有,那就是路径问题。
格式问题排第二。skill 的 frontmatter 必须用---包裹,字段名不能拼错,YAML 语法要正确。我见过有人把description写成descripton,排查了半天才发现是拼写错误。建议写完 skill 后用 YAML 校验工具过一遍。
触发条件问题排第三。如果你的触发关键词太生僻,AI 可能理解不了。比如你写“触发词:搞文档”,AI 不一定能把这个词和“生成文档”关联起来。触发词尽量用自然语言里常见的表达,或者直接在 skill 描述里写清楚“当用户说 X 时激活”。
权限问题也偶尔遇到。有些 skill 需要读取项目文件或执行命令,如果 Claude Code 没有对应权限,skill 会静默失败。你可以在 skill 里显式声明需要的权限,或者在启动 Claude Code 时用--allow-all参数放开权限(仅限可信项目)。
| 问题现象 | 可能原因 | 排查方法 |
|---|---|---|
| skill 列表里没有 | 路径错误 | 检查.claude/skills/目录结构 |
| skill 加载了但不执行 | 触发条件不匹配 | 手动用触发词测试,看 AI 是否识别 |
| 执行到一半报错 | 权限不足或依赖缺失 | 检查 skill 声明的权限和外部依赖 |
| 输出格式不对 | 模板定义有误 | 检查输出模板的 Markdown 语法 |
| 多个 skill 冲突 | 触发条件重叠 | 调整触发词,避免歧义 |
5.2 性能优化:让 skill 跑得更快更稳
skill 跑得慢,通常是因为做了太多不必要的操作。比如一个“生成文档”的 skill,如果每次都扫描整个项目目录,那肯定慢。优化思路是缩小扫描范围,只处理变更文件或者指定目录。
我在 skill 里加了一个“增量模式”参数,默认只处理 git diff 里变更的文件,需要全量处理时再手动指定。这个改动让文档生成 skill 的执行时间从 30 秒降到了 3 秒,效果立竿见影。
另一个优化点是缓存。有些 skill 需要读取大量文件或调用外部 API,如果每次执行都重新读取,浪费很大。可以在 skill 里加一个简单的缓存机制,把上次执行的结果存到临时文件里,下次执行时先检查缓存是否有效。Claude Code 的 skill 支持在 frontmatter 里声明缓存策略,Codex 则需要自己在脚本里实现。
稳定性方面,最重要的是错误处理。skill 执行过程中可能遇到各种意外:文件不存在、网络超时、权限被拒。如果 skill 没有错误处理逻辑,遇到这些情况就会直接崩溃,用户体验很差。我的做法是在每个关键步骤后面加检查点,失败时输出明确的错误信息,并给出修复建议。比如“文件不存在”就提示“请确认路径是否正确”,“权限被拒”就提示“请检查文件权限或使用管理员权限运行”。
5.3 安全边界:哪些事不该让 skill 做
skills 虽然强大,但不是万能的。有些操作让 skill 自动执行风险很高,我建议手动确认或者干脆不要自动化。
删除文件是第一个红线。我见过有人写了一个“清理无用文件”的 skill,结果 AI 误判把重要源码删了。这种操作必须加人工确认,或者至少要有备份机制。
修改生产配置是第二个红线。数据库连接串、API 密钥、部署配置这些敏感信息,不要让 skill 自动修改。即使要改,也必须经过人工 review。
执行外部命令要谨慎。skill 里调用 shell 命令很方便,但也容易被滥用。我建议在 skill 里明确列出允许执行的命令白名单,超出白名单的命令一律拒绝。
访问网络也要控制。有些 skill 需要调用外部 API,这本身没问题,但要确保 API 是可信的,传输的数据不包含敏感信息。我通常会在 skill 里加一个“网络访问声明”,明确说明会访问哪些域名、传输什么数据,让用户知情。
提示:Claude Code 和 Codex 都支持在 skill 里声明安全策略,建议每个 skill 都显式声明权限边界,不要依赖默认行为。
6. 我踩过的坑和实测有效的技巧
6.1 那些让我熬夜排查的坑
第一个坑是skill 名称冲突。我早期写了一个formatskill,后来另一个同事也写了一个formatskill,放在不同目录下。Claude Code 加载的时候不知道用哪个,行为变得很奇怪。排查了半天才发现是名称冲突。后来我们定了规范,skill 名称必须带前缀,比如fe-format、be-format,避免冲突。
第二个坑是frontmatter 里的特殊字符。我在 description 里写了一个冒号,结果 YAML 解析报错,skill 直接加载失败。后来才知道 YAML 里冒号、引号这些字符需要转义。现在我都用引号把 description 包起来,省得出问题。
第三个坑是skill 之间的依赖顺序。我写了一个编排 skill,调用另外三个 skill,但没考虑执行顺序。结果格式化 skill 还没跑完,类型检查 skill 就开始了,检查的是未格式化的代码,报了一堆假错误。后来在编排 skill 里加了等待逻辑,确保前一个 skill 完全结束后再启动下一个。
第四个坑是跨平台兼容性。我在 macOS 上写的 skill,路径分隔符用的是/,同事在 Windows 上跑就报错。后来统一用 Node.js 的path模块处理路径,才解决了这个问题。如果你团队里有人用 Windows 有人用 macOS,这一点一定要提前考虑。
6.2 提升 skill 成功率的几个实用技巧
技巧一:给 skill 加自检逻辑。在 skill 执行前先检查环境是否满足条件,比如依赖是否安装、目录是否存在、权限是否足够。不满足条件就提前报错,不要等到执行到一半才失败。这个改动让我的 skill 成功率从 70% 提升到了 95% 以上。
技巧二:输出结构化日志。skill 执行过程中输出详细的日志,记录每一步做了什么、耗时多少、结果如何。这样出问题的时候能快速定位,不用靠猜。我通常会把日志写到.claude/logs/目录下,按日期和 skill 名称分文件。
技巧三:提供 dry-run 模式。对于有副作用的 skill(比如修改文件、执行命令),提供一个 dry-run 参数,只输出会做什么,不实际执行。这样用户可以先预览结果,确认无误后再正式执行。这个功能特别受团队新人欢迎,他们不敢直接跑 skill,先用 dry-run 看看效果,心里有底了再正式跑。
技巧四:定期回顾和清理。skill 库跟代码库一样,会随着时间积累垃圾。我每个月会花半小时回顾一遍所有 skill,把不再使用的删掉,把可以合并的合并,把过时的更新。保持 skill 库精简,AI 加载速度也会更快。
6.3 从个人使用到团队推广的经验
个人用 skill 和团队用 skill 是两码事。个人用,你怎么舒服怎么来;团队用,就得考虑一致性、可维护性、新人上手成本。
我的推广路径是这样的:先自己用一个月,把真正好用的 skill 沉淀下来;然后找一两个同事试用,收集反馈,迭代改进;最后在团队里正式推广,配套写使用文档和培训材料。这个过程急不得,强行推广只会让大家反感。
推广过程中最大的阻力是习惯改变。大家习惯了手动操作,觉得让 AI 自动执行不放心。我的应对方法是先从小事做起,比如让 skill 帮忙生成提交信息、格式化代码,这些低风险操作容易接受。等大家尝到甜头了,再推广更复杂的 skill。
另一个经验是建立反馈渠道。团队里谁用 skill 遇到问题,可以随时在群里反馈,我定期收集整理,把常见问题写进 FAQ 文档。这样新人遇到同样问题能自己查,不用每次都问我。
7. 这个方向后续还能怎么玩
skills 目前还处于早期阶段,很多可能性还没被充分挖掘。我个人比较看好的几个方向:一是skill 市场,社区里已经有人在分享自己写的 skill,未来可能出现类似 npm 的 skill 仓库,大家按需安装;二是skill 组合编排,通过可视化工具把多个 skill 串成工作流,降低使用门槛;三是skill 与 CI/CD 深度集成,让 AI 在代码提交、构建、部署各个环节自动执行任务。
我现在正在尝试的一个方向是让 skill 具备学习能力。比如一个代码审查 skill,每次审查后记录哪些问题被人工修正了,下次遇到类似情况时自动调整审查规则。这个方向还在探索阶段,但我觉得潜力很大。
如果你刚开始接触 skills,我的建议是不要贪多,先写一个解决自己实际痛点的 skill,跑通了再扩展。skills 的价值不在于数量,而在于能不能真正融入你的工作流,帮你省时间、少犯错。我见过有人写了五十个 skill,结果常用的就两三个,剩下的都是摆设。与其追求数量,不如把两三个核心 skill 打磨到极致,让它们成为你日常开发中离不开的工具。