Coding

skill-publish-sync

Try it

将本地开发的 Skills 同步到 ClawHub、腾讯 SkillHub 与联想开放平台。支持智能 .gitignore 过滤、平台独立白名单、增量与单个 skill 同步。本技能应在用户需要将本地 skills 发布到上述平台、批量同步技能或检查发布状态时使用。

What it does

将本地开发的 Skills 同步到 ClawHub、腾讯 SkillHub 与联想开放平台。支持智能 .gitignore 过滤、平台独立白名单、增量与单个 skill 同步。本技能应在用户需要将本地 skills 发布到上述平台、批量同步技能或检查发布状态时使用。

The skill document

Skill 同步工具(ClawHub + 腾讯 SkillHub)

将本地开发的 Skills 批量同步到三个公开平台:

  • ClawHub — 国际通用 Skills 社区,强制 MIT-0 许可证
  • 腾讯 SkillHub — 专为中国用户优化的 Skills 社区,无许可证限制
  • 联想开放平台 — 面向联想 AI 智能体生态,使用 @lenovo-open/skill-cli (Node.js);无强制许可证

支持读取 .gitignore 智能忽略敏感文件和临时文件。三个平台各自维护独立的 allowlist 列表文件(allowlist-clawhub.yaml / allowlist-skillhub.yaml / allowlist-lenovo.yaml),同一 skill 可在多份文件中独立维护字段(一对多,不强制不重复分发)。

依赖

系统依赖

依赖用途安装方式
rsyncprepare-publish.sh 复制过滤文件到临时发布目录macOS 自带;Linux: sudo apt-get install rsync
gitprepare-publish.shgit ls-files 精确匹配追踪文件macOS 自带;Linux: sudo apt-get install git
Python 3运行腾讯 SkillHub CLI(Python 脚本)macOS 自带;Linux: sudo apt-get install python3
Node.js(≥ 18)+ npm运行联想 lenovoskill CLI(npx @lenovo-open/skill-cli 走 Node.js 运行时)macOS 自带或 brew install node;Linux: sudo apt-get install -y nodejs npm

CLI 工具(按目标平台按需安装)

CLI用途安装命令必需场景
clawhub发布到 ClawHubClawHub 官方文档仅发布 ClawHub 时
skillhub发布到腾讯 SkillHub官方 CLI,skillhub self-upgrade 升级(须 ≥ 2026.7.29)仅发布 SkillHub 时
lenovoskillnpx @lenovo-open/skill-cli上传到联想开放平台npx @lenovo-open/skill-cli (免装,推荐)或 npm i -g @lenovo-open/skill-cli仅上传联想平台时

⚠️ 版本要求(重要)

腾讯 skillhub CLI 必须 ≥ 2026.7.29 才支持 publish/login。早期版本(如 2026.3.18)只有 search/install,不能发布。 运行 skillhub self-upgrade 升级到最新版;不确定时先用 skillhub self-upgrade --check-only 检查是否有新版。

首次安装清单(SkillHub 发布)

# 1. 安装 CLI(macOS/Linux)
curl -fsSL https://skillhub-1388575217.cos.ap-guangzhou.myqcloud.com/install/install.sh | bash

# 2. 升级到支持发布的版本(≥ 2026.7.29)
skillhub self-upgrade

# 3. 验证(应含 publish/login 命令)
skillhub --help

# 4. 登录(token 从 https://skillhub.cn 个人设置获取,skh_ 前缀)
skillhub login --key skh_xxx

# 5. 确认身份
skillhub auth whoami

ClawHub 强制使用 MIT-0 许可证(无需署名,允许商业使用)。 腾讯 SkillHub 无许可证限制,CC-BY-NC / MIT / Apache 等均可发布。

ClawHub 许可证关键条款(来自官方 Skill Format 文档,截至 2026-08 核实):

  • "All skills published on ClawHub are licensed under MIT-0." —— 所有发布即等同 MIT-0。
  • "Anyone may use, modify, and redistribute published skills, including commercially." —— 允许任何人商用。
  • "Attribution is not required." —— 不要求署名。
  • "ClawHub does not support per-skill license overrides." —— 不支持按 skill 覆盖许可证(frontmatter 写 license: CC-BY-NC 平台层面不生效)。
  • "Do not add conflicting license terms in SKILL.md." —— 禁止在 SKILL.md 内加冲突的许可证条款

