@damper/mcp 0.10.6 → 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 +26 -7
  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({
@@ -484,15 +497,15 @@ server.registerTool('start_task', {
484
497
  server.registerTool('add_note', {
485
498
  title: 'Add Note',
486
499
  description: 'Add a note to a task. Use ONLY for non-obvious approach decisions and blockers.\n\n' +
487
- '**When to use:**\n' +
488
- '- Decisions: "Decision: Using X because Y"\n' +
489
- '- Blockers: "Blocked: X needs Y before we can proceed"\n\n' +
490
500
  '**Do NOT use for:** Session start/end ceremony, commit logging (use `add_commit`), or restating what code changes do.\n\n' +
491
- '**Formatting:** Notes are rendered as markdown. Use **bold** for key terms, `code` for technical names, and bullet lists for multiple points. ' +
492
- 'Start with a short bold label like **Decision:** or **Blocked:**.',
501
+ '**Templates** (copy and fill in):\n\n' +
502
+ 'Decision:\n```\n**Decision:** Chose `libraryName` over `alternative` because it supports X and has fewer dependencies\n```\n\n' +
503
+ 'Blocker:\n```\n**Blocked:** Cannot proceed with `featureName` until:\n- Dependency X is merged\n- API endpoint Y is available\n```\n\n' +
504
+ 'Observation:\n```\n**Note:** Found that `componentName` already handles X via `methodName` — reusing instead of reimplementing\n```',
493
505
  inputSchema: z.object({
494
506
  taskId: z.string(),
495
- note: z.string().describe('Markdown-formatted note. Use **bold** labels, `code` for technical terms, and bullet lists for structure.'),
507
+ note: z.string().describe('Markdown-formatted note. Start with a **bold label** (Decision/Blocked/Note), ' +
508
+ 'use `code` for technical names, and bullet lists for multiple points.'),
496
509
  }),
497
510
  outputSchema: z.object({
498
511
  taskId: z.string(),
@@ -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.6",
3
+ "version": "0.11.0",
4
4
  "description": "MCP server for Damper task management",
5
5
  "author": "Damper <hello@usedamper.com>",
6
6
  "repository": {