@damper/mcp 0.8.4 → 0.8.6

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.
@@ -95,7 +95,10 @@ export function formatSelfAssessmentActions(assessment) {
95
95
  * Format complete_task response
96
96
  */
97
97
  export function formatCompleteTaskResponse(result, assessment) {
98
- const lines = [`✅ Completed ${result.id}`];
98
+ const statusMessage = result.status === 'done'
99
+ ? `✅ Task ${result.id} marked as done`
100
+ : `✅ Task ${result.id} moved to review`;
101
+ const lines = [statusMessage];
99
102
  // Self-assessment follow-up actions (shown first if provided)
100
103
  if (assessment) {
101
104
  const actions = formatSelfAssessmentActions(assessment);
@@ -131,7 +134,7 @@ export function formatAbandonTaskResponse(result, hasSummary, assessment) {
131
134
  if (!hasSummary) {
132
135
  lines.push('\n⚠️ Tip: Include a summary next time for better handoff.');
133
136
  }
134
- lines.push('\n💡 Task returned to "planned". Notes preserved for next agent.');
137
+ lines.push('\n💡 Task returned to "planned" (from in_progress or in_review). Notes preserved for next agent.');
135
138
  // Self-assessment follow-up actions
136
139
  if (assessment) {
137
140
  const actions = formatSelfAssessmentActions(assessment);
package/dist/index.js CHANGED
@@ -123,7 +123,7 @@ server.registerTool('list_tasks', {
123
123
  'If total > returned tasks, paginate with offset (e.g. offset=50 for page 2).\n\n' +
124
124
  '**Recommended:** Call `get_project_context` before starting work to understand codebase patterns.',
125
125
  inputSchema: z.object({
126
- status: z.enum(['planned', 'in_progress', 'done', 'all']).optional(),
126
+ status: z.enum(['planned', 'in_progress', 'in_review', 'done', 'all']).optional(),
127
127
  type: z.enum(['bug', 'feature', 'improvement', 'task']).optional().describe('Filter by task type'),
128
128
  quarter: z.string().optional().describe('Filter by quarter (e.g., "Q1 2025") or "none" for unscheduled'),
129
129
  sort: z.enum(['importance', 'newest', 'votes']).optional().describe('Sort order: importance (priority+votes, default), newest, or votes'),
@@ -359,7 +359,7 @@ server.registerTool('create_task', {
359
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
360
  'No code references, file paths, or jargon.'),
361
361
  type: z.enum(['bug', 'feature', 'improvement', 'task']).optional().describe('Task type (default: feature)'),
362
- status: z.enum(['planned', 'in_progress', 'done']).optional(),
362
+ status: z.enum(['planned', 'in_progress', 'in_review', 'done']).optional(),
363
363
  priority: z.enum(['high', 'medium', 'low']).optional().describe('Task priority'),
364
364
  implementationPlan: z.string().optional().describe('Implementation plan (markdown, internal only - never shown publicly)'),
365
365
  isPublic: z.boolean().optional().describe('Whether task is visible on public roadmap (default: true)'),
@@ -608,7 +608,8 @@ const DocumentationSchema = z.object({
608
608
  // Tool: Complete task
609
609
  server.registerTool('complete_task', {
610
610
  title: 'Complete Task',
611
- description: 'Mark task done with a brief one-line summary. Optionally log final commits at completion.\n\n' +
611
+ description: 'Mark task as ready for review (in_review). A human will verify and move it to done. ' +
612
+ 'Pass `skipReview: true` to mark as done immediately (use when the human explicitly asks).\n\n' +
612
613
  '**Before calling:**\n' +
613
614
  '1. Push all commits\n' +
614
615
  '2. Check if project context docs need updating\n\n' +
@@ -633,6 +634,7 @@ server.registerTool('complete_task', {
633
634
  item: z.string().describe('Checklist item text from start_task'),
634
635
  evidence: z.string().describe('Concrete proof of verification (e.g., "bun test: 47 passed, 0 failed")'),
635
636
  })).optional().describe('Completion checklist confirmations — echo back each item from the checklist shown in start_task'),
637
+ skipReview: z.boolean().optional().describe('Skip human review and mark task as done immediately (default: false, task goes to in_review)'),
636
638
  }),
637
639
  outputSchema: z.object({
638
640
  id: z.string(),
@@ -645,9 +647,9 @@ server.registerTool('complete_task', {
645
647
  idempotentHint: true,
646
648
  openWorldHint: false,
647
649
  },
648
- }, async ({ taskId, summary, selfAssessment, commits, confirmations }) => {
650
+ }, async ({ taskId, summary, selfAssessment, commits, confirmations, skipReview }) => {
649
651
  try {
650
- const result = await api('POST', `/api/agent/tasks/${taskId}/complete`, { summary, commits, confirmations });
652
+ const result = await api('POST', `/api/agent/tasks/${taskId}/complete`, { summary, commits, confirmations, skipReview });
651
653
  // Log self-assessment as a structured note if provided
652
654
  if (selfAssessment) {
653
655
  const assessmentLines = ['Self-Assessment:'];
@@ -713,7 +715,7 @@ server.registerTool('complete_task', {
713
715
  // Tool: Abandon task
714
716
  server.registerTool('abandon_task', {
715
717
  title: 'Abandon Task',
716
- description: 'Release lock and return task to planned status. Use when stopping work.\n\n' +
718
+ description: 'Release lock and return task to planned status. Works for in_progress and in_review tasks.\n\n' +
717
719
  '**Before calling:**\n' +
718
720
  '1. Push any WIP commits\n\n' +
719
721
  '**Summary parameter:** What was done, what remains, blockers. Helps the next agent.\n\n' +
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@damper/mcp",
3
- "version": "0.8.4",
3
+ "version": "0.8.6",
4
4
  "description": "MCP server for Damper task management",
5
5
  "author": "Damper <hello@usedamper.com>",
6
6
  "repository": {