From 725e053997e46447c7074c3bd09609cbf64ba619 Mon Sep 17 00:00:00 2001 From: Ares Date: Wed, 25 Feb 2026 15:04:20 +0000 Subject: [PATCH] refactor: update skill validation logic in validate_skills.py --- scripts/validate_skills.py | 29 ++++++++++++++++++++++++----- 1 file changed, 24 insertions(+), 5 deletions(-) diff --git a/scripts/validate_skills.py b/scripts/validate_skills.py index 635a45a9..8612a78b 100644 --- a/scripts/validate_skills.py +++ b/scripts/validate_skills.py @@ -12,22 +12,37 @@ WHEN_TO_USE_PATTERNS = [ def has_when_to_use_section(content): return any(pattern.search(content) for pattern in WHEN_TO_USE_PATTERNS) -def parse_frontmatter(content): +def parse_frontmatter(content, rel_path=None): """ Simple frontmatter parser using regex to avoid external dependencies. Returns a dict of key-values. """ fm_match = re.search(r'^---\s*\n(.*?)\n---', content, re.DOTALL) if not fm_match: - return None + return None, [] fm_text = fm_match.group(1) metadata = {} - for line in fm_text.split('\n'): + lines = fm_text.split('\n') + fm_errors = [] + + for i, line in enumerate(lines): if ':' in line: key, val = line.split(':', 1) metadata[key.strip()] = val.strip().strip('"').strip("'") - return metadata + + # Check for multi-line description issue (problem identification for the user) + if key.strip() == "description": + stripped_val = val.strip() + if (stripped_val.startswith('"') and stripped_val.endswith('"')) or \ + (stripped_val.startswith("'") and stripped_val.endswith("'")): + if i + 1 < len(lines) and lines[i+1].startswith(' '): + fm_errors.append(f"description is wrapped in quotes but followed by indented lines. This causes YAML truncation.") + + # Check for literal indicators wrapped in quotes + if stripped_val in ['"|"', "'>'", '"|"', "'>'"]: + fm_errors.append(f"description uses a block indicator {stripped_val} inside quotes. Remove quotes for proper YAML block behavior.") + return metadata, fm_errors def validate_skills(skills_dir, strict_mode=False): print(f"🔍 Validating skills in: {skills_dir}") @@ -59,10 +74,14 @@ def validate_skills(skills_dir, strict_mode=False): continue # 1. Frontmatter Check - metadata = parse_frontmatter(content) + metadata, fm_errors = parse_frontmatter(content, rel_path) if not metadata: errors.append(f"❌ {rel_path}: Missing or malformed YAML frontmatter") continue # Cannot proceed without metadata + + if fm_errors: + for fe in fm_errors: + errors.append(f"❌ {rel_path}: YAML Structure Error - {fe}") # 2. Metadata Schema Checks if "name" not in metadata: