Commands

Every stella subcommand, the default chat behavior, global flags, and exit codes.

The stella binary is a fast, BYOK (bring-your-own-key), model-agnostic terminal coding agent. Every feature is available through a subcommand.

Running stella with no subcommand opens the Command Deck, a tabbed terminal UI. This is the same as running stella chat. Pass --accessible (or set STELLA_ACCESSIBLE=1) to run that same deck so a screen reader can read it. Pass --plain (or set STELLA_PLAIN=1) for a plain line-based REPL instead. The deck also steps aside automatically when stdin or stdout is not a terminal.

# These two invocations are identical
stella
stella chat

Subcommands

Run the agent

Run many at once

Ask about this workspace

Steer what the agent knows

What it cost, what happened

Set up

stella arena is a benchmark-harness adapter for measuring stella, not for doing work with it. stella telemetry operates the managed enterprise spool and is disabled without a signed org-managed enrollment.

Global flags

The following flags apply to every command. Most have a matching environment variable, so you can set one once for a shell session or in your CI configuration. The exception is --api-key, which has no environment variable on purpose. Use credentials.toml or a provider key environment variable such as ANTHROPIC_API_KEY instead.

Every flag below works in either position: stella --spend-limit 5 run "…" and stella run "…" --spend-limit 5 do the same thing. No subcommand reuses these flag names for something else.

--model <provider/model_id>

Pin the worker model — zai/glm-5.2, anthropic/claude-fable-5, openai/gpt-5.5, local/llama3.3. Env STELLA_MODEL.

Default auto-detected

--api-key <key>

The highest-priority credential. Requires an explicit --model provider/…, since a bare key doesn't say which provider it's for. No env var.

--base-url <url>

Required with --model local/<model> to point at a local OpenAI-compatible server; an optional proxy override for any other provider. Env STELLA_BASE_URL.

Default provider default

--upstream-pin <vendor>

Pin a gateway to these upstreams, in order, and refuse any fallback. Repeatable or comma-separated. Does nothing on a direct endpoint. Env STELLA_UPSTREAM_PIN. See below.

Default gateway's own choice

--allow-dir <path>

An extra directory a write tool may touch, outside the workspace root. Repeatable or comma-separated. A relative path resolves against the workspace root, so it means the same directory no matter where the run was launched from. It adds to stella.toml's [workspace] allowed_dirs list for one run rather than replacing it, so adding one directory never removes the rest. Env STELLA_ALLOW_DIR.

Default the workspace root only

--spend-limit <usd>

A hard USD spend cap for the whole run or session. Must be a positive, finite number. Env STELLA_SPEND_LIMIT.

Default none (observed)

--turn-timeout <secs>

Wall-clock seconds one turn may spend before it wraps up. This is the time version of --spend-limit, for callers working under a deadline. Advisory in interactive sessions. Env STELLA_TURN_TIMEOUT.

Default unbounded

--max-output-tokens <n>

Cap output tokens per step below what the model can write, to spend less. This is clamped to the real ceiling rather than sent as written, and wins over [models.output_caps] and per-agent params.max_tokens. Env STELLA_MAX_OUTPUT_TOKENS.

Default the model's own ceiling

--plain

Use the plain line-based REPL for chat instead of the Command Deck. Also auto-selected on a non-TTY. Env STELLA_PLAIN=1.

Default off

--accessible

Run the Command Deck so a screen reader can read it: inline on your own screen, completed messages sent to scrollback, single-column panels, labelled rows instead of tables. Env STELLA_ACCESSIBLE=1.

Default off

--no-anim

Freeze all deck animation to a static frame, for CI and screen recordings. Env STELLA_NO_ANIM / NO_COLOR.

Default off

--mouse

Capture the mouse in interactive mode: click a tab to switch to it, wheel-scroll the transcript. This costs the terminal's own text selection (shift+drag still selects), which is why it is off by default. Env STELLA_MOUSE=1.

Default off

-v / --verbose

Diagnostics: -v info, -vv debug, -vvv trace. See below.

Default warn

--log-level <spec>

A per-module diagnostic filter — warn,stella_store=debug. Env STELLA_LOG; the flag wins over both it and -v.

Default warn

--plan-mode

Show the plan and wait for approval before anything runs, whatever its size. Needs an interactive terminal, since there is nobody to ask in a headless run. Scope review already interrupts on its own for a large plan.

Default off

--minimal

Run this session on the minimal base system prompt: a bare tool list in place of the built-in persona, so the instructions the model follows come from your own prompt settings — agents.default.prompt (which appends after the minimal base), workspace memories, rules, and SessionStart hook context. Durable spelling: [agents] minimal_prompt = "on" in stella.toml. Env STELLA_MINIMAL. The flag forces the mode on for one run only; it can never turn a configured mode off.

Default off

--tools <spec>

Turn tools off for this run only: --tools '*:off,task_list:on,get_state:on' is a read-only run. Uses the same format as the settings tools table. It can only narrow what is allowed — it never switches on what a policy turned off. See below.

