use super::*;
use crate::core::skill_deployer::deploy_skills;
fn hermetic_paths(base: &Path) -> FrameworkPaths {
let mut paths = FrameworkPaths::under(base);
paths.trusty_mpm_root = None;
paths
}
fn bundle(paths: &FrameworkPaths, stem: &str, body: &str) {
let dir = paths.skill_source_dir();
std::fs::create_dir_all(&dir).unwrap();
std::fs::write(dir.join(format!("{stem}.md")), body).unwrap();
}
fn stage_untracked(dir: &std::path::Path, stem: &str, body: &str) {
let skill_dir = dir.join(stem);
std::fs::create_dir_all(&skill_dir).unwrap();
std::fs::write(skill_dir.join("SKILL.md"), body).unwrap();
}
#[test]
fn unmanaged_bundled_skill_reports_unknown() {
let base = tempfile::TempDir::new().unwrap();
let paths = hermetic_paths(base.path());
bundle(&paths, "tm-workflow", "current text");
let tier = paths.agent_deploy_dir().parent().unwrap().join("skills");
std::fs::create_dir_all(&tier).unwrap();
stage_untracked(&tier, "tm-workflow", "stale text");
let check = check_skill_unmanaged(&paths, None);
assert_eq!(check.status, CheckStatus::Unknown, "{check:?}");
assert!(check.message.contains("tm-workflow"), "{check:?}");
assert!(check.message.contains("--reconcile-skills"), "{check:?}");
}
#[test]
fn managed_tier_is_ok() {
let base = tempfile::TempDir::new().unwrap();
let paths = hermetic_paths(base.path());
bundle(&paths, "tm-workflow", "current text");
let tier = paths.agent_deploy_dir().parent().unwrap().join("skills");
deploy_skills(&paths.skill_source_dir(), &tier).unwrap();
let check = check_skill_unmanaged(&paths, None);
assert_eq!(check.status, CheckStatus::Ok, "{check:?}");
}
#[test]
fn operator_skill_does_not_fire() {
let base = tempfile::TempDir::new().unwrap();
let paths = hermetic_paths(base.path());
bundle(&paths, "tm-workflow", "current text");
let tier = paths.agent_deploy_dir().parent().unwrap().join("skills");
std::fs::create_dir_all(&tier).unwrap();
stage_untracked(&tier, "my-own-skill", "mine");
let check = check_skill_unmanaged(&paths, None);
assert_eq!(check.status, CheckStatus::Ok, "{check:?}");
}
#[test]
fn project_tier_is_scanned() {
let base = tempfile::TempDir::new().unwrap();
let project = tempfile::TempDir::new().unwrap();
let paths = hermetic_paths(base.path());
bundle(&paths, "tm-workflow", "current text");
let tier = project.path().join(".claude").join("skills");
std::fs::create_dir_all(&tier).unwrap();
stage_untracked(&tier, "tm-workflow", "stale text");
let check = check_skill_unmanaged(&paths, Some(project.path()));
assert_eq!(check.status, CheckStatus::Unknown, "{check:?}");
assert!(check.message.contains("project/tm-workflow"), "{check:?}");
}
#[test]
fn empty_roster_is_not_a_clean_bill() {
let base = tempfile::TempDir::new().unwrap();
let paths = hermetic_paths(base.path());
let check = check_skill_unmanaged(&paths, None);
assert_eq!(check.status, CheckStatus::Unknown, "{check:?}");
assert!(
check.message.contains("no bundled skill source"),
"{check:?}"
);
}