Validate plugin structure, manifests, and silent failure patterns. TRIGGERS - plugin validation, validate plugin, check plugin, silent failures, hook audit, stderr emission.
View on GitHubterrylica/cc-skills
plugin-dev
January 25, 2026
Select agents to install to:
npx add-skill https://github.com/terrylica/cc-skills/blob/main/plugins/plugin-dev/skills/plugin-validator/SKILL.md -a claude-code --skill plugin-validatorInstallation paths:
.claude/skills/plugin-validator/# Plugin Validator
Comprehensive validation for Claude Code marketplace plugins.
## Quick Start
```bash
# Validate a specific plugin
uv run plugins/plugin-dev/skills/plugin-validator/scripts/audit_silent_failures.py plugins/my-plugin/
# Validate with fix suggestions
uv run plugins/plugin-dev/skills/plugin-validator/scripts/audit_silent_failures.py plugins/my-plugin/ --fix
```
## Validation Phases
### Phase 1: Structure Validation
Check plugin directory structure:
```bash
/usr/bin/env bash << 'VALIDATE_EOF'
PLUGIN_PATH="${1:-.}"
# Check plugin.json exists
if [[ ! -f "$PLUGIN_PATH/plugin.json" ]]; then
echo "ERROR: Missing plugin.json" >&2
exit 1
fi
# Validate JSON syntax
if ! jq empty "$PLUGIN_PATH/plugin.json" 2>/dev/null; then
echo "ERROR: Invalid JSON in plugin.json" >&2
exit 1
fi
# Check required fields
REQUIRED_FIELDS=("name" "version" "description")
for field in "${REQUIRED_FIELDS[@]}"; do
if ! jq -e ".$field" "$PLUGIN_PATH/plugin.json" >/dev/null 2>&1; then
echo "ERROR: Missing required field: $field" >&2
exit 1
fi
done
echo "Structure validation passed"
VALIDATE_EOF
```
### Phase 2: Silent Failure Audit
**Critical Rule**: All hook entry points MUST emit to stderr on failure.
Run the audit script:
```bash
uv run plugins/plugin-dev/skills/plugin-validator/scripts/audit_silent_failures.py plugins/my-plugin/
```
#### What Gets Checked
| Check | Target Files | Pattern |
| ------------- | ------------ | -------------------------------------- |
| Shellcheck | `hooks/*.sh` | SC2155, SC2086, etc. |
| Silent bash | `hooks/*.sh` | `mkdir\|cp\|mv\|rm\|jq` without `if !` |
| Silent Python | `hooks/*.py` | `except.*: pass` without stderr |
#### Hook Entry Points vs Utility Scripts
| Location | Type | Requirement |
| ------------------------ | ----------- | -------------------- |
| `plugins/*/hooks/*.sh` | Entry p