75 lines
3.0 KiB
Python
75 lines
3.0 KiB
Python
import os
|
|
import json
|
|
import re
|
|
|
|
def generate_index(skills_dir, output_file):
|
|
print(f"🏗️ Generating index from: {skills_dir}")
|
|
skills = []
|
|
|
|
for root, dirs, files in os.walk(skills_dir):
|
|
# Skip .disabled directories
|
|
dirs[:] = [d for d in dirs if d != '.disabled']
|
|
if "SKILL.md" in files:
|
|
skill_path = os.path.join(root, "SKILL.md")
|
|
dir_name = os.path.basename(root)
|
|
|
|
skill_info = {
|
|
"id": dir_name,
|
|
"path": os.path.relpath(root, os.path.dirname(skills_dir)),
|
|
"name": dir_name.replace("-", " ").title(),
|
|
"description": ""
|
|
}
|
|
|
|
with open(skill_path, 'r', encoding='utf-8') as f:
|
|
content = f.read()
|
|
|
|
# Try to extract from frontmatter first
|
|
fm_match = re.search(r'^---\s*(.*?)\s*---', content, re.DOTALL)
|
|
if fm_match:
|
|
fm_content = fm_match.group(1)
|
|
name_fm = re.search(r'^name:\s*(.+)$', fm_content, re.MULTILINE)
|
|
desc_fm = re.search(r'^description:\s*(.+)$', fm_content, re.MULTILINE)
|
|
|
|
if name_fm:
|
|
skill_info["name"] = name_fm.group(1).strip()
|
|
if desc_fm:
|
|
skill_info["description"] = desc_fm.group(1).strip()
|
|
|
|
# Fallback to Header and First Paragraph if needed
|
|
if not skill_info["description"] or skill_info["description"] == "":
|
|
name_match = re.search(r'^#\s+(.+)$', content, re.MULTILINE)
|
|
if name_match and not fm_match: # Only override if no frontmatter name
|
|
skill_info["name"] = name_match.group(1).strip()
|
|
|
|
# Extract first paragraph
|
|
body = content
|
|
if fm_match:
|
|
body = content[fm_match.end():].strip()
|
|
|
|
lines = body.split('\n')
|
|
desc_lines = []
|
|
for line in lines:
|
|
if line.startswith('#') or not line.strip():
|
|
if desc_lines: break
|
|
continue
|
|
desc_lines.append(line.strip())
|
|
|
|
if desc_lines:
|
|
skill_info["description"] = " ".join(desc_lines)[:150] + "..."
|
|
|
|
skills.append(skill_info)
|
|
|
|
skills.sort(key=lambda x: x["name"].lower())
|
|
|
|
with open(output_file, 'w', encoding='utf-8') as f:
|
|
json.dump(skills, f, indent=2)
|
|
|
|
print(f"✅ Generated index with {len(skills)} skills at: {output_file}")
|
|
return skills
|
|
|
|
if __name__ == "__main__":
|
|
base_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
|
skills_path = os.path.join(base_dir, "skills")
|
|
output_path = os.path.join(base_dir, "skills_index.json")
|
|
generate_index(skills_path, output_path)
|