@krodak/clickup-cli 1.23.0 → 1.23.1
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 +15 -15
- package/dist/index.js +71 -39
- package/package.json +1 -1
- package/skills/clickup-cli/SKILL.md +79 -76
|
@@ -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.23.
|
|
4
|
+
"version": "1.23.1",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Krzysztof Rodak"
|
|
7
7
|
},
|
package/README.md
CHANGED
|
@@ -171,21 +171,21 @@ npx skills add https://github.com/krodak/clickup-cli
|
|
|
171
171
|
|
|
172
172
|
Full CRUD for the core ClickUp workflow:
|
|
173
173
|
|
|
174
|
-
| Area | Capabilities
|
|
175
|
-
| -------------------- |
|
|
176
|
-
| ✅ **Tasks** | Create, read, update, delete, duplicate, search, subtasks, assign, dependencies, links, multi-list, bulk status
|
|
177
|
-
| 💬 **Comments** | Post, edit, delete by ID or by task scope for your own comments, threaded replies, notify all
|
|
178
|
-
| 📄 **Docs** | List, read, create, edit, delete (v3 API)
|
|
179
|
-
| ⏱️ **Time Tracking** | Start/stop timer, log entries, list/update/delete history
|
|
180
|
-
| ☑️ **Checklists** | View, create, delete, add/edit/delete items
|
|
181
|
-
| 🔧 **Custom Fields** | List, create, set, remove values (dropdown, labels, date, checkbox,
|
|
182
|
-
| 🏷️ **Tags** | Add/remove on tasks, space-level create/update/delete
|
|
183
|
-
| 🎯 **Goals & OKRs** | Goals CRUD, key results CRUD
|
|
184
|
-
| 🏃 **Sprints** | Auto-detect active sprint, `sprint:current` pseudo-ID for move/create, flexible date parsing, config override, favorite sprint folders
|
|
185
|
-
| ⭐ **Favorites** | Local favorites for quick access to sprint folders, spaces, lists, folders, views, tasks
|
|
186
|
-
| 👁️ **Views** | List, get, create, update, delete views on lists
|
|
187
|
-
| 🏢 **Workspace** | Spaces, folders, lists (read + create + rename + from template), members, task types, templates
|
|
188
|
-
| 📎 **Attachments** | Upload files to tasks, shown in detail views
|
|
174
|
+
| Area | Capabilities |
|
|
175
|
+
| -------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
176
|
+
| ✅ **Tasks** | Create, read, update, delete, duplicate, search, subtasks, assign, dependencies, links, multi-list, bulk operations (status, assign, due-date, tag, priority, field, move) |
|
|
177
|
+
| 💬 **Comments** | Post, edit, delete by ID or by task scope for your own comments, threaded replies, notify all |
|
|
178
|
+
| 📄 **Docs** | List, read, create, edit, delete (v3 API) |
|
|
179
|
+
| ⏱️ **Time Tracking** | Start/stop timer, log entries, list/update/delete history |
|
|
180
|
+
| ☑️ **Checklists** | View, create, delete, add/edit/delete items |
|
|
181
|
+
| 🔧 **Custom Fields** | List, create, set, remove values (text, number, dropdown, labels, date, checkbox, url, email, rating, progress, relationship, people) |
|
|
182
|
+
| 🏷️ **Tags** | Add/remove on tasks, space-level create/update/delete |
|
|
183
|
+
| 🎯 **Goals & OKRs** | Goals CRUD, key results CRUD |
|
|
184
|
+
| 🏃 **Sprints** | Auto-detect active sprint, `sprint:current` pseudo-ID for move/create, flexible date parsing, config override, favorite sprint folders |
|
|
185
|
+
| ⭐ **Favorites** | Local favorites for quick access to sprint folders, spaces, lists, folders, views, tasks |
|
|
186
|
+
| 👁️ **Views** | List, get, create, update, delete views on lists |
|
|
187
|
+
| 🏢 **Workspace** | Spaces, folders, lists (read + create + rename + from template), members, task types, templates |
|
|
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)
|
|
191
191
|
|
package/dist/index.js
CHANGED
|
@@ -7,13 +7,15 @@ import { Command } from "commander";
|
|
|
7
7
|
import { createRequire } from "module";
|
|
8
8
|
import { fileURLToPath } from "url";
|
|
9
9
|
|
|
10
|
+
// src/util/guards.ts
|
|
11
|
+
function isRecord(value) {
|
|
12
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
13
|
+
}
|
|
14
|
+
|
|
10
15
|
// src/api.ts
|
|
11
16
|
var BASE_URL = "https://api.clickup.com/api/v2";
|
|
12
17
|
var BASE_URL_V3 = "https://api.clickup.com/api/v3";
|
|
13
18
|
var MAX_PAGES = 100;
|
|
14
|
-
function isRecord(value) {
|
|
15
|
-
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
16
|
-
}
|
|
17
19
|
function expectRecord(value, context) {
|
|
18
20
|
if (!isRecord(value)) {
|
|
19
21
|
throw new Error(`Unexpected API response: expected ${context} object`);
|
|
@@ -887,8 +889,44 @@ var ClickUpClient = class {
|
|
|
887
889
|
import fs from "fs";
|
|
888
890
|
import { homedir } from "os";
|
|
889
891
|
import { join } from "path";
|
|
890
|
-
|
|
891
|
-
|
|
892
|
+
var VALID_FAVORITE_TYPES = /* @__PURE__ */ new Set([
|
|
893
|
+
"sprint-folder",
|
|
894
|
+
"space",
|
|
895
|
+
"list",
|
|
896
|
+
"folder",
|
|
897
|
+
"view",
|
|
898
|
+
"task"
|
|
899
|
+
]);
|
|
900
|
+
function isFilterEntry(v) {
|
|
901
|
+
if (!isRecord(v)) return false;
|
|
902
|
+
if (!Array.isArray(v.command)) return false;
|
|
903
|
+
if (!v.command.every((c) => typeof c === "string")) return false;
|
|
904
|
+
if (v.description !== void 0 && typeof v.description !== "string") return false;
|
|
905
|
+
return true;
|
|
906
|
+
}
|
|
907
|
+
function parseFiltersMap(raw) {
|
|
908
|
+
if (!isRecord(raw)) return {};
|
|
909
|
+
const out = {};
|
|
910
|
+
for (const [key, value] of Object.entries(raw)) {
|
|
911
|
+
if (isFilterEntry(value)) out[key] = value;
|
|
912
|
+
}
|
|
913
|
+
return out;
|
|
914
|
+
}
|
|
915
|
+
function isFavoriteEntry(v) {
|
|
916
|
+
if (!isRecord(v)) return false;
|
|
917
|
+
if (typeof v.type !== "string") return false;
|
|
918
|
+
if (!VALID_FAVORITE_TYPES.has(v.type)) return false;
|
|
919
|
+
if (typeof v.id !== "string") return false;
|
|
920
|
+
if (v.name !== void 0 && typeof v.name !== "string") return false;
|
|
921
|
+
return true;
|
|
922
|
+
}
|
|
923
|
+
function parseFavoritesMap(raw) {
|
|
924
|
+
if (!isRecord(raw)) return {};
|
|
925
|
+
const out = {};
|
|
926
|
+
for (const [key, value] of Object.entries(raw)) {
|
|
927
|
+
if (isFavoriteEntry(value)) out[key] = value;
|
|
928
|
+
}
|
|
929
|
+
return out;
|
|
892
930
|
}
|
|
893
931
|
function readConfigString(parsed, key, path, strict) {
|
|
894
932
|
const value = parsed[key];
|
|
@@ -912,7 +950,7 @@ function parseConfigFile(raw, path, strictFields, strictRoot = strictFields) {
|
|
|
912
950
|
}
|
|
913
951
|
return {};
|
|
914
952
|
}
|
|
915
|
-
if (!
|
|
953
|
+
if (!isRecord(parsed)) {
|
|
916
954
|
if (strictRoot) {
|
|
917
955
|
throw new Error(`Config file at ${path} must contain a JSON object.`);
|
|
918
956
|
}
|
|
@@ -978,18 +1016,18 @@ function migrateToMultiProfile(parsed, filePath) {
|
|
|
978
1016
|
});
|
|
979
1017
|
return migrated;
|
|
980
1018
|
}
|
|
981
|
-
if (
|
|
1019
|
+
if (isRecord(parsed.profiles)) {
|
|
982
1020
|
const profiles = {};
|
|
983
1021
|
for (const [name, value] of Object.entries(parsed.profiles)) {
|
|
984
|
-
if (
|
|
1022
|
+
if (isRecord(value)) {
|
|
985
1023
|
const p = {};
|
|
986
1024
|
if (typeof value.apiToken === "string" && value.apiToken.trim())
|
|
987
1025
|
p.apiToken = value.apiToken.trim();
|
|
988
1026
|
if (typeof value.teamId === "string" && value.teamId.trim()) p.teamId = value.teamId.trim();
|
|
989
1027
|
if (typeof value.sprintFolderId === "string" && value.sprintFolderId.trim())
|
|
990
1028
|
p.sprintFolderId = value.sprintFolderId.trim();
|
|
991
|
-
if (
|
|
992
|
-
if (
|
|
1029
|
+
if (value.filters !== void 0) p.filters = parseFiltersMap(value.filters);
|
|
1030
|
+
if (value.favorites !== void 0) p.favorites = parseFavoritesMap(value.favorites);
|
|
993
1031
|
profiles[name] = p;
|
|
994
1032
|
}
|
|
995
1033
|
}
|
|
@@ -1010,7 +1048,7 @@ function parseRawConfig(filePath) {
|
|
|
1010
1048
|
`Config file at ${filePath} contains invalid JSON. Please check the file syntax.`
|
|
1011
1049
|
);
|
|
1012
1050
|
}
|
|
1013
|
-
if (!
|
|
1051
|
+
if (!isRecord(parsed)) {
|
|
1014
1052
|
throw new Error(`Config file at ${filePath} must contain a JSON object.`);
|
|
1015
1053
|
}
|
|
1016
1054
|
return { parsed, raw };
|
|
@@ -1100,7 +1138,7 @@ function loadMultiProfileConfig() {
|
|
|
1100
1138
|
} catch {
|
|
1101
1139
|
return { defaultProfile: "", profiles: {} };
|
|
1102
1140
|
}
|
|
1103
|
-
if (!
|
|
1141
|
+
if (!isRecord(parsed)) return { defaultProfile: "", profiles: {} };
|
|
1104
1142
|
if (isOldFormat(parsed)) {
|
|
1105
1143
|
return migrateToMultiProfile(parsed, path);
|
|
1106
1144
|
}
|
|
@@ -1165,7 +1203,7 @@ function loadRawConfig(profileName) {
|
|
|
1165
1203
|
} catch {
|
|
1166
1204
|
return {};
|
|
1167
1205
|
}
|
|
1168
|
-
if (!
|
|
1206
|
+
if (!isRecord(parsed)) {
|
|
1169
1207
|
throw new Error(`Config file at ${path} must contain a JSON object.`);
|
|
1170
1208
|
}
|
|
1171
1209
|
if (isOldFormat(parsed)) {
|
|
@@ -1565,7 +1603,7 @@ function formatCustomFieldValue(field) {
|
|
|
1565
1603
|
switch (field.type) {
|
|
1566
1604
|
case "drop_down": {
|
|
1567
1605
|
if (!options) return stringifyFieldValue(field.value);
|
|
1568
|
-
const match = options.find((o) => o.
|
|
1606
|
+
const match = options.find((o) => o.orderindex === Number(field.value));
|
|
1569
1607
|
return match?.name ?? stringifyFieldValue(field.value);
|
|
1570
1608
|
}
|
|
1571
1609
|
case "labels": {
|
|
@@ -5443,7 +5481,7 @@ function parseFieldValue(field, rawValue) {
|
|
|
5443
5481
|
const available = options.map((o) => o.name).join(", ");
|
|
5444
5482
|
throw new Error(`Label "${name}" not found. Available: ${available}`);
|
|
5445
5483
|
}
|
|
5446
|
-
ids.push(
|
|
5484
|
+
ids.push(option.id);
|
|
5447
5485
|
}
|
|
5448
5486
|
return ids;
|
|
5449
5487
|
}
|
|
@@ -6124,31 +6162,34 @@ async function duplicateTask(config, taskId) {
|
|
|
6124
6162
|
return { id: created.id, name: created.name, url: created.url };
|
|
6125
6163
|
}
|
|
6126
6164
|
|
|
6127
|
-
// src/
|
|
6128
|
-
var BULK_CONCURRENCY = 5;
|
|
6165
|
+
// src/util/batch.ts
|
|
6129
6166
|
async function runInBatches(items, concurrency, fn) {
|
|
6167
|
+
if (!Number.isInteger(concurrency) || concurrency < 1) {
|
|
6168
|
+
throw new Error(`concurrency must be a positive integer, got ${concurrency}`);
|
|
6169
|
+
}
|
|
6130
6170
|
const results = [];
|
|
6131
6171
|
for (let i = 0; i < items.length; i += concurrency) {
|
|
6132
6172
|
const batch = items.slice(i, i + concurrency);
|
|
6133
|
-
const
|
|
6134
|
-
|
|
6173
|
+
const settled = await Promise.allSettled(batch.map(fn));
|
|
6174
|
+
settled.forEach((res, idx) => {
|
|
6135
6175
|
const item = batch[idx];
|
|
6136
6176
|
if (res.status === "fulfilled") {
|
|
6137
|
-
results.push({ item, result: res.value });
|
|
6177
|
+
results.push({ item, ok: true, result: res.value });
|
|
6138
6178
|
} else {
|
|
6139
|
-
|
|
6140
|
-
|
|
6141
|
-
error: res.reason instanceof Error ? res.reason : new Error(String(res.reason))
|
|
6142
|
-
});
|
|
6179
|
+
const error = res.reason instanceof Error ? res.reason : new Error(String(res.reason), { cause: res.reason });
|
|
6180
|
+
results.push({ item, ok: false, error });
|
|
6143
6181
|
}
|
|
6144
6182
|
});
|
|
6145
6183
|
}
|
|
6146
6184
|
return results;
|
|
6147
6185
|
}
|
|
6186
|
+
|
|
6187
|
+
// src/commands/bulk.ts
|
|
6188
|
+
var BULK_CONCURRENCY = 5;
|
|
6148
6189
|
function toBulkResult(outcomes) {
|
|
6149
6190
|
const failed = [];
|
|
6150
6191
|
for (const outcome of outcomes) {
|
|
6151
|
-
if (outcome.
|
|
6192
|
+
if (!outcome.ok) {
|
|
6152
6193
|
failed.push({ id: outcome.item, reason: outcome.error.message });
|
|
6153
6194
|
}
|
|
6154
6195
|
}
|
|
@@ -6484,14 +6525,14 @@ async function createView(config, listId, name, opts) {
|
|
|
6484
6525
|
}
|
|
6485
6526
|
|
|
6486
6527
|
// src/commands/view-update.ts
|
|
6487
|
-
var VALID_GROUP_BY_FIELDS2 = [
|
|
6528
|
+
var VALID_GROUP_BY_FIELDS2 = /* @__PURE__ */ new Set([
|
|
6488
6529
|
"status",
|
|
6489
6530
|
"assignee",
|
|
6490
6531
|
"priority",
|
|
6491
6532
|
"due_date",
|
|
6492
6533
|
"tag",
|
|
6493
6534
|
"sprint"
|
|
6494
|
-
];
|
|
6535
|
+
]);
|
|
6495
6536
|
async function updateView(config, viewId, opts) {
|
|
6496
6537
|
if (opts.name === void 0 && opts.groupBy === void 0) {
|
|
6497
6538
|
throw new Error("Provide at least one of: --name, --group-by");
|
|
@@ -6502,9 +6543,9 @@ async function updateView(config, viewId, opts) {
|
|
|
6502
6543
|
const payload = {};
|
|
6503
6544
|
if (opts.name) payload.name = opts.name;
|
|
6504
6545
|
if (opts.groupBy) {
|
|
6505
|
-
if (!VALID_GROUP_BY_FIELDS2.
|
|
6546
|
+
if (!VALID_GROUP_BY_FIELDS2.has(opts.groupBy)) {
|
|
6506
6547
|
throw new Error(
|
|
6507
|
-
`Invalid group-by field "${opts.groupBy}". Valid fields: ${VALID_GROUP_BY_FIELDS2.join(", ")}`
|
|
6548
|
+
`Invalid group-by field "${opts.groupBy}". Valid fields: ${[...VALID_GROUP_BY_FIELDS2].join(", ")}`
|
|
6508
6549
|
);
|
|
6509
6550
|
}
|
|
6510
6551
|
payload.grouping = { field: opts.groupBy };
|
|
@@ -7682,16 +7723,7 @@ function buildProgram(programName = basename(process.argv[1] ?? "cup")) {
|
|
|
7682
7723
|
wrapAction(async (status, taskIds, opts) => {
|
|
7683
7724
|
const config = loadConfig(getProfileName());
|
|
7684
7725
|
const result = await bulkUpdateStatus(config, taskIds, status);
|
|
7685
|
-
|
|
7686
|
-
console.log(JSON.stringify(result, null, 2));
|
|
7687
|
-
} else {
|
|
7688
|
-
console.log(`Updated ${result.updated} tasks to "${status}"`);
|
|
7689
|
-
if (result.failed.length > 0) {
|
|
7690
|
-
for (const f of result.failed) {
|
|
7691
|
-
console.log(` Failed ${f.id}: ${f.reason}`);
|
|
7692
|
-
}
|
|
7693
|
-
}
|
|
7694
|
-
}
|
|
7726
|
+
outputBulkResult(result, opts.json ?? false, `status ${status}`);
|
|
7695
7727
|
})
|
|
7696
7728
|
);
|
|
7697
7729
|
bulkCmd.command("assign <taskIds...>").description("Bulk assign or unassign a user from tasks").option("--to <userId>", 'Add this user (user ID or "me")').option("--remove <userId>", 'Remove this user (user ID or "me")').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.23.
|
|
6
|
+
# ClickUp CLI (`cup`) - skill version 1.23.1
|
|
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.23.
|
|
10
|
+
> **Version check:** Run `cup --version`. If your installed version is older than 1.23.1, update with `npm install -g @krodak/clickup-cli` and refresh this skill with `cup skill`.
|
|
11
11
|
|
|
12
12
|
## Install & Configure
|
|
13
13
|
|
|
@@ -120,10 +120,11 @@ All commands support `--help` for full flag details. All commands support `--jso
|
|
|
120
120
|
| `cup activity <id>` | Task details + comment history combined |
|
|
121
121
|
| `cup inbox [--days n] [--include-closed]` | Tasks updated in last n days (default 30) |
|
|
122
122
|
| `cup summary [--hours n]` | Standup: completed, in-progress, overdue |
|
|
123
|
-
| `cup overdue [--include-closed]`
|
|
124
|
-
| `cup spaces [--name partial] [--my]`
|
|
125
|
-
| `cup lists <spaceId> [--name partial]`
|
|
126
|
-
| `cup folders <spaceId> [--name partial]`
|
|
123
|
+
| `cup overdue [--all] [--include-closed]` | Tasks past due date (most overdue first) |
|
|
124
|
+
| `cup spaces [--name partial] [--my] [--archived]` | List/filter workspace spaces |
|
|
125
|
+
| `cup lists <spaceId> [--name partial] [--archived]` | Lists in a space (including folder lists) |
|
|
126
|
+
| `cup folders <spaceId> [--name partial] [--archived]` | Folders in a space (with their lists) |
|
|
127
|
+
| `cup time-in-status <id>` | Show how long a task has been in each status |
|
|
127
128
|
| `cup members` | Workspace members (username, ID, email) |
|
|
128
129
|
| `cup fields <listId>` | Custom fields on a list (type, required, options) |
|
|
129
130
|
| `cup tags <spaceId>` | Tags available in a space |
|
|
@@ -143,76 +144,78 @@ All commands support `--help` for full flag details. All commands support `--jso
|
|
|
143
144
|
|
|
144
145
|
### Write
|
|
145
146
|
|
|
146
|
-
| Command
|
|
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]`
|
|
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]`
|
|
151
|
-
| `cup comment-edit <commentId> -m text [--resolved] [--unresolved]`
|
|
152
|
-
| `cup comment-delete <commentId>` or `cup comment-delete --task <taskId> --mine [--match text]`
|
|
153
|
-
| `cup replies <commentId>`
|
|
154
|
-
| `cup reply <commentId> -m text [--notify-all]`
|
|
155
|
-
| `cup assign <id> [--to ids\|me] [--remove ids\|me]`
|
|
156
|
-
| `cup depend <id> [--on taskId] [--blocks taskId] [--remove]`
|
|
157
|
-
| `cup move <id> [--to listId\|sprint:current] [--remove listId]`
|
|
158
|
-
| `cup field <id> [--set "Name" value] [--remove "Name"]`
|
|
159
|
-
| `cup field-create <name> -t <type> [-d desc] [--options "a,b,c"] [--required]`
|
|
160
|
-
| `cup tag <id> [--add tags] [--remove tags]`
|
|
161
|
-
| `cup link <taskId> <linksTo> [--remove]`
|
|
162
|
-
| `cup attach <taskId> <filePath>`
|
|
163
|
-
| `cup delete <id> [--confirm]`
|
|
164
|
-
| `cup duplicate <taskId>`
|
|
165
|
-
| `cup bulk status <status> <taskIds...>`
|
|
166
|
-
| `cup bulk assign <taskIds...> [--to userId\|me] [--remove userId\|me]`
|
|
167
|
-
| `cup bulk due-date <date\|none\|clear> <taskIds...>`
|
|
168
|
-
| `cup bulk tag <tagName> <taskIds...> [--
|
|
169
|
-
| `cup bulk
|
|
170
|
-
| `cup
|
|
171
|
-
| `cup
|
|
172
|
-
| `cup checklist
|
|
173
|
-
| `cup checklist
|
|
174
|
-
| `cup checklist
|
|
175
|
-
| `cup checklist
|
|
176
|
-
| `cup
|
|
177
|
-
| `cup
|
|
178
|
-
| `cup time
|
|
179
|
-
| `cup time
|
|
180
|
-
| `cup time
|
|
181
|
-
| `cup time
|
|
182
|
-
| `cup time
|
|
183
|
-
| `cup
|
|
184
|
-
| `cup
|
|
185
|
-
| `cup goal-
|
|
186
|
-
| `cup
|
|
187
|
-
| `cup
|
|
188
|
-
| `cup key-result-
|
|
189
|
-
| `cup
|
|
190
|
-
| `cup
|
|
191
|
-
| `cup doc-
|
|
192
|
-
| `cup doc-
|
|
193
|
-
| `cup doc-page-
|
|
194
|
-
| `cup
|
|
195
|
-
| `cup
|
|
196
|
-
| `cup
|
|
197
|
-
| `cup list-
|
|
198
|
-
| `cup folder-
|
|
199
|
-
| `cup
|
|
200
|
-
| `cup
|
|
201
|
-
| `cup
|
|
202
|
-
| `cup tag-
|
|
203
|
-
| `cup
|
|
204
|
-
| `cup
|
|
205
|
-
| `cup
|
|
206
|
-
| `cup view-
|
|
207
|
-
| `cup
|
|
208
|
-
| `cup
|
|
209
|
-
| `cup favorite
|
|
210
|
-
| `cup
|
|
211
|
-
| `cup
|
|
212
|
-
| `cup profile
|
|
213
|
-
| `cup profile
|
|
214
|
-
| `cup
|
|
215
|
-
| `cup
|
|
147
|
+
| Command | What it does |
|
|
148
|
+
| --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------ |
|
|
149
|
+
| `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) |
|
|
150
|
+
| `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] [--type type] [--field "Name" val]` | Update task fields (including custom fields) |
|
|
151
|
+
| `cup comment <id> -m text [--notify-all]` | Post comment on task |
|
|
152
|
+
| `cup comment-edit <commentId> -m text [--resolved] [--unresolved]` | Edit a comment |
|
|
153
|
+
| `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 |
|
|
154
|
+
| `cup replies <commentId>` | List threaded replies |
|
|
155
|
+
| `cup reply <commentId> -m text [--notify-all]` | Reply to a comment |
|
|
156
|
+
| `cup assign <id> [--to ids\|me] [--remove ids\|me]` | Assign/unassign users (`--to`/`--remove` accept comma-separated IDs) |
|
|
157
|
+
| `cup depend <id> [--on taskId] [--blocks taskId] [--remove]` | Add/remove dependencies |
|
|
158
|
+
| `cup move <id> [--to listId\|sprint:current] [--remove listId]` | Add/remove task from lists (`--to` accepts `sprint:current`) |
|
|
159
|
+
| `cup field <id> [--set "Name" value] [--remove "Name"]` | Set/remove custom field values |
|
|
160
|
+
| `cup field-create <name> -t <type> [-d desc] [--options "a,b,c"] [--required]` | Create a custom field |
|
|
161
|
+
| `cup tag <id> [--add tags] [--remove tags]` | Add/remove tags on a task |
|
|
162
|
+
| `cup link <taskId> <linksTo> [--remove]` | Link/unlink tasks |
|
|
163
|
+
| `cup attach <taskId> <filePath>` | Upload file attachment |
|
|
164
|
+
| `cup delete <id> [--confirm]` | Delete task (DESTRUCTIVE) |
|
|
165
|
+
| `cup duplicate <taskId>` | Duplicate a task |
|
|
166
|
+
| `cup bulk status <status> <taskIds...>` | Bulk update status |
|
|
167
|
+
| `cup bulk assign <taskIds...> [--to userId\|me] [--remove userId\|me]` | Bulk assign/unassign user from tasks |
|
|
168
|
+
| `cup bulk due-date <date\|none\|clear> <taskIds...>` | Bulk set or clear due dates |
|
|
169
|
+
| `cup bulk tag <tagName> <taskIds...> [--remove]` | Bulk add/remove tag from tasks |
|
|
170
|
+
| `cup bulk priority <taskIds...> --to <priority>` | Bulk set priority on many tasks |
|
|
171
|
+
| `cup bulk field <taskIds...> --set "Name" value` | Bulk set a custom field value |
|
|
172
|
+
| `cup bulk move <taskIds...> --to <listId>` | Bulk move tasks to a destination list |
|
|
173
|
+
| `cup checklist view <id>` | View checklists on a task |
|
|
174
|
+
| `cup checklist create <id> <name>` | Create a checklist |
|
|
175
|
+
| `cup checklist delete <checklistId>` | Delete a checklist |
|
|
176
|
+
| `cup checklist add-item <checklistId> <name>` | Add item to checklist |
|
|
177
|
+
| `cup checklist edit-item <checklistId> <itemId> [--name n] [--resolved] [--unresolved] [--assignee id]` | Edit checklist item |
|
|
178
|
+
| `cup checklist delete-item <checklistId> <itemId>` | Delete checklist item |
|
|
179
|
+
| `cup time start <taskId> [-d desc]` | Start timer |
|
|
180
|
+
| `cup time stop` | Stop running timer |
|
|
181
|
+
| `cup time status` | Show running timer |
|
|
182
|
+
| `cup time log <taskId> <duration> [-d desc]` | Log manual entry (e.g. "2h", "30m") |
|
|
183
|
+
| `cup time list [--days n] [--task id] [--all]` | List my recent time entries (--all for team) |
|
|
184
|
+
| `cup time update <timeEntryId> [-d desc] [--duration dur]` | Update time entry |
|
|
185
|
+
| `cup time delete <timeEntryId>` | Delete time entry |
|
|
186
|
+
| `cup goal-create <name> [-d desc] [--color hex]` | Create a goal |
|
|
187
|
+
| `cup goal-update <goalId> [-n name] [-d desc] [--color hex]` | Update a goal |
|
|
188
|
+
| `cup goal-delete <goalId>` | Delete a goal |
|
|
189
|
+
| `cup key-result-create <goalId> <name> [--type t] [--target n]` | Create key result |
|
|
190
|
+
| `cup key-result-update <keyResultId> [--progress n] [--note text]` | Update key result |
|
|
191
|
+
| `cup key-result-delete <keyResultId>` | Delete key result |
|
|
192
|
+
| `cup doc-create <title> [-c content]` | Create a doc |
|
|
193
|
+
| `cup doc-page-create <docId> <name> [-c content] [--parent-page pageId]` | Create doc page |
|
|
194
|
+
| `cup doc-page-edit <docId> <pageId> [--name text] [-c content]` | Edit doc page |
|
|
195
|
+
| `cup doc-delete <docId>` | Delete a doc |
|
|
196
|
+
| `cup doc-page-delete <docId> <pageId>` | Delete doc page |
|
|
197
|
+
| `cup space-create <name>` | Create a space |
|
|
198
|
+
| `cup list-create <spaceId> <name> [--folder folderId] [--copy-statuses-from id]` | Create a list in a space or folder |
|
|
199
|
+
| `cup folder-create <spaceId> <name>` | Create a folder in a space |
|
|
200
|
+
| `cup list-rename <listId> <newName>` | Rename a list |
|
|
201
|
+
| `cup folder-rename <folderId> <newName>` | Rename a folder |
|
|
202
|
+
| `cup space-rename <spaceId> <newName>` | Rename a space |
|
|
203
|
+
| `cup tag-create <spaceId> <name> [--fg color] [--bg color]` | Create space tag |
|
|
204
|
+
| `cup tag-update <spaceId> <tagName> --name <newName> [--fg c] [--bg c]` | Update space tag |
|
|
205
|
+
| `cup tag-delete <spaceId> <name>` | Delete space tag |
|
|
206
|
+
| `cup list-from-template <name> --template <id> [--space id] [--folder id]` | Create list from template |
|
|
207
|
+
| `cup view-create <listId> <name> -t <type> [--group-by field]` | Create a view on a list |
|
|
208
|
+
| `cup view-update <viewId> [-n name] [--group-by field]` | Update a view |
|
|
209
|
+
| `cup view-delete <viewId> [--confirm]` | Delete a view (DESTRUCTIVE) |
|
|
210
|
+
| `cup favorite add <type> <id> [alias] [-n name]` | Add a local favorite |
|
|
211
|
+
| `cup favorite remove <alias>` | Remove a favorite |
|
|
212
|
+
| `cup favorite list [--type t]` | List favorites (optionally filter by type) |
|
|
213
|
+
| `cup profile list [--json]` | List all profiles |
|
|
214
|
+
| `cup profile add <name>` | Add a new profile (interactive) |
|
|
215
|
+
| `cup profile remove <name>` | Remove a profile |
|
|
216
|
+
| `cup profile use <name>` | Set the default profile |
|
|
217
|
+
| `cup config get <key>` / `set <key> <value>` / `path` | Manage config |
|
|
218
|
+
| `cup completion <shell>` | Shell completions (bash/zsh/fish) |
|
|
216
219
|
|
|
217
220
|
## Global Flags
|
|
218
221
|
|