@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
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Planka's activity log ("actions").
|
|
3
|
+
*
|
|
4
|
+
* Planka 2.x records only six kinds of event
|
|
5
|
+
* (`Action.Types` — server/api/models/Action.js:70-77):
|
|
6
|
+
*
|
|
7
|
+
* createCard · moveCard · addMemberToCard · removeMemberFromCard
|
|
8
|
+
* completeTask · uncompleteTask
|
|
9
|
+
*
|
|
10
|
+
* There is NO action for a comment, a rename or a description edit. A card
|
|
11
|
+
* whose history looks empty was not necessarily untouched — it was only never
|
|
12
|
+
* moved, assigned or checked off. Every consumer of this module has to say so
|
|
13
|
+
* rather than let a reader infer "nothing happened".
|
|
14
|
+
*
|
|
15
|
+
* Both endpoints (`/api/cards/:id/actions`, `/api/boards/:id/actions`) return
|
|
16
|
+
* at most 50 items — a module constant in Planka, not a query parameter — and
|
|
17
|
+
* page backwards with `?beforeId=<id>` (exclusive, ids descend with time).
|
|
18
|
+
*
|
|
19
|
+
* The raw item is ~350 chars of nested JSON. What a model needs from it is one
|
|
20
|
+
* line: who, when, what. So nothing here returns the raw action.
|
|
21
|
+
*/
|
|
22
|
+
import { z } from "zod";
|
|
23
|
+
import { plankaClient } from "../client.js";
|
|
24
|
+
import { withBoardId } from "./board-id.js";
|
|
25
|
+
/** Page size Planka hardcodes for actions. */
|
|
26
|
+
export const ACTIONS_PAGE_SIZE = 50;
|
|
27
|
+
/** The six event types Planka can record. */
|
|
28
|
+
export const ACTION_TYPES = [
|
|
29
|
+
"createCard",
|
|
30
|
+
"moveCard",
|
|
31
|
+
"addMemberToCard",
|
|
32
|
+
"removeMemberFromCard",
|
|
33
|
+
"completeTask",
|
|
34
|
+
"uncompleteTask",
|
|
35
|
+
];
|
|
36
|
+
const NamedRef = z
|
|
37
|
+
.object({ id: z.string().optional(), name: z.string().nullable().optional() })
|
|
38
|
+
.passthrough();
|
|
39
|
+
/**
|
|
40
|
+
* `data` shape verified live against Planka 2.2.1 on 2026-09-03:
|
|
41
|
+
* createCard {card:{name}, list:{id,name,type}}
|
|
42
|
+
* moveCard {card:{name}, fromList:{id,name,type}, toList:{…}}
|
|
43
|
+
* add/removeMemberToCard{card:{name}, user:{id,name}}
|
|
44
|
+
* complete/uncompleteTask {card:{name}, task:{id,name}}
|
|
45
|
+
*/
|
|
46
|
+
export const ActionSchema = z
|
|
47
|
+
.object({
|
|
48
|
+
id: z.string(),
|
|
49
|
+
type: z.string(),
|
|
50
|
+
createdAt: z.string(),
|
|
51
|
+
boardId: z.string().optional(),
|
|
52
|
+
cardId: z.string().nullable().optional(),
|
|
53
|
+
userId: z.string().nullable().optional(),
|
|
54
|
+
data: z
|
|
55
|
+
.object({
|
|
56
|
+
card: NamedRef.optional(),
|
|
57
|
+
list: NamedRef.optional(),
|
|
58
|
+
fromList: NamedRef.optional(),
|
|
59
|
+
toList: NamedRef.optional(),
|
|
60
|
+
user: NamedRef.optional(),
|
|
61
|
+
task: NamedRef.optional(),
|
|
62
|
+
})
|
|
63
|
+
.passthrough()
|
|
64
|
+
.optional(),
|
|
65
|
+
})
|
|
66
|
+
.passthrough();
|
|
67
|
+
const ActionsResponse = z.object({
|
|
68
|
+
items: z.array(ActionSchema),
|
|
69
|
+
included: z
|
|
70
|
+
.object({
|
|
71
|
+
users: z
|
|
72
|
+
.array(z.object({ id: z.string(), name: z.string().optional() }).passthrough())
|
|
73
|
+
.optional(),
|
|
74
|
+
})
|
|
75
|
+
.passthrough()
|
|
76
|
+
.optional(),
|
|
77
|
+
});
|
|
78
|
+
function toPage(response) {
|
|
79
|
+
const parsed = ActionsResponse.parse(response);
|
|
80
|
+
const userNames = new Map();
|
|
81
|
+
for (const user of parsed.included?.users ?? []) {
|
|
82
|
+
if (user.name)
|
|
83
|
+
userNames.set(user.id, user.name);
|
|
84
|
+
}
|
|
85
|
+
return {
|
|
86
|
+
actions: parsed.items,
|
|
87
|
+
userNames,
|
|
88
|
+
full: parsed.items.length >= ACTIONS_PAGE_SIZE,
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
/** One page of a card's history, newest first. */
|
|
92
|
+
export async function getCardActions(input) {
|
|
93
|
+
const query = input.beforeId ? `?beforeId=${encodeURIComponent(input.beforeId)}` : "";
|
|
94
|
+
return toPage(await plankaClient.get(`/api/cards/${input.cardId}/actions${query}`));
|
|
95
|
+
}
|
|
96
|
+
/** One page of a board's history, newest first. */
|
|
97
|
+
export async function getBoardActions(input) {
|
|
98
|
+
return withBoardId(input.boardId, async (boardId) => {
|
|
99
|
+
const query = input.beforeId
|
|
100
|
+
? `?beforeId=${encodeURIComponent(input.beforeId)}`
|
|
101
|
+
: "";
|
|
102
|
+
const page = toPage(await plankaClient.get(`/api/boards/${boardId}/actions${query}`));
|
|
103
|
+
return { ...page, boardId };
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
function label(ref, fallback) {
|
|
107
|
+
const name = ref?.name;
|
|
108
|
+
return name ? `"${name}"` : fallback;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* The one-line sentence for an action.
|
|
112
|
+
*
|
|
113
|
+
* Everything it needs travels inside `data` — Planka embeds the list, user and
|
|
114
|
+
* task NAMES in the action itself, so no extra lookup is ever made here.
|
|
115
|
+
*/
|
|
116
|
+
export function summarizeAction(action) {
|
|
117
|
+
const data = action.data ?? {};
|
|
118
|
+
switch (action.type) {
|
|
119
|
+
case "createCard":
|
|
120
|
+
return `created the card in ${label(data.list, "a list")}`;
|
|
121
|
+
case "moveCard":
|
|
122
|
+
return `moved the card from ${label(data.fromList, "another list")} to ${label(data.toList, "another list")}`;
|
|
123
|
+
case "addMemberToCard":
|
|
124
|
+
return `added member ${label(data.user, "someone")}`;
|
|
125
|
+
case "removeMemberFromCard":
|
|
126
|
+
return `removed member ${label(data.user, "someone")}`;
|
|
127
|
+
case "completeTask":
|
|
128
|
+
return `completed task ${label(data.task, "a task")}`;
|
|
129
|
+
case "uncompleteTask":
|
|
130
|
+
return `reopened task ${label(data.task, "a task")}`;
|
|
131
|
+
default:
|
|
132
|
+
// A type Planka added after this was written: say what it is instead of
|
|
133
|
+
// dropping the event.
|
|
134
|
+
return `${action.type} (unrecognised event type)`;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
/** Turns raw actions into digests, resolving user names where possible. */
|
|
138
|
+
export function digestActions(actions, userNames, options = {}) {
|
|
139
|
+
return actions.map((action) => ({
|
|
140
|
+
id: action.id,
|
|
141
|
+
type: action.type,
|
|
142
|
+
at: action.createdAt,
|
|
143
|
+
user: (action.userId ? userNames.get(action.userId) : undefined) ??
|
|
144
|
+
action.userId ??
|
|
145
|
+
"unknown",
|
|
146
|
+
summary: summarizeAction(action),
|
|
147
|
+
...(options.withCardId && action.cardId ? { cardId: action.cardId } : {}),
|
|
148
|
+
}));
|
|
149
|
+
}
|
|
150
|
+
/** The card name Planka embeds in every action of that card. */
|
|
151
|
+
export function cardNameOf(action) {
|
|
152
|
+
return action.data?.card?.name ?? undefined;
|
|
153
|
+
}
|
|
154
|
+
//# sourceMappingURL=actions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"actions.js","sourceRoot":"","sources":["../../src/operations/actions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { PlankaError } from "../errors.js";
|
|
2
|
+
export interface BoardSystemLists {
|
|
3
|
+
archiveListId: string | null;
|
|
4
|
+
trashListId: string | null;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* The board's hidden lists.
|
|
8
|
+
*
|
|
9
|
+
* Reads the board show because it is the only response that carries them — an
|
|
10
|
+
* expensive call on a large board, made once per archive operation.
|
|
11
|
+
*/
|
|
12
|
+
export declare function getBoardSystemLists(boardId: string): Promise<BoardSystemLists>;
|
|
13
|
+
/**
|
|
14
|
+
* Moves a card into a list by id. The one primitive archiving needs.
|
|
15
|
+
*
|
|
16
|
+
* `position` is optional going IN to the archive (Planka nulls it) and
|
|
17
|
+
* MANDATORY coming out: an archived card has `position: null`, and a PATCH that
|
|
18
|
+
* only carries `listId` is rejected with "Position must be present". Verified
|
|
19
|
+
* live on 2.2.1 (2026-09-03) — the restore path was broken until it sent one.
|
|
20
|
+
*/
|
|
21
|
+
export declare function moveCardToList(input: {
|
|
22
|
+
cardId: string;
|
|
23
|
+
listId: string;
|
|
24
|
+
position?: number;
|
|
25
|
+
}): Promise<void>;
|
|
26
|
+
/** Thrown when the board has no archive list (should not happen in 2.x). */
|
|
27
|
+
export declare function noArchiveList(boardId: string): PlankaError;
|
|
28
|
+
//# sourceMappingURL=archive.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"archive.d.ts","sourceRoot":"","sources":["../../src/operations/archive.ts"],"names":[],"mappings":"AAsBA,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAqB3C,MAAM,WAAW,gBAAgB;IAC/B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED;;;;;GAKG;AACH,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,gBAAgB,CAAC,CAQ3B;AAED;;;;;;;GAOG;AACH,wBAAsB,cAAc,CAAC,KAAK,EAAE;IAC1C,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,GAAG,OAAO,CAAC,IAAI,CAAC,CAKhB;AAED,4EAA4E;AAC5E,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,CAO1D"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Archiving a card, which Planka has no verb for.
|
|
3
|
+
*
|
|
4
|
+
* In Planka 2.x every board owns four lists, two of them invisible: besides
|
|
5
|
+
* the `active`/`closed` columns there is one of type `archive` and one of type
|
|
6
|
+
* `trash`. They have no name and no position, `GET /api/lists/:id` answers 404
|
|
7
|
+
* for them, and the board show leaves their cards out of `included.cards`.
|
|
8
|
+
*
|
|
9
|
+
* Archiving is therefore just a move: `PATCH /api/cards/:id {listId: <archive>}`.
|
|
10
|
+
* Verified live on 2.2.1 (2026-09-03):
|
|
11
|
+
*
|
|
12
|
+
* - the card's `position` becomes null (which is why verification reads go
|
|
13
|
+
* through `getCardBrief`, not the strict card schema);
|
|
14
|
+
* - `isClosed` does NOT change — it stays false, so it is useless as proof;
|
|
15
|
+
* - `prevListId` keeps the column the card came from, which is what makes
|
|
16
|
+
* un-archiving to the right place possible.
|
|
17
|
+
*
|
|
18
|
+
* The only trustworthy proof is `listId === <archive list of that board>`.
|
|
19
|
+
*/
|
|
20
|
+
import { z } from "zod";
|
|
21
|
+
import { plankaClient } from "../client.js";
|
|
22
|
+
import { assertBoardAllowed } from "../config/policy.js";
|
|
23
|
+
import { PlankaError } from "../errors.js";
|
|
24
|
+
const BoardListsResponse = z.object({
|
|
25
|
+
included: z
|
|
26
|
+
.object({
|
|
27
|
+
lists: z
|
|
28
|
+
.array(z
|
|
29
|
+
.object({
|
|
30
|
+
id: z.string(),
|
|
31
|
+
type: z.string().optional(),
|
|
32
|
+
name: z.string().nullable().optional(),
|
|
33
|
+
})
|
|
34
|
+
.passthrough())
|
|
35
|
+
.optional(),
|
|
36
|
+
})
|
|
37
|
+
.passthrough()
|
|
38
|
+
.optional(),
|
|
39
|
+
});
|
|
40
|
+
/**
|
|
41
|
+
* The board's hidden lists.
|
|
42
|
+
*
|
|
43
|
+
* Reads the board show because it is the only response that carries them — an
|
|
44
|
+
* expensive call on a large board, made once per archive operation.
|
|
45
|
+
*/
|
|
46
|
+
export async function getBoardSystemLists(boardId) {
|
|
47
|
+
assertBoardAllowed(boardId);
|
|
48
|
+
const response = await plankaClient.get(`/api/boards/${boardId}`);
|
|
49
|
+
const lists = BoardListsResponse.parse(response).included?.lists ?? [];
|
|
50
|
+
return {
|
|
51
|
+
archiveListId: lists.find((l) => l.type === "archive")?.id ?? null,
|
|
52
|
+
trashListId: lists.find((l) => l.type === "trash")?.id ?? null,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Moves a card into a list by id. The one primitive archiving needs.
|
|
57
|
+
*
|
|
58
|
+
* `position` is optional going IN to the archive (Planka nulls it) and
|
|
59
|
+
* MANDATORY coming out: an archived card has `position: null`, and a PATCH that
|
|
60
|
+
* only carries `listId` is rejected with "Position must be present". Verified
|
|
61
|
+
* live on 2.2.1 (2026-09-03) — the restore path was broken until it sent one.
|
|
62
|
+
*/
|
|
63
|
+
export async function moveCardToList(input) {
|
|
64
|
+
await plankaClient.patch(`/api/cards/${input.cardId}`, {
|
|
65
|
+
listId: input.listId,
|
|
66
|
+
...(input.position === undefined ? {} : { position: input.position }),
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
/** Thrown when the board has no archive list (should not happen in 2.x). */
|
|
70
|
+
export function noArchiveList(boardId) {
|
|
71
|
+
return new PlankaError(`Board ${boardId} exposes no list of type "archive", so a card cannot be archived here. ` +
|
|
72
|
+
`Move the card to a "closed" column instead, or delete it with planka_delete_card.`, "NO_ARCHIVE_LIST", 404);
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=archive.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"archive.js","sourceRoot":"","sources":["../../src/operations/archive.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3C,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IAClC,QAAQ,EAAE,CAAC;SACR,MAAM,CAAC;QACN,KAAK,EAAE,CAAC;aACL,KAAK,CACJ,CAAC;aACE,MAAM,CAAC;YACN,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;YACd,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;YAC3B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;SACvC,CAAC;aACD,WAAW,EAAE,CACjB;aACA,QAAQ,EAAE;KACd,CAAC;SACD,WAAW,EAAE;SACb,QAAQ,EAAE;CACd,CAAC,CAAC;AAOH;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,OAAe;IAEf,kBAAkB,CAAC,OAAO,CAAC,CAAC;IAC5B,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,GAAG,CAAU,eAAe,OAAO,EAAE,CAAC,CAAC;IAC3E,MAAM,KAAK,GAAG,kBAAkB,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,QAAQ,EAAE,KAAK,IAAI,EAAE,CAAC;IACvE,OAAO;QACL,aAAa,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,EAAE,EAAE,IAAI,IAAI;QAClE,WAAW,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,EAAE,EAAE,IAAI,IAAI;KAC/D,CAAC;AACJ,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,KAIpC;IACC,MAAM,YAAY,CAAC,KAAK,CAAU,cAAc,KAAK,CAAC,MAAM,EAAE,EAAE;QAC9D,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,GAAG,CAAC,KAAK,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC;KACtE,CAAC,CAAC;AACL,CAAC;AAED,4EAA4E;AAC5E,MAAM,UAAU,aAAa,CAAC,OAAe;IAC3C,OAAO,IAAI,WAAW,CACpB,SAAS,OAAO,yEAAyE;QACvF,mFAAmF,EACrF,iBAAiB,EACjB,GAAG,CACJ,CAAC;AACJ,CAAC"}
|
|
@@ -14,7 +14,7 @@ export declare function uploadAttachment(input: UploadAttachmentInput): Promise<
|
|
|
14
14
|
/**
|
|
15
15
|
* Delete an attachment.
|
|
16
16
|
*/
|
|
17
|
-
export declare function deleteAttachment(input: AttachmentIdInput): Promise<
|
|
17
|
+
export declare function deleteAttachment(input: AttachmentIdInput): Promise<Attachment | null>;
|
|
18
18
|
/**
|
|
19
19
|
* An attachment's download URL. 2.0 exposes it as data.url; when it is
|
|
20
20
|
* missing, fall back to the /attachments/:id/download/:name pattern.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"attachments.d.ts","sourceRoot":"","sources":["../../src/operations/attachments.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAMpD,OAAO,EAEL,iBAAiB,EAEjB,WAAW,EAEX,qBAAqB,EACtB,MAAM,wBAAwB,CAAC;AAmBhC,wBAAgB,aAAa,CAAC,KAAK,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAKjE;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CACzC,KAAK,EAAE,WAAW,GACjB,OAAO,CAAC,UAAU,EAAE,CAAC,CAQvB;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,qBAAqB,GAC3B,OAAO,CAAC,UAAU,CAAC,CAqBrB;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,iBAAiB,GACvB,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"attachments.d.ts","sourceRoot":"","sources":["../../src/operations/attachments.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAMpD,OAAO,EAEL,iBAAiB,EAEjB,WAAW,EAEX,qBAAqB,EACtB,MAAM,wBAAwB,CAAC;AAmBhC,wBAAgB,aAAa,CAAC,KAAK,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAKjE;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CACzC,KAAK,EAAE,WAAW,GACjB,OAAO,CAAC,UAAU,EAAE,CAAC,CAQvB;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,qBAAqB,GAC3B,OAAO,CAAC,UAAU,CAAC,CAqBrB;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,iBAAiB,GACvB,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAK5B;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE;IAC3C,UAAU,EAAE,UAAU,CAAC;CACxB,GAAG,MAAM,CAOT;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,KAAK,EAAE;IAC9C,UAAU,EAAE,UAAU,CAAC;CACxB,GAAG,OAAO,CAAC;IAAE,KAAK,EAAE,UAAU,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,CAYnD"}
|
|
@@ -61,7 +61,9 @@ export async function uploadAttachment(input) {
|
|
|
61
61
|
*/
|
|
62
62
|
export async function deleteAttachment(input) {
|
|
63
63
|
const { attachmentId } = parseInput(AttachmentIdSchema, input);
|
|
64
|
-
await plankaClient.delete(`/api/attachments/${attachmentId}`);
|
|
64
|
+
const body = await plankaClient.delete(`/api/attachments/${attachmentId}`);
|
|
65
|
+
const parsed = AttachmentResponse.safeParse(body);
|
|
66
|
+
return parsed.success ? parsed.data.item : null;
|
|
65
67
|
}
|
|
66
68
|
/**
|
|
67
69
|
* An attachment's download URL. 2.0 exposes it as data.url; when it is
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"attachments.js","sourceRoot":"","sources":["../../src/operations/attachments.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"attachments.js","sourceRoot":"","sources":["../../src/operations/attachments.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,5 +5,5 @@
|
|
|
5
5
|
* `run` receives the id to use: it is invoked again with the resolved board
|
|
6
6
|
* when the id turned out to be a single-board project.
|
|
7
7
|
*/
|
|
8
|
-
export declare function withBoardId<T>(boardId: string, run: (id: string) => Promise<T>): Promise<T>;
|
|
8
|
+
export declare function withBoardId<T>(boardId: string | undefined, run: (id: string) => Promise<T>): Promise<T>;
|
|
9
9
|
//# sourceMappingURL=board-id.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"board-id.d.ts","sourceRoot":"","sources":["../../src/operations/board-id.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"board-id.d.ts","sourceRoot":"","sources":["../../src/operations/board-id.ts"],"names":[],"mappings":"AA+FA;;;;;;GAMG;AACH,wBAAsB,WAAW,CAAC,CAAC,EACjC,OAAO,EAAE,MAAM,GAAG,SAAS,EAC3B,GAAG,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,GAC9B,OAAO,CAAC,CAAC,CAAC,CAcZ"}
|
|
@@ -11,6 +11,7 @@
|
|
|
11
11
|
* - an error saying "that is a projectId, and these are its boards".
|
|
12
12
|
*/
|
|
13
13
|
import { PlankaError, PlankaNotFoundError } from "../errors.js";
|
|
14
|
+
import { assertBoardAllowed, resolveBoardId } from "../config/policy.js";
|
|
14
15
|
import { getProjects } from "./projects.js";
|
|
15
16
|
/** A 404 can arrive as PlankaNotFoundError or as PlankaError with status 404. */
|
|
16
17
|
function isNotFound(error) {
|
|
@@ -29,16 +30,18 @@ function describe(id, name) {
|
|
|
29
30
|
* with exactly one board). In every other case it throws an actionable error
|
|
30
31
|
* and never returns.
|
|
31
32
|
*/
|
|
32
|
-
async function diagnoseBoardId(boardId) {
|
|
33
|
+
async function diagnoseBoardId(boardId, original) {
|
|
33
34
|
let projects;
|
|
34
35
|
let boards;
|
|
35
36
|
try {
|
|
36
37
|
({ projects, boards } = await getProjects());
|
|
37
38
|
}
|
|
38
39
|
catch {
|
|
39
|
-
// If we cannot even list projects, the original 404 is the best
|
|
40
|
-
//
|
|
41
|
-
|
|
40
|
+
// If we cannot even list projects, the original 404 is the best information
|
|
41
|
+
// available — and it carries the hint that says which kind of id this path
|
|
42
|
+
// wanted and that Planka answers 404 where it means 403. Re-throw it
|
|
43
|
+
// instead of replacing it with a bare "Board not found".
|
|
44
|
+
throw original;
|
|
42
45
|
}
|
|
43
46
|
const asProject = projects.find((p) => p.id === boardId);
|
|
44
47
|
if (asProject) {
|
|
@@ -72,15 +75,18 @@ async function diagnoseBoardId(boardId) {
|
|
|
72
75
|
* when the id turned out to be a single-board project.
|
|
73
76
|
*/
|
|
74
77
|
export async function withBoardId(boardId, run) {
|
|
78
|
+
// Default + allowlist first: nothing leaves the process for a board this
|
|
79
|
+
// server is not allowed to touch.
|
|
80
|
+
const id = resolveBoardId(boardId);
|
|
75
81
|
try {
|
|
76
|
-
return await run(
|
|
82
|
+
return await run(id);
|
|
77
83
|
}
|
|
78
84
|
catch (error) {
|
|
79
85
|
if (!isNotFound(error))
|
|
80
86
|
throw error;
|
|
81
87
|
// diagnoseBoardId throws unless the resolution is unambiguous.
|
|
82
|
-
const resolved = await diagnoseBoardId(
|
|
83
|
-
return await run(resolved);
|
|
88
|
+
const resolved = await diagnoseBoardId(id, error);
|
|
89
|
+
return await run(assertBoardAllowed(resolved));
|
|
84
90
|
}
|
|
85
91
|
}
|
|
86
92
|
//# sourceMappingURL=board-id.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"board-id.js","sourceRoot":"","sources":["../../src/operations/board-id.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAChE,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,iFAAiF;AACjF,SAAS,UAAU,CAAC,KAAc;IAChC,IAAI,KAAK,YAAY,mBAAmB;QAAE,OAAO,IAAI,CAAC;IACtD,OAAO,KAAK,YAAY,WAAW,IAAI,KAAK,CAAC,MAAM,KAAK,GAAG,CAAC;AAC9D,CAAC;AAED,kEAAkE;AAClE,SAAS,QAAQ,CAAC,EAAU,EAAE,IAA+B;IAC3D,OAAO,IAAI,CAAC,CAAC,CAAC,GAAG,EAAE,OAAO,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;AACzC,CAAC;AAED;;;;;;GAMG;AACH,KAAK,UAAU,eAAe,
|
|
1
|
+
{"version":3,"file":"board-id.js","sourceRoot":"","sources":["../../src/operations/board-id.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { Board, List, Card, Label, CardLabel, TaskList, Task } from "../schemas/entities.js";
|
|
2
|
-
import { BoardIdInput, BoardSummaryInput, FindCardsInput, GetCardsForListInput, ListCardsInput } from "../schemas/requests.js";
|
|
1
|
+
import { Board, List, Card, Label, CardLabel, TaskList, Task, CardMembership, User } from "../schemas/entities.js";
|
|
2
|
+
import { BoardIdInput, BoardSummaryInput, FindCardsInput, GetCardsForListInput, ListCardsInput, CardDetail } from "../schemas/requests.js";
|
|
3
3
|
/**
|
|
4
4
|
* Full board details with all included entities.
|
|
5
5
|
*/
|
|
@@ -9,8 +9,10 @@ export interface BoardDetails {
|
|
|
9
9
|
cards: Card[];
|
|
10
10
|
labels: Label[];
|
|
11
11
|
cardLabels: CardLabel[];
|
|
12
|
+
cardMemberships: CardMembership[];
|
|
12
13
|
taskLists: TaskList[];
|
|
13
14
|
tasks: Task[];
|
|
15
|
+
users: User[];
|
|
14
16
|
}
|
|
15
17
|
/**
|
|
16
18
|
* Card with computed task counts.
|
|
@@ -21,6 +23,13 @@ export interface CardWithTaskCounts extends Card {
|
|
|
21
23
|
}
|
|
22
24
|
/**
|
|
23
25
|
* Get a board by ID with all included entities.
|
|
26
|
+
*
|
|
27
|
+
* ⚠️ `GET /api/boards/:id` returns the cards of the FINITE lists only
|
|
28
|
+
* (`active` + `closed`). The `archive` and `trash` lists come back nameless,
|
|
29
|
+
* positionless and WITHOUT their cards. Everything derived from this call —
|
|
30
|
+
* counts, searches, summaries — is therefore a view of the visible board, not
|
|
31
|
+
* of everything Planka stores. Reads built on it flag it as
|
|
32
|
+
* `excludesArchived: true`. See docs/planka-2x-gotchas.md.
|
|
24
33
|
*/
|
|
25
34
|
export declare function getBoard(input: BoardIdInput): Promise<BoardDetails>;
|
|
26
35
|
/**
|
|
@@ -47,6 +56,18 @@ export interface ListCardsRawResult {
|
|
|
47
56
|
/** true when pagination stopped before the list was exhausted. */
|
|
48
57
|
truncated: boolean;
|
|
49
58
|
}
|
|
59
|
+
/**
|
|
60
|
+
* Page size of GET /api/lists/:id/cards in Planka 2.x — 50 at the time of
|
|
61
|
+
* writing. It is not configurable: `limit` is ignored and `before` is a
|
|
62
|
+
* composite cursor (`before[id]` + `before[listChangedAt]`).
|
|
63
|
+
*
|
|
64
|
+
* It is NOT assumed: the first response defines it (see below). Hardcoding 50
|
|
65
|
+
* against an instance that answers 20 stops the loop on page one and reports
|
|
66
|
+
* `truncated: false` over a third of the column — the exact class of lie this
|
|
67
|
+
* module exists to avoid. The constant is kept only as the documented
|
|
68
|
+
* expectation.
|
|
69
|
+
*/
|
|
70
|
+
export declare const LIST_CARDS_EXPECTED_PAGE_SIZE = 50;
|
|
50
71
|
export declare function getCardsForList(input: GetCardsForListInput): Promise<ListCardsRawResult>;
|
|
51
72
|
/** A list with its card count, without the cards. */
|
|
52
73
|
export interface ListWithCardCount {
|
|
@@ -57,6 +78,14 @@ export interface ListWithCardCount {
|
|
|
57
78
|
}
|
|
58
79
|
/** Ignores case and accents: "Necesita tu decisión" matches "decision". */
|
|
59
80
|
export declare function normalizeText(text: string): string;
|
|
81
|
+
/**
|
|
82
|
+
* Text matching, same semantics as Planka's own `?search=`:
|
|
83
|
+
* - a leading "/" makes the rest a case-insensitive regular expression;
|
|
84
|
+
* - otherwise every whitespace-separated token must appear (AND), ignoring
|
|
85
|
+
* case and accents.
|
|
86
|
+
* An invalid regex is reported to the caller instead of matching nothing.
|
|
87
|
+
*/
|
|
88
|
+
export declare function makeMatcher(query: string): (haystack: string) => boolean;
|
|
60
89
|
/**
|
|
61
90
|
* A board seen without its cards: just the visible lists and how many cards
|
|
62
91
|
* each one holds. One GET, a handful of lines of output.
|
|
@@ -70,11 +99,31 @@ export declare function getBoardListCounts(input: BoardIdInput): Promise<{
|
|
|
70
99
|
export interface CardDigest {
|
|
71
100
|
id: string;
|
|
72
101
|
name: string;
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
102
|
+
/**
|
|
103
|
+
* The column the card is in — same field name as planka_get_card. Present
|
|
104
|
+
* whenever the result spans more than one column; on the single-column path
|
|
105
|
+
* the response root carries `list: {id, name}` instead.
|
|
106
|
+
*/
|
|
107
|
+
listId?: string;
|
|
108
|
+
/** Only when the result spans more than one column. */
|
|
109
|
+
listName?: string;
|
|
110
|
+
labels?: string[];
|
|
111
|
+
/** Always present when the card has labels: what set_card_labels needs. */
|
|
112
|
+
labelIds?: string[];
|
|
113
|
+
members?: string[];
|
|
114
|
+
/** "completed/total", only when the card has checklist items. */
|
|
115
|
+
tasks?: string;
|
|
116
|
+
dueDate?: string;
|
|
117
|
+
commentsTotal?: number;
|
|
118
|
+
updatedAt?: string;
|
|
119
|
+
description?: string;
|
|
120
|
+
/** detail: "full" only. */
|
|
121
|
+
boardId?: string;
|
|
122
|
+
position?: number;
|
|
123
|
+
type?: string;
|
|
124
|
+
createdAt?: string;
|
|
125
|
+
isClosed?: boolean;
|
|
126
|
+
isDueCompleted?: boolean;
|
|
78
127
|
isCompleted?: boolean;
|
|
79
128
|
}
|
|
80
129
|
export interface BoardSummary {
|
|
@@ -84,41 +133,66 @@ export interface BoardSummary {
|
|
|
84
133
|
id: string;
|
|
85
134
|
name: string;
|
|
86
135
|
}[];
|
|
87
|
-
|
|
136
|
+
totalCards: number;
|
|
137
|
+
highlightLabel?: string;
|
|
88
138
|
cardsFrom: string[];
|
|
89
139
|
cards: (CardDigest & {
|
|
90
|
-
highlighted
|
|
140
|
+
highlighted?: boolean;
|
|
91
141
|
})[];
|
|
92
142
|
highlightedCount: number;
|
|
93
143
|
returned: number;
|
|
94
144
|
total: number;
|
|
95
145
|
hasMore: boolean;
|
|
146
|
+
warnings: string[];
|
|
96
147
|
}
|
|
97
148
|
/**
|
|
98
149
|
* Everything needed to open a working session, in one call: columns with
|
|
99
|
-
* counts, the board's labels, and the cards
|
|
100
|
-
*
|
|
150
|
+
* counts, the board's labels, and — when asked — the cards of the columns
|
|
151
|
+
* named in `cardsFrom`, flagged by whether they carry `highlightLabel`.
|
|
152
|
+
*
|
|
153
|
+
* With `cardsFrom: []` (or with neither argument nor
|
|
154
|
+
* PLANKA_SUMMARY_DECISION_LISTS) it answers the shape of the board and no
|
|
155
|
+
* cards at all: that is what `planka_list_lists` now is.
|
|
101
156
|
*/
|
|
102
157
|
export declare function getBoardSummary(input: BoardSummaryInput): Promise<BoardSummary>;
|
|
103
158
|
export interface FindCardsResult {
|
|
104
159
|
boardId: string;
|
|
160
|
+
/** Present when the search was scoped to a single column. */
|
|
161
|
+
list?: {
|
|
162
|
+
id: string;
|
|
163
|
+
name: string | null;
|
|
164
|
+
};
|
|
105
165
|
filters: {
|
|
166
|
+
listId?: string;
|
|
167
|
+
listName?: string;
|
|
106
168
|
labelName?: string;
|
|
169
|
+
labelIds?: string[];
|
|
170
|
+
userIds?: string[];
|
|
107
171
|
query?: string;
|
|
108
|
-
listId?: string;
|
|
109
172
|
};
|
|
173
|
+
detail: CardDetail;
|
|
174
|
+
/** "list" = one GET on the column; "board" = the board index. */
|
|
175
|
+
source: "list" | "board";
|
|
176
|
+
/** False when label names were not fetched: `labels` is absent everywhere. */
|
|
177
|
+
labelsResolved: boolean;
|
|
178
|
+
/** Only on the list path: the column came back whole, no cursor involved. */
|
|
179
|
+
truncated?: false;
|
|
180
|
+
/** Only on the board path: archive/trash lists are not in the board show. */
|
|
181
|
+
excludesArchived?: true;
|
|
110
182
|
total: number;
|
|
111
183
|
returned: number;
|
|
112
184
|
offset: number;
|
|
113
185
|
hasMore: boolean;
|
|
114
186
|
nextOffset?: number;
|
|
115
187
|
matches: CardDigest[];
|
|
116
|
-
|
|
117
|
-
warning?: string;
|
|
188
|
+
warnings: string[];
|
|
118
189
|
}
|
|
119
190
|
/**
|
|
120
|
-
*
|
|
121
|
-
*
|
|
191
|
+
* The one search over a board's cards.
|
|
192
|
+
*
|
|
193
|
+
* With `listId` it reads that column alone (`GET /api/lists/:id`): one call,
|
|
194
|
+
* unpaginated, so `total` is the real size of the column and nothing can be
|
|
195
|
+
* silently clipped. Without it, it filters over a single board read.
|
|
122
196
|
*/
|
|
123
197
|
export declare function findCards(input: FindCardsInput): Promise<FindCardsResult>;
|
|
124
198
|
export interface ListCardsResult {
|
|
@@ -135,9 +209,12 @@ export interface ListCardsResult {
|
|
|
135
209
|
cards: CardWithLabels[];
|
|
136
210
|
}
|
|
137
211
|
/**
|
|
138
|
-
* Cards of ONE list, paginated outward
|
|
139
|
-
*
|
|
140
|
-
*
|
|
212
|
+
* Cards of ONE list, paginated outward, through the cursor of
|
|
213
|
+
* `GET /api/lists/:id/cards`.
|
|
214
|
+
*
|
|
215
|
+
* Kept for callers that want the raw card records; `planka_list_cards` no
|
|
216
|
+
* longer goes through here — it is an alias of findCards({ listId }), which
|
|
217
|
+
* gets the same cards in ONE request via the list show.
|
|
141
218
|
*/
|
|
142
219
|
export declare function listCards(input: ListCardsInput): Promise<ListCardsResult>;
|
|
143
220
|
//# sourceMappingURL=boards.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"boards.d.ts","sourceRoot":"","sources":["../../src/operations/boards.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"boards.d.ts","sourceRoot":"","sources":["../../src/operations/boards.ts"],"names":[],"mappings":"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"}
|