@damper/mcp 0.3.6 → 0.3.8

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 (3) hide show
  1. package/README.md +30 -0
  2. package/dist/index.js +13 -3
  3. package/package.json +1 -1
package/README.md CHANGED
@@ -310,6 +310,36 @@ When working on tasks, follow this workflow for best results:
310
310
  > Sync all my documentation to Damper
311
311
  ```
312
312
 
313
+ ## Agent Instructions (CLAUDE.md)
314
+
315
+ Add this to your project's `CLAUDE.md` (or `.cursorrules` for Cursor) to ensure AI agents use Damper consistently:
316
+
317
+ ```markdown
318
+ ## Task Management with Damper MCP
319
+
320
+ This project uses Damper MCP for task tracking. **You MUST follow this workflow.**
321
+
322
+ ### At Session Start
323
+ 1. `get_project_context` - Read available project documentation
324
+ 2. `list_tasks` - Check for existing tasks to work on
325
+ 3. If working on a task: `start_task` to lock it
326
+
327
+ ### While Working
328
+ - `add_note` after each commit: "Committed abc123: description"
329
+ - `add_note` for decisions: "Decision: chose X because Y"
330
+ - `update_subtask` to mark subtask progress
331
+
332
+ ### At Session End (MANDATORY)
333
+ - ALWAYS call `add_note` with session summary before stopping
334
+ - ALWAYS call `complete_task` (if done) or `abandon_task` (if stopping early)
335
+ - NEVER leave a started task without completing or abandoning it
336
+
337
+ ### Why This Matters
338
+ - Locked tasks block other agents from working on them
339
+ - Notes help the next agent (or you) continue the work
340
+ - Project context saves future agents from re-analyzing the codebase
341
+ ```
342
+
313
343
  ## Environment
314
344
 
315
345
  | Variable | Required | Default |
package/dist/index.js CHANGED
@@ -216,7 +216,7 @@ server.registerTool('get_task', {
216
216
  // Tool: Update task
217
217
  server.registerTool('update_task', {
218
218
  title: 'Update Task',
219
- description: 'Update task fields like description, implementation plan, priority, effort, quarter, or labels. ' +
219
+ description: 'Update task fields like description, implementation plan, priority, effort, quarter, labels, or visibility. ' +
220
220
  'Useful for refining task details as you learn more about the work.',
221
221
  inputSchema: z.object({
222
222
  taskId: z.string().describe('Task ID'),
@@ -226,6 +226,7 @@ server.registerTool('update_task', {
226
226
  effort: z.enum(['xs', 's', 'm', 'l', 'xl']).nullable().optional().describe('Estimated effort'),
227
227
  quarter: z.string().nullable().optional().describe('Target quarter (e.g., "Q1 2025", "Q2 2025")'),
228
228
  labels: z.array(z.string()).optional().describe('Labels/tags'),
229
+ isPublic: z.boolean().optional().describe('Whether task is visible on public roadmap'),
229
230
  }),
230
231
  outputSchema: z.object({
231
232
  id: z.string(),
@@ -236,6 +237,7 @@ server.registerTool('update_task', {
236
237
  effort: z.string().nullable().optional(),
237
238
  quarter: z.string().nullable().optional(),
238
239
  labels: z.array(z.string()).optional(),
240
+ isPublic: z.boolean().optional(),
239
241
  }),
240
242
  annotations: {
241
243
  readOnlyHint: false,
@@ -243,7 +245,7 @@ server.registerTool('update_task', {
243
245
  idempotentHint: true,
244
246
  openWorldHint: false,
245
247
  },
246
- }, async ({ taskId, description, implementationPlan, priority, effort, quarter, labels }) => {
248
+ }, async ({ taskId, description, implementationPlan, priority, effort, quarter, labels, isPublic }) => {
247
249
  const body = {};
248
250
  if (description !== undefined)
249
251
  body.description = description;
@@ -257,6 +259,8 @@ server.registerTool('update_task', {
257
259
  body.quarter = quarter;
258
260
  if (labels !== undefined)
259
261
  body.labels = labels;
262
+ if (isPublic !== undefined)
263
+ body.isPublic = isPublic;
260
264
  const result = await api('PATCH', `/api/agent/tasks/${taskId}`, body);
261
265
  const updates = [];
262
266
  if (description !== undefined)
@@ -271,6 +275,8 @@ server.registerTool('update_task', {
271
275
  updates.push(`quarter=${quarter || 'none'}`);
272
276
  if (labels !== undefined)
273
277
  updates.push(`labels=[${labels.join(', ')}]`);
278
+ if (isPublic !== undefined)
279
+ updates.push(`isPublic=${isPublic}`);
274
280
  return {
275
281
  content: [{ type: 'text', text: `📝 Updated ${result.title}: ${updates.join(', ')}` }],
276
282
  structuredContent: {
@@ -282,6 +288,7 @@ server.registerTool('update_task', {
282
288
  effort: result.effort,
283
289
  quarter: result.quarter,
284
290
  labels: result.labels,
291
+ isPublic: result.isPublic,
285
292
  },
286
293
  };
287
294
  });
@@ -295,12 +302,14 @@ server.registerTool('create_task', {
295
302
  type: z.enum(['bug', 'feature', 'improvement', 'task']).optional().describe('Task type (default: feature)'),
296
303
  status: z.enum(['planned', 'in_progress']).optional(),
297
304
  implementationPlan: z.string().optional(),
305
+ isPublic: z.boolean().optional().describe('Whether task is visible on public roadmap (default: true)'),
298
306
  }),
299
307
  outputSchema: z.object({
300
308
  id: z.string(),
301
309
  title: z.string(),
302
310
  type: z.string(),
303
311
  status: z.string(),
312
+ isPublic: z.boolean().optional(),
304
313
  }),
305
314
  annotations: {
306
315
  readOnlyHint: false,
@@ -311,8 +320,9 @@ server.registerTool('create_task', {
311
320
  }, async (args) => {
312
321
  const result = await api('POST', '/api/agent/tasks', args);
313
322
  const typeIcon = result.type === 'bug' ? '🐛' : result.type === 'feature' ? '✨' : result.type === 'improvement' ? '💡' : '📌';
323
+ const visibilityIcon = result.isPublic ? '' : ' 🔒';
314
324
  return {
315
- content: [{ type: 'text', text: `Created: ${result.id} ${typeIcon} "${result.title}" [${result.status}]` }],
325
+ content: [{ type: 'text', text: `Created: ${result.id} ${typeIcon} "${result.title}" [${result.status}]${visibilityIcon}` }],
316
326
  structuredContent: result,
317
327
  };
318
328
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@damper/mcp",
3
- "version": "0.3.6",
3
+ "version": "0.3.8",
4
4
  "description": "MCP server for Damper task management",
5
5
  "author": "Damper <hello@usedamper.com>",
6
6
  "repository": {