在前一篇中,我们全面了解了 Hermes Agent 的 Skills 技能系统——从 Skills Hub 浏览安装,到本地技能创建,再到多平台启用策略。但你可能注意到一个关键问题:**如何从零开始编写一个高质量的自定义 Skill?**

创建自定义 Skills —— 从经验到可复用工作流、SKILL.md 格式规范、Frontmatter 与常见陷阱

简介

在前一篇中,我们全面了解了 Hermes Agent 的 Skills 技能系统——从 Skills Hub 浏览安装,到本地技能创建,再到多平台启用策略。但你可能注意到一个关键问题:如何从零开始编写一个高质量的自定义 Skill?

很多人第一次写 Skill 时,随便丢几个 markdown 文件到一个目录里,然后发现 Agent 根本不能正确理解和调用。这不是 Skill 系统的问题,而是没有遵循正确的结构和规范

本文将深入探讨自定义 Skills 的完整创建流程:

  • 从经验到抽象:如何将个人知识沉淀为可复用的 Skill
  • SKILL.md 核心格式:每个 Skill 的入口文件规范
  • YAML Frontmatter 详解:元数据定义的正确姿势
  • 知识库组织策略:让 Agent 真正"理解"你的领域
  • 工作流定义实战:把重复性操作变成自动化流程
  • 常见陷阱与避坑指南:那些踩过的坑,你不必再踩

核心观点:一个好的 Skill 不是"一堆文件的集合",而是"结构化的领域知识 + 明确的操作流程 + 精确的元数据描述"的三位一体。

目录

从经验到可复用工作流

你的经验如何变成 Skill?

假设你是一名资深前端工程师,在过去三年中处理过上百个 React 项目的性能问题。你脑子里有大量的"经验"——什么时候该用 useMemo、什么时候不该用、如何识别不必要的重渲染、如何设置 React DevTools Profiler……

但这些经验停留在你的脑子里。如果你离开这个项目,或者你需要带一个新同事,这些知识就流失了。

Skill 的本质:将隐性经验显性化、结构化、可执行化。

text
经验沉淀流程:

个人经验 ──→ 记录整理 ──→ 结构化文档 ──→ 封装为 Skill ──→ 团队共享
  (隐性)       (文档化)     (知识库)        (SKILL.md)      (可复用)

第一步:识别可模式化的场景

不是所有经验都适合做成 Skill。适合的场景通常有以下特征:

  • 重复性高:同样的流程每周/每天都在重复
  • 决策树明确:可以根据条件走不同的分支
  • 需要上下文知识:不仅仅是工具操作,还需要领域理解
  • 新手容易犯错:有明确的最佳实践和常见陷阱

适合做 Skill 的场景举例:

text
✅ 适合:                              ❌ 不适合:
• React 组件性能审计流程                 • "帮我写首诗"(太主观)
• Python 异步代码审查                    • "翻译这段文字"(通用任务)
• 数据库慢查询诊断                       • "计算 2+2"(太简单)
• CI/CD 流水线调试                       • "推荐一本书"(无固定流程)
• Kubernetes 故障排查                    • "画个架构图"(输出不确定)

第二步:提取知识要素

确定场景后,开始拆解需要的知识要素:

yaml
知识要素拆解模板:
  场景: React 组件性能优化
  输入:
    - 组件源码文件
    - 可选: 性能分析报告
  输出:
    - 性能问题清单
    - 修复建议
    - 修改后的代码(可选)
  需要知道:
    - React 渲染机制
    - 常见性能反模式
    - 优化手段及适用场景
    - 验证方法
  工具需要:
    - read_file (读代码)
    - patch (改代码)
    - terminal (跑测试/性能分析)
    - code_search (搜索特定模式)

第三步:定义工作流

将知识要素转化为 Agent 可以遵循的步骤:

text
React 性能审计工作流:

1. [检测] 扫描组件文件,识别潜在性能问题
2. [分析] 对每个问题判断严重程度和影响范围
3. [建议] 生成修复方案(含代码示例)
4. [实施] 应用修复(用户确认后)
5. [验证] 运行测试确保功能正常

SKILL.md 格式规范

SKILL.md 是什么?

