Skill file structure, naming conventions, directory layout, and frontmatter requirements. Use when creating skill files to ensure correct format and validation.
Custom slash commands and skills are the same thing. A file at .claude/commands/review.md and a skill at .claude/skills/review/SKILL.md both create /review. Existing .claude/commands/ files keep working. Skills add: a directory for supporting files, frontmatter to control invocation, and automatic context loading.
If a skill and command share the same name, the skill takes precedence.
When to use which:
| Type | When |
|---|---|
Command file (commands/name.md) |
Simple single-file workflow, no supporting files |
Skill directory (skills/name/SKILL.md) |
Needs references, background knowledge, or progressive disclosure |
| Rule | Example |
|---|---|
| Format | kebab-case, lowercase, 1-64 chars |
| Pattern | ^[a-z][a-z0-9]*(-[a-z0-9]+)*$ |
| Must match | Directory name exactly |
Good/Bad Examples:
| Good | Bad | Why |
|---|---|---|
stimulus-coder |
MySkill |
Uppercase not allowed |
tdd-workflow |
skill_helper |
Underscores not allowed |
pdf-processing |
-invalid |
Can't start with hyphen |
seo-content |
skill--bad |
No consecutive hyphens |
plugins/majestic-rails/skills/stimulus-coder/SKILL.md
-> name: stimulus-coder
-> invoked as: Skill("stimulus-coder")
plugins/majestic-rails/skills/dhh-coder/SKILL.md
-> name: dhh-coder
-> invoked as: Skill("dhh-coder")
Key Points:
name field is ONLY the final skill name (not the full path)name exactlyFor complex skills, split into multiple files:
my-skill/
+-- SKILL.md (overview, <500 lines)
+-- references/
| +-- patterns.md (detailed patterns)
| +-- examples.md (extended examples)
+-- scripts/
+-- helper.py (utility scripts)
Rules:
scripts/, references/, assets/---
name: skill-name # Matches directory, defaults to dir name if omitted
description: What it does... # Recommended, max 1024 chars
allowed-tools: Read Bash # Optional, space-delimited
---
| Field | Required | Description |
|---|---|---|
name |
No | Lowercase letters, numbers, hyphens (max 64 chars). Defaults to directory name. |
description |
Recommended | What it does AND when to use it. Max 1024 chars. |
argument-hint |
No | Hint during autocomplete. Example: [issue-number] |
disable-model-invocation |
No | true = Claude cannot auto-load. For manual workflows. Default: false |
user-invocable |
No | false = hidden from / menu. For background knowledge. Default: true |
allowed-tools |
No | Tools without permission prompts. Example: Read, Bash(git *) |
model |
No | haiku, sonnet, or opus |
context |
No | fork to run in isolated subagent context |
agent |
No | Subagent type when context: fork: Explore, Plan, general-purpose, or custom |
[What it does]. Use when [trigger contexts]. Triggers on [specific keywords].
Rules:
| Frontmatter | User can invoke | Claude can invoke | When loaded |
|---|---|---|---|
| (default) | Yes | Yes | Description always in context, full content on invocation |
user-invocable: false |
No | Yes | Description always in context, loads when relevant |
Decision guide:
user-invocable: falseNote: Avoid disable-model-invocation: true. Commands/skills with side effects should use confirmation steps (AskUserQuestion) rather than blocking model invocation entirely.
Use $ARGUMENTS for user input. If not present in content, arguments are appended automatically.
---
name: fix-issue
---
Fix GitHub issue $ARGUMENTS following our coding standards.
Individual args: $ARGUMENTS[0] or shorthand $0, $1, $2.
The !`command` syntax runs shell commands before content reaches Claude:
## Context
- Current branch: !`git branch --show-current`
- PR diff: !`gh pr diff`
Commands execute immediately; output replaces the placeholder.
Add context: fork to run in isolation (no conversation history):
---
name: deep-research
description: Research a topic thoroughly
context: fork
agent: Explore
---
Research $ARGUMENTS thoroughly...
| Tools Needed | Example Use Case |
|---|---|
Read, Grep, Glob |
Search codebase for patterns |
Bash(git *) |
Git operations only |
Bash(gh *) |
GitHub CLI operations |
WebFetch |
Fetch external documentation |
| None | Pure knowledge/guidance |
^[a-z][a-z0-9]*(-[a-z0-9]+)*$AskUserQuestion for confirmation if skill has side effectsallowed-tools set if specific tools neededscripts/, references/, assets/