SKILL 文档编写

本页给出完整 SKILL.md 模板(name/description/version/triggers/steps/constraints/examples/output_format 所有必要字段)、触发条件好坏对比代码、steps 原子粒度标准,以及一个 25+ 行的代码审查 SKILL 完整示例。

SKILL front matter 完整模板

入口文件顶部使用 YAML 围栏(两行 ---)包住元数据。以下是包含所有必要字段的完整模板:

---
name: skill-kebab-name          # kebab-case,与仓库路径一致
description: |
  一句话说明:何时触发、输入是什么、产出是什么、禁止做什么。
  示例:当用户要求审查 PR 时;输入 diff 文本;产出结构化评审报告;禁止直接修改代码。
version: "1.2.0"                # 语义化版本,破坏性变更升 major
triggers:
  - "审查.*PR|review.*pull request"   # 正则匹配用户意图
  - "代码审查|code review"
  - "检查.*代码质量"
steps:
  - id: step-1
    action: 读取 diff 文本,提取变更的文件列表
  - id: step-2
    action: 对每个文件检查命名规范、函数长度、注释覆盖
  - id: step-3
    action: 检查安全问题(SQL 注入、未验证输入、硬编码密钥)
  - id: step-4
    action: 输出 JSON 格式的评审结果
constraints:
  - 禁止直接修改用户代码,只输出建议
  - 禁止在评审结果中包含用户代码的完整副本
  - 每条评审意见必须包含行号和具体改法
examples:
  - input: "请审查这个 PR:[diff 内容]"
    output: '{"issues": [...], "summary": "...", "score": 85}'
output_format:
  type: json
  schema:
    issues: "array of {file, line, severity, message, suggestion}"
    summary: "string"
    score: "integer 0-100"
---

触发条件:好/坏对比

触发条件必须精确到可以用正则或关键词匹配——模糊的触发导致误触发或漏触发。

# ❌ 坏的触发条件——太模糊,任何编程问题都会触发
triggers:
  - "代码"
  - "帮我看看"
  - "有问题"

# ✅ 好的触发条件——精确描述任务类型、技术栈和动作
triggers:
  - "审查.*PR|review.*pull.?request"      # 明确动作:审查
  - "检查.*代码质量|code.?quality"         # 明确目标:质量
  - "找.*bug|debug.*代码"                  # 明确意图:调试
  - input_contains: ["diff", "patch"]      # 输入特征匹配

# ❌ 坏的 description——没有说明输入输出和边界
description: 帮助用户处理代码相关问题

# ✅ 好的 description——包含触发条件、输入、输出、禁止事项
description: |
  当用户提供代码 diff 或 PR 链接要求审查时触发。
  输入:unified diff 文本或 GitHub PR URL。
  产出:JSON 格式评审报告(问题列表、严重级别、改法建议)。
  禁止:直接修改代码;禁止在输出中包含完整代码副本。
  • 每个 trigger 用独立正则,避免一个大正则难以维护。
  • 在 constraints 中用否定形式写清禁止事项("禁止X" 而非 "尽量不要X")。

steps 粒度标准:每步必须是原子操作

每个 step 是一个可独立执行、可独立验证的原子动作。以下是 5 步代码审查 SKILL 的正确粒度示例:

# ❌ 粒度太粗——无法验证,模型不知道从哪里开始
steps:
  - 审查代码
  - 给出反馈

# ✅ 正确粒度——每步原子、有明确输入输出、可独立验证
steps:
  - id: step-1
    action: 解析 diff 文本,提取变更文件列表和变更行范围
    input: unified diff 字符串
    output: [{file, added_lines, removed_lines}]
    verify: 列表非空,每项包含 file 字段

  - id: step-2
    action: 对每个变更文件检查函数长度(超 50 行标记为 WARNING)
    input: step-1 的文件列表 + 原始代码
    output: [{file, line, type: "LONG_FUNCTION", message}]
    verify: 所有标记项都有 line 字段

  - id: step-3
    action: 检查安全问题(正则匹配 SQL 拼接、eval()、硬编码密钥模式)
    input: 变更行文本
    output: [{file, line, type: "SECURITY", severity: "ERROR", message}]
    verify: severity 只能是 ERROR/WARNING/INFO

  - id: step-4
    action: 合并 step-2 和 step-3 的结果,按 severity 降序排列
    input: step-2 + step-3 的 issues 列表
    output: 合并排序后的 issues 列表

  - id: step-5
    action: 输出 JSON 报告,计算总分(100 - ERROR*10 - WARNING*3)
    input: step-4 的 issues 列表
    output: '{"issues": [...], "summary": "...", "score": 0-100}'
    verify: score 在 [0, 100] 范围内

完整真实 SKILL 示例:代码审查

以下是一个生产可用的代码审查 SKILL 完整示例(25+ 行):

---
name: code-review-pr
description: |
  当用户提供代码 diff 或 PR 内容要求审查时触发。
  输入:unified diff 文本。
  产出:JSON 格式评审报告,包含问题列表、严重级别和改法建议。
  禁止:直接修改代码;禁止在输出中复制完整源文件。
