use super::*;
#[test]
fn constants_are_non_empty() {
assert!(!OPTIMIZER_TOML.trim().is_empty());
assert!(!OVERSEER_TOML.trim().is_empty());
assert!(!FRAMEWORK_INSTRUCTIONS.trim().is_empty());
assert!(!CLAUDE_STUB.trim().is_empty());
assert!(!BASE_AGENT.trim().is_empty());
assert!(!BASE_ENGINEER.trim().is_empty());
assert!(!BASE_RESEARCH.trim().is_empty());
assert!(!BASE_QA.trim().is_empty());
assert!(!BASE_OPS.trim().is_empty());
assert!(!ENGINEER_AGENT.trim().is_empty());
assert!(!QA_AGENT.trim().is_empty());
assert!(!RESEARCH_AGENT.trim().is_empty());
assert!(!OPS_AGENT.trim().is_empty());
assert!(!SECURITY_AGENT.trim().is_empty());
assert!(!DOCUMENTATION_AGENT.trim().is_empty());
assert!(!DATA_ENGINEER_AGENT.trim().is_empty());
assert!(!VERSION_CONTROL_AGENT.trim().is_empty());
assert!(!TICKETING_AGENT.trim().is_empty());
assert!(!CODE_ANALYZER_AGENT.trim().is_empty());
assert!(!PYTHON_ENGINEER_AGENT.trim().is_empty());
assert!(!TYPESCRIPT_ENGINEER_AGENT.trim().is_empty());
assert!(!GOLANG_ENGINEER_AGENT.trim().is_empty());
assert!(!RUST_ENGINEER_AGENT.trim().is_empty());
assert!(!JAVA_ENGINEER_AGENT.trim().is_empty());
assert!(!PHP_ENGINEER_AGENT.trim().is_empty());
assert!(!RUBY_ENGINEER_AGENT.trim().is_empty());
assert!(!REACT_ENGINEER_AGENT.trim().is_empty());
assert!(!NEXTJS_ENGINEER_AGENT.trim().is_empty());
assert!(!SVELTE_ENGINEER_AGENT.trim().is_empty());
assert!(!WEB_QA_AGENT.trim().is_empty());
assert!(!API_QA_AGENT.trim().is_empty());
assert!(!JAVASCRIPT_ENGINEER_AGENT.trim().is_empty());
assert!(!PHOENIX_ENGINEER_AGENT.trim().is_empty());
assert!(!DART_ENGINEER_AGENT.trim().is_empty());
assert!(!TAURI_ENGINEER_AGENT.trim().is_empty());
assert!(!WEB_UI_ENGINEER_AGENT.trim().is_empty());
assert!(!REFACTORING_ENGINEER_AGENT.trim().is_empty());
assert!(!PROMPT_ENGINEER_AGENT.trim().is_empty());
assert!(!CODE_CRITIC_AGENT.trim().is_empty());
assert!(!GCP_OPS_AGENT.trim().is_empty());
assert!(!VERCEL_OPS_AGENT.trim().is_empty());
assert!(!LOCAL_OPS_AGENT.trim().is_empty());
assert!(!MEMORY_MANAGER_AGENT.trim().is_empty());
assert!(!MPM_AGENT_MANAGER_AGENT.trim().is_empty());
assert!(!MPM_SKILLS_MANAGER_AGENT.trim().is_empty());
assert!(!EXAMPLE_SKILL.trim().is_empty());
assert!(!OUTPUT_STYLE.trim().is_empty());
assert!(!MPM_DELEGATION_PATTERNS.trim().is_empty());
assert!(!MPM_VERIFICATION_PROTOCOLS.trim().is_empty());
assert!(!MPM_GIT_FILE_TRACKING.trim().is_empty());
assert!(!MPM_PR_WORKFLOW.trim().is_empty());
assert!(!MPM_TICKETING_INTEGRATION.trim().is_empty());
assert!(!MPM_CIRCUIT_BREAKER_ENFORCEMENT.trim().is_empty());
assert!(!MPM_BUG_REPORTING.trim().is_empty());
assert!(!MPM_SESSION_MANAGEMENT.trim().is_empty());
assert!(!MPM_SESSION_PAUSE.trim().is_empty());
assert!(!MPM_SESSION_RESUME.trim().is_empty());
assert!(!MPM_TOOL_USAGE_GUIDE.trim().is_empty());
}
#[test]
fn output_style_has_matching_frontmatter_name() {
assert!(OUTPUT_STYLE.contains("name: trusty-mpm"));
}
#[test]
fn framework_instructions_and_stub_differ() {
assert_ne!(FRAMEWORK_INSTRUCTIONS, CLAUDE_STUB);
}
#[test]
fn claude_stub_is_seed_once() {
let stub = ALL
.iter()
.find(|a| a.rel_path == "instructions/CLAUDE.md")
.expect("CLAUDE.md stub present in bundle");
assert_eq!(stub.install, InstallPolicy::SeedOnce);
}
#[test]
fn framework_instructions_overwrites() {
let instr = ALL
.iter()
.find(|a| a.rel_path == "instructions/INSTRUCTIONS.md")
.expect("INSTRUCTIONS.md present in bundle");
assert_eq!(instr.install, InstallPolicy::Overwrite);
}
#[test]
fn optimizer_toml_is_parseable() {
let parsed: toml::Value = toml::from_str(OPTIMIZER_TOML).expect("valid TOML");
assert!(parsed.get("default").is_some());
}
#[test]
fn bundle_table_is_complete() {
assert_eq!(ALL.len(), 57);
let mut paths: Vec<&str> = ALL.iter().map(|a| a.rel_path).collect();
paths.sort_unstable();
paths.dedup();
assert_eq!(paths.len(), 57, "artifact paths must be unique");
for artifact in ALL {
assert!(!artifact.rel_path.is_empty());
assert!(!artifact.contents.trim().is_empty());
}
}
#[test]
fn overseer_toml_is_parseable() {
let parsed: toml::Value = toml::from_str(OVERSEER_TOML).expect("valid TOML");
assert_eq!(
parsed
.get("overseer")
.and_then(|o| o.get("enabled"))
.and_then(toml::Value::as_bool),
Some(false)
);
}
#[test]
fn overseer_toml_is_in_bundle() {
assert!(
ALL.iter().any(|a| a.rel_path == "hooks/overseer.toml"),
"overseer.toml must be a bundled artifact"
);
}
#[test]
fn new_concrete_agents_are_in_bundle() {
let agent_paths: Vec<&str> = ALL
.iter()
.filter(|a| a.rel_path.starts_with("agents/"))
.map(|a| a.rel_path)
.collect();
for expected in &[
"agents/qa.md",
"agents/research.md",
"agents/ops.md",
"agents/security.md",
"agents/documentation.md",
"agents/data-engineer.md",
"agents/version-control.md",
"agents/ticketing.md",
"agents/code-analyzer.md",
"agents/python-engineer.md",
"agents/typescript-engineer.md",
"agents/golang-engineer.md",
"agents/rust-engineer.md",
"agents/java-engineer.md",
"agents/php-engineer.md",
"agents/ruby-engineer.md",
"agents/react-engineer.md",
"agents/nextjs-engineer.md",
"agents/svelte-engineer.md",
"agents/web-qa.md",
"agents/api-qa.md",
"agents/javascript-engineer.md",
"agents/phoenix-engineer.md",
"agents/dart-engineer.md",
"agents/tauri-engineer.md",
"agents/web-ui-engineer.md",
"agents/refactoring-engineer.md",
"agents/prompt-engineer.md",
"agents/code-critic.md",
"agents/gcp-ops.md",
"agents/vercel-ops.md",
"agents/local-ops.md",
"agents/memory-manager.md",
"agents/mpm-agent-manager.md",
"agents/mpm-skills-manager.md",
] {
assert!(
agent_paths.contains(expected),
"missing bundled agent: {expected}"
);
}
}
#[test]
fn new_concrete_agents_have_extends_in_frontmatter() {
let agents = [
("qa", QA_AGENT),
("research", RESEARCH_AGENT),
("ops", OPS_AGENT),
("security", SECURITY_AGENT),
("documentation", DOCUMENTATION_AGENT),
("data-engineer", DATA_ENGINEER_AGENT),
("version-control", VERSION_CONTROL_AGENT),
("ticketing", TICKETING_AGENT),
("code-analyzer", CODE_ANALYZER_AGENT),
("python-engineer", PYTHON_ENGINEER_AGENT),
("typescript-engineer", TYPESCRIPT_ENGINEER_AGENT),
("golang-engineer", GOLANG_ENGINEER_AGENT),
("rust-engineer", RUST_ENGINEER_AGENT),
("java-engineer", JAVA_ENGINEER_AGENT),
("php-engineer", PHP_ENGINEER_AGENT),
("ruby-engineer", RUBY_ENGINEER_AGENT),
("react-engineer", REACT_ENGINEER_AGENT),
("nextjs-engineer", NEXTJS_ENGINEER_AGENT),
("svelte-engineer", SVELTE_ENGINEER_AGENT),
("web-qa", WEB_QA_AGENT),
("api-qa", API_QA_AGENT),
("javascript-engineer", JAVASCRIPT_ENGINEER_AGENT),
("phoenix-engineer", PHOENIX_ENGINEER_AGENT),
("dart-engineer", DART_ENGINEER_AGENT),
("tauri-engineer", TAURI_ENGINEER_AGENT),
("web-ui-engineer", WEB_UI_ENGINEER_AGENT),
("refactoring-engineer", REFACTORING_ENGINEER_AGENT),
("prompt-engineer", PROMPT_ENGINEER_AGENT),
("code-critic", CODE_CRITIC_AGENT),
("gcp-ops", GCP_OPS_AGENT),
("vercel-ops", VERCEL_OPS_AGENT),
("local-ops", LOCAL_OPS_AGENT),
("memory-manager", MEMORY_MANAGER_AGENT),
("mpm-agent-manager", MPM_AGENT_MANAGER_AGENT),
("mpm-skills-manager", MPM_SKILLS_MANAGER_AGENT),
];
for (name, content) in agents {
assert!(
content.contains("extends:"),
"agent {name} is missing `extends:` in frontmatter"
);
}
}
#[test]
fn new_concrete_agents_deploy_via_real_asset_files() {
use crate::core::agent_builder::compose_agent;
use std::path::Path;
let assets_dir = Path::new(env!("CARGO_MANIFEST_DIR"))
.join("src")
.join("assets")
.join("agents");
let agents = [
"qa",
"research",
"ops",
"security",
"documentation",
"data-engineer",
"version-control",
"ticketing",
"code-analyzer",
"python-engineer",
"typescript-engineer",
"golang-engineer",
"rust-engineer",
"java-engineer",
"php-engineer",
"ruby-engineer",
"react-engineer",
"nextjs-engineer",
"svelte-engineer",
"web-qa",
"api-qa",
"javascript-engineer",
"phoenix-engineer",
"dart-engineer",
"tauri-engineer",
"web-ui-engineer",
"refactoring-engineer",
"prompt-engineer",
"code-critic",
"gcp-ops",
"vercel-ops",
"local-ops",
"memory-manager",
"mpm-agent-manager",
"mpm-skills-manager",
];
for name in agents {
let composed = compose_agent(name, &assets_dir)
.unwrap_or_else(|e| panic!("compose_agent({name}) failed: {e}"));
assert!(
composed.starts_with("---\n"),
"composed {name} is missing frontmatter"
);
assert!(
!composed.contains("extends:"),
"composed {name} has leaked `extends:` in output"
);
assert!(
composed.len() > 200,
"composed {name} suspiciously short ({} bytes)",
composed.len()
);
}
}
#[test]
fn phase1_guidance_skills_are_in_bundle() {
let skill_paths: Vec<&str> = ALL
.iter()
.filter(|a| a.rel_path.starts_with("skills/mpm-"))
.map(|a| a.rel_path)
.collect();
for expected in &[
"skills/mpm-delegation-patterns.md",
"skills/mpm-verification-protocols.md",
"skills/mpm-git-file-tracking.md",
"skills/mpm-pr-workflow.md",
"skills/mpm-ticketing-integration.md",
"skills/mpm-circuit-breaker-enforcement.md",
"skills/mpm-bug-reporting.md",
"skills/mpm-session-management.md",
"skills/mpm-session-pause.md",
"skills/mpm-session-resume.md",
"skills/mpm-tool-usage-guide.md",
] {
assert!(
skill_paths.contains(expected),
"missing bundled guidance skill: {expected}"
);
}
}
#[test]
fn phase1_guidance_skills_have_frontmatter() {
let skills = [
("mpm-delegation-patterns", MPM_DELEGATION_PATTERNS),
("mpm-verification-protocols", MPM_VERIFICATION_PROTOCOLS),
("mpm-git-file-tracking", MPM_GIT_FILE_TRACKING),
("mpm-pr-workflow", MPM_PR_WORKFLOW),
("mpm-ticketing-integration", MPM_TICKETING_INTEGRATION),
(
"mpm-circuit-breaker-enforcement",
MPM_CIRCUIT_BREAKER_ENFORCEMENT,
),
("mpm-bug-reporting", MPM_BUG_REPORTING),
("mpm-session-management", MPM_SESSION_MANAGEMENT),
("mpm-session-pause", MPM_SESSION_PAUSE),
("mpm-session-resume", MPM_SESSION_RESUME),
("mpm-tool-usage-guide", MPM_TOOL_USAGE_GUIDE),
];
for (name, content) in skills {
assert!(
content.starts_with("---\n"),
"skill {name} is missing YAML frontmatter"
);
assert!(
content.contains("name:"),
"skill {name} frontmatter is missing `name:` field"
);
assert!(
!content.contains("claude-mpm") || content.contains("trusty-mpm"),
"skill {name} contains unadapted claude-mpm reference"
);
}
}