use clap::{Parser, Subcommand, ValueEnum};
use std::path::PathBuf;
#[derive(Parser)]
#[command(name = "grite", about = "Git-backed issue tracking", version)]
pub struct Cli {
#[arg(long, global = true)]
pub json: bool,
#[arg(long, global = true)]
pub quiet: bool,
#[arg(long, global = true)]
pub data_dir: Option<PathBuf>,
#[arg(long, global = true)]
pub actor: Option<String>,
#[arg(long, global = true)]
pub no_daemon: bool,
#[command(subcommand)]
pub command: Command,
}
#[derive(Subcommand)]
pub enum Command {
Init {
#[arg(long)]
no_agents_md: bool,
},
Actor {
#[command(subcommand)]
cmd: ActorCommand,
},
Issue {
#[command(subcommand)]
cmd: IssueCommand,
},
Db {
#[command(subcommand)]
cmd: DbCommand,
},
Export {
#[arg(long)]
format: ExportFormat,
#[arg(long)]
since: Option<String>,
},
Rebuild {
#[arg(long)]
from_snapshot: bool,
},
Sync {
#[arg(long, default_value = "origin")]
remote: String,
#[arg(long)]
pull: bool,
#[arg(long)]
push: bool,
},
Snapshot {
#[command(subcommand)]
cmd: SnapshotCommand,
},
Daemon {
#[command(subcommand)]
cmd: DaemonCommand,
},
Lock {
#[command(subcommand)]
cmd: LockCommand,
},
Doctor {
#[arg(long)]
fix: bool,
},
Context {
#[command(subcommand)]
cmd: ContextCommand,
},
InstallSkill {
#[arg(long)]
global: bool,
#[arg(long)]
force: bool,
},
}
#[derive(Clone, Subcommand)]
pub enum ActorCommand {
Init {
#[arg(long)]
label: Option<String>,
#[arg(long)]
generate_key: bool,
},
List,
Show {
id: Option<String>,
},
Current,
Use {
id: String,
},
}
#[derive(Clone, Subcommand)]
pub enum IssueCommand {
Create {
#[arg(long, allow_hyphen_values = true)]
title: String,
#[arg(long, default_value = "", allow_hyphen_values = true)]
body: String,
#[arg(long)]
label: Vec<String>,
},
List {
#[arg(long)]
state: Option<String>,
#[arg(long)]
label: Option<String>,
},
Show {
id: String,
},
Update {
id: String,
#[arg(long, allow_hyphen_values = true)]
title: Option<String>,
#[arg(long, allow_hyphen_values = true)]
body: Option<String>,
#[arg(long)]
lock: bool,
},
Comment {
id: String,
#[arg(long, allow_hyphen_values = true)]
body: String,
#[arg(long)]
lock: bool,
},
Close {
id: String,
#[arg(long)]
lock: bool,
},
Reopen {
id: String,
#[arg(long)]
lock: bool,
},
Label {
#[command(subcommand)]
cmd: LabelCommand,
},
Assignee {
#[command(subcommand)]
cmd: AssigneeCommand,
},
Link {
#[command(subcommand)]
cmd: LinkCommand,
},
Attachment {
#[command(subcommand)]
cmd: AttachmentCommand,
},
Dep {
#[command(subcommand)]
cmd: DepCommand,
},
}
#[derive(Clone, Subcommand)]
pub enum LabelCommand {
Add {
id: String,
#[arg(long)]
label: String,
#[arg(long)]
lock: bool,
},
Remove {
id: String,
#[arg(long)]
label: String,
#[arg(long)]
lock: bool,
},
}
#[derive(Clone, Subcommand)]
pub enum AssigneeCommand {
Add {
id: String,
#[arg(long)]
user: String,
#[arg(long)]
lock: bool,
},
Remove {
id: String,
#[arg(long)]
user: String,
#[arg(long)]
lock: bool,
},
}
#[derive(Clone, Subcommand)]
pub enum LinkCommand {
Add {
id: String,
#[arg(long)]
url: String,
#[arg(long, allow_hyphen_values = true)]
note: Option<String>,
#[arg(long)]
lock: bool,
},
}
#[derive(Clone, Subcommand)]
pub enum AttachmentCommand {
Add {
id: String,
#[arg(long)]
name: String,
#[arg(long)]
sha256: String,
#[arg(long)]
mime: String,
#[arg(long)]
lock: bool,
},
}
#[derive(Clone, Subcommand)]
pub enum DbCommand {
Stats,
Check {
#[arg(long)]
verify_parents: bool,
},
Verify {
#[arg(long)]
verbose: bool,
},
}
#[derive(Clone, Subcommand)]
pub enum SnapshotCommand {
Create,
List,
Gc {
#[arg(long, default_value = "5")]
keep: usize,
},
}
#[derive(Clone, ValueEnum)]
pub enum ExportFormat {
Json,
Md,
}
#[derive(Clone, Subcommand)]
pub enum DaemonCommand {
Start {
#[arg(long, default_value = "300")]
idle_timeout: u64,
},
Status,
Stop,
}
#[derive(Clone, Subcommand)]
pub enum LockCommand {
Acquire {
resource: String,
#[arg(long, default_value = "300")]
ttl: u64,
},
Release {
resource: String,
},
Renew {
resource: String,
#[arg(long, default_value = "300")]
ttl: u64,
},
Status,
Gc,
}
#[derive(Clone, Subcommand)]
pub enum DepCommand {
Add {
id: String,
#[arg(long)]
target: String,
#[arg(long, default_value = "depends_on")]
r#type: String,
#[arg(long)]
lock: bool,
},
Remove {
id: String,
#[arg(long)]
target: String,
#[arg(long, default_value = "depends_on")]
r#type: String,
#[arg(long)]
lock: bool,
},
List {
id: String,
#[arg(long)]
reverse: bool,
},
Topo {
#[arg(long)]
state: Option<String>,
#[arg(long)]
label: Option<String>,
},
}
#[derive(Clone, Subcommand)]
pub enum ContextCommand {
Index {
#[arg(long)]
path: Vec<String>,
#[arg(long)]
force: bool,
#[arg(long)]
pattern: Option<String>,
},
Query {
query: String,
},
Show {
path: String,
},
Project {
key: Option<String>,
},
Set {
key: String,
value: String,
},
}