version: "2.0.0"
triggers:
  - "审查.*PR|review.*pull.?request"
  - "代码审查|code.?review"
  - input_contains: ["diff", "@@"]
constraints:
  - 禁止直接修改用户提交的代码
  - 每条问题必须包含 file、line、severity、message、suggestion 五个字段
  - severity 只允许 ERROR / WARNING / INFO 三个值
  - 输出必须是合法 JSON,不得包含 markdown 代码块包裹
steps:
  - id: parse-diff
    action: 解析 unified diff,提取变更文件列表和每个文件的变更行范围
    output: "list[{file: str, hunks: list[{start, lines}]}]"

  - id: check-style
    action: |
      对每个变更行检查:
      1. 函数超 50 行 → WARNING: LONG_FUNCTION
      2. 行长超 120 字符 → INFO: LONG_LINE
      3. 缺少文档注释(public 函数)→ WARNING: MISSING_DOCSTRING
    output: "list[Issue]"

  - id: check-security
    action: |
      用以下正则扫描变更行:
      - SQL 拼接:r"[\"'].*(SELECT|INSERT|UPDATE).*[\"']\s*\+" → ERROR
      - eval/exec 调用:r"\beval\s*\(|\bexec\s*\(" → ERROR
      - 硬编码密钥:r"(api_key|secret|password)\s*=\s*[\"'][^\"']{8,}" → ERROR
    output: "list[Issue]"

  - id: check-tests
    action: 检查变更的函数是否有对应测试文件;若变更 src/foo.py 但 tests/test_foo.py 未变更,输出 WARNING: MISSING_TEST_UPDATE
    output: "list[Issue]"

  - id: aggregate
    action: 合并所有 issues,按 severity 降序(ERROR > WARNING > INFO)排列
    output: "list[Issue] sorted"

  - id: score-and-report
    action: |
      计算总分:score = max(0, 100 - len(ERROR)*10 - len(WARNING)*3 - len(INFO)*1)
      输出完整 JSON 报告
    output: |
      {
        "issues": [{"file": "...", "line": 42, "severity": "ERROR",
                    "message": "...", "suggestion": "..."}],
        "summary": "发现 2 个 ERROR,3 个 WARNING",
        "score": 74
      }

examples:
  - input: |
      --- a/src/user.py
      +++ b/src/user.py
      @@ -10,3 +10,4 @@
       def get_user(id):
      +    query = "SELECT * FROM users WHERE id = " + id
           return db.execute(query)
    expected_issues:
      - {file: "src/user.py", line: 11, severity: "ERROR", message: "SQL 字符串拼接存在注入风险"}
---
  [ 对齐 name / description 与触发话术 ]
        |
        v
  [ 写 front matter 所有必要字段 ]
        |
        v
  [ 原子步骤(每步有 action/output/verify)]
        |
        v
  [ constraints 用否定形式写禁止事项 ]
        |
        v
  [ examples 含 input/expected 可验证 ]

Front matter 草稿实验室

在文本框中编辑草稿:左侧清单根据内容勾选常见 front matter 要点;右侧为只读预览,高亮行首 YAML 键与 Markdown 标题(便于扫读,仍以左侧为准编辑)。

Front matter 要点

    键与标题预览

    
                    

    清单为启发式检测(基于关键字与围栏),不能替代平台 schema 校验。

    ---
    name: skill-authoring-guide
    description: 编写符合规范的 SKILL.md 文件;输入:技能需求描述;产出:完整 SKILL.md;禁止:写模糊触发条件或非原子步骤
    version: "1.0.0"
    triggers:
      - "写.*skill|创建.*技能|author.*skill"
      - "SKILL.md 怎么写"
    steps:
      1. 从需求描述中提取:触发场景、输入类型、期望输出、禁止行为
      2. 写 name(kebab-case)和 description(触发/输入/输出/禁止各一句)
      3. 写 triggers(每个正则覆盖一种说法,至少 2 个)
      4. 拆分 steps:每步一个原子动作,写明 action/input/output
      5. 写 constraints:全部用否定形式("禁止X" 不写 "尽量不X")
      6. 写至少 1 个 example(含 input 和 expected_output)
      7. 写 output_format(type: json 时附 schema 说明)
      8. 检查 triggers 是否与现有 SKILL 重叠(重叠时修改更精确)
      9. 检查每个 step 是否可独立验证(无法验证则进一步拆分)
      10. 设置 version: "1.0.0",破坏性变更时升 major
      11. 在 CI 中用 yamllint 校验 front matter 格式
      12. 提交时同步更新引用该 SKILL 的上层规则文件
    constraints:
      - 禁止写 "尽量"、"可以考虑"、"建议" 等模糊措辞
      - 禁止在 steps 中写多个动作合并为一步
      - 示例中禁止使用真实密钥或生产数据

    返回技能库 更多技能入口