pub use crate::agents::Agent as SkillAgent;
pub fn detect_agents() -> Vec<SkillAgent> {
SkillAgent::ALL
.iter()
.copied()
.filter(|a| a.is_installed())
.collect()
}
#[cfg(test)]
mod tests {
use super::*;
use tempfile::tempdir;
#[test]
#[serial_test::serial(jarvy_home_env)]
fn detect_agents_empty_when_no_dirs() {
#[allow(unsafe_code)]
unsafe {
let tmp = tempdir().unwrap();
std::env::set_var("JARVY_HOME", tmp.path());
let agents = detect_agents();
assert!(agents.is_empty(), "got {agents:?}");
std::env::remove_var("JARVY_HOME");
}
}
#[test]
#[serial_test::serial(jarvy_home_env)]
fn detect_agents_finds_present_dirs() {
#[allow(unsafe_code)]
unsafe {
let tmp = tempdir().unwrap();
std::fs::create_dir(tmp.path().join(".claude")).unwrap();
std::fs::create_dir(tmp.path().join(".cursor")).unwrap();
std::env::set_var("JARVY_HOME", tmp.path());
let agents = detect_agents();
assert!(agents.contains(&SkillAgent::ClaudeCode));
assert!(agents.contains(&SkillAgent::Cursor));
assert!(!agents.contains(&SkillAgent::Codex));
std::env::remove_var("JARVY_HOME");
}
}
}