use crate::core::deploy_validate::validate_workspace;
use crate::core::doctor::{CheckStatus, DoctorCheck};
use crate::core::paths::FrameworkPaths;
pub(super) fn check_deployment_completeness(paths: &FrameworkPaths) -> DoctorCheck {
let report = validate_workspace(paths);
if report.is_complete() {
return DoctorCheck::new(
"deployment",
CheckStatus::Ok,
"deployed .claude/{agents,skills} and settings.json match the canonical roster",
);
}
let detail: Vec<String> = report.gaps.iter().map(|g| g.describe()).collect();
DoctorCheck::new(
"deployment",
CheckStatus::Fail,
format!(
"{} deployment gap(s) found: {} — run `tm validate --repair` to fix",
detail.len(),
detail.join("; ")
),
)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn deployment_check_ok_when_complete() {
let tmp = tempfile::tempdir().unwrap();
let mut paths = FrameworkPaths::under(tmp.path());
paths.trusty_mpm_root = None;
let agents_dir = paths.claude_agents_dir();
std::fs::create_dir_all(&agents_dir).unwrap();
crate::core::agent_manifest::AgentManifest::default()
.save(&agents_dir)
.unwrap();
let skills_dir = paths.claude_skills_dir();
std::fs::create_dir_all(&skills_dir).unwrap();
crate::core::skill_manifest::SkillManifest::default()
.save(&skills_dir)
.unwrap();
let claude_dir = paths.claude_home_dir().join(".claude");
std::fs::create_dir_all(&claude_dir).unwrap();
let style_dir = claude_dir.join("output-styles");
std::fs::create_dir_all(&style_dir).unwrap();
let default_style = crate::core::bundle::OUTPUT_STYLES[0];
std::fs::write(
style_dir.join(default_style.file_name),
default_style.content,
)
.unwrap();
std::fs::write(
claude_dir.join("settings.json"),
r#"{"outputStyle": "trusty-mpm", "hooks": {"SessionStart": []}}"#,
)
.unwrap();
let check = check_deployment_completeness(&paths);
assert_eq!(check.status, CheckStatus::Ok, "message: {}", check.message);
}
#[test]
fn deployment_check_fail_lists_gaps() {
let tmp = tempfile::tempdir().unwrap();
let mut paths = FrameworkPaths::under(tmp.path());
paths.trusty_mpm_root = None;
let check = check_deployment_completeness(&paths);
assert_eq!(check.status, CheckStatus::Fail);
assert!(check.message.contains("agent ownership manifest"));
assert!(check.message.contains("tm validate --repair"));
}
}