[Claude Code] Skill/插件开发实践:设计、分发与维护

Claude Code 的 skill 机制将工作流知识按需注入上下文,解决了 CLAUDE.md 全量加载与低频流程常驻的矛盾。本文以 claude-skills 仓库(maestro 与 dataflow 两个插件)为案例,介绍 skill 从项目内工作流到 marketplace 分发的完整实践:机制基础、skill 分类、插件化设计、hook 注入、版本管理、评估驱动迭代与踩坑记录。

仓库地址:https://github.com/zjykzj/claude-skills

一、背景与动机

Claude Code 的 CLAUDE.md 由系统每次会话全量加载。当项目工作流(commit 规范、发布流程、spec 维护方法)沉淀进 CLAUDE.md 后,产生两类问题:

  • 上下文占用:低频流程常驻上下文,稀释注意力
  • 跨工程不可复用:工作流知识绑定在单个仓库,新工程需要复制,更新需要多处同步

skill 机制解决这两个问题:将工作流知识打包为独立指令集,由 description 触发、按需加载(渐进式披露),并通过插件在工程间分发。

官方文档覆盖 skill 格式与插件结构,但工程实践——分发、版本、维护、质量迭代——需要自行探索。本文以 claude-skills 仓库为案例,记录 skill 从项目内工作流到 marketplace 分发的完整实践。

二、Skill 机制基础

2.1 SKILL.md 结构

1
2
3
4
5
6
7
---
name: spec
description: (触发条件描述)
allowed-tools: Bash, Read, Write, Edit, Glob, Grep
---

正文:TL;DR + 分阶段流程 + 引用文件
  • description 是触发入口:模型依据 description 判断是否加载 skill。需要覆盖问题型请求(询问工作流、格式、分类),而不只是动作型请求(执行修改)
  • 渐进式披露:元数据 → SKILL.md 正文 → references/ 按需加载。正文保持精简,细节下沉到引用文件

2.2 插件命名空间

skill 通过插件分发,以 plugin:skill 形式调用(如 /maestro:spec)。插件是安装与启用的粒度单位,通过 marketplace 注册分发。

安装(一次性,每台机器):

1
2
claude plugin marketplace add zjykzj/claude-skills
claude plugin install maestro@claude-skills

2.3 仓库结构

1
2
3
4
5
6
7
8
9
10
claude-skills/
├── .claude-plugin/
│ └── marketplace.json # Marketplace 目录(每插件一条)
└── plugins/
├── maestro/ # 插件:开发工作流类
│ ├── plugin.json # Manifest(name = 命名空间前缀)
│ ├── skills/ # spec / commit / release / claude
│ └── hooks/ # PreToolUse hook 配置
└── dataflow/ # 插件:知识参考类
└── skills/dataflow-cv/

三、Skill 分类

实践中的 skill 可分为三类,分类决定设计取向:

类型 特征 读者 示例
工作流类 步骤化流程、强制清单 开发者 /maestro:commit/maestro:release/maestro:spec
作者辅助类 指导另一份文档的编写 开发者 /maestro:claude
知识参考类 参考手册式、含版本检查 库使用者 /dataflow:dataflow-cv
  • 工作流类以步骤与检查清单为主,目标是流程执行的确定性
  • 作者辅助类定义文档的编写规范(如 CLAUDE.md 的结构、开发命令文档化方式)
  • 知识参考类以命令树、API 参考与 gotchas 为主,并在执行前做版本检查:/dataflow:dataflow-cv 首先校验 dataflow-cv>=2.0.0,版本不符时降级为警告模式(逐项用 --help 复核后继续)

四、插件化设计

4.1 从项目内 Skill 到插件

项目内 skill 存在跨工程复制与更新同步问题。插件化后,skill 更新通过版本升级分发,用户执行 /plugin update 获取。

4.2 设计原则:可选,而非必需

