@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
@@ -1,6 +1,115 @@
1
1
  /**
2
- * Tool: planka_manage_lists
3
- * Create, update, or delete lists on a board.
2
+ * Tool: planka_create_list
3
+ */
4
+ export declare const createListTool: {
5
+ name: string;
6
+ description: string;
7
+ inputSchema: {
8
+ type: "object";
9
+ properties: {
10
+ boardId: {
11
+ type: string;
12
+ description: string;
13
+ };
14
+ name: {
15
+ type: string;
16
+ description: string;
17
+ };
18
+ position: {
19
+ type: string;
20
+ description: string;
21
+ };
22
+ type: {
23
+ type: string;
24
+ enum: string[];
25
+ description: string;
26
+ };
27
+ };
28
+ required: string[];
29
+ };
30
+ handler: (params: {
31
+ boardId?: string;
32
+ name: string;
33
+ position?: number;
34
+ type?: "active" | "closed";
35
+ }) => Promise<{
36
+ isError?: true | undefined;
37
+ content: {
38
+ type: "text";
39
+ text: string;
40
+ }[];
41
+ } | import("./guard.js").ToolReply>;
42
+ };
43
+ /**
44
+ * Tool: planka_update_list
45
+ */
46
+ export declare const updateListTool: {
47
+ name: string;
48
+ description: string;
49
+ inputSchema: {
50
+ type: "object";
51
+ properties: {
52
+ listId: {
53
+ type: string;
54
+ description: string;
55
+ };
56
+ name: {
57
+ type: string;
58
+ description: string;
59
+ };
60
+ position: {
61
+ type: string;
62
+ description: string;
63
+ };
64
+ type: {
65
+ type: string;
66
+ enum: string[];
67
+ description: string;
68
+ };
69
+ };
70
+ required: string[];
71
+ };
72
+ handler: (params: {
73
+ listId: string;
74
+ name?: string;
75
+ position?: number;
76
+ type?: "active" | "closed";
77
+ }) => Promise<{
78
+ isError?: true | undefined;
79
+ content: {
80
+ type: "text";
81
+ text: string;
82
+ }[];
83
+ } | import("./guard.js").ToolReply>;
84
+ };
85
+ /**
86
+ * Tool: planka_delete_list
87
+ */
88
+ export declare const deleteListTool: {
89
+ name: string;
90
+ description: string;
91
+ inputSchema: {
92
+ type: "object";
93
+ properties: {
94
+ listId: {
95
+ type: string;
96
+ description: string;
97
+ };
98
+ };
99
+ required: string[];
100
+ };
101
+ handler: (params: {
102
+ listId: string;
103
+ }) => Promise<{
104
+ isError?: true | undefined;
105
+ content: {
106
+ type: "text";
107
+ text: string;
108
+ }[];
109
+ } | import("./guard.js").ToolReply>;
110
+ };
111
+ /**
112
+ * Tool: planka_manage_lists (DEPRECATED alias)
4
113
  */
