meld 1.1.5

Deterministic filesystem state management using Merkle trees
Documentation
//! Init command presentation: preview and summary formatters.

use crate::agent::AgentStorage;
use crate::init::{InitPreview, InitSummary};
use std::path::PathBuf;

pub fn format_init_preview(preview: &InitPreview) -> String {
    let mut output = String::from("Initialization Preview:\n\n");

    if !preview.prompts.is_empty() {
        output.push_str("Would create prompts:\n");
        for prompt in &preview.prompts {
            output.push_str(&format!("  - {}\n", prompt));
        }
        output.push('\n');
    }

    if !preview.agents.is_empty() {
        output.push_str("Would create agents:\n");
        for agent in &preview.agents {
            output.push_str(&format!("  - {}.toml\n", agent));
        }
        output.push('\n');
    }

    if preview.prompts.is_empty() && preview.agents.is_empty() {
        output.push_str("All default agents and prompts already exist.\n");
    } else {
        output.push_str("Run 'meld init' to perform initialization.\n");
    }
    output
}

pub fn format_init_summary(summary: &InitSummary, force: bool) -> String {
    let mut output = String::from("Initializing Merkle configuration...\n\n");

    if !summary.prompts.created.is_empty() || !summary.prompts.skipped.is_empty() {
        let prompts_dir = crate::config::xdg::prompts_dir()
            .map(|p| p.display().to_string())
            .unwrap_or_else(|_| "~/.config/meld/prompts/".to_string());
        output.push_str(&format!("Created prompts directory: {}\n", prompts_dir));
        for prompt in &summary.prompts.created {
            if force {
                output.push_str(&format!("{} (overwritten)\n", prompt));
            } else {
                output.push_str(&format!("{}\n", prompt));
            }
        }
        for prompt in &summary.prompts.skipped {
            output.push_str(&format!("{} (already exists, skipped)\n", prompt));
        }
        output.push('\n');
    }

    if !summary.agents.created.is_empty() || !summary.agents.skipped.is_empty() {
        let agents_dir = crate::agent::XdgAgentStorage::new()
            .agents_dir()
            .map(|p: PathBuf| p.display().to_string())
            .unwrap_or_else(|_| "~/.config/meld/agents/".to_string());
        output.push_str(&format!("Created agents directory: {}\n", agents_dir));
        for agent in &summary.agents.created {
            let role_str = match agent.as_str() {
                "reader" => "Reader",
                "code-analyzer" => "Writer",
                "docs-writer" => "Writer",
                _ => "Unknown",
            };
            if force {
                output.push_str(&format!(
                    "{}.toml ({}) (overwritten)\n",
                    agent, role_str
                ));
            } else {
                output.push_str(&format!("{}.toml ({})\n", agent, role_str));
            }
        }
        for agent in &summary.agents.skipped {
            let role_str = match agent.as_str() {
                "reader" => "Reader",
                "code-analyzer" => "Writer",
                "docs-writer" => "Writer",
                _ => "Unknown",
            };
            output.push_str(&format!(
                "{}.toml ({}) (already exists, skipped)\n",
                agent, role_str
            ));
        }
        output.push('\n');
    }

    if !summary.prompts.errors.is_empty() || !summary.agents.errors.is_empty() {
        output.push_str("Errors:\n");
        for error in &summary.prompts.errors {
            output.push_str(&format!("{}\n", error));
        }
        for error in &summary.agents.errors {
            output.push_str(&format!("{}\n", error));
        }
        output.push('\n');
    }

    let all_valid = summary
        .validation
        .results
        .iter()
        .all(|(_, is_valid, _)| *is_valid);
    if all_valid {
        output.push_str("Validation:\n");
        output.push_str("  ✓ All agents validated successfully\n\n");
    } else {
        output.push_str("Validation:\n");
        for (agent_id, is_valid, errors) in &summary.validation.results {
            if *is_valid {
                output.push_str(&format!("{} validated\n", agent_id));
            } else {
                output.push_str(&format!("{} validation failed:\n", agent_id));
                for error in errors {
                    output.push_str(&format!("    - {}\n", error));
                }
            }
        }
        output.push('\n');
    }

    if summary.prompts.created.is_empty() && summary.agents.created.is_empty() && !force {
        output.push_str("All default agents already exist. Use --force to re-initialize.\n");
    } else {
        output.push_str("Initialization complete! You can now use:\n");
        output.push_str("  - meld agent list          # List all agents\n");
        output.push_str("  - meld agent show <id>     # View agent details\n");
        output.push_str("  - meld context generate    # Generate context frames\n");
    }
    output
}