use clap::Parser;
use winx_code_agent::{start_winx_server, Result, WinxError};
#[derive(Parser)]
#[command(name = "winx")]
#[command(author = "Gabriel Maia")]
#[command(version)]
#[command(about = "High-performance MCP server for shell and file operations", long_about = None)]
struct Cli {
#[arg(short, long)]
verbose: bool,
#[arg(long)]
debug: bool,
#[command(subcommand)]
command: Option<Commands>,
}
#[derive(clap::Subcommand)]
enum Commands {
Serve {
#[arg(long)]
debug_mode: bool,
},
}
fn setup_logging(verbose: bool, debug: bool) {
let level = if debug {
tracing::Level::DEBUG
} else if verbose {
tracing::Level::INFO
} else {
tracing::Level::WARN
};
tracing_subscriber::fmt()
.with_env_filter(
tracing_subscriber::EnvFilter::from_default_env().add_directive(level.into()),
)
.with_writer(std::io::stderr)
.with_ansi(true)
.init();
}
#[tokio::main]
async fn main() -> Result<()> {
let cli = Cli::parse();
setup_logging(cli.verbose, cli.debug);
match cli.command {
None | Some(Commands::Serve { .. }) => run_server().await,
}
}
async fn run_server() -> Result<()> {
tracing::info!("Starting winx MCP server v{}", env!("CARGO_PKG_VERSION"));
match start_winx_server().await {
Ok(()) => {
tracing::info!("Server shutting down normally");
Ok(())
}
Err(e) => {
tracing::error!("Server error: {}", e);
Err(WinxError::ShellInitializationError(format!("Failed to start server: {e}")))
}
}
}