5
114
  export declare const manageListsTool: {
6
115
  name: string;
@@ -45,20 +154,118 @@ export declare const manageListsTool: {
45
154
  position?: number;
46
155
  type?: "active" | "closed";
47
156
  }) => Promise<{
157
+ content: Array<{
158
+ type: string;
159
+ [key: string]: unknown;
160
+ }>;
161
+ isError?: boolean;
162
+ } | {
48
163
  content: {
49
164
  type: "text";
50
165
  text: string;
51
166
  }[];
52
- isError: boolean;
53
- } | {
167
+ isError: true;
168
+ }>;
169
+ };
170
+ export declare const listTools: ({
171
+ name: string;
172
+ description: string;
173
+ inputSchema: {
174
+ type: "object";
175
+ properties: {
176
+ boardId: {
177
+ type: string;
178
+ description: string;
179
+ };
180
+ name: {
181
+ type: string;
182
+ description: string;
183
+ };
184
+ position: {
185
+ type: string;
186
+ description: string;
187
+ };
188
+ type: {
189
+ type: string;
190
+ enum: string[];
191
+ description: string;
192
+ };
193
+ };
194
+ required: string[];
195
+ };
196
+ handler: (params: {
197
+ boardId?: string;
198
+ name: string;
199
+ position?: number;
200
+ type?: "active" | "closed";
201
+ }) => Promise<{
202
+ isError?: true | undefined;
54
203
  content: {
55
204
  type: "text";
56
205
  text: string;
57
206
  }[];
58
- isError?: undefined;
59
- }>;
60
- };
61
- export declare const listTools: {
207
+ } | import("./guard.js").ToolReply>;
208
+ } | {
209
+ name: string;
210
+ description: string;
211
+ inputSchema: {
212
+ type: "object";
213
+ properties: {
214
+ listId: {
215
+ type: string;
216
+ description: string;
217
+ };
218
+ name: {
219
+ type: string;
220
+ description: string;
221
+ };
222
+ position: {
223
+ type: string;
224
+ description: string;
225
+ };
226
+ type: {
227
+ type: string;
228
+ enum: string[];
229
+ description: string;
230
+ };
231
+ };
232
+ required: string[];
233
+ };
234
+ handler: (params: {
235
+ listId: string;
236
+ name?: string;
237
+ position?: number;
238
+ type?: "active" | "closed";
239
+ }) => Promise<{
240
+ isError?: true | undefined;
241
+ content: {
242
+ type: "text";
243
+ text: string;
244
+ }[];
245
+ } | import("./guard.js").ToolReply>;
246
+ } | {
247
+ name: string;
248
+ description: string;
249
+ inputSchema: {
250
+ type: "object";
251
+ properties: {
252
+ listId: {
253
+ type: string;
254
+ description: string;
255
+ };
256
+ };
257
+ required: string[];
258
+ };
259
+ handler: (params: {
260
+ listId: string;
261
+ }) => Promise<{
262
+ isError?: true | undefined;
263
+ content: {
264
+ type: "text";
265
+ text: string;
266
+ }[];
267
+ } | import("./guard.js").ToolReply>;
268
+ } | {
62
269
  name: string;
63
270
  description: string;
64
271
  inputSchema: {
@@ -101,17 +308,17 @@ export declare const listTools: {
101
308
  position?: number;
102
309
  type?: "active" | "closed";
103
310
  }) => Promise<{
104
- content: {
105
- type: "text";
106
- text: string;
107
- }[];
108
- isError: boolean;
311
+ content: Array<{
312
+ type: string;
313
+ [key: string]: unknown;
314
+ }>;
315
+ isError?: boolean;
109
316
  } | {
110
317
  content: {
111
318
  type: "text";
112
319
  text: string;
113
320
  }[];
114
- isError?: undefined;
321
+ isError: true;
115
322
  }>;
116
- }[];
323
+ })[];
117
324
  //# sourceMappingURL=lists.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"lists.d.ts","sourceRoot":"","sources":["../../src/tools/lists.ts"],"names":[],"mappings":"AAWA;;;GAGG;AACH,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;sBAmCF;QACtB,MAAM,EAAE,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;QACvC,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,IAAI,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAC;KAC5B;;;;;;;;;;;;;CAqJF,CAAC;AAEF,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;sBA9JI;QACtB,MAAM,EAAE,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;QACvC,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,IAAI,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAC;KAC5B;;;;;;;;;;;;;GAuJuC,CAAC"}
