@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 @@
1
+ {"version":3,"file":"members.js","sourceRoot":"","sources":["../../src/operations/members.ts"],"names":[],"mappings":"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"}
@@ -17,8 +17,24 @@ export declare function getProjects(): Promise<{
17
17
  projects: Project[];
18
18
  boards: Board[];
19
19
  }>;
20
+ /**
21
+ * Trims what Planka answered down to what this server is allowed to show.
22
+ *
23
+ * Filtering here (and not only at call time) is the point: an agent that
24
+ * cannot SEE the other boards never tries to touch them, and the error paths
25
+ * that list "known boards" stop leaking names from projects out of scope.
26
+ */
27
+ export declare function applyAllowlists(projects: Project[], boards: Board[]): {
28
+ projects: Project[];
29
+ boards: Board[];
30
+ };
20
31
  /**
21
32
  * Get the full structure: projects -> boards -> lists.
33
+ *
34
+ * `GET /api/projects` already carries every visible board, so with
35
+ * `withLists: false` the whole structure is ONE request. With lists (the
36
+ * default, kept so existing callers keep their column IDs) it costs one board
37
+ * read per board — the N+1 that `planka_board_summary` avoids.
22
38
  */
23
39
  export declare function getStructure(input?: GetStructureInput): Promise<ProjectStructure[]>;
24
40
  //# sourceMappingURL=projects.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"projects.d.ts","sourceRoot":"","sources":["../../src/operations/projects.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;AAE9D,OAAO,EAAsB,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAG/E;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,KAAK,CAAC;QACZ,KAAK,EAAE,KAAK,CAAC;QACb,KAAK,EAAE,IAAI,EAAE,CAAC;KACf,CAAC,CAAC;CACJ;AAED;;GAEG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC;IAC3C,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,MAAM,EAAE,KAAK,EAAE,CAAC;CACjB,CAAC,CAWD;AAED;;GAEG;AACH,wBAAsB,YAAY,CAChC,KAAK,GAAE,iBAAsB,GAC5B,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAkD7B"}
