claude-profiles 0.7.0

Launch claude with only the plugins, skills, and MCP servers a profile defines
pub fn build_eval_args(target: &str, json: bool, extra: &[String]) -> Vec<String> {
    let mut args = vec!["plugin".to_string(), "eval".to_string(), target.to_string()];
    if json {
        args.push("--json".to_string());
    }
    args.extend(extra.iter().cloned());
    args
}

pub fn run(target: &str, json: bool, extra: &[String]) -> anyhow::Result<i32> {
    let args = build_eval_args(target, json, extra);
    let status = crate::exe::command("claude").args(&args).status()
        .map_err(|e| anyhow::anyhow!("failed to run claude plugin eval: {e}"))?;
    Ok(status.code().unwrap_or(1))
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn builds_eval_argv() {
        let a = build_eval_args("my-skill", true, &["--case".into(), "smoke*".into()]);
        assert_eq!(a[0], "plugin");
        assert_eq!(a[1], "eval");
        assert_eq!(a[2], "my-skill");
        assert!(a.contains(&"--json".to_string()));
        let i = a.iter().position(|x| x == "--case").unwrap();
        assert_eq!(a[i + 1], "smoke*");
    }

    #[test]
    fn omits_json_when_false() {
        let a = build_eval_args("t", false, &[]);
        assert!(!a.contains(&"--json".to_string()));
    }
}