@krodak/clickup-cli 1.22.1 → 1.23.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/README.md +1 -1
- package/dist/index.js +178 -5
- package/package.json +1 -1
- package/skills/clickup-cli/SKILL.md +76 -68
|
@@ -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.23.0",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Krzysztof Rodak"
|
|
7
7
|
},
|
package/README.md
CHANGED
|
@@ -184,7 +184,7 @@ Full CRUD for the core ClickUp workflow:
|
|
|
184
184
|
| 🏃 **Sprints** | Auto-detect active sprint, `sprint:current` pseudo-ID for move/create, flexible date parsing, config override, favorite sprint folders |
|
|
185
185
|
| ⭐ **Favorites** | Local favorites for quick access to sprint folders, spaces, lists, folders, views, tasks |
|
|
186
186
|
| 👁️ **Views** | List, get, create, update, delete views on lists |
|
|
187
|
-
| 🏢 **Workspace** | Spaces, folders, lists (read + create + from template), members, task types, templates
|
|
187
|
+
| 🏢 **Workspace** | Spaces, folders, lists (read + create + rename + from template), members, task types, templates |
|
|
188
188
|
| 📎 **Attachments** | Upload files to tasks, shown in detail views |
|
|
189
189
|
|
|
190
190
|
[Full API coverage details](docs/api-coverage.md) | [Command reference](docs/commands.md)
|
package/dist/index.js
CHANGED
|
@@ -286,6 +286,12 @@ var ClickUpClient = class {
|
|
|
286
286
|
body: JSON.stringify({ name, multiple_assignees: true })
|
|
287
287
|
});
|
|
288
288
|
}
|
|
289
|
+
async updateSpace(spaceId, payload) {
|
|
290
|
+
return this.request(`/space/${spaceId}`, {
|
|
291
|
+
method: "PUT",
|
|
292
|
+
body: JSON.stringify(payload)
|
|
293
|
+
});
|
|
294
|
+
}
|
|
289
295
|
async getSpaces(teamId, archived = false) {
|
|
290
296
|
const data = await this.request(
|
|
291
297
|
`/team/${teamId}/space?archived=${archived ? "true" : "false"}`
|
|
@@ -326,6 +332,12 @@ var ClickUpClient = class {
|
|
|
326
332
|
body: JSON.stringify({ name })
|
|
327
333
|
});
|
|
328
334
|
}
|
|
335
|
+
async updateFolder(folderId, payload) {
|
|
336
|
+
return this.request(`/folder/${folderId}`, {
|
|
337
|
+
method: "PUT",
|
|
338
|
+
body: JSON.stringify(payload)
|
|
339
|
+
});
|
|
340
|
+
}
|
|
329
341
|
async getLists(spaceId, archived = false) {
|
|
330
342
|
const data = await this.request(
|
|
331
343
|
`/space/${spaceId}/list?archived=${archived ? "true" : "false"}`
|
|
@@ -2054,6 +2066,9 @@ async function createTask(config, options) {
|
|
|
2054
2066
|
if (options.timeEstimate !== void 0) {
|
|
2055
2067
|
payload.time_estimate = parseTimeEstimate(options.timeEstimate);
|
|
2056
2068
|
}
|
|
2069
|
+
if (options.customFields !== void 0 && options.customFields.length > 0) {
|
|
2070
|
+
payload.custom_fields = options.customFields;
|
|
2071
|
+
}
|
|
2057
2072
|
const task = await client.createTask(listId, payload);
|
|
2058
2073
|
return { id: task.id, name: task.name, url: task.url };
|
|
2059
2074
|
}
|
|
@@ -2092,10 +2107,8 @@ Next steps:
|
|
|
2092
2107
|
`;
|
|
2093
2108
|
function validateTokenFormat(token) {
|
|
2094
2109
|
if (!token.startsWith("pk_")) {
|
|
2095
|
-
throw new Error(
|
|
2096
|
-
|
|
2097
|
-
${TOKEN_HELP}`
|
|
2098
|
-
);
|
|
2110
|
+
throw new Error(`Invalid token format. Personal API tokens start with "pk_".
|
|
2111
|
+
${TOKEN_HELP}`);
|
|
2099
2112
|
}
|
|
2100
2113
|
}
|
|
2101
2114
|
async function verifyToken(apiToken) {
|
|
@@ -3273,6 +3286,7 @@ var commandMetadata = [
|
|
|
3273
3286
|
"--custom-item-id",
|
|
3274
3287
|
"--time-estimate",
|
|
3275
3288
|
"--template",
|
|
3289
|
+
"--field",
|
|
3276
3290
|
"--json"
|
|
3277
3291
|
],
|
|
3278
3292
|
quickReference: [{ section: "write", usage: "create", description: "Create a new task" }]
|
|
@@ -3758,6 +3772,42 @@ var commandMetadata = [
|
|
|
3758
3772
|
}
|
|
3759
3773
|
]
|
|
3760
3774
|
},
|
|
3775
|
+
{
|
|
3776
|
+
name: "list-rename",
|
|
3777
|
+
description: "Rename a list",
|
|
3778
|
+
flags: ["--json"],
|
|
3779
|
+
quickReference: [
|
|
3780
|
+
{
|
|
3781
|
+
section: "write",
|
|
3782
|
+
usage: "list-rename <listId> <newName>",
|
|
3783
|
+
description: "Rename a list"
|
|
3784
|
+
}
|
|
3785
|
+
]
|
|
3786
|
+
},
|
|
3787
|
+
{
|
|
3788
|
+
name: "folder-rename",
|
|
3789
|
+
description: "Rename a folder",
|
|
3790
|
+
flags: ["--json"],
|
|
3791
|
+
quickReference: [
|
|
3792
|
+
{
|
|
3793
|
+
section: "write",
|
|
3794
|
+
usage: "folder-rename <folderId> <newName>",
|
|
3795
|
+
description: "Rename a folder"
|
|
3796
|
+
}
|
|
3797
|
+
]
|
|
3798
|
+
},
|
|
3799
|
+
{
|
|
3800
|
+
name: "space-rename",
|
|
3801
|
+
description: "Rename a space",
|
|
3802
|
+
flags: ["--json"],
|
|
3803
|
+
quickReference: [
|
|
3804
|
+
{
|
|
3805
|
+
section: "write",
|
|
3806
|
+
usage: "space-rename <spaceId> <newName>",
|
|
3807
|
+
description: "Rename a space"
|
|
3808
|
+
}
|
|
3809
|
+
]
|
|
3810
|
+
},
|
|
3761
3811
|
{
|
|
3762
3812
|
name: "members",
|
|
3763
3813
|
description: "List workspace members",
|
|
@@ -3825,6 +3875,11 @@ var commandMetadata = [
|
|
|
3825
3875
|
section: "write",
|
|
3826
3876
|
usage: "bulk field <taskIds...>",
|
|
3827
3877
|
description: "Bulk set a custom field value on tasks"
|
|
3878
|
+
},
|
|
3879
|
+
{
|
|
3880
|
+
section: "write",
|
|
3881
|
+
usage: "bulk move <taskIds...>",
|
|
3882
|
+
description: "Move multiple tasks to a destination list"
|
|
3828
3883
|
}
|
|
3829
3884
|
]
|
|
3830
3885
|
},
|
|
@@ -4841,6 +4896,24 @@ ${renderZshTopLevelCommands(name)}
|
|
|
4841
4896
|
'2:name:' \\
|
|
4842
4897
|
'--json[Force JSON output]'
|
|
4843
4898
|
;;
|
|
4899
|
+
list-rename)
|
|
4900
|
+
_arguments \\
|
|
4901
|
+
'1:list_id:' \\
|
|
4902
|
+
'2:new_name:' \\
|
|
4903
|
+
'--json[Force JSON output]'
|
|
4904
|
+
;;
|
|
4905
|
+
folder-rename)
|
|
4906
|
+
_arguments \\
|
|
4907
|
+
'1:folder_id:' \\
|
|
4908
|
+
'2:new_name:' \\
|
|
4909
|
+
'--json[Force JSON output]'
|
|
4910
|
+
;;
|
|
4911
|
+
space-rename)
|
|
4912
|
+
_arguments \\
|
|
4913
|
+
'1:space_id:' \\
|
|
4914
|
+
'2:new_name:' \\
|
|
4915
|
+
'--json[Force JSON output]'
|
|
4916
|
+
;;
|
|
4844
4917
|
doc-create)
|
|
4845
4918
|
_arguments \\
|
|
4846
4919
|
'1:title:' \\
|
|
@@ -6145,6 +6218,16 @@ async function bulkField(config, fieldName, rawValue, taskIds) {
|
|
|
6145
6218
|
);
|
|
6146
6219
|
return toBulkResult(outcomes);
|
|
6147
6220
|
}
|
|
6221
|
+
async function bulkMove(config, listId, taskIds) {
|
|
6222
|
+
if (!listId) throw new Error("--to <listId> is required");
|
|
6223
|
+
if (taskIds.length === 0) throw new Error("Provide at least one task ID");
|
|
6224
|
+
const client = new ClickUpClient(config);
|
|
6225
|
+
const outcomes = await runInBatches(taskIds, BULK_CONCURRENCY, async (id) => {
|
|
6226
|
+
await client.moveTaskToList(id, listId);
|
|
6227
|
+
return id;
|
|
6228
|
+
});
|
|
6229
|
+
return toBulkResult(outcomes);
|
|
6230
|
+
}
|
|
6148
6231
|
|
|
6149
6232
|
// src/commands/goals.ts
|
|
6150
6233
|
import chalk16 from "chalk";
|
|
@@ -6578,6 +6661,27 @@ async function copyStatusesFrom(client, sourceId) {
|
|
|
6578
6661
|
}
|
|
6579
6662
|
}
|
|
6580
6663
|
|
|
6664
|
+
// src/commands/list-rename.ts
|
|
6665
|
+
async function renameList(config, listId, newName) {
|
|
6666
|
+
const client = new ClickUpClient(config);
|
|
6667
|
+
const result = await client.updateList(listId, { name: newName });
|
|
6668
|
+
return { id: result.id, name: result.name };
|
|
6669
|
+
}
|
|
6670
|
+
|
|
6671
|
+
// src/commands/folder-rename.ts
|
|
6672
|
+
async function renameFolder(config, folderId, newName) {
|
|
6673
|
+
const client = new ClickUpClient(config);
|
|
6674
|
+
const result = await client.updateFolder(folderId, { name: newName });
|
|
6675
|
+
return { id: result.id, name: result.name };
|
|
6676
|
+
}
|
|
6677
|
+
|
|
6678
|
+
// src/commands/space-rename.ts
|
|
6679
|
+
async function renameSpace(config, spaceId, newName) {
|
|
6680
|
+
const client = new ClickUpClient(config);
|
|
6681
|
+
const result = await client.updateSpace(spaceId, { name: newName });
|
|
6682
|
+
return { id: result.id, name: result.name };
|
|
6683
|
+
}
|
|
6684
|
+
|
|
6581
6685
|
// src/commands/favorite.ts
|
|
6582
6686
|
var VALID_TYPES = /* @__PURE__ */ new Set([
|
|
6583
6687
|
"sprint-folder",
|
|
@@ -6797,7 +6901,7 @@ function buildProgram(programName = basename(process.argv[1] ?? "cup")) {
|
|
|
6797
6901
|
}
|
|
6798
6902
|
)
|
|
6799
6903
|
);
|
|
6800
|
-
program.command("create").description("Create a new task").option("-l, --list <listId>", 'Target list ID or "sprint:current" for active sprint').requiredOption("-n, --name <name>", "Task name").option("-d, --description <text>", "Task description (markdown supported)").option("-p, --parent <taskId>", "Parent task ID (list auto-detected from parent)").option("-s, --status <status>", "Initial status").option("--priority <level>", "Priority: urgent, high, normal, low (or 1-4)").option("--due-date <date>", "Due date (YYYY-MM-DD)").option("--start-date <date>", "Start date (YYYY-MM-DD)").option("--assignee <userId>", 'Assignee user ID or "me"').option("--tags <tags>", "Comma-separated tag names").option("--custom-item-id <id>", "Custom task type ID (use to create initiatives)").option("--time-estimate <duration>", 'Time estimate (e.g. "2h", "30m", "1h30m")').option("--template <id>", "Create from a task template (find IDs with cup templates)").option("--json", "Force JSON output even in terminal").action(
|
|
6904
|
+
program.command("create").description("Create a new task").option("-l, --list <listId>", 'Target list ID or "sprint:current" for active sprint').requiredOption("-n, --name <name>", "Task name").option("-d, --description <text>", "Task description (markdown supported)").option("-p, --parent <taskId>", "Parent task ID (list auto-detected from parent)").option("-s, --status <status>", "Initial status").option("--priority <level>", "Priority: urgent, high, normal, low (or 1-4)").option("--due-date <date>", "Due date (YYYY-MM-DD)").option("--start-date <date>", "Start date (YYYY-MM-DD)").option("--assignee <userId>", 'Assignee user ID or "me"').option("--tags <tags>", "Comma-separated tag names").option("--custom-item-id <id>", "Custom task type ID (use to create initiatives)").option("--time-estimate <duration>", 'Time estimate (e.g. "2h", "30m", "1h30m")').option("--template <id>", "Create from a task template (find IDs with cup templates)").option("--field <nameAndValue...>", 'Set custom field: --field "Name" value (can repeat)').option("--json", "Force JSON output even in terminal").action(
|
|
6801
6905
|
wrapAction(async (opts) => {
|
|
6802
6906
|
const config = loadConfig(getProfileName());
|
|
6803
6907
|
if (opts.list === "sprint:current") {
|
|
@@ -6807,6 +6911,32 @@ function buildProgram(programName = basename(process.argv[1] ?? "cup")) {
|
|
|
6807
6911
|
const client = new ClickUpClient(config);
|
|
6808
6912
|
opts.assignee = String(await resolveAssigneeId(client, "me"));
|
|
6809
6913
|
}
|
|
6914
|
+
if (opts.field?.length) {
|
|
6915
|
+
if (opts.field.length % 2 !== 0) {
|
|
6916
|
+
throw new Error('--field requires pairs: --field "Name" value');
|
|
6917
|
+
}
|
|
6918
|
+
let listId = opts.list;
|
|
6919
|
+
if (!listId && opts.parent) {
|
|
6920
|
+
const client2 = new ClickUpClient(config);
|
|
6921
|
+
const parentTask = await client2.getTask(opts.parent);
|
|
6922
|
+
listId = parentTask.list.id;
|
|
6923
|
+
opts.list = listId;
|
|
6924
|
+
}
|
|
6925
|
+
if (!listId) {
|
|
6926
|
+
throw new Error("--field requires --list or --parent to resolve custom field names");
|
|
6927
|
+
}
|
|
6928
|
+
const client = new ClickUpClient(config);
|
|
6929
|
+
const fields = await client.getListCustomFields(listId);
|
|
6930
|
+
const customFields = [];
|
|
6931
|
+
for (let i = 0; i < opts.field.length; i += 2) {
|
|
6932
|
+
const fieldName = opts.field[i];
|
|
6933
|
+
const rawValue = opts.field[i + 1];
|
|
6934
|
+
const field = findFieldByName(fields, fieldName);
|
|
6935
|
+
const value = parseFieldValue(field, rawValue);
|
|
6936
|
+
customFields.push({ id: field.id, value });
|
|
6937
|
+
}
|
|
6938
|
+
opts.customFields = customFields;
|
|
6939
|
+
}
|
|
6810
6940
|
const result = await createTask(config, opts);
|
|
6811
6941
|
if (shouldOutputJson(opts.json ?? false)) {
|
|
6812
6942
|
console.log(JSON.stringify(result, null, 2));
|
|
@@ -7612,6 +7742,13 @@ function buildProgram(programName = basename(process.argv[1] ?? "cup")) {
|
|
|
7612
7742
|
outputBulkResult(result, opts.json ?? false, `field "${opts.set[0]}"`);
|
|
7613
7743
|
})
|
|
7614
7744
|
);
|
|
7745
|
+
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(
|
|
7746
|
+
wrapAction(async (taskIds, opts) => {
|
|
7747
|
+
const config = loadConfig(getProfileName());
|
|
7748
|
+
const result = await bulkMove(config, opts.to, taskIds);
|
|
7749
|
+
outputBulkResult(result, opts.json ?? false, `move to list ${opts.to}`);
|
|
7750
|
+
})
|
|
7751
|
+
);
|
|
7615
7752
|
program.command("goals").description("List goals in your workspace").option("--json", "Force JSON output even in terminal").action(
|
|
7616
7753
|
wrapAction(async (opts) => {
|
|
7617
7754
|
const config = loadConfig(getProfileName());
|
|
@@ -7844,6 +7981,42 @@ function buildProgram(programName = basename(process.argv[1] ?? "cup")) {
|
|
|
7844
7981
|
}
|
|
7845
7982
|
})
|
|
7846
7983
|
);
|
|
7984
|
+
program.command("list-rename <listId> <newName>").description("Rename a list").option("--json", "Force JSON output even in terminal").action(
|
|
7985
|
+
wrapAction(async (listId, newName, opts) => {
|
|
7986
|
+
if (!newName.trim()) throw new Error("List name cannot be empty");
|
|
7987
|
+
const config = loadConfig(getProfileName());
|
|
7988
|
+
const result = await renameList(config, listId, newName);
|
|
7989
|
+
if (shouldOutputJson(opts.json ?? false)) {
|
|
7990
|
+
console.log(JSON.stringify(result, null, 2));
|
|
7991
|
+
} else {
|
|
7992
|
+
console.log(`Renamed list ${result.id} to "${result.name}"`);
|
|
7993
|
+
}
|
|
7994
|
+
})
|
|
7995
|
+
);
|
|
7996
|
+
program.command("folder-rename <folderId> <newName>").description("Rename a folder").option("--json", "Force JSON output even in terminal").action(
|
|
7997
|
+
wrapAction(async (folderId, newName, opts) => {
|
|
7998
|
+
if (!newName.trim()) throw new Error("Folder name cannot be empty");
|
|
7999
|
+
const config = loadConfig(getProfileName());
|
|
8000
|
+
const result = await renameFolder(config, folderId, newName);
|
|
8001
|
+
if (shouldOutputJson(opts.json ?? false)) {
|
|
8002
|
+
console.log(JSON.stringify(result, null, 2));
|
|
8003
|
+
} else {
|
|
8004
|
+
console.log(`Renamed folder ${result.id} to "${result.name}"`);
|
|
8005
|
+
}
|
|
8006
|
+
})
|
|
8007
|
+
);
|
|
8008
|
+
program.command("space-rename <spaceId> <newName>").description("Rename a space").option("--json", "Force JSON output even in terminal").action(
|
|
8009
|
+
wrapAction(async (spaceId, newName, opts) => {
|
|
8010
|
+
if (!newName.trim()) throw new Error("Space name cannot be empty");
|
|
8011
|
+
const config = loadConfig(getProfileName());
|
|
8012
|
+
const result = await renameSpace(config, spaceId, newName);
|
|
8013
|
+
if (shouldOutputJson(opts.json ?? false)) {
|
|
8014
|
+
console.log(JSON.stringify(result, null, 2));
|
|
8015
|
+
} else {
|
|
8016
|
+
console.log(`Renamed space ${result.id} to "${result.name}"`);
|
|
8017
|
+
}
|
|
8018
|
+
})
|
|
8019
|
+
);
|
|
7847
8020
|
program.command("doc-create <title>").description("Create a new doc").option("-c, --content <text>", "Initial content (markdown)").option("--json", "Force JSON output even in terminal").action(
|
|
7848
8021
|
wrapAction(async (title, opts) => {
|
|
7849
8022
|
const config = loadConfig(getProfileName());
|
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.23.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.23.0, update with `npm install -g @krodak/clickup-cli` and refresh this skill with `cup skill`.
|
|
11
11
|
|
|
12
12
|
## Install & Configure
|
|
13
13
|
|
|
@@ -143,72 +143,76 @@ All commands support `--help` for full flag details. All commands support `--jso
|
|
|
143
143
|
|
|
144
144
|
### Write
|
|
145
145
|
|
|
146
|
-
| Command | What it does
|
|
147
|
-
| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
148
|
-
| `cup create -n name [-l listId\|sprint:current] [-p parentId] [-d desc] [-s status] [--priority p] [--due-date d] [--start-date d] [--time-estimate t] [--assignee id\|me] [--tags t] [--custom-item-id n] [--template id]`
|
|
149
|
-
| `cup update <id> [-n name] [-d desc] [-s status] [--priority p] [--due-date d\|none] [--start-date d] [--time-estimate t] [--assignee id\|me] [--remove-assignee id\|me] [--parent id] [--detach] [--archive] [--unarchive] [--field "Name" val]` | Update task fields (including custom fields)
|
|
150
|
-
| `cup comment <id> -m text [--notify-all]` | Post comment on task
|
|
151
|
-
| `cup comment-edit <commentId> -m text [--resolved] [--unresolved]` | Edit a comment
|
|
152
|
-
| `cup comment-delete <commentId>` or `cup comment-delete --task <taskId> --mine [--match text]` | Delete a comment by ID or delete one of your task comments
|
|
153
|
-
| `cup replies <commentId>` | List threaded replies
|
|
154
|
-
| `cup reply <commentId> -m text [--notify-all]` | Reply to a comment
|
|
155
|
-
| `cup assign <id> [--to ids\|me] [--remove ids\|me]` | Assign/unassign users (`--to`/`--remove` accept comma-separated IDs)
|
|
156
|
-
| `cup depend <id> [--on taskId] [--blocks taskId] [--remove]` | Add/remove dependencies
|
|
157
|
-
| `cup move <id> [--to listId\|sprint:current] [--remove listId]` | Add/remove task from lists (`--to` accepts `sprint:current`)
|
|
158
|
-
| `cup field <id> [--set "Name" value] [--remove "Name"]` | Set/remove custom field values
|
|
159
|
-
| `cup field-create <name> -t <type> [-d desc] [--options "a,b,c"] [--required]` | Create a custom field
|
|
160
|
-
| `cup tag <id> [--add tags] [--remove tags]` | Add/remove tags on a task
|
|
161
|
-
| `cup link <taskId> <linksTo> [--remove]` | Link/unlink tasks
|
|
162
|
-
| `cup attach <taskId> <filePath>` | Upload file attachment
|
|
163
|
-
| `cup delete <id> [--confirm]` | Delete task (DESTRUCTIVE)
|
|
164
|
-
| `cup duplicate <taskId>` | Duplicate a task
|
|
165
|
-
| `cup bulk status <status> <taskIds...>` | Bulk update status
|
|
166
|
-
| `cup bulk assign <taskIds...> [--to userId\|me] [--remove userId\|me]` | Bulk assign/unassign user from tasks
|
|
167
|
-
| `cup bulk due-date <date\|none\|clear> <taskIds...>` | Bulk set or clear due dates
|
|
168
|
-
| `cup bulk tag <tagName> <taskIds...> [--add] [--remove]` | Bulk add/remove tag from tasks
|
|
169
|
-
| `cup
|
|
170
|
-
| `cup checklist
|
|
171
|
-
| `cup checklist
|
|
172
|
-
| `cup checklist
|
|
173
|
-
| `cup checklist
|
|
174
|
-
| `cup checklist
|
|
175
|
-
| `cup
|
|
176
|
-
| `cup time
|
|
177
|
-
| `cup time
|
|
178
|
-
| `cup time
|
|
179
|
-
| `cup time
|
|
180
|
-
| `cup time
|
|
181
|
-
| `cup time
|
|
182
|
-
| `cup
|
|
183
|
-
| `cup goal-
|
|
184
|
-
| `cup goal-
|
|
185
|
-
| `cup
|
|
186
|
-
| `cup key-result-
|
|
187
|
-
| `cup key-result-
|
|
188
|
-
| `cup
|
|
189
|
-
| `cup doc-
|
|
190
|
-
| `cup doc-page-
|
|
191
|
-
| `cup doc-
|
|
192
|
-
| `cup doc-
|
|
193
|
-
| `cup
|
|
194
|
-
| `cup
|
|
195
|
-
| `cup
|
|
196
|
-
| `cup
|
|
197
|
-
| `cup
|
|
198
|
-
| `cup
|
|
199
|
-
| `cup
|
|
200
|
-
| `cup
|
|
201
|
-
| `cup
|
|
202
|
-
| `cup
|
|
203
|
-
| `cup
|
|
204
|
-
| `cup
|
|
205
|
-
| `cup
|
|
206
|
-
| `cup
|
|
207
|
-
| `cup
|
|
208
|
-
| `cup
|
|
209
|
-
| `cup
|
|
210
|
-
| `cup
|
|
211
|
-
| `cup
|
|
146
|
+
| Command | What it does |
|
|
147
|
+
| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------ |
|
|
148
|
+
| `cup create -n name [-l listId\|sprint:current] [-p parentId] [-d desc] [-s status] [--priority p] [--due-date d] [--start-date d] [--time-estimate t] [--assignee id\|me] [--tags t] [--custom-item-id n] [--template id] [--field "Name" val]` | Create task (`--list` accepts `sprint:current`, `--field` sets custom fields inline) |
|
|
149
|
+
| `cup update <id> [-n name] [-d desc] [-s status] [--priority p] [--due-date d\|none] [--start-date d] [--time-estimate t] [--assignee id\|me] [--remove-assignee id\|me] [--parent id] [--detach] [--archive] [--unarchive] [--field "Name" val]` | Update task fields (including custom fields) |
|
|
150
|
+
| `cup comment <id> -m text [--notify-all]` | Post comment on task |
|
|
151
|
+
| `cup comment-edit <commentId> -m text [--resolved] [--unresolved]` | Edit a comment |
|
|
152
|
+
| `cup comment-delete <commentId>` or `cup comment-delete --task <taskId> --mine [--match text]` | Delete a comment by ID or delete one of your task comments |
|
|
153
|
+
| `cup replies <commentId>` | List threaded replies |
|
|
154
|
+
| `cup reply <commentId> -m text [--notify-all]` | Reply to a comment |
|
|
155
|
+
| `cup assign <id> [--to ids\|me] [--remove ids\|me]` | Assign/unassign users (`--to`/`--remove` accept comma-separated IDs) |
|
|
156
|
+
| `cup depend <id> [--on taskId] [--blocks taskId] [--remove]` | Add/remove dependencies |
|
|
157
|
+
| `cup move <id> [--to listId\|sprint:current] [--remove listId]` | Add/remove task from lists (`--to` accepts `sprint:current`) |
|
|
158
|
+
| `cup field <id> [--set "Name" value] [--remove "Name"]` | Set/remove custom field values |
|
|
159
|
+
| `cup field-create <name> -t <type> [-d desc] [--options "a,b,c"] [--required]` | Create a custom field |
|
|
160
|
+
| `cup tag <id> [--add tags] [--remove tags]` | Add/remove tags on a task |
|
|
161
|
+
| `cup link <taskId> <linksTo> [--remove]` | Link/unlink tasks |
|
|
162
|
+
| `cup attach <taskId> <filePath>` | Upload file attachment |
|
|
163
|
+
| `cup delete <id> [--confirm]` | Delete task (DESTRUCTIVE) |
|
|
164
|
+
| `cup duplicate <taskId>` | Duplicate a task |
|
|
165
|
+
| `cup bulk status <status> <taskIds...>` | Bulk update status |
|
|
166
|
+
| `cup bulk assign <taskIds...> [--to userId\|me] [--remove userId\|me]` | Bulk assign/unassign user from tasks |
|
|
167
|
+
| `cup bulk due-date <date\|none\|clear> <taskIds...>` | Bulk set or clear due dates |
|
|
168
|
+
| `cup bulk tag <tagName> <taskIds...> [--add] [--remove]` | Bulk add/remove tag from tasks |
|
|
169
|
+
| `cup bulk move <taskIds...> --to <listId>` | Bulk move tasks to a destination list |
|
|
170
|
+
| `cup checklist view <id>` | View checklists on a task |
|
|
171
|
+
| `cup checklist create <id> <name>` | Create a checklist |
|
|
172
|
+
| `cup checklist delete <checklistId>` | Delete a checklist |
|
|
173
|
+
| `cup checklist add-item <checklistId> <name>` | Add item to checklist |
|
|
174
|
+
| `cup checklist edit-item <checklistId> <itemId> [--name n] [--resolved] [--unresolved] [--assignee id]` | Edit checklist item |
|
|
175
|
+
| `cup checklist delete-item <checklistId> <itemId>` | Delete checklist item |
|
|
176
|
+
| `cup time start <taskId> [-d desc]` | Start timer |
|
|
177
|
+
| `cup time stop` | Stop running timer |
|
|
178
|
+
| `cup time status` | Show running timer |
|
|
179
|
+
| `cup time log <taskId> <duration> [-d desc]` | Log manual entry (e.g. "2h", "30m") |
|
|
180
|
+
| `cup time list [--days n] [--task id] [--all]` | List my recent time entries (--all for team) |
|
|
181
|
+
| `cup time update <timeEntryId> [-d desc] [--duration dur]` | Update time entry |
|
|
182
|
+
| `cup time delete <timeEntryId>` | Delete time entry |
|
|
183
|
+
| `cup goal-create <name> [-d desc] [--color hex]` | Create a goal |
|
|
184
|
+
| `cup goal-update <goalId> [-n name] [-d desc] [--color hex]` | Update a goal |
|
|
185
|
+
| `cup goal-delete <goalId>` | Delete a goal |
|
|
186
|
+
| `cup key-result-create <goalId> <name> [--type t] [--target n]` | Create key result |
|
|
187
|
+
| `cup key-result-update <keyResultId> [--progress n] [--note text]` | Update key result |
|
|
188
|
+
| `cup key-result-delete <keyResultId>` | Delete key result |
|
|
189
|
+
| `cup doc-create <title> [-c content]` | Create a doc |
|
|
190
|
+
| `cup doc-page-create <docId> <name> [-c content] [--parent-page pageId]` | Create doc page |
|
|
191
|
+
| `cup doc-page-edit <docId> <pageId> [--name text] [-c content]` | Edit doc page |
|
|
192
|
+
| `cup doc-delete <docId>` | Delete a doc |
|
|
193
|
+
| `cup doc-page-delete <docId> <pageId>` | Delete doc page |
|
|
194
|
+
| `cup space-create <name>` | Create a space |
|
|
195
|
+
| `cup list-create <spaceId> <name> [--folder folderId] [--copy-statuses-from id]` | Create a list in a space or folder |
|
|
196
|
+
| `cup folder-create <spaceId> <name>` | Create a folder in a space |
|
|
197
|
+
| `cup list-rename <listId> <newName>` | Rename a list |
|
|
198
|
+
| `cup folder-rename <folderId> <newName>` | Rename a folder |
|
|
199
|
+
| `cup space-rename <spaceId> <newName>` | Rename a space |
|
|
200
|
+
| `cup tag-create <spaceId> <name> [--fg color] [--bg color]` | Create space tag |
|
|
201
|
+
| `cup tag-update <spaceId> <tagName> --name <newName> [--fg c] [--bg c]` | Update space tag |
|
|
202
|
+
| `cup tag-delete <spaceId> <name>` | Delete space tag |
|
|
203
|
+
| `cup list-from-template <name> --template <id> [--space id] [--folder id]` | Create list from template |
|
|
204
|
+
| `cup view-create <listId> <name> -t <type> [--group-by field]` | Create a view on a list |
|
|
205
|
+
| `cup view-update <viewId> [-n name] [--group-by field]` | Update a view |
|
|
206
|
+
| `cup view-delete <viewId> [--confirm]` | Delete a view (DESTRUCTIVE) |
|
|
207
|
+
| `cup favorite add <type> <id> [alias] [-n name]` | Add a local favorite |
|
|
208
|
+
| `cup favorite remove <alias>` | Remove a favorite |
|
|
209
|
+
| `cup favorite list [--type t]` | List favorites (optionally filter by type) |
|
|
210
|
+
| `cup profile list [--json]` | List all profiles |
|
|
211
|
+
| `cup profile add <name>` | Add a new profile (interactive) |
|
|
212
|
+
| `cup profile remove <name>` | Remove a profile |
|
|
213
|
+
| `cup profile use <name>` | Set the default profile |
|
|
214
|
+
| `cup config get <key>` / `set <key> <value>` / `path` | Manage config |
|
|
215
|
+
| `cup completion <shell>` | Shell completions (bash/zsh/fish) |
|
|
212
216
|
|
|
213
217
|
## Global Flags
|
|
214
218
|
|
|
@@ -287,6 +291,7 @@ cup create -n "Fix the thing" -p abc123def
|
|
|
287
291
|
cup create -n "Fix bug" -l <listId> --priority urgent --tags "bug,frontend"
|
|
288
292
|
cup create -n "Bug fix" -l sprint:current # create in active sprint
|
|
289
293
|
cup create -n "Q3 Roadmap" -l <listId> --custom-item-id 1
|
|
294
|
+
cup create -n "New story" -l <listId> --field "Story Points" 5 --field "Stage" "In Review"
|
|
290
295
|
cup comment abc123def -m "Completed in PR #42"
|
|
291
296
|
cup assign abc123def --to me
|
|
292
297
|
cup assign abc123def --to 12345,67890 # assign multiple users at once
|
|
@@ -326,6 +331,9 @@ cup space-create "New Space" # create a space
|
|
|
326
331
|
cup folder-create <spaceId> "Q2" # create a folder
|
|
327
332
|
cup list-create <spaceId> "Backlog" # create a list
|
|
328
333
|
cup list-create <spaceId> "Sprint" --folder <folderId>
|
|
334
|
+
cup space-rename <spaceId> "Platform" # rename a space
|
|
335
|
+
cup folder-rename <folderId> "Q3" # rename a folder
|
|
336
|
+
cup list-rename <listId> "Sprint 12" # rename a list
|
|
329
337
|
cup members # workspace members
|
|
330
338
|
cup fields <listId> # custom fields on a list
|
|
331
339
|
cup task-types # custom task types
|