use clap::{Parser, Subcommand};
use clap_complete::Shell;
use bears::task::{Priority, Status};
#[derive(Parser)]
#[command(
name = "bea",
about = "Bears 🐻🐻 - A file-based task tracker CLI and MCP server for AI agent workflows"
)]
#[command(version, propagate_version = true)]
pub struct Args {
#[command(subcommand)]
pub command: Command,
#[arg(long, global = true)]
pub json: bool,
}
#[derive(Subcommand, PartialEq)]
pub enum Command {
Init {
#[arg(long)]
claude: bool,
#[arg(long)]
copilot: bool,
#[arg(long)]
codex: bool,
#[arg(long)]
force: bool,
},
Agent {
#[arg(value_enum)]
category: AgentCategory,
#[arg(long)]
claude: bool,
#[arg(long)]
copilot: bool,
#[arg(long)]
codex: bool,
#[arg(long)]
force: bool,
#[arg(long, conflicts_with = "force")]
append: bool,
},
Create {
title: String,
#[arg(long, default_value = "P2")]
priority: Priority,
#[arg(long, value_delimiter = ',')]
tag: Vec<String>,
#[arg(long = "depends-on", value_delimiter = ',')]
depends_on: Vec<String>,
#[arg(long)]
parent: Option<String>,
#[arg(long)]
body: Option<String>,
#[arg(long)]
epic: bool,
},
List {
#[arg(long)]
status: Option<Status>,
#[arg(long)]
priority: Option<Priority>,
#[arg(long)]
tag: Option<String>,
#[arg(long)]
epic: Option<String>,
#[arg(long, short = 'a')]
all: bool,
#[arg(long, conflicts_with_all = ["status", "priority", "tag", "epic", "all"])]
archived: bool,
},
Ready {
#[arg(long)]
tag: Option<String>,
#[arg(long)]
epic: Option<String>,
#[arg(long)]
limit: Option<usize>,
},
Epics,
Show {
id: String,
#[arg(long)]
plan: bool,
},
Update {
id: String,
#[arg(long)]
status: Option<Status>,
#[arg(long)]
priority: Option<Priority>,
#[arg(long, value_delimiter = ',')]
tag: Option<Vec<String>>,
#[arg(long)]
assignee: Option<String>,
#[arg(long)]
body: Option<String>,
#[arg(long)]
title: Option<String>,
#[arg(long)]
parent: Option<String>,
},
Status {
id: String,
status: Status,
},
Start {
id: String,
},
Done {
id: String,
},
Dep {
#[command(subcommand)]
command: DepCommand,
},
Graph {
#[arg(long, short = 'a')]
all: bool,
},
Delete {
id: String,
},
Search {
query: String,
#[arg(long, short = 'a')]
all: bool,
},
Cancel {
id: String,
},
Prune {
#[arg(long)]
done: bool,
},
Archive {
id: Option<String>,
},
Restore {
id: String,
},
Log {
#[arg(long)]
limit: Option<usize>,
},
Edit {
id: String,
},
Completions {
shell: Shell,
},
Mcp,
Tui,
}
#[derive(Subcommand, PartialEq)]
pub enum DepCommand {
Add {
id: String,
depends_on: String,
},
Remove {
id: String,
depends_on: String,
},
Tree {
id: String,
},
}
#[derive(clap::ValueEnum, Clone, Copy, PartialEq, Eq, Debug)]
pub enum AgentCategory {
Instructions,
Skills,
All,
}
impl From<AgentCategory> for bears::scaffold::Category {
fn from(c: AgentCategory) -> Self {
match c {
AgentCategory::Instructions => bears::scaffold::Category::Instructions,
AgentCategory::Skills => bears::scaffold::Category::Skills,
AgentCategory::All => bears::scaffold::Category::All,
}
}
}