@omnicoreos/planka-mcp 0.2.0
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/CHANGELOG.md +86 -0
- package/CONTRIBUTING.md +37 -0
- package/CREDITS.md +39 -0
- package/LICENSE +22 -0
- package/README.es.md +213 -0
- package/README.md +213 -0
- package/dist/client.d.ts +96 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +281 -0
- package/dist/client.js.map +1 -0
- package/dist/errors.d.ts +85 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +226 -0
- package/dist/errors.js.map +1 -0
- package/dist/identity.generated.d.ts +3 -0
- package/dist/identity.generated.d.ts.map +1 -0
- package/dist/identity.generated.js +4 -0
- package/dist/identity.generated.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +93 -0
- package/dist/index.js.map +1 -0
- package/dist/operations/attachments.d.ts +34 -0
- package/dist/operations/attachments.d.ts.map +1 -0
- package/dist/operations/attachments.js +89 -0
- package/dist/operations/attachments.js.map +1 -0
- package/dist/operations/board-id.d.ts +9 -0
- package/dist/operations/board-id.d.ts.map +1 -0
- package/dist/operations/board-id.js +86 -0
- package/dist/operations/board-id.js.map +1 -0
- package/dist/operations/boards.d.ts +143 -0
- package/dist/operations/boards.d.ts.map +1 -0
- package/dist/operations/boards.js +391 -0
- package/dist/operations/boards.js.map +1 -0
- package/dist/operations/cards.d.ts +36 -0
- package/dist/operations/cards.d.ts.map +1 -0
- package/dist/operations/cards.js +81 -0
- package/dist/operations/cards.js.map +1 -0
- package/dist/operations/comments.d.ts +28 -0
- package/dist/operations/comments.d.ts.map +1 -0
- package/dist/operations/comments.js +53 -0
- package/dist/operations/comments.js.map +1 -0
- package/dist/operations/labels.d.ts +60 -0
- package/dist/operations/labels.d.ts.map +1 -0
- package/dist/operations/labels.js +146 -0
- package/dist/operations/labels.js.map +1 -0
- package/dist/operations/lists.d.ts +15 -0
- package/dist/operations/lists.d.ts.map +1 -0
- package/dist/operations/lists.js +40 -0
- package/dist/operations/lists.js.map +1 -0
- package/dist/operations/projects.d.ts +24 -0
- package/dist/operations/projects.d.ts.map +1 -0
- package/dist/operations/projects.js +61 -0
- package/dist/operations/projects.js.map +1 -0
- package/dist/operations/tasks.d.ts +30 -0
- package/dist/operations/tasks.d.ts.map +1 -0
- package/dist/operations/tasks.js +111 -0
- package/dist/operations/tasks.js.map +1 -0
- package/dist/schemas/entities.d.ts +389 -0
- package/dist/schemas/entities.d.ts.map +1 -0
- package/dist/schemas/entities.js +202 -0
- package/dist/schemas/entities.js.map +1 -0
- package/dist/schemas/requests.d.ts +539 -0
- package/dist/schemas/requests.d.ts.map +1 -0
- package/dist/schemas/requests.js +187 -0
- package/dist/schemas/requests.js.map +1 -0
- package/dist/schemas/responses.d.ts +2626 -0
- package/dist/schemas/responses.d.ts.map +1 -0
- package/dist/schemas/responses.js +75 -0
- package/dist/schemas/responses.js.map +1 -0
- package/dist/tools/attachments.d.ts +270 -0
- package/dist/tools/attachments.d.ts.map +1 -0
- package/dist/tools/attachments.js +247 -0
- package/dist/tools/attachments.js.map +1 -0
- package/dist/tools/cards.d.ts +401 -0
- package/dist/tools/cards.d.ts.map +1 -0
- package/dist/tools/cards.js +368 -0
- package/dist/tools/cards.js.map +1 -0
- package/dist/tools/comments.d.ts +217 -0
- package/dist/tools/comments.d.ts.map +1 -0
- package/dist/tools/comments.js +208 -0
- package/dist/tools/comments.js.map +1 -0
- package/dist/tools/index.d.ts +1293 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +62 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/labels.d.ts +214 -0
- package/dist/tools/labels.d.ts.map +1 -0
- package/dist/tools/labels.js +302 -0
- package/dist/tools/labels.js.map +1 -0
- package/dist/tools/lists.d.ts +117 -0
- package/dist/tools/lists.d.ts.map +1 -0
- package/dist/tools/lists.js +178 -0
- package/dist/tools/lists.js.map +1 -0
- package/dist/tools/navigation.d.ts +106 -0
- package/dist/tools/navigation.d.ts.map +1 -0
- package/dist/tools/navigation.js +151 -0
- package/dist/tools/navigation.js.map +1 -0
- package/dist/tools/queries.d.ts +380 -0
- package/dist/tools/queries.d.ts.map +1 -0
- package/dist/tools/queries.js +256 -0
- package/dist/tools/queries.js.map +1 -0
- package/dist/tools/tasks.d.ts +223 -0
- package/dist/tools/tasks.d.ts.map +1 -0
- package/dist/tools/tasks.js +169 -0
- package/dist/tools/tasks.js.map +1 -0
- package/docs/planka-2x-gotchas.md +192 -0
- package/docs/tools.md +659 -0
- package/docs/troubleshooting.md +138 -0
- package/package.json +71 -0
- package/project.identity.json +7 -0
- package/scripts/bootstrap-board.mjs +160 -0
- package/scripts/lib/planka-api.mjs +244 -0
- package/scripts/lib/workflow-template.mjs +26 -0
- package/scripts/setup.mjs +236 -0
- package/scripts/setup.sh +48 -0
- package/scripts/sync-identity.mjs +57 -0
- package/server.json +43 -0
- package/tests/smoke/planka-smoke.mjs +920 -0
- package/workflow/README.md +232 -0
- package/workflow/board-template.md +115 -0
- package/workflow/skills/planka-close-card/SKILL.md +81 -0
- package/workflow/skills/planka-orchestrator/SKILL.md +126 -0
- package/workflow/worktrees/README.md +104 -0
- package/workflow/worktrees/wt.conf.example +24 -0
- package/workflow/worktrees/wt.sh +345 -0
|
@@ -0,0 +1,380 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tool: planka_list_cards
|
|
3
|
+
*/
|
|
4
|
+
export declare const listCardsTool: {
|
|
5
|
+
name: string;
|
|
6
|
+
description: string;
|
|
7
|
+
inputSchema: {
|
|
8
|
+
type: "object";
|
|
9
|
+
properties: {
|
|
10
|
+
listId: {
|
|
11
|
+
type: string;
|
|
12
|
+
description: string;
|
|
13
|
+
};
|
|
14
|
+
withLabels: {
|
|
15
|
+
type: string;
|
|
16
|
+
description: string;
|
|
17
|
+
};
|
|
18
|
+
withDescription: {
|
|
19
|
+
type: string;
|
|
20
|
+
description: string;
|
|
21
|
+
};
|
|
22
|
+
labelFilter: {
|
|
23
|
+
type: string;
|
|
24
|
+
description: string;
|
|
25
|
+
};
|
|
26
|
+
limit: {
|
|
27
|
+
type: string;
|
|
28
|
+
description: string;
|
|
29
|
+
};
|
|
30
|
+
offset: {
|
|
31
|
+
type: string;
|
|
32
|
+
description: string;
|
|
33
|
+
};
|
|
34
|
+
};
|
|
35
|
+
required: string[];
|
|
36
|
+
};
|
|
37
|
+
handler: (params: {
|
|
38
|
+
listId: string;
|
|
39
|
+
withLabels?: boolean;
|
|
40
|
+
withDescription?: boolean;
|
|
41
|
+
labelFilter?: string;
|
|
42
|
+
limit?: number;
|
|
43
|
+
offset?: number;
|
|
44
|
+
}) => Promise<{
|
|
45
|
+
content: {
|
|
46
|
+
type: "text";
|
|
47
|
+
text: string;
|
|
48
|
+
}[];
|
|
49
|
+
} | {
|
|
50
|
+
content: {
|
|
51
|
+
type: "text";
|
|
52
|
+
text: string;
|
|
53
|
+
}[];
|
|
54
|
+
isError: boolean;
|
|
55
|
+
}>;
|
|
56
|
+
};
|
|
57
|
+
/**
|
|
58
|
+
* Tool: planka_list_lists
|
|
59
|
+
*/
|
|
60
|
+
export declare const listListsTool: {
|
|
61
|
+
name: string;
|
|
62
|
+
description: string;
|
|
63
|
+
inputSchema: {
|
|
64
|
+
type: "object";
|
|
65
|
+
properties: {
|
|
66
|
+
boardId: {
|
|
67
|
+
type: string;
|
|
68
|
+
description: string;
|
|
69
|
+
};
|
|
70
|
+
};
|
|
71
|
+
required: string[];
|
|
72
|
+
};
|
|
73
|
+
handler: (params: {
|
|
74
|
+
boardId: string;
|
|
75
|
+
}) => Promise<{
|
|
76
|
+
content: {
|
|
77
|
+
type: "text";
|
|
78
|
+
text: string;
|
|
79
|
+
}[];
|
|
80
|
+
} | {
|
|
81
|
+
content: {
|
|
82
|
+
type: "text";
|
|
83
|
+
text: string;
|
|
84
|
+
}[];
|
|
85
|
+
isError: boolean;
|
|
86
|
+
}>;
|
|
87
|
+
};
|
|
88
|
+
/**
|
|
89
|
+
* Tool: planka_board_summary
|
|
90
|
+
*/
|
|
91
|
+
export declare const boardSummaryTool: {
|
|
92
|
+
name: string;
|
|
93
|
+
description: string;
|
|
94
|
+
inputSchema: {
|
|
95
|
+
type: "object";
|
|
96
|
+
properties: {
|
|
97
|
+
boardId: {
|
|
98
|
+
type: string;
|
|
99
|
+
description: string;
|
|
100
|
+
};
|
|
101
|
+
cardsFrom: {
|
|
102
|
+
type: string;
|
|
103
|
+
items: {
|
|
104
|
+
type: string;
|
|
105
|
+
};
|
|
106
|
+
description: string;
|
|
107
|
+
};
|
|
108
|
+
highlightLabel: {
|
|
109
|
+
type: string;
|
|
110
|
+
description: string;
|
|
111
|
+
};
|
|
112
|
+
limit: {
|
|
113
|
+
type: string;
|
|
114
|
+
description: string;
|
|
115
|
+
};
|
|
116
|
+
};
|
|
117
|
+
required: string[];
|
|
118
|
+
};
|
|
119
|
+
handler: (params: {
|
|
120
|
+
boardId: string;
|
|
121
|
+
cardsFrom?: string[];
|
|
122
|
+
highlightLabel?: string;
|
|
123
|
+
limit?: number;
|
|
124
|
+
}) => Promise<{
|
|
125
|
+
content: {
|
|
126
|
+
type: "text";
|
|
127
|
+
text: string;
|
|
128
|
+
}[];
|
|
129
|
+
} | {
|
|
130
|
+
content: {
|
|
131
|
+
type: "text";
|
|
132
|
+
text: string;
|
|
133
|
+
}[];
|
|
134
|
+
isError: boolean;
|
|
135
|
+
}>;
|
|
136
|
+
};
|
|
137
|
+
/**
|
|
138
|
+
* Tool: planka_find_cards
|
|
139
|
+
*/
|
|
140
|
+
export declare const findCardsTool: {
|
|
141
|
+
name: string;
|
|
142
|
+
description: string;
|
|
143
|
+
inputSchema: {
|
|
144
|
+
type: "object";
|
|
145
|
+
properties: {
|
|
146
|
+
boardId: {
|
|
147
|
+
type: string;
|
|
148
|
+
description: string;
|
|
149
|
+
};
|
|
150
|
+
labelName: {
|
|
151
|
+
type: string;
|
|
152
|
+
description: string;
|
|
153
|
+
};
|
|
154
|
+
query: {
|
|
155
|
+
type: string;
|
|
156
|
+
description: string;
|
|
157
|
+
};
|
|
158
|
+
listId: {
|
|
159
|
+
type: string;
|
|
160
|
+
description: string;
|
|
161
|
+
};
|
|
162
|
+
withDescription: {
|
|
163
|
+
type: string;
|
|
164
|
+
description: string;
|
|
165
|
+
};
|
|
166
|
+
limit: {
|
|
167
|
+
type: string;
|
|
168
|
+
description: string;
|
|
169
|
+
};
|
|
170
|
+
offset: {
|
|
171
|
+
type: string;
|
|
172
|
+
description: string;
|
|
173
|
+
};
|
|
174
|
+
};
|
|
175
|
+
required: string[];
|
|
176
|
+
};
|
|
177
|
+
handler: (params: {
|
|
178
|
+
boardId: string;
|
|
179
|
+
labelName?: string;
|
|
180
|
+
query?: string;
|
|
181
|
+
listId?: string;
|
|
182
|
+
withDescription?: boolean;
|
|
183
|
+
limit?: number;
|
|
184
|
+
offset?: number;
|
|
185
|
+
}) => Promise<{
|
|
186
|
+
content: {
|
|
187
|
+
type: "text";
|
|
188
|
+
text: string;
|
|
189
|
+
}[];
|
|
190
|
+
} | {
|
|
191
|
+
content: {
|
|
192
|
+
type: "text";
|
|
193
|
+
text: string;
|
|
194
|
+
}[];
|
|
195
|
+
isError: boolean;
|
|
196
|
+
}>;
|
|
197
|
+
};
|
|
198
|
+
export declare const queryTools: ({
|
|
199
|
+
name: string;
|
|
200
|
+
description: string;
|
|
201
|
+
inputSchema: {
|
|
202
|
+
type: "object";
|
|
203
|
+
properties: {
|
|
204
|
+
listId: {
|
|
205
|
+
type: string;
|
|
206
|
+
description: string;
|
|
207
|
+
};
|
|
208
|
+
withLabels: {
|
|
209
|
+
type: string;
|
|
210
|
+
description: string;
|
|
211
|
+
};
|
|
212
|
+
withDescription: {
|
|
213
|
+
type: string;
|
|
214
|
+
description: string;
|
|
215
|
+
};
|
|
216
|
+
labelFilter: {
|
|
217
|
+
type: string;
|
|
218
|
+
description: string;
|
|
219
|
+
};
|
|
220
|
+
limit: {
|
|
221
|
+
type: string;
|
|
222
|
+
description: string;
|
|
223
|
+
};
|
|
224
|
+
offset: {
|
|
225
|
+
type: string;
|
|
226
|
+
description: string;
|
|
227
|
+
};
|
|
228
|
+
};
|
|
229
|
+
required: string[];
|
|
230
|
+
};
|
|
231
|
+
handler: (params: {
|
|
232
|
+
listId: string;
|
|
233
|
+
withLabels?: boolean;
|
|
234
|
+
withDescription?: boolean;
|
|
235
|
+
labelFilter?: string;
|
|
236
|
+
limit?: number;
|
|
237
|
+
offset?: number;
|
|
238
|
+
}) => Promise<{
|
|
239
|
+
content: {
|
|
240
|
+
type: "text";
|
|
241
|
+
text: string;
|
|
242
|
+
}[];
|
|
243
|
+
} | {
|
|
244
|
+
content: {
|
|
245
|
+
type: "text";
|
|
246
|
+
text: string;
|
|
247
|
+
}[];
|
|
248
|
+
isError: boolean;
|
|
249
|
+
}>;
|
|
250
|
+
} | {
|
|
251
|
+
name: string;
|
|
252
|
+
description: string;
|
|
253
|
+
inputSchema: {
|
|
254
|
+
type: "object";
|
|
255
|
+
properties: {
|
|
256
|
+
boardId: {
|
|
257
|
+
type: string;
|
|
258
|
+
description: string;
|
|
259
|
+
};
|
|
260
|
+
};
|
|
261
|
+
required: string[];
|
|
262
|
+
};
|
|
263
|
+
handler: (params: {
|
|
264
|
+
boardId: string;
|
|
265
|
+
}) => Promise<{
|
|
266
|
+
content: {
|
|
267
|
+
type: "text";
|
|
268
|
+
text: string;
|
|
269
|
+
}[];
|
|
270
|
+
} | {
|
|
271
|
+
content: {
|
|
272
|
+
type: "text";
|
|
273
|
+
text: string;
|
|
274
|
+
}[];
|
|
275
|
+
isError: boolean;
|
|
276
|
+
}>;
|
|
277
|
+
} | {
|
|
278
|
+
name: string;
|
|
279
|
+
description: string;
|
|
280
|
+
inputSchema: {
|
|
281
|
+
type: "object";
|
|
282
|
+
properties: {
|
|
283
|
+
boardId: {
|
|
284
|
+
type: string;
|
|
285
|
+
description: string;
|
|
286
|
+
};
|
|
287
|
+
cardsFrom: {
|
|
288
|
+
type: string;
|
|
289
|
+
items: {
|
|
290
|
+
type: string;
|
|
291
|
+
};
|
|
292
|
+
description: string;
|
|
293
|
+
};
|
|
294
|
+
highlightLabel: {
|
|
295
|
+
type: string;
|
|
296
|
+
description: string;
|
|
297
|
+
};
|
|
298
|
+
limit: {
|
|
299
|
+
type: string;
|
|
300
|
+
description: string;
|
|
301
|
+
};
|
|
302
|
+
};
|
|
303
|
+
required: string[];
|
|
304
|
+
};
|
|
305
|
+
handler: (params: {
|
|
306
|
+
boardId: string;
|
|
307
|
+
cardsFrom?: string[];
|
|
308
|
+
highlightLabel?: string;
|
|
309
|
+
limit?: number;
|
|
310
|
+
}) => Promise<{
|
|
311
|
+
content: {
|
|
312
|
+
type: "text";
|
|
313
|
+
text: string;
|
|
314
|
+
}[];
|
|
315
|
+
} | {
|
|
316
|
+
content: {
|
|
317
|
+
type: "text";
|
|
318
|
+
text: string;
|
|
319
|
+
}[];
|
|
320
|
+
isError: boolean;
|
|
321
|
+
}>;
|
|
322
|
+
} | {
|
|
323
|
+
name: string;
|
|
324
|
+
description: string;
|
|
325
|
+
inputSchema: {
|
|
326
|
+
type: "object";
|
|
327
|
+
properties: {
|
|
328
|
+
boardId: {
|
|
329
|
+
type: string;
|
|
330
|
+
description: string;
|
|
331
|
+
};
|
|
332
|
+
labelName: {
|
|
333
|
+
type: string;
|
|
334
|
+
description: string;
|
|
335
|
+
};
|
|
336
|
+
query: {
|
|
337
|
+
type: string;
|
|
338
|
+
description: string;
|
|
339
|
+
};
|
|
340
|
+
listId: {
|
|
341
|
+
type: string;
|
|
342
|
+
description: string;
|
|
343
|
+
};
|
|
344
|
+
withDescription: {
|
|
345
|
+
type: string;
|
|
346
|
+
description: string;
|
|
347
|
+
};
|
|
348
|
+
limit: {
|
|
349
|
+
type: string;
|
|
350
|
+
description: string;
|
|
351
|
+
};
|
|
352
|
+
offset: {
|
|
353
|
+
type: string;
|
|
354
|
+
description: string;
|
|
355
|
+
};
|
|
356
|
+
};
|
|
357
|
+
required: string[];
|
|
358
|
+
};
|
|
359
|
+
handler: (params: {
|
|
360
|
+
boardId: string;
|
|
361
|
+
labelName?: string;
|
|
362
|
+
query?: string;
|
|
363
|
+
listId?: string;
|
|
364
|
+
withDescription?: boolean;
|
|
365
|
+
limit?: number;
|
|
366
|
+
offset?: number;
|
|
367
|
+
}) => Promise<{
|
|
368
|
+
content: {
|
|
369
|
+
type: "text";
|
|
370
|
+
text: string;
|
|
371
|
+
}[];
|
|
372
|
+
} | {
|
|
373
|
+
content: {
|
|
374
|
+
type: "text";
|
|
375
|
+
text: string;
|
|
376
|
+
}[];
|
|
377
|
+
isError: boolean;
|
|
378
|
+
}>;
|
|
379
|
+
})[];
|
|
380
|
+
//# sourceMappingURL=queries.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queries.d.ts","sourceRoot":"","sources":["../../src/tools/queries.ts"],"names":[],"mappings":"AAgDA;;GAEG;AACH,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gBAyCZ,MAAM;qBACD,OAAO;0BACF,OAAO;sBACX,MAAM;gBACZ,MAAM;iBACL,MAAM;;;;;;;;;;;;;CA6CpB,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,aAAa;;;;;;;;;;;;;;iBAa4B,MAAM;;;;;;;;;;;;;CAQ3D,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA+Bd,MAAM;oBACH,MAAM,EAAE;yBACH,MAAM;gBACf,MAAM;;;;;;;;;;;;;CAuBnB,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA4CX,MAAM;oBACH,MAAM;gBACV,MAAM;iBACL,MAAM;0BACG,OAAO;gBACjB,MAAM;iBACL,MAAM;;;;;;;;;;;;;CAkBpB,CAAC;AAEF,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gBArNT,MAAM;qBACD,OAAO;0BACF,OAAO;sBACX,MAAM;gBACZ,MAAM;iBACL,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA+DiC,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA4C7C,MAAM;oBACH,MAAM,EAAE;yBACH,MAAM;gBACf,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAwEL,MAAM;oBACH,MAAM;gBACV,MAAM;iBACL,MAAM;0BACG,OAAO;gBACjB,MAAM;iBACL,MAAM;;;;;;;;;;;;;IAyBpB,CAAC"}
|
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Scoped query tools — they avoid pulling a whole board when only one column
|
|
3
|
+
* matters.
|
|
4
|
+
*
|
|
5
|
+
* All of them return small JSON and, when they clip, they say so (`total`,
|
|
6
|
+
* `returned`, `hasMore`, `nextOffset`): the model never has to guess whether
|
|
7
|
+
* it saw everything.
|
|
8
|
+
*/
|
|
9
|
+
import { listCards, getBoardListCounts, getBoardSummary, findCards, } from "../operations/boards.js";
|
|
10
|
+
import { PlankaError } from "../errors.js";
|
|
11
|
+
/** Standard JSON response for these tools. */
|
|
12
|
+
function jsonResult(payload) {
|
|
13
|
+
return {
|
|
14
|
+
content: [
|
|
15
|
+
{ type: "text", text: JSON.stringify(payload, null, 2) },
|
|
16
|
+
],
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Wraps a handler so PLANKA API failures come back as actionable text.
|
|
21
|
+
* PlankaInputError travels on untouched: `src/index.ts` formats it, being the
|
|
22
|
+
* only layer that knows the tool's inputSchema.
|
|
23
|
+
*/
|
|
24
|
+
function withPlankaErrors(handler) {
|
|
25
|
+
return async (params) => {
|
|
26
|
+
try {
|
|
27
|
+
return await handler(params);
|
|
28
|
+
}
|
|
29
|
+
catch (error) {
|
|
30
|
+
if (error instanceof PlankaError) {
|
|
31
|
+
return {
|
|
32
|
+
content: [{ type: "text", text: `Error: ${error.message}` }],
|
|
33
|
+
isError: true,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
throw error;
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Tool: planka_list_cards
|
|
42
|
+
*/
|
|
43
|
+
export const listCardsTool = {
|
|
44
|
+
name: "planka_list_cards",
|
|
45
|
+
description: "List the cards of ONE list/column, compact (id, name, labels, task counts, dueDate) and paginated. " +
|
|
46
|
+
"Prefer this over planka_get_board whenever you only care about one column: on a ~100-card board it returns roughly 1/20th of the text. " +
|
|
47
|
+
"Descriptions are OFF by default — turn them on only when you actually need them. " +
|
|
48
|
+
"Returns total/returned/hasMore/nextOffset, so you always know whether you saw everything. " +
|
|
49
|
+
"Get list IDs from planka_list_lists or planka_get_structure.",
|
|
50
|
+
inputSchema: {
|
|
51
|
+
type: "object",
|
|
52
|
+
properties: {
|
|
53
|
+
listId: { type: "string", description: "The list (column) ID" },
|
|
54
|
+
withLabels: {
|
|
55
|
+
type: "boolean",
|
|
56
|
+
description: "Resolve label names (adds one board fetch). Default true.",
|
|
57
|
+
},
|
|
58
|
+
withDescription: {
|
|
59
|
+
type: "boolean",
|
|
60
|
+
description: "Include a 200-char description preview per card. Default false — this is the expensive one.",
|
|
61
|
+
},
|
|
62
|
+
labelFilter: {
|
|
63
|
+
type: "string",
|
|
64
|
+
description: "Only return cards carrying this label name (e.g. 'decidido'; case- and accent-insensitive). Implies withLabels.",
|
|
65
|
+
},
|
|
66
|
+
limit: {
|
|
67
|
+
type: "number",
|
|
68
|
+
description: "Max cards to return. Default 25, max 200.",
|
|
69
|
+
},
|
|
70
|
+
offset: {
|
|
71
|
+
type: "number",
|
|
72
|
+
description: "Skip this many cards. Use the nextOffset from the previous response to page.",
|
|
73
|
+
},
|
|
74
|
+
},
|
|
75
|
+
required: ["listId"],
|
|
76
|
+
},
|
|
77
|
+
handler: withPlankaErrors(async (params) => {
|
|
78
|
+
const result = await listCards(params);
|
|
79
|
+
const showLabels = params.labelFilter !== undefined || params.withLabels !== false;
|
|
80
|
+
return jsonResult({
|
|
81
|
+
listId: result.listId,
|
|
82
|
+
total: result.total,
|
|
83
|
+
returned: result.returned,
|
|
84
|
+
offset: result.offset,
|
|
85
|
+
hasMore: result.hasMore,
|
|
86
|
+
...(result.nextOffset !== undefined
|
|
87
|
+
? { nextOffset: result.nextOffset }
|
|
88
|
+
: {}),
|
|
89
|
+
...(result.labelFilter
|
|
90
|
+
? { labelFilter: result.labelFilter, totalInList: result.totalInList }
|
|
91
|
+
: {}),
|
|
92
|
+
...(result.truncated
|
|
93
|
+
? {
|
|
94
|
+
truncated: true,
|
|
95
|
+
note: "PLANKA stopped paginating this list; some cards may be missing.",
|
|
96
|
+
}
|
|
97
|
+
: {}),
|
|
98
|
+
cards: result.cards.map((c) => ({
|
|
99
|
+
id: c.id,
|
|
100
|
+
name: c.name,
|
|
101
|
+
...(showLabels ? { labels: c.labelNames } : {}),
|
|
102
|
+
...(c.taskCount > 0
|
|
103
|
+
? { tasks: `${c.completedTaskCount}/${c.taskCount}` }
|
|
104
|
+
: {}),
|
|
105
|
+
...(c.dueDate ? { dueDate: c.dueDate } : {}),
|
|
106
|
+
...(c.isCompleted ? { isCompleted: true } : {}),
|
|
107
|
+
...(params.withDescription && c.description
|
|
108
|
+
? {
|
|
109
|
+
description: c.description.length > 200
|
|
110
|
+
? `${c.description.slice(0, 200)}…`
|
|
111
|
+
: c.description,
|
|
112
|
+
}
|
|
113
|
+
: {}),
|
|
114
|
+
})),
|
|
115
|
+
});
|
|
116
|
+
}),
|
|
117
|
+
};
|
|
118
|
+
/**
|
|
119
|
+
* Tool: planka_list_lists
|
|
120
|
+
*/
|
|
121
|
+
export const listListsTool = {
|
|
122
|
+
name: "planka_list_lists",
|
|
123
|
+
description: "List the columns of a board with how many cards each one holds — no cards, no descriptions. " +
|
|
124
|
+
"Use it to see the shape of a board and pick which column to open next: it costs a few dozen lines where planka_get_board costs thousands. " +
|
|
125
|
+
"planka_get_structure gives the same names but NOT the counts.",
|
|
126
|
+
inputSchema: {
|
|
127
|
+
type: "object",
|
|
128
|
+
properties: {
|
|
129
|
+
boardId: { type: "string", description: "The board ID" },
|
|
130
|
+
},
|
|
131
|
+
required: ["boardId"],
|
|
132
|
+
},
|
|
133
|
+
handler: withPlankaErrors(async (params) => {
|
|
134
|
+
const result = await getBoardListCounts({ boardId: params.boardId });
|
|
135
|
+
return jsonResult({
|
|
136
|
+
board: { id: result.board.id, name: result.board.name },
|
|
137
|
+
totalCards: result.totalCards,
|
|
138
|
+
lists: result.lists,
|
|
139
|
+
});
|
|
140
|
+
}),
|
|
141
|
+
};
|
|
142
|
+
/**
|
|
143
|
+
* Tool: planka_board_summary
|
|
144
|
+
*/
|
|
145
|
+
export const boardSummaryTool = {
|
|
146
|
+
name: "planka_board_summary",
|
|
147
|
+
description: "One-call briefing of a board: every column with its card count, every label, and the cards sitting in the column(s) that are waiting on a decision — flagged by whether they already carry the unblocking label. " +
|
|
148
|
+
"This is the tool to open a working session with: it answers 'what is on this board and what should I pick up' without dumping the board. " +
|
|
149
|
+
"By default it picks the decision column by name (matches 'decision'/'decide'/'blocked', accent-insensitive, so '🤔 Necesita tu decisión' works) and highlights the label 'decidido'; override both for other boards. " +
|
|
150
|
+
"Card payload is minimal (id, name, list, labels) — follow up with planka_get_card for one card, never with planka_get_board.",
|
|
151
|
+
inputSchema: {
|
|
152
|
+
type: "object",
|
|
153
|
+
properties: {
|
|
154
|
+
boardId: { type: "string", description: "The board ID" },
|
|
155
|
+
cardsFrom: {
|
|
156
|
+
type: "array",
|
|
157
|
+
items: { type: "string" },
|
|
158
|
+
description: "Which column(s) to return cards from: list IDs, or name fragments matched case- and accent-insensitively (e.g. ['decision'] or ['probalo','miralo']). Default: columns that look like a decision queue.",
|
|
159
|
+
},
|
|
160
|
+
highlightLabel: {
|
|
161
|
+
type: "string",
|
|
162
|
+
description: "Label that marks a card as unblocked/ready. Default 'decidido'. Cards carrying it come first and get highlighted:true.",
|
|
163
|
+
},
|
|
164
|
+
limit: {
|
|
165
|
+
type: "number",
|
|
166
|
+
description: "Max cards to return. Default 50, max 200.",
|
|
167
|
+
},
|
|
168
|
+
},
|
|
169
|
+
required: ["boardId"],
|
|
170
|
+
},
|
|
171
|
+
handler: withPlankaErrors(async (params) => {
|
|
172
|
+
const summary = await getBoardSummary(params);
|
|
173
|
+
return jsonResult({
|
|
174
|
+
board: { id: summary.board.id, name: summary.board.name },
|
|
175
|
+
lists: summary.lists,
|
|
176
|
+
labels: summary.labels,
|
|
177
|
+
cardsFrom: summary.cardsFrom,
|
|
178
|
+
highlightLabel: summary.highlightLabel,
|
|
179
|
+
highlightedCount: summary.highlightedCount,
|
|
180
|
+
total: summary.total,
|
|
181
|
+
returned: summary.returned,
|
|
182
|
+
hasMore: summary.hasMore,
|
|
183
|
+
cards: summary.cards.map((c) => ({
|
|
184
|
+
id: c.id,
|
|
185
|
+
name: c.name,
|
|
186
|
+
list: c.list,
|
|
187
|
+
labels: c.labels,
|
|
188
|
+
...(c.highlighted ? { highlighted: true } : {}),
|
|
189
|
+
})),
|
|
190
|
+
});
|
|
191
|
+
}),
|
|
192
|
+
};
|
|
193
|
+
/**
|
|
194
|
+
* Tool: planka_find_cards
|
|
195
|
+
*/
|
|
196
|
+
export const findCardsTool = {
|
|
197
|
+
name: "planka_find_cards",
|
|
198
|
+
description: "Search the cards of a board by label and/or text, returning only the matches (id, name, list, labels). " +
|
|
199
|
+
"Two jobs it does far cheaper than planka_get_board: sweeping every card carrying a label (labelName: 'decidido'), and checking 'does a card about X already exist?' before creating a duplicate. " +
|
|
200
|
+
"query matches BOTH the card name and its description, case- and accent-insensitive; listId narrows the search to one column. " +
|
|
201
|
+
"At least one of labelName / query / listId is required. Descriptions are omitted unless withDescription is set, so the answer stays a handful of lines however big the board is.",
|
|
202
|
+
inputSchema: {
|
|
203
|
+
type: "object",
|
|
204
|
+
properties: {
|
|
205
|
+
boardId: { type: "string", description: "The board ID" },
|
|
206
|
+
labelName: {
|
|
207
|
+
type: "string",
|
|
208
|
+
description: "Only cards carrying this label name (exact name, case- and accent-insensitive). If the board has no such label, the response says so and lists the ones it does have.",
|
|
209
|
+
},
|
|
210
|
+
query: {
|
|
211
|
+
type: "string",
|
|
212
|
+
description: "Free text matched against card name AND description (substring, case- and accent-insensitive).",
|
|
213
|
+
},
|
|
214
|
+
listId: {
|
|
215
|
+
type: "string",
|
|
216
|
+
description: "Restrict the search to this list (column).",
|
|
217
|
+
},
|
|
218
|
+
withDescription: {
|
|
219
|
+
type: "boolean",
|
|
220
|
+
description: "Include a 200-char description preview per match. Default false.",
|
|
221
|
+
},
|
|
222
|
+
limit: {
|
|
223
|
+
type: "number",
|
|
224
|
+
description: "Max matches to return. Default 25, max 200.",
|
|
225
|
+
},
|
|
226
|
+
offset: {
|
|
227
|
+
type: "number",
|
|
228
|
+
description: "Skip this many matches. Use nextOffset from the previous response.",
|
|
229
|
+
},
|
|
230
|
+
},
|
|
231
|
+
required: ["boardId"],
|
|
232
|
+
},
|
|
233
|
+
handler: withPlankaErrors(async (params) => {
|
|
234
|
+
const result = await findCards(params);
|
|
235
|
+
return jsonResult({
|
|
236
|
+
boardId: result.boardId,
|
|
237
|
+
filters: result.filters,
|
|
238
|
+
total: result.total,
|
|
239
|
+
returned: result.returned,
|
|
240
|
+
offset: result.offset,
|
|
241
|
+
hasMore: result.hasMore,
|
|
242
|
+
...(result.nextOffset !== undefined
|
|
243
|
+
? { nextOffset: result.nextOffset }
|
|
244
|
+
: {}),
|
|
245
|
+
...(result.warning ? { warning: result.warning } : {}),
|
|
246
|
+
matches: result.matches,
|
|
247
|
+
});
|
|
248
|
+
}),
|
|
249
|
+
};
|
|
250
|
+
export const queryTools = [
|
|
251
|
+
listCardsTool,
|
|
252
|
+
listListsTool,
|
|
253
|
+
boardSummaryTool,
|
|
254
|
+
findCardsTool,
|
|
255
|
+
];
|
|
256
|
+
//# sourceMappingURL=queries.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queries.js","sourceRoot":"","sources":["../../src/tools/queries.ts"],"names":[],"mappings":"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"}
|