use std::path::{Path, PathBuf};
pub use leviath_core::manifest::parse_manifest;
pub fn find_manifest(path: &str) -> anyhow::Result<PathBuf> {
let p = Path::new(path);
if p.is_file() && p.file_name() == Some(std::ffi::OsStr::new("agent.leviath")) {
return Ok(p.to_path_buf());
}
if p.is_dir() {
let manifest = p.join("agent.leviath");
if manifest.exists() {
return Ok(manifest);
}
}
if let Some(installed) = leviath_core::paths::agents_dir()
.map(|d| d.join(path).join("agent.leviath"))
.filter(|p| p.exists())
{
return Ok(installed);
}
let current_manifest = PathBuf::from("agent.leviath");
if current_manifest.exists() {
return Ok(current_manifest);
}
anyhow::bail!(
"Could not find agent manifest for '{}'. \
Pass a path to a directory containing agent.leviath, \
or an installed agent name (see `lev list`).",
path
)
}
#[cfg(test)]
mod tests {
use super::*;
use crate::config::CWD_LOCK;
#[test]
fn find_manifest_with_file_path() {
let dir = std::env::temp_dir().join("lev-test-find-manifest-file");
let _ = std::fs::create_dir_all(&dir);
let manifest = dir.join("agent.leviath");
std::fs::write(&manifest, "[agent]\nname = \"test\"").unwrap();
let result = find_manifest(manifest.to_str().unwrap());
assert!(result.is_ok());
assert_eq!(result.unwrap(), manifest);
let _ = std::fs::remove_dir_all(&dir);
}
#[test]
fn find_manifest_with_directory_path() {
let dir = std::env::temp_dir().join("lev-test-find-manifest-dir");
let _ = std::fs::create_dir_all(&dir);
let manifest = dir.join("agent.leviath");
std::fs::write(&manifest, "[agent]\nname = \"test\"").unwrap();
let result = find_manifest(dir.to_str().unwrap());
assert!(result.is_ok());
assert_eq!(result.unwrap(), manifest);
let _ = std::fs::remove_dir_all(&dir);
}
#[test]
fn find_manifest_with_invalid_path() {
let _guard = CWD_LOCK
.lock()
.unwrap_or_else(std::sync::PoisonError::into_inner);
let result = find_manifest("/nonexistent/path/to/nothing");
assert!(result.is_err());
}
#[test]
fn find_manifest_installed_agent_by_name_honors_leviath_home() {
let home = tempfile::tempdir().unwrap();
let agent_dir = home.path().join(".leviath").join("agents").join("named");
std::fs::create_dir_all(&agent_dir).unwrap();
let manifest_path = agent_dir.join("agent.leviath");
std::fs::write(&manifest_path, "[agent]\nname = \"test\"").unwrap();
temp_env::with_var("LEVIATH_HOME", Some(home.path()), || {
assert_eq!(find_manifest("named").unwrap(), manifest_path);
});
}
#[test]
fn find_manifest_dir_without_manifest_falls_through() {
let _guard = CWD_LOCK
.lock()
.unwrap_or_else(std::sync::PoisonError::into_inner);
let dir = std::env::temp_dir().join("lev-test-dir-no-manifest-9z7q");
let _ = std::fs::remove_dir_all(&dir);
std::fs::create_dir_all(&dir).unwrap();
let result = find_manifest(dir.to_str().unwrap());
assert!(result.is_err());
let _ = std::fs::remove_dir_all(&dir);
}
#[test]
fn find_manifest_installed_agent_not_found_falls_through() {
let _guard = CWD_LOCK
.lock()
.unwrap_or_else(std::sync::PoisonError::into_inner);
let result = find_manifest("lev-no-such-agent-xyzzy-9f3a");
assert!(result.is_err());
}
#[test]
fn find_manifest_cwd_agent_leviath_found() {
let dir = std::env::temp_dir().join("lev-test-cwd-manifest-a1b2");
let _ = std::fs::remove_dir_all(&dir);
std::fs::create_dir_all(&dir).unwrap();
let manifest = dir.join("agent.leviath");
std::fs::write(&manifest, "[agent]\nname = \"cwd-test\"").unwrap();
let _guard = CWD_LOCK
.lock()
.unwrap_or_else(std::sync::PoisonError::into_inner);
let original_cwd = std::env::current_dir().unwrap();
std::env::set_current_dir(&dir).unwrap();
let result = find_manifest("__lev_cwd_test_nonexistent__");
std::env::set_current_dir(&original_cwd).unwrap();
let _ = std::fs::remove_dir_all(&dir);
assert!(result.is_ok());
assert_eq!(result.unwrap().file_name().unwrap(), "agent.leviath");
}
}