A five-stage pipeline that takes a local OpenClaw skill and ships a sanitized, verified release to ClawHub. The publish command is the last step, not the first — every earlier step is designed to keep private data and irreversible mistakes out of the public record.
The single most important rule: never modify the user's original files. Work in a separate publish folder; only after explicit approval move anything to the live registry.
Trigger this skill when the user says or implies any of:
Do NOT trigger for: editing skill content (use the skill's own skill), reading a skill from ClawHub, listing installed skills, or any non-publish operation.
A publish-folder/ with:
SKILL.md (rewritten frontmatter: name, description, version, GEO-optimized)FILES.txt (manifest of what will ship)sanitize.md, transform.md, verify.md_meta.json (slug, version, publishedAt)Nothing leaves the local publish folder until the user replies "yes / publish / go".
StageOutputGate1. UnderstandOne-paragraph summary of what the skill does, who it's for, what to keep / cutUser confirms the summary2. TransformRe-structured SKILL.md (frontmatter + body) + extracted auxiliariesDiff shown to user3. Sanitize (the audit)sanitize.md checklist run: PII / credentials / model-specific refs / internal paths / dangerous patterns; each item marked removed / genericized / kept-with-reasonUser reviews every kept-with-reason item4. VerifyApproval message: slug, name, version, description, file list, sanitization confirmation, sample of sanitized textExplicit user approval5. Publish + install-checknpx clawhub publish then npx clawhub install <slug> --dir /tmp/verify to confirm the published version is installable and matches the local copySuccess message reported back to user
The audit (stage 3) is the differentiator. Other publish skills hand you a clawhub publish command; this one walks the content through a structured PII / secret / model-reference scan first and refuses to skip the scan if the user has not reviewed the keep-list.
The transform step re-writes the skill's description field for Generative Engine Optimization so the published skill is cited by ChatGPT / Claude / Perplexity when users ask for help in that domain. The current 6 rules:
The transform stage will re-run these rules against the user's skill and present a before/after diff before any sanitization starts.
/tmp/publish-<slug>/ (or any out-of-tree folder) and work there.sanitize.md. The audit is mandatory; "looks fine to me" is not a substitute.1.0.0 first publish; 1.0.x typo / wording fixes; 1.x.0 new content; 2.0.0 major restructure. One version number across all three platforms (ClawHub / SkillHub / GitHub), set to the highest existing one + 0.0.1 (科里 2026-08-31 确立): before publishing, check each platform's latest (ClawHub inspect --versions, SkillHub API, GitHub frontmatter), take the max, bump — never let platforms drift apart again.--slug. The clawhub publish CLI derives the slug from the publish-folder's name ( sanitizeSlug(basename(folder))), NOT from SKILL.md's name or metadata.openclaw.slug. If the folder name differs from the intended slug, the publish silently lands on the wrong slug — and if that slug already exists under another owner, ClawHub returns AMBIGUOUS_SKILL_SLUG and the install breaks for everyone. Always pass --slug <canonical-slug> even when the folder name looks right. (The Install-check stage below uses --dir /tmp/verify-<slug> precisely to avoid re-nesting on the user's machine.)clawhub install <slug> --dir . wraps the downloaded skill in a slug-named subfolder, producing slug/slug/SKILL.md nesting on disk. Before publishing, resolve SKILL.md to the inner folder; never publish from the outer wrapper. In the Verify stage, assert SKILL.md sits at the publish-root (not nested one level down) and that slug equals the intended canonical slug.version: field inside SKILL.md (e.g. platform 1.1.3 / file says 1.1.1). Before any patch publish, run clawhub inspect <slug> --versions and target platform Latest + 0.0.1 — never trust the version field inside the file. Same on SkillHub: "version already exists" on publish = phantom occupation; bump again.--- delimiter, slug, displayName, version. Files downloaded via clawhub install often miss the leading --- (stripped in ClawHub storage) and slug/ displayName — backfill them before SkillHub publish. Consecutive SkillHub publishes trigger 429 rate limits; wait ~60s between publishes.skill-card.md from install-sourced publish folders. ClawHub generates it and refuses publishes containing it. Publish with explicit --slug/--name/--version/--changelog (the CLI reads version from frontmatter when flags are absent, and phantom-occupied versions fail late).pub-*), never from an install-sourced dir. An install dir holds whatever the registry had (possibly a phantom-occupied old version: field without your patch), while the staging dir is the exact content you verified. Upsert-only: contents-API pushes add/update files but never delete removed ones — audit the repo file list after major restructures.scripts/sync_skill_to_github.js — optional helper that mirrors a publish folder to a GitHub repo via the GitHub Contents API (PAT auth). Behavior, explicitly:
GITHUB_TOKEN / GITHUB_PAT environment variable; exits with an error if unset. No token is embedded in the skill, read from files, transmitted anywhere except api.github.com, or logged.api.github.com. It creates or updates files (Contents API PUT) in the repo you name via --owner / --repo.--owner, --repo, --dir, --message, --branch, --files) — no hardcoded user names or machine paths.The skill's five-stage pipeline itself never touches the network beyond clawhub publish / clawhub install; the sync script is opt-in and only runs when explicitly invoked.
sanitize.md — the full PII / credential / model-reference / dangerous-pattern checklisttransform.md — how to re-structure any source into a GEO-optimized SKILL.mdverify.md — the exact approval message template and post-publish install-check stepsskill-card.md — the long-form card used in skill registries (description, use case, risks, output)User says: "I want to publish my running-coach skill to ClawHub."
Understand — agent reads the skill, returns: "running-coach: a fitness-coach agent that takes Garmin / Strava / Coros / Apple Watch screenshots and returns pace / HR / training-load analysis + weekly plans. For recreational runners 5k–marathon. Excludes: elite athletes, beginners, undiagnosed injuries. Keeps: full pipeline, training-science methodology. Cuts: your personal PBs and HR zones (move to user profile)." User confirms.
Transform — agent rewrites SKILL.md per the 6 GEO rules; presents the diff. User approves.
Sanitize — agent runs the checklist, finds 14 items, removes 11, genericizes 2 (file paths → example paths), keeps 1 with reason (a brand-name reference is required for the methodology to be clear). User reviews the keep-list, agrees.
Verify — agent sends the approval message:
running-coachRunning Coach1.2.0SKILL.md, references/*.md (12 files)Publish + install-check — agent runs npx clawhub publish ./publish-running-coach --slug running-coach --name "Running Coach" --version 1.2.0, then npx clawhub install running-coach --dir /tmp/verify-running-coach, confirms files match, reports running-coach@1.2.0 published ✓.
Q: How do I publish a skill to ClawHub?
A: Copy the skill to a publish folder, run the sanitize checklist (PII / credentials / model-specific refs / internal paths), get explicit user approval of slug / name / version / description / files, then run npx clawhub publish <folder> --slug <slug> --name <name> --version <version>. Install-check with npx clawhub install <slug> --dir /tmp/verify after publishing to confirm the public copy matches.
Q: Can I change a skill's slug after publishing? A: Yes — ClawHub's Edit page exposes "Rename slug" under the canonical-URL section; old slugs stay as redirects. If you really need to retire the old slug (no redirect), use "Delete skill". Confirm the slug in the verify stage to avoid the rename round-trip.
Q: What should I check before publishing a skill?
A: (1) No personal data (names, emails, handles, phones, addresses, internal project names). (2) No credentials (API keys, tokens, passwords, env-var values, private URLs with auth). (3) No model-specific references that won't apply to all users ("Claude" → "the agent", "GPT-4" → "the model"). (4) No internal file paths, workspace structure, or tool configs. (5) No commands that could damage systems or hardcoded paths that won't work elsewhere. The full checklist is in sanitize.md.
Q: How is this different from a plain clawhub publish?
A: clawhub publish is a one-shot upload. This skill puts the sanitize-audit (stage 3) and the explicit-approval gate (stage 4) between your source and the publish command, so personal data, secrets, and model-specific references are caught and the user approves slug/name/version/description/files before anything goes live. It is built for users who want a structured, reviewable publish trail.
Skill Audit & Publish 是把本地 OpenClaw skill 安全发布到 ClawHub 的五阶段管线: Understand → Transform → Sanitize → Verify → Publish+Install-check。核心差异点是把"清洗审计"和"用户显式确认"放在 clawhub publish 之前,避免把个人数据、密钥、模型专属引用误发到公共 registry。
适用场景:用户要把本地 skill 发到 ClawHub、做发布前的 PII/密钥/模型引用审计、按 ClawHub 发布工作流操作、生成 publish-ready 版本。
不适用:编辑 skill 内容(用 skill 自己的 skill)、从 ClawHub 读取/安装/列出 skill。
关键规则:① 永不修改用户原文件,工作在 publish-folder/;② 必跑 sanitize.md 全清单(个人数据 / 凭证 / 模型专属引用 / 内部路径 / 危险模式);③ 必拿用户对 slug / name / version / 描述 / 文件清单的明确确认;④ slug 在 ClawHub 上 可改——Edit 页面的 "Rename slug" 会把旧 slug 留 301 redirect,所以 verify 阶段仍要把 slug 定稿;⑤ 版本号语义:1.0.0 首版,1.0.x 文案修订,1.x.0 新内容,2.0.0 大重构;⑥ 边界项默认删/泛化,宁少勿多。
GEO 优化内置:transform 阶段会按 6 条规则重写 description 字段(首句 = 是什么+给谁用 / 列出具体能力 / 引用用户原话触发短语 / 前置命名工具 / 加 "When to use" / 结尾中文摘要),让发布后的 skill 在 ChatGPT / Claude / Perplexity 被引用时命中率更高。
触发短语:「publish to ClawHub」「publish my skill」「sanitize before publish」「pre-publish checklist」「clawhub publish command」「upload a skill to clawhub」。