@omnicoreos/planka-mcp 0.2.0 → 0.3.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/.agents/plugins/marketplace.json +20 -0
- package/.claude-plugin/marketplace.json +26 -0
- package/.claude-plugin/plugin.json +45 -0
- package/.codex-plugin/mcp.json +16 -0
- package/.codex-plugin/plugin.json +27 -0
- package/.mcp.json +17 -0
- package/CHANGELOG.md +510 -0
- package/README.es.md +294 -55
- package/README.md +293 -55
- package/dist/cli/init.d.ts +101 -0
- package/dist/cli/init.d.ts.map +1 -0
- package/dist/cli/init.js +481 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/client.d.ts +32 -4
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +106 -32
- package/dist/client.js.map +1 -1
- package/dist/config/policy.d.ts +82 -0
- package/dist/config/policy.d.ts.map +1 -0
- package/dist/config/policy.js +226 -0
- package/dist/config/policy.js.map +1 -0
- package/dist/errors.d.ts +5 -1
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +62 -5
- package/dist/errors.js.map +1 -1
- package/dist/identity.generated.d.ts +2 -1
- package/dist/identity.generated.d.ts.map +1 -1
- package/dist/identity.generated.js +2 -1
- package/dist/identity.generated.js.map +1 -1
- package/dist/index.js +85 -10
- package/dist/index.js.map +1 -1
- package/dist/instructions.d.ts +21 -0
- package/dist/instructions.d.ts.map +1 -0
- package/dist/instructions.js +37 -0
- package/dist/instructions.js.map +1 -0
- package/dist/operations/actions.d.ts +654 -0
- package/dist/operations/actions.d.ts.map +1 -0
- package/dist/operations/actions.js +154 -0
- package/dist/operations/actions.js.map +1 -0
- package/dist/operations/archive.d.ts +28 -0
- package/dist/operations/archive.d.ts.map +1 -0
- package/dist/operations/archive.js +74 -0
- package/dist/operations/archive.js.map +1 -0
- package/dist/operations/attachments.d.ts +1 -1
- package/dist/operations/attachments.d.ts.map +1 -1
- package/dist/operations/attachments.js +3 -1
- package/dist/operations/attachments.js.map +1 -1
- package/dist/operations/board-id.d.ts +1 -1
- package/dist/operations/board-id.d.ts.map +1 -1
- package/dist/operations/board-id.js +13 -7
- package/dist/operations/board-id.js.map +1 -1
- package/dist/operations/boards.d.ts +96 -19
- package/dist/operations/boards.d.ts.map +1 -1
- package/dist/operations/boards.js +377 -93
- package/dist/operations/boards.js.map +1 -1
- package/dist/operations/card-brief.d.ts +91 -0
- package/dist/operations/card-brief.d.ts.map +1 -0
- package/dist/operations/card-brief.js +79 -0
- package/dist/operations/card-brief.js.map +1 -0
- package/dist/operations/cards.d.ts +34 -9
- package/dist/operations/cards.d.ts.map +1 -1
- package/dist/operations/cards.js +60 -14
- package/dist/operations/cards.js.map +1 -1
- package/dist/operations/comments.d.ts +61 -4
- package/dist/operations/comments.d.ts.map +1 -1
- package/dist/operations/comments.js +91 -8
- package/dist/operations/comments.js.map +1 -1
- package/dist/operations/duplicate.d.ts +16 -0
- package/dist/operations/duplicate.d.ts.map +1 -0
- package/dist/operations/duplicate.js +43 -0
- package/dist/operations/duplicate.js.map +1 -0
- package/dist/operations/labels.d.ts +1 -1
- package/dist/operations/labels.d.ts.map +1 -1
- package/dist/operations/labels.js +7 -4
- package/dist/operations/labels.js.map +1 -1
- package/dist/operations/lists.d.ts +63 -1
- package/dist/operations/lists.d.ts.map +1 -1
- package/dist/operations/lists.js +97 -2
- package/dist/operations/lists.js.map +1 -1
- package/dist/operations/members.d.ts +39 -0
- package/dist/operations/members.d.ts.map +1 -0
- package/dist/operations/members.js +107 -0
- package/dist/operations/members.js.map +1 -0
- package/dist/operations/projects.d.ts +16 -0
- package/dist/operations/projects.d.ts.map +1 -1
- package/dist/operations/projects.js +54 -9
- package/dist/operations/projects.js.map +1 -1
- package/dist/operations/tasks.d.ts +1 -1
- package/dist/operations/tasks.d.ts.map +1 -1
- package/dist/operations/tasks.js +5 -3
- package/dist/operations/tasks.js.map +1 -1
- package/dist/operations/users.d.ts +123 -0
- package/dist/operations/users.d.ts.map +1 -0
- package/dist/operations/users.js +180 -0
- package/dist/operations/users.js.map +1 -0
- package/dist/operations/verify.d.ts +84 -0
- package/dist/operations/verify.d.ts.map +1 -0
- package/dist/operations/verify.js +124 -0
- package/dist/operations/verify.js.map +1 -0
- package/dist/prompts.d.ts +48 -0
- package/dist/prompts.d.ts.map +1 -0
- package/dist/prompts.js +155 -0
- package/dist/prompts.js.map +1 -0
- package/dist/resources.d.ts +38 -0
- package/dist/resources.d.ts.map +1 -0
- package/dist/resources.js +127 -0
- package/dist/resources.js.map +1 -0
- package/dist/schemas/entities.d.ts +115 -24
- package/dist/schemas/entities.d.ts.map +1 -1
- package/dist/schemas/entities.js +48 -0
- package/dist/schemas/entities.js.map +1 -1
- package/dist/schemas/requests.d.ts +121 -46
- package/dist/schemas/requests.d.ts.map +1 -1
- package/dist/schemas/requests.js +57 -12
- package/dist/schemas/requests.js.map +1 -1
- package/dist/schemas/responses.d.ts +541 -186
- package/dist/schemas/responses.d.ts.map +1 -1
- package/dist/schemas/responses.js +13 -2
- package/dist/schemas/responses.js.map +1 -1
- package/dist/tools/activity.d.ts +150 -0
- package/dist/tools/activity.d.ts.map +1 -0
- package/dist/tools/activity.js +198 -0
- package/dist/tools/activity.js.map +1 -0
- package/dist/tools/annotations.d.ts +52 -0
- package/dist/tools/annotations.d.ts.map +1 -0
- package/dist/tools/annotations.js +214 -0
- package/dist/tools/annotations.js.map +1 -0
- package/dist/tools/attachments.d.ts +28 -4
- package/dist/tools/attachments.d.ts.map +1 -1
- package/dist/tools/attachments.js +53 -34
- package/dist/tools/attachments.js.map +1 -1
- package/dist/tools/card-ops.d.ts +232 -0
- package/dist/tools/card-ops.d.ts.map +1 -0
- package/dist/tools/card-ops.js +333 -0
- package/dist/tools/card-ops.js.map +1 -0
- package/dist/tools/cards.d.ts +90 -8
- package/dist/tools/cards.d.ts.map +1 -1
- package/dist/tools/cards.js +411 -128
- package/dist/tools/cards.js.map +1 -1
- package/dist/tools/comments.d.ts +226 -22
- package/dist/tools/comments.d.ts.map +1 -1
- package/dist/tools/comments.js +163 -134
- package/dist/tools/comments.js.map +1 -1
- package/dist/tools/dispatch.d.ts +47 -0
- package/dist/tools/dispatch.d.ts.map +1 -0
- package/dist/tools/dispatch.js +63 -0
- package/dist/tools/dispatch.js.map +1 -0
- package/dist/tools/guard.d.ts +9 -0
- package/dist/tools/guard.d.ts.map +1 -0
- package/dist/tools/guard.js +20 -0
- package/dist/tools/guard.js.map +1 -0
- package/dist/tools/index.d.ts +748 -450
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +136 -17
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/labels.d.ts +213 -18
- package/dist/tools/labels.d.ts.map +1 -1
- package/dist/tools/labels.js +218 -203
- package/dist/tools/labels.js.map +1 -1
- package/dist/tools/lists.d.ts +222 -15
- package/dist/tools/lists.d.ts.map +1 -1
- package/dist/tools/lists.js +175 -156
- package/dist/tools/lists.js.map +1 -1
- package/dist/tools/members.d.ts +128 -0
- package/dist/tools/members.d.ts.map +1 -0
- package/dist/tools/members.js +150 -0
- package/dist/tools/members.js.map +1 -0
- package/dist/tools/navigation.d.ts +22 -2
- package/dist/tools/navigation.d.ts.map +1 -1
- package/dist/tools/navigation.js +60 -15
- package/dist/tools/navigation.js.map +1 -1
- package/dist/tools/queries.d.ts +196 -166
- package/dist/tools/queries.d.ts.map +1 -1
- package/dist/tools/queries.js +125 -155
- package/dist/tools/queries.js.map +1 -1
- package/dist/tools/tasks.d.ts +26 -6
- package/dist/tools/tasks.d.ts.map +1 -1
- package/dist/tools/tasks.js +110 -55
- package/dist/tools/tasks.js.map +1 -1
- package/dist/tools/users.d.ts +130 -0
- package/dist/tools/users.d.ts.map +1 -0
- package/dist/tools/users.js +165 -0
- package/dist/tools/users.js.map +1 -0
- package/docs/planka-2x-gotchas.md +121 -5
- package/docs/tools.md +771 -187
- package/docs/troubleshooting.md +137 -5
- package/hooks/hooks.json +15 -0
- package/hooks/preflight.mjs +100 -0
- package/package.json +6 -1
- package/scripts/setup.sh +8 -26
- package/scripts/sync-identity.mjs +55 -1
- package/server.json +87 -6
- package/tests/smoke/planka-smoke.mjs +512 -72
- package/workflow/skills/planka-close-card/SKILL.md +18 -5
- package/workflow/skills/planka-orchestrator/SKILL.md +36 -7
package/dist/tools/queries.js
CHANGED
|
@@ -6,13 +6,13 @@
|
|
|
6
6
|
* `returned`, `hasMore`, `nextOffset`): the model never has to guess whether
|
|
7
7
|
* it saw everything.
|
|
8
8
|
*/
|
|
9
|
-
import {
|
|
9
|
+
import { getBoardSummary, findCards } from "../operations/boards.js";
|
|
10
10
|
import { PlankaError } from "../errors.js";
|
|
11
11
|
/** Standard JSON response for these tools. */
|
|
12
12
|
function jsonResult(payload) {
|
|
13
13
|
return {
|
|
14
14
|
content: [
|
|
15
|
-
{ type: "text", text: JSON.stringify(payload
|
|
15
|
+
{ type: "text", text: JSON.stringify(payload) },
|
|
16
16
|
],
|
|
17
17
|
};
|
|
18
18
|
}
|
|
@@ -37,48 +37,83 @@ function withPlankaErrors(handler) {
|
|
|
37
37
|
}
|
|
38
38
|
};
|
|
39
39
|
}
|
|
40
|
+
const findCardsProperties = {
|
|
41
|
+
boardId: {
|
|
42
|
+
type: "string",
|
|
43
|
+
description: "Board ID. Optional with PLANKA_DEFAULT_BOARD_ID; ignored when listId is given.",
|
|
44
|
+
},
|
|
45
|
+
listId: {
|
|
46
|
+
type: "string",
|
|
47
|
+
description: "Read exactly this column. THE CHEAP PATH: one request, no pagination, so total is the real size of the column and truncated is false by construction.",
|
|
48
|
+
},
|
|
49
|
+
listName: {
|
|
50
|
+
type: "string",
|
|
51
|
+
description: "Column name fragment (case- and accent-insensitive) instead of an ID. Costs a board read; listId is cheaper.",
|
|
52
|
+
},
|
|
53
|
+
query: {
|
|
54
|
+
type: "string",
|
|
55
|
+
description: "Free text matched against card name AND description. Several words are ANDed — all must appear — ignoring case and accents. A leading '/' makes the rest a case-insensitive regular expression.",
|
|
56
|
+
},
|
|
57
|
+
labelName: {
|
|
58
|
+
type: "string",
|
|
59
|
+
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.",
|
|
60
|
+
},
|
|
61
|
+
labelIds: {
|
|
62
|
+
type: "array",
|
|
63
|
+
items: { type: "string" },
|
|
64
|
+
description: "Only cards carrying at least one of these label IDs (OR).",
|
|
65
|
+
},
|
|
66
|
+
userIds: {
|
|
67
|
+
type: "array",
|
|
68
|
+
items: { type: "string" },
|
|
69
|
+
description: "Only cards where one of these users is a member or a task assignee (OR).",
|
|
70
|
+
},
|
|
71
|
+
withLabels: {
|
|
72
|
+
type: "boolean",
|
|
73
|
+
description: "Resolve label names. Default true; false skips one board read on the listId path.",
|
|
74
|
+
},
|
|
75
|
+
detail: {
|
|
76
|
+
type: "string",
|
|
77
|
+
enum: ["digest", "full"],
|
|
78
|
+
description: "digest (default): id, name, labels, members, tasks, dueDate, commentsTotal, updatedAt. full: every field of the card, description included.",
|
|
79
|
+
},
|
|
80
|
+
descriptionChars: {
|
|
81
|
+
type: "number",
|
|
82
|
+
description: "Per-match description preview, in characters. 0 (the default) leaves descriptions out.",
|
|
83
|
+
},
|
|
84
|
+
limit: {
|
|
85
|
+
type: "number",
|
|
86
|
+
description: "Max matches to return. Default 25, max 200.",
|
|
87
|
+
},
|
|
88
|
+
offset: {
|
|
89
|
+
type: "number",
|
|
90
|
+
description: "Skip this many matches. Use nextOffset from the previous response.",
|
|
91
|
+
},
|
|
92
|
+
};
|
|
40
93
|
/**
|
|
41
|
-
* Tool:
|
|
94
|
+
* Tool: planka_find_cards — the one read over a board's cards.
|
|
42
95
|
*/
|
|
43
|
-
export const
|
|
44
|
-
name: "
|
|
45
|
-
description: "
|
|
46
|
-
"
|
|
47
|
-
"
|
|
48
|
-
"
|
|
49
|
-
"Get list IDs from planka_list_lists or planka_get_structure.",
|
|
96
|
+
export const findCardsTool = {
|
|
97
|
+
name: "planka_find_cards",
|
|
98
|
+
description: "Cards of a board or of ONE column, filtered by column, text, label or member, returned as digests. " +
|
|
99
|
+
"With listId it reads that column in a single request — unpaginated, so `total` is the whole column and nothing is silently clipped. " +
|
|
100
|
+
"Without it, it filters over one board read (archive and trash excluded). " +
|
|
101
|
+
"At least one filter is required: listId, listName, query, labelName, labelIds or userIds.",
|
|
50
102
|
inputSchema: {
|
|
51
103
|
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"],
|
|
104
|
+
properties: findCardsProperties,
|
|
76
105
|
},
|
|
77
106
|
handler: withPlankaErrors(async (params) => {
|
|
78
|
-
const result = await
|
|
79
|
-
const showLabels = params.labelFilter !== undefined || params.withLabels !== false;
|
|
107
|
+
const result = await findCards(params);
|
|
80
108
|
return jsonResult({
|
|
81
|
-
|
|
109
|
+
boardId: result.boardId,
|
|
110
|
+
...(result.list ? { list: result.list } : {}),
|
|
111
|
+
filters: result.filters,
|
|
112
|
+
...(result.detail !== "digest" ? { detail: result.detail } : {}),
|
|
113
|
+
source: result.source,
|
|
114
|
+
...(result.labelsResolved ? {} : { labelsResolved: false }),
|
|
115
|
+
...(result.truncated === false ? { truncated: false } : {}),
|
|
116
|
+
...(result.excludesArchived ? { excludesArchived: true } : {}),
|
|
82
117
|
total: result.total,
|
|
83
118
|
returned: result.returned,
|
|
84
119
|
offset: result.offset,
|
|
@@ -86,80 +121,74 @@ export const listCardsTool = {
|
|
|
86
121
|
...(result.nextOffset !== undefined
|
|
87
122
|
? { nextOffset: result.nextOffset }
|
|
88
123
|
: {}),
|
|
89
|
-
...(result.
|
|
90
|
-
|
|
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
|
-
})),
|
|
124
|
+
...(result.warnings.length > 0 ? { warnings: result.warnings } : {}),
|
|
125
|
+
matches: result.matches,
|
|
115
126
|
});
|
|
116
127
|
}),
|
|
117
128
|
};
|
|
118
129
|
/**
|
|
119
|
-
* Tool:
|
|
130
|
+
* Tool: planka_list_cards — alias of planka_find_cards with listId.
|
|
120
131
|
*/
|
|
121
|
-
export const
|
|
122
|
-
name: "
|
|
123
|
-
description: "
|
|
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.",
|
|
132
|
+
export const listCardsTool = {
|
|
133
|
+
name: "planka_list_cards",
|
|
134
|
+
description: "DEPRECATED: use planka_find_cards with listId. Same arguments, same handler, same response.",
|
|
126
135
|
inputSchema: {
|
|
127
136
|
type: "object",
|
|
128
|
-
properties:
|
|
129
|
-
|
|
130
|
-
},
|
|
131
|
-
required: ["boardId"],
|
|
137
|
+
properties: findCardsProperties,
|
|
138
|
+
required: ["listId"],
|
|
132
139
|
},
|
|
133
|
-
handler:
|
|
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
|
-
}),
|
|
140
|
+
handler: findCardsTool.handler,
|
|
141
141
|
};
|
|
142
|
+
async function boardSummaryResult(params) {
|
|
143
|
+
const summary = await getBoardSummary(params);
|
|
144
|
+
return jsonResult({
|
|
145
|
+
board: { id: summary.board.id, name: summary.board.name },
|
|
146
|
+
lists: summary.lists,
|
|
147
|
+
labels: summary.labels,
|
|
148
|
+
totalCards: summary.totalCards,
|
|
149
|
+
excludesArchived: true,
|
|
150
|
+
...(summary.warnings.length > 0 ? { warnings: summary.warnings } : {}),
|
|
151
|
+
...(summary.cardsFrom.length > 0 || summary.total > 0
|
|
152
|
+
? {
|
|
153
|
+
cardsFrom: summary.cardsFrom,
|
|
154
|
+
...(summary.highlightLabel
|
|
155
|
+
? {
|
|
156
|
+
highlightLabel: summary.highlightLabel,
|
|
157
|
+
highlightedCount: summary.highlightedCount,
|
|
158
|
+
}
|
|
159
|
+
: {}),
|
|
160
|
+
total: summary.total,
|
|
161
|
+
returned: summary.returned,
|
|
162
|
+
hasMore: summary.hasMore,
|
|
163
|
+
cards: summary.cards,
|
|
164
|
+
}
|
|
165
|
+
: {}),
|
|
166
|
+
});
|
|
167
|
+
}
|
|
142
168
|
/**
|
|
143
169
|
* Tool: planka_board_summary
|
|
144
170
|
*/
|
|
145
171
|
export const boardSummaryTool = {
|
|
146
172
|
name: "planka_board_summary",
|
|
147
|
-
description: "
|
|
148
|
-
"
|
|
149
|
-
"
|
|
150
|
-
"
|
|
173
|
+
description: "The session opener: every column with its card count and every label, in one call. " +
|
|
174
|
+
"Pass cardsFrom to also get the cards of those column(s) — with cardsFrom omitted (and no PLANKA_SUMMARY_DECISION_LISTS configured) it returns no cards at all. " +
|
|
175
|
+
"A cardsFrom entry or a highlightLabel that matches nothing comes back in `warnings`, never as a silent empty result. " +
|
|
176
|
+
"Archive and trash columns are not part of the answer (excludesArchived).",
|
|
151
177
|
inputSchema: {
|
|
152
178
|
type: "object",
|
|
153
179
|
properties: {
|
|
154
|
-
boardId: {
|
|
180
|
+
boardId: {
|
|
181
|
+
type: "string",
|
|
182
|
+
description: "The board ID. Optional when the server has PLANKA_DEFAULT_BOARD_ID.",
|
|
183
|
+
},
|
|
155
184
|
cardsFrom: {
|
|
156
185
|
type: "array",
|
|
157
186
|
items: { type: "string" },
|
|
158
|
-
description: "Which column(s) to return cards from: list IDs, or name fragments matched case- and accent-insensitively (e.g. ['
|
|
187
|
+
description: "Which column(s) to return cards from: list IDs, or name fragments matched case- and accent-insensitively (e.g. ['blocked'] or ['review','testing']). [] means columns only. Default: PLANKA_SUMMARY_DECISION_LISTS, or no cards.",
|
|
159
188
|
},
|
|
160
189
|
highlightLabel: {
|
|
161
190
|
type: "string",
|
|
162
|
-
description: "Label that marks a card as unblocked/ready
|
|
191
|
+
description: "Label that marks a card as unblocked/ready: those cards come first and get highlighted:true. Default: PLANKA_SUMMARY_HIGHLIGHT_LABEL, or no highlighting.",
|
|
163
192
|
},
|
|
164
193
|
limit: {
|
|
165
194
|
type: "number",
|
|
@@ -168,84 +197,25 @@ export const boardSummaryTool = {
|
|
|
168
197
|
},
|
|
169
198
|
required: ["boardId"],
|
|
170
199
|
},
|
|
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
|
-
}),
|
|
200
|
+
handler: withPlankaErrors(async (params) => boardSummaryResult(params)),
|
|
192
201
|
};
|
|
193
202
|
/**
|
|
194
|
-
* Tool:
|
|
203
|
+
* Tool: planka_list_lists — alias of planka_board_summary with cardsFrom: [].
|
|
195
204
|
*/
|
|
196
|
-
export const
|
|
197
|
-
name: "
|
|
198
|
-
description: "
|
|
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.",
|
|
205
|
+
export const listListsTool = {
|
|
206
|
+
name: "planka_list_lists",
|
|
207
|
+
description: "DEPRECATED: use planka_board_summary with cardsFrom: []. Columns with card counts plus the board's labels, no cards.",
|
|
202
208
|
inputSchema: {
|
|
203
209
|
type: "object",
|
|
204
210
|
properties: {
|
|
205
|
-
boardId: {
|
|
206
|
-
labelName: {
|
|
211
|
+
boardId: {
|
|
207
212
|
type: "string",
|
|
208
|
-
description: "
|
|
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.",
|
|
213
|
+
description: "The board ID. Optional when the server has PLANKA_DEFAULT_BOARD_ID.",
|
|
229
214
|
},
|
|
230
215
|
},
|
|
231
216
|
required: ["boardId"],
|
|
232
217
|
},
|
|
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
|
-
}),
|
|
218
|
+
handler: withPlankaErrors(async (params) => boardSummaryResult({ boardId: params.boardId, cardsFrom: [] })),
|
|
249
219
|
};
|
|
250
220
|
export const queryTools = [
|
|
251
221
|
listCardsTool,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"queries.js","sourceRoot":"","sources":["../../src/tools/queries.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,
|
|
1
|
+
{"version":3,"file":"queries.js","sourceRoot":"","sources":["../../src/tools/queries.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/tasks.d.ts
CHANGED
|
@@ -27,11 +27,11 @@ export declare const createTasksTool: {
|
|
|
27
27
|
cardId: string;
|
|
28
28
|
tasks: string[];
|
|
29
29
|
}) => Promise<{
|
|
30
|
+
isError?: true | undefined;
|
|
30
31
|
content: {
|
|
31
32
|
type: "text";
|
|
32
33
|
text: string;
|
|
33
34
|
}[];
|
|
34
|
-
isError?: undefined;
|
|
35
35
|
} | {
|
|
36
36
|
content: {
|
|
37
37
|
type: "text";
|
|
@@ -54,6 +54,10 @@ export declare const updateTaskTool: {
|
|
|
54
54
|
type: string;
|
|
55
55
|
description: string;
|
|
56
56
|
};
|
|
57
|
+
cardId: {
|
|
58
|
+
type: string;
|
|
59
|
+
description: string;
|
|
60
|
+
};
|
|
57
61
|
name: {
|
|
58
62
|
type: string;
|
|
59
63
|
description: string;
|
|
@@ -67,14 +71,15 @@ export declare const updateTaskTool: {
|
|
|
67
71
|
};
|
|
68
72
|
handler: (params: {
|
|
69
73
|
taskId: string;
|
|
74
|
+
cardId?: string;
|
|
70
75
|
name?: string;
|
|
71
76
|
isCompleted?: boolean;
|
|
72
77
|
}) => Promise<{
|
|
78
|
+
isError?: true | undefined;
|
|
73
79
|
content: {
|
|
74
80
|
type: "text";
|
|
75
81
|
text: string;
|
|
76
82
|
}[];
|
|
77
|
-
isError?: undefined;
|
|
78
83
|
} | {
|
|
79
84
|
content: {
|
|
80
85
|
type: "text";
|
|
@@ -97,17 +102,22 @@ export declare const deleteTaskTool: {
|
|
|
97
102
|
type: string;
|
|
98
103
|
description: string;
|
|
99
104
|
};
|
|
105
|
+
cardId: {
|
|
106
|
+
type: string;
|
|
107
|
+
description: string;
|
|
108
|
+
};
|
|
100
109
|
};
|
|
101
110
|
required: string[];
|
|
102
111
|
};
|
|
103
112
|
handler: (params: {
|
|
104
113
|
taskId: string;
|
|
114
|
+
cardId?: string;
|
|
105
115
|
}) => Promise<{
|
|
116
|
+
isError?: true | undefined;
|
|
106
117
|
content: {
|
|
107
118
|
type: "text";
|
|
108
119
|
text: string;
|
|
109
120
|
}[];
|
|
110
|
-
isError?: undefined;
|
|
111
121
|
} | {
|
|
112
122
|
content: {
|
|
113
123
|
type: "text";
|
|
@@ -141,11 +151,11 @@ export declare const taskTools: ({
|
|
|
141
151
|
cardId: string;
|
|
142
152
|
tasks: string[];
|
|
143
153
|
}) => Promise<{
|
|
154
|
+
isError?: true | undefined;
|
|
144
155
|
content: {
|
|
145
156
|
type: "text";
|
|
146
157
|
text: string;
|
|
147
158
|
}[];
|
|
148
|
-
isError?: undefined;
|
|
149
159
|
} | {
|
|
150
160
|
content: {
|
|
151
161
|
type: "text";
|
|
@@ -163,6 +173,10 @@ export declare const taskTools: ({
|
|
|
163
173
|
type: string;
|
|
164
174
|
description: string;
|
|
165
175
|
};
|
|
176
|
+
cardId: {
|
|
177
|
+
type: string;
|
|
178
|
+
description: string;
|
|
179
|
+
};
|
|
166
180
|
name: {
|
|
167
181
|
type: string;
|
|
168
182
|
description: string;
|
|
@@ -176,14 +190,15 @@ export declare const taskTools: ({
|
|
|
176
190
|
};
|
|
177
191
|
handler: (params: {
|
|
178
192
|
taskId: string;
|
|
193
|
+
cardId?: string;
|
|
179
194
|
name?: string;
|
|
180
195
|
isCompleted?: boolean;
|
|
181
196
|
}) => Promise<{
|
|
197
|
+
isError?: true | undefined;
|
|
182
198
|
content: {
|
|
183
199
|
type: "text";
|
|
184
200
|
text: string;
|
|
185
201
|
}[];
|
|
186
|
-
isError?: undefined;
|
|
187
202
|
} | {
|
|
188
203
|
content: {
|
|
189
204
|
type: "text";
|
|
@@ -201,17 +216,22 @@ export declare const taskTools: ({
|
|
|
201
216
|
type: string;
|
|
202
217
|
description: string;
|
|
203
218
|
};
|
|
219
|
+
cardId: {
|
|
220
|
+
type: string;
|
|
221
|
+
description: string;
|
|
222
|
+
};
|
|
204
223
|
};
|
|
205
224
|
required: string[];
|
|
206
225
|
};
|
|
207
226
|
handler: (params: {
|
|
208
227
|
taskId: string;
|
|
228
|
+
cardId?: string;
|
|
209
229
|
}) => Promise<{
|
|
230
|
+
isError?: true | undefined;
|
|
210
231
|
content: {
|
|
211
232
|
type: "text";
|
|
212
233
|
text: string;
|
|
213
234
|
}[];
|
|
214
|
-
isError?: undefined;
|
|
215
235
|
} | {
|
|
216
236
|
content: {
|
|
217
237
|
type: "text";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tasks.d.ts","sourceRoot":"","sources":["../../src/tools/tasks.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"tasks.d.ts","sourceRoot":"","sources":["../../src/tools/tasks.ts"],"names":[],"mappings":"AAqBA;;;GAGG;AACH,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;sBAoBF;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,EAAE,CAAA;KAAE;;;;;;;;;;;;;CA0C5D,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;sBA0BD;QACtB,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,WAAW,CAAC,EAAE,OAAO,CAAC;KACvB;;;;;;;;;;;;;CA4EF,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;sBAkBD;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE;;;;;;;;;;;;;CAoC5D,CAAC;AAEF,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;sBAzNI;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,EAAE,CAAA;KAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;sBA0EnC;QACtB,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,WAAW,CAAC,EAAE,OAAO,CAAC;KACvB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;sBAoGuB;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE;;;;;;;;;;;;;IAsCa,CAAC"}
|