SKILL.md 是每个 Skill 的入口文件,相当于这个技能的"名片"和"说明书"。Agent 在加载 Skill 时,首先读取 SKILL.md 来理解:

  1. 这个技能是做什么的
  2. 什么时候应该使用它
  3. 它需要什么工具
  4. 它包含哪些知识

SKILL.md 标准结构

markdown
---
name: react-performance-audit
version: 1.2.0
description: React 组件性能审计与优化技能
author: 张三 <zhangsan@example.com>
license: MIT
tags:
  - react
  - performance
  - frontend
  - audit
requires:
  - read_file
  - patch
  - terminal
  - code_search
inject:
  - knowledge/rendering-model.md
  - knowledge/anti-patterns.md
  - knowledge/optimization-strategies.md
---

# React 性能审计与优化

## 能力概述

本技能使 Agent 具备对 React 18+ 组件进行**系统化性能审计**的能力。

## 何时使用

当用户提到以下关键词或场景时,应主动建议使用此技能:
- 组件渲染慢 / 卡顿 / 掉帧
- "优化 React 性能"
- "为什么这个组件反复渲染"
- React DevTools Profiler 分析
- 列表滚动性能问题

## 能力范围

### 能做的
- ✅ 识别不必要的组件重渲染
- ✅ 检测 useMemo / useCallback 的误用和缺失
- ✅ 分析状态管理导致的全量更新
- ✅ 检查大列表未虚拟化问题
- ✅ 检测内存泄漏(未清理的 effect)
- ✅ 提供具体的代码修复方案

### 不能做的
- ❌ 无法分析 React Native 原生模块性能
- ❌ 无法优化 Webpack 打包体积(需配合 bundle-analysis 技能)
- ❌ 无法替代人工进行架构级性能规划

## 工作流程

### 审计流程

