User-local:~/.hermes/skills/<maybe-category>/<name>/SKILL.md — personal, not shared. Created via skill_manage(action='create').
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).
Long descriptions are truncated to 57 chars + "..." in the system
prompt skill index (extract_skill_description in agent/skill_utils.py);
longer text is visible via skills_list() and skill_view().
Front-load the trigger phrase.
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>. # first 57 chars shown in system prompt
version: 1.1.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). Long descriptions render as the first 57 chars
plus "..." in the system prompt skill index; the rest is visible via skills_list()
and skill_view().
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.
Writing Quality Principles
A skill exists to make the agent's process more predictable. Predictability does not mean identical output every run; it means the agent reliably follows the same useful discipline.
Use these quality checks when writing or editing any skill:
Optimize for process predictability. Ask: what behavior should change when this skill loads? If a line does not change behavior, cut it.
Choose the right context load. A model-invoked Hermes skill pays for its description every turn. Keep descriptions focused on trigger classes and the skill's distinctive behavior. Put details in the body or linked references.
Use an information hierarchy. Put always-needed steps in SKILL.md; put branch-specific or bulky reference material in references/, templates/, or scripts/ and point to it only when needed.
End steps with completion criteria. Each ordered step should say how the agent knows it is done. Good criteria are checkable and, when it matters, exhaustive: "every modified file accounted for" beats "summarize changes."
Co-locate rules with the concept they govern. Avoid scattering one idea across the file. Keep definition, caveats, examples, and verification near each other.
Use strong leading words. Prefer compact concepts the model already knows — e.g. "tight loop," "tracer bullet," "root cause," "regression test" — over long repeated explanations. A good leading word saves tokens and anchors behavior.
Prune duplication and no-ops. Keep each meaning in one source of truth. Sentence by sentence, ask whether the sentence changes agent behavior versus the default. If not, delete it rather than polishing it.
Watch for premature completion. If agents tend to rush a step, first sharpen that step's completion criterion. Split the sequence only when later steps distract from doing the current step well.
Common quality failures:
Premature completion — the skill lets the agent move on before the work is genuinely done.
Duplication — the same rule appears in multiple places and drifts.
Sediment — stale lines remain because adding felt safer than deleting.
Sprawl — too much always-visible material; push branch-specific reference behind pointers.
No-op prose — generic advice the agent would already follow without the skill.
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, 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
Survey peers in the target category:
ls skills/<category>/
Read 2-3 peer SKILL.md files to match tone and structure.
Check validator constraints in tools/skill_manager_tool.py if unsure.
Draft with write_file to skills/<category>/<name>/SKILL.md.
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
Git add + commit on the active branch.
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.
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
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.
Leading whitespace before ---. The validator checks content.startswith("---"); any leading blank line or BOM fails validation.
Description too generic or trigger buried past char 57. The system prompt
skill index truncates long descriptions at 57 chars. Peer descriptions start
with "Use when ..." and complete the trigger class within that window.
Good: Use when debugging Hermes skill discovery failures.
Bad: This skill contains detailed guidance for agents working on Hermes skill discovery failures.
Forgetting the author/license/metadata block. Not validator-enforced, but every peer has it; omitting makes the skill look half-finished.
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.
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.
Letting skills accumulate sediment. A skill should get shorter or sharper over time. When adding a rule, remove the old wording it replaces; don't layer advice forever.
Writing no-op prose. "Be careful," "be thorough," and "use best practices" rarely change model behavior. Replace with a checkable completion criterion or a stronger leading word.
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, trigger phrase self-contained within first 57 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
Each ordered step has a checkable completion criterion
Description is trigger-focused and avoids duplicated body content
Bulky or branch-specific reference is progressively disclosed in linked files
No-op prose and duplicated rules removed
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
1---2name: hermes-agent-skill-authoring3description: Author in-repo SKILL.md files: frontmatter and structure.4---567# Authoring Hermes-Agent Skills (in-repo)
89## Overview
1011There are two places a SKILL.md can live:
12131. **User-local:** `~/.hermes/skills/<maybe-category>/<name>/SKILL.md` — personal, not shared. Created via `skill_manage(action='create')`.
142. **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.
1516## When to Use
1718- User asks you to add a skill "in this branch / repo / commit"
19- You're committing a reusable workflow that should ship with hermes-agent
20- 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`)
2122## Required Frontmatter
2324Source of truth: `tools/skill_manager_tool.py::_validate_frontmatter`. Hard requirements:
2526- Starts with `---` as the first bytes (no leading blank line).
27- Closes with `\n---\n` before the body.
28- Parses as a YAML mapping.
29- `name` field present.
30- `description` field present, ≤ **1024 chars** (`MAX_DESCRIPTION_LENGTH`).
31 **Long descriptions are truncated to 57 chars + "..." in the system
32 prompt skill index** (`extract_skill_description` in `agent/skill_utils.py`);
33 longer text is visible via `skills_list()` and `skill_view()`.
34 Front-load the trigger phrase.
35- Non-empty body after the closing `---`.
3637Peer-matched shape used by every skill under `skills/software-development/`:
3839```yaml
40---
41name: my-skill-name # lowercase, hyphens, ≤64 chars (MAX_NAME_LENGTH)
42description: Use when <trigger>. <one-line behavior>. # first 57 chars shown in system prompt
43version: 1.1.0
44author: Hermes Agent
45license: MIT
46metadata:
47 hermes:
48 tags: [short, descriptive, tags]
49 related_skills: [other-skill, another-skill]
50---
51```
5253`version` / `author` / `license` / `metadata` are NOT enforced by the validator, but every peer has them — omit and your skill sticks out.
5455## Size Limits
5657- Description: ≤ 1024 chars (enforced). **Long descriptions render as the first 57 chars
58 plus "..." in the system prompt skill index;** the rest is visible via `skills_list()`
59 and `skill_view()`.
60- Full SKILL.md: ≤ 100,000 chars (enforced as `MAX_SKILL_CONTENT_CHARS`, ~36k tokens).
61- 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.
6263## Writing Quality Principles
6465A skill exists to make the agent's process more predictable. Predictability does **not** mean identical output every run; it means the agent reliably follows the same useful discipline.
6667Use these quality checks when writing or editing any skill:
68691. **Optimize for process predictability.** Ask: what behavior should change when this skill loads? If a line does not change behavior, cut it.
702. **Choose the right context load.** A model-invoked Hermes skill pays for its description every turn. Keep descriptions focused on trigger classes and the skill's distinctive behavior. Put details in the body or linked references.
713. **Use an information hierarchy.** Put always-needed steps in `SKILL.md`; put branch-specific or bulky reference material in `references/`, `templates/`, or `scripts/` and point to it only when needed.
724. **End steps with completion criteria.** Each ordered step should say how the agent knows it is done. Good criteria are checkable and, when it matters, exhaustive: "every modified file accounted for" beats "summarize changes."
735. **Co-locate rules with the concept they govern.** Avoid scattering one idea across the file. Keep definition, caveats, examples, and verification near each other.
746. **Use strong leading words.** Prefer compact concepts the model already knows — e.g. "tight loop," "tracer bullet," "root cause," "regression test" — over long repeated explanations. A good leading word saves tokens and anchors behavior.
757. **Prune duplication and no-ops.** Keep each meaning in one source of truth. Sentence by sentence, ask whether the sentence changes agent behavior versus the default. If not, delete it rather than polishing it.
768. **Watch for premature completion.** If agents tend to rush a step, first sharpen that step's completion criterion. Split the sequence only when later steps distract from doing the current step well.
7778Common quality failures:
7980- **Premature completion** — the skill lets the agent move on before the work is genuinely done.
81- **Duplication** — the same rule appears in multiple places and drifts.
82- **Sediment** — stale lines remain because adding felt safer than deleting.
83- **Sprawl** — too much always-visible material; push branch-specific reference behind pointers.
84- **No-op prose** — generic advice the agent would already follow without the skill.
8586## Peer-Matched Structure
8788Every in-repo skill follows roughly:
8990```
91# <Title>
9293## Overview
94One or two paragraphs: what and why.
9596## When to Use
97- Bulleted triggers
98- "Don't use for:" counter-triggers
99100## <Topic sections specific to the skill>
101- Quick-reference tables are common
102- Code blocks with exact commands
103- Hermes-specific recipes (tests via scripts/run_tests.sh, ui-tui paths, etc.)
104105## Common Pitfalls
106Numbered list of mistakes and their fixes.
107108## Verification Checklist
109- [ ] Checkbox list of post-action verifications
110111## One-Shot Recipes (optional)
112Named scenarios → concrete command sequences.
113```
114115Not every section is mandatory, but `Overview` + `When to Use` + actionable body + pitfalls are the minimum for the skill to feel like a peer.
116117## Directory Placement
118119```
120skills/<category>/<skill-name>/SKILL.md
121```
122123Categories currently in repo (confirm with `ls skills/`): `autonomous-ai-agents`, `creative`, `data-science`, `devops`, `email`, `gaming`, `github`, `leisure`, `mcp`, `media`, `mlops/*`, `note-taking`, `productivity`, `red-teaming`, `research`, `smart-home`, `social-media`, `software-development`.
124125Pick the closest existing category. Don't invent new top-level categories casually.
126127## Workflow
1281291. **Survey peers** in the target category:
130 ```
131 ls skills/<category>/
132 ```
133 Read 2-3 peer SKILL.md files to match tone and structure.
1342. **Check validator constraints** in `tools/skill_manager_tool.py` if unsure.
1353. **Draft** with `write_file` to `skills/<category>/<name>/SKILL.md`.
1364. **Validate locally**:
137 ```python
138 import yaml, re, pathlib
139 content = pathlib.Path("skills/<category>/<name>/SKILL.md").read_text()
140 assert content.startswith("---")
141 m = re.search(r'\n---\s*\n', content[3:])
142 fm = yaml.safe_load(content[3:m.start()+3])
143 assert "name" in fm and "description" in fm
144 assert len(fm["description"]) <= 1024
145 assert len(content) <= 100_000
146 ```
1475. **Git add + commit** on the active branch.
1486. **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.
149150## Cross-Referencing Other Skills
151152`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.
153154## Editing Existing In-Repo Skills
155156- **Small fix (typo, added pitfall, tightened trigger):** `skill_manage(action='patch', name=..., old_string=..., new_string=...)` works fine on in-repo skills.
157- **Major rewrite:** `write_file` the whole SKILL.md. `skill_manage(action='edit')` also works but requires supplying the full new content.
158- **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.
159- **Always commit** the edit — in-repo skills are source, not runtime state.
160161## Common Pitfalls
1621631. **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.
1641652. **Leading whitespace before `---`.** The validator checks `content.startswith("---")`; any leading blank line or BOM fails validation.
1661673. **Description too generic or trigger buried past char 57.** The system prompt
168 skill index truncates long descriptions at 57 chars. Peer descriptions start
169 with "Use when ..." and complete the trigger class within that window.
170 - Good: `Use when debugging Hermes skill discovery failures.`
171 - Bad: `This skill contains detailed guidance for agents working on Hermes skill discovery failures.`
1721734. **Forgetting the author/license/metadata block.** Not validator-enforced, but every peer has it; omitting makes the skill look half-finished.
1741755. **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.
1761776. **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.
1781797. **Letting skills accumulate sediment.** A skill should get shorter or sharper over time. When adding a rule, remove the old wording it replaces; don't layer advice forever.
1801818. **Writing no-op prose.** "Be careful," "be thorough," and "use best practices" rarely change model behavior. Replace with a checkable completion criterion or a stronger leading word.
1821839. **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.
184185## Verification Checklist
186187- [ ] File is at `skills/<category>/<name>/SKILL.md` (not in `~/.hermes/skills/`)
188- [ ] Frontmatter starts at byte 0 with `---`, closes with `\n---\n`
189- [ ] `name`, `description`, `version`, `author`, `license`, `metadata.hermes.{tags, related_skills}` all present
190- [ ] Name ≤ 64 chars, lowercase + hyphens
191- [ ] Description ≤ 1024 chars, trigger phrase self-contained within first 57 chars,
192 and starts with "Use when ..."
193- [ ] Total file ≤ 100,000 chars (aim for 8-15k)
194- [ ] Structure: `# Title` → `## Overview` → `## When to Use` → body → `## Common Pitfalls` → `## Verification Checklist`
195- [ ] Each ordered step has a checkable completion criterion
196- [ ] Description is trigger-focused and avoids duplicated body content
197- [ ] Bulky or branch-specific reference is progressively disclosed in linked files
198- [ ] No-op prose and duplicated rules removed
199- [ ] `related_skills` references resolve in-repo (or are explicitly OK to be user-local)
200- [ ] `git add skills/<category>/<name>/ && git commit` completed on the intended branch
201202---
203204**Source:** [`NousResearch/hermes-agent`](https://github.com/NousResearch/hermes-agent) → `skills/software-development/hermes-agent-skill-authoring/SKILL.md`
Run npx skillmds add thedixitjain/hermes-agent-skill-authoring in your terminal (requires Node.js), paste this page's agent-chat prompt into Claude, Cursor, or any MCP-connected agent, or download the SKILL.md file and copy it into your agent's skills directory.
Author in-repo SKILL.md files: frontmatter and structure. It is listed under AI & ML on SkillMD.
This skill has not completed SkillMD's automated safety review yet. Capability flags: makes network calls. SkillMD never runs a skill's scripts for you; review the SKILL.md before installing.
This skill is tagged as working with Claude Code, Claude.ai, OpenAI Codex. SKILL.md is an open format, so most agents that read a skills directory can load it too.
Yes. Installing skills from SkillMD is free, and the skill stays under its author's original license.
thedixitjain (@thedixitjain) published this skill. Their other Agent Skills are listed on their SkillMD profile.