▞ jazzdocsblogpersonas
github

CLI Reference

This page helps you find the exact command and flag you need.

Verified against packages/runtime/src/cli-app.ts. Run jazz <command> --help for the same information at the terminal.


Global options

Available on every command.

FlagEffect
-v, --verboseVerbose logging
--debugDebug-level logging
--config <path>Use a specific config file (also JAZZ_CONFIG_PATH)
--data-dir <path>Directory holding this invocation’s config, data, and keyring entries (overrides $JAZZ_HOME; defaults to ~/.jazz). Lets one host run several independent agents by flag
--no-tuiDisable the Ink TUI; plain terminal output. For CI, scripts, small terminals. Same as JAZZ_NO_TUI=1
--output <mode>rendered | hybrid (default) | raw (no formatting) | quiet (suppress output). Same as JAZZ_OUTPUT_MODE
--versionPrint the version
--helpPrint help

jazz

With no arguments, launches the interactive wizard — new conversation, create/list/edit/delete agents, update configuration. The home screen reports what is ready under setup (agents) and, under environment, the same machine facts every agent receives in its system prompt: date, OS with shell and user, working directory, and hardware. Both come from one source, so the screen cannot drift from what agents are actually told. On a short terminal the environment report is the first section dropped, after the tip.


jazz run — headless, one-shot

The command every non-terminal integration is built on. Takes a dynamic prompt, runs one agent turn, prints a clean payload. stdout is the answer; all chatter goes to stderr.

jazz run --agent <id> [prompt]

The prompt comes from the positional argument, or from piped stdin when the argument is absent and stdin is not a TTY.

FlagDefaultPurpose
--agent <id>requiredAgent id or name
--jsonoffEmit one JSON envelope: { ok, answer, costUSD, tokenUsage, toolCalls }
--conversation <id>noneStable conversation key. Loads prior history before the run, saves the transcript after — gives stateless bridges per-chat memory
--approval-policy <p>noneread-only | low-risk | high-risk. Tools above the tier are declined
--events <categories>noneNDJSON progress on stderr: tools, reasoning, text, usage, approval, subagent, all (comma-separated)
--reasoning <effort>agent configlow | medium | high | disable
--timeout <ms>noneAbort the run after this many milliseconds (hard external kill, no warning)
--max-iterations <n>80Cap reasoning iterations
--max-cost-usd <$>noneAbort once cumulative spend (own + sub-agent) reaches this many dollars, checked between iterations
--max-tokens <n>noneAbort once cumulative prompt + completion tokens (own run only, not sub-agents) reach this count, checked between iterations — needs no model pricing
--max-duration-ms <ms>noneAbort once elapsed wall-clock time reaches this budget, with agent pressure nudges at 50/80/90%, checked between iterations
--streamautoForce streaming. Required for --events in non-TTY contexts, where streaming auto-disables
--no-streamDisable streaming

--max-cost-usd, --max-tokens, and --max-duration-ms are soft checkpoints, not preemptive interrupts — see Configuration → maxCostUSD, maxTokens, and maxDurationMs for the enforcement model and how they differ from --timeout.

Exit codes: 0 on success, 1 on failure. In plain mode stdout is empty on failure and the message goes to stderr; in --json mode stdout always carries exactly one object.

Full contract, examples, and a complete bridge implementation: Surfaces → Headless.


jazz agent

CommandPurpose
jazz agent listList all agents
jazz agent createCreate an agent (interactive)
jazz agent show <agentId>Show an agent’s details
jazz agent edit <agentId>Edit an agent
jazz agent delete <agentId>Delete an agent. -y, --yes / -f, --force to skip confirmation
jazz agent chat <agentIdentifier>Interactive session with a specific agent, by id or name

agent chat accepts --stream / --no-stream and --max-iterations <n>.


jazz workflow

CommandPurpose
jazz workflow listList available workflows (built-in, global, local)
jazz workflow show <name>Show a workflow’s prompt and metadata
jazz workflow run <name>Run once — see flags below
jazz workflow schedule <name>Install into launchd (macOS) or cron (Linux)
jazz workflow unschedule <name>Remove from the scheduler
jazz workflow scheduledList scheduled workflows
jazz workflow catchupList workflows that missed a slot, select, run
jazz workflow history [name]Show run history

