Skip to content

Commit a7d499e

Browse files
echobtfactorydroid
andauthored
fix(cli): make agent creation fully automated when using --generate flag (#349)
When providing a description via --generate flag, the agent creation now runs in fully automated mode without requiring user interaction: - Skips interactive confirmation prompts - Automatically overwrites existing agents - Only prints essential success/error messages This enables proper function call behavior where the agent is created directly from the description without manual input redirects. Co-authored-by: Droid Agent <droid@factory.ai>
1 parent a9d1ba4 commit a7d499e

1 file changed

Lines changed: 68 additions & 54 deletions

File tree

cortex-cli/src/agent_cmd.rs

Lines changed: 68 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -1348,9 +1348,15 @@ async fn run_generate(args: CreateArgs) -> Result<()> {
13481348
}
13491349
}
13501350

1351-
println!("Cortex AI Agent Generator");
1352-
println!("{}", "=".repeat(40));
1353-
println!();
1351+
// Determine if we should run in fully automated mode
1352+
// When description is provided via --generate, run non-interactively
1353+
let fully_automated = args.generate.is_some() || args.non_interactive;
1354+
1355+
if !fully_automated {
1356+
println!("Cortex AI Agent Generator");
1357+
println!("{}", "=".repeat(40));
1358+
println!();
1359+
}
13541360

13551361
// Get description - either from args or interactively
13561362
let description = if let Some(ref desc) = args.generate {
@@ -1374,10 +1380,12 @@ async fn run_generate(args: CreateArgs) -> Result<()> {
13741380
bail!("Error: Model name cannot be empty");
13751381
}
13761382

1377-
println!();
1378-
println!("Generating agent configuration...");
1379-
println!(" Using model: {}", args.model);
1380-
println!();
1383+
if !fully_automated {
1384+
println!();
1385+
println!("Generating agent configuration...");
1386+
println!(" Using model: {}", args.model);
1387+
println!();
1388+
}
13811389

13821390
// Create generator and generate
13831391
let generator = AgentGenerator::new().with_model(&args.model);
@@ -1387,48 +1395,48 @@ async fn run_generate(args: CreateArgs) -> Result<()> {
13871395
.await
13881396
.with_context(|| "Failed to generate agent configuration")?;
13891397

1390-
// Display the generated configuration
1391-
println!("Generated Agent Configuration:");
1392-
println!("{}", "-".repeat(40));
1393-
println!();
1394-
println!(" Name: {}", generated.identifier);
1395-
println!(" Display: {}", generated.display_name);
1396-
println!(" Mode: {}", generated.mode);
1397-
if let Some(temp) = generated.temperature {
1398-
println!(" Temperature: {}", temp);
1399-
}
1400-
println!(" Tools: {}", generated.tools.join(", "));
1401-
if !generated.tags.is_empty() {
1402-
println!(" Tags: {}", generated.tags.join(", "));
1403-
}
1404-
println!(
1405-
" Delegate: {}",
1406-
if generated.can_delegate { "yes" } else { "no" }
1407-
);
1408-
println!();
1409-
println!(" When to use:");
1410-
println!(" {}", generated.when_to_use);
1411-
println!();
1412-
println!(" System Prompt:");
1413-
println!(" {}", "-".repeat(36));
1414-
1415-
// Show truncated prompt
1416-
let prompt_preview = if generated.system_prompt.len() > 500 {
1417-
format!(
1418-
"{}...\n\n (truncated, {} chars total)",
1419-
&generated.system_prompt[..500],
1420-
generated.system_prompt.len()
1421-
)
1422-
} else {
1423-
generated.system_prompt.clone()
1424-
};
1425-
for line in prompt_preview.lines() {
1426-
println!(" {}", line);
1427-
}
1428-
println!();
1398+
// Display the generated configuration (only in interactive mode)
1399+
if !fully_automated {
1400+
println!("Generated Agent Configuration:");
1401+
println!("{}", "-".repeat(40));
1402+
println!();
1403+
println!(" Name: {}", generated.identifier);
1404+
println!(" Display: {}", generated.display_name);
1405+
println!(" Mode: {}", generated.mode);
1406+
if let Some(temp) = generated.temperature {
1407+
println!(" Temperature: {}", temp);
1408+
}
1409+
println!(" Tools: {}", generated.tools.join(", "));
1410+
if !generated.tags.is_empty() {
1411+
println!(" Tags: {}", generated.tags.join(", "));
1412+
}
1413+
println!(
1414+
" Delegate: {}",
1415+
if generated.can_delegate { "yes" } else { "no" }
1416+
);
1417+
println!();
1418+
println!(" When to use:");
1419+
println!(" {}", generated.when_to_use);
1420+
println!();
1421+
println!(" System Prompt:");
1422+
println!(" {}", "-".repeat(36));
14291423

1430-
// Confirm or allow edits
1431-
if !args.non_interactive {
1424+
// Show truncated prompt
1425+
let prompt_preview = if generated.system_prompt.len() > 500 {
1426+
format!(
1427+
"{}...\n\n (truncated, {} chars total)",
1428+
&generated.system_prompt[..500],
1429+
generated.system_prompt.len()
1430+
)
1431+
} else {
1432+
generated.system_prompt.clone()
1433+
};
1434+
for line in prompt_preview.lines() {
1435+
println!(" {}", line);
1436+
}
1437+
println!();
1438+
1439+
// Confirm or allow edits (only in interactive mode)
14321440
let confirm = prompt_input(
14331441
&stdin,
14341442
&mut stdout,
@@ -1464,22 +1472,28 @@ async fn run_generate(args: CreateArgs) -> Result<()> {
14641472
generated
14651473
};
14661474

1467-
save_generated_agent(&final_agent)?;
1475+
save_generated_agent(&final_agent, false)?;
14681476
return Ok(());
14691477
}
14701478
_ => {
14711479
// Save as-is
14721480
}
14731481
}
1482+
save_generated_agent(&generated, false)?;
1483+
} else {
1484+
// Fully automated mode: save directly without prompts
1485+
save_generated_agent(&generated, true)?;
14741486
}
14751487

1476-
save_generated_agent(&generated)?;
1477-
14781488
Ok(())
14791489
}
14801490

14811491
/// Save a generated agent to disk.
1482-
fn save_generated_agent(agent: &cortex_engine::agent::GeneratedAgent) -> Result<()> {
1492+
///
1493+
/// # Arguments
1494+
/// * `agent` - The generated agent configuration to save
1495+
/// * `force` - If true, overwrite existing agent without confirmation prompt
1496+
fn save_generated_agent(agent: &cortex_engine::agent::GeneratedAgent, force: bool) -> Result<()> {
14831497
// Validate agent identifier is not empty
14841498
if agent.identifier.trim().is_empty() {
14851499
bail!("Error: Agent name cannot be empty");
@@ -1490,8 +1504,8 @@ fn save_generated_agent(agent: &cortex_engine::agent::GeneratedAgent) -> Result<
14901504

14911505
let agent_file = agents_dir.join(agent.filename());
14921506

1493-
// Check if file already exists
1494-
if agent_file.exists() {
1507+
// Check if file already exists (only prompt if not in force mode)
1508+
if agent_file.exists() && !force {
14951509
print!(
14961510
"Agent '{}' already exists. Overwrite? [y/N]: ",
14971511
agent.identifier

0 commit comments

Comments
 (0)