Source code for neurocore.cli.validate_cmd

"""neurocore validate — validate a blueprint without executing.

Checks that:
1. The YAML file parses correctly
2. The blueprint structure is valid
3. All referenced skills are discovered and registered

Usage:
    neurocore validate blueprints/agent.flow.yaml
    neurocore validate flow.yaml --project-root /path/to/project
"""

from __future__ import annotations

from pathlib import Path
from typing import Optional

import typer
from rich.console import Console

from neurocore.errors import BlueprintError, NeuroCoreError

console = Console()


[docs] def validate_blueprint_cmd( blueprint: Path = typer.Argument( help="Path to the blueprint YAML file to validate.", exists=True, dir_okay=False, readable=True, ), project_root: Optional[Path] = typer.Option( None, "--project-root", "-p", help="Project root directory (auto-detected if not provided).", ), ) -> None: """Validate a blueprint without executing it.""" # Lazy imports for fast CLI startup from neurocore.config.loader import load_config from neurocore.runtime.blueprint import load_blueprint, validate_blueprint from neurocore.skills.loader import discover_skills blueprint_path = blueprint.resolve() # Step 1: Parse the blueprint YAML console.print(f"[dim]Validating:[/dim] {blueprint_path}") console.print() try: bp = load_blueprint(blueprint_path) except BlueprintError as e: console.print(f"[red]Parse error:[/red] {e}") raise typer.Exit(code=1) from None console.print(f" [green]✓[/green] YAML parsing OK") console.print(f" [green]✓[/green] Blueprint structure valid") console.print( f" Name: {bp.name} | " f"Components: {len(bp.components)} | " f"Flow: {bp.flow.type}" ) # Step 2: Discover skills and validate references try: config = load_config(project_root=project_root) registry = discover_skills(config) except NeuroCoreError as e: console.print(f"\n[red]Discovery error:[/red] {e}") raise typer.Exit(code=1) from None errors = validate_blueprint(bp, registry) if errors: console.print(f"\n [red]✗[/red] Skill validation failed:") for error in errors: console.print(f" [red]•[/red] {error}") raise typer.Exit(code=1) console.print(f" [green]✓[/green] All skill references resolved") console.print(f"\n[green]Blueprint is valid.[/green]")