jazz workflow run flags

FlagPurpose
--auto-approveApply the workflow’s own autoApprove: policy instead of prompting
--agent <agentId>Override the agent for this run
--max-iterations <n>Override the workflow’s iteration cap
--max-cost-usd <$>Override the workflow’s spend cap
--max-tokens <n>Override the workflow’s token cap
--max-duration-ms <ms>Override the workflow’s wall-clock budget (50/80/90% agent pressure nudges)
--jsonOne JSON envelope on stdout; all chatter suppressed
--timeout <ms>Abort after this many milliseconds (hard external kill, no warning)
--events <categories>NDJSON progress on stderr. Requires --json — otherwise it errors
--scheduledMarks the run as scheduler-triggered (set automatically by launchd/cron)

Frontmatter fields: Workflow frontmatter.


jazz mcp

CommandPurpose
jazz mcp add [json]Add a server from inline JSON, -f, --file <path>, or interactively
jazz mcp listList configured servers
jazz mcp removeRemove a server
jazz mcp enableEnable a disabled server
jazz mcp disableDisable a server

See Integrations → MCP.


jazz runs

Inspect runs still in flight — including your own parked ones, and, once a daemon started one, runs begun from somewhere else entirely.

CommandPurpose
jazz runs listList unfinished runs, newest first. --agent, --conversation, --all (include finished, with cost), --json
jazz runs show <runId>Show one run, including what it’s waiting for. --json
jazz runs approve <runId>Approve what a parked run is waiting for; blocks until it finishes
jazz runs reject <runId>Refuse what it’s waiting for; --note <text> tells it why
jazz runs answer <runId>Answer a question the run asked, in your own words: --response <text> (empty declines it)

A run parks when it hits something needing your approval and nobody is there to give it — see Daemon for answering one from a different process than the one that started it.


jazz daemon

Serves runs over HTTP: start one, poll it, approve or reject what a parked one is waiting for — from a different terminal, a different process, or a different machine than the one that began it. Runs in the foreground; supervision (restart on crash, start on boot) is the host’s job, not the daemon’s — jazz daemon install wires it into that supervisor (systemd/launchd) instead of leaving that hand-written.

FlagPurpose
--port <n>Port to listen on. Default 4747
--host <address>Interface to bind. Default 127.0.0.1. Anything else requires a daemon token
--serve-peers <agentId>Also answer questions from configured peers, using this agent. Off unless given

A bearer token authenticates the operator routes (/runs, /health) whenever --host is anything but loopback; loopback needs none. The first time this daemon binds a non-loopback host with no token already set, Jazz generates one and stores it — an OS keyring when one’s reachable, otherwise a chmod 600 file at $JAZZ_HOME/secrets.json (see Setting up peers) — printing it once so it can be copied to a client. No setup command required. /peer/ask (when --serve-peers is given) uses a separate, per-peer credential instead — see jazz peers.

CommandPurpose
jazz daemon set-tokenGenerate (or store $JAZZ_DAEMON_TOKEN if set) a token before the daemon’s first run — useful when a client needs the value in advance
jazz daemon forget-tokenRemove the stored token
jazz daemon installInstall this as a persistent system service (systemd/launchd). Needs root; generates and stores its own token if none is set (no keyring or $JAZZ_DAEMON_TOKEN needed); doesn’t report success until /health answers; --serve-peers <agentId> (required), --host, --port, --yes
jazz daemon uninstallRemove the service installed by install. Needs root; --yes

Set $JAZZ_DAEMON_TOKEN yourself instead of letting Jazz generate one when the value needs to be known ahead of time — a client config written before the daemon has ever run, or an ephemeral container whose $JAZZ_HOME doesn’t survive to the next deploy.

See Setting up peers for a full walkthrough, and Agent-to-agent for the tier model this exists to serve.

