@standardbeagle/dart-query 0.3.2
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.
- package/LICENSE +21 -0
- package/README.md +427 -0
- package/TOOLS.md +2148 -0
- package/dist/api/dartClient.d.ts +123 -0
- package/dist/api/dartClient.d.ts.map +1 -0
- package/dist/api/dartClient.js +436 -0
- package/dist/api/dartClient.js.map +1 -0
- package/dist/batch/batchOperations.d.ts +14 -0
- package/dist/batch/batchOperations.d.ts.map +1 -0
- package/dist/batch/batchOperations.js +65 -0
- package/dist/batch/batchOperations.js.map +1 -0
- package/dist/cache/configCache.d.ts +20 -0
- package/dist/cache/configCache.d.ts.map +1 -0
- package/dist/cache/configCache.js +59 -0
- package/dist/cache/configCache.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +1120 -0
- package/dist/index.js.map +1 -0
- package/dist/parsers/csv.d.ts +44 -0
- package/dist/parsers/csv.d.ts.map +1 -0
- package/dist/parsers/csv.js +574 -0
- package/dist/parsers/csv.js.map +1 -0
- package/dist/parsers/dartql.d.ts +104 -0
- package/dist/parsers/dartql.d.ts.map +1 -0
- package/dist/parsers/dartql.js +889 -0
- package/dist/parsers/dartql.js.map +1 -0
- package/dist/tools/add_task_comment.d.ts +3 -0
- package/dist/tools/add_task_comment.d.ts.map +1 -0
- package/dist/tools/add_task_comment.js +43 -0
- package/dist/tools/add_task_comment.js.map +1 -0
- package/dist/tools/add_time_tracking.d.ts +3 -0
- package/dist/tools/add_time_tracking.d.ts.map +1 -0
- package/dist/tools/add_time_tracking.js +52 -0
- package/dist/tools/add_time_tracking.js.map +1 -0
- package/dist/tools/attach_url.d.ts +3 -0
- package/dist/tools/attach_url.d.ts.map +1 -0
- package/dist/tools/attach_url.js +38 -0
- package/dist/tools/attach_url.js.map +1 -0
- package/dist/tools/batch_delete_tasks.d.ts +3 -0
- package/dist/tools/batch_delete_tasks.d.ts.map +1 -0
- package/dist/tools/batch_delete_tasks.js +125 -0
- package/dist/tools/batch_delete_tasks.js.map +1 -0
- package/dist/tools/batch_update_tasks.d.ts +3 -0
- package/dist/tools/batch_update_tasks.d.ts.map +1 -0
- package/dist/tools/batch_update_tasks.js +327 -0
- package/dist/tools/batch_update_tasks.js.map +1 -0
- package/dist/tools/create_doc.d.ts +3 -0
- package/dist/tools/create_doc.d.ts.map +1 -0
- package/dist/tools/create_doc.js +65 -0
- package/dist/tools/create_doc.js.map +1 -0
- package/dist/tools/create_task.d.ts +3 -0
- package/dist/tools/create_task.d.ts.map +1 -0
- package/dist/tools/create_task.js +143 -0
- package/dist/tools/create_task.js.map +1 -0
- package/dist/tools/delete_doc.d.ts +3 -0
- package/dist/tools/delete_doc.d.ts.map +1 -0
- package/dist/tools/delete_doc.js +35 -0
- package/dist/tools/delete_doc.js.map +1 -0
- package/dist/tools/delete_task.d.ts +3 -0
- package/dist/tools/delete_task.d.ts.map +1 -0
- package/dist/tools/delete_task.js +35 -0
- package/dist/tools/delete_task.js.map +1 -0
- package/dist/tools/get_batch_status.d.ts +3 -0
- package/dist/tools/get_batch_status.d.ts.map +1 -0
- package/dist/tools/get_batch_status.js +24 -0
- package/dist/tools/get_batch_status.js.map +1 -0
- package/dist/tools/get_config.d.ts +3 -0
- package/dist/tools/get_config.d.ts.map +1 -0
- package/dist/tools/get_config.js +74 -0
- package/dist/tools/get_config.js.map +1 -0
- package/dist/tools/get_dartboard.d.ts +3 -0
- package/dist/tools/get_dartboard.d.ts.map +1 -0
- package/dist/tools/get_dartboard.js +43 -0
- package/dist/tools/get_dartboard.js.map +1 -0
- package/dist/tools/get_doc.d.ts +3 -0
- package/dist/tools/get_doc.d.ts.map +1 -0
- package/dist/tools/get_doc.js +34 -0
- package/dist/tools/get_doc.js.map +1 -0
- package/dist/tools/get_folder.d.ts +3 -0
- package/dist/tools/get_folder.d.ts.map +1 -0
- package/dist/tools/get_folder.js +45 -0
- package/dist/tools/get_folder.js.map +1 -0
- package/dist/tools/get_task.d.ts +3 -0
- package/dist/tools/get_task.d.ts.map +1 -0
- package/dist/tools/get_task.js +109 -0
- package/dist/tools/get_task.js.map +1 -0
- package/dist/tools/import_tasks_csv.d.ts +3 -0
- package/dist/tools/import_tasks_csv.d.ts.map +1 -0
- package/dist/tools/import_tasks_csv.js +218 -0
- package/dist/tools/import_tasks_csv.js.map +1 -0
- package/dist/tools/info.d.ts +3 -0
- package/dist/tools/info.d.ts.map +1 -0
- package/dist/tools/info.js +474 -0
- package/dist/tools/info.js.map +1 -0
- package/dist/tools/list_comments.d.ts +3 -0
- package/dist/tools/list_comments.d.ts.map +1 -0
- package/dist/tools/list_comments.js +46 -0
- package/dist/tools/list_comments.js.map +1 -0
- package/dist/tools/list_docs.d.ts +3 -0
- package/dist/tools/list_docs.d.ts.map +1 -0
- package/dist/tools/list_docs.js +101 -0
- package/dist/tools/list_docs.js.map +1 -0
- package/dist/tools/list_tasks.d.ts +3 -0
- package/dist/tools/list_tasks.d.ts.map +1 -0
- package/dist/tools/list_tasks.js +325 -0
- package/dist/tools/list_tasks.js.map +1 -0
- package/dist/tools/move_task.d.ts +3 -0
- package/dist/tools/move_task.d.ts.map +1 -0
- package/dist/tools/move_task.js +44 -0
- package/dist/tools/move_task.js.map +1 -0
- package/dist/tools/search_tasks.d.ts +3 -0
- package/dist/tools/search_tasks.d.ts.map +1 -0
- package/dist/tools/search_tasks.js +227 -0
- package/dist/tools/search_tasks.js.map +1 -0
- package/dist/tools/update_doc.d.ts +3 -0
- package/dist/tools/update_doc.d.ts.map +1 -0
- package/dist/tools/update_doc.js +102 -0
- package/dist/tools/update_doc.js.map +1 -0
- package/dist/tools/update_task.d.ts +3 -0
- package/dist/tools/update_task.d.ts.map +1 -0
- package/dist/tools/update_task.js +241 -0
- package/dist/tools/update_task.js.map +1 -0
- package/dist/types/index.d.ts +529 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +65 -0
- package/dist/types/index.js.map +1 -0
- package/package.json +72 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 StandardBeagle
|
|
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.
|
package/README.md
ADDED
|
@@ -0,0 +1,427 @@
|
|
|
1
|
+
# dart-query
|
|
2
|
+
|
|
3
|
+
**Production-ready MCP server for Dart AI task management with batch operations, SQL-like selectors, CSV import, and zero context rot.**
|
|
4
|
+
|
|
5
|
+
## What Problem Does This Solve?
|
|
6
|
+
|
|
7
|
+
### The Context Rot Problem
|
|
8
|
+
|
|
9
|
+
When managing tasks in Dart AI through an LLM, you quickly run into **context rot**:
|
|
10
|
+
|
|
11
|
+
```
|
|
12
|
+
You: "Update all high-priority tasks in Engineering to assign them to John"
|
|
13
|
+
|
|
14
|
+
LLM: Let me list the tasks...
|
|
15
|
+
[Fetches 847 tasks, fills context window with JSON]
|
|
16
|
+
[Context limit hit before making any updates]
|
|
17
|
+
[Lost track of what we were doing]
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
**Traditional approach** (context explosion):
|
|
21
|
+
1. List all tasks → 2000+ tokens
|
|
22
|
+
2. Filter in LLM → context fills with intermediate data
|
|
23
|
+
3. Update each task individually → 50+ API calls, each response adds more context
|
|
24
|
+
4. By task #10, you've lost context of what you're doing
|
|
25
|
+
5. No way to verify results without re-fetching everything
|
|
26
|
+
|
|
27
|
+
**dart-query approach** (zero context rot):
|
|
28
|
+
1. Single DartQL query: `"dartboard = 'Engineering' AND priority = 'high'"`
|
|
29
|
+
2. Server-side batch operation updates all 50 tasks
|
|
30
|
+
3. Returns summary: "50 tasks updated in 12s"
|
|
31
|
+
4. Context usage: ~100 tokens total
|
|
32
|
+
|
|
33
|
+
### Context-Efficient Design
|
|
34
|
+
|
|
35
|
+
Every operation is designed to **minimize token usage** while maximizing capability:
|
|
36
|
+
|
|
37
|
+
| Operation | Traditional | dart-query | Token Savings |
|
|
38
|
+
|-----------|-------------|------------|---------------|
|
|
39
|
+
| Update 50 tasks | 50 API calls, ~25K tokens | 1 batch op, ~200 tokens | **99% reduction** |
|
|
40
|
+
| Import 100 tasks | 100 create calls, ~30K tokens | 1 CSV import, ~300 tokens | **99% reduction** |
|
|
41
|
+
| Find + update tasks | List all + filter + update, ~20K tokens | DartQL selector, ~150 tokens | **99% reduction** |
|
|
42
|
+
|
|
43
|
+
**Key features for context efficiency:**
|
|
44
|
+
- **Progressive disclosure**: `info` tool discovers capabilities without reading schemas
|
|
45
|
+
- **Detail levels**: Return minimal/standard/full data based on need
|
|
46
|
+
- **Batch operations**: Single operation handles hundreds of tasks
|
|
47
|
+
- **Config caching**: 5-minute cache prevents repeated fetches
|
|
48
|
+
- **DartQL language**: SQL-like selectors instead of procedural filtering
|
|
49
|
+
|
|
50
|
+
### Production Safety Without Sandbox
|
|
51
|
+
|
|
52
|
+
Dart AI has **no sandbox environment** - all operations are production. dart-query provides safety through:
|
|
53
|
+
|
|
54
|
+
- **Dry-run modes**: Preview every batch operation before execution
|
|
55
|
+
- **Validation phases**: CSV imports validate before creating anything
|
|
56
|
+
- **Confirmation flags**: Batch deletes require explicit `confirm=true`
|
|
57
|
+
- **Recoverable operations**: Deleted tasks go to trash, not permanent deletion
|
|
58
|
+
- **Error isolation**: Failed operations don't corrupt subsequent work
|
|
59
|
+
|
|
60
|
+
## Quick Start
|
|
61
|
+
|
|
62
|
+
### 1. Installation
|
|
63
|
+
|
|
64
|
+
**Option A: Install from npm (recommended)**
|
|
65
|
+
|
|
66
|
+
```bash
|
|
67
|
+
npm install -g @standardbeagle/dart-query
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
**Option B: Install from source**
|
|
71
|
+
|
|
72
|
+
```bash
|
|
73
|
+
git clone https://github.com/standardbeagle/dart-query
|
|
74
|
+
cd dart-query
|
|
75
|
+
npm install
|
|
76
|
+
npm run build
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
### 2. Get Your Dart AI Token
|
|
80
|
+
|
|
81
|
+
Visit https://app.dartai.com/?settings=account and copy your token (starts with `dsa_`)
|
|
82
|
+
|
|
83
|
+
### 3. Configure MCP
|
|
84
|
+
|
|
85
|
+
**Option A: Using npm global install**
|
|
86
|
+
|
|
87
|
+
Add to your MCP settings (e.g., `~/Library/Application Support/Claude/claude_desktop_config.json`):
|
|
88
|
+
|
|
89
|
+
```json
|
|
90
|
+
{
|
|
91
|
+
"mcpServers": {
|
|
92
|
+
"dart-query": {
|
|
93
|
+
"command": "npx",
|
|
94
|
+
"args": ["-y", "@standardbeagle/dart-query"],
|
|
95
|
+
"env": {
|
|
96
|
+
"DART_TOKEN": "dsa_your_token_here"
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
**Option B: Using local installation**
|
|
104
|
+
|
|
105
|
+
```json
|
|
106
|
+
{
|
|
107
|
+
"mcpServers": {
|
|
108
|
+
"dart-query": {
|
|
109
|
+
"command": "node",
|
|
110
|
+
"args": ["/absolute/path/to/dart-query/dist/index.js"],
|
|
111
|
+
"env": {
|
|
112
|
+
"DART_TOKEN": "dsa_your_token_here"
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
**Option C: Using SLOP-MCP for dynamic management**
|
|
120
|
+
|
|
121
|
+
```bash
|
|
122
|
+
# With npm package
|
|
123
|
+
slop register dart-query \
|
|
124
|
+
--command npx \
|
|
125
|
+
--args "-y" "@standardbeagle/dart-query" \
|
|
126
|
+
--env DART_TOKEN=dsa_your_token_here \
|
|
127
|
+
--scope user
|
|
128
|
+
|
|
129
|
+
# With local installation
|
|
130
|
+
slop register dart-query \
|
|
131
|
+
--command node \
|
|
132
|
+
--args dist/index.js \
|
|
133
|
+
--env DART_TOKEN=dsa_your_token_here \
|
|
134
|
+
--scope user
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
### 4. Verify Connection
|
|
138
|
+
|
|
139
|
+
```typescript
|
|
140
|
+
// Get workspace config
|
|
141
|
+
get_config({})
|
|
142
|
+
|
|
143
|
+
// Explore capabilities
|
|
144
|
+
info({ level: "overview" })
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
### 5. Your First Operations
|
|
148
|
+
|
|
149
|
+
```typescript
|
|
150
|
+
// Create a task
|
|
151
|
+
create_task({
|
|
152
|
+
title: "Test dart-query MCP",
|
|
153
|
+
dartboard: "Personal/test",
|
|
154
|
+
priority: "high"
|
|
155
|
+
})
|
|
156
|
+
|
|
157
|
+
// Batch update multiple tasks (dry run first!)
|
|
158
|
+
batch_update_tasks({
|
|
159
|
+
selector: "dartboard = 'Personal/test' AND priority = 'high'",
|
|
160
|
+
updates: { status: "Doing" },
|
|
161
|
+
dry_run: true // Preview first
|
|
162
|
+
})
|
|
163
|
+
|
|
164
|
+
// Execute after reviewing preview
|
|
165
|
+
batch_update_tasks({
|
|
166
|
+
selector: "dartboard = 'Personal/test' AND priority = 'high'",
|
|
167
|
+
updates: { status: "Doing" },
|
|
168
|
+
dry_run: false
|
|
169
|
+
})
|
|
170
|
+
|
|
171
|
+
// Clean up
|
|
172
|
+
batch_delete_tasks({
|
|
173
|
+
selector: "dartboard = 'Personal/test'",
|
|
174
|
+
dry_run: false,
|
|
175
|
+
confirm: true // Required safety flag
|
|
176
|
+
})
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
## Core Features
|
|
180
|
+
|
|
181
|
+
### 🔍 **Progressive Discovery**
|
|
182
|
+
Start with `info` tool to explore capabilities without loading all schemas. Navigate overview → group → tool with increasing detail.
|
|
183
|
+
|
|
184
|
+
### 🎯 **DartQL Query Language**
|
|
185
|
+
SQL-like WHERE clause syntax for powerful batch operations:
|
|
186
|
+
```sql
|
|
187
|
+
dartboard = 'Engineering' AND priority = 'high' AND tags CONTAINS 'bug'
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
### 📊 **CSV Bulk Import**
|
|
191
|
+
Import hundreds of tasks from CSV with validation, error recovery, and fuzzy matching:
|
|
192
|
+
- Validate phase catches errors before creating anything
|
|
193
|
+
- Parallel import with configurable concurrency
|
|
194
|
+
- Continue-on-error mode for resilience
|
|
195
|
+
|
|
196
|
+
### ⚡ **Batch Operations**
|
|
197
|
+
Update or delete hundreds of tasks in a single operation:
|
|
198
|
+
- Server-side execution (no context rot)
|
|
199
|
+
- Dry-run preview mode
|
|
200
|
+
- Parallel processing with rate limiting
|
|
201
|
+
|
|
202
|
+
### 💾 **Context Efficiency**
|
|
203
|
+
- Detail levels (minimal/standard/full)
|
|
204
|
+
- 5-minute config cache
|
|
205
|
+
- Token-optimized responses
|
|
206
|
+
- Progressive disclosure of capabilities
|
|
207
|
+
|
|
208
|
+
### 🛡️ **Production Safety**
|
|
209
|
+
- No sandbox: all operations are production
|
|
210
|
+
- Dry-run modes for batch operations
|
|
211
|
+
- Validation phases for CSV imports
|
|
212
|
+
- Confirmation flags for destructive operations
|
|
213
|
+
- Recoverable deletions (tasks → trash)
|
|
214
|
+
|
|
215
|
+
## Tool Groups
|
|
216
|
+
|
|
217
|
+
| Group | Tools | Use Case |
|
|
218
|
+
|-------|-------|----------|
|
|
219
|
+
| **Discovery** | `info`, `get_config` | Explore capabilities, get workspace config |
|
|
220
|
+
| **Task CRUD** | `create_task`, `get_task`, `update_task`, `delete_task`, `add_task_comment` | Single task operations |
|
|
221
|
+
| **Task Query** | `list_tasks`, `search_tasks` | Find tasks with filters or full-text search |
|
|
222
|
+
| **Batch Operations** | `batch_update_tasks`, `batch_delete_tasks`, `get_batch_status` | Bulk operations on hundreds of tasks |
|
|
223
|
+
| **CSV Import** | `import_tasks_csv` | Bulk create from CSV files |
|
|
224
|
+
| **Documents** | `list_docs`, `create_doc`, `get_doc`, `update_doc`, `delete_doc` | Document management |
|
|
225
|
+
|
|
226
|
+
## Common Use Cases
|
|
227
|
+
|
|
228
|
+
### Bulk Task Management
|
|
229
|
+
```typescript
|
|
230
|
+
// Update all overdue high-priority tasks
|
|
231
|
+
batch_update_tasks({
|
|
232
|
+
selector: "due_at < '2026-01-18' AND priority = 'high' AND status != 'Done'",
|
|
233
|
+
updates: { priority: "critical", assignees: ["john@company.com"] },
|
|
234
|
+
dry_run: true // Preview first!
|
|
235
|
+
})
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
### Project Cleanup
|
|
239
|
+
```typescript
|
|
240
|
+
// Archive completed tasks from Q4 2025
|
|
241
|
+
batch_update_tasks({
|
|
242
|
+
selector: "completed_at >= '2025-10-01' AND completed_at < '2026-01-01'",
|
|
243
|
+
updates: { dartboard: "Archive" },
|
|
244
|
+
dry_run: false,
|
|
245
|
+
concurrency: 10
|
|
246
|
+
})
|
|
247
|
+
```
|
|
248
|
+
|
|
249
|
+
### CSV Migration
|
|
250
|
+
```typescript
|
|
251
|
+
// Import tasks from external system
|
|
252
|
+
import_tasks_csv({
|
|
253
|
+
csv_file_path: "./jira-export.csv",
|
|
254
|
+
dartboard: "Engineering",
|
|
255
|
+
column_mapping: {
|
|
256
|
+
"Issue Summary": "title",
|
|
257
|
+
"Assignee Email": "assignee",
|
|
258
|
+
"Priority": "priority"
|
|
259
|
+
},
|
|
260
|
+
validate_only: true // Validate first!
|
|
261
|
+
})
|
|
262
|
+
```
|
|
263
|
+
|
|
264
|
+
### Search and Update
|
|
265
|
+
```typescript
|
|
266
|
+
// Find all authentication-related tasks
|
|
267
|
+
const results = search_tasks({
|
|
268
|
+
query: "authentication oauth security",
|
|
269
|
+
dartboard: "Engineering",
|
|
270
|
+
limit: 20
|
|
271
|
+
})
|
|
272
|
+
|
|
273
|
+
// Update them in batch
|
|
274
|
+
batch_update_tasks({
|
|
275
|
+
selector: "tags CONTAINS 'security' AND title LIKE '%auth%'",
|
|
276
|
+
updates: { priority: "high" }
|
|
277
|
+
})
|
|
278
|
+
```
|
|
279
|
+
|
|
280
|
+
## Documentation
|
|
281
|
+
|
|
282
|
+
📖 **[Complete Tool Documentation →](./TOOLS.md)**
|
|
283
|
+
|
|
284
|
+
Detailed documentation for all tools including:
|
|
285
|
+
- Full parameter references
|
|
286
|
+
- Return value schemas
|
|
287
|
+
- How-to guides for common workflows
|
|
288
|
+
- Use case examples
|
|
289
|
+
- DartQL syntax reference
|
|
290
|
+
- CSV import formats
|
|
291
|
+
- Error handling strategies
|
|
292
|
+
- Performance optimization tips
|
|
293
|
+
|
|
294
|
+
## Production Safety Checklist
|
|
295
|
+
|
|
296
|
+
**Before ANY batch operation:**
|
|
297
|
+
- [ ] Use `dry_run: true` and review preview
|
|
298
|
+
- [ ] Verify selector matches ONLY intended tasks
|
|
299
|
+
- [ ] Test with small dataset first (< 10 tasks)
|
|
300
|
+
- [ ] Have rollback plan (tasks go to trash, recoverable)
|
|
301
|
+
|
|
302
|
+
**Before CSV import:**
|
|
303
|
+
- [ ] Use `validate_only: true` and fix all errors
|
|
304
|
+
- [ ] Test with 5-10 rows first
|
|
305
|
+
- [ ] Verify column mapping is correct
|
|
306
|
+
- [ ] Check references exist in workspace (`get_config`)
|
|
307
|
+
|
|
308
|
+
**Before batch delete:**
|
|
309
|
+
- [ ] Triple-check selector specificity
|
|
310
|
+
- [ ] Understand tasks move to trash (recoverable)
|
|
311
|
+
- [ ] Set `confirm: true` (required safety flag)
|
|
312
|
+
|
|
313
|
+
## Performance Metrics
|
|
314
|
+
|
|
315
|
+
Tested with production Dart API:
|
|
316
|
+
|
|
317
|
+
| Operation | Tasks | Time | Throughput |
|
|
318
|
+
|-----------|-------|------|------------|
|
|
319
|
+
| CSV Import | 41 tasks | 17.4s | 2.4 tasks/sec |
|
|
320
|
+
| Batch Update | 75 tasks | 22s | 3.4 tasks/sec |
|
|
321
|
+
| Batch Delete | 165 tasks | 37s | 4.5 tasks/sec |
|
|
322
|
+
| Single CRUD | 1 task | <2s | - |
|
|
323
|
+
|
|
324
|
+
*Concurrency: 10-20 parallel operations, production rate limits observed*
|
|
325
|
+
|
|
326
|
+
## Troubleshooting
|
|
327
|
+
|
|
328
|
+
### Authentication Issues
|
|
329
|
+
```
|
|
330
|
+
Error: Invalid DART_TOKEN
|
|
331
|
+
```
|
|
332
|
+
**Solution**: Ensure token starts with `dsa_` and get fresh token from https://app.dartai.com/?settings=account
|
|
333
|
+
|
|
334
|
+
### Rate Limiting (429)
|
|
335
|
+
```
|
|
336
|
+
Error: Rate limit exceeded
|
|
337
|
+
```
|
|
338
|
+
**Solution**: Reduce `concurrency` parameter (default: 5, try: 2-3). Automatic retry with exponential backoff.
|
|
339
|
+
|
|
340
|
+
### CSV Import Errors
|
|
341
|
+
```
|
|
342
|
+
Error: Row 3, column 'priority': Invalid priority: "5". Available: critical, high, medium, low
|
|
343
|
+
```
|
|
344
|
+
**Solution**: Use `validate_only: true` to see all errors. Check available values with `get_config()`.
|
|
345
|
+
|
|
346
|
+
### DartQL Syntax Errors
|
|
347
|
+
```
|
|
348
|
+
Error: Unknown field: priorty. Did you mean: priority?
|
|
349
|
+
```
|
|
350
|
+
**Solution**: Use fuzzy match suggestions. Reference field list with `info({ level: "tool", target: "batch_update_tasks" })`.
|
|
351
|
+
|
|
352
|
+
**See [TOOLS.md](./TOOLS.md) for comprehensive troubleshooting guide.**
|
|
353
|
+
|
|
354
|
+
## Development
|
|
355
|
+
|
|
356
|
+
```bash
|
|
357
|
+
# Install dependencies
|
|
358
|
+
npm install
|
|
359
|
+
|
|
360
|
+
# Build TypeScript
|
|
361
|
+
npm run build
|
|
362
|
+
|
|
363
|
+
# Type checking
|
|
364
|
+
npm run typecheck
|
|
365
|
+
|
|
366
|
+
# Run tests (unit tests only - no sandbox for integration)
|
|
367
|
+
npm test
|
|
368
|
+
```
|
|
369
|
+
|
|
370
|
+
### Project Structure
|
|
371
|
+
```
|
|
372
|
+
src/
|
|
373
|
+
├── index.ts # MCP server entry point
|
|
374
|
+
├── tools/ # Tool implementations (info, CRUD, batch, import)
|
|
375
|
+
├── api/dartClient.ts # Dart API wrapper with retry logic
|
|
376
|
+
├── parsers/ # DartQL and CSV parsers
|
|
377
|
+
├── cache/configCache.ts # 5-minute config cache
|
|
378
|
+
├── batch/ # Batch operation tracking
|
|
379
|
+
└── types/index.ts # TypeScript interfaces
|
|
380
|
+
```
|
|
381
|
+
|
|
382
|
+
## Design Philosophy
|
|
383
|
+
|
|
384
|
+
1. **Context efficiency first**: Every feature minimizes token usage
|
|
385
|
+
2. **Production safety**: Dry-run, validation, confirmation flags
|
|
386
|
+
3. **Progressive disclosure**: Discover capabilities without overwhelming schemas
|
|
387
|
+
4. **Zero context rot**: Batch operations prevent context pollution
|
|
388
|
+
5. **Fail-safe defaults**: `dry_run: true`, `validate_only: true` by default
|
|
389
|
+
|
|
390
|
+
## Comparison: Traditional vs dart-query
|
|
391
|
+
|
|
392
|
+
### Update 50 Tasks (Traditional LLM approach)
|
|
393
|
+
```
|
|
394
|
+
1. list_tasks() → Returns 50 task objects (~15,000 tokens)
|
|
395
|
+
2. For each task:
|
|
396
|
+
- update_task(task1) → ~300 tokens
|
|
397
|
+
- update_task(task2) → ~300 tokens
|
|
398
|
+
- ... (50 iterations)
|
|
399
|
+
3. Total: ~30,000 tokens, 50 API calls, context window exhausted
|
|
400
|
+
```
|
|
401
|
+
|
|
402
|
+
### Update 50 Tasks (dart-query)
|
|
403
|
+
```
|
|
404
|
+
1. batch_update_tasks({
|
|
405
|
+
selector: "dartboard = 'X' AND priority = 'high'",
|
|
406
|
+
updates: { assignee: "john@company.com" }
|
|
407
|
+
})
|
|
408
|
+
2. Total: ~200 tokens, 1 API call, zero context rot
|
|
409
|
+
```
|
|
410
|
+
|
|
411
|
+
**Token savings: 99%**
|
|
412
|
+
**Time savings: 90%**
|
|
413
|
+
**Context rot: Eliminated**
|
|
414
|
+
|
|
415
|
+
## Related Projects
|
|
416
|
+
|
|
417
|
+
- [Dart AI](https://dartai.com) - AI-powered task management platform
|
|
418
|
+
- [MCP](https://modelcontextprotocol.io) - Model Context Protocol specification
|
|
419
|
+
- [SLOP-MCP](https://github.com/belingud/slop-mcp) - Dynamic MCP server management
|
|
420
|
+
|
|
421
|
+
## License
|
|
422
|
+
|
|
423
|
+
MIT
|
|
424
|
+
|
|
425
|
+
---
|
|
426
|
+
|
|
427
|
+
**Built for production use. Tested with live Dart AI workspace managing 2000+ tasks across 67 dartboards.**
|