Custom commands and skills have been merged into a single unified system: the Skills system. The two locations, .claude/skills/ and .claude/commands/, create /commands that behave the same way, but their file structures differ. A skill is a directory containing a SKILL.md file (.claude/skills/deploy/SKILL.md); a command is a flat Markdown file (.claude/commands/deploy.md). A flat file placed directly inside .claude/skills/ does not create a command. The .claude/skills/ path is the canonical location. .claude/commands/ still works for backward compatibility.
The Unified Skills System
Both paths produce the same result - a /command that developers can invoke:
.claude/commands/deploy.mdcreates/deploy- a flat file whose filename becomes the command name.claude/skills/deploy/SKILL.mdalso creates/deploy- one directory per skill, named after the command, withSKILL.mdas the required entrypoint inside it
The skills path is the recommended one because it adds features the commands alias does not: a supporting-files directory alongside the SKILL.md, automatic discovery so Claude can load a skill when it matches your intent, and precedence when a skill and a command share the same name (the skill wins). Both paths support the same YAML frontmatter (context: fork, allowed-tools, argument-hint) and both produce the same /command, so existing .claude/commands/ files keep working unchanged.
Two Scoping Levels
Project-scoped (shared via git):
Place skills in .claude/skills/ (canonical) or .claude/commands/ (alias) inside your repository. Both are version-controlled and shared via git. Every developer who clones or pulls the repository gets these commands automatically. Use for team-wide workflows: /review, /deploy-check, /lint, /migration-guide.
<!-- .claude/commands/review.md - creates /review -->
Review the staged changes against our team checklist:
1. Check error handling patterns
2. Verify test coverage for new functions
3. Confirm API naming conventions
4. Flag any hardcoded credentials or secrets
User-scoped (personal):
Place skills in ~/.claude/skills/ (canonical) or ~/.claude/commands/ (alias). These are personal and not version-controlled or shared. Use for individual productivity workflows that other team members do not need.
Key Concept
The scoping pattern is consistent across Claude Code: project-level (.claude/) is shared via git; user-level (~/.claude/) is personal. This applies to CLAUDE.md, commands/skills, and rules. Memorise this pattern - it appears throughout Domain 3. Both .claude/commands/ and .claude/skills/ are project-scoped and create the same commands; .claude/skills/ is the canonical, fuller-featured path. Keep the file shapes straight, though: skills are directories with a SKILL.md inside; commands are flat .md files.
Skills Frontmatter: Optional Configuration
Skills in .claude/skills/ with SKILL.md files support optional YAML frontmatter configuration. This frontmatter also works with .claude/commands/ files, but .claude/skills/ is the canonical location for configured skills. Skills are task-specific workflows invoked on demand - they aren't loaded automatically like CLAUDE.md.
The three critical frontmatter options:
context: fork
Runs the skill in an isolated sub-agent context. All the verbose output stays contained in the fork, and the main conversation stays clean. This is essential for:
- Codebase analysis (produces extensive file listings and code excerpts)
- Brainstorming (generates many alternatives and evaluations)
- Any task that produces noisy, exploratory output
Without context: fork, skill output flows into the main conversation and consumes context window tokens. For verbose skills, this degrades the quality of subsequent responses.
The frontmatter sits at the top of the skill's SKILL.md. For a skill invoked as /analyse-feature, that file lives at .claude/skills/analyse-feature/SKILL.md:
---
description: "Analyse a feature area of the codebase and report structure, patterns and risks"
context: fork
allowed-tools:
- Read
- Grep
- Glob
argument-hint: "Provide a feature description or area of the codebase to analyse"
---
The description line isn't one of the three the exam tests. Leave it out of a real skill, though, and Claude has nothing to match your request against, so the skill only ever fires when you type /analyse-feature yourself.
allowed-tools
Pre-approves the listed tools so Claude can use them without a permission prompt while the skill is active. It does not restrict which tools are available: every other tool remains callable, and your normal permission settings still govern anything that is not listed. Use it to let a trusted workflow run without stopping to ask on each call.
---
allowed-tools:
- Read
- Grep
- Glob
---
To remove tools from Claude's pool while a skill runs, which is the actual security boundary, list them in disallowed-tools instead, or add deny rules in your permission settings.
argument-hint
Prompts the developer for required parameters when the skill is invoked without arguments. Improves the developer experience by making inputs explicit rather than relying on the developer to remember what the skill needs.
---
argument-hint: "Specify the module path to analyse (e.g., src/api/auth)"
---
Current state: description is the field that does the most work
Those three are the ones the exam guide (v1.0) names, and they're what a question will key on. The live field list is much longer, and the one you'll reach for first isn't on the guide's list at all: description. It's what Claude reads to decide whether a skill applies to what you just asked, so a skill without a useful one only ever runs when you type /name yourself. The docs mark it Recommended rather than required: leave it out and Claude Code falls back to the first paragraph of the skill body, which is usually a worse summary than one you'd write. Also live: disallowed-tools, disable-model-invocation, model, effort and when_to_use. (Claude Code skills docs, verified August 2026.)
Skills vs CLAUDE.md: The Critical Distinction
This distinction is tested directly on the exam:
- Skills = on-demand, task-specific workflows. Their descriptions are always in context so Claude knows they exist, but the full skill body loads only when invoked. Invocation can be explicit (
/skill-name) or automatic: Claude picks up skills whosedescriptionmatches the user's intent, or skills with apathsfrontmatter field when you're working on matching files. Skills withdisable-model-invocation: truerequire explicit user invocation. - CLAUDE.md = always-loaded, universal standards. Applied automatically to every session, with no invocation step.
The rule: do not put task-specific procedures in CLAUDE.md. Do not put always-on reference material in skills.
API naming conventions that must apply to every code generation task belong in CLAUDE.md (or .claude/rules/). A multi-step codebase analysis workflow that a developer runs occasionally belongs in a skill. For conventions that apply to a specific file type - like test files - path-scoped .claude/rules/ are the best fit because they load as always-on context alongside matching files.
Personal Skill Customisation
Create personal variants in ~/.claude/skills/ (or ~/.claude/commands/) with different names to avoid affecting teammates. If the team has a standard /analyse skill but you prefer a more verbose version, create your own in ~/.claude/skills/ with a different name (e.g., /deep-analyse). Your personal skill doesn't override or conflict with the team version.
Where to Place Custom Commands: Quick Reference
| Need | Canonical location | Also works | Scoping |
|---|---|---|---|
| Team-wide command | .claude/skills/<name>/SKILL.md |
.claude/commands/<name>.md |
Project (shared via git) |
| Team-wide command with frontmatter config | .claude/skills/<name>/SKILL.md |
.claude/commands/<name>.md |
Project (shared via git) |
| Personal command | ~/.claude/skills/<name>/SKILL.md |
~/.claude/commands/<name>.md |
User (not shared) |
| Universal standards | .claude/CLAUDE.md or root CLAUDE.md |
- | Project (always loaded) |
| Personal preferences | ~/.claude/CLAUDE.md |
- | User (not shared) |