use anyhow::{bail, Result};
use clap::ValueEnum;
use std::path::PathBuf;
#[derive(Debug, Clone, Copy, ValueEnum, PartialEq, Eq)]
pub enum InstallTarget {
Auto,
Claude,
Codex,
Cursor,
All,
}
pub enum HookSupport {
Installed,
#[allow(dead_code)]
Skipped(&'static str),
}
pub struct HookRepairReport {
pub path: PathBuf,
pub registered: usize,
pub expected: usize,
pub mcp_warning: Option<String>,
pub scope_warning: Option<String>,
}
pub trait InstallHost {
fn name(&self) -> &'static str;
fn config_path(&self) -> PathBuf;
fn is_available(&self) -> bool;
fn install_mcp(&self, bin: &str) -> Result<()>;
fn uninstall_mcp(&self, bin: &str) -> Result<()>;
fn install_hooks(&self, bin: &str) -> Result<HookSupport>;
fn repair_hooks(&self, _bin: &str) -> Result<HookRepairReport> {
bail!("{} hook repair is not supported", self.name())
}
fn uninstall_hooks(&self, bin: &str) -> Result<()>;
fn dry_run_plan(&self, bin: &str) -> Vec<String>;
}