@damper/mcp 0.9.0 → 0.10.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.
@@ -113,7 +113,7 @@ export function formatReviewTaskResponse(result, assessment) {
113
113
  lines.push(` □ ${item}`);
114
114
  }
115
115
  }
116
- lines.push('\n**Next:** Push commits, then call `complete_task` with summary.');
116
+ lines.push('\n**Next:** Push commits, then call `complete_task` with summary and `reviewInstructions` (what to test/verify).');
117
117
  return lines.join('\n');
118
118
  }
119
119
  /**
package/dist/index.js CHANGED
@@ -283,6 +283,8 @@ server.registerTool('update_task', {
283
283
  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. ' +
284
284
  'No code references, file paths, or jargon.'),
285
285
  implementationPlan: z.string().optional().describe('Implementation plan (markdown, internal only - never shown publicly)'),
286
+ reviewInstructions: z.string().optional().describe('Review instructions (markdown, internal only). What the reviewer should test, verify, or check. ' +
287
+ 'Write specific, actionable steps — not a restatement of what was done.'),
286
288
  priority: z.enum(['high', 'medium', 'low']).nullable().optional().describe('Task priority'),
287
289
  effort: z.enum(['xs', 's', 'm', 'l', 'xl']).nullable().optional().describe('Estimated effort'),
288
290
  quarter: z.string().nullable().optional().describe('Target quarter (e.g., "Q1 2025", "Q2 2025")'),
@@ -294,6 +296,7 @@ server.registerTool('update_task', {
294
296
  title: z.string(),
295
297
  description: z.string().nullable().optional(),
296
298
  implementationPlan: z.string().nullable().optional(),
299
+ reviewInstructions: z.string().nullable().optional(),
297
300
  priority: z.string().nullable().optional(),
298
301
  effort: z.string().nullable().optional(),
299
302
  quarter: z.string().nullable().optional(),
@@ -306,7 +309,7 @@ server.registerTool('update_task', {
306
309
  idempotentHint: true,
307
310
  openWorldHint: false,
308
311
  },
309
- }, async ({ taskId, title, description, implementationPlan, priority, effort, quarter, labels, isPublic }) => {
312
+ }, async ({ taskId, title, description, implementationPlan, reviewInstructions, priority, effort, quarter, labels, isPublic }) => {
310
313
  const body = {};
311
314
  if (title !== undefined)
312
315
  body.title = title;
@@ -314,6 +317,8 @@ server.registerTool('update_task', {
314
317
  body.description = description;
315
318
  if (implementationPlan !== undefined)
316
319
  body.implementationPlan = implementationPlan;
320
+ if (reviewInstructions !== undefined)
321
+ body.reviewInstructions = reviewInstructions;
317
322
  if (priority !== undefined)
318
323
  body.priority = priority;
319
324
  if (effort !== undefined)
@@ -332,6 +337,8 @@ server.registerTool('update_task', {
332
337
  updates.push('description');
333
338
  if (implementationPlan !== undefined)
334
339
  updates.push('plan');
340
+ if (reviewInstructions !== undefined)
341
+ updates.push('reviewInstructions');
335
342
  if (priority !== undefined)
336
343
  updates.push(`priority=${priority || 'none'}`);
337
344
  if (effort !== undefined)
@@ -349,6 +356,7 @@ server.registerTool('update_task', {
349
356
  title: result.title,
350
357
  description: result.description,
351
358
  implementationPlan: result.implementationPlan,
359
+ reviewInstructions: result.reviewInstructions,
352
360
  priority: result.priority,
353
361
  effort: result.effort,
354
362
  quarter: result.quarter,
@@ -661,6 +669,8 @@ server.registerTool('complete_task', {
661
669
  'and concrete evidence proving you verified it (e.g., test output, build log snippet). ' +
662
670
  'Empty evidence or evidence identical to the item text will be rejected.\n\n' +
663
671
  '**Commits:** Pass commits array to log them at completion (convenience for final commits).\n\n' +
672
+ '**Review instructions:** When sending to review (default), provide `reviewInstructions` — specific steps ' +
673
+ 'for the reviewer: what to test in UI, edge cases, areas of risk. Not a restatement of what was done.\n\n' +
664
674
  'Returns documentation update suggestions.',
665
675
  inputSchema: z.object({
666
676
  taskId: z.string(),
@@ -674,6 +684,9 @@ server.registerTool('complete_task', {
674
684
  evidence: z.string().describe('Concrete proof of verification (e.g., "bun test: 47 passed, 0 failed")'),
675
685
  })).optional().describe('Completion checklist confirmations — echo back each item from the checklist shown in start_task'),
676
686
  skipReview: z.boolean().optional().describe('Skip human review and mark task as done immediately (default: false, task goes to in_review)'),
687
+ reviewInstructions: z.string().optional().describe('What the reviewer should test or verify (markdown). Recommended when sending to review (default behavior). ' +
688
+ 'Write specific, actionable steps: what to test in the UI, what edge cases to check, ' +
689
+ 'what areas might break. Not a restatement of the summary.'),
677
690
  }),
678
691
  outputSchema: z.object({
679
692
  id: z.string(),
@@ -686,9 +699,9 @@ server.registerTool('complete_task', {
686
699
  idempotentHint: true,
687
700
  openWorldHint: false,
688
701
  },
689
- }, async ({ taskId, summary, commits, confirmations, skipReview }) => {
702
+ }, async ({ taskId, summary, commits, confirmations, skipReview, reviewInstructions }) => {
690
703
  try {
691
- const result = await api('POST', `/api/agent/tasks/${taskId}/complete`, { summary, commits, confirmations, skipReview });
704
+ const result = await api('POST', `/api/agent/tasks/${taskId}/complete`, { summary, commits, confirmations, skipReview, reviewInstructions });
692
705
  return {
693
706
  content: [{ type: 'text', text: formatCompleteTaskResponse(result) }],
694
707
  structuredContent: result,
@@ -888,6 +901,12 @@ All content you generate — titles, descriptions, changelogs, notes — should
888
901
  - Types: feat, fix, refactor, test, docs, chore, style, perf
889
902
  - Imperative mood: "add feature" not "added feature"
890
903
 
904
+ **Review instructions** (provided at task completion via \`reviewInstructions\`):
905
+ - Write for a human reviewer who hasn't seen the code changes
906
+ - List specific things to test: UI flows, edge cases, regressions
907
+ - Mention files/areas that were changed and what to verify
908
+ - Include any setup steps needed to test (e.g., "run migrations first")
909
+
891
910
  **Notes:**
892
911
  - Prefix with category: "Decision: …", "Blocked: …", "Context: …"
893
912
  - Only log non-obvious decisions and blockers — skip routine progress
@@ -2058,6 +2077,31 @@ server.registerTool('publish_changelog', {
2058
2077
  },
2059
2078
  };
2060
2079
  });
2080
+ // Tool: Delete changelog
2081
+ server.registerTool('delete_changelog', {
2082
+ title: 'Delete Changelog',
2083
+ description: 'Permanently delete a changelog entry.',
2084
+ inputSchema: z.object({
2085
+ changelogId: z.string().describe('Changelog ID'),
2086
+ }),
2087
+ outputSchema: z.object({
2088
+ success: z.boolean(),
2089
+ id: z.string(),
2090
+ title: z.string(),
2091
+ }),
2092
+ annotations: {
2093
+ readOnlyHint: false,
2094
+ destructiveHint: true,
2095
+ idempotentHint: true,
2096
+ openWorldHint: false,
2097
+ },
2098
+ }, async ({ changelogId }) => {
2099
+ const result = await api('DELETE', `/api/agent/changelogs/${changelogId}`);
2100
+ return {
2101
+ content: [{ type: 'text', text: `Deleted changelog: "${result.title}"` }],
2102
+ structuredContent: result,
2103
+ };
2104
+ });
2061
2105
  // ==================== Project Settings Tools ====================
2062
2106
  // Tool: Get project settings
2063
2107
  server.registerTool('get_project_settings', {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@damper/mcp",
3
- "version": "0.9.0",
3
+ "version": "0.10.0",
4
4
  "description": "MCP server for Damper task management",
5
5
  "author": "Damper <hello@usedamper.com>",
6
6
  "repository": {