Dev-agent-skills creating-skills
Guide for creating Claude Code skills following Anthropic's official best practices. Use when user wants to create a new skill, build a skill, write SKILL.md, update an existing skill, or needs skill creation guidelines. Provides structure, frontmatter fields, naming conventions, and new features like dynamic context injection and subagent execution.
git clone https://github.com/fvadicamo/dev-agent-skills
T=$(mktemp -d) && git clone --depth=1 https://github.com/fvadicamo/dev-agent-skills "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/creating-skills" ~/.claude/skills/fvadicamo-dev-agent-skills-creating-skills && rm -rf "$T"
skills/creating-skills/SKILL.mdCreating skills
Guide for creating Claude Code skills following Anthropic's official best practices.
Quick start
# 1. Create skill directory mkdir -p ~/.claude/skills/<skill-name> # 2. Create SKILL.md with frontmatter cat > ~/.claude/skills/<skill-name>/SKILL.md << 'EOF' --- name: <skill-name> description: <What it does>. Use when <trigger phrases>. <Key capabilities>. --- # <Skill title> <Instructions for the skill workflow> EOF # 3. Add optional resources as needed mkdir -p ~/.claude/skills/<skill-name>/{scripts,references,assets}
SKILL.md structure
Frontmatter (YAML between ---
markers)
---| Field | Required | Description |
|---|---|---|
| No | Display name. Defaults to directory name. Lowercase, hyphens, max 64 chars. |
| Recommended | What + when + capabilities. Max 1024 chars. Determines when Claude activates the skill. |
| No | Tools Claude can use without asking permission when skill is active. |
| No | Autocomplete hint for arguments. Example: |
| No | to prevent auto-invocation (manual only). |
| No | to hide from menu (background knowledge only). |
| No | Model override when skill is active. |
| No | to run in isolated subagent context. |
| No | Subagent type when . Built-in: , , . |
| No | Lifecycle hooks scoped to this skill. |
Invocation control matrix
| Configuration | User can invoke | Claude can invoke |
|---|---|---|
| (defaults) | Yes | Yes |
| Yes | No |
| No | Yes |
Description formula
<What it does>. Use when <trigger phrases>. <Key capabilities>.
Include action verbs ("create", "handle"), user intent ("wants to", "needs to"), and domain keywords users would say.
Directory structure
skill-name/ ├── SKILL.md # Required: instructions (keep under 500 lines) ├── scripts/ # Optional: executable code (deterministic, token-efficient) ├── references/ # Optional: docs loaded into context on demand └── assets/ # Optional: files used in output, NOT loaded into context # (templates, images, fonts, boilerplate)
Progressive disclosure (3-level loading)
- Metadata (name + description) - always in context (~100 tokens per skill)
- SKILL.md body - loaded when skill triggers (keep under 5k words)
- Bundled resources - loaded as needed by Claude
Reference supporting files from SKILL.md so Claude knows they exist. Keep references one level deep. For files over 100 lines, include a table of contents.
Scripts vs references vs assets
| Type | Purpose | Loaded into context? |
|---|---|---|
| Deterministic operations, complex processing | No (executed via bash) |
| Documentation Claude reads while working | Yes, on demand |
| Templates, images, fonts for output | No (copied/used in output) |
Only create scripts when they add value: complex multi-step processing, repeated code generation, deterministic reliability. Not for single-command wrappers.
Dynamic features
Context injection
Inject shell command output into skill content before loading:
## Recent commits !`git log --oneline -5 2>/dev/null`
The output replaces the directive when the skill loads.
String substitutions
Pass arguments to skills invoked via
/skill-name arg1 arg2:
| Variable | Value |
|---|---|
| Full argument string |
, | Individual arguments |
, | Shorthand for |
Subagent execution
Run a skill in isolated context with
context: fork:
--- name: deep-research description: Research a topic thoroughly. context: fork agent: Explore ---
Degrees of freedom
Match specificity to the task's fragility:
| Level | When to use | Example |
|---|---|---|
| High (text instructions) | Multiple valid approaches, context-dependent | "Analyze the code and suggest improvements" |
| Medium (pseudocode/scripts with params) | Preferred pattern exists, some variation OK | Script with configurable parameters |
| Low (specific scripts, few params) | Fragile operations, consistency critical | Exact sequence of API calls |
Naming conventions
- Lowercase, hyphens between words, max 64 chars
- Styles: gerund (
), noun phrase (processing-pdfs
), prefixed group (github-pr-creation
)github-pr-*
Important rules
- ALWAYS write descriptions that include WHAT + WHEN triggers + capabilities
- ALWAYS keep SKILL.md under 500 lines, split to references when approaching
- ALWAYS reference bundled files from SKILL.md so Claude discovers them
- NEVER duplicate info between SKILL.md and reference files
- NEVER create wrapper scripts for single commands
- NEVER include extraneous files (README.md, CHANGELOG.md, INSTALLATION_GUIDE.md, QUICK_REFERENCE.md)
- NEVER explain things Claude already knows (standard libraries, common tools, basic patterns)
References
- Principles, anti-patterns, quality checklist, testingreferences/official_best_practices.md
- Concrete skill examples with new featuresreferences/skill_examples.md