Short definitions for the words this series uses. Where a term belongs to one module, the entry links there. The two most confusable pairs get a callout instead of a one-liner.
AGENTS.mdCLAUDE.md, not AGENTS.md; bridge the two with an
@AGENTS.md import inside CLAUDE.md, or a symlink on
platforms that support one. See Rules.
allowed-tools~/.claude/projects/<project>/memory/ as a
MEMORY.md index plus topic files. Subagents do not inherit it, except
forks. Toggle with /memory or autoMemoryEnabled: false.
skills/, agents/,
hooks/hooks.json, and so on), and the final module packages the whole
thing behind .claude-plugin/plugin.json and validates it with
claude plugin validate --strict.
.claude-plugin/plugin.json. Every other
component (skills/, agents/, hooks/, and the
rest) lives at the plugin root, not inside this folder. See
the plugin layout table.
CLAUDE.mdCLAUDE.local.md appended last in each directory. See
Rules.
.claude/commands/<name>.md, invoked by its file
name. Commands still work but the docs describe them as merged into skills: a skill
directory supports supporting files and more frontmatter, so new work should use
.claude/skills/<name>/SKILL.md instead. See
Your first command.
effortlow | medium | high | xhigh | max, that sets how much reasoning budget
the invocation gets. Available at
${CLAUDE_EFFORT} for substitution inside a skill body.
WorktreeCreate is the one
event where any non-zero exit blocks, and PermissionRequest ignores exit
2 entirely, deciding only through the JSON decision field. See
the hook decision table and
Hooks.
command, http, mcp_tool, prompt,
and the experimental agent. All handlers matched by an event run in
parallel. See Hooks.
hooks key in a settings file or a
plugin's hooks/hooks.json. Three levels of nesting: event, matcher group,
handlers. See Hooks.
PreToolUse,
Stop, SessionStart, and so on) that a hook can attach to.
Not every event can block: only a subset, including PreToolUse,
UserPromptSubmit, and Stop, honor exit 2.
if filterPreToolUse, PostToolUse,
PostToolUseFailure, PermissionRequest,
PermissionDenied). On any other event, a hook with if set
never runs: it is not silently ignored, it is fully suppressed. The filter also fails
open: an unparseable Bash command still runs the hook. It has no &&,
||, or list syntax, and it is not a substitute for the permission system.
.claude-plugin/marketplace.json manifest listing installable plugins by
name and source. Adding a marketplace with
claude plugin marketplace add makes its plugins available to
/plugin install; it does not enable them.
*, an empty string, or omitting it matches everything. A string built only
from letters, digits, _, -, spaces, commas, and
| is an exact match or an exact-match list; anything else is treated as an
unanchored JavaScript regular expression.
.mcp.json. It is the one surface
the docs describe as portable across harnesses. See
MCP.
@server:protocol://resource/path (for example
@github:issue://123) and attached to a prompt with @
autocomplete. Distinct from an MCP tool, which the model calls rather than attaches.
type of
stdio, http, sse (deprecated), or
ws. Scopes are local (this project, not shared),
project (.mcp.json, checked into version control), and
user (every project). See MCP.
mcp__server__toolmcp__github__list_issues. This is the form to
use in permission rules, a skill's allowed-tools, a subagent's
tools list, and hook matchers. A plugin-supplied server's tools carry an
extra plugin_<plugin-name>_ segment.
output-styles/ that modifies the system prompt rather than
appending a user message. It takes effect only after /clear or a new
session, does not apply to subagents except forks, and across nested project
directories the definition closest to your working directory wins. See
Shaping the model.
default (read-only, called Manual in the UI),
acceptEdits, plan, auto (a classifier reviews
actions instead of you), dontAsk (auto-denies anything not
pre-approved), and bypassPermissions (skips prompts, including
protected-path writes). See Permissions
and sandbox.
permissions.allow, ask, or deny,
written as Tool or Tool(specifier). Rules evaluate deny, then
ask, then allow, first match wins, and specificity never matters: a broad deny beats a
narrower allow. A bare tool name in a deny rule removes the tool from Claude's context
entirely, rather than merely blocking calls to it.
| Surface | Highest to lowest |
|---|---|
| Skills | enterprise > personal > project |
| Subagents | managed > --agents > project > user > plugin |
| Settings | managed > CLI > project-local > shared project > user |
Skills and subagents invert against each other. For skills, your personal definition beats the project's. For subagents, the project's definition beats yours. Generalizing from one surface to the other produces a bug that both surfaces will load without complaint about.
CLAUDE.md.
description stays in
context for the whole session so Claude can decide when to reach for it, while the
body of SKILL.md and any supporting files load only when the skill is
actually invoked. See Skills.
.git, .claude, shell startup files,
.mcp.json, and others) whose writes are never auto-approved by an
allow rule, in any mode except bypassPermissions. The check
runs before allow rules are even read, so a permission rule cannot pre-clear it.
.claude/rules/CLAUDE.md. The only supported frontmatter field
is paths, a list of globs scoping when the rule loads; without it, a rule
loads unconditionally at launch. See Rules.
bypassPermissions depends on whatever isolation boundary you choose.
See Permissions and sandbox.
.claude/settings.local.json), then shared project
(.claude/settings.json), then user
(~/.claude/settings.json). List-valued keys such as
permissions.allow merge across levels rather than one replacing another;
a few whole-value keys like fallbackModel are exceptions. See
the precedence table.
.claude/skills/<name>/ (or
~/.claude/skills/, or a plugin's skills/) containing a
SKILL.md and optionally supporting files or scripts. Skills are the
current, merged form of both slash commands and reusable capabilities: the docs state
outright that custom commands have been merged into skills. See
Skills.
SKILL.mddescription is recommended, since that is what tells Claude when to
use the skill. The directory name, not the frontmatter name field,
determines what you type to invoke a personal or project skill.
.claude/agents/, with its own system prompt, tool allowlist, and model.
It runs in an isolated context window and does not inherit the main session's
conversation history, output style, or auto memory. name and
description are the only required fields. See
Subagents.
--append-system-prompt adds
to it from the command line. Understanding this split is the point of
Shaping the model.
theme
setting. Custom themes live at ~/.claude/themes/<slug>.json, with
three optional fields (name, base,
overrides) and hot reload; an invalid token is ignored rather than
breaking the theme. See Settings and
themes.
ENABLE_TOOL_SEARCH; a server can opt out of
deferral with alwaysLoad: true.
permissions.allow rules and additionalDirectories take
effect. deny and ask rules apply immediately regardless of
trust. Trust is keyed to the git repository root, and a headless
-p run never sees the dialog at all. See
Permissions and sandbox.