use std::path::PathBuf;
use clap::{Args, Parser, Subcommand, ValueEnum, ValueHint};
#[derive(Debug, Parser)]
#[command(
name = "agent-scope-lock",
version,
about = "Create and validate deterministic agent edit-scope locks.",
disable_help_subcommand = true,
after_help = "Examples:\n agent-scope-lock create --path crates/agent-scope-lock --path Cargo.toml --owner T3\n agent-scope-lock read\n agent-scope-lock validate --changes all\n agent-scope-lock validate --format json\n agent-scope-lock clear"
)]
pub struct Cli {
#[command(subcommand)]
pub command: Command,
}
#[derive(Debug, Subcommand)]
pub enum Command {
Create(CreateArgs),
Read(CommonArgs),
Validate(ValidateArgs),
Clear(CommonArgs),
Completion(CompletionArgs),
}
#[derive(Debug, Args)]
pub struct CommonArgs {
#[arg(long = "lock-file", value_name = "PATH", value_hint = ValueHint::FilePath)]
pub lock_file: Option<PathBuf>,
#[arg(long, value_enum, default_value_t = OutputFormat::Text)]
pub format: OutputFormat,
}
#[derive(Debug, Args)]
pub struct CreateArgs {
#[command(flatten)]
pub common: CommonArgs,
#[arg(long = "path", value_name = "PATH", value_hint = ValueHint::AnyPath)]
pub paths: Vec<PathBuf>,
#[arg(long, value_name = "OWNER")]
pub owner: Option<String>,
#[arg(long, value_name = "NOTE")]
pub note: Option<String>,
#[arg(long)]
pub force: bool,
}
#[derive(Debug, Args)]
pub struct ValidateArgs {
#[command(flatten)]
pub common: CommonArgs,
#[arg(long, value_enum, default_value_t = ChangeMode::All)]
pub changes: ChangeMode,
}
#[derive(Debug, Args)]
pub struct CompletionArgs {
#[arg(value_enum)]
pub shell: crate::completion::CompletionShell,
}
#[derive(Clone, Copy, Debug, Eq, PartialEq, ValueEnum)]
#[value(rename_all = "kebab-case")]
pub enum OutputFormat {
Text,
Json,
}
#[derive(Clone, Copy, Debug, Eq, PartialEq, ValueEnum)]
#[value(rename_all = "kebab-case")]
pub enum ChangeMode {
All,
Staged,
Unstaged,
}