use crate::core::Harness;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum DispatchMechanism {
InSession,
Cli,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct HarnessRunCapabilities {
pub mechanism: DispatchMechanism,
pub supports_guard: bool,
pub supports_bootstrap_with_no_stage: bool,
pub supports_stage_name_with_no_stage: bool,
}
pub fn capabilities_for(harness: Harness) -> HarnessRunCapabilities {
match harness {
Harness::ClaudeCode => HarnessRunCapabilities {
mechanism: DispatchMechanism::InSession,
supports_guard: true,
supports_bootstrap_with_no_stage: true,
supports_stage_name_with_no_stage: true,
},
Harness::Codex => HarnessRunCapabilities {
mechanism: DispatchMechanism::Cli,
supports_guard: true,
supports_bootstrap_with_no_stage: false,
supports_stage_name_with_no_stage: false,
},
Harness::OpenCode => HarnessRunCapabilities {
mechanism: DispatchMechanism::Cli,
supports_guard: false,
supports_bootstrap_with_no_stage: true,
supports_stage_name_with_no_stage: true,
},
}
}
pub fn mechanism_for(harness: Harness) -> DispatchMechanism {
capabilities_for(harness).mechanism
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn maps_each_harness_to_its_mechanism_today() {
assert_eq!(
mechanism_for(Harness::ClaudeCode),
DispatchMechanism::InSession
);
assert_eq!(mechanism_for(Harness::Codex), DispatchMechanism::Cli);
assert_eq!(mechanism_for(Harness::OpenCode), DispatchMechanism::Cli);
}
#[test]
fn capabilities_capture_run_option_support_by_harness() {
let claude = capabilities_for(Harness::ClaudeCode);
assert_eq!(claude.mechanism, DispatchMechanism::InSession);
assert!(claude.supports_guard);
assert!(claude.supports_bootstrap_with_no_stage);
assert!(claude.supports_stage_name_with_no_stage);
let codex = capabilities_for(Harness::Codex);
assert_eq!(codex.mechanism, DispatchMechanism::Cli);
assert!(codex.supports_guard);
assert!(!codex.supports_bootstrap_with_no_stage);
assert!(!codex.supports_stage_name_with_no_stage);
let opencode = capabilities_for(Harness::OpenCode);
assert_eq!(opencode.mechanism, DispatchMechanism::Cli);
assert!(!opencode.supports_guard);
assert!(opencode.supports_bootstrap_with_no_stage);
assert!(opencode.supports_stage_name_with_no_stage);
}
}