| name | plugin-checker |
| description | Use this skill when asked to "validate plugin", "check plugin structure", "verify plugin", "audit plugin", "is my plugin correct", "plugin issues", or when troubleshooting plugin problems. |
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