@damper/mcp 0.10.7 → 0.11.1
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/dist/index.js +30 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -10,6 +10,16 @@ if (!API_KEY) {
|
|
|
10
10
|
console.error('DAMPER_API_KEY required. Get one from Damper → Settings → API Keys');
|
|
11
11
|
process.exit(1);
|
|
12
12
|
}
|
|
13
|
+
// Deprecation notice — hosted version is now available
|
|
14
|
+
console.error('\n⚠️ @damper/mcp (stdio) is deprecated. Switch to the hosted version:\n' +
|
|
15
|
+
'\n' +
|
|
16
|
+
' "damper": {\n' +
|
|
17
|
+
' "type": "http",\n' +
|
|
18
|
+
' "url": "https://api.usedamper.com/mcp",\n' +
|
|
19
|
+
' "headers": { "Authorization": "Bearer YOUR_API_KEY" }\n' +
|
|
20
|
+
' }\n' +
|
|
21
|
+
'\n' +
|
|
22
|
+
' See: https://usedamper.com/docs/mcp\n');
|
|
13
23
|
// API Client
|
|
14
24
|
async function api(method, path, body) {
|
|
15
25
|
const res = await fetch(`${API_URL}${path}`, {
|
|
@@ -84,6 +94,7 @@ const TaskDetailSchema = z.object({
|
|
|
84
94
|
description: z.string().nullable().optional(),
|
|
85
95
|
type: z.string(),
|
|
86
96
|
implementationPlan: z.string().nullable().optional(),
|
|
97
|
+
userStories: z.string().nullable().optional(),
|
|
87
98
|
status: z.string(),
|
|
88
99
|
priority: z.string().nullable().optional(),
|
|
89
100
|
effort: z.string().nullable().optional(),
|
|
@@ -235,6 +246,8 @@ server.registerTool('get_task', {
|
|
|
235
246
|
parts.push(meta.join(' | '));
|
|
236
247
|
if (t.description)
|
|
237
248
|
parts.push(`\n## Description\n${t.description}`);
|
|
249
|
+
if (t.userStories)
|
|
250
|
+
parts.push(`\n## User Stories\n${t.userStories}`);
|
|
238
251
|
if (t.implementationPlan)
|
|
239
252
|
parts.push(`\n## Plan\n${t.implementationPlan}`);
|
|
240
253
|
// Show subtasks
|
|
@@ -284,6 +297,8 @@ server.registerTool('update_task', {
|
|
|
284
297
|
description: z.string().optional().describe('Task description (shown on public roadmap). Write for end users: 1-3 sentences on what changes and why it matters. ' +
|
|
285
298
|
'No code references, file paths, or jargon.'),
|
|
286
299
|
implementationPlan: z.string().optional().describe('Implementation plan (markdown, internal only - never shown publicly)'),
|
|
300
|
+
userStories: z.string().optional().describe('User stories describing how users interact with the feature (markdown, internal only). ' +
|
|
301
|
+
'Format: "As a [role], I [action] so that [benefit]." Include UI flows, buttons clicked, pages visited, API calls made.'),
|
|
287
302
|
reviewInstructions: z.string().optional().describe('Review instructions (markdown, internal only). What the reviewer should test, verify, or check. ' +
|
|
288
303
|
'Write specific, actionable steps — not a restatement of what was done.'),
|
|
289
304
|
priority: z.enum(['high', 'medium', 'low']).nullable().optional().describe('Task priority'),
|
|
@@ -297,6 +312,7 @@ server.registerTool('update_task', {
|
|
|
297
312
|
title: z.string(),
|
|
298
313
|
description: z.string().nullable().optional(),
|
|
299
314
|
implementationPlan: z.string().nullable().optional(),
|
|
315
|
+
userStories: z.string().nullable().optional(),
|
|
300
316
|
reviewInstructions: z.string().nullable().optional(),
|
|
301
317
|
priority: z.string().nullable().optional(),
|
|
302
318
|
effort: z.string().nullable().optional(),
|
|
@@ -310,7 +326,7 @@ server.registerTool('update_task', {
|
|
|
310
326
|
idempotentHint: true,
|
|
311
327
|
openWorldHint: false,
|
|
312
328
|
},
|
|
313
|
-
}, async ({ taskId, title, description, implementationPlan, reviewInstructions, priority, effort, quarter, labels, isPublic }) => {
|
|
329
|
+
}, async ({ taskId, title, description, implementationPlan, userStories, reviewInstructions, priority, effort, quarter, labels, isPublic }) => {
|
|
314
330
|
const body = {};
|
|
315
331
|
if (title !== undefined)
|
|
316
332
|
body.title = title;
|
|
@@ -318,6 +334,8 @@ server.registerTool('update_task', {
|
|
|
318
334
|
body.description = description;
|
|
319
335
|
if (implementationPlan !== undefined)
|
|
320
336
|
body.implementationPlan = implementationPlan;
|
|
337
|
+
if (userStories !== undefined)
|
|
338
|
+
body.userStories = userStories;
|
|
321
339
|
if (reviewInstructions !== undefined)
|
|
322
340
|
body.reviewInstructions = reviewInstructions;
|
|
323
341
|
if (priority !== undefined)
|
|
@@ -338,6 +356,8 @@ server.registerTool('update_task', {
|
|
|
338
356
|
updates.push('description');
|
|
339
357
|
if (implementationPlan !== undefined)
|
|
340
358
|
updates.push('plan');
|
|
359
|
+
if (userStories !== undefined)
|
|
360
|
+
updates.push('userStories');
|
|
341
361
|
if (reviewInstructions !== undefined)
|
|
342
362
|
updates.push('reviewInstructions');
|
|
343
363
|
if (priority !== undefined)
|
|
@@ -357,6 +377,7 @@ server.registerTool('update_task', {
|
|
|
357
377
|
title: result.title,
|
|
358
378
|
description: result.description,
|
|
359
379
|
implementationPlan: result.implementationPlan,
|
|
380
|
+
userStories: result.userStories,
|
|
360
381
|
reviewInstructions: result.reviewInstructions,
|
|
361
382
|
priority: result.priority,
|
|
362
383
|
effort: result.effort,
|
|
@@ -380,6 +401,8 @@ server.registerTool('create_task', {
|
|
|
380
401
|
status: z.enum(['planned', 'in_progress', 'in_review', 'done']).optional(),
|
|
381
402
|
priority: z.enum(['high', 'medium', 'low']).optional().describe('Task priority'),
|
|
382
403
|
implementationPlan: z.string().optional().describe('Implementation plan (markdown, internal only - never shown publicly)'),
|
|
404
|
+
userStories: z.string().optional().describe('User stories describing how users interact with the feature (markdown, internal only). ' +
|
|
405
|
+
'Format: "As a [role], I [action] so that [benefit]." Include UI flows, buttons clicked, pages visited, API calls made.'),
|
|
383
406
|
isPublic: z.boolean().optional().describe('Whether task is visible on public roadmap (default: true)'),
|
|
384
407
|
}),
|
|
385
408
|
outputSchema: z.object({
|
|
@@ -898,6 +921,12 @@ All content you generate — titles, descriptions, changelogs, notes — should
|
|
|
898
921
|
- 1-3 sentences explaining what changes and why it matters to users
|
|
899
922
|
- Focus on the user benefit, not implementation details
|
|
900
923
|
|
|
924
|
+
**User stories** (internal, never shown publicly):
|
|
925
|
+
- Describe how users interact with the feature — UI flows, buttons clicked, pages visited, API endpoints called
|
|
926
|
+
- Format: "As a [role], I [action] so that [benefit]"
|
|
927
|
+
- Include step-by-step flows where helpful
|
|
928
|
+
- Bridges the gap between description (what) and implementation plan (how)
|
|
929
|
+
|
|
901
930
|
**Subtask titles:**
|
|
902
931
|
- Short imperative phrase: "Add validation to login form"
|
|
903
932
|
- Specific enough to track independently
|