因此(v1.7.1 三份独立列表架构):

  • 每个平台独立维护自己的 allowlist 文件:ClawHub / SkillHub / 联想各一份
  • MIT 许可证的通用工具 skill → 默认只发 ClawHub(allowlist-clawhub.yaml
  • CC-BY-NC 等限制性许可证的法律类 skill → 默认只发 SkillHub(allowlist-skillhub.yaml,ClawHub MIT-0 冲突不收)
  • 想在 ClawHub / SkillHub 之外额外分发到联想生态的 skill → 在 allowlist-lenovo.yaml 里登记(无许可证限制,可与 SkillHub / ClawHub 重复登记,即同一 skill 跨多份文件是完全允许的)
  • ClawHub slug 被占用、发不了的 → 从 allowlist-clawhub.yaml 移到 allowlist-skillhub.yamlallowlist-lenovo.yaml

三份独立 allowlist 文件,每份独立维护各自平台的 skill 名单与字段;同一 skill 可同时出现在多份文件里(一对多),无需为新平台改动旧 skill 的配置。详见 DECISIONS D-2026-08-12-02

ClawHub 许可证详见 ClawHub Skill Format 官方文档


平台对比

维度ClawHub腾讯 SkillHub联想开放平台
CLI 工具clawhubskillhub(官方 CLI,skillhub self-upgrade 升级;须 ≥ 2026.7.29 才支持 publish/login)lenovoskillnpx @lenovo-open/skill-cli,Node.js 运行时)
登录命令clawhub loginskillhub login --key skh_xxxlenovoskill login(OAuth 浏览器授权)
发布命令clawhub publish --slug --name --version --changelogskillhub publish [--version] [--changelog] [--dry-run]lenovoskill package && lenovoskill push(两步:先打 zip 再传)
skill 标识--slug + --name(命令行传入)slug + displayName(prepare-publish.sh 从 allowlist-skillhub.yaml 注入临时副本;源 SKILL.md 不含)slug + displayName(prepare-publish.sh 从 allowlist-lenovo.yaml 注入临时副本;源 SKILL.md 不含) + 项目内 .skill-config.json
凭证位置clawhub CLI 默认本地 skillhub 配置~/.lenovoskill/auth.json(600,OAuth 双 token:Login Token + Biz Token)+ ~/.lenovoskill/config.json(默认 API)
可见性—(无此概念)—(无此概念)
namespace(绑定账号,发布命令不传,记录用于溯源)(OAuth 双 token,无 namespace 概念)
许可证强制 MIT-0无限制无限制
默认 registry/API内置https://api.skillhub.cnhttps://open.lenovomm.com
官方教程https://skillhub.cn/tutorials#publish-via-clihttps://open.lenovomm.com

前置条件

SKILL.md frontmatter 必需字段

---
name: skill-name
description: 技能描述
version: "1.0.0"  # 推荐但不强制
homepage: https://github.com/cat-xierluo/legal-skills  # 自动设置
---

slug / displayName 不写进 SKILL.md。SkillHub 需要的字段从 config/allowlist-skillhub.yaml 读取;联想开放平台需要的字段从 config/allowlist-lenovo.yaml 读取。每个平台独立白名单,字段独立维护(同一 skill 可同时出现在多份文件里,一对多)。发布前由 prepare-publish.sh--platform skillhub--platform lenovo)自动注入临时副本 frontmatter。源 SKILL.md 只保留 skill 标准字段,平台元数据与 skill 本体解耦。ClawHub 不依赖 frontmatter(用 --slug/--name 命令行参数)。

CLI 安装

CLI 工具的完整安装方式、版本要求,详见本文档开头「依赖」章节。

快速验证已安装:

clawhub --version      # ClawHub
skillhub --help        # SkillHub(确认含 publish/login 命令即为发布版)

使用方式

1. 登录平台(首次使用)

ClawHub

clawhub login

腾讯 SkillHub(使用 API Token,格式 skh_xxx,从 SkillHub 个人设置获取):

# token 从 https://skillhub.cn 个人设置获取(skh_ 前缀)
skillhub login --key skh_xxx

# 如需临时使用其他 token 覆盖登录态(不写入本地)
skillhub login --key skh_yyy

登录后 token 存在本地,后续发布命令无需重复传 token。也可在 skillhub publish 时用 --token skh_xxx 临时覆盖。

2. 验证登录状态

# ClawHub
clawhub whoami

# 腾讯 SkillHub
skillhub auth whoami

3. 同步技能

ClawHub

同步单个技能

clawhub sync skills/

同步所有技能

clawhub sync --all

注意:--all 会受 skills/skill-publish-sync/config/allowlist-clawhub.yaml 约束。只有在该文件中列出的 skill 才会同步到 ClawHub。SkillHub / 联想同理(各自独立白名单文件)。

腾讯 SkillHub

SkillHub 推荐逐个 skill 发布(通过 publish 命令指定目录,标识来自 SKILL.md frontmatter,见下方「单个 Skill 同步工作流」)。

# 发布目录(自动打包)
skillhub publish ./my-skill

# 指定版本和 changelog
skillhub publish ./my-skill --version 1.2.0 --changelog "新增xxx"

# 先预检(只校验 + 打包,不实际发请求)
skillhub publish ./my-skill --dry-run

SkillHub 用 slug + displayName(发布前由 prepare-publish.sh 从 config/allowlist-skillhub.yaml 注入临时副本,源 SKILL.md 不含)标识 skill,namespace 绑定在账号上(发布时无需命令行指定)。没有可见性概念。

