@damper/mcp 0.6.0 ā 0.6.2
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 +2 -1
- package/dist/index.js +37 -13
- package/package.json +1 -1
package/dist/formatters.js
CHANGED
|
@@ -19,7 +19,8 @@ export function formatStartTaskResponse(result) {
|
|
|
19
19
|
// Completion checklist - shown after critical rules so agent knows upfront
|
|
20
20
|
if (result.completionChecklist && result.completionChecklist.length > 0) {
|
|
21
21
|
lines.push('\nš **COMPLETION CHECKLIST (required for complete_task):**');
|
|
22
|
-
lines.push('You MUST verify each item and pass
|
|
22
|
+
lines.push('You MUST verify each item and pass as `confirmations` with evidence:');
|
|
23
|
+
lines.push('Format: `[{item: "...", evidence: "..."}]` ā evidence must be concrete proof, not just repeating the item.');
|
|
23
24
|
for (const item of result.completionChecklist) {
|
|
24
25
|
lines.push(` ā” ${item}`);
|
|
25
26
|
}
|
package/dist/index.js
CHANGED
|
@@ -29,7 +29,7 @@ async function api(method, path, body) {
|
|
|
29
29
|
throw lockErr;
|
|
30
30
|
}
|
|
31
31
|
// Preserve checklist info for 400 checklist failures
|
|
32
|
-
if (res.status === 400 && err.missingItems) {
|
|
32
|
+
if (res.status === 400 && (err.missingItems || err.invalidEvidence)) {
|
|
33
33
|
const checklistErr = new Error(err.error || `HTTP ${res.status}`);
|
|
34
34
|
checklistErr.checklistInfo = err;
|
|
35
35
|
throw checklistErr;
|
|
@@ -41,7 +41,7 @@ async function api(method, path, body) {
|
|
|
41
41
|
// Server
|
|
42
42
|
const server = new McpServer({
|
|
43
43
|
name: 'damper',
|
|
44
|
-
version: '0.
|
|
44
|
+
version: '0.5.1',
|
|
45
45
|
});
|
|
46
46
|
// Output schemas
|
|
47
47
|
const SubtaskProgressSchema = z.object({
|
|
@@ -595,8 +595,9 @@ server.registerTool('complete_task', {
|
|
|
595
595
|
'1. Push all commits\n' +
|
|
596
596
|
'2. Check if project context docs need updating\n\n' +
|
|
597
597
|
'**Completion checklist:** If the project has a completion checklist (shown in `start_task` response), ' +
|
|
598
|
-
'you MUST pass `confirmations` ā an array
|
|
599
|
-
'
|
|
598
|
+
'you MUST pass `confirmations` ā an array of `{item, evidence}` objects. Each confirmation needs the checklist item text ' +
|
|
599
|
+
'and concrete evidence proving you verified it (e.g., test output, build log snippet). ' +
|
|
600
|
+
'Empty evidence or evidence identical to the item text will be rejected.\n\n' +
|
|
600
601
|
'**Commits:** Pass commits array to log them at completion (convenience for final commits).\n\n' +
|
|
601
602
|
'Returns documentation update suggestions.',
|
|
602
603
|
inputSchema: z.object({
|
|
@@ -606,7 +607,10 @@ server.registerTool('complete_task', {
|
|
|
606
607
|
hash: z.string().describe('Commit hash (short or full)'),
|
|
607
608
|
message: z.string().describe('Commit message'),
|
|
608
609
|
})).optional().describe('Optional: commits to log at completion'),
|
|
609
|
-
confirmations: z.array(z.
|
|
610
|
+
confirmations: z.array(z.object({
|
|
611
|
+
item: z.string().describe('Checklist item text from start_task'),
|
|
612
|
+
evidence: z.string().describe('Concrete proof of verification (e.g., "bun test: 47 passed, 0 failed")'),
|
|
613
|
+
})).optional().describe('Completion checklist confirmations ā echo back each item from the checklist shown in start_task'),
|
|
610
614
|
}),
|
|
611
615
|
outputSchema: z.object({
|
|
612
616
|
id: z.string(),
|
|
@@ -630,15 +634,25 @@ server.registerTool('complete_task', {
|
|
|
630
634
|
catch (err) {
|
|
631
635
|
const error = err;
|
|
632
636
|
if (error.checklistInfo) {
|
|
633
|
-
const { missingItems, checklist } = error.checklistInfo;
|
|
637
|
+
const { missingItems, invalidEvidence, checklist } = error.checklistInfo;
|
|
634
638
|
const lines = [
|
|
635
639
|
'ā Completion blocked ā checklist not fully confirmed.',
|
|
636
640
|
'',
|
|
637
|
-
`**Missing ${missingItems.length} of ${checklist.length} items:**`,
|
|
638
|
-
...missingItems.map(item => ` ⢠${item}`),
|
|
639
|
-
'',
|
|
640
|
-
'Pass ALL checklist items in `confirmations` to complete the task.',
|
|
641
641
|
];
|
|
642
|
+
if (missingItems.length > 0) {
|
|
643
|
+
lines.push(`**Missing ${missingItems.length} of ${checklist.length} items:**`);
|
|
644
|
+
lines.push(...missingItems.map(item => ` ⢠${item}`));
|
|
645
|
+
lines.push('');
|
|
646
|
+
}
|
|
647
|
+
if (invalidEvidence && invalidEvidence.length > 0) {
|
|
648
|
+
lines.push(`**Invalid evidence for ${invalidEvidence.length} item(s):**`);
|
|
649
|
+
lines.push(...invalidEvidence.map(item => ` ⢠${item}`));
|
|
650
|
+
lines.push('');
|
|
651
|
+
lines.push('Evidence must be non-empty and different from the checklist item text.');
|
|
652
|
+
lines.push('Provide concrete proof (e.g., "bun test: 47 passed, 0 failed").');
|
|
653
|
+
lines.push('');
|
|
654
|
+
}
|
|
655
|
+
lines.push('Pass ALL checklist items in `confirmations` with valid evidence to complete the task.');
|
|
642
656
|
return {
|
|
643
657
|
content: [{ type: 'text', text: lines.join('\n') }],
|
|
644
658
|
isError: true,
|
|
@@ -722,7 +736,7 @@ server.registerTool('get_agent_instructions', {
|
|
|
722
736
|
openWorldHint: false,
|
|
723
737
|
},
|
|
724
738
|
}, async ({ format = 'section' }) => {
|
|
725
|
-
const lastModified = '
|
|
739
|
+
const lastModified = '2026-02-08';
|
|
726
740
|
const section = `## Task Management with Damper MCP
|
|
727
741
|
|
|
728
742
|
> Last updated: ${lastModified}
|
|
@@ -739,6 +753,7 @@ This project uses Damper MCP for task tracking. **You MUST follow this workflow.
|
|
|
739
753
|
4. If working on a task: \`start_task\` to lock it
|
|
740
754
|
|
|
741
755
|
### While Working
|
|
756
|
+
- **Do NOT commit or complete tasks without explicit user confirmation** - Always ask the user before running \`git commit\` or calling \`complete_task\`
|
|
742
757
|
- \`add_commit\` after each commit with hash and message
|
|
743
758
|
- \`add_note\` for decisions: "Decision: chose X because Y"
|
|
744
759
|
- \`update_subtask\` to mark subtask progress
|
|
@@ -758,7 +773,8 @@ This project uses Damper MCP for task tracking. **You MUST follow this workflow.
|
|
|
758
773
|
- \`update_project_settings\` - Configure completion checklist and other agent-relevant settings
|
|
759
774
|
|
|
760
775
|
### At Session End (MANDATORY)
|
|
761
|
-
-
|
|
776
|
+
- **Ask the user for confirmation before committing or completing a task** - Never autonomously commit code or call \`complete_task\`
|
|
777
|
+
- Once user confirms, call \`complete_task\` (if done) or \`abandon_task\` (if stopping early)
|
|
762
778
|
- NEVER leave a started task without completing or abandoning it
|
|
763
779
|
- If the project has a **completion checklist** (shown in \`start_task\` response), you MUST pass all items as \`confirmations\` when calling \`complete_task\`
|
|
764
780
|
- If you learned something about the codebase, consider updating project context
|
|
@@ -1707,6 +1723,7 @@ server.registerTool('create_changelog', {
|
|
|
1707
1723
|
title: z.string().describe('Changelog title (e.g., "v2.1.0" or "January 2025 Release")'),
|
|
1708
1724
|
content: z.string().optional().describe('Initial changelog content (markdown)'),
|
|
1709
1725
|
version: z.string().optional().describe('Version number'),
|
|
1726
|
+
date: z.string().optional().describe('Custom display date (ISO 8601). When set, used for sorting/display instead of publishedAt.'),
|
|
1710
1727
|
summary: z.string().max(280).optional().describe('Short summary for social sharing and email subject (max 280 chars)'),
|
|
1711
1728
|
status: z.enum(['draft', 'published']).optional().describe('Status (default: draft)'),
|
|
1712
1729
|
}),
|
|
@@ -1714,6 +1731,7 @@ server.registerTool('create_changelog', {
|
|
|
1714
1731
|
id: z.string(),
|
|
1715
1732
|
title: z.string(),
|
|
1716
1733
|
version: z.string().nullable().optional(),
|
|
1734
|
+
date: z.string().nullable().optional(),
|
|
1717
1735
|
status: z.string(),
|
|
1718
1736
|
}),
|
|
1719
1737
|
annotations: {
|
|
@@ -1740,6 +1758,7 @@ server.registerTool('update_changelog', {
|
|
|
1740
1758
|
title: z.string().optional().describe('New title'),
|
|
1741
1759
|
content: z.string().optional().describe('New content (markdown)'),
|
|
1742
1760
|
version: z.string().optional().describe('Version number'),
|
|
1761
|
+
date: z.string().optional().describe('Custom display date (ISO 8601). When set, used for sorting/display instead of publishedAt. Pass empty string to clear.'),
|
|
1743
1762
|
summary: z.string().max(280).optional().describe('Short summary for social sharing and email subject (max 280 chars)'),
|
|
1744
1763
|
status: z.enum(['draft', 'published']).optional().describe('Status'),
|
|
1745
1764
|
}),
|
|
@@ -1747,6 +1766,7 @@ server.registerTool('update_changelog', {
|
|
|
1747
1766
|
id: z.string(),
|
|
1748
1767
|
title: z.string(),
|
|
1749
1768
|
version: z.string().nullable().optional(),
|
|
1769
|
+
date: z.string().nullable().optional(),
|
|
1750
1770
|
status: z.string(),
|
|
1751
1771
|
publishedAt: z.string().nullable().optional(),
|
|
1752
1772
|
}),
|
|
@@ -1756,7 +1776,7 @@ server.registerTool('update_changelog', {
|
|
|
1756
1776
|
idempotentHint: true,
|
|
1757
1777
|
openWorldHint: false,
|
|
1758
1778
|
},
|
|
1759
|
-
}, async ({ changelogId, title, content, version, status }) => {
|
|
1779
|
+
}, async ({ changelogId, title, content, version, date, summary, status }) => {
|
|
1760
1780
|
const body = {};
|
|
1761
1781
|
if (title !== undefined)
|
|
1762
1782
|
body.title = title;
|
|
@@ -1764,6 +1784,10 @@ server.registerTool('update_changelog', {
|
|
|
1764
1784
|
body.content = content;
|
|
1765
1785
|
if (version !== undefined)
|
|
1766
1786
|
body.version = version;
|
|
1787
|
+
if (date !== undefined)
|
|
1788
|
+
body.date = date;
|
|
1789
|
+
if (summary !== undefined)
|
|
1790
|
+
body.summary = summary;
|
|
1767
1791
|
if (status !== undefined)
|
|
1768
1792
|
body.status = status;
|
|
1769
1793
|
const result = await api('PATCH', `/api/agent/changelogs/${changelogId}`, body);
|