agentleFS
abduznikabduznik/abduznik-skills/skills/hermes-agent-skill-authoring/SKILL.md

hermes-agent-skill-authoring

Skill2 starsChanged 2 months agoMITView on GitHub

Author in-repo SKILL.md: frontmatter, validator, structure.

  • Installs packages

15 other projects use a version of this, 15 of them edited.

Adopted by

Most recently taken up by

The file

We split this skill into the rules it gives an agent

8 rules. 1 is common, 1 is distinctive, and 6 are very specific to this project.

  • 1

    Common

    Most of the 15 edited versions we read keep these.

  • 1

    Distinctive

    This author's own choices. Worth a look.

  • 6

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  1. Common:

    Every in-repo skill follows roughly:

    line 67
  2. Very specific:

    Not every section is mandatory, but Overview + When to Use + actionable body + pitfalls are the minimum for the skill to feel like a peer.

    line 94
  3. Very specific:

    Read 2-3 peer SKILL.md files to match tone and structure.

    line 112
  4. Distinctive:

    When sharing a custom user-local skill publicly as a GitHub repo, follow these conventions:

    line 135
  5. Very specific:

    Delete the old name-only repo: if you created one without the -skill suffix first — orphan repos confuse people searching.

    line 149
  6. Very specific:

    When creating a skill via skill_manage(action='create') (the most common path for agent-authored skills):

    line 168
  7. Very specific:

    Forgetting the author/license/metadata block: Not validator-enforced, but every peer has it.

    line 193
  8. Very specific:

    Writing a skill that duplicates a peer: Before creating, ls skills/<category>/ and open 2-3 peers.

    line 195

“Common” is measured: kept by at least 6 in 10 of the 15 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md

Authoring Hermes-Agent Skills (in-repo)

Overview

There are two places a SKILL.md can live:

  1. User-local: ~/.hermes/skills/<maybe-category>/<name>/SKILL.md — personal, not shared. Created via skill_manage(action='create').
  2. In-repo (this skill is about this case): /home/bb/hermes-agent/skills/<category>/<name>/SKILL.md — committed, shipped with the package. Use write_file + git add. skill_manage(action='create') does NOT target this tree.

When to Use

  • User asks you to add a skill "in this branch / repo / commit"
  • You're committing a reusable workflow that should ship with hermes-agent
  • You're editing an existing skill under /home/bb/hermes-agent/skills/ (use patch for small edits, write_file for rewrites; skill_manage still works for patch on in-repo skills, but not for create)

Required Frontmatter

Source of truth: tools/skill_manager_tool.py::_validate_frontmatter. Hard requirements:

  • Starts with --- as the first bytes (no leading blank line).
  • Closes with \n---\n before the body.
  • Parses as a YAML mapping.
  • name field present.
  • description field present, ≤ 1024 chars (MAX_DESCRIPTION_LENGTH).
  • Non-empty body after the closing ---.

Peer-matched shape used by every skill under skills/software-development/:

---
name: my-skill-name               # lowercase, hyphens, ≤64 chars (MAX_NAME_LENGTH)
description: Use when <trigger>. <one-line behavior>.
version: 1.0.0
author: Hermes Agent
license: MIT
metadata:
  hermes:
    tags: [short, descriptive, tags]
    related_skills: [other-skill, another-skill]
---

version / author / license / metadata are NOT enforced by the validator, but every peer has them — omit and your skill sticks out.

Size Limits

  • Description: ≤ 1024 chars (enforced).
  • Full SKILL.md: ≤ 100,000 chars (enforced as MAX_SKILL_CONTENT_CHARS, ~36k tokens).
  • Peer skills in software-development/ sit at 8-14k chars. Aim for that range. If you're pushing past 20k, split into references/*.md and reference them from SKILL.md.

Peer-Matched Structure

Every in-repo skill follows roughly:

# <Title>

## Overview
One or two paragraphs: what and why.

## When to Use
- Bulleted triggers
- "Don't use for:" counter-triggers

## <Topic sections specific to the skill>
- Quick-reference tables are common
- Code blocks with exact commands
- Hermes-specific recipes (tests via scripts/run_tests.sh, ui-tui paths, etc.)

## Common Pitfalls
Numbered list of mistakes and their fixes.

## Verification Checklist
- [ ] Checkbox list of post-action verifications

## One-Shot Recipes (optional)
Named scenarios → concrete command sequences.

Not every section is mandatory, but Overview + When to Use + actionable body + pitfalls are the minimum for the skill to feel like a peer.

Directory Placement

skills/<category>/<skill-name>/SKILL.md

