zagens-cli 0.8.0

Zagens headless CLI + HTTP/SSE runtime sidecar (`zagens`, `zagens-runtime` binaries)
Documentation
//! Feature flags — re-exported from `zagens-core` (P2 PR4).

pub use zagens_core::features::{Feature, Features, FeaturesToml, is_known_feature_key};

#[cfg(test)]
mod tests {
    use super::*;
    use std::collections::BTreeMap;
    use zagens_core::features::{feature_from_key, render_feature_table};

    #[test]
    fn apply_map_toggles_known_features_and_ignores_unknown_keys() {
        let mut features = Features::with_defaults();
        let entries = BTreeMap::from([
            ("mcp".to_string(), false),
            ("shell_tool".to_string(), false),
            ("not_real".to_string(), false),
        ]);

        features.apply_map(&entries);

        assert!(!features.enabled(Feature::Mcp));
        assert!(!features.enabled(Feature::ShellTool));
        assert_eq!(feature_from_key("not_real"), None);
    }

    #[test]
    fn render_feature_table_uses_registry_order_and_effective_state() {
        let mut features = Features::with_defaults();
        features.disable(Feature::Mcp);

        let table = render_feature_table(&features);
        let lines = table.lines().collect::<Vec<_>>();

        assert_eq!(lines.first(), Some(&"feature\tstage\tenabled"));
        assert!(lines.contains(&"shell_tool\tstable\ttrue"));
        assert!(lines.contains(&"mcp\texperimental\tfalse"));
    }
}