jazz wake-trigger fire --agent <agentId> --id <id> is internal plumbing, not something you run by hand: it’s what register_trigger schedules with launchd/at to fire a wake trigger without jazz daemon running. See Wake Triggers.


jazz peers

Other people’s agents this machine talks to, and what has been said to or by them.

CommandPurpose
jazz peers listList configured peers and what each may learn. --json
jazz peers set-token <name>Store a peer’s token, read from $JAZZ_PEER_TOKEN (or --from-env <VAR>)
jazz peers forget-token <name>Remove a peer’s stored token
jazz peers logEverything said to and by a peer, newest first. --peer <name>, --limit <n>, --json

Peers can be added by invitejazz peers invite create/accept — or by editing ~/.jazz/config.json directly. See Setting up peers for both paths.

jazz peers invite

CommandPurpose
jazz peers invite create <name>Create a one-time invite link granting <name> a tier once accepted. --disclosure <tier> (required), --persona <name> (which persona answers them), --expires <duration>, --host/--port or --public-url (reverse-proxy setups), --as <name>, --qr, --json
jazz peers invite accept <url>Accept an invite link. --as <name>, --yes (skip confirmation), --json
jazz peers invite listInvites created on this machine. --json
jazz peers invite revoke <id>Invalidate an invite before it’s redeemed

jazz persona

CommandPurpose
jazz persona listList personas (built-in + custom)
jazz persona createCreate a custom persona (interactive)
jazz persona show <identifier>Show a persona by name or id
jazz persona edit <identifier>Edit a custom persona
jazz persona delete <identifier>Delete a custom persona
jazz persona browseBrowse the marketplace and install a persona (interactive). --refresh
jazz persona searchList every persona the marketplace offers. --refresh
jazz persona install <name>Install a marketplace persona. --as <name> (local name), -y/--yes (skip confirmation), --refresh

install prints the full system prompt and asks before writing it — a persona becomes an agent’s instructions, so non-interactive runs must pass --yes. The catalog is cached under <jazz home>/cache/persona-registry.json and keeps working offline; JAZZ_PERSONA_REGISTRY_URL points Jazz at a self-hosted catalog.

See Personas.


jazz config

CommandPurpose
jazz config showShow all configuration values
jazz config get <key>Get one value
jazz config set <key> [value]Set one value

See Configuration.


jazz update

CommandPurpose
jazz updateUpdate Jazz to the latest version
jazz update --checkCheck for updates without installing

In-chat commands

Available inside an interactive session. Type /help for the current list.

CommandPurpose
/helpList commands
/toolsShow available tools
/skillsBrowse skills
/workflowsBrowse workflows
/modeChange approval mode (also Shift+Tab)
/costTokens and USD for this session, including sub-agents
/contextContext window usage and the biggest consumers
/compactForce context compaction now
/switchSwitch agent
/peersList configured peers and what each may learn or do
/newStart a fresh conversation

Keys: double-Escape interrupts generation or a running tool. Shift+Tab cycles the approval policy. Shift+Enter inserts a newline in the composer; Enter sends.

Shell escapes

In the interactive terminal, type ! <command> when the agent asks you to run a command yourself. Jazz executes the command in the current session directory and sends its bounded stdout, stderr, and exit code to the agent as context for the next response:

> ! ssh user@test rm -r folder
> Did that remove the folder successfully?

The command is executed because you entered it explicitly; it does not wait for the model to call execute_command. The built-in shell denylist, sanitized environment, timeout, process interruption, and 256 KiB per-stream output cap still apply. Output is treated as command data, not as instructions. A non-zero exit code is still passed to the agent so it can explain or suggest the next step. ! is an interactive terminal feature and is not interpreted by jazz run, scheduled jobs, CI, or chat bridges.


Output modes

--output controls formatting; it does not change what goes to stdout vs stderr.

ModeBehavior
renderedFull markdown rendering
hybridDefault — rendered with plain fallbacks
rawNo formatting, no ANSI. Use this in CI
quietSuppress output

machine-readable: /docs/reference/cli.md · /llms.txt · /llms-full.txt