插件对工程是可选加速器,分三种状态:

  • 无插件:工程规则自足(CLAUDE.md 不依赖外部 skill),无 hook、无报错
  • 有插件、工程未配置:skill 首次使用时检测缺失的 {{VARIABLE}} 定义,自动向 CLAUDE.md 追加配置块(bootstrap 自配置)
  • 两者齐备:hook + skill 完整工作流

4.3 Bootstrap 自配置

skill 中的 placeholder 变量({{AI_MODEL_NAME}}{{REPO_URL}} 等)在首次使用时从工程 CLAUDE.md 读取;缺失时 skill 自动生成配置块写入。职责划分:skill 定义「怎么做」,CLAUDE.md 定义「用什么参数做」。

五、Hook:插件内的事件驱动注入

skill 由 Agent 主动调用,存在「不调用」的失败模式。hook 补足时机保证:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
{
"hooks": {
"PreToolUse": [
{
"matcher": "Edit|Write",
"hooks": [
{
"type": "command",
"command": "\"${CLAUDE_PLUGIN_ROOT}\"/skills/spec/scripts/sdd-reminder.sh"
}
]
}
]
}
}

实现要点:

  • matcher:匹配工具类型(Edit|Write),脚本内进一步判断目标是否属于 specs/
  • 路径解析${CLAUDE_PLUGIN_ROOT} 由插件系统注入,避免工程侧配置 hook 路径
  • 可执行位:hook 脚本被直接执行(不经 sh),缺少 +x 会导致 Permission denied 并阻断工具调用——脚本需以可执行位提交

六、版本与发布

6.1 Per-plugin 版本化

仓库无 repo 级版本,各插件独立版本序列:maestro 独立演进;dataflow 镜像其文档对象的版本(dataflow-cv)。

  • CHANGELOG 头部为 plugin-scoped:## [<plugin>-X.Y.Z]
  • tag 格式:<plugin>--vX.Y.Z(工具原生格式 {name}--v{version}
  • GitHub Release 按插件发布

6.2 安装与更新机制

  • 安装解析 plugin@marketplace:快照 marketplace 仓库默认分支 HEAD commit;GitHub Releases 与 tag 不参与分发
  • 更新门控:plugin.json 的 version 决定是否推送更新——skill 内容变更必须伴随版本号升级,否则用户无法获取
  • 热加载规则:SKILL.md 变更热加载;hooks/ 与 plugin.json 变更需 /reload-plugins

七、评估驱动的 Skill 迭代

skill 质量迭代采用官方 skill-creator 的评估方法:为每个 skill 准备触发查询评测集,量化 description 的召回。

实践数据(每 skill 20 条查询的 should-trigger recall):

Skill 优化前 优化后
spec 66% 96%
commit 45% 100%
release 85% 100%
claude 100% 100%(未改动)

核心改进:description 覆盖问题型请求(询问工作流、格式、分类),而非仅动作型请求。

行为评测采用 dual-run 基线:同一任务分别在有/无 skill 的会话中执行,对比输出质量。

八、踩坑记录

  1. 插件命名冲突:初始命名 workflow 与社区插件撞名,改为 maestro。命名空间前缀随之变更,已安装用户需卸载重装
  2. description 的 YAML 解析错误:description 中 (v2.0.0+) 后的 : 被 YAML 解析为 mapping 分隔符,导致 frontmatter 渲染失败。改为 em dash
  3. hook 脚本可执行位:见第五节。缺 +x 时 Permission denied 阻断 Edit/Write 工具调用
  4. marketplace 目录与 manifest 不同步:移除 skill 后目录描述未同步更新。marketplace.json 的 skill 列表需与插件 manifest 保持一致

九、适用边界与维护成本

适合做成 skill:高频重复流程、强步骤约束的工作流、稳定的知识参考(API/CLI 手册)。

不适合:一次性任务;工程特有细节(留在 CLAUDE.md)。

维护成本

  • skill 是活文档,需随工作流演进更新
  • 跨工程联动:skill 描述的外部 API 变更时需同步版本要求(如 dataflow 插件的 post-release checklist)
  • 版本纪律:内容变更必须伴随版本升级,否则用户无法获取更新