#!/usr/bin/env python3 """ Regenerate manifest.json for LinkML schema frontend. This script scans the LinkML schema directory and generates a complete manifest of all class and enum files for the frontend to load. """ import json import os from datetime import datetime, timezone from pathlib import Path # Schema paths SCHEMA_DIR = Path(__file__).parent.parent / "schemas" / "20251121" / "linkml" CLASSES_DIR = SCHEMA_DIR / "modules" / "classes" ENUMS_DIR = SCHEMA_DIR / "modules" / "enums" MANIFEST_PATH = SCHEMA_DIR / "manifest.json" def get_yaml_files(directory: Path) -> list[str]: """Get all .yaml files in a directory, sorted alphabetically.""" if not directory.exists(): return [] return sorted([f.stem for f in directory.glob("*.yaml")]) def main(): # Get all class files class_files = get_yaml_files(CLASSES_DIR) print(f"Found {len(class_files)} class files") # Get all enum files enum_files = get_yaml_files(ENUMS_DIR) print(f"Found {len(enum_files)} enum files") # Build manifest structure manifest = { "generated": datetime.now(timezone.utc).strftime("%Y-%m-%dT%H:%M:%S.000Z"), "version": "1.0.0", "categories": [ { "name": "main", "displayName": "Main Schema", "files": [ { "name": "Heritage Custodian Ontology", "path": "01_custodian_name_modular.yaml", "category": "main" } ] }, { "name": "class", "displayName": "Classes", "files": [ { "name": name, "path": f"modules/classes/{name}.yaml", "category": "classes" } for name in class_files ] }, { "name": "enum", "displayName": "Enumerations", "files": [ { "name": name, "path": f"modules/enums/{name}.yaml", "category": "enums" } for name in enum_files ] } ] } # Write manifest with open(MANIFEST_PATH, 'w', encoding='utf-8') as f: json.dump(manifest, f, indent=2) print(f"\n✅ Manifest written to {MANIFEST_PATH}") print(f" - Main schema: 1 file") print(f" - Classes: {len(class_files)} files") print(f" - Enums: {len(enum_files)} files") print(f" - Total: {1 + len(class_files) + len(enum_files)} files") if __name__ == "__main__": main()