1use std::fs;
4
5use colored::Colorize;
6
7use nika_engine::error::NikaError;
8use nika_engine::tools::PermissionMode;
9
10pub 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 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 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 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 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}