@damper/mcp 0.1.10 → 0.1.13
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/README.md +14 -1
- package/dist/index.js +9 -4
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -71,7 +71,7 @@ The AI will see tools from both servers and can distinguish between them:
|
|
|
71
71
|
|
|
72
72
|
| Tool | Description |
|
|
73
73
|
|------|-------------|
|
|
74
|
-
| `list_tasks` | Get roadmap tasks (filter by `status`, `type`, `quarter`) |
|
|
74
|
+
| `list_tasks` | Get roadmap tasks (filter by `status`, `type`, `quarter`, sort by `importance`/`newest`/`votes`) |
|
|
75
75
|
| `get_task` | Task details + subtasks + linked feedback |
|
|
76
76
|
| `create_task` | Create task with type (bug, feature, improvement, task) |
|
|
77
77
|
| `update_task` | Update description, plan, priority, effort, quarter, labels |
|
|
@@ -96,6 +96,19 @@ Filter tasks by type to prioritize work:
|
|
|
96
96
|
|
|
97
97
|
Types: `bug` 🐛, `feature` ✨, `improvement` 💡, `task` 📌
|
|
98
98
|
|
|
99
|
+
### Sorting
|
|
100
|
+
|
|
101
|
+
Tasks are sorted by **weighted importance** by default (priority weight + vote score), so high-priority items surface first even without votes. Override with `sort`:
|
|
102
|
+
|
|
103
|
+
- `importance` (default) - priority weight (high=100, medium=50, low=10) + votes
|
|
104
|
+
- `newest` - most recently created first
|
|
105
|
+
- `votes` - highest vote score first
|
|
106
|
+
|
|
107
|
+
```
|
|
108
|
+
> List tasks sorted by newest
|
|
109
|
+
> Show me the most voted features
|
|
110
|
+
```
|
|
111
|
+
|
|
99
112
|
### Task Metadata
|
|
100
113
|
|
|
101
114
|
Tasks include project management fields visible in `list_tasks` and `get_task`:
|
package/dist/index.js
CHANGED
|
@@ -34,7 +34,7 @@ async function api(method, path, body) {
|
|
|
34
34
|
// Server
|
|
35
35
|
const server = new McpServer({
|
|
36
36
|
name: 'damper',
|
|
37
|
-
version: '0.1.
|
|
37
|
+
version: '0.1.11',
|
|
38
38
|
});
|
|
39
39
|
// Output schemas
|
|
40
40
|
const SubtaskProgressSchema = z.object({
|
|
@@ -109,6 +109,7 @@ server.registerTool('list_tasks', {
|
|
|
109
109
|
status: z.enum(['planned', 'in_progress', 'done', 'all']).optional(),
|
|
110
110
|
type: z.enum(['bug', 'feature', 'improvement', 'task']).optional().describe('Filter by task type'),
|
|
111
111
|
quarter: z.string().optional().describe('Filter by quarter (e.g., "Q1 2025") or "none" for unscheduled'),
|
|
112
|
+
sort: z.enum(['importance', 'newest', 'votes']).optional().describe('Sort order: importance (priority+votes, default), newest, or votes'),
|
|
112
113
|
limit: z.number().optional(),
|
|
113
114
|
}),
|
|
114
115
|
outputSchema: z.object({
|
|
@@ -121,7 +122,7 @@ server.registerTool('list_tasks', {
|
|
|
121
122
|
idempotentHint: true,
|
|
122
123
|
openWorldHint: false,
|
|
123
124
|
},
|
|
124
|
-
}, async ({ status, type, quarter, limit }) => {
|
|
125
|
+
}, async ({ status, type, quarter, sort, limit }) => {
|
|
125
126
|
const params = new URLSearchParams();
|
|
126
127
|
if (status)
|
|
127
128
|
params.set('status', status);
|
|
@@ -129,6 +130,8 @@ server.registerTool('list_tasks', {
|
|
|
129
130
|
params.set('type', type);
|
|
130
131
|
if (quarter)
|
|
131
132
|
params.set('quarter', quarter);
|
|
133
|
+
if (sort)
|
|
134
|
+
params.set('sort', sort);
|
|
132
135
|
if (limit)
|
|
133
136
|
params.set('limit', String(limit));
|
|
134
137
|
const query = params.toString();
|
|
@@ -169,9 +172,10 @@ server.registerTool('get_task', {
|
|
|
169
172
|
}, async ({ taskId }) => {
|
|
170
173
|
const t = await api('GET', `/api/agent/tasks/${taskId}`);
|
|
171
174
|
const typeIcon = t.type === 'bug' ? '🐛' : t.type === 'feature' ? '✨' : t.type === 'improvement' ? '💡' : '📌';
|
|
175
|
+
const scorePart = t.voteScore > 0 ? ` | Score: ${t.voteScore}` : '';
|
|
172
176
|
const parts = [
|
|
173
177
|
`# ${typeIcon} ${t.title}`,
|
|
174
|
-
`Type: ${t.type} | Status: ${t.status}
|
|
178
|
+
`Type: ${t.type} | Status: ${t.status}${scorePart}`,
|
|
175
179
|
];
|
|
176
180
|
// Add priority/effort/quarter/labels if present
|
|
177
181
|
const meta = [];
|
|
@@ -569,9 +573,10 @@ server.registerTool('get_feedback', {
|
|
|
569
573
|
},
|
|
570
574
|
}, async ({ feedbackId }) => {
|
|
571
575
|
const f = await api('GET', `/api/agent/feedback/${feedbackId}`);
|
|
576
|
+
const scorePart = f.voteScore > 0 ? ` | Score: ${f.voteScore}` : '';
|
|
572
577
|
const parts = [
|
|
573
578
|
`# ${f.title}`,
|
|
574
|
-
`Type: ${f.type} | Status: ${f.status}
|
|
579
|
+
`Type: ${f.type} | Status: ${f.status}${scorePart}`,
|
|
575
580
|
f.linkedTaskId ? `Linked: ${f.linkedTaskId}` : '',
|
|
576
581
|
`\n${f.description}`,
|
|
577
582
|
].filter(Boolean);
|