1
+ {"version":3,"file":"lists.d.ts","sourceRoot":"","sources":["../../src/tools/lists.ts"],"names":[],"mappings":"AA0BA;;GAEG;AACH,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;sBAcD;QACtB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,IAAI,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAC;KAC5B;;;;;;;CA2CF,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;sBAcD;QACtB,MAAM,EAAE,MAAM,CAAC;QACf,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,IAAI,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAC;KAC5B;;;;;;;CA6CF,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,cAAc;;;;;;;;;;;;;sBAWD;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE;;;;;;;CAwB3C,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;sBAuBF;QACtB,MAAM,EAAE,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;QACvC,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,IAAI,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAC;KAC5B;;;;;;;;;;;;;CAMF,CAAC;AAEF,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;sBAxMI;QACtB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,IAAI,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAC;KAC5B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;sBA8DuB;QACtB,MAAM,EAAE,MAAM,CAAC;QACf,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,IAAI,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAC;KAC5B;;;;;;;;;;;;;;;;;;;;sBA6DuB;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;sBAoDlB;QACtB,MAAM,EAAE,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;QACvC,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,IAAI,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAC;KAC5B;;;;;;;;;;;;;IAaF,CAAC"}
@@ -1,178 +1,197 @@
1
1
  /**
2
- * List tools for PLANKA MCP server.
2
+ * List (column) tools for PLANKA MCP server.
3
+ *
4
+ * One tool per action: the old `planka_manage_lists` action enum could not put
5
+ * `listId` in `required`, so the checks were hand-written and an update with
6
+ * only an id shipped an empty PATCH that answered `success: true`.
3
7
  */
4
- import { createList, updateList, deleteList, } from "../operations/lists.js";
5
- import { PlankaError } from "../errors.js";
8
+ import { createList, updateList, deleteList } from "../operations/lists.js";
9
+ import { getBoard } from "../operations/boards.js";
10
+ import { nothingToDo, verifiedDelete, verifiedWrite, writeResult, } from "../operations/verify.js";
11
+ import { assertBoardAllowed, getPolicy } from "../config/policy.js";
12
+ import { dispatchAction } from "./dispatch.js";
13
+ import { guarded } from "./guard.js";
14
+ const listTypeProperty = {
15
+ type: "string",
16
+ enum: ["active", "closed"],
17
+ description: "List type. Defaults to active when creating.",
18
+ };
19
+ /**
20
+ * Tool: planka_create_list
21
+ */
22
+ export const createListTool = {
23
+ name: "planka_create_list",
24
+ description: "Create a list (column) on a board. Verified against the board after writing.",
25
+ inputSchema: {
26
+ type: "object",
27
+ properties: {
28
+ boardId: { type: "string", description: "Board ID" },
29
+ name: { type: "string", description: "List name" },
30
+ position: { type: "number", description: "List position" },
31
+ type: listTypeProperty,
32
+ },
33
+ required: ["boardId", "name"],
34
+ },
35
+ handler: async (params) => guarded(async () => {
36
+ // Explicit, like every other write path: the allowlist must not depend
37
+ // on a lower layer the handler does not control.
38
+ const requested = params.boardId ?? getPolicy().defaultBoardId;
39
+ const boardId = requested ? assertBoardAllowed(requested) : null;
40
+ if (!boardId) {
41
+ return {
42
+ content: [
43
+ {
44
+ type: "text",
45
+ text: "Error: boardId is required (or set PLANKA_DEFAULT_BOARD_ID)",
46
+ },
47
+ ],
48
+ isError: true,
49
+ };
50
+ }
51
+ const written = await verifiedWrite({
52
+ write: () => createList({
53
+ boardId,
54
+ name: params.name,
55
+ position: params.position,
56
+ type: params.type,
57
+ }),
58
+ reread: (list) => getBoard({ boardId: list.boardId }),
59
+ landed: (board, list) => board.lists.some((l) => l.id === list.id && l.name === params.name),
60
+ });
61
+ return writeResult({
62
+ list: {
63
+ id: written.result.id,
64
+ name: written.result.name,
65
+ position: written.result.position,
66
+ boardId: written.result.boardId,
67
+ },
68
+ }, written);
69
+ }),
70
+ };
6
71
  /**
7
- * Tool: planka_manage_lists
8
- * Create, update, or delete lists on a board.
72
+ * Tool: planka_update_list
73
+ */
74
+ export const updateListTool = {
75
+ name: "planka_update_list",
76
+ description: "Rename, reposition or reclassify a list (column). Verified against the board.",
77
+ inputSchema: {
78
+ type: "object",
79
+ properties: {
80
+ listId: { type: "string", description: "List ID" },
81
+ name: { type: "string", description: "New list name" },
82
+ position: { type: "number", description: "List position" },
83
+ type: listTypeProperty,
84
+ },
85
+ required: ["listId"],
86
+ },
87
+ handler: async (params) => guarded(async () => {
88
+ const updates = { listId: params.listId };
89
+ if (params.name !== undefined)
90
+ updates.name = params.name;
91
+ if (params.position !== undefined)
92
+ updates.position = params.position;
93
+ if (params.type !== undefined)
94
+ updates.type = params.type;
95
+ if (Object.keys(updates).length === 1) {
96
+ return nothingToDo("name, position, type");
97
+ }
98
+ const written = await verifiedWrite({
99
+ write: () => updateList(updates),
100
+ reread: (list) => getBoard({ boardId: list.boardId }),
101
+ landed: (board) => {
102
+ const list = board.lists.find((l) => l.id === params.listId);
103
+ if (!list)
104
+ return false;
105
+ if (updates.name !== undefined && list.name !== updates.name)
106
+ return false;
107
+ if (updates.position !== undefined &&
108
+ list.position !== updates.position)
109
+ return false;
110
+ if (updates.type !== undefined && list.type !== updates.type)
111
+ return false;
112
+ return true;
113
+ },
114
+ });
115
+ const onBoard = written.after?.lists.find((l) => l.id === params.listId);
116
+ return writeResult({
117
+ list: {
118
+ id: written.result.id,
119
+ name: onBoard?.name ?? written.result.name,
120
+ position: onBoard?.position ?? written.result.position,
121
+ type: onBoard?.type ?? written.result.type,
122
+ boardId: written.result.boardId,
123
+ },
124
+ }, written);
125
+ }),
126
+ };
127
+ /**
128
+ * Tool: planka_delete_list
129
+ */
130
+ export const deleteListTool = {
131
+ name: "planka_delete_list",
132
+ description: "Delete a list (column). DESTRUCTIVE: it deletes every card in it — move the cards out first with planka_move_list_cards. Confirmed by re-reading the board.",
133
+ inputSchema: {
134
+ type: "object",
135
+ properties: {
136
+ listId: { type: "string", description: "List ID" },
137
+ },
138
+ required: ["listId"],
139
+ },
140
+ handler: async (params) => guarded(async () => {
141
+ const deleted = await verifiedDelete({
142
+ del: () => deleteList({ listId: params.listId }),
143
+ confirmGone: async (list) => {
144
+ if (!list)
145
+ return null;
146
+ const board = await getBoard({ boardId: list.boardId });
147
+ return !board.lists.some((l) => l.id === params.listId);
148
+ },
149
+ unknownReason: "Planka did not echo the deleted list, so its board is unknown and the delete could not be confirmed — call planka_board_summary on the board to see whether the column is gone",
150
+ });
151
+ return writeResult({
152
+ listId: params.listId,
153
+ ...(deleted.result ? { boardId: deleted.result.boardId } : {}),
154
+ message: deleted.verified
155
+ ? `List ${params.listId} deleted, with every card it contained`
156
+ : `List ${params.listId} delete NOT confirmed — check with planka_board_summary before retrying`,
157
+ }, deleted);
158
+ }),
159
+ };
160
+ /**
161
+ * Tool: planka_manage_lists (DEPRECATED alias)
9
162
  */
