omk 0.5.0

A Rust runtime for Kimi CLI. Turns prompts into proof-backed engineering runs with gates, worktrees, and replay.
Documentation
use anyhow::Result;
use tracing::info;

pub(super) async fn run_setup() -> Result<()> {
    info!("Running omk setup");

    crate::runtime::config::ensure_dirs().await?;

    let config_dir = crate::runtime::config::config_dir();
    let state_dir = crate::runtime::config::state_dir();
    let data_dir = crate::runtime::config::data_dir();

    let config_path = config_dir.join("config.toml");
    if !config_path.exists() {
        let default_config = r#"# OMK Configuration
# See https://github.com/ekhodzitsky/oh-my-kimi for docs

# Default number of workers for team mode
default_team_size = 2

# Enable YOLO (auto-approve) mode by default
default_yolo = false

# Path to Kimi CLI binary (leave empty for auto-detect)
# kimi_binary = "/usr/local/bin/kimi"

# Additional skill directories
# extra_skill_dirs = ["~/.omk/skills"]

# Enable metrics collection
enable_metrics = true
"#;
        crate::runtime::atomic::atomic_write(&config_path, default_config.as_bytes()).await?;
    }

    let skills_dir = data_dir.join("skills");
    tokio::fs::create_dir_all(&skills_dir).await?;

    let project_omk = std::env::current_dir()?.join(".omk");
    tokio::fs::create_dir_all(&project_omk).await.ok();
    let agents_path = project_omk.join("AGENTS.md");
    if !agents_path.exists() {
        tokio::fs::write(&agents_path, crate::agents::runtime::default_agents_md()).await?;
        println!("✓ Created {}", agents_path.display());
    }

    println!("✓ omk setup complete");
    println!("  Config: {}", config_dir.display());
    println!("  State:  {}", state_dir.display());
    println!("  Data:   {}", data_dir.display());
    println!();
    println!("Next steps:");
    println!("  1. Ensure 'kimi' CLI is installed and authenticated");
    println!("  2. Run 'omk team run 2:coder \"fix TypeScript errors\"' to try team mode");

    Ok(())
}