#!/usr/bin/env python3 """ Music Product Validator with Sub-Agent Architecture This orchestrator launches specialized sub-agents for different validation domains: - release-validator: Album-level metadata validation - track-validator: Track-level metadata validation - classical-validator: Classical-specific validation (conditional) Each sub-agent runs in isolation with access to only its relevant skill. """ import asyncio import json from pathlib import Path from claude_agent_sdk import query, ClaudeAgentOptions async def main(): print("šŸŽµ Music Product Validator with Sub-Agents\n") print("="*60) # Load the orchestrator prompt prompt_path = Path("prompts/orchestrator_prompt.md") with open(prompt_path) as f: orchestrator_prompt = f.read() print("\nšŸ“‹ Launching validation orchestrator...") print(" This will spawn specialized sub-agents in parallel:\n") print(" • release-validator (album-level metadata)") print(" • track-validator (track-level metadata)") print(" • classical-validator (classical rules, if needed)\n") # Run the orchestrator async for message in query( prompt=orchestrator_prompt, options=ClaudeAgentOptions( setting_sources=["user", "project"], # Required to load skills allowed_tools=["Task", "Read", "Write", "Bash"] # Task tool enables sub-agents ) ): print(message) # Validate the output print("\n" + "="*60) print("\nšŸ“Š Validating output against schema...") try: import jsonschema schema_path = Path("validation_result_schema.json") output_path = Path("validation_results.json") with open(schema_path) as f: schema = json.load(f) with open(output_path) as f: results = json.load(f) jsonschema.validate(instance=results, schema=schema) print("āœ… Output conforms to schema") # Print summary summary = results.get("summary", {}) print(f"\nšŸ“ˆ Validation Summary:") print(f" Status: {results.get('validationStatus', 'UNKNOWN')}") print(f" Total Rules: {summary.get('totalRulesChecked', 0)}") print(f" Passed: {summary.get('passed', 0)}") print(f" Warnings: {summary.get('warnings', 0)}") print(f" Failures: {summary.get('failures', 0)}") except ImportError: print("ā„¹ļø Install jsonschema for validation: pip install jsonschema") except jsonschema.ValidationError as e: print(f"āŒ Schema validation failed: {e.message}") print(f" Failed at: {'.'.join(str(p) for p in e.path)}") except FileNotFoundError as e: print(f"āŒ File not found: {e.filename}") except Exception as e: print(f"āŒ Validation error: {e}") print("\n" + "="*60) print("āœ… Validation complete!") if __name__ == "__main__": asyncio.run(main())