Agentic CLI - Autonomous coding assistant with multi-provider AI support
Project description
Commandor
๐ค Agentic CLI โ Autonomous Coding Assistant
AI-powered terminal assistant that autonomously implements features, fixes bugs, refactors code, writes tests, and manages files โ all from a single unified terminal interface.
โจ Why Commandor?
๐ฏ Agent Modes
Commandor offers two distinct interaction modes:
| Mode | Command | Description |
|---|---|---|
| Agent | /agent <task> |
Autonomous AI that uses all available tools to complete tasks. The AI decides how to accomplish the goal and executes autonomously. |
| Chat | /chat <message> |
Pure conversation โ no tool access. Use for questions, explanations, code reviews, or brainstorming. |
๐ง Intelligent Context Management
@File References
Inline file contents directly into your prompts without manual copying:
/agent refactor this function: @src/utils.py
/agent write tests for @app/models.py
/chat explain @Dockerfile
Supports glob patterns too:
/agent fix all type errors in @**/*.py
Persistent Sessions
- Auto-save: Every conversation is automatically saved with a unique thread ID
- Name & organize: Use
/sessions save <name>to name important sessions - Resume later:
/sessions resume <name>continues where you left off - Multiple sessions: Keep separate contexts for different projects or tasks
- Checkpoint storage: Uses SQLite (
~/.commandor/checkpoints.db) for durability
Real-time Metrics
Watch token usage and performance as you work:
- Context window usage (with visual progress bar)
- Input/output token counts
- Context condensation events (when history is summarized to save space)
- Model name and execution time
๐ค Multi-Provider Support
Commandor works with the leading AI providers. Configure one or all:
| Provider | Models | Setup |
|---|---|---|
| Google Gemini | gemini-2.5-flash, gemini-2.5-pro, gemini-1.5-pro, gemini-1.5-flash |
GEMINI_API_KEY |
| Anthropic Claude | claude-3-5-sonnet-20241022, claude-3-7-sonnet-20250219, claude-3-opus-20240229, claude-3-5-haiku-20241022 |
ANTHROPIC_API_KEY |
| OpenAI GPT | gpt-4o, gpt-4o-mini, gpt-4-turbo, o1, o3-mini |
OPENAI_API_KEY |
| OpenRouter | 100+ models (including anthropic/claude-3.5-sonnet, google/gemini-2.5-pro) |
OPENROUTER_API_KEY |
Switch providers on the fly with /provider <name> and models with /model <id>.
๐ง Built-in Tools
The agent has access to a comprehensive toolkit for software development:
File Operations
read_file_toolโ Read files with optional line rangeswrite_file_toolโ Create or overwrite files (with diff preview)edit_file_toolโ Surgical string replacement (preserves formatting)patch_file_toolโ Apply unified diffs (usespatchcommand or pure-Python fallback)
Search & Discovery
glob_toolโ Find files by pattern (e.g.,**/*.py,*.ts)grep_toolโ Search file contents with regexlist_directory_toolโ Explore directory structureget_project_files_toolโ List all source files by extension
Shell & System
run_command_toolโ Execute shell commands (with timeout protection)cd_toolโ Change working directory (native support, updates prompt)get_directory_toolโ Get current working directoryget_git_info_toolโ Git status, branch, recent commitsget_environment_toolโ OS, Python version, shell, user info
Session & Project
get_project_files_toolโ Enumerate project source files- Session management via
/sessionscommands (see below)
All tools include rich diff displays when modifying files, so you always see exactly what changed.
๐ฆ Installation
Prerequisites
- Python 3.9 or higher
- API key from at least one supported provider (Gemini, Anthropic, OpenAI, or OpenRouter)
From PyPI (Recommended)
pip install commandor-ai
From Source (Development)
git clone https://github.com/ravin-d-27/Commandor.git
cd Commandor
pip install -e .
Optional Dependencies
For enhanced experience, install additional packages:
pip install commandor-ai[dev] # Testing & linting tools
On Windows, pyreadline3 is automatically installed for better command-line editing.
๐ API Key Setup
Interactive Setup (Recommended)
Launch Commandor and run the setup wizard:
commandor
/setup
The wizard will:
- List available providers
- Prompt for API keys (or skip if you'll use environment variables)
- Let you choose a default provider
- Save everything to
~/.commandor/config
Manual Configuration
Edit the config file directly:
# Create the config directory
mkdir -p ~/.commandor
# Edit config
nano ~/.commandor/config
Example config:
default_provider: openrouter
providers:
gemini:
enabled: true
api_key: null # Will fall back to GEMINI_API_KEY env var
default_model: gemini-2.5-flash
anthropic:
enabled: true
api_key: "your-key-here" # Can store directly (file protected at 600)
default_model: claude-3.5-sonnet-20241022
openai:
enabled: true
api_key: null
default_model: gpt-4o
openrouter:
enabled: true
api_key: null
default_model: anthropic/claude-3.5-sonnet
agent:
max_iterations: 50
max_tokens_per_response: 4096
confirm_destructive: true
auto_scroll: true
ui:
color_scheme: auto
show_thinking: true
verbose: true
Environment Variables
You can also set API keys via environment variables (takes precedence over config file):
export GEMINI_API_KEY="your-key"
export ANTHROPIC_API_KEY="your-key"
export OPENAI_API_KEY="your-key"
export OPENROUTER_API_KEY="your-key"
๐ Usage
Interactive Terminal (TUI)
Launch the full Textual UI:
commandor
Features:
- Single-pane terminal: shell commands and AI chat coexist
- Real-time streaming of AI responses and tool outputs
- Command history (โ/โ)
- Tab completion for slash commands
- Rich syntax highlighting and markdown rendering
Quick start:
# Run a shell command
ls -la
# Ask a question
/chat what's the difference between async/await and threads?
# Autonomous task
/agent refactor this codebase to use type hints
# Use file references
/agent write tests for @src/main.py
Command-Line Mode (Non-Interactive)
Run a single task without entering the TUI:
# Autonomous agent
commandor -a "fix the bug in main.py"
commandor --agent "add comprehensive tests for the auth module"
# Chat mode
commandor --chat "explain how LangGraph works"
Options:
-p, --provider <name>โ Override the default provider-m, --model <id>โ Use a specific model--setupโ Run the interactive configuration wizard--versionโ Show version information
Examples with provider/model selection:
commandor -a "review this PR" -p anthropic -m claude-3-7-sonnet-20250219
commandor --chat "explain quantum computing" -p openai -m o1
โจ๏ธ Command Reference
AI Commands
| Command | Mode | Description |
|---|---|---|
/agent <task> |
Agent | Execute task independently using all tools |
/chat <message> |
Chat | Conversational Q&A (no tools) |
/retry |
Any | Re-run the last AI command |
/reset |
Any | Clear conversation memory, start fresh session |
Provider & Model Management
| Command | Description |
|---|---|
/providers |
List all providers with configuration status |
/provider <name> |
Switch active provider (gemini, anthropic, openai, openrouter) |
/model <id> |
Set model for current provider (e.g., claude-3-7-sonnet-20250219) |
Session Management
| Command | Description |
|---|---|
/sessions |
List all saved sessions with metadata |
/sessions save <name> |
Name the current session |
/sessions new <name> |
Create fresh named session and switch to it |
/sessions resume <name> |
Switch to a saved session (loads its conversation history) |
/sessions rename <old> <new> |
Rename a session |
/sessions delete <name> |
Delete a session and its checkpoints |
Configuration & Help
| Command | Description |
|---|---|
/setup |
Interactive API key configuration wizard |
/setup <provider> |
Configure a specific provider (e.g., /setup anthropic) |
/help |
Show comprehensive help with all commands |
/clear or Ctrl+L |
Clear the terminal screen |
/exit or Ctrl+Q |
Exit Commandor |
Export & Utilities
| Command | Description |
|---|---|
/export [filename] |
Save conversation as Markdown (default: commandor-YYYYMMDD-HHMMSS.md) |
Shell Commands
Any input that doesn't start with / is executed as a shell command in the current working directory.
Special handling:
cd <path>โ Changes the working directory natively (no subprocess). Supports~, relative paths, and environment variable expansion.- All other commands run in your default shell (
$SHELLor/bin/bash)
Examples:
# Navigate
cd ~/projects/myapp
# Git operations
git status
git diff HEAD~1
# Package managers
npm install
pip install -r requirements.txt
# Build & test
pytest tests/
python -m pytest --cov
# Project exploration
find . -name "*.py" | head -20
ls -R | grep ".js"
๐จ User Interface
Visual Design
- Theme: Batman-inspired dark mode (black background, gold accents)
- Layout: Single-pane terminal with input at bottom
- Streaming: Real-time token-by-token response rendering
- Panels:
- Status bar (top): provider, model, context usage, session name
- Log area (center): conversation history, tool outputs, errors
- Stream preview (bottom, temporary): live "thinking" indicator
Key Bindings
| Key | Action |
|---|---|
โ / โ |
Navigate command history |
Tab |
Auto-complete slash commands |
Ctrl+L |
Clear screen |
Ctrl+Q |
Quit |
Context Window Bar
The status bar displays context usage with a visual progress bar:
โโโโโโโโโ 12.3k/128k (9%) โ 12.3k tokens used of 128k limit
- Automatically detects model context limits
- Shows percentage of context window used
- Updates in real-time as conversation grows
When usage exceeds 80% of the context window, Commandor automatically summarizes the conversation history to free up space (you'll see a small โป context condensed indicator).
โ๏ธ Configuration
Config File Location
- Linux/macOS:
~/.commandor/config - Windows:
%USERPROFILE%\.commandor\config
Configuration Schema
# Default provider (gemini, anthropic, openai, openrouter)
default_provider: openrouter
# Provider-specific settings
providers:
gemini:
enabled: true # Enable/disable this provider
api_key: null # null = use GEMINI_API_KEY env var
default_model: gemini-2.5-flash
anthropic:
enabled: true
api_key: null # or set directly (file permissions: 600)
default_model: claude-3.5-sonnet-20241022
openai:
enabled: true
api_key: null
default_model: gpt-4o
openrouter:
enabled: true
api_key: null
default_model: anthropic/claude-3.5-sonnet
# Agent behavior
agent:
max_iterations: 50 # Maximum tool calls per task
max_tokens_per_response: 4096 # Max tokens per LLM response
confirm_destructive: true # Always ask before rm, drop_db, etc.
auto_scroll: true # Auto-scroll log during streaming
# UI settings
ui:
color_scheme: auto # auto/dark/light (Textual theme)
show_thinking: true # Show AI reasoning blocks
verbose: true # Show detailed tool output
Precedence Order for API Keys
- Config file (
api_keyfield) โ if set and non-null - Environment variable โ
GEMINI_API_KEY,ANTHROPIC_API_KEY, etc. .envfile โ Legacy support:~/.commandor/.env- None โ Provider will be marked as unconfigured
๐ฆ Docker Support
Pull the Image
docker pull ravind2704/commandor:latest
Run Interactively
docker run -it ravind2704/commandor
With API Keys (Recommended)
docker run -it \
-e GEMINI_API_KEY=your_key \
-e ANTHROPIC_API_KEY=your_key \
-e OPENAI_API_KEY=your_key \
-e OPENROUTER_API_KEY=your_key \
ravind2704/commandor
Mount Your Project
# Mount current directory into container
docker run -it \
-v $(pwd):/workspace \
-w /workspace \
-e OPENAI_API_KEY=your_key \
ravind2704/commandor
Build from Source
docker build -t commandor .
docker run -it commandor
๐๏ธ Project Structure
Commandor/
โโโ commandor/ # Main package
โ โโโ __init__.py # Package metadata
โ โโโ __main__.py # CLI entry point (argparse, TUI launcher)
โ โโโ main.py # Legacy terminal entry (kept for compatibility)
โ โโโ textual_app.py # Textual TUI application
โ โโโ agent_bridge.py # Streaming event bridge (TUI โ LangGraph)
โ โโโ config.py # ConfigManager, setup wizard, API key resolution
โ โโโ api_manager.py # (deprecated โ functionality moved to config.py)
โ โโโ session_manager.py # Named session persistence (JSON registry)
โ โ
โ โโโ agent/ # Agent core (singular, not plural)
โ โ โโโ __init__.py
โ โ โโโ executor.py # run_agent(), _run_* mode runners, metrics
โ โ โโโ lc_graph.py # LangGraph factory (build_agent_graph, etc.)
โ โ โโโ lc_models.py # build_model() โ provider model factory
โ โ โโโ lc_tools.py # All @tool-decorated functions
โ โ โโโ modes.py # Mode descriptions
โ โ
โ โโโ providers/ # AI provider integrations
โ โ โโโ __init__.py
โ โ โโโ base.py # AgentResult dataclass, provider base
โ โ # Note: Provider-specific logic (gemini, anthropic, openai, openrouter)
โ โ # is handled by LangChain integrations in agent/lc_models.py
โ โ
โ โโโ utils/ # Utility modules
โ โ โโโ __init__.py
โ โ โโโ file_ops.py # Low-level file read/write/edit/patch
โ โ โโโ shell.py # Shell execution, cd, git, env info
โ โ โโโ diff_display.py # Rich diff rendering for file changes
โ โ
โ โโโ widgets/ # Textual UI components
โ โโโ __init__.py
โ โโโ terminal_widget.py # Main unified terminal (shell + AI)
โ
โโโ tests/ # Test suite (if exists)
โโโ pyproject.toml # Modern Python packaging
โโโ setup.py # Legacy setuptools (still used for install)
โโโ requirements.txt # Dev dependencies (optional)
โโโ Dockerfile # Container image definition
โโโ LICENSE # MIT License
โโโ README.md # This file
Key Architecture Insights
LangGraph Integration:
- Uses
create_react_agent()from LangGraph for ReAct pattern - Checkpointer:
SqliteSaverat~/.commandor/checkpoints.dbfor persistence - Thread IDs scoped by mode:
{mode}_{uuid}to separate chat/agent/plan histories
Provider Integration:
- All provider logic (Gemini, Anthropic, OpenAI, OpenRouter) is in
agent/lc_models.py - Uses LangChain's
ChatGoogleGenerativeAI,ChatAnthropic,ChatOpenAIintegrations - No separate provider modules โ single factory function
build_model()handles all providers
Streaming Pipeline:
terminal_widget.pyโ_run_ai()โ spawns worker thread- Worker calls
agent_bridge.stream_agent_events() stream_agent_events()builds LLM vialc_models.py, constructs graph vialc_graph.py, calls_iter_graph()- Events (
ThinkingEvent,ToolCallEvent,ToolResultEvent, etc.) yielded back to UI TerminalWidget._on_ai_event()renders each event type with Rich formatting
Context Summarization:
- Hook
_make_summarize_hook()runs before each LLM call - Checks
_approx_tokens(messages)against threshold (80% of context window) - If exceeded, summarizes old messages into a single
HumanMessagewith summary - Prevents context overflow while preserving key information
Session Management:
session_manager.pymaintains a JSON registry at~/.commandor/sessions.json- Maps human-readable names to thread IDs (UUIDs)
- Checkpoints are stored in SQLite and survive restarts
- Sessions can be saved, resumed, renamed, and deleted via
/sessionscommands
๐งช Examples
Basic File Operations
# Read a file
/chat show me the contents of @commandor/config.py
# Create a new module
/agent create a new module @utils/helpers.py with functions for validation
# Edit a file
/agent in @app/main.py, replace the print statement with proper logging
# Apply a patch
/agent apply this diff to @src/components/Button.tsx:
# --- a/src/components/Button.tsx
# +++ b/src/components/Button.tsx
# @@ -10,7 +10,7 @@
# - return <button className="btn">{children}</button>
# + return <button className="btn primary">{children}</button>
Project Exploration
# Find all test files
/agent find all test files in the project
# Search for a function
/chat where is the authenticate_user function defined?
# Understand architecture
/plan analyze the project structure and document the main components
Shell + AI Hybrid
# Check git status first
git status
# Then ask AI to fix conflicts
/agent resolve the git conflicts in @src/auth.py
# Run tests, then fix failures
pytest tests/ -v
/agent fix the failing tests and re-run
Complex Agent Task
/agent implement OAuth2 login
# The agent will autonomously:
# 1. Explore the codebase
# 2. Create necessary files
# 3. Implement the feature
# 4. Run tests to verify
Session Management
# Start a task
/agent implement OAuth2 login
# Name it for later
/sessions save oauth-login
# Later, resume
/sessions resume oauth-login
# List all sessions
/sessions
# Delete old session
/sessions delete old-project
๐ Troubleshooting
"No API key found for provider 'X'"
Cause: The provider isn't configured with an API key.
Solutions:
- Run
/setupinside Commandor and enter your key - Set the environment variable (
export GEMINI_API_KEY=...) - Edit
~/.commandor/configand add the key under the provider - Test status:
/providers(shows โ/โ for each)
"Command not found" after installation
Cause: Scripts directory not in PATH or virtual environment not activated.
Solutions:
# Check if installed
pip show commandor-ai
# If in venv, activate it
source venv/bin/activate # Linux/macOS
venv\Scripts\activate # Windows
# Or use full path
python -m commandor
Context window exceeded / Memory issues
Cause: Very long conversations can hit model token limits.
Solutions:
- Commandor auto-summarizes at 80% capacity, but you can also:
- Use
/resetto start fresh - Start a new session:
/sessions new <name> - Use a model with larger context (e.g.,
gemini-2.5-prohas 2M tokens)
- Use
"Corrupt checkpoint" errors
Cause: SQLite database corruption (rare, usually from abrupt termination).
Solutions:
- Delete
~/.commandor/checkpoints.dbโ Commandor will recreate it - Sessions themselves (in
~/.commandor/sessions.json) are safe to keep
Tool execution fails (permission denied, file not found)
Tips:
- Always use
cd_toolto navigate to the correct project directory first - Check file paths are relative to CWD (shown in prompt)
- Some tools require files to exist; use
list_directory_toolto verify - For shell commands, ensure you have execute permissions
Textual UI glitches / display issues
Solutions:
- Update Textual:
pip install -U textual - Try a different color scheme: edit
~/.commandor/config, setui.color_scheme: dark - Disable live streaming: set
ui.verbose: false - Run with
TERM=xterm-256colorif colors are broken
Provider-specific errors
- Gemini: Ensure API key has Generative Language API enabled
- Anthropic: Check you're using an API key from console.anthropic.com
- OpenAI: Verify organization and billing are set up
- OpenRouter: Some models require credits; check your balance
๐งช Testing
Run the test suite
# Install dev dependencies
pip install -e ".[dev]"
# Run tests
pytest tests/ -v
# With coverage
pytest --cov=commandor
Manual smoke test
# Quick interactive test
commandor
/setup # configure a provider
/agent create a simple Python hello world script
Test provider connectivity
# From Python
from commandor.agent.executor import test_providers
results = test_providers()
print(results)
# Output: {'gemini': {'status': 'ok'}, 'anthropic': {'status': 'no_api_key'}, ...}
๐ ๏ธ Development
Setting Up a Dev Environment
# Clone
git clone https://github.com/ravin-d-27/Commandor.git
cd Commandor
# Create venv
python -m venv venv
source venv/bin/activate # or venv\Scripts\activate on Windows
# Install in editable mode with dev deps
pip install -e ".[dev]"
# Run locally
commandor --version
Code Style
- Python: Follow PEP 8, use
rufffor linting - Imports: Sort with
rufforisort - Types: Use type hints (checked with
mypy) - Commits: Conventional Commits recommended (feat:, fix:, docs:, etc.)
Pre-commit Hooks (optional)
pip install pre-commit
pre-commit install
# Runs ruff, mypy, etc. on staged files
Building & Publishing
# Build distribution
pip install build
python -m build
# Check
twine check dist/*
# Upload to PyPI (maintainers only)
twine upload dist/*
๐ค Contributing
Contributions are welcome and appreciated!
How to Contribute
- Report bugs: Open an issue with steps to reproduce, expected vs actual behavior, environment details
- Request features: Describe the use case and proposed solution
- Submit PRs:
- Fork the repo
- Create a feature branch (
git checkout -b feat/amazing-feature) - Make changes, add tests if applicable
- Ensure tests pass (
pytest) - Open a PR with clear description
Areas Needing Help
- Support for more providers (Groq, Together, etc.)
- Enhanced diff viewer (side-by-side, syntax highlighting)
- Export formats (JSON, HTML, PDF)
- Plugin system for custom tools
- Windows-specific improvements
- Performance optimizations for large repos
- Better error recovery and retry logic
Code of Conduct
Please be respectful and constructive. Harassment or toxic behavior will not be tolerated.
๐ License
MIT License โ see LICENSE file for full text.
Short version: Use this software for any purpose, modify it, distribute it. Just include the original license and copyright notice.
๐ Acknowledgments
Built with these amazing open-source projects:
- LangGraph โ Agent orchestration
- Textual โ TUI framework
- Rich โ Terminal formatting
- LangChain โ LLM abstractions
- OpenAI / Anthropic / Google โ Model providers
๐ Contact
Author: Ravin D
- GitHub: https://github.com/ravin-d-27
- Email: ravin.d3107@outlook.com
- Issues: https://github.com/ravin-d-27/Commandor/issues
โญ Support
If you find Commandor useful, please consider:
- Starring the repository on GitHub
- Reporting bugs and suggesting improvements
- Sharing with your network
- Contributing code or documentation
Your support helps keep the project alive! ๐
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 commandor_ai-0.2.1.tar.gz.
File metadata
- Download URL: commandor_ai-0.2.1.tar.gz
- Upload date:
- Size: 68.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8e075a09a3d3bd07cf9d42f8c6152b6c83f99cdbadd5cf1b3e1c8250f2a442b8
|
|
| MD5 |
15a350fb70a37fd645d11ce0b6c77344
|
|
| BLAKE2b-256 |
b74a1b21e8d67ec69c3fafd6378e2c1cbffc3965614620e9d9f49e8a77c42b3b
|
File details
Details for the file commandor_ai-0.2.1-py3-none-any.whl.
File metadata
- Download URL: commandor_ai-0.2.1-py3-none-any.whl
- Upload date:
- Size: 64.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
999b9acb0e57fd413eca5087ab0eb52801c80600cd54b5594cb06db8adc46264
|
|
| MD5 |
1bcd9c27b8de66f291cae5c5a35443a7
|
|
| BLAKE2b-256 |
b8f859fcb361914abd1fac1b141c15c8767f2289af76ea4b692e054beb22715d
|