Skill hub united
Skill Songhonglei/build-better-skills/skills/skill-hub-united
Install skills from multiple skill hubs with one tool: clawhub.ai (default), skillhub.cn (SkillHub, China-optimized), skills.sh (npx skills, GitHub-based), the official anthropics/skills repo, and your own self-hosted "custom" hub. Routes to the right source based on how the user phrases the request, handles name collisions (rename/overwrite/abort), Anthropic source-available license gating, multi-skill repos, and path-traversal-safe extraction. Use when the user says "install skill X", "add skill X", "download skill X", "get X from clawhub", "get X from skillhub.cn", "use skills.sh to install X", "install the claude/anthropic X skill", or "install X from my hub". Also triggers in Chinese: "安装skill xxx"、"装一下xxx"、"下载skill xxx"、 "从 clawhub 装 xxx"、"从 skillhub.cn 装 xxx"、"用 skills.sh 装 xxx"、 "装 claude 的 xxx"、"从我的 hub 装 xxx"。From its SKILL.md
npx -y skills add Songhonglei/build-better-skills --skill skill-hub-unitedAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
4 things to look at
- reads credentialsReads from 1 credential source: `SKILL_HUB_CUSTOM_URL`.
- 1 stars1 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
- runs commandsInstructs the agent to run 8 commands, including `python3 <skill-dir>/scripts/install_skill.py <slug> --source <SRC>` and 7 more.
- fetches URLsInstructs the agent to fetch 2 URLs, including https://clawhub.ai/api/v1/download?slug=<slug> and 1 more.
SKILL.md
9.6 KB, ~2.4k tokens by cl100k_base, as published. Nobody here has run it
Skill Hub United Installer
One installer for multiple skill hubs — picks the right source from how the user phrases the request.
- Version: 1.0.6
- License: MIT
- Author: Evan Song · github.com/Songhonglei
- Repository: https://github.com/Songhonglei/build-better-skills
- Part of:
build-better-skillssuite — see Stages for the lifecycle map.
Sources
| Source | What it is | Auth |
|---|---|---|
clawhub (default) | clawhub.ai public hub (REST, with npx clawhub fallback) | none |
skillhub_cn | skillhub.cn — SkillHub, a China-optimized public hub (REST) | none |
skills_sh | skills.sh / npx skills CLI (GitHub-source based) | none |
anthropic | the official anthropics/skills GitHub repo (sparse-checkout) | none |
custom | your own self-hosted hub — any GET <base>/<slug> endpoint that returns a skill zip | up to you |
1. Source routing (read first)
| User wording | --source |
|---|---|
| no source mentioned / "clawhub" / "openclaw official" / default | clawhub (default) |
| "skillhub.cn" / "腾讯 skillhub" / "tencent skillhub" / "国内 hub" / "skillhub 中国" | skillhub_cn |
| "skills.sh" / "npx skills" / "open skills" / "skills cli" | skills_sh |
| "anthropic" / "claude official" / "claude skills" / "anthropics/skills" | anthropic |
| "my hub" / "custom hub" / "self-hosted" / "private hub" / "company hub" | custom |
Ambiguity: if the user names multiple sources or is unclear, ask first ("Which source — clawhub / skillhub.cn / skills.sh / anthropic / custom?"); do not guess.
2. Workflow
- Parse the input:
- Extract the slug (e.g. "install my-tool" → slug =
my-tool) - Decide
sourcefrom the table above - For skills.sh, the slug must be
org/repoororg/repo#skillor a full git URL — ask if a bare word is given
- Extract the slug (e.g. "install my-tool" → slug =
- Call the script:
python3 <skill-dir>/scripts/install_skill.py <slug> --source <SRC> - Handle the structured exit code:
0success → relay the script output to the user1failure → relay the error and suggest a next step based on the message2name conflict → script prints JSON{"status":"conflict", "base_name", "suggested_rename", ...}. Tell the user about the conflict and let them choose:- Rename install (use
suggested_rename) → re-run with--rename <name> - Overwrite existing → re-run with
--rename <base_name>(script overwrites) - Abort → stop
- Rename install (use
3Anthropic license restriction → script prints JSON{"status":"license_required", "slug", ...}. Ask the user using the script's message verbatim ("This skill's license only permits use inside Claude — still install?"). On confirmation re-run with--force-license4skills.sh repo has multiple skills → script prints JSON{"status":"multi_skill", "available":[...], ...}. Show the list and let the user pick, then re-run with<repo>#<skill-name>5custom source selected butSKILL_HUB_CUSTOM_URLnot set → guide the user to configure it (see section 4 below)
- Report: on success, briefly state which directory it installed to and which source was used.
3. Naming convention
On normal install, the package's own name is used (no prefix).
Only on a name collision does the script offer a source-prefixed
suggested_rename:
| Source | Conflict prefix | Example (vs local coding-agent) |
|---|---|---|
| custom | custom- | custom-coding-agent |
| clawhub | clawhub- | clawhub-coding-agent |
| skillhub_cn | shcn- | shcn-coding-agent |
| skills.sh | sh- | sh-coding-agent |
| anthropic | claude- | claude-coding-agent |
After a rename the script syncs the SKILL.md frontmatter
name, so it won't trigger a new conflict.
4. Custom (self-hosted) hub — one-time setup
The custom source lets you install from your own hub — handy for private,
enterprise, or air-gapped skill registries. The only contract is:
A
GET <base>/<slug>request returns the skill packaged as a zip.
Configure the base URL once via the SKILL_HUB_CUSTOM_URL environment variable.
To avoid re-exporting it every session, write it to your shell rc file once:
# one-time: append to ~/.bashrc (or ~/.zshrc)
echo 'export SKILL_HUB_CUSTOM_URL="https://my-hub.example.com/api/skill/download"' >> ~/.bashrc
source ~/.bashrc
# verify it's set
echo "$SKILL_HUB_CUSTOM_URL"
# then install from your hub
python3 <skill-dir>/scripts/install_skill.py my-tool --source custom
# → GET https://my-hub.example.com/api/skill/download/my-tool → unzip into the skills dir
If SKILL_HUB_CUSTOM_URL is unset and --source custom is used, the script
exits 5 with an actionable message — it never makes a network call.
Where skills get installed
The installer resolves the target skills directory in this order:
SKILL_HUB_SKILLS_DIR(explicit override)OPENCLAW_SKILLS_DIR(OpenClaw-specific override)~/.claude/skills/→~/.openclaw/workspace/skills/→~/.config/skills/(first existing wins)
Set SKILL_HUB_SKILLS_DIR the same one-time way if your agent uses a non-standard path.
5. Source details
clawhub (default)
- REST first:
https://clawhub.ai/api/v1/download?slug=<slug> - Falls back to
npx clawhub@latest installif REST fails - Final directory name follows the package's SKILL.md
name(clawhub slugs often carry an owner prefix)
skillhub_cn (skillhub.cn)
- REST:
https://api.skillhub.cn/api/v1/download?slug=<slug>→ 302 → skill zip - No public CLI, so there is no fallback path (unlike clawhub's npx)
- 404 (slug not found) / 401 / 403 (private) / network errors reported clearly; a 200 with a JSON error body is detected and reported
- Final directory name follows the package's SKILL.md
name - China-optimized public hub; good when clawhub.ai is slow/unreachable from the user's network
skills.sh
- Calls
npx skills@latest add <repo> -y --copy [-s <skill-name>] - Source format:
org/repo→ installs all skills in the repo; if multiple, exits4to ask the userorg/repo#<skill-name>→ installs a single skill (recommended)- full URL / git remote — same rules
- A bare word (no
/) is rejected
anthropic
git clone --depth 1 --filter=blob:none --sparse anthropics/skills+sparse-checkout set skills/<slug>- License gating:
docx/xlsx/pdf/pptx/doc-coauthoring/internal-commsare source-available (Claude-only). The script blocks these and requires--force-license. - Other subdirs (algorithmic-art / canvas-design / frontend-design / mcp-builder / skill-creator / webapp-testing / ...) are Apache 2.0 and install freely.
- Defaults to a
claude-prefix to avoid local name collisions.
custom (self-hosted)
GET <SKILL_HUB_CUSTOM_URL>/<slug>→ expects a skill zip- 404 / 403 / network errors reported clearly; a 200 with a JSON error body (a hub returning an error masquerading as a zip) is detected and reported
- Requires
SKILL_HUB_CUSTOM_URL(exit5if unset)
6. Edge cases
- Wrong slug / 404: report and suggest checking the hub
- Illegal slug chars (
.., absolute path, special chars): rejected at entry (exit 1) to prevent path traversal - Network / timeout: report and suggest retry
- npx unavailable: clawhub/skills.sh paths need Node.js — say so
- Name collision (exit 2): see Workflow step 3 — must ask the user
- Anthropic source-available limit (exit 3): see Workflow step 3 — use the script's message verbatim
- skills.sh multi-skill repo (exit 4): see Workflow step 3 — show
availableand let the user pick - Custom hub not configured (exit 5): guide the user through section 4
- Malicious archive (path traversal): the script verifies zip/tar member paths don't escape the target dir and rejects malicious packages
7. Out of scope
- ❌ No cross-source auto-fallback (if not found, report clearly and let the user decide)
- ❌ No cross-source aggregated search (that's a different concern)
- ❌ Anthropic source-available skills are never installed by default —
--force-licenserequired - ❌ Never overwrites a local same-named skill without the user asking
Part of build-better-skills
This skill belongs to the build-better-skills suite.
For the full lifecycle map (Install → Audit → Release → Testing → Sediment),
all sibling skills, and their current status, see the
Stages table on the suite repo home — kept as the single source
of truth (this file does not duplicate it).
What ships with it: 4 files
42.0 KB alongside SKILL.md, 1 of them executable
scripts/
- install_skill.pyruns31.2 KB
- .gitignore128 B
- LICENSE1.1 KB
- README.md9.6 KB