@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,15 +1,22 @@
1
1
  /**
2
2
  * Task tools for PLANKA MCP server.
3
+ *
4
+ * Tasks have no GET of their own in Planka 2.x: they are only visible through
5
+ * their card. So verification here needs a `cardId`; without it the tool says
6
+ * so instead of claiming success.
3
7
  */
4
8
  import { createTasks, updateTask, deleteTask } from "../operations/tasks.js";
9
+ import { getCardLight } from "../operations/cards.js";
10
+ import { nothingToDo, verifiedDelete, verifiedWrite, writeResult, } from "../operations/verify.js";
5
11
  import { PlankaError } from "../errors.js";
12
+ const NO_CARD_ID = "pass cardId to verify: Planka has no GET for a single task, so the card is the only place it can be re-read";
6
13
  /**
7
14
  * Tool: planka_create_tasks
8
15
  * Add one or more tasks (checklist items) to a card.
9
16
  */
10
17
  export const createTasksTool = {
11
18
  name: "planka_create_tasks",
12
- description: "Add one or more tasks (checklist items) to a card.",
19
+ description: "Add tasks (checklist items) to a card. Reports the tasks that actually landed.",
13
20
  inputSchema: {
14
21
  type: "object",
15
22
  properties: {
@@ -28,26 +35,29 @@ export const createTasksTool = {
28
35
  },
29
36
  handler: async (params) => {
30
37
  try {
31
- const tasks = await createTasks({
32
- cardId: params.cardId,
33
- tasks: params.tasks.map((name) => ({ name })),
38
+ const written = await verifiedWrite({
39
+ write: () => createTasks({
40
+ cardId: params.cardId,
41
+ tasks: params.tasks.map((name) => ({ name })),
42
+ }),
43
+ reread: () => getCardLight({ cardId: params.cardId }),
44
+ landed: (after, tasks) => tasks.length === params.tasks.length &&
45
+ tasks.every((t) => after.tasks.some((x) => x.id === t.id)),
34
46
  });
35
- return {
36
- content: [
37
- {
38
- type: "text",
39
- text: JSON.stringify({
40
- success: true,
41
- tasksCreated: tasks.length,
42
- tasks: tasks.map((t) => ({
43
- id: t.id,
44
- name: t.name,
45
- isCompleted: t.isCompleted,
46
- })),
47
- }, null, 2),
48
- },
49
- ],
50
- };
47
+ const after = written.after;
48
+ const onCard = after
49
+ ? written.result.filter((t) => after.tasks.some((x) => x.id === t.id))
50
+ : [];
51
+ return writeResult({
52
+ cardId: params.cardId,
53
+ tasksRequested: params.tasks.length,
54
+ tasksCreated: after ? onCard.length : 0,
55
+ tasks: (after ? onCard : written.result).map((t) => ({
56
+ id: t.id,
57
+ name: t.name,
58
+ isCompleted: t.isCompleted,
59
+ })),
60
+ }, written);
51
61
  }
52
62
  catch (error) {
53
63
  if (error instanceof PlankaError) {
@@ -66,7 +76,7 @@ export const createTasksTool = {
66
76
  */
67
77
  export const updateTaskTool = {
68
78
  name: "planka_update_task",
69
- description: "Update a task's name or completion status.",
79
+ description: "Update a task's name or completion. Pass cardId to have it verified.",
70
80
  inputSchema: {
71
81
  type: "object",
72
82
  properties: {
@@ -74,6 +84,10 @@ export const updateTaskTool = {
74
84
  type: "string",
75
85
  description: "The task ID",
76
86
  },
87
+ cardId: {
88
+ type: "string",
89
+ description: "The task's card. Without it the change cannot be verified.",
90
+ },
77
91
  name: {
78
92
  type: "string",
79
93
  description: "New task name",
@@ -87,29 +101,58 @@ export const updateTaskTool = {
87
101
  },
88
102
  handler: async (params) => {
89
103
  try {
90
- const { taskId, ...updates } = params;
91
- // Only include defined fields
92
- const patch = { taskId };
93
- if (updates.name !== undefined)
94
- patch.name = updates.name;
95
- if (updates.isCompleted !== undefined)
96
- patch.isCompleted = updates.isCompleted;
97
- const task = await updateTask(patch);
98
- return {
99
- content: [
100
- {
101
- type: "text",
102
- text: JSON.stringify({
103
- success: true,
104
- task: {
105
- id: task.id,
106
- name: task.name,
107
- isCompleted: task.isCompleted,
108
- },
109
- }, null, 2),
104
+ const patch = { taskId: params.taskId };
105
+ if (params.name !== undefined)
106
+ patch.name = params.name;
107
+ if (params.isCompleted !== undefined)
108
+ patch.isCompleted = params.isCompleted;
109
+ if (Object.keys(patch).length === 1) {
110
+ return nothingToDo("name, isCompleted");
111
+ }
112
+ const cardId = params.cardId;
113
+ if (!cardId) {
114
+ const task = await updateTask(patch);
115
+ return writeResult({
116
+ task: {
117
+ id: task.id,
118
+ name: task.name,
119
+ isCompleted: task.isCompleted,
110
120
  },
111
- ],
121
+ // Planka's echo of the PATCH, not a re-read: the write-echo trap
122
+ // documented in docs/planka-2x-gotchas.md. Labelled so the model
123
+ // does not mistake it for confirmed state.
124
+ taskFromWriteEcho: true,
125
+ message: `Task ${params.taskId} was sent to Planka but NOT verified. Call planka_update_task again with cardId, or planka_get_card, to confirm it landed.`,
126
+ }, { verified: false, verificationUnavailable: NO_CARD_ID });
127
+ }
128
+ const mismatches = (after) => {
129
+ const task = after.tasks.find((t) => t.id === params.taskId);
130
+ if (!task)
131
+ return ["task not found on the card"];
132
+ const bad = [];
133
+ if (patch.name !== undefined && task.name !== patch.name)
134
+ bad.push("name");
135
+ if (patch.isCompleted !== undefined &&
136
+ task.isCompleted !== patch.isCompleted)
137
+ bad.push("isCompleted");
138
+ return bad;
112
139
  };
140
+ const written = await verifiedWrite({
141
+ write: () => updateTask(patch),
142
+ reread: () => getCardLight({ cardId }),
143
+ landed: (after) => mismatches(after).length === 0,
144
+ });
145
+ const onCard = written.after?.tasks.find((t) => t.id === params.taskId);
146
+ const notLanded = written.after ? mismatches(written.after) : [];
147
+ return writeResult({
148
+ cardId,
149
+ task: {
150
+ id: written.result.id,
151
+ name: onCard?.name ?? written.result.name,
152
+ isCompleted: onCard?.isCompleted ?? written.result.isCompleted,
153
+ },
154
+ ...(notLanded.length > 0 ? { notLanded } : {}),
155
+ }, written);
113
156
  }
114
157
  catch (error) {
115
158
  if (error instanceof PlankaError) {
@@ -128,7 +171,7 @@ export const updateTaskTool = {
128
171
  */
129
172
  export const deleteTaskTool = {
130
173
  name: "planka_delete_task",
131
- description: "Delete a task from a card.",
174
+ description: "Delete a task. Pass cardId to have it verified.",
132
175
  inputSchema: {
133
176
  type: "object",
134
177
  properties: {
@@ -136,23 +179,35 @@ export const deleteTaskTool = {
136
179
  type: "string",
137
180
  description: "The task ID to delete",
138
181
  },
182
+ cardId: {
183
+ type: "string",
184
+ description: "The task's card. Without it the deletion cannot be verified.",
185
+ },
139
186
  },
140
187
  required: ["taskId"],
141
188
  },
142
189
  handler: async (params) => {
143
190
  try {
144
- await deleteTask({ taskId: params.taskId });
145
- return {
146
- content: [
147
- {
148
- type: "text",
149
- text: JSON.stringify({
150
- success: true,
151
- message: `Task ${params.taskId} deleted`,
152
- }, null, 2),
153
- },
154
- ],
155
- };
191
+ const cardId = params.cardId;
192
+ const deleted = await verifiedDelete({
193
+ del: () => deleteTask({ taskId: params.taskId }),
194
+ confirmGone: async () => {
195
+ if (!cardId)
196
+ return null;
197
+ const after = await getCardLight({ cardId });
198
+ return !after.tasks.some((t) => t.id === params.taskId);
199
+ },
200
+ unknownReason: NO_CARD_ID,
201
+ });
202
+ return writeResult({
203
+ taskId: params.taskId,
204
+ ...(cardId ? { cardId } : {}),
205
+ message: deleted.verified
206
+ ? `Task ${params.taskId} deleted`
207
+ : cardId
208
+ ? `Task ${params.taskId} delete NOT confirmed: it still reads on card ${cardId}`
209
+ : `Task ${params.taskId} delete NOT confirmed — pass cardId to have it verified, or read the card with planka_get_card`,
210
+ }, deleted);
156
211
  }
157
212
  catch (error) {
158
213
  if (error instanceof PlankaError) {
@@ -1 +1 @@
1
- {"version":3,"file":"tasks.js","sourceRoot":"","sources":["../../src/tools/tasks.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tasks.js","sourceRoot":"","sources":["../../src/tools/tasks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,130 @@
1
+ /**
2
+ * Tool: planka_list_users
3
+ */
4
+ export declare const listUsersTool: {
5
+ name: string;
6
+ description: string;
7
+ inputSchema: {
8
+ type: "object";
9
+ properties: {
10
+ boardId: {
11
+ type: string;
12
+ description: string;
13
+ };
14
+ detail: {
15
+ type: string;
16
+ enum: string[];
17
+ description: string;
18
+ };
19
+ };
20
+ };
21
+ handler: (params: {
22
+ boardId?: string;
23
+ detail?: "digest" | "full";
24
+ }) => Promise<{
25
+ content: {
26
+ type: "text";
27
+ text: string;
28
+ }[];
29
+ isError: true;
30
+ } | {
31
+ content: {
32
+ type: "text";
33
+ text: string;
34
+ }[];
35
+ }>;
36
+ };
37
+ /**
38
+ * Tool: planka_whoami
39
+ *
40
+ * The first call to make when something answers 404 that should not: it says
41
+ * which account this is, what it may do on the board, and what the local policy
42
+ * has switched off — the three usual causes of a confusing refusal.
43
+ */
44
+ export declare const whoamiTool: {
45
+ name: string;
46
+ description: string;
47
+ inputSchema: {
48
+ type: "object";
49
+ properties: {
50
+ boardId: {
51
+ type: string;
52
+ description: string;
53
+ };
54
+ };
55
+ };
56
+ handler: (params?: {
57
+ boardId?: string;
58
+ }) => Promise<{
59
+ content: {
60
+ type: "text";
61
+ text: string;
62
+ }[];
63
+ isError: true;
64
+ } | {
65
+ content: {
66
+ type: "text";
67
+ text: string;
68
+ }[];
69
+ }>;
70
+ };
71
+ export declare const userTools: ({
72
+ name: string;
73
+ description: string;
74
+ inputSchema: {
75
+ type: "object";
76
+ properties: {
77
+ boardId: {
78
+ type: string;
79
+ description: string;
80
+ };
81
+ detail: {
82
+ type: string;
83
+ enum: string[];
84
+ description: string;
85
+ };
86
+ };
87
+ };
88
+ handler: (params: {
89
+ boardId?: string;
90
+ detail?: "digest" | "full";
91
+ }) => Promise<{
92
+ content: {
93
+ type: "text";
94
+ text: string;
95
+ }[];
96
+ isError: true;
97
+ } | {
98
+ content: {
99
+ type: "text";
100
+ text: string;
101
+ }[];
102
+ }>;
103
+ } | {
104
+ name: string;
105
+ description: string;
106
+ inputSchema: {
107
+ type: "object";
108
+ properties: {
109
+ boardId: {
110
+ type: string;
111
+ description: string;
112
+ };
113
+ };
114
+ };
115
+ handler: (params?: {
116
+ boardId?: string;
117
+ }) => Promise<{
118
+ content: {
119
+ type: "text";
120
+ text: string;
121
+ }[];
122
+ isError: true;
123
+ } | {
124
+ content: {
125
+ type: "text";
126
+ text: string;
127
+ }[];
128
+ }>;
129
+ })[];
130
+ //# sourceMappingURL=users.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"users.d.ts","sourceRoot":"","sources":["../../src/tools/users.ts"],"names":[],"mappings":"AAuBA;;GAEG;AACH,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;sBAoBA;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,QAAQ,GAAG,MAAM,CAAA;KAAE;;;;;;;;;;;;CAyBzE,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,UAAU;;;;;;;;;;;;uBAcG;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE;;;;;;;;;;;;CAsF7C,CAAC;AAEF,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;sBAxII;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,QAAQ,GAAG,MAAM,CAAA;KAAE;;;;;;;;;;;;;;;;;;;;;;;;uBAgDhD;QAAE,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE;;;;;;;;;;;;IAwFM,CAAC"}
@@ -0,0 +1,165 @@
1
+ /**
2
+ * Identity tools: who can be assigned, and who this server is.
3
+ */
4
+ import { getBoardMembership, getCurrentUser, getPlankaVersion, listUsers, } from "../operations/users.js";
5
+ import { getConfig } from "../client.js";
6
+ import { getPolicy } from "../config/policy.js";
7
+ import { PlankaError } from "../errors.js";
8
+ function errorResult(error) {
9
+ if (error instanceof PlankaError) {
10
+ return {
11
+ content: [{ type: "text", text: `Error: ${error.message}` }],
12
+ isError: true,
13
+ };
14
+ }
15
+ throw error;
16
+ }
17
+ /**
18
+ * Tool: planka_list_users
19
+ */
20
+ export const listUsersTool = {
21
+ name: "planka_list_users",
22
+ description: "The people who can be assigned, with their IDs. Falls back to the board's members when this " +
23
+ "account may not read the instance roster, and says so in `source`. Emails only with detail: full.",
24
+ inputSchema: {
25
+ type: "object",
26
+ properties: {
27
+ boardId: {
28
+ type: "string",
29
+ description: "Board to fall back to when the instance roster is refused (403). Ignored otherwise.",
30
+ },
31
+ detail: {
32
+ type: "string",
33
+ enum: ["digest", "full"],
34
+ description: "digest (default) hides email addresses; full includes them.",
35
+ },
36
+ },
37
+ },
38
+ handler: async (params) => {
39
+ try {
40
+ const result = await listUsers({
41
+ boardId: params.boardId,
42
+ detail: params.detail,
43
+ });
44
+ return {
45
+ content: [
46
+ {
47
+ type: "text",
48
+ text: JSON.stringify({
49
+ source: result.source,
50
+ ...(result.boardId ? { boardId: result.boardId } : {}),
51
+ ...(result.fellBackBecause ? { note: result.fellBackBecause } : {}),
52
+ total: result.users.length,
53
+ users: result.users,
54
+ }),
55
+ },
56
+ ],
57
+ };
58
+ }
59
+ catch (error) {
60
+ return errorResult(error);
61
+ }
62
+ },
63
+ };
64
+ /**
65
+ * Tool: planka_whoami
66
+ *
67
+ * The first call to make when something answers 404 that should not: it says
68
+ * which account this is, what it may do on the board, and what the local policy
69
+ * has switched off — the three usual causes of a confusing refusal.
70
+ */
71
+ export const whoamiTool = {
72
+ name: "planka_whoami",
73
+ description: "This server's identity and limits: the Planka account, its board role, the Planka version, " +
74
+ "and the local access policy (default board, allowlist, read-only, disabled tools).",
75
+ inputSchema: {
76
+ type: "object",
77
+ properties: {
78
+ boardId: {
79
+ type: "string",
80
+ description: "Board to report membership for. Defaults to the configured board.",
81
+ },
82
+ },
83
+ },
84
+ handler: async (params = {}) => {
85
+ try {
86
+ const policy = getPolicy();
87
+ const user = await getCurrentUser();
88
+ let authMode = "unknown";
89
+ try {
90
+ authMode = getConfig().apiKey ? "apiKey" : "password";
91
+ }
92
+ catch {
93
+ // A config error would have stopped the call above; stay silent.
94
+ }
95
+ let plankaVersion = null;
96
+ let versionWarning;
97
+ try {
98
+ plankaVersion = await getPlankaVersion();
99
+ }
100
+ catch {
101
+ versionWarning = "The Planka version could not be read from /api/bootstrap.";
102
+ }
103
+ if (plankaVersion && !plankaVersion.startsWith("2.")) {
104
+ versionWarning =
105
+ `This server targets Planka 2.x and the instance reports ${plankaVersion}. ` +
106
+ `Endpoints, response shapes and the card-membership paths may differ.`;
107
+ }
108
+ const boardId = params?.boardId ?? policy.defaultBoardId ?? policy.allowedBoardIds?.[0] ?? null;
109
+ let boardMembership = null;
110
+ if (boardId) {
111
+ try {
112
+ const membership = await getBoardMembership({ boardId, userId: user.id });
113
+ boardMembership = membership
114
+ ? {
115
+ boardId,
116
+ role: membership.role ?? null,
117
+ canComment: membership.canComment ?? null,
118
+ }
119
+ : null;
120
+ }
121
+ catch {
122
+ boardMembership = null;
123
+ }
124
+ }
125
+ return {
126
+ content: [
127
+ {
128
+ type: "text",
129
+ text: JSON.stringify({
130
+ user: {
131
+ id: user.id,
132
+ name: user.name ?? user.username ?? user.id,
133
+ ...(user.username ? { username: user.username } : {}),
134
+ ...(user.role ? { role: user.role } : {}),
135
+ },
136
+ plankaVersion,
137
+ ...(versionWarning ? { versionWarning } : {}),
138
+ authMode,
139
+ boardMembership,
140
+ ...(boardId && !boardMembership
141
+ ? {
142
+ membershipNote: `No board membership found for this user on board ${boardId}. ` +
143
+ `An admin can still read it; a boardUser could not write to it.`,
144
+ }
145
+ : {}),
146
+ policy: {
147
+ defaultBoardId: policy.defaultBoardId,
148
+ allowedBoardIds: policy.allowedBoardIds,
149
+ allowedProjectIds: policy.allowedProjectIds,
150
+ readOnly: policy.readOnly,
151
+ disabledTools: policy.disabledTools,
152
+ protectedListIds: policy.protectedListIds,
153
+ },
154
+ }),
155
+ },
156
+ ],
157
+ };
158
+ }
159
+ catch (error) {
160
+ return errorResult(error);
161
+ }
162
+ },
163
+ };
164
+ export const userTools = [listUsersTool, whoamiTool];
165
+ //# sourceMappingURL=users.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"users.js","sourceRoot":"","sources":["../../src/tools/users.ts"],"names":[],"mappings":"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"}