"""CLI para validar la biblioteca curada del Sprint 0. Uso: uv run vms-validate-library # equivalente: python -m vmssailor.tools.validate_library Salida: - Exit code 0 si no hay errores (warnings/info no bloquean). - Exit code 1 si hay errores estructurales. """ from __future__ import annotations import argparse import sys from pathlib import Path from vmssailor.library import load_library from vmssailor.shared.logging_setup import setup_logging def main(argv: list[str] | None = None) -> int: parser = argparse.ArgumentParser( prog="vms-validate-library", description="Valida la biblioteca curada de VMS-Sailor.", ) parser.add_argument( "--root", type=Path, default=None, help="Ruta raíz de la biblioteca (defecto: vmssailor/library/).", ) parser.add_argument( "--verbose", action="store_true", help="Logging DEBUG.", ) parser.add_argument( "--strict-warnings", action="store_true", help="Salir con error si hay warnings.", ) args = parser.parse_args(argv) setup_logging(verbose=args.verbose) print("VMS-Sailor — Validador de biblioteca curada") print("=" * 60) result = load_library(args.root) print(result.format()) print() if not result.ok(): print(f"\nFAIL: {len(result.errors)} errores en la biblioteca.") return 1 if args.strict_warnings and result.warnings: print(f"\nFAIL (strict): {len(result.warnings)} warnings.") return 1 info_count = len([i for i in result.issues if i.severity == "info"]) print( f"\nOK: biblioteca válida " f"({len(result.vessels)} vessels, {len(result.equipment_models)} equipment, " f"{len(result.rules)} rules, {info_count} info)." ) return 0 if __name__ == "__main__": sys.exit(main())