
Skill Validator
Validate local SKILL.md packages against the Agent Skills spec before you publish or submit them to a catalog.
Overview
skill-validator is an agent skill most often used in Build (also Ship review) that validates Agent Skills folders against the official specification using a bundled Python CLI.
Install
npx skills add https://github.com/skillscatalog/registry --skill skill-validatorWhat is this skill?
- Mirrors catalog spec-compliance rules via validate_skill.py for consistent pass/fail behavior
- CLI validates a skill directory path with optional --json and --strict modes
- SHA-256 manifest integrity block documents SKILL.md and bundled script fingerprints
- Two-file layout: SKILL.md manifest plus scripts/validate_skill.py validator
- Structured validation output suitable for CI and pre-publish gates
- 2 bundled files: SKILL.md manifest and scripts/validate_skill.py
- Supports --json and --strict CLI flags per bundled usage docs
Adoption & trust: 1 installs on skills.sh; 1 GitHub stars; 3/3 security scanners passed (skills.sh audits); trending (+100% hot-view momentum).
What problem does it solve?
You have a skill folder ready to publish but no fast, catalog-aligned way to know if it violates Agent Skills spec before agents install it.
Who is it for?
Indie skill authors and maintainers who want the same validation logic as the skills catalog before every commit or publish.
Skip if: Builders who only consume third-party skills and never author SKILL.md packages—skip unless you are packaging your own skill.
When should I use this skill?
Before publishing, submitting to a catalog, or merging changes to a skill package that must match Agent Skills specification.
What do I get? / Deliverables
You receive structured pass/fail validation from validate_skill.py so you can fix spec issues before catalog ingest or CI release.
- Console or JSON validation report for the skill path
- Spec compliance pass/fail suitable for CI pipelines
Recommended Skills
Journey fit
Spans multiple journey phases - primary shelf plus alternate fits below.
Skill authors most often run this while building or packaging agent skills in the agent-tooling shelf of the Build phase. Spec compliance checks belong on the agent-tooling shelf because they gate reusable skills and scripts agents install.
Where it fits
Run validate_skill.py on a new skill repo before opening a PR to a skills registry.
Gate a release tag with --strict validation so non-compliant manifests never ship.
Re-validate after editing bundled scripts when users report install or integrity mismatches.
How it compares
Use instead of hand-reading the spec or ad-hoc lint scripts that drift from catalog compliance rules.
Common Questions / FAQ
Who is skill-validator for?
Solo builders and small teams authoring Agent Skills who need spec compliance checks aligned with catalog ingest rules before publish.
When should I use skill-validator?
During Build agent-tooling when packaging SKILL.md, before Ship review as a release gate, and in CI when validating skill directories with --json output.
Is skill-validator safe to install?
Review the Security Audits panel on this Prism page and inspect scripts/validate_skill.py locally; the skill runs filesystem reads on paths you pass to the CLI.
SKILL.md
READMESKILL.md - Skill Validator
{ "$schema": "https://agentskills.io/schemas/manifest.v1.json", "manifestVersion": "1.0", "generatedAt": "2026-01-03T02:24:46.094996Z", "generator": "skill-manifest-generator/1.0.0", "skill": { "name": "skill-validator", "version": "1.0.0" }, "integrity": { "algorithm": "sha256", "hash": "2c48316df8cb9231cc24b1387e24ef96b1ff5d383af74caea719185841c2bf6f" }, "files": [ { "path": "SKILL.md", "size": 2586, "sha256": "c662b1e1bc6846aeefe7cf06ad3be26518f2168bd4db68dfd38b9cb95bceabfe", "type": "manifest" }, { "path": "scripts/validate_skill.py", "size": 14502, "sha256": "ebf57274d07bf593eab81cbf7b3455e406827960d0eec4e91831838411e39009", "type": "script" } ], "externalReferences": [], "structure": { "maxDepth": 1, "totalFiles": 2, "totalBytes": 17088, "folders": [ "scripts" ] }, "license": { "spdxId": "MIT" } } #!/usr/bin/env python3 """ Skill Validator Validates Agent Skills against the specification. This script mirrors the validation logic from src/lib/spec-compliance/index.ts to ensure consistent behavior between the skill and the catalog. Usage: python validate_skill.py /path/to/skill python validate_skill.py /path/to/skill --json python validate_skill.py /path/to/skill --strict """ import argparse import json import os import re import sys from dataclasses import dataclass, field, asdict from pathlib import Path from typing import Optional # Try to import yaml, fall back to basic parsing if not available try: import yaml HAS_YAML = True except ImportError: HAS_YAML = False @dataclass class ValidationResult: """Result of skill validation - mirrors ComplianceResult from TypeScript""" is_compliant: bool score: int # 0-100 has_skill_md: bool has_valid_name: bool has_valid_description: bool name_matches_dir: bool has_valid_structure: bool skill_name: Optional[str] description: Optional[str] issues: list = field(default_factory=list) warnings: list = field(default_factory=list) # Additional fields for enhanced validation version: Optional[str] = None license: Optional[str] = None author: Optional[str] = None tags: list = field(default_factory=list) def validate_name(name: str) -> tuple[bool, Optional[str]]: """ Validate a skill name according to spec. Rules (from src/lib/spec-compliance/index.ts): - 1-64 characters - lowercase alphanumeric and hyphens only - cannot start with hyphen - cannot end with hyphen - no consecutive hyphens Extended rules (from specs/20-skill-manifest-system.md): - must start with a letter """ if not name or len(name) == 0: return False, "Name is required" if len(name) > 64: return False, "Name exceeds 64 characters" # Must be lowercase alphanumeric and hyphens only if not re.match(r'^[a-z0-9-]+$', name): return False, "Name must be lowercase alphanumeric and hyphens only" # Must start with a letter (extended rule from Spec 20) if not re.match(r'^[a-z]', name): return False, "Name must start with a letter" if name.startswith("-"): return False, "Name cannot start with a hyphen" if name.endswith("-"): return False, "Name cannot end with a hyphen" if "--" in name: return False, "Name cannot contain consecutive hyphens" return True, None def validate_description(desc: str) -> tuple[bool, Optional[str]]: """ Validate description according to spec. Rules: - 1-1024 characters - non-empty """ if not desc or len(desc.strip()) == 0: return False, "Description is required" if len(desc) > 1024: return False, "Description exceeds 1024 characters" return True, None def validate_version(version: str) -> tuple[bool, Optional[str]]: """Validate version follows semver format (war