use clap::{Args, Parser, Subcommand, ValueEnum};
use std::path::PathBuf;
#[derive(Parser, Debug)]
#[command(name = "csm")]
#[command(about = "Chaotic Semantic Memory CLI", long_about = None)]
#[command(version)]
pub struct CliArgs {
#[command(subcommand)]
pub command: Commands,
#[arg(short, long, global = true, action = clap::ArgAction::Count)]
pub verbose: u8,
#[arg(short, long, global = true, value_name = "PATH")]
pub database: Option<PathBuf>,
#[arg(long, global = true)]
pub git_local: bool,
#[arg(long, global = true, value_name = "PATH")]
pub index_path: Option<PathBuf>,
#[arg(long, global = true, value_enum, default_value = "table")]
pub output_format: OutputFormat,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, ValueEnum)]
pub enum OutputFormat {
Json,
Table,
Quiet,
}
#[derive(Subcommand, Debug)]
pub enum Commands {
Inject(InjectArgs),
Probe(ProbeArgs),
Query(QueryArgs),
Associate(AssociateArgs),
Export(ExportArgs),
Import(ImportArgs),
Version(VersionArgs),
Completions(CompletionsArgs),
IndexJsonl(IndexJsonlArgs),
IndexDir(IndexDirArgs),
}
#[derive(Args, Debug, Clone)]
pub struct InjectArgs {
#[arg(required = true)]
pub concept_id: String,
#[arg(short, long)]
pub from_file: Option<PathBuf>,
#[arg(long, default_value = "random", value_enum)]
pub vector_source: VectorSource,
#[arg(short, long, value_name = "JSON")]
pub metadata: Option<String>,
}
#[derive(Debug, Clone, Copy, ValueEnum)]
pub enum VectorSource {
Random,
File,
Stdin,
}
#[derive(Args, Debug, Clone)]
pub struct ProbeArgs {
#[arg(required = true)]
pub concept_id: String,
#[arg(short = 'k', long, default_value = "10")]
pub top_k: usize,
#[arg(short, long)]
pub threshold: Option<f64>,
}
#[derive(Args, Debug, Clone)]
pub struct QueryArgs {
#[arg(required = true)]
pub text: String,
#[arg(short = 'k', long, default_value = "10")]
pub top_k: usize,
#[arg(short, long, default_value = "0.0")]
pub min_score: f64,
#[arg(long)]
pub code_aware: bool,
#[arg(long)]
pub compact: bool,
#[arg(long)]
pub semantic_only: bool,
#[arg(long)]
pub keyword_only: bool,
#[arg(long, value_name = "WEIGHT")]
pub keyword_weight: Option<f64>,
}
#[derive(Args, Debug, Clone)]
pub struct AssociateArgs {
#[arg(required = true)]
pub source_id: String,
#[arg(required = true)]
pub target_id: String,
#[arg(short, long, default_value = "1.0")]
pub strength: f64,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, ValueEnum)]
pub enum ExportFormat {
Json,
Binary,
}
#[derive(Args, Debug, Clone)]
pub struct ExportArgs {
#[arg(short, long, default_value = "export.json")]
pub output: PathBuf,
#[arg(long, value_enum, default_value = "json")]
pub format: ExportFormat,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, ValueEnum)]
pub enum ImportFormat {
Json,
Binary,
Auto,
}
#[derive(Args, Debug, Clone)]
pub struct ImportArgs {
#[arg(required = true)]
pub input: PathBuf,
#[arg(long, value_enum, default_value = "auto")]
pub format: ImportFormat,
#[arg(long)]
pub merge: bool,
}
#[derive(Args, Debug, Clone)]
pub struct VersionArgs {
#[arg(long)]
pub detailed: bool,
}
#[derive(Args, Debug, Clone)]
pub struct CompletionsArgs {
#[arg(value_enum)]
pub shell: clap_complete::Shell,
#[arg(short, long, value_name = "FILE")]
pub output: Option<PathBuf>,
}
#[derive(Args, Debug, Clone)]
pub struct IndexJsonlArgs {
#[arg(short = 'F', long, value_name = "FILE")]
pub file: PathBuf,
#[arg(short, long, default_value = "text")]
pub field: String,
#[arg(long, value_name = "FIELD")]
pub id_field: Option<String>,
#[arg(long, value_name = "FIELD")]
pub tag_field: Option<String>,
#[arg(long)]
pub code_aware: bool,
}
#[derive(Args, Debug, Clone)]
pub struct IndexDirArgs {
#[arg(short, long, required = true, value_name = "PATTERN")]
pub glob: Vec<String>,
#[arg(long, default_value = "2", value_name = "LEVEL")]
pub heading_level: usize,
#[arg(long)]
pub code_aware: bool,
}