dostuff 0.1.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- dostuff-0.1.0/LICENSE +21 -0
- dostuff-0.1.0/PKG-INFO +458 -0
- dostuff-0.1.0/README.md +420 -0
- dostuff-0.1.0/dostuff/__init__.py +2 -0
- dostuff-0.1.0/dostuff/agent/call_agent.py +44 -0
- dostuff-0.1.0/dostuff/agent/loop.py +161 -0
- dostuff-0.1.0/dostuff/agent/run_tool.py +52 -0
- dostuff-0.1.0/dostuff/cli.py +105 -0
- dostuff-0.1.0/dostuff/cli_tui.py +647 -0
- dostuff-0.1.0/dostuff/config.py +93 -0
- dostuff-0.1.0/dostuff/helpers/agent/append_step.py +11 -0
- dostuff-0.1.0/dostuff/helpers/agent/constants.py +187 -0
- dostuff-0.1.0/dostuff/helpers/agent/extract_text.py +13 -0
- dostuff-0.1.0/dostuff/helpers/agent/get_model_token_limit.py +11 -0
- dostuff-0.1.0/dostuff/helpers/agent/learn_from_session.py +52 -0
- dostuff-0.1.0/dostuff/helpers/agent/load_identity.py +17 -0
- dostuff-0.1.0/dostuff/helpers/agent/load_project_instructions.py +36 -0
- dostuff-0.1.0/dostuff/helpers/agent/manage_context.py +94 -0
- dostuff-0.1.0/dostuff/helpers/agent/save_memories_and_exit.py +49 -0
- dostuff-0.1.0/dostuff/helpers/mcp/load_mcp_config.py +32 -0
- dostuff-0.1.0/dostuff/helpers/mcp/mcp_oauth.py +229 -0
- dostuff-0.1.0/dostuff/helpers/memory/extract_episodic_memory.py +97 -0
- dostuff-0.1.0/dostuff/helpers/memory/extract_semantic_memories.py +66 -0
- dostuff-0.1.0/dostuff/helpers/memory/format_transcript.py +92 -0
- dostuff-0.1.0/dostuff/helpers/memory/resolve_memory_operation.py +49 -0
- dostuff-0.1.0/dostuff/helpers/skills/discover_skills.py +35 -0
- dostuff-0.1.0/dostuff/helpers/tools/generate_tool_schema.py +62 -0
- dostuff-0.1.0/dostuff/helpers/tools/resolve_safe_path.py +15 -0
- dostuff-0.1.0/dostuff/helpers/ui/__init__.py +0 -0
- dostuff-0.1.0/dostuff/helpers/ui/emit.py +24 -0
- dostuff-0.1.0/dostuff/lib/exceptions.py +11 -0
- dostuff-0.1.0/dostuff/lib/mcp/mcp_client.py +186 -0
- dostuff-0.1.0/dostuff/lib/mcp/mcp_client_registration_store.py +48 -0
- dostuff-0.1.0/dostuff/lib/mcp/mcp_tool_registry_store.py +78 -0
- dostuff-0.1.0/dostuff/lib/memory/episodic_memory_store.py +112 -0
- dostuff-0.1.0/dostuff/lib/memory/semantic_memory_store.py +51 -0
- dostuff-0.1.0/dostuff/lib/memory/session_store.py +198 -0
- dostuff-0.1.0/dostuff/lib/memory/types.py +36 -0
- dostuff-0.1.0/dostuff/lib/model.py +22 -0
- dostuff-0.1.0/dostuff/lib/tracing.py +78 -0
- dostuff-0.1.0/dostuff/memory/__init__.py +6 -0
- dostuff-0.1.0/dostuff/skills.py +3 -0
- dostuff-0.1.0/dostuff/tools/__init__.py +1 -0
- dostuff-0.1.0/dostuff/tools/bash/bash_command.py +63 -0
- dostuff-0.1.0/dostuff/tools/definitions.py +35 -0
- dostuff-0.1.0/dostuff/tools/delegate_to_subagent.py +74 -0
- dostuff-0.1.0/dostuff/tools/files/delete_file.py +33 -0
- dostuff-0.1.0/dostuff/tools/files/list_files.py +33 -0
- dostuff-0.1.0/dostuff/tools/files/read_file.py +21 -0
- dostuff-0.1.0/dostuff/tools/files/write_file.py +31 -0
- dostuff-0.1.0/dostuff/tools/get_current_datetime.py +17 -0
- dostuff-0.1.0/dostuff/tools/mcp/call_mcp_tool.py +83 -0
- dostuff-0.1.0/dostuff/tools/mcp/get_mcp_tool_details.py +19 -0
- dostuff-0.1.0/dostuff/tools/mcp/search_mcp_tools.py +55 -0
- dostuff-0.1.0/dostuff.egg-info/PKG-INFO +458 -0
- dostuff-0.1.0/dostuff.egg-info/SOURCES.txt +60 -0
- dostuff-0.1.0/dostuff.egg-info/dependency_links.txt +1 -0
- dostuff-0.1.0/dostuff.egg-info/entry_points.txt +2 -0
- dostuff-0.1.0/dostuff.egg-info/requires.txt +18 -0
- dostuff-0.1.0/dostuff.egg-info/top_level.txt +1 -0
- dostuff-0.1.0/pyproject.toml +58 -0
- dostuff-0.1.0/setup.cfg +4 -0
dostuff-0.1.0/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Varun
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
dostuff-0.1.0/PKG-INFO
ADDED
|
@@ -0,0 +1,458 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: dostuff
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: DoStuff - AI agent harness with global CLI, pipx install, and persistent session storage
|
|
5
|
+
Author-email: Varun Kumawat <varunkumawatleap2@gmail.com>
|
|
6
|
+
License-Expression: MIT
|
|
7
|
+
Project-URL: Homepage, https://github.com/kVarunkk/DoStuff/blob/README.md
|
|
8
|
+
Project-URL: Repository, https://github.com/kVarunkk/DoStuff
|
|
9
|
+
Project-URL: Issues, https://github.com/kVarunkk/DoStuff/issues
|
|
10
|
+
Classifier: Development Status :: 4 - Beta
|
|
11
|
+
Classifier: Intended Audience :: Developers
|
|
12
|
+
Classifier: Programming Language :: Python :: 3
|
|
13
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
14
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
15
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
16
|
+
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
17
|
+
Requires-Python: >=3.10
|
|
18
|
+
Description-Content-Type: text/markdown
|
|
19
|
+
License-File: LICENSE
|
|
20
|
+
Requires-Dist: typer>=0.9.0
|
|
21
|
+
Requires-Dist: aiosqlite>=0.19.0
|
|
22
|
+
Requires-Dist: chromadb>=1.5.0
|
|
23
|
+
Requires-Dist: pydantic>=2.0
|
|
24
|
+
Requires-Dist: python-dotenv>=1.0
|
|
25
|
+
Requires-Dist: pyyaml>=6.0
|
|
26
|
+
Requires-Dist: litellm>=1.0
|
|
27
|
+
Requires-Dist: httpx>=0.27
|
|
28
|
+
Requires-Dist: pkce>=1.0
|
|
29
|
+
Requires-Dist: mcp>=1.0
|
|
30
|
+
Requires-Dist: opentelemetry-api>=1.20
|
|
31
|
+
Requires-Dist: opentelemetry-sdk>=1.20
|
|
32
|
+
Requires-Dist: textual>=0.50.0
|
|
33
|
+
Requires-Dist: opentelemetry-exporter-otlp-proto-grpc>=1.20
|
|
34
|
+
Provides-Extra: full
|
|
35
|
+
Requires-Dist: onnxruntime>=1.16; extra == "full"
|
|
36
|
+
Requires-Dist: grpcio>=1.52; extra == "full"
|
|
37
|
+
Dynamic: license-file
|
|
38
|
+
|
|
39
|
+
<div align="center">
|
|
40
|
+
|
|
41
|
+
# DoStuff
|
|
42
|
+
|
|
43
|
+
**A pip-installable AI agent harness with a Textual TUI, persistent sessions, and MCP tool support.**
|
|
44
|
+
|
|
45
|
+
[](https://python.org)
|
|
46
|
+
[](https://docs.litellm.ai/docs/providers)
|
|
47
|
+
[](https://modelcontextprotocol.io)
|
|
48
|
+
[](LICENSE)
|
|
49
|
+
[](https://textual.textualize.io)
|
|
50
|
+
|
|
51
|
+
[Install](#install) • [Quick start](#quick-start) • [Configuration](#configuration) • [TUI controls](#tui-controls) • [MCP servers](#mcp-servers) • [Skills](#skills) • [Troubleshooting](#troubleshooting)
|
|
52
|
+
|
|
53
|
+
</div>
|
|
54
|
+
|
|
55
|
+
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](https://docs.litellm.ai), and pluggable [MCP](https://modelcontextprotocol.io) tool servers. State lives in `~/.dostuff/`, so any project you launch `dostuff` from shares the same memory and sessions.
|
|
56
|
+
|
|
57
|
+

|
|
58
|
+
|
|
59
|
+
> [!TIP]
|
|
60
|
+
> If you have used `claude-code` or `aider`, this will feel familiar. DoStuff is opinionated, minimal, and easy to extend.
|
|
61
|
+
|
|
62
|
+
---
|
|
63
|
+
|
|
64
|
+
## Features
|
|
65
|
+
|
|
66
|
+
- **Textual TUI** with per-role colored messages, status bar, and a loading spinner
|
|
67
|
+
- **Multi-provider LLMs** via [litellm](https://docs.litellm.ai/docs/providers) — OpenAI, Anthropic, Gemini, Groq, Mistral, Ollama, OpenRouter
|
|
68
|
+
- **Persistent sessions** in SQLite; resume with `dostuff --session <id>`
|
|
69
|
+
- **Long-term memory** (semantic + episodic) backed by ChromaDB
|
|
70
|
+
- **MCP server support** — stdio (npx, uvx) and HTTP transports
|
|
71
|
+
- **Skills loader** — drop a `SKILL.md` in the right folder, restart, done
|
|
72
|
+
- **Per-tool timeout** (120s) to prevent hung servers
|
|
73
|
+
- **Token tracking** — per-turn and cumulative totals
|
|
74
|
+
- **Graceful exit** — `Ctrl+Q` or `/exit` saves, cleans up, and stops background workers
|
|
75
|
+
|
|
76
|
+
---
|
|
77
|
+
|
|
78
|
+
## Install
|
|
79
|
+
|
|
80
|
+
Install from PyPI:
|
|
81
|
+
|
|
82
|
+
```bash
|
|
83
|
+
pip install dostuff
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
This installs the `dostuff` command on your `PATH`. Done.
|
|
87
|
+
|
|
88
|
+
### Other install methods
|
|
89
|
+
|
|
90
|
+
For an isolated install with [pipx](https://pypa.github.io/pipx/):
|
|
91
|
+
|
|
92
|
+
```bash
|
|
93
|
+
pipx install dostuff
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
For development (editable mode, from a clone):
|
|
97
|
+
|
|
98
|
+
```bash
|
|
99
|
+
git clone https://github.com/<you>/dostuff.git
|
|
100
|
+
cd dostuff
|
|
101
|
+
pip install -e . # core
|
|
102
|
+
pip install -e ".[full]" # + onnxruntime + grpcio
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
Verify:
|
|
106
|
+
|
|
107
|
+
```bash
|
|
108
|
+
dostuff --help
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
---
|
|
112
|
+
|
|
113
|
+
## Quick start
|
|
114
|
+
|
|
115
|
+
```bash
|
|
116
|
+
# 1. Set up config and secrets
|
|
117
|
+
mkdir -p ~/.dostuff
|
|
118
|
+
cp config.example.yaml ~/.dostuff/config.yaml
|
|
119
|
+
cp .env.example ~/.dostuff/.env
|
|
120
|
+
nano ~/.dostuff/.env # add OPENAI_API_KEY=sk-...
|
|
121
|
+
|
|
122
|
+
# 2. Edit ~/.dostuff/config.yaml and set model.name
|
|
123
|
+
# (see config.example.yaml)
|
|
124
|
+
|
|
125
|
+
# 3. Launch the TUI
|
|
126
|
+
dostuff
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
In the TUI:
|
|
130
|
+
|
|
131
|
+
```text
|
|
132
|
+
> hi there
|
|
133
|
+
[agent replies]
|
|
134
|
+
|
|
135
|
+
> /exit
|
|
136
|
+
[session saved, goodbye]
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
> [!NOTE]
|
|
140
|
+
> No config? No `.env`? The TUI shows a clear message and lets you quit without crashing. See [Troubleshooting](#troubleshooting).
|
|
141
|
+
|
|
142
|
+
---
|
|
143
|
+
|
|
144
|
+
## CLI reference
|
|
145
|
+
|
|
146
|
+
| Command | Description |
|
|
147
|
+
| ------------------------ | ---------------------------------------------- |
|
|
148
|
+
| `dostuff` | Launch the interactive TUI |
|
|
149
|
+
| `dostuff --session <id>` | Resume a prior session |
|
|
150
|
+
| `dostuff --user <id>` | Override the user ID |
|
|
151
|
+
| `dostuff init` | Create `.dostuff/` in the current directory |
|
|
152
|
+
| `dostuff config` | Show resolved config paths and values |
|
|
153
|
+
| `dostuff doctor` | Health check (config, data dir, user ID) |
|
|
154
|
+
| `dostuff session-list` | List all past sessions with their working dirs |
|
|
155
|
+
|
|
156
|
+
---
|
|
157
|
+
|
|
158
|
+
## TUI controls
|
|
159
|
+
|
|
160
|
+
| Key / command | Action |
|
|
161
|
+
| ------------- | ----------------------------------- |
|
|
162
|
+
| `Enter` | Submit message |
|
|
163
|
+
| `Ctrl+J` | Insert a newline (multi-line input) |
|
|
164
|
+
| `/exit` | Save memories and quit |
|
|
165
|
+
| `Ctrl+Q` | Graceful quit with save |
|
|
166
|
+
| `/help` | Show available in-TUI commands |
|
|
167
|
+
|
|
168
|
+
**Visual elements:**
|
|
169
|
+
|
|
170
|
+
- **User messages** — blue background
|
|
171
|
+
- **Agent messages** — neutral
|
|
172
|
+
- **Tool calls and results** — teal background, truncated at 600 chars
|
|
173
|
+
- **Confirmations** — yellow background (respond with `y` or `n`)
|
|
174
|
+
- **Errors** — red background
|
|
175
|
+
- **Status bar** — `cwd • session-id • new/resumed • ↑total ↓total`
|
|
176
|
+
- **Loading** — `⏳ agent is thinking...` while waiting for the model
|
|
177
|
+
|
|
178
|
+
---
|
|
179
|
+
|
|
180
|
+
## Configuration
|
|
181
|
+
|
|
182
|
+
Config is layered, with later sources overriding earlier ones:
|
|
183
|
+
|
|
184
|
+
1. `~/.dostuff/config.yaml` — global defaults
|
|
185
|
+
2. `<cwd>/.dostuff/config.yaml` — per-project overrides
|
|
186
|
+
3. `~/.dostuff/.env` / `<cwd>/.dostuff/.env` — secrets
|
|
187
|
+
4. Environment variables — highest priority
|
|
188
|
+
|
|
189
|
+
### `config.yaml`
|
|
190
|
+
|
|
191
|
+
```yaml
|
|
192
|
+
# ~/.dostuff/config.yaml
|
|
193
|
+
data:
|
|
194
|
+
global_dir: ~/.dostuff/data
|
|
195
|
+
|
|
196
|
+
mcp:
|
|
197
|
+
config_path: ~/.dostuff/mcp_config.json
|
|
198
|
+
|
|
199
|
+
tracing:
|
|
200
|
+
enabled: false # default OFF (no 4317 noise)
|
|
201
|
+
exporter: "otlp" # otlp | console | none
|
|
202
|
+
|
|
203
|
+
model:
|
|
204
|
+
name: "openai/gpt-4o-mini" # litellm format: provider/model
|
|
205
|
+
api_key_env: "OPENAI_API_KEY" # name of the env var holding the key
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
See [`config.example.yaml`](./config.example.yaml) for a full template.
|
|
209
|
+
|
|
210
|
+
### `.env`
|
|
211
|
+
|
|
212
|
+
**Never put secrets in `config.yaml`.** Use `~/.dostuff/.env`:
|
|
213
|
+
|
|
214
|
+
```bash
|
|
215
|
+
# ~/.dostuff/.env (chmod 600 on Unix)
|
|
216
|
+
OPENAI_API_KEY=sk-...
|
|
217
|
+
GEMINI_API_KEY=AIza...
|
|
218
|
+
GROQ_API_KEY=gsk_...
|
|
219
|
+
TAVILY_API_KEY=tvly-...
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
### Override at runtime
|
|
223
|
+
|
|
224
|
+
```bash
|
|
225
|
+
MODEL=gemini/gemini-3.1-flash-lite dostuff
|
|
226
|
+
OTEL_ENABLED=true OTEL_EXPORTER=console dostuff
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
---
|
|
230
|
+
|
|
231
|
+
## Models
|
|
232
|
+
|
|
233
|
+
The `name` field uses [litellm format](https://docs.litellm.ai/docs/providers): `provider/model-name`.
|
|
234
|
+
|
|
235
|
+
| Provider | Model name | API key env |
|
|
236
|
+
| --------- | -------------------------------------- | ------------------- |
|
|
237
|
+
| OpenAI | `openai/gpt-4o-mini` | `OPENAI_API_KEY` |
|
|
238
|
+
| Anthropic | `anthropic/claude-3-5-sonnet-20240620` | `ANTHROPIC_API_KEY` |
|
|
239
|
+
| Gemini | `gemini/gemini-3.1-flash-lite` | `GEMINI_API_KEY` |
|
|
240
|
+
| Groq | `groq/llama-3.1-70b-versatile` | `GROQ_API_KEY` |
|
|
241
|
+
| Ollama | `ollama/llama3.1` | _(none)_ |
|
|
242
|
+
|
|
243
|
+
If `name` has no `/`, the `provider` field is auto-prepended.
|
|
244
|
+
|
|
245
|
+
---
|
|
246
|
+
|
|
247
|
+
## MCP servers
|
|
248
|
+
|
|
249
|
+
MCP servers extend the agent with new tools. Configure them in `~/.dostuff/mcp_config.json`.
|
|
250
|
+
|
|
251
|
+
**Discovery order:** `mcp.config_path` → `~/.dostuff/mcp_config.json` → `<cwd>/.dostuff/mcp_config.json` → `<cwd>/mcp_config.json`.
|
|
252
|
+
|
|
253
|
+
**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.
|
|
254
|
+
|
|
255
|
+
### Example config
|
|
256
|
+
|
|
257
|
+
```json
|
|
258
|
+
{
|
|
259
|
+
"mcpServers": {
|
|
260
|
+
"tavily": {
|
|
261
|
+
"transport": "stdio",
|
|
262
|
+
"command": "npx",
|
|
263
|
+
"args": ["-y", "@tavily/mcp-server"],
|
|
264
|
+
"env": { "TAVILY_API_KEY": "tvly-..." }
|
|
265
|
+
},
|
|
266
|
+
"github": {
|
|
267
|
+
"transport": "stdio",
|
|
268
|
+
"command": "uvx",
|
|
269
|
+
"args": ["mcp-server-github"],
|
|
270
|
+
"env": { "GITHUB_TOKEN": "ghp_..." }
|
|
271
|
+
},
|
|
272
|
+
"remote": {
|
|
273
|
+
"transport": "http",
|
|
274
|
+
"url": "https://mcp.example.com/sse",
|
|
275
|
+
"headers": { "Authorization": "Bearer xxx" }
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
```
|
|
280
|
+
|
|
281
|
+
| Field | Required for | Notes |
|
|
282
|
+
| ----------- | ------------ | ------------------------------ |
|
|
283
|
+
| `transport` | optional | `stdio` (default) or `http` |
|
|
284
|
+
| `command` | stdio | Executable (`npx`, `uvx`, ...) |
|
|
285
|
+
| `args` | stdio | Argument list |
|
|
286
|
+
| `env` | stdio | Env vars for the child process |
|
|
287
|
+
| `url` | http | Remote MCP server URL |
|
|
288
|
+
| `headers` | http | HTTP headers |
|
|
289
|
+
|
|
290
|
+
MCP connections start in a background worker, so the TUI never blanks during boot. Each server is announced with a `✓` or `✗` in the message area.
|
|
291
|
+
|
|
292
|
+
To force a re-registration, delete:
|
|
293
|
+
|
|
294
|
+
```bash
|
|
295
|
+
rm ~/.dostuff/data/mcp_client_registrations.json
|
|
296
|
+
```
|
|
297
|
+
|
|
298
|
+
---
|
|
299
|
+
|
|
300
|
+
## Skills
|
|
301
|
+
|
|
302
|
+
Skills are markdown documents that teach the agent new workflows. Each is a directory with a `SKILL.md` (frontmatter + body).
|
|
303
|
+
|
|
304
|
+
**Discovered from (in order):**
|
|
305
|
+
|
|
306
|
+
1. `<cwd>/.dostuff/skills/`
|
|
307
|
+
2. `<cwd>/.agents/skills/`
|
|
308
|
+
3. `~/.dostuff/skills/`
|
|
309
|
+
4. `~/.agents/skills/`
|
|
310
|
+
5. `<cwd>/skills/`
|
|
311
|
+
|
|
312
|
+
**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.
|
|
313
|
+
|
|
314
|
+
**Example structure:**
|
|
315
|
+
|
|
316
|
+
```text
|
|
317
|
+
~/.agents/skills/
|
|
318
|
+
└── my-skill/
|
|
319
|
+
├── SKILL.md # required
|
|
320
|
+
└── helpers/ # optional
|
|
321
|
+
```
|
|
322
|
+
|
|
323
|
+
**`SKILL.md`:**
|
|
324
|
+
|
|
325
|
+
```markdown
|
|
326
|
+
---
|
|
327
|
+
name: my-skill
|
|
328
|
+
description: One-line description of what this skill does
|
|
329
|
+
---
|
|
330
|
+
|
|
331
|
+
# My Skill
|
|
332
|
+
|
|
333
|
+
Detailed instructions for the agent go here.
|
|
334
|
+
```
|
|
335
|
+
|
|
336
|
+
Run `dostuff init` to bootstrap a local `.dostuff/skills/` folder. Restart the agent after adding new skills.
|
|
337
|
+
|
|
338
|
+
---
|
|
339
|
+
|
|
340
|
+
## Sessions and memory
|
|
341
|
+
|
|
342
|
+
- **DB:** `~/.dostuff/data/sessions.db` (SQLite)
|
|
343
|
+
- **Resume:** `dostuff --session <id>`
|
|
344
|
+
- **List:** `dostuff session-list`
|
|
345
|
+
- **Memory stores:** `~/.dostuff/data/chroma/`
|
|
346
|
+
- Semantic (key/value facts)
|
|
347
|
+
- Episodic (events with summaries and timestamps)
|
|
348
|
+
- **Saved on:** `/exit` or `Ctrl+Q`
|
|
349
|
+
|
|
350
|
+
Long-term memory survives `pip install . --upgrade` because it lives in the user's home directory, not in the package.
|
|
351
|
+
|
|
352
|
+
---
|
|
353
|
+
|
|
354
|
+
## Tracing (opt-in)
|
|
355
|
+
|
|
356
|
+
Tracing is **OFF by default** to avoid spurious `localhost:4317` errors.
|
|
357
|
+
|
|
358
|
+
```yaml
|
|
359
|
+
# ~/.dostuff/config.yaml
|
|
360
|
+
tracing:
|
|
361
|
+
enabled: true
|
|
362
|
+
exporter: "console" # or "otlp"
|
|
363
|
+
endpoint: "localhost:4317"
|
|
364
|
+
```
|
|
365
|
+
|
|
366
|
+
Or via env:
|
|
367
|
+
|
|
368
|
+
```bash
|
|
369
|
+
OTEL_ENABLED=true OTEL_EXPORTER=console dostuff
|
|
370
|
+
```
|
|
371
|
+
|
|
372
|
+
---
|
|
373
|
+
|
|
374
|
+
## Troubleshooting
|
|
375
|
+
|
|
376
|
+
> [!WARNING]
|
|
377
|
+
> TUI says **"No LLM configured"**
|
|
378
|
+
>
|
|
379
|
+
> Set `model.name` in `~/.dostuff/config.yaml` and add the API key to `~/.dostuff/.env`. See [Quick start](#quick-start).
|
|
380
|
+
|
|
381
|
+
> [!WARNING]
|
|
382
|
+
> **Connection closed** (MCP tool)
|
|
383
|
+
>
|
|
384
|
+
> The MCP server disconnected. Check the command and logs. Force a reconnect:
|
|
385
|
+
>
|
|
386
|
+
> ```bash
|
|
387
|
+
> rm ~/.dostuff/data/mcp_client_registrations.json
|
|
388
|
+
> dostuff
|
|
389
|
+
> ```
|
|
390
|
+
|
|
391
|
+
> [!WARNING]
|
|
392
|
+
> **MarkupError** when a tool returns a long URL
|
|
393
|
+
>
|
|
394
|
+
> Fixed in the current version. Update:
|
|
395
|
+
>
|
|
396
|
+
> ```bash
|
|
397
|
+
> pip install --upgrade dostuff
|
|
398
|
+
> ```
|
|
399
|
+
|
|
400
|
+
> [!WARNING]
|
|
401
|
+
> **Tracing errors / `localhost:4317` retrying**
|
|
402
|
+
>
|
|
403
|
+
> Tracing is OFF by default. If you enabled it and have no collector, set:
|
|
404
|
+
>
|
|
405
|
+
> ```bash
|
|
406
|
+
> OTEL_ENABLED=false dostuff
|
|
407
|
+
> ```
|
|
408
|
+
|
|
409
|
+
> [!WARNING]
|
|
410
|
+
> **Session not resuming**
|
|
411
|
+
>
|
|
412
|
+
> Use `dostuff session-list` to find the session ID. Each session also stores the working directory it was started from.
|
|
413
|
+
|
|
414
|
+
> [!WARNING]
|
|
415
|
+
> **`pip install .` fails**
|
|
416
|
+
>
|
|
417
|
+
> Requires Python 3.10+. Upgrade pip first:
|
|
418
|
+
>
|
|
419
|
+
> ```bash
|
|
420
|
+
> pip install --upgrade pip
|
|
421
|
+
> ```
|
|
422
|
+
|
|
423
|
+
---
|
|
424
|
+
|
|
425
|
+
## Project structure
|
|
426
|
+
|
|
427
|
+
```text
|
|
428
|
+
dostuff/
|
|
429
|
+
├── cli_tui.py # Textual App + adapter
|
|
430
|
+
├── cli.py # typer CLI entrypoint
|
|
431
|
+
├── config.py # layered config (env > project > global > default)
|
|
432
|
+
├── agent/
|
|
433
|
+
│ ├── loop.py # agent loop, tool dispatch, token tracking
|
|
434
|
+
│ ├── call_agent.py # LLM call wrapper
|
|
435
|
+
│ └── run_tool.py # tool execution
|
|
436
|
+
├── lib/
|
|
437
|
+
│ ├── tracing.py # opt-in OpenTelemetry tracing
|
|
438
|
+
│ ├── model.py # model resolution
|
|
439
|
+
│ ├── memory/ # SQLite + ChromaDB stores
|
|
440
|
+
│ └── mcp/ # MCP client and registries
|
|
441
|
+
├── helpers/
|
|
442
|
+
│ ├── skills/ # skill discovery
|
|
443
|
+
│ ├── agent/ # identity, constants, exit handlers
|
|
444
|
+
│ ├── mcp/ # config loading
|
|
445
|
+
│ └── ui/ # emit shim
|
|
446
|
+
└── tools/ # tool definitions
|
|
447
|
+
├── bash/
|
|
448
|
+
├── files/
|
|
449
|
+
└── mcp/
|
|
450
|
+
```
|
|
451
|
+
|
|
452
|
+
---
|
|
453
|
+
|
|
454
|
+
## Project metadata
|
|
455
|
+
|
|
456
|
+
- **Author:** [varun](mailto:varunkumawatleap2@gmail.com)
|
|
457
|
+
- **Repository:** https://github.com/kVarunkk/DoStuff
|
|
458
|
+
- **Issues:** https://github.com/kVarunkk/DoStuff/issues
|