use crate::commands::unified::OutputModeArg;
use clap::{Parser, Subcommand};
use std::path::PathBuf;
pub const DEFAULT_CONFIG_FILE: &str = "sage_config.json";
#[derive(Parser)]
#[command(name = "sage")]
#[command(about = "Sage Agent - LLM-based agent for software engineering tasks")]
#[command(
long_about = r#"Sage Agent - LLM-based agent for software engineering tasks
USAGE:
sage # Start interactive mode
sage "your task" # Execute task (interactive)
sage -p "your task" # Print mode (non-interactive)
sage -c # Resume most recent session
sage -r <session_id> # Resume specific session
UTILITY COMMANDS:
sage config init # Create config file
sage config show # Show current config
sage tools # List available tools
For detailed help: sage --help"#
)]
#[command(version)]
pub struct Cli {
pub task: Option<String>,
#[arg(short = 'p', long = "print")]
pub print_mode: bool,
#[arg(short = 'c', long = "continue", conflicts_with = "resume_session")]
pub continue_session: bool,
#[arg(short = 'r', long = "resume", conflicts_with = "continue_session")]
pub resume_session: Option<String>,
#[arg(long)]
pub max_steps: Option<u32>,
#[arg(long, default_value = DEFAULT_CONFIG_FILE)]
pub config_file: String,
#[arg(long)]
pub working_dir: Option<PathBuf>,
#[arg(long, short)]
pub verbose: bool,
#[arg(long)]
pub stream_json: bool,
#[arg(long, value_enum, default_value = "streaming")]
pub output_mode: OutputModeArg,
#[command(subcommand)]
pub command: Option<Commands>,
}
#[derive(Subcommand)]
pub enum Commands {
#[command(verbatim_doc_comment)]
Config {
#[command(subcommand)]
action: ConfigAction,
},
#[command(verbatim_doc_comment)]
Tools,
#[command(verbatim_doc_comment)]
Doctor {
#[arg(long, default_value = DEFAULT_CONFIG_FILE)]
config_file: String,
},
#[command(verbatim_doc_comment)]
Status {
#[arg(long, default_value = DEFAULT_CONFIG_FILE)]
config_file: String,
},
#[command(verbatim_doc_comment)]
Usage {
#[arg(long)]
session_dir: Option<PathBuf>,
#[arg(long, short)]
detailed: bool,
},
}
#[derive(Subcommand, Clone)]
pub enum ConfigAction {
Show {
#[arg(long, default_value = DEFAULT_CONFIG_FILE)]
config_file: String,
},
Validate {
#[arg(long, default_value = DEFAULT_CONFIG_FILE)]
config_file: String,
},
Init {
#[arg(long, default_value = DEFAULT_CONFIG_FILE)]
config_file: String,
#[arg(long)]
force: bool,
},
}