omk 0.5.0

A Rust runtime for Kimi CLI. Turns prompts into proof-backed engineering runs with gates, worktrees, and replay.
Documentation
use omk::mcp::config::{McpConfig, McpServerConfig, TransportType};
use tempfile::TempDir;

#[tokio::test]
async fn test_config_backward_compatibility_stdio() {
    let dir = TempDir::new().unwrap();
    let path = dir.path().join("mcp.json");
    let raw = r#"{"servers":{"fs":{"command":"npx","args":["-y","@modelcontextprotocol/server-filesystem"],"env":{}}}}"#;
    tokio::fs::write(&path, raw).await.unwrap();

    let config = McpConfig::load(&path).await.unwrap();
    assert_eq!(config.servers.len(), 1);
    let server = config.servers.get("fs").unwrap();
    match &server.transport {
        TransportType::Stdio { command, args, env } => {
            assert_eq!(command, "npx");
            assert_eq!(args, &["-y", "@modelcontextprotocol/server-filesystem"]);
            assert!(env.is_empty());
        }
        other => panic!("expected stdio transport, got {:?}", other),
    }
}

#[tokio::test]
async fn test_config_sse_http() {
    let dir = TempDir::new().unwrap();
    let path = dir.path().join("mcp.json");
    let raw = r#"{"servers":{"context7":{"url":"https://context7.com/sse","headers":{"Authorization":"Bearer token"}}}}"#;
    tokio::fs::write(&path, raw).await.unwrap();

    let config = McpConfig::load(&path).await.unwrap();
    assert_eq!(config.servers.len(), 1);
    let server = config.servers.get("context7").unwrap();
    match &server.transport {
        TransportType::SseHttp { url, headers } => {
            assert_eq!(url, "https://context7.com/sse");
            assert_eq!(
                headers.get("Authorization"),
                Some(&"Bearer token".to_string())
            );
        }
        other => panic!("expected sse_http transport, got {:?}", other),
    }
}

#[tokio::test]
async fn test_config_mixed_transports() {
    let dir = TempDir::new().unwrap();
    let path = dir.path().join("mcp.json");
    let raw = r#"{
        "servers":{
            "fs":{"command":"npx","args":["-y","@modelcontextprotocol/server-filesystem"]},
            "linear":{"url":"https://linear.dev/mcp","headers":{}}
        }
    }"#;
    tokio::fs::write(&path, raw).await.unwrap();

    let config = McpConfig::load(&path).await.unwrap();
    assert_eq!(config.servers.len(), 2);

    let fs = config.servers.get("fs").unwrap();
    assert!(matches!(fs.transport, TransportType::Stdio { .. }));

    let linear = config.servers.get("linear").unwrap();
    assert!(matches!(linear.transport, TransportType::SseHttp { .. }));
}

#[tokio::test]
async fn test_config_empty_is_default() {
    let dir = TempDir::new().unwrap();
    let path = dir.path().join("mcp.json");
    tokio::fs::write(&path, "{}").await.unwrap();
    let config = McpConfig::load(&path).await.unwrap();
    assert!(config.servers.is_empty());
}

#[tokio::test]
async fn test_config_missing_is_default() {
    let dir = TempDir::new().unwrap();
    let path = dir.path().join("nonexistent.json");
    let config = McpConfig::load(&path).await.unwrap();
    assert!(config.servers.is_empty());
}

#[test]
fn test_transport_type_default_is_stdio() {
    let default = TransportType::default();
    assert!(matches!(default, TransportType::Stdio { .. }));
}

#[test]
fn test_server_config_default() {
    let config = McpServerConfig::default();
    assert!(matches!(config.transport, TransportType::Stdio { .. }));
}