import re from pathlib import Path from .types import Skill def parse_skill_file(skill_file: Path, category: str) -> Skill | None: """ Parse a SKILL.md file and extract metadata. Args: skill_file: Path to the SKILL.md file category: Category of the skill ('public' or 'custom') Returns: Skill object if parsing succeeds, None otherwise """ if not skill_file.exists() or skill_file.name != "SKILL.md": return None try: content = skill_file.read_text(encoding="utf-8") # Extract YAML front matter # Pattern: ---\nkey: value\n--- front_matter_match = re.match(r"^---\s*\n(.*?)\n---\s*\n", content, re.DOTALL) if not front_matter_match: return None front_matter = front_matter_match.group(1) # Parse YAML front matter (simple key-value parsing) metadata = {} for line in front_matter.split("\n"): line = line.strip() if not line: continue if ":" in line: key, value = line.split(":", 1) metadata[key.strip()] = value.strip() # Extract required fields name = metadata.get("name") description = metadata.get("description") if not name or not description: return None license_text = metadata.get("license") return Skill( name=name, description=description, license=license_text, skill_dir=skill_file.parent, skill_file=skill_file, category=category, enabled=True, # Default to enabled, actual state comes from config file ) except Exception as e: print(f"Error parsing skill file {skill_file}: {e}") return None