ClawHub 同步检查(工作流第5步)
核心规则:仅当项目目录下存在
skills/skill-publish-sync/时才执行——不存在则静默跳过,不输出任何提示。
⚠️ 能力边界披露:本步骤会把技能发布到 ClawHub/SkillHub 外部平台,并可能修改
sync-allowlist.yaml与sync-records.yaml。这些动作超出"仅提交"职责,每一步都必须获得用户显式确认(下方y/n/s选择);用户未确认时一律不执行发布或文件修改。详细披露见 SKILL.md「所需权限与能力边界」。
完成 Git 提交后,执行以下检查。
触发条件
完成提交后,依次执行以下三类检测。任一命中即提示用户是否同步。
检测 A:已有技能版本升级
全部满足时触发:
本地存在 skill-publish-sync 技能
- 检查
skills/skill-publish-sync/目录是否存在 - 不存在则静默跳过,不提示用户
- 检查
提交涉及 skills 目录
- 提交的文件中包含
skills/<skill-name>/下的文件
- 提交的文件中包含
版本号有更新
- 读取
skills/<skill-name>/SKILL.md的 frontmatter 中的version字段 - 比较
skills/skill-publish-sync/config/sync-records.yaml中records.<skill>.platforms.<platform>.version记录的版本(按目标平台读取:ClawHub 读platforms.clawhub.version,SkillHub 读platforms.skillhub.version) - 如果新版本 > 已记录版本(或记录中无版本),则需要同步
- 读取
在白名单中
- 检查
skills/skill-publish-sync/config/sync-allowlist.yaml - skill 必须在白名单中(未被
#注释),且其platforms数组包含目标平台
- 检查
检测 B:新增技能首次同步
当提交新增了 skills/<skill-name>/ 目录时触发:
识别新增技能:检查提交中是否有
skills/<skill-name>/SKILL.md为新文件(untracked → committed)读取许可证:读取新技能
SKILL.mdfrontmatter 中的license字段- MIT → 可发布到 ClawHub 和 SkillHub 两个平台
- CC-BY-NC 等限制性许可证 → 仅可发布到 SkillHub(ClawHub 强制 MIT-0,冲突)
未在白名单中:
sync-allowlist.yaml中无此 skill 的条目(无论是否被注释)未在同步记录中:
sync-records.yaml中无此 skill 的条目
满足全部条件时,向用户提示:
🆕 发现新增技能:<skill-name>(license: <MIT|CC-BY-NC>)
该技能尚未加入同步白名单。是否将其加入白名单并同步?
可选平台:<clawhub+skillhub(MIT)/ skillhub(CC-BY-NC)>
选项:
y - 加入白名单并同步
n - 跳过,暂不发布
s - 加入白名单但暂不同步用户选择 y 时:
- 在
sync-allowlist.yaml中添加该 skill,按许可证设置platforms(MIT →[clawhub, skillhub];CC-BY-NC →[skillhub]) - 执行 prepare-publish → publish → 更新 sync-records 流程(按平台分别执行)
- 注意:发布前检查临时目录,确保不含
.env、密钥等敏感文件
用户选择 s 时:
- 仅在
sync-allowlist.yaml中添加该 skill(被注释),下次版本更新时再同步
检测 C:白名单新增但未同步
当白名单中有未被注释的 skill,但 sync-records.yaml 中没有对应记录时:
- 遍历
sync-allowlist.yaml中未被注释的 skill - 检查
sync-records.yaml中是否有该 skill 的记录 - 如果白名单有但记录中没有,且
SKILL.md存在,提示用户执行首次同步
执行步骤
对于每个需要同步的 skill,按照 skill-publish-sync 的"单个 Skill 同步工作流"执行。按目标平台分别处理:
步骤 1:准备发布目录
# ClawHub(默认平台,可省略 --platform)
bash skills/skill-publish-sync/scripts/prepare-publish.sh skills/<skill-name>
# 腾讯 SkillHub
bash skills/skill-publish-sync/scripts/prepare-publish.sh --platform skillhub skills/<skill-name>步骤 2:执行发布
ClawHub(使用 publish 命令):
clawhub publish /tmp/clawhub-publish-<skill-name> \
--slug <skill-name> \
--name "<Display Name>" \
--version "<新版本号>" \
--changelog "<变更说明>"⚠️ 必须指定 --slug 和 --name
- 临时目录名可能包含前缀,使用
--slug确保正确的 skill 标识符- 使用
--name确保 ClawHub 上显示正确的名称
为什么用
publish而不是sync?
clawhub sync会扫描所有目录的 skills,可能遇到 slug 冲突clawhub publish <path>只发布指定路径的单个 skill,更精确
腾讯 SkillHub(使用 publish 命令):
skillhub publish /tmp/skillhub-publish-<skill-name> \
--version "<新版本号>" \
--changelog "<变更说明>"腾讯 SkillHub 用
slug+displayName(SKILL.md frontmatter)标识 skill,namespace 绑定在账号上(发布时无需命令行指定)。建议先--dry-run预检:skillhub publish <path> --dry-run。确认 SKILL.md frontmatter 含slug/version/displayName三必填字段,否则预检报错。
步骤 3:更新同步记录
更新 skills/skill-publish-sync/config/sync-records.yaml,在对应平台 platforms.<platform> 下写入:
- 更新
version为新版本号 - 更新
last_sync为当前时间 - 更新
git_hash为当前 commit hash - 更新
status为synced - 添加
url和publish_id(从命令输出获取)
失败处理
- 同步失败时仅显示警告信息
- 不影响 Git 提交结果
- 继续处理其他 skills
版本比较逻辑
new_version = SKILL.md frontmatter 中的 version(如 "1.2.0")
recorded_version = sync-records.yaml 中 records.<skill>.platforms.<platform>.version(如 "1.1.0")
if new_version > recorded_version:
执行同步(针对该平台)版本号按语义化版本规则比较(major.minor.patch)。两个平台独立比较、独立同步。
示例场景
| 场景 | 版本变化 | 白名单 platforms | 同步记录 | 结果 |
|---|---|---|---|---|
| 版本升级(检测A) | "1.0.0" → "1.1.0" | 含目标平台 | 有记录 | ✅ 执行同步(该平台) |
| 无版本变化(检测A) | "1.1.0" → "1.1.0" | 含目标平台 | 有记录 | ❌ 跳过 |
| platforms 不含目标平台(检测A) | 任意 | 不含 | - | ❌ 跳过该平台 |
| 被注释(检测A) | 任意 | 被注释 | - | ❌ 跳过 |
| 白名单内首次发布(检测A/C) | "1.0.0" | 含目标平台 | 无记录 | ✅ 执行同步 |
| 新增 MIT 技能(检测B) | "0.1.0" | 无条目 | 无记录 | ✅ 提示用户选择(clawhub+skillhub) |
| 新增 CC-BY-NC 技能(检测B) | "0.1.0" | 无条目 | 无记录 | ✅ 提示用户选择(仅 skillhub) |
| skill-publish-sync 不存在 | - | - | - | ❌ 静默跳过整个工作流 |