@damper/mcp 0.10.7 → 0.11.0

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 (2) hide show
  1. package/dist/index.js +20 -1
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -84,6 +84,7 @@ const TaskDetailSchema = z.object({
84
84
  description: z.string().nullable().optional(),
85
85
  type: z.string(),
86
86
  implementationPlan: z.string().nullable().optional(),
87
+ userStories: z.string().nullable().optional(),
87
88
  status: z.string(),
88
89
  priority: z.string().nullable().optional(),
89
90
  effort: z.string().nullable().optional(),
@@ -235,6 +236,8 @@ server.registerTool('get_task', {
235
236
  parts.push(meta.join(' | '));
236
237
  if (t.description)
237
238
  parts.push(`\n## Description\n${t.description}`);
239
+ if (t.userStories)
240
+ parts.push(`\n## User Stories\n${t.userStories}`);
238
241
  if (t.implementationPlan)
239
242
  parts.push(`\n## Plan\n${t.implementationPlan}`);
240
243
  // Show subtasks
@@ -284,6 +287,8 @@ server.registerTool('update_task', {
284
287
  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
288
  'No code references, file paths, or jargon.'),
286
289
  implementationPlan: z.string().optional().describe('Implementation plan (markdown, internal only - never shown publicly)'),
290
+ userStories: z.string().optional().describe('User stories describing how users interact with the feature (markdown, internal only). ' +
291
+ 'Format: "As a [role], I [action] so that [benefit]." Include UI flows, buttons clicked, pages visited, API calls made.'),
287
292
  reviewInstructions: z.string().optional().describe('Review instructions (markdown, internal only). What the reviewer should test, verify, or check. ' +
288
293
  'Write specific, actionable steps — not a restatement of what was done.'),
289
294
  priority: z.enum(['high', 'medium', 'low']).nullable().optional().describe('Task priority'),
@@ -297,6 +302,7 @@ server.registerTool('update_task', {
297
302
  title: z.string(),
298
303
  description: z.string().nullable().optional(),
299
304
  implementationPlan: z.string().nullable().optional(),
305
+ userStories: z.string().nullable().optional(),
300
306
  reviewInstructions: z.string().nullable().optional(),
301
307
  priority: z.string().nullable().optional(),
302
308
  effort: z.string().nullable().optional(),
@@ -310,7 +316,7 @@ server.registerTool('update_task', {
310
316
  idempotentHint: true,
311
317
  openWorldHint: false,
312
318
  },
313
- }, async ({ taskId, title, description, implementationPlan, reviewInstructions, priority, effort, quarter, labels, isPublic }) => {
319
+ }, async ({ taskId, title, description, implementationPlan, userStories, reviewInstructions, priority, effort, quarter, labels, isPublic }) => {
314
320
  const body = {};
315
321
  if (title !== undefined)
316
322
  body.title = title;
@@ -318,6 +324,8 @@ server.registerTool('update_task', {
318
324
  body.description = description;
319
325
  if (implementationPlan !== undefined)
320
326
  body.implementationPlan = implementationPlan;
327
+ if (userStories !== undefined)
328
+ body.userStories = userStories;
321
329
  if (reviewInstructions !== undefined)
322
330
  body.reviewInstructions = reviewInstructions;
323
331
  if (priority !== undefined)
@@ -338,6 +346,8 @@ server.registerTool('update_task', {
338
346
  updates.push('description');
339
347
  if (implementationPlan !== undefined)
340
348
  updates.push('plan');
349
+ if (userStories !== undefined)
350
+ updates.push('userStories');
341
351
  if (reviewInstructions !== undefined)
342
352
  updates.push('reviewInstructions');
343
353
  if (priority !== undefined)
@@ -357,6 +367,7 @@ server.registerTool('update_task', {
357
367
  title: result.title,
358
368
  description: result.description,
359
369
  implementationPlan: result.implementationPlan,
370
+ userStories: result.userStories,
360
371
  reviewInstructions: result.reviewInstructions,
361
372
  priority: result.priority,
362
373
  effort: result.effort,
@@ -380,6 +391,8 @@ server.registerTool('create_task', {
380
391
  status: z.enum(['planned', 'in_progress', 'in_review', 'done']).optional(),
381
392
  priority: z.enum(['high', 'medium', 'low']).optional().describe('Task priority'),
382
393
  implementationPlan: z.string().optional().describe('Implementation plan (markdown, internal only - never shown publicly)'),
394
+ userStories: z.string().optional().describe('User stories describing how users interact with the feature (markdown, internal only). ' +
395
+ 'Format: "As a [role], I [action] so that [benefit]." Include UI flows, buttons clicked, pages visited, API calls made.'),
383
396
  isPublic: z.boolean().optional().describe('Whether task is visible on public roadmap (default: true)'),
384
397
  }),
385
398
  outputSchema: z.object({
@@ -898,6 +911,12 @@ All content you generate — titles, descriptions, changelogs, notes — should
898
911
  - 1-3 sentences explaining what changes and why it matters to users
899
912
  - Focus on the user benefit, not implementation details
900
913
 
914
+ **User stories** (internal, never shown publicly):
915
+ - Describe how users interact with the feature — UI flows, buttons clicked, pages visited, API endpoints called
916
+ - Format: "As a [role], I [action] so that [benefit]"
917
+ - Include step-by-step flows where helpful
918
+ - Bridges the gap between description (what) and implementation plan (how)
919
+
901
920
  **Subtask titles:**
902
921
  - Short imperative phrase: "Add validation to login form"
903
922
  - Specific enough to track independently
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@damper/mcp",
3
- "version": "0.10.7",
3
+ "version": "0.11.0",
4
4
  "description": "MCP server for Damper task management",
5
5
  "author": "Damper <hello@usedamper.com>",
6
6
  "repository": {