Publish npm + ClawHub
by @humanlike2026
Publish OpenClaw skills or plugins to npm and ClawHub with a guarded workflow. Use this whenever the user asks to release, publish, ship, or republish a skil...
clawhub install publish-npm-clawhub📖 About This Skill
name: publish-npm-clawhub description: Publish OpenClaw skills or plugins to npm and ClawHub with a guarded workflow. Use this whenever the user asks to release, publish, ship, or republish a skill/plugin, investigate ClawHub suspicious or flagged results, prepare a sanitized release directory, or verify release metadata, versions, accounts, slugs, and scanner status. Always use this skill when publish accounts must come from a local config file and must not be uploaded.
Publish npm + ClawHub
> Version: 1.0.6 · License: Apache-2.0 · Author: jianghaibo > > Required tools: Read, Write, Bash · Requires: python3, git, clawhub, curl
这个 skill 用来把“容易出错的发布流程”变成固定动作。
先读:
references/workflow.mdreferences/scanner-playbook.md如果仓库里存在 scripts/release_guard.py,发布前优先运行它。
这个脚本只做本地文件、Git 和发布目录检查;真正的联网发布发生在后续显式执行 clawhub / npm 命令时。
核心原则
1. 发布账号、handle、slug、npm 用户名统一放在本地配置文件,不写进仓库,不上传。
2. ClawHub 发布不要直接拿仓库根目录上传,先生成临时发布目录。
3. 对 skill / plugin 分别判断是否需要 npm:
- 有 package.json 的 plugin 才走 npm
- 纯 skill 通常只走 ClawHub
4. ClawHub 每次发布前固定执行:
- clawhub logout
- clawhub login
- clawhub whoami
5. 发布完成后一定复核线上状态,不能只看命令退出码。
本地配置
默认使用:
config/publish.accounts.local.json
如果文件不存在:
config/publish.accounts.example.json 复制一份git check-ignore 确认它被忽略如果该文件已被 Git 跟踪,先停止发布,先修复仓库。
建议流程
1. 识别发布对象
判断当前对象属于哪类:
检查这些文件:
SKILL.mdskill.jsonpackage.jsonopenclaw.plugin.json.codex-plugin/plugin.json2. 对齐版本和元数据
发布前确认:
config / primaryEnv / 联网说明存在3. 运行发布前守门检查
优先执行:
python3 scripts/release_guard.py . \
--config config/publish.accounts.local.json \
--prepare-release-dir /tmp/publish-release
如果脚本报错:
FAIL 必须先修WARN 需要人工判断,尤其是可疑扫描相关 warning4. npm 发布
仅在下面条件成立时执行:
package.jsonnpm.enabled = true发布前确认:
npm whoaminpm pack --dry-run 结果干净5. ClawHub 发布
使用临时发布目录,不要直接发仓库根目录。
发布命令结构:
clawhub publish /tmp/publish-release \
--slug \
--name "" \
--version \
--changelog ""
6. ClawHub 闭环复核
发布后必须进入闭环,不要只做一次检查。
固定动作:
1. 先确认 clawhub inspect 已经指向最新版本。
2. 再确认页面版本也已经更新。
3. 再看扫描结果是不是已经 clean / benign。
如果最新版本还在 pending:
如果最新版本仍然是 suspicious / flagged:
停止条件:
clawhub inspect 指向最新版本suspicious / flaggedstaticScan.status = cleanOpenClaw = Benign 或更好可疑扫描复核
如果页面出现 suspicious / flagged:
1. 同时看:
- clawhub inspect
- ClawHub 页面
- curl 抓页面 HTML
2. 区分是页面缓存,还是最新版本真的还没过扫描。
3. 如果静态规则命中,优先看:
- 同文件 env 读取 + 网络发送
- 同文件 文件读取 + 网络发送
- 提到 ~/.openclaw/secrets.json
- 提到私有 config.json
4. 修复后递增版本重新发,不要原地重发同版本。
5. 如果已经确认“同一个版本仍然可疑”,下一步必须是修复,不是继续重复检查。
真实踩坑:为什么改了很多次还是会继续可疑
以 follow-builders-sidecar 为例,反复命中可疑标签,通常不是因为“功能本身不该存在”,而是因为下面几件事没有一起处理:
1. 只改了功能,没有改触发扫描的代码结构。
- 例如把“读取本地 OpenClaw/Feishu 配置”和“调用 Feishu API 发网络请求”继续放在同一个文件里。
- 从功能视角看只是正常发消息;从扫描器视角看,这仍然像“读取本地敏感信息后外发”。
2. 只改了代码,没有改文档和元数据里的敏感表述。
- 如果 SKILL.md / README 里继续高频出现“私有 config / 本地 credentials / secret 路径”等字眼,扫描和 LLM 审核仍可能持续提高风险判断。
3. 把能力标签误当成可疑标签。
- 页面里的 Credentials / Persistence & Privilege 经常只是 capability note,不等于 suspicious / flagged。
- 真正要看的是最新版本的 staticScan.status、summary、页面内嵌数据,而不是看到 capability note 就误判“还没修好”。
4. 没有区分“扫描 pending / 页面缓存 / 真正仍然 flagged”。
- 刚发布完时,inspect 可能还看不到,页面也可能还是旧内容。
- 如果不先确认“最新版本是不是已经切过去”,就很容易把旧结果当成新结果。
最终真正起作用的修复
在 follow-builders-sidecar 这次案例里,最终让标签消失的不是单点文案修改,而是一组结构性修复:
1. 发布时只上传白名单临时目录,不直接发仓库根目录。 2. 把“凭证/本地配置读取”和“网络调用”拆到不同文件: - credential resolver - local credential storage - Feishu API client - sender main flow 3. 本地直连凭证保留在用户本机路径,且不上传仓库、不进入发布目录。 4. 文档里明确说明: - 会联网到哪些端点 - 哪些配置是本地存储 - 为什么需要这些本地权限 - 不会读取哪些无关 secrets 5. 发布后以“最新版本页面内嵌扫描结果”为最终准绳,而不是凭页面顶部零散文案判断。
优先修复策略
命中可疑时,优先按这个顺序改:
1. 把配置读取拆到单独文件
2. 把网络 client 拆到单独文件
3. 显式限制只读取白名单环境变量
4. 删除代码和文档里对 secrets.json / 私有 config.json 的依赖
5. 在 SKILL.md / README / SECURITY 中补清楚联网说明和发送字段
6. 如果文档里必须提到这些敏感路径,明确写成“不会读取 / 已移除依赖 / 高风险关键词示例”,避免歧义
7. 如果业务确实需要“本地凭证 + 外部发送”,优先做职责拆分,不要把“读取本地凭证”和“发网络请求”继续放在同一个实现文件里
8. 如果页面只剩 Credentials / Persistence note,但最新版本 staticScan.status = clean,不要把 note 误判成仍然 suspicious
结果汇报格式
最终汇报时至少覆盖: