devduck 0.5.4__tar.gz → 0.7.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.
Potentially problematic release.
This version of devduck might be problematic. Click here for more details.
- {devduck-0.5.4 → devduck-0.7.0}/PKG-INFO +158 -8
- {devduck-0.5.4 → devduck-0.7.0}/README.md +157 -7
- {devduck-0.5.4 → devduck-0.7.0}/action.yml +1 -1
- devduck-0.7.0/devduck/__init__.py +1787 -0
- {devduck-0.5.4 → devduck-0.7.0}/devduck/_version.py +3 -3
- {devduck-0.5.4 → devduck-0.7.0}/devduck/tools/__init__.py +3 -0
- {devduck-0.5.4 → devduck-0.7.0}/devduck/tools/agentcore_config.py +1 -0
- {devduck-0.5.4 → devduck-0.7.0}/devduck/tools/agentcore_invoke.py +1 -0
- {devduck-0.5.4 → devduck-0.7.0}/devduck/tools/install_tools.py +103 -2
- {devduck-0.5.4 → devduck-0.7.0}/devduck/tools/ipc.py +4 -1
- devduck-0.7.0/devduck/tools/state_manager.py +292 -0
- {devduck-0.5.4 → devduck-0.7.0}/devduck/tools/tcp.py +6 -0
- {devduck-0.5.4 → devduck-0.7.0}/devduck/tools/websocket.py +7 -1
- {devduck-0.5.4 → devduck-0.7.0}/devduck.egg-info/PKG-INFO +158 -8
- {devduck-0.5.4 → devduck-0.7.0}/devduck.egg-info/SOURCES.txt +2 -0
- devduck-0.7.0/docs/mac-os-tray.jpg +0 -0
- devduck-0.5.4/devduck/__init__.py +0 -1173
- {devduck-0.5.4 → devduck-0.7.0}/.github/workflows/agent.yml +0 -0
- {devduck-0.5.4 → devduck-0.7.0}/.gitignore +0 -0
- {devduck-0.5.4 → devduck-0.7.0}/LICENSE +0 -0
- {devduck-0.5.4 → devduck-0.7.0}/MANIFEST.in +0 -0
- {devduck-0.5.4 → devduck-0.7.0}/agent_runner.py +0 -0
- {devduck-0.5.4 → devduck-0.7.0}/devduck/__main__.py +0 -0
- {devduck-0.5.4 → devduck-0.7.0}/devduck/agentcore_handler.py +0 -0
- {devduck-0.5.4 → devduck-0.7.0}/devduck/test_redduck.py +0 -0
- {devduck-0.5.4 → devduck-0.7.0}/devduck/tools/_ambient_input.py +0 -0
- {devduck-0.5.4 → devduck-0.7.0}/devduck/tools/_tray_app.py +0 -0
- {devduck-0.5.4 → devduck-0.7.0}/devduck/tools/agentcore_agents.py +0 -0
- {devduck-0.5.4 → devduck-0.7.0}/devduck/tools/agentcore_logs.py +0 -0
- {devduck-0.5.4 → devduck-0.7.0}/devduck/tools/ambient.py +0 -0
- {devduck-0.5.4 → devduck-0.7.0}/devduck/tools/create_subagent.py +0 -0
- {devduck-0.5.4 → devduck-0.7.0}/devduck/tools/mcp_server.py +0 -0
- {devduck-0.5.4 → devduck-0.7.0}/devduck/tools/store_in_kb.py +0 -0
- {devduck-0.5.4 → devduck-0.7.0}/devduck/tools/system_prompt.py +0 -0
- {devduck-0.5.4 → devduck-0.7.0}/devduck/tools/tray.py +0 -0
- {devduck-0.5.4 → devduck-0.7.0}/devduck/tools/use_github.py +0 -0
- {devduck-0.5.4 → devduck-0.7.0}/devduck.egg-info/dependency_links.txt +0 -0
- {devduck-0.5.4 → devduck-0.7.0}/devduck.egg-info/entry_points.txt +0 -0
- {devduck-0.5.4 → devduck-0.7.0}/devduck.egg-info/requires.txt +0 -0
- {devduck-0.5.4 → devduck-0.7.0}/devduck.egg-info/top_level.txt +0 -0
- {devduck-0.5.4 → devduck-0.7.0}/docs/index.html +0 -0
- {devduck-0.5.4 → devduck-0.7.0}/pyproject.toml +0 -0
- {devduck-0.5.4 → devduck-0.7.0}/requirements.txt +0 -0
- {devduck-0.5.4 → devduck-0.7.0}/setup-aws-oidc.sh +0 -0
- {devduck-0.5.4 → devduck-0.7.0}/setup.cfg +0 -0
- {devduck-0.5.4 → devduck-0.7.0}/test.py +0 -0
- {devduck-0.5.4 → devduck-0.7.0}/tools/__init__.py +0 -0
- {devduck-0.5.4 → devduck-0.7.0}/tools/fetch_github_tool.py +0 -0
- {devduck-0.5.4 → devduck-0.7.0}/tools/gist.py +0 -0
- {devduck-0.5.4 → devduck-0.7.0}/tools/github_tools.py +0 -0
- {devduck-0.5.4 → devduck-0.7.0}/tools/scraper.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: devduck
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.7.0
|
|
4
4
|
Summary: 🦆 Extreme minimalist self-adapting AI agent - one file, self-healing, runtime dependencies
|
|
5
5
|
Author-email: Cagatay Cali <cagataycali@icloud.com>
|
|
6
6
|
License: Apache-2.0
|
|
@@ -53,6 +53,19 @@ Dynamic: license-file
|
|
|
53
53
|
|
|
54
54
|
One Python file that adapts to your environment, fixes itself, and expands capabilities at runtime.
|
|
55
55
|
|
|
56
|
+
Learn more: https://duck.nyc
|
|
57
|
+
|
|
58
|
+
## 🎬 See It In Action
|
|
59
|
+
|
|
60
|
+
| Feature | What You'll See | Video |
|
|
61
|
+
|---------|----------------|-------|
|
|
62
|
+
| 🔥 **Hot-Reload** | Agent detects code changes and restarts instantly—no manual intervention needed. Edit your agent code or tools while running, save the file, and watch it reload automatically. | [Watch Demo](https://redduck.dev/videos/hot-reload.mp4) |
|
|
63
|
+
| 🌐 **Web UI** | Clean, modern web interface for chatting with DevDuck. Real-time streaming responses, tool execution visibility, and beautiful markdown rendering. | [Watch Demo](https://redduck.dev/videos/web-ui.mp4) |
|
|
64
|
+
| 🛠️ **Dynamic Tool Creation** | Create a new tool by simply saving a `.py` file in the `./tools/` directory. No restart, no configuration—the agent loads it instantly and starts using it. Pure hot-reload magic. | [Watch Demo](https://redduck.dev/videos/dynamic-tool-creation.mp4) |
|
|
65
|
+
| 🌊 **TCP Streaming Server** | Connect from any client (netcat, custom apps, other agents) via TCP. Real-time streaming responses with parallel tool execution. Multi-protocol access to the same agent. | [Watch Demo](https://redduck.dev/videos/tcp.mp4) |
|
|
66
|
+
| 🔌 **IPC & macOS Tray** | Unix socket-based inter-process communication with native macOS menu bar integration. DevDuck runs in your menu bar with quick actions, status indicators, and seamless IPC streaming via `/tmp/devduck_main.sock`. |  |
|
|
67
|
+
| 💬 **Ambient Overlay** | Floating AI input overlay with glassmorphism UI. Real-time IPC streaming from devduck, auto-focus with blinking cursor, and ESC to hide / Enter to send. Perfect for desktop AI interactions. | [Watch Demo](https://redduck.dev/videos/floating-input.mp4) |
|
|
68
|
+
|
|
56
69
|
---
|
|
57
70
|
|
|
58
71
|
## Install & Run
|
|
@@ -101,7 +114,7 @@ devduck
|
|
|
101
114
|
| 🧠 **Auto-RAG** | Remembers past conversations | "I prefer FastAPI" → later uses FastAPI automatically |
|
|
102
115
|
| 🌊 **Multi-Protocol** | CLI, Python, TCP, WebSocket, MCP, IPC | `devduck "query"` or `nc localhost 9999` |
|
|
103
116
|
| ☁️ **AWS Deploy** | One-command serverless deployment | `agentcore_config(auto_launch=True)` |
|
|
104
|
-
| 🛠️ **
|
|
117
|
+
| 🛠️ **35+ Tools** | Shell, GitHub, file editing, math, UI control | `devduck("create GitHub issue")` |
|
|
105
118
|
| 🎛️ **Flexible Config** | Load only tools you need | `DEVDUCK_TOOLS="strands_tools:shell,editor"` |
|
|
106
119
|
|
|
107
120
|
---
|
|
@@ -113,7 +126,7 @@ graph TB
|
|
|
113
126
|
A[User Input] -->|CLI/TCP/WS/MCP/IPC| B[DevDuck Core]
|
|
114
127
|
B -->|Auto RAG| C[Knowledge Base]
|
|
115
128
|
C -.->|Context Retrieval| B
|
|
116
|
-
B -->|Tool Calls| D[
|
|
129
|
+
B -->|Tool Calls| D[35+ Built-in Tools]
|
|
117
130
|
D --> E[shell/editor/calculator]
|
|
118
131
|
D --> F[GitHub/AgentCore]
|
|
119
132
|
D --> G[TCP/WebSocket/MCP/IPC]
|
|
@@ -165,7 +178,7 @@ devduck("refactor my code to use async/await")
|
|
|
165
178
|
|
|
166
179
|
| Provider | Setup | When to Use |
|
|
167
180
|
|----------|-------|-------------|
|
|
168
|
-
| **Bedrock** (auto-detected) | [Get API key](https://console.aws.amazon.com/bedrock) → `export AWS_BEARER_TOKEN_BEDROCK=...` |
|
|
181
|
+
| **Bedrock** (auto-detected) | [Get API key](https://console.aws.amazon.com/bedrock) → `export AWS_BEARER_TOKEN_BEDROCK=...` | Auto-selected if credentials found |
|
|
169
182
|
| **MLX** (macOS auto-detected) | Auto-detected on Apple Silicon | Local, optimized for M-series Macs |
|
|
170
183
|
| **Ollama** (fallback) | `ollama pull qwen3:1.7b` | Local, free, private (used if Bedrock/MLX unavailable) |
|
|
171
184
|
| **Anthropic** | `export ANTHROPIC_API_KEY=...` | Claude API direct access |
|
|
@@ -187,8 +200,8 @@ devduck
|
|
|
187
200
|
| **Dev** | `shell`, `editor`, `file_read`, `calculator` | Code, test, debug |
|
|
188
201
|
| **GitHub** | `use_github`, `create_subagent` | Issues, PRs, CI/CD automation |
|
|
189
202
|
| **Network** | `tcp`, `websocket`, `mcp_server`, `ipc` | Serve agents over protocols |
|
|
190
|
-
| **AWS** | `agentcore_config`, `agentcore_invoke`, `agentcore_logs` | Deploy to serverless |
|
|
191
|
-
| **AI** | `use_agent`, `retrieve`, `store_in_kb` | Multi-agent, memory |
|
|
203
|
+
| **AWS** | `agentcore_config`, `agentcore_invoke`, `agentcore_logs`, `agentcore_agents` | Deploy to serverless |
|
|
204
|
+
| **AI** | `use_agent`, `retrieve`, `store_in_kb`, `state_manager` | Multi-agent, memory, state |
|
|
192
205
|
| **UI** (macOS) | `tray`, `ambient`, `cursor`, `clipboard` | Desktop automation |
|
|
193
206
|
|
|
194
207
|
<details>
|
|
@@ -204,6 +217,7 @@ devduck
|
|
|
204
217
|
- `create_subagent` - Spawn sub-agents via GitHub Actions
|
|
205
218
|
- `store_in_kb` - Store content in Bedrock Knowledge Base
|
|
206
219
|
- `system_prompt` - Manage agent system prompt
|
|
220
|
+
- `state_manager` - Agent state management with time-travel capabilities
|
|
207
221
|
- `tray` - System tray app control (macOS)
|
|
208
222
|
- `ambient` - Ambient AI input overlay (macOS)
|
|
209
223
|
|
|
@@ -225,6 +239,12 @@ devduck
|
|
|
225
239
|
- `environment` - Environment variable management
|
|
226
240
|
- `mcp_client` - Connect to external MCP servers
|
|
227
241
|
- `retrieve` - Bedrock Knowledge Base retrieval
|
|
242
|
+
- `scraper` - HTML/XML parsing with BeautifulSoup4
|
|
243
|
+
- `fetch_github_tool` - Fetch and load tools from GitHub
|
|
244
|
+
- `gist` - Comprehensive GitHub Gist management
|
|
245
|
+
- `add_comment` - Add comments to GitHub issues/PRs
|
|
246
|
+
- `list_issues` - List GitHub issues
|
|
247
|
+
- `list_pull_requests` - List GitHub pull requests
|
|
228
248
|
|
|
229
249
|
### strands-fun-tools (macOS)
|
|
230
250
|
- `listen` - Background speech transcription with Whisper
|
|
@@ -286,22 +306,75 @@ No restart. No configuration. Just works.
|
|
|
286
306
|
|----------|---------|---------|
|
|
287
307
|
| `MODEL_PROVIDER` | Auto-detect | `bedrock`, `anthropic`, `github`, `mlx`, `ollama` |
|
|
288
308
|
| `STRANDS_MODEL_ID` | Auto | Model name (e.g., `qwen3:1.7b`, `claude-sonnet-4`) |
|
|
289
|
-
| `DEVDUCK_TOOLS` |
|
|
309
|
+
| `DEVDUCK_TOOLS` | 37 default tools | `package:tool1,tool2:package2:tool3` format |
|
|
310
|
+
| `DEVDUCK_LOAD_TOOLS_FROM_DIR` | `false` | `true`/`false` - Auto-load tools from `./tools/` directory |
|
|
290
311
|
| `DEVDUCK_KNOWLEDGE_BASE_ID` | - | Bedrock KB ID for auto-RAG |
|
|
291
312
|
| `DEVDUCK_TCP_PORT` | `9999` | TCP server port |
|
|
292
313
|
| `DEVDUCK_ENABLE_TCP` | `true` | Enable/disable TCP |
|
|
293
314
|
|
|
294
|
-
|
|
315
|
+
### Tool Configuration Format
|
|
316
|
+
|
|
317
|
+
**Format:** `package:tool1,tool2:package2:tool3`
|
|
318
|
+
|
|
319
|
+
**Directory Auto-Loading:**
|
|
320
|
+
|
|
321
|
+
By default, DevDuck **does not** automatically load tools from the `./tools/` directory. This gives you explicit control over which tools are loaded. To enable automatic loading of tools from `./tools/`, set:
|
|
322
|
+
|
|
323
|
+
```bash
|
|
324
|
+
export DEVDUCK_LOAD_TOOLS_FROM_DIR=true
|
|
325
|
+
devduck
|
|
326
|
+
```
|
|
327
|
+
|
|
328
|
+
When enabled, any `.py` file in `./tools/` with a `@tool` decorator will be loaded automatically. When disabled (default), you control tool loading via `DEVDUCK_TOOLS` or runtime `manage_tools()` calls.
|
|
329
|
+
|
|
330
|
+
**Examples:**
|
|
295
331
|
```bash
|
|
332
|
+
# Minimal (shell + editor only)
|
|
296
333
|
export DEVDUCK_TOOLS="strands_tools:shell,editor"
|
|
334
|
+
|
|
335
|
+
# Dev tools only
|
|
336
|
+
export DEVDUCK_TOOLS="strands_tools:shell,editor,file_read,file_write,calculator"
|
|
337
|
+
|
|
338
|
+
# Full DevDuck + Strands (no fun tools)
|
|
339
|
+
export DEVDUCK_TOOLS="devduck.tools:tcp,websocket,mcp_server,use_github:strands_tools:shell,editor,file_read"
|
|
340
|
+
|
|
341
|
+
# Custom package
|
|
342
|
+
export DEVDUCK_TOOLS="my_tools:custom_tool,another_tool:strands_tools:shell"
|
|
343
|
+
|
|
297
344
|
devduck
|
|
298
345
|
```
|
|
299
346
|
|
|
347
|
+
**Runtime tool management:**
|
|
348
|
+
```python
|
|
349
|
+
# List loaded tools
|
|
350
|
+
manage_tools(action="list")
|
|
351
|
+
|
|
352
|
+
# Add tools at runtime
|
|
353
|
+
manage_tools(action="add", package="strands_fun_tools", tool_names="cursor,clipboard")
|
|
354
|
+
|
|
355
|
+
# Remove tools
|
|
356
|
+
manage_tools(action="remove", tool_names="cursor,clipboard")
|
|
357
|
+
|
|
358
|
+
# Reload specific tools
|
|
359
|
+
manage_tools(action="reload", tool_names="shell,editor")
|
|
360
|
+
|
|
361
|
+
# Reload all (restart agent)
|
|
362
|
+
manage_tools(action="reload")
|
|
363
|
+
```
|
|
364
|
+
|
|
365
|
+
**Discover tools before loading:**
|
|
366
|
+
```python
|
|
367
|
+
# List available tools in a package
|
|
368
|
+
install_tools(action="list_available", package="strands-fun-tools", module="strands_fun_tools")
|
|
369
|
+
```
|
|
370
|
+
|
|
300
371
|
---
|
|
301
372
|
|
|
302
373
|
|
|
303
374
|
## MCP Integration
|
|
304
375
|
|
|
376
|
+
### Expose DevDuck as MCP Server
|
|
377
|
+
|
|
305
378
|
**Claude Desktop** (`~/Library/Application Support/Claude/claude_desktop_config.json`):
|
|
306
379
|
```json
|
|
307
380
|
{
|
|
@@ -316,6 +389,83 @@ devduck
|
|
|
316
389
|
|
|
317
390
|
Restart Claude → DevDuck tools appear automatically.
|
|
318
391
|
|
|
392
|
+
### Load External MCP Servers
|
|
393
|
+
|
|
394
|
+
DevDuck can act as an MCP client and load tools from external MCP servers automatically.
|
|
395
|
+
|
|
396
|
+
**Setup:**
|
|
397
|
+
```bash
|
|
398
|
+
export MCP_SERVERS='{
|
|
399
|
+
"mcpServers": {
|
|
400
|
+
"strands": {
|
|
401
|
+
"command": "uvx",
|
|
402
|
+
"args": ["strands-agents-mcp-server"]
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
}'
|
|
406
|
+
devduck
|
|
407
|
+
```
|
|
408
|
+
|
|
409
|
+
**Supported Transport Types:**
|
|
410
|
+
|
|
411
|
+
| Transport | Configuration | Example |
|
|
412
|
+
|-----------|--------------|---------|
|
|
413
|
+
| **stdio** | `command`, `args`, `env` | Executables via stdin/stdout |
|
|
414
|
+
| **HTTP** | `url`, `headers` | Remote servers via HTTP |
|
|
415
|
+
| **SSE** | `url` (with `/sse` path) | Server-Sent Events streaming |
|
|
416
|
+
|
|
417
|
+
**Examples:**
|
|
418
|
+
|
|
419
|
+
```bash
|
|
420
|
+
# Stdio server
|
|
421
|
+
export MCP_SERVERS='{
|
|
422
|
+
"mcpServers": {
|
|
423
|
+
"myserver": {
|
|
424
|
+
"command": "python",
|
|
425
|
+
"args": ["server.py"],
|
|
426
|
+
"env": {"API_KEY": "secret"}
|
|
427
|
+
}
|
|
428
|
+
}
|
|
429
|
+
}'
|
|
430
|
+
|
|
431
|
+
# HTTP server
|
|
432
|
+
export MCP_SERVERS='{
|
|
433
|
+
"mcpServers": {
|
|
434
|
+
"remote": {
|
|
435
|
+
"url": "https://api.example.com/mcp",
|
|
436
|
+
"headers": {"Authorization": "Bearer token"}
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
}'
|
|
440
|
+
|
|
441
|
+
# SSE server
|
|
442
|
+
export MCP_SERVERS='{
|
|
443
|
+
"mcpServers": {
|
|
444
|
+
"events": {
|
|
445
|
+
"url": "https://api.example.com/sse"
|
|
446
|
+
}
|
|
447
|
+
}
|
|
448
|
+
}'
|
|
449
|
+
|
|
450
|
+
# Multiple servers
|
|
451
|
+
export MCP_SERVERS='{
|
|
452
|
+
"mcpServers": {
|
|
453
|
+
"strands": {
|
|
454
|
+
"command": "uvx",
|
|
455
|
+
"args": ["strands-agents-mcp-server"]
|
|
456
|
+
},
|
|
457
|
+
"remote": {
|
|
458
|
+
"url": "https://api.example.com/mcp"
|
|
459
|
+
}
|
|
460
|
+
}
|
|
461
|
+
}'
|
|
462
|
+
|
|
463
|
+
devduck
|
|
464
|
+
# Tools from all MCP servers automatically available
|
|
465
|
+
```
|
|
466
|
+
|
|
467
|
+
**Tool Prefixing:** Each MCP server's tools are prefixed with the server name (e.g., `strands_tool_name`)
|
|
468
|
+
|
|
319
469
|
---
|
|
320
470
|
|
|
321
471
|
## Troubleshooting
|
|
@@ -6,6 +6,19 @@
|
|
|
6
6
|
|
|
7
7
|
One Python file that adapts to your environment, fixes itself, and expands capabilities at runtime.
|
|
8
8
|
|
|
9
|
+
Learn more: https://duck.nyc
|
|
10
|
+
|
|
11
|
+
## 🎬 See It In Action
|
|
12
|
+
|
|
13
|
+
| Feature | What You'll See | Video |
|
|
14
|
+
|---------|----------------|-------|
|
|
15
|
+
| 🔥 **Hot-Reload** | Agent detects code changes and restarts instantly—no manual intervention needed. Edit your agent code or tools while running, save the file, and watch it reload automatically. | [Watch Demo](https://redduck.dev/videos/hot-reload.mp4) |
|
|
16
|
+
| 🌐 **Web UI** | Clean, modern web interface for chatting with DevDuck. Real-time streaming responses, tool execution visibility, and beautiful markdown rendering. | [Watch Demo](https://redduck.dev/videos/web-ui.mp4) |
|
|
17
|
+
| 🛠️ **Dynamic Tool Creation** | Create a new tool by simply saving a `.py` file in the `./tools/` directory. No restart, no configuration—the agent loads it instantly and starts using it. Pure hot-reload magic. | [Watch Demo](https://redduck.dev/videos/dynamic-tool-creation.mp4) |
|
|
18
|
+
| 🌊 **TCP Streaming Server** | Connect from any client (netcat, custom apps, other agents) via TCP. Real-time streaming responses with parallel tool execution. Multi-protocol access to the same agent. | [Watch Demo](https://redduck.dev/videos/tcp.mp4) |
|
|
19
|
+
| 🔌 **IPC & macOS Tray** | Unix socket-based inter-process communication with native macOS menu bar integration. DevDuck runs in your menu bar with quick actions, status indicators, and seamless IPC streaming via `/tmp/devduck_main.sock`. |  |
|
|
20
|
+
| 💬 **Ambient Overlay** | Floating AI input overlay with glassmorphism UI. Real-time IPC streaming from devduck, auto-focus with blinking cursor, and ESC to hide / Enter to send. Perfect for desktop AI interactions. | [Watch Demo](https://redduck.dev/videos/floating-input.mp4) |
|
|
21
|
+
|
|
9
22
|
---
|
|
10
23
|
|
|
11
24
|
## Install & Run
|
|
@@ -54,7 +67,7 @@ devduck
|
|
|
54
67
|
| 🧠 **Auto-RAG** | Remembers past conversations | "I prefer FastAPI" → later uses FastAPI automatically |
|
|
55
68
|
| 🌊 **Multi-Protocol** | CLI, Python, TCP, WebSocket, MCP, IPC | `devduck "query"` or `nc localhost 9999` |
|
|
56
69
|
| ☁️ **AWS Deploy** | One-command serverless deployment | `agentcore_config(auto_launch=True)` |
|
|
57
|
-
| 🛠️ **
|
|
70
|
+
| 🛠️ **35+ Tools** | Shell, GitHub, file editing, math, UI control | `devduck("create GitHub issue")` |
|
|
58
71
|
| 🎛️ **Flexible Config** | Load only tools you need | `DEVDUCK_TOOLS="strands_tools:shell,editor"` |
|
|
59
72
|
|
|
60
73
|
---
|
|
@@ -66,7 +79,7 @@ graph TB
|
|
|
66
79
|
A[User Input] -->|CLI/TCP/WS/MCP/IPC| B[DevDuck Core]
|
|
67
80
|
B -->|Auto RAG| C[Knowledge Base]
|
|
68
81
|
C -.->|Context Retrieval| B
|
|
69
|
-
B -->|Tool Calls| D[
|
|
82
|
+
B -->|Tool Calls| D[35+ Built-in Tools]
|
|
70
83
|
D --> E[shell/editor/calculator]
|
|
71
84
|
D --> F[GitHub/AgentCore]
|
|
72
85
|
D --> G[TCP/WebSocket/MCP/IPC]
|
|
@@ -118,7 +131,7 @@ devduck("refactor my code to use async/await")
|
|
|
118
131
|
|
|
119
132
|
| Provider | Setup | When to Use |
|
|
120
133
|
|----------|-------|-------------|
|
|
121
|
-
| **Bedrock** (auto-detected) | [Get API key](https://console.aws.amazon.com/bedrock) → `export AWS_BEARER_TOKEN_BEDROCK=...` |
|
|
134
|
+
| **Bedrock** (auto-detected) | [Get API key](https://console.aws.amazon.com/bedrock) → `export AWS_BEARER_TOKEN_BEDROCK=...` | Auto-selected if credentials found |
|
|
122
135
|
| **MLX** (macOS auto-detected) | Auto-detected on Apple Silicon | Local, optimized for M-series Macs |
|
|
123
136
|
| **Ollama** (fallback) | `ollama pull qwen3:1.7b` | Local, free, private (used if Bedrock/MLX unavailable) |
|
|
124
137
|
| **Anthropic** | `export ANTHROPIC_API_KEY=...` | Claude API direct access |
|
|
@@ -140,8 +153,8 @@ devduck
|
|
|
140
153
|
| **Dev** | `shell`, `editor`, `file_read`, `calculator` | Code, test, debug |
|
|
141
154
|
| **GitHub** | `use_github`, `create_subagent` | Issues, PRs, CI/CD automation |
|
|
142
155
|
| **Network** | `tcp`, `websocket`, `mcp_server`, `ipc` | Serve agents over protocols |
|
|
143
|
-
| **AWS** | `agentcore_config`, `agentcore_invoke`, `agentcore_logs` | Deploy to serverless |
|
|
144
|
-
| **AI** | `use_agent`, `retrieve`, `store_in_kb` | Multi-agent, memory |
|
|
156
|
+
| **AWS** | `agentcore_config`, `agentcore_invoke`, `agentcore_logs`, `agentcore_agents` | Deploy to serverless |
|
|
157
|
+
| **AI** | `use_agent`, `retrieve`, `store_in_kb`, `state_manager` | Multi-agent, memory, state |
|
|
145
158
|
| **UI** (macOS) | `tray`, `ambient`, `cursor`, `clipboard` | Desktop automation |
|
|
146
159
|
|
|
147
160
|
<details>
|
|
@@ -157,6 +170,7 @@ devduck
|
|
|
157
170
|
- `create_subagent` - Spawn sub-agents via GitHub Actions
|
|
158
171
|
- `store_in_kb` - Store content in Bedrock Knowledge Base
|
|
159
172
|
- `system_prompt` - Manage agent system prompt
|
|
173
|
+
- `state_manager` - Agent state management with time-travel capabilities
|
|
160
174
|
- `tray` - System tray app control (macOS)
|
|
161
175
|
- `ambient` - Ambient AI input overlay (macOS)
|
|
162
176
|
|
|
@@ -178,6 +192,12 @@ devduck
|
|
|
178
192
|
- `environment` - Environment variable management
|
|
179
193
|
- `mcp_client` - Connect to external MCP servers
|
|
180
194
|
- `retrieve` - Bedrock Knowledge Base retrieval
|
|
195
|
+
- `scraper` - HTML/XML parsing with BeautifulSoup4
|
|
196
|
+
- `fetch_github_tool` - Fetch and load tools from GitHub
|
|
197
|
+
- `gist` - Comprehensive GitHub Gist management
|
|
198
|
+
- `add_comment` - Add comments to GitHub issues/PRs
|
|
199
|
+
- `list_issues` - List GitHub issues
|
|
200
|
+
- `list_pull_requests` - List GitHub pull requests
|
|
181
201
|
|
|
182
202
|
### strands-fun-tools (macOS)
|
|
183
203
|
- `listen` - Background speech transcription with Whisper
|
|
@@ -239,22 +259,75 @@ No restart. No configuration. Just works.
|
|
|
239
259
|
|----------|---------|---------|
|
|
240
260
|
| `MODEL_PROVIDER` | Auto-detect | `bedrock`, `anthropic`, `github`, `mlx`, `ollama` |
|
|
241
261
|
| `STRANDS_MODEL_ID` | Auto | Model name (e.g., `qwen3:1.7b`, `claude-sonnet-4`) |
|
|
242
|
-
| `DEVDUCK_TOOLS` |
|
|
262
|
+
| `DEVDUCK_TOOLS` | 37 default tools | `package:tool1,tool2:package2:tool3` format |
|
|
263
|
+
| `DEVDUCK_LOAD_TOOLS_FROM_DIR` | `false` | `true`/`false` - Auto-load tools from `./tools/` directory |
|
|
243
264
|
| `DEVDUCK_KNOWLEDGE_BASE_ID` | - | Bedrock KB ID for auto-RAG |
|
|
244
265
|
| `DEVDUCK_TCP_PORT` | `9999` | TCP server port |
|
|
245
266
|
| `DEVDUCK_ENABLE_TCP` | `true` | Enable/disable TCP |
|
|
246
267
|
|
|
247
|
-
|
|
268
|
+
### Tool Configuration Format
|
|
269
|
+
|
|
270
|
+
**Format:** `package:tool1,tool2:package2:tool3`
|
|
271
|
+
|
|
272
|
+
**Directory Auto-Loading:**
|
|
273
|
+
|
|
274
|
+
By default, DevDuck **does not** automatically load tools from the `./tools/` directory. This gives you explicit control over which tools are loaded. To enable automatic loading of tools from `./tools/`, set:
|
|
275
|
+
|
|
276
|
+
```bash
|
|
277
|
+
export DEVDUCK_LOAD_TOOLS_FROM_DIR=true
|
|
278
|
+
devduck
|
|
279
|
+
```
|
|
280
|
+
|
|
281
|
+
When enabled, any `.py` file in `./tools/` with a `@tool` decorator will be loaded automatically. When disabled (default), you control tool loading via `DEVDUCK_TOOLS` or runtime `manage_tools()` calls.
|
|
282
|
+
|
|
283
|
+
**Examples:**
|
|
248
284
|
```bash
|
|
285
|
+
# Minimal (shell + editor only)
|
|
249
286
|
export DEVDUCK_TOOLS="strands_tools:shell,editor"
|
|
287
|
+
|
|
288
|
+
# Dev tools only
|
|
289
|
+
export DEVDUCK_TOOLS="strands_tools:shell,editor,file_read,file_write,calculator"
|
|
290
|
+
|
|
291
|
+
# Full DevDuck + Strands (no fun tools)
|
|
292
|
+
export DEVDUCK_TOOLS="devduck.tools:tcp,websocket,mcp_server,use_github:strands_tools:shell,editor,file_read"
|
|
293
|
+
|
|
294
|
+
# Custom package
|
|
295
|
+
export DEVDUCK_TOOLS="my_tools:custom_tool,another_tool:strands_tools:shell"
|
|
296
|
+
|
|
250
297
|
devduck
|
|
251
298
|
```
|
|
252
299
|
|
|
300
|
+
**Runtime tool management:**
|
|
301
|
+
```python
|
|
302
|
+
# List loaded tools
|
|
303
|
+
manage_tools(action="list")
|
|
304
|
+
|
|
305
|
+
# Add tools at runtime
|
|
306
|
+
manage_tools(action="add", package="strands_fun_tools", tool_names="cursor,clipboard")
|
|
307
|
+
|
|
308
|
+
# Remove tools
|
|
309
|
+
manage_tools(action="remove", tool_names="cursor,clipboard")
|
|
310
|
+
|
|
311
|
+
# Reload specific tools
|
|
312
|
+
manage_tools(action="reload", tool_names="shell,editor")
|
|
313
|
+
|
|
314
|
+
# Reload all (restart agent)
|
|
315
|
+
manage_tools(action="reload")
|
|
316
|
+
```
|
|
317
|
+
|
|
318
|
+
**Discover tools before loading:**
|
|
319
|
+
```python
|
|
320
|
+
# List available tools in a package
|
|
321
|
+
install_tools(action="list_available", package="strands-fun-tools", module="strands_fun_tools")
|
|
322
|
+
```
|
|
323
|
+
|
|
253
324
|
---
|
|
254
325
|
|
|
255
326
|
|
|
256
327
|
## MCP Integration
|
|
257
328
|
|
|
329
|
+
### Expose DevDuck as MCP Server
|
|
330
|
+
|
|
258
331
|
**Claude Desktop** (`~/Library/Application Support/Claude/claude_desktop_config.json`):
|
|
259
332
|
```json
|
|
260
333
|
{
|
|
@@ -269,6 +342,83 @@ devduck
|
|
|
269
342
|
|
|
270
343
|
Restart Claude → DevDuck tools appear automatically.
|
|
271
344
|
|
|
345
|
+
### Load External MCP Servers
|
|
346
|
+
|
|
347
|
+
DevDuck can act as an MCP client and load tools from external MCP servers automatically.
|
|
348
|
+
|
|
349
|
+
**Setup:**
|
|
350
|
+
```bash
|
|
351
|
+
export MCP_SERVERS='{
|
|
352
|
+
"mcpServers": {
|
|
353
|
+
"strands": {
|
|
354
|
+
"command": "uvx",
|
|
355
|
+
"args": ["strands-agents-mcp-server"]
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
}'
|
|
359
|
+
devduck
|
|
360
|
+
```
|
|
361
|
+
|
|
362
|
+
**Supported Transport Types:**
|
|
363
|
+
|
|
364
|
+
| Transport | Configuration | Example |
|
|
365
|
+
|-----------|--------------|---------|
|
|
366
|
+
| **stdio** | `command`, `args`, `env` | Executables via stdin/stdout |
|
|
367
|
+
| **HTTP** | `url`, `headers` | Remote servers via HTTP |
|
|
368
|
+
| **SSE** | `url` (with `/sse` path) | Server-Sent Events streaming |
|
|
369
|
+
|
|
370
|
+
**Examples:**
|
|
371
|
+
|
|
372
|
+
```bash
|
|
373
|
+
# Stdio server
|
|
374
|
+
export MCP_SERVERS='{
|
|
375
|
+
"mcpServers": {
|
|
376
|
+
"myserver": {
|
|
377
|
+
"command": "python",
|
|
378
|
+
"args": ["server.py"],
|
|
379
|
+
"env": {"API_KEY": "secret"}
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
}'
|
|
383
|
+
|
|
384
|
+
# HTTP server
|
|
385
|
+
export MCP_SERVERS='{
|
|
386
|
+
"mcpServers": {
|
|
387
|
+
"remote": {
|
|
388
|
+
"url": "https://api.example.com/mcp",
|
|
389
|
+
"headers": {"Authorization": "Bearer token"}
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
}'
|
|
393
|
+
|
|
394
|
+
# SSE server
|
|
395
|
+
export MCP_SERVERS='{
|
|
396
|
+
"mcpServers": {
|
|
397
|
+
"events": {
|
|
398
|
+
"url": "https://api.example.com/sse"
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
}'
|
|
402
|
+
|
|
403
|
+
# Multiple servers
|
|
404
|
+
export MCP_SERVERS='{
|
|
405
|
+
"mcpServers": {
|
|
406
|
+
"strands": {
|
|
407
|
+
"command": "uvx",
|
|
408
|
+
"args": ["strands-agents-mcp-server"]
|
|
409
|
+
},
|
|
410
|
+
"remote": {
|
|
411
|
+
"url": "https://api.example.com/mcp"
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
}'
|
|
415
|
+
|
|
416
|
+
devduck
|
|
417
|
+
# Tools from all MCP servers automatically available
|
|
418
|
+
```
|
|
419
|
+
|
|
420
|
+
**Tool Prefixing:** Each MCP server's tools are prefixed with the server name (e.g., `strands_tool_name`)
|
|
421
|
+
|
|
272
422
|
---
|
|
273
423
|
|
|
274
424
|
## Troubleshooting
|