@krodak/clickup-cli 1.40.0 → 1.42.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.
- package/.claude-plugin/plugin.json +1 -1
- package/dist/index.js +113 -50
- package/package.json +1 -1
- package/skills/clickup-cli/SKILL.md +38 -37
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "clickup-cli",
|
|
3
3
|
"description": "ClickUp CLI skills for managing tasks, sprints, comments, checklists, custom fields, tags, and time tracking via the cup command",
|
|
4
|
-
"version": "1.
|
|
4
|
+
"version": "1.42.0",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Krzysztof Rodak"
|
|
7
7
|
},
|
package/dist/index.js
CHANGED
|
@@ -769,16 +769,18 @@ var ClickUpClient = class {
|
|
|
769
769
|
`/workspaces/${workspaceId}/docs/${docId}/pages/${pageId}?content_format=text/md`
|
|
770
770
|
);
|
|
771
771
|
}
|
|
772
|
-
|
|
773
|
-
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
|
|
772
|
+
/**
|
|
773
|
+
* Create a Doc.
|
|
774
|
+
*
|
|
775
|
+
* ClickUp's v3 Create Doc endpoint accepts `name` only — `title` and `content`
|
|
776
|
+
* are silently ignored (the request still returns 201), which is why passing
|
|
777
|
+
* them produced unnamed Docs with empty root pages. Initial content must be
|
|
778
|
+
* written to the Doc's root page via {@link editDocPage}.
|
|
779
|
+
*/
|
|
780
|
+
async createDoc(workspaceId, name) {
|
|
779
781
|
return this.requestV3(`/workspaces/${workspaceId}/docs`, {
|
|
780
782
|
method: "POST",
|
|
781
|
-
body: JSON.stringify(
|
|
783
|
+
body: JSON.stringify({ name })
|
|
782
784
|
});
|
|
783
785
|
}
|
|
784
786
|
async createDocPage(workspaceId, docId, name, content, parentPageId) {
|
|
@@ -859,11 +861,6 @@ var ClickUpClient = class {
|
|
|
859
861
|
async deleteKeyResult(keyResultId) {
|
|
860
862
|
await this.request(`/key_result/${keyResultId}`, { method: "DELETE" });
|
|
861
863
|
}
|
|
862
|
-
async deleteDoc(workspaceId, docId) {
|
|
863
|
-
await this.requestV3(`/workspaces/${workspaceId}/docs/${docId}`, {
|
|
864
|
-
method: "DELETE"
|
|
865
|
-
});
|
|
866
|
-
}
|
|
867
864
|
async deleteDocPage(workspaceId, docId, pageId) {
|
|
868
865
|
await this.requestV3(
|
|
869
866
|
`/workspaces/${workspaceId}/docs/${docId}/pages/${pageId}`,
|
|
@@ -2451,7 +2448,9 @@ async function createTask(config, options) {
|
|
|
2451
2448
|
}
|
|
2452
2449
|
|
|
2453
2450
|
// src/text-input.ts
|
|
2454
|
-
import { readFileSync } from "fs";
|
|
2451
|
+
import { readFileSync, readSync } from "fs";
|
|
2452
|
+
var STDIN_TIMEOUT_MS = 3e4;
|
|
2453
|
+
var STDIN_RETRY_MS = 5;
|
|
2455
2454
|
function resolveTextInput(args) {
|
|
2456
2455
|
const { inline, file, inlineFlag, fileFlag } = args;
|
|
2457
2456
|
if (inline !== void 0 && file !== void 0) {
|
|
@@ -2468,14 +2467,38 @@ function readTextFile(path, fileFlag) {
|
|
|
2468
2467
|
throw new Error(`Cannot read ${fileFlag} "${path}": ${err.message}`, { cause: err });
|
|
2469
2468
|
}
|
|
2470
2469
|
}
|
|
2470
|
+
function sleepSync(ms) {
|
|
2471
|
+
Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, ms);
|
|
2472
|
+
}
|
|
2471
2473
|
function readStdin(fileFlag) {
|
|
2472
|
-
|
|
2473
|
-
|
|
2474
|
-
|
|
2475
|
-
|
|
2476
|
-
|
|
2477
|
-
|
|
2474
|
+
const chunks = [];
|
|
2475
|
+
const buffer = Buffer.alloc(64 * 1024);
|
|
2476
|
+
const deadline = Date.now() + STDIN_TIMEOUT_MS;
|
|
2477
|
+
for (; ; ) {
|
|
2478
|
+
let bytesRead;
|
|
2479
|
+
try {
|
|
2480
|
+
bytesRead = readSync(0, buffer, 0, buffer.length, null);
|
|
2481
|
+
} catch (err) {
|
|
2482
|
+
const code = err.code;
|
|
2483
|
+
if (code === "EAGAIN") {
|
|
2484
|
+
if (Date.now() > deadline) {
|
|
2485
|
+
throw new Error(
|
|
2486
|
+
`Timed out reading ${fileFlag} from stdin after ${STDIN_TIMEOUT_MS / 1e3}s. Pass a file path instead of "-" if no input is being piped.`,
|
|
2487
|
+
{ cause: err }
|
|
2488
|
+
);
|
|
2489
|
+
}
|
|
2490
|
+
sleepSync(STDIN_RETRY_MS);
|
|
2491
|
+
continue;
|
|
2492
|
+
}
|
|
2493
|
+
if (code === "EOF") break;
|
|
2494
|
+
throw new Error(`Failed to read ${fileFlag} from stdin: ${err.message}`, {
|
|
2495
|
+
cause: err
|
|
2496
|
+
});
|
|
2497
|
+
}
|
|
2498
|
+
if (bytesRead === 0) break;
|
|
2499
|
+
chunks.push(Buffer.from(buffer.subarray(0, bytesRead)));
|
|
2478
2500
|
}
|
|
2501
|
+
return Buffer.concat(chunks).toString("utf8");
|
|
2479
2502
|
}
|
|
2480
2503
|
|
|
2481
2504
|
// src/commands/get.ts
|
|
@@ -4201,7 +4224,7 @@ var commandMetadata = [
|
|
|
4201
4224
|
{
|
|
4202
4225
|
name: "field",
|
|
4203
4226
|
description: "Set or remove a custom field value on a task",
|
|
4204
|
-
flags: ["--set", "--remove", "--json"],
|
|
4227
|
+
flags: ["--set", "--value-file", "--remove", "--json"],
|
|
4205
4228
|
quickReference: [
|
|
4206
4229
|
{
|
|
4207
4230
|
section: "write",
|
|
@@ -4445,10 +4468,14 @@ var commandMetadata = [
|
|
|
4445
4468
|
},
|
|
4446
4469
|
{
|
|
4447
4470
|
name: "doc-delete",
|
|
4448
|
-
description: "
|
|
4471
|
+
description: "Not supported: ClickUp has no delete-Doc API (use the ClickUp UI)",
|
|
4449
4472
|
flags: ["--json"],
|
|
4450
4473
|
quickReference: [
|
|
4451
|
-
{
|
|
4474
|
+
{
|
|
4475
|
+
section: "write",
|
|
4476
|
+
usage: "doc-delete <docId>",
|
|
4477
|
+
description: "Not supported by ClickUp API (delete Docs in the UI)"
|
|
4478
|
+
}
|
|
4452
4479
|
]
|
|
4453
4480
|
},
|
|
4454
4481
|
{
|
|
@@ -5438,6 +5465,7 @@ ${renderZshTopLevelCommands(name)}
|
|
|
5438
5465
|
_arguments \\
|
|
5439
5466
|
'1:task_id:' \\
|
|
5440
5467
|
'--set[Set field name and value]:name_and_value:' \\
|
|
5468
|
+
'--value-file[Read the field value from a file (- for stdin)]:path:_files' \\
|
|
5441
5469
|
'--remove[Remove field value by name]:field_name:' \\
|
|
5442
5470
|
'--json[Force JSON output]'
|
|
5443
5471
|
;;
|
|
@@ -7241,8 +7269,22 @@ function formatDocPagesMarkdown(pages) {
|
|
|
7241
7269
|
async function createDoc(config, title, content) {
|
|
7242
7270
|
if (!title.trim()) throw new Error("Doc title cannot be empty");
|
|
7243
7271
|
const client = new ClickUpClient(config);
|
|
7244
|
-
const doc = await client.createDoc(config.teamId, title
|
|
7245
|
-
|
|
7272
|
+
const doc = await client.createDoc(config.teamId, title);
|
|
7273
|
+
try {
|
|
7274
|
+
const pages = await client.getDocPageListing(config.teamId, doc.id);
|
|
7275
|
+
const rootPage = pages[0];
|
|
7276
|
+
if (!rootPage) throw new Error("the doc has no root page");
|
|
7277
|
+
await client.editDocPage(config.teamId, doc.id, rootPage.id, {
|
|
7278
|
+
name: title,
|
|
7279
|
+
...content !== void 0 ? { content } : {}
|
|
7280
|
+
});
|
|
7281
|
+
} catch (err) {
|
|
7282
|
+
throw new Error(
|
|
7283
|
+
`Created doc ${doc.id} but could not write its root page: ${err.message}`,
|
|
7284
|
+
{ cause: err }
|
|
7285
|
+
);
|
|
7286
|
+
}
|
|
7287
|
+
return { id: doc.id, title: doc.name || title };
|
|
7246
7288
|
}
|
|
7247
7289
|
async function createDocPage(config, docId, name, content, parentPageId) {
|
|
7248
7290
|
if (!name.trim()) throw new Error("Page name cannot be empty");
|
|
@@ -7256,9 +7298,10 @@ async function editDocPage(config, docId, pageId, updates) {
|
|
|
7256
7298
|
const client = new ClickUpClient(config);
|
|
7257
7299
|
return client.editDocPage(config.teamId, docId, pageId, updates);
|
|
7258
7300
|
}
|
|
7259
|
-
async function deleteDoc(
|
|
7260
|
-
|
|
7261
|
-
|
|
7301
|
+
async function deleteDoc(docId) {
|
|
7302
|
+
throw new Error(
|
|
7303
|
+
`Cannot delete doc ${docId}: ClickUp's public API does not support deleting Docs (no delete endpoint exists; the request returns HTTP 405). Delete or archive the Doc in the ClickUp UI instead. To remove a single page, use \`cup doc-page-delete <docId> <pageId>\`.`
|
|
7304
|
+
);
|
|
7262
7305
|
}
|
|
7263
7306
|
async function deleteDocPage(config, docId, pageId) {
|
|
7264
7307
|
const client = new ClickUpClient(config);
|
|
@@ -8656,6 +8699,27 @@ function splitCommaList(value) {
|
|
|
8656
8699
|
function collect(value, previous) {
|
|
8657
8700
|
return [...previous, value];
|
|
8658
8701
|
}
|
|
8702
|
+
function resolveFieldSet(set, valueFile) {
|
|
8703
|
+
if (set.length > 2) {
|
|
8704
|
+
throw new Error("--set requires exactly two arguments: field name and value");
|
|
8705
|
+
}
|
|
8706
|
+
const name = set[0];
|
|
8707
|
+
if (name === void 0) {
|
|
8708
|
+
throw new Error("--set requires a field name");
|
|
8709
|
+
}
|
|
8710
|
+
const value = resolveTextInput({
|
|
8711
|
+
inline: set[1],
|
|
8712
|
+
file: valueFile,
|
|
8713
|
+
inlineFlag: "--set <value>",
|
|
8714
|
+
fileFlag: "--value-file"
|
|
8715
|
+
});
|
|
8716
|
+
if (value === void 0) {
|
|
8717
|
+
throw new Error(
|
|
8718
|
+
'--set requires a value: pass it inline (--set "Field Name" value) or use --value-file'
|
|
8719
|
+
);
|
|
8720
|
+
}
|
|
8721
|
+
return [name, value];
|
|
8722
|
+
}
|
|
8659
8723
|
function resolveRequiredMessage(opts) {
|
|
8660
8724
|
const message = resolveTextInput({
|
|
8661
8725
|
inline: opts.message,
|
|
@@ -9357,16 +9421,18 @@ function buildProgram(programName = basename(process.argv[1] ?? "cup")) {
|
|
|
9357
9421
|
}
|
|
9358
9422
|
})
|
|
9359
9423
|
);
|
|
9360
|
-
program.command("field <taskId>").description("Set or remove a custom field value on a task").option("--set <nameAndValue...>", 'Set field: --set "Field Name" value').option(
|
|
9424
|
+
program.command("field <taskId>").description("Set or remove a custom field value on a task").option("--set <nameAndValue...>", 'Set field: --set "Field Name" value').option(
|
|
9425
|
+
"--value-file <path>",
|
|
9426
|
+
'Read the field value from a file ("-" for stdin); use with --set "Field Name". Avoids shell quoting'
|
|
9427
|
+
).option("--remove <fieldName>", "Remove field value by name").option("--json", "Force JSON output even in terminal").action(
|
|
9361
9428
|
wrapAction(
|
|
9362
9429
|
async (taskId, opts) => {
|
|
9363
9430
|
const config = loadConfig(getProfileName());
|
|
9364
9431
|
const fieldOpts = {};
|
|
9365
9432
|
if (opts.set) {
|
|
9366
|
-
|
|
9367
|
-
|
|
9368
|
-
|
|
9369
|
-
fieldOpts.set = [opts.set[0], opts.set[1]];
|
|
9433
|
+
fieldOpts.set = resolveFieldSet(opts.set, opts.valueFile);
|
|
9434
|
+
} else if (opts.valueFile !== void 0) {
|
|
9435
|
+
throw new Error('--value-file requires --set "Field Name"');
|
|
9370
9436
|
}
|
|
9371
9437
|
if (opts.remove) {
|
|
9372
9438
|
fieldOpts.remove = opts.remove;
|
|
@@ -9905,15 +9971,18 @@ function buildProgram(programName = basename(process.argv[1] ?? "cup")) {
|
|
|
9905
9971
|
outputBulkResult(result, opts.json ?? false, `priority ${opts.to}`);
|
|
9906
9972
|
})
|
|
9907
9973
|
);
|
|
9908
|
-
bulkCmd.command("field <taskIds...>").description("Bulk set the same custom field value on tasks").requiredOption("--set <nameAndValue...>", 'Set field: --set "Field Name" value').option(
|
|
9909
|
-
|
|
9910
|
-
|
|
9911
|
-
|
|
9974
|
+
bulkCmd.command("field <taskIds...>").description("Bulk set the same custom field value on tasks").requiredOption("--set <nameAndValue...>", 'Set field: --set "Field Name" value').option(
|
|
9975
|
+
"--value-file <path>",
|
|
9976
|
+
'Read the field value from a file ("-" for stdin); use with --set "Field Name"'
|
|
9977
|
+
).option("--json", "Force JSON output even in terminal").action(
|
|
9978
|
+
wrapAction(
|
|
9979
|
+
async (taskIds, opts) => {
|
|
9980
|
+
const [fieldName, fieldValue] = resolveFieldSet(opts.set, opts.valueFile);
|
|
9981
|
+
const config = loadConfig(getProfileName());
|
|
9982
|
+
const result = await bulkField(config, fieldName, fieldValue, taskIds);
|
|
9983
|
+
outputBulkResult(result, opts.json ?? false, `field "${fieldName}"`);
|
|
9912
9984
|
}
|
|
9913
|
-
|
|
9914
|
-
const result = await bulkField(config, opts.set[0], opts.set[1], taskIds);
|
|
9915
|
-
outputBulkResult(result, opts.json ?? false, `field "${opts.set[0]}"`);
|
|
9916
|
-
})
|
|
9985
|
+
)
|
|
9917
9986
|
);
|
|
9918
9987
|
bulkCmd.command("move <taskIds...>").description("Move multiple tasks to a single destination list").requiredOption("--to <listId>", "Destination list ID").option("--json", "Force JSON output even in terminal").action(
|
|
9919
9988
|
wrapAction(async (taskIds, opts) => {
|
|
@@ -10230,15 +10299,9 @@ function buildProgram(programName = basename(process.argv[1] ?? "cup")) {
|
|
|
10230
10299
|
}
|
|
10231
10300
|
)
|
|
10232
10301
|
);
|
|
10233
|
-
program.command("doc-delete <docId>").description("
|
|
10234
|
-
wrapAction(async (docId
|
|
10235
|
-
|
|
10236
|
-
await deleteDoc(config, docId);
|
|
10237
|
-
if (shouldOutputJson(opts.json ?? false)) {
|
|
10238
|
-
console.log(JSON.stringify({ success: true, docId }, null, 2));
|
|
10239
|
-
} else {
|
|
10240
|
-
console.log(`Deleted doc ${docId}`);
|
|
10241
|
-
}
|
|
10302
|
+
program.command("doc-delete <docId>").description("Not supported: ClickUp has no delete-Doc API (use the ClickUp UI)").option("--json", "Force JSON output even in terminal").action(
|
|
10303
|
+
wrapAction(async (docId) => {
|
|
10304
|
+
await deleteDoc(docId);
|
|
10242
10305
|
})
|
|
10243
10306
|
);
|
|
10244
10307
|
program.command("doc-page-delete <docId> <pageId>").description("Delete a doc page").option("--json", "Force JSON output even in terminal").action(
|
package/package.json
CHANGED
|
@@ -3,11 +3,11 @@ name: clickup
|
|
|
3
3
|
description: 'Use when managing ClickUp tasks, sprints, or comments via the `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, listing members, listing fields, duplicating tasks, bulk operations, goals, key results, saved filters, favorites.'
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
# ClickUp CLI (`cup`) - skill version 1.
|
|
6
|
+
# ClickUp CLI (`cup`) - skill version 1.42.0
|
|
7
7
|
|
|
8
8
|
Reference for AI agents using the `cup` CLI tool. Covers task management, sprint tracking, comments, time tracking, custom fields, goals, docs, and project workflows.
|
|
9
9
|
|
|
10
|
-
> **Version check:** Run `cup --version`. If your installed version is older than 1.
|
|
10
|
+
> **Version check:** Run `cup --version`. If your installed version is older than 1.42.0, update with `npm install -g @krodak/clickup-cli` and refresh this skill with `cup skill`.
|
|
11
11
|
|
|
12
12
|
## Install & Configure
|
|
13
13
|
|
|
@@ -173,7 +173,7 @@ All commands support `--help` for full flag details. All commands support `--jso
|
|
|
173
173
|
| `cup assign <id> [--to ids\|me] [--remove ids\|me] [--group uuid\|@handle,...] [--remove-group uuid\|@handle,...]` | Assign/unassign users and groups (all flags accept comma-separated values) |
|
|
174
174
|
| `cup depend <id> [--on taskId] [--blocks taskId] [--remove]` | Add/remove dependencies |
|
|
175
175
|
| `cup move <id> [--to listId\|sprint:current] [--remove listId]` | Add/remove task from lists. **`--to` + `--remove` together changes the task's _home_ list** (uses v3 `home_list` endpoint with auto status mapping). `--to` alone adds multi-list membership. `--to` accepts `sprint:current`. |
|
|
176
|
-
| `cup field <id> [--set "Name" value] [--remove "Name"]`
|
|
176
|
+
| `cup field <id> [--set "Name" value\|--set "Name" --value-file path] [--remove "Name"]` | Set/remove custom field values (`--value-file` reads the value from a file or `-` for stdin; use for long/free-text values) |
|
|
177
177
|
| `cup field-create <name> -t <type> [-d desc] [--options "a,b,c"] [--required] [--list id] [--lists id1,id2]` | Create a custom field — workspace-wide (default), on one list (`--list`), or bulk across lists (`--lists`, parallel, per-list reporting) |
|
|
178
178
|
| `cup tag <id> [--add tags] [--remove tags]` | Add/remove tags on a task |
|
|
179
179
|
| `cup link <taskId> <linksTo> [--remove]` | Link/unlink tasks |
|
|
@@ -209,10 +209,10 @@ All commands support `--help` for full flag details. All commands support `--jso
|
|
|
209
209
|
| `cup key-result-create <goalId> <name> [--type t] [--target n]` | Create key result |
|
|
210
210
|
| `cup key-result-update <keyResultId> [--progress n] [--note text]` | Update key result |
|
|
211
211
|
| `cup key-result-delete <keyResultId>` | Delete key result |
|
|
212
|
-
| `cup doc-create <title> [-c content]` | Create a doc
|
|
212
|
+
| `cup doc-create <title> [-c content]` | Create a doc (root page is named after the title; `-c` writes its markdown content) |
|
|
213
213
|
| `cup doc-page-create <docId> <name> [-c content] [--parent-page pageId]` | Create doc page |
|
|
214
214
|
| `cup doc-page-edit <docId> <pageId> [--name text] [-c content]` | Edit doc page |
|
|
215
|
-
| `cup doc-delete <docId>` |
|
|
215
|
+
| `cup doc-delete <docId>` | **Not supported** — ClickUp has no delete-Doc API (HTTP 405). Fails fast; delete Docs in the UI. Use `cup doc-page-delete` for a single page |
|
|
216
216
|
| `cup doc-page-delete <docId> <pageId>` | Delete doc page |
|
|
217
217
|
| `cup space-create <name>` | Create a space |
|
|
218
218
|
| `cup list-create <spaceId> <name> [--folder folderId] [--copy-statuses-from id]` | Create a list in a space or folder |
|
|
@@ -263,38 +263,38 @@ All commands support `--help` for full flag details. All commands support `--jso
|
|
|
263
263
|
|
|
264
264
|
## Flags & Conventions
|
|
265
265
|
|
|
266
|
-
| Topic
|
|
267
|
-
|
|
|
268
|
-
| Task IDs
|
|
269
|
-
| Task URLs
|
|
270
|
-
| View URLs
|
|
271
|
-
| `--status`
|
|
272
|
-
| `--priority`
|
|
273
|
-
| `--due-date`
|
|
274
|
-
| `--assignee`
|
|
275
|
-
| `--tags`
|
|
276
|
-
| `--time-estimate`
|
|
277
|
-
| `--type`
|
|
278
|
-
| `--custom-item-id`
|
|
279
|
-
| `--space`
|
|
280
|
-
| `--name`
|
|
281
|
-
| `--all`
|
|
282
|
-
| `--include-closed`
|
|
283
|
-
| `--list` on create
|
|
284
|
-
| `cup field --set`
|
|
285
|
-
| `cup field-create`
|
|
286
|
-
| `--field` filter
|
|
287
|
-
| `--due-before/after`
|
|
288
|
-
| `--created-before/after`
|
|
289
|
-
| `cup sprint`
|
|
290
|
-
| `cup favorite`
|
|
291
|
-
| `cup link`
|
|
292
|
-
| `cup delete`
|
|
293
|
-
| Errors
|
|
294
|
-
| Rate limiting
|
|
295
|
-
| Multiline markdown (`-d` / `-m`) | **Best for agents:** use `--description-file <path>` / `--message-file <path>` (or `-` for stdin) to bypass shell quoting entirely — see the multiline example below. For inline multiline, use a **quoted heredoc** `"$(cat <<'EOF' … EOF)"` — it preserves backticks, newlines, and apostrophes. **Footgun:** never split a `$'...'` string with `'\''` for an apostrophe — the tail drops back to normal single quotes and `\n` becomes literal text (e.g. `$'…team'\''s…\n## Goals'` breaks). Plain double quotes execute backticks as commands. |
|
|
296
|
-
| `--mention <user>`
|
|
297
|
-
| Comment links
|
|
266
|
+
| Topic | Detail |
|
|
267
|
+
| ----------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
268
|
+
| Task IDs | Native (`abc123def`) or custom (`PROJ-123`). Custom IDs auto-detected by `PREFIX-DIGITS` format |
|
|
269
|
+
| Task URLs | All commands that accept a task ID also accept full ClickUp URLs (`https://app.clickup.com/t/<id>` or `https://app.clickup.com/t/<workspace>/<id>`). The ID is auto-extracted |
|
|
270
|
+
| View URLs | All commands that accept a view ID also accept full ClickUp view URLs (`https://app.clickup.com/<workspace>/v/<type>/<viewId>`). The ID is auto-extracted |
|
|
271
|
+
| `--status` | Fuzzy matching: exact > starts-with > contains. Prints match to stderr |
|
|
272
|
+
| `--priority` | Names (`urgent`, `high`, `normal`, `low`) or numbers (1-4) |
|
|
273
|
+
| `--due-date` | `YYYY-MM-DD` (date only), `YYYY-MM-DDTHH:MM` (with time), or full ISO 8601 with offset. Time-of-day formats set `due_date_time: true` in ClickUp |
|
|
274
|
+
| `--assignee` | User ID or `me` |
|
|
275
|
+
| `--tags` | Comma-separated (e.g. `--tags "bug,frontend"`) |
|
|
276
|
+
| `--time-estimate` | Duration: `"2h"`, `"30m"`, `"1h30m"`, or raw milliseconds |
|
|
277
|
+
| `--type` | `task` (regular) or custom type name/ID (e.g. `initiative`, `Bug`) |
|
|
278
|
+
| `--custom-item-id` | Custom task type ID for `cup create` (find with `cup task-types`) |
|
|
279
|
+
| `--space` | Partial name match or exact ID |
|
|
280
|
+
| `--name` | Partial match, case-insensitive |
|
|
281
|
+
| `--all` | Show all tasks in workspace, not just assigned to me. Available on `tasks`, `search`, `overdue`. Default: my tasks only (smaller output for agent context windows) |
|
|
282
|
+
| `--include-closed` | Include closed/done tasks |
|
|
283
|
+
| `--list` on create | Optional when `--parent` is given (auto-detected). Accepts `sprint:current` pseudo-ID |
|
|
284
|
+
| `cup field --set` | Supports: text, number, checkbox (true/false), dropdown (option name), labels (comma-separated names), date (YYYY-MM-DD), url, email, emoji/rating (0-5), manual_progress (0-100), tasks/relationship (comma-separated task IDs), users/people (comma-separated user IDs). Names resolved case-insensitively; errors list available fields/options |
|
|
285
|
+
| `cup field-create` | Use `--options "a,b,c"` for `drop_down` and `labels` types (required). Other types don't need `--options` |
|
|
286
|
+
| `--field` filter | `--field "Name" value` on `tasks` and `search` requires `--list` to resolve field names to IDs |
|
|
287
|
+
| `--due-before/after` | `YYYY-MM-DD` date filters for due date range |
|
|
288
|
+
| `--created-before/after` | `YYYY-MM-DD` date filters for creation date range |
|
|
289
|
+
| `cup sprint` | Auto-detects active sprint by folder name (sprint/iteration/cycle/scrum), parses multiple date formats. Override with `--folder <id>`, `cup config set sprintFolderId <id>`, or favorite a sprint folder |
|
|
290
|
+
| `cup favorite` | Local-only favorites (not synced to ClickUp). Types: sprint-folder, space, list, folder, view, task. Favorited sprint-folders auto-used by sprint commands |
|
|
291
|
+
| `cup link` | Both IDs must be the same type (both custom or both native) |
|
|
292
|
+
| `cup delete` | DESTRUCTIVE. Requires `--confirm` in non-interactive mode. Cannot be undone |
|
|
293
|
+
| Errors | stderr with exit code 1. Strict parsing - excess/unknown arguments rejected |
|
|
294
|
+
| Rate limiting | The client auto-retries on HTTP 429 and transient 5xx (502/503/504) with `Retry-After`-aware backoff (up to 3 retries). Retry warnings go to stderr. No action needed by callers |
|
|
295
|
+
| Multiline markdown (`-d` / `-m` / field values) | **Best for agents:** use `--description-file <path>` / `--message-file <path>` / `--value-file <path>` (or `-` for stdin) to bypass shell quoting entirely — see the multiline example below. For inline multiline, use a **quoted heredoc** `"$(cat <<'EOF' … EOF)"` — it preserves backticks, newlines, and apostrophes. **Footgun:** never split a `$'...'` string with `'\''` for an apostrophe — the tail drops back to normal single quotes and `\n` becomes literal text (e.g. `$'…team'\''s…\n## Goals'` breaks). Plain double quotes execute backticks as commands. |
|
|
296
|
+
| `--mention <user>` | Real ClickUp @mention (notifies the user). Accepts ID, email, username, or `me`. Repeatable. Also: `<@userId>` inline token in `-m` for mid-sentence mentions. Bare `@Name` is NOT parsed (ambiguous). On `comment`, `reply`, `comment-edit`, `list-comment`, `view-comment` |
|
|
297
|
+
| Comment links | In comment messages, bare URLs (`https://...`) and markdown links (`[text](url)`) both render as clickable links. Unfurled preview cards are not supported (web-UI only) |
|
|
298
298
|
|
|
299
299
|
> **Note:** `cup search`, `cup tasks`, `cup overdue`, and `cup assigned` default to tasks assigned to the current user. Use `--all` to include tasks assigned to others. This matters when searching for parent initiatives or team-wide items.
|
|
300
300
|
|
|
@@ -393,6 +393,7 @@ Agents produce structured markdown (headings, bullets, code, apostrophes). Shell
|
|
|
393
393
|
cup create -n "Improve onboarding" -l <listId> --description-file /tmp/desc.md
|
|
394
394
|
cup update <taskId> --description-file /tmp/desc.md
|
|
395
395
|
cup comment <taskId> --message-file /tmp/comment.md
|
|
396
|
+
cup field <taskId> --set "Standup 4 - 6/25" --value-file /tmp/note.md
|
|
396
397
|
# "-" reads stdin:
|
|
397
398
|
printf '## Notes\n\nTeam'\''s update with `code`.' | cup update <taskId> --description-file -
|
|
398
399
|
|