use clap::{Args, Parser, Subcommand};
use crate::core::{Harness, RunMode};
#[derive(Debug, Parser)]
#[command(
name = "eval-magic",
version,
about = "Run skill evals — measure whether an agent skill actually shifts behavior.",
after_help = super::help::AFTER_HELP
)]
pub(crate) struct Cli {
#[command(subcommand)]
pub command: Option<Commands>,
}
#[derive(Debug, Args)]
pub struct CommonArgs {
#[arg(long)]
pub skill_dir: Option<String>,
#[arg(long)]
pub skill: Option<String>,
#[arg(long)]
pub iteration: Option<u32>,
#[arg(long)]
pub mode: Option<String>,
#[arg(long)]
pub harness: Option<Harness>,
#[arg(long)]
pub run_mode: Option<RunMode>,
#[arg(long)]
pub workspace_dir: Option<String>,
#[arg(long)]
pub subagents_dir: Option<String>,
#[arg(long)]
pub session_id: Option<String>,
#[arg(long)]
pub only: Option<String>,
#[arg(long)]
pub skip: Option<String>,
#[arg(long)]
pub overwrite: bool,
}
#[derive(Debug, Args)]
pub struct ValidateArgs {
#[arg(long)]
pub skill_dir: Option<String>,
#[arg(long)]
pub skill: Option<String>,
}
#[derive(Debug, Args)]
pub struct InitArgs {
#[arg(long)]
pub skill_dir: Option<String>,
#[arg(long)]
pub skill: Option<String>,
#[arg(long)]
pub id: Option<String>,
#[arg(long)]
pub prompt: Option<String>,
#[arg(long = "expected-output")]
pub expected_output: Option<String>,
#[arg(long)]
pub skill_should_trigger: Option<bool>,
#[arg(long)]
pub force: bool,
}
#[derive(Debug, Args)]
pub struct GradeArgs {
#[command(flatten)]
pub common: CommonArgs,
#[arg(long)]
pub finalize: bool,
}
#[derive(Debug, Args)]
pub struct SwitchConditionArgs {
#[command(flatten)]
pub common: CommonArgs,
#[arg(long)]
pub condition: String,
}
#[derive(Debug, Args)]
pub struct ResetBatchArgs {
#[command(flatten)]
pub common: CommonArgs,
#[arg(long)]
pub group: String,
}
#[derive(Debug, Args)]
pub struct SnapshotArgs {
#[command(flatten)]
pub common: CommonArgs,
#[arg(long)]
pub label: Option<String>,
#[arg(long = "ref")]
pub reference: Option<String>,
}
#[derive(Debug, Args)]
pub struct PromoteBaselineArgs {
#[command(flatten)]
pub common: CommonArgs,
#[arg(long)]
pub label: Option<String>,
#[arg(long)]
pub agent_model: Option<String>,
#[arg(long)]
pub judge_model: Option<String>,
}
#[derive(Debug, Args)]
pub struct RunArgs {
#[command(flatten)]
pub common: CommonArgs,
#[arg(long)]
pub baseline: Option<String>,
#[arg(long)]
pub bootstrap: Option<String>,
#[arg(long)]
pub dry_run: bool,
#[arg(long)]
pub no_stage: bool,
#[arg(long)]
pub guard: bool,
#[arg(long)]
pub stage_name: Option<String>,
#[arg(long)]
pub plan_mode: bool,
#[arg(long, default_value_t = 1, value_parser = clap::value_parser!(u32).range(1..))]
pub runs: u32,
#[arg(long)]
pub agent_model: Option<String>,
#[arg(long)]
pub judge_model: Option<String>,
#[arg(long)]
pub label: Option<String>,
}
#[derive(Debug, Subcommand)]
pub(crate) enum Commands {
Run(RunArgs),
Snapshot(SnapshotArgs),
Teardown(CommonArgs),
TeardownGuard(CommonArgs),
Ingest(CommonArgs),
Finalize(CommonArgs),
SwitchCondition(SwitchConditionArgs),
ResetBatch(ResetBatchArgs),
RecordRuns(CommonArgs),
FillTranscripts(CommonArgs),
DetectStrayWrites(CommonArgs),
Grade(GradeArgs),
Aggregate(CommonArgs),
Init(InitArgs),
PromoteBaseline(PromoteBaselineArgs),
Validate(ValidateArgs),
#[command(hide = true)]
Guard {
marker: Option<String>,
},
#[command(hide = true)]
GuardCodex {
marker: Option<String>,
},
}