@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,481 @@
1
+ /**
2
+ * `planka-mcp init` — write the MCP config for one client, or print it.
3
+ *
4
+ * Design rules, all of them learned the hard way:
5
+ *
6
+ * - **Never clobber.** Every emitter merges: an existing `planka` entry is
7
+ * reported and left alone rather than overwritten, and unrelated servers in
8
+ * the same file are preserved byte for byte.
9
+ * - **`--dry-run` and `--client print` write nothing** and need no credentials,
10
+ * so the command is safe to run just to see what it would do.
11
+ * - **The API key is preferred** over email + password: no login, no token
12
+ * refresh, and no sign-in rate limit when ten agents start at once.
13
+ * - **No secret ever reaches a shareable artifact.** The Cursor deeplink and
14
+ * every printed snippet carry placeholders; only files under the user's home
15
+ * get the real value, and those are written 0600.
16
+ */
17
+ import { spawnSync } from "node:child_process";
18
+ import { chmod, mkdir, readFile, writeFile } from "node:fs/promises";
19
+ import { homedir } from "node:os";
20
+ import { dirname, resolve } from "node:path";
21
+ import { PlankaClient } from "../client.js";
22
+ import { PACKAGE_NAME, SERVER_VERSION } from "../identity.generated.js";
23
+ export const CLIENTS = ["claude", "codex", "cursor", "vscode", "print"];
24
+ const KEY_PLACEHOLDER = "<your-planka-api-key>";
25
+ const URL_PLACEHOLDER = "https://planka.example.com";
26
+ export const USAGE = `planka-mcp init — configure this MCP server in your client
27
+
28
+ Usage:
29
+ npx ${PACKAGE_NAME} init [--client <name>] [options]
30
+
31
+ Clients:
32
+ claude Claude Code (claude mcp add, user scope)
33
+ codex Codex CLI (~/.codex/config.toml)
34
+ cursor Cursor (~/.cursor/mcp.json) and an "Add to Cursor" deeplink
35
+ vscode VS Code (.vscode/mcp.json, secret asked at startup)
36
+ print print every snippet, write nothing (default without a TTY)
37
+
38
+ Options:
39
+ --base-url <url> Planka origin, e.g. https://planka.example.com
40
+ --api-key <key> Planka API key (recommended)
41
+ --email <email> Agent email, only if you have no API key
42
+ --password <pass> Agent password, only if you have no API key
43
+ --board <id> Default board ID (PLANKA_DEFAULT_BOARD_ID)
44
+ --project-dir <dir> Where to write .vscode/mcp.json (default: cwd)
45
+ --dry-run Print what would be written, change nothing
46
+ -h, --help This text
47
+
48
+ With no flags and a terminal attached, init asks for what it needs.`;
49
+ /** Flags in, options out. Unknown flags are an error, not a silent no-op. */
50
+ export function parseInitArgs(argv) {
51
+ const options = {
52
+ client: "print",
53
+ dryRun: false,
54
+ projectDir: process.cwd(),
55
+ help: false,
56
+ };
57
+ let clientGiven = false;
58
+ const value = (index, flag) => {
59
+ const next = argv[index + 1];
60
+ if (next === undefined || next.startsWith("--")) {
61
+ throw new Error(`${flag} needs a value.`);
62
+ }
63
+ return next;
64
+ };
65
+ for (let index = 0; index < argv.length; index += 1) {
66
+ const flag = argv[index];
67
+ switch (flag) {
68
+ case "-h":
69
+ case "--help":
70
+ options.help = true;
71
+ break;
72
+ case "--dry-run":
73
+ options.dryRun = true;
74
+ break;
75
+ case "--client": {
76
+ const raw = value(index, flag);
77
+ if (!CLIENTS.includes(raw)) {
78
+ throw new Error(`Unknown client: ${raw}. Choose one of: ${CLIENTS.join(", ")}.`);
79
+ }
80
+ options.client = raw;
81
+ clientGiven = true;
82
+ index += 1;
83
+ break;
84
+ }
85
+ case "--base-url":
86
+ options.baseUrl = value(index, flag);
87
+ index += 1;
88
+ break;
89
+ case "--api-key":
90
+ options.apiKey = value(index, flag);
91
+ index += 1;
92
+ break;
93
+ case "--email":
94
+ options.email = value(index, flag);
95
+ index += 1;
96
+ break;
97
+ case "--password":
98
+ options.password = value(index, flag);
99
+ index += 1;
100
+ break;
101
+ case "--board":
102
+ options.boardId = value(index, flag);
103
+ index += 1;
104
+ break;
105
+ case "--project-dir":
106
+ options.projectDir = resolve(value(index, flag));
107
+ index += 1;
108
+ break;
109
+ default:
110
+ throw new Error(`Unknown option: ${flag}. Run init --help.`);
111
+ }
112
+ }
113
+ // Without --client and without a terminal to ask on, printing is the only
114
+ // honest default: writing someone's config from a script they did not aim is
115
+ // exactly the invasiveness this command is supposed to avoid.
116
+ if (!clientGiven && !process.stdin.isTTY)
117
+ options.client = "print";
118
+ return options;
119
+ }
120
+ /**
121
+ * The server entry every client gets, in MCP's `{command, args, env}` shape.
122
+ * `redacted` swaps the secret for a placeholder — that is the version that goes
123
+ * into anything printed, linked or committed.
124
+ */
125
+ export function serverSpec(options, redacted = false) {
126
+ const env = {
127
+ PLANKA_BASE_URL: options.baseUrl || URL_PLACEHOLDER,
128
+ };
129
+ if (options.apiKey || !(options.email && options.password)) {
130
+ env.PLANKA_API_KEY = redacted
131
+ ? KEY_PLACEHOLDER
132
+ : options.apiKey || KEY_PLACEHOLDER;
133
+ }
134
+ else {
135
+ env.PLANKA_AGENT_EMAIL = options.email;
136
+ env.PLANKA_AGENT_PASSWORD = redacted ? "<your-planka-password>" : options.password;
137
+ }
138
+ if (options.boardId)
139
+ env.PLANKA_DEFAULT_BOARD_ID = options.boardId;
140
+ return {
141
+ command: "npx",
142
+ args: ["-y", `${PACKAGE_NAME}@${SERVER_VERSION}`],
143
+ env,
144
+ };
145
+ }
146
+ /** `claude mcp add …`, ready to paste. */
147
+ export function claudeMcpAddCommand(spec) {
148
+ const envFlags = Object.entries(spec.env)
149
+ .map(([key, val]) => ` --env ${key}=${val} \\`)
150
+ .join("\n");
151
+ return [
152
+ "claude mcp add --scope user --transport stdio planka \\",
153
+ envFlags,
154
+ ` -- ${spec.command} ${spec.args.join(" ")}`,
155
+ ].join("\n");
156
+ }
157
+ /** The `[mcp_servers.planka]` block for `~/.codex/config.toml`. */
158
+ export function codexTomlBlock(spec) {
159
+ const envLines = Object.entries(spec.env)
160
+ .map(([key, val]) => `${key} = ${JSON.stringify(val)}`)
161
+ .join(", ");
162
+ return [
163
+ "[mcp_servers.planka]",
164
+ `command = ${JSON.stringify(spec.command)}`,
165
+ `args = [${spec.args.map((a) => JSON.stringify(a)).join(", ")}]`,
166
+ `env = { ${envLines} }`,
167
+ "",
168
+ ].join("\n");
169
+ }
170
+ /**
171
+ * Cursor's install deeplink. The base64 payload is the SERVER OBJECT ONLY —
172
+ * `{command, args, env}` with no name wrapper — and it never carries a real
173
+ * key: a deeplink ends up in browser history and in READMEs.
174
+ */
175
+ export function cursorDeeplink(spec) {
176
+ const config = Buffer.from(JSON.stringify(spec)).toString("base64");
177
+ return `cursor://anysphere.cursor-deeplink/mcp/install?name=planka&config=${config}`;
178
+ }
179
+ /** VS Code badge URL. Same payload, url-encoded instead of base64. */
180
+ export function vscodeBadgeUrl(spec) {
181
+ const config = encodeURIComponent(JSON.stringify({ ...spec, type: "stdio" }));
182
+ return `https://insiders.vscode.dev/redirect/mcp/install?name=planka&config=${config}`;
183
+ }
184
+ /**
185
+ * `.vscode/mcp.json`. The secret is an `inputs` promptString with
186
+ * `password: true`, so VS Code asks for it at startup and the committed file
187
+ * holds no credential.
188
+ */
189
+ export function vscodeConfig(options) {
190
+ const env = {
191
+ PLANKA_BASE_URL: options.baseUrl || URL_PLACEHOLDER,
192
+ PLANKA_API_KEY: "${input:planka_api_key}",
193
+ };
194
+ if (options.boardId)
195
+ env.PLANKA_DEFAULT_BOARD_ID = options.boardId;
196
+ return {
197
+ inputs: [
198
+ {
199
+ id: "planka_api_key",
200
+ type: "promptString",
201
+ description: "Planka API key (X-Api-Key) for the agent user",
202
+ password: true,
203
+ },
204
+ ],
205
+ servers: {
206
+ planka: {
207
+ type: "stdio",
208
+ command: "npx",
209
+ args: ["-y", `${PACKAGE_NAME}@${SERVER_VERSION}`],
210
+ env,
211
+ },
212
+ },
213
+ };
214
+ }
215
+ /**
216
+ * Merge a server entry into an `{mcpServers: …}` document without touching
217
+ * anything else. An existing `planka` entry wins: this command never silently
218
+ * replaces a config the user tuned by hand.
219
+ */
220
+ export function mergeMcpJson(document, spec, key = "mcpServers") {
221
+ const base = document && typeof document === "object" && !Array.isArray(document)
222
+ ? { ...document }
223
+ : {};
224
+ const servers = base[key] && typeof base[key] === "object" && !Array.isArray(base[key])
225
+ ? { ...base[key] }
226
+ : {};
227
+ if (servers.planka) {
228
+ base[key] = servers;
229
+ return { document: base, added: false };
230
+ }
231
+ servers.planka = { type: "stdio", ...spec };
232
+ base[key] = servers;
233
+ return { document: base, added: true };
234
+ }
235
+ /**
236
+ * Append the Codex block to an existing config.toml. Present already = leave it
237
+ * alone. TOML is edited as text on purpose: no parser here means no chance of
238
+ * rewriting (and reformatting, and losing the comments of) somebody's config.
239
+ */
240
+ export function mergeCodexToml(current, block) {
241
+ if (/^\s*\[mcp_servers\.planka\]\s*$/m.test(current)) {
242
+ return { text: current, added: false };
243
+ }
244
+ const prefix = current.length === 0 || current.endsWith("\n") ? "" : "\n";
245
+ const separator = current.trim().length === 0 ? "" : "\n";
246
+ return { text: `${current}${prefix}${separator}${block}`, added: true };
247
+ }
248
+ async function readJsonFile(path) {
249
+ try {
250
+ return JSON.parse(await readFile(path, "utf8"));
251
+ }
252
+ catch (error) {
253
+ const code = error.code;
254
+ if (code === "ENOENT")
255
+ return undefined;
256
+ throw new Error(`Cannot parse ${path}: ${error.message}`);
257
+ }
258
+ }
259
+ async function writePrivateJson(path, value) {
260
+ await mkdir(dirname(path), { recursive: true });
261
+ await writeFile(path, `${JSON.stringify(value, null, 2)}\n`, { mode: 0o600 });
262
+ await chmod(path, 0o600);
263
+ }
264
+ /**
265
+ * The connection smoke that `scripts/setup.mjs` has always run, reduced to its
266
+ * useful half: one authenticated GET. It proves the base URL is the API origin
267
+ * (not an SPA or a proxy page) and that the credential works, before anything
268
+ * is written. Never fatal — a config that cannot be verified is still worth
269
+ * writing, as long as we say so.
270
+ */
271
+ export async function checkConnection(options, fetchImpl = fetch) {
272
+ if (!options.baseUrl)
273
+ return { ok: false, detail: "no base URL given" };
274
+ if (!options.apiKey && !(options.email && options.password)) {
275
+ return { ok: false, detail: "no credentials given" };
276
+ }
277
+ const env = { PLANKA_BASE_URL: options.baseUrl };
278
+ if (options.apiKey)
279
+ env.PLANKA_API_KEY = options.apiKey;
280
+ else {
281
+ env.PLANKA_AGENT_EMAIL = options.email;
282
+ env.PLANKA_AGENT_PASSWORD = options.password;
283
+ }
284
+ try {
285
+ const client = new PlankaClient(env, fetchImpl);
286
+ const me = await client.get("/api/users/me");
287
+ const who = me?.item?.username || me?.item?.name || "the agent user";
288
+ return { ok: true, detail: `authenticated as ${who}` };
289
+ }
290
+ catch (error) {
291
+ return { ok: false, detail: error.message };
292
+ }
293
+ }
294
+ /** Fill in whatever is missing, but only when there is a terminal to ask on. */
295
+ async function promptMissing(options, ask) {
296
+ if (options.client === "print")
297
+ return;
298
+ if (!options.baseUrl) {
299
+ options.baseUrl =
300
+ (await ask("Planka base URL (https://…)")) || undefined;
301
+ }
302
+ if (!options.apiKey && !(options.email && options.password)) {
303
+ options.apiKey = (await ask("Planka API key (blank to use email + password)", true)) || undefined;
304
+ if (!options.apiKey) {
305
+ options.email = (await ask("Agent email or username")) || undefined;
306
+ options.password = (await ask("Agent password", true)) || undefined;
307
+ }
308
+ }
309
+ if (!options.boardId) {
310
+ options.boardId = (await ask("Default board ID (optional)")) || undefined;
311
+ }
312
+ }
313
+ function printAll(options, log) {
314
+ const spec = serverSpec(options, true);
315
+ log("# Claude Code (user scope)");
316
+ log(claudeMcpAddCommand(spec));
317
+ log("");
318
+ log("# Claude Code / Codex plugin (skills included)");
319
+ log("/plugin marketplace add omnicoreos/planka-mcp");
320
+ log("/plugin install planka@planka-mcp");
321
+ log("");
322
+ log("# Codex CLI — append to ~/.codex/config.toml");
323
+ log(codexTomlBlock(spec));
324
+ log("# Cursor — open this link (it carries no credential; Cursor asks)");
325
+ log(cursorDeeplink(spec));
326
+ log("");
327
+ log("# VS Code — .vscode/mcp.json (the key is asked at startup)");
328
+ log(JSON.stringify(vscodeConfig(options), null, 2));
329
+ }
330
+ /** Entry point. Returns the process exit code; never throws for user error. */
331
+ export async function runInit(argv, deps = {}) {
332
+ const log = deps.log ?? ((line) => console.log(line));
333
+ let options;
334
+ try {
335
+ options = parseInitArgs(argv);
336
+ }
337
+ catch (error) {
338
+ log(`init: ${error.message}`);
339
+ return 2;
340
+ }
341
+ if (options.help) {
342
+ log(USAGE);
343
+ return 0;
344
+ }
345
+ if (deps.ask && !options.dryRun)
346
+ await promptMissing(options, deps.ask);
347
+ if (options.client === "print") {
348
+ printAll(options, log);
349
+ return 0;
350
+ }
351
+ // The smoke: real credentials, one authenticated GET, before writing.
352
+ if (!options.dryRun) {
353
+ const check = deps.check ?? checkConnection;
354
+ const result = await check(options);
355
+ log(result.ok
356
+ ? `Planka reachable: ${result.detail}.`
357
+ : `Warning: could not verify the connection (${result.detail}). Writing the config anyway — fix the credentials and rerun to verify.`);
358
+ }
359
+ const spec = serverSpec(options);
360
+ const redacted = serverSpec(options, true);
361
+ switch (options.client) {
362
+ case "claude": {
363
+ const command = claudeMcpAddCommand(spec);
364
+ if (options.dryRun) {
365
+ log("Would run:");
366
+ log(claudeMcpAddCommand(redacted));
367
+ return 0;
368
+ }
369
+ const probe = spawnSync("claude", ["--version"], { encoding: "utf8" });
370
+ if (probe.error) {
371
+ log("Claude Code is not on PATH. Run this once it is installed:");
372
+ log(command);
373
+ return 0;
374
+ }
375
+ const args = [
376
+ "mcp",
377
+ "add",
378
+ "--scope",
379
+ "user",
380
+ "--transport",
381
+ "stdio",
382
+ "planka",
383
+ ...Object.entries(spec.env).flatMap(([key, val]) => [
384
+ "--env",
385
+ `${key}=${val}`,
386
+ ]),
387
+ "--",
388
+ spec.command,
389
+ ...spec.args,
390
+ ];
391
+ const added = spawnSync("claude", args, { encoding: "utf8" });
392
+ if (added.status !== 0) {
393
+ log(`claude mcp add failed: ${(added.stderr || added.stdout || "unknown error").trim()}`);
394
+ return 1;
395
+ }
396
+ log("Claude Code user configuration updated. Restart Claude Code.");
397
+ return 0;
398
+ }
399
+ case "codex": {
400
+ const block = codexTomlBlock(spec);
401
+ const path = resolve(homedir(), ".codex", "config.toml");
402
+ if (options.dryRun) {
403
+ log(`Would append to ${path}:`);
404
+ log(codexTomlBlock(redacted));
405
+ return 0;
406
+ }
407
+ let current = "";
408
+ try {
409
+ current = await readFile(path, "utf8");
410
+ }
411
+ catch (error) {
412
+ if (error.code !== "ENOENT")
413
+ throw error;
414
+ }
415
+ const merged = mergeCodexToml(current, block);
416
+ if (!merged.added) {
417
+ log(`${path} already has [mcp_servers.planka]. Left untouched; replace it by hand with:`);
418
+ log(block);
419
+ return 0;
420
+ }
421
+ await mkdir(dirname(path), { recursive: true });
422
+ await writeFile(path, merged.text, { mode: 0o600 });
423
+ log(`Appended [mcp_servers.planka] to ${path}. Restart Codex.`);
424
+ return 0;
425
+ }
426
+ case "cursor": {
427
+ const path = resolve(homedir(), ".cursor", "mcp.json");
428
+ if (options.dryRun) {
429
+ log(`Would merge into ${path}:`);
430
+ log(JSON.stringify(mergeMcpJson(undefined, redacted).document, null, 2));
431
+ log("");
432
+ log("Deeplink (no credential inside):");
433
+ log(cursorDeeplink(redacted));
434
+ return 0;
435
+ }
436
+ const merged = mergeMcpJson(await readJsonFile(path), spec);
437
+ if (!merged.added) {
438
+ log(`${path} already has an "planka" server. Left untouched.`);
439
+ }
440
+ else {
441
+ await writePrivateJson(path, merged.document);
442
+ log(`Merged into ${path} (0600). Restart Cursor.`);
443
+ }
444
+ log("");
445
+ log("Share this instead of the file — it carries no credential:");
446
+ log(cursorDeeplink(redacted));
447
+ return 0;
448
+ }
449
+ case "vscode": {
450
+ const path = resolve(options.projectDir, ".vscode", "mcp.json");
451
+ const config = vscodeConfig(options);
452
+ if (options.dryRun) {
453
+ log(`Would write ${path}:`);
454
+ log(JSON.stringify(config, null, 2));
455
+ return 0;
456
+ }
457
+ const existing = await readJsonFile(path);
458
+ if (existing &&
459
+ typeof existing === "object" &&
460
+ existing.servers?.planka) {
461
+ log(`${path} already has a "planka" server. Left untouched.`);
462
+ return 0;
463
+ }
464
+ const base = existing ?? {};
465
+ const document = {
466
+ ...base,
467
+ inputs: [
468
+ ...(base.inputs ?? []).filter((input) => input.id !== "planka_api_key"),
469
+ ...config.inputs,
470
+ ],
471
+ servers: { ...(base.servers ?? {}), ...config.servers },
472
+ };
473
+ await mkdir(dirname(path), { recursive: true });
474
+ await writeFile(path, `${JSON.stringify(document, null, 2)}\n`);
475
+ log(`Wrote ${path}. VS Code asks for the API key on first start.`);
476
+ return 0;
477
+ }
478
+ }
479
+ return 0;
480
+ }
481
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/cli/init.ts"],"names":[],"mappings":"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"}
package/dist/client.d.ts CHANGED
@@ -1,10 +1,21 @@
1
1
  export interface ClientConfig {
2
2
  baseUrl: string;
3
- email: string;
4
- password: string;
3
+ /**
4
+ * Planka API key (`X-Api-Key`). When present there is no login and no token
5
+ * refresh: the key is sent on every request, including binary downloads.
6
+ */
7
+ apiKey?: string;
8
+ email?: string;
9
+ password?: string;
5
10
  }
