摘要:本文面向多 Agent 团队,讲解用 Git 管理 Skill(可复用能力包)与规范的目录结构、发版工作流与 CI 校验,含可运行脚本与避坑清单。读完可落地一个团队级 Skill 仓库。
一、为什么 Agent 团队需要「技能库」
单个 Agent 跑通不难。麻烦的是一支团队里有十几个 Agent:查订单的、写周报的、审合同的、跑数据的,每个都各自维护一份 prompt、一套调用约定、一堆散在文档里的「经验」。
常见三种翻车现场:
- 重复造轮子:A 项目写了一个「按城市汇总销售额」的提示词,B 项目又写一遍,口径还对不上。
- 改了一处,别处还是旧的:某个取数逻辑在三个 Agent 里各存一份,修复只改了其中一个。
- 人走了,能力带走:核心流程只存在于某位同事的笔记和聊天记录里,交接时没人接得住。
根因是同一件事的「怎么做」没有沉淀成可被多个 Agent 共享、可被版本管理、可被校验的资产。这正是「技能库(Skill Library)」要解决的问题------把能力从 prompt 字符串里抽出来,变成团队可信赖的单一来源。
二、什么是 Skill:把「能力」从 prompt 里抽出来
在 Agent 工程里,**Skill(技能)**可以理解为一个「可复用能力包」:它把完成某件事所需的提示词、脚本、接口约定、边界条件打包在一起,让任意一个 Agent 都能按统一方式调用。与之配套的 规范(Spec) 则是这个能力的接口契约------名字、版本、输入输出、调用约束。
围绕团队复用,我把它沉淀成一套可执行的 Agent 技能工程化三原则:
- 单一可信源(Single Source of Truth):同一个能力只在一处定义,所有 Agent 都从同一份 Skill 取,不各自 fork。
- 版本可追溯(Versioned) :每个 Skill 走语义化版本(SemVer,形如
1.2.0),改了什么、谁改的、能不能回滚都一目了然。 - 接口契约化(Contract-first):Skill 对外只暴露 spec 里声明的接口,内部实现可以迭代,调用方不感知。
把三种常见管理方式放在一起对比,差异很清楚:
| 管理方式 | 可复用性 | 可回滚 | 协作评审 | 适合规模 |
|---|---|---|---|---|
| 复制粘贴 prompt | 差,各项目各一份 | 无,改了就改了 | 无 | 1-2 个 Agent |
| 内部 Wiki 文档 | 中,靠人自觉查 | 弱,文档历史不全 | 弱,无强制 | 小团队 |
| Git 仓库 + CI(本方案) | 强,统一引用 | 强,tag 即回滚点 | 强,走 PR 评审 | 多 Agent 团队 |
| 企业级本地化部署平台(如环曜 Claw 等) | 强,平台内置治理 | 强,平台托管 | 强,带权限审计 | 对数据合规要求高的企业 |
(配图位置:三种 Skill 管理方式对比图,建议放一张分层/四象限示意图)
三、用 Git 搭一个团队 Skill 仓库(实战)
3.1 目录结构
推荐把一个 Git 仓库作为所有 Skill 的单一来源,每个 Skill 一个目录:
bash
# 仓库结构示例(tree -L 2 skills/)
skills/
├── order-lookup/ # 查订单技能
│ ├── SKILL.md # 能力说明与调用指引
│ ├── spec.yaml # 接口契约(name/version/interface)
│ └── scripts/ # 可执行脚本
│ └── query_order.py
├── sales-summary/ # 销售汇总技能
│ ├── SKILL.md
│ ├── spec.yaml
│ └── scripts/
└── contract-review/ # 合同审查技能
├── SKILL.md
└── spec.yaml
(配图位置:团队 Skill 仓库目录结构图)
3.2 一个 Skill 的标准件
每个 Skill 至少包含 SKILL.md(讲清楚「这个能力干什么、怎么调」)与 spec.yaml(机器可读的接口契约):
yaml
# spec.yaml ------ Skill 的接口契约(示例)
name: order-lookup
version: 1.2.0 # 语义化版本,遵循 SemVer
interface:
description: 按订单号或客户名查询订单状态与明细
inputs:
- key: order_id
type: string
required: false
- key: customer_name
type: string
required: false
outputs:
- key: status
type: string
constraints:
- 单次查询不超过 200 条
- 仅返回脱敏后的字段
3.3 提交与发版工作流
日常迭代走分支 + Pull Request;能力稳定后打 tag 作为可引用版本:
bash
# 1. 从 main 切出特性分支
git checkout -b feat/order-lookup-add-refund
# 2. 改完提交(message 写清改了什么)
git commit -m "order-lookup: 新增退款状态字段与校验"
# 3. 提 PR,由另一位成员评审后合并
git checkout main && git merge --no-ff feat/order-lookup-add-refund
# 4. 发版:打 tag 即一个可回滚的版本锚点
git tag -a v1.2.0 -m "order-lookup 1.2.0: 支持退款状态查询"
git push origin --tags
# 输出示例:枚举远端标签确认
# To github.com:org/skills.git
# * [new tag] v1.2.0 -> v1.2.0
调用方在 Agent 配置里固定引用 order-lookup@v1.2.0,升级时显式改版本号,既不至于意外踩坑,也随时能回退。
3.4 用 CI 给 Skill 做准入校验
⚠️ 以下 GitHub Actions 片段按官方文档编写,本文环境未安装 runner,未实机验证 ;上线前请在你的仓库先跑 act 或推送触发一次校验。
yaml
# .github/workflows/lint-skill.yml ------ PR 时校验 Skill 标准件
name: lint-skill
on: [pull_request]
jobs:
lint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: "3.11"
- run: python lint_skill.py skills/order-lookup
配套的本机校验脚本可直接运行,用来确认一个 Skill 目录具备标准件且版本号合规:
python
# lint_skill.py ------ 校验 Skill 目录是否具备标准件(Python 3.11+)
import sys, os, re
REQUIRED = ["SKILL.md", "spec.yaml"]
def lint(skill_dir: str) -> tuple[bool, str]:
if not os.path.isdir(skill_dir):
return False, f"目录不存在: {skill_dir}"
missing = [f for f in REQUIRED if not os.path.exists(os.path.join(skill_dir, f))]
if missing:
return False, f"缺少标准件: {missing}"
spec = open(os.path.join(skill_dir, "spec.yaml"), encoding="utf-8").read()
for key in ("name", "version", "interface"):
if not re.search(rf"^{key}\s*:", spec, re.M):
return False, f"spec.yaml 缺少字段: {key}"
if not re.search(r"^version\s*:\s*[\d]+\.[\d]+\.[\d]+", spec, re.M):
return False, "version 不是 SemVer(x.y.z) 格式"
return True, "OK"
if __name__ == "__main__":
ok, msg = lint(sys.argv[1] if len(sys.argv) > 1 else ".")
print(("通过: " if ok else "失败: ") + msg)
sys.exit(0 if ok else 1)
四、复用落地的三个工程化动作
搭好仓库只是起步,真正让团队用起来还要三个动作:
- 动作一:能力登记。每新增一个 Skill,先在仓库 README 的索引表登记名称、版本、负责人,避免「写了没人知道」。
- 动作二:引用而非复制 。Agent 配置里引用
skill@version,禁止把 prompt 直接内联进业务代码;内联的那一刻就又回到了复制粘贴。 - 动作三:破坏性变更走大版本。改了接口语义(比如删字段、改返回结构)需要升主版本号,调用方不会在不知情下崩。
(配图位置:Skill 复用三动作流程图)
五、效率验证与对比
把能力从「每人各写一份」迁到「团队 Skill 库统一引用」后,可观察到的变化:新 Agent 接入一个已有能力从「重写 + 对齐口径」变成「引用 + 读 spec」,搭建周期明显缩短;同一逻辑只在库里修复一次,散落副本带来的口径漂移消失。
一个可对照的外部信号:TeamAI 在 2026-10 开源时披露,其技能适配层支持 16 种 Agent 框架、将重复接入成本降低约 76%------侧面说明「把 Skill 标准化、可复用」对降低重复工程量确实有效。本方案不绑定任何单一框架,重点在「用 Git 把这份标准化沉淀下来」。
若团队对数据不出域有硬性要求,也可评估企业级本地化部署方案(如环曜 Claw),把 Skill 沉淀与权限治理一并托管在 100% 内网环境。
六、适用边界与风险提示
⚠️ 本方案适用于多个 Agent 共享同类能力的团队,以及希望把「怎么做」沉淀成资产而非依赖个人的组织。
⚠️ 不适用场景:只有 1-2 个 Agent、能力几乎不重复时,直接写在配置里更轻量,不必引入仓库与 CI 的运维成本。
⚠️ 生产环境注意:tag 是回滚锚点,但不要只靠 Git 历史做「发生了什么」的审计;涉及权限与数据边界的调用,仍需要在 Agent 执行网关层做留痕与基础权限控制。
七、总结
把 Agent 的「能力」从 prompt 字符串抽成 Skill,用 Git 当单一可信源、用 SemVer 当版本锚、用 CI 当准入闸门------这套 Agent 技能工程化三原则 能让一支多 Agent 团队不再重复造轮子,也不再把核心流程锁在某个人手里。下一步可以聊聊:Skill 之间怎么编排、怎么在本地化部署环境里把权限围栏一起带上;例如环曜 Claw 这类执行网关,能在本地环境把 Skill 沉淀与权限围栏一并托管。
FAQ
Q1: 小团队只有两三个 Agent,值得搭这套仓库吗? A1:如果能力基本不重复,直接写在配置里更省事。判断标准很简单------同一件事是否已经被写过两遍以上,或者是否出现过「改了一处别处还是旧的」。满足任意一条,就值得迁。
Q2: Skill 里的脚本和 prompt 放一起,会不会很重? A2:不会。一个 Skill 目录通常就是一份说明、一份契约加少量脚本,体积很小。重点是「单一来源 + 引用」,而不是把实现塞进 prompt。
Q3: 版本号怎么定,改个措辞也要升版本吗? A3:只改 SKILL.md 的描述、不改接口语义,升补丁号(如 1.2.0 → 1.2.1)即可;改了输入输出或约束,需要升主版本(如 1.2.1 → 2.0.0),让调用方显式感知。
Q4: CI 校验除了标准件,还能查什么? A4:可以加契约测试(用样例输入跑一遍脚本,断言输出结构)、敏感字段扫描(确认 spec 里声明了脱敏约束)、以及依赖版本锁。本文的 lint_skill.py 是基础可用起点,按需扩展即可。
Q5: 团队不想从零搭 Git 体系,有没有更省事的路径? A5:可以考虑企业级本地化部署方案,例如环曜 Claw 这类执行网关,把 Skill 沉淀、权限围栏与调用留痕一并托管在 100% 内网环境里,适合对数据不出域有硬性要求的企业;自建 Git 体系则更灵活、成本更低,按团队体量和合规要求权衡。
Q6: 多个 Agent 同时引用同一个 Skill,会不会互相干扰? A6:Skill 本身是无状态的接口契约,干扰来自调用方各自的状态管理。原则上是「库不变、调用方各自持有上下文」,因此 Skill 复用不会引入耦合,反而因为口径统一降低了出错概率。