refactor: update skill validation logic in validate_skills.py
This commit is contained in:
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user