dev:validate — Claude Code skill: what it does, how to install
Verifies plugin integrity before release by checking version sync, skill and agent frontmatter, cross-references, and Python tool syntax.
npx skills add raphaelchristi/harness-evolver --skill dev-validate -a claude-codeWhat dev:validate does
This skill runs automated integrity checks across a plugin repository. It verifies that version numbers match between package.json and .claude-plugin/plugin.json, then scans frontmatter headers in skills/*/SKILL.md and agents/*.md. Skills must declare name, description, and allowed-tools, while agent files require name, description, tools, and color.
The checks also cover agent cross-references: every subagent_type invoked inside a skill must resolve to an existing file in agents/. In addition, it parses all tools/*.py scripts with Python's ast module to catch syntax errors, checks execution bits on hooks/session-start.sh, and validates hooks/hooks.json.
Without python3 available in your environment, the JSON parsing and syntax inspection will fail. The run concludes with a concise PASS/FAIL summary covering every checked subsystem.
What it helps with
- catch version mismatches between package.json and plugin.json
- verify required frontmatter fields in skill and agent markdown files
- detect broken subagent_type references across skills
- find syntax errors in tools/*.py scripts using Python AST
- ensure hooks/session-start.sh has executable permissions
Example prompts for the agent
- Validate the plugin before release
- /dev:validate
- Check plugin integrity and verify cross-references
How to install dev:validate
1Skills CLI (Vercel)
npx skills add raphaelchristi/harness-evolver --skill dev-validate -a claude-code2Manually: put the files in place
~/.claude/skills/dev-validate/SKILL.mdCopy the whole skill folder; for one project use .claude/skills/dev-validate/
1Skills CLI (Vercel)
npx skills add raphaelchristi/harness-evolver --skill dev-validate -a codex2Manually: put the files in place
.agents/skills/dev-validate/SKILL.mdFor all projects use ~/.agents/skills/
1Skills CLI (Vercel)
npx skills add raphaelchristi/harness-evolver --skill dev-validate -a cursor2Manually: put the files in place
.cursor/skills/dev-validate/SKILL.mdCursor also reads .agents/skills/ and .claude/skills/
1GitHub CLI
gh skill install raphaelchristi/harness-evolver dev-validate2Manually: put the files in place
.github/skills/dev-validate/SKILL.md1Skills CLI (Vercel)
npx skills add raphaelchristi/harness-evolver --skill dev-validate -a gemini-cli2Platform CLI
gemini skills install https://github.com/raphaelchristi/harness-evolver --path .claude/skills/dev-validateManually: put the files in place
.devin/skills/dev-validate/SKILL.mdThe legacy .windsurf/skills/ path still works
Skills CLI (Vercel)
npx skills add raphaelchristi/harness-evolver --skill dev-validate -a opencodeClaude.ai
Zip the folder and upload it in Settings → Capabilities → Skills
Step by step, with commands for each platform: How to install skills in Claude Code: five ways
Questions about dev:validate
How do I install dev:validate in Claude Code?
Run npx skills add raphaelchristi/harness-evolver --skill dev-validate -a claude-code. Alternatively, place the file directly at ~/.claude/skills/dev-validate/SKILL.md.
What checks does dev:validate perform?
It validates plugin structure: version synchronization, frontmatter fields, resolution of agent cross-references, Python tool syntax, and hook file permissions.
What dependencies are required to run dev:validate?
The skill relies on Bash, Read, Glob, and Grep execution tools, plus a local python3 binary for JSON parsing and AST syntax checks.
Source text
SKILL.md · MIT
---
name: dev:validate
description: "Use when the user wants to validate the plugin, check integrity, verify cross-references, or before a release. Also use when the user says 'validate', 'check plugin', or 'verify'."
allowed-tools: [Read, Bash, Glob, Grep]
---
# /dev:validate
Check plugin integrity: skill/agent frontmatter, cross-references, Python tool syntax, version sync, hook script executability.
## Checks
### 1. Version Sync
```bash
PKG_V=$(python3 -c "import json; print(json.load(open('package.json'))['version'])")
PLUGIN_V=$(python3 -c "import json; print(json.load(open('.claude-plugin/plugin.json'))['version'])")
if [ "$PKG_V" = "$PLUGIN_V" ]; then
echo "OK: versions match ($PKG_V)"
else
echo "FAIL: package.json=$PKG_V, plugin.json=$PLUGIN_V"
fi
```
### 2. Skill Frontmatter
For each `skills/*/SKILL.md`:
- Must have `name:` in frontmatter
- Must have `description:` in frontmatter
- Must have `allowed-tools:` in frontmatter
```bash
for f in skills/*/SKILL.md; do
NAME=$(grep -m1 "^name:" "$f" | cut -d: -f2- | xargs)
DESC=$(grep -m1 "^description:" "$f")
TOOLS=$(grep -m1 "^allowed-tools:" "$f")
if [ -z "$NAME" ] || [ -z "$DESC" ] || [ -z "$TOOLS" ]; then
echo "FAIL: $f missing frontmatter fields"
else
echo "OK: $f ($NAME)"
fi
done
```
### 3. Agent Frontmatter
For each `agents/*.md`:
- Must have `name:` in frontmatter
- Must have `description:` in frontmatter
- Must have `tools:` in frontmatter
- Must have `color:` in frontmatter
```bash
for f in agents/*.md; do
NAME=$(grep -m1 "^name:" "$f" | cut -d: -f2- | xargs)
COLOR=$(grep -m1 "^color:" "$f" | cut -d: -f2- | xargs)
if [ -z "$NAME" ] || [ -z "$COLOR" ]; then
echo "FAIL: $f missing name or color"
else
echo "OK: $f ($NAME, $COLOR)"
fi
done
```
### 4. Agent Cross-References
Check that every `subagent_type:` referenced in skills exists as an agent file:
```bash
for AGENT in $(grep -roh 'subagent_type: "[^"]*"' skills/ | sed 's/subagent_type: "//;s/"//' | sort -u); do
if [ ! -f "agents/$AGENT.md" ]; then
echo "FAIL: subagent_type '$AGENT' referenced in skills but agents/$AGENT.md not found"
else
echo "OK: $AGENT agent exists"
fi
done
```
### 5. Python Tool Syntax
```bash
ERRORS=0
for f in tools/*.py; do
python3 -c "import ast; ast.parse(open('$f').read())" 2>&1
if [ $? -ne 0 ]; then
echo "FAIL: $f has syntax errors"
ERRORS=$((ERRORS+1))
else
echo "OK: $f"
fi
done
echo "Python tools: $ERRORS errors"
```
### 6. Hook Script
```bash
if [ -f "hooks/session-start.sh" ]; then
if [ -x "hooks/session-start.sh" ]; then
echo "OK: hooks/session-start.sh is executable"
else
echo "FAIL: hooks/session-start.sh not executable"
fi
if [ -f "hooks/hooks.json" ]; then
python3 -c "import json; json.load(open('hooks/hooks.json'))" 2>&1
if [ $? -eq 0 ]; then echo "OK: hooks.json valid JSON"; else echo "FAIL: hooks.json invalid"; fi
fi
else
echo "WARN: no hooks/session-start.sh"
fi
```
### 7. CLAUDE.md Accuracy
Check that tool count and agent count in CLAUDE.md match reality:
```bash
TOOL_COUNT=$(ls tools/*.py 2>/dev/null | wc -l)
AGENT_COUNT=$(ls agents/*.md 2>/dev/null | wc -l)
echo "Tools: $TOOL_COUNT Python files"
echo "Agents: $AGENT_COUNT agent definitions"
```
## Report
Print a summary:
```
Plugin Validation:
Versions: {OK/FAIL}
Skills: {N} checked, {N} passed
Agents: {N} checked, {N} passed
Cross-refs: {N} checked, {N} passed
Python tools: {N} checked, {N} syntax errors
Hooks: {OK/FAIL}
Result: {PASS/FAIL}
```
© raphaelchristi · MIT · raphaelchristi/harness-evolver