fix(skills-hub): show every catalog source on /docs/skills (skills.sh, ClawHub, browse.sh, OpenAI, …) (#32336)
Some checks are pending
Deploy Site / deploy-vercel (push) Waiting to run
Deploy Site / deploy-docs (push) Waiting to run
Docker / shell lint / Lint Dockerfile (hadolint) (push) Waiting to run
Docker / shell lint / Lint docker/ shell scripts (shellcheck) (push) Waiting to run
Docker Build and Publish / build-amd64 (push) Waiting to run
Docker Build and Publish / build-arm64 (push) Waiting to run
Docker Build and Publish / merge (push) Blocked by required conditions
Docker Build and Publish / move-latest (push) Blocked by required conditions
Lint (ruff + ty) / ruff + ty diff (push) Waiting to run
Lint (ruff + ty) / ruff enforcement (blocking) (push) Waiting to run
Lint (ruff + ty) / Windows footguns (blocking) (push) Waiting to run
Nix / nix (macos-latest) (push) Waiting to run
Nix / nix (ubuntu-latest) (push) Waiting to run
Build Skills Index / build-index (push) Waiting to run
Build Skills Index / trigger-deploy (push) Blocked by required conditions
Tests / test (1) (push) Waiting to run
Tests / test (2) (push) Waiting to run
Tests / test (3) (push) Waiting to run
Tests / test (4) (push) Waiting to run
Tests / test (5) (push) Waiting to run
Tests / test (6) (push) Waiting to run
Tests / save-durations (push) Blocked by required conditions
Tests / e2e (push) Waiting to run

The Skills Hub page was stuck on a stale Feb 25 snapshot, showing only Built-in
+ Optional + Anthropic + LobeHub. The unified index already has 2078 skills
from skills.sh / ClawHub / LobeHub / GitHub taps / Claude Marketplace, and
BrowseShSource adds another ~330 — none of it was reaching the page.

Changes:

- website/scripts/extract-skills.py: read website/static/api/skills-index.json
  (the unified multi-source catalog, rebuilt twice daily) as the canonical
  external source. Keep the legacy skills/index-cache/ fallback for offline
  builds. Add friendly per-source labels (skills.sh, ClawHub, browse.sh,
  OpenAI, HuggingFace, Anthropic, LobeHub, etc.) and per-entry installCmd.
- website/src/pages/skills/index.tsx: add source pills + ordering for the 11
  new sources; render installCmd from the index entry.
- website/scripts/prebuild.mjs: when no local skills-index.json exists, fetch
  the live one from hermes-agent.nousresearch.com so local 'npm run build'
  matches production without burning GitHub API quota.
- scripts/build_skills_index.py: crawl BrowseShSource so browse.sh entries
  land in the unified index. Adjust source_order.
- tools/skills_hub.py: GitHubSource.DEFAULT_TAPS — openai/skills moved its
  skills into skills/.curated/ and skills/.system/, so add both as explicit
  taps (the listing code skips dotted dirs by design). Drop
  VoltAgent/awesome-agent-skills (README-only, no SKILL.md files) and
  MiniMax-AI/cli (singular skill, not a tap directory). Net effect: github
  source jumps from 83 → 143 skills, with OpenAI properly included.
- .github/workflows/deploy-site.yml: build the unified index BEFORE running
  extract-skills.py — previous order meant extract-skills always fell back
  to the legacy cache. Drop the 'skip if file exists' guard; the file is
  gitignored and must be rebuilt every deploy.
- .github/workflows/skills-index.yml: drop the broken 'deploy-with-index'
  job (it cp'd 'landingpage/\*' which no longer exists, failing every cron
  run since the landingpage move). Replace it with a workflow_dispatch
  trigger of deploy-site.yml so the index refresh still reaches production
  on schedule.
- website/docs/user-guide/features/skills.md: drop VoltAgent from the
  default-taps doc list to match the code.

Before: 695 skills (Built-in 90, Optional 84, Anthropic 16, LobeHub 505).
After:  2168 skills across 9 source pills, including the 1212 skills.sh
        entries the user expected to see.
This commit is contained in:
Teknium 2026-05-25 18:34:54 -07:00 committed by GitHub
parent c26af46811
commit cea87d9139
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
8 changed files with 396 additions and 95 deletions

View file

@ -18,6 +18,8 @@ interface Skill {
envVars?: string[];
commands?: string[];
docsPath?: string;
identifier?: string;
installCmd?: string;
}
const allSkills: Skill[] = skills as Skill[];
@ -95,9 +97,96 @@ const SOURCE_CONFIG: Record<
border: "rgba(167, 139, 250, 0.2)",
icon: "\u{25A0}",
},
"skills.sh": {
label: "skills.sh",
color: "#34d399",
bg: "rgba(52, 211, 153, 0.08)",
border: "rgba(52, 211, 153, 0.2)",
icon: "\u{2734}",
},
ClawHub: {
label: "ClawHub",
color: "#f472b6",
bg: "rgba(244, 114, 182, 0.08)",
border: "rgba(244, 114, 182, 0.2)",
icon: "\u{2726}",
},
"browse.sh": {
label: "browse.sh",
color: "#22d3ee",
bg: "rgba(34, 211, 238, 0.08)",
border: "rgba(34, 211, 238, 0.2)",
icon: "\u{29BF}",
},
OpenAI: {
label: "OpenAI",
color: "#10b981",
bg: "rgba(16, 185, 129, 0.08)",
border: "rgba(16, 185, 129, 0.2)",
icon: "\u{2737}",
},
HuggingFace: {
label: "HuggingFace",
color: "#fbbf24",
bg: "rgba(251, 191, 36, 0.08)",
border: "rgba(251, 191, 36, 0.2)",
icon: "\u{1F917}",
},
VoltAgent: {
label: "VoltAgent",
color: "#facc15",
bg: "rgba(250, 204, 21, 0.08)",
border: "rgba(250, 204, 21, 0.2)",
icon: "\u{26A1}",
},
GitHub: {
label: "GitHub",
color: "#94a3b8",
bg: "rgba(148, 163, 184, 0.08)",
border: "rgba(148, 163, 184, 0.2)",
icon: "\u{2756}",
},
"Well-Known": {
label: "Well-Known",
color: "#818cf8",
bg: "rgba(129, 140, 248, 0.08)",
border: "rgba(129, 140, 248, 0.2)",
icon: "\u{2756}",
},
gstack: {
label: "gstack",
color: "#fb923c",
bg: "rgba(251, 146, 60, 0.08)",
border: "rgba(251, 146, 60, 0.2)",
icon: "\u{2756}",
},
MiniMax: {
label: "MiniMax",
color: "#f87171",
bg: "rgba(248, 113, 113, 0.08)",
border: "rgba(248, 113, 113, 0.2)",
icon: "\u{2756}",
},
};
const SOURCE_ORDER = ["all", "built-in", "optional", "Anthropic", "LobeHub", "Claude Marketplace"];
const SOURCE_ORDER = [
"all",
"built-in",
"optional",
"Anthropic",
"OpenAI",
"HuggingFace",
"skills.sh",
"ClawHub",
"browse.sh",
"LobeHub",
"Claude Marketplace",
"VoltAgent",
"Well-Known",
"GitHub",
"gstack",
"MiniMax",
];
function highlightMatch(text: string, query: string): React.ReactNode {
if (!query || !text) return text;
@ -250,7 +339,7 @@ function SkillCard({
</div>
)}
<div className={styles.installHint}>
<code>hermes skills install {skill.name}</code>
<code>{skill.installCmd || `hermes skills install ${skill.name}`}</code>
</div>
{skill.docsPath && (
<a