交互式选择同步:用户可指定要同步的技能列表与目标平台,我会逐个执行同步命令。


单个 Skill 同步工作流

当需要同步指定的 skill(而非全部)时,使用此工作流。流程对两个平台通用,仅在「执行发布」步骤区分命令。

前置检查

  1. 检查登录状态

    clawhub whoami           # ClawHub
    skillhub auth whoami     # 腾讯 SkillHub
    
  2. 检查白名单

    • 读取 skills/skill-publish-sync/config/allowlist-${PLATFORM}.yaml(平台特定白名单)
    • 确认目标 skill 出现在对应平台的 allowlist 文件中(每平台独立文件,无 platforms 字段)
    • 三平台独立文件路径:
      • ClawHub → allowlist-clawhub.yaml
      • SkillHub → allowlist-skillhub.yaml
      • 联想 → allowlist-lenovo.yaml
  3. 检查许可证(仅 ClawHub 需要)

    • 读取目标 skill 的 SKILL.md frontmatter 中的 license 字段
    • ClawHub:只有 MIT 许可证的 skill 才能同步
    • SkillHub / 联想:无许可证限制,均可同步

版本检测

比较两个版本号(按目标平台读取记录):

来源位置格式
新版本skills//SKILL.md frontmatter 的 version"1.2.0"
已记录版本skills/skill-publish-sync/config/sync-records.yamlrecords..platforms..version"1.1.0"

版本比较逻辑(语义化版本):

new_version > recorded_version → 需要同步
new_version == recorded_version → 跳过(无变化)
new_version < recorded_version → 警告(版本回退?)
recorded_version 为 null → 需要同步(首次发布)

执行同步

步骤 1:准备发布目录

# ClawHub(默认平台,可省略 --platform)
bash skills/skill-publish-sync/scripts/prepare-publish.sh skills/

# 腾讯 SkillHub
bash skills/skill-publish-sync/scripts/prepare-publish.sh --platform skillhub skills/

脚本会创建临时目录:

  • ClawHub:/tmp/clawhub-publish-
  • SkillHub:/tmp/skillhub-publish-

步骤 2:执行发布

ClawHub(使用 clawhub publish,显式指定 slug 和 name):

clawhub publish /tmp/clawhub-publish- \
  --slug  \
  --name "" \
  --version "<新版本号>" \
  --changelog "<变更说明>"

⚠️ 必须指定 --slug 和 --name

  • 临时目录名可能包含前缀(如 clawhub-publish-),导致发布时 slug 不正确
  • --slug 确保使用正确的 skill 标识符
  • --name "" 确保在 ClawHub 上显示正确的名称

腾讯 SkillHub(使用 skillhub publish,指定版本与 changelog):

skillhub publish /tmp/skillhub-publish- \
  --version "<新版本号>" \
  --changelog "<变更说明>"

腾讯用 slug + displayName 标识 skill:这两个字段不写进源 SKILL.md,而是发布前由 prepare-publish.sh --platform skillhubconfig/allowlist-skillhub.yaml 读取并注入临时副本 frontmatter(slug 默认取 name,displayName 取配置的 display_name)。namespace 绑定在账号上(发布时无需命令行指定),没有可见性概念。 版本号与 changelog 通过 --version / --changelog 显式传入;不带 --version 时由 CLI 决定。发布前可加 --dry-run 只做预检。

联想开放平台(使用 lenovoskill,先打 zip 再传两步):

# 1. 准备:先在临时目录生成 .skill-config.json(联想 CLI 项目级配置)
cd /tmp/lenovo-publish-
# 源 skill 若已带 .skill-config.json,prepare-publish.sh 已一并复制,跳过 init;
# 否则跑一次 init 生成默认配置再按需编辑:
lenovoskill init

# 2. 打 zip
lenovoskill package
# → 生成 .zip

# 3. 上传 zip
lenovoskill push

联想同样从 SKILL.md frontmatter 读 slug + displayName:这两个字段由 prepare-publish.sh --platform lenovo 注入临时副本(与 SkillHub 共用同一段 python 逻辑)。同时联想 CLI 也读项目内 .skill-config.json——两者并存,displayName / slug 字段在 SKILL.md frontmatter 与 .skill-config.json 中应保持一致。 .skill-config.json 建议仅在临时目录生成/复制,不要 commit 进源 skill(它是联想 CLI 的私有适配层,与 skill 标准结构无关)。

步骤 3:更新同步记录

更新 skills/skill-publish-sync/config/sync-records.yaml,在对应平台下写入记录:

