Skip to content
Foundry
Esc
↑↓navigate↵open⌘Jpreview
On this page

CLI reference

Commands, flags, and dashboard keys for running and inspecting Marbles.

These commands use the standalone marbles executable. See Installation to set it up in your environment.

A launch uses the bundled Workflows runtime and local persistent stores. roll creates a new run; it does not resume a previous failed run. The dashboard can adopt parked work under the durability rules.

Commands

Command Action
No command or run Open the splash and live dashboard; Enter starts triggers. Piped, start at once.
help, --help, -h Print usage without loading modules.
init [developer | design | product] Create a starter module in .foundry/marbles, without running it or overwriting it. Defaults to Product.
list Load modules and list named work, schedules, and monitors with their keys and cadence. Runs no step body.
roll <name-or-key> [--input <json>] Dispatch one step, workflow, schedule, or monitor now, print its result as JSON, and exit.
status Read every workspace under the state root: foreground process, schedules, recent runs, session count. Needs no running Marbles process and loads no module.
watch <runId> Replay saved output, follow new output, and exit when an agent or workflow run finishes.
sessions List the current workspace’s agent sessions: id, message count, last update, and whether a compaction summary exists. Loads no module.

run starts every trigger and takes no name. marbles run <name> prints a pointer to roll <name> and exits 1.

Invalid commands, arguments, starters, and harness IDs print a usage error to stderr and exit 1 before importing modules or touching state.

run, roll, and list import the discovered modules first; help, init, status, sessions, and watch do not. Keep module scope to declarations: importing the file must not do work. Only commands that run something under a state root (run, roll, and the dashboard after Enter) record the workspace in workspace.json, and never under --dry-run.

Watch a background run

The MCP server returns a runId from both dispatch_workflow and dispatch_agent. Wait for either kind of run with:

marbles watch <runId>

watch replays earlier output, follows the live stream, prints the result and terminal status, and exits. It reads across the workspaces under --state; it needs neither the launching process’s working directory nor --source. It imports no authoring modules and starts no engine. Multiple watchers can follow the same run.

Use the same --state as the owner when it is customized:

marbles watch <runId> --state /path/to/state

Exit codes are 0 for completion, 1 for failure, cancellation, missing output, or a lost owner, and 130 when the watcher is interrupted. Stopping the watcher does not cancel the run. Use the MCP cancel_run tool to cancel work owned by that server.

The output journal includes agent text, workflow stream.write and exec output, and step lifecycle messages. Raw console.log and process stdout remain with the owning process. Completed journals can be replayed after the owner exits. Runs from before this feature, and in-memory --dry-run runs, have no journal to watch.

Choose a roll target

Target Input and execution
Definition name Run the step or workflow with --input, or no input.
Schedule key Use its configured input unless overridden, take its lock, and record schedule history.
Monitor key Poll once; run the handler if the observation changed. A returned locked node launches its target.

Use the keys printed by list. Schedule keys derive from the target and input; monitor keys derive from the source. The first monitor poll treats existing files or the first HTTP response as a change.

Input errors and questions

Input the definition rejects is reported in one line on stderr, with exit code 1: what failed, the fields the definition takes, an --input to start from, and the schedule keys that carry input for it:

marbles: "greet" input: name: Invalid input: expected string, received undefined. greet takes name (text). Pass --input '{"name":"…"}', or roll a schedule key that carries it: greet-88bab6d8.

--input that is not JSON is a usage error naming the flag.

roll has nobody to answer a question. A run that reaches ask.approval or ask.question under roll is cancelled at the ask, the CLI prints marbles: run "<name>" was cancelled: "<title>" is waiting for an answer and exits 1. Everything before the ask ran. Launch such runs from the dashboard instead, or by a schedule or monitor while the dashboard is open.

Flags

Flag Default Meaning
--source <path> ./.foundry/marbles Authoring folder or single module. Missing sources offer setup in the dashboard; other commands use an empty catalog.
--config <path> Same as --source Compatibility alias. A legacy marbles.config.ts is used when the default folder is absent.
--state <dir> ~/.foundry/marbles Root directory for workspace state.
--artifacts <dir> artifacts/ beside the state root Shared artifact store holding declared artifacts and feed entries from every workspace.
--input <json> A schedule’s input, or none Input for roll. Overrides a schedule’s recorded input.
--harness <id> Every detected harness Keep only claude-code, codex, or pi. Repeat to keep more than one.
--dry-run Off Echo agent turns, git mutations, and sandbox commands instead of running them, and write no state. See safety and limits.

Agents can select any retained harness through provider. Without one, Claude Code takes precedence over Codex. Dry execution echoes allowed harnesses even when neither CLI is installed.

--dry is an alias for --dry-run. A later occurrence of a value flag wins.

The dashboard

With a terminal on both stdin and stdout, marbles opens the dashboard. Its Dashboard tab shows Triggers, Marbles, and Runs, including live steps and saved run history. The Feed tab lists reports and questions from every workspace, newest first. Each tab shows its count, capped at 99+.

Key Action
Shift+D / Shift+F Show the Dashboard or Feed tab
1 / 2 / 3, Tab, m Focus Triggers, Marbles, or Runs
↑ / ↓, Enter, Esc Select rows, open details, return
← / →, Space Collapse or expand run branches; change inspector tab
l in Marbles Launch the selected step or workflow; a schema opens a form (Tab moves, Ctrl+Enter submits, Esc cancels)
f in Marbles Filter runs to this schedule, monitor, workflow, or step; x clears
s / p / k on a run Steer the running agent, pause or resume the step, cancel the run. Each shows only when the run’s status allows it: steer and pause while running, resume while paused, cancel until the run settles
a / e, b Jump to the active step or failure; return from step details to the run
/ Search the focused marble or run list
f in logs Toggle following new log lines
w / x in the Feed Cycle the workspace filter (all workspaces, this workspace, then any other that has posted); show every workspace
1 through 9 / a in the Feed Answer an open question by choice, or type a free-text answer. An approval takes an optional note after the choice
h Return to the dashboard
? Keyboard help
q / Ctrl+C Confirm quit; Ctrl+C again quits

Pause, resume, and steer

Pause parks the selected step and everything under it. Resume, with or without a prompt, replays the parked bodies from the top; a prompt leads the first turn of the agent session each step had open. Steer hands a prompt to the agent turn running in the step; the turn stops, the prompt becomes the next message, and the step’s generate resolves with the steered reply. The run inspector’s Stream tab shows [steer] and [resume] markers inline.

Quit and restart

Quitting stops triggers and cancels queued and running runs. A run parked on a question or a pause is kept, with its question open, and is adopted by the next dashboard that starts with the same state root and still registers the step. Under --dry-run nothing is written, so parked runs are cancelled too. Custom code in a step body must honour the context’s signal to stop external work; cancellation cannot undo side effects.

Headless operation

When stdin or stdout is not a terminal, marbles and marbles run start at once and print plain text. SIGINT and SIGTERM stop new triggers and let active runs finish. status behaves the same way: a terminal opens a view that q closes; piped output is plain text.

marbles --harness pi selects Pi when its CLI is installed; setup also offers Pi. Host model calls use ai-sdk-provider-pi 0.1.0, which embeds Pi 0.52.12, with read-only tools by default. Configure its credentials through Pi’s auth storage or provider API-key environment variables. Sandbox sessions install the pinned standalone Pi binary for the guest’s architecture, verify its SHA-256, and use Marbles’ permission-controlled coding tools. Supply a session API key or sign in with Pi on the host for the selected provider/model; the host resolves the current key, and only that key enters the guest environment. Refresh credentials remain on the host.

Was this page helpful?