use clap::{Parser, Subcommand};
use paladin::application::cli::commands::{
agent::{AgentCommands, handle_agent_new, handle_agent_run},
arsenal::{ArsenalCommands, handle_arsenal_command},
battalion::{BattalionCommands, handle_battalion_new, handle_battalion_run},
council, features,
maneuver::{ManeuverCommands, handle_maneuver_command},
muster, onboarding, setup_check,
};
use paladin::application::cli::error::CliError;
use std::process;
use tokio::signal;
#[derive(Parser)]
#[command(name = "paladin")]
#[command(version, about = "Paladin Multi-Agent Orchestration CLI", long_about = None)]
struct Cli {
#[command(subcommand)]
command: Commands,
#[arg(long, global = true)]
quiet: bool,
#[arg(long, global = true)]
verbose: bool,
}
#[derive(Subcommand)]
enum Commands {
Agent {
#[command(subcommand)]
action: AgentCommands,
},
Battalion {
#[command(subcommand)]
action: BattalionCommands,
},
Arsenal {
#[command(subcommand)]
action: ArsenalCommands,
},
Maneuver {
#[command(subcommand)]
action: ManeuverCommands,
},
Onboarding,
SetupCheck {
#[arg(long)]
verbose: bool,
},
Features {
#[arg(long)]
category: Option<String>,
#[arg(long)]
format: Option<String>,
},
Muster {
#[arg(long)]
task: Option<String>,
#[arg(long, short)]
output: Option<String>,
#[arg(long)]
execute: bool,
#[arg(long)]
provider: Option<String>,
#[arg(long)]
model: Option<String>,
#[arg(long)]
no_review: bool,
},
Council {
#[arg(long)]
topic: Option<String>,
#[arg(long, default_value = "3")]
participants: usize,
#[arg(long, value_delimiter = ',')]
roles: Option<Vec<String>>,
#[arg(long, default_value = "5")]
max_rounds: usize,
#[arg(long)]
save: Option<String>,
#[arg(long)]
model: Option<String>,
#[arg(long)]
temperature: Option<f32>,
},
}
#[tokio::main]
async fn main() {
let _sigint_handler = tokio::spawn(async {
if signal::ctrl_c().await.is_ok() {
eprintln!("\n\nReceived interrupt signal (Ctrl+C). Exiting...");
process::exit(130); }
});
let cli = Cli::parse();
let _quiet = cli.quiet;
let _verbose = cli.verbose;
let result = match cli.command {
Commands::Agent { action } => match action {
AgentCommands::New(args) => handle_agent_new(args),
AgentCommands::Run(args) => handle_agent_run(args).await,
},
Commands::Battalion { action } => match action {
BattalionCommands::New(args) => handle_battalion_new(args),
BattalionCommands::Run(args) => handle_battalion_run(args).await,
},
Commands::Arsenal { action } => handle_arsenal_command(action).await,
Commands::Maneuver { action } => handle_maneuver_command(action).await,
Commands::Onboarding => onboarding::run_onboarding().await,
Commands::SetupCheck { verbose } => {
setup_check::run_setup_check(verbose)
.await
.map(|exit_code| {
process::exit(exit_code);
})
}
Commands::Features { category, format } => features::run_features(category, format).await,
Commands::Muster {
task,
output,
execute,
provider,
model,
no_review,
} => muster::run_muster(task, output, execute, provider, model, no_review).await,
Commands::Council {
topic,
participants,
roles,
max_rounds,
save,
model,
temperature,
} => {
council::run_council(
topic,
participants,
roles,
max_rounds,
save,
model,
temperature,
)
.await
}
};
if let Err(e) = result {
let error: CliError = e;
eprintln!("{}", error.format_detailed());
process::exit(error.exit_code());
}
}