Global options
These flags apply to all subcommands:| Flag | Description |
|---|---|
--json | Output machine-readable JSON when the command supports it |
--debug | Enable DEBUG-level logging (default is INFO) |
--no-upgrade-check | Skip the automatic background upgrade check |
--quiet | Suppress non-essential output |
--verbose | Enable verbose output |
-h, --help | Print help |
-V, --version | Print version |
--storage-dir and --server are command-specific, not global. Fabro no longer auto-loads ~/.fabro/.env; persist server-owned credentials with fabro provider login / fabro secret set, or provide environment variables in the invoking shell.
Configuration
CLI defaults can be set in~/.fabro/settings.toml so you don’t have to pass common flags every time:
settings.toml
[cli.exec] config applies to fabro exec. [run.model] sets the default workflow model/provider for commands like fabro run and fabro preflight. [cli.target] stores connection info for commands that can target a remote Fabro server.
fabro model uses [cli.target] by default when no explicit --storage-dir is passed. fabro exec remains a local session unless you pass --server, even if [cli.target] is configured.
Explicit http(s)://... targets are always treated as remote servers. They do not inherit identity from a local daemon, a local storage dir, or ~/.fabro/dev-token. For remote URLs, use fabro auth login --server ..., a stored CLI auth session, or an explicit FABRO_DEV_TOKEN.
CLI flags always override settings.toml values, which override hardcoded defaults.
fabro
Running fabro with no subcommand prints a short, curated landing guide organized by lifecycle stage — Set up, Author workflows, Run workflows, Inspect runs — highlighting the commands most users reach for first. Use fabro help or fabro --help for the full clap-generated command reference.
fabro settings
Print the merged resolved configuration as YAML.
~/.fabro/settings.toml and the nearest .fabro/project.toml.
When you pass a workflow name or path:
- If it resolves to a
.tomlrun config, Fabro overlays that run config on top of the ambient defaults before printing. - If it resolves to a
.fabrograph file, Fabro prints the ambient defaults unchanged.
| Argument | Description |
|---|---|
[WORKFLOW] | Optional workflow name, .fabro workflow path, or .toml run config path |
fabro run
Launch a workflow from a .fabro workflow file or .toml task config.
| Argument / Flag | Description |
|---|---|
<WORKFLOW> | Path to a .fabro workflow file, .toml task config, or workflow name (resolved from .fabro/workflows/ in the project, then ~/.fabro/workflows/). |
--dry-run | Execute with a simulated LLM backend |
--auto-approve | Auto-approve all human gates |
--model <MODEL> | Override default LLM model |
--provider <PROVIDER> | Override default LLM provider |
-v, --verbose | Enable verbose output |
--sandbox <SANDBOX> | Sandbox for agent tools: local, docker, or daytona |
--label <KEY=VALUE> | Attach a label to this run (repeatable) |
--goal <GOAL> | Override the workflow goal (available as {{ goal }} in prompts) |
--goal-file <FILE> | Read the goal from a file instead of inline text |
--no-retro | Skip retro generation after the run |
--preserve-sandbox | Keep the sandbox alive after the run finishes (for debugging) |
-d, --detach | Fork the workflow as a background process and print the run ID. Reconnect later with fabro logs -f. |
fabro preflight
Validate run configuration (sandbox, LLM providers, GitHub tokens) without executing the workflow.
| Argument / Flag | Description |
|---|---|
<WORKFLOW> | Path to a .fabro workflow file, .toml task config, or workflow name. |
--goal <GOAL> | Override the workflow goal (available as {{ goal }} in prompts) |
--goal-file <FILE> | Read the goal from a file instead of inline text |
--model <MODEL> | Override default LLM model |
--provider <PROVIDER> | Override default LLM provider |
-v, --verbose | Enable verbose output |
--sandbox <SANDBOX> | Sandbox for agent tools: local, docker, or daytona |
fabro resume
Resume an interrupted workflow run from its last checkpoint. The run is looked up by ID prefix and uses the configuration persisted at create time — no runtime overrides are accepted.
| Argument / Flag | Description |
|---|---|
<RUN_ID> | Run ID or unambiguous prefix |
-d, --detach | Run in the background and print the run ID |
fabro wait
Block until a workflow run reaches a terminal state and exit with a code reflecting the outcome — analogous to docker wait. Exits 0 on success, 1 on failure or dead.
| Argument / Flag | Description |
|---|---|
<RUN> | Run ID prefix or workflow name (most recent run) |
--timeout <SECONDS> | Maximum time to wait in seconds |
--interval <MS> | Poll interval in milliseconds (default: 1000) |
--json | Output the conclusion as JSON |
fabro create
Allocate a run directory and persist a run spec without starting execution. Pair with fabro start and fabro attach for composable automation.
fabro run.
fabro start
Start a previously created run by spawning the detached engine process.
| Argument | Description |
|---|---|
<RUN> | Run ID prefix or workflow name |
fabro attach
Attach to a running or finished workflow run. Tails progress with live rendering and handles human-in-the-loop interactions (interviews, steering).
| Argument | Description |
|---|---|
<RUN> | Run ID prefix or workflow name |
fabro ps
List workflow runs. By default, shows only active (running) runs — similar to docker ps. Use -a to include completed runs.
| Flag | Description |
|---|---|
-a, --all | Show all runs, not just active ones |
--before <DATE> | Only show runs started before this date (YYYY-MM-DD prefix match) |
--workflow <NAME> | Filter by workflow name (substring match) |
--label <KEY=VALUE> | Filter by label (repeatable, AND semantics) |
--orphans | Include orphan directories (no matching durable run) |
--json | Output as JSON |
-q, --quiet | Only display full run IDs, one per line (no headers or footers). Takes precedence over --json. |
fabro rm
Remove one or more workflow runs by ID or workflow name. Cleans up both the run directory and any associated sandbox.
| Argument / Flag | Description |
|---|---|
<RUN>... | Run IDs or workflow names to remove (required, repeatable) |
-f, --force | Force removal of active runs |
fabro version
Show client and server build identity side-by-side, including version, build metadata, and server uptime.
fabro --version, this queries the server. Unlike fabro system info, this stays focused on version/build identity rather than operational runtime details.
fabro system info
Show server runtime information including version, uptime, and run counts.
fabro system events
Stream run events from the server in real time.
| Flag | Description |
|---|---|
--run-id <ID> | Filter by run ID (repeatable) |
fabro system prune
Delete old workflow runs. Dry-run by default — pass --yes to actually delete.
| Flag | Description |
|---|---|
--before <DATE> | Only prune runs started before this date (YYYY-MM-DD prefix match) |
--older-than <DURATION> | Only prune runs older than this duration (e.g. 24h, 7d). Default when no explicit filters are set: 24h |
--workflow <NAME> | Filter by workflow name (substring match) |
--label <KEY=VALUE> | Filter by label (repeatable, AND semantics) |
--orphans | Include orphan directories (no matching durable run) |
--yes | Actually delete (default is dry-run) |
fabro exec
Run an agentic coding session. The agent operates in the current directory using file, search, and shell tools.
| Argument / Flag | Description | Default |
|---|---|---|
<PROMPT> | Task prompt (required) | — |
--provider <PROVIDER> | LLM provider | Auto-detected from configured API keys (see default models) |
--model <MODEL> | Model name | Per provider (see below) |
--permissions <LEVEL> | Permission level: read-only, read-write, or full | read-write |
--auto-approve | Skip interactive prompts; deny tools outside permission level | — |
--debug | Print LLM request/response debug info to stderr | — |
--verbose | Print full LLM request/response JSON to stderr | — |
--skills-dir <DIR> | Directory containing skill files (overrides default discovery) | — |
--output-format <FORMAT> | Output format: text (human-readable) or json (NDJSON event stream) | text |
read-only allows read tools (read_file, grep, glob, list_dir) and subagent tools; read-write adds write tools (write_file, edit_file, apply_patch); full allows all tools including shell commands. Tools outside the permission level are either interactively prompted (if a TTY is present) or denied (with --auto-approve). See default models by provider.
fabro model list
List available LLM models from the built-in catalog. Running fabro model with no subcommand also lists models.
| Flag | Description |
|---|---|
-p, --provider <PROVIDER> | Filter by provider |
-q, --query <QUERY> | Search for models matching this string (checks ID, display name, and aliases) |
fabro model test
Test model availability by sending a simple prompt to each model and reporting the result.
| Flag | Description |
|---|---|
-p, --provider <PROVIDER> | Filter by provider |
-m, --model <MODEL> | Test a specific model |
--deep | Run a multi-turn tool-use test that validates the full agent loop (tool calls, reasoning round-trips) instead of a single-turn completion |
fabro server start
Start the Fabro server daemon. By default, the server launches as a background process using the resolved [server.listen] setting, and falls back to a Unix socket when [server.listen] is absent. Use --foreground for the previous blocking behavior.
| Flag | Description | Default |
|---|---|---|
--bind <ADDR> | Address to bind: IP or IP:port for TCP, or a path for Unix socket | Resolved [server.listen], falling back to ~/.fabro/fabro.sock when [server.listen] is absent |
--web | Enable the embedded web UI, browser auth routes, and web-only helper endpoints | Enabled |
--no-web | Disable the embedded web UI, browser auth routes, and web-only helper endpoints | Disabled |
--foreground | Run in the foreground instead of daemonizing | — |
--model <MODEL> | Override default LLM model | — |
--provider <PROVIDER> | Override default LLM provider | — |
--sandbox <SANDBOX> | Sandbox for agent tools: local, docker, or daytona | — |
--max-concurrent-runs <N> | Maximum number of concurrent run executions | — |
--config <PATH> | Path to server config file | ~/.fabro/settings.toml |
X-Fabro-Demo: 1 header to get static demo data with auth disabled.
When --no-web is set, the server still exposes the machine API under /api/v1 and /health, but it returns 404 for /, /auth/*, SPA client routes, and the web-only helper endpoints under /api/v1.
Install mode
If~/.fabro/settings.toml does not exist yet, fabro server start enters install mode: it prints an install URL, attempts to open it in your default browser, and serves a web wizard for configuring the server URL, shared object store, LLM providers, and GitHub integration. The server exits cleanly when the wizard finishes; start it again (or let a supervisor restart it) to boot in configured mode. See Running the Fabro Server for the full flow, and fabro install for the headless CLI-only equivalent.
fabro server stop
Stop the running server daemon. Sends SIGTERM and waits for graceful shutdown, escalating to SIGKILL after the timeout.
| Flag | Description | Default |
|---|---|---|
--timeout <SECONDS> | Seconds to wait for graceful shutdown before SIGKILL | 10 |
fabro server restart
Stop the running server and start a fresh one. Passes through the same flags as server start (--bind, --foreground, --no-web, etc.). Works even if no server is currently running.
| Flag | Description | Default |
|---|---|---|
--timeout <SECONDS> | Seconds to wait for graceful shutdown before SIGKILL | 10 |
--foreground | Run in the foreground instead of daemonizing | — |
fabro server start flags are also accepted.
fabro server status
Show whether the server daemon is running, along with PID, bind address, and uptime.
| Flag | Description |
|---|---|
--json | Output as JSON |
fabro sandbox cp
Copy files between a run’s sandbox and the local filesystem. The run must have a persisted sandbox record (Daytona or a preserved local/Docker sandbox).
| Argument / Flag | Description |
|---|---|
<SRC> | Source: <run-id>:<path> for sandbox, or a local path |
<DST> | Destination: <run-id>:<path> for sandbox, or a local path |
-r, --recursive | Recurse into directories |
fabro pr
Manage GitHub pull requests created by workflow runs. The fabro server performs the GitHub calls on your behalf, so GitHub access must be configured on the server — via the default token strategy or a GitHub App — rather than on the client.
fabro pr create
Create a GitHub pull request from a completed workflow run. Uses the run’s persisted run spec, conclusion, and diff.
| Argument / Flag | Description |
|---|---|
<RUN_ID> | Run ID or prefix (required) |
--model <MODEL> | LLM model for generating the PR description |
-f, --force | Create PR even if the run status is not success or partial success |
--force to override the status check.
fabro pr view
Show details of a pull request from a specific run.
| Argument | Description |
|---|---|
<RUN_ID> | Run ID or prefix (required) |
fabro pr merge
Merge a pull request from a specific run.
| Argument / Flag | Description |
|---|---|
<RUN_ID> | Run ID or prefix (required) |
--method <METHOD> | Merge method: squash (default), merge, or rebase |
fabro pr close
Close a pull request from a specific run without merging.
| Argument | Description |
|---|---|
<RUN_ID> | Run ID or prefix (required) |
fabro system df
Show disk usage of Fabro’s data directory, including run logs, worktrees, server logs, and databases.
| Flag | Description |
|---|---|
-v, --verbose | Show per-run breakdown |
fabro graph
Render a workflow graph as SVG. SVG output includes styled defaults (teal node strokes, clean typography, transparent background) and automatic dark mode support via prefers-color-scheme media queries.
| Argument / Flag | Description |
|---|---|
<WORKFLOW> | Path to a .fabro workflow file or .toml run config (required) |
--format <FORMAT> | Output format: svg (default) |
-o, --output <FILE> | Output file path. Defaults to stdout. |
-d, --direction <DIR> | Graph direction: lr or tb. If omitted, uses the Graphviz file’s own rankdir. |
fabro rewind
Rewind a terminal workflow run to an earlier checkpoint. This creates a replacement run at the target checkpoint, archives the source run, and prints the new run ID for fabro resume.
| Argument / Flag | Description |
|---|---|
<RUN_ID> | Run ID or unambiguous prefix (required) |
[TARGET] | Checkpoint to rewind to: node name, node@visit, or @ordinal (1-based). Omit to show the timeline. |
--list | Show the checkpoint timeline instead of rewinding |
--no-push | Skip pushing the replacement run refs to the remote |
| Format | Example | Meaning |
|---|---|---|
node | plan | Most recent visit of the named node |
node@N | plan@2 | The 2nd visit of the named node |
@N | @3 | The 3rd checkpoint in sequence |
succeeded, failed, or dead. Archived sources are rejected until you unarchive them. Rewind is not idempotent; if it creates the replacement run but cannot archive the source, archive the source manually instead of retrying rewind.
See Checkpoints for background on how checkpointing works.
fabro fork
Fork a new run from an existing run’s checkpoint. Unlike fabro rewind, which archives the original run after creating a replacement, fabro fork creates an independent copy and leaves the original run intact.
| Argument / Flag | Description |
|---|---|
<RUN_ID> | Run ID or unambiguous prefix (required) |
[TARGET] | Checkpoint to fork from: node name, node@visit, or @ordinal (1-based). Omit to fork from the latest checkpoint. |
--list | Show the checkpoint timeline instead of forking |
--no-push | Skip pushing new branches to the remote |
fabro rewind. After forking, resume the new run:
fabro rewind, fabro fork, and their --list modes run through the server. The server must be able to access the run’s recorded working directory. Timeline listing reads the metadata branch without rebuilding it; if the metadata branch is missing, the list can be empty.
See Checkpoints — Forking a run for when to use fork vs. rewind.
fabro logs
View the event log of a workflow run. Runs can be referenced by ID prefix or workflow name (uses the most recent run).
| Argument / Flag | Description |
|---|---|
<RUN> | Run ID prefix or workflow name (required) |
-f, --follow | Follow log output in real time |
-p, --pretty | Formatted colored output with rendered assistant messages and tool calls |
--since <TIMESTAMP> | Show logs since a timestamp or relative duration (e.g. 42m, 2h, 2026-01-02T13:00:00Z) |
-n, --tail <N> | Show only the last N lines |
fabro inspect
Show detailed JSON data for a workflow run, including its run spec, start record, conclusion, checkpoint, and sandbox record.
| Argument | Description |
|---|---|
<RUN> | Run ID prefix or workflow name (required) |
fabro workflow list
List all available workflows in the current project. Shows workflows from both the project directory and user-level ~/.fabro/workflows/, grouped by source with descriptions pulled from each workflow’s goal.
fabro workflow create
Scaffold a new workflow in the project’s workflows directory. Creates a workflow.fabro graph file and a workflow.toml run config.
| Argument / Flag | Description |
|---|---|
<NAME> | Name of the workflow (required) |
-g, --goal <GOAL> | Goal description for the workflow |
.fabro/project.toml project config in the current directory or a parent.
fabro validate
Validate a workflow file without executing it. Reports errors and warnings. Accepts both .fabro workflow files and .toml run configs.
| Argument | Description |
|---|---|
<WORKFLOW> | Path to a .fabro workflow file or .toml run config (required) |
fabro parse
Parse a Graphviz file and print its AST as JSON. Useful for debugging workflow definitions.
| Argument | Description |
|---|---|
<WORKFLOW> | Path to the .fabro workflow file (required) |
fabro repo init
Initialize a new Fabro project in the current git repository. Creates a .fabro/project.toml project config and a sample hello workflow.
.fabro/project.toml— project configuration with comments and a link to docs.fabro/workflows/hello/workflow.fabro— a simple greeting workflow.fabro/workflows/hello/workflow.toml— run config for the hello workflow
fabro repo deinit
Remove Fabro from a project by deleting the .fabro/ project directory. Fails with an error if the project is not initialized.
fabro diff
Show the diff from a workflow run. Reads the stored diff for completed runs.
| Argument / Flag | Description |
|---|---|
<RUN> | Run ID or prefix (required) |
--node <NODE> | Show diff for a specific node instead of the full run |
fabro sandbox ssh
SSH into a Daytona sandbox from a completed or in-progress run. Creates temporary SSH credentials and connects directly, or prints the command with --print.
| Argument / Flag | Description |
|---|---|
<RUN> | Run ID or prefix (required) |
--ttl <MINUTES> | SSH credential expiry in minutes (default: 60) |
--print | Print the SSH command instead of connecting |
fabro sandbox preview
Generate a preview URL for a port exposed by a Daytona sandbox. Useful for accessing web servers, dev tools, or APIs running inside the sandbox.
| Argument / Flag | Description |
|---|---|
<RUN> | Run ID or prefix (required) |
<PORT> | Port number to preview (required) |
--signed | Generate a signed URL (self-contained, no headers needed) |
--ttl <SECONDS> | Signed URL expiry in seconds (default: 3600, requires --signed) |
--open | Open the URL in a browser (implies --signed) |
--signed, the command prints the URL, token, and a curl example. See Preview for more details.
fabro doctor
Check environment and integration health. fabro doctor always performs live server-backed diagnostics and keeps only local user-config and legacy .env checks on the CLI side.
| Flag | Description |
|---|---|
-v, --verbose | Show detailed information for each check |
fabro upgrade
For self-managed installs, download and install a newer version of Fabro from GitHub releases. The CLI verifies the download with SHA256 checksums and atomically replaces the binary.
If Fabro was installed via Homebrew, fabro upgrade does not overwrite the Homebrew-managed binary. It prints the matching brew upgrade fabro or brew upgrade fabro-nightly command instead.
| Flag | Description |
|---|---|
--version <VERSION> | Target version (e.g. 0.5.0, v0.5.0, or v0.177.0-alpha.1) for self-managed installs. Defaults to the latest stable release. |
--prerelease | For self-managed installs, select the highest semver across stable and prerelease tags. |
--force | For self-managed installs, upgrade even if already on the target version. |
--dry-run | Preview what would happen without making changes |
fabro upgrade tracks the latest stable release. On self-managed installs, use --version to install an explicitly named pre-release or --prerelease to follow the newest prerelease automatically.
Fabro refuses to downgrade unless you specify an explicit --version. On Homebrew installs, --version, --prerelease, and --force are not supported because Homebrew selects the version/channel. A daily background check notifies you when a new version is available — disable it with upgrade_check = false in settings.toml or the --no-upgrade-check global flag.
fabro artifact list
List artifacts (screenshots, test reports, traces) collected from a workflow run.
| Argument / Flag | Description |
|---|---|
<RUN_ID> | Run ID or unambiguous prefix (required) |
--node <NODE> | Filter to assets from a specific node |
--retry <N> | Filter to assets from a specific retry attempt |
--json | Output as JSON |
fabro artifact cp
Copy artifacts from a workflow run to the local filesystem.
| Argument / Flag | Description |
|---|---|
<SOURCE> | RUN_ID (all assets) or RUN_ID:path (specific file) |
[DEST] | Destination directory (defaults to .) |
--node <NODE> | Filter to assets from a specific node |
--retry <N> | Filter to assets from a specific retry attempt |
--tree | Preserve \{node\}/\{retry\}/ directory structure |
--tree, --node, or --retry to disambiguate.
fabro provider login
Re-authenticate with an LLM provider without re-running the full install wizard. Useful when tokens expire or when switching accounts.
| Flag | Description |
|---|---|
--provider <PROVIDER> | LLM provider to authenticate with (required) |
fabro install
Interactive CLI setup wizard that walks you through configuring API keys and validating your environment. Runs fabro doctor with live probes after setup to validate the configuration.
For most users, the preferred way to set up server mode is to run
fabro server start, which opens a web-based install wizard in the browser (see Running the Fabro Server). fabro install is the headless, CLI-only alternative — useful for remote hosts without a browser, scripted deployments, and CI.| Flag | Description | Default |
|---|---|---|
--web-url <URL> | Web UI base URL for OAuth callback endpoints | http://localhost:3000 |
--non-interactive | Run without prompts; supply inputs via scripted flags | — |
gh CLI) and lets you choose whether to register the app under your personal account or an organization. If the gh CLI is not available, the installer prompts for a GitHub token directly. Use --non-interactive for headless or CI environments where no TTY is available.
fabro install github
Reconfigure just the GitHub integration on an existing install without re-running the full setup wizard.
| Flag | Description |
|---|---|
--strategy <STRATEGY> | GitHub auth strategy: token or app (requires --non-interactive on the parent) |
--owner <OWNER> | GitHub App owner: personal or org:<slug> (app strategy only, requires --non-interactive) |
fabro uninstall
Remove Fabro’s local state, server data, and configuration files. Stops the server if it is running, removes the data directory, cleans up shell PATH entries, and optionally removes the binary.
| Flag | Description |
|---|---|
--yes | Skip confirmation prompt |
fabro secret set
Store or update a server-owned secret on the connected Fabro server. The value can be provided as a positional argument, piped via --value-stdin, or entered interactively when stdin is a TTY.
| Argument / Flag | Description |
|---|---|
<KEY> | Name of the secret (required) |
[VALUE] | Value to store (omit to enter interactively) |
--value-stdin | Read the secret value from stdin |
fabro secret list
List server-owned secrets with their name, type, and last-updated timestamp. Values are never returned after storage.
fabro secret rm
Remove a server-owned secret from the connected Fabro server.
| Argument | Description |
|---|---|
<KEY> | Name of the secret to remove (required) |
fabro dump
Export the contents of a run’s durable state to a directory for debugging and inspection.
| Argument / Flag | Description |
|---|---|
<RUN> | Run ID prefix or workflow name |
-o, --output <DIR> | Output directory (must not exist or be empty) |
fabro completion
Generate shell completion scripts for bash, zsh, fish, elvish, and PowerShell.
| Argument | Description |
|---|---|
<SHELL> | Shell to generate completions for: bash, zsh, fish, elvish, powershell (required) |