https://github.com/0xNyk/awesome-hermes-agent (primary curated list)~/.hermes/skills/ (symlinked or copied)systemctl restart hermes-gatewayhermes skills CLI — the built-in subcommand for browsing, searching, and installing hub skills (hermes skills browse/search/install/check/update)~/.hermes/skills/ | Installed skill directories (gateway scans depth 2) |
| ~/.hermes/skill-repos/ | Cloned git repos for persistence + future pulls |
| /usr/local/lib/hermes-agent/optional-skills/ | Hub-installed skills (via hermes skills install) |
| /tmp/awesome-hermes-agent/ | Ephemeral clone of curated list (refreshed each run) |
| /tmp/new-skill-checks/ | Temp dir for cloning candidate repos before installing |
| scripts/gateway-smoke-test.sh | Hermes gateway health verification (8 checks) |
| scripts/openclaw-smoke-test.sh | OpenClaw deployment health verification (6 checks) |
| scripts/skill-verify.sh | Validate SKILL.md meets quality standards (6 checks) |
| references/llm-council-scoring.md | Full LLM council evaluation workflow, rubric, provider pitfalls, and historical results |
# Count discoverable vs total
find ~/.hermes/skills -maxdepth 2 -name "SKILL.md" -type f | wc -l # discoverable
find ~/.hermes/skills -name "SKILL.md" -type f | wc -l # total
Check for broken files
find ~/.hermes/skills -maxdepth 2 -name "SKILL.md" -type f | while read f; do
head -5 "$f" | grep -q "^name:" || echo "BROKEN: $f"
done
Check broken symlinks
find ~/.hermes/skills -type l ! -exec test -e {} \; -print
Token impact
find ~/.hermes/skills -maxdepth 2 -name "SKILL.md" -type f -exec grep "^description:" {} \; | wc -c
Divide by 4 for estimated tokens
cd ~/.hermes/skills
for dir in */; do
[ -d "$dir/.git" ] && (cd "$dir" && git pull --ff-only 2>&1 | tail -1)
done
Also update skill-repos
cd ~/.hermes/skill-repos
for dir in */; do
[ -d "$dir/.git" ] && (cd "$dir" && git pull --ff-only 2>&1 | tail -1)
done
Step 3a: Check official hub for new skills (fastest, no GitHub auth needed):
# List all available official hub skills
hermes skills browse --size 100 --source official
Parse skill names (the '#' column has row numbers, name is column 2)
hermes skills browse --size 100 --source official 2>&1 > /tmp/hub_browse.txt
python3 -c "
import re
with open('/tmp/hub_browse.txt') as f:
content = f.read()
skills = re.findall(r'│\s+\d+\s+│\s+(\S+)\s+│', content)
print(f'Hub has {len(skills)} skills')
for s in skills: print(s)
" > /tmp/hub_skill_names.txt
Compare against installed (at depth 2 in ~/.hermes/skills/ + hub optional-skills/)
find ~/.hermes/skills -maxdepth 2 -name "SKILL.md" -type f | while read f; do
dir=\$(dirname "\$f"); basename "\$dir"
done | sort -u > /tmp/installed_local.txt
find /usr/local/lib/hermes-agent/optional-skills -maxdepth 3 -name "SKILL.md" -type f | while read f; do
grep "^name:" "\$f" | head -1 | sed 's/name: *//'
done | sort -u > /tmp/installed_hub.txt
cat /tmp/installed_local.txt /tmp/installed_hub.txt | sort -u > /tmp/installed_all.txt
Find missing skills
comm -23 /tmp/hub_skill_names.txt /tmp/installed_all.txt
Install missing ones directly (no git clone needed):
hermes skills install # e.g. hermes skills install sherlock
Step 3b: Refresh awesome-hermes-agent (for community/repo-based skills):
# Clone or pull the curated list
if [ -d /tmp/awesome-hermes-agent ]; then
cd /tmp/awesome-hermes-agent && git pull --ff-only
else
git clone --depth 1 https://github.com/0xNyk/awesome-hermes-agent /tmp/awesome-hermes-agent
fi
Extract repo URLs — filter to actual repos (must have owner/repo, not just user profiles)
grep -o 'https://github\.com/[^)"]*' /tmp/awesome-hermes-agent/README.md \
| grep -E 'github\.com/[^/]+/[^/]+$' \
| grep -v '/issues\|/releases\|/tree/' \
| sort -u
Pitfall: No GitHub auth = can't clone repos. If git clone from GitHub fails with "could not read Username", the official hub (hermes skills install) still works because it uses the skills.sh registry API — no auth needed. Prefer hub installs when available; fall back to awesome-list only for skills not on the hub.
/tmp/new-skill-checks/ first — never install directly. Filter out repos already in ~/.hermes/skill-repos/. Skip private/deleted repos gracefully.
mkdir -p /tmp/new-skill-checks && cd /tmp/new-skill-checks
Extract owner/repo from awesome list URLs
Compare against existing skill-repos to find NEW ones only
for repo in ; do
dirname=$(echo "$repo" | tr '/' '_')
echo -n "Cloning $repo ... "
git clone --depth 1 "https://github.com/$repo.git" "$dirname" 2>&1 | tail -1
# Private/deleted repos will fail with: "fatal: could not read Username" — skip them
done
Check which cloned repos actually contain SKILL.md files
for d in */; do
count=$(find "$d" -name "SKILL.md" -type f 2>/dev/null | wc -l)
[ "$count" -gt 0 ] && echo " $d: $count skills"
done
hermes skills install), then from cloned repos.
From hub (preferred):
hermes skills install
Installs to /usr/local/lib/hermes-agent/optional-skills///
No git clone needed, no GitHub auth required
From cloned repos (for skills NOT on the hub):
CRITICAL: Only install repos that contain SKILL.md files. Many awesome-list entries are Docker configs, templates, or tools — NOT skill packs. The find SKILL.md check in Step 4 filters these out.
Size-based install strategy:
~/.hermes/skills/ (gateway scans depth 2, nested skills are on-demand)skills/ subdirectoryDEST=~/.hermes/skills
For each validated repo from Step 4:
for repo_dir in /tmp/new-skill-checks//; do
name=
if [ ! -d "$DEST/$name" ]; then
cp -r "$repo_dir" "$DEST/$name"
echo "Installed $name"
else
echo " $name: already exists, skipping"
fi
done
For large packs (100+ skills), create an index SKILL.md:
mkdir -p "$DEST//skills"
cp -r /tmp/new-skill-checks//skills/* "$DEST//skills/"
cat > "$DEST//SKILL.md" << 'EOF'
name:
description: >-
EOF
Persist new repos to skill-repos/ for future git pulls:
for repo_dir in /tmp/new-skill-checks/*/; do
name=$(basename "$repo_dir")
[ -d "$repo_dir/.git" ] && [ ! -d ~/.hermes/skill-repos/"$name" ] && cp -r "$repo_dir" ~/.hermes/skill-repos/"$name"
done
# Add frontmatter if missing
with open("SKILL.md", "r") as f:
content = f.read()
if not content.startswith("---"):
fm = '---\nname: skill-name\ndescription: Auto-repaired skill\n---\n\n'
with open("SKILL.md", "w") as f:
f.write(fm + content)
# Token impact — measure BOTH local and hub-installed skills
local_chars=$(find ~/.hermes/skills -maxdepth 2 -name "SKILL.md" -type f -exec grep "^description:" {} \; | wc -c)
hub_chars=$(find /usr/local/lib/hermes-agent/optional-skills -maxdepth 3 -name "SKILL.md" -type f -exec grep "^description:" {} \; | wc -c)
total=$((local_chars + hub_chars))
echo "Local: $local_chars chars | Hub: $hub_chars chars | Total: $total chars"
echo "Estimated tokens: $((total / 4)) (target: < 25K = 20% of 128K)"
Total skill counts
local_count=$(find ~/.hermes/skills -maxdepth 2 -name "SKILL.md" -type f | wc -l)
hub_count=$(find /usr/local/lib/hermes-agent/optional-skills -maxdepth 3 -name "SKILL.md" -type f | wc -l)
nested_count=$(find ~/.hermes/skills -name "SKILL.md" -type f | wc -l)
echo "Discoverable: $local_count local + $hub_count hub = $((local_count + hub_count))"
echo "Total incl nested: $nested_count + $hub_count = $((nested_count + hub_count))"
Restart gateway
systemctl restart hermes-gateway
sleep 5
systemctl is-active hermes-gateway
playwright-skill, hermes-dojo, claudeception, reflexion, felo-skillstaste-skill, seo-geo-skills, screenshotone-skills, hermes-nexthermes-plugins, cybersecurity-skills, open-design, wondelai-skillsoh-my-hermes, agentcash, hermes-alpha, hermes-councilhermes-genesis, hermes-skill-factory, hermes-embodied, mercuryyoutube-skills, mistral-mcp, chainlink-skills, super-hermesskillsdotnet, pydanticai-docs, hermes-research-agent, bfl-skillshermeshub-reviewer, hermes-life-os, hermes-incident-commanderhermes-skill-marketplace, MeiGen-AI-Design-MCPcybersecurity-mitre-pack — 753 MITRE ATT&CK skills (nested in skills/)open-design — 134 design system skills (nested in skills/)wondelai-skills — 42 business/design skills (nested in skills/)After creating new skills (especially large ones 10K+), validate quality with LLM Council scoring:
Scoring rubric (10 dims × 10pts = 100 total):
Pass threshold: 80/100.
Critical: send FULL skill content (not truncated) to evaluators. Most LLM APIs truncate to ~3K chars, missing security/testing/deployment sections. Use a model with 128K+ context (Groq Llama 3.3 70B works well) and send the complete SKILL.md. Add 2-3 second delays between calls to avoid rate limits. If Groq key expires mid-session, switch to OpenRouter + google/gemini-2.0-flash-001. See references/llm-council-scoring.md for the full evaluation workflow, rubric details, past scoring results (coding + devops), and the OpenRouter fallback procedure.
~/.hermes/skills/*/SKILL.md at depth 2 — nested packs must be indexed/usr/local/lib/hermes-agent/optional-skills/ — they are NOT in ~/.hermes/skills/. Always measure token impact from BOTH pathshermes skills list shows combined counts: "N builtin" = hub/optional skills, "M local" = ~/.hermes/skills/hermes skills check/update only work for hub-installed skills (hermes skills install), NOT for git-cloned local skillsskills/ subdirectory, NOT flat install/tmp/ are ephemeral — ALWAYS copy validated repos to ~/.hermes/skill-repos/ for persistencesystemctl restart hermes-gateway after changes — it caches skill listgrep -E 'github\.com/[^/]+/[^/]+$' to exclude bare profile linkscode-review in multiple repos). Use descriptive top-level dir names to avoid overwrites0xNyk on GitHub — if that URL changes, check NousResearch org for updated linkhermes skills browse output — the table has multi-line rows with row numbers in column 1. Use regex │\s+\d+\s+│\s+(\S+)\s+│ to extract skill names. Simple awk -F'│' catches row numbers as skill namesgit clone from GitHub may fail with "could not read Username". Use hermes skills install for hub-available skills instead (no auth needed). For community-only repos, the user needs gh auth login first/tmp/ is ephemeral — awesome-hermes-agent clone in /tmp/ disappears on reboot. Always re-clone if missing; don't assume persistence--- frontmatter blocks. Always validate frontmatter after delegate_task skill creationreferences/llm-council-scoring.md for full details including provider-specific parsing pitfalls, score parser code, and historical results... blocks in the content field — strip before parsing; (2) return markdown bold format like 1._DESIGN: N/10 — use tolerant parser that strips ** and numbered prefixes; (3) content can be null — fall back to reasoning_content field## Best Practices~/.hermes/skills/agents/## Best Practiceshermes-skills-install, skill-library-management, and hermes-skills-upgrade all cover skill installation. hermes-skills-upgrade is the authoritative workflow; the others are complementary but narrowerskill_view. 8 coding skills (13-24KB each) added ~1.5K tokens over target — acceptable for rich skills, but monitor if adding many large skillswrite_file directly for creating SKILL.md files when content is >15KB. delegate_task still works for smaller tasks but not for crafting comprehensive skills## Best Practices — when boosting weak dimensions (Security, Deployment, Performance), insert new sections just before the Best Practices section. This preserves existing content order and adds the missing material exactly where evaluators expect it