use std::path::PathBuf;
use clap::{Args, Parser, Subcommand};
use crate::db::{RetrievalFilters, RetrievalKind, SearchMode, TimelineSort};
use super::formats::{OutputArgs, ProgressFormat, RecallOutputArgs, StatsOutputArgs, ToggleState};
use super::help::{
AGENTS_CONTEXT_AFTER_HELP, APP_AFTER_HELP, APP_SETTINGS_AFTER_HELP, CAPTURE_ONCE_AFTER_HELP,
DOCTOR_AFTER_HELP, EXPORT_AFTER_HELP, FORGET_AFTER_HELP, GET_AFTER_HELP,
HERMES_DOCTOR_AFTER_HELP, HERMES_INSTALL_AFTER_HELP, HERMES_PRINT_AFTER_HELP,
HERMES_UNINSTALL_AFTER_HELP, OCR_AFTER_HELP, OPENCLAW_DOCTOR_AFTER_HELP,
OPENCLAW_INSTALL_AFTER_HELP, OPENCLAW_PRINT_AFTER_HELP, OPENCLAW_UNINSTALL_AFTER_HELP,
PURGE_AFTER_HELP, RECALL_AFTER_HELP, RECENT_AFTER_HELP, RESTORE_AFTER_HELP, ROOT_AFTER_HELP,
SEARCH_AFTER_HELP, SERVICE_AFTER_HELP, SERVICE_REVISION_AFTER_HELP, SERVICE_STATUS_AFTER_HELP,
SETTINGS_AFTER_HELP, SETUP_AFTER_HELP, STATS_AFTER_HELP, STORAGE_AFTER_HELP,
TIMELINE_AFTER_HELP, WATCH_AFTER_HELP,
};
use super::parsing::{
parse_bounded_limit, parse_bundle_id, parse_duration_value, parse_item_index,
parse_nonnegative_bytes, parse_normalized_score, parse_preferred_app, parse_representation_uti,
parse_retention_value, parse_retrieval_kind, parse_rfc3339_timestamp, parse_search_mode,
parse_sha256_hash, parse_timeline_sort, DurationValue, RetentionValue,
};
use super::value_validation::{
normalize_nonempty_filter_value, validate_byte_window, validate_positive_hours,
validate_time_window,
};
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub(super) enum AppPreferenceKey {
BinaryPathOverride,
DatabasePathOverride,
DefaultRecentHours,
DefaultQueryMode,
HotkeyEnabled,
}
impl AppPreferenceKey {
pub(super) const fn as_str(self) -> &'static str {
match self {
Self::BinaryPathOverride => "binary-path-override",
Self::DatabasePathOverride => "database-path-override",
Self::DefaultRecentHours => "default-recent-hours",
Self::DefaultQueryMode => "default-query-mode",
Self::HotkeyEnabled => "hotkey-enabled",
}
}
}
fn parse_app_preference_key(value: &str) -> Result<AppPreferenceKey, String> {
match value {
"binary-path-override" => Ok(AppPreferenceKey::BinaryPathOverride),
"database-path-override" => Ok(AppPreferenceKey::DatabasePathOverride),
"default-recent-hours" => Ok(AppPreferenceKey::DefaultRecentHours),
"default-query-mode" => Ok(AppPreferenceKey::DefaultQueryMode),
"hotkey-enabled" => Ok(AppPreferenceKey::HotkeyEnabled),
_ => Err(format!(
"unsupported app preference key `{value}`; expected binary-path-override, database-path-override, default-recent-hours, default-query-mode, or hotkey-enabled"
)),
}
}
#[derive(Debug, Parser)]
#[command(name = "clipmem")]
#[command(version)]
#[command(about = "macOS clipboard memory backed by SQLite")]
#[command(after_help = ROOT_AFTER_HELP)]
#[command(next_line_help = true)]
pub(super) struct Cli {
#[arg(long, global = true)]
pub(super) db: Option<PathBuf>,
#[command(subcommand)]
pub(super) command: Command,
}
#[derive(Debug, Subcommand)]
pub(super) enum Command {
Agents(AgentsArgs),
Setup(SetupArgs),
Service(ServiceArgs),
App(AppArgs),
Watch(WatchArgs),
CaptureOnce(CaptureOnceArgs),
Search(SearchArgs),
Recent(RecentArgs),
Timeline(TimelineArgs),
Stats(StatsArgs),
Recall(RecallArgs),
Get(GetArgs),
Export(ExportArgs),
Restore(RestoreArgs),
Forget(ForgetArgs),
Purge(PurgeArgs),
Storage(StorageArgs),
Ocr(OcrArgs),
Settings(SettingsArgs),
Doctor(DoctorArgs),
}
#[derive(Debug, Args)]
#[command(after_help = WATCH_AFTER_HELP)]
pub(super) struct WatchArgs {
#[arg(long, default_value_t = 400)]
pub(super) interval_ms: u64,
#[arg(long, default_value_t = false)]
pub(super) quiet: bool,
#[arg(long, default_value_t = false)]
pub(super) skip_initial: bool,
}
#[derive(Debug, Args)]
#[command(after_help = SETUP_AFTER_HELP)]
pub(super) struct SetupArgs {}
#[derive(Debug, Args)]
#[command(after_help = SERVICE_AFTER_HELP)]
pub(super) struct ServiceArgs {
#[command(subcommand)]
pub(super) command: ServiceCommand,
}
#[derive(Debug, Subcommand)]
pub(super) enum ServiceCommand {
Providers(ServiceProvidersArgs),
Revision(ServiceRevisionArgs),
Start,
Stop,
Status(ServiceStatusArgs),
Uninstall,
}
#[derive(Debug, Args)]
pub(super) struct ServiceProvidersArgs {
#[command(flatten)]
pub(super) output: OutputArgs,
}
#[derive(Debug, Args)]
#[command(after_help = SERVICE_REVISION_AFTER_HELP)]
pub(super) struct ServiceRevisionArgs {
#[command(flatten)]
pub(super) output: OutputArgs,
}
#[derive(Debug, Args)]
#[command(after_help = SERVICE_STATUS_AFTER_HELP)]
pub(super) struct ServiceStatusArgs {
#[arg(long, default_value_t = false)]
pub(super) json: bool,
#[arg(long, default_value_t = false)]
pub(super) human: bool,
}
#[derive(Debug, Args)]
#[command(after_help = APP_AFTER_HELP)]
pub(super) struct AppArgs {
#[command(subcommand)]
pub(super) command: AppCommand,
}
#[derive(Debug, Subcommand)]
pub(super) enum AppCommand {
Settings(AppSettingsArgs),
LaunchAtLogin(AppLaunchAtLoginArgs),
UpdateCheck(AppUpdateCheckArgs),
Quit(AppQuitArgs),
}
#[derive(Debug, Args)]
#[command(after_help = APP_SETTINGS_AFTER_HELP)]
pub(super) struct AppSettingsArgs {
#[command(subcommand)]
pub(super) command: AppSettingsCommand,
}
#[derive(Debug, Subcommand)]
pub(super) enum AppSettingsCommand {
Show(AppSettingsShowArgs),
Set(AppSettingsSetArgs),
Clear(AppSettingsClearArgs),
}
#[derive(Debug, Args)]
pub(super) struct AppSettingsShowArgs {
#[command(flatten)]
pub(super) output: OutputArgs,
}
#[derive(Debug, Args)]
pub(super) struct AppSettingsSetArgs {
#[arg(value_parser = parse_app_preference_key)]
pub(super) key: AppPreferenceKey,
pub(super) value: String,
#[command(flatten)]
pub(super) output: OutputArgs,
}
#[derive(Debug, Args)]
pub(super) struct AppSettingsClearArgs {
#[arg(value_parser = parse_app_preference_key)]
pub(super) key: AppPreferenceKey,
#[command(flatten)]
pub(super) output: OutputArgs,
}
#[derive(Debug, Args)]
pub(super) struct AppLaunchAtLoginArgs {
#[command(subcommand)]
pub(super) command: AppLaunchAtLoginCommand,
}
#[derive(Debug, Subcommand)]
pub(super) enum AppLaunchAtLoginCommand {
Show(AppLaunchAtLoginShowArgs),
Set(AppLaunchAtLoginSetArgs),
Clear(AppLaunchAtLoginClearArgs),
}
#[derive(Debug, Args)]
pub(super) struct AppLaunchAtLoginShowArgs {
#[command(flatten)]
pub(super) output: OutputArgs,
}
#[derive(Debug, Args)]
pub(super) struct AppLaunchAtLoginSetArgs {
pub(super) state: ToggleState,
#[command(flatten)]
pub(super) output: OutputArgs,
}
#[derive(Debug, Args)]
pub(super) struct AppLaunchAtLoginClearArgs {
#[command(flatten)]
pub(super) output: OutputArgs,
}
#[derive(Debug, Args)]
pub(super) struct AppUpdateCheckArgs {
#[command(subcommand)]
pub(super) command: AppUpdateCheckCommand,
}
#[derive(Debug, Subcommand)]
pub(super) enum AppUpdateCheckCommand {
Show(AppUpdateCheckShowArgs),
Run(AppUpdateCheckRunArgs),
Clear(AppUpdateCheckClearArgs),
}
#[derive(Debug, Args)]
pub(super) struct AppUpdateCheckShowArgs {
#[command(flatten)]
pub(super) output: OutputArgs,
}
#[derive(Debug, Args)]
pub(super) struct AppUpdateCheckRunArgs {
#[command(flatten)]
pub(super) output: OutputArgs,
}
#[derive(Debug, Args)]
pub(super) struct AppUpdateCheckClearArgs {
#[command(flatten)]
pub(super) output: OutputArgs,
}
#[derive(Debug, Args)]
pub(super) struct AppQuitArgs {
#[command(flatten)]
pub(super) output: OutputArgs,
}
#[derive(Debug, Args)]
#[command(after_help = CAPTURE_ONCE_AFTER_HELP)]
pub(super) struct CaptureOnceArgs {
#[arg(long, default_value_t = false)]
pub(super) json: bool,
#[arg(long, default_value_t = false)]
pub(super) human: bool,
}
#[derive(Debug, Args)]
#[command(after_help = SEARCH_AFTER_HELP)]
pub(super) struct SearchArgs {
pub(super) query: String,
#[arg(long, value_parser = parse_search_mode, default_value = "auto")]
pub(super) mode: SearchMode,
#[arg(long, default_value_t = 10, value_parser = parse_bounded_limit)]
pub(super) limit: usize,
#[arg(long)]
pub(super) cursor: Option<String>,
#[command(flatten)]
pub(super) filters: RetrievalFilterArgs,
#[command(flatten)]
pub(super) output: OutputArgs,
}
impl SearchArgs {
pub(super) fn search_mode(&self) -> SearchMode {
self.mode
}
}
#[derive(Debug, Clone, Args)]
pub(super) struct RetrievalFilterArgs {
#[arg(long, value_parser = parse_rfc3339_timestamp)]
pub(super) since: Option<String>,
#[arg(long, value_parser = parse_rfc3339_timestamp)]
pub(super) until: Option<String>,
#[arg(long)]
pub(super) hours: Option<u32>,
#[arg(long)]
pub(super) app: Option<String>,
#[arg(long)]
pub(super) bundle_id: Option<String>,
#[arg(long, value_parser = parse_retrieval_kind)]
pub(super) kind: Option<RetrievalKind>,
#[arg(long, default_value_t = false)]
pub(super) has_text: bool,
#[arg(long, default_value_t = false)]
pub(super) has_url: bool,
#[arg(long, default_value_t = false)]
pub(super) has_file_url: bool,
#[arg(long, default_value_t = false)]
pub(super) has_image: bool,
#[arg(long, default_value_t = false)]
pub(super) has_pdf: bool,
#[arg(long, value_parser = parse_nonnegative_bytes)]
pub(super) min_bytes: Option<usize>,
#[arg(long, value_parser = parse_nonnegative_bytes)]
pub(super) max_bytes: Option<usize>,
}
impl RetrievalFilterArgs {
pub(super) fn normalized(
&self,
) -> std::result::Result<RetrievalFilters, super::errors::CliValueError> {
validate_time_window(self.since.as_deref(), self.until.as_deref())?;
validate_positive_hours(self.hours)?;
validate_byte_window(self.min_bytes, self.max_bytes)?;
let app = normalize_nonempty_filter_value(self.app.as_deref(), "--app")?;
let bundle_id = normalize_nonempty_filter_value(self.bundle_id.as_deref(), "--bundle-id")?;
let since = self.since.clone();
let hours = if self.since.is_some() {
None
} else {
self.hours
};
let mut filters = RetrievalFilters::default()
.with_since(since)
.with_until(self.until.clone())
.with_hours(hours)
.with_app(app)
.with_bundle_id(bundle_id)
.with_kind(self.kind)
.with_min_bytes(self.min_bytes)
.with_max_bytes(self.max_bytes);
if self.has_text {
filters = filters.requiring_text();
}
if self.has_url {
filters = filters.requiring_url();
}
if self.has_file_url {
filters = filters.requiring_file_url();
}
if self.has_image {
filters = filters.requiring_image();
}
if self.has_pdf {
filters = filters.requiring_pdf();
}
Ok(filters)
}
}
#[derive(Debug, Args)]
#[command(after_help = RECENT_AFTER_HELP)]
pub(super) struct RecentArgs {
#[arg(long, default_value_t = 10, value_parser = parse_bounded_limit)]
pub(super) limit: usize,
#[arg(long)]
pub(super) cursor: Option<String>,
#[command(flatten)]
pub(super) filters: RetrievalFilterArgs,
#[command(flatten)]
pub(super) output: OutputArgs,
}
#[derive(Debug, Args)]
#[command(after_help = TIMELINE_AFTER_HELP)]
pub(super) struct TimelineArgs {
#[arg(long, default_value_t = 10, value_parser = parse_bounded_limit)]
pub(super) limit: usize,
#[arg(long)]
pub(super) cursor: Option<String>,
#[arg(long, value_parser = parse_timeline_sort, default_value = "desc")]
pub(super) sort: TimelineSort,
#[command(flatten)]
pub(super) filters: RetrievalFilterArgs,
#[command(flatten)]
pub(super) output: OutputArgs,
}
impl TimelineArgs {
pub(super) fn timeline_sort(&self) -> TimelineSort {
self.sort
}
}
#[derive(Debug, Args)]
#[command(after_help = STATS_AFTER_HELP)]
pub(super) struct StatsArgs {
#[command(flatten)]
pub(super) filters: RetrievalFilterArgs,
#[command(flatten)]
pub(super) output: StatsOutputArgs,
}
#[derive(Debug, Args)]
#[command(after_help = RECALL_AFTER_HELP)]
pub(super) struct RecallArgs {
pub(super) query: Option<String>,
#[arg(long, value_parser = parse_search_mode, default_value = "auto")]
pub(super) mode: SearchMode,
#[arg(long, default_value_t = 5, value_parser = parse_bounded_limit)]
pub(super) limit: usize,
#[arg(long, default_value_t = false)]
pub(super) full: bool,
#[arg(long, default_value_t = false)]
pub(super) quote: bool,
#[arg(long, value_parser = parse_normalized_score)]
pub(super) min_score: Option<f64>,
#[arg(long, default_value_t = false)]
pub(super) prefer_recent: bool,
#[arg(long, value_parser = parse_preferred_app)]
pub(super) prefer_app: Option<String>,
#[command(flatten)]
pub(super) filters: RetrievalFilterArgs,
#[command(flatten)]
pub(super) output: RecallOutputArgs,
}
impl RecallArgs {
pub(super) fn search_mode(&self) -> SearchMode {
self.mode
}
}
#[derive(Debug, Args)]
#[command(after_help = GET_AFTER_HELP)]
pub(super) struct GetArgs {
pub(super) snapshot_id: i64,
#[arg(long, default_value_t = 10, value_parser = parse_bounded_limit)]
pub(super) events: usize,
#[command(flatten)]
pub(super) filters: RetrievalFilterArgs,
#[command(flatten)]
pub(super) output: OutputArgs,
}
#[derive(Debug, Args)]
#[command(after_help = EXPORT_AFTER_HELP)]
pub(super) struct ExportArgs {
pub(super) snapshot_id: i64,
#[arg(long, value_parser = parse_item_index)]
pub(super) item: usize,
#[arg(long, value_parser = parse_representation_uti)]
pub(super) uti: String,
#[arg(long)]
pub(super) out: PathBuf,
#[arg(long, default_value_t = false)]
pub(super) force: bool,
#[command(flatten)]
pub(super) filters: RetrievalFilterArgs,
#[command(flatten)]
pub(super) output: OutputArgs,
}
#[derive(Debug, Args)]
#[command(after_help = RESTORE_AFTER_HELP)]
pub(super) struct RestoreArgs {
pub(super) snapshot_id: i64,
#[command(flatten)]
pub(super) output: OutputArgs,
}
#[derive(Debug, Args)]
#[command(after_help = FORGET_AFTER_HELP)]
pub(super) struct ForgetArgs {
pub(super) snapshot_id: i64,
#[command(flatten)]
pub(super) output: OutputArgs,
}
#[derive(Debug, Args)]
#[command(after_help = PURGE_AFTER_HELP)]
pub(super) struct PurgeArgs {
#[arg(long, value_parser = parse_duration_value)]
pub(super) older_than: DurationValue,
#[arg(long, default_value_t = false)]
pub(super) dry_run: bool,
#[command(flatten)]
pub(super) output: OutputArgs,
}
#[derive(Debug, Args)]
#[command(after_help = STORAGE_AFTER_HELP)]
pub(super) struct StorageArgs {
#[command(subcommand)]
pub(super) command: StorageCommand,
}
#[derive(Debug, Subcommand)]
pub(super) enum StorageCommand {
Compact(StorageCompactArgs),
ImageCandidates(StorageImageCandidatesArgs),
OptimizeImages(StorageOptimizeImagesArgs),
}
#[derive(Debug, Args)]
pub(super) struct StorageCompactArgs {
#[arg(long, default_value_t = false)]
pub(super) dry_run: bool,
#[command(flatten)]
pub(super) output: OutputArgs,
}
#[derive(Debug, Args)]
pub(super) struct StorageImageCandidatesArgs {
#[arg(long, default_value_t = 25, value_parser = parse_bounded_limit)]
pub(super) limit: usize,
#[command(flatten)]
pub(super) output: OutputArgs,
}
#[derive(Debug, Args)]
pub(super) struct StorageOptimizeImagesArgs {
#[arg(long, default_value_t = false)]
pub(super) dry_run: bool,
#[arg(long, default_value_t = false)]
pub(super) no_compact: bool,
#[arg(long, default_value_t = 25, value_parser = parse_bounded_limit)]
pub(super) limit: usize,
#[arg(long, value_enum)]
pub(super) progress: Option<ProgressFormat>,
#[command(flatten)]
pub(super) output: OutputArgs,
}
#[derive(Debug, Args)]
#[command(after_help = OCR_AFTER_HELP)]
pub(super) struct OcrArgs {
#[command(subcommand)]
pub(super) command: OcrCommand,
}
#[derive(Debug, Subcommand)]
pub(super) enum OcrCommand {
Status(OcrStatusArgs),
Candidates(OcrCandidatesArgs),
Get(OcrGetArgs),
Clear(OcrClearArgs),
Run(OcrRunArgs),
}
#[derive(Debug, Args)]
pub(super) struct OcrStatusArgs {
#[command(flatten)]
pub(super) output: OutputArgs,
}
#[derive(Debug, Args)]
pub(super) struct OcrCandidatesArgs {
#[arg(long, default_value_t = 25, value_parser = parse_bounded_limit)]
pub(super) limit: usize,
#[arg(long)]
pub(super) snapshot: Option<i64>,
#[command(flatten)]
pub(super) output: OutputArgs,
}
#[derive(Debug, Args)]
pub(super) struct OcrGetArgs {
#[arg(value_parser = parse_sha256_hash)]
pub(super) raw_sha256: String,
#[command(flatten)]
pub(super) output: OutputArgs,
}
#[derive(Debug, Args)]
pub(super) struct OcrClearArgs {
#[arg(value_parser = parse_sha256_hash)]
pub(super) raw_sha256: String,
#[command(flatten)]
pub(super) output: OutputArgs,
}
#[derive(Debug, Args)]
pub(super) struct OcrRunArgs {
#[arg(long, default_value_t = 25, value_parser = parse_bounded_limit)]
pub(super) limit: usize,
#[arg(long)]
pub(super) snapshot: Option<i64>,
#[arg(long, default_value_t = false)]
pub(super) retry_failed: bool,
#[command(flatten)]
pub(super) output: OutputArgs,
}
#[derive(Debug, Args)]
#[command(after_help = SETTINGS_AFTER_HELP)]
pub(super) struct SettingsArgs {
#[command(subcommand)]
pub(super) command: SettingsCommand,
}
#[derive(Debug, Subcommand)]
pub(super) enum SettingsCommand {
Show(SettingsShowArgs),
Pause(SettingsPauseArgs),
ApiKeyFilter(SettingsApiKeyFilterArgs),
Ocr(SettingsOcrArgs),
Retention(SettingsRetentionArgs),
Reset(SettingsResetArgs),
Ignore(SettingsIgnoreArgs),
}
#[derive(Debug, Args)]
pub(super) struct SettingsShowArgs {
#[command(flatten)]
pub(super) output: OutputArgs,
}
#[derive(Debug, Args)]
pub(super) struct SettingsPauseArgs {
pub(super) state: ToggleState,
#[command(flatten)]
pub(super) output: OutputArgs,
}
#[derive(Debug, Args)]
pub(super) struct SettingsApiKeyFilterArgs {
pub(super) state: ToggleState,
#[command(flatten)]
pub(super) output: OutputArgs,
}
#[derive(Debug, Args)]
pub(super) struct SettingsOcrArgs {
pub(super) state: ToggleState,
#[command(flatten)]
pub(super) output: OutputArgs,
}
#[derive(Debug, Args)]
pub(super) struct SettingsRetentionArgs {
#[arg(value_parser = parse_retention_value)]
pub(super) value: RetentionValue,
#[command(flatten)]
pub(super) output: OutputArgs,
}
#[derive(Debug, Args)]
pub(super) struct SettingsResetArgs {
#[command(flatten)]
pub(super) output: OutputArgs,
}
#[derive(Debug, Args)]
pub(super) struct SettingsIgnoreArgs {
#[command(subcommand)]
pub(super) command: SettingsIgnoreCommand,
}
#[derive(Debug, Subcommand)]
pub(super) enum SettingsIgnoreCommand {
Add(SettingsIgnoreBundleArgs),
Remove(SettingsIgnoreBundleArgs),
List(SettingsIgnoreListArgs),
}
#[derive(Debug, Args)]
pub(super) struct SettingsIgnoreBundleArgs {
#[arg(value_parser = parse_bundle_id)]
pub(super) bundle_id: String,
#[command(flatten)]
pub(super) output: OutputArgs,
}
#[derive(Debug, Args)]
pub(super) struct SettingsIgnoreListArgs {
#[command(flatten)]
pub(super) output: OutputArgs,
}
#[derive(Debug, Args)]
#[command(after_help = DOCTOR_AFTER_HELP)]
pub(super) struct DoctorArgs {
#[arg(long, default_value_t = false)]
pub(super) json: bool,
#[arg(long, default_value_t = false)]
pub(super) human: bool,
}
#[derive(Debug, Args)]
pub(super) struct AgentsArgs {
#[command(subcommand)]
pub(super) command: AgentsCommand,
}
#[derive(Debug, Subcommand)]
pub(super) enum AgentsCommand {
#[command(after_help = AGENTS_CONTEXT_AFTER_HELP)]
Context(AgentsContextArgs),
Openclaw(OpenClawArgs),
Hermes(HermesArgs),
}
#[derive(Debug, Args)]
pub(super) struct AgentsContextArgs {
#[command(flatten)]
pub(super) output: OutputArgs,
}
#[derive(Debug, Args)]
pub(super) struct OpenClawArgs {
#[command(subcommand)]
pub(super) command: OpenClawCommand,
}
#[derive(Debug, Subcommand)]
pub(super) enum OpenClawCommand {
InstallSkill(OpenClawInstallSkillArgs),
UninstallSkill(OpenClawUninstallSkillArgs),
#[command(after_help = OPENCLAW_PRINT_AFTER_HELP)]
PrintSkill,
Doctor(OpenClawDoctorArgs),
}
#[derive(Debug, Args)]
#[command(after_help = OPENCLAW_INSTALL_AFTER_HELP)]
pub(super) struct OpenClawInstallSkillArgs {
#[arg(long, default_value_t = false)]
pub(super) shared: bool,
#[arg(long)]
pub(super) dest: Option<PathBuf>,
#[arg(long, default_value_t = false)]
pub(super) force: bool,
}
#[derive(Debug, Args)]
#[command(after_help = OPENCLAW_UNINSTALL_AFTER_HELP)]
pub(super) struct OpenClawUninstallSkillArgs {
#[arg(long, default_value_t = false)]
pub(super) shared: bool,
#[arg(long)]
pub(super) dest: Option<PathBuf>,
}
#[derive(Debug, Args)]
#[command(after_help = OPENCLAW_DOCTOR_AFTER_HELP)]
pub(super) struct OpenClawDoctorArgs {
#[arg(long, default_value_t = false)]
pub(super) shared: bool,
#[arg(long)]
pub(super) dest: Option<PathBuf>,
}
#[derive(Debug, Args)]
pub(super) struct HermesArgs {
#[command(subcommand)]
pub(super) command: HermesCommand,
}
#[derive(Debug, Subcommand)]
pub(super) enum HermesCommand {
InstallSkill(HermesInstallSkillArgs),
UninstallSkill(HermesUninstallSkillArgs),
#[command(after_help = HERMES_PRINT_AFTER_HELP)]
PrintSkill,
Doctor(HermesDoctorArgs),
}
#[derive(Debug, Args)]
#[command(after_help = HERMES_INSTALL_AFTER_HELP)]
pub(super) struct HermesInstallSkillArgs {
#[arg(long)]
pub(super) dest: Option<PathBuf>,
#[arg(long, default_value_t = false)]
pub(super) force: bool,
}
#[derive(Debug, Args)]
#[command(after_help = HERMES_UNINSTALL_AFTER_HELP)]
pub(super) struct HermesUninstallSkillArgs {
#[arg(long)]
pub(super) dest: Option<PathBuf>,
}
#[derive(Debug, Args)]
#[command(after_help = HERMES_DOCTOR_AFTER_HELP)]
pub(super) struct HermesDoctorArgs {
#[arg(long)]
pub(super) dest: Option<PathBuf>,
}