Install
openclaw skills install skill-publisher-universalClawHub Security found sensitive or high-impact capabilities. Review the scan results before using.
Generic publishing tool for Claude Code skills. Validates, packages, and publishes to ClawHub, Hermes Agent, and anthropics/skills with bilingual README support.
openclaw skills install skill-publisher-universalA generic publishing workflow for any Claude Code skill. Package, validate, and publish to ClawHub (OpenClaw), Hermes Agent, and anthropics/skills (Claude Code).
clawhub publish or GitHub PR submissionBefore using this skill, check for the following in the environment (or ask the user):
These tokens are pre-configured in ~/.env and shell environment. Read them automatically — do not ask the user:
| Token | Env Var | Source |
|---|---|---|
| GitHub PAT | GITHUB_TOKEN | ~/.env or env |
| GitHub user | GITHUB_USER | ~/.env or env |
| ClawHub token | CLAWHUB_TOKEN | ~/.env or env |
If a variable is missing, read ~/.env first, then ask the user.
Before any GitHub API call, test connectivity first:
curl -s -m 5 https://api.github.com/repos/NousResearch/hermes-agent > /dev/null 2>&1 && echo "direct OK" || echo "direct FAIL"
If direct access fails (common in restricted networks), load proxy from ~/.env:
source ~/.env
# ~/.env may contain (possibly commented-out):
# https_proxy=http://192.168.28.92:7897
# http_proxy=http://192.168.28.92:7897
# Export the proxy ONLY if direct access failed:
export https_proxy=http://192.168.28.92:7897
export http_proxy=http://192.168.28.92:7897
# Re-test with proxy:
https_proxy=$https_proxy curl -s -m 10 https://api.github.com/ > /dev/null 2>&1 && echo "proxy OK" || echo "proxy FAIL"
Fallback strategy (ordered by priority):
~/.env — read https_proxy/http_proxy values; if commented out, uncomment and export them for this session onlygit@github.com:... works without proxy in most environments; use for git clone/push, but NOT for GitHub REST API (curl/gh api)When proxy is also down: skip GitHub API PR creation. Push branch via SSH and instruct user to create PR manually via browser.
python3 ~/.skills/skill-publisher/scripts/validate_skill.py <skill-path>
Checks: SKILL.md exists, valid YAML frontmatter, required fields (name, description), name format (lowercase, hyphens), description <= 1024 chars, no hardcoded secrets, file size <= 100,000 chars.
python3 ~/.skills/skill-publisher/scripts/generate_package.py \
--source ~/.skills/<skill-name> \
--output /tmp/publish-<skill-name> \
--platforms clawhub hermes anthropics
Produces:
/tmp/publish-<skill-name>/
├── SKILL.md # Copied from source
├── README.md # Bilingual (EN/ZH) README with examples
├── examples/ # Copied from source skill
└── .clawhub.json # ClawHub manifest
CRITICAL: Always pass --slug <skill-name> to prevent ClawHub from using the directory name as the slug. Without --slug, a publish from /tmp/publish-my-skill/ would create a duplicate entry named publish-my-skill instead of my-skill.
clawhub publish /tmp/publish-<skill-name> --version <version> --slug <skill-name>
If CLI unavailable: install npm i -g clawhub or upload via clawhub.ai.
Target: NousResearch/hermes-agent → skills/creative/<skill-name>/SKILL.md
skills/creative/<skill-name>/Target: anthropics/skills → skills/<skill-name>/SKILL.md
Same process as Hermes, different repo.
# ClawHub
curl -s "https://clawhub.ai/api/v1/skills?slug=<skill-name>"
# Hermes / anthropics — check raw GitHub URLs
| Script | Purpose |
|---|---|
scripts/validate_skill.py | Validate SKILL.md format |
scripts/generate_package.py | Generate publish package with bilingual README |
scripts/gen_clawhub_manifest.py | Generate .clawhub.json |
scripts/create_pr.py | Create GitHub PR via API |
--- — no BOM, no blank linemetadata.hermes.tags and related_skills~/.env and re-test. If proxy also fails, use SSH (git@github.com:...) for git operations and tell user to create PR manually via browser--slug <skill-name> when publishing; otherwise the directory name becomes the slug, creating a wrong/duplicate entry (e.g. publish-my-skill instead of my-skill)