with one click
skillsvalidate
// Validate skill files meet the standard format and naming conventions
// Validate skill files meet the standard format and naming conventions
Review all orchestration PRs before merge - per-PR checks, cross-PR consistency, and coordinated approval
Scan a repository to bootstrap new skills or audit and update existing ones
Skill management - create, validate, and improve Claude Code skills
Create or edit skills with proper structure, task tracking, and naming conventions
| name | skills:validate |
| description | Validate skill files meet the standard format and naming conventions |
name: and description: fieldsname: uses colon notation (e.g., tdd:ci not tdd-ci)name: field# Skill Name as first heading&& chaining).claude/settings.jsonfor loops in commandsSKILL.md references this skillSkills operate on either sandbox (safe) or management (requires approval) targets:
| Type | Target | Auto-approve? | Command format |
|---|---|---|---|
| Sandbox | Local Kind cluster, custom HyperShift hosted cluster | YES | Single commands, one per step |
| Management | Management cluster, AWS resources, git push, destructive ops | NO | Can chain commands (user approves anyway) |
Commands target localtest.me, KUBECONFIG=~/clusters/hcp/kagenti-hypershift-custom-*, or Kind clusters.
IMPORTANT: Run each command separately — not chained with &&. Chained or multiline commands break Claude Code's auto-approve pattern matching.
## GOOD (each command runs separately, matches auto-approve patterns)
Check pod status:
```bash
kubectl get pods -n kagenti-system
Check logs:
kubectl logs -n kagenti-system deployment/mlflow
kubectl get pods -n kagenti-system && kubectl logs -n kagenti-system deployment/mlflow
### Management skills (require approval)
Commands target management clusters, AWS APIs, or perform destructive operations. These can use any command format since the user must approve each one.
## How to Validate
### Single Skill
```bash
# Check frontmatter
head -5 .claude/skills/<skill>/SKILL.md
# Check name matches directory
DIR_NAME=$(basename $(dirname .claude/skills/<skill>/SKILL.md))
SKILL_NAME=$(grep '^name:' .claude/skills/<skill>/SKILL.md | sed 's/name: //')
[ "$DIR_NAME" = "$SKILL_NAME" ] && echo "OK" || echo "MISMATCH: dir=$DIR_NAME name=$SKILL_NAME"
# Check all frontmatter name-vs-directory
for f in .claude/skills/*/SKILL.md; do
dir=$(basename $(dirname "$f"))
name=$(grep '^name:' "$f" | sed 's/name: //' | tr -d ' ')
[ "$dir" = "$name" ] || echo "MISMATCH: $dir != $name"
done
# Find chained commands in sandbox skills (potential auto-approve issues)
grep -rn ' && ' .claude/skills/*/SKILL.md
for f in .claude/skills/*/SKILL.md; do
dir=$(basename $(dirname "$f"))
case "$dir" in git|auth|meta|repo) continue ;; esac
if ! grep -q '```mermaid' "$f"; then
echo "MISSING DIAGRAM: $dir"
fi
done
For each command in a sandbox skill, verify it matches a pattern in .claude/settings.json:
| Command prefix | settings.json pattern |
|---|---|
kubectl get | Bash(kubectl get:*) |
kubectl describe | Bash(kubectl describe:*) |
kubectl logs | Bash(kubectl logs:*) |
helm list | Bash(helm list:*) |
KUBECONFIG=~/clusters/hcp/... kubectl | Bash(KUBECONFIG=*/clusters/hcp/kagenti-hypershift-custom-*/auth/kubeconfig kubectl:*) |
uv run pytest | Bash(uv run pytest:*) |
If a command is NOT covered, add the pattern to .claude/settings.json in the allow array.
When validating multiple skills:
TaskCreate: "kagenti | skills | <category> | Verify | Validate <skill-name>"
skills:write - Create new skills following the standardskills:scan - Audit repository skills