Initial commit
This commit is contained in:
122
skills/subagent-prompt-construction/scripts/generate-frontmatter.py
Executable file
122
skills/subagent-prompt-construction/scripts/generate-frontmatter.py
Executable file
@@ -0,0 +1,122 @@
|
||||
#!/usr/bin/env python3
|
||||
"""generate-frontmatter.py - Generate skill frontmatter inventory"""
|
||||
|
||||
import json
|
||||
import re
|
||||
from pathlib import Path
|
||||
from typing import Dict
|
||||
|
||||
|
||||
def extract_frontmatter(skill_md: Path) -> Dict:
|
||||
"""Extract YAML frontmatter from SKILL.md"""
|
||||
if not skill_md.exists():
|
||||
return {"error": "SKILL.md not found"}
|
||||
|
||||
content = skill_md.read_text()
|
||||
|
||||
# Extract frontmatter between --- delimiters
|
||||
match = re.search(r"^---\n(.+?)\n---", content, re.DOTALL | re.MULTILINE)
|
||||
if not match:
|
||||
return {"error": "No frontmatter found"}
|
||||
|
||||
frontmatter_text = match.group(1)
|
||||
|
||||
# Parse YAML-style frontmatter
|
||||
frontmatter = {}
|
||||
for line in frontmatter_text.split("\n"):
|
||||
if ":" in line:
|
||||
key, value = line.split(":", 1)
|
||||
key = key.strip()
|
||||
value = value.strip()
|
||||
|
||||
# Try to parse as number or boolean
|
||||
if value.replace(".", "").isdigit():
|
||||
value = float(value) if "." in value else int(value)
|
||||
elif value.lower() in ["true", "false"]:
|
||||
value = value.lower() == "true"
|
||||
elif value.endswith("%"):
|
||||
value = int(value[:-1])
|
||||
|
||||
frontmatter[key] = value
|
||||
|
||||
return frontmatter
|
||||
|
||||
|
||||
def extract_lambda_contract(skill_md: Path) -> str:
|
||||
"""Extract lambda contract from SKILL.md"""
|
||||
if not skill_md.exists():
|
||||
return ""
|
||||
|
||||
content = skill_md.read_text()
|
||||
|
||||
# Find lambda contract (starts with λ)
|
||||
match = re.search(r"^λ\(.+?\).*$", content, re.MULTILINE)
|
||||
if match:
|
||||
return match.group(0)
|
||||
|
||||
return ""
|
||||
|
||||
|
||||
def main():
|
||||
"""Main entry point"""
|
||||
skill_dir = Path(__file__).parent.parent
|
||||
skill_md = skill_dir / "SKILL.md"
|
||||
|
||||
if not skill_md.exists():
|
||||
print(json.dumps({"error": "SKILL.md not found"}, indent=2))
|
||||
return
|
||||
|
||||
# Extract frontmatter and lambda contract
|
||||
frontmatter = extract_frontmatter(skill_md)
|
||||
lambda_contract = extract_lambda_contract(skill_md)
|
||||
|
||||
# Calculate metrics
|
||||
skill_lines = len(skill_md.read_text().split("\n"))
|
||||
|
||||
# Count examples
|
||||
examples_dir = skill_dir / "examples"
|
||||
examples_count = len(list(examples_dir.glob("*.md"))) if examples_dir.exists() else 0
|
||||
|
||||
# Count reference files
|
||||
reference_dir = skill_dir / "reference"
|
||||
reference_count = len(list(reference_dir.glob("*.md"))) if reference_dir.exists() else 0
|
||||
|
||||
# Count case studies
|
||||
case_studies_dir = reference_dir / "case-studies" if reference_dir.exists() else None
|
||||
case_studies_count = len(list(case_studies_dir.glob("*.md"))) if case_studies_dir and case_studies_dir.exists() else 0
|
||||
|
||||
# Combine results
|
||||
result = {
|
||||
"skill": "subagent-prompt-construction",
|
||||
"frontmatter": frontmatter,
|
||||
"lambda_contract": lambda_contract,
|
||||
"metrics": {
|
||||
"skill_md_lines": skill_lines,
|
||||
"examples_count": examples_count,
|
||||
"reference_files_count": reference_count,
|
||||
"case_studies_count": case_studies_count
|
||||
},
|
||||
"compliance": {
|
||||
"skill_md_under_40_lines": skill_lines <= 40,
|
||||
"has_lambda_contract": len(lambda_contract) > 0,
|
||||
"has_examples": examples_count > 0,
|
||||
"has_reference": reference_count > 0
|
||||
}
|
||||
}
|
||||
|
||||
# Save to inventory
|
||||
inventory_dir = skill_dir / "inventory"
|
||||
inventory_dir.mkdir(exist_ok=True)
|
||||
|
||||
output_file = inventory_dir / "skill-frontmatter.json"
|
||||
output_file.write_text(json.dumps(result, indent=2))
|
||||
|
||||
print(f"✅ Frontmatter extracted to {output_file}")
|
||||
print(f" - SKILL.md: {skill_lines} lines ({'✅' if skill_lines <= 40 else '⚠️ over'})")
|
||||
print(f" - Examples: {examples_count}")
|
||||
print(f" - Reference files: {reference_count}")
|
||||
print(f" - Case studies: {case_studies_count}")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in New Issue
Block a user