DoStuff
A pip-installable AI agent harness with a Textual TUI, persistent sessions, and MCP tool support.
Install • Quick start • Configuration • TUI controls • MCP servers • Skills • Troubleshooting
DoStuff is a terminal AI agent that runs anywhere pip runs. It gives you a full interactive session with persistent memory, multi-provider LLM support via litellm, and pluggable MCP tool servers. State lives in ~/.dostuff/, so any project you launch dostuff from shares the same memory and sessions.
Features
- Textual TUI with per-role colored messages, status bar, and a loading/timer spinner
- Multi-provider LLMs via litellm — OpenAI, Anthropic, Gemini, Groq, Mistral, Ollama, OpenRouter
- Persistent sessions in SQLite; resume with
dostuff --session <id> - Long-term memory (semantic + episodic) backed by ChromaDB
- MCP server support — stdio (npx, uvx) and HTTP transports
- Skills loader — drop a
SKILL.mdin the right folder, restart, done - Per-tool timeout (120s) to prevent hung servers
- Token tracking — per-turn and cumulative totals displayed live
- Graceful exit —
Ctrl+Qor/exitsaves, cleans up, and stops background workers - Clean Cancellation —
Escapecan cancel in-flight agent turns cleanly without corrupting the session - 2-state session split —
session_steps(full audit) /working_history(LLM payload); DB persists both pluscompaction_notes+last_input_tokens - Auto & Manual Compaction — Manual
/compactruns compaction and saves it. Auto-compaction triggers automatically during the agent loop if context usage (last_input_tokens) exceeds 50% of the model's token limit. It keeps at least 15% or 20k tokens of the most recent steps in the working history, summarizing the rest intocompaction_noteswhich are appended to system instructions. - Tracing (opt-in) — OTLP tracing support built into
lib/tracing.py
Install
Install from PyPI:
pip install dostuff
This installs the dostuff command on your PATH. Done.
Other install methods
For an isolated install with pipx:
pipx install dostuff
For development (editable mode, from a clone):
git clone https://github.com/<you>/dostuff.git
cd dostuff
pip install -e . # core
pip install -e ".[full]" # + onnxruntime + grpcio
Verify:
dostuff --help
Quick start
# 1. Set up config and secrets
mkdir -p ~/.dostuff
cp config.example.yaml ~/.dostuff/config.yaml
cp .env.example ~/.dostuff/.env
nano ~/.dostuff/.env # add keys (e.g., OPENAI_API_KEY=sk-...)
# 2. cd to your project root
cd your_project
# 3. Launch the TUI
dostuff
In the TUI:
> hi there
[agent replies]
> /exit
[session saved, goodbye]
CLI reference
| Command | Description |
|---|---|
dostuff |
Launch the interactive TUI |
dostuff --session <id> |
Resume a prior session |
dostuff init |
Create .dostuff/ config/skills in current dir |
dostuff config |
Show resolved config paths and values |
dostuff doctor |
Health check (config, data dir, user ID) |
dostuff session-list |
List all past sessions with their working dirs |
TUI controls
| Key / command | Action |
|---|---|
Enter |
Submit message |
Ctrl+J |
Insert a newline (multi-line input) |
/exit |
Save memories and quit |
/clear |
Clear chat and session history |
/compact |
Manually trigger context compaction |
Ctrl+Q |
Graceful quit with save |
Escape |
Cancel in-flight turn |
/help |
Show available in-TUI commands |
Visual elements:
- User messages — blue background
- Agent messages — neutral
- Tool calls and results — teal/green background
- Confirmations — yellow background (respond with
yorn) - Errors — red background
- Status bar —
cwd • session-id • active model • prompt/completion token rates • context usage % • processing timer - Loading —
Working...or streamed thoughts displayed live
Configuration
Config is layered, with later sources overriding earlier ones:
~/.dostuff/config.yaml— global defaults<cwd>/.dostuff/config.yaml— per-project overrides- Environment variables — highest priority
config.yaml
mcp:
config_path: ~/.dostuff/mcp_config.json
tracing:
enabled: true # default OFF
exporter: "otlp" # otlp | none
# Multi-model selection: active marks the selected model
models:
- name: "openai/gpt-4o-mini"
provider: "openai"
active: true
- name: "gemini/gemini-3.1-flash-lite"
provider: "gemini"
active: false
See config.example.yaml for a full template.
.env
Never put secrets in config.yaml. Use ~/.dostuff/.env or project-local <cwd>/.dostuff/.env:
# ~/.dostuff/.env (chmod 600 on Unix)
OPENAI_API_KEY=sk-...
GEMINI_API_KEY=AIza...
GROQ_API_KEY=gsk_...
TAVILY_API_KEY=tvly-...
Override at runtime
MODEL=gemini/gemini-3.1-flash-lite dostuff
OTEL_ENABLED=true OTEL_EXPORTER=otlp dostuff
Models
The model resolution maps model names (using litellm format: provider/model-name) or derives them if the provider prefix is missing:
| Provider | Example Model name | API key env |
|---|---|---|
| OpenAI | openai/gpt-4o-mini |
OPENAI_API_KEY |
| Anthropic | anthropic/claude-3-5-sonnet-20240620 |
ANTHROPIC_API_KEY |
| Gemini | gemini/gemini-3.1-flash-lite |
GEMINI_API_KEY |
| Groq | groq/llama-3.1-70b-versatile |
GROQ_API_KEY |
| Ollama | ollama/llama3.1 |
(none) |
If name has no /, the provider prefix is dynamically inferred from the model name prefix or configured provider fields.
MCP servers
MCP servers extend the agent with new tools. Configure them in ~/.dostuff/mcp_config.json.
Discovery order: mcp.config_path → ~/.dostuff/mcp_config.json → <cwd>/.dostuff/mcp_config.json → <cwd>/mcp_config.json.
Conflict resolution: No merge — the first found config wins. If ~/.dostuff/mcp_config.json exists, the project-level .dostuff/mcp_config.json is silently ignored. To use a custom path, set mcp.config_path in config.yaml — that takes highest priority.
Example config
{
"mcpServers": {
"tavily": {
"transport": "stdio",
"command": "npx",
"args": ["-y", "@tavily/mcp-server"],
"env": { "TAVILY_API_KEY": "tvly-..." }
},
"github": {
"transport": "stdio",
"command": "uvx",
"args": ["mcp-server-github"],
"env": { "GITHUB_TOKEN": "ghp_..." }
},
"remote": {
"transport": "http",
"url": "https://mcp.example.com/sse",
"headers": { "Authorization": "Bearer xxx" }
}
}
}
| Field | Required for | Notes |
|---|---|---|
transport |
optional | stdio (default) or http |
command |
stdio | Executable (npx, uvx, ...) |
args |
stdio | Argument list |
env |
stdio | Env vars for the child process |
url |
http | Remote MCP server URL |
headers |
http | HTTP headers |
MCP connections start in a background worker, so the TUI never blanks during boot. Each server is announced in the chat area upon successful or failed connection.
To force a re-registration, delete:
rm ~/.dostuff/data/mcp_client_registrations.json
Skills
Skills are directories containing a SKILL.md (frontmatter with name and description + instructions body).
Discovered from (in order):
<cwd>/.dostuff/skills/<cwd>/.agents/skills/~/.dostuff/skills/~/.agents/skills/<cwd>/skills/
Conflict resolution: No deduplication. If two skills share the same name (from different directories), both are loaded and passed to the model — the agent may see the same skill twice with different location paths. To avoid confusion, keep names unique across the search paths.
Example structure:
~/.agents/skills/
└── my-skill/
└── SKILL.md # required
SKILL.md:
---
name: my-skill
description: One-line description of what this skill does
---
# My Skill
Detailed instructions for the agent go here.
Run dostuff init to bootstrap a local .dostuff/skills/ folder. Restart the agent after adding new skills.
Sessions and memory
- DB:
~/.dostuff/data/sessions.db(SQLite) - Resume:
dostuff --session <id> - List:
dostuff session-list - Memory stores:
~/.dostuff/data/chroma/- Semantic (key/value facts)
- Episodic (events with summaries and timestamps)
- Saved on:
/exitorCtrl+Q - Compacted working_history — preserved in
working_history;session_stepskept as full audit;compaction_notesmerged with existing notes on each compact - Token persistence —
prompt_tokens/completion_tokens/total_tokens/last_input_tokenssaved to DB; resume restores percent from DB meta
Long-term memory survives pip install . --upgrade because it lives in the user's home directory, not in the package.
Tracing (opt-in)
Tracing is OFF by default to avoid spurious endpoint connection errors.
# ~/.dostuff/config.yaml
tracing:
enabled: true
exporter: "otlp"
endpoint: "localhost:4317"
Or via env:
OTEL_ENABLED=true OTEL_EXPORTER=otlp dostuff
Troubleshooting
Project structure
dostuff/
├── agent/ # agent loop, tool dispatch, token tracking
│ ├── call_agent.py # litellm agent call wrapper with retry/retry-delay logic
│ ├── loop.py # main execution loop, auto-compaction and tool coordination
│ └── run_tool.py # executes tool calls safely with optional timeouts
├── helpers/ # sub-modules for agent, mcp, memory, skills, tools, ui
│ ├── agent/ # state, exit handlers, system prompts, token limit utilities
│ ├── mcp/ # config loading, oauth
│ ├── memory/ # transcript formatting and memory extractors
│ ├── skills/ # skill discovery logic
│ ├── tools/ # schemas and path resolution
│ └── ui/ # event emission shims
├── lib/ # core logic
│ ├── exceptions.py # validation, confirmation, and workflow exceptions
│ ├── mcp/ # mcp transport client & local registrations
│ ├── memory/ # semantic, episodic, and session stores
│ ├── model.py # model and provider resolution
│ └── tracing.py # opentelemetry tracing bootstrap
├── memory/ # DB management
│ └── __init__.py # DB initiation exports
├── tools/ # defined tools
│ ├── bash/ # terminal command execution tools
│ ├── files/ # file write, delete, list, and read utilities
│ └── mcp/ # mcp tool search, detail, and execution wrappers
├── cli.py # CLI typer entrypoints and doctor checkup utilities
├── cli_tui.py # Textual TUI Application and adapter translates state
├── config.py # layered config loader supporting project/global yaml and multi-model configuration
└── skills.py # skills loader re-exports
Project metadata
- Author: varun
- Repository: https://github.com/kVarunkk/DoStuff
- Issues: https://github.com/kVarunkk/DoStuff/issues
Metadata
Release files for dostuff 0.1.5
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| dostuff-0.1.5.tar.gz | 71.6 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| dostuff-0.1.5-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 152.2 kB
Release files / dostuff-0.1.5.tar.gz
| Download URL | dostuff-0.1.5.tar.gz |
|---|---|
| Size | 71.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
9e2d1fbf34cbbc878c30f5b84a0e504151e456e4d02e03a160a85455e60dc06a
|
|
BLAKE2b-256 checksum How to use checksums |
3d1c3bf88f4b9405ecd7831fdb35e6460447b7d0d7c0120fc0b858e0c9632e03
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.14.0
|
Release files / dostuff-0.1.5-py3-none-any.whl
| Download URL | dostuff-0.1.5-py3-none-any.whl |
|---|---|
| Size | 80.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
fe2e9dda118a0e82a1db52fff3ccd858e225a1ec8e7d005c90acdcff254b4445
|
|
BLAKE2b-256 checksum How to use checksums |
fce972f9f55b232e151ef9dfeb8cef2c977cb0f2639ee19be242ea3d78371d15
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.14.0
|