@krodak/clickup-cli 0.17.0 → 0.19.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.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "clickup-cli",
3
- "description": "ClickUp CLI skills for managing tasks, sprints, comments, checklists, custom fields, tags, and time tracking via the cu command",
4
- "version": "0.17.0",
3
+ "description": "ClickUp CLI skills for managing tasks, sprints, comments, checklists, custom fields, tags, and time tracking via the cu/cup command",
4
+ "version": "0.19.0",
5
5
  "author": {
6
6
  "name": "Krzysztof Rodak"
7
7
  },
package/README.md CHANGED
@@ -11,6 +11,8 @@
11
11
  npm install -g @krodak/clickup-cli && cu init
12
12
  ```
13
13
 
14
+ Both `cu` and `cup` are installed as binaries. Use `cup` if `cu` conflicts with the Unix [cu(1)](<https://en.wikipedia.org/wiki/Cu_(Unix_utility)>) utility on your system. All examples below use `cu` but `cup` works identically.
15
+
14
16
  ## Talk to your agent
15
17
 
16
18
  Install the CLI, add the skill file to your agent, and it works with ClickUp. No API knowledge needed.
@@ -305,6 +307,23 @@ Environment variables override config file values:
305
307
 
306
308
  When both are set, the config file is not required. Useful for CI/CD and containerized agents.
307
309
 
310
+ ## Custom Task IDs
311
+
312
+ ClickUp workspaces can configure custom task IDs with a prefix per space (e.g., `PROJ-123`, `DEV-42`). The CLI detects these automatically - any ID matching the `PREFIX-DIGITS` format (uppercase letters, hyphen, digits) is treated as a custom task ID.
313
+
314
+ All commands that accept task IDs work with both native IDs and custom IDs:
315
+
316
+ ```bash
317
+ cu task PROJ-123
318
+ cu update DEV-42 --status done
319
+ cu comment PROJ-456 -m "Fixed in latest commit"
320
+ cu subtasks DEV-100
321
+ ```
322
+
323
+ Custom ID resolution uses the `teamId` from your config, which is required (`cu init` sets it up).
324
+
325
+ **Task links with custom IDs:** The `cu link` command passes both task IDs in a single API request. When both IDs are custom, this works correctly. However, mixing custom and native IDs in a single link command may not work as expected because the ClickUp API applies the `custom_task_ids` flag to all IDs in the request.
326
+
308
327
  ## Why a CLI and not MCP?
309
328
 
310
329
  A CLI + skill file has fewer moving parts. No server process, no protocol layer. The agent already knows how to run shell commands - the skill file teaches it which ones exist. For tool-use with coding agents, CLI + instructions tends to work better than MCP in practice.
package/dist/index.js CHANGED
@@ -1,17 +1,37 @@
1
1
  #!/usr/bin/env node
2
2
 
3
3
  // src/index.ts
4
+ import { basename } from "path";
4
5
  import { Command } from "commander";
5
6
  import { createRequire } from "module";
6
7
 
7
8
  // src/api.ts
8
9
  var BASE_URL = "https://api.clickup.com/api/v2";
9
10
  var MAX_PAGES = 100;
11
+ function isCustomTaskId(id) {
12
+ return /^[A-Z]+-\d+$/i.test(id);
13
+ }
10
14
  var ClickUpClient = class {
11
15
  apiToken;
16
+ teamId;
12
17
  meCache = null;
13
18
  constructor(config) {
14
19
  this.apiToken = config.apiToken;
20
+ this.teamId = config.teamId;
21
+ }
22
+ taskPath(taskId, suffix = "") {
23
+ const base = `/task/${taskId}${suffix}`;
24
+ if (isCustomTaskId(taskId) && this.teamId) {
25
+ const sep = base.includes("?") ? "&" : "?";
26
+ return `${base}${sep}custom_task_ids=true&team_id=${this.teamId}`;
27
+ }
28
+ return base;
29
+ }
30
+ customIdQueryParams(taskId) {
31
+ if (isCustomTaskId(taskId) && this.teamId) {
32
+ return `?custom_task_ids=true&team_id=${this.teamId}`;
33
+ }
34
+ return "";
15
35
  }
16
36
  async request(path, options = {}) {
17
37
  const res = await fetch(`${BASE_URL}${path}`, {
@@ -81,19 +101,19 @@ var ClickUpClient = class {
81
101
  });
82
102
  }
83
103
  async updateTask(taskId, options) {
84
- return this.request(`/task/${taskId}`, {
104
+ return this.request(this.taskPath(taskId), {
85
105
  method: "PUT",
86
106
  body: JSON.stringify(options)
87
107
  });
88
108
  }
89
109
  async postComment(taskId, commentText) {
90
- return this.request(`/task/${taskId}/comment`, {
110
+ return this.request(this.taskPath(taskId, "/comment"), {
91
111
  method: "POST",
92
112
  body: JSON.stringify({ comment_text: commentText })
93
113
  });
94
114
  }
95
115
  async getTaskComments(taskId) {
96
- const data = await this.request(`/task/${taskId}/comment`);
116
+ const data = await this.request(this.taskPath(taskId, "/comment"));
97
117
  return data.comments ?? [];
98
118
  }
99
119
  async getTasksFromList(listId, params = {}, options = {}) {
@@ -105,7 +125,7 @@ var ClickUpClient = class {
105
125
  });
106
126
  }
107
127
  async getTask(taskId) {
108
- return this.request(`/task/${taskId}?include_markdown_description=true`);
128
+ return this.request(this.taskPath(taskId, "?include_markdown_description=true"));
109
129
  }
110
130
  async createTask(listId, options) {
111
131
  return this.request(`/list/${listId}/task`, {
@@ -162,28 +182,32 @@ var ClickUpClient = class {
162
182
  await this.request(`/list/${listId}/task/${taskId}`, { method: "DELETE" });
163
183
  }
164
184
  async setCustomFieldValue(taskId, fieldId, value) {
165
- await this.request(`/task/${taskId}/field/${fieldId}`, {
185
+ await this.request(this.taskPath(taskId, `/field/${fieldId}`), {
166
186
  method: "POST",
167
187
  body: JSON.stringify({ value })
168
188
  });
169
189
  }
170
190
  async removeCustomFieldValue(taskId, fieldId) {
171
- await this.request(`/task/${taskId}/field/${fieldId}`, { method: "DELETE" });
191
+ await this.request(this.taskPath(taskId, `/field/${fieldId}`), { method: "DELETE" });
172
192
  }
173
193
  async deleteTask(taskId) {
174
- await this.request(`/task/${taskId}`, { method: "DELETE" });
194
+ await this.request(this.taskPath(taskId), { method: "DELETE" });
175
195
  }
176
196
  async addTagToTask(taskId, tagName) {
177
- await this.request(`/task/${taskId}/tag/${encodeURIComponent(tagName)}`, { method: "POST" });
197
+ await this.request(this.taskPath(taskId, `/tag/${encodeURIComponent(tagName)}`), {
198
+ method: "POST"
199
+ });
178
200
  }
179
201
  async removeTagFromTask(taskId, tagName) {
180
- await this.request(`/task/${taskId}/tag/${encodeURIComponent(tagName)}`, { method: "DELETE" });
202
+ await this.request(this.taskPath(taskId, `/tag/${encodeURIComponent(tagName)}`), {
203
+ method: "DELETE"
204
+ });
181
205
  }
182
206
  async addDependency(taskId, opts) {
183
207
  const body = {};
184
208
  if (opts.dependsOn) body.depends_on = opts.dependsOn;
185
209
  if (opts.dependencyOf) body.dependency_of = opts.dependencyOf;
186
- await this.request(`/task/${taskId}/dependency`, {
210
+ await this.request(this.taskPath(taskId, "/dependency"), {
187
211
  method: "POST",
188
212
  body: JSON.stringify(body)
189
213
  });
@@ -192,7 +216,7 @@ var ClickUpClient = class {
192
216
  const params = new URLSearchParams();
193
217
  if (opts.dependsOn) params.set("depends_on", opts.dependsOn);
194
218
  if (opts.dependencyOf) params.set("dependency_of", opts.dependencyOf);
195
- await this.request(`/task/${taskId}/dependency?${params.toString()}`, {
219
+ await this.request(this.taskPath(taskId, `/dependency?${params.toString()}`), {
196
220
  method: "DELETE"
197
221
  });
198
222
  }
@@ -218,17 +242,21 @@ var ClickUpClient = class {
218
242
  });
219
243
  }
220
244
  async addTaskLink(taskId, linksTo) {
221
- await this.request(`/task/${taskId}/link/${linksTo}`, { method: "POST" });
245
+ await this.request(this.taskPath(taskId, `/link/${linksTo}`), {
246
+ method: "POST"
247
+ });
222
248
  }
223
249
  async deleteTaskLink(taskId, linksTo) {
224
- await this.request(`/task/${taskId}/link/${linksTo}`, { method: "DELETE" });
250
+ await this.request(this.taskPath(taskId, `/link/${linksTo}`), {
251
+ method: "DELETE"
252
+ });
225
253
  }
226
254
  async getListCustomFields(listId) {
227
255
  const data = await this.request(`/list/${listId}/field`);
228
256
  return data.fields ?? [];
229
257
  }
230
258
  async createChecklist(taskId, name) {
231
- const data = await this.request(`/task/${taskId}/checklist`, {
259
+ const data = await this.request(this.taskPath(taskId, "/checklist"), {
232
260
  method: "POST",
233
261
  body: JSON.stringify({ name })
234
262
  });
@@ -264,10 +292,13 @@ var ClickUpClient = class {
264
292
  duration: -1
265
293
  };
266
294
  if (description) body.description = description;
267
- const data = await this.request(`/team/${teamId}/time_entries/start`, {
268
- method: "POST",
269
- body: JSON.stringify(body)
270
- });
295
+ const data = await this.request(
296
+ `/team/${teamId}/time_entries/start${this.customIdQueryParams(taskId)}`,
297
+ {
298
+ method: "POST",
299
+ body: JSON.stringify(body)
300
+ }
301
+ );
271
302
  return data.data;
272
303
  }
273
304
  async stopTimeEntry(teamId) {
@@ -290,10 +321,13 @@ var ClickUpClient = class {
290
321
  duration
291
322
  };
292
323
  if (opts?.description) body.description = opts.description;
293
- const data = await this.request(`/team/${teamId}/time_entries`, {
294
- method: "POST",
295
- body: JSON.stringify(body)
296
- });
324
+ const data = await this.request(
325
+ `/team/${teamId}/time_entries${this.customIdQueryParams(taskId)}`,
326
+ {
327
+ method: "POST",
328
+ body: JSON.stringify(body)
329
+ }
330
+ );
297
331
  return data.data;
298
332
  }
299
333
  async getTimeEntries(teamId, opts) {
@@ -316,12 +350,12 @@ var ClickUpClient = class {
316
350
  }
317
351
  async createTaskAttachment(taskId, filePath) {
318
352
  const { readFile } = await import("fs/promises");
319
- const { basename } = await import("path");
353
+ const { basename: basename2 } = await import("path");
320
354
  const fileBuffer = await readFile(filePath);
321
- const fileName = basename(filePath);
355
+ const fileName = basename2(filePath);
322
356
  const formData = new FormData();
323
357
  formData.append("attachment", new Blob([fileBuffer]), fileName);
324
- const res = await fetch(`${BASE_URL}/task/${taskId}/attachment`, {
358
+ const res = await fetch(`${BASE_URL}${this.taskPath(taskId, "/attachment")}`, {
325
359
  method: "POST",
326
360
  headers: { Authorization: this.apiToken },
327
361
  body: formData,
@@ -1597,7 +1631,7 @@ async function runAssignedCommand(config, opts) {
1597
1631
 
1598
1632
  // src/commands/open.ts
1599
1633
  function looksLikeTaskId(query) {
1600
- return /^[a-z0-9]+$/i.test(query) && query.length <= 12;
1634
+ return /^[a-z0-9]+$/i.test(query) && query.length <= 12 || isCustomTaskId(query);
1601
1635
  }
1602
1636
  async function openTask(config, query, opts = {}) {
1603
1637
  const client = new ClickUpClient(config);
@@ -1858,8 +1892,8 @@ ${commentsMd}`);
1858
1892
  }