1
+ {"version":3,"file":"projects.d.ts","sourceRoot":"","sources":["../../src/operations/projects.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;AAE9D,OAAO,EAAsB,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAG/E;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,KAAK,CAAC;QACZ,KAAK,EAAE,KAAK,CAAC;QACb,KAAK,EAAE,IAAI,EAAE,CAAC;KACf,CAAC,CAAC;CACJ;AAED;;GAEG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC;IAC3C,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,MAAM,EAAE,KAAK,EAAE,CAAC;CACjB,CAAC,CAQD;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,OAAO,EAAE,EACnB,MAAM,EAAE,KAAK,EAAE,GACd;IAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;IAAC,MAAM,EAAE,KAAK,EAAE,CAAA;CAAE,CAoB1C;AAED;;;;;;;GAOG;AACH,wBAAsB,YAAY,CAChC,KAAK,GAAE,iBAAsB,GAC5B,OAAO,CAAC,gBAAgB,EAAE,CAAC,CA2E7B"}
@@ -2,7 +2,8 @@
2
2
  * Project operations for PLANKA API.
3
3
  */
4
4
  import { plankaClient } from "../client.js";
5
- import { parseInput } from "../errors.js";
5
+ import { parseInput, PlankaError } from "../errors.js";
6
+ import { assertProjectAllowed, getPolicy, isBoardAllowed, isProjectAllowed, } from "../config/policy.js";
6
7
  import { ProjectsResponse, ProjectsIncludedSchema } from "../schemas/responses.js";
7
8
  import { GetStructureSchema } from "../schemas/requests.js";
8
9
  import { z } from "zod";
@@ -13,26 +14,70 @@ export async function getProjects() {
13
14
  const response = await plankaClient.get("/api/projects");
14
15
  const parsed = ProjectsResponse.parse(response);
15
16
  const included = ProjectsIncludedSchema.parse(response.included || {});
16
- return {
17
- projects: parsed.items,
18
- boards: included.boards || [],
19
- };
17
+ return applyAllowlists(parsed.items, included.boards || []);
18
+ }
19
+ /**
20
+ * Trims what Planka answered down to what this server is allowed to show.
21
+ *
22
+ * Filtering here (and not only at call time) is the point: an agent that
23
+ * cannot SEE the other boards never tries to touch them, and the error paths
24
+ * that list "known boards" stop leaking names from projects out of scope.
25
+ */
26
+ export function applyAllowlists(projects, boards) {
27
+ const policy = getPolicy();
28
+ if (policy.allowedProjectIds === null && policy.allowedBoardIds === null) {
29
+ return { projects, boards };
30
+ }
31
+ let visibleProjects = projects.filter((p) => isProjectAllowed(p.id, policy));
32
+ const projectIds = new Set(visibleProjects.map((p) => p.id));
33
+ const visibleBoards = boards.filter((b) => projectIds.has(b.projectId) && isBoardAllowed(b.id, policy));
34
+ // With a board allowlist, a project with no allowed board is noise.
35
+ if (policy.allowedBoardIds !== null) {
36
+ const withBoards = new Set(visibleBoards.map((b) => b.projectId));
37
+ visibleProjects = visibleProjects.filter((p) => withBoards.has(p.id));
38
+ }
39
+ return { projects: visibleProjects, boards: visibleBoards };
20
40
  }
21
41
  /**
22
42
  * Get the full structure: projects -> boards -> lists.
43
+ *
44
+ * `GET /api/projects` already carries every visible board, so with
45
+ * `withLists: false` the whole structure is ONE request. With lists (the
46
+ * default, kept so existing callers keep their column IDs) it costs one board
47
+ * read per board — the N+1 that `planka_board_summary` avoids.
23
48
  */
24
49
  export async function getStructure(input = {}) {
25
- const { projectId } = parseInput(GetStructureSchema, input);
50
+ const { projectId, withLists } = parseInput(GetStructureSchema, input);
51
+ // Outside the allowlist: say so instead of answering an empty structure.
52
+ if (projectId)
53
+ assertProjectAllowed(projectId);
26
54
  const { projects, boards } = await getProjects();
27
55
  // Filter to specific project if requested
28
- const targetProjects = projectId
29
- ? projects.filter((p) => p.id === projectId)
30
- : projects;
56
+ let targetProjects = projects;
57
+ if (projectId) {
58
+ targetProjects = projects.filter((p) => p.id === projectId);
59
+ if (targetProjects.length === 0) {
60
+ const known = projects
61
+ .map((p) => ` - ${p.id} — "${p.name}"`)
62
+ .join("\n");
63
+ throw new PlankaError(`No project with id ${projectId} is visible to this account. ` +
64
+ (projects.length
65
+ ? `Visible projects:\n${known}`
66
+ : "No projects are visible at all — check the credentials and the board memberships of the Planka user."), "NOT_FOUND", 404);
67
+ }
68
+ }
31
69
  const structures = [];
32
70
  for (const project of targetProjects) {
33
71
  const projectBoards = boards.filter((b) => b.projectId === project.id);
34
72
  const boardsWithLists = [];
35
73
  for (const board of projectBoards) {
74
+ // Planka has no per-board list endpoint: the columns only come inside a
75
+ // full board read (every card, every attachment). One per board — so it
76
+ // only happens when the caller asked for the lists.
77
+ if (!withLists) {
78
+ boardsWithLists.push({ board, lists: [] });
79
+ continue;
80
+ }
36
81
  // Get board details to get lists
37
82
  const boardResponse = await plankaClient.get(`/api/boards/${board.id}`);
38
83
  const included = boardResponse.included;
@@ -1 +1 @@
1
- {"version":3,"file":"projects.js","sourceRoot":"","sources":["../../src/operations/projects.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"projects.js","sourceRoot":"","sources":["../../src/operations/projects.ts"],"names":[],"mappings":"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"}
@@ -22,7 +22,7 @@ export declare function updateTask(input: UpdateTaskParamsInput): Promise<Task>;
22
22
  /**
23
23
  * Delete a task.
24
24
  */
25
- export declare function deleteTask(input: TaskIdInput): Promise<void>;
25
+ export declare function deleteTask(input: TaskIdInput): Promise<Task | null>;
26
26
  /**
27
27
  * Delete a task-list and all its tasks.
28
28
  */
@@ -1 +1 @@
1
- {"version":3,"file":"tasks.d.ts","sourceRoot":"","sources":["../../src/operations/tasks.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAEL,qBAAqB,EAGrB,mBAAmB,EAEnB,eAAe,EAEf,WAAW,EAEX,eAAe,EAEf,qBAAqB,EACtB,MAAM,wBAAwB,CAAC;AAqChC;;GAEG;AACH,wBAAsB,cAAc,CAClC,KAAK,EAAE,mBAAmB,GACzB,OAAO,CAAC,QAAQ,CAAC,CAanB;AAED;;;GAGG;AACH,wBAAsB,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAkBtE;AAED;;;;GAIG;AACH,wBAAsB,WAAW,CAAC,KAAK,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,CA0B/E;AAED;;GAEG;AACH,wBAAsB,UAAU,CAC9B,KAAK,EAAE,qBAAqB,GAC3B,OAAO,CAAC,IAAI,CAAC,CAUf;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAGlE;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAG1E"}
1
+ {"version":3,"file":"tasks.d.ts","sourceRoot":"","sources":["../../src/operations/tasks.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAEL,qBAAqB,EAGrB,mBAAmB,EAEnB,eAAe,EAEf,WAAW,EAEX,eAAe,EAEf,qBAAqB,EACtB,MAAM,wBAAwB,CAAC;AAqChC;;GAEG;AACH,wBAAsB,cAAc,CAClC,KAAK,EAAE,mBAAmB,GACzB,OAAO,CAAC,QAAQ,CAAC,CAanB;AAED;;;GAGG;AACH,wBAAsB,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAkBtE;AAED;;;;GAIG;AACH,wBAAsB,WAAW,CAAC,KAAK,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,CA0B/E;AAED;;GAEG;AACH,wBAAsB,UAAU,CAC9B,KAAK,EAAE,qBAAqB,GAC3B,OAAO,CAAC,IAAI,CAAC,CAUf;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,CAKzE;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAG1E"}
@@ -9,7 +9,7 @@ import { plankaClient } from "../client.js";
9
9
  import { parseInput } from "../errors.js";
10
10
  import { BatchCreateTasksSchema, CreateTaskListSchema, CreateTaskSchema, TaskIdSchema, TaskListIdSchema, UpdateTaskParamsSchema, } from "../schemas/requests.js";
11
11
  import { TaskResponse, TaskListResponse } from "../schemas/responses.js";
12
- import { getCard } from "./cards.js";
12
+ import { getCardLight } from "./cards.js";
13
13
  const DEFAULT_TASK_LIST_NAME = "Tasks";
14
14
  /**
15
15
  * Get or create a default task-list for a card.
@@ -18,7 +18,7 @@ const DEFAULT_TASK_LIST_NAME = "Tasks";
18
18
  async function getOrCreateDefaultTaskList(input) {
19
19
  const { cardId } = input;
20
20
  // Fetch card to see existing task-lists
21
- const cardDetails = await getCard({ cardId });
21
+ const cardDetails = await getCardLight({ cardId });
22
22
  // Check if there's an existing task-list
23
23
  if (cardDetails.taskLists && cardDetails.taskLists.length > 0) {
24
24
  // Return the first task-list (sorted by position)
@@ -99,7 +99,9 @@ export async function updateTask(input) {
99
99
  */
100
100
  export async function deleteTask(input) {
101
101
  const { taskId } = parseInput(TaskIdSchema, input);
102
- await plankaClient.delete(`/api/tasks/${taskId}`);
102
+ const body = await plankaClient.delete(`/api/tasks/${taskId}`);
103
+ const parsed = TaskResponse.safeParse(body);
104
+ return parsed.success ? parsed.data.item : null;
103
105
  }
104
106
  /**
105
107
  * Delete a task-list and all its tasks.
@@ -1 +1 @@
1
- {"version":3,"file":"tasks.js","sourceRoot":"","sources":["../../src/operations/tasks.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,OAAO,EACL,sBAAsB,EAGtB,oBAAoB,EAEpB,gBAAgB,EAEhB,YAAY,EAEZ,gBAAgB,EAEhB,sBAAsB,GAEvB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AACzE,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAErC,MAAM,sBAAsB,GAAG,OAAO,CAAC;AAEvC;;;GAGG;AACH,KAAK,UAAU,0BAA0B,CACvC,KAAkB;IAElB,MAAM,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC;IAEzB,wCAAwC;IACxC,MAAM,WAAW,GAAG,MAAM,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;IAE9C,yCAAyC;IACzC,IAAI,WAAW,CAAC,SAAS,IAAI,WAAW,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9D,kDAAkD;QAClD,OAAO,WAAW,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1E,CAAC;IAED,6BAA6B;IAC7B,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,IAAI,CACtC,cAAc,MAAM,aAAa,EACjC;QACE,IAAI,EAAE,sBAAsB;QAC5B,QAAQ,EAAE,KAAK;KAChB,CACF,CAAC;IAEF,MAAM,MAAM,GAAG,gBAAgB,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAChD,OAAO,MAAM,CAAC,IAAI,CAAC;AACrB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,KAA0B;IAE1B,MAAM,SAAS,GAAG,UAAU,CAAC,oBAAoB,EAAE,KAAK,CAAC,CAAC;IAE1D,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,IAAI,CACtC,cAAc,SAAS,CAAC,MAAM,aAAa,EAC3C;QACE,IAAI,EAAE,SAAS,CAAC,IAAI;QACpB,QAAQ,EAAE,SAAS,CAAC,QAAQ;KAC7B,CACF,CAAC;IAEF,MAAM,MAAM,GAAG,gBAAgB,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAChD,OAAO,MAAM,CAAC,IAAI,CAAC;AACrB,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,KAAsB;IACrD,MAAM,SAAS,GAAG,UAAU,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC;IAEtD,0CAA0C;IAC1C,MAAM,QAAQ,GAAG,MAAM,0BAA0B,CAAC;QAChD,MAAM,EAAE,SAAS,CAAC,MAAM;KACzB,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,IAAI,CACtC,mBAAmB,QAAQ,CAAC,EAAE,QAAQ,EACtC;QACE,IAAI,EAAE,SAAS,CAAC,IAAI;QACpB,QAAQ,EAAE,SAAS,CAAC,QAAQ;KAC7B,CACF,CAAC;IAEF,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC5C,OAAO,MAAM,CAAC,IAAI,CAAC;AACrB,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,KAA4B;IAC5D,MAAM,SAAS,GAAG,UAAU,CAAC,sBAAsB,EAAE,KAAK,CAAC,CAAC;IAE5D,0CAA0C;IAC1C,MAAM,QAAQ,GAAG,MAAM,0BAA0B,CAAC;QAChD,MAAM,EAAE,SAAS,CAAC,MAAM;KACzB,CAAC,CAAC;IAEH,MAAM,KAAK,GAAW,EAAE,CAAC;IACzB,IAAI,QAAQ,GAAG,KAAK,CAAC;IAErB,KAAK,MAAM,SAAS,IAAI,SAAS,CAAC,KAAK,EAAE,CAAC;QACxC,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,IAAI,CACtC,mBAAmB,QAAQ,CAAC,EAAE,QAAQ,EACtC;YACE,IAAI,EAAE,SAAS,CAAC,IAAI;YACpB,QAAQ,EAAE,SAAS,CAAC,QAAQ,IAAI,QAAQ;SACzC,CACF,CAAC;QAEF,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC5C,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACxB,QAAQ,IAAI,KAAK,CAAC;IACpB,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,KAA4B;IAE5B,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,EAAE,GAAG,UAAU,CAAC,sBAAsB,EAAE,KAAK,CAAC,CAAC;IAEzE,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,KAAK,CACvC,cAAc,MAAM,EAAE,EACtB,OAAO,CACR,CAAC;IAEF,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC5C,OAAO,MAAM,CAAC,IAAI,CAAC;AACrB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,KAAkB;IACjD,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;IACnD,MAAM,YAAY,CAAC,MAAM,CAAC,cAAc,MAAM,EAAE,CAAC,CAAC;AACpD,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,KAAsB;IACzD,MAAM,EAAE,UAAU,EAAE,GAAG,UAAU,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC;IAC3D,MAAM,YAAY,CAAC,MAAM,CAAC,mBAAmB,UAAU,EAAE,CAAC,CAAC;AAC7D,CAAC"}
1
+ {"version":3,"file":"tasks.js","sourceRoot":"","sources":["../../src/operations/tasks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,123 @@
1
+ /**
2
+ * Who exists in this Planka, and who this server is logged in as.
3
+ *
4
+ * `GET /api/users` is admin-or-projectOwner only (`policies.js`): an agent
5
+ * running as the recommended `boardUser` gets 403 and would be left unable to
6
+ * assign anybody. So every read here has a board-scoped fallback — the board
7
+ * show carries `included.users` and `included.boardMemberships` for exactly
8
+ * the people who can be assigned on that board, which is the useful set anyway.
9
+ *
10
+ * The fallback is never silent: the result says `source: "board"` so a caller
11
+ * knows it is looking at the board's members, not the instance's roster.
12
+ */
13
+ import { z } from "zod";
14
+ declare const UserRowSchema: z.ZodObject<{
15
+ id: z.ZodString;
16
+ name: z.ZodOptional<z.ZodNullable<z.ZodString>>;
17
+ username: z.ZodOptional<z.ZodNullable<z.ZodString>>;
18
+ email: z.ZodOptional<z.ZodNullable<z.ZodString>>;
19
+ role: z.ZodOptional<z.ZodNullable<z.ZodString>>;
20
+ isDeactivated: z.ZodOptional<z.ZodNullable<z.ZodBoolean>>;
21
+ }, "passthrough", z.ZodTypeAny, z.objectOutputType<{
22
+ id: z.ZodString;
23
+ name: z.ZodOptional<z.ZodNullable<z.ZodString>>;
24
+ username: z.ZodOptional<z.ZodNullable<z.ZodString>>;
25
+ email: z.ZodOptional<z.ZodNullable<z.ZodString>>;
26
+ role: z.ZodOptional<z.ZodNullable<z.ZodString>>;
27
+ isDeactivated: z.ZodOptional<z.ZodNullable<z.ZodBoolean>>;
28
+ }, z.ZodTypeAny, "passthrough">, z.objectInputType<{
29
+ id: z.ZodString;
30
+ name: z.ZodOptional<z.ZodNullable<z.ZodString>>;
31
+ username: z.ZodOptional<z.ZodNullable<z.ZodString>>;
32
+ email: z.ZodOptional<z.ZodNullable<z.ZodString>>;
33
+ role: z.ZodOptional<z.ZodNullable<z.ZodString>>;
34
+ isDeactivated: z.ZodOptional<z.ZodNullable<z.ZodBoolean>>;
35
+ }, z.ZodTypeAny, "passthrough">>;
36
+ export type UserRow = z.infer<typeof UserRowSchema>;
37
+ declare const BoardMembershipSchema: z.ZodObject<{
38
+ id: z.ZodString;
39
+ boardId: z.ZodString;
40
+ userId: z.ZodString;
41
+ role: z.ZodOptional<z.ZodNullable<z.ZodString>>;
42
+ canComment: z.ZodOptional<z.ZodNullable<z.ZodBoolean>>;
43
+ }, "passthrough", z.ZodTypeAny, z.objectOutputType<{
44
+ id: z.ZodString;
45
+ boardId: z.ZodString;
46
+ userId: z.ZodString;
47
+ role: z.ZodOptional<z.ZodNullable<z.ZodString>>;
48
+ canComment: z.ZodOptional<z.ZodNullable<z.ZodBoolean>>;
49
+ }, z.ZodTypeAny, "passthrough">, z.objectInputType<{
50
+ id: z.ZodString;
51
+ boardId: z.ZodString;
52
+ userId: z.ZodString;
53
+ role: z.ZodOptional<z.ZodNullable<z.ZodString>>;
54
+ canComment: z.ZodOptional<z.ZodNullable<z.ZodBoolean>>;
55
+ }, z.ZodTypeAny, "passthrough">>;
56
+ export type BoardMembership = z.infer<typeof BoardMembershipSchema>;
57
+ /** One user, reduced to what an assignment decision needs. */
58
+ export interface UserDigest {
59
+ id: string;
60
+ name: string;
61
+ username?: string;
62
+ role?: string;
63
+ /** Only in the board-scoped view: "editor" | "viewer". */
64
+ boardRole?: string;
65
+ canComment?: boolean;
66
+ /** Only with detail: "full" — an address is PII, not a routing key. */
67
+ email?: string;
68
+ isDeactivated?: boolean;
69
+ }
70
+ export interface ListUsersResult {
71
+ /** "instance" = GET /api/users · "board" = the board's own members. */
72
+ source: "instance" | "board";
73
+ boardId?: string;
74
+ users: UserDigest[];
75
+ /** Set when the instance roster was refused and the board answered instead. */
76
+ fellBackBecause?: string;
77
+ }
78
+ /**
79
+ * Everyone this server can see, instance-wide when allowed and board-scoped
80
+ * otherwise.
81
+ */
82
+ export declare function listUsers(input?: {
83
+ boardId?: string;
84
+ detail?: "digest" | "full";
85
+ }): Promise<ListUsersResult>;
86
+ /** The board's own members, with their board role. */
87
+ export declare function listBoardUsers(input: {
88
+ boardId?: string;
89
+ detail?: "digest" | "full";
90
+ }): Promise<ListUsersResult>;
91
+ /** The account this server authenticates as. */
92
+ export declare function getCurrentUser(): Promise<UserRow>;
93
+ /**
94
+ * The Planka version.
95
+ *
96
+ * `/api/bootstrap` is the ONLY endpoint that carries it in 2.x — `/api/config`
97
+ * returns SMTP settings and nothing else, and `/swagger.json` is not served.
98
+ */
99
+ export declare function getPlankaVersion(): Promise<string | null>;
100
+ /**
101
+ * This user's membership on one board, read from `/api/projects` (3 kB) rather
102
+ * than from the board show (~900 kB): both carry `boardMemberships`.
103
+ */
104
+ export declare function getBoardMembership(input: {
105
+ boardId: string;
106
+ userId: string;
107
+ }): Promise<BoardMembership | null>;
108
+ /**
109
+ * Resolves names or usernames to user ids.
110
+ *
111
+ * Case-insensitive, exact match on `username` first and then on `name`. An
112
+ * ambiguous name is NOT guessed: assigning the wrong person is worse than
113
+ * failing, so it comes back in `failed`.
114
+ */
115
+ export declare function resolveUserNames(names: string[], users: UserDigest[]): {
116
+ ids: string[];
117
+ failed: Array<{
118
+ userName: string;
119
+ reason: string;
120
+ }>;
121
+ };
122
+ export {};
123
+ //# sourceMappingURL=users.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"users.d.ts","sourceRoot":"","sources":["../../src/operations/users.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB,QAAA,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;gCASH,CAAC;AACjB,MAAM,MAAM,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,CAAC;AAKpD,QAAA,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;gCAQX,CAAC;AACjB,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAyBpE,8DAA8D;AAC9D,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,0DAA0D;IAC1D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,uEAAuE;IACvE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,eAAe;IAC9B,uEAAuE;IACvE,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,+EAA+E;IAC/E,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AA0BD;;;GAGG;AACH,wBAAsB,SAAS,CAC7B,KAAK,GAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,QAAQ,GAAG,MAAM,CAAA;CAAO,GAC3D,OAAO,CAAC,eAAe,CAAC,CAqB1B;AAED,sDAAsD;AACtD,wBAAsB,cAAc,CAAC,KAAK,EAAE;IAC1C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,QAAQ,GAAG,MAAM,CAAC;CAC5B,GAAG,OAAO,CAAC,eAAe,CAAC,CAiB3B;AAED,gDAAgD;AAChD,wBAAsB,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC,CAGvD;AAED;;;;;GAKG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAG/D;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,CAAC,KAAK,EAAE;IAC9C,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAQlC;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,MAAM,EAAE,EACf,KAAK,EAAE,UAAU,EAAE,GAClB;IAAE,GAAG,EAAE,MAAM,EAAE,CAAC;IAAC,MAAM,EAAE,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,CAqCxE"}
@@ -0,0 +1,180 @@
1
+ /**
2
+ * Who exists in this Planka, and who this server is logged in as.
3
+ *
4
+ * `GET /api/users` is admin-or-projectOwner only (`policies.js`): an agent
5
+ * running as the recommended `boardUser` gets 403 and would be left unable to
6
+ * assign anybody. So every read here has a board-scoped fallback — the board
7
+ * show carries `included.users` and `included.boardMemberships` for exactly
8
+ * the people who can be assigned on that board, which is the useful set anyway.
9
+ *
10
+ * The fallback is never silent: the result says `source: "board"` so a caller
11
+ * knows it is looking at the board's members, not the instance's roster.
12
+ */
13
+ import { z } from "zod";
14
+ import { plankaClient } from "../client.js";
15
+ import { PlankaError } from "../errors.js";
16
+ import { withBoardId } from "./board-id.js";
17
+ const UserRowSchema = z
18
+ .object({
19
+ id: z.string(),
20
+ name: z.string().nullable().optional(),
21
+ username: z.string().nullable().optional(),
22
+ email: z.string().nullable().optional(),
23
+ role: z.string().nullable().optional(),
24
+ isDeactivated: z.boolean().nullable().optional(),
25
+ })
26
+ .passthrough();
27
+ const UsersResponse = z.object({ items: z.array(UserRowSchema) });
28
+ const UserResponse = z.object({ item: UserRowSchema });
29
+ const BoardMembershipSchema = z
30
+ .object({
31
+ id: z.string(),
32
+ boardId: z.string(),
33
+ userId: z.string(),
34
+ role: z.string().nullable().optional(),
35
+ canComment: z.boolean().nullable().optional(),
36
+ })
37
+ .passthrough();
38
+ const BoardUsersResponse = z.object({
39
+ included: z
40
+ .object({
41
+ users: z.array(UserRowSchema).optional(),
42
+ boardMemberships: z.array(BoardMembershipSchema).optional(),
43
+ })
44
+ .passthrough()
45
+ .optional(),
46
+ });
47
+ const ProjectsMembershipsResponse = z.object({
48
+ included: z
49
+ .object({
50
+ boardMemberships: z.array(BoardMembershipSchema).optional(),
51
+ })
52
+ .passthrough()
53
+ .optional(),
54
+ });
55
+ const BootstrapResponse = z.object({
56
+ item: z.object({ version: z.string().optional() }).passthrough(),
57
+ });
58
+ function digestUser(user, membership, full) {
59
+ return {
60
+ id: user.id,
61
+ name: user.name ?? user.username ?? user.id,
62
+ ...(user.username ? { username: user.username } : {}),
63
+ ...(user.role ? { role: user.role } : {}),
64
+ ...(membership?.role ? { boardRole: membership.role } : {}),
65
+ ...(membership && membership.canComment !== null && membership.canComment !== undefined
66
+ ? { canComment: membership.canComment }
67
+ : {}),
68
+ ...(full && user.email ? { email: user.email } : {}),
69
+ ...(user.isDeactivated ? { isDeactivated: true } : {}),
70
+ };
71
+ }
72
+ /** True for the 403 Planka answers a `boardUser` asking for the roster. */
73
+ function isForbidden(error) {
74
+ return error instanceof PlankaError && (error.status === 403 || error.status === 401);
75
+ }
76
+ /**
77
+ * Everyone this server can see, instance-wide when allowed and board-scoped
78
+ * otherwise.
79
+ */
80
+ export async function listUsers(input = {}) {
81
+ const full = input.detail === "full";
82
+ try {
83
+ const response = await plankaClient.get("/api/users");
84
+ const parsed = UsersResponse.parse(response);
85
+ return {
86
+ source: "instance",
87
+ users: parsed.items.map((user) => digestUser(user, undefined, full)),
88
+ };
89
+ }
90
+ catch (error) {
91
+ if (!isForbidden(error))
92
+ throw error;
93
+ const board = await listBoardUsers({ boardId: input.boardId, detail: input.detail });
94
+ return {
95
+ ...board,
96
+ fellBackBecause: "GET /api/users is admin-only and this account is not an admin; " +
97
+ "these are the members of the board instead.",
98
+ };
99
+ }
100
+ }
101
+ /** The board's own members, with their board role. */
102
+ export async function listBoardUsers(input) {
103
+ const full = input.detail === "full";
104
+ return withBoardId(input.boardId, async (boardId) => {
105
+ const response = await plankaClient.get(`/api/boards/${boardId}`);
106
+ const parsed = BoardUsersResponse.parse(response);
107
+ const memberships = parsed.included?.boardMemberships ?? [];
108
+ const byUser = new Map(memberships.map((m) => [m.userId, m]));
109
+ return {
110
+ source: "board",
111
+ boardId,
112
+ users: (parsed.included?.users ?? []).map((user) => digestUser(user, byUser.get(user.id), full)),
113
+ };
114
+ });
115
+ }
116
+ /** The account this server authenticates as. */
117
+ export async function getCurrentUser() {
118
+ const response = await plankaClient.get("/api/users/me");
119
+ return UserResponse.parse(response).item;
120
+ }
121
+ /**
122
+ * The Planka version.
123
+ *
124
+ * `/api/bootstrap` is the ONLY endpoint that carries it in 2.x — `/api/config`
125
+ * returns SMTP settings and nothing else, and `/swagger.json` is not served.
126
+ */
127
+ export async function getPlankaVersion() {
128
+ const response = await plankaClient.get("/api/bootstrap");
129
+ return BootstrapResponse.parse(response).item.version ?? null;
130
+ }
131
+ /**
132
+ * This user's membership on one board, read from `/api/projects` (3 kB) rather
133
+ * than from the board show (~900 kB): both carry `boardMemberships`.
134
+ */
135
+ export async function getBoardMembership(input) {
136
+ const response = await plankaClient.get("/api/projects");
137
+ const parsed = ProjectsMembershipsResponse.parse(response);
138
+ return ((parsed.included?.boardMemberships ?? []).find((m) => m.boardId === input.boardId && m.userId === input.userId) ?? null);
139
+ }
140
+ /**
141
+ * Resolves names or usernames to user ids.
142
+ *
143
+ * Case-insensitive, exact match on `username` first and then on `name`. An
144
+ * ambiguous name is NOT guessed: assigning the wrong person is worse than
145
+ * failing, so it comes back in `failed`.
146
+ */
147
+ export function resolveUserNames(names, users) {
148
+ const ids = [];
149
+ const failed = [];
150
+ for (const raw of names) {
151
+ const wanted = raw.trim().toLowerCase();
152
+ if (!wanted) {
153
+ failed.push({ userName: raw, reason: "empty name" });
154
+ continue;
155
+ }
156
+ const byUsername = users.filter((u) => u.username?.toLowerCase() === wanted);
157
+ const matches = byUsername.length > 0
158
+ ? byUsername
159
+ : users.filter((u) => u.name.toLowerCase() === wanted);
160
+ if (matches.length === 0) {
161
+ failed.push({
162
+ userName: raw,
163
+ reason: `no user named "${raw}" — call planka_list_users for the real names`,
164
+ });
165
+ continue;
166
+ }
167
+ if (matches.length > 1) {
168
+ failed.push({
169
+ userName: raw,
170
+ reason: `"${raw}" matches ${matches.length} users (${matches
171
+ .map((u) => u.id)
172
+ .join(", ")}); pass the userId`,
173
+ });
174
+ continue;
175
+ }
176
+ ids.push(matches[0].id);
177
+ }
178
+ return { ids, failed };
179
+ }
180
+ //# sourceMappingURL=users.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"users.js","sourceRoot":"","sources":["../../src/operations/users.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,84 @@
1
+ export interface VerifiedWriteResult<T, A> {
2
+ /** Whatever the write returned (usually Planka's `item`). */
3
+ result: T;
4
+ /** True only when the re-read confirmed the change. */
5
+ verified: boolean;
6
+ /** The re-read state, when the re-read succeeded. */
7
+ after?: A;
8
+ /** Set when the re-read itself blew up — the write may or may not have landed. */
9
+ verificationError?: string;
10
+ }
11
+ /**
12
+ * Run a write, re-read the entity, and report whether the change is really there.
13
+ *
14
+ * `landed` gets the re-read state and the write's own result; it answers the
15
+ * only question that matters: is what we asked for true now?
16
+ */
17
+ export declare function verifiedWrite<T, A>(opts: {
18
+ write: () => Promise<T>;
19
+ reread: (written: T) => Promise<A>;
20
+ landed: (after: A, written: T) => boolean;
21
+ }): Promise<VerifiedWriteResult<T, A>>;
22
+ export interface VerifiedDeleteResult<T> {
23
+ /** The DELETE response body (Planka 2.x returns the deleted item). */
24
+ result: T;
25
+ /** True only when a re-read confirmed the entity is gone. */
26
+ verified: boolean;
27
+ /** Set when the confirmation could not be made at all. */
28
+ verificationError?: string;
29
+ /** Set when confirmation was structurally impossible (missing parent id). */
30
+ verificationUnavailable?: string;
31
+ }
32
+ /**
33
+ * Run a delete and confirm the entity is really gone.
34
+ *
35
+ * `confirmGone` returns true (gone), false (still there) or null (could not
36
+ * check — e.g. the parent id needed for the re-read is unknown).
37
+ */
38
+ export declare function verifiedDelete<T>(opts: {
39
+ del: () => Promise<T>;
40
+ confirmGone: (deleted: T) => Promise<boolean | null>;
41
+ /** Message used when confirmGone answers null. */
42
+ unknownReason?: string;
43
+ }): Promise<VerifiedDeleteResult<T>>;
44
+ /**
45
+ * Confirmation helper for entities that have their own GET: a 404 on re-read
46
+ * is the proof of deletion. Any other failure propagates.
47
+ */
48
+ export declare function goneOn404(reread: () => Promise<unknown>): Promise<boolean>;
49
+ /**
50
+ * Standard tool payload for a write.
51
+ *
52
+ * `success` mirrors `verified` and nothing else. "I could not check" is not a
53
+ * success: a payload that says `success: true` next to `verified: false` and
54
+ * "delete not confirmed" is read by the model as done, and the model moves on.
55
+ *
56
+ * - verified → success, no isError
57
+ * - unavailable → success:false, verified:false, isError, and a
58
+ * `verificationUnavailable` that names the parameter
59
+ * which would have made the check possible
60
+ * - anything else → isError, because the write cannot be claimed
61
+ */
62
+ export declare function writeResult(payload: Record<string, unknown>, v: {
63
+ verified: boolean;
64
+ verificationError?: string;
65
+ verificationUnavailable?: string;
66
+ }): {
67
+ isError?: true | undefined;
68
+ content: {
69
+ type: "text";
70
+ text: string;
71
+ }[];
72
+ };
73
+ /**
74
+ * The "nothing to do" guard shared by the update tools: a PATCH with only an
75
+ * id is a no-op that Planka happily answers 200 to.
76
+ */
77
+ export declare function nothingToDo(fields: string, extra?: string): {
78
+ content: {
79
+ type: "text";
80
+ text: string;
81
+ }[];
82
+ isError: true;
83
+ };
84
+ //# sourceMappingURL=verify.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../../src/operations/verify.ts"],"names":[],"mappings":"AAkBA,MAAM,WAAW,mBAAmB,CAAC,CAAC,EAAE,CAAC;IACvC,6DAA6D;IAC7D,MAAM,EAAE,CAAC,CAAC;IACV,uDAAuD;IACvD,QAAQ,EAAE,OAAO,CAAC;IAClB,qDAAqD;IACrD,KAAK,CAAC,EAAE,CAAC,CAAC;IACV,kFAAkF;IAClF,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED;;;;;GAKG;AACH,wBAAsB,aAAa,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE;IAC9C,KAAK,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,CAAC;IACxB,MAAM,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC;IACnC,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,KAAK,OAAO,CAAC;CAC3C,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAerC;AAED,MAAM,WAAW,oBAAoB,CAAC,CAAC;IACrC,sEAAsE;IACtE,MAAM,EAAE,CAAC,CAAC;IACV,6DAA6D;IAC7D,QAAQ,EAAE,OAAO,CAAC;IAClB,0DAA0D;IAC1D,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,6EAA6E;IAC7E,uBAAuB,CAAC,EAAE,MAAM,CAAC;CAClC;AAED;;;;;GAKG;AACH,wBAAsB,cAAc,CAAC,CAAC,EAAE,IAAI,EAAE;IAC5C,GAAG,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,CAAC;IACtB,WAAW,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;IACrD,kDAAkD;IAClD,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,CAwBnC;AAED;;;GAGG;AACH,wBAAsB,SAAS,CAAC,MAAM,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAQhF;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,WAAW,CACzB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,CAAC,EAAE;IACD,QAAQ,EAAE,OAAO,CAAC;IAClB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,uBAAuB,CAAC,EAAE,MAAM,CAAC;CAClC;;;;;;EAgBF;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM;;;;;;EAUzD"}