A multi-provider AI-powered CLI agent
Project description
jarv
A multi-provider AI-powered CLI agent that can run shell commands, fan out work to parallel subagents, and keep track of conversation history across terminal sessions.
jarv # start an interactive session
jarv whats the meaning of life? # one-shot question
jarv commit all these files # let it run commands to do the job
jarv refactor the auth module # complex tasks get split across subagents
Install
Requires Python 3.10+ and an OpenAI API key.
pip install jarv
jarv /setup
The setup wizard will walk you through entering your API key and choosing a model. The key can also be set via the OPENAI_API_KEY environment variable or jarv /set api_key ....
To upgrade:
jarv /update
Usage
One-shot mode
Pass a prompt as arguments. Jarv answers (running commands if needed) and exits.
jarv what process is using port 8080?
jarv find all TODO comments in src/
Jarv also accepts piped stdin as one-shot input. If you pass both stdin and prompt arguments, the arguments are treated as the instruction and stdin is attached as context.
git diff | jarv review this patch
cat README.md | jarv summarize this
rg TODO . | jarv group these by subsystem
Heads-up mode
Run jarv with no arguments to enter an interactive prompt loop.
jarv> what files changed today?
jarv> now run the tests
jarv> /history
jarv> /new
- Type a prompt and press Enter.
- Slash commands start with
/— type/helpto list them. - Exit with
exit,quit,/exit, or Ctrl+C.
Flags
Flags override config values for a single run and work in both one-shot and heads-up mode.
| Flag | Short | Description |
|---|---|---|
--model MODEL |
-m |
Override the model (e.g. gpt-5.4-mini) |
--effort EFFORT |
-e |
Override reasoning effort (low / medium / high) |
--timeout SECONDS |
Override command timeout in seconds | |
--system PROMPT |
-s |
Override the system prompt |
--new |
Start a fresh session (ignore prior history, but still save) | |
--incognito |
Don't load or save session history | |
--version |
Print the version and exit |
jarv -m gpt-5.4-mini "summarise this repo"
jarv --effort high "refactor the auth module"
jarv --new "start fresh without prior context"
jarv --incognito "one-off task, leave no trace"
jarv --timeout 120 --system "You are a poet" "write me a haiku"
How it works
Jarv wraps the OpenAI Responses API with a tool-calling agent loop. The model can call three tools:
| Tool | Purpose |
|---|---|
run_command |
Execute a shell command and return stdout, stderr, and exit code |
spawn |
Fan out work to parallel subagents, each with their own tool access |
read_artifact |
Retrieve the full output of a completed subagent |
On Windows, commands run through PowerShell. On other platforms, they run through the system shell.
Command safety
Before executing a shell command, jarv can prompt you for confirmation. The command_safety config key controls this:
| Level | Behavior |
|---|---|
risky (default) |
Prompts for confirmation when a command matches dangerous patterns — recursive deletion, privilege escalation, network exfiltration, disk formatting, credential access, force pushes, and more. |
all |
Every command requires your explicit approval before running. |
none |
Commands run immediately with no confirmation prompt. |
Set the level in the settings menu (jarv /settings) or at any time with:
jarv /set command_safety risky # default — confirm dangerous commands
jarv /set command_safety all # confirm everything
jarv /set command_safety none # no prompts
Subagent orchestration
When the model calls spawn, Jarv runs N child agents in parallel. Each child operates independently — running commands, reasoning through subtasks — and terminates by calling finish with a detailed report and a short summary. The parent agent can then read any child's full output via read_artifact.
- Parallel by default — all children in a
spawncall run concurrently in a thread pool. - Artifacts — each child's output is stored as a named artifact. The parent (or siblings that declare a dependency) can fetch the full content.
- Recursive — children can themselves spawn further children, up to
max_subagent_depthlevels deep (default 4). Children are sterile by default; the parent must explicitly allow further spawning. - Scoped per query — the artifact store resets with each new top-level prompt.
The terminal shows a live progress panel as children run, with a green checkmark or red cross as each finishes.
Commands
| Command | Description |
|---|---|
/help |
Show all commands |
/about |
Detailed info and examples |
/set <key> <value> |
Set a config value |
/unset <key> |
Reset a config key to default |
/settings |
Open the interactive settings menu |
/config |
Show raw config values |
/setup |
Run the setup wizard |
/new |
Start a fresh session on the next prompt |
/archive |
Archive session history and artifacts |
/sessions |
Browse sessions (interactive when in a TTY) |
/sessions <id> |
Load a specific session by ID prefix |
/history |
Show recent conversation history |
/undo [n] |
Remove last n exchanges (default 1) |
/redo [n] |
Restore last n undone exchanges (default 1) |
/usage |
Show token usage, cost, and context breakdown |
/update |
Update Jarv to the latest version |
All commands work both as jarv /command (one-shot) and inside heads-up mode.
Sessions
Each terminal is automatically bound to its own session. Jarv identifies terminals using environment variables (WT_SESSION, TERM_SESSION_ID, TMUX, STY) with a parent-process fallback, so history persists across runs in the same terminal.
/newstarts a fresh session on the next prompt without archiving the current session./sessionsopens an interactive browser (arrow keys to navigate, Enter to load,ato archive,dto delete,pto preview,Tabto switch views, Ctrl+F to search)./historyopens an interactive transcript where Up/Down scroll and Left/Right jump to the previous or next chat/reply./undoand/redolet you step through recent exchanges.
Config
Settings live in ~/.jarv/config.json (created on first run). Use /settings for the common controls, or edit the file directly with /set and /unset.
| Key | Default | Description |
|---|---|---|
api_key |
"" |
OpenAI API key. Falls back to OPENAI_API_KEY env var if empty. |
model |
"gpt-5.4-mini" |
Model name passed to the API. |
reasoning_effort |
"" |
Reasoning effort level. Leave empty to disable. |
max_history |
40 |
Number of recent messages kept as context. |
max_stdin_chars |
200000 |
Maximum piped stdin characters attached to a one-shot prompt. |
max_tool_output_chars |
20000 |
Maximum tool output characters returned to the model. Longer output is returned with the middle omitted. |
command_timeout |
60 |
Seconds before a shell command is killed. |
command_safety |
"risky" |
Command confirmation level: all (confirm every command), risky (confirm dangerous commands only), none (no confirmation). |
audit |
true |
LLM auditor for flagged commands. |
auditor_auto_approve |
true |
Let the auditor auto-approve commands it deems safe. |
auditor_model |
"" |
Auditor model. Empty uses the active model. |
max_subagent_depth |
4 |
Maximum nesting depth for spawned subagents. |
subagent_thread_pool_max_workers |
8 |
Max parallel subagents per spawn call. |
check_updates |
true |
Background update check on startup (non-blocking, throttled to once per 24h). |
system_prompt |
"You are Jarv..." |
System instructions sent with each request. |
Local files
All state is stored in ~/.jarv/ (on Windows, %USERPROFILE%\.jarv\):
~/.jarv/
├── config.json # settings and optional API key
├── sessions.json # terminal → session mappings
├── sessions/
│ ├── history-<hash>.json # conversation history
│ ├── artifacts-<hash>.json # subagent artifacts
│ ├── usage-<hash>.json # token usage totals
│ └── redo-<hash>.json # undo/redo stack
└── archive/ # archived sessions
Dependencies
| Package | Role |
|---|---|
| openai | Responses API client |
| rich | Terminal styling, live rendering, markdown |
| litellm | Token counting, model pricing, context window metadata |
License
Elastic License 2.0 (ELv2) — free to use, modify, and redistribute. You may not offer jarv as a hosted/managed service.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file jarv-0.10.2.tar.gz.
File metadata
- Download URL: jarv-0.10.2.tar.gz
- Upload date:
- Size: 86.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c0bc9c23e059db2ab6e6ea617c71b842754b2f4f15819d882e519f1f2ac8e942
|
|
| MD5 |
599dbb8ad5fc05991ee3981a4f634b8c
|
|
| BLAKE2b-256 |
84df851f6c74b2c247df6355cf4ac563a48d53324fa283bbc8ac369b2b09ca5e
|
Provenance
The following attestation bundles were made for jarv-0.10.2.tar.gz:
Publisher:
publish.yml on JamesWHomer/jarv
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
jarv-0.10.2.tar.gz -
Subject digest:
c0bc9c23e059db2ab6e6ea617c71b842754b2f4f15819d882e519f1f2ac8e942 - Sigstore transparency entry: 1590384740
- Sigstore integration time:
-
Permalink:
JamesWHomer/jarv@75d37dee04a9fb972fa586a2df432d9d986430f0 -
Branch / Tag:
refs/tags/v0.10.2 - Owner: https://github.com/JamesWHomer
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@75d37dee04a9fb972fa586a2df432d9d986430f0 -
Trigger Event:
push
-
Statement type:
File details
Details for the file jarv-0.10.2-py3-none-any.whl.
File metadata
- Download URL: jarv-0.10.2-py3-none-any.whl
- Upload date:
- Size: 86.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a591c25a1f24cbdda3091fec7a6d14a165606cb1ec7c8580299dd8c47f31a07f
|
|
| MD5 |
326f90cb4ba2a998f1a0b991152bf3d0
|
|
| BLAKE2b-256 |
546a2c83bbe40e1996df9892635a84e0b3bbbb6470be218c78f2426e13710ff0
|
Provenance
The following attestation bundles were made for jarv-0.10.2-py3-none-any.whl:
Publisher:
publish.yml on JamesWHomer/jarv
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
jarv-0.10.2-py3-none-any.whl -
Subject digest:
a591c25a1f24cbdda3091fec7a6d14a165606cb1ec7c8580299dd8c47f31a07f - Sigstore transparency entry: 1590384783
- Sigstore integration time:
-
Permalink:
JamesWHomer/jarv@75d37dee04a9fb972fa586a2df432d9d986430f0 -
Branch / Tag:
refs/tags/v0.10.2 - Owner: https://github.com/JamesWHomer
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@75d37dee04a9fb972fa586a2df432d9d986430f0 -
Trigger Event:
push
-
Statement type: