claudy 0.3.0

Modern multi-provider launcher for Claude CLI
#[cfg(feature = "analytics")]
pub mod analytics_cmd;
pub mod channel_cmd;
pub mod config_cmd;
pub mod dispatch;
pub mod info;
pub mod install;
pub mod list;
pub mod mcp_cmd;
pub mod mode_cmd;
pub mod session_cmd;
pub mod status;
pub mod test_cmd;
pub mod uninstall;
pub mod update_cmd;

use crate::adapters::cli::args::Commands;
use crate::domain::commands::{
    AnalyticsAction, ChannelAction, DomainCommand, McpAction, SessionAction,
};
use crate::domain::context::Context;

pub struct LegacyCommandAdapter;

impl crate::ports::command_ports::CommandGateway for LegacyCommandAdapter {
    fn dispatch(&self, ctx: &mut Context, command: DomainCommand) -> anyhow::Result<i32> {
        crate::adapters::commands::dispatch::dispatch_new(ctx, command)
    }
}

pub fn map_cli_to_domain(command: Commands) -> DomainCommand {
    match command {
        Commands::List => DomainCommand::List,
        Commands::Setup { provider } => DomainCommand::Setup { provider },
        Commands::Show { profile } => DomainCommand::Show { profile },
        Commands::Ping { profile } => DomainCommand::Ping { profile },
        Commands::Doctor => DomainCommand::Doctor,
        Commands::Sync => DomainCommand::Sync,
        Commands::Update => DomainCommand::Update,
        Commands::Uninstall => DomainCommand::Uninstall,
        Commands::Mode { action, name } => DomainCommand::Mode { action, name },
        Commands::Channel(sub) => match sub {
            crate::adapters::cli::args::ChannelCommands::Serve { profile, listen } => {
                DomainCommand::Channel {
                    action: ChannelAction::Serve,
                    profile,
                    listen,
                }
            }
            crate::adapters::cli::args::ChannelCommands::Start { profile, listen } => {
                DomainCommand::Channel {
                    action: ChannelAction::Start,
                    profile,
                    listen,
                }
            }
            crate::adapters::cli::args::ChannelCommands::Stop => DomainCommand::Channel {
                action: ChannelAction::Stop,
                profile: None,
                listen: None,
            },
            crate::adapters::cli::args::ChannelCommands::Restart { profile, listen } => {
                DomainCommand::Channel {
                    action: ChannelAction::Restart,
                    profile,
                    listen,
                }
            }
            crate::adapters::cli::args::ChannelCommands::Status => DomainCommand::Channel {
                action: ChannelAction::Status,
                profile: None,
                listen: None,
            },
            crate::adapters::cli::args::ChannelCommands::Add { platform } => {
                DomainCommand::Channel {
                    action: ChannelAction::Add { platform },
                    profile: None,
                    listen: None,
                }
            }
            crate::adapters::cli::args::ChannelCommands::Remove { platform } => {
                DomainCommand::Channel {
                    action: ChannelAction::Remove { platform },
                    profile: None,
                    listen: None,
                }
            }
            crate::adapters::cli::args::ChannelCommands::Enable => DomainCommand::Channel {
                action: ChannelAction::Enable,
                profile: None,
                listen: None,
            },
            crate::adapters::cli::args::ChannelCommands::Disable => DomainCommand::Channel {
                action: ChannelAction::Disable,
                profile: None,
                listen: None,
            },
        },
        Commands::Mcp(sub) => DomainCommand::Mcp(match sub {
            crate::adapters::cli::args::McpCommands::Run => McpAction::Run,
            crate::adapters::cli::args::McpCommands::Install => McpAction::Install,
            crate::adapters::cli::args::McpCommands::Uninstall => McpAction::Uninstall,
        }),
        Commands::Session(sub) => match sub {
            crate::adapters::cli::args::SessionCommands::Sanitize { project, all, yes } => {
                DomainCommand::Session(SessionAction::Sanitize { project, all, yes })
            }
        },
        Commands::Analytics(sub) => match sub {
            crate::adapters::cli::args::AnalyticsCommands::Dashboard => {
                DomainCommand::Analytics(AnalyticsAction::Dashboard)
            }
            crate::adapters::cli::args::AnalyticsCommands::Ingest { full, project } => {
                DomainCommand::Analytics(AnalyticsAction::Ingest { full, project })
            }
            crate::adapters::cli::args::AnalyticsCommands::Recommend => {
                DomainCommand::Analytics(AnalyticsAction::Recommend)
            }
            crate::adapters::cli::args::AnalyticsCommands::Export {
                format,
                project,
                days,
            } => DomainCommand::Analytics(AnalyticsAction::Export {
                format,
                project,
                days,
            }),
            crate::adapters::cli::args::AnalyticsCommands::SyncPricing => {
                DomainCommand::Analytics(AnalyticsAction::SyncPricing)
            }
            crate::adapters::cli::args::AnalyticsCommands::Insights {
                days,
                from,
                to,
                project,
            } => DomainCommand::Analytics(AnalyticsAction::Insights {
                days,
                from,
                to,
                project,
            }),
            crate::adapters::cli::args::AnalyticsCommands::Recalculate => {
                DomainCommand::Analytics(AnalyticsAction::Recalculate)
            }
        },
    }
}