Skip to main content

nika_cli/
init.rs

1//! Init subcommand handler — creates .nika/config.toml
2
3use std::fs;
4
5use colored::Colorize;
6
7use nika_engine::error::NikaError;
8use nika_engine::tools::PermissionMode;
9
10/// Initialize a Nika project config in the current directory.
11///
12/// Creates `.nika/config.toml` with provider and permission settings.
13/// Everything else (editors, AI rules, completions) is handled by auto-setup.
14pub async fn init_project(permission: &str, migrate_keys: bool) -> Result<(), NikaError> {
15    let cwd = std::env::current_dir()?;
16    let nika_dir = cwd.join(".nika");
17
18    // Check if already initialized
19    if nika_dir.join("config.toml").exists() {
20        return Err(NikaError::ValidationError {
21            reason: format!(
22                "Already initialized at {}. Edit .nika/config.toml to change settings.",
23                nika_dir.display()
24            ),
25        });
26    }
27
28    // Parse permission mode
29    let permission_mode = match permission.to_lowercase().as_str() {
30        "deny" => PermissionMode::Deny,
31        "plan" => PermissionMode::Plan,
32        "accept-edits" | "acceptedits" => PermissionMode::AcceptEdits,
33        "accept-all" | "acceptall" | "yolo" => PermissionMode::YoloMode,
34        other => {
35            return Err(NikaError::ValidationError {
36                reason: format!(
37                    "Invalid permission mode: '{other}'. Use: deny, plan, accept-edits, yolo"
38                ),
39            });
40        }
41    };
42
43    // Create .nika/config.toml
44    fs::create_dir_all(&nika_dir)?;
45
46    let config_path = nika_dir.join("config.toml");
47    let config_content = format!(
48        r#"# Nika Project Configuration
49
50[tools]
51permission = "{}"
52
53[provider]
54default = "claude"
55# model = "claude-sonnet-4-6"
56"#,
57        permission_mode
58            .display_name()
59            .to_lowercase()
60            .replace(" (yolo)", "")
61    );
62    fs::write(&config_path, config_content)?;
63
64    println!();
65    println!("  {} {}", "\u{2713}".green(), config_path.display());
66    println!();
67    println!("  Permission: {}", permission_mode.display_name().cyan());
68    println!("  Provider:   {}", "claude (auto-detect)".cyan());
69    println!();
70    println!("  Edit {} to change settings.", ".nika/config.toml".bold());
71    println!();
72
73    // Migrate API keys if requested
74    if migrate_keys {
75        use nika_engine::secrets::migrate_env_to_keyring;
76        println!(
77            "{}",
78            "Migrating API keys from environment variables...".cyan()
79        );
80        let report = migrate_env_to_keyring();
81        println!("{}", report.summary());
82
83        if report.migrated > 0 {
84            println!(
85                "{}",
86                "You can now remove these env vars from your shell config.".yellow()
87            );
88        }
89        println!();
90    }
91
92    Ok(())
93}