use clap::{Parser, Subcommand};
use std::path::PathBuf;
pub(super) use crate::install::InstallTarget;
#[derive(Parser)]
#[command(
name = "remem",
about = "Persistent memory for Claude Code and Codex",
version
)]
pub(super) struct Cli {
#[command(subcommand)]
pub(super) command: Commands,
}
#[derive(Subcommand)]
pub(super) enum Commands {
Context {
#[arg(long)]
cwd: Option<String>,
#[arg(long)]
session_id: Option<String>,
#[arg(long)]
host: Option<String>,
#[arg(long)]
color: bool,
#[arg(long)]
debug: bool,
#[arg(long)]
force: bool,
#[arg(long)]
gate: Option<String>,
},
SessionInit,
Observe,
Summarize,
Worker {
#[arg(long)]
once: bool,
},
Mcp,
Install {
#[arg(long, value_enum, default_value = "auto")]
target: InstallTarget,
#[arg(long)]
dry_run: bool,
},
Uninstall {
#[arg(long, value_enum, default_value = "auto")]
target: InstallTarget,
#[arg(long)]
dry_run: bool,
},
Cleanup,
SyncMemory {
#[arg(long)]
cwd: Option<String>,
},
Preferences {
#[command(subcommand)]
action: PreferenceAction,
},
Pending {
#[command(subcommand)]
action: PendingAction,
},
Review {
#[command(subcommand)]
action: ReviewAction,
},
Usage {
#[arg(long, short)]
project: Option<String>,
#[arg(long, default_value = "14")]
days: i64,
#[arg(long, default_value = "8")]
weeks: i64,
},
Status,
Doctor {
#[arg(long)]
json: bool,
#[arg(long, short)]
quiet: bool,
},
Search {
query: String,
#[arg(long, short)]
project: Option<String>,
#[arg(long, alias = "type", short = 't')]
memory_type: Option<String>,
#[arg(long, short = 'n', default_value = "10")]
limit: i64,
#[arg(long, default_value = "0")]
offset: i64,
#[arg(long)]
branch: Option<String>,
#[arg(long)]
include_stale: bool,
#[arg(long)]
multi_hop: bool,
#[arg(long)]
explain: bool,
},
Show {
id: i64,
},
Eval {
#[arg(long, default_value = "eval/golden.json")]
dataset: String,
#[arg(long, short = 'k', default_value = "5")]
k: usize,
},
EvalLocal,
BackfillEntities,
Encrypt,
Api {
#[arg(long, short, default_value = "5567")]
port: u16,
},
Dream {
#[arg(long, short)]
project: Option<String>,
#[arg(long)]
dry_run: bool,
},
Admin {
#[command(subcommand)]
action: AdminAction,
},
Import {
#[command(subcommand)]
action: ImportAction,
},
}
#[derive(Subcommand)]
pub(in crate::cli) enum PreferenceAction {
List,
Add {
#[arg(long)]
project: Option<String>,
#[arg(long)]
global: bool,
text: String,
},
Remove {
id: i64,
},
}
#[derive(Subcommand)]
pub(in crate::cli) enum AdminAction {
Backup {
#[arg(long)]
output: Option<PathBuf>,
},
#[command(name = "reset-schema")]
ResetSchema {
#[arg(long)]
confirm_destructive: bool,
},
}
#[derive(Subcommand)]
pub(in crate::cli) enum ImportAction {
Backup {
#[arg(long)]
source: PathBuf,
#[arg(long)]
best_effort: bool,
},
}
#[derive(Subcommand)]
#[allow(clippy::enum_variant_names)]
pub(in crate::cli) enum PendingAction {
ListFailed {
#[arg(long, short)]
project: Option<String>,
#[arg(long, short = 'n', default_value = "20")]
limit: i64,
},
RetryFailed {
#[arg(long, short)]
project: Option<String>,
#[arg(long, short = 'n', default_value = "100")]
limit: i64,
#[arg(long)]
dry_run: bool,
},
PurgeFailed {
#[arg(long, short)]
project: Option<String>,
#[arg(long, default_value = "7")]
older_than_days: i64,
#[arg(long)]
dry_run: bool,
},
}
#[derive(Subcommand)]
pub(in crate::cli) enum ReviewAction {
List {
#[arg(long, short)]
project: Option<String>,
#[arg(long, short = 'n', default_value = "20")]
limit: i64,
},
Approve {
id: i64,
},
Discard {
id: i64,
},
Edit {
id: i64,
#[arg(long)]
text: Option<String>,
#[arg(long = "topic-key")]
topic_key: Option<String>,
#[arg(long = "type")]
memory_type: Option<String>,
#[arg(long)]
scope: Option<String>,
},
}