Agent Skills spec as implemented by Claude Code, verified against https://code.claude.com/docs/en/skills (June 2026).
Key model change vs older guides: custom commands have been merged into skills. .claude/commands/deploy.md and .claude/skills/deploy/SKILL.md both create /deploy. Skills follow the Agent Skills open standard; Claude Code extends it with invocation control, subagent execution, and dynamic context injection.
| Location | Path | Scope |
|---|---|---|
| Enterprise | managed settings dir | Organization |
| Personal | ~/.claude/skills/<name>/SKILL.md |
All your projects |
| Project | .claude/skills/<name>/SKILL.md |
This project |
| Plugin | <plugin>/skills/<name>/SKILL.md |
Where enabled (namespaced plugin:skill) |
.claude/commands/ file..claude/skills/ in parent directories up to the repo root, and on demand from nested .claude/skills/ when working in subdirectories (monorepos).--add-dir / /add-dir directories DO load their .claude/skills/ (exception to the file-access-only rule); the permissions.additionalDirectories setting does NOT.hooks/, .mcp.json, agents/ changes need /reload-plugins..claude-plugin/plugin.json inside a skill folder and it loads as a plugin named <name>@skills-dir (can then bundle agents, hooks, MCP servers).All fields optional; description strongly recommended.
| Field | Meaning |
|---|---|
name |
Display name in listings. Defaults to directory name. Does NOT change the /command you type (except plugin-root SKILL.md, where it does). |
description |
What it does + when to use. Claude's trigger signal. If omitted, first paragraph of body is used. |
when_to_use |
Extra trigger context (phrases, example requests). Appended to description in the listing. Combined description+when_to_use truncated at 1,536 chars in the listing. |
argument-hint |
Autocomplete hint, e.g. [issue-number] or [filename] [format]. |
arguments |
Named positional args for $name substitution. Space-separated string or YAML list; names map to positions in order. |
disable-model-invocation |
true = only the user can invoke (/name). Removes description from Claude's context entirely; also prevents preloading into subagents. Use for side-effect workflows (/deploy, /commit). Default false. |
user-invocable |
false = hidden from the / menu; only Claude can invoke. For background knowledge. Default true. Menu visibility only — does not block the Skill tool. |
allowed-tools |
Tools usable without permission prompts while the skill is active (grant, not restriction). Space/comma-separated string or YAML list. Permission-rule syntax works: Bash(git add *). For project skills, requires workspace trust. |
disallowed-tools |
Tools removed from the pool while active. Restriction clears on your next message. |
model |
Model while active (same values as /model, or inherit). Applies for the rest of the turn; session model resumes next prompt. |
effort |
low/medium/high/xhigh/max while active; overrides session effort. |
context |
fork = run in a forked subagent context; the skill body becomes the subagent's prompt (no conversation history). |
agent |
Subagent type when context: fork (Explore, Plan, general-purpose, or custom). Default general-purpose. |
hooks |
Hooks scoped to the skill's lifecycle (same YAML shape as settings hooks; see hooks-reference.md). |
paths |
Glob patterns gating auto-activation: skill loads only when working with matching files. Comma-separated string or YAML list. |
shell |
bash (default) or powershell for !`cmd` injection. powershell requires CLAUDE_CODE_USE_POWERSHELL_TOOL=1. |
license |
License identifier (Agent Skills spec field). |
compatibility |
Environment requirements (Agent Skills spec field). |
metadata |
Arbitrary key/value strings (author, etc.). |
| Frontmatter | You invoke | Claude invokes | Context cost |
|---|---|---|---|
| (default) | Yes | Yes | Description always in context; body loads on invoke |
disable-model-invocation: true |
Yes | No | Nothing in context until you invoke |
user-invocable: false |
No | Yes | Description always in context |
| Token | Expands to |
|---|---|
$ARGUMENTS |
Full argument string as typed. If absent from body, args are appended as ARGUMENTS: <value> |
$ARGUMENTS[N] |
N-th argument, 0-based, shell-style quoting ("hello world" = one arg) |
$N ($0, $1, …) |
Shorthand for $ARGUMENTS[N] — note: $0 is the FIRST argument |
$name |
Named arg declared in arguments: frontmatter |
${CLAUDE_SESSION_ID} |
Current session ID |
${CLAUDE_EFFORT} |
Current effort level (low…max; ultracode reports xhigh) |
${CLAUDE_SKILL_DIR} |
Directory containing this SKILL.md — use for bundled script paths |
Escape a literal dollar before a digit/ARGUMENTS/declared name with a single backslash: \$1.00.
!`command` runs before Claude sees the skill content; output replaces the placeholder. This is preprocessing — Claude never executes it.
---
name: pr-summary
description: Summarize changes in a pull request
context: fork
agent: Explore
allowed-tools: Bash(gh *)
---
- PR diff: !`gh pr diff`
- Changed files: !`gh pr diff --name-only`
Rules:
! must be at line start or after whitespace (KEY=!`cmd` stays literal).```!."disableSkillShellExecution": true in settings replaces each command with [shell command execution disabled by policy] (bundled/managed skills unaffected).ultrathink anywhere in the body to request deeper reasoning when the skill runs.skillListingBudgetFraction setting, e.g. 0.02, or SLASH_COMMAND_TOOL_CHAR_BUDGET env var for a fixed char count).description + when_to_use truncated at 1,536 chars (configurable via maxSkillDescriptionChars). Put key trigger phrases first./doctor shows whether the budget is overflowing and which skills are affected.skillOverrides in settings (or /skills + Space): "on" / "name-only" / "user-invocable-only" / "off" per skill. Plugin skills are managed via /plugin instead.Skill # deny rule: disable Claude's skill invocation entirely
Skill(commit) # exact match
Skill(review-pr *) # prefix match with any args
| Approach | System prompt | Task | Also loads |
|---|---|---|---|
Skill with context: fork |
From agent type |
SKILL.md content | CLAUDE.md, except Explore/Plan agents |
Subagent with skills: frontmatter |
Agent's markdown body | Claude's delegation message | Full preloaded skill content + CLAUDE.md |
Subagent skills: preloading injects full skill content at startup (not just descriptions). Skills with disable-model-invocation: true cannot be preloaded.
/skill-name args works inside a -p prompt string — Claude Code expands it before running:
claude -p "/summarize-changes" --output-format json
---
name: summarize-changes
description: Summarizes uncommitted changes and flags risks. Use when the user asks what changed or wants a commit message.
---
## Current changes
!`git diff HEAD`
## Instructions
Summarize the changes above in two or three bullets, then list risks.