Skip to content

CLI reference

With a tool install (uv tool install), every command is just jutul-agent …. From a dev checkout, run them through uv run jutul-agent … instead. Two flags are accepted by every command:

Flag Meaning
--workspace <path> Workspace directory (default: current working directory)
--state-home <path> Where sessions and traces live (default: $XDG_DATA_HOME/jutul-agent, falling back to ~/.local/share/jutul-agent)

Interfaces

jutul-agent has three interfaces; pick one explicitly (bare jutul-agent prints this list and exits, rather than launching one by default):

Command Interface
jutul-agent web [options] Browser UI (HTTP + WebSocket server + bundled web app)
jutul-agent tui [options] Terminal UI
jutul-agent run "<prompt>" [options] One headless turn, then exit

jutul-agent --version prints the version.

jutul-agent web

jutul-agent web [--sim <name>] [--approval-mode <mode>] [--model <m>] [--host <addr>] [--port <n>]

Serves the browser UI (default http://127.0.0.1:8742). One folder is bound to one simulator — from --sim, the workspace config, or auto-detection — and the choice is remembered. Runs locally for a single trusted user; the protocol and embedding are covered in the server interface.

The session knobs below set the default for every session this server creates (one folder, one Julia environment); the model and approval policy can still be changed per session in the UI.

Option Meaning
--sim <name> Simulator for this folder's sessions (persisted to the workspace config)
--approval-mode ask\|workspace\|auto Default human-in-the-loop policy for new sessions (change per session in the UI with /approval-mode)
--model <provider:model> Default model for new sessions (override per session with the UI model picker)
--julia-project <path> Override the resolved workspace Julia project
--threads <N\|auto> Julia compute threads (default: physical cores minus one)
--add-dir <path> Add an extra folder the agent can read and edit (repeatable; also runtime /add-dir)
--ephemeral-memory Use a throwaway memory directory; nothing persists to workspace memory
--host <addr> Address to bind (default 127.0.0.1, localhost only)
--port <n> Port to bind (default 8742)

jutul-agent tui

jutul-agent tui [options]

Launches the interactive terminal UI.

Option Meaning
--sim <name> Active simulator. Required only if not in workspace config and not auto-detectable from a Project.toml
--model <provider:model> Model for this session. Precedence: this flag, workspace config, user config, $JUTUL_AGENT_MODEL, default
--julia-project <path> Override the resolved workspace Julia project
--threads <N\|auto> Julia compute threads (default: physical cores minus one)
--add-dir <path> Add an extra folder for the agent (repeatable)
--continue Continue the most recent session in this workspace
--resume [id] Resume a session by id or unique prefix; with no value, pick from a list
--approval-mode ask\|workspace\|auto Human-in-the-loop policy
--ephemeral-memory Throwaway memory directory for this session

jutul-agent run

jutul-agent run "<prompt>" [options]

Runs one headless turn and exits — same options as tui (headless runs need --approval-mode auto). Exit codes: 0 on success, 3 when the turn needed an approval that headless mode cannot ask for.

jutul-agent init (alias: setup)

Bootstrap the workspace: write .jutul-agent/config.toml, copy the simulator's Julia env template, and (by default) precompile the env and the web-plotting overlay so the first session in any interface is fast.

Option Meaning
--sim <name> Simulator to bootstrap (omit to auto-detect)
--source-path <path> Pkg.develop a local checkout of the simulator package (persisted to the workspace config)
--no-precompile Skip the bake — bootstrap config + env only; the first session builds the rest
--force Replace an existing workspace env with a fresh template copy (after upgrading jutul-agent)

jutul-agent doctor

Diagnose the setup: Julia version, provider key (or Ollama reachability), which Julia project the workspace resolves to, whether the simulator package is actually in the manifest, whether the env was built from the current simulator template, display/xvfb for plotting, and a boot check of the env. Each finding comes with a fix.

Option Meaning
--sim <name> Simulator to check against (default: workspace config / auto-detect)

jutul-agent key

View and set the provider API keys jutul-agent saves (in the global .env). Run it from anywhere; it needs no workspace or Julia. This is the way to add a key on a pip-only install, or to replace a wrong or expired one.

jutul-agent key                # list which keys are set, and where each comes from
jutul-agent key openai         # prompt for the OpenAI key and save it (hidden input)
jutul-agent key --show         # list status only, never prompt

The status flags a key that the process environment or a project .env overrides, since those take precedence over the saved one.

jutul-agent upgrade

Upgrade jutul-agent to the latest version, doing the right thing for how it was installed: a tool install runs uv tool upgrade jutul-agent; a dev checkout is pointed at git pull && uv sync. After upgrading, rebuild any workspace env that was set up with an older version (jutul-agent init --sim <name> --force).

jutul-agent upgrade           # upgrade to the latest
jutul-agent upgrade --check   # report latest vs installed, change nothing
Option Meaning
--check Only report the latest available version; don't upgrade

jutul-agent also checks for updates at launch and prints a one-line notice when a newer version exists (cached for a day; runs in the background so it never delays startup). Disable it with JUTUL_AGENT_NO_UPDATE_CHECK=1.

jutul-agent transcript

Render a recorded session.

jutul-agent transcript                  # last session in this workspace, HTML
jutul-agent transcript <id>             # a specific session
jutul-agent transcript --format markdown
jutul-agent transcript --bundle         # zip including artifacts

jutul-agent sessions

List this workspace's sessions, newest first: start time, id, and the title derived from each session's first prompt. Any id (or unique prefix) can be passed to --resume.

jutul-agent sessions
jutul-agent sessions --limit 0    # show all

jutul-agent eval

Run bench suites through Inspect AI (needs uv sync --extra eval). See evaluation.

jutul-agent eval --list
jutul-agent eval <suite> [<suite>...] --model <provider/model>[,<provider/model>...]
Option Meaning
--model Inspect model id(s), comma-separated for a matrix
--epochs <n> Repetitions per sample (default 1)
--max-samples <n> Concurrent samples (default 1: sessions only interleave, the workspace root is process-global)
--limit <n> Only the first n samples of each task
--log-dir <path> Where Inspect writes logs (default: state home /eval-logs)
--list List available suites

Exit code 1 when any task errored. Note the model id form differs from the app's: Inspect uses provider/model, the agent uses provider:model.