@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,143 @@
|
|
|
1
|
+
import { Board, List, Card, Label, CardLabel, TaskList, Task } from "../schemas/entities.js";
|
|
2
|
+
import { BoardIdInput, BoardSummaryInput, FindCardsInput, GetCardsForListInput, ListCardsInput } from "../schemas/requests.js";
|
|
3
|
+
/**
|
|
4
|
+
* Full board details with all included entities.
|
|
5
|
+
*/
|
|
6
|
+
export interface BoardDetails {
|
|
7
|
+
board: Board;
|
|
8
|
+
lists: List[];
|
|
9
|
+
cards: Card[];
|
|
10
|
+
labels: Label[];
|
|
11
|
+
cardLabels: CardLabel[];
|
|
12
|
+
taskLists: TaskList[];
|
|
13
|
+
tasks: Task[];
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Card with computed task counts.
|
|
17
|
+
*/
|
|
18
|
+
export interface CardWithTaskCounts extends Card {
|
|
19
|
+
taskCount: number;
|
|
20
|
+
completedTaskCount: number;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Get a board by ID with all included entities.
|
|
24
|
+
*/
|
|
25
|
+
export declare function getBoard(input: BoardIdInput): Promise<BoardDetails>;
|
|
26
|
+
/**
|
|
27
|
+
* Get a board with cards enriched with task counts.
|
|
28
|
+
*/
|
|
29
|
+
export declare function getBoardWithTaskCounts(input: BoardIdInput): Promise<{
|
|
30
|
+
board: Board;
|
|
31
|
+
lists: List[];
|
|
32
|
+
cards: CardWithTaskCounts[];
|
|
33
|
+
labels: Label[];
|
|
34
|
+
cardLabels: CardLabel[];
|
|
35
|
+
}>;
|
|
36
|
+
/**
|
|
37
|
+
* Cards of one list with labels resolved and task counts — WITHOUT pulling the
|
|
38
|
+
* whole board. Uses the native GET /api/lists/:id/cards endpoint (PLANKA 2.0),
|
|
39
|
+
* which includes cardLabels/taskLists/tasks but NOT the board's labels: names
|
|
40
|
+
* come from a single extra GET on the board, and only when withLabels is set.
|
|
41
|
+
*/
|
|
42
|
+
export type CardWithLabels = CardWithTaskCounts & {
|
|
43
|
+
labelNames: string[];
|
|
44
|
+
};
|
|
45
|
+
export interface ListCardsRawResult {
|
|
46
|
+
cards: CardWithLabels[];
|
|
47
|
+
/** true when pagination stopped before the list was exhausted. */
|
|
48
|
+
truncated: boolean;
|
|
49
|
+
}
|
|
50
|
+
export declare function getCardsForList(input: GetCardsForListInput): Promise<ListCardsRawResult>;
|
|
51
|
+
/** A list with its card count, without the cards. */
|
|
52
|
+
export interface ListWithCardCount {
|
|
53
|
+
id: string;
|
|
54
|
+
name: string;
|
|
55
|
+
type?: string;
|
|
56
|
+
cardCount: number;
|
|
57
|
+
}
|
|
58
|
+
/** Ignores case and accents: "Necesita tu decisión" matches "decision". */
|
|
59
|
+
export declare function normalizeText(text: string): string;
|
|
60
|
+
/**
|
|
61
|
+
* A board seen without its cards: just the visible lists and how many cards
|
|
62
|
+
* each one holds. One GET, a handful of lines of output.
|
|
63
|
+
*/
|
|
64
|
+
export declare function getBoardListCounts(input: BoardIdInput): Promise<{
|
|
65
|
+
board: Board;
|
|
66
|
+
lists: ListWithCardCount[];
|
|
67
|
+
totalCards: number;
|
|
68
|
+
}>;
|
|
69
|
+
/** A card at its smallest: enough to decide whether to open it. */
|
|
70
|
+
export interface CardDigest {
|
|
71
|
+
id: string;
|
|
72
|
+
name: string;
|
|
73
|
+
listId: string;
|
|
74
|
+
list: string;
|
|
75
|
+
labels: string[];
|
|
76
|
+
description?: string | null;
|
|
77
|
+
dueDate?: string | null;
|
|
78
|
+
isCompleted?: boolean;
|
|
79
|
+
}
|
|
80
|
+
export interface BoardSummary {
|
|
81
|
+
board: Board;
|
|
82
|
+
lists: ListWithCardCount[];
|
|
83
|
+
labels: {
|
|
84
|
+
id: string;
|
|
85
|
+
name: string;
|
|
86
|
+
}[];
|
|
87
|
+
highlightLabel: string;
|
|
88
|
+
cardsFrom: string[];
|
|
89
|
+
cards: (CardDigest & {
|
|
90
|
+
highlighted: boolean;
|
|
91
|
+
})[];
|
|
92
|
+
highlightedCount: number;
|
|
93
|
+
returned: number;
|
|
94
|
+
total: number;
|
|
95
|
+
hasMore: boolean;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Everything needed to open a working session, in one call: columns with
|
|
99
|
+
* counts, the board's labels, and the cards sitting in the column(s) waiting
|
|
100
|
+
* on a decision, flagged by whether they already got one.
|
|
101
|
+
*/
|
|
102
|
+
export declare function getBoardSummary(input: BoardSummaryInput): Promise<BoardSummary>;
|
|
103
|
+
export interface FindCardsResult {
|
|
104
|
+
boardId: string;
|
|
105
|
+
filters: {
|
|
106
|
+
labelName?: string;
|
|
107
|
+
query?: string;
|
|
108
|
+
listId?: string;
|
|
109
|
+
};
|
|
110
|
+
total: number;
|
|
111
|
+
returned: number;
|
|
112
|
+
offset: number;
|
|
113
|
+
hasMore: boolean;
|
|
114
|
+
nextOffset?: number;
|
|
115
|
+
matches: CardDigest[];
|
|
116
|
+
/** Filled in only when the requested filter does not exist on the board. */
|
|
117
|
+
warning?: string;
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Searches a board's cards by label and/or text. Text matches both name and
|
|
121
|
+
* description, case- and accent-insensitive.
|
|
122
|
+
*/
|
|
123
|
+
export declare function findCards(input: FindCardsInput): Promise<FindCardsResult>;
|
|
124
|
+
export interface ListCardsResult {
|
|
125
|
+
listId: string;
|
|
126
|
+
listName?: string;
|
|
127
|
+
total: number;
|
|
128
|
+
totalInList: number;
|
|
129
|
+
returned: number;
|
|
130
|
+
offset: number;
|
|
131
|
+
hasMore: boolean;
|
|
132
|
+
nextOffset?: number;
|
|
133
|
+
truncated: boolean;
|
|
134
|
+
labelFilter?: string;
|
|
135
|
+
cards: CardWithLabels[];
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Cards of ONE list, paginated outward. `limit`/`offset` are output-side:
|
|
139
|
+
* Planka's API accepts neither, so the whole list is resolved through its
|
|
140
|
+
* cursor and clipped here — the only way to report an honest `total`.
|
|
141
|
+
*/
|
|
142
|
+
export declare function listCards(input: ListCardsInput): Promise<ListCardsResult>;
|
|
143
|
+
//# sourceMappingURL=boards.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"boards.d.ts","sourceRoot":"","sources":["../../src/operations/boards.ts"],"names":[],"mappings":"AAMA,OAAO,EACL,KAAK,EACL,IAAI,EACJ,IAAI,EACJ,KAAK,EACL,SAAS,EACT,QAAQ,EACR,IAAI,EACL,MAAM,wBAAwB,CAAC;AAMhC,OAAO,EAEL,YAAY,EAEZ,iBAAiB,EAEjB,cAAc,EAEd,oBAAoB,EAEpB,cAAc,EACf,MAAM,wBAAwB,CAAC;AAEhC;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,KAAK,CAAC;IACb,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,UAAU,EAAE,SAAS,EAAE,CAAC;IACxB,SAAS,EAAE,QAAQ,EAAE,CAAC;IACtB,KAAK,EAAE,IAAI,EAAE,CAAC;CACf;AAED;;GAEG;AACH,MAAM,WAAW,kBAAmB,SAAQ,IAAI;IAC9C,SAAS,EAAE,MAAM,CAAC;IAClB,kBAAkB,EAAE,MAAM,CAAC;CAC5B;AAED;;GAEG;AACH,wBAAsB,QAAQ,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC,CAwBzE;AAED;;GAEG;AACH,wBAAsB,sBAAsB,CAC1C,KAAK,EAAE,YAAY,GAClB,OAAO,CAAC;IACT,KAAK,EAAE,KAAK,CAAC;IACb,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,KAAK,EAAE,kBAAkB,EAAE,CAAC;IAC5B,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,UAAU,EAAE,SAAS,EAAE,CAAC;CACzB,CAAC,CAiDD;AAED;;;;;GAKG;AACH,MAAM,MAAM,cAAc,GAAG,kBAAkB,GAAG;IAAE,UAAU,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AAE3E,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,kEAAkE;IAClE,SAAS,EAAE,OAAO,CAAC;CACpB;AAeD,wBAAsB,eAAe,CACnC,KAAK,EAAE,oBAAoB,GAC1B,OAAO,CAAC,kBAAkB,CAAC,CA8E7B;AAgBD,qDAAqD;AACrD,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,2EAA2E;AAC3E,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAKlD;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC;IACrE,KAAK,EAAE,KAAK,CAAC;IACb,KAAK,EAAE,iBAAiB,EAAE,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC,CAwBD;AAED,mEAAmE;AACnE,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAsFD,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,KAAK,CAAC;IACb,KAAK,EAAE,iBAAiB,EAAE,CAAC;IAC3B,MAAM,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACvC,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,KAAK,EAAE,CAAC,UAAU,GAAG;QAAE,WAAW,EAAE,OAAO,CAAA;KAAE,CAAC,EAAE,CAAC;IACjD,gBAAgB,EAAE,MAAM,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;CAClB;AAED;;;;GAIG;AACH,wBAAsB,eAAe,CACnC,KAAK,EAAE,iBAAiB,GACvB,OAAO,CAAC,YAAY,CAAC,CAqDvB;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACjE,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,4EAA4E;IAC5E,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;GAGG;AACH,wBAAsB,SAAS,CAC7B,KAAK,EAAE,cAAc,GACpB,OAAO,CAAC,eAAe,CAAC,CAyE1B;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,cAAc,EAAE,CAAC;CACzB;AAED;;;;GAIG;AACH,wBAAsB,SAAS,CAC7B,KAAK,EAAE,cAAc,GACpB,OAAO,CAAC,eAAe,CAAC,CA+B1B"}
|
|
@@ -0,0 +1,391 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Board operations for PLANKA API.
|
|
3
|
+
*/
|
|
4
|
+
import { plankaClient } from "../client.js";
|
|
5
|
+
import { parseInput } from "../errors.js";
|
|
6
|
+
import { withBoardId } from "./board-id.js";
|
|
7
|
+
import { BoardResponse, BoardIncludedSchema, CardsResponse, } from "../schemas/responses.js";
|
|
8
|
+
import { BoardIdSchema, BoardSummarySchema, FindCardsSchema, GetCardsForListSchema, ListCardsSchema, } from "../schemas/requests.js";
|
|
9
|
+
/**
|
|
10
|
+
* Get a board by ID with all included entities.
|
|
11
|
+
*/
|
|
12
|
+
export async function getBoard(input) {
|
|
13
|
+
const { boardId } = parseInput(BoardIdSchema, input);
|
|
14
|
+
return withBoardId(boardId, async (id) => {
|
|
15
|
+
const response = await plankaClient.get(`/api/boards/${id}`);
|
|
16
|
+
const parsed = BoardResponse.parse(response);
|
|
17
|
+
const included = BoardIncludedSchema.parse(response.included || {});
|
|
18
|
+
return {
|
|
19
|
+
board: parsed.item,
|
|
20
|
+
lists: (included.lists || []).sort((a, b) => (a.position ?? Infinity) - (b.position ?? Infinity)),
|
|
21
|
+
cards: included.cards || [],
|
|
22
|
+
labels: (included.labels || []).sort((a, b) => a.position - b.position),
|
|
23
|
+
cardLabels: included.cardLabels || [],
|
|
24
|
+
taskLists: (included.taskLists || []).sort((a, b) => a.position - b.position),
|
|
25
|
+
tasks: included.tasks || [],
|
|
26
|
+
};
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Get a board with cards enriched with task counts.
|
|
31
|
+
*/
|
|
32
|
+
export async function getBoardWithTaskCounts(input) {
|
|
33
|
+
const { boardId } = parseInput(BoardIdSchema, input);
|
|
34
|
+
const details = await getBoard({ boardId });
|
|
35
|
+
// Build taskList -> cardId mapping (PLANKA 2.0: tasks belong to taskLists, not cards directly)
|
|
36
|
+
const taskListToCard = new Map();
|
|
37
|
+
for (const taskList of details.taskLists) {
|
|
38
|
+
taskListToCard.set(taskList.id, taskList.cardId);
|
|
39
|
+
}
|
|
40
|
+
// Build task count map by card
|
|
41
|
+
const taskCountsByCard = new Map();
|
|
42
|
+
for (const task of details.tasks) {
|
|
43
|
+
// Get cardId via the taskList
|
|
44
|
+
const cardId = taskListToCard.get(task.taskListId);
|
|
45
|
+
if (!cardId)
|
|
46
|
+
continue;
|
|
47
|
+
const counts = taskCountsByCard.get(cardId) || {
|
|
48
|
+
total: 0,
|
|
49
|
+
completed: 0,
|
|
50
|
+
};
|
|
51
|
+
counts.total++;
|
|
52
|
+
if (task.isCompleted) {
|
|
53
|
+
counts.completed++;
|
|
54
|
+
}
|
|
55
|
+
taskCountsByCard.set(cardId, counts);
|
|
56
|
+
}
|
|
57
|
+
// Enrich cards with task counts
|
|
58
|
+
const cardsWithCounts = details.cards.map((card) => {
|
|
59
|
+
const counts = taskCountsByCard.get(card.id) || { total: 0, completed: 0 };
|
|
60
|
+
return {
|
|
61
|
+
...card,
|
|
62
|
+
taskCount: counts.total,
|
|
63
|
+
completedTaskCount: counts.completed,
|
|
64
|
+
};
|
|
65
|
+
});
|
|
66
|
+
return {
|
|
67
|
+
board: details.board,
|
|
68
|
+
lists: details.lists,
|
|
69
|
+
cards: cardsWithCounts,
|
|
70
|
+
labels: details.labels,
|
|
71
|
+
cardLabels: details.cardLabels,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Page size of GET /api/lists/:id/cards in Planka 2.x. It is not
|
|
76
|
+
* configurable: `limit` is ignored and `before` is a composite cursor
|
|
77
|
+
* (`before[id]` + `before[listChangedAt]`). Verified against the live API.
|
|
78
|
+
*
|
|
79
|
+
* Without following that cursor, a column of 77 cards answers 50 and says
|
|
80
|
+
* nothing about the other 27.
|
|
81
|
+
*/
|
|
82
|
+
const LIST_CARDS_PAGE_SIZE = 50;
|
|
83
|
+
/** Safety ceiling: 20 pages = 1000 cards. */
|
|
84
|
+
const LIST_CARDS_MAX_PAGES = 20;
|
|
85
|
+
export async function getCardsForList(input) {
|
|
86
|
+
const { listId, withLabels } = parseInput(GetCardsForListSchema, input);
|
|
87
|
+
const rawCards = [];
|
|
88
|
+
const cardLabels = [];
|
|
89
|
+
const taskLists = [];
|
|
90
|
+
const tasks = [];
|
|
91
|
+
let cursor = null;
|
|
92
|
+
let truncated = false;
|
|
93
|
+
for (let page = 0; page < LIST_CARDS_MAX_PAGES; page++) {
|
|
94
|
+
let path = `/api/lists/${listId}/cards`;
|
|
95
|
+
if (cursor) {
|
|
96
|
+
const query = new URLSearchParams({
|
|
97
|
+
"before[id]": cursor.id,
|
|
98
|
+
"before[listChangedAt]": cursor.listChangedAt,
|
|
99
|
+
});
|
|
100
|
+
path += `?${query.toString()}`;
|
|
101
|
+
}
|
|
102
|
+
const response = await plankaClient.get(path);
|
|
103
|
+
const parsed = CardsResponse.parse(response);
|
|
104
|
+
const included = BoardIncludedSchema.parse(response.included || {});
|
|
105
|
+
rawCards.push(...parsed.items);
|
|
106
|
+
cardLabels.push(...(included.cardLabels || []));
|
|
107
|
+
taskLists.push(...(included.taskLists || []));
|
|
108
|
+
tasks.push(...(included.tasks || []));
|
|
109
|
+
if (parsed.items.length < LIST_CARDS_PAGE_SIZE)
|
|
110
|
+
break;
|
|
111
|
+
const last = parsed.items[parsed.items.length - 1];
|
|
112
|
+
if (!last.listChangedAt) {
|
|
113
|
+
// No listChangedAt means no cursor is possible: warn instead of lying.
|
|
114
|
+
truncated = true;
|
|
115
|
+
break;
|
|
116
|
+
}
|
|
117
|
+
cursor = { id: last.id, listChangedAt: last.listChangedAt };
|
|
118
|
+
if (page === LIST_CARDS_MAX_PAGES - 1)
|
|
119
|
+
truncated = true;
|
|
120
|
+
}
|
|
121
|
+
const cards = rawCards.sort((a, b) => a.position - b.position);
|
|
122
|
+
// labelId -> name (labels live on the board; one extra GET)
|
|
123
|
+
let labelNameById = new Map();
|
|
124
|
+
if (withLabels && cards.length > 0 && cardLabels.length > 0) {
|
|
125
|
+
const board = await getBoard({ boardId: cards[0].boardId });
|
|
126
|
+
labelNameById = new Map(board.labels.map((l) => [l.id, l.name ?? l.color]));
|
|
127
|
+
}
|
|
128
|
+
const taskListToCard = new Map(taskLists.map((tl) => [tl.id, tl.cardId]));
|
|
129
|
+
const counts = new Map();
|
|
130
|
+
for (const task of tasks) {
|
|
131
|
+
const cardId = taskListToCard.get(task.taskListId);
|
|
132
|
+
if (!cardId)
|
|
133
|
+
continue;
|
|
134
|
+
const c = counts.get(cardId) || { total: 0, completed: 0 };
|
|
135
|
+
c.total++;
|
|
136
|
+
if (task.isCompleted)
|
|
137
|
+
c.completed++;
|
|
138
|
+
counts.set(cardId, c);
|
|
139
|
+
}
|
|
140
|
+
return {
|
|
141
|
+
truncated,
|
|
142
|
+
cards: cards.map((card) => {
|
|
143
|
+
const c = counts.get(card.id) || { total: 0, completed: 0 };
|
|
144
|
+
return {
|
|
145
|
+
...card,
|
|
146
|
+
taskCount: c.total,
|
|
147
|
+
completedTaskCount: c.completed,
|
|
148
|
+
labelNames: cardLabels
|
|
149
|
+
.filter((cl) => cl.cardId === card.id)
|
|
150
|
+
.map((cl) => labelNameById.get(cl.labelId))
|
|
151
|
+
.filter((n) => n !== undefined),
|
|
152
|
+
};
|
|
153
|
+
}),
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
/** Ignores case and accents: "Necesita tu decisión" matches "decision". */
|
|
157
|
+
export function normalizeText(text) {
|
|
158
|
+
return text
|
|
159
|
+
.normalize("NFD")
|
|
160
|
+
.replace(/[\u0300-\u036f]/g, "")
|
|
161
|
+
.toLowerCase();
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* A board seen without its cards: just the visible lists and how many cards
|
|
165
|
+
* each one holds. One GET, a handful of lines of output.
|
|
166
|
+
*/
|
|
167
|
+
export async function getBoardListCounts(input) {
|
|
168
|
+
const { boardId } = parseInput(BoardIdSchema, input);
|
|
169
|
+
const details = await getBoard({ boardId });
|
|
170
|
+
const countByList = new Map();
|
|
171
|
+
for (const card of details.cards) {
|
|
172
|
+
countByList.set(card.listId, (countByList.get(card.listId) ?? 0) + 1);
|
|
173
|
+
}
|
|
174
|
+
// name === null means archive/trash: those are not board columns.
|
|
175
|
+
const lists = details.lists
|
|
176
|
+
.filter((list) => list.name !== null)
|
|
177
|
+
.map((list) => ({
|
|
178
|
+
id: list.id,
|
|
179
|
+
name: list.name,
|
|
180
|
+
...(list.type ? { type: list.type } : {}),
|
|
181
|
+
cardCount: countByList.get(list.id) ?? 0,
|
|
182
|
+
}));
|
|
183
|
+
return {
|
|
184
|
+
board: details.board,
|
|
185
|
+
lists,
|
|
186
|
+
totalCards: details.cards.length,
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
/** Clips the description so a preview does not eat the size advantage. */
|
|
190
|
+
const DESCRIPTION_PREVIEW = 200;
|
|
191
|
+
function digest(card, listName, labelNames, withDescription) {
|
|
192
|
+
const description = card.description ?? null;
|
|
193
|
+
return {
|
|
194
|
+
id: card.id,
|
|
195
|
+
name: card.name,
|
|
196
|
+
listId: card.listId,
|
|
197
|
+
list: listName,
|
|
198
|
+
labels: labelNames,
|
|
199
|
+
...(withDescription && description
|
|
200
|
+
? {
|
|
201
|
+
description: description.length > DESCRIPTION_PREVIEW
|
|
202
|
+
? `${description.slice(0, DESCRIPTION_PREVIEW)}…`
|
|
203
|
+
: description,
|
|
204
|
+
}
|
|
205
|
+
: {}),
|
|
206
|
+
...(card.dueDate ? { dueDate: card.dueDate } : {}),
|
|
207
|
+
...(card.isCompleted ? { isCompleted: true } : {}),
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Indexes derived from a single GET on the board: list names, label names per
|
|
212
|
+
* card, and the cards ordered the way the board shows them.
|
|
213
|
+
*/
|
|
214
|
+
async function indexBoard(boardId) {
|
|
215
|
+
const details = await getBoard({ boardId });
|
|
216
|
+
const listById = new Map(details.lists.map((l) => [l.id, l]));
|
|
217
|
+
const labelById = new Map(details.labels.map((l) => [l.id, l]));
|
|
218
|
+
const labelNamesByCard = new Map();
|
|
219
|
+
for (const cl of details.cardLabels) {
|
|
220
|
+
const label = labelById.get(cl.labelId);
|
|
221
|
+
if (!label)
|
|
222
|
+
continue;
|
|
223
|
+
const names = labelNamesByCard.get(cl.cardId) ?? [];
|
|
224
|
+
names.push(label.name ?? label.color);
|
|
225
|
+
labelNamesByCard.set(cl.cardId, names);
|
|
226
|
+
}
|
|
227
|
+
// Same order a human sees: by list position, then by card position.
|
|
228
|
+
const listPosition = new Map(details.lists.map((l) => [l.id, l.position ?? Number.MAX_SAFE_INTEGER]));
|
|
229
|
+
const cards = [...details.cards].sort((a, b) => {
|
|
230
|
+
const byList = (listPosition.get(a.listId) ?? 0) - (listPosition.get(b.listId) ?? 0);
|
|
231
|
+
return byList !== 0 ? byList : a.position - b.position;
|
|
232
|
+
});
|
|
233
|
+
return { details, listById, labelById, labelNamesByCard, cards };
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* The lists whose cards the caller asked for. Each entry matches an exact id
|
|
237
|
+
* or a name fragment (accent- and case-insensitive).
|
|
238
|
+
*/
|
|
239
|
+
function selectLists(lists, wanted) {
|
|
240
|
+
const selected = [];
|
|
241
|
+
for (const list of lists) {
|
|
242
|
+
if (list.name === null)
|
|
243
|
+
continue;
|
|
244
|
+
const name = normalizeText(list.name);
|
|
245
|
+
const hit = wanted.some((w) => w === list.id || name.includes(normalizeText(w)));
|
|
246
|
+
if (hit)
|
|
247
|
+
selected.push(list);
|
|
248
|
+
}
|
|
249
|
+
return selected;
|
|
250
|
+
}
|
|
251
|
+
/**
|
|
252
|
+
* Default for `cardsFrom`: the column where cards waiting on a decision pile
|
|
253
|
+
* up. Matched by name so it works on any board, whatever the language.
|
|
254
|
+
*/
|
|
255
|
+
const DECISION_LIST_HINTS = ["decision", "decide", "blocked", "bloquead"];
|
|
256
|
+
/**
|
|
257
|
+
* Everything needed to open a working session, in one call: columns with
|
|
258
|
+
* counts, the board's labels, and the cards sitting in the column(s) waiting
|
|
259
|
+
* on a decision, flagged by whether they already got one.
|
|
260
|
+
*/
|
|
261
|
+
export async function getBoardSummary(input) {
|
|
262
|
+
const { boardId, cardsFrom, highlightLabel, limit } = parseInput(BoardSummarySchema, input);
|
|
263
|
+
const { details, listById, labelNamesByCard, cards } = await indexBoard(boardId);
|
|
264
|
+
const countByList = new Map();
|
|
265
|
+
for (const card of details.cards) {
|
|
266
|
+
countByList.set(card.listId, (countByList.get(card.listId) ?? 0) + 1);
|
|
267
|
+
}
|
|
268
|
+
const visibleLists = details.lists.filter((list) => list.name !== null);
|
|
269
|
+
const wanted = cardsFrom ?? DECISION_LIST_HINTS;
|
|
270
|
+
const selected = selectLists(visibleLists, wanted);
|
|
271
|
+
const selectedIds = new Set(selected.map((l) => l.id));
|
|
272
|
+
const highlight = normalizeText(highlightLabel);
|
|
273
|
+
const matching = cards
|
|
274
|
+
.filter((card) => selectedIds.has(card.listId))
|
|
275
|
+
.map((card) => {
|
|
276
|
+
const labels = labelNamesByCard.get(card.id) ?? [];
|
|
277
|
+
return {
|
|
278
|
+
...digest(card, listById.get(card.listId)?.name ?? "", labels, false),
|
|
279
|
+
highlighted: labels.some((l) => normalizeText(l) === highlight),
|
|
280
|
+
};
|
|
281
|
+
});
|
|
282
|
+
// Unblocked first: that is what gets picked up at the start of a session.
|
|
283
|
+
matching.sort((a, b) => Number(b.highlighted) - Number(a.highlighted));
|
|
284
|
+
const page = matching.slice(0, limit);
|
|
285
|
+
return {
|
|
286
|
+
board: details.board,
|
|
287
|
+
lists: visibleLists.map((list) => ({
|
|
288
|
+
id: list.id,
|
|
289
|
+
name: list.name,
|
|
290
|
+
...(list.type ? { type: list.type } : {}),
|
|
291
|
+
cardCount: countByList.get(list.id) ?? 0,
|
|
292
|
+
})),
|
|
293
|
+
labels: details.labels.map((l) => ({ id: l.id, name: l.name ?? l.color })),
|
|
294
|
+
highlightLabel,
|
|
295
|
+
cardsFrom: selected.map((l) => l.name ?? l.id),
|
|
296
|
+
cards: page,
|
|
297
|
+
highlightedCount: matching.filter((c) => c.highlighted).length,
|
|
298
|
+
returned: page.length,
|
|
299
|
+
total: matching.length,
|
|
300
|
+
hasMore: page.length < matching.length,
|
|
301
|
+
};
|
|
302
|
+
}
|
|
303
|
+
/**
|
|
304
|
+
* Searches a board's cards by label and/or text. Text matches both name and
|
|
305
|
+
* description, case- and accent-insensitive.
|
|
306
|
+
*/
|
|
307
|
+
export async function findCards(input) {
|
|
308
|
+
const { boardId, labelName, query, listId, withDescription, limit, offset } = parseInput(FindCardsSchema, input);
|
|
309
|
+
const { details, listById, labelById, labelNamesByCard, cards } = await indexBoard(boardId);
|
|
310
|
+
const warnings = [];
|
|
311
|
+
// labelName -> ids. A board can carry the same name on two labels.
|
|
312
|
+
let labelIds = null;
|
|
313
|
+
if (labelName) {
|
|
314
|
+
const wanted = normalizeText(labelName);
|
|
315
|
+
const hits = details.labels.filter((l) => normalizeText(l.name ?? l.color) === wanted);
|
|
316
|
+
if (hits.length === 0) {
|
|
317
|
+
warnings.push(`No label named "${labelName}" on this board. Existing labels: ` +
|
|
318
|
+
details.labels.map((l) => l.name ?? l.color).join(", "));
|
|
319
|
+
}
|
|
320
|
+
labelIds = new Set(hits.map((l) => l.id));
|
|
321
|
+
}
|
|
322
|
+
if (listId && !listById.has(listId)) {
|
|
323
|
+
warnings.push(`No list ${listId} on this board.`);
|
|
324
|
+
}
|
|
325
|
+
const needle = query ? normalizeText(query) : null;
|
|
326
|
+
const matched = cards.filter((card) => {
|
|
327
|
+
if (listId && card.listId !== listId)
|
|
328
|
+
return false;
|
|
329
|
+
if (labelIds) {
|
|
330
|
+
const cardLabelIds = details.cardLabels
|
|
331
|
+
.filter((cl) => cl.cardId === card.id)
|
|
332
|
+
.map((cl) => cl.labelId);
|
|
333
|
+
if (!cardLabelIds.some((id) => labelIds.has(id)))
|
|
334
|
+
return false;
|
|
335
|
+
}
|
|
336
|
+
if (needle) {
|
|
337
|
+
const haystack = normalizeText(`${card.name}\n${card.description ?? ""}`);
|
|
338
|
+
if (!haystack.includes(needle))
|
|
339
|
+
return false;
|
|
340
|
+
}
|
|
341
|
+
return true;
|
|
342
|
+
});
|
|
343
|
+
const page = matched.slice(offset, offset + limit);
|
|
344
|
+
const hasMore = offset + page.length < matched.length;
|
|
345
|
+
return {
|
|
346
|
+
boardId,
|
|
347
|
+
filters: {
|
|
348
|
+
...(labelName ? { labelName } : {}),
|
|
349
|
+
...(query ? { query } : {}),
|
|
350
|
+
...(listId ? { listId } : {}),
|
|
351
|
+
},
|
|
352
|
+
total: matched.length,
|
|
353
|
+
returned: page.length,
|
|
354
|
+
offset,
|
|
355
|
+
hasMore,
|
|
356
|
+
...(hasMore ? { nextOffset: offset + page.length } : {}),
|
|
357
|
+
matches: page.map((card) => digest(card, listById.get(card.listId)?.name ?? "", labelNamesByCard.get(card.id) ?? [], withDescription)),
|
|
358
|
+
...(warnings.length > 0 ? { warning: warnings.join(" ") } : {}),
|
|
359
|
+
};
|
|
360
|
+
}
|
|
361
|
+
/**
|
|
362
|
+
* Cards of ONE list, paginated outward. `limit`/`offset` are output-side:
|
|
363
|
+
* Planka's API accepts neither, so the whole list is resolved through its
|
|
364
|
+
* cursor and clipped here — the only way to report an honest `total`.
|
|
365
|
+
*/
|
|
366
|
+
export async function listCards(input) {
|
|
367
|
+
const { listId, withLabels, labelFilter, limit, offset } = parseInput(ListCardsSchema, input);
|
|
368
|
+
const { cards, truncated } = await getCardsForList({
|
|
369
|
+
listId,
|
|
370
|
+
withLabels: labelFilter !== undefined ? true : withLabels,
|
|
371
|
+
});
|
|
372
|
+
const wanted = labelFilter ? normalizeText(labelFilter) : null;
|
|
373
|
+
const matched = wanted
|
|
374
|
+
? cards.filter((c) => c.labelNames.some((l) => normalizeText(l) === wanted))
|
|
375
|
+
: cards;
|
|
376
|
+
const page = matched.slice(offset, offset + limit);
|
|
377
|
+
const hasMore = offset + page.length < matched.length;
|
|
378
|
+
return {
|
|
379
|
+
listId,
|
|
380
|
+
total: matched.length,
|
|
381
|
+
totalInList: cards.length,
|
|
382
|
+
returned: page.length,
|
|
383
|
+
offset,
|
|
384
|
+
hasMore,
|
|
385
|
+
...(hasMore ? { nextOffset: offset + page.length } : {}),
|
|
386
|
+
truncated,
|
|
387
|
+
...(labelFilter ? { labelFilter } : {}),
|
|
388
|
+
cards: page,
|
|
389
|
+
};
|
|
390
|
+
}
|
|
391
|
+
//# sourceMappingURL=boards.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"boards.js","sourceRoot":"","sources":["../../src/operations/boards.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { Card, TaskList, Task, Label, CardLabel, Attachment } from "../schemas/entities.js";
|
|
2
|
+
import { CardIdInput, CreateCardInput, MoveCardInput, UpdateCardParamsInput } from "../schemas/requests.js";
|
|
3
|
+
import { CommentWithAuthor } from "./comments.js";
|
|
4
|
+
/**
|
|
5
|
+
* Card details with all related entities.
|
|
6
|
+
*/
|
|
7
|
+
export interface CardDetails {
|
|
8
|
+
card: Card;
|
|
9
|
+
taskLists: TaskList[];
|
|
10
|
+
tasks: Task[];
|
|
11
|
+
comments: CommentWithAuthor[];
|
|
12
|
+
labels: Label[];
|
|
13
|
+
cardLabels: CardLabel[];
|
|
14
|
+
attachments: Attachment[];
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Create a new card in a list.
|
|
18
|
+
*/
|
|
19
|
+
export declare function createCard(input: CreateCardInput): Promise<Card>;
|
|
20
|
+
/**
|
|
21
|
+
* Get a card by ID with all related entities.
|
|
22
|
+
*/
|
|
23
|
+
export declare function getCard(input: CardIdInput): Promise<CardDetails>;
|
|
24
|
+
/**
|
|
25
|
+
* Update a card's properties.
|
|
26
|
+
*/
|
|
27
|
+
export declare function updateCard(input: UpdateCardParamsInput): Promise<Card>;
|
|
28
|
+
/**
|
|
29
|
+
* Move a card to a different list/position.
|
|
30
|
+
*/
|
|
31
|
+
export declare function moveCard(input: MoveCardInput): Promise<Card>;
|
|
32
|
+
/**
|
|
33
|
+
* Delete a card.
|
|
34
|
+
*/
|
|
35
|
+
export declare function deleteCard(input: CardIdInput): Promise<void>;
|
|
36
|
+
//# sourceMappingURL=cards.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cards.d.ts","sourceRoot":"","sources":["../../src/operations/cards.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAW,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACrG,OAAO,EAEL,WAAW,EAEX,eAAe,EAEf,aAAa,EAEb,qBAAqB,EACtB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EAAsB,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAEtE;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,IAAI,CAAC;IACX,SAAS,EAAE,QAAQ,EAAE,CAAC;IACtB,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,QAAQ,EAAE,iBAAiB,EAAE,CAAC;IAC9B,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,UAAU,EAAE,SAAS,EAAE,CAAC;IACxB,WAAW,EAAE,UAAU,EAAE,CAAC;CAC3B;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAgBtE;AAED;;GAEG;AACH,wBAAsB,OAAO,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,CA4BtE;AAED;;GAEG;AACH,wBAAsB,UAAU,CAC9B,KAAK,EAAE,qBAAqB,GAC3B,OAAO,CAAC,IAAI,CAAC,CAUf;AAED;;GAEG;AACH,wBAAsB,QAAQ,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAmBlE;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAGlE"}
|