Default settings

--log-file <path>

Write diagnostics as JSONL to a file, created with permissions 0600, at info level by default. An unwritable path is reported and the run continues.

Default none

--foreground

Own this terminal instead of surviving it. Env STELLA_FOREGROUND. See stella daemon.

Default supervised

--detach

Start the run in the background and return to the shell right away. --foreground wins if both are given. Env STELLA_DETACH. See stella daemon.

Default off

Prefer an environment variable or credentials.toml for anything long-lived. A key passed with --api-key shows up in your shell history and in ps output.

--upstream-pin: holding the vendor fixed

Only a gateway routes to another vendor's hardware, so this applies to OpenRouter, where it sets provider.order and allow_fallbacks: false. It does nothing on a direct endpoint.

stella run "…" --model openrouter/anthropic/claude-fable-5 \
  --upstream-pin z-ai --upstream-pin anthropic

Use it when two runs must be comparable. A gateway otherwise picks per app identity and may serve the same model from a different vendor between runs, which quietly changes the one thing a head-to-head comparison is supposed to hold fixed. It's a flag rather than a settings-only option because a measured trial runs with settings isolation (STELLA_NO_SETTINGS), where a flag is the only way to reach it. That's also why --base-url is a flag.

--tools: narrowing for one run

The value is a comma-separated list of name:on / name:off, where a name is a tool, a group, or *. It uses the same format as the settings tools table, so you can try a policy before writing it to a file.

stella run "triage the board" --tools '*:off,task_list:on,get_state:on,list_state:on'
stella run "ship the fix"     --tools 'task_assign:off'

This flag can only take capability away, never add it: turning something off is always allowed, and turning something on never overrides a deny from an org or project policy.

Diagnostics: -v, --log-level, --log-file

The diagnostic output explains why stella behaved the way it did. This is different from what the agent did (the event stream) and what it cost (the receipts). Diagnostic records carry a stable code and typed fields, and never include prompts, paths, or model output.

stella run "…" -vv                                   # debug everywhere
stella run "…" --log-level 'warn,stella_model=trace' # quiet except where you are looking
stella run "…" --log-file ./run.jsonl                # JSONL to a file, created 0600

A target is a Rust module path, so library modules are stella_store, stella_model, and so on, and the binary's own records are under stella (hyphens work too). The longest match wins. An unrecognized clause is reported and skipped rather than treated as fatal. Levels are off, error, warn, info, debug, trace.

You don't need a flag to catch an unplanned crash: stella writes .stella/private/crash-*.jsonl on a panic or a failed run, and stella doctor --last-failure prints the newest one.

--output-format (a flag of run and fleet, not a global)

--output-format <text|json|stream-json> (env STELLA_OUTPUT_FORMAT) is not in the table above on purpose. It's a promise about what reaches stdout, and only the commands that keep that promise offer it: stella run and stella fleet. As a subcommand flag, it goes after the subcommand — stella run "…" --output-format json — and using it anywhere else is a parse error, not a flag that's silently ignored. stella arena always emits stream-json, since the benchmark runner is its only reader. The interactive chat, goal, and monitor modes always render text, and query commands with a machine-readable shape declare their own flag (stella stats --format json, stella inspect --format json, stella memory list --format json).

text

Interactive, human-readable render. The default.

json

One final JSON object emitted at the end of the run. Headless.

stream-json

One JSON line per AgentEvent as it happens. Headless streaming.

--spend-limit modes

Observed

Omit --spend-limit. Spend is tracked for the cost summary but never blocks anything.

Enforced

Pass --spend-limit <usd>. This is a hard cap: work stops cleanly, never mid-tool, once spend exceeds it.

Token usage, cost, and per-step metering are recorded in a local SQLite store on your disk (<workspace>/.stella/private/store.db). Nothing is sent anywhere. See stella stats.

Model selection

If you do not pass --model, stella auto-detects a provider by picking the first one with a usable credential, in this order:

zai, anthropic, openai, xai, deepseek, gemini, openrouter, then vertex, and bedrock LAST

vertex and bedrock are checked last so that generic AWS or Google credentials present for other reasons never get picked by accident. To be explicit, pin a model with --model provider/model_id.

Exit codes

Every command follows standard shell conventions:

0

Success.

1

An error occurred — a missing credential, a run stopped by a budget cap, a failed goal, a doctor check that did not pass.

128 + signal

The run was interrupted by a signal rather than failing on its own. SIGINT (Ctrl-C) exits 130, SIGTERM exits 143.

The signal range exists so a script wrapping stella run can tell "the user stopped this" from "this failed" — different outcomes that usually need different handling:

stella run "Fix the failing tests"
case $? in
  0)   echo "done" ;;
  130) echo "interrupted — nothing to report" ;;
  *)   echo "run failed" ;;
esac

This makes stella safe to use in scripts and CI pipelines. Check $? (or rely on set -e) to react to failures.