1. **扫描阶段**:使用 `code_search` 搜索目标文件中的性能反模式
2. **分析阶段**:读取相关文件,结合知识库判断问题严重性
3. **报告阶段**:生成结构化的性能审计报告
4. **修复阶段**:对每个问题提供修复代码(使用 `patch`5. **验证阶段**:运行测试确保功能未受损

### 交互模式

用户: 这个列表组件滚动很卡 Agent: [加载 react-performance-audit 技能] Agent: 我来帮你审计这个组件的性能问题。

  1. 首先,让我读取组件源码...
  2. 我发现了以下问题:
    • [P0] 未使用虚拟列表(500+ 条数据直接渲染)
    • [P1] map 中使用 index 作为 key
    • [P2] 每次渲染都创建新的函数引用
  3. 建议修复方案:...
text

## 相关知识

- [React 渲染模型](knowledge/rendering-model.md)
- [常见性能反模式](knowledge/anti-patterns.md)
- [优化策略速查](knowledge/optimization-strategies.md)

SKILL.md 写作要点

区域 重要性 说明
Frontmatter 🔴 必须 元数据定义,Agent 解析用
能力概述 🔴 必须 一句话说明技能用途
何时使用 🔴 必须 触发条件和关键词
能力范围 🟡 推荐 明确能做/不能做的事
工作流程 🟡 推荐 Agent 执行步骤指南
交互模式 🟢 可选 示例对话,帮助理解使用方式
相关知识 🟡 推荐 知识库文件索引

YAML Frontmatter 详解

Frontmatter 基础

Frontmatter 是 SKILL.md 文件开头的 YAML 区块,用 --- 包裹。它是 Agent 解析 Skill 的核心依据

yaml
---
name: react-performance-audit
version: 1.2.0
description: "React 组件性能审计与优化技能"
author: "张三 <zhangsan@example.com>"
license: MIT
homepage: "https://github.com/example/react-performance-audit"
repository: "https://github.com/example/react-performance-audit.git"
---

字段完整说明

yaml
---
# ─── 基础信息 ───
name: my-skill-name              # 技能标识符(必需)
                                 # 规则:小写字母、数字、连字符
                                 # 长度:3-50 字符
                                 # 示例:react-perf, db-tuning, k8s-deploy

version: 1.2.0                   # 语义化版本号(必需)
                                 # 格式:MAJOR.MINOR.PATCH
                                 # MAJOR: 不兼容更新
                                 # MINOR: 向后兼容的功能新增
                                 # PATCH: 向后兼容的 bug 修复

description: "一句话描述"         # 技能描述(必需)
                                 # 长度:10-200 字符
                                 # 用途:搜索展示、列表预览

author: "你的名字 <邮箱>"          # 作者信息(推荐)

license: MIT                     # 许可证(推荐)
                                 # 常用:MIT, Apache-2.0, GPL-3.0

# ─── 分类与标签 ───
tags:                            # 标签数组(推荐)
  - react
  - performance
  - frontend
category: frontend               # 主分类(可选)
                                 # 内置分类:
                                 #   frontend, backend, devops, database,
                                 #   testing, security, ai-ml, data-science,
                                 #   mobile, documentation

# ─── 工具依赖 ───
requires:                        # 需要的工具列表(必需)
  - read_file
  - write_file
  - patch
  - terminal
  - code_search

optional_tools:                  # 可选工具(可选)
  - lint_check
  - test_run

# ─── 知识库注入 ───
inject:                          # 要注入到上下文的知识文件(推荐)
  - knowledge/overview.md
  - knowledge/patterns/*.md      # 支持 glob 模式
  - knowledge/anti-patterns.md

inject_mode: system_prompt       # 注入模式(可选,默认 system_prompt)
                                 # system_prompt: 注入到系统提示词(优先级高)
                                 # context: 注入到对话上下文
                                 # both: 同时注入

# ─── 运行约束 ───
min_hermes_version: 0.8.0        # 最低 Hermes 版本(可选)

platforms:                       # 支持的平台(可选,默认全部)
  - linux
  - macos

languages:                       # 适用的编程语言(推荐)
  - typescript
  - javascript

project_types:                   # 适用的项目类型(可选)
  - react
  - nextjs

# ─── 依赖声明 ───
dependencies:                    # 外部依赖(可选)
  node: ">=18.0.0"
  npm_packages:
    - react@">=18.0.0"

conflicts:                       # 冲突的技能(可选)
  - react-old-perf-checker       # 与旧版本技能互斥

# ─── 工作流定义 ───
workflows:                       # 内置工作流(可选)
  audit:
    name: "性能审计"
    description: "对 React 组件进行性能审计"
    trigger_words:
      - "性能审计"
      - "渲染慢"
      - "优化性能"
    steps:
      - scan
      - analyze
      - report
      - fix

# ─── 自定义变量 ───
variables:                       # 技能内部变量(可选)
  max_severity: P0               # 最大严重级别
  auto_fix: false                # 是否自动修复

# ─── 元数据 ───
created: 2025-05-20              # 创建日期
updated: 2025-06-15              # 最后更新日期
changelog: |                     # 更新日志
  1.2.0 - 新增 React 19 支持
  1.1.0 - 优化检测算法
  1.0.0 - 初始版本
---

Frontmatter 验证

bash
# 验证 SKILL.md 格式
hermes skills validate ./my-skill/SKILL.md

# 输出:
# ═══════════════════════════════════════════════════
#  SKILL.md 验证结果
# ═══════════════════════════════════════════════════
#
#  ✅ Frontmatter 格式正确
#  ✅ 必需字段完整 (name, version, description)
#  ✅ 版本号符合语义化规范 (1.2.0)
#  ✅ 标签有效 (3 个)
#  ✅ 工具列表有效 (5 个工具)
#  ✅ 知识库文件存在 (3/3)
#  ⚠️  建议添加 license 字段
#  ⚠️  建议添加 author 字段
#  ⚠️  描述长度偏短 (15 字符),建议 30+ 字符
#
#  总计: 4 个通过, 0 个错误, 3 个建议

Frontmatter 常见错误

yaml
# ❌ 错误 1:name 包含大写字母
---
name: ReactPerformance    # 错误!必须全小写
---

# ✅ 正确
---
name: react-performance
---

# ❌ 错误 2:版本号不规范
---
version: 1.2              # 错误!缺少 PATCH 版本
version: v1.2.0           # 错误!不要带 v 前缀
version: "1.0"            # 错误!
---

# ✅ 正确
---
version: 1.2.0
---

# ❌ 错误 3:描述为空或过长
---
description: ""           # 错误!描述不能为空
description: "这是一个非常非常非常长的描述,超过了200个字符的限制,会导致解析失败并且在 Skills Hub 上显示不完整,影响用户的阅读体验。"  # 错误!
---

# ✅ 正确
---
description: "React 组件性能审计与优化技能,自动检测反渲染、状态管理等问题"
---

# ❌ 错误 4:requires 中包含不存在的工具
---
requires:
  - read_file
  - magic_fix             # 错误!不存在这个工具
---

# ❌ 错误 5:inject 指向不存在的文件
---
inject:
  - knowledge/nonexistent.md   # 错误!文件不存在
---

知识库组织策略

知识库目录结构

text
my-skill/
├── SKILL.md                    # 技能入口文件
├── knowledge/                   # 知识库根目录
│   ├── overview.md              # 概述(总是第一个加载)
│   ├── concepts/                # 核心概念
│   │   ├── rendering-model.md
│   │   └── state-management.md
│   ├── patterns/                # 最佳实践模式
│   │   ├── memoization.md
│   │   ├── virtualization.md
│   │   └── lazy-loading.md
│   ├── anti-patterns/           # 反模式/常见错误
│   │   ├── excessive-re-render.md
│   │   ├── misuse-of-memo.md
│   │   └── memory-leaks.md
│   ├── examples/                # 示例代码
│   │   ├── before-after.md      # 修复前后对比
│   │   └── templates.md         # 代码模板
│   └── reference/               # 参考资料
│       ├── react-docs-links.md
│       └── tools-guide.md
├── workflows/                   # 工作流定义
│   ├── audit.yaml
│   └── fix.yaml
└── assets/                      # 附加资源
    └── templates/
        └── component-template.tsx

知识库编写原则

原则一:为 Agent 写作,不是为人写作

markdown
<!-- ❌ 为人写作:太笼统 -->
# React 性能优化
React 性能优化很重要,有很多方法可以做。

<!-- ✅ 为 Agent 写作:结构化、可执行 -->
# React 性能优化

## 识别不必要的重渲染

### 判断标准
当以下任一条件满足时,组件发生了不必要的重渲染:
1. props 值未变化,但组件重新执行了 render
2. context 值未变化,但消费该 context 的组件重新渲染
3. state 值通过 Object.is 比较相等,但触发了重新渲染

### 检测方法
```bash
# 使用 React DevTools Profiler
# 1. 打开 DevTools → Profiler
# 2. 点击 "Record" 开始录制
# 3. 执行触发渲染的操作
# 4. 点击 "Stop" 查看火焰图
# 5. 关注 "Why did this render?" 面板
```

### 常见原因
| 原因 | 症状 | 解决方案 |
|------|------|----------|
| 父组件重渲染传递新对象引用 | props 看起来一样但组件重新渲染 | 提升状态 / 使用 useMemo |
| Context 值频繁变化 | 大量无关组件重新渲染 | 拆分 Context / 使用 selector |
| 内联函数/对象作为 props | 子组件每次都是新引用 | useCallback / useMemo |

原则二:使用明确的判断规则

markdown
## 何时使用 useMemo

### 应该使用 ✅
- [ ] 计算成本 > 5ms 的纯函数
- [ ] 引用稳定性的场景(作为其他 hook 的依赖)
- [ ] 传递给 React.memo 包裹的组件的 props

### 不应该使用 ❌
- [ ] 简单的值计算(如 `a + b`- [ ] 仅渲染一次的组件
- [ ] 没有传递给子组件的局部变量
- [ ] 期望缓存副作用(useMemo 不保证执行次数)

### 决策树
计算成本高?── 是 ──→ 是纯函数?── 是 ──→ 使用 useMemo
    │                      │
    否                     否
    │                      │
    ▼                      ▼
不使用                  考虑重构为纯函数

原则三:提供可执行的代码示例

markdown
## 虚拟列表实现模板

### 问题场景
当列表数据量 > 100 条时,直接渲染所有 DOM 节点会导致严重卡顿。

### 解决方案:react-window 虚拟列表

```tsx
import { FixedSizeList } from 'react-window';

// ❌ 错误:直接渲染所有数据
function BadList({ items }: { items: Item[] }) {
  return (
    <div>
      {items.map((item) => (
        <div key={item.id}>{item.name}</div>
      ))}
    </div>
  );
}

// ✅ 正确:使用虚拟列表
function GoodList({ items }: { items: Item[] }) {
  const Row = ({ index, style }: ListChildComponentProps) => {
    const item = items[index];
    return (
      <div style={style}>
        {item.name}
      </div>
    );
  };

  return (
    <FixedSizeList
      height={600}
      itemCount={items.length}
      itemSize={40}
      width="100%"
    >
      {Row}
    </FixedSizeList>
  );
}
```

知识库大小建议

技能复杂度 知识库文件数 总大小 适用场景
简单 1-3 个 < 10KB 单一场景、规则明确
中等 4-8 个 10-50KB 多步骤流程、需要上下文
复杂 9-20 个 50-200KB 完整领域知识体系

⚠️ 注意:知识库总量不宜超过 200KB。过大的知识库会:

  1. 增加上下文窗口占用
  2. 降低 Agent 响应速度
  3. 可能导致重要信息被截断

工作流定义实战

工作流 YAML 格式

yaml
# workflows/audit.yaml
name: performance-audit
description: "对 React 组件进行系统化性能审计"
version: 1.0.0

# 触发词:当用户输入包含这些词时,Agent 会考虑使用此工作流
trigger_words:
  - "性能审计"
  - "渲染慢"
  - "卡顿"
  - "优化"
  - "重渲染"

# 输入参数
inputs:
  - name: target_files
    type: file_paths
    description: "需要审计的组件文件路径"
    required: true
  - name: severity_threshold
    type: enum
    description: "最低报告严重级别"
    default: P2
    options: [P0, P1, P2, P3]

# 步骤定义
steps:
  - name: scan
    description: "扫描文件中的性能反模式"
    tool: code_search
    args:
      patterns:
        - pattern: "\\.map\\(.*=>.*<[^>]+>"
          description: "检查 .map 渲染是否使用了 key"
        - pattern: "useMemo\\(\\(\\) =>"
          description: "检查 useMemo 是否缺少依赖数组"
        - pattern: "style=\\{\\{"
          description: "检查是否使用内联样式对象"
      files: "{{ inputs.target_files }}"

  - name: analyze
    description: "分析问题严重性"
    tool: read_file
    args:
      # Agent 根据 scan 结果,读取相关源文件深入分析
      context: "结合知识库中的反模式文档,判断每个问题的严重级别"

  - name: report
    description: "生成审计报告"
    tool: write_file
    args:
      path: "./performance-audit-report.md"
      content_template: |
        # 性能审计报告

        审计时间: {{ now }}
        目标文件: {{ inputs.target_files }}
        严重级别阈值: {{ inputs.severity_threshold }}

        ## 问题清单

        {{ scan_results | format_report }}

  - name: suggest_fixes
    description: "提供修复建议"
    args:
      # 这一步主要依赖知识库,不需要特定工具
      instruction: |
        根据发现的问题,从知识库中匹配对应的修复方案。
        对每个问题提供:
        1. 问题描述
        2. 严重程度 (P0/P1/P2/P3)
        3. 修复代码(修改前 vs 修改后)
        4. 修复后的预期效果

  - name: apply_fixes
    description: "应用修复(需用户确认)"
    tool: patch
    args:
      # Agent 展示修改建议,等待用户确认后再执行
      require_confirmation: true

工作流步骤类型

yaml
# 步骤类型参考

# 1. 工具执行步骤
- name: step_name
  tool: terminal
  args:
    command: "npm run lint"

# 2. 知识驱动步骤(不依赖特定工具)
- name: step_name
  args:
    instruction: "根据知识库中的规则 X 进行分析"

# 3. 条件分支步骤
- name: check_severity
  condition: "{{ scan_results | length > 0 }}"
  then:
    - name: report_critical
      args:
        instruction: "报告严重问题"
  else:
    - name: all_clear
      args:
        instruction: "报告未发现严重问题"

# 4. 循环步骤
- name: check_each_file
  loop: "{{ inputs.target_files }}"
  args:
    instruction: "对 {{ loop_item }} 执行性能检查"

# 5. 并行步骤
- name: parallel_check
  parallel:
    - name: check_js
      args:
        instruction: "检查 JS 文件性能模式"
    - name: check_css
      args:
        instruction: "检查 CSS 文件性能模式"

工作流变量与模板

yaml
# 变量引用语法
variables:
  max_issues: 50
  report_format: markdown

# 在步骤中引用变量
- name: generate_report
  args:
    instruction: |
      生成最多 {{ variables.max_issues }} 个问题的报告
      使用 {{ variables.report_format }} 格式
      审计时间: {{ now }}
      工作目录: {{ workspace_root }}
      技能版本: {{ skill.version }}

# 管道过滤器
- name: format_results
  args:
    instruction: |
      按严重级别排序: {{ results | sort_by("severity") }}
      只显示 P0/P1: {{ results | filter("severity", ["P0", "P1"]) }}
      去重: {{ results | unique_by("pattern") }}
      取前 N 个: {{ results | limit(10) }}

技能配置完整示例

完整 Skill 目录

bash
$ tree react-performance-audit/
react-performance-audit/
├── SKILL.md
├── knowledge/
│   ├── overview.md
│   ├── concepts/
│   │   ├── rendering-model.md
│   │   └── react-memo.md
│   ├── anti-patterns/
│   │   ├── excessive-re-render.md
│   │   ├── misuse-of-memo.md
│   │   └── inline-objects.md
│   ├── patterns/
│   │   ├── virtualization.md
│   │   └── code-splitting.md
│   └── examples/
│       └── before-after.md
└── workflows/
    └── audit.yaml

SKILL.md 完整示例

markdown
---
name: react-performance-audit
version: 1.0.0
description: "React 组件性能审计与优化,自动检测重渲染、memo 误用、虚拟列表等问题"
author: "Hermes Community"
license: MIT
tags:
  - react
  - performance
  - frontend
  - audit
category: frontend
requires:
  - read_file
  - patch
  - terminal
  - code_search
optional_tools:
  - lint_check
inject:
  - knowledge/overview.md
  - knowledge/concepts/*.md
  - knowledge/anti-patterns/*.md
  - knowledge/patterns/*.md
inject_mode: system_prompt
languages:
  - typescript
  - javascript
project_types:
  - react
  - nextjs
dependencies:
  node: ">=18.0.0"
workflows:
  audit:
    name: "性能审计"
    description: "对 React 组件进行系统化性能审计"
    trigger_words:
      - "性能审计"
      - "渲染慢"
      - "优化性能"
---

# React 性能审计与优化

## 能力概述

本技能使 Agent 具备对 React 18+ 组件进行**系统化性能审计****自动优化建议**的能力。

## 何时使用

当用户提到以下关键词或场景时主动建议:
- 组件渲染慢 / 卡顿 / 掉帧
- "优化 React 性能" / "性能审计"
- "为什么反复渲染"
- 大列表滚动问题

## 能力范围

### 能做的
- ✅ 识别不必要的组件重渲染
- ✅ 检测 useMemo/useCallback 误用
- ✅ 分析状态管理导致的全量更新
- ✅ 检查大列表未虚拟化
- ✅ 检测内存泄漏
- ✅ 提供具体修复代码

### 不能做的
- ❌ React Native 原生模块性能
- ❌ Webpack 打包体积优化
- ❌ 架构级性能规划

常见陷阱与避坑指南

陷阱 1:知识库过载

yaml
# ❌ 错误:一次性注入太多文件
---
inject:
  - knowledge/*.md              # 可能注入 50+ 文件
  - docs/*.md
  - examples/*.md
---

# 正确:按需注入核心文件
---
inject:
  - knowledge/overview.md       # 概览总是需要
  - knowledge/anti-patterns/*.md # 核心反模式
inject_mode: system_prompt
---

# 补充知识通过工作流按需加载
workflows:
  audit:
    steps:
      - name: load_additional
        args:
          instruction: |
            如果发现问题类型 X,加载 knowledge/patterns/X.md
            如果发现问题类型 Y,加载 knowledge/patterns/Y.md

问题:注入过多文件会:

  • 占用大量上下文窗口
  • 稀释关键信息的权重
  • 增加 token 消耗

解决方案:分层注入 + 按需加载

陷阱 2:触发词过于宽泛

yaml
# ❌ 错误:触发词太宽泛
---
workflows:
  audit:
    trigger_words:
      - "优化"          # 太宽泛!数据库、网络、CSS 都要优化
      - "检查"          # 太宽泛!任何检查都会触发
      - "问题"          # 太宽泛!
---

# 正确:精准触发词
---
workflows:
  audit:
    trigger_words:
      - "React 性能"
      - "渲染慢"
      - "重渲染"
      - "组件卡顿"
      - "性能审计"
---

陷阱 3:技能职责过大

yaml
# ❌ 错误:一个技能做太多事
---
name: react-everything
description: "React 全能技能:性能、测试、安全、部署..."
---

# 正确:拆分为多个专注的技能
# react-performance-audit    - 性能审计
# react-testing-guide        - 测试指南
# react-security-check       - 安全检查
# react-deploy-helper        - 部署辅助

原则:一个技能 = 一个核心能力。遵循单一职责原则。

陷阱 4:缺少冲突声明

yaml
# ❌ 错误:没声明与其他技能的冲突
---
name: react-perf-v2
description: "React 性能优化 V2"
# 没有 conflicts 字段
---

# 正确:明确声明冲突
---
name: react-perf-v2
description: "React 性能优化 V2"
conflicts:
  - react-perf-v1            # 与旧版本互斥
  - react-simple-perf        # 与简化版互斥
---

陷阱 5:知识库文件路径错误

yaml
# ❌ 错误:路径不存在或拼写错误
---
inject:
  - knowledge/anti-pattern.md    # 实际文件名是 anti-patterns.md(复数)
  - knowledge/pattern/*.md       # 实际目录是 patterns/(复数)
---

# 正确:使用 validate 命令检查
# hermes skills validate ./my-skill/SKILL.md

陷阱 6:描述不够精确

yaml
# ❌ 错误:模糊描述
---
description: "React 相关的技能"    # 太模糊
description: "性能优化"              # 没有说明是什么的性能优化
---

# 正确:精确描述
---
description: "React 18+ 组件性能审计与优化,自动检测重渲染、memo 误用等问题"
---

陷阱 7:忽略版本兼容性

yaml
# ❌ 错误:不声明版本约束
---
name: nextjs-helper
description: "Next.js 开发辅助"
# 没有声明依赖的 Next.js 版本
---

# 正确:声明版本约束
---
name: nextjs-helper
version: 2.0.0
description: "Next.js 14+ App Router 开发辅助"
project_types:
  - nextjs
dependencies:
  npm_packages:
    - next@">=14.0.0"
---

陷阱 8:没有提供交互示例

markdown
<!-- ❌ 错误:只有冷冰冰的文档 -->
# 我的技能
这个技能可以做 X、Y、Z。

<!-- ✅ 正确:提供交互示例 -->
# 我的技能

## 使用示例


用户: 帮我看看这个组件为什么这么慢
Agent: [加载技能]
Agent: 我来帮你做性能审计。请先告诉我:
       1. 哪个组件文件?
       2. 有什么具体的表现?(如:输入时卡顿 / 滚动时掉帧)

总结

本文深入探讨了如何从零开始创建高质量的自定义 Skills:

  1. 经验到抽象:识别可模式化的场景,提取知识要素,定义工作流
  2. SKILL.md 规范:入口文件的标准结构,各区域的重要程度
  3. Frontmatter 详解:完整的字段说明、验证方法、常见错误
  4. 知识库组织:目录结构、编写原则、大小建议
  5. 工作流定义:YAML 格式、步骤类型、变量与模板
  6. 八大陷阱:知识库过载、触发词宽泛、职责过大、缺少冲突声明等

核心原则:

  • 为 Agent 写作:结构化、可执行、判断明确
  • 单一职责:一个技能专注一个核心能力
  • 按需注入:核心知识放 frontmatter,扩展知识按需加载
  • 精准触发:触发词要精确,避免误触发
  • 版本约束:声明依赖和兼容性,避免运行时错误

📌 下篇预告

发布与共享 Skills —— 将你的自定义 Skill 分享给全世界:Registry 发布流程、版本管理与语义化版本、社区贡献指南、私有 Registry 搭建。写完一个好 Skill 只是第一步,如何让别人也能用上它?下一篇将带你走完从本地到全球分发的完整旅程。