首页 / 资讯中心 / 文章详情

12 Skills 开发实战:用 SKILL.md 与 YAML frontmatter 搭建 Claude Code 技能骨架

12 Skills 开发实战:用 SKILL.md 与 YAML frontmatter 搭建 Claude Code 技能骨架 ★ FEATURED ARTICLE
1. 从一次“技能失控”说起为什么需要工程化 Skills如果你在 Claude Code 里装过十几个 Skill大概率遇到过这种场面输入/之后补全列表长得像菜单选了一个部署 Skill结果它把整个项目的上下文全吃掉了主对话直接开始胡言乱语。更糟的是有些 Skill 明明只是改一个 YAML 文件却因为auto_activate_on写得太宽在你编辑任何.ts文件时都跳出来刷存在感。这就是 12 Skills 开发实战要解决的核心问题Skill 不是写一个 Markdown 就完事它是一套需要工程化管理的上下文注入机制。SKILL.md 是载体YAML frontmatter 是控制面板context:fork是隔离舱三者配合才能让技能既好用又不互相打架。这篇内容适合两类人一是已经在 Claude Code 里手写 Skill、但发现越写越乱的开发者二是准备把团队内部流程部署、审查、排障沉淀成可复用技能包的工程团队。我会从目录骨架开始逐项拆解 frontmatter 字段给出可直接复制的配置模板并演示加载、触发、验证技能生效的完整动作。全程围绕一个目标让你手里的 12 个 Skill 各司其职而不是互相抢上下文。2. TaoToken 前置把模型接入和技能开发分开管Skill 开发本身不依赖特定网关但你要在 Claude Code 里反复触发、验证技能行为就需要一个稳定的模型调用入口。我的做法是把模型接入层和技能层解耦技能目录放在项目仓库里跟着代码走模型访问凭证通过 TaoToken 统一管理这样换模型或换环境时不用动 Skill 文件。TaoToken 在这里扮演的是“模型访问层”的角色官网地址是 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 入口是 https://taotoken.net/api 。你需要在控制台创建 API Key然后把它配置到 Claude Code 的环境变量里。这一步和 Skill 开发是两条平行线但验证阶段会频繁用到。具体操作上先到控制台的 API Keys 页面生成一个 Key页面地址是 https://taotoken.net/console/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi_keysutm_campaignrewrite 。生成后不要直接写进 SKILL.md而是放到 shell 的环境变量或项目的.env.local里。Skill 文件里只引用变量名不出现明文凭证这是后面做团队共享时的基本纪律。如果你打算长期跑编码类 Skill比如自动重构、批量生成测试可以顺带看一下 Coding Plan 的说明页 https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding_planutm_campaignrewrite 它更适合高频调用的场景。接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 遇到字段含义不清楚时对照查一下。3. 可复制配置12 Skills 的目录骨架与 frontmatter 模板3.1 目录结构一个 Skill 一个文件夹先给出一套可以直接mkdir出来的骨架。核心原则是SKILL.md 只放指令重资源放子目录这样三级渐进式加载才有意义。skills/ ├── deploy/ │ ├── SKILL.md │ ├── templates/ │ │ ├── Dockerfile.tmpl │ │ └── deploy.yml.tmpl │ └── examples/ │ └── ecs-config.json ├── pr-review/ │ └── SKILL.md ├── onboard/ │ └── SKILL.md ├── db-migrate/ │ └── SKILL.md ├── api-mock/ │ └── SKILL.md ├── log-triage/ │ └── SKILL.md ├── release-note/ │ └── SKILL.md ├── perf-audit/ │ └── SKILL.md ├── sec-scan/ │ └── SKILL.md ├── i18n-sync/ │ └── SKILL.md ├── test-gen/ │ └── SKILL.md └── rollback/ └── SKILL.md12 个目录对应 12 个技能命名用短横线避免和内置命令冲突。每个目录里SKILL.md是必需项templates/和examples/按需添加。注意不要把大段文档塞进 SKILL.md正文超过 2000 行就该拆到子目录。3.2 YAML frontmatter 字段逐项说明frontmatter 是 Skill 的控制面板写错一个字段可能导致技能不触发或触发过猛。下面这张表是我实测后整理的字段清单。字段必需作用常见坑name是唯一标识也是斜杠命令名用deploy容易和别的技能撞名description是搜索和展示用决定 AI 是否匹配写太泛会导致误触发version否语义化版本便于团队同步不写也能跑但排查时没依据auto_activate_on否正则匹配文件路径时自动激活写.*\.ts会到处触发context否设为fork时启用隔离子会话子会话拿不到主对话历史model否指定该技能使用的模型不写则继承主会话模型tags否分类标签便于检索随意堆标签等于没标签一个最小可用的 frontmatter 长这样--- name: db-migrate description: 数据库迁移标准化流程包含备份、迁移、校验、回滚四步 version: 1.0.0 auto_activate_on: prisma/migrations/.*\.sql tags: [database, migration] ---注意auto_activate_on用的是正则不是 glob。prisma/migrations/.*\.sql只会在操作迁移 SQL 文件时激活不会在你改业务代码时乱入。3.3 context:fork 的配置与适用边界context:fork是 12 Skills 里最容易被误用的字段。它的行为是主会话触发技能后Claude Code 创建一个独立子会话只加载 SKILL.md 和必要文件执行完把结果序列化返回主会话然后销毁子会话。--- name: pr-review description: PR 审查流程检查安全、性能、质量、测试覆盖 version: 1.0.0 context: fork model: sonnet tags: [code-review, quality] ---什么时候该用 fork我总结了两条判断标准一是这个技能会产生大量工具调用比如扫描整个 diff、跑多轮检查不隔离会污染主对话二是任务足够独立不需要主对话的完整历史。反过来如果技能需要引用你前面聊过的需求细节fork 之后子会话看不到就得在 SKILL.md 里显式声明上下文说明。3.4 一个完整的 SKILL.md 正文模板frontmatter 之后是正文正文结构建议固定为概述、前置条件、执行步骤、回滚方案、注意事项。下面以db-migrate为例。# DB Migrate Skill ## 概述 封装数据库迁移的标准流程确保每次迁移可备份、可校验、可回滚。 ## 前置条件 - 已配置 DATABASE_URL 环境变量 - 当前分支为 main 且工作区干净 - 迁移文件已通过本地测试 ## 执行步骤 ### Step 1: 备份当前数据库 bash pg_dump $DATABASE_URL backup_$(date %Y%m%d_%H%M%S).sqlStep 2: 执行迁移npx prisma migrate deployStep 3: 校验迁移结果npx prisma migrate statusStep 4: 抽样验证检查关键表行数与迁移前一致若异常立即执行回滚。回滚方案npx prisma migrate resolve --rolled-back migration_name注意事项生产环境迁移前必须通知团队迁移期间禁止合并其他 PR正文里的代码块要标语言步骤要能直接复制执行。这样 AI 激活技能后注入的是一份可操作的指令而不是一段泛泛的描述。 ## 4. 验证请求加载、触发与确认技能生效 ### 4.1 加载技能并确认元数据可见 把 skills/ 目录放到项目根目录后重启 Claude Code 会话。此时所有技能的 frontmatter metadata 会被载入Level 1你可以通过输入 / 来观察补全列表里是否出现了 db-migrate、pr-review 等名称。如果没出现先检查目录层级skills/name/SKILL.md 是固定结构少一层或多一层都不会被识别。 ### 4.2 手动触发与自动触发各测一次 手动触发直接输入斜杠命令 text /db-migrate观察返回内容是否包含 SKILL.md 正文里的步骤。自动触发则通过操作匹配文件来验证比如打开prisma/migrations/20240101_init.sql并让 Claude Code 处理它看db-migrate是否被自动激活。两种触发方式都测一遍才能确认 frontmatter 里的auto_activate_on正则写对了。4.3 用一次真实请求验证 fork 行为对pr-review这类 fork 技能触发后留意主会话是否保持干净。你可以这样验证先在主会话里聊一段无关内容然后输入/pr-review等它返回审查报告后再问主会话“我们刚才聊了什么”。如果主会话还记得之前的内容说明 fork 隔离生效了如果子会话的内容混进了主对话说明context:fork没被正确解析。4.4 检查上下文占用在触发前后分别观察 token 使用量。非 fork 技能激活时SKILL.md 正文会注入主对话token 会明显上升fork 技能则只在子会话里消耗主对话增量很小。这个对比能帮你判断哪些技能该改成 fork 模式。5. 本篇常见错排查5.1 技能不触发先查 name 和路径最常见的原因是name字段和目录名不一致或者SKILL.md大小写写错。Claude Code 对文件名敏感skill.md和SKILL.md是两回事。另外auto_activate_on正则里的反斜杠在 YAML 里要转义\.写成.会导致匹配范围扩大。5.2 触发过猛收紧正则如果技能在你编辑无关文件时频繁激活把auto_activate_on从宽泛模式改成精确路径。比如把.*\.ts改成src/api/routes/.*\.ts。宁可少触发也不要让技能在不该出现的时候刷上下文。5.3 fork 模式下数据丢失子会话无法访问主会话历史这是设计使然。解决办法是在 SKILL.md 里加一段“上下文说明”让主会话在触发时把必要信息传进去## 上下文说明 当前分支{从 git branch 获取} 本次任务{从主会话传入的说明} 相关文件{用户指定的文件列表}5.4 命名冲突多个技能用同一个name时Claude Code 按加载顺序取第一个匹配项后面的会被静默忽略。建议加团队前缀比如team-deploy、team-pr-review避免和社区技能撞名。5.5 SKILL.md 过长导致上下文爆炸正文超过 2000 行就该拆分。把模板、示例、详细文档移到templates/和examples/子目录SKILL.md 只保留核心指令。三级渐进式加载的意义就在这里Level 1 只载 metadataLevel 2 按需载正文Level 3 才读子目录资源。6. 把技能开发流程固定下来12 个 Skill 跑通之后我建议把开发流程固化成三步先在skills/下建目录写 frontmatter再补正文和子目录资源最后在 Claude Code 里手动触发一次、自动触发一次、fork 验证一次。三步都过了才算完成。如果你在验证阶段需要频繁切换模型来对比技能行为可以用模型对话页面快速试不同模型的响应差异地址是 https://taotoken.net/model-chat?utm_sourcetaotoken_aicg_blog_endutm_contentmodel_chatutm_campaignrewrite 。接入相关的字段和报错对照文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite API Key 管理在 https://taotoken.net/console/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi_keysutm_campaignrewrite 。长期跑编码类技能的话Coding Plan 页面 https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding_planutm_campaignrewrite 里有调用频率相关的说明。最后留一个我踩过的坑不要试图用一个“万能 Skill”覆盖所有场景。我早期写过一个包含部署、审查、排障的巨型 SKILL.md结果每次激活都吃掉大量上下文AI 反而抓不住重点。拆成 12 个精准的小技能后每个只做一件事触发准确率和执行质量都上来了。技能开发的黄金法则就是一个 Skill 只做一件事把它做到极致。
阅读完成 · 觉得有帮助?
咨询建站