如何将现有技能从 Hermes Agent 移植到 OpenCode
如何将 Hermes Agent 的技能移植到 OpenCode
除了从零编写技能,你还可以直接移植现成的。移植的好处在于,那些逻辑已经过实战检验、足够可靠——你只需保留技能主体,只调整 OpenCode 需要的那部分。本仓库中的 custom-infographic 技能(位于 .opencode/skills/custom-infographic/,原名为 baoyu-infographic)就是一个现成的例子,它从 JimLiu/baoyu-skills v1.56.1 移植而来,中间经过了 Hermes Agent ⚕ 的转换。
1. 了解两种格式
Hermes Agent ⚕ 技能和 OpenCode 技能在结构上其实是同一种东西:一个带 frontmatter(前置元数据)的 SKILL.md 文件,旁边还可以放 references/ 和 scripts/ 文件夹。目录布局完全一致,所以移植的工作量主要就是改 frontmatter 加快速测试。
真正的区别在于 frontmatter。一个典型的 Hermes ⚕ 技能长这样:
---
name: some-skill
description: What it does
license: MIT
---
OpenCode 使用相同的 name、description 和 license 字段。另外还有两个可选字段:metadata(标注原作者,发布时很有用)和 compatibility(仅作信息说明——OpenCode 的加载器会忽略它,但它可以记录该技能面向的目标平台):
---
name: some-skill
description: A trigger-friendly description with keywords like "信息图", "visual summary", or "generate a poster"
license: MIT
compatibility: opencode
metadata:
author: Original Author
upstream: https://github.com/author/some-skill
version: 1.0.0
---
2. 复制技能并改写 frontmatter
把技能文件夹复制到 .opencode/skills/(项目级)或 ~/.config/opencode/skills/(用户全局):
cp -r ~/.hermes/skills/some-skill .opencode/skills/
把技能文件夹重命名,避免和原版混淆——比如 baoyu-infographic 改成了 custom-infographic。frontmatter 中的 name 字段要跟文件夹名保持一致。
在 metadata 块中保留原作者的名字,以示尊重。description 和 license 保持原样。再加上 compatibility: opencode(可选,仅作信息说明——OpenCode 会忽略它,但它可以记录该技能面向的目标平台)。
重写 description,让 OpenCode 的技能路由(skill router)能匹配到它:把用户可能会输入的动词和关键词写进去,如果适用的话,中英文都写上。路由匹配的是这段描述文本,而不是文件名——描述写得含糊,技能就永远不会被触发。
加一个元数据块,写上原作者和上游仓库——这是署名的好习惯。OpenCode 的加载器会直接忽略它,但对浏览技能文件夹的人来说很有用,将来发布到 ClawHub 也用得上。
3. 修复路径和依赖
正文内容基本不用改,需要处理的是路径和环境。references/ 和 scripts/ 目录就在 SKILL.md 旁边,只要整个文件夹一起复制(而不是只复制单个文件),references/layouts/bento-grid.md 这类相对引用就能继续正常工作。注意,OpenCode 只从项目工作目录里加载技能——如果原技能引用了仓库之外的路径(比如 ~/.hermes/...),这些引用就会失效。
检查硬编码路径:Hermes 技能可能会假定 ~/.hermes/... 或自己的技能目录存在;OpenCode 的技能是从项目目录运行的,所以应优先使用相对路径或环境变量。还要检查外部依赖:系统命令(which python3)、Python 包、API 密钥。custom-infographic 这个移植示例需要 OPENROUTER_API_KEY 来生成图片——把它配到环境变量里,或者在 SKILL.md 里写清楚。记得给打包的脚本加上执行权限(chmod +x)。
4. 在 OpenCode 里测试
新开一个 OpenCode 会话,让它加载新技能(技能在会话启动时加载,不支持热重载)。用触发词唤起技能干活,比如“做一个关于 X 的信息图”。如果没触发,就把 description 写得更精准一些——路由匹配的就是这段文本。把技能自己的工作流完整跑一遍,根据报错信息逐个修复问题。
就这么简单——移植比从零写要快得多,而且保留了原作者久经测试的行为。custom-infographic 这个移植已经测试过很多次,一直稳定运行,输出结果见 imgs/——一个经过实战检验的移植技能,比从零手写的新技能更可靠。
关于许可证:移植 MIT 许可的技能没有问题,前提是保留原许可证和作者署名。如果你打算把移植版发布到 ClawHub,请在元数据块里保留原作者的姓名——即使许可证允许,去掉署名重新发布也会给用户造成困惑。