Skip to main content

DoStuff

A pip-installable AI agent harness with a Textual TUI, persistent sessions, and MCP tool support.

PyPI

Python litellm MCP License textual

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.md in 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+Q or /exit saves, cleans up, and stops background workers
  • Clean Cancellation — Escape can 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 plus compaction_notes + last_input_tokens
  • Auto & Manual Compaction — Manual /compact runs 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 into compaction_notes which 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 y or n)
  • 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:

  1. ~/.dostuff/config.yaml — global defaults
  2. <cwd>/.dostuff/config.yaml — per-project overrides
  3. 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):

  1. <cwd>/.dostuff/skills/
  2. <cwd>/.agents/skills/
  3. ~/.dostuff/skills/
  4. ~/.agents/skills/
  5. <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: /exit or Ctrl+Q
  • Compacted working_history — preserved in working_history; session_steps kept as full audit; compaction_notes merged with existing notes on each compact
  • Token persistence — prompt_tokens / completion_tokens / total_tokens / last_input_tokens saved 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

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)

Source distribution for dostuff 0.1.5
File Size Uploaded
dostuff-0.1.5.tar.gz 71.6 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for dostuff 0.1.5
File Interpreter ABI Platform
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

Release history Release notifications | RSS feed

0.1.6

2 release files

This release

0.1.5 This release

2 release files

0.1.4

2 release files

0.1.3

2 release files

0.1.2

2 release files

0.1.1

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page