use clap::{Parser, Subcommand};
#[derive(Parser)]
#[command(name = "chasm")]
#[command(author = "Nervosys")]
#[command(version)]
#[command(about = "Manage and merge chat sessions across workspaces", long_about = None)]
pub struct Cli {
#[command(subcommand)]
pub command: Commands,
}
#[derive(Subcommand)]
pub enum Commands {
#[command(visible_alias = "ls")]
List {
#[command(subcommand)]
command: Option<ListCommands>,
},
Find {
#[command(subcommand)]
command: Option<FindCommands>,
},
#[command(visible_alias = "info")]
Show {
#[command(subcommand)]
command: Option<ShowCommands>,
},
Fetch {
#[command(subcommand)]
command: Option<FetchCommands>,
},
Merge {
#[command(subcommand)]
command: Option<MergeCommands>,
},
Export {
#[command(subcommand)]
command: Option<ExportCommands>,
},
Import {
#[command(subcommand)]
command: Option<ImportCommands>,
},
#[command(visible_alias = "mv")]
Move {
#[command(subcommand)]
command: Option<MoveCommands>,
},
Git {
#[command(subcommand)]
command: GitCommands,
},
Migration {
#[command(subcommand)]
command: MigrationCommands,
},
Run {
#[command(subcommand)]
command: RunCommands,
},
#[command(visible_alias = "w")]
Watch {
#[arg(short, long)]
agent: Option<String>,
#[arg(short, long)]
path: Option<String>,
#[arg(short, long, default_value = "3")]
debounce: u64,
#[arg(long)]
no_harvest: bool,
#[arg(short, long)]
verbose: bool,
},
Provider {
#[command(subcommand)]
command: ProviderCommands,
},
Detect {
#[command(subcommand)]
command: Option<DetectCommands>,
},
Register {
#[command(subcommand)]
command: RegisterCommands,
},
Sync {
#[arg(long)]
path: Option<String>,
#[arg(long)]
push: bool,
#[arg(long)]
pull: bool,
#[arg(long)]
provider: Option<String>,
#[arg(long)]
workspace: Option<String>,
#[arg(long, num_args = 1..)]
sessions: Option<Vec<String>>,
#[arg(long, default_value = "auto")]
format: String,
#[arg(long)]
force: bool,
#[arg(long)]
dry_run: bool,
},
Harvest {
#[command(subcommand)]
command: HarvestCommands,
},
#[command(visible_alias = "restore")]
Recover {
#[command(subcommand)]
command: RecoverCommands,
},
#[command(visible_alias = "serve")]
Api {
#[command(subcommand)]
command: ApiCommands,
},
Agency {
#[command(subcommand)]
command: AgencyCommands,
},
Telemetry {
#[command(subcommand)]
command: Option<TelemetryCommands>,
},
Completions {
#[arg(value_enum)]
shell: CompletionShell,
},
Shard {
#[command(subcommand)]
command: ShardCommands,
},
#[command(visible_alias = "check")]
Doctor {
#[arg(long)]
full: bool,
#[arg(long, default_value = "text")]
format: String,
#[arg(long)]
fix: bool,
},
Inspect {
#[command(subcommand)]
command: InspectCommands,
},
Schema {
#[command(subcommand)]
command: SchemaCommands,
},
#[command(hide = true)]
Internal {
#[command(subcommand)]
command: InternalCommands,
},
#[command(hide = true)]
Banner,
}
#[derive(Subcommand)]
pub enum InternalCommands {
ApplyPending {
pending_file: String,
},
}
#[derive(Subcommand)]
pub enum ListCommands {
#[command(visible_alias = "ws")]
Workspaces,
#[command(visible_alias = "s")]
Sessions {
#[arg(long)]
project_path: Option<String>,
#[arg(long, short = 's')]
size: bool,
#[arg(long, short = 'p')]
provider: Option<String>,
#[arg(long)]
all_providers: bool,
},
#[command(visible_alias = "a")]
Agents,
#[command(visible_alias = "e")]
Edits {
#[arg(long)]
project_path: Option<String>,
#[arg(long, short = 's')]
size: bool,
#[arg(long, short = 'p')]
provider: Option<String>,
},
Path {
project_path: Option<String>,
},
Orphaned {
#[arg(long)]
path: Option<String>,
},
}
#[derive(Subcommand)]
pub enum FindCommands {
#[command(visible_alias = "ws")]
Workspace {
pattern: Option<String>,
},
#[command(visible_alias = "s")]
Session {
pattern: Option<String>,
#[arg(long, short = 'w')]
workspace: Option<String>,
#[arg(long, short = 't')]
title_only: bool,
#[arg(long, short = 'c')]
content: bool,
#[arg(long)]
after: Option<String>,
#[arg(long)]
before: Option<String>,
#[arg(long)]
date: Option<String>,
#[arg(long, short = 'a')]
all: bool,
#[arg(long, short = 'p')]
provider: Option<String>,
#[arg(long)]
all_providers: bool,
#[arg(long, short = 'n', default_value = "50")]
limit: usize,
},
Path {
pattern: Option<String>,
#[arg(long)]
project_path: Option<String>,
},
}
#[derive(Subcommand)]
pub enum ShowCommands {
#[command(visible_alias = "ws")]
Workspace {
workspace: String,
},
#[command(visible_alias = "s")]
Session {
session_id: String,
#[arg(long)]
project_path: Option<String>,
},
#[command(visible_alias = "a")]
Agent {
session_id: String,
#[arg(long)]
project_path: Option<String>,
},
#[command(visible_alias = "idx")]
Index {
#[arg(long)]
path: Option<String>,
#[arg(long, short)]
all: bool,
},
Path {
project_path: Option<String>,
},
Timeline {
project_path: Option<String>,
#[arg(long, short = 'a')]
agents: bool,
#[arg(long, short = 'p')]
provider: Option<String>,
#[arg(long)]
all_providers: bool,
},
}
#[derive(Subcommand)]
pub enum FetchCommands {
#[command(visible_alias = "ws")]
Workspace {
workspace_name: String,
#[arg(long)]
target_path: Option<String>,
#[arg(long)]
force: bool,
#[arg(long)]
no_register: bool,
},
#[command(visible_alias = "s")]
Session {
#[arg(required = true, num_args = 1..)]
session_ids: Vec<String>,
#[arg(long)]
target_path: Option<String>,
#[arg(long)]
force: bool,
#[arg(long)]
no_register: bool,
},
Path {
project_path: Option<String>,
#[arg(long)]
force: bool,
#[arg(long)]
no_register: bool,
},
}
#[derive(Subcommand)]
pub enum MergeCommands {
#[command(visible_alias = "ws")]
Workspace {
workspace_name: String,
#[arg(short, long)]
title: Option<String>,
#[arg(long)]
target_path: Option<String>,
#[arg(long)]
force: bool,
#[arg(long)]
no_backup: bool,
},
#[command(visible_alias = "wss")]
Workspaces {
#[arg(required = true, num_args = 1..)]
workspace_names: Vec<String>,
#[arg(short, long)]
title: Option<String>,
#[arg(long)]
target_path: Option<String>,
#[arg(long)]
force: bool,
#[arg(long)]
no_backup: bool,
},
#[command(visible_alias = "s")]
Sessions {
#[arg(required = true, num_args = 1..)]
sessions: Vec<String>,
#[arg(short, long)]
title: Option<String>,
#[arg(long)]
target_path: Option<String>,
#[arg(long)]
force: bool,
#[arg(long)]
no_backup: bool,
},
Path {
project_path: Option<String>,
#[arg(short, long)]
title: Option<String>,
#[arg(long)]
force: bool,
#[arg(long)]
no_backup: bool,
},
Provider {
provider_name: String,
#[arg(short, long)]
title: Option<String>,
#[arg(long)]
target_path: Option<String>,
#[arg(long)]
sessions: Option<Vec<String>>,
#[arg(long)]
force: bool,
#[arg(long)]
no_backup: bool,
},
#[command(name = "providers")]
Providers {
#[arg(required = true, num_args = 1..)]
providers: Vec<String>,
#[arg(short, long)]
title: Option<String>,
#[arg(long)]
target_path: Option<String>,
#[arg(long)]
workspace: Option<String>,
#[arg(long)]
force: bool,
#[arg(long)]
no_backup: bool,
},
All {
#[arg(short, long)]
title: Option<String>,
#[arg(long)]
target_path: Option<String>,
#[arg(long)]
workspace: Option<String>,
#[arg(long)]
force: bool,
#[arg(long)]
no_backup: bool,
},
}
#[derive(Subcommand)]
pub enum ExportCommands {
#[command(visible_alias = "ws")]
Workspace {
destination: String,
hash: String,
},
#[command(visible_alias = "s")]
Sessions {
destination: String,
#[arg(required = true, num_args = 1..)]
session_ids: Vec<String>,
#[arg(long)]
project_path: Option<String>,
},
Path {
destination: String,
project_path: Option<String>,
},
Batch {
destination: String,
#[arg(required = true, num_args = 1..)]
project_paths: Vec<String>,
},
}
#[derive(Subcommand)]
pub enum ImportCommands {
#[command(visible_alias = "ws")]
Workspace {
source: String,
hash: String,
#[arg(long)]
force: bool,
},
#[command(visible_alias = "s")]
Sessions {
#[arg(required = true, num_args = 1..)]
session_files: Vec<String>,
#[arg(long)]
target_path: Option<String>,
#[arg(long)]
force: bool,
},
Path {
source: String,
target_path: Option<String>,
#[arg(long)]
force: bool,
},
}
#[derive(Subcommand)]
pub enum MoveCommands {
#[command(visible_alias = "ws")]
Workspace {
source_hash: String,
target: String,
},
#[command(visible_alias = "s")]
Sessions {
#[arg(required = true, num_args = 1..)]
session_ids: Vec<String>,
target_path: String,
},
Path {
source_path: String,
target_path: String,
},
}
#[derive(Subcommand)]
pub enum GitCommands {
Config {
#[arg(long)]
name: Option<String>,
#[arg(long)]
email: Option<String>,
#[arg(long)]
path: Option<String>,
},
Init {
path: String,
},
Add {
path: String,
#[arg(long)]
commit: bool,
#[arg(short, long)]
message: Option<String>,
},
Status {
path: String,
},
Snapshot {
path: String,
#[arg(long)]
tag: Option<String>,
#[arg(short, long)]
message: Option<String>,
},
Track {
path: String,
#[arg(short, long)]
message: Option<String>,
#[arg(long)]
all: bool,
#[arg(long)]
files: Option<Vec<String>>,
#[arg(long)]
tag: Option<String>,
},
Log {
path: String,
#[arg(short = 'n', long, default_value = "10")]
count: usize,
#[arg(long)]
sessions_only: bool,
},
Diff {
path: String,
#[arg(long)]
from: Option<String>,
#[arg(long)]
to: Option<String>,
#[arg(long)]
with_files: bool,
},
Restore {
path: String,
commit: String,
#[arg(long)]
with_files: bool,
#[arg(long)]
backup: bool,
},
}
#[derive(Subcommand)]
pub enum MigrationCommands {
Create {
output: String,
#[arg(long)]
projects: Option<String>,
#[arg(long)]
all: bool,
},
Restore {
package: String,
#[arg(long)]
mapping: Option<String>,
#[arg(long)]
dry_run: bool,
},
}
#[derive(Subcommand)]
pub enum RunCommands {
Tui,
#[command(visible_aliases = ["claude-code", "claudecode"])]
Claude {
#[arg(last = true)]
args: Vec<String>,
#[arg(long)]
no_save: bool,
#[arg(short, long)]
verbose: bool,
},
#[command(visible_aliases = ["opencode", "open-code"])]
Open {
#[arg(last = true)]
args: Vec<String>,
#[arg(long)]
no_save: bool,
#[arg(short, long)]
verbose: bool,
},
#[command(visible_aliases = ["openclaw", "clawdbot"])]
Claw {
#[arg(last = true)]
args: Vec<String>,
#[arg(long)]
no_save: bool,
#[arg(short, long)]
verbose: bool,
},
Cursor {
#[arg(last = true)]
args: Vec<String>,
#[arg(long)]
no_save: bool,
#[arg(short, long)]
verbose: bool,
},
#[command(visible_aliases = ["codex-cli", "codexcli"])]
Codex {
#[arg(last = true)]
args: Vec<String>,
#[arg(long)]
no_save: bool,
#[arg(short, long)]
verbose: bool,
},
#[command(visible_aliases = ["droid-cli", "droidcli", "factory"])]
Droid {
#[arg(last = true)]
args: Vec<String>,
#[arg(long)]
no_save: bool,
#[arg(short, long)]
verbose: bool,
},
#[command(visible_aliases = ["gemini-cli", "geminicli"])]
Gemini {
#[arg(last = true)]
args: Vec<String>,
#[arg(long)]
no_save: bool,
#[arg(short, long)]
verbose: bool,
},
}
#[derive(Subcommand)]
pub enum ProviderCommands {
List,
Info {
provider: String,
},
Config {
provider: String,
#[arg(long)]
endpoint: Option<String>,
#[arg(long)]
api_key: Option<String>,
#[arg(long)]
model: Option<String>,
#[arg(long)]
enabled: Option<bool>,
},
Import {
#[arg(long)]
from: String,
#[arg(long)]
path: Option<String>,
#[arg(long)]
session: Option<String>,
},
Test {
provider: String,
},
}
#[derive(Subcommand)]
pub enum DetectCommands {
Workspace {
path: Option<String>,
},
Providers {
#[arg(long)]
with_sessions: bool,
},
Session {
session_id: String,
#[arg(long)]
path: Option<String>,
},
All {
path: Option<String>,
#[arg(long)]
verbose: bool,
},
Orphaned {
path: Option<String>,
#[arg(long, short)]
recover: bool,
},
}
#[derive(Subcommand)]
pub enum RegisterCommands {
All {
#[arg(long)]
path: Option<String>,
#[arg(long, short)]
merge: bool,
#[arg(long, short)]
force: bool,
#[arg(long)]
close_vscode: bool,
#[arg(long)]
reopen: bool,
#[arg(long, short = 'w')]
write_only: bool,
},
#[command(visible_alias = "s")]
Session {
#[arg(required_unless_present = "title")]
ids: Vec<String>,
#[arg(long, short, num_args = 1.., value_delimiter = ' ')]
title: Option<Vec<String>>,
#[arg(long)]
path: Option<String>,
#[arg(long, short)]
force: bool,
},
#[command(visible_alias = "r")]
Recursive {
path: Option<String>,
#[arg(long, short)]
depth: Option<usize>,
#[arg(long, short)]
force: bool,
#[arg(long)]
dry_run: bool,
#[arg(long, short = 'x')]
exclude: Vec<String>,
},
#[command(visible_alias = "fix")]
Repair {
#[arg(long)]
path: Option<String>,
#[arg(long, short)]
all: bool,
#[arg(long, short)]
recursive: bool,
#[arg(long, short)]
depth: Option<usize>,
#[arg(long, short = 'x')]
exclude: Vec<String>,
#[arg(long)]
dry_run: bool,
#[arg(long, short)]
force: bool,
#[arg(long)]
close_vscode: bool,
#[arg(long)]
reopen: bool,
},
#[command(visible_alias = "t")]
Trim {
#[arg(long)]
path: Option<String>,
#[arg(long, short, default_value = "20")]
keep: usize,
#[arg(long, short)]
session: Option<String>,
#[arg(long, short)]
all: bool,
#[arg(long, default_value = "10")]
threshold_mb: u64,
#[arg(long, short)]
force: bool,
},
}
#[derive(Subcommand)]
pub enum HarvestCommands {
Init {
#[arg(long)]
path: Option<String>,
#[arg(long)]
git: bool,
},
Scan {
#[arg(long)]
sessions: bool,
#[arg(long)]
web: bool,
#[arg(long, default_value = "5")]
timeout: u64,
#[arg(long, short)]
verbose: bool,
},
Run {
#[arg(long)]
path: Option<String>,
#[arg(long, value_delimiter = ',')]
providers: Option<Vec<String>>,
#[arg(long, value_delimiter = ',')]
exclude: Option<Vec<String>>,
#[arg(long)]
incremental: bool,
#[arg(long)]
commit: bool,
#[arg(short, long)]
message: Option<String>,
},
Status {
#[arg(long)]
path: Option<String>,
},
List {
#[arg(long)]
path: Option<String>,
#[arg(long)]
provider: Option<String>,
#[arg(long, default_value = "20")]
limit: usize,
#[arg(long)]
search: Option<String>,
},
Export {
output: String,
#[arg(long)]
path: Option<String>,
#[arg(long, default_value = "json")]
format: String,
#[arg(long)]
provider: Option<String>,
#[arg(long, value_delimiter = ',')]
sessions: Option<Vec<String>>,
},
Share {
url: String,
#[arg(long)]
path: Option<String>,
#[arg(long)]
name: Option<String>,
#[arg(long)]
workspace: Option<String>,
},
Shares {
#[arg(long)]
path: Option<String>,
#[arg(long)]
status: Option<String>,
#[arg(long, default_value = "20")]
limit: usize,
},
Checkpoint {
session: String,
#[arg(long)]
path: Option<String>,
#[arg(short, long)]
message: Option<String>,
},
Checkpoints {
session: String,
#[arg(long)]
path: Option<String>,
},
Revert {
session: String,
checkpoint: i64,
#[arg(long)]
path: Option<String>,
},
Sync {
#[arg(long)]
path: Option<String>,
#[arg(long)]
push: bool,
#[arg(long)]
pull: bool,
#[arg(long)]
provider: Option<String>,
#[arg(long)]
workspace: Option<String>,
#[arg(long, num_args = 1..)]
sessions: Option<Vec<String>>,
#[arg(long, default_value = "auto")]
format: String,
#[arg(long)]
force: bool,
#[arg(long)]
dry_run: bool,
},
#[command(visible_alias = "gc")]
Compact {
#[arg(long)]
path: Option<String>,
#[arg(long)]
dry_run: bool,
},
Rebuild {
#[arg(long)]
path: Option<String>,
},
Search {
query: String,
#[arg(long)]
path: Option<String>,
#[arg(long)]
provider: Option<String>,
#[arg(long, default_value = "20")]
limit: usize,
},
Git {
#[command(subcommand)]
command: HarvestGitCommands,
},
}
#[derive(Subcommand)]
pub enum HarvestGitCommands {
Init {
#[arg(long)]
path: Option<String>,
},
Commit {
#[arg(long)]
path: Option<String>,
#[arg(short, long)]
message: Option<String>,
},
Log {
#[arg(long)]
path: Option<String>,
#[arg(short = 'n', long, default_value = "10")]
count: usize,
},
Diff {
#[arg(long)]
path: Option<String>,
#[arg(long)]
commit: Option<String>,
},
Restore {
commit: String,
#[arg(long)]
path: Option<String>,
},
}
#[derive(Subcommand)]
pub enum RecoverCommands {
Scan {
#[arg(long, default_value = "all")]
provider: String,
#[arg(short, long)]
verbose: bool,
#[arg(long)]
include_old: bool,
},
Recording {
#[arg(long, default_value = "http://localhost:8787")]
server: String,
#[arg(long)]
session: Option<String>,
#[arg(short, long)]
output: Option<String>,
},
Database {
backup: String,
#[arg(long)]
session: Option<String>,
#[arg(short, long)]
output: Option<String>,
#[arg(long, default_value = "json")]
format: String,
},
Jsonl {
file: String,
#[arg(short, long)]
output: Option<String>,
#[arg(long)]
aggressive: bool,
},
Orphans {
#[arg(long, default_value = "all")]
provider: String,
#[arg(long)]
unindexed: bool,
#[arg(long)]
verify: bool,
},
Repair {
path: String,
#[arg(long, default_value = "true")]
backup: bool,
#[arg(long)]
dry_run: bool,
},
Status {
#[arg(long, default_value = "all")]
provider: String,
#[arg(long)]
system: bool,
},
Convert {
input: String,
#[arg(short, long)]
output: Option<String>,
#[arg(long)]
format: Option<String>,
#[arg(long, default_value = "both")]
compat: String,
},
Extract {
path: String,
#[arg(short, long)]
output: Option<String>,
#[arg(long)]
all_formats: bool,
#[arg(long)]
include_edits: bool,
},
Detect {
file: String,
#[arg(long)]
verbose: bool,
#[arg(long)]
json: bool,
},
Upgrade {
#[arg(required = true, num_args = 1..)]
project_paths: Vec<String>,
#[arg(long, default_value = "auto")]
provider: String,
#[arg(long, default_value = "jsonl")]
target_format: String,
#[arg(long)]
no_backup: bool,
#[arg(long)]
dry_run: bool,
},
CopilotInfo {
#[arg(long)]
session_dir: Option<String>,
#[arg(long)]
json: bool,
},
#[command(visible_alias = "b")]
Backups {
path: Option<String>,
#[arg(long)]
dry_run: bool,
#[arg(long, short)]
force: bool,
},
#[command(visible_alias = "r")]
Recursive {
path: Option<String>,
#[arg(long, short)]
depth: Option<usize>,
#[arg(long, short)]
force: bool,
#[arg(long)]
dry_run: bool,
#[arg(long, short = 'x')]
exclude: Vec<String>,
#[arg(long)]
register: bool,
},
}
#[derive(Subcommand)]
pub enum ShardCommands {
Session {
file: String,
#[arg(long, short = 'n')]
max_requests: Option<usize>,
#[arg(long, short = 's')]
max_size: Option<String>,
#[arg(long, short = 'o')]
output: Option<String>,
#[arg(long)]
update_index: bool,
#[arg(long, short = 'w')]
workspace: Option<String>,
#[arg(long)]
dry_run: bool,
#[arg(long)]
no_backup: bool,
},
Workspace {
#[arg(long, short = 'w')]
workspace: Option<String>,
#[arg(long, short = 'n')]
max_requests: Option<usize>,
#[arg(long, short = 's')]
max_size: Option<String>,
#[arg(long)]
dry_run: bool,
#[arg(long)]
no_backup: bool,
},
Info {
file: String,
},
}
#[derive(Subcommand)]
pub enum ApiCommands {
Serve {
#[arg(long, default_value = "0.0.0.0")]
host: String,
#[arg(short, long, default_value = "8787")]
port: u16,
#[arg(long)]
database: Option<String>,
},
}
#[derive(Subcommand)]
pub enum AgencyCommands {
List {
#[arg(short, long)]
verbose: bool,
},
Info {
name: String,
},
Modes,
Run {
#[arg(short, long, default_value = "assistant")]
agent: String,
prompt: String,
#[arg(short, long)]
model: Option<String>,
#[arg(long, default_value = "single")]
orchestration: String,
#[arg(short, long)]
verbose: bool,
},
Create {
name: String,
#[arg(short, long, default_value = "custom")]
role: String,
#[arg(short, long)]
instruction: Option<String>,
#[arg(short, long)]
model: Option<String>,
},
Tools,
Templates,
}
#[derive(Subcommand)]
pub enum TelemetryCommands {
#[command(visible_alias = "status")]
Info,
#[command(visible_alias = "enable")]
OptIn,
#[command(visible_alias = "disable")]
OptOut,
Reset,
#[command(visible_alias = "log")]
Record {
#[arg(short, long, default_value = "custom")]
category: String,
#[arg(short, long)]
event: String,
#[arg(short, long)]
data: Option<String>,
#[arg(short = 'k', long = "kv", value_parser = parse_key_value)]
kv: Vec<(String, String)>,
#[arg(short, long)]
tags: Vec<String>,
#[arg(long)]
context: Option<String>,
#[arg(short, long)]
verbose: bool,
},
#[command(visible_alias = "logs")]
Show {
#[arg(short, long)]
category: Option<String>,
#[arg(short, long)]
event: Option<String>,
#[arg(short, long)]
tag: Option<String>,
#[arg(short = 'n', long, default_value = "20")]
limit: usize,
#[arg(short, long, default_value = "table")]
format: String,
#[arg(long)]
after: Option<String>,
#[arg(long)]
before: Option<String>,
},
Export {
output: String,
#[arg(short, long, default_value = "jsonl")]
format: String,
#[arg(short, long)]
category: Option<String>,
#[arg(long)]
with_metadata: bool,
},
Clear {
#[arg(short, long)]
force: bool,
#[arg(long)]
older_than: Option<u32>,
},
Config {
#[arg(long)]
endpoint: Option<String>,
#[arg(long)]
api_key: Option<String>,
#[arg(long)]
enable_remote: bool,
#[arg(long)]
disable_remote: bool,
},
Sync {
#[arg(short = 'n', long)]
limit: Option<usize>,
#[arg(long)]
clear_after: bool,
},
Test,
}
#[derive(Subcommand)]
pub enum InspectCommands {
Index {
#[arg(long)]
path: Option<String>,
#[arg(long, short = 'w')]
workspace_id: Option<String>,
#[arg(long)]
json: bool,
},
Memento {
#[arg(long)]
path: Option<String>,
#[arg(long, short = 'w')]
workspace_id: Option<String>,
#[arg(long)]
json: bool,
},
Cache {
#[arg(long)]
path: Option<String>,
#[arg(long, short = 'w')]
workspace_id: Option<String>,
#[arg(long)]
json: bool,
},
Validate {
#[arg(long)]
path: Option<String>,
#[arg(long, short = 'w')]
workspace_id: Option<String>,
#[arg(long)]
json: bool,
},
Keys {
#[arg(long)]
path: Option<String>,
#[arg(long, short = 'w')]
workspace_id: Option<String>,
#[arg(long, short)]
all: bool,
#[arg(long)]
json: bool,
},
Files {
#[arg(long)]
path: Option<String>,
#[arg(long, short = 'w')]
workspace_id: Option<String>,
#[arg(long)]
json: bool,
},
#[command(visible_alias = "fix")]
Rebuild {
#[arg(long)]
path: Option<String>,
#[arg(long, short = 'w')]
workspace_id: Option<String>,
#[arg(long)]
dry_run: bool,
#[arg(long)]
json: bool,
},
}
fn parse_key_value(s: &str) -> std::result::Result<(String, String), String> {
let pos = s
.find('=')
.ok_or_else(|| format!("invalid key=value pair: no '=' found in '{s}'"))?;
Ok((s[..pos].to_string(), s[pos + 1..].to_string()))
}
#[derive(Subcommand)]
pub enum SchemaCommands {
#[command(visible_alias = "ls")]
List {
#[arg(long, short = 'p')]
provider: Option<String>,
#[arg(long)]
json: bool,
},
Show {
schema_id: String,
#[arg(long)]
json: bool,
},
Detect {
#[arg(long)]
path: Option<String>,
#[arg(long, short = 'w')]
workspace_id: Option<String>,
#[arg(long)]
json: bool,
},
Export {
#[arg(long)]
compact: bool,
#[arg(long, short = 'o')]
output: Option<String>,
},
Ontology {
#[arg(long)]
json: bool,
},
Mappings {
#[arg(long, short = 's')]
source: Option<String>,
#[arg(long, short = 't')]
target: Option<String>,
#[arg(long)]
tag: Option<String>,
#[arg(long)]
json: bool,
},
}
#[derive(Clone, Debug, clap::ValueEnum)]
pub enum CompletionShell {
Bash,
Zsh,
Fish,
Powershell,
Elvish,
}