mod claude;
mod copilot;
use anyhow::{bail, Result};
use std::path::{Path, PathBuf};
pub struct MaterializedSkill {
pub name: String,
pub path: PathBuf,
}
pub trait Vendor {
#[allow(dead_code)] fn name(&self) -> &'static str;
fn materialize(
&self,
project_root: &Path,
project_id: &str,
skills: &[MaterializedSkill],
) -> Result<()>;
fn clean(&self, project_root: &Path, project_id: &str) -> Result<()>;
}
pub fn for_target(target: &str) -> Result<Box<dyn Vendor>> {
match target {
"claude" => Ok(Box::new(claude::Claude)),
"copilot" => Ok(Box::new(copilot::Copilot)),
other => bail!("unknown target `{other}` (supported: claude, copilot)"),
}
}