records:
  :
    platforms:
      clawhub:                      # 或 skillhub / lenovo
        version: "<新版本号>"
        last_sync: ""
        git_hash: "<当前 commit hash>"
        status: synced
        changelog_summary: "<变更说明>"
        url: "https://clawhub.ai/skills/"      # ClawHub
        # 或 SkillHub:
        # url: "https://skillhub.cn/skills/"
        # 或联想开放平台:
        # url: "https://open.lenovomm.com/skills/"
        publish_id: "<从命令输出获取>"
        # SkillHub 还要加一行 namespace: "";ClawHub / 联想无 namespace 字段

示例:同步 skill(按分流策略发到对应平台)

A. MIT 工具 → ClawHub(以 git-batch-commit 为例)

# 1. 检查白名单
grep -A1 "^git-batch-commit:" skills/skill-publish-sync/config/allowlist-clawhub.yaml
# 输出:platforms: [clawhub]   # MIT 工具,只发 ClawHub

# 2. 比较版本
# SKILL.md: version: "1.2.0"
# sync-records.yaml: platforms.clawhub.version: "1.1.0" → 需要同步

# 3. 准备并发布到 ClawHub
bash skills/skill-publish-sync/scripts/prepare-publish.sh skills/git-batch-commit
clawhub publish /tmp/clawhub-publish-git-batch-commit \
  --slug git-batch-commit --name "Git Batch Commit" \
  --version "1.2.0" --changelog "本次变更说明"

# 4. 更新 sync-records.yaml 的 platforms.clawhub 字段

B. CC-BY-NC 法律类 → SkillHub(以 legal-qa-extractor 为例)

# 1. 检查白名单
grep -A2 "^legal-qa-extractor:" skills/skill-publish-sync/config/allowlist-skillhub.yaml
# 输出:platforms: [skillhub]  +  display_name: "法律问答知识提取"

# 2. 准备(--platform skillhub 会自动从配置读 display_name/slug 注入临时副本 frontmatter)
bash skills/skill-publish-sync/scripts/prepare-publish.sh --platform skillhub skills/legal-qa-extractor

# 3. 发布到 SkillHub
skillhub publish /tmp/skillhub-publish-legal-qa-extractor \
  --version "<新版本号>" --changelog "<变更说明>"

# 4. 更新 sync-records.yaml 的 platforms.skillhub 字段

失败处理

  • 同步失败时记录 status: failed
  • 不重试,让用户决定后续操作
  • 记录失败原因到 changelog_summary

SkillHub 专属说明

Token 获取

  1. 登录 SkillHub
  2. 在个人设置中生成 API Token(格式 skh_xxx,前缀 skh_
  3. 通过 skillhub login --key skh_xxx 保存到本地
skillhub login --key skh_xxx
skillhub auth whoami     # 确认身份

安全提醒:Token 等同于账号密码,绝对不要写入配置文件或提交到 Git。skillhub login 已将 token 存到本地,后续发布命令无需重复传 token(CLI 自动读取);如需临时覆盖,可在 skillhub publish 时用 --token skh_xxx

slug / namespace 与版本号规则

腾讯 SkillHub 用 slug + displayName + namespace(账号绑定)标识 skill。slug/displayName 不写进源 SKILL.md,而在 config/allowlist-skillhub.yaml(平台特定白名单)配置,发布前由 prepare-publish.sh 注入临时副本 frontmatter:

  • slug:kebab-case,2-128 字符(实测校验正则)。默认 = skill 目录名(即 name);在 allowlist-skillhub.yamlslug: 字段覆盖(处理重名/被占用)。slug 在同一 namespace 下唯一,跨 namespace 可重名(如 @cat-xierluo/md2word 与他人的 @xxx/md2word 不冲突)
  • namespace:命名空间,绑定在账号上(服务端 @/ 格式),发布命令无需也无法命令行指定——CLI 用登录账号的身份,服务端自动归到你的 namespace 下。你的 namespace 可通过 skillhub search <你的skill> 查看已发布 skill 的 @xxx/slug 前缀得知
  • version:合法 SemVer(major.minor.patch),如 1.0.0。建议从 0.1.01.0.0 开始。已发布的版本不可修改,只能发布新版本

API host

默认 API host 为 https://api.skillhub.cn。如需覆盖,skillhub publish 时用 --host 指定。

SKILL.md frontmatter 要求

腾讯 SkillHub 发布时从(临时副本的)SKILL.md frontmatter 读取 skill 元数据。源 SKILL.md 不需要写 slug/displayName——prepare-publish.sh 会从 config/allowlist-skillhub.yaml 读取并注入临时副本:

字段来源说明
slug默认取 nameallowlist-skillhub.yamlslug: 可覆盖kebab-case,2-128 字符
displayNameallowlist-skillhub.yamldisplay_name:(必填)SkillHub 展示名(中文)
version源 SKILL.md frontmatter(或 --version 覆盖)合法 SemVer
summary源 SKILL.md(可选)简短摘要
description源 SKILL.md(可选)较长描述
tags源 SKILL.md(可选)标签数组
license源 SKILL.md(可选)许可证标识
homepage源 SKILL.md(可选)主页地址

ClawHub 与腾讯字段差异:ClawHub 用 name 字段 + 命令行 --slug/--name;腾讯用 slug + displayName(注入临时副本,源文件不写;namespace 绑定账号)。源 SKILL.md 只保留 name/description/version 等标准字段,两个平台的标识需求都由发布流程(命令行参数 / 配置注入)满足,不污染 skill 本体。

CLI 版本注意

腾讯 skillhub CLI 是 Python 脚本。老版本(< 2026.7.29)不支持 publish/login,运行 skillhub self-upgrade 升级到最新版;不确定时先用 skillhub self-upgrade --check-only 检查是否有新版。

发布频率限制(避免并发限流)

腾讯 SkillHub API 对发布请求有频率限制。连续多次 skillhub publish 会触发限流(报错 "请求过于频繁,请稍后再试"),单个 publish 失败需重试,且会拖慢整个批量流程。

实测安全间隔:每个 skillhub publish 之间 sleep 12-15 秒。批量发布 N 个预计总耗时 ≈ N ×(单次发布耗时 + 15s)。

推荐写法串行 + sleep,不要并行):

