Skip to main content

Baxter CLI - a terminal coding agent

Project description

Terminal Coding Agent (Baxter CLI)

Baxter CLI Banner

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-compatible chat/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

  • anthropic
    • claude-opus-4-6
    • claude-sonnet-4-6
    • claude-haiku-4-5-20251001 (default)
  • openai
    • gpt-4o-mini (default)
    • gpt-5-mini
    • codex-3.5
  • groq
    • llama-3.1-8b-instant (default)

Notes:

  • OpenAI model IDs are fetched from /v1/models and intersected with the allowlist above.
  • You can override the OpenAI allowlist with OPENAI_MODELS_ALLOWLIST (comma-separated IDs).

Tooling

Tools available:

  • read_file
  • write_file
  • apply_diff
  • list_dir
  • make_dir
  • delete_path
  • run_cmd
  • git_cmd
  • search_code

Key behaviors:

  • File paths are restricted to the repo root (no absolute paths, no .. escape).
  • delete_path supports recursive directory deletion (default recursive=true).
  • write_file refuses to overwrite existing files unless overwrite=true.
  • apply_diff supports targeted edits using exact find/replace with optional replace_all=true.
  • apply_diff returns a unified diff summary (+/-) and stores the full last diff for terminal viewing.

Confirmations

Baxter asks y/N confirmation before:

  • delete_path
  • apply_diff
  • write_file when overwrite=true
  • git push
  • git rm

CLI Commands

  • / opens interactive provider/model picker
  • /providers (alias: /settings)
  • /provider <groq|openai|anthropic>
  • /models
  • /model <model_name>
  • /lastdiff (expand the last apply_diff unified 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_KEY
    • OPENAI_API_KEY
    • GROQ_API_KEY

Setup (Developer)

  1. 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
  1. Install editable:
pip install -e .
  1. Create .env from .env.example and 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)

  1. Install Baxter:
pip install baxter-cli
  1. 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.

  1. Open any project folder and run:
baxter

Environment Setup Smoke Test

Use this to verify first-run key loading and precedence.

  1. 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.

  1. 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.

  1. 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:

  • python
  • python3
  • pip
  • pip3
  • git

git_cmd subcommand allowlist:

  • status
  • log
  • diff
  • show
  • branch
  • switch
  • checkout
  • add
  • commit
  • push
  • pull
  • fetch
  • remote
  • rev-parse
  • restore
  • rm
  • mv
  • stash

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 .env has the expected API key and restart Baxter.
  • 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_ALLOWLIST explicitly.
  • git not found on PATH:
    • Install Git and restart terminal.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

baxter_cli-0.1.1.tar.gz (26.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

baxter_cli-0.1.1-py3-none-any.whl (29.3 kB view details)

Uploaded Python 3

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

Hashes for baxter_cli-0.1.1.tar.gz
Algorithm Hash digest
SHA256 32454397dbd01ebe714e70237e755f9ceb7d5e4b7f10ea37427dbf884f7b7420
MD5 11581e8b5c2e9f6df53fe15d914647a9
BLAKE2b-256 f7f7cbe6e38426d1120a2f26cb5817df6444b3157cc6edf3d87520379b91537a

See more details on using hashes here.

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

Hashes for baxter_cli-0.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 4d1bf3e4bd55fe66613b234fba998edf83b0c3faf6f4cd90bed891bb95f0a9df
MD5 33b3bc0995e8f7a036b8a81b9641bee5
BLAKE2b-256 3318a914d57bfe9a18a36729867847361cc47496ed5d61576c341a33ac3bb6e7

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page