From 260460aebf0c9981f564fcdce827dc22f45f1f61 Mon Sep 17 00:00:00 2001 From: Bryan Helmkamp Date: Sun, 5 Apr 2026 15:20:00 -0400 Subject: [PATCH] refactor(cli): remove global execution mode --- docs/administration/deploy-server.mdx | 8 +- docs/reference/cli.mdx | 11 +- docs/reference/user-configuration.mdx | 18 +- lib/crates/fabro-cli/src/args.rs | 4 +- lib/crates/fabro-cli/src/commands/exec.rs | 51 ++-- lib/crates/fabro-cli/src/commands/model.rs | 10 +- lib/crates/fabro-cli/src/user_config.rs | 218 +++++++++++------- lib/crates/fabro-cli/tests/it/cmd/artifact.rs | 4 +- .../fabro-cli/tests/it/cmd/artifact_cp.rs | 4 +- .../fabro-cli/tests/it/cmd/artifact_list.rs | 4 +- lib/crates/fabro-cli/tests/it/cmd/attach.rs | 5 +- .../fabro-cli/tests/it/cmd/completion.rs | 4 +- lib/crates/fabro-cli/tests/it/cmd/config.rs | 10 +- lib/crates/fabro-cli/tests/it/cmd/create.rs | 4 +- lib/crates/fabro-cli/tests/it/cmd/diff.rs | 4 +- lib/crates/fabro-cli/tests/it/cmd/discord.rs | 4 +- lib/crates/fabro-cli/tests/it/cmd/docs.rs | 4 +- lib/crates/fabro-cli/tests/it/cmd/doctor.rs | 4 +- lib/crates/fabro-cli/tests/it/cmd/exec.rs | 124 +++++++++- lib/crates/fabro-cli/tests/it/cmd/fabro.rs | 4 +- lib/crates/fabro-cli/tests/it/cmd/fork.rs | 4 +- lib/crates/fabro-cli/tests/it/cmd/graph.rs | 4 +- lib/crates/fabro-cli/tests/it/cmd/inspect.rs | 4 +- lib/crates/fabro-cli/tests/it/cmd/install.rs | 4 +- lib/crates/fabro-cli/tests/it/cmd/logs.rs | 4 +- lib/crates/fabro-cli/tests/it/cmd/model.rs | 63 ++++- .../fabro-cli/tests/it/cmd/model_list.rs | 4 +- .../fabro-cli/tests/it/cmd/model_test.rs | 4 +- lib/crates/fabro-cli/tests/it/cmd/parse.rs | 4 +- lib/crates/fabro-cli/tests/it/cmd/pr.rs | 4 +- lib/crates/fabro-cli/tests/it/cmd/pr_close.rs | 4 +- .../fabro-cli/tests/it/cmd/pr_create.rs | 4 +- lib/crates/fabro-cli/tests/it/cmd/pr_list.rs | 4 +- lib/crates/fabro-cli/tests/it/cmd/pr_merge.rs | 4 +- lib/crates/fabro-cli/tests/it/cmd/pr_view.rs | 4 +- .../fabro-cli/tests/it/cmd/preflight.rs | 4 +- lib/crates/fabro-cli/tests/it/cmd/provider.rs | 4 +- .../fabro-cli/tests/it/cmd/provider_login.rs | 4 +- lib/crates/fabro-cli/tests/it/cmd/ps.rs | 4 +- lib/crates/fabro-cli/tests/it/cmd/repo.rs | 8 +- .../fabro-cli/tests/it/cmd/repo_deinit.rs | 4 +- .../fabro-cli/tests/it/cmd/repo_init.rs | 4 +- lib/crates/fabro-cli/tests/it/cmd/resume.rs | 4 +- lib/crates/fabro-cli/tests/it/cmd/rewind.rs | 4 +- lib/crates/fabro-cli/tests/it/cmd/rm.rs | 4 +- lib/crates/fabro-cli/tests/it/cmd/run.rs | 5 +- lib/crates/fabro-cli/tests/it/cmd/runner.rs | 4 +- .../fabro-cli/tests/it/cmd/sandbox_cp.rs | 4 +- .../fabro-cli/tests/it/cmd/sandbox_preview.rs | 4 +- .../fabro-cli/tests/it/cmd/sandbox_ssh.rs | 4 +- lib/crates/fabro-cli/tests/it/cmd/secret.rs | 4 +- .../fabro-cli/tests/it/cmd/secret_get.rs | 4 +- .../fabro-cli/tests/it/cmd/secret_list.rs | 4 +- .../fabro-cli/tests/it/cmd/secret_rm.rs | 4 +- .../fabro-cli/tests/it/cmd/secret_set.rs | 4 +- .../fabro-cli/tests/it/cmd/send_analytics.rs | 4 +- .../fabro-cli/tests/it/cmd/send_panic.rs | 4 +- .../fabro-cli/tests/it/cmd/server_start.rs | 4 +- .../fabro-cli/tests/it/cmd/server_status.rs | 4 +- .../fabro-cli/tests/it/cmd/server_stop.rs | 4 +- lib/crates/fabro-cli/tests/it/cmd/start.rs | 4 +- lib/crates/fabro-cli/tests/it/cmd/store.rs | 4 +- .../fabro-cli/tests/it/cmd/store_dump.rs | 4 +- lib/crates/fabro-cli/tests/it/cmd/system.rs | 4 +- .../fabro-cli/tests/it/cmd/system_df.rs | 4 +- .../fabro-cli/tests/it/cmd/system_prune.rs | 4 +- lib/crates/fabro-cli/tests/it/cmd/upgrade.rs | 4 +- lib/crates/fabro-cli/tests/it/cmd/validate.rs | 4 +- lib/crates/fabro-cli/tests/it/cmd/wait.rs | 4 +- lib/crates/fabro-cli/tests/it/cmd/workflow.rs | 4 +- .../fabro-cli/tests/it/cmd/workflow_create.rs | 4 +- .../fabro-cli/tests/it/cmd/workflow_list.rs | 4 +- lib/crates/fabro-config/src/config.rs | 6 +- lib/crates/fabro-config/src/settings.rs | 1 - lib/crates/fabro-config/src/user.rs | 2 +- .../fabro-server/tests/it/api/routing.rs | 20 +- lib/crates/fabro-server/tests/it/helpers.rs | 9 +- .../tests/it/scenario/lifecycle.rs | 20 +- .../tests/it/scenario/run_completion.rs | 3 +- .../fabro-server/tests/it/scenario/sse.rs | 6 +- .../fabro-server/tests/it/scenario/usage.rs | 3 +- lib/crates/fabro-test/src/lib.rs | 2 +- lib/crates/fabro-types/src/settings/mod.rs | 6 +- lib/crates/fabro-types/src/settings/user.rs | 9 - 84 files changed, 520 insertions(+), 338 deletions(-) diff --git a/docs/administration/deploy-server.mdx b/docs/administration/deploy-server.mdx index a5919397a..f5d51b9d0 100644 --- a/docs/administration/deploy-server.mdx +++ b/docs/administration/deploy-server.mdx @@ -110,11 +110,9 @@ Send the `X-Fabro-Demo: 1` header on any API request to get static mock data wit ## Pointing the CLI at a server -The CLI can delegate commands to a running Fabro server instead of executing locally. Set `mode = "server"` in `~/.fabro/user.toml`: +The CLI can target a running Fabro server for commands that support a remote API. Configure `~/.fabro/user.toml`: ```toml title="user.toml" -mode = "server" - [server] base_url = "https://fabro.example.com:3000/api/v1" ``` @@ -125,7 +123,9 @@ Or use the `--server-url` flag: fabro --server-url https://fabro.example.com:3000/api/v1 model list ``` -This applies to commands like `fabro model list`, `fabro model test`, and `fabro exec`. See [User Configuration](/reference/user-configuration#mode) for the full options including mTLS setup. +`fabro model list` and `fabro model test` honor `[server].base_url` by default unless you explicitly pass `--storage-dir`. `fabro exec` remains a local agent session and only uses the server when you pass `--server-url`. + +See [User Configuration](/reference/user-configuration#server-section) for the full connection options, including mTLS setup. ## Next steps diff --git a/docs/reference/cli.mdx b/docs/reference/cli.mdx index 3629d9649..ff1b9b049 100644 --- a/docs/reference/cli.mdx +++ b/docs/reference/cli.mdx @@ -11,8 +11,8 @@ These flags apply to all subcommands: |---|---| | `--debug` | Enable DEBUG-level logging (default is INFO) | | `--no-upgrade-check` | Skip the automatic background upgrade check | -| `--storage-dir ` | Storage directory for local run data (default: `~/.fabro`). Implies standalone mode. | -| `--server-url ` | Fabro API server URL (overrides `server.base_url` from `user.toml`). Implies server mode. | +| `--storage-dir ` | Local storage directory for Fabro data (default: `~/.fabro`). | +| `--server-url ` | Fabro API server URL for commands that support a remote target (overrides `server.base_url` from `user.toml`). | | `-h, --help` | Print help | | `-V, --version` | Print version | @@ -31,9 +31,14 @@ output_format = "text" [llm] model = "claude-sonnet-4-5" + +[server] +base_url = "https://fabro.example.com:3000/api/v1" ``` -`[exec]` config applies to `fabro exec`. `[llm]` sets the default workflow model/provider for commands like `fabro run` and `fabro preflight`. +`[exec]` config applies to `fabro exec`. `[llm]` sets the default workflow model/provider for commands like `fabro run` and `fabro preflight`. `[server]` stores connection info for commands that can target a remote Fabro API. + +`fabro model` uses `[server].base_url` by default when no explicit `--storage-dir` is passed. `fabro exec` remains a local session unless you pass `--server-url`, even if `[server].base_url` is configured. CLI flags always override `user.toml` values, which override hardcoded defaults. diff --git a/docs/reference/user-configuration.mdx b/docs/reference/user-configuration.mdx index 33646a08b..dd4058950 100644 --- a/docs/reference/user-configuration.mdx +++ b/docs/reference/user-configuration.mdx @@ -22,7 +22,6 @@ CLI flags always take the highest priority: ```toml title="user.toml" verbose = true upgrade_check = true -mode = "server" [server] base_url = "https://fabro.example.com:3000/api/v1" @@ -148,31 +147,22 @@ Customize the git author identity used for checkpoint commits. Overrides the ser | `name` | Git author name | `"fabro"` | | `email` | Git author email | `"fabro@local"` | -## `mode` - -Controls the default execution mode when neither `--storage-dir` nor `--server-url` is passed. - -| Value | Description | -|---|---| -| `"standalone"` | Execute locally (default) | -| `"server"` | Delegate to an Fabro API server | - -For a single invocation, `--storage-dir` implies standalone mode and `--server-url` implies server mode. - ## `[server]` section -Configuration for server mode. +Connection info for commands that can target a remote Fabro API server. | Key | Description | Default | |---|---|---| | `base_url` | Server URL | `"http://localhost:3000/api/v1"` | -Passing `--server-url` implies server mode and overrides `server.base_url`: +`fabro model` uses `[server].base_url` by default when no explicit `--storage-dir` is passed. `--server-url` overrides `server.base_url`: ```bash fabro --server-url https://fabro.example.com:3000/api/v1 model list ``` +`fabro exec` does not automatically use `[server].base_url`. It only routes model traffic through a Fabro server when you pass `--server-url` for that invocation. + ### `[server.tls]` section Optional mTLS configuration for authenticating with the server. When present, the CLI presents a client certificate during the TLS handshake. diff --git a/lib/crates/fabro-cli/src/args.rs b/lib/crates/fabro-cli/src/args.rs index 299a6c9e4..6572911be 100644 --- a/lib/crates/fabro-cli/src/args.rs +++ b/lib/crates/fabro-cli/src/args.rs @@ -36,11 +36,11 @@ pub(crate) struct GlobalArgs { #[arg(long, global = true, env = "FABRO_VERBOSE", value_parser = clap::builder::BoolishValueParser::new(), conflicts_with = "quiet")] pub verbose: bool, - /// Storage directory (default: ~/.fabro) + /// Local storage directory (default: ~/.fabro) #[arg(long, global = true, env = "FABRO_STORAGE_DIR")] pub storage_dir: Option, - /// Server URL (overrides server.base_url from user.toml) + /// Fabro API server URL (overrides server.base_url from user.toml when supported) #[arg( long, global = true, diff --git a/lib/crates/fabro-cli/src/commands/exec.rs b/lib/crates/fabro-cli/src/commands/exec.rs index 6ff1b03f1..c97ad1ec4 100644 --- a/lib/crates/fabro-cli/src/commands/exec.rs +++ b/lib/crates/fabro-cli/src/commands/exec.rs @@ -24,40 +24,33 @@ pub(crate) async fn execute(mut args: AgentArgs, globals: &GlobalArgs) -> Result if globals.json { args.output_format = Some(OutputFormat::Json); } - let resolved = user_config::resolve_mode( - globals.storage_dir.as_deref(), - globals.server_url.as_deref(), - &cli_settings, - ); + let server_target = user_config::exec_server_target(globals, &cli_settings); let mcp_servers: Vec = cli_settings .mcp_servers .into_iter() .map(|(name, entry): (String, McpServerEntry)| entry.into_config(name)) .collect(); - match resolved.mode { - user_config::ExecutionMode::Server => { - tracing::info!(mode = "server", "Agent session starting"); - let http_client = user_config::build_server_client(resolved.tls.as_ref())?; - let provider_name = args - .provider - .clone() - .unwrap_or_else(|| "anthropic".to_string()); - let adapter = Arc::new(FabroServerAdapter::new( - http_client, - &resolved.server_base_url, - &provider_name, - )); - let mut client = Client::new(HashMap::new(), None, vec![]); - client - .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?; - } - user_config::ExecutionMode::Standalone => { - tracing::info!(mode = "standalone", "Agent session starting"); - run_with_args(args, mcp_servers).await?; - } + if let Some(target) = server_target { + tracing::info!(transport = "server", "Agent session starting"); + let http_client = user_config::build_server_client(target.tls.as_ref())?; + let provider_name = args + .provider + .clone() + .unwrap_or_else(|| "anthropic".to_string()); + let adapter = Arc::new(FabroServerAdapter::new( + http_client, + &target.server_base_url, + &provider_name, + )); + let mut client = Client::new(HashMap::new(), None, vec![]); + client + .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?; + } else { + tracing::info!(transport = "direct", "Agent session starting"); + run_with_args(args, mcp_servers).await?; } Ok(()) diff --git a/lib/crates/fabro-cli/src/commands/model.rs b/lib/crates/fabro-cli/src/commands/model.rs index b12cba26c..a4e196b48 100644 --- a/lib/crates/fabro-cli/src/commands/model.rs +++ b/lib/crates/fabro-cli/src/commands/model.rs @@ -39,13 +39,9 @@ struct ModelTestOutput { pub(crate) async fn execute(command: Option, globals: &GlobalArgs) -> Result<()> { let cli_settings = user_config::load_user_settings_with_globals(globals)?; - let client = match globals.server_url.as_deref() { - Some(base_url) => { - let tls = cli_settings - .server - .as_ref() - .and_then(|server| server.tls.as_ref()); - server_client::connect_remote_api_client(base_url, tls)? + let client = match user_config::model_server_target(globals, &cli_settings) { + Some(target) => { + server_client::connect_remote_api_client(&target.server_base_url, target.tls.as_ref())? } None => server_client::connect_api_client(&cli_settings.storage_dir()).await?, }; diff --git a/lib/crates/fabro-cli/src/user_config.rs b/lib/crates/fabro-cli/src/user_config.rs index f351193eb..bee3b7d1c 100644 --- a/lib/crates/fabro-cli/src/user_config.rs +++ b/lib/crates/fabro-cli/src/user_config.rs @@ -1,5 +1,3 @@ -use std::path::Path; - pub(crate) use fabro_config::user::*; use fabro_config::ConfigLayer; @@ -24,55 +22,70 @@ pub(crate) fn load_user_settings_with_globals(globals: &GlobalArgs) -> anyhow::R 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()); - layer.mode = Some(ExecutionMode::Standalone); } if let Some(url) = &globals.server_url { layer.server.get_or_insert_with(Default::default).base_url = Some(url.clone()); - layer.mode = Some(ExecutionMode::Server); } layer } -#[derive(Debug, PartialEq)] -pub(crate) struct ResolvedMode { - pub mode: ExecutionMode, +#[derive(Debug, Clone, PartialEq)] +pub(crate) struct ServerTarget { pub server_base_url: String, pub tls: Option, } -const DEFAULT_SERVER_URL: &str = "http://localhost:3000/api/v1"; +fn configured_server_target(settings: &Settings) -> Option { + settings.server.as_ref().and_then(|server| { + server.base_url.clone().map(|server_base_url| ServerTarget { + server_base_url, + tls: server.tls.clone(), + }) + }) +} -pub(crate) fn resolve_mode( - cli_storage_dir: Option<&Path>, - cli_server_url: Option<&str>, +pub(crate) fn exec_server_target( + globals: &GlobalArgs, settings: &Settings, -) -> ResolvedMode { - let mode = if cli_server_url.is_some() { - ExecutionMode::Server - } else if cli_storage_dir.is_some() { - ExecutionMode::Standalone +) -> Option { + 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()), + }); + debug!(has_target = target.is_some(), "Resolved exec server target"); + target +} + +pub(crate) fn model_server_target( + globals: &GlobalArgs, + settings: &Settings, +) -> Option { + let target = if let Some(server_base_url) = globals.server_url.as_ref() { + Some(ServerTarget { + server_base_url: server_base_url.clone(), + tls: settings + .server + .as_ref() + .and_then(|server| server.tls.clone()), + }) + } else if globals.storage_dir.is_some() { + None } else { - settings.mode.clone().unwrap_or_default() + configured_server_target(settings) }; - - let server_defaults = settings.server.as_ref(); - - let server_base_url = cli_server_url - .map(String::from) - .or_else(|| server_defaults.and_then(|s| s.base_url.clone())) - .unwrap_or_else(|| DEFAULT_SERVER_URL.to_string()); - - let tls = server_defaults.and_then(|s| s.tls.clone()); - - debug!(mode = ?mode, base_url = %server_base_url, tls = tls.is_some(), "CLI mode resolved"); - - ResolvedMode { - mode, - server_base_url, - tls, - } + debug!( + has_target = target.is_some(), + "Resolved model server target" + ); + target } pub(crate) fn build_server_client( @@ -108,63 +121,44 @@ pub(crate) fn build_server_client( #[cfg(test)] mod tests { - use std::path::{Path, PathBuf}; + use std::path::PathBuf; use super::*; - // --- resolve_mode precedence --- + fn globals() -> GlobalArgs { + GlobalArgs { + json: false, + debug: false, + no_upgrade_check: false, + quiet: false, + verbose: false, + storage_dir: None, + server_url: None, + } + } #[test] - fn resolve_mode_defaults_to_standalone() { + fn exec_has_no_server_target_by_default() { let settings = Settings::default(); - let resolved = resolve_mode(None, None, &settings); - assert_eq!(resolved.mode, ExecutionMode::Standalone); - assert_eq!(resolved.server_base_url, DEFAULT_SERVER_URL); - assert_eq!(resolved.tls, None); + assert_eq!(exec_server_target(&globals(), &settings), None); } #[test] - fn resolve_mode_storage_dir_forces_standalone() { - let settings = Settings { - mode: Some(ExecutionMode::Server), - ..Settings::default() - }; - let resolved = resolve_mode(Some(Path::new("/tmp/fabro")), None, &settings); - assert_eq!(resolved.mode, ExecutionMode::Standalone); - } - - #[test] - fn resolve_mode_server_url_forces_server() { - let settings = Settings { - mode: Some(ExecutionMode::Standalone), - server: Some(ServerSettings { - base_url: Some("https://config.example.com".to_string()), + 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), + Some(ServerTarget { + server_base_url: "https://cli.example.com".to_string(), tls: None, - }), - ..Settings::default() - }; - let resolved = resolve_mode(None, Some("https://cli.example.com"), &settings); - assert_eq!(resolved.mode, ExecutionMode::Server); - assert_eq!(resolved.server_base_url, "https://cli.example.com"); + }) + ); } #[test] - fn resolve_mode_config_overrides_default() { - let settings = Settings { - mode: Some(ExecutionMode::Server), - server: Some(ServerSettings { - base_url: Some("https://config.example.com".to_string()), - tls: None, - }), - ..Settings::default() - }; - let resolved = resolve_mode(None, None, &settings); - assert_eq!(resolved.mode, ExecutionMode::Server); - assert_eq!(resolved.server_base_url, "https://config.example.com"); - } - - #[test] - fn resolve_mode_cli_url_overrides_config_url() { + fn exec_ignores_configured_server_base_url_without_cli_server_url() { let settings = Settings { server: Some(ServerSettings { base_url: Some("https://config.example.com".to_string()), @@ -172,12 +166,63 @@ mod tests { }), ..Settings::default() }; - let resolved = resolve_mode(None, Some("https://cli.example.com"), &settings); - assert_eq!(resolved.server_base_url, "https://cli.example.com"); + assert_eq!(exec_server_target(&globals(), &settings), None); } #[test] - fn resolve_mode_tls_from_config() { + fn model_uses_configured_server_base_url() { + let settings = Settings { + server: Some(ServerSettings { + base_url: Some("https://config.example.com".to_string()), + tls: None, + }), + ..Settings::default() + }; + assert_eq!( + model_server_target(&globals(), &settings), + Some(ServerTarget { + server_base_url: "https://config.example.com".to_string(), + tls: None, + }) + ); + } + + #[test] + fn model_cli_server_url_overrides_config_url() { + let settings = Settings { + server: Some(ServerSettings { + base_url: Some("https://config.example.com".to_string()), + tls: None, + }), + ..Settings::default() + }; + let mut globals = globals(); + globals.server_url = Some("https://cli.example.com".to_string()); + assert_eq!( + model_server_target(&globals, &settings), + Some(ServerTarget { + server_base_url: "https://cli.example.com".to_string(), + tls: None, + }) + ); + } + + #[test] + fn model_storage_dir_suppresses_configured_remote_target() { + let settings = Settings { + server: Some(ServerSettings { + base_url: Some("https://config.example.com".to_string()), + tls: None, + }), + ..Settings::default() + }; + let mut globals = globals(); + globals.storage_dir = Some(PathBuf::from("/tmp/fabro")); + assert_eq!(model_server_target(&globals, &settings), None); + } + + #[test] + fn remote_target_uses_tls_from_config() { let tls = ClientTlsSettings { cert: PathBuf::from("cert.pem"), key: PathBuf::from("key.pem"), @@ -190,7 +235,14 @@ mod tests { }), ..Settings::default() }; - let resolved = resolve_mode(None, None, &settings); - assert_eq!(resolved.tls, Some(tls)); + let mut globals = globals(); + globals.server_url = Some("https://cli.example.com".to_string()); + assert_eq!( + exec_server_target(&globals, &settings), + Some(ServerTarget { + server_base_url: "https://cli.example.com".to_string(), + tls: Some(tls), + }) + ); } } diff --git a/lib/crates/fabro-cli/tests/it/cmd/artifact.rs b/lib/crates/fabro-cli/tests/it/cmd/artifact.rs index 00d0de303..108f44e11 100644 --- a/lib/crates/fabro-cli/tests/it/cmd/artifact.rs +++ b/lib/crates/fabro-cli/tests/it/cmd/artifact.rs @@ -24,8 +24,8 @@ fn help() { --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 directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]] - --server-url Server URL (overrides server.base_url from user.toml) [env: FABRO_SERVER_URL=] + --storage-dir Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]] + --server-url Fabro API server URL (overrides server.base_url from user.toml when supported) [env: FABRO_SERVER_URL=] -h, --help Print help ----- stderr ----- "); diff --git a/lib/crates/fabro-cli/tests/it/cmd/artifact_cp.rs b/lib/crates/fabro-cli/tests/it/cmd/artifact_cp.rs index 426ca3ac2..6a810b056 100644 --- a/lib/crates/fabro-cli/tests/it/cmd/artifact_cp.rs +++ b/lib/crates/fabro-cli/tests/it/cmd/artifact_cp.rs @@ -28,8 +28,8 @@ fn help() { --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 directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]] - --server-url Server URL (overrides server.base_url from user.toml) [env: FABRO_SERVER_URL=] + --storage-dir Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]] + --server-url Fabro API server URL (overrides server.base_url from user.toml when supported) [env: FABRO_SERVER_URL=] -h, --help Print help ----- stderr ----- "); diff --git a/lib/crates/fabro-cli/tests/it/cmd/artifact_list.rs b/lib/crates/fabro-cli/tests/it/cmd/artifact_list.rs index db0e58b95..5648dd4cc 100644 --- a/lib/crates/fabro-cli/tests/it/cmd/artifact_list.rs +++ b/lib/crates/fabro-cli/tests/it/cmd/artifact_list.rs @@ -26,8 +26,8 @@ fn help() { --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 directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]] - --server-url Server URL (overrides server.base_url from user.toml) [env: FABRO_SERVER_URL=] + --storage-dir Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]] + --server-url Fabro API server URL (overrides server.base_url from user.toml when supported) [env: FABRO_SERVER_URL=] -h, --help Print help ----- stderr ----- "); diff --git a/lib/crates/fabro-cli/tests/it/cmd/attach.rs b/lib/crates/fabro-cli/tests/it/cmd/attach.rs index 9f0616e53..7c6cdf365 100644 --- a/lib/crates/fabro-cli/tests/it/cmd/attach.rs +++ b/lib/crates/fabro-cli/tests/it/cmd/attach.rs @@ -31,8 +31,8 @@ fn help() { --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 directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]] - --server-url Server URL (overrides server.base_url from user.toml) [env: FABRO_SERVER_URL=] + --storage-dir Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]] + --server-url Fabro API server URL (overrides server.base_url from user.toml when supported) [env: FABRO_SERVER_URL=] -h, --help Print help ----- stderr ----- "); @@ -444,7 +444,6 @@ fn attach_json_errors_without_prompting_for_human_input() { "model": "gpt-5.4", "provider": "openai" }, - "mode": "standalone", "no_retro": true, "sandbox": { "daytona": null, diff --git a/lib/crates/fabro-cli/tests/it/cmd/completion.rs b/lib/crates/fabro-cli/tests/it/cmd/completion.rs index 6fea74e47..758193c3f 100644 --- a/lib/crates/fabro-cli/tests/it/cmd/completion.rs +++ b/lib/crates/fabro-cli/tests/it/cmd/completion.rs @@ -22,8 +22,8 @@ fn help() { --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 directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]] - --server-url Server URL (overrides server.base_url from user.toml) [env: FABRO_SERVER_URL=] + --storage-dir Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]] + --server-url Fabro API server URL (overrides server.base_url from user.toml when supported) [env: FABRO_SERVER_URL=] -h, --help Print help ----- stderr ----- "); diff --git a/lib/crates/fabro-cli/tests/it/cmd/config.rs b/lib/crates/fabro-cli/tests/it/cmd/config.rs index 816533704..445196a43 100644 --- a/lib/crates/fabro-cli/tests/it/cmd/config.rs +++ b/lib/crates/fabro-cli/tests/it/cmd/config.rs @@ -1,7 +1,6 @@ use std::path::PathBuf; use fabro_config::mcp::McpTransport; -use fabro_config::user::ExecutionMode; use fabro_test::{fabro_snapshot, test_context}; use fabro_types::Settings; use predicates::prelude::*; @@ -31,8 +30,8 @@ fn help() { --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 directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]] - --server-url Server URL (overrides server.base_url from user.toml) [env: FABRO_SERVER_URL=] + --storage-dir Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]] + --server-url Fabro API server URL (overrides server.base_url from user.toml when supported) [env: FABRO_SERVER_URL=] -h, --help Print help ----- stderr ----- "); @@ -585,9 +584,7 @@ fn settings_server_url_overrides_cli_defaults() { let existing = std::fs::read_to_string(&user_toml_path).unwrap(); context.write_home( ".fabro/user.toml", - format!( - "{existing}\nmode = \"standalone\"\n[server]\nbase_url = \"https://config.example.com\"\n" - ), + format!("{existing}\n[server]\nbase_url = \"https://config.example.com\"\n"), ); let output = context @@ -602,7 +599,6 @@ fn settings_server_url_overrides_cli_defaults() { .clone(); let cfg = parse_settings(&output); - assert_eq!(cfg.mode, Some(ExecutionMode::Server)); assert_eq!( cfg.server .as_ref() diff --git a/lib/crates/fabro-cli/tests/it/cmd/create.rs b/lib/crates/fabro-cli/tests/it/cmd/create.rs index 9352a910d..3b07c3cb9 100644 --- a/lib/crates/fabro-cli/tests/it/cmd/create.rs +++ b/lib/crates/fabro-cli/tests/it/cmd/create.rs @@ -34,8 +34,8 @@ fn help() { --quiet Suppress non-essential output [env: FABRO_QUIET=] --model Override default LLM model --provider Override default LLM provider - --storage-dir Storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]] - --server-url Server URL (overrides server.base_url from user.toml) [env: FABRO_SERVER_URL=] + --storage-dir Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]] + --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 for agent tools [possible values: local, docker, daytona] --label Attach a label to this run (repeatable, format: KEY=VALUE) diff --git a/lib/crates/fabro-cli/tests/it/cmd/diff.rs b/lib/crates/fabro-cli/tests/it/cmd/diff.rs index f32a51597..5cd808dff 100644 --- a/lib/crates/fabro-cli/tests/it/cmd/diff.rs +++ b/lib/crates/fabro-cli/tests/it/cmd/diff.rs @@ -27,8 +27,8 @@ fn help() { --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 directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]] - --server-url Server URL (overrides server.base_url from user.toml) [env: FABRO_SERVER_URL=] + --storage-dir Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]] + --server-url Fabro API server URL (overrides server.base_url from user.toml when supported) [env: FABRO_SERVER_URL=] -h, --help Print help ----- stderr ----- "); diff --git a/lib/crates/fabro-cli/tests/it/cmd/discord.rs b/lib/crates/fabro-cli/tests/it/cmd/discord.rs index 87cbee06d..349b519bf 100644 --- a/lib/crates/fabro-cli/tests/it/cmd/discord.rs +++ b/lib/crates/fabro-cli/tests/it/cmd/discord.rs @@ -19,8 +19,8 @@ fn help() { --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 directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]] - --server-url Server URL (overrides server.base_url from user.toml) [env: FABRO_SERVER_URL=] + --storage-dir Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]] + --server-url Fabro API server URL (overrides server.base_url from user.toml when supported) [env: FABRO_SERVER_URL=] -h, --help Print help ----- stderr ----- "); diff --git a/lib/crates/fabro-cli/tests/it/cmd/docs.rs b/lib/crates/fabro-cli/tests/it/cmd/docs.rs index aeecd2b33..51f042a19 100644 --- a/lib/crates/fabro-cli/tests/it/cmd/docs.rs +++ b/lib/crates/fabro-cli/tests/it/cmd/docs.rs @@ -19,8 +19,8 @@ fn help() { --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 directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]] - --server-url Server URL (overrides server.base_url from user.toml) [env: FABRO_SERVER_URL=] + --storage-dir Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]] + --server-url Fabro API server URL (overrides server.base_url from user.toml when supported) [env: FABRO_SERVER_URL=] -h, --help Print help ----- stderr ----- "); diff --git a/lib/crates/fabro-cli/tests/it/cmd/doctor.rs b/lib/crates/fabro-cli/tests/it/cmd/doctor.rs index 9e09ae678..1855ed683 100644 --- a/lib/crates/fabro-cli/tests/it/cmd/doctor.rs +++ b/lib/crates/fabro-cli/tests/it/cmd/doctor.rs @@ -31,8 +31,8 @@ fn help() { --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 directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]] - --server-url Server URL (overrides server.base_url from user.toml) [env: FABRO_SERVER_URL=] + --storage-dir Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]] + --server-url Fabro API server URL (overrides server.base_url from user.toml when supported) [env: FABRO_SERVER_URL=] -h, --help Print help ----- stderr ----- "); diff --git a/lib/crates/fabro-cli/tests/it/cmd/exec.rs b/lib/crates/fabro-cli/tests/it/cmd/exec.rs index 8a3715e9c..d85af8968 100644 --- a/lib/crates/fabro-cli/tests/it/cmd/exec.rs +++ b/lib/crates/fabro-cli/tests/it/cmd/exec.rs @@ -3,6 +3,7 @@ use std::process::Output; use fabro_test::{fabro_snapshot, test_context}; +use httpmock::MockServer; async fn run_success_output(mut cmd: assert_cmd::Command) -> Output { tokio::task::spawn_blocking(move || cmd.assert().success().get_output().clone()) @@ -35,9 +36,9 @@ fn help() { --auto-approve Skip interactive prompts; deny tools outside permission level --quiet Suppress non-essential output [env: FABRO_QUIET=] --debug Print LLM request/response debug info to stderr - --storage-dir Storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[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 (overrides server.base_url from user.toml) [env: FABRO_SERVER_URL=] + --server-url Fabro API server URL (overrides server.base_url from user.toml when supported) [env: FABRO_SERVER_URL=] --skills-dir Directory containing skill files (overrides default discovery) --output-format Output format (text for human-readable, json for NDJSON event stream) [possible values: text, json] -h, --help Print help @@ -119,6 +120,125 @@ fn exec_uses_user_config_defaults() { "); } +#[test] +fn exec_server_url_uses_remote_transport_instead_of_local_api_key_resolution() { + let context = test_context!(); + let server = MockServer::start(); + server.mock(|when, then| { + when.method("POST").path("/api/v1/completions"); + then.status(500).body("server-routed-marker"); + }); + + let mut cmd = context.exec_cmd(); + cmd.env_clear(); + cmd.env("HOME", &context.home_dir); + cmd.env("FABRO_NO_UPGRADE_CHECK", "true"); + cmd.args([ + "--server-url", + &format!("{}/api/v1", server.base_url()), + "--provider", + "openai", + "--model", + "gpt-5.4-mini", + "test prompt", + ]); + + let output = cmd.assert().failure().get_output().clone(); + let stderr = String::from_utf8(output.stderr).expect("valid utf8"); + assert!( + stderr.contains("server-routed-marker"), + "expected remote server failure marker, got: {stderr}" + ); + assert!( + !stderr.contains("API key not set"), + "exec should not fail local API key validation when --server-url is set: {stderr}" + ); +} + +#[test] +fn exec_configured_server_base_url_alone_does_not_reroute_exec() { + let context = test_context!(); + let server = MockServer::start(); + server.mock(|when, then| { + when.method("POST").path("/api/v1/completions"); + then.status(500).body("config-should-not-be-used"); + }); + context.write_home( + ".fabro/user.toml", + format!("[server]\nbase_url = \"{}/api/v1\"\n", server.base_url()), + ); + + let mut cmd = context.exec_cmd(); + cmd.env_clear(); + cmd.env("HOME", &context.home_dir); + cmd.env("FABRO_NO_UPGRADE_CHECK", "true"); + cmd.args([ + "--provider", + "openai", + "--model", + "gpt-5.4-mini", + "test prompt", + ]); + + let output = cmd.assert().failure().get_output().clone(); + let stderr = String::from_utf8(output.stderr).expect("valid utf8"); + assert!( + stderr.contains("API key not set for provider 'openai'"), + "expected local API key validation failure, got: {stderr}" + ); + assert!( + !stderr.contains("config-should-not-be-used"), + "exec should ignore configured server.base_url without --server-url: {stderr}" + ); +} + +#[test] +fn exec_cli_server_url_overrides_configured_server_base_url() { + let context = test_context!(); + let config_server = MockServer::start(); + config_server.mock(|when, then| { + when.method("POST").path("/api/v1/completions"); + then.status(500).body("config-should-not-be-used"); + }); + let cli_server = MockServer::start(); + cli_server.mock(|when, then| { + when.method("POST").path("/api/v1/completions"); + then.status(500).body("cli-override-marker"); + }); + context.write_home( + ".fabro/user.toml", + format!( + "[server]\nbase_url = \"{}/api/v1\"\n", + config_server.base_url() + ), + ); + + let mut cmd = context.exec_cmd(); + cmd.env_clear(); + cmd.env("HOME", &context.home_dir); + cmd.env("FABRO_NO_UPGRADE_CHECK", "true"); + cmd.args([ + "--server-url", + &format!("{}/api/v1", cli_server.base_url()), + "--provider", + "openai", + "--model", + "gpt-5.4-mini", + "test prompt", + ]); + + let output = cmd.assert().failure().get_output().clone(); + let stderr = String::from_utf8(output.stderr).expect("valid utf8"); + assert!( + stderr.contains("cli-override-marker"), + "expected CLI server URL to win, got: {stderr}" + ); + assert!( + !stderr.contains("config-should-not-be-used"), + "configured server.base_url should not be used when --server-url is passed: {stderr}" + ); +} + #[fabro_macros::e2e_test(live("ANTHROPIC_API_KEY"))] fn exec_creates_file() { let context = test_context!(); diff --git a/lib/crates/fabro-cli/tests/it/cmd/fabro.rs b/lib/crates/fabro-cli/tests/it/cmd/fabro.rs index 3c5fa073f..3a8834c89 100644 --- a/lib/crates/fabro-cli/tests/it/cmd/fabro.rs +++ b/lib/crates/fabro-cli/tests/it/cmd/fabro.rs @@ -52,8 +52,8 @@ fn help() { --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 directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]] - --server-url Server URL (overrides server.base_url from user.toml) [env: FABRO_SERVER_URL=] + --storage-dir Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]] + --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 ----- stderr ----- diff --git a/lib/crates/fabro-cli/tests/it/cmd/fork.rs b/lib/crates/fabro-cli/tests/it/cmd/fork.rs index 488784112..168e78991 100644 --- a/lib/crates/fabro-cli/tests/it/cmd/fork.rs +++ b/lib/crates/fabro-cli/tests/it/cmd/fork.rs @@ -32,8 +32,8 @@ fn help() { --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 directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]] - --server-url Server URL (overrides server.base_url from user.toml) [env: FABRO_SERVER_URL=] + --storage-dir Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]] + --server-url Fabro API server URL (overrides server.base_url from user.toml when supported) [env: FABRO_SERVER_URL=] -h, --help Print help ----- stderr ----- "); diff --git a/lib/crates/fabro-cli/tests/it/cmd/graph.rs b/lib/crates/fabro-cli/tests/it/cmd/graph.rs index 054e47022..092450182 100644 --- a/lib/crates/fabro-cli/tests/it/cmd/graph.rs +++ b/lib/crates/fabro-cli/tests/it/cmd/graph.rs @@ -62,12 +62,12 @@ fn help() { [env: FABRO_VERBOSE=] --storage-dir - Storage directory (default: ~/.fabro) + Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]] --server-url - Server URL (overrides server.base_url from user.toml) + Fabro API server URL (overrides server.base_url from user.toml when supported) [env: FABRO_SERVER_URL=] diff --git a/lib/crates/fabro-cli/tests/it/cmd/inspect.rs b/lib/crates/fabro-cli/tests/it/cmd/inspect.rs index a75cadf77..c810e4e00 100644 --- a/lib/crates/fabro-cli/tests/it/cmd/inspect.rs +++ b/lib/crates/fabro-cli/tests/it/cmd/inspect.rs @@ -29,8 +29,8 @@ fn help() { --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 directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]] - --server-url Server URL (overrides server.base_url from user.toml) [env: FABRO_SERVER_URL=] + --storage-dir Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]] + --server-url Fabro API server URL (overrides server.base_url from user.toml when supported) [env: FABRO_SERVER_URL=] -h, --help Print help ----- stderr ----- "); diff --git a/lib/crates/fabro-cli/tests/it/cmd/install.rs b/lib/crates/fabro-cli/tests/it/cmd/install.rs index 082bac91b..1fecd1416 100644 --- a/lib/crates/fabro-cli/tests/it/cmd/install.rs +++ b/lib/crates/fabro-cli/tests/it/cmd/install.rs @@ -20,8 +20,8 @@ fn help() { --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 directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]] - --server-url Server URL (overrides server.base_url from user.toml) [env: FABRO_SERVER_URL=] + --storage-dir Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]] + --server-url Fabro API server URL (overrides server.base_url from user.toml when supported) [env: FABRO_SERVER_URL=] -h, --help Print help ----- stderr ----- "); diff --git a/lib/crates/fabro-cli/tests/it/cmd/logs.rs b/lib/crates/fabro-cli/tests/it/cmd/logs.rs index 9961f26bb..101de1f8b 100644 --- a/lib/crates/fabro-cli/tests/it/cmd/logs.rs +++ b/lib/crates/fabro-cli/tests/it/cmd/logs.rs @@ -69,8 +69,8 @@ fn help() { -p, --pretty Formatted colored output with rendered assistant text --quiet Suppress non-essential output [env: FABRO_QUIET=] --verbose Enable verbose output [env: FABRO_VERBOSE=] - --storage-dir Storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]] - --server-url Server URL (overrides server.base_url from user.toml) [env: FABRO_SERVER_URL=] + --storage-dir Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]] + --server-url Fabro API server URL (overrides server.base_url from user.toml when supported) [env: FABRO_SERVER_URL=] -h, --help Print help ----- stderr ----- "#); diff --git a/lib/crates/fabro-cli/tests/it/cmd/model.rs b/lib/crates/fabro-cli/tests/it/cmd/model.rs index a1e32ba66..64f694977 100644 --- a/lib/crates/fabro-cli/tests/it/cmd/model.rs +++ b/lib/crates/fabro-cli/tests/it/cmd/model.rs @@ -1,4 +1,5 @@ use fabro_test::{fabro_snapshot, test_context}; +use httpmock::MockServer; #[test] fn help() { @@ -24,8 +25,8 @@ fn help() { --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 directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]] - --server-url Server URL (overrides server.base_url from user.toml) [env: FABRO_SERVER_URL=] + --storage-dir Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]] + --server-url Fabro API server URL (overrides server.base_url from user.toml when supported) [env: FABRO_SERVER_URL=] -h, --help Print help ----- stderr ----- "); @@ -175,3 +176,61 @@ fn list_invalid_provider_errors() { error: unknown provider: not-a-provider "); } + +#[test] +fn list_uses_configured_server_base_url_without_server_url_flag() { + let context = test_context!(); + let server = MockServer::start(); + let mock = server.mock(|when, then| { + when.method("GET"); + then.status(200) + .header("Content-Type", "application/json") + .body( + serde_json::json!({ + "data": [{ + "id": "remote-model", + "display_name": "Remote Model", + "provider": "openai", + "family": "test", + "aliases": ["remote"], + "limits": { + "context_window": 131_072, + "max_output": 4096 + }, + "training": null, + "knowledge_cutoff": null, + "features": { + "tools": true, + "vision": false, + "reasoning": false, + "effort": false + }, + "costs": { + "input_cost_per_mtok": 1.0, + "output_cost_per_mtok": 2.0, + "cache_input_cost_per_mtok": null + }, + "estimated_output_tps": 42.0, + "default": false + }], + "meta": { "has_more": false } + }) + .to_string(), + ); + }); + context.write_home( + ".fabro/user.toml", + format!("[server]\nbase_url = \"{}/api/v1\"\n", server.base_url()), + ); + + let mut cmd = context.model(); + cmd.env_remove("FABRO_STORAGE_DIR"); + cmd.args(["list", "--json"]); + let output = cmd.assert().success().get_output().stdout.clone(); + let models: serde_json::Value = + serde_json::from_slice(&output).expect("model list json should parse"); + + mock.assert(); + assert_eq!(models.as_array().map(Vec::len), Some(1)); + assert_eq!(models[0]["id"].as_str(), Some("remote-model")); +} diff --git a/lib/crates/fabro-cli/tests/it/cmd/model_list.rs b/lib/crates/fabro-cli/tests/it/cmd/model_list.rs index 9f56bcf0c..ad6aa05df 100644 --- a/lib/crates/fabro-cli/tests/it/cmd/model_list.rs +++ b/lib/crates/fabro-cli/tests/it/cmd/model_list.rs @@ -21,8 +21,8 @@ fn help() { --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 directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]] - --server-url Server URL (overrides server.base_url from user.toml) [env: FABRO_SERVER_URL=] + --storage-dir Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]] + --server-url Fabro API server URL (overrides server.base_url from user.toml when supported) [env: FABRO_SERVER_URL=] -h, --help Print help ----- stderr ----- "); diff --git a/lib/crates/fabro-cli/tests/it/cmd/model_test.rs b/lib/crates/fabro-cli/tests/it/cmd/model_test.rs index 9ae0987c5..7e9b898c3 100644 --- a/lib/crates/fabro-cli/tests/it/cmd/model_test.rs +++ b/lib/crates/fabro-cli/tests/it/cmd/model_test.rs @@ -22,8 +22,8 @@ fn help() { --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 directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]] - --server-url Server URL (overrides server.base_url from user.toml) [env: FABRO_SERVER_URL=] + --storage-dir Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]] + --server-url Fabro API server URL (overrides server.base_url from user.toml when supported) [env: FABRO_SERVER_URL=] -h, --help Print help ----- stderr ----- "); diff --git a/lib/crates/fabro-cli/tests/it/cmd/parse.rs b/lib/crates/fabro-cli/tests/it/cmd/parse.rs index bb647b763..3c40dbe6f 100644 --- a/lib/crates/fabro-cli/tests/it/cmd/parse.rs +++ b/lib/crates/fabro-cli/tests/it/cmd/parse.rs @@ -22,8 +22,8 @@ fn help() { --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 directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]] - --server-url Server URL (overrides server.base_url from user.toml) [env: FABRO_SERVER_URL=] + --storage-dir Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]] + --server-url Fabro API server URL (overrides server.base_url from user.toml when supported) [env: FABRO_SERVER_URL=] -h, --help Print help ----- stderr ----- "); diff --git a/lib/crates/fabro-cli/tests/it/cmd/pr.rs b/lib/crates/fabro-cli/tests/it/cmd/pr.rs index a8e43dd37..fa5908036 100644 --- a/lib/crates/fabro-cli/tests/it/cmd/pr.rs +++ b/lib/crates/fabro-cli/tests/it/cmd/pr.rs @@ -27,8 +27,8 @@ fn help() { --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 directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]] - --server-url Server URL (overrides server.base_url from user.toml) [env: FABRO_SERVER_URL=] + --storage-dir Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]] + --server-url Fabro API server URL (overrides server.base_url from user.toml when supported) [env: FABRO_SERVER_URL=] -h, --help Print help ----- stderr ----- "); diff --git a/lib/crates/fabro-cli/tests/it/cmd/pr_close.rs b/lib/crates/fabro-cli/tests/it/cmd/pr_close.rs index e5bcc3b58..4aada8c16 100644 --- a/lib/crates/fabro-cli/tests/it/cmd/pr_close.rs +++ b/lib/crates/fabro-cli/tests/it/cmd/pr_close.rs @@ -22,8 +22,8 @@ fn help() { --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 directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]] - --server-url Server URL (overrides server.base_url from user.toml) [env: FABRO_SERVER_URL=] + --storage-dir Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]] + --server-url Fabro API server URL (overrides server.base_url from user.toml when supported) [env: FABRO_SERVER_URL=] -h, --help Print help ----- stderr ----- "); diff --git a/lib/crates/fabro-cli/tests/it/cmd/pr_create.rs b/lib/crates/fabro-cli/tests/it/cmd/pr_create.rs index 4194ed863..bd035ce18 100644 --- a/lib/crates/fabro-cli/tests/it/cmd/pr_create.rs +++ b/lib/crates/fabro-cli/tests/it/cmd/pr_create.rs @@ -25,8 +25,8 @@ fn help() { --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 directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]] - --server-url Server URL (overrides server.base_url from user.toml) [env: FABRO_SERVER_URL=] + --storage-dir Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]] + --server-url Fabro API server URL (overrides server.base_url from user.toml when supported) [env: FABRO_SERVER_URL=] -h, --help Print help ----- stderr ----- "); diff --git a/lib/crates/fabro-cli/tests/it/cmd/pr_list.rs b/lib/crates/fabro-cli/tests/it/cmd/pr_list.rs index e971515d9..cc9829531 100644 --- a/lib/crates/fabro-cli/tests/it/cmd/pr_list.rs +++ b/lib/crates/fabro-cli/tests/it/cmd/pr_list.rs @@ -20,8 +20,8 @@ fn help() { --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 directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]] - --server-url Server URL (overrides server.base_url from user.toml) [env: FABRO_SERVER_URL=] + --storage-dir Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]] + --server-url Fabro API server URL (overrides server.base_url from user.toml when supported) [env: FABRO_SERVER_URL=] -h, --help Print help ----- stderr ----- "); diff --git a/lib/crates/fabro-cli/tests/it/cmd/pr_merge.rs b/lib/crates/fabro-cli/tests/it/cmd/pr_merge.rs index f18a05c01..000e84b35 100644 --- a/lib/crates/fabro-cli/tests/it/cmd/pr_merge.rs +++ b/lib/crates/fabro-cli/tests/it/cmd/pr_merge.rs @@ -23,8 +23,8 @@ fn help() { --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 directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]] - --server-url Server URL (overrides server.base_url from user.toml) [env: FABRO_SERVER_URL=] + --storage-dir Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]] + --server-url Fabro API server URL (overrides server.base_url from user.toml when supported) [env: FABRO_SERVER_URL=] -h, --help Print help ----- stderr ----- "); diff --git a/lib/crates/fabro-cli/tests/it/cmd/pr_view.rs b/lib/crates/fabro-cli/tests/it/cmd/pr_view.rs index 238f655b0..7b88c09f9 100644 --- a/lib/crates/fabro-cli/tests/it/cmd/pr_view.rs +++ b/lib/crates/fabro-cli/tests/it/cmd/pr_view.rs @@ -28,8 +28,8 @@ fn help() { --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 directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]] - --server-url Server URL (overrides server.base_url from user.toml) [env: FABRO_SERVER_URL=] + --storage-dir Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]] + --server-url Fabro API server URL (overrides server.base_url from user.toml when supported) [env: FABRO_SERVER_URL=] -h, --help Print help ----- stderr ----- "); diff --git a/lib/crates/fabro-cli/tests/it/cmd/preflight.rs b/lib/crates/fabro-cli/tests/it/cmd/preflight.rs index 89b22a96d..85a8b4b60 100644 --- a/lib/crates/fabro-cli/tests/it/cmd/preflight.rs +++ b/lib/crates/fabro-cli/tests/it/cmd/preflight.rs @@ -30,8 +30,8 @@ fn help() { --quiet Suppress non-essential output [env: FABRO_QUIET=] -v, --verbose Enable verbose output --sandbox Sandbox for agent tools [possible values: local, docker, daytona] - --storage-dir Storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]] - --server-url Server URL (overrides server.base_url from user.toml) [env: FABRO_SERVER_URL=] + --storage-dir Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]] + --server-url Fabro API server URL (overrides server.base_url from user.toml when supported) [env: FABRO_SERVER_URL=] -h, --help Print help ----- stderr ----- "); diff --git a/lib/crates/fabro-cli/tests/it/cmd/provider.rs b/lib/crates/fabro-cli/tests/it/cmd/provider.rs index b9c51055a..552e4206e 100644 --- a/lib/crates/fabro-cli/tests/it/cmd/provider.rs +++ b/lib/crates/fabro-cli/tests/it/cmd/provider.rs @@ -23,8 +23,8 @@ fn help() { --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 directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]] - --server-url Server URL (overrides server.base_url from user.toml) [env: FABRO_SERVER_URL=] + --storage-dir Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]] + --server-url Fabro API server URL (overrides server.base_url from user.toml when supported) [env: FABRO_SERVER_URL=] -h, --help Print help ----- stderr ----- "); diff --git a/lib/crates/fabro-cli/tests/it/cmd/provider_login.rs b/lib/crates/fabro-cli/tests/it/cmd/provider_login.rs index be2602a04..75aef5c53 100644 --- a/lib/crates/fabro-cli/tests/it/cmd/provider_login.rs +++ b/lib/crates/fabro-cli/tests/it/cmd/provider_login.rs @@ -20,8 +20,8 @@ fn help() { --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 directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]] - --server-url Server URL (overrides server.base_url from user.toml) [env: FABRO_SERVER_URL=] + --storage-dir Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]] + --server-url Fabro API server URL (overrides server.base_url from user.toml when supported) [env: FABRO_SERVER_URL=] -h, --help Print help ----- stderr ----- "); diff --git a/lib/crates/fabro-cli/tests/it/cmd/ps.rs b/lib/crates/fabro-cli/tests/it/cmd/ps.rs index 3d93165d3..b13d846a2 100644 --- a/lib/crates/fabro-cli/tests/it/cmd/ps.rs +++ b/lib/crates/fabro-cli/tests/it/cmd/ps.rs @@ -27,8 +27,8 @@ fn help() { -a, --all Show all runs, not just running (like docker ps -a) --verbose Enable verbose output [env: FABRO_VERBOSE=] -q, --quiet Only display run IDs - --storage-dir Storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]] - --server-url Server URL (overrides server.base_url from user.toml) [env: FABRO_SERVER_URL=] + --storage-dir Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]] + --server-url Fabro API server URL (overrides server.base_url from user.toml when supported) [env: FABRO_SERVER_URL=] -h, --help Print help ----- stderr ----- "); diff --git a/lib/crates/fabro-cli/tests/it/cmd/repo.rs b/lib/crates/fabro-cli/tests/it/cmd/repo.rs index cf886da14..619cbfb7b 100644 --- a/lib/crates/fabro-cli/tests/it/cmd/repo.rs +++ b/lib/crates/fabro-cli/tests/it/cmd/repo.rs @@ -31,8 +31,8 @@ fn help() { --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 directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]] - --server-url Server URL (overrides server.base_url from user.toml) [env: FABRO_SERVER_URL=] + --storage-dir Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]] + --server-url Fabro API server URL (overrides server.base_url from user.toml when supported) [env: FABRO_SERVER_URL=] -h, --help Print help ----- stderr ----- "); @@ -112,8 +112,8 @@ fn test_repo_init_help_does_not_show_skill() { --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 directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]] - --server-url Server URL (overrides server.base_url from user.toml) [env: FABRO_SERVER_URL=] + --storage-dir Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]] + --server-url Fabro API server URL (overrides server.base_url from user.toml when supported) [env: FABRO_SERVER_URL=] -h, --help Print help ----- stderr ----- "); diff --git a/lib/crates/fabro-cli/tests/it/cmd/repo_deinit.rs b/lib/crates/fabro-cli/tests/it/cmd/repo_deinit.rs index ea3991797..7489e4f01 100644 --- a/lib/crates/fabro-cli/tests/it/cmd/repo_deinit.rs +++ b/lib/crates/fabro-cli/tests/it/cmd/repo_deinit.rs @@ -19,8 +19,8 @@ fn help() { --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 directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]] - --server-url Server URL (overrides server.base_url from user.toml) [env: FABRO_SERVER_URL=] + --storage-dir Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]] + --server-url Fabro API server URL (overrides server.base_url from user.toml when supported) [env: FABRO_SERVER_URL=] -h, --help Print help ----- stderr ----- "); diff --git a/lib/crates/fabro-cli/tests/it/cmd/repo_init.rs b/lib/crates/fabro-cli/tests/it/cmd/repo_init.rs index 8a1a2a0ec..49f5edaef 100644 --- a/lib/crates/fabro-cli/tests/it/cmd/repo_init.rs +++ b/lib/crates/fabro-cli/tests/it/cmd/repo_init.rs @@ -21,8 +21,8 @@ fn help() { --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 directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]] - --server-url Server URL (overrides server.base_url from user.toml) [env: FABRO_SERVER_URL=] + --storage-dir Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]] + --server-url Fabro API server URL (overrides server.base_url from user.toml when supported) [env: FABRO_SERVER_URL=] -h, --help Print help ----- stderr ----- "); diff --git a/lib/crates/fabro-cli/tests/it/cmd/resume.rs b/lib/crates/fabro-cli/tests/it/cmd/resume.rs index 033b2074c..7fc78b6ec 100644 --- a/lib/crates/fabro-cli/tests/it/cmd/resume.rs +++ b/lib/crates/fabro-cli/tests/it/cmd/resume.rs @@ -27,8 +27,8 @@ fn help() { --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 directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]] - --server-url Server URL (overrides server.base_url from user.toml) [env: FABRO_SERVER_URL=] + --storage-dir Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]] + --server-url Fabro API server URL (overrides server.base_url from user.toml when supported) [env: FABRO_SERVER_URL=] -h, --help Print help ----- stderr ----- "); diff --git a/lib/crates/fabro-cli/tests/it/cmd/rewind.rs b/lib/crates/fabro-cli/tests/it/cmd/rewind.rs index b54611295..839f03792 100644 --- a/lib/crates/fabro-cli/tests/it/cmd/rewind.rs +++ b/lib/crates/fabro-cli/tests/it/cmd/rewind.rs @@ -32,8 +32,8 @@ fn help() { --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 directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]] - --server-url Server URL (overrides server.base_url from user.toml) [env: FABRO_SERVER_URL=] + --storage-dir Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]] + --server-url Fabro API server URL (overrides server.base_url from user.toml when supported) [env: FABRO_SERVER_URL=] -h, --help Print help ----- stderr ----- "); diff --git a/lib/crates/fabro-cli/tests/it/cmd/rm.rs b/lib/crates/fabro-cli/tests/it/cmd/rm.rs index e411743d2..06eccaa92 100644 --- a/lib/crates/fabro-cli/tests/it/cmd/rm.rs +++ b/lib/crates/fabro-cli/tests/it/cmd/rm.rs @@ -28,8 +28,8 @@ fn help() { --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 directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]] - --server-url Server URL (overrides server.base_url from user.toml) [env: FABRO_SERVER_URL=] + --storage-dir Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]] + --server-url Fabro API server URL (overrides server.base_url from user.toml when supported) [env: FABRO_SERVER_URL=] -h, --help Print help ----- stderr ----- "); diff --git a/lib/crates/fabro-cli/tests/it/cmd/run.rs b/lib/crates/fabro-cli/tests/it/cmd/run.rs index 95755543d..4ecc150f3 100644 --- a/lib/crates/fabro-cli/tests/it/cmd/run.rs +++ b/lib/crates/fabro-cli/tests/it/cmd/run.rs @@ -37,8 +37,8 @@ fn help() { --quiet Suppress non-essential output [env: FABRO_QUIET=] --model Override default LLM model --provider Override default LLM provider - --storage-dir Storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]] - --server-url Server URL (overrides server.base_url from user.toml) [env: FABRO_SERVER_URL=] + --storage-dir Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]] + --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 for agent tools [possible values: local, docker, daytona] --label Attach a label to this run (repeatable, format: KEY=VALUE) @@ -374,7 +374,6 @@ fn json_run_implies_auto_approve_for_human_gates() { "model": "[LLM_MODEL]", "provider": "[LLM_PROVIDER]" }, - "mode": "standalone", "no_retro": true, "sandbox": { "daytona": null, diff --git a/lib/crates/fabro-cli/tests/it/cmd/runner.rs b/lib/crates/fabro-cli/tests/it/cmd/runner.rs index ae9d7bc08..fa5b26b66 100644 --- a/lib/crates/fabro-cli/tests/it/cmd/runner.rs +++ b/lib/crates/fabro-cli/tests/it/cmd/runner.rs @@ -26,8 +26,8 @@ fn help() { --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 directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]] - --server-url Server URL (overrides server.base_url from user.toml) [env: FABRO_SERVER_URL=] + --storage-dir Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]] + --server-url Fabro API server URL (overrides server.base_url from user.toml when supported) [env: FABRO_SERVER_URL=] -h, --help Print help ----- stderr ----- "); diff --git a/lib/crates/fabro-cli/tests/it/cmd/sandbox_cp.rs b/lib/crates/fabro-cli/tests/it/cmd/sandbox_cp.rs index 330c0eaee..4e12ee813 100644 --- a/lib/crates/fabro-cli/tests/it/cmd/sandbox_cp.rs +++ b/lib/crates/fabro-cli/tests/it/cmd/sandbox_cp.rs @@ -26,8 +26,8 @@ fn help() { --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 directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]] - --server-url Server URL (overrides server.base_url from user.toml) [env: FABRO_SERVER_URL=] + --storage-dir Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]] + --server-url Fabro API server URL (overrides server.base_url from user.toml when supported) [env: FABRO_SERVER_URL=] -h, --help Print help ----- stderr ----- "); diff --git a/lib/crates/fabro-cli/tests/it/cmd/sandbox_preview.rs b/lib/crates/fabro-cli/tests/it/cmd/sandbox_preview.rs index ec9869435..dc40b8be8 100644 --- a/lib/crates/fabro-cli/tests/it/cmd/sandbox_preview.rs +++ b/lib/crates/fabro-cli/tests/it/cmd/sandbox_preview.rs @@ -28,8 +28,8 @@ fn help() { --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 directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]] - --server-url Server URL (overrides server.base_url from user.toml) [env: FABRO_SERVER_URL=] + --storage-dir Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]] + --server-url Fabro API server URL (overrides server.base_url from user.toml when supported) [env: FABRO_SERVER_URL=] -h, --help Print help ----- stderr ----- "); diff --git a/lib/crates/fabro-cli/tests/it/cmd/sandbox_ssh.rs b/lib/crates/fabro-cli/tests/it/cmd/sandbox_ssh.rs index 0f620589b..4b6c1b90a 100644 --- a/lib/crates/fabro-cli/tests/it/cmd/sandbox_ssh.rs +++ b/lib/crates/fabro-cli/tests/it/cmd/sandbox_ssh.rs @@ -26,8 +26,8 @@ fn help() { --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 directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]] - --server-url Server URL (overrides server.base_url from user.toml) [env: FABRO_SERVER_URL=] + --storage-dir Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]] + --server-url Fabro API server URL (overrides server.base_url from user.toml when supported) [env: FABRO_SERVER_URL=] -h, --help Print help ----- stderr ----- "); diff --git a/lib/crates/fabro-cli/tests/it/cmd/secret.rs b/lib/crates/fabro-cli/tests/it/cmd/secret.rs index 579d2f197..e02216e25 100644 --- a/lib/crates/fabro-cli/tests/it/cmd/secret.rs +++ b/lib/crates/fabro-cli/tests/it/cmd/secret.rs @@ -28,8 +28,8 @@ fn help() { --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 directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]] - --server-url Server URL (overrides server.base_url from user.toml) [env: FABRO_SERVER_URL=] + --storage-dir Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]] + --server-url Fabro API server URL (overrides server.base_url from user.toml when supported) [env: FABRO_SERVER_URL=] -h, --help Print help ----- stderr ----- "); diff --git a/lib/crates/fabro-cli/tests/it/cmd/secret_get.rs b/lib/crates/fabro-cli/tests/it/cmd/secret_get.rs index aeb153bb0..38fe583f4 100644 --- a/lib/crates/fabro-cli/tests/it/cmd/secret_get.rs +++ b/lib/crates/fabro-cli/tests/it/cmd/secret_get.rs @@ -22,8 +22,8 @@ fn help() { --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 directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]] - --server-url Server URL (overrides server.base_url from user.toml) [env: FABRO_SERVER_URL=] + --storage-dir Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]] + --server-url Fabro API server URL (overrides server.base_url from user.toml when supported) [env: FABRO_SERVER_URL=] -h, --help Print help ----- stderr ----- "); diff --git a/lib/crates/fabro-cli/tests/it/cmd/secret_list.rs b/lib/crates/fabro-cli/tests/it/cmd/secret_list.rs index 7ebdeb2dc..3561ff674 100644 --- a/lib/crates/fabro-cli/tests/it/cmd/secret_list.rs +++ b/lib/crates/fabro-cli/tests/it/cmd/secret_list.rs @@ -21,8 +21,8 @@ fn help() { --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 directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]] - --server-url Server URL (overrides server.base_url from user.toml) [env: FABRO_SERVER_URL=] + --storage-dir Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]] + --server-url Fabro API server URL (overrides server.base_url from user.toml when supported) [env: FABRO_SERVER_URL=] -h, --help Print help ----- stderr ----- "); diff --git a/lib/crates/fabro-cli/tests/it/cmd/secret_rm.rs b/lib/crates/fabro-cli/tests/it/cmd/secret_rm.rs index 30142ed57..8e798c64e 100644 --- a/lib/crates/fabro-cli/tests/it/cmd/secret_rm.rs +++ b/lib/crates/fabro-cli/tests/it/cmd/secret_rm.rs @@ -22,8 +22,8 @@ fn help() { --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 directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]] - --server-url Server URL (overrides server.base_url from user.toml) [env: FABRO_SERVER_URL=] + --storage-dir Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]] + --server-url Fabro API server URL (overrides server.base_url from user.toml when supported) [env: FABRO_SERVER_URL=] -h, --help Print help ----- stderr ----- "); diff --git a/lib/crates/fabro-cli/tests/it/cmd/secret_set.rs b/lib/crates/fabro-cli/tests/it/cmd/secret_set.rs index a05748079..fb33f09ff 100644 --- a/lib/crates/fabro-cli/tests/it/cmd/secret_set.rs +++ b/lib/crates/fabro-cli/tests/it/cmd/secret_set.rs @@ -23,8 +23,8 @@ fn help() { --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 directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]] - --server-url Server URL (overrides server.base_url from user.toml) [env: FABRO_SERVER_URL=] + --storage-dir Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]] + --server-url Fabro API server URL (overrides server.base_url from user.toml when supported) [env: FABRO_SERVER_URL=] -h, --help Print help ----- stderr ----- "); diff --git a/lib/crates/fabro-cli/tests/it/cmd/send_analytics.rs b/lib/crates/fabro-cli/tests/it/cmd/send_analytics.rs index 9f40918c6..c4ce5160c 100644 --- a/lib/crates/fabro-cli/tests/it/cmd/send_analytics.rs +++ b/lib/crates/fabro-cli/tests/it/cmd/send_analytics.rs @@ -22,8 +22,8 @@ fn help() { --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 directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]] - --server-url Server URL (overrides server.base_url from user.toml) [env: FABRO_SERVER_URL=] + --storage-dir Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]] + --server-url Fabro API server URL (overrides server.base_url from user.toml when supported) [env: FABRO_SERVER_URL=] -h, --help Print help ----- stderr ----- "); diff --git a/lib/crates/fabro-cli/tests/it/cmd/send_panic.rs b/lib/crates/fabro-cli/tests/it/cmd/send_panic.rs index a464a21bf..cda1725ad 100644 --- a/lib/crates/fabro-cli/tests/it/cmd/send_panic.rs +++ b/lib/crates/fabro-cli/tests/it/cmd/send_panic.rs @@ -22,8 +22,8 @@ fn help() { --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 directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]] - --server-url Server URL (overrides server.base_url from user.toml) [env: FABRO_SERVER_URL=] + --storage-dir Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]] + --server-url Fabro API server URL (overrides server.base_url from user.toml when supported) [env: FABRO_SERVER_URL=] -h, --help Print help ----- stderr ----- "); diff --git a/lib/crates/fabro-cli/tests/it/cmd/server_start.rs b/lib/crates/fabro-cli/tests/it/cmd/server_start.rs index 48d37974f..20ffa3a91 100644 --- a/lib/crates/fabro-cli/tests/it/cmd/server_start.rs +++ b/lib/crates/fabro-cli/tests/it/cmd/server_start.rs @@ -46,11 +46,11 @@ fn help() { --sandbox Sandbox for agent tools --storage-dir - Storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]] + Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]] --max-concurrent-runs Maximum number of concurrent run executions --server-url - Server URL (overrides server.base_url from user.toml) [env: FABRO_SERVER_URL=] + Fabro API server URL (overrides server.base_url from user.toml when supported) [env: FABRO_SERVER_URL=] --config Path to server config file (default: ~/.fabro/server.toml) -h, --help diff --git a/lib/crates/fabro-cli/tests/it/cmd/server_status.rs b/lib/crates/fabro-cli/tests/it/cmd/server_status.rs index 85dc39eb1..e4394a113 100644 --- a/lib/crates/fabro-cli/tests/it/cmd/server_status.rs +++ b/lib/crates/fabro-cli/tests/it/cmd/server_status.rs @@ -25,8 +25,8 @@ fn help() { --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 directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]] - --server-url Server URL (overrides server.base_url from user.toml) [env: FABRO_SERVER_URL=] + --storage-dir Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]] + --server-url Fabro API server URL (overrides server.base_url from user.toml when supported) [env: FABRO_SERVER_URL=] -h, --help Print help ----- stderr ----- "); diff --git a/lib/crates/fabro-cli/tests/it/cmd/server_stop.rs b/lib/crates/fabro-cli/tests/it/cmd/server_stop.rs index 45d8c3457..f40dd1b73 100644 --- a/lib/crates/fabro-cli/tests/it/cmd/server_stop.rs +++ b/lib/crates/fabro-cli/tests/it/cmd/server_stop.rs @@ -26,8 +26,8 @@ fn help() { --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 directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]] - --server-url Server URL (overrides server.base_url from user.toml) [env: FABRO_SERVER_URL=] + --storage-dir Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]] + --server-url Fabro API server URL (overrides server.base_url from user.toml when supported) [env: FABRO_SERVER_URL=] -h, --help Print help ----- stderr ----- "); diff --git a/lib/crates/fabro-cli/tests/it/cmd/start.rs b/lib/crates/fabro-cli/tests/it/cmd/start.rs index 82bb5a2be..ed268d305 100644 --- a/lib/crates/fabro-cli/tests/it/cmd/start.rs +++ b/lib/crates/fabro-cli/tests/it/cmd/start.rs @@ -28,8 +28,8 @@ fn help() { --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 directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]] - --server-url Server URL (overrides server.base_url from user.toml) [env: FABRO_SERVER_URL=] + --storage-dir Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]] + --server-url Fabro API server URL (overrides server.base_url from user.toml when supported) [env: FABRO_SERVER_URL=] -h, --help Print help ----- stderr ----- "); diff --git a/lib/crates/fabro-cli/tests/it/cmd/store.rs b/lib/crates/fabro-cli/tests/it/cmd/store.rs index cefd5ed6f..e04956b02 100644 --- a/lib/crates/fabro-cli/tests/it/cmd/store.rs +++ b/lib/crates/fabro-cli/tests/it/cmd/store.rs @@ -23,8 +23,8 @@ fn help() { --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 directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]] - --server-url Server URL (overrides server.base_url from user.toml) [env: FABRO_SERVER_URL=] + --storage-dir Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]] + --server-url Fabro API server URL (overrides server.base_url from user.toml when supported) [env: FABRO_SERVER_URL=] -h, --help Print help ----- stderr ----- "); diff --git a/lib/crates/fabro-cli/tests/it/cmd/store_dump.rs b/lib/crates/fabro-cli/tests/it/cmd/store_dump.rs index 88bdd536d..5004e83df 100644 --- a/lib/crates/fabro-cli/tests/it/cmd/store_dump.rs +++ b/lib/crates/fabro-cli/tests/it/cmd/store_dump.rs @@ -27,8 +27,8 @@ fn help() { --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 directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]] - --server-url Server URL (overrides server.base_url from user.toml) [env: FABRO_SERVER_URL=] + --storage-dir Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]] + --server-url Fabro API server URL (overrides server.base_url from user.toml when supported) [env: FABRO_SERVER_URL=] -h, --help Print help ----- stderr ----- "); diff --git a/lib/crates/fabro-cli/tests/it/cmd/system.rs b/lib/crates/fabro-cli/tests/it/cmd/system.rs index 7c9fd8f5d..8c1048d52 100644 --- a/lib/crates/fabro-cli/tests/it/cmd/system.rs +++ b/lib/crates/fabro-cli/tests/it/cmd/system.rs @@ -24,8 +24,8 @@ fn help() { --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 directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]] - --server-url Server URL (overrides server.base_url from user.toml) [env: FABRO_SERVER_URL=] + --storage-dir Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]] + --server-url Fabro API server URL (overrides server.base_url from user.toml when supported) [env: FABRO_SERVER_URL=] -h, --help Print help ----- stderr ----- "); diff --git a/lib/crates/fabro-cli/tests/it/cmd/system_df.rs b/lib/crates/fabro-cli/tests/it/cmd/system_df.rs index 418f2492b..c487516e4 100644 --- a/lib/crates/fabro-cli/tests/it/cmd/system_df.rs +++ b/lib/crates/fabro-cli/tests/it/cmd/system_df.rs @@ -22,8 +22,8 @@ fn help() { --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=] - --storage-dir Storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]] - --server-url Server URL (overrides server.base_url from user.toml) [env: FABRO_SERVER_URL=] + --storage-dir Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]] + --server-url Fabro API server URL (overrides server.base_url from user.toml when supported) [env: FABRO_SERVER_URL=] -h, --help Print help ----- stderr ----- "); diff --git a/lib/crates/fabro-cli/tests/it/cmd/system_prune.rs b/lib/crates/fabro-cli/tests/it/cmd/system_prune.rs index 175b10a6c..1b9e284d5 100644 --- a/lib/crates/fabro-cli/tests/it/cmd/system_prune.rs +++ b/lib/crates/fabro-cli/tests/it/cmd/system_prune.rs @@ -26,9 +26,9 @@ fn help() { --quiet Suppress non-essential output [env: FABRO_QUIET=] --older-than Only prune runs older than this duration (e.g. 24h, 7d). Default: 24h when no explicit filters are set --verbose Enable verbose output [env: FABRO_VERBOSE=] - --storage-dir Storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]] + --storage-dir Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]] --yes Actually delete (default is dry-run) - --server-url Server URL (overrides server.base_url from user.toml) [env: FABRO_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 ----- "); diff --git a/lib/crates/fabro-cli/tests/it/cmd/upgrade.rs b/lib/crates/fabro-cli/tests/it/cmd/upgrade.rs index 71a27876f..5af2e17c0 100644 --- a/lib/crates/fabro-cli/tests/it/cmd/upgrade.rs +++ b/lib/crates/fabro-cli/tests/it/cmd/upgrade.rs @@ -22,8 +22,8 @@ fn help() { --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 directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]] - --server-url Server URL (overrides server.base_url from user.toml) [env: FABRO_SERVER_URL=] + --storage-dir Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]] + --server-url Fabro API server URL (overrides server.base_url from user.toml when supported) [env: FABRO_SERVER_URL=] -h, --help Print help ----- stderr ----- "#); diff --git a/lib/crates/fabro-cli/tests/it/cmd/validate.rs b/lib/crates/fabro-cli/tests/it/cmd/validate.rs index bce2ef0e5..aa5ef3868 100644 --- a/lib/crates/fabro-cli/tests/it/cmd/validate.rs +++ b/lib/crates/fabro-cli/tests/it/cmd/validate.rs @@ -29,8 +29,8 @@ fn help() { --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 directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]] - --server-url Server URL (overrides server.base_url from user.toml) [env: FABRO_SERVER_URL=] + --storage-dir Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]] + --server-url Fabro API server URL (overrides server.base_url from user.toml when supported) [env: FABRO_SERVER_URL=] -h, --help Print help ----- stderr ----- "); diff --git a/lib/crates/fabro-cli/tests/it/cmd/wait.rs b/lib/crates/fabro-cli/tests/it/cmd/wait.rs index 29ebfd9c5..3b5605265 100644 --- a/lib/crates/fabro-cli/tests/it/cmd/wait.rs +++ b/lib/crates/fabro-cli/tests/it/cmd/wait.rs @@ -26,8 +26,8 @@ fn help() { --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 directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]] - --server-url Server URL (overrides server.base_url from user.toml) [env: FABRO_SERVER_URL=] + --storage-dir Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]] + --server-url Fabro API server URL (overrides server.base_url from user.toml when supported) [env: FABRO_SERVER_URL=] -h, --help Print help ----- stderr ----- "); diff --git a/lib/crates/fabro-cli/tests/it/cmd/workflow.rs b/lib/crates/fabro-cli/tests/it/cmd/workflow.rs index 24a23842e..9a7e661ed 100644 --- a/lib/crates/fabro-cli/tests/it/cmd/workflow.rs +++ b/lib/crates/fabro-cli/tests/it/cmd/workflow.rs @@ -24,8 +24,8 @@ fn help() { --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 directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]] - --server-url Server URL (overrides server.base_url from user.toml) [env: FABRO_SERVER_URL=] + --storage-dir Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]] + --server-url Fabro API server URL (overrides server.base_url from user.toml when supported) [env: FABRO_SERVER_URL=] -h, --help Print help ----- stderr ----- "); diff --git a/lib/crates/fabro-cli/tests/it/cmd/workflow_create.rs b/lib/crates/fabro-cli/tests/it/cmd/workflow_create.rs index 1211d4004..e64125f51 100644 --- a/lib/crates/fabro-cli/tests/it/cmd/workflow_create.rs +++ b/lib/crates/fabro-cli/tests/it/cmd/workflow_create.rs @@ -30,8 +30,8 @@ fn help() { --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 directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]] - --server-url Server URL (overrides server.base_url from user.toml) [env: FABRO_SERVER_URL=] + --storage-dir Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]] + --server-url Fabro API server URL (overrides server.base_url from user.toml when supported) [env: FABRO_SERVER_URL=] -h, --help Print help ----- stderr ----- "); diff --git a/lib/crates/fabro-cli/tests/it/cmd/workflow_list.rs b/lib/crates/fabro-cli/tests/it/cmd/workflow_list.rs index 703bfa6a8..97f3af010 100644 --- a/lib/crates/fabro-cli/tests/it/cmd/workflow_list.rs +++ b/lib/crates/fabro-cli/tests/it/cmd/workflow_list.rs @@ -21,8 +21,8 @@ fn help() { --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 directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]] - --server-url Server URL (overrides server.base_url from user.toml) [env: FABRO_SERVER_URL=] + --storage-dir Local storage directory (default: ~/.fabro) [env: FABRO_STORAGE_DIR=[STORAGE_DIR]] + --server-url Fabro API server URL (overrides server.base_url from user.toml when supported) [env: FABRO_SERVER_URL=] -h, --help Print help ----- stderr ----- "); diff --git a/lib/crates/fabro-config/src/config.rs b/lib/crates/fabro-config/src/config.rs index 72abe987d..7c9aa6c26 100644 --- a/lib/crates/fabro-config/src/config.rs +++ b/lib/crates/fabro-config/src/config.rs @@ -12,7 +12,7 @@ use crate::run::{ }; use crate::sandbox::SandboxConfig; use crate::server::{self, ApiConfig, FeaturesConfig, GitConfig, LogConfig, WebConfig}; -use crate::user::{self, ExecConfig, ExecutionMode, ServerConfig}; +use crate::user::{self, ExecConfig, ServerConfig}; use fabro_types::Settings; fn is_default_checkpoint(c: &CheckpointConfig) -> bool { @@ -77,9 +77,6 @@ pub struct ConfigLayer { pub github: Option, // --- User config fields --- - #[serde(default, skip_serializing_if = "Option::is_none")] - pub mode: Option, - #[serde(default, skip_serializing_if = "Option::is_none")] pub server: Option, @@ -161,7 +158,6 @@ impl Combine for ConfigLayer { hooks, mcp_servers: self.mcp_servers.combine(other.mcp_servers), github: self.github.combine(other.github), - mode: self.mode.combine(other.mode), server: self.server.combine(other.server), exec: self.exec.combine(other.exec), prevent_idle_sleep: self.prevent_idle_sleep.combine(other.prevent_idle_sleep), diff --git a/lib/crates/fabro-config/src/settings.rs b/lib/crates/fabro-config/src/settings.rs index 8918df2fb..537f7ceb5 100644 --- a/lib/crates/fabro-config/src/settings.rs +++ b/lib/crates/fabro-config/src/settings.rs @@ -23,7 +23,6 @@ impl TryFrom for Settings { hooks: value.hooks, mcp_servers: value.mcp_servers, github: value.github.map(Into::into), - mode: value.mode, server: value.server.map(TryInto::try_into).transpose()?, exec: value.exec.map(Into::into), prevent_idle_sleep: value.prevent_idle_sleep, diff --git a/lib/crates/fabro-config/src/user.rs b/lib/crates/fabro-config/src/user.rs index 0dedf2522..8883b2ca5 100644 --- a/lib/crates/fabro-config/src/user.rs +++ b/lib/crates/fabro-config/src/user.rs @@ -8,7 +8,7 @@ use serde::{Deserialize, Serialize}; use crate::config::ConfigLayer; pub use fabro_types::settings::user::{ - ClientTlsSettings, ExecSettings, ExecutionMode, OutputFormat, PermissionLevel, ServerSettings, + ClientTlsSettings, ExecSettings, OutputFormat, PermissionLevel, ServerSettings, }; pub const USER_CONFIG_FILENAME: &str = "user.toml"; diff --git a/lib/crates/fabro-server/tests/it/api/routing.rs b/lib/crates/fabro-server/tests/it/api/routing.rs index f1631ac6e..dc4d97c06 100644 --- a/lib/crates/fabro-server/tests/it/api/routing.rs +++ b/lib/crates/fabro-server/tests/it/api/routing.rs @@ -1,5 +1,6 @@ -use axum::body::Body; +use axum::body::{Body, to_bytes}; use axum::http::{Method, Request, StatusCode}; +use fabro_server::jwt_auth::AuthMode; use fabro_server::server::{build_router, create_app_state}; use tower::ServiceExt; @@ -7,10 +8,7 @@ use crate::helpers::body_json; #[tokio::test] async fn old_unversioned_routes_return_404() { - let app = build_router( - create_app_state(), - fabro_server::jwt_auth::AuthMode::Disabled, - ); + let app = build_router(create_app_state(), AuthMode::Disabled); let cases = [(Method::POST, "/completions")]; @@ -27,10 +25,7 @@ async fn old_unversioned_routes_return_404() { #[tokio::test] async fn root_and_health_stay_at_root() { - let app = build_router( - create_app_state(), - fabro_server::jwt_auth::AuthMode::Disabled, - ); + let app = build_router(create_app_state(), AuthMode::Disabled); let root_req = Request::builder() .method("GET") @@ -39,7 +34,7 @@ async fn root_and_health_stay_at_root() { .unwrap(); let root_response = app.clone().oneshot(root_req).await.unwrap(); assert_eq!(root_response.status(), StatusCode::OK); - let root_body = axum::body::to_bytes(root_response.into_body(), usize::MAX) + let root_body = to_bytes(root_response.into_body(), usize::MAX) .await .unwrap(); let root_html = String::from_utf8(root_body.to_vec()).unwrap(); @@ -58,10 +53,7 @@ async fn root_and_health_stay_at_root() { #[tokio::test] async fn moved_routes_not_at_root_of_api_prefix() { - let app = build_router( - create_app_state(), - fabro_server::jwt_auth::AuthMode::Disabled, - ); + let app = build_router(create_app_state(), AuthMode::Disabled); for path in ["/api/v1/health", "/api/v1/"] { let req = Request::builder() diff --git a/lib/crates/fabro-server/tests/it/helpers.rs b/lib/crates/fabro-server/tests/it/helpers.rs index 282c73e98..6ab6d97e7 100644 --- a/lib/crates/fabro-server/tests/it/helpers.rs +++ b/lib/crates/fabro-server/tests/it/helpers.rs @@ -1,13 +1,14 @@ use std::sync::Arc; use std::time::Duration; -use axum::body::Body; +use axum::body::{Body, to_bytes}; use axum::http::{Request, StatusCode}; use fabro_server::jwt_auth::AuthMode; use fabro_server::server::{ AppState, build_router, create_app_state, create_app_state_with_options, spawn_scheduler, }; use fabro_types::Settings; +use tokio::time::sleep; use tower::ServiceExt; pub(crate) const MINIMAL_DOT: &str = r#"digraph Test { @@ -47,7 +48,7 @@ pub(crate) fn api(path: &str) -> String { } pub(crate) async fn body_json(body: Body) -> serde_json::Value { - let bytes = axum::body::to_bytes(body, usize::MAX).await.unwrap(); + let bytes = to_bytes(body, usize::MAX).await.unwrap(); serde_json::from_slice(&bytes).unwrap() } @@ -98,7 +99,7 @@ pub(crate) async fn wait_for_run_status( if expected.iter().any(|candidate| *candidate == status) { return status; } - tokio::time::sleep(POLL_INTERVAL).await; + sleep(POLL_INTERVAL).await; } panic!("run {run_id} did not reach any of {expected:?}"); } @@ -114,7 +115,7 @@ pub(crate) async fn wait_for_run_status_not_in( if unexpected.iter().all(|candidate| *candidate != status) { return status; } - tokio::time::sleep(POLL_INTERVAL).await; + sleep(POLL_INTERVAL).await; } panic!("run {run_id} stayed in {unexpected:?}"); } diff --git a/lib/crates/fabro-server/tests/it/scenario/lifecycle.rs b/lib/crates/fabro-server/tests/it/scenario/lifecycle.rs index b55bcdff7..07049936f 100644 --- a/lib/crates/fabro-server/tests/it/scenario/lifecycle.rs +++ b/lib/crates/fabro-server/tests/it/scenario/lifecycle.rs @@ -3,12 +3,14 @@ use std::sync::Arc; use axum::body::Body; use axum::http::{Request, StatusCode}; use fabro_interview::Interviewer; -use fabro_server::server::{build_router, create_app_state_with_registry_factory}; +use fabro_server::jwt_auth::AuthMode; +use fabro_server::server::{build_router, create_app_state_with_registry_factory, spawn_scheduler}; use fabro_workflow::handler::HandlerRegistry; use fabro_workflow::handler::agent::AgentHandler; use fabro_workflow::handler::exit::ExitHandler; use fabro_workflow::handler::human::HumanHandler; use fabro_workflow::handler::start::StartHandler; +use tokio::time::sleep; use tower::ServiceExt; use crate::helpers::{ @@ -42,7 +44,7 @@ async fn wait_for_question_id(app: &axum::Router, run_id: &str) -> String { { return question_id; } - tokio::time::sleep(POLL_INTERVAL).await; + sleep(POLL_INTERVAL).await; } panic!("question should have appeared"); } @@ -66,11 +68,8 @@ const GATE_DOT: &str = r#"digraph GateTest { #[tokio::test(flavor = "multi_thread", worker_threads = 2)] async fn full_http_lifecycle_approve_and_complete() { let state = create_app_state_with_registry_factory(gate_registry); - fabro_server::server::spawn_scheduler(Arc::clone(&state)); - let app = build_router( - Arc::clone(&state), - fabro_server::jwt_auth::AuthMode::Disabled, - ); + spawn_scheduler(Arc::clone(&state)); + let app = build_router(Arc::clone(&state), AuthMode::Disabled); // 1. Create run let req = Request::builder() @@ -134,11 +133,8 @@ async fn full_http_lifecycle_approve_and_complete() { #[tokio::test(flavor = "multi_thread", worker_threads = 2)] async fn full_http_lifecycle_cancel() { let state = create_app_state_with_registry_factory(gate_registry); - fabro_server::server::spawn_scheduler(Arc::clone(&state)); - let app = build_router( - Arc::clone(&state), - fabro_server::jwt_auth::AuthMode::Disabled, - ); + spawn_scheduler(Arc::clone(&state)); + let app = build_router(Arc::clone(&state), AuthMode::Disabled); // Create and start a run that will block at the human gate let req = Request::builder() diff --git a/lib/crates/fabro-server/tests/it/scenario/run_completion.rs b/lib/crates/fabro-server/tests/it/scenario/run_completion.rs index bc3dfc43e..228ddb0b7 100644 --- a/lib/crates/fabro-server/tests/it/scenario/run_completion.rs +++ b/lib/crates/fabro-server/tests/it/scenario/run_completion.rs @@ -1,6 +1,7 @@ use axum::body::Body; use axum::http::{Request, StatusCode}; use fabro_server::server::create_app_state_with_options; +use tokio::time::sleep; use tower::ServiceExt; use crate::helpers::{ @@ -27,7 +28,7 @@ async fn attach_run_events_returns_sse_stream() { let run_id = create_and_start_run(&app, MINIMAL_DOT).await; // Wait for scheduler to promote run. - tokio::time::sleep(std::time::Duration::from_millis(100)).await; + sleep(std::time::Duration::from_millis(100)).await; let req = Request::builder() .method("GET") diff --git a/lib/crates/fabro-server/tests/it/scenario/sse.rs b/lib/crates/fabro-server/tests/it/scenario/sse.rs index fcffc41bd..170344b28 100644 --- a/lib/crates/fabro-server/tests/it/scenario/sse.rs +++ b/lib/crates/fabro-server/tests/it/scenario/sse.rs @@ -4,6 +4,7 @@ use axum::body::Body; use axum::http::{Request, StatusCode}; use fabro_server::server::create_app_state_with_options; use http_body_util::BodyExt; +use tokio::time::{sleep, timeout}; use tower::ServiceExt; use crate::helpers::{ @@ -30,7 +31,7 @@ async fn wait_for_checkpoint(app: &axum::Router, run_id: &str) -> serde_json::Va if response.status() == StatusCode::OK { return body_json(response.into_body()).await; } - tokio::time::sleep(POLL_INTERVAL).await; + sleep(POLL_INTERVAL).await; } panic!("checkpoint did not become available for {run_id}"); } @@ -72,8 +73,7 @@ async fn sse_stream_contains_expected_event_types() { // Collect SSE frames with a timeout let mut body = response.into_body(); let mut sse_data = String::new(); - while let Ok(Some(Ok(frame))) = tokio::time::timeout(Duration::from_secs(2), body.frame()).await - { + while let Ok(Some(Ok(frame))) = timeout(Duration::from_secs(2), body.frame()).await { if let Some(data) = frame.data_ref() { sse_data.push_str(&String::from_utf8_lossy(data)); } diff --git a/lib/crates/fabro-server/tests/it/scenario/usage.rs b/lib/crates/fabro-server/tests/it/scenario/usage.rs index 1d478cde7..0bc95d5ae 100644 --- a/lib/crates/fabro-server/tests/it/scenario/usage.rs +++ b/lib/crates/fabro-server/tests/it/scenario/usage.rs @@ -1,6 +1,7 @@ use axum::body::Body; use axum::http::{Request, StatusCode}; use fabro_server::server::create_app_state_with_options; +use tokio::time::sleep; use tower::ServiceExt; use crate::helpers::{ @@ -35,7 +36,7 @@ async fn aggregate_usage_increments_after_run_completes() { if total_runs == 1 { break; } - tokio::time::sleep(POLL_INTERVAL).await; + sleep(POLL_INTERVAL).await; } assert_eq!(total_runs, 1); } diff --git a/lib/crates/fabro-test/src/lib.rs b/lib/crates/fabro-test/src/lib.rs index 9997b597f..e2c83ea84 100644 --- a/lib/crates/fabro-test/src/lib.rs +++ b/lib/crates/fabro-test/src/lib.rs @@ -305,7 +305,7 @@ fn stop_session_server(storage_dir: &Path) { let Ok(record) = serde_json::from_str::(&content) else { return; }; - let Some(pid) = record["pid"].as_u64().map(|p| p as u32) else { + let Some(pid) = record["pid"].as_u64().and_then(|p| u32::try_from(p).ok()) else { return; }; diff --git a/lib/crates/fabro-types/src/settings/mod.rs b/lib/crates/fabro-types/src/settings/mod.rs index 5692dabb0..25a79738d 100644 --- a/lib/crates/fabro-types/src/settings/mod.rs +++ b/lib/crates/fabro-types/src/settings/mod.rs @@ -30,9 +30,7 @@ pub use server::{ GitProvider, GitSettings, LogSettings, TlsSettings, WebSettings, WebhookSettings, WebhookStrategy, }; -pub use user::{ - ClientTlsSettings, ExecSettings, ExecutionMode, OutputFormat, PermissionLevel, ServerSettings, -}; +pub use user::{ClientTlsSettings, ExecSettings, OutputFormat, PermissionLevel, ServerSettings}; fn is_default_checkpoint(c: &CheckpointSettings) -> bool { c.exclude_globs.is_empty() @@ -73,8 +71,6 @@ pub struct Settings { #[serde(default, skip_serializing_if = "Option::is_none")] pub github: Option, #[serde(default, skip_serializing_if = "Option::is_none")] - pub mode: Option, - #[serde(default, skip_serializing_if = "Option::is_none")] pub server: Option, #[serde(default, skip_serializing_if = "Option::is_none")] pub exec: Option, diff --git a/lib/crates/fabro-types/src/settings/user.rs b/lib/crates/fabro-types/src/settings/user.rs index 897cea01a..b1d5cf779 100644 --- a/lib/crates/fabro-types/src/settings/user.rs +++ b/lib/crates/fabro-types/src/settings/user.rs @@ -19,15 +19,6 @@ pub enum PermissionLevel { Full, } -#[derive(Clone, Debug, Default, Deserialize, PartialEq, Serialize, crate::Combine)] -#[cfg_attr(feature = "clap", derive(clap::ValueEnum))] -#[serde(rename_all = "lowercase")] -pub enum ExecutionMode { - #[default] - Standalone, - Server, -} - #[derive(Clone, Debug, Deserialize, PartialEq, Serialize)] pub struct ClientTlsSettings { pub cert: PathBuf,