use super::schema::{
AgentSet, ContentSource, DivertConfig, HarnessManifest, InstructionLayers, MANIFEST_VERSION,
McpServers, ModelTiers, SkillSet, StyleSelection,
};
pub fn default_manifest() -> HarnessManifest {
HarnessManifest {
version: Some(MANIFEST_VERSION),
agents: Some(AgentSet {
include: Vec::new(), exclude: Vec::new(),
ignore_staleness: Vec::new(),
source: ContentSource::Bundled,
}),
agent_categories: None,
skill_categories: None,
skills: Some(all_skills()),
instructions: Some(InstructionLayers {
system: Some(true),
contextual: Some(true),
domain: Some(true),
}),
style: Some(StyleSelection {
active: Some(crate::core::bundle::DEFAULT_OUTPUT_STYLE_ID.to_string()),
}),
mcp: Some(McpServers {
trusty_memory: Some(true),
trusty_search: Some(true),
}),
models: Some(ModelTiers::default()),
divert: Some(DivertConfig {
enabled: Some(false),
min_lines: Some(DEFAULT_DIVERT_MIN_LINES),
worker_model: Some(DEFAULT_DIVERT_WORKER_MODEL.to_string()),
}),
}
}
pub const DEFAULT_DIVERT_MIN_LINES: u32 = 350;
pub const DEFAULT_DIVERT_WORKER_MODEL: &str = "claude-haiku-4-5";
fn all_skills() -> SkillSet {
SkillSet {
include: Vec::new(),
exclude: Vec::new(),
source: ContentSource::Bundled,
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn default_manifest_divert_disabled_by_default() {
let divert = default_manifest().divert.expect("divert section present");
assert_eq!(divert.enabled, Some(false), "divert must be opt-in");
assert_eq!(divert.min_lines, Some(DEFAULT_DIVERT_MIN_LINES));
assert_eq!(divert.min_lines, Some(350));
assert_eq!(divert.worker_model.as_deref(), Some("claude-haiku-4-5"));
}
#[test]
fn default_manifest_carries_current_version() {
assert_eq!(default_manifest().version, Some(MANIFEST_VERSION));
}
#[test]
fn default_manifest_reproduces_bundled_behavior() {
let m = default_manifest();
let agents = m.agents.expect("agents set");
assert!(agents.include.is_empty(), "empty include = all agents");
assert!(agents.exclude.is_empty());
assert_eq!(agents.source, ContentSource::Bundled);
let skills = m.skills.expect("skills set");
assert!(skills.include.is_empty(), "empty include = all skills");
assert_eq!(skills.source, ContentSource::Bundled);
let instr = m.instructions.expect("instruction layers");
assert_eq!(instr.system, Some(true));
assert_eq!(instr.contextual, Some(true));
assert_eq!(instr.domain, Some(true));
assert_eq!(
m.style.and_then(|s| s.active),
Some(crate::core::bundle::DEFAULT_OUTPUT_STYLE_ID.to_string())
);
let models = m.models.expect("model tiers");
assert_eq!(
models,
ModelTiers::default(),
"no tier overrides by default"
);
}
#[test]
fn default_manifest_enables_both_mcp() {
let mcp = default_manifest().mcp.expect("mcp section");
assert_eq!(mcp.trusty_memory, Some(true));
assert_eq!(mcp.trusty_search, Some(true));
}
}