Deferring plugin validation until RUNTIME is painful, especially in TEAM DEVELOPMENT: teammates can hit errors during INSTALLATION, which increases ADOPTION FRICTION, and malformed plugin content may be silently ignored. So why not SHIFT VALIDATION LEFT and catch these issues before release?
This tool validates Claude Code plugin manifest schema (plugin.json) and
plugin content schemas (markdown frontmatter and hooks/hooks.json structure).
- Validate
plugin.jsonschema + semantic constraints - Optional validation for plugin markdown component frontmatter
- Optional hooks JSON structural validation
- CLI text and JSON output
Installation
cargo install claude-plugin-validateclaude-plugin-validate /path/to/plugin.json
claude-plugin-validate /path/to/plugins-dir
claude-plugin-validate /path/to/plugins-dir --allExit codes:
0: all valid1: one or more validation failures2: runtime/argument errors
Sample: https://github.com/anthropics/claude-code/tree/main/plugins
Basic validation
❯ claude-plugin-validate ./plugins
OK ./plugins/agent-sdk-dev/.claude-plugin/plugin.json
OK ./plugins/claude-opus-4-5-migration/.claude-plugin/plugin.json
OK ./plugins/code-review/.claude-plugin/plugin.json
OK ./plugins/commit-commands/.claude-plugin/plugin.json
OK ./plugins/explanatory-output-style/.claude-plugin/plugin.json
OK ./plugins/feature-dev/.claude-plugin/plugin.json
OK ./plugins/frontend-design/.claude-plugin/plugin.json
OK ./plugins/hookify/.claude-plugin/plugin.json
OK ./plugins/learning-output-style/.claude-plugin/plugin.json
OK ./plugins/pr-review-toolkit/.claude-plugin/plugin.json
OK ./plugins/ralph-wiggum/.claude-plugin/plugin.json
OK ./plugins/security-guidance/.claude-plugin/plugin.json
Summary: 12/12 validFull validation
❯ claude-plugin-validate ./plugins --all
OK ./plugins/agent-sdk-dev/.claude-plugin/plugin.json
OK ./plugins/claude-opus-4-5-migration/.claude-plugin/plugin.json
OK ./plugins/code-review/.claude-plugin/plugin.json
OK ./plugins/commit-commands/.claude-plugin/plugin.json
OK ./plugins/explanatory-output-style/.claude-plugin/plugin.json
OK ./plugins/feature-dev/.claude-plugin/plugin.json
OK ./plugins/frontend-design/.claude-plugin/plugin.json
OK ./plugins/hookify/.claude-plugin/plugin.json
ERR ./plugins/hookify/agents/conversation-analyzer.md
- frontmatter: YAML frontmatter failed to parse: mapping values are not allowed in this context at line 2 column 124. At runtime this agent loads with empty metadata (all frontmatter fields silently dropped).
OK ./plugins/learning-output-style/.claude-plugin/plugin.json
OK ./plugins/pr-review-toolkit/.claude-plugin/plugin.json
ERR ./plugins/pr-review-toolkit/agents/code-reviewer.md
- frontmatter: YAML frontmatter failed to parse: mapping values are not allowed in this context at line 2 column 717. At runtime this agent loads with empty metadata (all frontmatter fields silently dropped).
ERR ./plugins/pr-review-toolkit/agents/code-simplifier.md
- frontmatter: YAML frontmatter failed to parse: could not find expected ':' at line 7 column 1, while scanning a simple key at line 6 column 1. At runtime this agent loads with empty metadata (all frontmatter fields silently dropped).
ERR ./plugins/pr-review-toolkit/agents/comment-analyzer.md
- frontmatter: YAML frontmatter failed to parse: mapping values are not allowed in this context at line 2 column 140. At runtime this agent loads with empty metadata (all frontmatter fields silently dropped).
ERR ./plugins/pr-review-toolkit/agents/pr-test-analyzer.md
- frontmatter: YAML frontmatter failed to parse: mapping values are not allowed in this context at line 2 column 272. At runtime this agent loads with empty metadata (all frontmatter fields silently dropped).
ERR ./plugins/pr-review-toolkit/agents/silent-failure-hunter.md
- frontmatter: YAML frontmatter failed to parse: mapping values are not allowed in this context at line 2 column 393. At runtime this agent loads with empty metadata (all frontmatter fields silently dropped).
ERR ./plugins/pr-review-toolkit/agents/type-design-analyzer.md
- frontmatter: YAML frontmatter failed to parse: mapping values are not allowed in this context at line 2 column 111. At runtime this agent loads with empty metadata (all frontmatter fields silently dropped).
OK ./plugins/ralph-wiggum/.claude-plugin/plugin.json
OK ./plugins/security-guidance/.claude-plugin/plugin.json
Summary: 12/19 valid