Install any skill in seconds. Free to start, no credit card required.
Get Started Free →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.
.claude/skills/dicklesworthstone-plugin-checker/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-07 | ✗→✓ | ▲ Improved | 59% | 0% |
| case-04 | ✗→✓ | ▲ Improved | 45% | 0% |
| case-06 | ✗→✓ | ▲ Improved | 90% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 88% | 0% |
| case-09 | ✗→✓ | ▲ Improved | 98% | 0% |
This skill provides comprehensive validation guidelines for Claude Code plugins, helping identify structural issues, misconfigurations, and best practice violations.
Check .claude-plugin/plugin.json:
Required:
.claude-plugin/plugin.jsonname field present and validName validation:
Optional fields (if present):
version follows semver (X.Y.Z)description is a non-empty stringauthor has name field (string)author.email is valid email format (if present)Required structure:
plugin-name/
├── .claude-plugin/
│ └── plugin.json ← REQUIREDValid optional directories:
agents/ - Contains .md files onlyskills/ - Contains subdirectories with SKILL.mdcommands/ - Contains .md files onlyhooks/ - Contains hooks.jsonscripts/ - Contains executable scriptsInvalid patterns to flag:
AGENTS.md at root (should be agents/*.md)SKILL.md at root (should be skills/*/SKILL.md).claude-plugin/ directoriesskills/ (should be in subdirs)For each file in agents/*.md:
Frontmatter checks:
---name field presentdescription field presentName field:
Description field:
<example> block (recommended)user:, assistant:, <commentary>Model field (if present):
inherit, sonnet, opus, haikuColor field (if present):
blue, cyan, green, yellow, magenta, redTools field (if present):
Content check:
For each directory in skills/*/:
Structure:
SKILL.md fileSKILL.md has YAML frontmatterFrontmatter:
name field presentdescription field present with trigger phrasesOptional subdirectories:
references/ - Additional documentationexamples/ - Working examplesscripts/ - Utility scriptsFor each file in commands/*.md:
Frontmatter:
description field presentargument-hint is string (if present)allowed-tools is array (if present)Naming:
For hooks/hooks.json:
JSON structure:
hooks object at root (or in description + hooks)Event names (if present):
PreToolUsePostToolUseStopSubagentStopSessionStartSessionEndUserPromptSubmitPreCompactNotificationPermissionRequestHook entries:
matcher field present (for tool events)hooks array presenttype ("command" or "prompt")command fieldprompt fieldPath portability:
${CLAUDE_PLUGIN_ROOT} for plugin pathsScript references:
Credentials:
URLs:
Scripts:
Cause: Missing or invalid plugin.json Fix: Create .claude-plugin/plugin.json with valid JSON and name field
Cause: Agents not in correct location Fix: Move to agents/ directory with .md extension
Cause: Weak trigger description or wrong structure Fix:
skills/{name}/SKILL.md structureCause: Invalid hooks.json or script permissions Fix:
chmod +x scripts/*.sh${CLAUDE_PLUGIN_ROOT} in pathsCause: Missing frontmatter or wrong location Fix: Ensure commands/*.md with description in frontmatter
Quick structure check:
bash# 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:
bashclaude --plugin-dir /path/to/my-plugin
Debug mode:
bashclaude --debug --plugin-dir /path/to/my-plugin
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]bash#!/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 ==="
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 7,169 | 5,039 | -30% | 1 | 1 | 0% | 347 | 2,510 | +623% | 0 | 0 | — |
case-07 | fail→pass | 13,588 | 4,937 | -64% | 1 | 1 | 0% | 2,066 | 3,287 | +59% | 0 | 0 | — |
case-12 | pass→pass | 13,122 | 6,138 | -53% | 1 | 1 | 0% | 2,015 | 3,221 | +60% | 0 | 0 | — |
case-02 | fail→fail | 4,407 | 7,427 | +69% | 1 | 1 | 0% | 244 | 2,690 | +1002% | 0 | 0 | — |
case-03 | fail→fail | 24,565 | 4,127 | -83% | 1 | 1 | 0% | 3,281 | 2,736 | -17% | 0 | 0 | — |
case-04 | fail→pass | 14,375 | 4,427 | -69% | 1 | 1 | 0% | 2,010 | 2,924 | +45% | 0 | 0 | — |
case-05 | pass→pass | 10,558 | 4,444 | -58% | 1 | 1 | 0% | 1,695 | 2,963 | +75% | 0 | 0 | — |
case-06 | fail→pass | 9,568 | 4,753 | -50% | 1 | 1 | 0% | 1,628 | 3,086 | +90% | 0 | 0 | — |
case-08 | fail→pass | 7,961 | 4,847 | -39% | 1 | 1 | 0% | 1,558 | 2,927 | +88% | 0 | 0 | — |
case-09 | fail→pass | 8,869 | 2,548 | -71% | 1 | 1 | 0% | 1,349 | 2,670 | +98% | 0 | 0 | — |
case-10 | fail→pass | 7,533 | 5,101 | -32% | 1 | 1 | 0% | 1,226 | 3,053 | +149% | 0 | 0 | — |
case-11 | fail→pass | 13,160 | 5,240 | -60% | 1 | 1 | 0% | 2,159 | 3,046 | +41% | 0 | 0 | — |
case-13 | fail→pass | 7,433 | 4,884 | -34% | 1 | 1 | 0% | 1,302 | 2,891 | +122% | 0 | 0 | — |
case-14 | fail→pass | 7,168 | 3,960 | -45% | 1 | 1 | 0% | 1,097 | 2,892 | +164% | 0 | 0 | — |
case-15 | pass→pass | 5,801 | 6,671 | +15% | 1 | 1 | 0% | 866 | 3,393 | +292% | 0 | 0 | — |
case-16 | fail→pass | 10,647 | 3,745 | -65% | 1 | 1 | 0% | 1,745 | 2,908 | +67% | 0 | 0 | — |
case-17 | pass→pass | 11,187 | 5,210 | -53% | 1 | 1 | 0% | 1,624 | 3,014 | +86% | 0 | 0 | — |
case-18 | fail→pass | 12,281 | 5,703 | -54% | 1 | 1 | 0% | 2,012 | 3,322 | +65% | 0 | 0 | — |
case-19 | pass→pass | 16,217 | 15,689 | -3% | 1 | 1 | 0% | 2,911 | 5,505 | +89% | 0 | 0 | — |
case-20 | pass→pass | 14,118 | 18,004 | +28% | 1 | 1 | 0% | 2,172 | 5,184 | +139% | 0 | 0 | — |
case-21 | pass→pass | 11,693 | 27,254 | +133% | 1 | 1 | 0% | 2,085 | 6,357 | +205% | 0 | 0 | — |
case-22 | pass→pass | 8,544 | 12,323 | +44% | 1 | 1 | 0% | 1,741 | 4,274 | +145% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted, and 20 counted toward the lift figure. The other 2 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +50 percentage points is the difference between those two pass rates over the 20 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.