关于 skillpack-harvest
skillpack-harvest 是一项将成熟 Agent 技能从宿主仓库复制到 gbrain 的编辑流程,面向希望把已验证模式纳入共享技能包的维护者。它要求先通用化内容并预览文件,再执行隐私检查、验证和人工审阅。
主要功能
- 01将单项技能复制到 gbrain
- 02执行通用化与隐私检查流程
- 03支持预览待复制文件
- 04验证技能规范及软件包状态
- 05保留宿主仓库中的原始文件
适用场景
- 01将生产中验证过的技能纳入 gbrain
- 02清理分支专属名称和私有信息
- 03审阅并提交新的技能包内容
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ garrytan/ gbrain --skill skillpack-harvest安装后在 Claude Code 中输入/skillpack-harvest确认已加载。
附带文件routing-eval.jsonl
详细介绍
skillpack-harvest — 将宿主技能提升到 gbrain 的编辑工作流
约定: 文件放置规则见 _brain-filing-rules.md。本技能写入的是 gbrain 自身的目录树,而不是 brain 仓库的笔记。
本技能是 gbrain skillpack scaffold 的逆向操作。Scaffold 将技能下发到下游(gbrain → 宿主),Harvest 则将经过验证的模式上传到上游(宿主 → gbrain),使其成为其他所有客户端都可以 scaffold 的参考。
合约
当满足以下条件时,一次 harvest 才算“完整完成”:
- 宿主技能已经成熟(在生产环境中使用过,近期的路由评估用例全部通过)。
- Phase 3 的编辑式通用化已经清除了所有分支特有的引用(名称、真实实体、内部频道)。
gbrain skillpack harvest --dry-run已预览过文件集合。- 真正的
gbrain skillpack harvest <slug> --from <host>已成功执行,状态为status: harvested(没有隐私检查命中)。 - 新的
skills/<slug>/SKILL.md通过了bun test test/skills-conformance.test.ts。 - 用户已审阅 gbrain 中的差异,并明确批准提交。
如果其中任何一项未完成,则该技能尚未 harvest:文件可能仍留在 gbrain 的工作树中,但并未正式落地。
输出格式
本技能会在 gbrain 的工作树中生成三类产物:
skills/<harvested-slug>/SKILL.md(以及任何同级文件,例如routing-eval.jsonl)- 位于镜像路径上的配对源文件(例如
src/commands/<slug>.ts),前提是宿主 SKILL.md 在 frontmatter 的sources:中声明了它们 - 更新后的
openclaw.plugin.json,其中新 slug 已添加到skills:中(并排序)
返回给用户的会话输出是一行成功摘要,加上已写入文件的列表。JSON 模式(--json)会返回完整的 HarvestResult 结构,供机器读取。
失败时如何处理
对于任何 gbrain 错误 code、退出码、[AGENT] 块或提示块,请遵循 agent 操作协议。针对本技能的具体情况:
lint_failed:隐私检查器发现了真实姓名或私密细节;返回 Phase 3,用占位符替换它们(alice-example、acme-example、fund-a)。- harvest 之后
gbrain skillpack check --strict报告漂移:重新生成 bundle 并再次运行;永远不要发布存在漂移的 skillpack。
反模式
- 跳过 dry-run。 务必先预览。文件会落到 gbrain 的工作树中;清理只需一次
git checkout,但你本不应该需要它。 - 只信任检查器。 默认正则集能覆盖常见情况,但无法覆盖所有专有名词。Phase 3(编辑通过)是主要防线。
- 无正当理由就使用
--no-lint进行 harvest。 检查存在是有原因的。如果绕过它,请在提交信息中说明原因。 - harvest 仍在变动中的技能。 等待宿主版本稳定。否则你会先 harvest、再重新 harvest、再重新 harvest,这只会让 gbrain 的 bundle 反复变动,毫无益处。
- 移动文件而非复制。 Harvest 是复制操作。宿主仍保留其技能。harvest 之后不要对源文件执行
rm -rf。 - 批量 harvest(一次多个技能)。 不受支持,原因充分:每个技能的编辑审阅都是实实在在的工作。
何时调用
- 用户在其宿主分支(你的 OpenClaw 或任何私有下游分支)中开发了一个技能,并希望其他 gbrain 客户端也能使用它
- 某个技能已在生产中证明了自身价值,并准备好进行通用化
- 用户明确要求将技能“harvest”或“发布”到上游
以下情况不要调用:
- 技能在本地仍在变动中,应先让其稳定
- 技能引用了无法通用化的私有内容
- 用户只想分享一份一次性草稿(应改用 gist)
前置条件
运行此 skill 之前,请确认:
-
该 skill 已经成熟。 近期的
routing-eval.jsonl用例均能通过;该 skill 已在生产环境中至少使用过几次。 -
该 skill 具有通用性。 在脑中做一次去特定化测试:把每个 fork 专属名称都替换掉,它作为 skill 是否依然成立?
-
用户拥有 gbrain 检出副本。 收割操作会写入 gbrain 的工作树,由用户审阅并提交。不要把内容收割到用户并不打算从中提交的检出副本里。
工作流程
阶段 1 — 规划
询问用户:
- 收割得到的 skill 应使用什么 slug?(slug 必须为 kebab-case,并且在 gbrain 包中全局唯一。)
- 源宿主仓库是哪一个?(应为仓库根目录的路径,而不是 skill 目录的路径,例如
~/git/agent-fork,而非~/git/agent-fork/skills/foo。) - 配对的源文件是否需要一并带上?(检查宿主 SKILL.md 前置元数据中的
sources:数组。)
阶段 2 — 试运行与隐私检查预览
使用 --dry-run 运行 CLI:
gbrain skillpack harvest <slug> --from <host-repo-root> --dry-run
输出内容包括:
- 哪些文件会被写入 gbrain 的目录树
- 是否包含配对的源文件
- (隐含)skill 前置元数据中的触发条件——请阅读并检查它们是否具有通用性
不要跳过试运行。隐私检查器只会在真正的收割时运行,但试运行预览可以让你在文件落地之前查看它们。请抽查 SKILL.md 以及任何配对源文件,查找隐私检查器可能漏掉的内容(专有名词、内部项目名称等)。
阶段 3 — 通用化检查清单(编辑审阅步骤)
在运行真正的收割之前,逐一检查宿主 skills/<slug>/ 下的文件,并应用此清单。如果有任何匹配项,请先编辑宿主文件,然后再运行收割。
-
fork 专属名称 → 通用表述
<personal-fork-name>→your OpenClaw(或OpenClaw deployment);用户私人 Agent 的任何昵称都做同样处理- 个人的名字(如
garry、jane等)→the user/you/ 通用占位词
-
真实实体 → 占位符
- 真实的人物、公司、交易、基金 → 占位 slug(
alice-example、acme-example、fund-a等) - 电子邮件地址 → 整体删除,或使用
[email protected] - 内部 Slack 频道 →
#some-channel或直接删除 - 具体的工单系统 ID / Linear 工单编号 → 删除
- 真实的人物、公司、交易、基金 → 占位 slug(
-
fork 专属约定 → 引用
- 提及
<host-repo>/docs/...文件的内容 → 要么将该文档纳入 gbrain,要么替换为通用的占位说明 - 提及
<host-repo>/skills/<other-fork-only-skill>→ 要么决定一并收割该 skill,要么替换为通用模式的引用
- 提及
-
triggers 数组具有通用性
- 逐条阅读前置元数据中的
triggers:。其中不应出现用户姓名、fork 名称或内部工具名称。 - “Have garry sign off on it” → “have the user sign off on it”
- 逐条阅读前置元数据中的
-
routing-eval.jsonl 示例已脱敏
- 打开
skills/<slug>/routing-eval.jsonl。每个intent字段都需要与triggers:做同样的脱敏处理。
- 打开
-
代码注释与日志字符串
- 如果要收割配对的源代码,请逐行检查其中是否存在同样的私有信息泄露。注释是最常见的藏匿位置。
Phase 4 — 正式收割
Phase 3 完成后,运行正式收割:
gbrain skillpack harvest <slug> --from <host-repo-root>
默认行为:
- 文件复制时进行路径限制与符号链接拒绝
- 隐私检查器会针对
~/.gbrain/harvest-private-patterns.txt运行 (以及内置默认规则:规范的私有分支名称、电子邮件地址、Slack 频道;参见src/core/skillpack/harvest-lint.ts) - 一旦命中任何匹配 → 回滚(删除已收割的文件)并以非零状态退出
openclaw.plugin.json会被更新,按排序加入该 slug
结果:
harvested—— 成功,清单已更新,文件位于 gbrain 目录树中lint_failed—— 隐私检查器发现了问题。返回 Phase 3,清理宿主文件后重试。slug_collision—— gbrain 中已存在该 slug 的技能。可以改用其他 slug,或者如果确实要替换,传入--overwrite-local。
Phase 5 — 在 gbrain 中验证
成功收割后:
bun test test/skills-conformance.test.ts—— 确认新的 SKILL.md 符合 frontmatter 约定。gbrain skillpack check --strict—— 确认捆绑包与 gbrain 自身检出目录之间没有偏差。gbrain skillpack list—— 确认该 slug 出现在捆绑包中。- 检查差异:
cd <gbrainRoot> && git diff -- skills/<slug>/ - 在 gbrain 中提交新增内容(不要提交宿主仓库中残留的任何文件,收割是复制,不是移动)。
Phase 6 — 下游公告(可选)
如果其他 gbrain 客户端应当获取新技能:
- 在下一个版本的
CHANGELOG.md中,于 "Skills added" 下记录此变更 - 如果该技能来自核心团队之外的人,在 PR 中 @ 对方用户或贡献者
绕过:--no-lint
隐私检查器是安全网,编辑审校才是主要防线。如果你已彻底完成 Phase 3,而检查器仍对误报触发,可使用 --no-lint:
gbrain skillpack harvest <slug> --from <host-repo-root> --no-lint
请在提交信息中记录绕过原因。 未来的维护者应当能看出为何绕过了检查(例如"该分支名称出现在引用中,并非真实指代,已人工核实")。
切勿随意绕过检查器。默认开启检查的全部意义在于:真实名称偶尔会漏过编辑审校。
收割不会做的事
- 它不会移动文件(而是复制)。宿主的
skills/<slug>/保持原位。 - 它不会自动清除名称。编辑审校由人工完成。
- 它不会发布到 npm 或远程捆绑包。它写入 gbrain 的工作树;用户通过常规 gbrain 发布流程提交并发布。
- 它不支持
--all(不做批量收割)。每次一个技能,才能让编辑审阅保持可控。
本技能涉及的文件
- gbrain 的
skills/<slug>/—— 宿主技能目录中的每个文件(复制) - 已声明配对源的 gbrain 镜像路径
(例如宿主 SKILL.md 在 frontmatter 中声明了
src/commands/<slug>.ts时) - gbrain 的
openclaw.plugin.json—— 将 slug 按字母顺序加入skills:数组,且不删除id、configSchema、contracts等 OpenClaw 原生插件字段