use crate::api::schema::IntegrationTarget; pub(super) fn run_integration_command(args: &[String]) -> std::io::Result { let Some(subcommand) = args.first().map(|arg| arg.as_str()) else { print_integration_help(); return Ok(2); }; match subcommand { "install" => integration_install(&args[1..]), "uninstall" => integration_uninstall(&args[1..]), "status" => integration_status(&args[1..]), "help" | "--help" | "-h" => { print_integration_help(); Ok(0) } _ => { print_integration_help(); Ok(2) } } } fn integration_status(args: &[String]) -> std::io::Result { let outdated_only = match args { [] => false, [flag] if flag == "--outdated-only" => true, _ => { eprintln!("usage: herdr integration status [--outdated-only]"); return Ok(2); } }; if outdated_only { crate::integration::print_outdated_update_notice(); return Ok(0); } for status in crate::integration::installed_integration_statuses() { let target = crate::integration::integration_target_label(status.target); let version = match status.installed_version { Some(version) => format!("v{version}"), None => "legacy".to_string(), }; let state = match status.state { crate::integration::IntegrationStatusKind::NotInstalled => "not installed".to_string(), crate::integration::IntegrationStatusKind::Current => { format!("current ({version})") } crate::integration::IntegrationStatusKind::Outdated => { format!("outdated ({version} < v{})", status.expected_version) } }; println!("{target}: {state} ({})", status.path.display()); } Ok(0) } fn integration_install(args: &[String]) -> std::io::Result { let Some(target) = parse_integration_target(args, "install")? else { return Ok(2); }; match crate::integration::install_target(target) { Ok(messages) => { print_integration_messages(messages); Ok(0) } Err(err) => { eprintln!("{err}"); Ok(1) } } } fn integration_uninstall(args: &[String]) -> std::io::Result { let Some(target) = parse_integration_target(args, "uninstall")? else { return Ok(2); }; match crate::integration::uninstall_target(target) { Ok(messages) => { print_integration_messages(messages); Ok(0) } Err(err) => { eprintln!("{err}"); Ok(1) } } } fn print_integration_messages(messages: Vec) { for message in messages { println!("{message}"); } } fn parse_integration_target( args: &[String], action: &str, ) -> std::io::Result> { let Some(target) = args.first().map(|arg| arg.as_str()) else { eprintln!( "usage: herdr integration {action} " ); return Ok(None); }; if args.len() != 1 { eprintln!( "usage: herdr integration {action} " ); return Ok(None); } let parsed = match target { "pi" => IntegrationTarget::Pi, "omp" => IntegrationTarget::Omp, "claude" => IntegrationTarget::Claude, "codex" => IntegrationTarget::Codex, "copilot" => IntegrationTarget::Copilot, "devin" => IntegrationTarget::Devin, "droid" => IntegrationTarget::Droid, "kimi" => IntegrationTarget::Kimi, "opencode" => IntegrationTarget::Opencode, "kilo" => IntegrationTarget::Kilo, "hermes" => IntegrationTarget::Hermes, "qodercli" => IntegrationTarget::Qodercli, "cursor" => IntegrationTarget::Cursor, "mastracode" => IntegrationTarget::Mastracode, "antigravity-cli" | "antigravity_cli" => IntegrationTarget::AntigravityCli, "grok" => IntegrationTarget::Grok, _ => { eprintln!("unknown integration target: {target}"); eprintln!( "currently supported: pi, omp, claude, codex, copilot, devin, droid, kimi, opencode, kilo, hermes, qodercli, cursor, mastracode, antigravity-cli, grok" ); return Ok(None); } }; Ok(Some(parsed)) } fn print_integration_help() { eprintln!("herdr integration commands:"); eprintln!(" herdr integration install pi"); eprintln!(" herdr integration install omp"); eprintln!(" herdr integration install claude"); eprintln!(" herdr integration install codex"); eprintln!(" herdr integration install copilot"); eprintln!(" herdr integration install devin"); eprintln!(" herdr integration install droid"); eprintln!(" herdr integration install kimi"); eprintln!(" herdr integration install opencode"); eprintln!(" herdr integration install kilo"); eprintln!(" herdr integration install hermes"); eprintln!(" herdr integration install qodercli"); eprintln!(" herdr integration install cursor"); eprintln!(" herdr integration install mastracode"); eprintln!(" herdr integration install antigravity-cli"); eprintln!(" herdr integration install grok"); eprintln!(" herdr integration uninstall pi"); eprintln!(" herdr integration uninstall omp"); eprintln!(" herdr integration uninstall claude"); eprintln!(" herdr integration uninstall codex"); eprintln!(" herdr integration uninstall copilot"); eprintln!(" herdr integration uninstall devin"); eprintln!(" herdr integration uninstall droid"); eprintln!(" herdr integration uninstall kimi"); eprintln!(" herdr integration uninstall opencode"); eprintln!(" herdr integration uninstall kilo"); eprintln!(" herdr integration uninstall hermes"); eprintln!(" herdr integration uninstall qodercli"); eprintln!(" herdr integration uninstall cursor"); eprintln!(" herdr integration uninstall mastracode"); eprintln!(" herdr integration uninstall antigravity-cli"); eprintln!(" herdr integration uninstall grok"); eprintln!(" herdr integration status [--outdated-only]"); }