@damper/mcp 0.8.2 β 0.8.4
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.d.ts +12 -2
- package/dist/formatters.js +71 -7
- package/dist/index.js +137 -19
- package/package.json +1 -1
package/dist/formatters.d.ts
CHANGED
|
@@ -4,6 +4,11 @@
|
|
|
4
4
|
* Extracted for testability - these pure functions format API responses
|
|
5
5
|
* into user-friendly text output.
|
|
6
6
|
*/
|
|
7
|
+
export interface SelfAssessment {
|
|
8
|
+
missingContext?: string[];
|
|
9
|
+
toolIssues?: string[];
|
|
10
|
+
processGaps?: string[];
|
|
11
|
+
}
|
|
7
12
|
export interface StartTaskResult {
|
|
8
13
|
id: string;
|
|
9
14
|
status: string;
|
|
@@ -39,11 +44,16 @@ export interface AbandonTaskResult {
|
|
|
39
44
|
* Format start_task response
|
|
40
45
|
*/
|
|
41
46
|
export declare function formatStartTaskResponse(result: StartTaskResult): string;
|
|
47
|
+
/**
|
|
48
|
+
* Format self-assessment follow-up actions.
|
|
49
|
+
* Guides the agent to propose improvements to the user with rationale.
|
|
50
|
+
*/
|
|
51
|
+
export declare function formatSelfAssessmentActions(assessment: SelfAssessment): string;
|
|
42
52
|
/**
|
|
43
53
|
* Format complete_task response
|
|
44
54
|
*/
|
|
45
|
-
export declare function formatCompleteTaskResponse(result: CompleteTaskResult): string;
|
|
55
|
+
export declare function formatCompleteTaskResponse(result: CompleteTaskResult, assessment?: SelfAssessment): string;
|
|
46
56
|
/**
|
|
47
57
|
* Format abandon_task response
|
|
48
58
|
*/
|
|
49
|
-
export declare function formatAbandonTaskResponse(result: AbandonTaskResult, hasSummary: boolean): string;
|
|
59
|
+
export declare function formatAbandonTaskResponse(result: AbandonTaskResult, hasSummary: boolean, assessment?: SelfAssessment): string;
|
package/dist/formatters.js
CHANGED
|
@@ -52,18 +52,67 @@ export function formatStartTaskResponse(result) {
|
|
|
52
52
|
lines.push('1. `add_note`: "Session started: <goal>"');
|
|
53
53
|
lines.push('2. Work: use `add_commit` for commits, `add_note` for decisions');
|
|
54
54
|
lines.push('3. `add_note`: "Session end: <summary>"');
|
|
55
|
-
lines.push('4. `complete_task` (with `confirmations`
|
|
55
|
+
lines.push('4. `complete_task` (with `confirmations` and `selfAssessment`) or `abandon_task`');
|
|
56
|
+
return lines.join('\n');
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Format self-assessment follow-up actions.
|
|
60
|
+
* Guides the agent to propose improvements to the user with rationale.
|
|
61
|
+
*/
|
|
62
|
+
export function formatSelfAssessmentActions(assessment) {
|
|
63
|
+
const lines = [];
|
|
64
|
+
const hasContent = (assessment.missingContext?.length ?? 0) > 0
|
|
65
|
+
|| (assessment.toolIssues?.length ?? 0) > 0
|
|
66
|
+
|| (assessment.processGaps?.length ?? 0) > 0;
|
|
67
|
+
if (!hasContent)
|
|
68
|
+
return '';
|
|
69
|
+
lines.push('\nπ **Self-Assessment β propose these improvements to the user:**');
|
|
70
|
+
lines.push('Explain each finding briefly and why fixing it helps future tasks. Ask for approval before acting.');
|
|
71
|
+
if (assessment.missingContext && assessment.missingContext.length > 0) {
|
|
72
|
+
lines.push('\n**Missing project context:**');
|
|
73
|
+
for (const item of assessment.missingContext) {
|
|
74
|
+
lines.push(` β’ ${item}`);
|
|
75
|
+
}
|
|
76
|
+
lines.push('β Propose calling `update_context_section` to document these β explain that future agents will waste time rediscovering the same things.');
|
|
77
|
+
}
|
|
78
|
+
if (assessment.toolIssues && assessment.toolIssues.length > 0) {
|
|
79
|
+
lines.push('\n**Tool/workflow issues:**');
|
|
80
|
+
for (const item of assessment.toolIssues) {
|
|
81
|
+
lines.push(` β’ ${item}`);
|
|
82
|
+
}
|
|
83
|
+
lines.push('β Propose calling `report_issue` for each β explain what went wrong and how it slowed the task.');
|
|
84
|
+
}
|
|
85
|
+
if (assessment.processGaps && assessment.processGaps.length > 0) {
|
|
86
|
+
lines.push('\n**Process/spec gaps:**');
|
|
87
|
+
for (const item of assessment.processGaps) {
|
|
88
|
+
lines.push(` β’ ${item}`);
|
|
89
|
+
}
|
|
90
|
+
lines.push('β Propose `update_context_section` for doc gaps or `report_issue` for tooling problems β explain the friction it caused.');
|
|
91
|
+
}
|
|
56
92
|
return lines.join('\n');
|
|
57
93
|
}
|
|
58
94
|
/**
|
|
59
95
|
* Format complete_task response
|
|
60
96
|
*/
|
|
61
|
-
export function formatCompleteTaskResponse(result) {
|
|
97
|
+
export function formatCompleteTaskResponse(result, assessment) {
|
|
62
98
|
const lines = [`β
Completed ${result.id}`];
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
99
|
+
// Self-assessment follow-up actions (shown first if provided)
|
|
100
|
+
if (assessment) {
|
|
101
|
+
const actions = formatSelfAssessmentActions(assessment);
|
|
102
|
+
if (actions) {
|
|
103
|
+
lines.push(actions);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
if (!assessment) {
|
|
107
|
+
// No assessment provided β nudge the agent to reflect
|
|
108
|
+
lines.push('\n---');
|
|
109
|
+
lines.push('**π Before you finish β quick self-assessment:**');
|
|
110
|
+
lines.push('Reflect on your session. If you encountered any of these, propose improvements to the user:');
|
|
111
|
+
lines.push('β’ Missing project docs β offer to call `update_context_section`');
|
|
112
|
+
lines.push('β’ Confusing tools β offer to call `report_issue`');
|
|
113
|
+
lines.push('β’ Spec/process gaps β offer to update docs or report');
|
|
114
|
+
lines.push('Explain briefly why each improvement would help future tasks.');
|
|
115
|
+
}
|
|
67
116
|
if (result.documentation) {
|
|
68
117
|
if (result.documentation.affectedSections?.length > 0) {
|
|
69
118
|
lines.push(`\nSections that may need updates: ${result.documentation.affectedSections.join(', ')}`);
|
|
@@ -77,11 +126,26 @@ export function formatCompleteTaskResponse(result) {
|
|
|
77
126
|
/**
|
|
78
127
|
* Format abandon_task response
|
|
79
128
|
*/
|
|
80
|
-
export function formatAbandonTaskResponse(result, hasSummary) {
|
|
129
|
+
export function formatAbandonTaskResponse(result, hasSummary, assessment) {
|
|
81
130
|
const lines = [`βΈοΈ Abandoned ${result.id}: ${result.message}`];
|
|
82
131
|
if (!hasSummary) {
|
|
83
132
|
lines.push('\nβ οΈ Tip: Include a summary next time for better handoff.');
|
|
84
133
|
}
|
|
85
134
|
lines.push('\nπ‘ Task returned to "planned". Notes preserved for next agent.');
|
|
135
|
+
// Self-assessment follow-up actions
|
|
136
|
+
if (assessment) {
|
|
137
|
+
const actions = formatSelfAssessmentActions(assessment);
|
|
138
|
+
if (actions) {
|
|
139
|
+
lines.push(actions);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
if (!assessment) {
|
|
143
|
+
lines.push('\n---');
|
|
144
|
+
lines.push('**π Before you finish β quick self-assessment:**');
|
|
145
|
+
lines.push('Something caused this task to be abandoned. Propose improvements to the user:');
|
|
146
|
+
lines.push('β’ Missing project docs that would have helped β offer to call `update_context_section`');
|
|
147
|
+
lines.push('β’ Tool issues that blocked progress β offer to call `report_issue`');
|
|
148
|
+
lines.push('Explain briefly why each fix would help the next agent pick this up smoothly.');
|
|
149
|
+
}
|
|
86
150
|
return lines.join('\n');
|
|
87
151
|
}
|
package/dist/index.js
CHANGED
|
@@ -269,8 +269,10 @@ server.registerTool('update_task', {
|
|
|
269
269
|
'Useful for refining task details as you learn more about the work.',
|
|
270
270
|
inputSchema: z.object({
|
|
271
271
|
taskId: z.string().describe('Task ID'),
|
|
272
|
-
title: z.string().optional().describe('Task title'
|
|
273
|
-
|
|
272
|
+
title: z.string().optional().describe('Task title (max 60 chars, sentence case, no trailing period). Verb prefix: ' +
|
|
273
|
+
'bug β "Fix β¦", feature β "Add β¦", improvement β "Improve β¦", task β "Set up β¦" / "Update β¦"'),
|
|
274
|
+
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. ' +
|
|
275
|
+
'No code references, file paths, or jargon.'),
|
|
274
276
|
implementationPlan: z.string().optional().describe('Implementation plan (markdown, internal only - never shown publicly)'),
|
|
275
277
|
priority: z.enum(['high', 'medium', 'low']).nullable().optional().describe('Task priority'),
|
|
276
278
|
effort: z.enum(['xs', 's', 'm', 'l', 'xl']).nullable().optional().describe('Estimated effort'),
|
|
@@ -351,9 +353,11 @@ server.registerTool('create_task', {
|
|
|
351
353
|
title: 'Create Task',
|
|
352
354
|
description: 'Create a new roadmap task. Use for importing from TODO files or creating work items.',
|
|
353
355
|
inputSchema: z.object({
|
|
354
|
-
title: z.string().describe('Task title. Use verb prefix matching the type: ' +
|
|
355
|
-
'bug β "Fix β¦", feature β "Add β¦", improvement β "Improve β¦", task β "Set up β¦" / "Update β¦"'
|
|
356
|
-
|
|
356
|
+
title: z.string().describe('Task title (max 60 chars, sentence case, no trailing period). Use verb prefix matching the type: ' +
|
|
357
|
+
'bug β "Fix β¦", feature β "Add β¦", improvement β "Improve β¦", task β "Set up β¦" / "Update β¦". ' +
|
|
358
|
+
'E.g., "Add dark mode support", "Fix login timeout on slow connections"'),
|
|
359
|
+
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. ' +
|
|
360
|
+
'No code references, file paths, or jargon.'),
|
|
357
361
|
type: z.enum(['bug', 'feature', 'improvement', 'task']).optional().describe('Task type (default: feature)'),
|
|
358
362
|
status: z.enum(['planned', 'in_progress', 'done']).optional(),
|
|
359
363
|
priority: z.enum(['high', 'medium', 'low']).optional().describe('Task priority'),
|
|
@@ -498,7 +502,7 @@ server.registerTool('add_commit', {
|
|
|
498
502
|
inputSchema: z.object({
|
|
499
503
|
taskId: z.string(),
|
|
500
504
|
hash: z.string().describe('Commit hash (short or full)'),
|
|
501
|
-
message: z.string().describe('Commit message'),
|
|
505
|
+
message: z.string().describe('Commit message in conventional commits format: type(scope): description. E.g., "feat(auth): add OAuth login"'),
|
|
502
506
|
}),
|
|
503
507
|
outputSchema: z.object({
|
|
504
508
|
taskId: z.string(),
|
|
@@ -524,7 +528,7 @@ server.registerTool('create_subtask', {
|
|
|
524
528
|
description: 'Add a new subtask to a task. Useful for breaking down work into smaller steps.',
|
|
525
529
|
inputSchema: z.object({
|
|
526
530
|
taskId: z.string().describe('Task ID'),
|
|
527
|
-
title: z.string().describe('Subtask title'),
|
|
531
|
+
title: z.string().describe('Subtask title β short imperative phrase, e.g., "Add validation to login form"'),
|
|
528
532
|
}),
|
|
529
533
|
outputSchema: z.object({
|
|
530
534
|
taskId: z.string(),
|
|
@@ -589,6 +593,12 @@ server.registerTool('update_subtask', {
|
|
|
589
593
|
},
|
|
590
594
|
};
|
|
591
595
|
});
|
|
596
|
+
// Self-assessment schema for end-of-task reflection
|
|
597
|
+
const SelfAssessmentSchema = z.object({
|
|
598
|
+
missingContext: z.array(z.string()).optional().describe('Project knowledge that was missing or wrong β things you had to figure out that should be documented for future agents'),
|
|
599
|
+
toolIssues: z.array(z.string()).optional().describe('MCP tools or workflow steps that were confusing, broken, or could be improved'),
|
|
600
|
+
processGaps: z.array(z.string()).optional().describe('Gaps in specs, checklists, or conventions that caused friction or mistakes'),
|
|
601
|
+
});
|
|
592
602
|
// Documentation reminder schema for complete_task response
|
|
593
603
|
const DocumentationSchema = z.object({
|
|
594
604
|
hasContext: z.boolean(),
|
|
@@ -602,6 +612,8 @@ server.registerTool('complete_task', {
|
|
|
602
612
|
'**Before calling:**\n' +
|
|
603
613
|
'1. Push all commits\n' +
|
|
604
614
|
'2. Check if project context docs need updating\n\n' +
|
|
615
|
+
'**Self-assessment:** Reflect on your session β what project knowledge was missing, what tools were confusing, ' +
|
|
616
|
+
'what process gaps caused friction. If you identify improvements, propose them to the user with a brief explanation.\n\n' +
|
|
605
617
|
'**Completion checklist:** If the project has a completion checklist (shown in `start_task` response), ' +
|
|
606
618
|
'you MUST pass `confirmations` β an array of `{item, evidence}` objects. Each confirmation needs the checklist item text ' +
|
|
607
619
|
'and concrete evidence proving you verified it (e.g., test output, build log snippet). ' +
|
|
@@ -610,7 +622,9 @@ server.registerTool('complete_task', {
|
|
|
610
622
|
'Returns documentation update suggestions.',
|
|
611
623
|
inputSchema: z.object({
|
|
612
624
|
taskId: z.string(),
|
|
613
|
-
summary: z.string().describe('Brief one-line summary of what was done'),
|
|
625
|
+
summary: z.string().describe('Brief one-line summary of what was done, written for end users. Focus on the outcome, not the implementation.'),
|
|
626
|
+
selfAssessment: SelfAssessmentSchema.optional().describe('Reflect on your session: what went well, what knowledge was missing, what caused friction. ' +
|
|
627
|
+
'Be honest β this drives project improvements.'),
|
|
614
628
|
commits: z.array(z.object({
|
|
615
629
|
hash: z.string().describe('Commit hash (short or full)'),
|
|
616
630
|
message: z.string().describe('Commit message'),
|
|
@@ -631,11 +645,38 @@ server.registerTool('complete_task', {
|
|
|
631
645
|
idempotentHint: true,
|
|
632
646
|
openWorldHint: false,
|
|
633
647
|
},
|
|
634
|
-
}, async ({ taskId, summary, commits, confirmations }) => {
|
|
648
|
+
}, async ({ taskId, summary, selfAssessment, commits, confirmations }) => {
|
|
635
649
|
try {
|
|
636
650
|
const result = await api('POST', `/api/agent/tasks/${taskId}/complete`, { summary, commits, confirmations });
|
|
651
|
+
// Log self-assessment as a structured note if provided
|
|
652
|
+
if (selfAssessment) {
|
|
653
|
+
const assessmentLines = ['Self-Assessment:'];
|
|
654
|
+
if (selfAssessment.missingContext?.length) {
|
|
655
|
+
assessmentLines.push('Missing context:');
|
|
656
|
+
for (const item of selfAssessment.missingContext)
|
|
657
|
+
assessmentLines.push(` - ${item}`);
|
|
658
|
+
}
|
|
659
|
+
if (selfAssessment.toolIssues?.length) {
|
|
660
|
+
assessmentLines.push('Tool issues:');
|
|
661
|
+
for (const item of selfAssessment.toolIssues)
|
|
662
|
+
assessmentLines.push(` - ${item}`);
|
|
663
|
+
}
|
|
664
|
+
if (selfAssessment.processGaps?.length) {
|
|
665
|
+
assessmentLines.push('Process gaps:');
|
|
666
|
+
for (const item of selfAssessment.processGaps)
|
|
667
|
+
assessmentLines.push(` - ${item}`);
|
|
668
|
+
}
|
|
669
|
+
if (assessmentLines.length > 1) {
|
|
670
|
+
try {
|
|
671
|
+
await api('POST', `/api/agent/tasks/${taskId}/notes`, { note: assessmentLines.join('\n') });
|
|
672
|
+
}
|
|
673
|
+
catch {
|
|
674
|
+
// Don't fail completion if note logging fails
|
|
675
|
+
}
|
|
676
|
+
}
|
|
677
|
+
}
|
|
637
678
|
return {
|
|
638
|
-
content: [{ type: 'text', text: formatCompleteTaskResponse(result) }],
|
|
679
|
+
content: [{ type: 'text', text: formatCompleteTaskResponse(result, selfAssessment) }],
|
|
639
680
|
structuredContent: result,
|
|
640
681
|
};
|
|
641
682
|
}
|
|
@@ -675,10 +716,14 @@ server.registerTool('abandon_task', {
|
|
|
675
716
|
description: 'Release lock and return task to planned status. Use when stopping work.\n\n' +
|
|
676
717
|
'**Before calling:**\n' +
|
|
677
718
|
'1. Push any WIP commits\n\n' +
|
|
678
|
-
'**Summary parameter:** What was done, what remains, blockers. Helps the next agent
|
|
719
|
+
'**Summary parameter:** What was done, what remains, blockers. Helps the next agent.\n\n' +
|
|
720
|
+
'**Self-assessment:** Especially important when abandoning β reflect on what blocked you ' +
|
|
721
|
+
'or what knowledge was missing so the next agent has a smoother experience.',
|
|
679
722
|
inputSchema: z.object({
|
|
680
723
|
taskId: z.string(),
|
|
681
724
|
summary: z.string().optional().describe('Handoff summary: what was done, what remains, any blockers'),
|
|
725
|
+
selfAssessment: SelfAssessmentSchema.optional().describe('Reflect on your session: what went well, what knowledge was missing, what caused friction. ' +
|
|
726
|
+
'Be honest β this drives project improvements.'),
|
|
682
727
|
}),
|
|
683
728
|
outputSchema: z.object({
|
|
684
729
|
id: z.string(),
|
|
@@ -691,10 +736,37 @@ server.registerTool('abandon_task', {
|
|
|
691
736
|
idempotentHint: true,
|
|
692
737
|
openWorldHint: false,
|
|
693
738
|
},
|
|
694
|
-
}, async ({ taskId, summary }) => {
|
|
739
|
+
}, async ({ taskId, summary, selfAssessment }) => {
|
|
695
740
|
const result = await api('POST', `/api/agent/tasks/${taskId}/abandon`, summary ? { summary } : undefined);
|
|
741
|
+
// Log self-assessment as a structured note if provided
|
|
742
|
+
if (selfAssessment) {
|
|
743
|
+
const assessmentLines = ['Self-Assessment (abandoned):'];
|
|
744
|
+
if (selfAssessment.missingContext?.length) {
|
|
745
|
+
assessmentLines.push('Missing context:');
|
|
746
|
+
for (const item of selfAssessment.missingContext)
|
|
747
|
+
assessmentLines.push(` - ${item}`);
|
|
748
|
+
}
|
|
749
|
+
if (selfAssessment.toolIssues?.length) {
|
|
750
|
+
assessmentLines.push('Tool issues:');
|
|
751
|
+
for (const item of selfAssessment.toolIssues)
|
|
752
|
+
assessmentLines.push(` - ${item}`);
|
|
753
|
+
}
|
|
754
|
+
if (selfAssessment.processGaps?.length) {
|
|
755
|
+
assessmentLines.push('Process gaps:');
|
|
756
|
+
for (const item of selfAssessment.processGaps)
|
|
757
|
+
assessmentLines.push(` - ${item}`);
|
|
758
|
+
}
|
|
759
|
+
if (assessmentLines.length > 1) {
|
|
760
|
+
try {
|
|
761
|
+
await api('POST', `/api/agent/tasks/${taskId}/notes`, { note: assessmentLines.join('\n') });
|
|
762
|
+
}
|
|
763
|
+
catch {
|
|
764
|
+
// Don't fail abandonment if note logging fails
|
|
765
|
+
}
|
|
766
|
+
}
|
|
767
|
+
}
|
|
696
768
|
return {
|
|
697
|
-
content: [{ type: 'text', text: formatAbandonTaskResponse(result, !!summary) }],
|
|
769
|
+
content: [{ type: 'text', text: formatAbandonTaskResponse(result, !!summary, selfAssessment) }],
|
|
698
770
|
structuredContent: result,
|
|
699
771
|
};
|
|
700
772
|
});
|
|
@@ -744,7 +816,7 @@ server.registerTool('get_agent_instructions', {
|
|
|
744
816
|
openWorldHint: false,
|
|
745
817
|
},
|
|
746
818
|
}, async ({ format = 'section' }) => {
|
|
747
|
-
const lastModified = '2026-02-
|
|
819
|
+
const lastModified = '2026-02-10';
|
|
748
820
|
const section = `## Task Management with Damper MCP
|
|
749
821
|
|
|
750
822
|
> Last updated: ${lastModified}
|
|
@@ -787,7 +859,49 @@ This project uses Damper MCP for task tracking. **You MUST follow this workflow.
|
|
|
787
859
|
2. **Abandon and hand off** - Call \`abandon_task\` with a detailed handoff summary for the next agent.
|
|
788
860
|
- NEVER leave a started task without completing or abandoning it
|
|
789
861
|
- If the project has a **completion checklist** (shown in \`start_task\` response), you MUST pass all items as \`confirmations\` when calling \`complete_task\`
|
|
790
|
-
-
|
|
862
|
+
- **Self-assessment:** Include \`selfAssessment\` when calling \`complete_task\` or \`abandon_task\`. Reflect honestly on:
|
|
863
|
+
- \`missingContext\` β What project knowledge was missing or wrong?
|
|
864
|
+
- \`toolIssues\` β Which tools or workflow steps were confusing or broken?
|
|
865
|
+
- \`processGaps\` β What specs or conventions were missing?
|
|
866
|
+
If you identify improvements, **propose them to the user** β explain briefly what you found and why fixing it helps future tasks. Only act after the user approves.
|
|
867
|
+
|
|
868
|
+
### Content Style Guide
|
|
869
|
+
|
|
870
|
+
All content you generate β titles, descriptions, changelogs, notes β should follow these conventions for consistency.
|
|
871
|
+
|
|
872
|
+
**Task titles:**
|
|
873
|
+
- Imperative verb prefix matching type: bug β "Fix β¦", feature β "Add β¦", improvement β "Improve β¦", task β "Set up β¦" / "Update β¦"
|
|
874
|
+
- Sentence case after verb (lowercase unless proper noun): "Add dark mode support"
|
|
875
|
+
- Max 60 characters, no trailing period
|
|
876
|
+
- Specific enough to understand without reading the description
|
|
877
|
+
|
|
878
|
+
**Task descriptions** (shown on public roadmap):
|
|
879
|
+
- Write for end users, not developers β no code references, file paths, or jargon
|
|
880
|
+
- 1-3 sentences explaining what changes and why it matters to users
|
|
881
|
+
- Focus on the user benefit, not implementation details
|
|
882
|
+
|
|
883
|
+
**Subtask titles:**
|
|
884
|
+
- Short imperative phrase: "Add validation to login form"
|
|
885
|
+
- Specific enough to track independently
|
|
886
|
+
|
|
887
|
+
**Changelog content:**
|
|
888
|
+
- Write for users who want to know what changed and why they should care
|
|
889
|
+
- Group entries by type: Added, Improved, Fixed
|
|
890
|
+
- Each entry: 1-2 sentences focused on the user-visible change, not the technical approach
|
|
891
|
+
- Use plain language β avoid technical jargon
|
|
892
|
+
|
|
893
|
+
**Changelog summaries** (max 280 chars):
|
|
894
|
+
- Lead with the most impactful change
|
|
895
|
+
- Conversational tone suitable for social media or email subject
|
|
896
|
+
|
|
897
|
+
**Commit messages:**
|
|
898
|
+
- Conventional commits format: \`type(scope): description\`
|
|
899
|
+
- Types: feat, fix, refactor, test, docs, chore, style, perf
|
|
900
|
+
- Imperative mood: "add feature" not "added feature"
|
|
901
|
+
|
|
902
|
+
**Notes:**
|
|
903
|
+
- Prefix with category: "Decision: β¦", "Blocked: β¦", "Context: β¦"
|
|
904
|
+
- Only log non-obvious decisions and blockers β skip routine progress
|
|
791
905
|
|
|
792
906
|
### Why This Matters
|
|
793
907
|
- **Project context prevents mistakes** - Contains architecture decisions, gotchas, and patterns
|
|
@@ -1731,10 +1845,12 @@ server.registerTool('create_changelog', {
|
|
|
1731
1845
|
'Use this to create additional changelogs if needed.',
|
|
1732
1846
|
inputSchema: z.object({
|
|
1733
1847
|
title: z.string().describe('Changelog title (e.g., "v2.1.0" or "January 2025 Release")'),
|
|
1734
|
-
content: z.string().optional().describe('
|
|
1848
|
+
content: z.string().optional().describe('Changelog content (markdown). Write for users: group by Added/Improved/Fixed, ' +
|
|
1849
|
+
'1-2 sentences per entry focused on user-visible changes. Avoid technical jargon.'),
|
|
1735
1850
|
version: z.string().optional().describe('Version number'),
|
|
1736
1851
|
date: z.string().optional().describe('Custom display date (ISO 8601). When set, used for sorting/display instead of publishedAt.'),
|
|
1737
|
-
summary: z.string().max(280).optional().describe('Short summary for social sharing and email subject (max 280 chars)'
|
|
1852
|
+
summary: z.string().max(280).optional().describe('Short summary for social sharing and email subject (max 280 chars). ' +
|
|
1853
|
+
'Lead with the most impactful change, conversational tone.'),
|
|
1738
1854
|
status: z.enum(['draft', 'published']).optional().describe('Status (default: draft)'),
|
|
1739
1855
|
}),
|
|
1740
1856
|
outputSchema: z.object({
|
|
@@ -1766,10 +1882,12 @@ server.registerTool('update_changelog', {
|
|
|
1766
1882
|
inputSchema: z.object({
|
|
1767
1883
|
changelogId: z.string().describe('Changelog ID'),
|
|
1768
1884
|
title: z.string().optional().describe('New title'),
|
|
1769
|
-
content: z.string().optional().describe('New content (markdown)'
|
|
1885
|
+
content: z.string().optional().describe('New content (markdown). Write for users: group by Added/Improved/Fixed, ' +
|
|
1886
|
+
'1-2 sentences per entry focused on user-visible changes. Avoid technical jargon.'),
|
|
1770
1887
|
version: z.string().optional().describe('Version number'),
|
|
1771
1888
|
date: z.string().optional().describe('Custom display date (ISO 8601). When set, used for sorting/display instead of publishedAt. Pass empty string to clear.'),
|
|
1772
|
-
summary: z.string().max(280).optional().describe('Short summary for social sharing and email subject (max 280 chars)'
|
|
1889
|
+
summary: z.string().max(280).optional().describe('Short summary for social sharing and email subject (max 280 chars). ' +
|
|
1890
|
+
'Lead with the most impactful change, conversational tone.'),
|
|
1773
1891
|
status: z.enum(['draft', 'published']).optional().describe('Status'),
|
|
1774
1892
|
}),
|
|
1775
1893
|
outputSchema: z.object({
|