use std::path::PathBuf;
use colored::Colorize;
use nika::error::NikaError;
#[allow(clippy::too_many_arguments)]
pub fn handle_new_command(
name: Option<String>,
wizard: bool,
template: Option<String>,
verb: Option<String>,
provider: Option<String>,
output: Option<String>,
with_mcp: bool,
with_include: bool,
with_artifacts: bool,
output_dir: Option<PathBuf>,
list: bool,
quiet: bool,
) -> Result<(), NikaError> {
use nika::new::{
create_from_template, list_templates, NewWorkflowConfig, OutputFormat, Provider, Template,
Verb,
};
let output_dir = output_dir.unwrap_or_else(|| PathBuf::from("."));
if list {
if !quiet {
println!("{}", "Available templates:".bold());
println!();
}
for (name, description, category) in list_templates() {
if quiet {
println!("{}", name);
} else {
println!(
" {} {}",
format!("{:<18}", name).green(),
format!("[{}] {}", category, description).white()
);
}
}
return Ok(());
}
let _has_flags = template.is_some()
|| verb.is_some()
|| provider.is_some()
|| output.is_some()
|| with_mcp
|| with_include
|| with_artifacts;
#[cfg(feature = "tui")]
if wizard || (name.is_none() && !_has_flags) {
let path = nika::new::wizard::run_wizard(output_dir)?;
if !quiet {
println!("{} Created: {}", "SUCCESS!".green().bold(), path.display());
println!(" Run: nika {}", path.display());
}
return Ok(());
}
#[cfg(not(feature = "tui"))]
if wizard {
return Err(NikaError::ValidationError {
reason: "Wizard mode requires TUI feature. Use --template or flags instead."
.to_string(),
});
}
if let Some(template_name) = template {
let workflow_name = name.unwrap_or_else(|| "my-workflow".to_string());
let tmpl =
Template::from_name(&template_name).ok_or_else(|| NikaError::ValidationError {
reason: format!(
"Unknown template: '{}'. Use --list to see available templates.",
template_name
),
})?;
let path = create_from_template(&workflow_name, tmpl, &output_dir)?;
if !quiet {
println!("{} Created: {}", "SUCCESS!".green().bold(), path.display());
println!(" Template: {}", tmpl.name().cyan());
println!(" Run: nika {}", path.display());
}
return Ok(());
}
let workflow_name = name.ok_or_else(|| NikaError::ValidationError {
reason: "Workflow name is required. Use: nika new <NAME> [OPTIONS]".to_string(),
})?;
let verb = verb
.map(|v| {
Verb::from_name(&v).ok_or_else(|| NikaError::ValidationError {
reason: format!(
"Unknown verb: '{}'. Valid: infer, exec, fetch, invoke, agent",
v
),
})
})
.transpose()?
.unwrap_or_default();
let provider = provider
.map(|p| {
Provider::from_name(&p).ok_or_else(|| NikaError::ValidationError {
reason: format!(
"Unknown provider: '{}'. Valid: claude, openai, mistral, groq, deepseek, native",
p
),
})
})
.transpose()?
.unwrap_or_default();
let output_format = output
.map(|o| {
OutputFormat::from_name(&o).ok_or_else(|| NikaError::ValidationError {
reason: format!("Unknown output format: '{}'. Valid: text, json, yaml", o),
})
})
.transpose()?
.unwrap_or_default();
let config = NewWorkflowConfig {
name: workflow_name,
description: None,
verb,
provider,
model: None,
output_format,
with_mcp,
with_include,
with_artifacts,
output_dir,
};
let path = config.write()?;
if !quiet {
println!("{} Created: {}", "SUCCESS!".green().bold(), path.display());
println!(" Verb: {}", config.verb.name().cyan());
println!(" Provider: {}", config.provider.name().yellow());
if with_mcp {
println!(" MCP: {}", "enabled".magenta());
}
println!(" Run: nika {}", path.display());
}
Ok(())
}