10
163
  export const manageListsTool = {
11
164
  name: "planka_manage_lists",
12
- description: "Create, update, or delete lists on a board.",
165
+ description: "DEPRECATED: use planka_create_list / planka_update_list / planka_delete_list. Kept so existing callers keep working; it only routes `action` to those tools. delete still takes the column's cards with it.",
13
166
  inputSchema: {
14
167
  type: "object",
15
168
  properties: {
16
169
  action: {
17
170
  type: "string",
18
171
  enum: ["create", "update", "delete"],
19
- description: "Action to perform",
20
- },
21
- boardId: {
22
- type: "string",
23
- description: "Board ID (required for create)",
172
+ description: "Action. `delete` takes the list's cards with it.",
24
173
  },
174
+ boardId: { type: "string", description: "Board ID (required for create)" },
25
175
  listId: {
26
176
  type: "string",
27
177
  description: "List ID (required for update/delete)",
28
178
  },
29
- name: {
30
- type: "string",
31
- description: "List name",
32
- },
33
- position: {
34
- type: "number",
35
- description: "List position",
36
- },
37
- type: {
38
- type: "string",
39
- enum: ["active", "closed"],
40
- description: "List type. Defaults to active when creating.",
41
- },
179
+ name: { type: "string", description: "List name" },
180
+ position: { type: "number", description: "List position" },
181
+ type: listTypeProperty,
42
182
  },
43
183
  required: ["action"],
44
184
  },
45
- handler: async (params) => {
46
- try {
47
- switch (params.action) {
48
- case "create": {
49
- if (!params.boardId) {
50
- return {
51
- content: [
52
- {
53
- type: "text",
54
- text: "Error: boardId is required for create action",
55
- },
56
- ],
57
- isError: true,
58
- };
59
- }
60
- if (!params.name) {
61
- return {
62
- content: [
63
- {
64
- type: "text",
65
- text: "Error: name is required for create action",
66
- },
67
- ],
68
- isError: true,
69
- };
70
- }
71
- const list = await createList({
72
- boardId: params.boardId,
73
- name: params.name,
74
- position: params.position,
75
- type: params.type,
76
- });
77
- return {
78
- content: [
79
- {
80
- type: "text",
81
- text: JSON.stringify({
82
- success: true,
83
- list: {
84
- id: list.id,
85
- name: list.name,
86
- position: list.position,
87
- },
88
- }, null, 2),
89
- },
90
- ],
91
- };
92
- }
93
- case "update": {
94
- if (!params.listId) {
95
- return {
96
- content: [
97
- {
98
- type: "text",
99
- text: "Error: listId is required for update action",
100
- },
101
- ],
102
- isError: true,
103
- };
104
- }
105
- const updates = { listId: params.listId };
106
- if (params.name !== undefined)
107
- updates.name = params.name;
108
- if (params.position !== undefined)
109
- updates.position = params.position;
110
- if (params.type !== undefined)
111
- updates.type = params.type;
112
- const list = await updateList(updates);
113
- return {
114
- content: [
115
- {
116
- type: "text",
117
- text: JSON.stringify({
118
- success: true,
119
- list: {
120
- id: list.id,
121
- name: list.name,
122
- position: list.position,
123
- },
124
- }, null, 2),
125
- },
126
- ],
127
- };
128
- }
129
- case "delete": {
130
- if (!params.listId) {
131
- return {
132
- content: [
133
- {
134
- type: "text",
135
- text: "Error: listId is required for delete action",
136
- },
137
- ],
138
- isError: true,
139
- };
140
- }
141
- await deleteList({ listId: params.listId });
142
- return {
143
- content: [
144
- {
145
- type: "text",
146
- text: JSON.stringify({
147
- success: true,
148
- message: `List ${params.listId} deleted`,
149
- }, null, 2),
150
- },
151
- ],
152
- };
153
- }
154
- default:
155
- return {
156
- content: [
157
- {
158
- type: "text",
159
- text: `Error: Unknown action '${params.action}'`,
160
- },
161
- ],
162
- isError: true,
163
- };
164
- }
165
- }
166
- catch (error) {
167
- if (error instanceof PlankaError) {
168
- return {
169
- content: [{ type: "text", text: `Error: ${error.message}` }],
170
- isError: true,
171
- };
172
- }
173
- throw error;
174
- }
175
- },
185
+ handler: async (params) => dispatchAction("planka_manage_lists", params, {
186
+ create: createListTool,
187
+ update: updateListTool,
188
+ delete: deleteListTool,
189
+ }),
176
190
  };
177
- export const listTools = [manageListsTool];
191
+ export const listTools = [
192
+ createListTool,
193
+ updateListTool,
194
+ deleteListTool,
195
+ manageListsTool,
196
+ ];
178
197
  //# sourceMappingURL=lists.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"lists.js","sourceRoot":"","sources":["../../src/tools/lists.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"lists.js","sourceRoot":"","sources":["../../src/tools/lists.ts"],"names":[],"mappings":"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"}