Plugin Checker Skill
This skill provides comprehensive validation guidelines for Claude Code plugins, helping identify structural issues, misconfigurations, and best practice violations.
Validation Checklist
1. Plugin Manifest Validation
Check .claude-plugin/plugin.json:
Required:
- • File exists at
.claude-plugin/plugin.json - • Valid JSON syntax
- •
namefield present and valid
Name validation:
- • Uses kebab-case (lowercase letters, numbers, hyphens)
- • Length between 3-50 characters
- • No spaces or special characters
- • Starts with a letter
Optional fields (if present):
- •
versionfollows semver (X.Y.Z) - •
descriptionis a non-empty string - •
authorhasnamefield (string) - •
author.emailis valid email format (if present)
2. Directory Structure Validation
Required structure:
plugin-name/ ├── .claude-plugin/ │ └── plugin.json ← REQUIRED
Valid optional directories:
- •
agents/- Contains.mdfiles only - •
skills/- Contains subdirectories withSKILL.md - •
commands/- Contains.mdfiles only - •
hooks/- Containshooks.json - •
scripts/- Contains executable scripts
Invalid patterns to flag:
- •❌
AGENTS.mdat root (should beagents/*.md) - •❌
SKILL.mdat root (should beskills/*/SKILL.md) - •❌ Nested
.claude-plugin/directories - •❌ Files directly in
skills/(should be in subdirs)
3. Agent File Validation
For each file in agents/*.md:
Frontmatter checks:
- • File starts with
--- - • Valid YAML frontmatter
- •
namefield present - •
descriptionfield present
Name field:
- • Lowercase letters, numbers, hyphens only
- • 3-50 characters
- • Matches filename (recommended)
Description field:
- • Contains trigger conditions
- • Has at least one
<example>block (recommended) - • Example has
user:,assistant:,<commentary>
Model field (if present):
- • Valid value:
inherit,sonnet,opus,haiku
Color field (if present):
- • Valid value:
blue,cyan,green,yellow,magenta,red
Tools field (if present):
- • Is an array
- • Contains valid tool names
Content check:
- • Has system prompt after frontmatter
- • System prompt is substantial (>20 chars)
4. Skill Directory Validation
For each directory in skills/*/:
Structure:
- • Contains
SKILL.mdfile - •
SKILL.mdhas YAML frontmatter
Frontmatter:
- •
namefield present - •
descriptionfield present with trigger phrases
Optional subdirectories:
- •
references/- Additional documentation - •
examples/- Working examples - •
scripts/- Utility scripts
5. Command File Validation
For each file in commands/*.md:
Frontmatter:
- •
descriptionfield present - •
argument-hintis string (if present) - •
allowed-toolsis array (if present)
Naming:
- • Filename is kebab-case
- • No spaces or special characters
6. Hooks Validation
For hooks/hooks.json:
JSON structure:
- • Valid JSON syntax
- • Has
hooksobject at root (or indescription+hooks)
Event names (if present):
- •
PreToolUse - •
PostToolUse - •
Stop - •
SubagentStop - •
SessionStart - •
SessionEnd - •
UserPromptSubmit - •
PreCompact - •
Notification - •
PermissionRequest
Hook entries:
- •
matcherfield present (for tool events) - •
hooksarray present - • Each hook has
type("command" or "prompt") - • Command hooks have
commandfield - • Prompt hooks have
promptfield
Path portability:
- • Uses
${CLAUDE_PLUGIN_ROOT}for plugin paths - • No hardcoded absolute paths
Script references:
- • Referenced scripts exist
- • Scripts are executable (have shebang)
7. Security Checks
Credentials:
- • No hardcoded API keys or tokens
- • No passwords in configuration
- • Environment variables used for secrets
URLs:
- • MCP servers use HTTPS/WSS (not HTTP/WS)
Scripts:
- • No obvious command injection vulnerabilities
- • Input validation present
- • Variables properly quoted
Common Issues and Fixes
Issue: "plugin not found"
Cause: Missing or invalid plugin.json
Fix: Create .claude-plugin/plugin.json with valid JSON and name field
Issue: "agents not loading"
Cause: Agents not in correct location
Fix: Move to agents/ directory with .md extension
Issue: "skill not triggering"
Cause: Weak trigger description or wrong structure Fix:
- •Ensure
skills/{name}/SKILL.mdstructure - •Add specific trigger phrases to description
Issue: "hooks not running"
Cause: Invalid hooks.json or script permissions Fix:
- •Validate JSON syntax
- •Make scripts executable:
chmod +x scripts/*.sh - •Use
${CLAUDE_PLUGIN_ROOT}in paths
Issue: "command not appearing"
Cause: Missing frontmatter or wrong location
Fix: Ensure commands/*.md with description in frontmatter
Validation Commands
Quick structure check:
# Check plugin.json exists and is valid jq . my-plugin/.claude-plugin/plugin.json # List all components find my-plugin -name "*.md" -o -name "*.json" | head -20 # Check hooks.json jq . my-plugin/hooks/hooks.json 2>/dev/null || echo "No hooks.json"
Test plugin locally:
claude --plugin-dir /path/to/my-plugin
Debug mode:
claude --debug --plugin-dir /path/to/my-plugin
Validation Report Format
When reporting validation results:
## Plugin Validation Report ### Plugin: [name] Location: [path] ### Summary [PASS/FAIL] - [brief assessment] ### Critical Issues (must fix) - [ ] `path/to/file` - [issue] - [fix] ### Warnings (should fix) - [ ] `path/to/file` - [issue] - [recommendation] ### Components Found - Agents: [count] files - Skills: [count] directories - Commands: [count] files - Hooks: [present/not present] ### Positive Findings - [What's done correctly] ### Recommendations 1. [Priority fix] 2. [Improvement suggestion]
Quick Validation Script
#!/bin/bash
# validate-plugin.sh <plugin-dir>
PLUGIN_DIR="${1:-.}"
echo "=== Plugin Validation ==="
# Check plugin.json
if [ -f "$PLUGIN_DIR/.claude-plugin/plugin.json" ]; then
echo "✓ plugin.json exists"
NAME=$(jq -r '.name' "$PLUGIN_DIR/.claude-plugin/plugin.json" 2>/dev/null)
if [ -n "$NAME" ] && [ "$NAME" != "null" ]; then
echo "✓ name: $NAME"
else
echo "✗ ERROR: name field missing or invalid"
fi
else
echo "✗ CRITICAL: .claude-plugin/plugin.json not found"
fi
# Check agents
if [ -d "$PLUGIN_DIR/agents" ]; then
AGENT_COUNT=$(find "$PLUGIN_DIR/agents" -name "*.md" | wc -l)
echo "✓ agents/: $AGENT_COUNT files"
fi
# Check skills
if [ -d "$PLUGIN_DIR/skills" ]; then
SKILL_COUNT=$(find "$PLUGIN_DIR/skills" -name "SKILL.md" | wc -l)
echo "✓ skills/: $SKILL_COUNT SKILL.md files"
fi
# Check commands
if [ -d "$PLUGIN_DIR/commands" ]; then
CMD_COUNT=$(find "$PLUGIN_DIR/commands" -name "*.md" | wc -l)
echo "✓ commands/: $CMD_COUNT files"
fi
# Check hooks
if [ -f "$PLUGIN_DIR/hooks/hooks.json" ]; then
if jq empty "$PLUGIN_DIR/hooks/hooks.json" 2>/dev/null; then
echo "✓ hooks/hooks.json: valid JSON"
else
echo "✗ hooks/hooks.json: invalid JSON"
fi
fi
echo "=== Validation Complete ==="
References
- •Plugin structure: https://code.claude.com/docs/en/plugins-reference
- •Hooks reference: https://code.claude.com/docs/en/hooks
- •Official examples: https://github.com/anthropics/claude-code/tree/main/plugins