diff --git a/tools/README.md b/tools/README.md index edf3c13d..19e8c64b 100644 --- a/tools/README.md +++ b/tools/README.md @@ -20,7 +20,7 @@ python tools/validate-skill.py --all - Valid YAML frontmatter (between `---` markers) - Required fields present: `name`, `description`, `domain`, `subdomain`, `tags` - Name is kebab-case, 1–64 characters -- Description is 20–500 characters +- Description is at least 50 characters (no upper limit; multi-line folded scalars are valid) - Domain is `cybersecurity` - Subdomain is from the allowed list - Tags is a list with at least 2 items diff --git a/tools/validate-skill.py b/tools/validate-skill.py index 9411b9a3..9932abc8 100755 --- a/tools/validate-skill.py +++ b/tools/validate-skill.py @@ -205,7 +205,9 @@ def validate_skill(skill_dir): # Validate description. desc = fm.get("description", "") - if isinstance(desc, str): + if isinstance(desc, list): + errors.append("Description must be a string value, not a list") + elif isinstance(desc, str): if len(desc) < DESCRIPTION_MIN_CHARS: errors.append( f"Description too short ({len(desc)} chars, min {DESCRIPTION_MIN_CHARS})" @@ -251,6 +253,9 @@ def main(): if sys.argv[1] == "--all": skill_dirs = sorted(glob.glob("skills/*/")) + if not skill_dirs: + print("ERROR: No skill directories found. Run from the repository root.") + sys.exit(1) else: skill_dirs = [sys.argv[1].rstrip("/") + "/"]