@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.
Files changed (195) hide show
  1. package/.agents/plugins/marketplace.json +20 -0
  2. package/.claude-plugin/marketplace.json +26 -0
  3. package/.claude-plugin/plugin.json +45 -0
  4. package/.codex-plugin/mcp.json +16 -0
  5. package/.codex-plugin/plugin.json +27 -0
  6. package/.mcp.json +17 -0
  7. package/CHANGELOG.md +510 -0
  8. package/README.es.md +294 -55
  9. package/README.md +293 -55
  10. package/dist/cli/init.d.ts +101 -0
  11. package/dist/cli/init.d.ts.map +1 -0
  12. package/dist/cli/init.js +481 -0
  13. package/dist/cli/init.js.map +1 -0
  14. package/dist/client.d.ts +32 -4
  15. package/dist/client.d.ts.map +1 -1
  16. package/dist/client.js +106 -32
  17. package/dist/client.js.map +1 -1
  18. package/dist/config/policy.d.ts +82 -0
  19. package/dist/config/policy.d.ts.map +1 -0
  20. package/dist/config/policy.js +226 -0
  21. package/dist/config/policy.js.map +1 -0
  22. package/dist/errors.d.ts +5 -1
  23. package/dist/errors.d.ts.map +1 -1
  24. package/dist/errors.js +62 -5
  25. package/dist/errors.js.map +1 -1
  26. package/dist/identity.generated.d.ts +2 -1
  27. package/dist/identity.generated.d.ts.map +1 -1
  28. package/dist/identity.generated.js +2 -1
  29. package/dist/identity.generated.js.map +1 -1
  30. package/dist/index.js +85 -10
  31. package/dist/index.js.map +1 -1
  32. package/dist/instructions.d.ts +21 -0
  33. package/dist/instructions.d.ts.map +1 -0
  34. package/dist/instructions.js +37 -0
  35. package/dist/instructions.js.map +1 -0
  36. package/dist/operations/actions.d.ts +654 -0
  37. package/dist/operations/actions.d.ts.map +1 -0
  38. package/dist/operations/actions.js +154 -0
  39. package/dist/operations/actions.js.map +1 -0
  40. package/dist/operations/archive.d.ts +28 -0
  41. package/dist/operations/archive.d.ts.map +1 -0
  42. package/dist/operations/archive.js +74 -0
  43. package/dist/operations/archive.js.map +1 -0
  44. package/dist/operations/attachments.d.ts +1 -1
  45. package/dist/operations/attachments.d.ts.map +1 -1
  46. package/dist/operations/attachments.js +3 -1
  47. package/dist/operations/attachments.js.map +1 -1
  48. package/dist/operations/board-id.d.ts +1 -1
  49. package/dist/operations/board-id.d.ts.map +1 -1
  50. package/dist/operations/board-id.js +13 -7
  51. package/dist/operations/board-id.js.map +1 -1
  52. package/dist/operations/boards.d.ts +96 -19
  53. package/dist/operations/boards.d.ts.map +1 -1
  54. package/dist/operations/boards.js +377 -93
  55. package/dist/operations/boards.js.map +1 -1
  56. package/dist/operations/card-brief.d.ts +91 -0
  57. package/dist/operations/card-brief.d.ts.map +1 -0
  58. package/dist/operations/card-brief.js +79 -0
  59. package/dist/operations/card-brief.js.map +1 -0
  60. package/dist/operations/cards.d.ts +34 -9
  61. package/dist/operations/cards.d.ts.map +1 -1
  62. package/dist/operations/cards.js +60 -14
  63. package/dist/operations/cards.js.map +1 -1
  64. package/dist/operations/comments.d.ts +61 -4
  65. package/dist/operations/comments.d.ts.map +1 -1
  66. package/dist/operations/comments.js +91 -8
  67. package/dist/operations/comments.js.map +1 -1
  68. package/dist/operations/duplicate.d.ts +16 -0
  69. package/dist/operations/duplicate.d.ts.map +1 -0
  70. package/dist/operations/duplicate.js +43 -0
  71. package/dist/operations/duplicate.js.map +1 -0
  72. package/dist/operations/labels.d.ts +1 -1
  73. package/dist/operations/labels.d.ts.map +1 -1
  74. package/dist/operations/labels.js +7 -4
  75. package/dist/operations/labels.js.map +1 -1
  76. package/dist/operations/lists.d.ts +63 -1
  77. package/dist/operations/lists.d.ts.map +1 -1
  78. package/dist/operations/lists.js +97 -2
  79. package/dist/operations/lists.js.map +1 -1
  80. package/dist/operations/members.d.ts +39 -0
  81. package/dist/operations/members.d.ts.map +1 -0
  82. package/dist/operations/members.js +107 -0
  83. package/dist/operations/members.js.map +1 -0
  84. package/dist/operations/projects.d.ts +16 -0
  85. package/dist/operations/projects.d.ts.map +1 -1
  86. package/dist/operations/projects.js +54 -9
  87. package/dist/operations/projects.js.map +1 -1
  88. package/dist/operations/tasks.d.ts +1 -1
  89. package/dist/operations/tasks.d.ts.map +1 -1
  90. package/dist/operations/tasks.js +5 -3
  91. package/dist/operations/tasks.js.map +1 -1
  92. package/dist/operations/users.d.ts +123 -0
  93. package/dist/operations/users.d.ts.map +1 -0
  94. package/dist/operations/users.js +180 -0
  95. package/dist/operations/users.js.map +1 -0
  96. package/dist/operations/verify.d.ts +84 -0
  97. package/dist/operations/verify.d.ts.map +1 -0
  98. package/dist/operations/verify.js +124 -0
  99. package/dist/operations/verify.js.map +1 -0
  100. package/dist/prompts.d.ts +48 -0
  101. package/dist/prompts.d.ts.map +1 -0
  102. package/dist/prompts.js +155 -0
  103. package/dist/prompts.js.map +1 -0
  104. package/dist/resources.d.ts +38 -0
  105. package/dist/resources.d.ts.map +1 -0
  106. package/dist/resources.js +127 -0
  107. package/dist/resources.js.map +1 -0
  108. package/dist/schemas/entities.d.ts +115 -24
  109. package/dist/schemas/entities.d.ts.map +1 -1
  110. package/dist/schemas/entities.js +48 -0
  111. package/dist/schemas/entities.js.map +1 -1
  112. package/dist/schemas/requests.d.ts +121 -46
  113. package/dist/schemas/requests.d.ts.map +1 -1
  114. package/dist/schemas/requests.js +57 -12
  115. package/dist/schemas/requests.js.map +1 -1
  116. package/dist/schemas/responses.d.ts +541 -186
  117. package/dist/schemas/responses.d.ts.map +1 -1
  118. package/dist/schemas/responses.js +13 -2
  119. package/dist/schemas/responses.js.map +1 -1
  120. package/dist/tools/activity.d.ts +150 -0
  121. package/dist/tools/activity.d.ts.map +1 -0
  122. package/dist/tools/activity.js +198 -0
  123. package/dist/tools/activity.js.map +1 -0
  124. package/dist/tools/annotations.d.ts +52 -0
  125. package/dist/tools/annotations.d.ts.map +1 -0
  126. package/dist/tools/annotations.js +214 -0
  127. package/dist/tools/annotations.js.map +1 -0
  128. package/dist/tools/attachments.d.ts +28 -4
  129. package/dist/tools/attachments.d.ts.map +1 -1
  130. package/dist/tools/attachments.js +53 -34
  131. package/dist/tools/attachments.js.map +1 -1
  132. package/dist/tools/card-ops.d.ts +232 -0
  133. package/dist/tools/card-ops.d.ts.map +1 -0
  134. package/dist/tools/card-ops.js +333 -0
  135. package/dist/tools/card-ops.js.map +1 -0
  136. package/dist/tools/cards.d.ts +90 -8
  137. package/dist/tools/cards.d.ts.map +1 -1
  138. package/dist/tools/cards.js +411 -128
  139. package/dist/tools/cards.js.map +1 -1
  140. package/dist/tools/comments.d.ts +226 -22
  141. package/dist/tools/comments.d.ts.map +1 -1
  142. package/dist/tools/comments.js +163 -134
  143. package/dist/tools/comments.js.map +1 -1
  144. package/dist/tools/dispatch.d.ts +47 -0
  145. package/dist/tools/dispatch.d.ts.map +1 -0
  146. package/dist/tools/dispatch.js +63 -0
  147. package/dist/tools/dispatch.js.map +1 -0
  148. package/dist/tools/guard.d.ts +9 -0
  149. package/dist/tools/guard.d.ts.map +1 -0
  150. package/dist/tools/guard.js +20 -0
  151. package/dist/tools/guard.js.map +1 -0
  152. package/dist/tools/index.d.ts +748 -450
  153. package/dist/tools/index.d.ts.map +1 -1
  154. package/dist/tools/index.js +136 -17
  155. package/dist/tools/index.js.map +1 -1
  156. package/dist/tools/labels.d.ts +213 -18
  157. package/dist/tools/labels.d.ts.map +1 -1
  158. package/dist/tools/labels.js +218 -203
  159. package/dist/tools/labels.js.map +1 -1
  160. package/dist/tools/lists.d.ts +222 -15
  161. package/dist/tools/lists.d.ts.map +1 -1
  162. package/dist/tools/lists.js +175 -156
  163. package/dist/tools/lists.js.map +1 -1
  164. package/dist/tools/members.d.ts +128 -0
  165. package/dist/tools/members.d.ts.map +1 -0
  166. package/dist/tools/members.js +150 -0
  167. package/dist/tools/members.js.map +1 -0
  168. package/dist/tools/navigation.d.ts +22 -2
  169. package/dist/tools/navigation.d.ts.map +1 -1
  170. package/dist/tools/navigation.js +60 -15
  171. package/dist/tools/navigation.js.map +1 -1
  172. package/dist/tools/queries.d.ts +196 -166
  173. package/dist/tools/queries.d.ts.map +1 -1
  174. package/dist/tools/queries.js +125 -155
  175. package/dist/tools/queries.js.map +1 -1
  176. package/dist/tools/tasks.d.ts +26 -6
  177. package/dist/tools/tasks.d.ts.map +1 -1
  178. package/dist/tools/tasks.js +110 -55
  179. package/dist/tools/tasks.js.map +1 -1
  180. package/dist/tools/users.d.ts +130 -0
  181. package/dist/tools/users.d.ts.map +1 -0
  182. package/dist/tools/users.js +165 -0
  183. package/dist/tools/users.js.map +1 -0
  184. package/docs/planka-2x-gotchas.md +121 -5
  185. package/docs/tools.md +771 -187
  186. package/docs/troubleshooting.md +137 -5
  187. package/hooks/hooks.json +15 -0
  188. package/hooks/preflight.mjs +100 -0
  189. package/package.json +6 -1
  190. package/scripts/setup.sh +8 -26
  191. package/scripts/sync-identity.mjs +55 -1
  192. package/server.json +87 -6
  193. package/tests/smoke/planka-smoke.mjs +512 -72
  194. package/workflow/skills/planka-close-card/SKILL.md +18 -5
  195. 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<void>;
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,CAGf;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"}
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":"AAyFA;;;;;;GAMG;AACH,wBAAsB,WAAW,CAAC,CAAC,EACjC,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,GAC9B,OAAO,CAAC,CAAC,CAAC,CAUZ"}
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
- // information available: let the caller re-throw it.
41
- throw new PlankaNotFoundError("Board", boardId);
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(boardId);
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(boardId);
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":"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"}
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
- listId: string;
74
- list: string;
75
- labels: string[];
76
- description?: string | null;
77
- dueDate?: string | null;
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
- highlightLabel: string;
136
+ totalCards: number;
137
+ highlightLabel?: string;
88
138
  cardsFrom: string[];
89
139
  cards: (CardDigest & {
90
- highlighted: boolean;
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 sitting in the column(s) waiting
100
- * on a decision, flagged by whether they already got one.
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
- /** Filled in only when the requested filter does not exist on the board. */
117
- warning?: string;
188
+ warnings: string[];
118
189
  }
119
190
  /**
120
- * Searches a board's cards by label and/or text. Text matches both name and
121
- * description, case- and accent-insensitive.
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. `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`.
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":"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"}
1
+ {"version":3,"file":"boards.d.ts","sourceRoot":"","sources":["../../src/operations/boards.ts"],"names":[],"mappings":"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"}