use clap::{Parser, Subcommand};
use crate::domain::task::{Priority, TaskType};
#[derive(Parser)]
#[command(
name = "cn",
about = "Chronis — the agent-native task CLI",
long_about = "Chronis — the agent-native task CLI. Event-sourced, TOON-optimized.\n\n\
Inspired by beads_rust. Every action is an immutable event.\n\
State is derived from projections over the event stream.\n\n\
TOON OUTPUT (the key differentiator):\n \
Pass --toon to ANY command for TOON (Token-Oriented Object Notation).\n \
~50% fewer tokens than JSON — pipe-delimited, no braces, no quotes.\n \
Lists: [id|type|title|pri|status|...]\\n val|val|val\n \
Details: key:value lines\n \
Actions: ok:verb:id (single-line ack)\n\n\
AGENT WORKFLOW (4 commands, ~20 tokens overhead):\n \
cn ready --toon → pick a task from TOON table\n \
cn claim <id> --toon → ok:claimed:<id>\n \
cn done <id> --toon → ok:done:<id>\n \
cn list --toon → verify final state\n\n\
QUICK REFERENCE:\n \
cn task create <title> Create task (-p priority, -t type, --parent, --blocked-by, -d desc)\n \
cn list [--status=S] List tasks (--archived, --all, --toon)\n \
cn ready Open + unblocked tasks\n \
cn show <id> Task detail + event timeline\n \
cn claim <id> Claim task (--cascade for epics)\n \
cn done <id> Complete task (--reason, --cascade)\n \
cn approve <id> Approve task\n \
cn archive [ids..] Archive tasks (--all-done, --done-before <days>)\n \
cn unarchive [ids..] Restore archived tasks\n \
cn dep add|remove Manage blockers\n \
cn sync Git-based sync (pull→import→export→push)\n \
cn tui Interactive TUI\n \
cn serve Web viewer\n\n\
MIGRATE FROM BEADS:\n \
cn migrate-beads Import .beads/issues.jsonl → chronis events"
)]
pub struct Cli {
#[arg(long, global = true)]
pub toon: bool,
#[command(subcommand)]
pub command: Command,
}
#[derive(Subcommand)]
pub enum Command {
Init,
Task(TaskArgs),
#[command(visible_alias = "ls")]
List(ListArgs),
#[command(visible_alias = "s")]
Show(ShowArgs),
#[command(visible_alias = "r")]
Ready,
#[command(visible_alias = "c")]
Claim(ClaimArgs),
#[command(visible_alias = "d")]
Done(DoneArgs),
Approve(ApproveArgs),
Archive(ArchiveArgs),
Unarchive(UnarchiveArgs),
Dep(DepArgs),
MigrateBeads(MigrateBeadsArgs),
Sync(SyncArgs),
Tui,
Serve(ServeArgs),
}
#[derive(clap::Args)]
pub struct TaskArgs {
#[command(subcommand)]
pub subcommand: TaskCommands,
}
#[derive(Subcommand)]
pub enum TaskCommands {
Create(CreateArgs),
}
#[derive(clap::Args)]
pub struct CreateArgs {
pub title: String,
#[arg(short, long, default_value = "p2")]
pub priority: Priority,
#[arg(long, value_delimiter = ',')]
pub blocked_by: Vec<String>,
#[arg(short = 't', long = "type", default_value = "task")]
pub task_type: TaskType,
#[arg(long)]
pub parent: Option<String>,
#[arg(short = 'd', long)]
pub description: Option<String>,
}
#[derive(clap::Args)]
pub struct ListArgs {
#[arg(short, long)]
pub status: Option<String>,
#[arg(short = 't', long = "type")]
pub task_type: Option<String>,
#[arg(long)]
pub archived: bool,
#[arg(long)]
pub all: bool,
}
#[derive(clap::Args)]
pub struct ShowArgs {
pub id: String,
}
#[derive(clap::Args)]
pub struct ClaimArgs {
pub id: String,
#[arg(long)]
pub cascade: bool,
}
#[derive(clap::Args)]
pub struct DoneArgs {
pub id: String,
#[arg(long)]
pub reason: Option<String>,
#[arg(long)]
pub cascade: bool,
}
#[derive(clap::Args)]
pub struct ApproveArgs {
pub id: String,
}
#[derive(clap::Args)]
pub struct ArchiveArgs {
pub ids: Vec<String>,
#[arg(long)]
pub all_done: bool,
#[arg(long, value_name = "DAYS")]
pub done_before: Option<u64>,
}
#[derive(clap::Args)]
pub struct UnarchiveArgs {
pub ids: Vec<String>,
}
#[derive(clap::Args)]
pub struct DepArgs {
#[command(subcommand)]
pub subcommand: DepCommands,
}
#[derive(Subcommand)]
pub enum DepCommands {
Add(DepAddArgs),
Remove(DepRemoveArgs),
}
#[derive(clap::Args)]
pub struct DepAddArgs {
pub task_id: String,
pub blocker_id: String,
}
#[derive(clap::Args)]
pub struct DepRemoveArgs {
pub task_id: String,
pub blocker_id: String,
}
#[derive(clap::Args)]
pub struct MigrateBeadsArgs {
#[arg(long, default_value = ".beads")]
pub beads_dir: String,
}
#[derive(clap::Args)]
pub struct SyncArgs {
#[arg(long, default_value_t = true)]
pub git: bool,
}
#[derive(clap::Args)]
pub struct ServeArgs {
#[arg(short, long, default_value = "3905")]
pub port: u16,
#[arg(long)]
pub open: bool,
}