1859
1893
 
1860
1894
  // src/commands/completion.ts
1861
- function bashCompletion() {
1862
- return `_cu_completions() {
1895
+ function bashCompletion(name) {
1896
+ return `_${name}_completions() {
1863
1897
  local cur prev words cword
1864
1898
 
1865
1899
  if type _init_completion &>/dev/null; then
@@ -2012,16 +2046,16 @@ function bashCompletion() {
2012
2046
  ;;
2013
2047
  esac
2014
2048
  }
2015
- complete -F _cu_completions cu
2049
+ complete -F _${name}_completions ${name}
2016
2050
  `;
2017
2051
  }
2018
- function zshCompletion() {
2019
- return `#compdef cu
2052
+ function zshCompletion(name) {
2053
+ return `#compdef ${name}
2020
2054
 
2021
- _cu() {
2055
+ _${name}() {
2022
2056
  local -a commands
2023
2057
  commands=(
2024
- 'init:Set up cu for the first time'
2058
+ 'init:Set up ${name} for the first time'
2025
2059
  'auth:Validate API token and show current user'
2026
2060
  'tasks:List tasks assigned to me'
2027
2061
  'task:Get task details'
@@ -2405,215 +2439,215 @@ _cu() {
2405
2439
  esac
2406
2440
  }
2407
2441
 
2408
- _cu
2442
+ _${name}
2409
2443
  `;
2410
2444
  }
2411
- function fishCompletion() {
2412
- return `complete -c cu -f
2413
-
2414
- complete -c cu -n __fish_use_subcommand -s h -l help -d 'Show help'
2415
- complete -c cu -n __fish_use_subcommand -s V -l version -d 'Show version'
2416
-
2417
- complete -c cu -n __fish_use_subcommand -a init -d 'Set up cu for the first time'
2418
- complete -c cu -n __fish_use_subcommand -a auth -d 'Validate API token and show current user'
2419
- complete -c cu -n __fish_use_subcommand -a tasks -d 'List tasks assigned to me'
2420
- complete -c cu -n __fish_use_subcommand -a task -d 'Get task details'
2421
- complete -c cu -n __fish_use_subcommand -a update -d 'Update a task'
2422
- complete -c cu -n __fish_use_subcommand -a create -d 'Create a new task'
2423
- complete -c cu -n __fish_use_subcommand -a sprint -d 'List my tasks in the current active sprint'
2424
- complete -c cu -n __fish_use_subcommand -a sprints -d 'List all sprints in sprint folders'
2425
- complete -c cu -n __fish_use_subcommand -a subtasks -d 'List subtasks of a task or initiative'
2426
- complete -c cu -n __fish_use_subcommand -a comment -d 'Post a comment on a task'
2427
- complete -c cu -n __fish_use_subcommand -a comments -d 'List comments on a task'
2428
- complete -c cu -n __fish_use_subcommand -a activity -d 'Show task details and comments combined'
2429
- complete -c cu -n __fish_use_subcommand -a lists -d 'List all lists in a space'
2430
- complete -c cu -n __fish_use_subcommand -a spaces -d 'List spaces in your workspace'
2431
- complete -c cu -n __fish_use_subcommand -a inbox -d 'Recently updated tasks grouped by time period'
2432
- complete -c cu -n __fish_use_subcommand -a assigned -d 'Show all tasks assigned to me'
2433
- complete -c cu -n __fish_use_subcommand -a open -d 'Open a task in the browser by ID or name'
2434
- complete -c cu -n __fish_use_subcommand -a search -d 'Search my tasks by name'
2435
- complete -c cu -n __fish_use_subcommand -a summary -d 'Daily standup summary'
2436
- complete -c cu -n __fish_use_subcommand -a overdue -d 'List tasks that are past their due date'
2437
- complete -c cu -n __fish_use_subcommand -a assign -d 'Assign or unassign users from a task'
2438
- complete -c cu -n __fish_use_subcommand -a depend -d 'Add or remove task dependencies'
2439
- complete -c cu -n __fish_use_subcommand -a move -d 'Add or remove a task from a list'
2440
- complete -c cu -n __fish_use_subcommand -a field -d 'Set or remove a custom field value on a task'
2441
- complete -c cu -n __fish_use_subcommand -a delete -d 'Delete a task'
2442
- complete -c cu -n __fish_use_subcommand -a tag -d 'Add or remove tags from a task'
2443
- complete -c cu -n __fish_use_subcommand -a checklist -d 'Manage checklists on a task'
2444
- complete -c cu -n __fish_use_subcommand -a time -d 'Track time on tasks'
2445
- complete -c cu -n __fish_use_subcommand -a comment-edit -d 'Edit an existing comment'
2446
- complete -c cu -n __fish_use_subcommand -a comment-delete -d 'Delete a comment'
2447
- complete -c cu -n __fish_use_subcommand -a replies -d 'List threaded replies on a comment'
2448
- complete -c cu -n __fish_use_subcommand -a reply -d 'Reply to a comment'
2449
- complete -c cu -n __fish_use_subcommand -a link -d 'Add or remove a link between two tasks'
2450
- complete -c cu -n __fish_use_subcommand -a attach -d 'Upload a file attachment to a task'
2451
- complete -c cu -n __fish_use_subcommand -a config -d 'Manage CLI configuration'
2452
- complete -c cu -n __fish_use_subcommand -a completion -d 'Output shell completion script'
2453
-
2454
- complete -c cu -n '__fish_seen_subcommand_from auth' -l json -d 'Force JSON output'
2455
-
2456
- complete -c cu -n '__fish_seen_subcommand_from tasks' -l status -d 'Filter by status'
2457
- complete -c cu -n '__fish_seen_subcommand_from tasks' -l list -d 'Filter by list ID'
2458
- complete -c cu -n '__fish_seen_subcommand_from tasks' -l space -d 'Filter by space ID'
2459
- complete -c cu -n '__fish_seen_subcommand_from tasks' -l name -d 'Filter by name'
2460
- complete -c cu -n '__fish_seen_subcommand_from tasks' -l type -d 'Filter by task type'
2461
- complete -c cu -n '__fish_seen_subcommand_from tasks' -l include-closed -d 'Include done/closed tasks'
2462
- complete -c cu -n '__fish_seen_subcommand_from tasks' -l json -d 'Force JSON output'
2463
-
2464
- complete -c cu -n '__fish_seen_subcommand_from task' -l json -d 'Force JSON output'
2465
-
2466
- complete -c cu -n '__fish_seen_subcommand_from update' -s n -l name -d 'New task name'
2467
- complete -c cu -n '__fish_seen_subcommand_from update' -s d -l description -d 'New description'
2468
- complete -c cu -n '__fish_seen_subcommand_from update' -s s -l status -d 'New status'
2469
- complete -c cu -n '__fish_seen_subcommand_from update' -l priority -d 'Priority level' -a 'urgent high normal low'
2470
- complete -c cu -n '__fish_seen_subcommand_from update' -l due-date -d 'Due date'
2471
- complete -c cu -n '__fish_seen_subcommand_from update' -l time-estimate -d 'Time estimate'
2472
- complete -c cu -n '__fish_seen_subcommand_from update' -l assignee -d 'Add assignee'
2473
- complete -c cu -n '__fish_seen_subcommand_from update' -l parent -d 'Set parent task'
2474
- complete -c cu -n '__fish_seen_subcommand_from update' -l json -d 'Force JSON output'
2475
-
2476
- complete -c cu -n '__fish_seen_subcommand_from create' -s l -l list -d 'Target list ID'
2477
- complete -c cu -n '__fish_seen_subcommand_from create' -s n -l name -d 'Task name'
2478
- complete -c cu -n '__fish_seen_subcommand_from create' -s d -l description -d 'Task description'
2479
- complete -c cu -n '__fish_seen_subcommand_from create' -s p -l parent -d 'Parent task ID'
2480
- complete -c cu -n '__fish_seen_subcommand_from create' -s s -l status -d 'Initial status'
2481
- complete -c cu -n '__fish_seen_subcommand_from create' -l priority -d 'Priority level' -a 'urgent high normal low'
2482
- complete -c cu -n '__fish_seen_subcommand_from create' -l due-date -d 'Due date'
2483
- complete -c cu -n '__fish_seen_subcommand_from create' -l assignee -d 'Assignee user ID'
2484
- complete -c cu -n '__fish_seen_subcommand_from create' -l tags -d 'Comma-separated tag names'
2485
- complete -c cu -n '__fish_seen_subcommand_from create' -l custom-item-id -d 'Custom task type ID'
2486
- complete -c cu -n '__fish_seen_subcommand_from create' -l time-estimate -d 'Time estimate'
2487
- complete -c cu -n '__fish_seen_subcommand_from create' -l json -d 'Force JSON output'
2488
-
2489
- complete -c cu -n '__fish_seen_subcommand_from sprint' -l status -d 'Filter by status'
2490
- complete -c cu -n '__fish_seen_subcommand_from sprint' -l space -d 'Narrow sprint search to a space'
2491
- complete -c cu -n '__fish_seen_subcommand_from sprint' -l include-closed -d 'Include done/closed tasks'
2492
- complete -c cu -n '__fish_seen_subcommand_from sprint' -l json -d 'Force JSON output'
2493
-
2494
- complete -c cu -n '__fish_seen_subcommand_from sprints' -l space -d 'Filter by space'
2495
- complete -c cu -n '__fish_seen_subcommand_from sprints' -l json -d 'Force JSON output'
2496
-
2497
- complete -c cu -n '__fish_seen_subcommand_from subtasks' -l status -d 'Filter by status'
2498
- complete -c cu -n '__fish_seen_subcommand_from subtasks' -l name -d 'Filter by name'
2499
- complete -c cu -n '__fish_seen_subcommand_from subtasks' -l include-closed -d 'Include closed/done subtasks'
2500
- complete -c cu -n '__fish_seen_subcommand_from subtasks' -l json -d 'Force JSON output'
2501
-
2502
- complete -c cu -n '__fish_seen_subcommand_from comment' -s m -l message -d 'Comment text'
2503
- complete -c cu -n '__fish_seen_subcommand_from comment' -l json -d 'Force JSON output'
2504
-
2505
- complete -c cu -n '__fish_seen_subcommand_from comments' -l json -d 'Force JSON output'
2506
-
2507
- complete -c cu -n '__fish_seen_subcommand_from activity' -l json -d 'Force JSON output'
2508
-
2509
- complete -c cu -n '__fish_seen_subcommand_from lists' -l name -d 'Filter by name'
2510
- complete -c cu -n '__fish_seen_subcommand_from lists' -l json -d 'Force JSON output'
2511
-
2512
- complete -c cu -n '__fish_seen_subcommand_from spaces' -l name -d 'Filter spaces by name'
2513
- complete -c cu -n '__fish_seen_subcommand_from spaces' -l my -d 'Show only spaces where I have assigned tasks'
2514
- complete -c cu -n '__fish_seen_subcommand_from spaces' -l json -d 'Force JSON output'
2515
-
2516
- complete -c cu -n '__fish_seen_subcommand_from inbox' -l include-closed -d 'Include done/closed tasks'
2517
- complete -c cu -n '__fish_seen_subcommand_from inbox' -l json -d 'Force JSON output'
2518
- complete -c cu -n '__fish_seen_subcommand_from inbox' -l days -d 'Lookback period in days'
2519
-
2520
- complete -c cu -n '__fish_seen_subcommand_from assigned' -l status -d 'Show only tasks with this status'
2521
- complete -c cu -n '__fish_seen_subcommand_from assigned' -l include-closed -d 'Include done/closed tasks'
2522
- complete -c cu -n '__fish_seen_subcommand_from assigned' -l json -d 'Force JSON output'
2523
-
2524
- complete -c cu -n '__fish_seen_subcommand_from open' -l json -d 'Output task JSON instead of opening'
2525
-
2526
- complete -c cu -n '__fish_seen_subcommand_from search' -l status -d 'Filter by status'
2527
- complete -c cu -n '__fish_seen_subcommand_from search' -l include-closed -d 'Include done/closed tasks in search'
2528
- complete -c cu -n '__fish_seen_subcommand_from search' -l json -d 'Force JSON output'
2529
-
2530
- complete -c cu -n '__fish_seen_subcommand_from summary' -l hours -d 'Completed-tasks lookback in hours'
2531
- complete -c cu -n '__fish_seen_subcommand_from summary' -l json -d 'Force JSON output'
2532
-
2533
- complete -c cu -n '__fish_seen_subcommand_from overdue' -l include-closed -d 'Include done/closed overdue tasks'
2534
- complete -c cu -n '__fish_seen_subcommand_from overdue' -l json -d 'Force JSON output'
2535
-
2536
- complete -c cu -n '__fish_seen_subcommand_from assign' -l to -d 'Add assignee'
2537
- complete -c cu -n '__fish_seen_subcommand_from assign' -l remove -d 'Remove assignee'
2538
- complete -c cu -n '__fish_seen_subcommand_from assign' -l json -d 'Force JSON output'
2539
-
2540
- complete -c cu -n '__fish_seen_subcommand_from depend' -l on -d 'Task that this task depends on'
2541
- complete -c cu -n '__fish_seen_subcommand_from depend' -l blocks -d 'Task that this task blocks'
2542
- complete -c cu -n '__fish_seen_subcommand_from depend' -l remove -d 'Remove the dependency'
2543
- complete -c cu -n '__fish_seen_subcommand_from depend' -l json -d 'Force JSON output'
2544
-
2545
- complete -c cu -n '__fish_seen_subcommand_from move' -l to -d 'Add task to this list'
2546
- complete -c cu -n '__fish_seen_subcommand_from move' -l remove -d 'Remove task from this list'
2547
- complete -c cu -n '__fish_seen_subcommand_from move' -l json -d 'Force JSON output'
2548
-
2549
- complete -c cu -n '__fish_seen_subcommand_from field' -l set -d 'Set field name and value'
2550
- complete -c cu -n '__fish_seen_subcommand_from field' -l remove -d 'Remove field value by name'
2551
- complete -c cu -n '__fish_seen_subcommand_from field' -l json -d 'Force JSON output'
2552
-
2553
- complete -c cu -n '__fish_seen_subcommand_from delete' -l confirm -d 'Skip confirmation prompt'
2554
- complete -c cu -n '__fish_seen_subcommand_from delete' -l json -d 'Force JSON output'
2555
-
2556
- complete -c cu -n '__fish_seen_subcommand_from tag' -l add -d 'Comma-separated tag names to add'
2557
- complete -c cu -n '__fish_seen_subcommand_from tag' -l remove -d 'Comma-separated tag names to remove'
2558
- complete -c cu -n '__fish_seen_subcommand_from tag' -l json -d 'Force JSON output'
2559
-
2560
- complete -c cu -n '__fish_seen_subcommand_from checklist; and not __fish_seen_subcommand_from view create delete add-item edit-item delete-item' -a view -d 'View checklists on a task'
2561
- complete -c cu -n '__fish_seen_subcommand_from checklist; and not __fish_seen_subcommand_from view create delete add-item edit-item delete-item' -a create -d 'Create a checklist on a task'
2562
- complete -c cu -n '__fish_seen_subcommand_from checklist; and not __fish_seen_subcommand_from view create delete add-item edit-item delete-item' -a delete -d 'Delete a checklist'
2563
- complete -c cu -n '__fish_seen_subcommand_from checklist; and not __fish_seen_subcommand_from view create delete add-item edit-item delete-item' -a add-item -d 'Add an item to a checklist'
2564
- complete -c cu -n '__fish_seen_subcommand_from checklist; and not __fish_seen_subcommand_from view create delete add-item edit-item delete-item' -a edit-item -d 'Edit a checklist item'
2565
- complete -c cu -n '__fish_seen_subcommand_from checklist; and not __fish_seen_subcommand_from view create delete add-item edit-item delete-item' -a delete-item -d 'Delete a checklist item'
2566
- complete -c cu -n '__fish_seen_subcommand_from view create delete add-item edit-item delete-item' -l json -d 'Force JSON output'
2567
- complete -c cu -n '__fish_seen_subcommand_from edit-item' -l name -d 'New item name'
2568
- complete -c cu -n '__fish_seen_subcommand_from edit-item' -l resolved -d 'Mark item as resolved'
2569
- complete -c cu -n '__fish_seen_subcommand_from edit-item' -l unresolved -d 'Mark item as unresolved'
2570
- complete -c cu -n '__fish_seen_subcommand_from edit-item' -l assignee -d 'Assign user by ID'
2571
-
2572
- complete -c cu -n '__fish_seen_subcommand_from time; and not __fish_seen_subcommand_from start stop status log list' -a start -d 'Start tracking time on a task'
2573
- complete -c cu -n '__fish_seen_subcommand_from time; and not __fish_seen_subcommand_from start stop status log list' -a stop -d 'Stop the running timer'
2574
- complete -c cu -n '__fish_seen_subcommand_from time; and not __fish_seen_subcommand_from start stop status log list' -a status -d 'Show the currently running timer'
2575
- complete -c cu -n '__fish_seen_subcommand_from time; and not __fish_seen_subcommand_from start stop status log list' -a log -d 'Log a manual time entry'
2576
- complete -c cu -n '__fish_seen_subcommand_from time; and not __fish_seen_subcommand_from start stop status log list' -a list -d 'List recent time entries'
2577
- complete -c cu -n '__fish_seen_subcommand_from start stop status log list; and __fish_seen_subcommand_from time' -l json -d 'Force JSON output'
2578
- complete -c cu -n '__fish_seen_subcommand_from start; and __fish_seen_subcommand_from time' -s d -l description -d 'Description'
2579
- complete -c cu -n '__fish_seen_subcommand_from log; and __fish_seen_subcommand_from time' -s d -l description -d 'Description'
2580
- complete -c cu -n '__fish_seen_subcommand_from list; and __fish_seen_subcommand_from time' -l days -d 'Number of days to look back'
2581
- complete -c cu -n '__fish_seen_subcommand_from list; and __fish_seen_subcommand_from time' -l task -d 'Filter by task ID'
2582
-
2583
- complete -c cu -n '__fish_seen_subcommand_from comment-delete' -l json -d 'Force JSON output'
2445
+ function fishCompletion(name) {
2446
+ return `complete -c ${name} -f
2447
+
2448
+ complete -c ${name} -n __fish_use_subcommand -s h -l help -d 'Show help'
2449
+ complete -c ${name} -n __fish_use_subcommand -s V -l version -d 'Show version'
2450
+
2451
+ complete -c ${name} -n __fish_use_subcommand -a init -d 'Set up ${name} for the first time'
2452
+ complete -c ${name} -n __fish_use_subcommand -a auth -d 'Validate API token and show current user'
2453
+ complete -c ${name} -n __fish_use_subcommand -a tasks -d 'List tasks assigned to me'
2454
+ complete -c ${name} -n __fish_use_subcommand -a task -d 'Get task details'
2455
+ complete -c ${name} -n __fish_use_subcommand -a update -d 'Update a task'
2456
+ complete -c ${name} -n __fish_use_subcommand -a create -d 'Create a new task'
2457
+ complete -c ${name} -n __fish_use_subcommand -a sprint -d 'List my tasks in the current active sprint'
2458
+ complete -c ${name} -n __fish_use_subcommand -a sprints -d 'List all sprints in sprint folders'
2459
+ complete -c ${name} -n __fish_use_subcommand -a subtasks -d 'List subtasks of a task or initiative'
2460
+ complete -c ${name} -n __fish_use_subcommand -a comment -d 'Post a comment on a task'
2461
+ complete -c ${name} -n __fish_use_subcommand -a comments -d 'List comments on a task'
2462
+ complete -c ${name} -n __fish_use_subcommand -a activity -d 'Show task details and comments combined'
2463
+ complete -c ${name} -n __fish_use_subcommand -a lists -d 'List all lists in a space'
2464
+ complete -c ${name} -n __fish_use_subcommand -a spaces -d 'List spaces in your workspace'
2465
+ complete -c ${name} -n __fish_use_subcommand -a inbox -d 'Recently updated tasks grouped by time period'
2466
+ complete -c ${name} -n __fish_use_subcommand -a assigned -d 'Show all tasks assigned to me'
2467
+ complete -c ${name} -n __fish_use_subcommand -a open -d 'Open a task in the browser by ID or name'
2468
+ complete -c ${name} -n __fish_use_subcommand -a search -d 'Search my tasks by name'
2469
+ complete -c ${name} -n __fish_use_subcommand -a summary -d 'Daily standup summary'
2470
+ complete -c ${name} -n __fish_use_subcommand -a overdue -d 'List tasks that are past their due date'
2471
+ complete -c ${name} -n __fish_use_subcommand -a assign -d 'Assign or unassign users from a task'
2472
+ complete -c ${name} -n __fish_use_subcommand -a depend -d 'Add or remove task dependencies'
2473
+ complete -c ${name} -n __fish_use_subcommand -a move -d 'Add or remove a task from a list'
2474
+ complete -c ${name} -n __fish_use_subcommand -a field -d 'Set or remove a custom field value on a task'
2475
+ complete -c ${name} -n __fish_use_subcommand -a delete -d 'Delete a task'
2476
+ complete -c ${name} -n __fish_use_subcommand -a tag -d 'Add or remove tags from a task'
2477
+ complete -c ${name} -n __fish_use_subcommand -a checklist -d 'Manage checklists on a task'
2478
+ complete -c ${name} -n __fish_use_subcommand -a time -d 'Track time on tasks'
2479
+ complete -c ${name} -n __fish_use_subcommand -a comment-edit -d 'Edit an existing comment'
2480
+ complete -c ${name} -n __fish_use_subcommand -a comment-delete -d 'Delete a comment'
2481
+ complete -c ${name} -n __fish_use_subcommand -a replies -d 'List threaded replies on a comment'
2482
+ complete -c ${name} -n __fish_use_subcommand -a reply -d 'Reply to a comment'
2483
+ complete -c ${name} -n __fish_use_subcommand -a link -d 'Add or remove a link between two tasks'
2484
+ complete -c ${name} -n __fish_use_subcommand -a attach -d 'Upload a file attachment to a task'
2485
+ complete -c ${name} -n __fish_use_subcommand -a config -d 'Manage CLI configuration'
2486
+ complete -c ${name} -n __fish_use_subcommand -a completion -d 'Output shell completion script'
2487
+
2488
+ complete -c ${name} -n '__fish_seen_subcommand_from auth' -l json -d 'Force JSON output'
2489
+
2490
+ complete -c ${name} -n '__fish_seen_subcommand_from tasks' -l status -d 'Filter by status'
2491
+ complete -c ${name} -n '__fish_seen_subcommand_from tasks' -l list -d 'Filter by list ID'
2492
+ complete -c ${name} -n '__fish_seen_subcommand_from tasks' -l space -d 'Filter by space ID'
2493
+ complete -c ${name} -n '__fish_seen_subcommand_from tasks' -l name -d 'Filter by name'
2494
+ complete -c ${name} -n '__fish_seen_subcommand_from tasks' -l type -d 'Filter by task type'
2495
+ complete -c ${name} -n '__fish_seen_subcommand_from tasks' -l include-closed -d 'Include done/closed tasks'
2496
+ complete -c ${name} -n '__fish_seen_subcommand_from tasks' -l json -d 'Force JSON output'
2497
+
2498
+ complete -c ${name} -n '__fish_seen_subcommand_from task' -l json -d 'Force JSON output'
2499
+
2500
+ complete -c ${name} -n '__fish_seen_subcommand_from update' -s n -l name -d 'New task name'
2501
+ complete -c ${name} -n '__fish_seen_subcommand_from update' -s d -l description -d 'New description'
2502
+ complete -c ${name} -n '__fish_seen_subcommand_from update' -s s -l status -d 'New status'
2503
+ complete -c ${name} -n '__fish_seen_subcommand_from update' -l priority -d 'Priority level' -a 'urgent high normal low'
2504
+ complete -c ${name} -n '__fish_seen_subcommand_from update' -l due-date -d 'Due date'
2505
+ complete -c ${name} -n '__fish_seen_subcommand_from update' -l time-estimate -d 'Time estimate'
2506
+ complete -c ${name} -n '__fish_seen_subcommand_from update' -l assignee -d 'Add assignee'
2507
+ complete -c ${name} -n '__fish_seen_subcommand_from update' -l parent -d 'Set parent task'
2508
+ complete -c ${name} -n '__fish_seen_subcommand_from update' -l json -d 'Force JSON output'
2509
+
2510
+ complete -c ${name} -n '__fish_seen_subcommand_from create' -s l -l list -d 'Target list ID'
2511
+ complete -c ${name} -n '__fish_seen_subcommand_from create' -s n -l name -d 'Task name'
2512
+ complete -c ${name} -n '__fish_seen_subcommand_from create' -s d -l description -d 'Task description'
2513
+ complete -c ${name} -n '__fish_seen_subcommand_from create' -s p -l parent -d 'Parent task ID'
2514
+ complete -c ${name} -n '__fish_seen_subcommand_from create' -s s -l status -d 'Initial status'
2515
+ complete -c ${name} -n '__fish_seen_subcommand_from create' -l priority -d 'Priority level' -a 'urgent high normal low'
2516
+ complete -c ${name} -n '__fish_seen_subcommand_from create' -l due-date -d 'Due date'
2517
+ complete -c ${name} -n '__fish_seen_subcommand_from create' -l assignee -d 'Assignee user ID'
2518
+ complete -c ${name} -n '__fish_seen_subcommand_from create' -l tags -d 'Comma-separated tag names'
2519
+ complete -c ${name} -n '__fish_seen_subcommand_from create' -l custom-item-id -d 'Custom task type ID'
2520
+ complete -c ${name} -n '__fish_seen_subcommand_from create' -l time-estimate -d 'Time estimate'
2521
+ complete -c ${name} -n '__fish_seen_subcommand_from create' -l json -d 'Force JSON output'
2522
+
2523
+ complete -c ${name} -n '__fish_seen_subcommand_from sprint' -l status -d 'Filter by status'
2524
+ complete -c ${name} -n '__fish_seen_subcommand_from sprint' -l space -d 'Narrow sprint search to a space'
2525
+ complete -c ${name} -n '__fish_seen_subcommand_from sprint' -l include-closed -d 'Include done/closed tasks'
2526
+ complete -c ${name} -n '__fish_seen_subcommand_from sprint' -l json -d 'Force JSON output'
2527
+
2528
+ complete -c ${name} -n '__fish_seen_subcommand_from sprints' -l space -d 'Filter by space'
2529
+ complete -c ${name} -n '__fish_seen_subcommand_from sprints' -l json -d 'Force JSON output'
2530
+
2531
+ complete -c ${name} -n '__fish_seen_subcommand_from subtasks' -l status -d 'Filter by status'
2532
+ complete -c ${name} -n '__fish_seen_subcommand_from subtasks' -l name -d 'Filter by name'
2533
+ complete -c ${name} -n '__fish_seen_subcommand_from subtasks' -l include-closed -d 'Include closed/done subtasks'
2534
+ complete -c ${name} -n '__fish_seen_subcommand_from subtasks' -l json -d 'Force JSON output'
2535
+
2536
+ complete -c ${name} -n '__fish_seen_subcommand_from comment' -s m -l message -d 'Comment text'
2537
+ complete -c ${name} -n '__fish_seen_subcommand_from comment' -l json -d 'Force JSON output'
2538
+
2539
+ complete -c ${name} -n '__fish_seen_subcommand_from comments' -l json -d 'Force JSON output'
2540
+
2541
+ complete -c ${name} -n '__fish_seen_subcommand_from activity' -l json -d 'Force JSON output'
2542
+
2543
+ complete -c ${name} -n '__fish_seen_subcommand_from lists' -l name -d 'Filter by name'
2544
+ complete -c ${name} -n '__fish_seen_subcommand_from lists' -l json -d 'Force JSON output'
2545
+
2546
+ complete -c ${name} -n '__fish_seen_subcommand_from spaces' -l name -d 'Filter spaces by name'
2547
+ complete -c ${name} -n '__fish_seen_subcommand_from spaces' -l my -d 'Show only spaces where I have assigned tasks'
2548
+ complete -c ${name} -n '__fish_seen_subcommand_from spaces' -l json -d 'Force JSON output'
2549
+
2550
+ complete -c ${name} -n '__fish_seen_subcommand_from inbox' -l include-closed -d 'Include done/closed tasks'
2551
+ complete -c ${name} -n '__fish_seen_subcommand_from inbox' -l json -d 'Force JSON output'
2552
+ complete -c ${name} -n '__fish_seen_subcommand_from inbox' -l days -d 'Lookback period in days'
2553
+
2554
+ complete -c ${name} -n '__fish_seen_subcommand_from assigned' -l status -d 'Show only tasks with this status'
2555
+ complete -c ${name} -n '__fish_seen_subcommand_from assigned' -l include-closed -d 'Include done/closed tasks'
2556
+ complete -c ${name} -n '__fish_seen_subcommand_from assigned' -l json -d 'Force JSON output'
2557
+
2558
+ complete -c ${name} -n '__fish_seen_subcommand_from open' -l json -d 'Output task JSON instead of opening'
2559
+
2560
+ complete -c ${name} -n '__fish_seen_subcommand_from search' -l status -d 'Filter by status'
2561
+ complete -c ${name} -n '__fish_seen_subcommand_from search' -l include-closed -d 'Include done/closed tasks in search'
2562
+ complete -c ${name} -n '__fish_seen_subcommand_from search' -l json -d 'Force JSON output'
2563
+
2564
+ complete -c ${name} -n '__fish_seen_subcommand_from summary' -l hours -d 'Completed-tasks lookback in hours'
2565
+ complete -c ${name} -n '__fish_seen_subcommand_from summary' -l json -d 'Force JSON output'
2566
+
2567
+ complete -c ${name} -n '__fish_seen_subcommand_from overdue' -l include-closed -d 'Include done/closed overdue tasks'
2568
+ complete -c ${name} -n '__fish_seen_subcommand_from overdue' -l json -d 'Force JSON output'
2569
+
2570
+ complete -c ${name} -n '__fish_seen_subcommand_from assign' -l to -d 'Add assignee'
2571
+ complete -c ${name} -n '__fish_seen_subcommand_from assign' -l remove -d 'Remove assignee'
2572
+ complete -c ${name} -n '__fish_seen_subcommand_from assign' -l json -d 'Force JSON output'
2573
+
2574
+ complete -c ${name} -n '__fish_seen_subcommand_from depend' -l on -d 'Task that this task depends on'
2575
+ complete -c ${name} -n '__fish_seen_subcommand_from depend' -l blocks -d 'Task that this task blocks'
2576
+ complete -c ${name} -n '__fish_seen_subcommand_from depend' -l remove -d 'Remove the dependency'
2577
+ complete -c ${name} -n '__fish_seen_subcommand_from depend' -l json -d 'Force JSON output'
2578
+
2579
+ complete -c ${name} -n '__fish_seen_subcommand_from move' -l to -d 'Add task to this list'
2580
+ complete -c ${name} -n '__fish_seen_subcommand_from move' -l remove -d 'Remove task from this list'
2581
+ complete -c ${name} -n '__fish_seen_subcommand_from move' -l json -d 'Force JSON output'
2582
+
2583
+ complete -c ${name} -n '__fish_seen_subcommand_from field' -l set -d 'Set field name and value'
2584
+ complete -c ${name} -n '__fish_seen_subcommand_from field' -l remove -d 'Remove field value by name'
2585
+ complete -c ${name} -n '__fish_seen_subcommand_from field' -l json -d 'Force JSON output'
2586
+
2587
+ complete -c ${name} -n '__fish_seen_subcommand_from delete' -l confirm -d 'Skip confirmation prompt'
2588
+ complete -c ${name} -n '__fish_seen_subcommand_from delete' -l json -d 'Force JSON output'
2589
+
2590
+ complete -c ${name} -n '__fish_seen_subcommand_from tag' -l add -d 'Comma-separated tag names to add'
2591
+ complete -c ${name} -n '__fish_seen_subcommand_from tag' -l remove -d 'Comma-separated tag names to remove'
2592
+ complete -c ${name} -n '__fish_seen_subcommand_from tag' -l json -d 'Force JSON output'
2593
+
2594
+ complete -c ${name} -n '__fish_seen_subcommand_from checklist; and not __fish_seen_subcommand_from view create delete add-item edit-item delete-item' -a view -d 'View checklists on a task'
2595
+ complete -c ${name} -n '__fish_seen_subcommand_from checklist; and not __fish_seen_subcommand_from view create delete add-item edit-item delete-item' -a create -d 'Create a checklist on a task'
2596
+ complete -c ${name} -n '__fish_seen_subcommand_from checklist; and not __fish_seen_subcommand_from view create delete add-item edit-item delete-item' -a delete -d 'Delete a checklist'
2597
+ complete -c ${name} -n '__fish_seen_subcommand_from checklist; and not __fish_seen_subcommand_from view create delete add-item edit-item delete-item' -a add-item -d 'Add an item to a checklist'
2598
+ complete -c ${name} -n '__fish_seen_subcommand_from checklist; and not __fish_seen_subcommand_from view create delete add-item edit-item delete-item' -a edit-item -d 'Edit a checklist item'
2599
+ complete -c ${name} -n '__fish_seen_subcommand_from checklist; and not __fish_seen_subcommand_from view create delete add-item edit-item delete-item' -a delete-item -d 'Delete a checklist item'
2600
+ complete -c ${name} -n '__fish_seen_subcommand_from view create delete add-item edit-item delete-item' -l json -d 'Force JSON output'
2601
+ complete -c ${name} -n '__fish_seen_subcommand_from edit-item' -l name -d 'New item name'
2602
+ complete -c ${name} -n '__fish_seen_subcommand_from edit-item' -l resolved -d 'Mark item as resolved'
2603
+ complete -c ${name} -n '__fish_seen_subcommand_from edit-item' -l unresolved -d 'Mark item as unresolved'
2604
+ complete -c ${name} -n '__fish_seen_subcommand_from edit-item' -l assignee -d 'Assign user by ID'
2605
+
2606
+ complete -c ${name} -n '__fish_seen_subcommand_from time; and not __fish_seen_subcommand_from start stop status log list' -a start -d 'Start tracking time on a task'
2607
+ complete -c ${name} -n '__fish_seen_subcommand_from time; and not __fish_seen_subcommand_from start stop status log list' -a stop -d 'Stop the running timer'
2608
+ complete -c ${name} -n '__fish_seen_subcommand_from time; and not __fish_seen_subcommand_from start stop status log list' -a status -d 'Show the currently running timer'
2609
+ complete -c ${name} -n '__fish_seen_subcommand_from time; and not __fish_seen_subcommand_from start stop status log list' -a log -d 'Log a manual time entry'
2610
+ complete -c ${name} -n '__fish_seen_subcommand_from time; and not __fish_seen_subcommand_from start stop status log list' -a list -d 'List recent time entries'
2611
+ complete -c ${name} -n '__fish_seen_subcommand_from start stop status log list; and __fish_seen_subcommand_from time' -l json -d 'Force JSON output'
2612
+ complete -c ${name} -n '__fish_seen_subcommand_from start; and __fish_seen_subcommand_from time' -s d -l description -d 'Description'
2613
+ complete -c ${name} -n '__fish_seen_subcommand_from log; and __fish_seen_subcommand_from time' -s d -l description -d 'Description'
2614
+ complete -c ${name} -n '__fish_seen_subcommand_from list; and __fish_seen_subcommand_from time' -l days -d 'Number of days to look back'
2615
+ complete -c ${name} -n '__fish_seen_subcommand_from list; and __fish_seen_subcommand_from time' -l task -d 'Filter by task ID'
2616
+
2617
+ complete -c ${name} -n '__fish_seen_subcommand_from comment-delete' -l json -d 'Force JSON output'
2584
2618
 
2585
- complete -c cu -n '__fish_seen_subcommand_from replies' -l json -d 'Force JSON output'
2619
+ complete -c ${name} -n '__fish_seen_subcommand_from replies' -l json -d 'Force JSON output'
2586
2620
 
2587
- complete -c cu -n '__fish_seen_subcommand_from reply' -s m -l message -d 'Reply text'
2588
- complete -c cu -n '__fish_seen_subcommand_from reply' -l json -d 'Force JSON output'
2621
+ complete -c ${name} -n '__fish_seen_subcommand_from reply' -s m -l message -d 'Reply text'
2622
+ complete -c ${name} -n '__fish_seen_subcommand_from reply' -l json -d 'Force JSON output'
2589
2623
 
2590
- complete -c cu -n '__fish_seen_subcommand_from link' -l remove -d 'Remove the link'
2591
- complete -c cu -n '__fish_seen_subcommand_from link' -l json -d 'Force JSON output'
2624
+ complete -c ${name} -n '__fish_seen_subcommand_from link' -l remove -d 'Remove the link'
2625
+ complete -c ${name} -n '__fish_seen_subcommand_from link' -l json -d 'Force JSON output'
2592
2626
 
2593
- complete -c cu -n '__fish_seen_subcommand_from attach' -l json -d 'Force JSON output'
2594
- complete -c cu -n '__fish_seen_subcommand_from attach' -F
2627
+ complete -c ${name} -n '__fish_seen_subcommand_from attach' -l json -d 'Force JSON output'
2628
+ complete -c ${name} -n '__fish_seen_subcommand_from attach' -F
2595
2629
 
2596
- complete -c cu -n '__fish_seen_subcommand_from comment-edit' -s m -l message -d 'New comment text'
2597
- complete -c cu -n '__fish_seen_subcommand_from comment-edit' -l resolved -d 'Mark comment as resolved'
2598
- complete -c cu -n '__fish_seen_subcommand_from comment-edit' -l unresolved -d 'Mark comment as unresolved'
2599
- complete -c cu -n '__fish_seen_subcommand_from comment-edit' -l json -d 'Force JSON output'
2630
+ complete -c ${name} -n '__fish_seen_subcommand_from comment-edit' -s m -l message -d 'New comment text'
2631
+ complete -c ${name} -n '__fish_seen_subcommand_from comment-edit' -l resolved -d 'Mark comment as resolved'
2632
+ complete -c ${name} -n '__fish_seen_subcommand_from comment-edit' -l unresolved -d 'Mark comment as unresolved'
2633
+ complete -c ${name} -n '__fish_seen_subcommand_from comment-edit' -l json -d 'Force JSON output'
2600
2634
 
2601
- complete -c cu -n '__fish_seen_subcommand_from config; and not __fish_seen_subcommand_from get set path' -a get -d 'Print a config value'
2602
- complete -c cu -n '__fish_seen_subcommand_from config; and not __fish_seen_subcommand_from get set path' -a set -d 'Set a config value'
2603
- complete -c cu -n '__fish_seen_subcommand_from config; and not __fish_seen_subcommand_from get set path' -a path -d 'Print config file path'
2604
- complete -c cu -n '__fish_seen_subcommand_from get set' -a 'apiToken teamId' -d 'Config key'
2635
+ complete -c ${name} -n '__fish_seen_subcommand_from config; and not __fish_seen_subcommand_from get set path' -a get -d 'Print a config value'
2636
+ complete -c ${name} -n '__fish_seen_subcommand_from config; and not __fish_seen_subcommand_from get set path' -a set -d 'Set a config value'
2637
+ complete -c ${name} -n '__fish_seen_subcommand_from config; and not __fish_seen_subcommand_from get set path' -a path -d 'Print config file path'
2638
+ complete -c ${name} -n '__fish_seen_subcommand_from get set' -a 'apiToken teamId' -d 'Config key'
2605
2639
 
2606
- complete -c cu -n '__fish_seen_subcommand_from completion' -a 'bash zsh fish' -d 'Shell type'
2640
+ complete -c ${name} -n '__fish_seen_subcommand_from completion' -a 'bash zsh fish' -d 'Shell type'
2607
2641
  `;
2608
2642
  }
2609
- function generateCompletion(shell) {
2643
+ function generateCompletion(shell, name = "cu") {
2610
2644
  switch (shell) {
2611
2645
  case "bash":
2612
- return bashCompletion();
2646
+ return bashCompletion(name);
2613
2647
  case "zsh":
2614
- return zshCompletion();
2648
+ return zshCompletion(name);
2615
2649
  case "fish":
2616
- return fishCompletion();
2650
+ return fishCompletion(name);
2617
2651
  default:
2618
2652
  throw new Error(`Unsupported shell: ${shell}. Supported shells: bash, zsh, fish`);
2619
2653
  }
@@ -3023,6 +3057,7 @@ function formatTimeEntries(entries) {
3023
3057
  // src/index.ts
3024
3058
  var require2 = createRequire(import.meta.url);
3025
3059
  var { version } = require2("../package.json");
3060
+ var programName = basename(process.argv[1] ?? "cu");
3026
3061
  function wrapAction(fn) {
3027
3062
  return (...args) => {
3028
3063
  fn(...args).catch((err) => {
@@ -3032,8 +3067,8 @@ function wrapAction(fn) {
3032
3067
  };
3033
3068
  }
3034
3069
  var program = new Command();
3035
- program.name("cu").description("ClickUp CLI for AI agents").version(version).allowExcessArguments(false);
3036
- program.command("init").description("Set up cu for the first time").action(
3070
+ program.name(programName).description("ClickUp CLI for AI agents").version(version).allowExcessArguments(false);
3071
+ program.command("init").description(`Set up ${programName} for the first time`).action(
3037
3072
  wrapAction(async () => {
3038
3073
  await runInitCommand();
3039
3074
  })
@@ -3568,7 +3603,7 @@ configCmd.command("path").description("Print config file path").action(
3568
3603
  );
3569
3604
  program.command("completion <shell>").description("Output shell completion script (bash, zsh, fish)").action(
3570
3605
  wrapAction(async (shell) => {
3571
- const script = generateCompletion(shell);
3606
+ const script = generateCompletion(shell, programName);
3572
3607
  process.stdout.write(script);
3573
3608
  })
3574
3609
  );
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@krodak/clickup-cli",
3
- "version": "0.17.0",
3
+ "version": "0.19.0",
4
4
  "description": "ClickUp CLI for AI agents and humans",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -20,7 +20,8 @@
20
20
  "initiative"
21
21
  ],
22
22
  "bin": {
23
- "cu": "./dist/index.js"
23
+ "cu": "./dist/index.js",
24
+ "cup": "./dist/index.js"
24
25
  },
25
26
  "files": [
26
27
  "dist",
@@ -1,14 +1,18 @@
1
1
  ---
2
2
  name: clickup
3
- description: 'Use when managing ClickUp tasks, sprints, or comments via the `cu` CLI tool. Triggers: task queries, status updates, sprint tracking, creating subtasks, posting comments, threaded replies, standup summaries, searching tasks, checking overdue items, assigning tasks, listing spaces and lists, opening tasks in browser, checking auth or config, setting custom fields, deleting tasks, managing tags, managing checklists, editing comments, task links, time tracking, attachments, file uploads.'
3
+ description: 'Use when managing ClickUp tasks, sprints, or comments via the `cu` / `cup` CLI tool. Triggers: task queries, status updates, sprint tracking, creating subtasks, posting comments, threaded replies, standup summaries, searching tasks, checking overdue items, assigning tasks, listing spaces and lists, opening tasks in browser, checking auth or config, setting custom fields, deleting tasks, managing tags, managing checklists, editing comments, task links, time tracking, attachments, file uploads.'
4
4
  ---
5
5
 
6
- # ClickUp CLI (`cu`)
6
+ # ClickUp CLI (`cu` / `cup`)
7
7
 
8
8
  Reference for AI agents using the `cu` CLI tool. Covers task management, sprint tracking, comments, and project workflows.
9
9
 
10
10
  Keywords: ClickUp, task management, sprint, project management, agile, backlog, subtasks, standup, overdue, search
11
11
 
12
+ ## Binary Names
13
+
14
+ Both `cu` and `cup` are available as binary names. They are identical. Use `cup` if `cu` conflicts with the Unix `cu(1)` utility on your system. All examples below use `cu`, but `cup` works the same way.
15
+
12
16
  ## Setup
13
17
 
14
18
  Config at `~/.config/cu/config.json` with `apiToken` and `teamId`. Run `cu init` to set up interactively.
@@ -90,7 +94,7 @@ All commands support `--help` for full flag details.
90
94
 
91
95
  | Topic | Detail |
92
96
  | ------------------------- | ------------------------------------------------------------------------------------------------------ |
93
- | Task IDs | Stable alphanumeric strings (e.g. `abc123def`) |
97
+ | Task IDs | Native (`abc123def`) or custom (`PROJ-123`). Custom IDs auto-detected by `PREFIX-DIGITS` format |
94
98
  | `--type` | Filter by task type: `task` (regular), or custom type name/ID (e.g. `initiative`, `Bug`) |
95
99
  | `--list` on create | Optional when `--parent` is given (auto-detected) |
96
100
  | `--status` | Fuzzy matching: exact > starts-with > contains. Prints match to stderr. |
@@ -120,6 +124,8 @@ All commands support `--help` for full flag details.
120
124
  | `cu comment-edit` | Edit comment text and resolution status |
121
125
  | `cu comment-delete` | Delete a comment |
122
126
  | `cu replies` / `cu reply` | View and post threaded comment replies |
127
+ | Custom task IDs | Auto-detected by format (`PROJ-123`). Uses `teamId` from config. All commands support them |
128
+ | `cu link` + custom IDs | Both IDs must be the same type (both custom or both native). Mixing may not work |
123
129
  | `cu link` | Link/unlink tasks (different from dependencies) |
124
130
  | `cu attach` | Upload files to tasks. Attachments shown in `cu task` detail view |
125
131
  | `cu task` | Shows custom fields, checklists, and attachments in detail view |