Claude Code Plugin Conventions Reference
Purpose: This skill is the single source of truth for Claude Code artifact conventions. Audit commands inject this content into Codex's
developer-instructionsso Codex can accurately validate Claude Code artifacts despite having no native knowledge of the platform.Freshness: Last updated 2026-03-25 from context7 (
/websites/code_claude_en_plugins-reference,/websites/code_claude_en_plugins). Run/cc-suite:refresh-knowledgeto refresh.
When to Use
Load this skill when:
- Auditing Claude Code plugin artifacts (commands, agents, skills, hooks, plugin.json)
- Validating frontmatter fields against the official schema
- Checking hook event names, types, and output formats
- Authoring new plugin artifacts and need the canonical field reference
- Running
/cc-suite:audit-plugin,/cc-suite:audit-command,/cc-suite:audit-agent, or/cc-suite:audit-skill
plugin.json Schema
Only name is strictly required. Version and description are strongly recommended but optional.
Required:
name(string): plugin identifier, kebab-case. Used for namespacing (e.g.,plugin-dev:agent-creator)
Recommended:
version(string): semverX.Y.Z. If also set in marketplace entry, plugin.json takes precedencedescription(string): brief purpose
Optional metadata:
author(object):{ "name": "string", "email": "string", "url": "string" }homepage(string): URL to plugin docsrepository(string): URL to source codelicense(string): SPDX identifier (e.g.,"MIT","Apache-2.0")keywords(string[]): discovery tags
Component path fields (string, string[], or inline object):
commands— path(s) to command files. Default:./commands/(auto-discovered)agents— path(s) to agent files. Default:./agents/(auto-discovered)skills— path(s) to skill directories. Default:./skills/(auto-discovered)hooks— path to hooks config OR inline hooks object. Default:./hooks/hooks.jsonmcpServers— path to MCP config OR inline object. Default:./.mcp.jsonlspServers— path to LSP config. Default:./.lsp.jsonoutputStyles— path to output style definitions
If omitted, components are auto-discovered from default locations.
Command Frontmatter
Location: commands/<name>.md (auto-discovered from commands/ directory)
Required fields:
description(string): shown in/help, must be specific and actionable
Optional fields:
argument-hint(string): usage pattern (e.g.,"<file> [--flag]")allowed-tools(string[]): restrict available tools. Omit for all toolsmodel(string): override session model (haiku,sonnet,opus)user-invocable(boolean):falsefor shared partials incommands/shared/
Body: imperative instructions FOR Claude, not documentation TO user.
Shared Partial Frontmatter
Location: commands/shared/<name>.md
Required:
user-invocable: false
Referenced by commands to eliminate boilerplate. Not shown in /help.
Agent Frontmatter
Location: agents/<name>.md (auto-discovered)
Official documented fields:
name(string): agent identifierdescription(string): what the agent does and when to invoke it
Widely-used convention fields (not in official docs but used by all xiaolai plugins and numerous community plugins):
model(string):haiku,sonnet,opuscolor(string): UI color hint —cyan,blue,magenta,yellow,green,redtools(string[] or comma-separated): tools available to the agentskills(string[]): skills loaded into context, formatplugin-name:skill-nameallowed-tools(string[]): alternative totools
Agents can also embed inline hooks in frontmatter for PreToolUse/PostToolUse within their scope.
Body: system prompt defining mission, instructions, and output format. Best practice: include <example> blocks in description showing when/how to trigger.
Skill Structure
Location: skills/<skill-name>/SKILL.md (or skills/<plugin-name>/<skill-name>/SKILL.md)
Required frontmatter:
name(string): skill identifierdescription(string): when/why to use — acts as trigger for auto-loading
Optional frontmatter:
version(string): semverglobs(string or string[]): file patterns that scope this skill
Body: reference material. Keep under 500 lines for context efficiency.
Supporting files alongside SKILL.md:
references/— detailed reference materialexamples/— working code examplesscripts/— utility scripts
Skills in commands/ directory work identically (legacy layout). Both are auto-discovered.
Hook Events
Location: hooks/hooks.json (can have multiple files: hooks.json, security-hooks.json, etc.), inline in plugin.json hooks field, or inline in agent frontmatter.
Valid event types:
PreToolUse— before a tool executes (can block via permission decision)PostToolUse— after a tool executes successfullyPostToolUseFailure— after a tool execution failsPermissionRequest— when tool permission is neededUserPromptSubmit— when user sends a messageStop— when Claude stops respondingSubagentStop— when a subagent completesSessionStart— when a session beginsSessionEnd— when a session endsPreCompact— before context compressionNotification— for notificationsInstructionsLoaded— after CLAUDE.md files are loaded
Note: Event names are case-sensitive.
Hook types:
command— run a shell command, receives JSON on stdinprompt— evaluate a prompt with the LLMagent— spawn an agentic verifier for complex verification tasks
Hook output (for command type blocking decisions):
{
"hookSpecificOutput": {
"permissionDecision": "allow" | "deny",
"permissionDecisionReason": "explanation"
}
}
Matcher: regex pattern for tool name (e.g., "Bash", "Write|Edit", "mcp__.*")
hooks.json Format
{
"hooks": {
"PostToolUse": [
{
"matcher": "Write|Edit",
"hooks": [
{
"type": "command",
"command": "${CLAUDE_PLUGIN_ROOT}/scripts/format-code.sh"
}
]
}
]
}
}
Multiple hook config files are supported in the hooks/ directory.
.mcp.json Format
{
"mcpServers": {
"server-name": {
"command": "executable",
"args": ["arg1", "arg2"],
"cwd": "${CLAUDE_PLUGIN_ROOT}",
"env": { "KEY": "value" }
}
}
}
marketplace.json Format
Per-plugin marketplace (for claude plugin marketplace add):
{
"name": "marketplace-name",
"owner": { "name": "author-name" },
"plugins": [
{
"name": "plugin-name",
"source": { "source": "github", "repo": "owner/repo" },
"description": "...",
"version": "X.Y.Z",
"author": { "name": "..." },
"category": "developer-tools"
}
]
}
owner with name is required for marketplace validation.
Source types: github, git, url, npm, file, directory, hostPattern
Plugin Directory Layout
plugin-name/
├── .claude-plugin/
│ ├── plugin.json # manifest (name required, rest optional)
│ └── marketplace.json # optional
├── commands/ # auto-discovered
│ ├── command-name.md
│ └── shared/ # non-invocable partials
│ └── partial-name.md
├── agents/ # auto-discovered
│ └── agent-name.md
├── skills/ # auto-discovered
│ └── skill-name/
│ ├── SKILL.md
│ ├── references/ # optional
│ ├── examples/ # optional
│ └── scripts/ # optional
├── hooks/ # can have multiple .json files
│ ├── hooks.json
│ └── security-hooks.json # additional hook configs
├── scripts/ # utility scripts
├── settings.json # default plugin settings (optional)
├── .mcp.json # optional MCP servers
├── .lsp.json # optional LSP servers
├── CLAUDE.md # project instructions
├── README.md
└── LICENSE
${CLAUDE_PLUGIN_ROOT} resolves to the plugin's root directory at runtime. Use it in all script paths for portability.
Naming Conventions
- Plugin names: kebab-case (
reading-assistant,codex-toolkit) - Command files: kebab-case
.md(audit-plugin.md) - Agent files: kebab-case
.md(qc-coordinator.md) - Skill directories:
skill-name/SKILL.mdorplugin-name/skill-name/SKILL.md - Script files: kebab-case with extension (
codex-preflight.sh,parse_epub.py)
Settings
settings.jsonat plugin root — default settings shipped with the plugin~/.claude/settings.json— global user settings{project}/.claude/settings.json— project settings (committed){project}/.claude/settings.local.json— local settings (gitignored).claude/<plugin-name>.local.md— per-plugin config with YAML frontmatter
CLAUDE.md
- Project-level instructions for Claude Code
- Supports
@import syntax to reference other files - Loaded from: project root,
.claude/,~/.claude/, parent directories - Priority: closer to project root wins
claudeMdExcludessetting can ignore specific CLAUDE.md files
Quality Standards
Commands
- Description: specific and actionable
- Steps: numbered, unambiguous, all paths covered
- Tools: match
allowed-tools, least-privilege - Output: format defined (report template)
- Errors: fallback paths specified
Agents
- Description: include
<example>blocks for triggering - Model: match task complexity (haiku mechanical, sonnet reasoning, opus judgment)
- Tools: least-privilege
- Body: mission, instructions, output format
Skills
- Description: trigger phrases matching user queries
- Body: under 500 lines, patterns over theory
- Code examples: runnable, not pseudocode
- Scope: clear boundaries, cross-references to related skills
Rules (.claude/rules/)
- YAML frontmatter:
description(required),paths(optional glob array) - Budget: <500 lines total across all rule files
- Format: bold imperative + rationale + positive framing
- Enforceable: testable, specific, observable
- No duplication of linter/formatter/CI enforcement
Scope Note
Covers Claude Code's own artifact schemas and naming conventions, and exists to inject that reference material into Codex audit prompts. For running an audit against those conventions, use $audit or $audit-fix. For authoring cc-suite advisor agents — a different, cc-suite-specific file format — use agent-design. For choosing canonical terminology inside cc-suite artifacts, use vocabulary.