mirror of
https://github.com/fabro-sh/fabro.git
synced 2026-08-28 05:27:41 +00:00
979 lines
32 KiB
Text
979 lines
32 KiB
Text
---
|
|
title: "CLI Reference"
|
|
description: "Fabro command-line interface reference"
|
|
---
|
|
|
|
## 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 |
|
|
|
|
Connection-target flags like `--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:
|
|
|
|
```toml title="settings.toml"
|
|
_version = 1
|
|
|
|
[cli.exec.model]
|
|
provider = "anthropic"
|
|
name = "claude-opus-4-6"
|
|
|
|
[cli.exec.agent]
|
|
permissions = "read-write"
|
|
|
|
[cli.output]
|
|
format = "text"
|
|
|
|
[run.model]
|
|
name = "claude-sonnet-4-5"
|
|
|
|
[cli.target]
|
|
type = "http"
|
|
url = "https://fabro.example.com:3000/api/v1"
|
|
```
|
|
|
|
`[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.
|
|
|
|
CLI flags always override `settings.toml` values, which override hardcoded defaults.
|
|
|
|
---
|
|
|
|
## `fabro settings`
|
|
|
|
Print the merged resolved configuration as YAML.
|
|
|
|
```bash
|
|
fabro settings
|
|
fabro settings demo
|
|
fabro settings run.toml
|
|
```
|
|
|
|
With no argument, Fabro prints the merged ambient defaults from `~/.fabro/settings.toml` and the nearest `.fabro/project.toml`.
|
|
|
|
When you pass a workflow name or path:
|
|
|
|
- If it resolves to a `.toml` run config, Fabro overlays that run config on top of the ambient defaults before printing.
|
|
- If it resolves to a `.fabro` graph 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.
|
|
|
|
```bash
|
|
fabro run <WORKFLOW>
|
|
fabro run run.toml
|
|
```
|
|
|
|
| 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.
|
|
|
|
```bash
|
|
fabro preflight <WORKFLOW>
|
|
fabro preflight run.toml
|
|
```
|
|
|
|
| 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.
|
|
|
|
```bash
|
|
fabro resume <RUN_ID>
|
|
fabro resume <RUN_ID> --detach
|
|
```
|
|
|
|
| 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.
|
|
|
|
```bash
|
|
fabro wait <RUN>
|
|
fabro wait abc123 --timeout 300
|
|
fabro wait my-workflow --json
|
|
```
|
|
|
|
| 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.
|
|
|
|
```bash
|
|
fabro create <WORKFLOW> --goal "Implement feature X"
|
|
```
|
|
|
|
Accepts the same arguments and flags as [`fabro run`](#fabro-run).
|
|
|
|
## `fabro start`
|
|
|
|
Start a previously created run by spawning the detached engine process.
|
|
|
|
```bash
|
|
fabro start <RUN>
|
|
```
|
|
|
|
| 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).
|
|
|
|
```bash
|
|
fabro attach <RUN>
|
|
```
|
|
|
|
| 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.
|
|
|
|
```bash
|
|
fabro ps # active runs only
|
|
fabro ps -a # all runs including completed
|
|
fabro ps --workflow deploy --label env=prod
|
|
fabro ps --json
|
|
fabro ps -q # run IDs only, one per line
|
|
fabro ps -qa # all run IDs
|
|
```
|
|
|
|
The table shows run ID, status, workflow name, goal, and timing.
|
|
|
|
| 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.
|
|
|
|
```bash
|
|
fabro rm <RUN>...
|
|
fabro rm abc123
|
|
fabro rm my-workflow --force
|
|
```
|
|
|
|
| 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.
|
|
|
|
```bash
|
|
fabro version
|
|
fabro version --server http://127.0.0.1:4110
|
|
fabro version --json
|
|
```
|
|
|
|
Use this when you want to check CLI/server parity. Unlike `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.
|
|
|
|
```bash
|
|
fabro system info
|
|
fabro system info --json
|
|
```
|
|
|
|
## `fabro system events`
|
|
|
|
Stream run events from the server in real time.
|
|
|
|
```bash
|
|
fabro system events
|
|
fabro system events --run-id abc123
|
|
```
|
|
|
|
| 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.
|
|
|
|
```bash
|
|
fabro system prune --before 2026-01-01
|
|
fabro system prune --older-than 7d --yes
|
|
fabro system prune --orphans --yes
|
|
```
|
|
|
|
| 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.
|
|
|
|
```bash
|
|
fabro exec "Add input validation to the signup form"
|
|
fabro exec "Fix the failing test" --provider openai --model gpt-5.2-codex
|
|
fabro exec "Refactor the auth module" --permissions full --auto-approve
|
|
```
|
|
|
|
| Argument / Flag | Description | Default |
|
|
|---|---|---|
|
|
| `<PROMPT>` | Task prompt (required) | — |
|
|
| `--provider <PROVIDER>` | LLM provider | Auto-detected from configured API keys (see [default models](/core-concepts/models#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` |
|
|
|
|
Permission levels control which tools are auto-approved: `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](/core-concepts/models#default-models).
|
|
|
|
---
|
|
|
|
## `fabro model list`
|
|
|
|
List available LLM models from the built-in catalog. Running `fabro model` with no subcommand also lists models.
|
|
|
|
```bash
|
|
fabro model list
|
|
fabro model list -p anthropic
|
|
fabro model list -q sonnet
|
|
fabro model list --server http://localhost:3000/api/v1
|
|
```
|
|
|
|
| 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.
|
|
|
|
```bash
|
|
fabro model test
|
|
fabro model test -p anthropic
|
|
fabro model test -m claude-sonnet-4-5
|
|
```
|
|
|
|
| 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.
|
|
|
|
```bash
|
|
fabro server start # background daemon using server.listen or the default Unix socket
|
|
fabro server start --bind 127.0.0.1 # TCP on 32276, or random port if 32276 is busy
|
|
fabro server start --bind 127.0.0.1:8080 # TCP on a specific port
|
|
fabro server start --no-web # API and /health only
|
|
fabro server start --foreground # blocking foreground mode
|
|
fabro server start --sandbox daytona --max-concurrent-runs 4
|
|
```
|
|
|
|
| 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` |
|
|
|
|
Demo mode is per-request: send the `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`.
|
|
|
|
## `fabro server stop`
|
|
|
|
Stop the running server daemon. Sends SIGTERM and waits for graceful shutdown, escalating to SIGKILL after the timeout.
|
|
|
|
```bash
|
|
fabro server stop
|
|
fabro server stop --timeout 30
|
|
```
|
|
|
|
| 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.
|
|
|
|
```bash
|
|
fabro server restart
|
|
fabro server restart --foreground
|
|
```
|
|
|
|
| Flag | Description | Default |
|
|
|---|---|---|
|
|
| `--timeout <SECONDS>` | Seconds to wait for graceful shutdown before SIGKILL | `10` |
|
|
| `--foreground` | Run in the foreground instead of daemonizing | — |
|
|
|
|
All `fabro server start` flags are also accepted.
|
|
|
|
## `fabro server status`
|
|
|
|
Show whether the server daemon is running, along with PID, bind address, and uptime.
|
|
|
|
```bash
|
|
fabro server status
|
|
fabro server status --json
|
|
```
|
|
|
|
| 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).
|
|
|
|
```bash
|
|
fabro sandbox cp <run-id>:/path/in/sandbox ./local-dir # download
|
|
fabro sandbox cp ./local-file <run-id>:/path/in/sandbox # upload
|
|
fabro sandbox cp -r <run-id>:/output ./results # recursive download
|
|
```
|
|
|
|
| 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 |
|
|
|
|
Run IDs support prefix matching — you can use the first few characters instead of the full ID.
|
|
|
|
## `fabro pr`
|
|
|
|
Manage GitHub pull requests created by workflow runs. Requires GitHub access to be configured via the default `token` strategy or a [GitHub App](/integrations/github).
|
|
|
|
### `fabro pr create`
|
|
|
|
Create a GitHub pull request from a completed workflow run. Uses the run's persisted run record, conclusion, and diff.
|
|
|
|
```bash
|
|
fabro pr create <run-id>
|
|
fabro pr create <run-id> --model claude-opus-4-6
|
|
fabro pr create <run-id> --force
|
|
```
|
|
|
|
| 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 |
|
|
|
|
The run must have completed successfully (or with partial success) and have a stored diff with changes. Use `--force` to override the status check.
|
|
|
|
### `fabro pr list`
|
|
|
|
List all pull requests created by workflow runs. Shows PR number, title, status, and the associated run ID.
|
|
|
|
```bash
|
|
fabro pr list
|
|
fabro pr list --all
|
|
```
|
|
|
|
| Flag | Description |
|
|
|---|---|
|
|
| `--all` | Include closed and merged PRs (default: open only) |
|
|
|
|
### `fabro pr view`
|
|
|
|
Show details of a pull request from a specific run.
|
|
|
|
```bash
|
|
fabro pr view <run-id>
|
|
```
|
|
|
|
| Argument | Description |
|
|
|---|---|
|
|
| `<RUN_ID>` | Run ID or prefix (required) |
|
|
|
|
### `fabro pr merge`
|
|
|
|
Merge a pull request from a specific run.
|
|
|
|
```bash
|
|
fabro pr merge <run-id>
|
|
fabro pr merge <run-id> --method rebase
|
|
```
|
|
|
|
| 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.
|
|
|
|
```bash
|
|
fabro pr close <run-id>
|
|
```
|
|
|
|
| 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.
|
|
|
|
```bash
|
|
fabro system df
|
|
fabro system df -v
|
|
```
|
|
|
|
| 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.
|
|
|
|
```bash
|
|
fabro graph workflow.fabro
|
|
fabro graph workflow.fabro -o diagram.svg
|
|
fabro graph run.toml
|
|
```
|
|
|
|
| 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 workflow run to an earlier checkpoint. This resets both the run branch and metadata branch refs so that `fabro resume` continues from the target checkpoint.
|
|
|
|
```bash
|
|
fabro rewind <RUN_ID> [TARGET]
|
|
fabro rewind <RUN_ID> --list
|
|
```
|
|
|
|
| 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 force-pushing rewound refs to the remote |
|
|
|
|
Target formats:
|
|
|
|
| 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 |
|
|
|
|
After rewinding, resume from the earlier point:
|
|
|
|
```bash
|
|
fabro resume <RUN_ID>
|
|
```
|
|
|
|
See [Checkpoints](/execution/checkpoints#rewinding-to-an-earlier-checkpoint) for background on how checkpointing works.
|
|
|
|
## `fabro fork`
|
|
|
|
Fork a new run from an existing run's checkpoint. Unlike `fabro rewind`, which resets the original run in place, `fabro fork` creates an independent copy — the original run stays intact.
|
|
|
|
```bash
|
|
fabro fork <RUN_ID> [TARGET]
|
|
fabro fork <RUN_ID> --list
|
|
```
|
|
|
|
| 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 |
|
|
|
|
Target formats are the same as [`fabro rewind`](#fabro-rewind). After forking, resume the new run:
|
|
|
|
```bash
|
|
fabro resume <NEW_RUN_ID>
|
|
```
|
|
|
|
See [Checkpoints — Forking a run](/execution/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).
|
|
|
|
```bash
|
|
fabro logs my-workflow
|
|
fabro logs abc123 --pretty
|
|
fabro logs -f my-workflow -p
|
|
```
|
|
|
|
| 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 record, start record, conclusion, checkpoint, and sandbox record.
|
|
|
|
```bash
|
|
fabro inspect <RUN>
|
|
fabro inspect abc123
|
|
```
|
|
|
|
| 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.
|
|
|
|
```bash
|
|
fabro workflow list
|
|
```
|
|
|
|
## `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.
|
|
|
|
```bash
|
|
fabro workflow create my-workflow
|
|
fabro workflow create my-workflow --goal "Run the CI pipeline"
|
|
```
|
|
|
|
| Argument / Flag | Description |
|
|
|---|---|
|
|
| `<NAME>` | Name of the workflow (required) |
|
|
| `-g, --goal <GOAL>` | Goal description for the workflow |
|
|
|
|
Requires a `.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.
|
|
|
|
```bash
|
|
fabro validate workflow.fabro
|
|
fabro validate run.toml
|
|
```
|
|
|
|
| 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.
|
|
|
|
```bash
|
|
fabro parse workflow.fabro
|
|
```
|
|
|
|
| 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.
|
|
|
|
```bash
|
|
fabro repo init
|
|
```
|
|
|
|
The command must be run inside a git repository. It creates:
|
|
- `.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
|
|
|
|
After creating files, it checks whether GitHub access is available for the repository. In GitHub App mode, if the app is not installed and the repository owner differs from the app owner, it warns that the app may need to be [made public](/integrations/github#github-app-is-private-but-this-repo-belongs-to-a-different-owner) first.
|
|
|
|
## `fabro repo deinit`
|
|
|
|
Remove Fabro from a project by deleting the `.fabro/` project directory. Fails with an error if the project is not initialized.
|
|
|
|
```bash
|
|
fabro repo deinit
|
|
```
|
|
|
|
## `fabro diff`
|
|
|
|
Show the diff from a workflow run. Reads the stored diff for completed runs.
|
|
|
|
```bash
|
|
fabro diff <run-id>
|
|
fabro diff <run-id> --node work
|
|
```
|
|
|
|
| Argument / Flag | Description |
|
|
|---|---|
|
|
| `<RUN>` | Run ID or prefix (required) |
|
|
| `--node <NODE>` | Show diff for a specific node instead of the full run |
|
|
|
|
Output is colorized when writing to a terminal.
|
|
|
|
## `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`.
|
|
|
|
```bash
|
|
fabro sandbox ssh <run-id>
|
|
fabro sandbox ssh <run-id> --print
|
|
fabro sandbox ssh <run-id> --ttl 120
|
|
```
|
|
|
|
| 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 |
|
|
|
|
See [SSH Access](/human-tools/ssh-access) for more details on SSH workflows.
|
|
|
|
## `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.
|
|
|
|
```bash
|
|
fabro sandbox preview <run-id> <port>
|
|
fabro sandbox preview <run-id> 3000 --signed
|
|
fabro sandbox preview <run-id> 3000 --open
|
|
```
|
|
|
|
| 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`) |
|
|
|
|
Without `--signed`, the command prints the URL, token, and a `curl` example. See [Preview](/human-tools/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.
|
|
|
|
```bash
|
|
fabro doctor
|
|
fabro doctor -v
|
|
fabro doctor --server https://fabro.example.com:3000/api/v1
|
|
```
|
|
|
|
| Flag | Description |
|
|
|---|---|
|
|
| `-v, --verbose` | Show detailed information for each check |
|
|
|
|
## `fabro upgrade`
|
|
|
|
Download and install a newer version of Fabro from GitHub releases. Verifies the download with SHA256 checksums and atomically replaces the binary.
|
|
|
|
```bash
|
|
fabro upgrade
|
|
fabro upgrade --dry-run
|
|
fabro upgrade --version 0.6.0
|
|
fabro upgrade --version v0.177.0-alpha.1
|
|
```
|
|
|
|
| Flag | Description |
|
|
|---|---|
|
|
| `--version <VERSION>` | Target version (e.g. `0.5.0`, `v0.5.0`, or `v0.177.0-alpha.1`). Defaults to the latest stable release. |
|
|
| `--force` | Upgrade even if already on the target version |
|
|
| `--dry-run` | Preview what would happen without making changes |
|
|
|
|
Plain `fabro upgrade` tracks the latest stable release. Use `--version` to install an explicitly named pre-release.
|
|
|
|
Fabro refuses to downgrade unless you specify an explicit `--version`. A daily background check notifies you when a new version is available — disable it with `upgrade_check = false` in [`settings.toml`](/reference/user-configuration#upgrade_check) or the `--no-upgrade-check` global flag.
|
|
|
|
## `fabro artifact list`
|
|
|
|
List artifacts (screenshots, test reports, traces) collected from a workflow run.
|
|
|
|
```bash
|
|
fabro artifact list <RUN_ID>
|
|
fabro artifact list <RUN_ID> --node verify --json
|
|
fabro artifact list <RUN_ID> --node verify --retry 2
|
|
```
|
|
|
|
| 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.
|
|
|
|
```bash
|
|
fabro artifact cp <RUN_ID> ./output # all assets, flat
|
|
fabro artifact cp <RUN_ID> ./output --tree # preserve directory structure
|
|
fabro artifact cp <RUN_ID>:report.html ./output # specific file
|
|
fabro artifact cp <RUN_ID>:report.html ./output --node verify --retry 2
|
|
```
|
|
|
|
| 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 |
|
|
|
|
When copying all assets in flat mode, filenames must be unique across nodes and retries. Use `--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.
|
|
|
|
```bash
|
|
fabro provider login --provider openai
|
|
fabro provider login --provider anthropic
|
|
```
|
|
|
|
| Flag | Description |
|
|
|---|---|
|
|
| `--provider <PROVIDER>` | LLM provider to authenticate with (required) |
|
|
|
|
For OpenAI, this offers a device code flow — you open a URL in your browser, enter a one-time code, and Fabro completes the auth handshake automatically. If you decline, it falls back to manual API key entry. All other providers prompt for an API key with validation. Credentials are saved to the connected Fabro server's vault as typed credentials.
|
|
|
|
## `fabro install`
|
|
|
|
Interactive 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.
|
|
|
|
```bash
|
|
fabro install
|
|
fabro install --web-url https://fabro.example.com
|
|
fabro install --non-interactive --llm-provider anthropic --llm-api-key-env ANTHROPIC_API_KEY --github-strategy token
|
|
```
|
|
|
|
| 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 | — |
|
|
|
|
When configuring a GitHub App, the wizard detects your GitHub organizations (via the `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.
|
|
|
|
```bash
|
|
fabro install github
|
|
fabro install github --strategy token
|
|
fabro install github --strategy app --owner org:my-org
|
|
```
|
|
|
|
| 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.
|
|
|
|
```bash
|
|
fabro uninstall
|
|
fabro uninstall --yes
|
|
```
|
|
|
|
| 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.
|
|
|
|
```bash
|
|
fabro secret set ANTHROPIC_API_KEY sk-ant-...
|
|
echo "sk-ant-..." | fabro secret set ANTHROPIC_API_KEY --value-stdin
|
|
fabro secret set ANTHROPIC_API_KEY # interactive prompt
|
|
```
|
|
|
|
| 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.
|
|
|
|
```bash
|
|
fabro secret list
|
|
fabro secret list --json
|
|
```
|
|
|
|
## `fabro secret rm`
|
|
|
|
Remove a server-owned secret from the connected Fabro server.
|
|
|
|
```bash
|
|
fabro secret rm ANTHROPIC_API_KEY
|
|
```
|
|
|
|
| Argument | Description |
|
|
|---|---|
|
|
| `<KEY>` | Name of the secret to remove (required) |
|
|
|
|
---
|
|
|
|
## `fabro store dump`
|
|
|
|
Export the contents of a run's store-backed state to a directory for debugging and inspection.
|
|
|
|
```bash
|
|
fabro store dump <RUN>
|
|
fabro store dump abc123 -o ./debug-output
|
|
```
|
|
|
|
| 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.
|
|
|
|
```bash
|
|
fabro completion bash
|
|
fabro completion zsh
|
|
fabro completion fish
|
|
```
|
|
|
|
| Argument | Description |
|
|
|---|---|
|
|
| `<SHELL>` | Shell to generate completions for: `bash`, `zsh`, `fish`, `elvish`, `powershell` (required) |
|
|
|
|
See [Shell Completions](/reference/shell-completions) for installation instructions for each shell.
|
|
|
|
---
|
|
|
|
## `fabro docs`
|
|
|
|
Open the Fabro documentation website in your default browser.
|
|
|
|
```bash
|
|
fabro docs
|
|
```
|
|
|
|
## `fabro discord`
|
|
|
|
Open the Fabro Discord community invite in your default browser.
|
|
|
|
```bash
|
|
fabro discord
|
|
```
|