@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.
- package/dist/formatters.js +1 -1
- package/dist/index.js +47 -3
- package/package.json +1 -1
package/dist/formatters.js
CHANGED
|
@@ -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', {
|