Claude Code的工程化落地-skill篇

0 阅读6分钟

Skills

解决 Prompt 不可复用、经验无法沉淀、团队能力难以传承的问题,把个人技巧变成可组合的工程资产,本质上是一种按需加载的认知结构,可操作知识,智能体它通过 description 告诉模型:在什么情况下应该加载这项能力,可人为/智能体 都可触发。

触发模式

同一个 Skill 既可以作为斜杠命令使用,也可以让 Claude 自动判断何时需要。

  • 人工触发:/skill-name
  • 智能体读取:Claude 读取 description, 语意启动后自动加载

设计

导航页 + 详情页

SKILL.md                    ← 导航页:概述 + 引用(< 500 行)
├── reference.md            ← 详情页:具体内容
├── examples.md             ← 详情页:使用示例
└── scripts/make.sh         ← 工具:可执行脚本

内容书写

Skills Frontmatter 字段详解

Frontmatter 是 SKILL.md 顶部的 YAML 块,配置技能怎么运行(权限、触发方式);正文 Markdown 告诉 Claude 做什么

字段一览

字段必需类型说明
name字符串技能标识符,也是 /slash-command 名称,默认取目录名
description推荐字符串告诉 Claude 何时加载此技能,是自动触发的核心依据
disable-model-invocation布尔设为 true 禁止 Claude 自动触发,只能用户手动 /name 调用
user-invocable布尔设为 false 则用户不可调用,只作为 Claude 的背景知识
allowed-tools字符串列表限制技能激活时可使用的工具,形成安全屏障
argument-hint字符串自动补全提示,如 [issue-number]
context字符串设为 fork 时技能在子代理中隔离运行,无主对话上下文
agent字符串context: fork 时指定子代理类型,如 Explore
hooks对象技能级别的生命周期钩子,在特定工具调用前后执行脚本
paths字符串/列表Glob 模式,限制技能仅在匹配文件上自动激活
shell字符串!command`` 块使用的 shell,bash(默认)或 powershell
mode布尔设为 true 标记为"模式命令",修改 Claude 的行为或上下文

所有字段均可选,但强烈建议写 description

description — 技能的灵魂

description 不是给人看的文档,而是给 Claude 看的语义触发器

写作公式:[做什么] + [怎么做] + [什么时候用]

description: 审查代码质量、安全性和最佳实践。检查 bug、性能问题和风格违规。用于用户请求代码审查、希望获得代码反馈、提到审查更改或询问代码质量时。

disable-model-invocation — 控制谁能触发

适用于有副作用的操作(部署、发消息、提交),防止 Claude 自作主张:

disable-model-invocation: true   # 仅用户可通过 /deploy 手动触发

user-invocable — 控制用户可见性

适用于不应作为命令暴露的背景知识(如遗留系统说明):

user-invocable: false   # 用户菜单隐藏,Claude 自动按需加载

allowed-tools — 工具安全屏障

限制技能激活时 Claude 可使用的工具集:

# 只读分析型技能
allowed-tools: Read Grep Glob

# 需要执行命令的部署型技能
allowed-tools: Bash

context: fork — 隔离执行

技能在独立子代理中运行,无法访问主对话历史,适合自包含工作流:

context: fork

agent — 指定子代理类型

context: fork 搭配使用,指定隔离运行时的代理类型:

context: fork
agent: Explore   # 使用 Explore 代理,擅长代码库探索和调研

主代理只收到子代理的摘要结果,保持主上下文窗口精简。

hooks — 技能级生命周期钩子

在技能激活期间,特定工具调用前后自动执行脚本(安全检查、代码格式化等):

hooks:
  PreToolUse:
    - matcher: Bash
      command: ./scripts/security-check.sh
  PostToolUse:
    - matcher: "Write|Edit"
      command: ./scripts/lint-fix.sh

paths — 文件范围限定

限制技能仅在操作匹配的文件时自动激活,避免不相关场景加载:

paths: "src/api/**/*.ts"

# 或多个模式
paths:
  - "src/api/**/*.ts"
  - "src/models/**/*.ts"

完整示例

---
name: code-review
description: 审查代码变更的质量和安全性。用于用户请求审查、提到 review 或询问代码质量时。
disable-model-invocation: false
allowed-tools: Read Grep Glob
---

# Code Review Skill

## 审查步骤
1. 读取变更文件
2. 检查安全漏洞、性能问题
3. 输出审查报告

类型

不同类型的技能在设计上有不同侧重点,以下是主要的两大类型:

参考型: 参考形主要特点如下

---
name: git-commit-guidelines
description: "提供 Git 提交信息规范和示例,适合用于检查提交信息格式、生成标准化提交说明。"
---

# Git Commit Guidelines

一个参考型 Skill,用于给出 Git 提交信息的规范和最佳实践,不要求生成固定输出格式。

