use clap::{Args, Parser, Subcommand};
#[derive(Debug, Parser)]
#[command(name = "kindling", version, about, long_about = None)]
pub struct Cli {
#[arg(long, global = true)]
pub via_daemon: bool,
#[command(subcommand)]
pub command: Command,
}
#[derive(Debug, Args, Clone, Default)]
pub struct CommonOpts {
#[arg(long, value_name = "path")]
pub db: Option<String>,
#[arg(long)]
pub json: bool,
}
#[derive(Debug, Subcommand)]
pub enum Command {
Init(InitArgs),
Log(LogArgs),
#[command(subcommand)]
Capsule(CapsuleCommand),
Status(StatusArgs),
Search(SearchArgs),
List(ListArgs),
Pin(PinArgs),
Unpin(UnpinArgs),
Forget(ForgetArgs),
Export(ExportArgs),
Import(ImportArgs),
Serve(ServeArgs),
Demo(DemoArgs),
Browse(BrowseArgs),
#[command(subcommand)]
Spool(SpoolCommand),
}
#[derive(Debug, Args)]
pub struct InitArgs {
#[arg(long, value_name = "path")]
pub db: Option<String>,
#[arg(long)]
pub claude_code: bool,
#[arg(long)]
pub skip_db: bool,
#[arg(long)]
pub json: bool,
}
#[derive(Debug, Args)]
pub struct LogArgs {
pub content: String,
#[arg(long, value_name = "kind", default_value = "message")]
pub kind: String,
#[arg(long, value_name = "id")]
pub session: Option<String>,
#[arg(long, value_name = "id")]
pub repo: Option<String>,
#[arg(long, value_name = "id")]
pub capsule: Option<String>,
#[command(flatten)]
pub common: CommonOpts,
}
#[derive(Debug, Subcommand)]
pub enum CapsuleCommand {
Open(CapsuleOpenArgs),
Close(CapsuleCloseArgs),
}
#[derive(Debug, Args)]
pub struct CapsuleOpenArgs {
#[arg(long, value_name = "text")]
pub intent: String,
#[arg(long = "type", value_name = "type", default_value = "session")]
pub kind: String,
#[arg(long, value_name = "id")]
pub session: Option<String>,
#[arg(long, value_name = "id")]
pub repo: Option<String>,
#[command(flatten)]
pub common: CommonOpts,
}
#[derive(Debug, Args)]
pub struct CapsuleCloseArgs {
pub id: String,
#[arg(long, value_name = "text")]
pub summary: Option<String>,
#[command(flatten)]
pub common: CommonOpts,
}
#[derive(Debug, Args)]
pub struct StatusArgs {
#[command(flatten)]
pub common: CommonOpts,
}
#[derive(Debug, Args)]
pub struct SearchArgs {
pub query: String,
#[arg(long, value_name = "id")]
pub session: Option<String>,
#[arg(long, value_name = "id")]
pub repo: Option<String>,
#[arg(long, value_name = "n", default_value_t = 10)]
pub max: u32,
#[command(flatten)]
pub common: CommonOpts,
}
#[derive(Debug, Args)]
pub struct ListArgs {
pub entity: String,
#[arg(long, value_name = "id")]
pub session: Option<String>,
#[arg(long, value_name = "id")]
pub repo: Option<String>,
#[arg(long, value_name = "n", default_value_t = 20)]
pub limit: u32,
#[command(flatten)]
pub common: CommonOpts,
}
#[derive(Debug, Args)]
pub struct PinArgs {
#[arg(value_name = "type")]
pub target_type: String,
pub id: String,
#[arg(long, value_name = "text")]
pub note: Option<String>,
#[arg(long, value_name = "ms")]
pub ttl: Option<i64>,
#[command(flatten)]
pub common: CommonOpts,
}
#[derive(Debug, Args)]
pub struct UnpinArgs {
pub id: String,
#[command(flatten)]
pub common: CommonOpts,
}
#[derive(Debug, Args)]
pub struct ForgetArgs {
pub id: String,
#[command(flatten)]
pub common: CommonOpts,
}
#[derive(Debug, Args)]
pub struct ExportArgs {
pub output: Option<String>,
#[arg(long, value_name = "id")]
pub session: Option<String>,
#[arg(long, value_name = "id")]
pub repo: Option<String>,
#[arg(long)]
pub pretty: bool,
#[arg(long, value_name = "ms", hide = true)]
pub timestamp: Option<i64>,
#[command(flatten)]
pub common: CommonOpts,
}
#[derive(Debug, Args)]
pub struct ImportArgs {
pub file: String,
#[arg(long)]
pub dry_run: bool,
#[command(flatten)]
pub common: CommonOpts,
}
#[derive(Debug, Args)]
pub struct ServeArgs {
#[arg(long, value_name = "path")]
pub socket: Option<String>,
#[arg(long, value_name = "secs", default_value_t = 1800)]
pub idle_timeout: u64,
#[arg(long, value_name = "path")]
pub kindling_home: Option<String>,
#[arg(long)]
pub daemonize: bool,
}
#[derive(Debug, Args)]
pub struct DemoArgs {
#[arg(long)]
pub reset: bool,
#[command(flatten)]
pub common: CommonOpts,
}
#[derive(Debug, Subcommand)]
pub enum SpoolCommand {
Status(SpoolStatusArgs),
}
#[derive(Debug, Args)]
pub struct SpoolStatusArgs {
#[arg(long, value_name = "path")]
pub spool_path: String,
#[arg(long)]
pub json: bool,
}
#[derive(Debug, Args)]
pub struct BrowseArgs {
#[arg(long, value_name = "path")]
pub output: Option<String>,
#[arg(long)]
pub no_open: bool,
#[command(flatten)]
pub common: CommonOpts,
}