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.
Files changed (62) hide show
  1. dostuff-0.1.0/LICENSE +21 -0
  2. dostuff-0.1.0/PKG-INFO +458 -0
  3. dostuff-0.1.0/README.md +420 -0
  4. dostuff-0.1.0/dostuff/__init__.py +2 -0
  5. dostuff-0.1.0/dostuff/agent/call_agent.py +44 -0
  6. dostuff-0.1.0/dostuff/agent/loop.py +161 -0
  7. dostuff-0.1.0/dostuff/agent/run_tool.py +52 -0
  8. dostuff-0.1.0/dostuff/cli.py +105 -0
  9. dostuff-0.1.0/dostuff/cli_tui.py +647 -0
  10. dostuff-0.1.0/dostuff/config.py +93 -0
  11. dostuff-0.1.0/dostuff/helpers/agent/append_step.py +11 -0
  12. dostuff-0.1.0/dostuff/helpers/agent/constants.py +187 -0
  13. dostuff-0.1.0/dostuff/helpers/agent/extract_text.py +13 -0
  14. dostuff-0.1.0/dostuff/helpers/agent/get_model_token_limit.py +11 -0
  15. dostuff-0.1.0/dostuff/helpers/agent/learn_from_session.py +52 -0
  16. dostuff-0.1.0/dostuff/helpers/agent/load_identity.py +17 -0
  17. dostuff-0.1.0/dostuff/helpers/agent/load_project_instructions.py +36 -0
  18. dostuff-0.1.0/dostuff/helpers/agent/manage_context.py +94 -0
  19. dostuff-0.1.0/dostuff/helpers/agent/save_memories_and_exit.py +49 -0
  20. dostuff-0.1.0/dostuff/helpers/mcp/load_mcp_config.py +32 -0
  21. dostuff-0.1.0/dostuff/helpers/mcp/mcp_oauth.py +229 -0
  22. dostuff-0.1.0/dostuff/helpers/memory/extract_episodic_memory.py +97 -0
  23. dostuff-0.1.0/dostuff/helpers/memory/extract_semantic_memories.py +66 -0
  24. dostuff-0.1.0/dostuff/helpers/memory/format_transcript.py +92 -0
  25. dostuff-0.1.0/dostuff/helpers/memory/resolve_memory_operation.py +49 -0
  26. dostuff-0.1.0/dostuff/helpers/skills/discover_skills.py +35 -0
  27. dostuff-0.1.0/dostuff/helpers/tools/generate_tool_schema.py +62 -0
  28. dostuff-0.1.0/dostuff/helpers/tools/resolve_safe_path.py +15 -0
  29. dostuff-0.1.0/dostuff/helpers/ui/__init__.py +0 -0
  30. dostuff-0.1.0/dostuff/helpers/ui/emit.py +24 -0
  31. dostuff-0.1.0/dostuff/lib/exceptions.py +11 -0
  32. dostuff-0.1.0/dostuff/lib/mcp/mcp_client.py +186 -0
  33. dostuff-0.1.0/dostuff/lib/mcp/mcp_client_registration_store.py +48 -0
  34. dostuff-0.1.0/dostuff/lib/mcp/mcp_tool_registry_store.py +78 -0
  35. dostuff-0.1.0/dostuff/lib/memory/episodic_memory_store.py +112 -0
  36. dostuff-0.1.0/dostuff/lib/memory/semantic_memory_store.py +51 -0
  37. dostuff-0.1.0/dostuff/lib/memory/session_store.py +198 -0
  38. dostuff-0.1.0/dostuff/lib/memory/types.py +36 -0
  39. dostuff-0.1.0/dostuff/lib/model.py +22 -0
  40. dostuff-0.1.0/dostuff/lib/tracing.py +78 -0
  41. dostuff-0.1.0/dostuff/memory/__init__.py +6 -0
  42. dostuff-0.1.0/dostuff/skills.py +3 -0
  43. dostuff-0.1.0/dostuff/tools/__init__.py +1 -0
  44. dostuff-0.1.0/dostuff/tools/bash/bash_command.py +63 -0
  45. dostuff-0.1.0/dostuff/tools/definitions.py +35 -0
  46. dostuff-0.1.0/dostuff/tools/delegate_to_subagent.py +74 -0
  47. dostuff-0.1.0/dostuff/tools/files/delete_file.py +33 -0
  48. dostuff-0.1.0/dostuff/tools/files/list_files.py +33 -0
  49. dostuff-0.1.0/dostuff/tools/files/read_file.py +21 -0
  50. dostuff-0.1.0/dostuff/tools/files/write_file.py +31 -0
  51. dostuff-0.1.0/dostuff/tools/get_current_datetime.py +17 -0
  52. dostuff-0.1.0/dostuff/tools/mcp/call_mcp_tool.py +83 -0
  53. dostuff-0.1.0/dostuff/tools/mcp/get_mcp_tool_details.py +19 -0
  54. dostuff-0.1.0/dostuff/tools/mcp/search_mcp_tools.py +55 -0
  55. dostuff-0.1.0/dostuff.egg-info/PKG-INFO +458 -0
  56. dostuff-0.1.0/dostuff.egg-info/SOURCES.txt +60 -0
  57. dostuff-0.1.0/dostuff.egg-info/dependency_links.txt +1 -0
  58. dostuff-0.1.0/dostuff.egg-info/entry_points.txt +2 -0
  59. dostuff-0.1.0/dostuff.egg-info/requires.txt +18 -0
  60. dostuff-0.1.0/dostuff.egg-info/top_level.txt +1 -0
  61. dostuff-0.1.0/pyproject.toml +58 -0
  62. 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
+ [![Python](https://img.shields.io/badge/Python-3.10+-3776ab?style=flat-square&logo=python&logoColor=white)](https://python.org)
46
+ [![litellm](https://img.shields.io/badge/litellm-any--provider-blueviolet?style=flat-square)](https://docs.litellm.ai/docs/providers)
47
+ [![MCP](https://img.shields.io/badge/MCP-compatible-success?style=flat-square)](https://modelcontextprotocol.io)
48
+ [![License](https://img.shields.io/badge/License-MIT-yellow?style=flat-square)](LICENSE)
49
+ [![textual](https://img.shields.io/badge/UI-textual-ff6b6b?style=flat-square)](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
+ ![TUI demo showing agent loop with tool call and response](./docs/demo.png)
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