@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.
@@ -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.22.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
- `Invalid token format. Personal API tokens start with "pk_".
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@krodak/clickup-cli",
3
- "version": "1.22.1",
3
+ "version": "1.23.0",
4
4
  "description": "ClickUp CLI for AI agents and humans",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -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.22.0
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.22.0, update with `npm install -g @krodak/clickup-cli` and refresh this skill with `cup skill`.
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]` | Create task (`--list` accepts `sprint:current`) |
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 checklist view <id>` | View checklists on a task |
170
- | `cup checklist create <id> <name>` | Create a checklist |
171
- | `cup checklist delete <checklistId>` | Delete a checklist |
172
- | `cup checklist add-item <checklistId> <name>` | Add item to checklist |
173
- | `cup checklist edit-item <checklistId> <itemId> [--name n] [--resolved] [--unresolved] [--assignee id]` | Edit checklist item |
174
- | `cup checklist delete-item <checklistId> <itemId>` | Delete checklist item |
175
- | `cup time start <taskId> [-d desc]` | Start timer |
176
- | `cup time stop` | Stop running timer |
177
- | `cup time status` | Show running timer |
178
- | `cup time log <taskId> <duration> [-d desc]` | Log manual entry (e.g. "2h", "30m") |
179
- | `cup time list [--days n] [--task id] [--all]` | List my recent time entries (--all for team) |
180
- | `cup time update <timeEntryId> [-d desc] [--duration dur]` | Update time entry |
181
- | `cup time delete <timeEntryId>` | Delete time entry |
182
- | `cup goal-create <name> [-d desc] [--color hex]` | Create a goal |
183
- | `cup goal-update <goalId> [-n name] [-d desc] [--color hex]` | Update a goal |
184
- | `cup goal-delete <goalId>` | Delete a goal |
185
- | `cup key-result-create <goalId> <name> [--type t] [--target n]` | Create key result |
186
- | `cup key-result-update <keyResultId> [--progress n] [--note text]` | Update key result |
187
- | `cup key-result-delete <keyResultId>` | Delete key result |
188
- | `cup doc-create <title> [-c content]` | Create a doc |
189
- | `cup doc-page-create <docId> <name> [-c content] [--parent-page pageId]` | Create doc page |
190
- | `cup doc-page-edit <docId> <pageId> [--name text] [-c content]` | Edit doc page |
191
- | `cup doc-delete <docId>` | Delete a doc |
192
- | `cup doc-page-delete <docId> <pageId>` | Delete doc page |
193
- | `cup space-create <name>` | Create a space |
194
- | `cup list-create <spaceId> <name> [--folder folderId] [--copy-statuses-from id]` | Create a list in a space or folder |
195
- | `cup folder-create <spaceId> <name>` | Create a folder in a space |
196
- | `cup tag-create <spaceId> <name> [--fg color] [--bg color]` | Create space tag |
197
- | `cup tag-update <spaceId> <tagName> --name <newName> [--fg c] [--bg c]` | Update space tag |
198
- | `cup tag-delete <spaceId> <name>` | Delete space tag |
199
- | `cup list-from-template <name> --template <id> [--space id] [--folder id]` | Create list from template |
200
- | `cup view-create <listId> <name> -t <type> [--group-by field]` | Create a view on a list |
201
- | `cup view-update <viewId> [-n name] [--group-by field]` | Update a view |
202
- | `cup view-delete <viewId> [--confirm]` | Delete a view (DESTRUCTIVE) |
203
- | `cup favorite add <type> <id> [alias] [-n name]` | Add a local favorite |
204
- | `cup favorite remove <alias>` | Remove a favorite |
205
- | `cup favorite list [--type t]` | List favorites (optionally filter by type) |
206
- | `cup profile list [--json]` | List all profiles |
207
- | `cup profile add <name>` | Add a new profile (interactive) |
208
- | `cup profile remove <name>` | Remove a profile |
209
- | `cup profile use <name>` | Set the default profile |
210
- | `cup config get <key>` / `set <key> <value>` / `path` | Manage config |
211
- | `cup completion <shell>` | Shell completions (bash/zsh/fish) |
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