refactor(cli): deglobalize server and storage target flags

Move --storage-dir and --server-url off GlobalArgs and onto the
leaf commands that actually honor them.

This aligns help, parser behavior, and env-var wiring with the
current command architecture while preserving the intended model
and exec targeting semantics.
This commit is contained in:
Bryan Helmkamp 2026-04-05 16:06:42 -04:00
parent 260460aebf
commit afc53a421d
No known key found for this signature in database
98 changed files with 871 additions and 706 deletions

View file

@ -1,5 +1,5 @@
use std::fmt;
use std::path::PathBuf;
use std::path::{Path, PathBuf};
use clap::{Args, Subcommand, ValueEnum};
use fabro_agent::cli::AgentArgs;
@ -35,19 +35,6 @@ pub(crate) struct GlobalArgs {
/// Enable verbose output
#[arg(long, global = true, env = "FABRO_VERBOSE", value_parser = clap::builder::BoolishValueParser::new(), conflicts_with = "quiet")]
pub verbose: bool,
/// Local storage directory (default: ~/.fabro)
#[arg(long, global = true, env = "FABRO_STORAGE_DIR")]
pub storage_dir: Option<PathBuf>,
/// Fabro API server URL (overrides server.base_url from user.toml when supported)
#[arg(
long,
global = true,
env = "FABRO_SERVER_URL",
conflicts_with = "storage_dir"
)]
pub server_url: Option<String>,
}
impl GlobalArgs {
@ -57,6 +44,57 @@ impl GlobalArgs {
}
}
#[derive(Args, Debug, Clone, Default)]
pub(crate) struct StorageDirArgs {
/// Local storage directory (default: ~/.fabro)
#[arg(long, env = "FABRO_STORAGE_DIR")]
pub(crate) storage_dir: Option<PathBuf>,
}
impl StorageDirArgs {
pub(crate) fn as_deref(&self) -> Option<&Path> {
self.storage_dir.as_deref()
}
pub(crate) fn clone_path(&self) -> Option<PathBuf> {
self.storage_dir.clone()
}
}
#[derive(Args, Debug, Clone, Default)]
pub(crate) struct ServerUrlArgs {
/// Fabro API server URL (overrides server.base_url from user.toml when supported)
#[arg(long, env = "FABRO_SERVER_URL")]
pub(crate) server_url: Option<String>,
}
impl ServerUrlArgs {
pub(crate) fn as_deref(&self) -> Option<&str> {
self.server_url.as_deref()
}
}
#[derive(Args, Debug, Clone, Default)]
pub(crate) struct ModelTargetArgs {
/// Local storage directory (default: ~/.fabro)
#[arg(long, env = "FABRO_STORAGE_DIR", conflicts_with = "server_url")]
pub(crate) storage_dir: Option<PathBuf>,
/// Fabro API server URL (overrides server.base_url from user.toml when supported)
#[arg(long, env = "FABRO_SERVER_URL", conflicts_with = "storage_dir")]
pub(crate) server_url: Option<String>,
}
impl ModelTargetArgs {
pub(crate) fn storage_dir(&self) -> Option<&Path> {
self.storage_dir.as_deref()
}
pub(crate) fn server_url(&self) -> Option<&str> {
self.server_url.as_deref()
}
}
#[derive(Debug, Clone, Copy, ValueEnum)]
pub(crate) enum CliSandboxProvider {
Local,
@ -86,6 +124,9 @@ impl From<fabro_sandbox::SandboxProvider> for CliSandboxProvider {
#[derive(Args)]
pub(crate) struct RunArgs {
#[command(flatten)]
pub(crate) storage_dir: StorageDirArgs,
/// Path to a .fabro workflow file or .toml task config
#[arg(required = true)]
pub(crate) workflow: Option<PathBuf>,
@ -145,6 +186,9 @@ pub(crate) struct RunArgs {
#[derive(Args)]
pub(crate) struct PreflightArgs {
#[command(flatten)]
pub(crate) storage_dir: StorageDirArgs,
/// Path to a .fabro workflow file or .toml task config
pub(crate) workflow: PathBuf,
@ -194,6 +238,9 @@ pub(crate) struct RunFilterArgs {
#[derive(Args)]
pub(crate) struct RunsListArgs {
#[command(flatten)]
pub(crate) storage_dir: StorageDirArgs,
#[command(flatten)]
pub(crate) filter: RunFilterArgs,
@ -208,6 +255,9 @@ pub(crate) struct RunsListArgs {
#[derive(Args)]
pub(crate) struct RunsRemoveArgs {
#[command(flatten)]
pub(crate) storage_dir: StorageDirArgs,
/// Run IDs or workflow names to remove
#[arg(required = true)]
pub(crate) runs: Vec<String>,
@ -219,6 +269,9 @@ pub(crate) struct RunsRemoveArgs {
#[derive(Args)]
pub(crate) struct LogsArgs {
#[command(flatten)]
pub(crate) storage_dir: StorageDirArgs,
/// Run ID prefix or workflow name (most recent run)
pub(crate) run: String,
/// Follow log output
@ -308,6 +361,9 @@ pub(crate) struct ParseArgs {
#[derive(Args)]
pub(crate) struct ArtifactListArgs {
#[command(flatten)]
pub(crate) storage_dir: StorageDirArgs,
/// Run ID (or prefix)
pub(crate) run_id: String,
@ -322,6 +378,9 @@ pub(crate) struct ArtifactListArgs {
#[derive(Args)]
pub(crate) struct ArtifactCpArgs {
#[command(flatten)]
pub(crate) storage_dir: StorageDirArgs,
/// Source: RUN_ID (all artifacts) or RUN_ID:path (specific artifact)
pub(crate) source: String,
@ -344,6 +403,9 @@ pub(crate) struct ArtifactCpArgs {
#[derive(Args)]
pub(crate) struct CpArgs {
#[command(flatten)]
pub(crate) storage_dir: StorageDirArgs,
/// Source: <run-id>:<path> or local path
pub(crate) src: String,
/// Destination: <run-id>:<path> or local path
@ -355,6 +417,9 @@ pub(crate) struct CpArgs {
#[derive(Args)]
pub(crate) struct PreviewArgs {
#[command(flatten)]
pub(crate) storage_dir: StorageDirArgs,
/// Run ID or prefix
pub(crate) run: String,
/// Port number
@ -372,6 +437,9 @@ pub(crate) struct PreviewArgs {
#[derive(Args)]
pub(crate) struct SshArgs {
#[command(flatten)]
pub(crate) storage_dir: StorageDirArgs,
/// Run ID or prefix
pub(crate) run: String,
/// SSH access expiry in minutes (default 60)
@ -384,6 +452,9 @@ pub(crate) struct SshArgs {
#[derive(Args)]
pub(crate) struct DiffArgs {
#[command(flatten)]
pub(crate) storage_dir: StorageDirArgs,
/// Run ID or prefix
pub(crate) run: String,
/// Show diff for a specific node
@ -399,12 +470,18 @@ pub(crate) struct DiffArgs {
#[derive(Args)]
pub(crate) struct InspectArgs {
#[command(flatten)]
pub(crate) storage_dir: StorageDirArgs,
/// Run ID prefix or workflow name (most recent run)
pub(crate) run: String,
}
#[derive(Args)]
pub(crate) struct StoreDumpArgs {
#[command(flatten)]
pub(crate) storage_dir: StorageDirArgs,
/// Run ID prefix or workflow name
pub(crate) run: String,
@ -442,6 +519,9 @@ pub(crate) struct SecretSetArgs {
#[derive(Debug, Args)]
pub(crate) struct ResumeArgs {
#[command(flatten)]
pub(crate) storage_dir: StorageDirArgs,
/// Run ID or unambiguous prefix
pub(crate) run: String,
@ -452,6 +532,9 @@ pub(crate) struct ResumeArgs {
#[derive(Debug, Args)]
pub(crate) struct RewindArgs {
#[command(flatten)]
pub(crate) storage_dir: StorageDirArgs,
/// Run ID (or unambiguous prefix)
pub(crate) run_id: String,
@ -469,6 +552,9 @@ pub(crate) struct RewindArgs {
#[derive(Debug, Args)]
pub(crate) struct ForkArgs {
#[command(flatten)]
pub(crate) storage_dir: StorageDirArgs,
/// Run ID (or unambiguous prefix)
pub(crate) run_id: String,
@ -486,6 +572,9 @@ pub(crate) struct ForkArgs {
#[derive(Args)]
pub(crate) struct WaitArgs {
#[command(flatten)]
pub(crate) storage_dir: StorageDirArgs,
/// Run ID prefix or workflow name (most recent run)
pub(crate) run: String,
@ -520,6 +609,9 @@ pub(crate) struct ProviderLoginArgs {
#[derive(Args)]
pub(crate) struct RunsPruneArgs {
#[command(flatten)]
pub(crate) storage_dir: StorageDirArgs,
#[command(flatten)]
pub(crate) filter: RunFilterArgs,
@ -538,6 +630,9 @@ pub(crate) struct RunsPruneArgs {
#[derive(Args)]
pub(crate) struct DfArgs {
#[command(flatten)]
pub(crate) storage_dir: StorageDirArgs,
/// Show per-run breakdown
#[arg(short, long)]
pub(crate) verbose: bool,
@ -545,6 +640,9 @@ pub(crate) struct DfArgs {
#[derive(Args)]
pub(crate) struct SettingsArgs {
#[command(flatten)]
pub(crate) storage_dir: StorageDirArgs,
/// Optional workflow name, .fabro path, or .toml run config to overlay
pub(crate) workflow: Option<PathBuf>,
}
@ -578,6 +676,9 @@ pub(crate) struct SkillInstallArgs {
#[derive(Args)]
pub(crate) struct PrCreateArgs {
#[command(flatten)]
pub(crate) storage_dir: StorageDirArgs,
/// Run ID or prefix
pub(crate) run_id: String,
/// LLM model for generating PR description
@ -587,6 +688,9 @@ pub(crate) struct PrCreateArgs {
#[derive(Args)]
pub(crate) struct PrListArgs {
#[command(flatten)]
pub(crate) storage_dir: StorageDirArgs,
/// Show all PRs (including closed/merged), not just open
#[arg(long)]
pub(crate) all: bool,
@ -594,12 +698,18 @@ pub(crate) struct PrListArgs {
#[derive(Args)]
pub(crate) struct PrViewArgs {
#[command(flatten)]
pub(crate) storage_dir: StorageDirArgs,
/// Run ID or prefix
pub(crate) run_id: String,
}
#[derive(Args)]
pub(crate) struct PrMergeArgs {
#[command(flatten)]
pub(crate) storage_dir: StorageDirArgs,
/// Run ID or prefix
pub(crate) run_id: String,
/// Merge method: merge, squash, or rebase
@ -609,10 +719,85 @@ pub(crate) struct PrMergeArgs {
#[derive(Args)]
pub(crate) struct PrCloseArgs {
#[command(flatten)]
pub(crate) storage_dir: StorageDirArgs,
/// Run ID or prefix
pub(crate) run_id: String,
}
#[derive(Args)]
pub(crate) struct StartArgs {
#[command(flatten)]
pub(crate) storage_dir: StorageDirArgs,
/// Run ID prefix or workflow name
pub(crate) run: String,
}
#[derive(Args)]
pub(crate) struct AttachArgs {
#[command(flatten)]
pub(crate) storage_dir: StorageDirArgs,
/// Run ID prefix or workflow name
pub(crate) run: String,
}
#[derive(Args)]
pub(crate) struct RunnerArgs {
#[command(flatten)]
pub(crate) storage_dir: StorageDirArgs,
/// Run ID
#[arg(long)]
pub(crate) run_id: fabro_types::RunId,
/// Resume from checkpoint instead of fresh start
#[arg(long)]
pub(crate) resume: bool,
}
#[derive(Args, Debug, Clone, Default)]
pub(crate) struct ModelListArgs {
#[command(flatten)]
pub(crate) target: ModelTargetArgs,
/// Filter by provider
#[arg(short, long)]
pub(crate) provider: Option<String>,
/// Search for models matching this string
#[arg(short, long)]
pub(crate) query: Option<String>,
}
#[derive(Args, Debug, Clone, Default)]
pub(crate) struct ModelTestArgs {
#[command(flatten)]
pub(crate) target: ModelTargetArgs,
/// Filter by provider
#[arg(short, long)]
pub(crate) provider: Option<String>,
/// Test a specific model
#[arg(short, long)]
pub(crate) model: Option<String>,
/// Run a multi-turn tool-use test (catches reasoning round-trip bugs)
#[arg(long)]
pub(crate) deep: bool,
}
#[derive(Args)]
pub(crate) struct ExecArgs {
#[command(flatten)]
pub(crate) server_url: ServerUrlArgs,
#[command(flatten)]
pub(crate) agent: AgentArgs,
}
#[derive(Args)]
pub(crate) struct UpgradeArgs {
/// Target version (e.g. "0.5.0" or "v0.5.0")
@ -635,25 +820,12 @@ pub(crate) enum RunCommands {
/// Create a workflow run (allocate run dir, persist spec)
Create(RunArgs),
/// Start a created workflow run on the server
Start {
/// Run ID prefix or workflow name
run: String,
},
Start(StartArgs),
/// Attach to a running or finished workflow run
Attach {
/// Run ID prefix or workflow name
run: String,
},
Attach(AttachArgs),
/// Internal: queue or resume a workflow run via the server
#[command(name = "__runner", hide = true)]
Runner {
/// Run ID
#[arg(long)]
run_id: fabro_types::RunId,
/// Resume from checkpoint instead of fresh start
#[arg(long)]
resume: bool,
},
Runner(RunnerArgs),
/// Show the diff of changes from a workflow run
#[command(hide = true)]
Diff(DiffArgs),
@ -674,9 +846,9 @@ impl RunCommands {
match self {
Self::Run(_) => "run",
Self::Create(_) => "create",
Self::Start { .. } => "start",
Self::Attach { .. } => "attach",
Self::Runner { .. } => "__runner",
Self::Start(_) => "start",
Self::Attach(_) => "attach",
Self::Runner(_) => "__runner",
Self::Diff(_) => "diff",
Self::Logs(_) => "logs",
Self::Resume(_) => "resume",
@ -731,37 +903,17 @@ impl RunsCommands {
#[derive(Subcommand)]
pub(crate) enum ModelsCommand {
/// List available models
List {
/// Filter by provider
#[arg(short, long)]
provider: Option<String>,
/// Search for models matching this string
#[arg(short, long)]
query: Option<String>,
},
List(ModelListArgs),
/// Test model availability by sending a simple prompt
Test {
/// Filter by provider
#[arg(short, long)]
provider: Option<String>,
/// Test a specific model
#[arg(short, long)]
model: Option<String>,
/// Run a multi-turn tool-use test (catches reasoning round-trip bugs)
#[arg(long)]
deep: bool,
},
Test(ModelTestArgs),
}
#[derive(Subcommand)]
pub(crate) enum Commands {
/// Run an agentic coding session
#[command(hide = true)]
Exec(AgentArgs),
Exec(ExecArgs),
#[command(flatten)]
RunCmd(RunCommands),
/// Validate run configuration without executing
@ -871,15 +1023,15 @@ impl Commands {
Self::Parse(_) => "parse",
Self::RunsCmd(cmd) => cmd.name(),
Self::Model { command } => match command {
Some(ModelsCommand::List { .. }) => "model list",
Some(ModelsCommand::Test { .. }) => "model test",
Some(ModelsCommand::List(_)) => "model list",
Some(ModelsCommand::Test(_)) => "model test",
None => "model",
},
Self::Server(ns) => match &ns.command {
ServerCommand::Start { .. } => "server start",
ServerCommand::Stop { .. } => "server stop",
ServerCommand::Status { .. } => "server status",
ServerCommand::Serve { .. } => "server __serve",
ServerCommand::Start(_) => "server start",
ServerCommand::Stop(_) => "server stop",
ServerCommand::Status(_) => "server status",
ServerCommand::Serve(_) => "server __serve",
},
Self::Doctor { .. } => "doctor",
Self::Repo(ns) => match &ns.command {
@ -1001,39 +1153,63 @@ pub(crate) struct ServerNamespace {
use fabro_server::serve::ServeArgs;
#[derive(Args)]
pub(crate) struct ServerStartArgs {
#[command(flatten)]
pub(crate) storage_dir: StorageDirArgs,
/// Run in the foreground instead of daemonizing
#[arg(long)]
pub(crate) foreground: bool,
#[command(flatten)]
pub(crate) serve_args: ServeArgs,
}
#[derive(Args)]
pub(crate) struct ServerStopArgs {
#[command(flatten)]
pub(crate) storage_dir: StorageDirArgs,
/// Seconds to wait for graceful shutdown before SIGKILL
#[arg(long, default_value = "10")]
pub(crate) timeout: u64,
}
#[derive(Args)]
pub(crate) struct ServerStatusArgs {
#[command(flatten)]
pub(crate) storage_dir: StorageDirArgs,
/// Output as JSON
#[arg(long)]
pub(crate) json: bool,
}
#[derive(Args)]
pub(crate) struct ServerServeArgs {
#[command(flatten)]
pub(crate) storage_dir: StorageDirArgs,
/// Path to the server record file
#[arg(long)]
pub(crate) record_path: PathBuf,
#[command(flatten)]
pub(crate) serve_args: ServeArgs,
}
#[derive(Subcommand)]
pub(crate) enum ServerCommand {
/// Start the HTTP API server
Start {
/// Run in the foreground instead of daemonizing
#[arg(long)]
foreground: bool,
#[command(flatten)]
serve_args: ServeArgs,
},
Start(ServerStartArgs),
/// Stop the HTTP API server
Stop {
/// Seconds to wait for graceful shutdown before SIGKILL
#[arg(long, default_value = "10")]
timeout: u64,
},
Stop(ServerStopArgs),
/// Show server status
Status {
/// Output as JSON
#[arg(long)]
json: bool,
},
Status(ServerStatusArgs),
/// Internal: run the server process (spawned by `start`)
#[command(name = "__serve", hide = true)]
Serve {
/// Path to the server record file
#[arg(long)]
record_path: PathBuf,
#[command(flatten)]
serve_args: ServeArgs,
},
Serve(ServerServeArgs),
}
#[derive(Args)]

View file

@ -7,10 +7,10 @@ use fabro_workflow::artifacts::{ArtifactEntry, scan_artifacts};
use crate::args::{ArtifactCpArgs, GlobalArgs};
use crate::server_runs::ServerRunLookup;
use crate::shared::{print_json_pretty, split_run_path};
use crate::user_config::load_user_settings_with_globals;
use crate::user_config::load_user_settings_with_storage_dir;
pub(super) async fn cp_command(args: &ArtifactCpArgs, globals: &GlobalArgs) -> Result<()> {
let cli_settings = load_user_settings_with_globals(globals)?;
let cli_settings = load_user_settings_with_storage_dir(args.storage_dir.as_deref())?;
let (run_id, asset_path) = parse_source(&args.source);
let lookup = ServerRunLookup::connect(&cli_settings.storage_dir()).await?;
let run = lookup.resolve(run_id)?;

View file

@ -5,10 +5,10 @@ use fabro_workflow::artifacts::scan_artifacts;
use crate::args::{ArtifactListArgs, GlobalArgs};
use crate::server_runs::ServerRunLookup;
use crate::shared::format_size;
use crate::user_config::load_user_settings_with_globals;
use crate::user_config::load_user_settings_with_storage_dir;
pub(super) async fn list_command(args: &ArtifactListArgs, globals: &GlobalArgs) -> Result<()> {
let cli_settings = load_user_settings_with_globals(globals)?;
let cli_settings = load_user_settings_with_storage_dir(args.storage_dir.as_deref())?;
let lookup = ServerRunLookup::connect(&cli_settings.storage_dir()).await?;
let run = lookup.resolve(&args.run_id)?;
let runtime_state = RuntimeState::new(&run.path);

View file

@ -7,19 +7,19 @@ use crate::user_config;
use fabro_config::ConfigLayer;
use fabro_types::Settings;
fn merged_config(workflow: Option<&Path>, globals: &GlobalArgs) -> anyhow::Result<Settings> {
fn merged_config(workflow: Option<&Path>, args: &SettingsArgs) -> anyhow::Result<Settings> {
let cwd = std::env::current_dir()?;
let base = match workflow {
Some(path) => ConfigLayer::for_workflow(path, &cwd)?,
None => ConfigLayer::project(&cwd)?,
};
let cli = user_config::user_layer_with_globals(globals)?;
let cli = user_config::user_layer_with_storage_dir(args.storage_dir.as_deref())?;
base.combine(cli).resolve()
}
pub(crate) fn execute(args: &SettingsArgs, globals: &GlobalArgs) -> anyhow::Result<()> {
let config = merged_config(args.workflow.as_deref(), globals)?;
let config = merged_config(args.workflow.as_deref(), args)?;
if globals.json {
print_json_pretty(&config)?;
return Ok(());

View file

@ -1,5 +1,5 @@
use anyhow::Result;
use fabro_agent::cli::{AgentArgs, OutputFormat, run_with_args, run_with_args_and_client};
use fabro_agent::cli::{OutputFormat, run_with_args, run_with_args_and_client};
use fabro_config::mcp::McpServerEntry;
use fabro_llm::client::Client;
use fabro_llm::providers::FabroServerAdapter;
@ -7,24 +7,24 @@ use fabro_mcp::config::McpServerSettings;
use std::collections::HashMap;
use std::sync::Arc;
use crate::args::GlobalArgs;
use crate::args::{ExecArgs, GlobalArgs};
use crate::user_config;
pub(crate) async fn execute(mut args: AgentArgs, globals: &GlobalArgs) -> Result<()> {
let cli_settings = user_config::load_user_settings_with_globals(globals)?;
pub(crate) async fn execute(mut args: ExecArgs, globals: &GlobalArgs) -> Result<()> {
let cli_settings = user_config::load_user_settings()?;
#[cfg(feature = "sleep_inhibitor")]
let _sleep_guard = crate::sleep_inhibitor::guard(cli_settings.prevent_idle_sleep_enabled());
let exec_defaults = cli_settings.exec.as_ref();
args.apply_cli_defaults(
args.agent.apply_cli_defaults(
exec_defaults.and_then(|a| a.provider.as_deref()),
exec_defaults.and_then(|a| a.model.as_deref()),
exec_defaults.and_then(|a| a.permissions),
exec_defaults.and_then(|a| a.output_format),
);
if globals.json {
args.output_format = Some(OutputFormat::Json);
args.agent.output_format = Some(OutputFormat::Json);
}
let server_target = user_config::exec_server_target(globals, &cli_settings);
let server_target = user_config::exec_server_target(&args.server_url, &cli_settings);
let mcp_servers: Vec<McpServerSettings> = cli_settings
.mcp_servers
.into_iter()
@ -34,6 +34,7 @@ pub(crate) async fn execute(mut args: AgentArgs, globals: &GlobalArgs) -> Result
tracing::info!(transport = "server", "Agent session starting");
let http_client = user_config::build_server_client(target.tls.as_ref())?;
let provider_name = args
.agent
.provider
.clone()
.unwrap_or_else(|| "anthropic".to_string());
@ -47,10 +48,10 @@ pub(crate) async fn execute(mut args: AgentArgs, globals: &GlobalArgs) -> Result
.register_provider(adapter)
.await
.map_err(|e| anyhow::anyhow!("Failed to register fabro server adapter: {e}"))?;
run_with_args_and_client(args, Some(client), mcp_servers).await?;
run_with_args_and_client(args.agent, Some(client), mcp_servers).await?;
} else {
tracing::info!(transport = "direct", "Agent session starting");
run_with_args(args, mcp_servers).await?;
run_with_args(args.agent, mcp_servers).await?;
}
Ok(())

View file

@ -7,7 +7,7 @@ use fabro_util::terminal::Styles;
use serde::Serialize;
use serde::de::DeserializeOwned;
use crate::args::{GlobalArgs, ModelsCommand};
use crate::args::{GlobalArgs, ModelListArgs, ModelTestArgs, ModelsCommand};
use crate::server_client;
use crate::user_config;
@ -38,8 +38,13 @@ struct ModelTestOutput {
}
pub(crate) async fn execute(command: Option<ModelsCommand>, globals: &GlobalArgs) -> Result<()> {
let cli_settings = user_config::load_user_settings_with_globals(globals)?;
let client = match user_config::model_server_target(globals, &cli_settings) {
let command = command.unwrap_or_default();
let target_args = match &command {
ModelsCommand::List(args) => &args.target,
ModelsCommand::Test(args) => &args.target,
};
let cli_settings = user_config::load_user_settings_with_storage_dir(target_args.storage_dir())?;
let client = match user_config::model_server_target(target_args, &cli_settings) {
Some(target) => {
server_client::connect_remote_api_client(&target.server_base_url, target.tls.as_ref())?
}
@ -394,19 +399,16 @@ async fn test_models_via_server(
#[allow(clippy::print_stdout)]
async fn run_models(
command: Option<ModelsCommand>,
command: ModelsCommand,
client: fabro_api::Client,
json_output: bool,
) -> Result<()> {
let command = command.unwrap_or(ModelsCommand::List {
provider: None,
query: None,
});
let styles = Styles::detect_stdout();
match command {
ModelsCommand::List { provider, query } => {
ModelsCommand::List(ModelListArgs {
provider, query, ..
}) => {
let models =
fetch_models_from_server(&client, provider.as_deref(), query.as_deref()).await?;
@ -416,11 +418,12 @@ async fn run_models(
print_models_table(&models, &styles);
}
}
ModelsCommand::Test {
ModelsCommand::Test(ModelTestArgs {
provider,
model,
deep,
} => {
..
}) => {
test_models_via_server(
&client,
provider.as_deref(),
@ -436,6 +439,12 @@ async fn run_models(
Ok(())
}
impl Default for ModelsCommand {
fn default() -> Self {
Self::List(ModelListArgs::default())
}
}
#[cfg(test)]
mod tests {
use super::*;

View file

@ -6,14 +6,14 @@ use tracing::info;
use crate::args::{GlobalArgs, PrCloseArgs};
use crate::shared::print_json_pretty;
use crate::user_config::load_user_settings_with_globals;
use crate::user_config::load_user_settings_with_storage_dir;
pub(super) async fn close_command(
args: PrCloseArgs,
github_app: Option<fabro_github::GitHubAppCredentials>,
globals: &GlobalArgs,
) -> Result<()> {
let cli_settings = load_user_settings_with_globals(globals)?;
let cli_settings = load_user_settings_with_storage_dir(args.storage_dir.as_deref())?;
let base = runs_base(&cli_settings.storage_dir());
close_from(&base, args, github_app, globals).await
}

View file

@ -12,14 +12,14 @@ use crate::args::{GlobalArgs, PrCreateArgs};
use crate::commands::store::rebuild::rebuild_run_store;
use crate::server_runs::ServerRunLookup;
use crate::shared::print_json_pretty;
use crate::user_config::load_user_settings_with_globals;
use crate::user_config::load_user_settings_with_storage_dir;
pub(super) async fn create_command(
args: PrCreateArgs,
github_app: Option<fabro_github::GitHubAppCredentials>,
globals: &GlobalArgs,
) -> Result<()> {
let cli_settings = load_user_settings_with_globals(globals)?;
let cli_settings = load_user_settings_with_storage_dir(args.storage_dir.as_deref())?;
let base = runs_base(&cli_settings.storage_dir());
create_from(&base, args, github_app, globals).await
}

View file

@ -11,7 +11,7 @@ use crate::args::{GlobalArgs, PrListArgs};
use crate::server_client;
use crate::server_runs::ServerRunLookup;
use crate::shared::print_json_pretty;
use crate::user_config::load_user_settings_with_globals;
use crate::user_config::load_user_settings_with_storage_dir;
#[derive(Serialize)]
struct PrRow {
@ -27,7 +27,7 @@ pub(super) async fn list_command(
github_app: Option<fabro_github::GitHubAppCredentials>,
globals: &GlobalArgs,
) -> Result<()> {
let cli_settings = load_user_settings_with_globals(globals)?;
let cli_settings = load_user_settings_with_storage_dir(args.storage_dir.as_deref())?;
let base = runs_base(&cli_settings.storage_dir());
let lookup = ServerRunLookup::connect(&cli_settings.storage_dir()).await?;
list_from(

View file

@ -7,14 +7,14 @@ use fabro_workflow::run_lookup::runs_base;
use crate::args::{GlobalArgs, PrMergeArgs};
use crate::shared::print_json_pretty;
use crate::user_config::load_user_settings_with_globals;
use crate::user_config::load_user_settings_with_storage_dir;
pub(super) async fn merge_command(
args: PrMergeArgs,
github_app: Option<fabro_github::GitHubAppCredentials>,
globals: &GlobalArgs,
) -> Result<()> {
let cli_settings = load_user_settings_with_globals(globals)?;
let cli_settings = load_user_settings_with_storage_dir(args.storage_dir.as_deref())?;
let base = runs_base(&cli_settings.storage_dir());
merge_from(&base, args, github_app, globals).await
}

View file

@ -13,20 +13,35 @@ use fabro_types::PullRequestRecord;
use crate::args::{GlobalArgs, PrCommand, PrNamespace};
use crate::server_runs::ServerRunLookup;
use crate::shared::github::build_github_app_credentials;
use crate::user_config::load_user_settings_with_globals;
use crate::user_config::load_user_settings_with_storage_dir;
pub(crate) async fn dispatch(ns: PrNamespace, globals: &GlobalArgs) -> Result<()> {
let cli_settings = load_user_settings_with_globals(globals)?;
let github_app = build_github_app_credentials(cli_settings.app_id())?;
match ns.command {
PrCommand::Create(args) => {
let cli_settings = load_user_settings_with_storage_dir(args.storage_dir.as_deref())?;
let github_app = build_github_app_credentials(cli_settings.app_id())?;
Box::pin(create::create_command(args, github_app, globals)).await
}
PrCommand::List(args) => list::list_command(args, github_app, globals).await,
PrCommand::View(args) => view::view_command(args, github_app, globals).await,
PrCommand::Merge(args) => merge::merge_command(args, github_app, globals).await,
PrCommand::Close(args) => close::close_command(args, github_app, globals).await,
PrCommand::List(args) => {
let cli_settings = load_user_settings_with_storage_dir(args.storage_dir.as_deref())?;
let github_app = build_github_app_credentials(cli_settings.app_id())?;
list::list_command(args, github_app, globals).await
}
PrCommand::View(args) => {
let cli_settings = load_user_settings_with_storage_dir(args.storage_dir.as_deref())?;
let github_app = build_github_app_credentials(cli_settings.app_id())?;
view::view_command(args, github_app, globals).await
}
PrCommand::Merge(args) => {
let cli_settings = load_user_settings_with_storage_dir(args.storage_dir.as_deref())?;
let github_app = build_github_app_credentials(cli_settings.app_id())?;
merge::merge_command(args, github_app, globals).await
}
PrCommand::Close(args) => {
let cli_settings = load_user_settings_with_storage_dir(args.storage_dir.as_deref())?;
let github_app = build_github_app_credentials(cli_settings.app_id())?;
close::close_command(args, github_app, globals).await
}
}
}

View file

@ -7,14 +7,14 @@ use fabro_workflow::run_lookup::runs_base;
use crate::args::{GlobalArgs, PrViewArgs};
use crate::shared::print_json_pretty;
use crate::user_config::load_user_settings_with_globals;
use crate::user_config::load_user_settings_with_storage_dir;
pub(super) async fn view_command(
args: PrViewArgs,
github_app: Option<fabro_github::GitHubAppCredentials>,
globals: &GlobalArgs,
) -> Result<()> {
let cli_settings = load_user_settings_with_globals(globals)?;
let cli_settings = load_user_settings_with_storage_dir(args.storage_dir.as_deref())?;
let base = runs_base(&cli_settings.storage_dir());
view_from(&base, args, github_app, globals).await
}

View file

@ -18,12 +18,12 @@ use fabro_workflow::operations::{ValidateInput, WorkflowInput, validate};
use crate::args::{GlobalArgs, PreflightArgs};
use crate::shared::github::build_github_app_credentials;
use crate::shared::print_json_pretty;
use crate::user_config::{load_user_settings_with_globals, user_layer_with_globals};
use crate::user_config::{load_user_settings_with_storage_dir, user_layer_with_storage_dir};
pub(crate) async fn execute(mut args: PreflightArgs, globals: &GlobalArgs) -> anyhow::Result<()> {
let styles: &'static Styles = Box::leak(Box::new(Styles::detect_stderr()));
let cli = user_layer_with_globals(globals)?;
let cli_settings: Settings = load_user_settings_with_globals(globals)?;
let cli = user_layer_with_storage_dir(args.storage_dir.as_deref())?;
let cli_settings: Settings = load_user_settings_with_storage_dir(args.storage_dir.as_deref())?;
args.verbose = args.verbose || cli_settings.verbose_enabled();
let github_app = build_github_app_credentials(cli_settings.app_id())?;

View file

@ -3,12 +3,13 @@ use fabro_util::terminal::Styles;
use crate::args::{GlobalArgs, RunArgs};
use crate::shared::print_json_pretty;
use crate::user_config::{self, user_layer_with_globals};
use crate::user_config::{self, user_layer_with_storage_dir};
pub(crate) async fn execute(mut args: RunArgs, globals: &GlobalArgs) -> Result<()> {
let styles: &'static Styles = Box::leak(Box::new(Styles::detect_stderr()));
let cli_settings = user_config::load_user_settings_with_globals(globals)?;
let cli = user_layer_with_globals(globals)?;
let cli_settings =
user_config::load_user_settings_with_storage_dir(args.storage_dir.as_deref())?;
let cli = user_layer_with_storage_dir(args.storage_dir.as_deref())?;
args.verbose = args.verbose || cli_settings.verbose_enabled();
let quiet = args.detach;

View file

@ -9,7 +9,7 @@ use tracing::{debug, info};
use crate::args::{CpArgs, GlobalArgs};
use crate::server_runs::ServerRunLookup;
use crate::shared::{print_json_pretty, split_run_path};
use crate::user_config::load_user_settings_with_globals;
use crate::user_config::load_user_settings_with_storage_dir;
enum CopyDirection {
Download {
@ -26,7 +26,7 @@ enum CopyDirection {
pub(crate) async fn cp_command(args: CpArgs, globals: &GlobalArgs) -> Result<()> {
let direction = parse_direction(&args.src, &args.dst)?;
let cli_settings = load_user_settings_with_globals(globals)?;
let cli_settings = load_user_settings_with_storage_dir(args.storage_dir.as_deref())?;
match direction {
CopyDirection::Download {

View file

@ -10,11 +10,11 @@ use crate::args::{DiffArgs, GlobalArgs};
use crate::server_client::RunProjection;
use crate::server_runs::ServerRunLookup;
use crate::shared::print_json_pretty;
use crate::user_config::load_user_settings_with_globals;
use crate::user_config::load_user_settings_with_storage_dir;
pub(crate) async fn run(args: DiffArgs, globals: &GlobalArgs) -> Result<()> {
info!(run_id = %args.run, "Showing diff");
let cli_settings = load_user_settings_with_globals(globals)?;
let cli_settings = load_user_settings_with_storage_dir(args.storage_dir.as_deref())?;
let lookup = ServerRunLookup::connect(&cli_settings.storage_dir()).await?;
let run = lookup.resolve(&args.run)?;
let run_id = run.run_id();

View file

@ -9,11 +9,11 @@ use crate::args::{ForkArgs, GlobalArgs};
use crate::commands::store::rebuild::rebuild_run_store;
use crate::server_runs::ServerRunLookup;
use crate::shared::print_json_pretty;
use crate::user_config::load_user_settings_with_globals;
use crate::user_config::load_user_settings_with_storage_dir;
pub(crate) async fn run(args: &ForkArgs, styles: &Styles, globals: &GlobalArgs) -> Result<()> {
let repo = Repository::discover(".").context("not in a git repository")?;
let cli_settings = load_user_settings_with_globals(globals)?;
let cli_settings = load_user_settings_with_storage_dir(args.storage_dir.as_deref())?;
let lookup = ServerRunLookup::connect(&cli_settings.storage_dir()).await?;
let run = lookup.resolve(&args.run_id)?;
let run_id = run.run_id();

View file

@ -13,10 +13,10 @@ use tracing::{debug, info};
use crate::args::{GlobalArgs, LogsArgs};
use crate::server_client;
use crate::server_runs::ServerRunLookup;
use crate::user_config::load_user_settings_with_globals;
use crate::user_config::load_user_settings_with_storage_dir;
pub(crate) async fn run(args: &LogsArgs, styles: &Styles, globals: &GlobalArgs) -> Result<()> {
let cli_settings = load_user_settings_with_globals(globals)?;
let cli_settings = load_user_settings_with_storage_dir(args.storage_dir.as_deref())?;
let lookup = ServerRunLookup::connect(&cli_settings.storage_dir()).await?;
let run = lookup.resolve(&args.run)?;
let client = lookup.client();

View file

@ -1,10 +1,10 @@
use anyhow::Result;
use fabro_util::terminal::Styles;
use crate::args::{GlobalArgs, RunArgs, RunCommands};
use crate::args::{AttachArgs, GlobalArgs, RunArgs, RunCommands, RunnerArgs, StartArgs};
use crate::server_runs::ServerRunLookup;
use crate::shared::print_json_pretty;
use crate::user_config::{load_user_settings_with_globals, user_layer_with_globals};
use crate::user_config::{load_user_settings_with_storage_dir, user_layer_with_storage_dir};
pub(crate) mod attach;
pub(crate) mod command;
@ -39,7 +39,7 @@ pub(crate) async fn dispatch(cmd: RunCommands, globals: &GlobalArgs) -> Result<(
RunCommands::Create(mut args) => {
apply_json_defaults(&mut args, globals);
let styles: &'static Styles = Box::leak(Box::new(Styles::detect_stderr()));
let cli = user_layer_with_globals(globals)?;
let cli = user_layer_with_storage_dir(args.storage_dir.as_deref())?;
let (run_id, _run_dir) = Box::pin(create::create_run(&args, cli, styles, true)).await?;
if globals.json {
print_json_pretty(&serde_json::json!({ "run_id": run_id }))?;
@ -48,8 +48,8 @@ pub(crate) async fn dispatch(cmd: RunCommands, globals: &GlobalArgs) -> Result<(
}
Ok(())
}
RunCommands::Start { run } => {
let cli_settings = load_user_settings_with_globals(globals)?;
RunCommands::Start(StartArgs { storage_dir, run }) => {
let cli_settings = load_user_settings_with_storage_dir(storage_dir.as_deref())?;
let lookup = ServerRunLookup::connect(&cli_settings.storage_dir()).await?;
let run_info = lookup.resolve(&run)?;
let run_id = run_info.run_id();
@ -59,9 +59,9 @@ pub(crate) async fn dispatch(cmd: RunCommands, globals: &GlobalArgs) -> Result<(
}
Ok(())
}
RunCommands::Attach { run } => {
RunCommands::Attach(AttachArgs { storage_dir, run }) => {
let styles: &'static Styles = Box::leak(Box::new(Styles::detect_stderr()));
let cli_settings = load_user_settings_with_globals(globals)?;
let cli_settings = load_user_settings_with_storage_dir(storage_dir.as_deref())?;
let lookup = ServerRunLookup::connect(&cli_settings.storage_dir()).await?;
let run_info = lookup.resolve(&run)?;
let run_id = run_info.run_id();
@ -79,9 +79,11 @@ pub(crate) async fn dispatch(cmd: RunCommands, globals: &GlobalArgs) -> Result<(
}
Ok(())
}
RunCommands::Runner { run_id, resume } => {
runner::execute(run_id, globals.storage_dir.clone(), resume).await
}
RunCommands::Runner(RunnerArgs {
storage_dir,
run_id,
resume,
}) => runner::execute(run_id, storage_dir.clone_path(), resume).await,
RunCommands::Diff(args) => diff::run(args, globals).await,
RunCommands::Logs(args) => {
let styles = Styles::detect_stdout();
@ -91,7 +93,8 @@ pub(crate) async fn dispatch(cmd: RunCommands, globals: &GlobalArgs) -> Result<(
let styles: &'static Styles = Box::leak(Box::new(Styles::detect_stderr()));
#[cfg(feature = "sleep_inhibitor")]
let _sleep_guard = {
let cli_settings = load_user_settings_with_globals(globals)?;
let cli_settings =
load_user_settings_with_storage_dir(args.storage_dir.as_deref())?;
crate::sleep_inhibitor::guard(cli_settings.prevent_idle_sleep_enabled())
};
resume::resume_command(args, styles, globals).await

View file

@ -5,10 +5,10 @@ use tracing::info;
use crate::args::{GlobalArgs, PreviewArgs};
use crate::server_runs::ServerRunLookup;
use crate::shared::{print_json_pretty, validate_daytona_provider};
use crate::user_config::load_user_settings_with_globals;
use crate::user_config::load_user_settings_with_storage_dir;
pub(crate) async fn run(args: PreviewArgs, globals: &GlobalArgs) -> Result<()> {
let cli_settings = load_user_settings_with_globals(globals)?;
let cli_settings = load_user_settings_with_storage_dir(args.storage_dir.as_deref())?;
let lookup = ServerRunLookup::connect(&cli_settings.storage_dir()).await?;
let run = lookup.resolve(&args.run)?;
let record = lookup

View file

@ -3,7 +3,7 @@ use fabro_util::terminal::Styles;
use crate::args::{GlobalArgs, ResumeArgs};
use crate::server_runs::ServerRunLookup;
use crate::shared::print_json_pretty;
use crate::user_config::load_user_settings_with_globals;
use crate::user_config::load_user_settings_with_storage_dir;
/// Resume an interrupted workflow run.
///
@ -15,7 +15,7 @@ pub(crate) async fn resume_command(
styles: &'static Styles,
globals: &GlobalArgs,
) -> anyhow::Result<()> {
let cli_settings = load_user_settings_with_globals(globals)?;
let cli_settings = load_user_settings_with_storage_dir(args.storage_dir.as_deref())?;
let lookup = ServerRunLookup::connect(&cli_settings.storage_dir()).await?;
let run = lookup.resolve(&args.run)?;
let run_id = run.run_id();

View file

@ -18,7 +18,7 @@ use crate::commands::store::rebuild::rebuild_run_store;
use crate::server_client::ServerStoreClient;
use crate::server_runs::ServerRunLookup;
use crate::shared::{color_if, print_json_pretty};
use crate::user_config::load_user_settings_with_globals;
use crate::user_config::load_user_settings_with_storage_dir;
#[derive(Serialize)]
pub(crate) struct TimelineEntryJson {
@ -30,7 +30,7 @@ pub(crate) struct TimelineEntryJson {
pub(crate) async fn run(args: &RewindArgs, styles: &Styles, globals: &GlobalArgs) -> Result<()> {
let repo = Repository::discover(".").context("not in a git repository")?;
let cli_settings = load_user_settings_with_globals(globals)?;
let cli_settings = load_user_settings_with_storage_dir(args.storage_dir.as_deref())?;
let lookup = ServerRunLookup::connect(&cli_settings.storage_dir()).await?;
let run = lookup.resolve(&args.run_id)?;
let run_id = run.run_id();

View file

@ -5,14 +5,14 @@ use tracing::info;
use crate::args::{GlobalArgs, SshArgs};
use crate::server_runs::ServerRunLookup;
use crate::shared::{print_json_pretty, validate_daytona_provider};
use crate::user_config::load_user_settings_with_globals;
use crate::user_config::load_user_settings_with_storage_dir;
pub(crate) async fn run(args: SshArgs, globals: &GlobalArgs) -> Result<()> {
if globals.json && !args.print {
globals.require_no_json()?;
}
let cli_settings = load_user_settings_with_globals(globals)?;
let cli_settings = load_user_settings_with_storage_dir(args.storage_dir.as_deref())?;
let lookup = ServerRunLookup::connect(&cli_settings.storage_dir()).await?;
let run = lookup.resolve(&args.run)?;
let run_id = run.run_id();

View file

@ -10,7 +10,7 @@ use tracing::info;
use crate::args::{GlobalArgs, WaitArgs};
use crate::server_runs::ServerRunLookup;
use crate::shared::format_duration_ms;
use crate::user_config::load_user_settings_with_globals;
use crate::user_config::load_user_settings_with_storage_dir;
#[cfg(test)]
const WAIT_STARTUP_GRACE: std::time::Duration = std::time::Duration::from_millis(500);
@ -18,7 +18,7 @@ const WAIT_STARTUP_GRACE: std::time::Duration = std::time::Duration::from_millis
const WAIT_STARTUP_GRACE: std::time::Duration = std::time::Duration::from_secs(3);
pub(crate) async fn run(args: &WaitArgs, styles: &Styles, globals: &GlobalArgs) -> Result<()> {
let cli_settings = load_user_settings_with_globals(globals)?;
let cli_settings = load_user_settings_with_storage_dir(args.storage_dir.as_deref())?;
let lookup = ServerRunLookup::connect(&cli_settings.storage_dir()).await?;
let run_info = lookup.resolve(&args.run)?;
let client = lookup.client();

View file

@ -9,7 +9,7 @@ use fabro_workflow::run_status::RunStatus;
use crate::args::{GlobalArgs, InspectArgs};
use crate::server_client::RunProjection;
use crate::server_runs::ServerRunLookup;
use crate::user_config::load_user_settings_with_globals;
use crate::user_config::load_user_settings_with_storage_dir;
#[derive(Debug, Serialize)]
pub(crate) struct InspectOutput {
@ -23,8 +23,8 @@ pub(crate) struct InspectOutput {
pub sandbox: Option<serde_json::Value>,
}
pub(crate) async fn run(args: &InspectArgs, globals: &GlobalArgs) -> Result<()> {
let cli_settings = load_user_settings_with_globals(globals)?;
pub(crate) async fn run(args: &InspectArgs, _globals: &GlobalArgs) -> Result<()> {
let cli_settings = load_user_settings_with_storage_dir(args.storage_dir.as_deref())?;
let lookup = ServerRunLookup::connect(&cli_settings.storage_dir()).await?;
let run = lookup.resolve(&args.run)?;
let run_id = run.run_id();

View file

@ -13,7 +13,7 @@ use fabro_workflow::run_status::RunStatus;
use crate::args::{GlobalArgs, RunsListArgs};
use crate::server_runs::ServerRunLookup;
use crate::shared::{color_if, format_duration_ms, tilde_path};
use crate::user_config::load_user_settings_with_globals;
use crate::user_config::load_user_settings_with_storage_dir;
use super::short_run_id;
@ -23,7 +23,7 @@ pub(crate) async fn list_command(
styles: &Styles,
globals: &GlobalArgs,
) -> Result<()> {
let cli_settings = load_user_settings_with_globals(globals)?;
let cli_settings = load_user_settings_with_storage_dir(args.storage_dir.as_deref())?;
let base = runs_base(&cli_settings.storage_dir());
let lookup = ServerRunLookup::connect(&cli_settings.storage_dir()).await?;
let runs = scan_runs_with_summaries(lookup.summaries(), &base)?;

View file

@ -12,12 +12,12 @@ use crate::server_client;
use crate::server_client::RunProjection;
use crate::server_runs::ServerRunLookup;
use crate::shared::print_json_pretty;
use crate::user_config::load_user_settings_with_globals;
use crate::user_config::load_user_settings_with_storage_dir;
use super::short_run_id;
pub(crate) async fn remove_command(args: &RunsRemoveArgs, globals: &GlobalArgs) -> Result<()> {
let cli_settings = load_user_settings_with_globals(globals)?;
let cli_settings = load_user_settings_with_storage_dir(args.storage_dir.as_deref())?;
let lookup = ServerRunLookup::connect(&cli_settings.storage_dir()).await?;
remove_from(
args,

View file

@ -11,16 +11,20 @@ use fabro_server::bind;
use fabro_server::bind::Bind;
use fabro_util::terminal::Styles;
use crate::args::{GlobalArgs, ServerCommand};
use crate::args::{
GlobalArgs, ServerCommand, ServerServeArgs, ServerStartArgs, ServerStatusArgs, ServerStopArgs,
};
use crate::user_config;
pub(crate) async fn dispatch(command: ServerCommand, globals: &GlobalArgs) -> Result<()> {
pub(crate) async fn dispatch(command: ServerCommand, _globals: &GlobalArgs) -> Result<()> {
match command {
ServerCommand::Start {
ServerCommand::Start(ServerStartArgs {
storage_dir,
foreground,
serve_args,
} => {
let settings = user_config::load_user_settings_with_globals(globals)?;
}) => {
let settings =
user_config::load_user_settings_with_storage_dir(storage_dir.as_deref())?;
let storage_dir = settings.storage_dir();
let bind_addr = match serve_args.bind.as_deref() {
Some(s) => bind::parse_bind(s)?,
@ -29,27 +33,34 @@ pub(crate) async fn dispatch(command: ServerCommand, globals: &GlobalArgs) -> Re
let styles: &'static Styles = Box::leak(Box::new(Styles::detect_stderr()));
start::execute(bind_addr, foreground, serve_args, storage_dir, styles).await
}
ServerCommand::Stop { timeout } => {
let settings = user_config::load_user_settings_with_globals(globals)?;
ServerCommand::Stop(ServerStopArgs {
storage_dir,
timeout,
}) => {
let settings =
user_config::load_user_settings_with_storage_dir(storage_dir.as_deref())?;
let storage_dir = settings.storage_dir();
stop::execute(&storage_dir, Duration::from_secs(timeout));
Ok(())
}
ServerCommand::Status { json } => {
let settings = user_config::load_user_settings_with_globals(globals)?;
ServerCommand::Status(ServerStatusArgs { storage_dir, json }) => {
let settings =
user_config::load_user_settings_with_storage_dir(storage_dir.as_deref())?;
let storage_dir = settings.storage_dir();
status::execute(&storage_dir, json)
}
ServerCommand::Serve {
ServerCommand::Serve(ServerServeArgs {
storage_dir,
record_path,
serve_args,
} => {
}) => {
let bind_addr = if let Some(s) = serve_args.bind.as_deref() {
bind::parse_bind(s)?
} else {
// __serve should always receive an explicit --bind from the parent,
// but fall back to the storage dir default if missing.
let settings = user_config::load_user_settings_with_globals(globals)?;
let settings =
user_config::load_user_settings_with_storage_dir(storage_dir.as_deref())?;
Bind::Unix(settings.storage_dir().join("fabro.sock"))
};
let styles: &'static Styles = Box::leak(Box::new(Styles::detect_stderr()));
@ -57,7 +68,7 @@ pub(crate) async fn dispatch(command: ServerCommand, globals: &GlobalArgs) -> Re
record_path,
serve_args,
bind_addr,
globals.storage_dir.clone(),
storage_dir.clone_path(),
styles,
)
.await

View file

@ -12,10 +12,10 @@ use crate::args::{GlobalArgs, StoreDumpArgs};
use crate::commands::store::rebuild::rebuild_run_store;
use crate::server_runs::ServerRunLookup;
use crate::shared::{absolute_or_current, print_json_pretty};
use crate::user_config::load_user_settings_with_globals;
use crate::user_config::load_user_settings_with_storage_dir;
pub(crate) async fn dump_command(args: &StoreDumpArgs, globals: &GlobalArgs) -> Result<()> {
let cli_settings = load_user_settings_with_globals(globals)?;
let cli_settings = load_user_settings_with_storage_dir(args.storage_dir.as_deref())?;
let lookup = ServerRunLookup::connect(&cli_settings.storage_dir()).await?;
let run = lookup.resolve(&args.run)?;
let run_id = run.run_id();

View file

@ -12,7 +12,7 @@ use fabro_workflow::run_status::RunStatus;
use crate::args::{DfArgs, GlobalArgs};
use crate::server_runs::ServerRunLookup;
use crate::shared::{format_size, print_json_pretty};
use crate::user_config::load_user_settings_with_globals;
use crate::user_config::load_user_settings_with_storage_dir;
#[derive(Serialize)]
struct SummaryRow {
@ -45,7 +45,7 @@ struct DfOutput {
}
pub(super) async fn df_command(args: &DfArgs, globals: &GlobalArgs) -> Result<()> {
let cli_settings = load_user_settings_with_globals(globals)?;
let cli_settings = load_user_settings_with_storage_dir(args.storage_dir.as_deref())?;
let data_dir = cli_settings.storage_dir();
let runs_base_dir = runs_base(&data_dir);
let logs_base_dir = logs_base(&data_dir);

View file

@ -12,7 +12,7 @@ use crate::commands::runs::rm::remove_run_with_cleanup;
use crate::server_client;
use crate::server_runs::ServerRunLookup;
use crate::shared::{format_size, print_json_pretty};
use crate::user_config::load_user_settings_with_globals;
use crate::user_config::load_user_settings_with_storage_dir;
#[derive(Serialize)]
struct PruneRunRow {
@ -23,7 +23,7 @@ struct PruneRunRow {
}
pub(super) async fn prune_command(args: &RunsPruneArgs, globals: &GlobalArgs) -> Result<()> {
let cli_settings = load_user_settings_with_globals(globals)?;
let cli_settings = load_user_settings_with_storage_dir(args.storage_dir.as_deref())?;
let base = runs_base(&cli_settings.storage_dir());
let lookup = ServerRunLookup::connect(&cli_settings.storage_dir()).await?;
prune_from(args, lookup.client(), lookup.summaries(), &base, globals).await

View file

@ -108,12 +108,12 @@ async fn main_inner() -> (String, Result<()>) {
let (config_log_level, upgrade_check_enabled) = {
if let Commands::Server(ServerNamespace {
command:
ServerCommand::Start {
ServerCommand::Start(args::ServerStartArgs {
serve_args: args, ..
}
| ServerCommand::Serve {
})
| ServerCommand::Serve(args::ServerServeArgs {
serve_args: args, ..
},
}),
}) = command.as_ref()
{
match load_server_settings(args.config.as_deref()) {
@ -275,7 +275,9 @@ async fn main_inner() -> (String, Result<()>) {
#[cfg(test)]
mod tests {
use super::*;
use args::{ProviderCommand, ProviderNamespace, StoreCommand, StoreNamespace};
use args::{
Commands, ModelsCommand, ProviderCommand, ProviderNamespace, StoreCommand, StoreNamespace,
};
use clap::Parser;
#[test]
@ -335,7 +337,7 @@ mod tests {
}
#[test]
fn parse_global_storage_dir_after_subcommand() {
fn parse_run_storage_dir_after_subcommand() {
let cli = Cli::try_parse_from([
"fabro",
"run",
@ -344,12 +346,12 @@ mod tests {
"/tmp/fabro",
])
.expect("should parse");
assert_eq!(
cli.globals.storage_dir.as_deref(),
Some(std::path::Path::new("/tmp/fabro"))
);
match *cli.command {
Commands::RunCmd(RunCommands::Run(args)) => {
assert_eq!(
args.storage_dir.as_deref(),
Some(std::path::Path::new("/tmp/fabro"))
);
assert_eq!(
args.workflow.as_deref(),
Some(std::path::Path::new("test/simple.fabro"))
@ -360,17 +362,84 @@ mod tests {
}
#[test]
fn parse_server_url_conflicts_with_storage_dir() {
fn parse_model_list_server_url_after_subcommand() {
let cli = Cli::try_parse_from([
"fabro",
"model",
"list",
"--server-url",
"http://localhost:3000/api/v1",
])
.expect("should parse");
match *cli.command {
Commands::Model {
command: Some(ModelsCommand::List(args)),
} => assert_eq!(
args.target.server_url(),
Some("http://localhost:3000/api/v1")
),
_ => panic!("unexpected command variant"),
}
}
#[test]
fn parse_exec_server_url_after_subcommand() {
let cli = Cli::try_parse_from([
"fabro",
"exec",
"--server-url",
"http://localhost:3000/api/v1",
"fix the bug",
])
.expect("should parse");
match *cli.command {
Commands::Exec(args) => assert_eq!(
args.server_url.as_deref(),
Some("http://localhost:3000/api/v1")
),
_ => panic!("unexpected command variant"),
}
}
#[test]
fn parse_model_server_url_conflicts_with_storage_dir() {
let result = Cli::try_parse_from([
"fabro",
"model",
"list",
"--storage-dir",
"/tmp/fabro",
"--server-url",
"http://localhost:3000",
]);
assert!(
result.is_err(),
"should fail with conflicting model target flags"
);
}
#[test]
fn parse_global_server_url_before_subcommand_is_rejected() {
let result = Cli::try_parse_from([
"fabro",
"--server-url",
"http://localhost:3000/api/v1",
"model",
"list",
]);
assert!(result.is_err(), "should fail with conflicting global flags");
assert!(result.is_err(), "should reject top-level --server-url");
}
#[test]
fn parse_global_storage_dir_before_subcommand_is_rejected() {
let result = Cli::try_parse_from([
"fabro",
"--storage-dir",
"/tmp/fabro",
"run",
"test/simple.fabro",
]);
assert!(result.is_err(), "should reject top-level --storage-dir");
}
#[test]
@ -392,8 +461,8 @@ mod tests {
fn parse_start_command() {
let cli = Cli::try_parse_from(["fabro", "start", "ABC123"]).expect("should parse");
match *cli.command {
Commands::RunCmd(RunCommands::Start { run }) => {
assert_eq!(run, "ABC123");
Commands::RunCmd(RunCommands::Start(args)) => {
assert_eq!(args.run, "ABC123");
}
_ => panic!("unexpected command variant"),
}
@ -403,8 +472,8 @@ mod tests {
fn parse_attach_command() {
let cli = Cli::try_parse_from(["fabro", "attach", "ABC123"]).expect("should parse");
match *cli.command {
Commands::RunCmd(RunCommands::Attach { run }) => {
assert_eq!(run, "ABC123");
Commands::RunCmd(RunCommands::Attach(args)) => {
assert_eq!(args.run, "ABC123");
}
_ => panic!("unexpected command variant"),
}
@ -436,9 +505,9 @@ mod tests {
])
.expect("should parse");
match *cli.command {
Commands::RunCmd(RunCommands::Runner { run_id, resume }) => {
assert_eq!(run_id, "01ARZ3NDEKTSV4RRFFQ69G5FAV".parse().unwrap());
assert!(!resume);
Commands::RunCmd(RunCommands::Runner(args)) => {
assert_eq!(args.run_id, "01ARZ3NDEKTSV4RRFFQ69G5FAV".parse().unwrap());
assert!(!args.resume);
}
_ => panic!("unexpected command variant"),
}
@ -455,9 +524,9 @@ mod tests {
])
.expect("should parse");
match *cli.command {
Commands::RunCmd(RunCommands::Runner { run_id, resume }) => {
assert_eq!(run_id, "01ARZ3NDEKTSV4RRFFQ69G5FAV".parse().unwrap());
assert!(resume);
Commands::RunCmd(RunCommands::Runner(args)) => {
assert_eq!(args.run_id, "01ARZ3NDEKTSV4RRFFQ69G5FAV".parse().unwrap());
assert!(args.resume);
}
_ => panic!("unexpected command variant"),
}

View file

@ -1,31 +1,36 @@
use std::path::Path;
pub(crate) use fabro_config::user::*;
use fabro_config::ConfigLayer;
use fabro_types::Settings;
use tracing::debug;
use crate::args::GlobalArgs;
use crate::args::{ModelTargetArgs, ServerUrlArgs};
pub(crate) fn load_user_settings() -> anyhow::Result<Settings> {
ConfigLayer::user()?.resolve()
}
pub(crate) fn user_layer_with_globals(globals: &GlobalArgs) -> anyhow::Result<ConfigLayer> {
pub(crate) fn user_layer_with_storage_dir(
storage_dir: Option<&Path>,
) -> anyhow::Result<ConfigLayer> {
let layer = ConfigLayer::user()?;
Ok(apply_global_overrides(layer, globals))
Ok(apply_storage_dir_override(layer, storage_dir))
}
pub(crate) fn load_user_settings_with_globals(globals: &GlobalArgs) -> anyhow::Result<Settings> {
user_layer_with_globals(globals)?.resolve()
pub(crate) fn load_user_settings_with_storage_dir(
storage_dir: Option<&Path>,
) -> anyhow::Result<Settings> {
user_layer_with_storage_dir(storage_dir)?.resolve()
}
pub(crate) fn apply_global_overrides(mut layer: ConfigLayer, globals: &GlobalArgs) -> ConfigLayer {
if let Some(dir) = &globals.storage_dir {
layer.storage_dir = Some(dir.clone());
}
if let Some(url) = &globals.server_url {
layer.server.get_or_insert_with(Default::default).base_url = Some(url.clone());
pub(crate) fn apply_storage_dir_override(
mut layer: ConfigLayer,
storage_dir: Option<&Path>,
) -> ConfigLayer {
if let Some(dir) = storage_dir {
layer.storage_dir = Some(dir.to_path_buf());
}
layer
@ -47,36 +52,33 @@ fn configured_server_target(settings: &Settings) -> Option<ServerTarget> {
}
pub(crate) fn exec_server_target(
globals: &GlobalArgs,
args: &ServerUrlArgs,
settings: &Settings,
) -> Option<ServerTarget> {
let target = globals
.server_url
.as_ref()
.map(|server_base_url| ServerTarget {
server_base_url: server_base_url.clone(),
tls: settings
.server
.as_ref()
.and_then(|server| server.tls.clone()),
});
let target = args.as_deref().map(|server_base_url| ServerTarget {
server_base_url: server_base_url.to_string(),
tls: settings
.server
.as_ref()
.and_then(|server| server.tls.clone()),
});
debug!(has_target = target.is_some(), "Resolved exec server target");
target
}
pub(crate) fn model_server_target(
globals: &GlobalArgs,
args: &ModelTargetArgs,
settings: &Settings,
) -> Option<ServerTarget> {
let target = if let Some(server_base_url) = globals.server_url.as_ref() {
let target = if let Some(server_base_url) = args.server_url() {
Some(ServerTarget {
server_base_url: server_base_url.clone(),
server_base_url: server_base_url.to_string(),
tls: settings
.server
.as_ref()
.and_then(|server| server.tls.clone()),
})
} else if globals.storage_dir.is_some() {
} else if args.storage_dir().is_some() {
None
} else {
configured_server_target(settings)
@ -124,32 +126,32 @@ mod tests {
use std::path::PathBuf;
use super::*;
use crate::args::{ModelTargetArgs, ServerUrlArgs};
fn globals() -> GlobalArgs {
GlobalArgs {
json: false,
debug: false,
no_upgrade_check: false,
quiet: false,
verbose: false,
storage_dir: None,
server_url: None,
fn server_url_args(url: Option<&str>) -> ServerUrlArgs {
ServerUrlArgs {
server_url: url.map(str::to_string),
}
}
fn model_target_args(storage_dir: Option<&str>, server_url: Option<&str>) -> ModelTargetArgs {
ModelTargetArgs {
storage_dir: storage_dir.map(std::path::PathBuf::from),
server_url: server_url.map(str::to_string),
}
}
#[test]
fn exec_has_no_server_target_by_default() {
let settings = Settings::default();
assert_eq!(exec_server_target(&globals(), &settings), None);
assert_eq!(exec_server_target(&server_url_args(None), &settings), None);
}
#[test]
fn exec_uses_cli_server_url() {
let settings = Settings::default();
let mut globals = globals();
globals.server_url = Some("https://cli.example.com".to_string());
assert_eq!(
exec_server_target(&globals, &settings),
exec_server_target(&server_url_args(Some("https://cli.example.com")), &settings),
Some(ServerTarget {
server_base_url: "https://cli.example.com".to_string(),
tls: None,
@ -166,7 +168,7 @@ mod tests {
}),
..Settings::default()
};
assert_eq!(exec_server_target(&globals(), &settings), None);
assert_eq!(exec_server_target(&server_url_args(None), &settings), None);
}
#[test]
@ -179,7 +181,7 @@ mod tests {
..Settings::default()
};
assert_eq!(
model_server_target(&globals(), &settings),
model_server_target(&model_target_args(None, None), &settings),
Some(ServerTarget {
server_base_url: "https://config.example.com".to_string(),
tls: None,
@ -196,10 +198,11 @@ mod tests {
}),
..Settings::default()
};
let mut globals = globals();
globals.server_url = Some("https://cli.example.com".to_string());
assert_eq!(
model_server_target(&globals, &settings),
model_server_target(
&model_target_args(None, Some("https://cli.example.com")),
&settings
),
Some(ServerTarget {
server_base_url: "https://cli.example.com".to_string(),
tls: None,
@ -216,9 +219,10 @@ mod tests {
}),
..Settings::default()
};
let mut globals = globals();
globals.storage_dir = Some(PathBuf::from("/tmp/fabro"));
assert_eq!(model_server_target(&globals, &settings), None);
assert_eq!(
model_server_target(&model_target_args(Some("/tmp/fabro"), None), &settings),
None
);
}
#[test]
@ -235,10 +239,8 @@ mod tests {
}),
..Settings::default()
};
let mut globals = globals();
globals.server_url = Some("https://cli.example.com".to_string());
assert_eq!(
exec_server_target(&globals, &settings),
exec_server_target(&server_url_args(Some("https://cli.example.com")), &settings),
Some(ServerTarget {
server_base_url: "https://cli.example.com".to_string(),
tls: Some(tls),

View file

@ -19,14 +19,12 @@ fn help() {
help Print this message or the help of the given subcommand(s)
Options:
--json Output as JSON [env: FABRO_JSON=]
--debug Enable DEBUG-level logging (default is INFO) [env: FABRO_DEBUG=]
--no-upgrade-check Disable automatic upgrade check [env: FABRO_NO_UPGRADE_CHECK=true]
--quiet Suppress non-essential output [env: FABRO_QUIET=]
--verbose Enable verbose output [env: FABRO_VERBOSE=]
--storage-dir <STORAGE_DIR> Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]]
--server-url <SERVER_URL> Fabro API server URL (overrides server.base_url from user.toml when supported) [env: FABRO_SERVER_URL=]
-h, --help Print help
--json Output as JSON [env: FABRO_JSON=]
--debug Enable DEBUG-level logging (default is INFO) [env: FABRO_DEBUG=]
--no-upgrade-check Disable automatic upgrade check [env: FABRO_NO_UPGRADE_CHECK=true]
--quiet Suppress non-essential output [env: FABRO_QUIET=]
--verbose Enable verbose output [env: FABRO_VERBOSE=]
-h, --help Print help
----- stderr -----
");
}

View file

@ -21,15 +21,14 @@ fn help() {
Options:
--json Output as JSON [env: FABRO_JSON=]
--node <NODE> Filter to artifacts from a specific node
--debug Enable DEBUG-level logging (default is INFO) [env: FABRO_DEBUG=]
--retry <RETRY> Filter to artifacts from a specific retry attempt
--no-upgrade-check Disable automatic upgrade check [env: FABRO_NO_UPGRADE_CHECK=true]
--tree Preserve {node_slug}/retry_{N}/ directory structure
--quiet Suppress non-essential output [env: FABRO_QUIET=]
--verbose Enable verbose output [env: FABRO_VERBOSE=]
--storage-dir <STORAGE_DIR> Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]]
--server-url <SERVER_URL> Fabro API server URL (overrides server.base_url from user.toml when supported) [env: FABRO_SERVER_URL=]
--debug Enable DEBUG-level logging (default is INFO) [env: FABRO_DEBUG=]
--node <NODE> Filter to artifacts from a specific node
--no-upgrade-check Disable automatic upgrade check [env: FABRO_NO_UPGRADE_CHECK=true]
--retry <RETRY> Filter to artifacts from a specific retry attempt
--quiet Suppress non-essential output [env: FABRO_QUIET=]
--tree Preserve {node_slug}/retry_{N}/ directory structure
--verbose Enable verbose output [env: FABRO_VERBOSE=]
-h, --help Print help
----- stderr -----
");

View file

@ -20,14 +20,13 @@ fn help() {
Options:
--json Output as JSON [env: FABRO_JSON=]
--node <NODE> Filter to artifacts from a specific node
--storage-dir <STORAGE_DIR> Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]]
--debug Enable DEBUG-level logging (default is INFO) [env: FABRO_DEBUG=]
--retry <RETRY> Filter to artifacts from a specific retry attempt
--node <NODE> Filter to artifacts from a specific node
--no-upgrade-check Disable automatic upgrade check [env: FABRO_NO_UPGRADE_CHECK=true]
--retry <RETRY> Filter to artifacts from a specific retry attempt
--quiet Suppress non-essential output [env: FABRO_QUIET=]
--verbose Enable verbose output [env: FABRO_VERBOSE=]
--storage-dir <STORAGE_DIR> Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]]
--server-url <SERVER_URL> Fabro API server URL (overrides server.base_url from user.toml when supported) [env: FABRO_SERVER_URL=]
-h, --help Print help
----- stderr -----
");

View file

@ -27,12 +27,11 @@ fn help() {
Options:
--json Output as JSON [env: FABRO_JSON=]
--storage-dir <STORAGE_DIR> Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]]
--debug Enable DEBUG-level logging (default is INFO) [env: FABRO_DEBUG=]
--no-upgrade-check Disable automatic upgrade check [env: FABRO_NO_UPGRADE_CHECK=true]
--quiet Suppress non-essential output [env: FABRO_QUIET=]
--verbose Enable verbose output [env: FABRO_VERBOSE=]
--storage-dir <STORAGE_DIR> Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]]
--server-url <SERVER_URL> Fabro API server URL (overrides server.base_url from user.toml when supported) [env: FABRO_SERVER_URL=]
-h, --help Print help
----- stderr -----
");
@ -51,7 +50,7 @@ fn attach_requires_run_arg() {
error: the following required arguments were not provided:
<RUN>
Usage: fabro attach --no-upgrade-check --storage-dir <STORAGE_DIR> <RUN>
Usage: fabro attach --storage-dir <STORAGE_DIR> --no-upgrade-check <RUN>
For more information, try '--help'.
");

View file

@ -17,14 +17,12 @@ fn help() {
<SHELL> Shell to generate completions for [possible values: bash, elvish, fish, powershell, zsh]
Options:
--json Output as JSON [env: FABRO_JSON=]
--debug Enable DEBUG-level logging (default is INFO) [env: FABRO_DEBUG=]
--no-upgrade-check Disable automatic upgrade check [env: FABRO_NO_UPGRADE_CHECK=true]
--quiet Suppress non-essential output [env: FABRO_QUIET=]
--verbose Enable verbose output [env: FABRO_VERBOSE=]
--storage-dir <STORAGE_DIR> Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]]
--server-url <SERVER_URL> Fabro API server URL (overrides server.base_url from user.toml when supported) [env: FABRO_SERVER_URL=]
-h, --help Print help
--json Output as JSON [env: FABRO_JSON=]
--debug Enable DEBUG-level logging (default is INFO) [env: FABRO_DEBUG=]
--no-upgrade-check Disable automatic upgrade check [env: FABRO_NO_UPGRADE_CHECK=true]
--quiet Suppress non-essential output [env: FABRO_QUIET=]
--verbose Enable verbose output [env: FABRO_VERBOSE=]
-h, --help Print help
----- stderr -----
");
}

View file

@ -26,12 +26,11 @@ fn help() {
Options:
--json Output as JSON [env: FABRO_JSON=]
--storage-dir <STORAGE_DIR> Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]]
--debug Enable DEBUG-level logging (default is INFO) [env: FABRO_DEBUG=]
--no-upgrade-check Disable automatic upgrade check [env: FABRO_NO_UPGRADE_CHECK=true]
--quiet Suppress non-essential output [env: FABRO_QUIET=]
--verbose Enable verbose output [env: FABRO_VERBOSE=]
--storage-dir <STORAGE_DIR> Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]]
--server-url <SERVER_URL> Fabro API server URL (overrides server.base_url from user.toml when supported) [env: FABRO_SERVER_URL=]
-h, --help Print help
----- stderr -----
");
@ -577,32 +576,14 @@ shared = "legacy"
}
#[test]
fn settings_server_url_overrides_cli_defaults() {
fn settings_rejects_server_url_flag() {
let context = test_context!();
let project = setup_settings_fixture(&context);
let user_toml_path = context.home_dir.join(".fabro/user.toml");
let existing = std::fs::read_to_string(&user_toml_path).unwrap();
context.write_home(
".fabro/user.toml",
format!("{existing}\n[server]\nbase_url = \"https://config.example.com\"\n"),
);
let output = context
context
.command()
.env_remove("FABRO_STORAGE_DIR")
.current_dir(project.path())
.args(["--server-url", "https://cli.example.com", "settings"])
.assert()
.success()
.get_output()
.stdout
.clone();
let cfg = parse_settings(&output);
assert_eq!(
cfg.server
.as_ref()
.and_then(|server| server.base_url.as_deref()),
Some("https://cli.example.com")
);
.failure()
.stderr(predicate::str::contains(
"unexpected argument '--server-url' found",
));
}

View file

@ -24,18 +24,17 @@ fn help() {
<WORKFLOW> Path to a .fabro workflow file or .toml task config
Options:
--dry-run Execute with simulated LLM backend
--json Output as JSON [env: FABRO_JSON=]
--auto-approve Auto-approve all human gates
--storage-dir <STORAGE_DIR> Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]]
--debug Enable DEBUG-level logging (default is INFO) [env: FABRO_DEBUG=]
--goal <GOAL> Override the workflow goal (exposed as $goal in prompts)
--dry-run Execute with simulated LLM backend
--auto-approve Auto-approve all human gates
--no-upgrade-check Disable automatic upgrade check [env: FABRO_NO_UPGRADE_CHECK=true]
--goal-file <GOAL_FILE> Read the workflow goal from a file
--goal <GOAL> Override the workflow goal (exposed as $goal in prompts)
--quiet Suppress non-essential output [env: FABRO_QUIET=]
--goal-file <GOAL_FILE> Read the workflow goal from a file
--model <MODEL> Override default LLM model
--provider <PROVIDER> Override default LLM provider
--storage-dir <STORAGE_DIR> Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]]
--server-url <SERVER_URL> Fabro API server URL (overrides server.base_url from user.toml when supported) [env: FABRO_SERVER_URL=]
-v, --verbose Enable verbose output
--sandbox <SANDBOX> Sandbox for agent tools [possible values: local, docker, daytona]
--label <KEY=VALUE> Attach a label to this run (repeatable, format: KEY=VALUE)

View file

@ -20,15 +20,14 @@ fn help() {
Options:
--json Output as JSON [env: FABRO_JSON=]
--node <NODE> Show diff for a specific node
--debug Enable DEBUG-level logging (default is INFO) [env: FABRO_DEBUG=]
--stat Show diffstat instead of full patch (live diffs only)
--no-upgrade-check Disable automatic upgrade check [env: FABRO_NO_UPGRADE_CHECK=true]
--shortstat Show only files-changed/insertions/deletions summary (live diffs only)
--quiet Suppress non-essential output [env: FABRO_QUIET=]
--verbose Enable verbose output [env: FABRO_VERBOSE=]
--storage-dir <STORAGE_DIR> Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]]
--server-url <SERVER_URL> Fabro API server URL (overrides server.base_url from user.toml when supported) [env: FABRO_SERVER_URL=]
--debug Enable DEBUG-level logging (default is INFO) [env: FABRO_DEBUG=]
--node <NODE> Show diff for a specific node
--no-upgrade-check Disable automatic upgrade check [env: FABRO_NO_UPGRADE_CHECK=true]
--stat Show diffstat instead of full patch (live diffs only)
--quiet Suppress non-essential output [env: FABRO_QUIET=]
--shortstat Show only files-changed/insertions/deletions summary (live diffs only)
--verbose Enable verbose output [env: FABRO_VERBOSE=]
-h, --help Print help
----- stderr -----
");

View file

@ -14,14 +14,12 @@ fn help() {
Usage: fabro discord [OPTIONS]
Options:
--json Output as JSON [env: FABRO_JSON=]
--debug Enable DEBUG-level logging (default is INFO) [env: FABRO_DEBUG=]
--no-upgrade-check Disable automatic upgrade check [env: FABRO_NO_UPGRADE_CHECK=true]
--quiet Suppress non-essential output [env: FABRO_QUIET=]
--verbose Enable verbose output [env: FABRO_VERBOSE=]
--storage-dir <STORAGE_DIR> Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]]
--server-url <SERVER_URL> Fabro API server URL (overrides server.base_url from user.toml when supported) [env: FABRO_SERVER_URL=]
-h, --help Print help
--json Output as JSON [env: FABRO_JSON=]
--debug Enable DEBUG-level logging (default is INFO) [env: FABRO_DEBUG=]
--no-upgrade-check Disable automatic upgrade check [env: FABRO_NO_UPGRADE_CHECK=true]
--quiet Suppress non-essential output [env: FABRO_QUIET=]
--verbose Enable verbose output [env: FABRO_VERBOSE=]
-h, --help Print help
----- stderr -----
");
}

View file

@ -14,14 +14,12 @@ fn help() {
Usage: fabro docs [OPTIONS]
Options:
--json Output as JSON [env: FABRO_JSON=]
--debug Enable DEBUG-level logging (default is INFO) [env: FABRO_DEBUG=]
--no-upgrade-check Disable automatic upgrade check [env: FABRO_NO_UPGRADE_CHECK=true]
--quiet Suppress non-essential output [env: FABRO_QUIET=]
--verbose Enable verbose output [env: FABRO_VERBOSE=]
--storage-dir <STORAGE_DIR> Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]]
--server-url <SERVER_URL> Fabro API server URL (overrides server.base_url from user.toml when supported) [env: FABRO_SERVER_URL=]
-h, --help Print help
--json Output as JSON [env: FABRO_JSON=]
--debug Enable DEBUG-level logging (default is INFO) [env: FABRO_DEBUG=]
--no-upgrade-check Disable automatic upgrade check [env: FABRO_NO_UPGRADE_CHECK=true]
--quiet Suppress non-essential output [env: FABRO_QUIET=]
--verbose Enable verbose output [env: FABRO_VERBOSE=]
-h, --help Print help
----- stderr -----
");
}

View file

@ -25,15 +25,13 @@ fn help() {
Usage: fabro doctor [OPTIONS]
Options:
--json Output as JSON [env: FABRO_JSON=]
-v, --verbose Show detailed information for each check
--debug Enable DEBUG-level logging (default is INFO) [env: FABRO_DEBUG=]
--dry-run Skip live service probes (LLM, sandbox, API, web, Brave Search)
--no-upgrade-check Disable automatic upgrade check [env: FABRO_NO_UPGRADE_CHECK=true]
--quiet Suppress non-essential output [env: FABRO_QUIET=]
--storage-dir <STORAGE_DIR> Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]]
--server-url <SERVER_URL> Fabro API server URL (overrides server.base_url from user.toml when supported) [env: FABRO_SERVER_URL=]
-h, --help Print help
--json Output as JSON [env: FABRO_JSON=]
-v, --verbose Show detailed information for each check
--debug Enable DEBUG-level logging (default is INFO) [env: FABRO_DEBUG=]
--dry-run Skip live service probes (LLM, sandbox, API, web, Brave Search)
--no-upgrade-check Disable automatic upgrade check [env: FABRO_NO_UPGRADE_CHECK=true]
--quiet Suppress non-essential output [env: FABRO_QUIET=]
-h, --help Print help
----- stderr -----
");
}

View file

@ -29,16 +29,15 @@ fn help() {
Options:
--json Output as JSON [env: FABRO_JSON=]
--server-url <SERVER_URL> Fabro API server URL (overrides server.base_url from user.toml when supported) [env: FABRO_SERVER_URL=]
--provider <PROVIDER> LLM provider (anthropic, openai, gemini, kimi, zai, minimax, inception)
--model <MODEL> Model name (defaults per provider)
--no-upgrade-check Disable automatic upgrade check [env: FABRO_NO_UPGRADE_CHECK=true]
--permissions <PERMISSIONS> Permission level for tool execution [possible values: read-only, read-write, full]
--auto-approve Skip interactive prompts; deny tools outside permission level
--quiet Suppress non-essential output [env: FABRO_QUIET=]
--auto-approve Skip interactive prompts; deny tools outside permission level
--debug Print LLM request/response debug info to stderr
--storage-dir <STORAGE_DIR> Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]]
--verbose Print full LLM request/response JSON to stderr
--server-url <SERVER_URL> Fabro API server URL (overrides server.base_url from user.toml when supported) [env: FABRO_SERVER_URL=]
--skills-dir <SKILLS_DIR> Directory containing skill files (overrides default discovery)
--output-format <OUTPUT_FORMAT> Output format (text for human-readable, json for NDJSON event stream) [possible values: text, json]
-h, --help Print help
@ -74,7 +73,7 @@ fn no_prompt() {
error: the following required arguments were not provided:
<PROMPT>
Usage: fabro exec --no-upgrade-check --storage-dir <STORAGE_DIR> <PROMPT>
Usage: fabro exec --no-upgrade-check <PROMPT>
For more information, try '--help'.
");

View file

@ -47,15 +47,13 @@ fn help() {
help Print this message or the help of the given subcommand(s)
Options:
--json Output as JSON [env: FABRO_JSON=]
--debug Enable DEBUG-level logging (default is INFO) [env: FABRO_DEBUG=]
--no-upgrade-check Disable automatic upgrade check [env: FABRO_NO_UPGRADE_CHECK=true]
--quiet Suppress non-essential output [env: FABRO_QUIET=]
--verbose Enable verbose output [env: FABRO_VERBOSE=]
--storage-dir <STORAGE_DIR> Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]]
--server-url <SERVER_URL> Fabro API server URL (overrides server.base_url from user.toml when supported) [env: FABRO_SERVER_URL=]
-h, --help Print help
-V, --version Print version
--json Output as JSON [env: FABRO_JSON=]
--debug Enable DEBUG-level logging (default is INFO) [env: FABRO_DEBUG=]
--no-upgrade-check Disable automatic upgrade check [env: FABRO_NO_UPGRADE_CHECK=true]
--quiet Suppress non-essential output [env: FABRO_QUIET=]
--verbose Enable verbose output [env: FABRO_VERBOSE=]
-h, --help Print help
-V, --version Print version
----- stderr -----
");
}

View file

@ -26,14 +26,13 @@ fn help() {
Options:
--json Output as JSON [env: FABRO_JSON=]
--list Show the checkpoint timeline instead of forking
--storage-dir <STORAGE_DIR> Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]]
--debug Enable DEBUG-level logging (default is INFO) [env: FABRO_DEBUG=]
--list Show the checkpoint timeline instead of forking
--no-push Skip pushing new branches to the remote
--no-upgrade-check Disable automatic upgrade check [env: FABRO_NO_UPGRADE_CHECK=true]
--quiet Suppress non-essential output [env: FABRO_QUIET=]
--verbose Enable verbose output [env: FABRO_VERBOSE=]
--storage-dir <STORAGE_DIR> Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]]
--server-url <SERVER_URL> Fabro API server URL (overrides server.base_url from user.toml when supported) [env: FABRO_SERVER_URL=]
-h, --help Print help
----- stderr -----
");

View file

@ -61,16 +61,6 @@ fn help() {
[env: FABRO_VERBOSE=]
--storage-dir <STORAGE_DIR>
Local storage directory (default: ~/.fabro)
[env: FABRO_STORAGE_DIR=[STORAGE_DIR]]
--server-url <SERVER_URL>
Fabro API server URL (overrides server.base_url from user.toml when supported)
[env: FABRO_SERVER_URL=]
-h, --help
Print help (see a summary with '-h')
----- stderr -----

View file

@ -25,12 +25,11 @@ fn help() {
Options:
--json Output as JSON [env: FABRO_JSON=]
--storage-dir <STORAGE_DIR> Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]]
--debug Enable DEBUG-level logging (default is INFO) [env: FABRO_DEBUG=]
--no-upgrade-check Disable automatic upgrade check [env: FABRO_NO_UPGRADE_CHECK=true]
--quiet Suppress non-essential output [env: FABRO_QUIET=]
--verbose Enable verbose output [env: FABRO_VERBOSE=]
--storage-dir <STORAGE_DIR> Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]]
--server-url <SERVER_URL> Fabro API server URL (overrides server.base_url from user.toml when supported) [env: FABRO_SERVER_URL=]
-h, --help Print help
----- stderr -----
");

View file

@ -14,15 +14,13 @@ fn help() {
Usage: fabro install [OPTIONS]
Options:
--json Output as JSON [env: FABRO_JSON=]
--web-url <WEB_URL> Base URL for the web UI (used for OAuth callback URLs) [default: http://localhost:3000]
--debug Enable DEBUG-level logging (default is INFO) [env: FABRO_DEBUG=]
--no-upgrade-check Disable automatic upgrade check [env: FABRO_NO_UPGRADE_CHECK=true]
--quiet Suppress non-essential output [env: FABRO_QUIET=]
--verbose Enable verbose output [env: FABRO_VERBOSE=]
--storage-dir <STORAGE_DIR> Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]]
--server-url <SERVER_URL> Fabro API server URL (overrides server.base_url from user.toml when supported) [env: FABRO_SERVER_URL=]
-h, --help Print help
--json Output as JSON [env: FABRO_JSON=]
--web-url <WEB_URL> Base URL for the web UI (used for OAuth callback URLs) [default: http://localhost:3000]
--debug Enable DEBUG-level logging (default is INFO) [env: FABRO_DEBUG=]
--no-upgrade-check Disable automatic upgrade check [env: FABRO_NO_UPGRADE_CHECK=true]
--quiet Suppress non-essential output [env: FABRO_QUIET=]
--verbose Enable verbose output [env: FABRO_VERBOSE=]
-h, --help Print help
----- stderr -----
");
}

View file

@ -60,17 +60,16 @@ fn help() {
<RUN> Run ID prefix or workflow name (most recent run)
Options:
-f, --follow Follow log output
--json Output as JSON [env: FABRO_JSON=]
--storage-dir <STORAGE_DIR> Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]]
--debug Enable DEBUG-level logging (default is INFO) [env: FABRO_DEBUG=]
-f, --follow Follow log output
--no-upgrade-check Disable automatic upgrade check [env: FABRO_NO_UPGRADE_CHECK=true]
--since <SINCE> Logs since timestamp or relative (e.g. "42m", "2h", "2026-01-02T13:00:00Z")
-n, --tail <TAIL> Lines from end (default: all)
--no-upgrade-check Disable automatic upgrade check [env: FABRO_NO_UPGRADE_CHECK=true]
-p, --pretty Formatted colored output with rendered assistant text
--quiet Suppress non-essential output [env: FABRO_QUIET=]
-p, --pretty Formatted colored output with rendered assistant text
--verbose Enable verbose output [env: FABRO_VERBOSE=]
--storage-dir <STORAGE_DIR> Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]]
--server-url <SERVER_URL> Fabro API server URL (overrides server.base_url from user.toml when supported) [env: FABRO_SERVER_URL=]
-h, --help Print help
----- stderr -----
"#);

View file

@ -20,14 +20,12 @@ fn help() {
help Print this message or the help of the given subcommand(s)
Options:
--json Output as JSON [env: FABRO_JSON=]
--debug Enable DEBUG-level logging (default is INFO) [env: FABRO_DEBUG=]
--no-upgrade-check Disable automatic upgrade check [env: FABRO_NO_UPGRADE_CHECK=true]
--quiet Suppress non-essential output [env: FABRO_QUIET=]
--verbose Enable verbose output [env: FABRO_VERBOSE=]
--storage-dir <STORAGE_DIR> Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]]
--server-url <SERVER_URL> Fabro API server URL (overrides server.base_url from user.toml when supported) [env: FABRO_SERVER_URL=]
-h, --help Print help
--json Output as JSON [env: FABRO_JSON=]
--debug Enable DEBUG-level logging (default is INFO) [env: FABRO_DEBUG=]
--no-upgrade-check Disable automatic upgrade check [env: FABRO_NO_UPGRADE_CHECK=true]
--quiet Suppress non-essential output [env: FABRO_QUIET=]
--verbose Enable verbose output [env: FABRO_VERBOSE=]
-h, --help Print help
----- stderr -----
");
}

View file

@ -15,14 +15,14 @@ fn help() {
Options:
--json Output as JSON [env: FABRO_JSON=]
-p, --provider <PROVIDER> Filter by provider
--storage-dir <STORAGE_DIR> Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]]
--debug Enable DEBUG-level logging (default is INFO) [env: FABRO_DEBUG=]
-q, --query <QUERY> Search for models matching this string
--server-url <SERVER_URL> Fabro API server URL (overrides server.base_url from user.toml when supported) [env: FABRO_SERVER_URL=]
--no-upgrade-check Disable automatic upgrade check [env: FABRO_NO_UPGRADE_CHECK=true]
-p, --provider <PROVIDER> Filter by provider
-q, --query <QUERY> Search for models matching this string
--quiet Suppress non-essential output [env: FABRO_QUIET=]
--verbose Enable verbose output [env: FABRO_VERBOSE=]
--storage-dir <STORAGE_DIR> Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]]
--server-url <SERVER_URL> Fabro API server URL (overrides server.base_url from user.toml when supported) [env: FABRO_SERVER_URL=]
-h, --help Print help
----- stderr -----
");

View file

@ -15,15 +15,15 @@ fn help() {
Options:
--json Output as JSON [env: FABRO_JSON=]
-p, --provider <PROVIDER> Filter by provider
--debug Enable DEBUG-level logging (default is INFO) [env: FABRO_DEBUG=]
-m, --model <MODEL> Test a specific model
--deep Run a multi-turn tool-use test (catches reasoning round-trip bugs)
--no-upgrade-check Disable automatic upgrade check [env: FABRO_NO_UPGRADE_CHECK=true]
--quiet Suppress non-essential output [env: FABRO_QUIET=]
--verbose Enable verbose output [env: FABRO_VERBOSE=]
--storage-dir <STORAGE_DIR> Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]]
--debug Enable DEBUG-level logging (default is INFO) [env: FABRO_DEBUG=]
--server-url <SERVER_URL> Fabro API server URL (overrides server.base_url from user.toml when supported) [env: FABRO_SERVER_URL=]
--no-upgrade-check Disable automatic upgrade check [env: FABRO_NO_UPGRADE_CHECK=true]
-p, --provider <PROVIDER> Filter by provider
-m, --model <MODEL> Test a specific model
--quiet Suppress non-essential output [env: FABRO_QUIET=]
--deep Run a multi-turn tool-use test (catches reasoning round-trip bugs)
--verbose Enable verbose output [env: FABRO_VERBOSE=]
-h, --help Print help
----- stderr -----
");

View file

@ -17,14 +17,12 @@ fn help() {
<WORKFLOW> Path to the .fabro workflow file
Options:
--json Output as JSON [env: FABRO_JSON=]
--debug Enable DEBUG-level logging (default is INFO) [env: FABRO_DEBUG=]
--no-upgrade-check Disable automatic upgrade check [env: FABRO_NO_UPGRADE_CHECK=true]
--quiet Suppress non-essential output [env: FABRO_QUIET=]
--verbose Enable verbose output [env: FABRO_VERBOSE=]
--storage-dir <STORAGE_DIR> Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]]
--server-url <SERVER_URL> Fabro API server URL (overrides server.base_url from user.toml when supported) [env: FABRO_SERVER_URL=]
-h, --help Print help
--json Output as JSON [env: FABRO_JSON=]
--debug Enable DEBUG-level logging (default is INFO) [env: FABRO_DEBUG=]
--no-upgrade-check Disable automatic upgrade check [env: FABRO_NO_UPGRADE_CHECK=true]
--quiet Suppress non-essential output [env: FABRO_QUIET=]
--verbose Enable verbose output [env: FABRO_VERBOSE=]
-h, --help Print help
----- stderr -----
");
}

View file

@ -22,14 +22,12 @@ fn help() {
help Print this message or the help of the given subcommand(s)
Options:
--json Output as JSON [env: FABRO_JSON=]
--debug Enable DEBUG-level logging (default is INFO) [env: FABRO_DEBUG=]
--no-upgrade-check Disable automatic upgrade check [env: FABRO_NO_UPGRADE_CHECK=true]
--quiet Suppress non-essential output [env: FABRO_QUIET=]
--verbose Enable verbose output [env: FABRO_VERBOSE=]
--storage-dir <STORAGE_DIR> Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]]
--server-url <SERVER_URL> Fabro API server URL (overrides server.base_url from user.toml when supported) [env: FABRO_SERVER_URL=]
-h, --help Print help
--json Output as JSON [env: FABRO_JSON=]
--debug Enable DEBUG-level logging (default is INFO) [env: FABRO_DEBUG=]
--no-upgrade-check Disable automatic upgrade check [env: FABRO_NO_UPGRADE_CHECK=true]
--quiet Suppress non-essential output [env: FABRO_QUIET=]
--verbose Enable verbose output [env: FABRO_VERBOSE=]
-h, --help Print help
----- stderr -----
");
}

View file

@ -18,12 +18,11 @@ fn help() {
Options:
--json Output as JSON [env: FABRO_JSON=]
--storage-dir <STORAGE_DIR> Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]]
--debug Enable DEBUG-level logging (default is INFO) [env: FABRO_DEBUG=]
--no-upgrade-check Disable automatic upgrade check [env: FABRO_NO_UPGRADE_CHECK=true]
--quiet Suppress non-essential output [env: FABRO_QUIET=]
--verbose Enable verbose output [env: FABRO_VERBOSE=]
--storage-dir <STORAGE_DIR> Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]]
--server-url <SERVER_URL> Fabro API server URL (overrides server.base_url from user.toml when supported) [env: FABRO_SERVER_URL=]
-h, --help Print help
----- stderr -----
");

View file

@ -20,13 +20,12 @@ fn help() {
Options:
--json Output as JSON [env: FABRO_JSON=]
--model <MODEL> LLM model for generating PR description
--storage-dir <STORAGE_DIR> Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]]
--debug Enable DEBUG-level logging (default is INFO) [env: FABRO_DEBUG=]
--model <MODEL> LLM model for generating PR description
--no-upgrade-check Disable automatic upgrade check [env: FABRO_NO_UPGRADE_CHECK=true]
--quiet Suppress non-essential output [env: FABRO_QUIET=]
--verbose Enable verbose output [env: FABRO_VERBOSE=]
--storage-dir <STORAGE_DIR> Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]]
--server-url <SERVER_URL> Fabro API server URL (overrides server.base_url from user.toml when supported) [env: FABRO_SERVER_URL=]
-h, --help Print help
----- stderr -----
");

View file

@ -14,14 +14,13 @@ fn help() {
Usage: fabro pr list [OPTIONS]
Options:
--all Show all PRs (including closed/merged), not just open
--json Output as JSON [env: FABRO_JSON=]
--storage-dir <STORAGE_DIR> Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]]
--all Show all PRs (including closed/merged), not just open
--debug Enable DEBUG-level logging (default is INFO) [env: FABRO_DEBUG=]
--no-upgrade-check Disable automatic upgrade check [env: FABRO_NO_UPGRADE_CHECK=true]
--quiet Suppress non-essential output [env: FABRO_QUIET=]
--verbose Enable verbose output [env: FABRO_VERBOSE=]
--storage-dir <STORAGE_DIR> Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]]
--server-url <SERVER_URL> Fabro API server URL (overrides server.base_url from user.toml when supported) [env: FABRO_SERVER_URL=]
-h, --help Print help
----- stderr -----
");

View file

@ -18,13 +18,12 @@ fn help() {
Options:
--json Output as JSON [env: FABRO_JSON=]
--method <METHOD> Merge method: merge, squash, or rebase [default: squash]
--storage-dir <STORAGE_DIR> Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]]
--debug Enable DEBUG-level logging (default is INFO) [env: FABRO_DEBUG=]
--method <METHOD> Merge method: merge, squash, or rebase [default: squash]
--no-upgrade-check Disable automatic upgrade check [env: FABRO_NO_UPGRADE_CHECK=true]
--quiet Suppress non-essential output [env: FABRO_QUIET=]
--verbose Enable verbose output [env: FABRO_VERBOSE=]
--storage-dir <STORAGE_DIR> Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]]
--server-url <SERVER_URL> Fabro API server URL (overrides server.base_url from user.toml when supported) [env: FABRO_SERVER_URL=]
-h, --help Print help
----- stderr -----
");

View file

@ -24,12 +24,11 @@ fn help() {
Options:
--json Output as JSON [env: FABRO_JSON=]
--storage-dir <STORAGE_DIR> Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]]
--debug Enable DEBUG-level logging (default is INFO) [env: FABRO_DEBUG=]
--no-upgrade-check Disable automatic upgrade check [env: FABRO_NO_UPGRADE_CHECK=true]
--quiet Suppress non-essential output [env: FABRO_QUIET=]
--verbose Enable verbose output [env: FABRO_VERBOSE=]
--storage-dir <STORAGE_DIR> Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]]
--server-url <SERVER_URL> Fabro API server URL (overrides server.base_url from user.toml when supported) [env: FABRO_SERVER_URL=]
-h, --help Print help
----- stderr -----
");

View file

@ -20,18 +20,17 @@ fn help() {
<WORKFLOW> Path to a .fabro workflow file or .toml task config
Options:
--goal <GOAL> Override the workflow goal (exposed as $goal in prompts)
--json Output as JSON [env: FABRO_JSON=]
--storage-dir <STORAGE_DIR> Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]]
--debug Enable DEBUG-level logging (default is INFO) [env: FABRO_DEBUG=]
--goal <GOAL> Override the workflow goal (exposed as $goal in prompts)
--goal-file <GOAL_FILE> Read the workflow goal from a file
--model <MODEL> Override default LLM model
--no-upgrade-check Disable automatic upgrade check [env: FABRO_NO_UPGRADE_CHECK=true]
--provider <PROVIDER> Override default LLM provider
--model <MODEL> Override default LLM model
--quiet Suppress non-essential output [env: FABRO_QUIET=]
--provider <PROVIDER> Override default LLM provider
-v, --verbose Enable verbose output
--sandbox <SANDBOX> Sandbox for agent tools [possible values: local, docker, daytona]
--storage-dir <STORAGE_DIR> Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]]
--server-url <SERVER_URL> Fabro API server URL (overrides server.base_url from user.toml when supported) [env: FABRO_SERVER_URL=]
-h, --help Print help
----- stderr -----
");

View file

@ -18,14 +18,12 @@ fn help() {
help Print this message or the help of the given subcommand(s)
Options:
--json Output as JSON [env: FABRO_JSON=]
--debug Enable DEBUG-level logging (default is INFO) [env: FABRO_DEBUG=]
--no-upgrade-check Disable automatic upgrade check [env: FABRO_NO_UPGRADE_CHECK=true]
--quiet Suppress non-essential output [env: FABRO_QUIET=]
--verbose Enable verbose output [env: FABRO_VERBOSE=]
--storage-dir <STORAGE_DIR> Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]]
--server-url <SERVER_URL> Fabro API server URL (overrides server.base_url from user.toml when supported) [env: FABRO_SERVER_URL=]
-h, --help Print help
--json Output as JSON [env: FABRO_JSON=]
--debug Enable DEBUG-level logging (default is INFO) [env: FABRO_DEBUG=]
--no-upgrade-check Disable automatic upgrade check [env: FABRO_NO_UPGRADE_CHECK=true]
--quiet Suppress non-essential output [env: FABRO_QUIET=]
--verbose Enable verbose output [env: FABRO_VERBOSE=]
-h, --help Print help
----- stderr -----
");
}

View file

@ -14,15 +14,13 @@ fn help() {
Usage: fabro provider login [OPTIONS] --provider <PROVIDER>
Options:
--json Output as JSON [env: FABRO_JSON=]
--provider <PROVIDER> LLM provider to authenticate with
--debug Enable DEBUG-level logging (default is INFO) [env: FABRO_DEBUG=]
--no-upgrade-check Disable automatic upgrade check [env: FABRO_NO_UPGRADE_CHECK=true]
--quiet Suppress non-essential output [env: FABRO_QUIET=]
--verbose Enable verbose output [env: FABRO_VERBOSE=]
--storage-dir <STORAGE_DIR> Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]]
--server-url <SERVER_URL> Fabro API server URL (overrides server.base_url from user.toml when supported) [env: FABRO_SERVER_URL=]
-h, --help Print help
--json Output as JSON [env: FABRO_JSON=]
--provider <PROVIDER> LLM provider to authenticate with
--debug Enable DEBUG-level logging (default is INFO) [env: FABRO_DEBUG=]
--no-upgrade-check Disable automatic upgrade check [env: FABRO_NO_UPGRADE_CHECK=true]
--quiet Suppress non-essential output [env: FABRO_QUIET=]
--verbose Enable verbose output [env: FABRO_VERBOSE=]
-h, --help Print help
----- stderr -----
");
}

View file

@ -17,18 +17,17 @@ fn help() {
Usage: fabro ps [OPTIONS]
Options:
--before <BEFORE> Only include runs started before this date (YYYY-MM-DD prefix match)
--json Output as JSON [env: FABRO_JSON=]
--storage-dir <STORAGE_DIR> Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]]
--before <BEFORE> Only include runs started before this date (YYYY-MM-DD prefix match)
--debug Enable DEBUG-level logging (default is INFO) [env: FABRO_DEBUG=]
--no-upgrade-check Disable automatic upgrade check [env: FABRO_NO_UPGRADE_CHECK=true]
--workflow <WORKFLOW> Filter by workflow name (substring match)
--label <KEY=VALUE> Filter by label (KEY=VALUE, repeatable, AND semantics)
--no-upgrade-check Disable automatic upgrade check [env: FABRO_NO_UPGRADE_CHECK=true]
--orphans Include orphan directories (no run.json)
-a, --all Show all runs, not just running (like docker ps -a)
--verbose Enable verbose output [env: FABRO_VERBOSE=]
-a, --all Show all runs, not just running (like docker ps -a)
-q, --quiet Only display run IDs
--storage-dir <STORAGE_DIR> Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]]
--server-url <SERVER_URL> Fabro API server URL (overrides server.base_url from user.toml when supported) [env: FABRO_SERVER_URL=]
-h, --help Print help
----- stderr -----
");

View file

@ -26,14 +26,12 @@ fn help() {
help Print this message or the help of the given subcommand(s)
Options:
--json Output as JSON [env: FABRO_JSON=]
--debug Enable DEBUG-level logging (default is INFO) [env: FABRO_DEBUG=]
--no-upgrade-check Disable automatic upgrade check [env: FABRO_NO_UPGRADE_CHECK=true]
--quiet Suppress non-essential output [env: FABRO_QUIET=]
--verbose Enable verbose output [env: FABRO_VERBOSE=]
--storage-dir <STORAGE_DIR> Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]]
--server-url <SERVER_URL> Fabro API server URL (overrides server.base_url from user.toml when supported) [env: FABRO_SERVER_URL=]
-h, --help Print help
--json Output as JSON [env: FABRO_JSON=]
--debug Enable DEBUG-level logging (default is INFO) [env: FABRO_DEBUG=]
--no-upgrade-check Disable automatic upgrade check [env: FABRO_NO_UPGRADE_CHECK=true]
--quiet Suppress non-essential output [env: FABRO_QUIET=]
--verbose Enable verbose output [env: FABRO_VERBOSE=]
-h, --help Print help
----- stderr -----
");
}
@ -107,14 +105,12 @@ fn test_repo_init_help_does_not_show_skill() {
Usage: fabro repo init [OPTIONS]
Options:
--json Output as JSON [env: FABRO_JSON=]
--debug Enable DEBUG-level logging (default is INFO) [env: FABRO_DEBUG=]
--no-upgrade-check Disable automatic upgrade check [env: FABRO_NO_UPGRADE_CHECK=true]
--quiet Suppress non-essential output [env: FABRO_QUIET=]
--verbose Enable verbose output [env: FABRO_VERBOSE=]
--storage-dir <STORAGE_DIR> Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]]
--server-url <SERVER_URL> Fabro API server URL (overrides server.base_url from user.toml when supported) [env: FABRO_SERVER_URL=]
-h, --help Print help
--json Output as JSON [env: FABRO_JSON=]
--debug Enable DEBUG-level logging (default is INFO) [env: FABRO_DEBUG=]
--no-upgrade-check Disable automatic upgrade check [env: FABRO_NO_UPGRADE_CHECK=true]
--quiet Suppress non-essential output [env: FABRO_QUIET=]
--verbose Enable verbose output [env: FABRO_VERBOSE=]
-h, --help Print help
----- stderr -----
");
}

View file

@ -14,14 +14,12 @@ fn help() {
Usage: fabro repo deinit [OPTIONS]
Options:
--json Output as JSON [env: FABRO_JSON=]
--debug Enable DEBUG-level logging (default is INFO) [env: FABRO_DEBUG=]
--no-upgrade-check Disable automatic upgrade check [env: FABRO_NO_UPGRADE_CHECK=true]
--quiet Suppress non-essential output [env: FABRO_QUIET=]
--verbose Enable verbose output [env: FABRO_VERBOSE=]
--storage-dir <STORAGE_DIR> Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]]
--server-url <SERVER_URL> Fabro API server URL (overrides server.base_url from user.toml when supported) [env: FABRO_SERVER_URL=]
-h, --help Print help
--json Output as JSON [env: FABRO_JSON=]
--debug Enable DEBUG-level logging (default is INFO) [env: FABRO_DEBUG=]
--no-upgrade-check Disable automatic upgrade check [env: FABRO_NO_UPGRADE_CHECK=true]
--quiet Suppress non-essential output [env: FABRO_QUIET=]
--verbose Enable verbose output [env: FABRO_VERBOSE=]
-h, --help Print help
----- stderr -----
");
}

View file

@ -16,14 +16,12 @@ fn help() {
Usage: fabro repo init [OPTIONS]
Options:
--json Output as JSON [env: FABRO_JSON=]
--debug Enable DEBUG-level logging (default is INFO) [env: FABRO_DEBUG=]
--no-upgrade-check Disable automatic upgrade check [env: FABRO_NO_UPGRADE_CHECK=true]
--quiet Suppress non-essential output [env: FABRO_QUIET=]
--verbose Enable verbose output [env: FABRO_VERBOSE=]
--storage-dir <STORAGE_DIR> Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]]
--server-url <SERVER_URL> Fabro API server URL (overrides server.base_url from user.toml when supported) [env: FABRO_SERVER_URL=]
-h, --help Print help
--json Output as JSON [env: FABRO_JSON=]
--debug Enable DEBUG-level logging (default is INFO) [env: FABRO_DEBUG=]
--no-upgrade-check Disable automatic upgrade check [env: FABRO_NO_UPGRADE_CHECK=true]
--quiet Suppress non-essential output [env: FABRO_QUIET=]
--verbose Enable verbose output [env: FABRO_VERBOSE=]
-h, --help Print help
----- stderr -----
");
}

View file

@ -21,14 +21,13 @@ fn help() {
<RUN> Run ID or unambiguous prefix
Options:
-d, --detach Run in the background and print the run ID
--json Output as JSON [env: FABRO_JSON=]
--storage-dir <STORAGE_DIR> Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]]
-d, --detach Run in the background and print the run ID
--debug Enable DEBUG-level logging (default is INFO) [env: FABRO_DEBUG=]
--no-upgrade-check Disable automatic upgrade check [env: FABRO_NO_UPGRADE_CHECK=true]
--quiet Suppress non-essential output [env: FABRO_QUIET=]
--verbose Enable verbose output [env: FABRO_VERBOSE=]
--storage-dir <STORAGE_DIR> Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]]
--server-url <SERVER_URL> Fabro API server URL (overrides server.base_url from user.toml when supported) [env: FABRO_SERVER_URL=]
-h, --help Print help
----- stderr -----
");
@ -47,7 +46,7 @@ fn resume_requires_run_arg() {
error: the following required arguments were not provided:
<RUN>
Usage: fabro resume --no-upgrade-check --storage-dir <STORAGE_DIR> <RUN>
Usage: fabro resume --storage-dir <STORAGE_DIR> --no-upgrade-check <RUN>
For more information, try '--help'.
");

View file

@ -26,14 +26,13 @@ fn help() {
Options:
--json Output as JSON [env: FABRO_JSON=]
--list Show the checkpoint timeline instead of rewinding
--storage-dir <STORAGE_DIR> Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]]
--debug Enable DEBUG-level logging (default is INFO) [env: FABRO_DEBUG=]
--list Show the checkpoint timeline instead of rewinding
--no-push Skip force-pushing rewound refs to the remote
--no-upgrade-check Disable automatic upgrade check [env: FABRO_NO_UPGRADE_CHECK=true]
--quiet Suppress non-essential output [env: FABRO_QUIET=]
--verbose Enable verbose output [env: FABRO_VERBOSE=]
--storage-dir <STORAGE_DIR> Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]]
--server-url <SERVER_URL> Fabro API server URL (overrides server.base_url from user.toml when supported) [env: FABRO_SERVER_URL=]
-h, --help Print help
----- stderr -----
");

View file

@ -22,14 +22,13 @@ fn help() {
<RUNS>... Run IDs or workflow names to remove
Options:
-f, --force Force removal of active runs
--json Output as JSON [env: FABRO_JSON=]
--storage-dir <STORAGE_DIR> Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]]
--debug Enable DEBUG-level logging (default is INFO) [env: FABRO_DEBUG=]
-f, --force Force removal of active runs
--no-upgrade-check Disable automatic upgrade check [env: FABRO_NO_UPGRADE_CHECK=true]
--quiet Suppress non-essential output [env: FABRO_QUIET=]
--verbose Enable verbose output [env: FABRO_VERBOSE=]
--storage-dir <STORAGE_DIR> Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]]
--server-url <SERVER_URL> Fabro API server URL (overrides server.base_url from user.toml when supported) [env: FABRO_SERVER_URL=]
-h, --help Print help
----- stderr -----
");

View file

@ -27,18 +27,17 @@ fn help() {
<WORKFLOW> Path to a .fabro workflow file or .toml task config
Options:
--dry-run Execute with simulated LLM backend
--json Output as JSON [env: FABRO_JSON=]
--auto-approve Auto-approve all human gates
--storage-dir <STORAGE_DIR> Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]]
--debug Enable DEBUG-level logging (default is INFO) [env: FABRO_DEBUG=]
--goal <GOAL> Override the workflow goal (exposed as $goal in prompts)
--dry-run Execute with simulated LLM backend
--auto-approve Auto-approve all human gates
--no-upgrade-check Disable automatic upgrade check [env: FABRO_NO_UPGRADE_CHECK=true]
--goal-file <GOAL_FILE> Read the workflow goal from a file
--goal <GOAL> Override the workflow goal (exposed as $goal in prompts)
--quiet Suppress non-essential output [env: FABRO_QUIET=]
--goal-file <GOAL_FILE> Read the workflow goal from a file
--model <MODEL> Override default LLM model
--provider <PROVIDER> Override default LLM provider
--storage-dir <STORAGE_DIR> Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]]
--server-url <SERVER_URL> Fabro API server URL (overrides server.base_url from user.toml when supported) [env: FABRO_SERVER_URL=]
-v, --verbose Enable verbose output
--sandbox <SANDBOX> Sandbox for agent tools [possible values: local, docker, daytona]
--label <KEY=VALUE> Attach a label to this run (repeatable, format: KEY=VALUE)

View file

@ -20,14 +20,13 @@ fn help() {
Options:
--json Output as JSON [env: FABRO_JSON=]
--run-id <RUN_ID> Run ID
--storage-dir <STORAGE_DIR> Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]]
--debug Enable DEBUG-level logging (default is INFO) [env: FABRO_DEBUG=]
--resume Resume from checkpoint instead of fresh start
--run-id <RUN_ID> Run ID
--no-upgrade-check Disable automatic upgrade check [env: FABRO_NO_UPGRADE_CHECK=true]
--resume Resume from checkpoint instead of fresh start
--quiet Suppress non-essential output [env: FABRO_QUIET=]
--verbose Enable verbose output [env: FABRO_VERBOSE=]
--storage-dir <STORAGE_DIR> Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]]
--server-url <SERVER_URL> Fabro API server URL (overrides server.base_url from user.toml when supported) [env: FABRO_SERVER_URL=]
-h, --help Print help
----- stderr -----
");

View file

@ -21,13 +21,12 @@ fn help() {
Options:
--json Output as JSON [env: FABRO_JSON=]
-r, --recursive Recurse into directories
--storage-dir <STORAGE_DIR> Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]]
--debug Enable DEBUG-level logging (default is INFO) [env: FABRO_DEBUG=]
-r, --recursive Recurse into directories
--no-upgrade-check Disable automatic upgrade check [env: FABRO_NO_UPGRADE_CHECK=true]
--quiet Suppress non-essential output [env: FABRO_QUIET=]
--verbose Enable verbose output [env: FABRO_VERBOSE=]
--storage-dir <STORAGE_DIR> Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]]
--server-url <SERVER_URL> Fabro API server URL (overrides server.base_url from user.toml when supported) [env: FABRO_SERVER_URL=]
-h, --help Print help
----- stderr -----
");

View file

@ -21,15 +21,14 @@ fn help() {
Options:
--json Output as JSON [env: FABRO_JSON=]
--signed Generate a signed URL (embeds auth token, no headers needed)
--storage-dir <STORAGE_DIR> Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]]
--debug Enable DEBUG-level logging (default is INFO) [env: FABRO_DEBUG=]
--ttl <TTL> Signed URL expiry in seconds (default 3600, requires --signed) [default: 3600]
--signed Generate a signed URL (embeds auth token, no headers needed)
--no-upgrade-check Disable automatic upgrade check [env: FABRO_NO_UPGRADE_CHECK=true]
--ttl <TTL> Signed URL expiry in seconds (default 3600, requires --signed) [default: 3600]
--open Open URL in browser (implies --signed)
--quiet Suppress non-essential output [env: FABRO_QUIET=]
--verbose Enable verbose output [env: FABRO_VERBOSE=]
--storage-dir <STORAGE_DIR> Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]]
--server-url <SERVER_URL> Fabro API server URL (overrides server.base_url from user.toml when supported) [env: FABRO_SERVER_URL=]
-h, --help Print help
----- stderr -----
");

View file

@ -20,14 +20,13 @@ fn help() {
Options:
--json Output as JSON [env: FABRO_JSON=]
--ttl <TTL> SSH access expiry in minutes (default 60) [default: 60]
--storage-dir <STORAGE_DIR> Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]]
--debug Enable DEBUG-level logging (default is INFO) [env: FABRO_DEBUG=]
--print Print the SSH command instead of connecting
--ttl <TTL> SSH access expiry in minutes (default 60) [default: 60]
--no-upgrade-check Disable automatic upgrade check [env: FABRO_NO_UPGRADE_CHECK=true]
--print Print the SSH command instead of connecting
--quiet Suppress non-essential output [env: FABRO_QUIET=]
--verbose Enable verbose output [env: FABRO_VERBOSE=]
--storage-dir <STORAGE_DIR> Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]]
--server-url <SERVER_URL> Fabro API server URL (overrides server.base_url from user.toml when supported) [env: FABRO_SERVER_URL=]
-h, --help Print help
----- stderr -----
");

View file

@ -23,14 +23,12 @@ fn help() {
help Print this message or the help of the given subcommand(s)
Options:
--json Output as JSON [env: FABRO_JSON=]
--debug Enable DEBUG-level logging (default is INFO) [env: FABRO_DEBUG=]
--no-upgrade-check Disable automatic upgrade check [env: FABRO_NO_UPGRADE_CHECK=true]
--quiet Suppress non-essential output [env: FABRO_QUIET=]
--verbose Enable verbose output [env: FABRO_VERBOSE=]
--storage-dir <STORAGE_DIR> Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]]
--server-url <SERVER_URL> Fabro API server URL (overrides server.base_url from user.toml when supported) [env: FABRO_SERVER_URL=]
-h, --help Print help
--json Output as JSON [env: FABRO_JSON=]
--debug Enable DEBUG-level logging (default is INFO) [env: FABRO_DEBUG=]
--no-upgrade-check Disable automatic upgrade check [env: FABRO_NO_UPGRADE_CHECK=true]
--quiet Suppress non-essential output [env: FABRO_QUIET=]
--verbose Enable verbose output [env: FABRO_VERBOSE=]
-h, --help Print help
----- stderr -----
");
}

View file

@ -17,14 +17,12 @@ fn help() {
<KEY> Name of the secret
Options:
--json Output as JSON [env: FABRO_JSON=]
--debug Enable DEBUG-level logging (default is INFO) [env: FABRO_DEBUG=]
--no-upgrade-check Disable automatic upgrade check [env: FABRO_NO_UPGRADE_CHECK=true]
--quiet Suppress non-essential output [env: FABRO_QUIET=]
--verbose Enable verbose output [env: FABRO_VERBOSE=]
--storage-dir <STORAGE_DIR> Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]]
--server-url <SERVER_URL> Fabro API server URL (overrides server.base_url from user.toml when supported) [env: FABRO_SERVER_URL=]
-h, --help Print help
--json Output as JSON [env: FABRO_JSON=]
--debug Enable DEBUG-level logging (default is INFO) [env: FABRO_DEBUG=]
--no-upgrade-check Disable automatic upgrade check [env: FABRO_NO_UPGRADE_CHECK=true]
--quiet Suppress non-essential output [env: FABRO_QUIET=]
--verbose Enable verbose output [env: FABRO_VERBOSE=]
-h, --help Print help
----- stderr -----
");
}

View file

@ -15,15 +15,13 @@ fn help() {
Usage: fabro secret list [OPTIONS]
Options:
--json Output as JSON [env: FABRO_JSON=]
--show-values Show values alongside keys
--debug Enable DEBUG-level logging (default is INFO) [env: FABRO_DEBUG=]
--no-upgrade-check Disable automatic upgrade check [env: FABRO_NO_UPGRADE_CHECK=true]
--quiet Suppress non-essential output [env: FABRO_QUIET=]
--verbose Enable verbose output [env: FABRO_VERBOSE=]
--storage-dir <STORAGE_DIR> Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]]
--server-url <SERVER_URL> Fabro API server URL (overrides server.base_url from user.toml when supported) [env: FABRO_SERVER_URL=]
-h, --help Print help
--json Output as JSON [env: FABRO_JSON=]
--show-values Show values alongside keys
--debug Enable DEBUG-level logging (default is INFO) [env: FABRO_DEBUG=]
--no-upgrade-check Disable automatic upgrade check [env: FABRO_NO_UPGRADE_CHECK=true]
--quiet Suppress non-essential output [env: FABRO_QUIET=]
--verbose Enable verbose output [env: FABRO_VERBOSE=]
-h, --help Print help
----- stderr -----
");
}

View file

@ -17,14 +17,12 @@ fn help() {
<KEY> Name of the secret to remove
Options:
--json Output as JSON [env: FABRO_JSON=]
--debug Enable DEBUG-level logging (default is INFO) [env: FABRO_DEBUG=]
--no-upgrade-check Disable automatic upgrade check [env: FABRO_NO_UPGRADE_CHECK=true]
--quiet Suppress non-essential output [env: FABRO_QUIET=]
--verbose Enable verbose output [env: FABRO_VERBOSE=]
--storage-dir <STORAGE_DIR> Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]]
--server-url <SERVER_URL> Fabro API server URL (overrides server.base_url from user.toml when supported) [env: FABRO_SERVER_URL=]
-h, --help Print help
--json Output as JSON [env: FABRO_JSON=]
--debug Enable DEBUG-level logging (default is INFO) [env: FABRO_DEBUG=]
--no-upgrade-check Disable automatic upgrade check [env: FABRO_NO_UPGRADE_CHECK=true]
--quiet Suppress non-essential output [env: FABRO_QUIET=]
--verbose Enable verbose output [env: FABRO_VERBOSE=]
-h, --help Print help
----- stderr -----
");
}

View file

@ -18,14 +18,12 @@ fn help() {
<VALUE> Value to store
Options:
--json Output as JSON [env: FABRO_JSON=]
--debug Enable DEBUG-level logging (default is INFO) [env: FABRO_DEBUG=]
--no-upgrade-check Disable automatic upgrade check [env: FABRO_NO_UPGRADE_CHECK=true]
--quiet Suppress non-essential output [env: FABRO_QUIET=]
--verbose Enable verbose output [env: FABRO_VERBOSE=]
--storage-dir <STORAGE_DIR> Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]]
--server-url <SERVER_URL> Fabro API server URL (overrides server.base_url from user.toml when supported) [env: FABRO_SERVER_URL=]
-h, --help Print help
--json Output as JSON [env: FABRO_JSON=]
--debug Enable DEBUG-level logging (default is INFO) [env: FABRO_DEBUG=]
--no-upgrade-check Disable automatic upgrade check [env: FABRO_NO_UPGRADE_CHECK=true]
--quiet Suppress non-essential output [env: FABRO_QUIET=]
--verbose Enable verbose output [env: FABRO_VERBOSE=]
-h, --help Print help
----- stderr -----
");
}

View file

@ -17,14 +17,12 @@ fn help() {
<PATH> Path to the JSON event file
Options:
--json Output as JSON [env: FABRO_JSON=]
--debug Enable DEBUG-level logging (default is INFO) [env: FABRO_DEBUG=]
--no-upgrade-check Disable automatic upgrade check [env: FABRO_NO_UPGRADE_CHECK=true]
--quiet Suppress non-essential output [env: FABRO_QUIET=]
--verbose Enable verbose output [env: FABRO_VERBOSE=]
--storage-dir <STORAGE_DIR> Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]]
--server-url <SERVER_URL> Fabro API server URL (overrides server.base_url from user.toml when supported) [env: FABRO_SERVER_URL=]
-h, --help Print help
--json Output as JSON [env: FABRO_JSON=]
--debug Enable DEBUG-level logging (default is INFO) [env: FABRO_DEBUG=]
--no-upgrade-check Disable automatic upgrade check [env: FABRO_NO_UPGRADE_CHECK=true]
--quiet Suppress non-essential output [env: FABRO_QUIET=]
--verbose Enable verbose output [env: FABRO_VERBOSE=]
-h, --help Print help
----- stderr -----
");
}

View file

@ -17,14 +17,12 @@ fn help() {
<PATH> Path to the JSON event file
Options:
--json Output as JSON [env: FABRO_JSON=]
--debug Enable DEBUG-level logging (default is INFO) [env: FABRO_DEBUG=]
--no-upgrade-check Disable automatic upgrade check [env: FABRO_NO_UPGRADE_CHECK=true]
--quiet Suppress non-essential output [env: FABRO_QUIET=]
--verbose Enable verbose output [env: FABRO_VERBOSE=]
--storage-dir <STORAGE_DIR> Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]]
--server-url <SERVER_URL> Fabro API server URL (overrides server.base_url from user.toml when supported) [env: FABRO_SERVER_URL=]
-h, --help Print help
--json Output as JSON [env: FABRO_JSON=]
--debug Enable DEBUG-level logging (default is INFO) [env: FABRO_DEBUG=]
--no-upgrade-check Disable automatic upgrade check [env: FABRO_NO_UPGRADE_CHECK=true]
--quiet Suppress non-essential output [env: FABRO_QUIET=]
--verbose Enable verbose output [env: FABRO_VERBOSE=]
-h, --help Print help
----- stderr -----
");
}

View file

@ -23,34 +23,32 @@ fn help() {
Usage: fabro server start [OPTIONS]
Options:
--foreground
Run in the foreground instead of daemonizing
--json
Output as JSON [env: FABRO_JSON=]
--bind <BIND>
Address to bind to (host:port for TCP, or path containing / for Unix socket)
--debug
Enable DEBUG-level logging (default is INFO) [env: FABRO_DEBUG=]
--model <MODEL>
Override default LLM model
--no-upgrade-check
Disable automatic upgrade check [env: FABRO_NO_UPGRADE_CHECK=true]
--provider <PROVIDER>
Override default LLM provider
--quiet
Suppress non-essential output [env: FABRO_QUIET=]
--dry-run
Execute with simulated LLM backend
--verbose
Enable verbose output [env: FABRO_VERBOSE=]
--sandbox <SANDBOX>
Sandbox for agent tools
--storage-dir <STORAGE_DIR>
Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]]
--debug
Enable DEBUG-level logging (default is INFO) [env: FABRO_DEBUG=]
--foreground
Run in the foreground instead of daemonizing
--bind <BIND>
Address to bind to (host:port for TCP, or path containing / for Unix socket)
--no-upgrade-check
Disable automatic upgrade check [env: FABRO_NO_UPGRADE_CHECK=true]
--model <MODEL>
Override default LLM model
--quiet
Suppress non-essential output [env: FABRO_QUIET=]
--provider <PROVIDER>
Override default LLM provider
--verbose
Enable verbose output [env: FABRO_VERBOSE=]
--dry-run
Execute with simulated LLM backend
--sandbox <SANDBOX>
Sandbox for agent tools
--max-concurrent-runs <MAX_CONCURRENT_RUNS>
Maximum number of concurrent run executions
--server-url <SERVER_URL>
Fabro API server URL (overrides server.base_url from user.toml when supported) [env: FABRO_SERVER_URL=]
--config <CONFIG>
Path to server config file (default: ~/.fabro/server.toml)
-h, --help

View file

@ -20,13 +20,12 @@ fn help() {
Usage: fabro server status [OPTIONS]
Options:
--json Output as JSON
--storage-dir <STORAGE_DIR> Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]]
--debug Enable DEBUG-level logging (default is INFO) [env: FABRO_DEBUG=]
--json Output as JSON
--no-upgrade-check Disable automatic upgrade check [env: FABRO_NO_UPGRADE_CHECK=true]
--quiet Suppress non-essential output [env: FABRO_QUIET=]
--verbose Enable verbose output [env: FABRO_VERBOSE=]
--storage-dir <STORAGE_DIR> Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]]
--server-url <SERVER_URL> Fabro API server URL (overrides server.base_url from user.toml when supported) [env: FABRO_SERVER_URL=]
-h, --help Print help
----- stderr -----
");

View file

@ -21,13 +21,12 @@ fn help() {
Options:
--json Output as JSON [env: FABRO_JSON=]
--timeout <TIMEOUT> Seconds to wait for graceful shutdown before SIGKILL [default: 10]
--storage-dir <STORAGE_DIR> Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]]
--debug Enable DEBUG-level logging (default is INFO) [env: FABRO_DEBUG=]
--timeout <TIMEOUT> Seconds to wait for graceful shutdown before SIGKILL [default: 10]
--no-upgrade-check Disable automatic upgrade check [env: FABRO_NO_UPGRADE_CHECK=true]
--quiet Suppress non-essential output [env: FABRO_QUIET=]
--verbose Enable verbose output [env: FABRO_VERBOSE=]
--storage-dir <STORAGE_DIR> Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]]
--server-url <SERVER_URL> Fabro API server URL (overrides server.base_url from user.toml when supported) [env: FABRO_SERVER_URL=]
-h, --help Print help
----- stderr -----
");

View file

@ -24,12 +24,11 @@ fn help() {
Options:
--json Output as JSON [env: FABRO_JSON=]
--storage-dir <STORAGE_DIR> Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]]
--debug Enable DEBUG-level logging (default is INFO) [env: FABRO_DEBUG=]
--no-upgrade-check Disable automatic upgrade check [env: FABRO_NO_UPGRADE_CHECK=true]
--quiet Suppress non-essential output [env: FABRO_QUIET=]
--verbose Enable verbose output [env: FABRO_VERBOSE=]
--storage-dir <STORAGE_DIR> Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]]
--server-url <SERVER_URL> Fabro API server URL (overrides server.base_url from user.toml when supported) [env: FABRO_SERVER_URL=]
-h, --help Print help
----- stderr -----
");

View file

@ -18,14 +18,12 @@ fn help() {
help Print this message or the help of the given subcommand(s)
Options:
--json Output as JSON [env: FABRO_JSON=]
--debug Enable DEBUG-level logging (default is INFO) [env: FABRO_DEBUG=]
--no-upgrade-check Disable automatic upgrade check [env: FABRO_NO_UPGRADE_CHECK=true]
--quiet Suppress non-essential output [env: FABRO_QUIET=]
--verbose Enable verbose output [env: FABRO_VERBOSE=]
--storage-dir <STORAGE_DIR> Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]]
--server-url <SERVER_URL> Fabro API server URL (overrides server.base_url from user.toml when supported) [env: FABRO_SERVER_URL=]
-h, --help Print help
--json Output as JSON [env: FABRO_JSON=]
--debug Enable DEBUG-level logging (default is INFO) [env: FABRO_DEBUG=]
--no-upgrade-check Disable automatic upgrade check [env: FABRO_NO_UPGRADE_CHECK=true]
--quiet Suppress non-essential output [env: FABRO_QUIET=]
--verbose Enable verbose output [env: FABRO_VERBOSE=]
-h, --help Print help
----- stderr -----
");
}

View file

@ -22,13 +22,12 @@ fn help() {
Options:
--json Output as JSON [env: FABRO_JSON=]
-o, --output <OUTPUT> Output directory (must not exist or be empty)
--storage-dir <STORAGE_DIR> Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]]
--debug Enable DEBUG-level logging (default is INFO) [env: FABRO_DEBUG=]
-o, --output <OUTPUT> Output directory (must not exist or be empty)
--no-upgrade-check Disable automatic upgrade check [env: FABRO_NO_UPGRADE_CHECK=true]
--quiet Suppress non-essential output [env: FABRO_QUIET=]
--verbose Enable verbose output [env: FABRO_VERBOSE=]
--storage-dir <STORAGE_DIR> Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]]
--server-url <SERVER_URL> Fabro API server URL (overrides server.base_url from user.toml when supported) [env: FABRO_SERVER_URL=]
-h, --help Print help
----- stderr -----
");

View file

@ -19,14 +19,12 @@ fn help() {
help Print this message or the help of the given subcommand(s)
Options:
--json Output as JSON [env: FABRO_JSON=]
--debug Enable DEBUG-level logging (default is INFO) [env: FABRO_DEBUG=]
--no-upgrade-check Disable automatic upgrade check [env: FABRO_NO_UPGRADE_CHECK=true]
--quiet Suppress non-essential output [env: FABRO_QUIET=]
--verbose Enable verbose output [env: FABRO_VERBOSE=]
--storage-dir <STORAGE_DIR> Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]]
--server-url <SERVER_URL> Fabro API server URL (overrides server.base_url from user.toml when supported) [env: FABRO_SERVER_URL=]
-h, --help Print help
--json Output as JSON [env: FABRO_JSON=]
--debug Enable DEBUG-level logging (default is INFO) [env: FABRO_DEBUG=]
--no-upgrade-check Disable automatic upgrade check [env: FABRO_NO_UPGRADE_CHECK=true]
--quiet Suppress non-essential output [env: FABRO_QUIET=]
--verbose Enable verbose output [env: FABRO_VERBOSE=]
-h, --help Print help
----- stderr -----
");
}

View file

@ -18,12 +18,11 @@ fn help() {
Options:
--json Output as JSON [env: FABRO_JSON=]
-v, --verbose Show per-run breakdown
--storage-dir <STORAGE_DIR> Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]]
--debug Enable DEBUG-level logging (default is INFO) [env: FABRO_DEBUG=]
-v, --verbose Show per-run breakdown
--no-upgrade-check Disable automatic upgrade check [env: FABRO_NO_UPGRADE_CHECK=true]
--quiet Suppress non-essential output [env: FABRO_QUIET=]
--storage-dir <STORAGE_DIR> Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]]
--server-url <SERVER_URL> Fabro API server URL (overrides server.base_url from user.toml when supported) [env: FABRO_SERVER_URL=]
-h, --help Print help
----- stderr -----
");

View file

@ -16,19 +16,18 @@ fn help() {
Usage: fabro system prune [OPTIONS]
Options:
--before <BEFORE> Only include runs started before this date (YYYY-MM-DD prefix match)
--json Output as JSON [env: FABRO_JSON=]
--storage-dir <STORAGE_DIR> Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]]
--before <BEFORE> Only include runs started before this date (YYYY-MM-DD prefix match)
--debug Enable DEBUG-level logging (default is INFO) [env: FABRO_DEBUG=]
--no-upgrade-check Disable automatic upgrade check [env: FABRO_NO_UPGRADE_CHECK=true]
--workflow <WORKFLOW> Filter by workflow name (substring match)
--label <KEY=VALUE> Filter by label (KEY=VALUE, repeatable, AND semantics)
--no-upgrade-check Disable automatic upgrade check [env: FABRO_NO_UPGRADE_CHECK=true]
--orphans Include orphan directories (no run.json)
--quiet Suppress non-essential output [env: FABRO_QUIET=]
--older-than <DURATION> Only prune runs older than this duration (e.g. 24h, 7d). Default: 24h when no explicit filters are set
--orphans Include orphan directories (no run.json)
--verbose Enable verbose output [env: FABRO_VERBOSE=]
--storage-dir <STORAGE_DIR> Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]]
--older-than <DURATION> Only prune runs older than this duration (e.g. 24h, 7d). Default: 24h when no explicit filters are set
--yes Actually delete (default is dry-run)
--server-url <SERVER_URL> Fabro API server URL (overrides server.base_url from user.toml when supported) [env: FABRO_SERVER_URL=]
-h, --help Print help
----- stderr -----
");

View file

@ -14,17 +14,15 @@ fn help() {
Usage: fabro upgrade [OPTIONS]
Options:
--json Output as JSON [env: FABRO_JSON=]
--version <VERSION> Target version (e.g. "0.5.0" or "v0.5.0")
--debug Enable DEBUG-level logging (default is INFO) [env: FABRO_DEBUG=]
--force Upgrade even if already on the target version
--dry-run Preview what would happen without making changes
--no-upgrade-check Disable automatic upgrade check [env: FABRO_NO_UPGRADE_CHECK=true]
--quiet Suppress non-essential output [env: FABRO_QUIET=]
--verbose Enable verbose output [env: FABRO_VERBOSE=]
--storage-dir <STORAGE_DIR> Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]]
--server-url <SERVER_URL> Fabro API server URL (overrides server.base_url from user.toml when supported) [env: FABRO_SERVER_URL=]
-h, --help Print help
--json Output as JSON [env: FABRO_JSON=]
--version <VERSION> Target version (e.g. "0.5.0" or "v0.5.0")
--debug Enable DEBUG-level logging (default is INFO) [env: FABRO_DEBUG=]
--force Upgrade even if already on the target version
--dry-run Preview what would happen without making changes
--no-upgrade-check Disable automatic upgrade check [env: FABRO_NO_UPGRADE_CHECK=true]
--quiet Suppress non-essential output [env: FABRO_QUIET=]
--verbose Enable verbose output [env: FABRO_VERBOSE=]
-h, --help Print help
----- stderr -----
"#);
}

View file

@ -24,14 +24,12 @@ fn help() {
<WORKFLOW> Path to the .fabro workflow file
Options:
--json Output as JSON [env: FABRO_JSON=]
--debug Enable DEBUG-level logging (default is INFO) [env: FABRO_DEBUG=]
--no-upgrade-check Disable automatic upgrade check [env: FABRO_NO_UPGRADE_CHECK=true]
--quiet Suppress non-essential output [env: FABRO_QUIET=]
--verbose Enable verbose output [env: FABRO_VERBOSE=]
--storage-dir <STORAGE_DIR> Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]]
--server-url <SERVER_URL> Fabro API server URL (overrides server.base_url from user.toml when supported) [env: FABRO_SERVER_URL=]
-h, --help Print help
--json Output as JSON [env: FABRO_JSON=]
--debug Enable DEBUG-level logging (default is INFO) [env: FABRO_DEBUG=]
--no-upgrade-check Disable automatic upgrade check [env: FABRO_NO_UPGRADE_CHECK=true]
--quiet Suppress non-essential output [env: FABRO_QUIET=]
--verbose Enable verbose output [env: FABRO_VERBOSE=]
-h, --help Print help
----- stderr -----
");
}

View file

@ -20,14 +20,13 @@ fn help() {
Options:
--json Output as JSON [env: FABRO_JSON=]
--timeout <SECONDS> Maximum time to wait in seconds
--storage-dir <STORAGE_DIR> Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]]
--debug Enable DEBUG-level logging (default is INFO) [env: FABRO_DEBUG=]
--timeout <SECONDS> Maximum time to wait in seconds
--interval <MS> Poll interval in milliseconds [default: 1000]
--no-upgrade-check Disable automatic upgrade check [env: FABRO_NO_UPGRADE_CHECK=true]
--quiet Suppress non-essential output [env: FABRO_QUIET=]
--verbose Enable verbose output [env: FABRO_VERBOSE=]
--storage-dir <STORAGE_DIR> Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]]
--server-url <SERVER_URL> Fabro API server URL (overrides server.base_url from user.toml when supported) [env: FABRO_SERVER_URL=]
-h, --help Print help
----- stderr -----
");

View file

@ -19,14 +19,12 @@ fn help() {
help Print this message or the help of the given subcommand(s)
Options:
--json Output as JSON [env: FABRO_JSON=]
--debug Enable DEBUG-level logging (default is INFO) [env: FABRO_DEBUG=]
--no-upgrade-check Disable automatic upgrade check [env: FABRO_NO_UPGRADE_CHECK=true]
--quiet Suppress non-essential output [env: FABRO_QUIET=]
--verbose Enable verbose output [env: FABRO_VERBOSE=]
--storage-dir <STORAGE_DIR> Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]]
--server-url <SERVER_URL> Fabro API server URL (overrides server.base_url from user.toml when supported) [env: FABRO_SERVER_URL=]
-h, --help Print help
--json Output as JSON [env: FABRO_JSON=]
--debug Enable DEBUG-level logging (default is INFO) [env: FABRO_DEBUG=]
--no-upgrade-check Disable automatic upgrade check [env: FABRO_NO_UPGRADE_CHECK=true]
--quiet Suppress non-essential output [env: FABRO_QUIET=]
--verbose Enable verbose output [env: FABRO_VERBOSE=]
-h, --help Print help
----- stderr -----
");
}

View file

@ -24,15 +24,13 @@ fn help() {
<NAME> Name of the workflow
Options:
-g, --goal <GOAL> Goal description for the workflow
--json Output as JSON [env: FABRO_JSON=]
--debug Enable DEBUG-level logging (default is INFO) [env: FABRO_DEBUG=]
--no-upgrade-check Disable automatic upgrade check [env: FABRO_NO_UPGRADE_CHECK=true]
--quiet Suppress non-essential output [env: FABRO_QUIET=]
--verbose Enable verbose output [env: FABRO_VERBOSE=]
--storage-dir <STORAGE_DIR> Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]]
--server-url <SERVER_URL> Fabro API server URL (overrides server.base_url from user.toml when supported) [env: FABRO_SERVER_URL=]
-h, --help Print help
-g, --goal <GOAL> Goal description for the workflow
--json Output as JSON [env: FABRO_JSON=]
--debug Enable DEBUG-level logging (default is INFO) [env: FABRO_DEBUG=]
--no-upgrade-check Disable automatic upgrade check [env: FABRO_NO_UPGRADE_CHECK=true]
--quiet Suppress non-essential output [env: FABRO_QUIET=]
--verbose Enable verbose output [env: FABRO_VERBOSE=]
-h, --help Print help
----- stderr -----
");
}

View file

@ -16,14 +16,12 @@ fn help() {
Usage: fabro workflow list [OPTIONS]
Options:
--json Output as JSON [env: FABRO_JSON=]
--debug Enable DEBUG-level logging (default is INFO) [env: FABRO_DEBUG=]
--no-upgrade-check Disable automatic upgrade check [env: FABRO_NO_UPGRADE_CHECK=true]
--quiet Suppress non-essential output [env: FABRO_QUIET=]
--verbose Enable verbose output [env: FABRO_VERBOSE=]
--storage-dir <STORAGE_DIR> Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]]
--server-url <SERVER_URL> Fabro API server URL (overrides server.base_url from user.toml when supported) [env: FABRO_SERVER_URL=]
-h, --help Print help
--json Output as JSON [env: FABRO_JSON=]
--debug Enable DEBUG-level logging (default is INFO) [env: FABRO_DEBUG=]
--no-upgrade-check Disable automatic upgrade check [env: FABRO_NO_UPGRADE_CHECK=true]
--quiet Suppress non-essential output [env: FABRO_QUIET=]
--verbose Enable verbose output [env: FABRO_VERBOSE=]
-h, --help Print help
----- stderr -----
");
}