6
11
  export interface RequestOptions {
7
12
  token?: string;
13
+ /**
14
+ * Planka API key. Mutually exclusive with `token` by design: Planka reads
15
+ * `Authorization: Bearer` first and ignores `x-api-key` when both arrive
16
+ * (`server/api/hooks/current-user/index.js`).
17
+ */
18
+ apiKey?: string;
8
19
  body?: unknown;
9
20
  /**
10
21
  * Multipart body (attachment uploads). Content-Type is left unset on
@@ -53,6 +64,18 @@ export declare class PlankaClient {
53
64
  * Gets a valid token, refreshing if necessary.
54
65
  */
55
66
  private getToken;
67
+ /**
68
+ * The auth material for one request: an API key when configured (no login,
69
+ * no refresh), a bearer token otherwise. Never both — Planka ignores
70
+ * `x-api-key` whenever `Authorization` is present.
71
+ */
72
+ private authOptions;
73
+ /**
74
+ * A 200 carrying the SPA's HTML instead of JSON — Planka answers every
75
+ * unknown GET that way, and an http:// base URL redirected to https:// ends
76
+ * up here too. Indistinguishable from success if only the status is read.
77
+ */
78
+ private assertNotHtml;
56
79
  /**
57
80
  * Safely parses JSON from a response, returning null on failure.
58
81
  */
@@ -71,7 +94,7 @@ export declare class PlankaClient {
71
94
  * Authenticated binary download (attachment contents).
72
95
  * Accepts an absolute URL on the same host, or a relative path.
73
96
  */
74
- getBinary(urlOrPath: string): Promise<{
97
+ getBinary(urlOrPath: string, isRetry?: boolean): Promise<{
75
98
  bytes: Uint8Array;
76
99
  mimeType: string | null;
77
100
  }>;
@@ -89,8 +112,13 @@ export declare class PlankaClient {
89
112
  patch<T>(path: string, body: unknown): Promise<T>;
90
113
  /**
91
114
  * DELETE request.
115
+ *
116
+ * Returns the response body: Planka 2.x answers a delete with `{item}` of
117
+ * what it removed, and that item carries the parent id (cardId, boardId…)
118
+ * the caller needs to re-read the parent and prove the delete landed.
119
+ * Discarding it made every delete a blind `success: true`.
92
120
  */
93
- delete(path: string): Promise<void>;
121
+ delete<T = unknown>(path: string): Promise<T>;
94
122
  }
95
123
  export declare const plankaClient: PlankaClient;
96
124
  //# sourceMappingURL=client.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAWA,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,CAAC;IACf;;;OAGG;IACH,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB;;;;OAIG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,cAAmB,GAC3B,WAAW,CAkBb;AAED;;GAEG;AACH,wBAAgB,SAAS,CACvB,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,YAAY,CA6Bd;AAED;;GAEG;AACH,qBAAa,YAAY;IAMrB,OAAO,CAAC,QAAQ,CAAC,GAAG;IACpB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAN5B,OAAO,CAAC,MAAM,CAA6B;IAC3C,OAAO,CAAC,KAAK,CAAuB;IACpC,OAAO,CAAC,cAAc,CAAa;gBAGhB,GAAG,GAAE,MAAM,CAAC,UAAwB,EACpC,SAAS,GAAE,OAAO,KAAa;IAGlD;;OAEG;IACH,OAAO,CAAC,SAAS;IAOjB,sCAAsC;IACtC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,kBAAkB,CAAS;IAEnD;;;OAGG;IACH,OAAO,CAAC,mBAAmB;IAI3B;;OAEG;YACW,YAAY;IA+D1B;;OAEG;YACW,QAAQ;IAOtB;;OAEG;YACW,aAAa;IAQ3B;;;OAGG;YACW,OAAO;IA+CrB;;;OAGG;IACG,aAAa,CAAC,CAAC,EACnB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,QAAQ,EACd,OAAO,UAAQ,GACd,OAAO,CAAC,CAAC,CAAC;IAoCb;;;OAGG;IACG,SAAS,CACb,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC;QAAE,KAAK,EAAE,UAAU,CAAC;QAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;IAmC1D;;OAEG;IACG,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC;IAItC;;OAEG;IACG,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC;IAItD;;OAEG;IACG,KAAK,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC;IAIvD;;OAEG;IACG,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAG1C;AAGD,eAAO,MAAM,YAAY,cAAqB,CAAC"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAWA,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf;;;OAGG;IACH,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB;;;;OAIG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,cAAmB,GAC3B,WAAW,CAuBb;AAED;;GAEG;AACH,wBAAgB,SAAS,CACvB,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,YAAY,CA8Cd;AAED;;GAEG;AACH,qBAAa,YAAY;IAMrB,OAAO,CAAC,QAAQ,CAAC,GAAG;IACpB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAN5B,OAAO,CAAC,MAAM,CAA6B;IAC3C,OAAO,CAAC,KAAK,CAAuB;IACpC,OAAO,CAAC,cAAc,CAAa;gBAGhB,GAAG,GAAE,MAAM,CAAC,UAAwB,EACpC,SAAS,GAAE,OAAO,KAAa;IAGlD;;OAEG;IACH,OAAO,CAAC,SAAS;IAOjB,sCAAsC;IACtC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,kBAAkB,CAAS;IAEnD;;;OAGG;IACH,OAAO,CAAC,mBAAmB;IAI3B;;OAEG;YACW,YAAY;IAgE1B;;OAEG;YACW,QAAQ;IAOtB;;;;OAIG;YACW,WAAW;IAMzB;;;;OAIG;IACH,OAAO,CAAC,aAAa;IA+BrB;;OAEG;YACW,aAAa;IAQ3B;;;OAGG;YACW,OAAO;IAwDrB;;;OAGG;IACG,aAAa,CAAC,CAAC,EACnB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,QAAQ,EACd,OAAO,UAAQ,GACd,OAAO,CAAC,CAAC,CAAC;IA2Cb;;;OAGG;IACG,SAAS,CACb,SAAS,EAAE,MAAM,EACjB,OAAO,UAAQ,GACd,OAAO,CAAC;QAAE,KAAK,EAAE,UAAU,CAAC;QAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;IAiD1D;;OAEG;IACG,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC;IAItC;;OAEG;IACG,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC;IAItD;;OAEG;IACG,KAAK,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC;IAIvD;;;;;;;OAOG;IACG,MAAM,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC;CAGpD;AAGD,eAAO,MAAM,YAAY,cAAqB,CAAC"}