| 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") |
|
|
| |
| |
| 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) |
|
|
| |
| 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() |
|
|
| |
| 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, |
| ) |
|
|
| except Exception as e: |
| print(f"Error parsing skill file {skill_file}: {e}") |
| return None |
|
|