Categories currently in repo (confirm with ls skills/): autonomous-ai-agents, creative, data-science, devops, dogfood, email, gaming, github, leisure, mcp, media, mlops/*, note-taking, productivity, red-teaming, research, smart-home, social-media, software-development.

Pick the closest existing category. Don't invent new top-level categories casually.

Workflow

  1. Survey peers in the target category:
    ls skills/<category>/
    Read 2-3 peer SKILL.md files to match tone and structure.
  2. Check validator constraints in tools/skill_manager_tool.py if unsure.
  3. Draft with write_file to skills/<category>/<name>/SKILL.md.
  4. Validate locally:
    import yaml, re, pathlib
    content = pathlib.Path("skills/<category>/<name>/SKILL.md").read_text()
    assert content.startswith("---")
    m = re.search(r'\n---\s*\n', content[3:])
    fm = yaml.safe_load(content[3:m.start()+3])
    assert "name" in fm and "description" in fm
    assert len(fm["description"]) <= 1024
    assert len(content) <= 100_000
  5. Git add + commit on the active branch.
  6. Note: the CURRENT session's skill loader is cached — skill_view / skills_list will not see the new skill until a new session. This is expected, not a bug.

Cross-Referencing Other Skills

metadata.hermes.related_skills unions both trees (skills/ in-repo and ~/.hermes/skills/) at load time. You CAN reference a user-local skill from an in-repo skill, but it won't resolve for other users who clone the repo fresh. Prefer referencing only in-repo skills from in-repo skills. If a frequently-referenced skill lives only in ~/.hermes/skills/, consider promoting it to the repo.

Publishing Skills to GitHub

When sharing a custom user-local skill publicly as a GitHub repo, follow these conventions:

Repo name — append -skill suffix. The repo is a skill package, not a standalone library. my-skill → my-skill-skill.

Include both SKILL.md and README.md:

  • SKILL.md — the full Hermes skill definition with YAML frontmatter. This is what skill_view loads and what Hermes uses.
  • README.md — GitHub front-page rendered docs. Should be a Hermes headstart setup guide covering:
    • Clone path: git clone <repo> /path/to/hermes/data/skills/<name>
    • Dependency install: pip install <pkg> or platform-specific commands
    • First-use example: what to tell the Hermes agent to trigger the skill
    • Python API usage and documentation (same as SKILL.md body but platform-agnostic)

Why two files? GitHub renders README.md as the repo front page. SKILL.md is Hermes-internal — it has YAML frontmatter that GitHub doesn't render well. Both should stay in sync content-wise; README.md drops the frontmatter and adds the Hermes setup section at the top.

Delete the old name-only repo if you created one without the -skill suffix first — orphan repos confuse people searching.

Support Files (references/ templates/ scripts/)

Skills can carry three kinds of support files — use the right directory per kind:

DirectoryPurposeExample
references/Session-specific detail (error transcripts, reproduction recipes, provider quirks) AND condensed knowledge banks (quoted research, API docs, external authoritative excerpts).references/s3-signed-urls.md
templates/Starter files meant to be copied and modified — boilerplate configs, scaffolding, known-good examples the agent can reproduce with modifications.templates/pytest.ini
scripts/Statically re-runnable actions the skill can invoke directly — verification scripts, fixture generators, deterministic probes.scripts/smoke_test.py

Add via: skill_manage(action='write_file', name='<skill>', file_path='scripts/<name>', file_content=...) Remove via: skill_manage(action='remove_file', name='<skill>', file_path='scripts/<name>')

Support files show up under linked_files in skill_view() output, making them discoverable to future sessions.

User-Local Skill Creation Workflow

When creating a skill via skill_manage(action='create') (the most common path for agent-authored skills):

  1. Draft the SKILL.md with full YAML frontmatter (name, description, category, tags). Aim for 8-15k chars.
  2. Create via skill_manage(action='create', name='<name>', content='<full SKILL.md>'). If the directory already exists (e.g. from a prior write_file), the tool reports a conflict — use skill_manage(action='edit') to overwrite instead.
  3. Add support files immediately: skill_manage(action='write_file', name='<name>', file_path='scripts/<name>', file_content=...). This registers them as linked_files.
  4. Patch SKILL.md to include a support-files reference table so future agents see the pointers.
  5. Verify with skill_view(name='<name>') — confirm linked_files lists everything and the content is correct.

This workflow produces a class-level skill with discoverable support files, avoiding loose files in the skill directory root.

Editing Existing In-Repo Skills

  • Small fix (typo, added pitfall, tightened trigger): skill_manage(action='patch', name=..., old_string=..., new_string=...) works fine on in-repo skills.
  • Major rewrite: write_file the whole SKILL.md. skill_manage(action='edit') also works but requires supplying the full new content.
  • Adding supporting files: write_file to skills/<category>/<name>/references/<file>.md, templates/<file>, or scripts/<file>. skill_manage(action='write_file') also works and enforces the references/templates/scripts/assets subdir allowlist.
  • Always commit the edit — in-repo skills are source, not runtime state.

Common Pitfalls

  1. Using skill_manage(action='create') for an in-repo skill. It writes to ~/.hermes/skills/, not the repo tree. Use write_file for in-repo creation.
  2. Leading whitespace before ---. The validator checks content.startswith("---"); any leading blank line or BOM fails validation.
  3. Description too generic. Peer descriptions start with "Use when ..." and describe the trigger class, not the one task. "Use when debugging X" > "Debug X".
  4. Forgetting the author/license/metadata block. Not validator-enforced, but every peer has it; omitting makes the skill look half-finished.
  5. Writing a skill that duplicates a peer. Before creating, ls skills/<category>/ and open 2-3 peers. Prefer extending an existing skill to creating a narrow sibling.
  6. Expecting the current session to see the new skill. It won't. The skill loader is initialized at session start. Verify in a fresh session or via skill_view using the exact path.
  7. Linking to skills that don't exist in-repo. related_skills: [some-user-local-skill] works for you but breaks for other clones. Prefer only in-repo links.

Verification Checklist

  • File is at skills/<category>/<name>/SKILL.md (not in ~/.hermes/skills/)
  • Frontmatter starts at byte 0 with ---, closes with \n---\n
  • name, description, version, author, license, metadata.hermes.{tags, related_skills} all present
  • Name ≤ 64 chars, lowercase + hyphens
  • Description ≤ 1024 chars and starts with "Use when ..."
  • Total file ≤ 100,000 chars (aim for 8-15k)
  • Structure: # Title → ## Overview → ## When to Use → body → ## Common Pitfalls → ## Verification Checklist
  • related_skills references resolve in-repo (or are explicitly OK to be user-local)
  • git add skills/<category>/<name>/ && git commit completed on the intended branch

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

No reviews yet

People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.

  • It worked
  • Partly
  • It didn't
What did you use it for? e.g. Reviewing pull requests in a Rails app

Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.