## 何时使用

当用户需要:

- "帮我写一条符合规范的提交信息"
- "Git commit message 应该怎么写"
- "提交信息格式规范是什么"
- "检查一下这条提交说明是否合理"

## 参考内容
....
### 提交信息格式
....

  1. 没有执行步骤:不是先做 A 再做 B,而是"遵循这些规范"。
  2. 没有输出模板:不要求 Claude 输出固定格式的报告
  3. 没有设disable-model-invocation(是否禁止智能体自动读取):Claude 可以自动判断何时需要
  4. 只读工具:allowed-tools 限制为 Read/Grep/Glob,限制它为只读

任务型

和参考型 相反需要执行步奏,具体的输出模版,给于足够的执行文件权限。

  • 常规执行任务型 通过/skill-name 触发,或者智能体自动判断触发时机,执行具体的步骤,输出结构化结果。
---
name: repo-refactor
description: 自动执行代码重构、格式化和提交建议。用于用户请求“帮我修复代码风格”、“重构这个模块”或“请生成可执行的修复步骤”时。
disable-model-invocation: true
allowed-tools:
  - Read
  - Grep
  - Bash
---

# Repo Refactor Skill

## 任务说明
1. 阅读变更文件和代码段
2. 自动检查风格/重构问题
3. 生成修复命令或补丁
4. 返回结构化执行结果

## 输出模板
- status: success|failure
- summary: 简要说明
- steps:
  - description: 步骤说明
    command: 具体命令或修复建议
command 类型

command 的目录是 .claude/commands/,本质是带参数的提示词模板,必须由用户通过 /command-name 手动触发,不会被智能体自动执行。

与 Skill 的核心区别:

对比项Skill(SKILL.md)Command(.claude/commands/)
触发方式用户手动 + 智能体自动仅用户手动 /name
有 description是(语义触发器)
有 frontmatter是(完整配置)否(纯 Markdown)
适用场景可复用的认知能力一次性的参数化任务
示例:翻译文件

文件路径:.claude/commands/translate.md

将指定文件翻译为目标语言。

步骤:
1. 读取需要翻译的文件
2. 保持原有格式(Markdown 标记、代码块、链接等不变)
3. 翻译后写入同目录下的新文件,文件名添加语言后缀(如 README.en.md)

目标语言和文件路径:$ARGUMENTS

使用方式:/translate en README.md

skill+command 结合使用

command 虽然能人工执行,我们可以通过hook 的方式去去执行,也可以为单独的skill 配置 command 如:

---
name: api-migration
description:  api/ 下已存在的 App API 函数,并完成返回数据映射适配。
argument-hint: "[接口地址] 要改为的新 App API 接口地址,如 /img/list"
license: MIT
metadata:
  author: libokaifa
  version: "1.0"
hooks:
  PostToolUse:
    - matcher: "Edit|Write"
      hooks:
        - type: command
          command: "test -f .claude/.migration-active && cat .claude/skills/api-migration/review-checklist.md || true"
          timeout: 5000
          statusMessage: "API 迁移代码审查中..."
---
**前置操作**:技能开始时,必须先执行 `touch .claude/.migration-active` 创建标记文件,以激活 PostToolUse 审查 hook。
**最后执行**: `rm -f .claude/.migration-active` 移除标记文件**,关闭

聪明的你发现示例中配置了前置条件和最后执行,因为hook 在 setting.json 的配置

 "hooks": {
    "PostToolUse": [
      {
        "matcher": "Edit|Write",
        "hooks": [
          {
            "type": "command",
            "command": "test -f .claude/.migration-active && cat .claude/skills/api-migration/review-checklist.md || true",
            "timeout": 5000
          }
        ]
      }
    ]
  }

在执行任务型的skill 后都会触发,这里是为了某个command为某一个或多个 skill 服务,通过标记的方式来触发执行单独的执行特定command。当然你也可以单独添加执行步奏在skill内,但这样就做不到command的单一性,可复用性和范围性。

总结

skill 的使用,和代码的封装逻辑类似,对于主Agent 来说,子Agent 是个黑盒执行,只分析结果。 另外还可以跨会话拿上下文,在对应的skill 放置 参数 ${CLAUDE_SESSION_ID} 。

CLAUDE_SESSION_ID: 位置Session ID = UUID v4,对话启动时自动生成, 日志位置 = ~/.claude/projects/{project-hash}/{session-id}.jsonl,子代理日志在同名目录的 subagents/ 下。

同时opus 4.7 已经发布 更擅长跨会话,可不用单独配置 CLAUDE_SESSION_ID

opus 4.7+ 当你和Claude进行跨越多个会话的长期协作时,它能够更好地保持上下文的连续性。这在大型软件开发项目、长期研究任务等场景中非常实用