@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.
Files changed (2) hide show
  1. package/dist/index.js +30 -1
  2. 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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@damper/mcp",
3
- "version": "0.10.7",
3
+ "version": "0.11.1",
4
4
  "description": "MCP server for Damper task management",
5
5
  "author": "Damper <hello@usedamper.com>",
6
6
  "repository": {