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 chatSubcommands
Run the agent
Send a one-shot prompt (non-interactive)
Start an interactive session (the Command Deck)
Work in judged rounds until a verifier says the goal is met
Reopen a previous session exactly where it stood
Find, watch, and stop runs that outlived their terminal
Steer every live non-interactive session on this machine at once
Analyze this workspace: domain taxonomy and code graph
Run many at once
Fan tasks out to a fleet of worker agents in one tree
Watch CI for a branch or PR and fix it until green
Drive the perpetual delivery loop: plan, cycle, audit, watch
arena-bench adapter, invoked by the benchmark runner
Ask about this workspace
Find code — semantic and structural search over the workspace
Inspect the storage map — layers, namespaces, relations
List every tool available to the agent this session
List or convert this workspace's custom slash commands
Steer what the agent knows
Turn markdown you already wrote into checkable steering
Review, publish, and explain context records
Review what the adaptive-context loop wants to keep
Inspect and promote the project's memories
Run a skill as a scoped one-shot (stella skill run <slug>)
What it cost, what happened
Cost, tokens, and resolve rate per provider and model
What the work cost, and whether anyone called it good
Open the Observatory, a local telemetry dashboard
Show the exact context a past model call was sent
Pass calibration: false-positive rate vs CI and reverts
Cross-project telemetry hub (~/.stella/usage.db)
A/B one policy knob over two loop-bench result files
Curate a redacted training dataset from workspace receipts
Set up
Manage BYOK provider keys in ~/.stella/credentials.toml
List configured providers and available models
Manage MCP servers: search, install, list, telemetry
Install, list, and remove plugins
Show current configuration
Move settings.json to stella.toml
Check the local state stella owns, and report each verdict
Print a shell completion script for stella to stdout
Cloud account registration (stub)
Inspect or flush the managed enterprise telemetry spool
Print the version and exit
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
--plainUse 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
--accessibleRun 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-animFreeze all deck animation to a static frame, for CI and screen recordings.
Env STELLA_NO_ANIM / NO_COLOR.
Default off
--mouseCapture 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
--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-modeShow 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
--minimalRun 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
--foregroundOwn this terminal instead of surviving it. Env STELLA_FOREGROUND. See
stella daemon.
Default supervised
--detachStart 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 anthropicUse 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 0600A 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).
textInteractive, human-readable render. The default.
jsonOne final JSON object emitted at the end of the run. Headless.
stream-jsonOne JSON line per AgentEvent as it happens. Headless streaming.
--spend-limit modes
Omit --spend-limit. Spend is tracked for the cost summary but never blocks anything.
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 LASTvertex 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:
0Success.
1An error occurred — a missing credential, a run stopped by a budget cap, a failed goal, a doctor check that did not pass.
128 + signalThe 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" ;;
esacThis makes stella safe to use in scripts and CI pipelines. Check $? (or rely on set -e) to react to failures.