@damper/mcp 0.1.8 → 0.1.9
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/README.md +3 -1
- package/dist/index.js +17 -5
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -74,7 +74,7 @@ The AI will see tools from both servers and can distinguish between them:
|
|
|
74
74
|
| `list_tasks` | Get roadmap tasks (filter by `status`, `type`) |
|
|
75
75
|
| `get_task` | Task details + subtasks + linked feedback |
|
|
76
76
|
| `create_task` | Create task with type (bug, feature, improvement, task) |
|
|
77
|
-
| `update_task` | Update description, plan, priority, effort, labels |
|
|
77
|
+
| `update_task` | Update description, plan, priority, effort, quarter, labels |
|
|
78
78
|
| `start_task` | Lock and start task (use `force` to take over) |
|
|
79
79
|
| `add_note` | Add progress note |
|
|
80
80
|
| `create_subtask` | Add subtask to a task |
|
|
@@ -102,6 +102,7 @@ Tasks include project management fields visible in `list_tasks` and `get_task`:
|
|
|
102
102
|
|
|
103
103
|
- **Priority**: high 🔴, medium 🟡, low ⚪
|
|
104
104
|
- **Effort**: xs, s, m, l, xl
|
|
105
|
+
- **Quarter**: Target quarter (Q1 2025, Q2 2025, etc.)
|
|
105
106
|
- **Labels**: Custom tags
|
|
106
107
|
- **Due date**: Target completion date
|
|
107
108
|
|
|
@@ -114,6 +115,7 @@ Refine task details as you work:
|
|
|
114
115
|
> Update the implementation plan with what I've learned
|
|
115
116
|
> Add labels: backend, api, auth
|
|
116
117
|
> Set effort to medium
|
|
118
|
+
> Schedule this for Q2 2025
|
|
117
119
|
```
|
|
118
120
|
|
|
119
121
|
### Subtasks
|
package/dist/index.js
CHANGED
|
@@ -34,7 +34,7 @@ async function api(method, path, body) {
|
|
|
34
34
|
// Server
|
|
35
35
|
const server = new McpServer({
|
|
36
36
|
name: 'damper',
|
|
37
|
-
version: '0.1.
|
|
37
|
+
version: '0.1.9',
|
|
38
38
|
});
|
|
39
39
|
// Output schemas
|
|
40
40
|
const SubtaskProgressSchema = z.object({
|
|
@@ -48,6 +48,7 @@ const TaskSummarySchema = z.object({
|
|
|
48
48
|
status: z.string(),
|
|
49
49
|
priority: z.string(),
|
|
50
50
|
effort: z.string().nullable().optional(),
|
|
51
|
+
quarter: z.string().nullable().optional(),
|
|
51
52
|
labels: z.array(z.string()).optional(),
|
|
52
53
|
dueDate: z.string().nullable().optional(),
|
|
53
54
|
feedbackCount: z.number(),
|
|
@@ -68,6 +69,7 @@ const TaskDetailSchema = z.object({
|
|
|
68
69
|
status: z.string(),
|
|
69
70
|
priority: z.string().nullable().optional(),
|
|
70
71
|
effort: z.string().nullable().optional(),
|
|
72
|
+
quarter: z.string().nullable().optional(),
|
|
71
73
|
labels: z.array(z.string()).optional(),
|
|
72
74
|
dueDate: z.string().nullable().optional(),
|
|
73
75
|
voteScore: z.number(),
|
|
@@ -138,7 +140,8 @@ server.registerTool('list_tasks', {
|
|
|
138
140
|
const p = t.priority === 'high' ? '🔴' : t.priority === 'medium' ? '🟡' : '⚪';
|
|
139
141
|
const typeIcon = t.type === 'bug' ? '🐛' : t.type === 'feature' ? '✨' : t.type === 'improvement' ? '💡' : '📌';
|
|
140
142
|
const subtaskInfo = t.subtaskProgress ? ` [${t.subtaskProgress.done}/${t.subtaskProgress.total}]` : '';
|
|
141
|
-
|
|
143
|
+
const quarterInfo = t.quarter ? ` 📅${t.quarter}` : '';
|
|
144
|
+
return `• ${t.id}: ${typeIcon} ${t.title} [${t.status}] ${p}${quarterInfo}${t.hasImplementationPlan ? ' 📋' : ''}${subtaskInfo}`;
|
|
142
145
|
});
|
|
143
146
|
return {
|
|
144
147
|
content: [{ type: 'text', text: `Tasks in "${data.project.name}":\n${lines.join('\n')}` }],
|
|
@@ -166,12 +169,14 @@ server.registerTool('get_task', {
|
|
|
166
169
|
`# ${typeIcon} ${t.title}`,
|
|
167
170
|
`Type: ${t.type} | Status: ${t.status} | Score: ${t.voteScore}`,
|
|
168
171
|
];
|
|
169
|
-
// Add priority/effort/labels if present
|
|
172
|
+
// Add priority/effort/quarter/labels if present
|
|
170
173
|
const meta = [];
|
|
171
174
|
if (t.priority)
|
|
172
175
|
meta.push(`Priority: ${t.priority}`);
|
|
173
176
|
if (t.effort)
|
|
174
177
|
meta.push(`Effort: ${t.effort}`);
|
|
178
|
+
if (t.quarter)
|
|
179
|
+
meta.push(`Quarter: ${t.quarter}`);
|
|
175
180
|
if (t.dueDate)
|
|
176
181
|
meta.push(`Due: ${t.dueDate}`);
|
|
177
182
|
if (t.labels && t.labels.length)
|
|
@@ -202,7 +207,7 @@ server.registerTool('get_task', {
|
|
|
202
207
|
// Tool: Update task
|
|
203
208
|
server.registerTool('update_task', {
|
|
204
209
|
title: 'Update Task',
|
|
205
|
-
description: 'Update task fields like description, implementation plan, priority, effort, or labels. ' +
|
|
210
|
+
description: 'Update task fields like description, implementation plan, priority, effort, quarter, or labels. ' +
|
|
206
211
|
'Useful for refining task details as you learn more about the work.',
|
|
207
212
|
inputSchema: z.object({
|
|
208
213
|
taskId: z.string().describe('Task ID'),
|
|
@@ -210,6 +215,7 @@ server.registerTool('update_task', {
|
|
|
210
215
|
implementationPlan: z.string().optional().describe('Implementation plan (markdown)'),
|
|
211
216
|
priority: z.enum(['high', 'medium', 'low']).nullable().optional().describe('Task priority'),
|
|
212
217
|
effort: z.enum(['xs', 's', 'm', 'l', 'xl']).nullable().optional().describe('Estimated effort'),
|
|
218
|
+
quarter: z.string().nullable().optional().describe('Target quarter (e.g., "Q1 2025", "Q2 2025")'),
|
|
213
219
|
labels: z.array(z.string()).optional().describe('Labels/tags'),
|
|
214
220
|
}),
|
|
215
221
|
outputSchema: z.object({
|
|
@@ -219,6 +225,7 @@ server.registerTool('update_task', {
|
|
|
219
225
|
implementationPlan: z.string().nullable().optional(),
|
|
220
226
|
priority: z.string().nullable().optional(),
|
|
221
227
|
effort: z.string().nullable().optional(),
|
|
228
|
+
quarter: z.string().nullable().optional(),
|
|
222
229
|
labels: z.array(z.string()).optional(),
|
|
223
230
|
}),
|
|
224
231
|
annotations: {
|
|
@@ -227,7 +234,7 @@ server.registerTool('update_task', {
|
|
|
227
234
|
idempotentHint: true,
|
|
228
235
|
openWorldHint: false,
|
|
229
236
|
},
|
|
230
|
-
}, async ({ taskId, description, implementationPlan, priority, effort, labels }) => {
|
|
237
|
+
}, async ({ taskId, description, implementationPlan, priority, effort, quarter, labels }) => {
|
|
231
238
|
const body = {};
|
|
232
239
|
if (description !== undefined)
|
|
233
240
|
body.description = description;
|
|
@@ -237,6 +244,8 @@ server.registerTool('update_task', {
|
|
|
237
244
|
body.priority = priority;
|
|
238
245
|
if (effort !== undefined)
|
|
239
246
|
body.effort = effort;
|
|
247
|
+
if (quarter !== undefined)
|
|
248
|
+
body.quarter = quarter;
|
|
240
249
|
if (labels !== undefined)
|
|
241
250
|
body.labels = labels;
|
|
242
251
|
const result = await api('PATCH', `/api/agent/tasks/${taskId}`, body);
|
|
@@ -249,6 +258,8 @@ server.registerTool('update_task', {
|
|
|
249
258
|
updates.push(`priority=${priority || 'none'}`);
|
|
250
259
|
if (effort !== undefined)
|
|
251
260
|
updates.push(`effort=${effort || 'none'}`);
|
|
261
|
+
if (quarter !== undefined)
|
|
262
|
+
updates.push(`quarter=${quarter || 'none'}`);
|
|
252
263
|
if (labels !== undefined)
|
|
253
264
|
updates.push(`labels=[${labels.join(', ')}]`);
|
|
254
265
|
return {
|
|
@@ -260,6 +271,7 @@ server.registerTool('update_task', {
|
|
|
260
271
|
implementationPlan: result.implementationPlan,
|
|
261
272
|
priority: result.priority,
|
|
262
273
|
effort: result.effort,
|
|
274
|
+
quarter: result.quarter,
|
|
263
275
|
labels: result.labels,
|
|
264
276
|
},
|
|
265
277
|
};
|