A terminal-native AI coding agent with tool execution, MCP support, extensible hooks, and persistent conversations. Built in Rust with a TUI interface designed to stay out of your way.
Features
- Multi-Provider: Supports Anthropic Claude, OpenAI, and any OpenAI-compatible endpoint
- Tool Execution: Built-in file operations, shell commands, and pattern search
- Custom Tools: Define shell-backed tools in config.toml
- MCP Integration: Connect any Model Context Protocol server for extensible tooling
- Lifecycle Hooks: 22 events with blocking/modifying support via shell commands
- Slash Commands: Built-in and custom
/commandsaccessible from the TUI - Extension Packages: Install extensions from git with
dot install <url> - Persistent Sessions: SQLite-backed conversation history, resumable across restarts
- Agent Profiles: Define custom agents with specific models, prompts, and tool sets
- Skills System: Discovers and loads skill definitions from configurable directories
- Context-Aware: Auto-loads project-level and global
AGENTS.mdinstructions - Vim Keybindings: Modal editing with full vim-style navigation
Install
Or from source:
Setup
# Authenticate with a provider
# Or set environment variables
Usage
# Launch the TUI
# Resume a previous session
# Show config paths and current settings
# List MCP servers and discovered tools
# List installed extensions
# Install an extension from git
# Uninstall an extension
## Configuration
MCP Servers
[]
= ["npx", "-y", "@modelcontextprotocol/server-filesystem", "/tmp"]
= true
= {}
= 30
Agent Profiles
[]
= "Code review agent"
= "claude-sonnet-4-20250514"
= "You are a thorough code reviewer."
= true
[]
= false
Custom Providers
[]
= "openai"
= "https://proxy.example.com/v1"
= "MY_API_KEY"
= ["gpt-4o"]
= "gpt-4o"
Custom Tools
[]
= "Deploy to production"
= "scripts/deploy.sh"
= { = "object", = { = { = "string" } } }
= 60
Slash Commands
[]
= "Run code review"
= "scripts/review.sh"
= 30
Lifecycle Hooks
[]
= "scripts/notify.sh"
= 10
[]
= "scripts/log.sh"
Available events: session_start, session_end, before_prompt, after_prompt, before_tool_call, after_tool_call, before_compact, after_compact, model_switch, agent_switch, on_error, on_stream_start, on_stream_end, on_resume, on_user_input, on_tool_error, before_exit, on_thinking_start, on_thinking_end, on_title_generated, before_permission_check, on_context_load.
before_* hooks can block (exit non-zero) or modify (stdout replaces input). Other hooks are fire-and-forget.
Extension Packages
Extensions live in ~/.config/dot/extensions/ with an extension.toml manifest:
= "my-extension"
= "An example extension"
= "0.1.0"
[]
= "Run linter"
= "scripts/lint.sh"
[]
= "Deploy"
= "scripts/deploy.sh"
[]
= "scripts/notify.sh"
Architecture
src/
main.rs CLI entry point and provider/tool wiring
config.rs TOML configuration loading
extension.rs Extension trait, hooks, lifecycle events, script tools
command.rs Slash command registry
packages.rs Extension package discovery, install, uninstall
context.rs AGENTS.md discovery and injection
mcp.rs MCP client (stdio transport, JSON-RPC)
skills.rs Skill discovery and loading
agent/ Conversation loop, profiles, event types, hook integration
provider/ Provider trait + Anthropic and OpenAI implementations
tools/ Tool trait, file operations, shell execution
tui/ Ratatui-based interface, input handling, markdown rendering
auth/ OAuth and API key credential management
db/ SQLite session and message persistence
Development
Requires Rust nightly (edition 2024). Key dependencies: ratatui, crossterm, tokio, clap, reqwest, rusqlite, async-openai, syntect.
License
MIT