while IFS='|' read -r s v; do
  bash prepare-publish.sh --platform skillhub "skills/$s" >/dev/null 2>&1
  echo "$s: $(skillhub publish /tmp/skillhub-publish-$s --version "$v" --changelog '...' 2>&1 | tail -1)"
  sleep 15
done <

# 方式 2:全局安装(短命令、可离线)
npm install -g @lenovo-open/skill-cli
# 之后用 lenovoskill 代替 npx @lenovo-open/skill-cli

下文统一用 lenovoskill;用 npx 时替换即可。前置依赖:Node.js ≥ 18 + npm(详见本文档「依赖 · 系统依赖」章节)。

首次登录

lenovoskill login          # 浏览器 OAuth 授权
lenovoskill whoami         # 确认身份
lenovoskill logout         # 退出登录

凭证与配置(OAuth 安全存储,禁止写入仓库或公开平台):

文件模式用途
~/.lenovoskill/auth.json600Login Token + Biz Token(OAuth 双 token)+ 用户信息
~/.lenovoskill/config.json默认API URL(默认 https://open.lenovomm.com)+ 默认可见性

上传工作流(5 步)

# ① 准备安全过滤目录(复用 prepare-publish.sh,会触发 SkillHub/联想 共用的 frontmatter 注入段)
bash skills/skill-publish-sync/scripts/prepare-publish.sh --platform lenovo skills/
# → 生成 /tmp/lenovo-publish-;临时副本 SKILL.md 已注入 slug + displayName

cd /tmp/lenovo-publish-

# ② 准备 .skill-config.json(联想 CLI 项目级元数据,与 SKILL.md frontmatter 互补)
#    - 源 skill 目录若已带 .skill-config.json,prepare-publish.sh 已一并复制,直接用
#    - 否则从源目录复制,或在此目录跑一次 lenovoskill init 生成默认配置再按需编辑
lenovoskill init            # 生成默认 .skill-config.json(可手编 ignore patterns)

# ③ 打 zip
lenovoskill package
# → 生成 .zip

# ④ 上传 zip
lenovoskill push

⚠️ 必须先过 prepare-publish.sh:联想 CLI 没有内置 .gitignore 过滤,直接打源目录会把本地真实 config/*.yamlscripts/ 中间产物、.DS_Store 等一并打进 zip 上传。先过 prepare-publish.sh,临时目录已是 git ls-files 过滤后的"干净内容",再打 zip 才安全。

.skill-config.json

联想 CLI 在每个 skill 项目根目录读取该文件,包含:

  • Skill 元数据:name / version / description 等(可与 SKILL.md frontmatter 一致)
  • Ignore patterns:打包时额外排除的文件(配合 prepare-publish.sh 双重保险)

建议:此文件仅在临时目录里生成/复制,不写回源 skill 仓库——它只是联想 CLI 的私有适配层,与 skill 标准结构无关。

与 frontmatter slug/displayName 的关系:联想 CLI 同时从 SKILL.md frontmatter 读 slug + displayName(由 prepare-publish.sh 注入临时副本)和项目内 .skill-config.json 读元数据。两者应保持一致——displayName / slug 在 SKILL.md frontmatter 与 .skill-config.json 中不能冲突。

命令速查

命令用途
lenovoskill login登录联想开放平台(OAuth)
lenovoskill logout注销
lenovoskill whoami显示当前登录用户
lenovoskill init在当前目录初始化 .skill-config.json
lenovoskill package将当前目录打包成 zip
lenovoskill push上传 zip 到联想开放平台

失败处理

  • push 失败:先跑 lenovoskill whoami 确认登录态;检查 .skill-config.json 字段;确认 zip 是 package 刚生成的。
  • 打包内容有误:回到步骤 1,改源 skill + 重跑 prepare-publish.sh,不要在源目录直接重打(会绕过安全过滤)。
  • 想撤销已发布的版本:参考本文档「修复已发布的技能」章节,但联系联想平台支持由用户自行决定,不在本 skill 范围内。

与 sync-records.yaml 的关系

联想平台发布结果必须写进 sync-records.yamlplatforms.lenovo——与 SkillHub / ClawHub 一样,是三平台独立白名单架构的固定组成部分。platforms.lenovo 字段与 platforms.skillhub / platforms.clawhub 同构(version / last_sync / git_hash / status / changelog_summary / url / publish_id),namespace 字段(OAuth 双 token 机制,没有 namespace 概念)。

records:
  :
    platforms:
      lenovo:                      # 三平台独立白名单架构(联想是独立第三选项,允许与其他平台字段独立维护)
        version: "<新版本号>"
        last_sync: ""
        git_hash: "<当前 commit hash>"
        status: synced
        changelog_summary: "<变更说明>"
        url: "https://open.lenovomm.com/skills/"
        publish_id: "<从 lenovoskill push 输出获取>"
        # 无 namespace:联想用 OAuth 双 token(Login Token + Biz Token)

⚠️ NOT_VERIFIED:以上 LenovoSkill CLI 命令(login/init/package/push 行为、.skill-config.json 字段、OAuth 流程、平台许可证审核、是否实际从 SKILL.md frontmatter 读 slug/displayName)的细节来自用户提供的材料,未独立实测。首次实际推送时以 CLI 实际行为为准;若行为有偏差(比如实测发现联想 CLI 不读 frontmatter 而完全依赖 .skill-config.json),回头修正本节——inject 段对 lenovo 可能无意义,需重新评估本决策。


同步策略

版本号处理

  • 从技能的 CHANGELOG.md 第一行提取版本号
  • 格式要求:## [x.y.z] - YYYY-MM-DD
  • 自动处理 v 前缀(v1.0.01.0.0

自动字段

字段处理方式
homepage自动设置为 GitHub 仓库地址
version从 CHANGELOG.md 提取(如 SKILL.md 中未指定)

同步范围控制(白名单机制,v1.7.1 三份独立列表)

配置文件: 三份独立白名单文件(v1.7.1 架构,详见 DECISIONS D-2026-08-12-02):

  • skills/skill-publish-sync/config/allowlist-clawhub.yaml(ClawHub 平台白名单)
  • skills/skill-publish-sync/config/allowlist-skillhub.yaml(SkillHub 平台白名单)
  • skills/skill-publish-sync/config/allowlist-lenovo.yaml(联想开放平台白名单)

优先级:白名单 > 默认忽略规则

  • 如果对应平台的 allowlist-${PLATFORM}.yaml 存在:只同步该文件中列出的 skill(每个平台独立读取自己的白名单文件)
  • 如果对应平台的 allowlist-${PLATFORM}.yaml 不存在:使用默认忽略规则(忽略 test/、private-skills/、node_modules/)

配置格式(v1.7.1 三份独立列表,每份文件无 platforms 字段):

# allowlist-clawhub.yaml(17 条 MIT 通用工具,display_name/slug 可选)
md2word:
patent-download:
# ...

# allowlist-skillhub.yaml(12 条 CC-BY-NC 法律类,display_name 必填)
legal-qa-extractor:
  display_name: "法律问答知识提取"
contract-copilot:
  display_name: "合同起草与审查助手"
# ...

# allowlist-lenovo.yaml(0 条,初始空,用户按需手动添加)
# contract-copilot:
#   display_name: "合同起草与审查助手"    # 与 skillhub 分区独立维护,可不同

一对多语义:同一 skill 可同时出现在多份文件里(如 contract-copilot 可同时在 allowlist-skillhub.yamlallowlist-lenovo.yaml 登记,各自维护独立的 display_name)。无需为新平台改动旧 skill 的配置。

如需启用/禁用某 skill 在某平台,直接在对应平台的 allowlist 文件里添加/注释该 skill 行即可。

配置文件与隐私(example vs 本地,v1.7.1 三份独立列表)

配置文件分公开模板和本地真实两份,便于本技能被他人复用:

文件角色是否入库含本地真实数据
config/allowlist-clawhub.example.yamlClawHub 白名单公开模板✅ 入库
config/allowlist-skillhub.example.yamlSkillHub 白名单公开模板✅ 入库
config/allowlist-lenovo.example.yaml联想白名单公开模板✅ 入库
config/sync-records.example.yaml同步记录公开模板✅ 入库用占位符
config/allowlist-clawhub.yamlClawHub 本地真实白名单❌ gitignore 排除
config/allowlist-skillhub.yamlSkillHub 本地真实白名单❌ gitignore 排除
config/allowlist-lenovo.yaml联想本地真实白名单❌ gitignore 排除
config/sync-records.yaml本地真实同步记录❌ gitignore 排除填入实际 publish_id 等

首次使用:复制对应 .example.yaml 去掉 .example 后缀,填入你的实际数据。三份白名单文件独立维护——同一 skill 可在不同白名单中独立登记(一对多)。 SkillHub / 联想的白名单文件中 display_name 必填(中文展示名,发布前由 prepare-publish.sh 注入临时副本 frontmatter;源 SKILL.md 不含此字段)。sync-records.yaml 记录 publish_id 等发布结果。

根目录 .gitignore**/config/*.yaml + !**/config/*.example.yaml 规则对所有平台(ClawHub / SkillHub / 联想)均生效(共用 prepare-publish.sh 过滤逻辑)。实测发布 skill-publish-sync 自身时,三份真实 allowlist-*.yamlsync-records.yaml 均不进入临时目录,只有 .example.yaml 模板会上传。

根目录 .gitignore 已通过 **/config/*.yaml + !**/config/*.example.yaml 规则,自动排除真实配置、保留模板。

文件过滤规则

发布时会自动应用 .gitignore 过滤规则,确保敏感文件和临时文件不会被上传。三个平台共用同一套过滤逻辑。

双重过滤机制

  1. 项目根目录 .gitignore - 自动检测 Git 仓库根目录的 .gitignore
  2. 技能内部 .gitignore - 如果技能目录有自己的 .gitignore,会额外应用

默认排除(始终生效):

  • .git/ - Git 目录
  • node_modules/ - Node.js 依赖
  • __pycache__/ - Python 缓存
  • .DS_Store - macOS 系统文件

同步流程

每次同步前,会自动:

  1. 创建临时目录 - 前缀随平台变化:/tmp/clawhub-publish-/tmp/skillhub-publish-
  2. 复制过滤后的文件 - 使用 rsync 遵循 .gitignore 规则复制文件
  3. 发布到目标平台 - 从临时目录执行对应平台的发布命令
  4. 清理临时目录 - 发布完成后自动清理

手动准备发布目录

如需手动检查将要发布的文件:

# ClawHub(默认)
bash skills/skill-publish-sync/scripts/prepare-publish.sh skills/trademark-assistant
ls -la /tmp/clawhub-publish-trademark-assistant/

# 腾讯 SkillHub
bash skills/skill-publish-sync/scripts/prepare-publish.sh --platform skillhub skills/trademark-assistant
ls -la /tmp/skillhub-publish-trademark-assistant/

安全最佳实践

发布前检查清单

  • 确认 .gitignore 包含所有敏感文件模式
  • 使用 prepare-publish.sh 检查将要发布的文件
  • 不要在技能中包含 API keys、密码等
  • 使用 .env.example 代替 .env 文件

常见敏感文件

  • .env - 环境变量(使用 .env.example 作为模板)
  • config.yaml - 配置文件(使用 config.example.yaml 作为模板)
  • *.db, *.sqlite - 数据库文件
  • logs/ - 日志目录
  • downloads/, output/ - 输出目录

修复已发布的技能

如果发现已发布的技能包含敏感信息:

  1. 立即更新 - 从技能目录中删除敏感文件
  2. 更新 .gitignore - 确保未来不会再次包含
  3. 重新发布 - 用 clawhub publish / skillhub publish / lenovoskill push 更新对应平台
  4. 联系平台支持 - 如果需要删除旧版本

重要提醒

  • 两个平台都是公开平台:发布的技能任何人都可以访问
  • 不要包含客户信息:案例文件、沟通记录等应排除
  • 不要包含凭证:API keys、tokens 等应使用环境变量

常见问题

版本号未更新?

检查 CHANGELOG.md 格式:

## [1.0.0] - 2026-03-21

### 新增
- 新功能描述

同步失败?

  1. ClawHub:运行 clawhub sync --dry-run 检查配置
  2. SkillHub:确认 skillhub auth whoami 登录正常、config/allowlist-skillhub.yaml 已为该 skill 配 display_name(slug 默认取 name;缺 display_name 时 prepare-publish.sh 会 fail-closed 报错)
  3. 联想开放平台:确认 lenovoskill whoami 登录正常、config/allowlist-lenovo.yaml 已配 display_name(联想也由 prepare-publish.sh 注入 frontmatter);Node.js ≥ 18 + npx 可用;临时目录已生成 .skill-config.json(init 生成或从源复制)
  4. 确认 SKILL.md frontmatter 格式正确
  5. 检查白名单:目标 skill 是否在对应平台的 allowlist-${PLATFORM}.yaml 中(v1.7.1 三份独立列表,每平台独立文件)

ClawHub 提示许可证冲突?

CC-BY-NC 等 license 与 ClawHub MIT-0 冲突,无法发布到 ClawHub。这类 skill 改发 SkillHub(无许可证限制)。详见 ClawHub Skill Format 官方文档

输入/输出

输入

  • 必需:本地开发的 skill 目录
  • 可选:指定技能名称列表、目标平台(clawhub / skillhub / lenovo,每平台独立白名单文件 allowlist-${PLATFORM}.yaml;详见平台对比表与同步范围控制章节)、白名单配置

输出

  • 同步结果报告(成功/失败列表,按平台分组)
  • 错误信息(如有)

同步记录

每次同步后,会更新 config/sync-records.yaml 记录文件,便于溯源和增量同步。记录按平台分别存储。

记录结构

records:
  :
    platforms:
      clawhub:    # ClawHub 平台记录
        
      skillhub:   # 腾讯 SkillHub 平台记录(含 namespace 字段)
        
      lenovo:     # 联想开放平台记录(无 namespace 字段)
        

记录字段

字段说明适用平台
version同步时的版本号三者
last_sync最后同步时间 (ISO 8601)三者
git_hash同步时的 commit hash三者
statussynced / pending / failed / skipped / slug_conflict / deleted三者
changelog_summary变更摘要三者
url平台发布地址三者
publish_id平台内部 ID三者
namespace命名空间(账号绑定,如 cat-xierluo;发布时不传,记录用于溯源安装命令)仅 SkillHub(ClawHub / 联想无 namespace 概念)

记录示例

records:
  md2word:
    platforms:
      clawhub:
        version: "1.1.8"
        last_sync: "2026-03-24T16:42:00+08:00"
        git_hash: "fbb1db4"
        status: synced
        changelog_summary: "全书自动更新目录域"
        url: "https://clawhub.ai/skills/md2word"
        publish_id: "k97dtn63cty6ezwzj9g9ry85818axkdq"
      skillhub:
        namespace: "cat-xierluo"
        version: "1.1.8"
        last_sync: "2026-08-01T10:00:00+08:00"
        git_hash: "fbb1db4"
        status: synced
        changelog_summary: "首次发布 SkillHub"
        url: "https://skillhub.cn/cat-xierluo/md2word"
        publish_id: "sh_xxxxxxxxxxxxxxxx"
      lenovo:
        # 无 namespace:联想用 OAuth 双 token(Login Token + Biz Token)
        version: "1.1.8"
        last_sync: "2026-08-12T10:00:00+08:00"
        git_hash: "fbb1db4"
        status: synced
        changelog_summary: "首次发布联想开放平台"
        url: "https://open.lenovomm.com/skills/md2word"
        publish_id: "len_xxxxxxxxxxxxxxxx"

用途

  1. 增量同步:只同步 status: pending 或版本更新的 skill(按平台独立判断)
  2. 溯源:通过 git_hash 追溯发布时的代码状态
  3. 快速访问:通过 url 直接访问平台上的 skill 页面

Related skills

将本地开发的 Skills 批量同步到 ClawHub 与腾讯 SkillHub 两个平台。支持智能 .gitignore 过滤、白名单控制、增量同步、单个 skill 同步、双平台分流发布。本技能应在用户需要将本地 skills 发布到 ClawHub/SkillHub、批量同步技能、检查发布状态时使用。

13 installs

将当前项目中的 Skill 发布到 GitHub 并同步到 ClawHub。新项目自动走完流程,已有仓库的项目会总结变更、确认提交信息和建议版本号。

16 installs

技能发布 — 将已有 Skill 三平台同步推送到 GitHub + ClawHub + SkillHub。当用户说 技能发布到三平台/发布技能更新/迭代技能发布 时触发。⚠️ 本技能的行为范围(用户须知):① 推送代码到外部平台(GitHub/ClawHub/SkillHub),操作对外可见且可能不可逆 ② 同步到本地 TRAE 安装目录(会覆盖已有版本) ③ 在本地 docs/knowledge/ 追加发布日志。执行前会向用户确认。含安全审查、隐私清洗、版本号查重、仓库结构生成、ClawHub 自动文件排除、SkillHub dry-run 预检。Do NOT use for creating skill content, general coding, or non-skill projects.

5 installs

将本地已编写完成的 SKILL.md 技能目录一键发布到多个公开市场(ClawHub、腾讯 SkillHub、 skills.sh、LobeHub、SkillsMP、Agensi、Coze、ClawMart),自动完成格式校验、双语 README、 敏感文件清理、Git 版本打标、串行发布与结果汇总。 当用户要把已经写好的 SKILL.md 同时分发到多个公开市场时使用——即使他们只说 "发布 skill"、"publish to clawhub"、"ship to marketplace"、"一键发布"或"上架 skill"。 不用于:纯本地 skill 管理、未完成 skill 的撰写、单个市场的单独发布指引。

Multi-hub skill publisher. Sign → Audit (placeholder) → Pack (clean tar.gz with exclude rules) → Publish to clawhub.com, skillhub.cn (Tencent Cloud), or GitH...

1 installs

Prepare and publish a local skill to ClawHub and GitHub using a workflow that keeps the local publish directory clean. Use this skill when the user wants to...

19 installs