Baxter CLI - a terminal coding agent
Project description
Terminal Coding Agent (Baxter CLI)
A local terminal coding assistant with provider switching, tool-calling, and safety rails for file + command operations.
Features
- Interactive chat loop with tool chaining
- Provider support:
anthropic(/v1/messages)openai(/v1/responses)groq(OpenAI-compatiblechat/completions)
- Startup provider preference:
anthropic->openai->groq - Curated model lists per provider (with OpenAI dynamic filtering against
/v1/models) - Working indicator while model calls are in flight (
Baxter is working...) - Built-in malformed tool-call recovery (one automatic retry if JSON tool call is broken)
Current Model Sets
anthropicclaude-opus-4-6claude-sonnet-4-6claude-haiku-4-5-20251001(default)
openaigpt-4o-mini(default)gpt-5-minicodex-3.5
groqllama-3.1-8b-instant(default)
Notes:
- OpenAI model IDs are fetched from
/v1/modelsand intersected with the allowlist above. - You can override the OpenAI allowlist with
OPENAI_MODELS_ALLOWLIST(comma-separated IDs).
Tooling
Tools available:
read_filewrite_fileapply_difflist_dirmake_dirdelete_pathrun_cmdgit_cmdsearch_code
Key behaviors:
- File paths are restricted to the repo root (no absolute paths, no
..escape). delete_pathsupports recursive directory deletion (defaultrecursive=true).write_filerefuses to overwrite existing files unlessoverwrite=true.apply_diffsupports targeted edits using exactfind/replacewith optionalreplace_all=true.apply_diffreturns a unified diff summary (+/-) and stores the full last diff for terminal viewing.
Confirmations
Baxter asks y/N confirmation before:
delete_pathapply_diffwrite_filewhenoverwrite=truegit pushgit rm
CLI Commands
/opens interactive provider/model picker/providers(alias:/settings)/provider <groq|openai|anthropic>/models/model <model_name>/lastdiff(expand the lastapply_diffunified diff)/help
Project Layout
.
├─ .env.example
├─ pyproject.toml
├─ README.md
└─ baxter/
├─ __init__.py
├─ baxter_cli.py
├─ providers.py
└─ tools/
├─ __init__.py
├─ registry.py
├─ safe_path.py
├─ read_file.py
├─ write_file.py
├─ apply_diff.py
├─ list_dir.py
├─ make_dir.py
├─ delete_path.py
├─ run_cmd.py
├─ git_cmd.py
└─ search_code.py
Requirements
- Python 3.10+
- At least one API key:
ANTHROPIC_API_KEYOPENAI_API_KEYGROQ_API_KEY
Setup (Developer)
- Create and activate a virtual environment.
Windows (cmd):
python -m venv .venv
.venv\Scripts\activate.bat
Windows (PowerShell):
python -m venv .venv
.venv\Scripts\Activate.ps1
macOS/Linux:
python3 -m venv .venv
source .venv/bin/activate
- Install editable:
pip install -e .
- Create
.envfrom.env.exampleand set keys:
GROQ_API_KEY=...
OPENAI_API_KEY=...
ANTHROPIC_API_KEY=...
# optional:
# OPENAI_MODELS_ALLOWLIST=gpt-4o-mini,gpt-5-mini,codex-3.5
The CLI also loads user-level keys from ~/.baxter/.env first, then applies project .env as an override.
Setup (User install via pip)
- Install Baxter:
pip install baxter-cli
- Configure keys once per machine in:
- Windows:
%USERPROFILE%\.baxter\.env - macOS/Linux:
~/.baxter/.env
Example:
GROQ_API_KEY=...
OPENAI_API_KEY=...
ANTHROPIC_API_KEY=...
# optional:
# OPENAI_MODELS_ALLOWLIST=gpt-4o-mini,gpt-5-mini,codex-3.5
If keys are missing on startup, Baxter now offers an interactive one-time setup prompt and writes keys to ~/.baxter/.env.
- Open any project folder and run:
baxter
Environment Setup Smoke Test
Use this to verify first-run key loading and precedence.
- Missing keys path:
Remove-Item Env:OPENAI_API_KEY -ErrorAction SilentlyContinue
Remove-Item Env:ANTHROPIC_API_KEY -ErrorAction SilentlyContinue
Remove-Item Env:GROQ_API_KEY -ErrorAction SilentlyContinue
Remove-Item "$HOME\.baxter\.env" -ErrorAction SilentlyContinue
baxter
Expected: startup warning about missing keys.
- User-level key file path:
mkdir $HOME\.baxter -Force
@"
OPENAI_API_KEY=your_real_key
"@ | Set-Content "$HOME\.baxter\.env"
baxter
Expected: no missing-key warning.
- Project-level override path:
@"
GROQ_API_KEY=your_real_groq_key
"@ | Set-Content ".env"
baxter
Expected: local .env values override user-level values for overlapping keys.
Run
baxter
or:
python -m baxter.baxter_cli
Command Safety Model
run_cmd allowlist:
pythonpython3pippip3git
git_cmd subcommand allowlist:
statuslogdiffshowbranchswitchcheckoutaddcommitpushpullfetchremoterev-parserestorermmvstash
Additional protections:
- No shell execution for command tools
- Path traversal/root escape blocked
- Selected risky git flags blocked (
--git-dir,--work-tree,-C, etc.) - Per-tool timeout bounds
Troubleshooting
- Missing key error:
- Verify
.envhas the expected API key and restart Baxter.
- Verify
- OpenAI tool-call/JSON issues:
- Baxter now does one automatic repair retry for malformed tool-call JSON.
- OpenAI model list too large:
- Set
OPENAI_MODELS_ALLOWLISTexplicitly.
- Set
git not found on PATH:- Install Git and restart terminal.
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 baxter_cli-0.1.1.tar.gz.
File metadata
- Download URL: baxter_cli-0.1.1.tar.gz
- Upload date:
- Size: 26.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.10
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
32454397dbd01ebe714e70237e755f9ceb7d5e4b7f10ea37427dbf884f7b7420
|
|
| MD5 |
11581e8b5c2e9f6df53fe15d914647a9
|
|
| BLAKE2b-256 |
f7f7cbe6e38426d1120a2f26cb5817df6444b3157cc6edf3d87520379b91537a
|
File details
Details for the file baxter_cli-0.1.1-py3-none-any.whl.
File metadata
- Download URL: baxter_cli-0.1.1-py3-none-any.whl
- Upload date:
- Size: 29.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.10
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4d1bf3e4bd55fe66613b234fba998edf83b0c3faf6f4cd90bed891bb95f0a9df
|
|
| MD5 |
33b3bc0995e8f7a036b8a81b9641bee5
|
|
| BLAKE2b-256 |
3318a914d57bfe9a18a36729867847361cc47496ed5d61576c341a33ac3bb6e7
|