morph-cli 0.1.0

AST-based codebase migration and codemod tool for JavaScript and TypeScript projects.
Documentation
use crate::core::plugins::PluginRegistry;
use anyhow::Result;
use std::path::Path;

pub fn execute(project_root: &Path) -> Result<()> {
    let mut registry = PluginRegistry::new();
    let reports = registry.discover(project_root);

    if reports.is_empty() {
        println!("No plugins discovered.");
        println!("Searched in:");
        println!("  - ./plugins");
        println!("  - ./.morph-cli/plugins");
        println!("  - ~/.morph-cli/plugins");
        return Ok(());
    }

    println!("Discovered Plugins:\n");

    for report in &reports {
        let status = match report.status {
            crate::core::plugins::DiscoveryStatus::Valid => "",
            crate::core::plugins::DiscoveryStatus::Invalid => "",
            crate::core::plugins::DiscoveryStatus::NotFound => "?",
        };

        println!("  {} {} (v{})", status, report.name, report.version);
        println!("      Path:    {}", report.path.display());
        if !report.recipes.is_empty() {
            println!("      Recipes: {}", report.recipes.join(", "));
        }

        if let Some(err) = &report.error {
            println!("      Error: {}", err);
        }
        println!();
    }

    let summary = registry.summary();
    print!("{}", summary);

    Ok(())
}