@krodak/clickup-cli 1.26.0 → 1.26.2

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.26.0",
4
+ "version": "1.26.2",
5
5
  "author": {
6
6
  "name": "Krzysztof Rodak"
7
7
  },
package/README.md CHANGED
@@ -51,17 +51,17 @@ Install the CLI, add the skill file to your agent, and it works with ClickUp. No
51
51
 
52
52
  The agent reads the skill file, picks the right `cup` commands, and handles everything. You don't need to learn the CLI - the agent does.
53
53
 
54
- ### Agent mode
54
+ ### Terminal mode (TTY)
55
55
 
56
- When piped (no TTY), output is Markdown optimized for AI context windows. Pass `--json` for structured data.
56
+ Task listing commands (`cup tasks`, `cup search`, `cup sprint`, etc.) present an interactive picker — navigate with arrow keys or j/k, Space to select tasks, Enter to confirm. Selected tasks show full details and offer to open in the browser. Other prompts (sprint disambiguation, delete confirmations) also use interactive selection.
57
57
 
58
- ![Agent Mode - markdown and JSON output](demos/agent-mode.gif)
58
+ ![TTY Mode - interactive tables and detail views](demos/tty-mode.gif)
59
59
 
60
- ### Terminal mode
60
+ ### Agent / piped mode
61
61
 
62
- In a terminal, you get interactive tables with colors. Most commands scope to your assigned tasks by default.
62
+ When piped (no TTY), the same commands output clean Markdown (or JSON with `--json`). No prompts, no colors designed for agents and pipelines.
63
63
 
64
- ![TTY Mode - interactive tables and detail views](demos/tty-mode.gif)
64
+ ![Agent Mode - markdown and JSON output](demos/agent-mode.gif)
65
65
 
66
66
  ## Why a CLI and not MCP?
67
67
 
package/dist/index.js CHANGED
@@ -1464,7 +1464,7 @@ function formatTaskDetailMarkdown(task) {
1464
1464
  lines.push(`**${label}:** ${value}`);
1465
1465
  }
1466
1466
  }
1467
- const descriptionContent = task.markdown_content ?? task.description;
1467
+ const descriptionContent = task.markdown_description ?? task.description;
1468
1468
  if (descriptionContent) {
1469
1469
  lines.push("", "## Description", "", descriptionContent);
1470
1470
  }
@@ -3378,7 +3378,7 @@ var commandMetadata = [
3378
3378
  },
3379
3379
  {
3380
3380
  name: "tasks",
3381
- description: "List tasks assigned to me (use --all for all tasks)",
3381
+ description: "List tasks assigned to you by default. Use --all to search across all assignees.",
3382
3382
  flags: [
3383
3383
  "--status",
3384
3384
  "--list",
@@ -3397,7 +3397,7 @@ var commandMetadata = [
3397
3397
  "--json"
3398
3398
  ],
3399
3399
  quickReference: [
3400
- { section: "read", usage: "tasks", description: "List tasks assigned to me (--all for all)" }
3400
+ { section: "read", usage: "tasks", description: "My tasks (--all for all assignees)" }
3401
3401
  ]
3402
3402
  },
3403
3403
  {
@@ -3599,7 +3599,7 @@ var commandMetadata = [
3599
3599
  },
3600
3600
  {
3601
3601
  name: "search",
3602
- description: "Search my tasks by name (use --all for all tasks)",
3602
+ description: "Search tasks assigned to you by default. Use --all to search across all assignees.",
3603
3603
  flags: [
3604
3604
  "--status",
3605
3605
  "--list",
@@ -3616,7 +3616,11 @@ var commandMetadata = [
3616
3616
  "--json"
3617
3617
  ],
3618
3618
  quickReference: [
3619
- { section: "read", usage: "search <query>", description: "Search my tasks by name" }
3619
+ {
3620
+ section: "read",
3621
+ usage: "search <query>",
3622
+ description: "Search your tasks by name (--all for all assignees)"
3623
+ }
3620
3624
  ]
3621
3625
  },
3622
3626
  {
@@ -5438,6 +5442,29 @@ async function checkAuth(config) {
5438
5442
  }
5439
5443
 
5440
5444
  // src/commands/search.ts
5445
+ async function resolveSpaceNameToId(config, value) {
5446
+ if (/^\d+$/.test(value)) {
5447
+ return value;
5448
+ }
5449
+ const client = new ClickUpClient(config);
5450
+ const spaces = await client.getSpaces(config.teamId);
5451
+ const lower = value.toLowerCase();
5452
+ const matches = spaces.filter((s) => s.name.toLowerCase().includes(lower));
5453
+ if (matches.length === 1) {
5454
+ process.stderr.write(`Space matched: "${value}" -> "${matches[0].name}" (${matches[0].id})
5455
+ `);
5456
+ return matches[0].id;
5457
+ }
5458
+ if (matches.length > 1) {
5459
+ const list = matches.map((s) => ` - "${s.name}" (${s.id})`).join("\n");
5460
+ throw new Error(`Multiple spaces match "${value}":
5461
+ ${list}
5462
+ Specify the space ID directly.`);
5463
+ }
5464
+ const available = spaces.map((s) => ` - "${s.name}" (${s.id})`).join("\n");
5465
+ throw new Error(`No space matching "${value}" found. Available spaces:
5466
+ ${available}`);
5467
+ }
5441
5468
  async function searchTasks(config, query, opts = {}) {
5442
5469
  const trimmed = query.trim();
5443
5470
  if (!trimmed) {
@@ -6972,7 +6999,7 @@ function buildProgram(programName = basename(process.argv[1] ?? "cup")) {
6972
6999
  }
6973
7000
  })
6974
7001
  );
6975
- program.command("tasks").description("List tasks assigned to me (use --all for all tasks)").option("--status <status>", 'Filter by status (e.g. "in progress")').option("--list <listId>", "Filter by list ID").option("--space <spaceId>", "Filter by space ID").option("--name <partial>", "Filter by name (case-insensitive contains)").option(
7002
+ program.command("tasks").description("List tasks assigned to you by default. Use --all to search across all assignees.").option("--status <status>", 'Filter by status (e.g. "in progress")').option("--list <listId>", "Filter by list ID").option("--space <spaceId|name>", "Filter by space ID or name (partial match)").option("--name <partial>", "Filter by name (case-insensitive contains)").option(
6976
7003
  "--type <type>",
6977
7004
  'Filter by task type (e.g. "task", "initiative", or custom type name/ID)'
6978
7005
  ).option("--all", "Include all tasks, not just mine").option("--include-closed", "Include done/closed tasks").option("--assignee <userId>", 'Filter by assignee (user ID or "me")').option("--tag <tag>", "Filter by tag name").option("--due-before <date>", "Tasks due before date (YYYY-MM-DD)").option("--due-after <date>", "Tasks due after date (YYYY-MM-DD)").option("--created-after <date>", "Tasks created after date (YYYY-MM-DD)").option("--created-before <date>", "Tasks created before date (YYYY-MM-DD)").option("--field <nameAndValue...>", 'Filter by custom field: --field "Name" value').option("--json", "Force JSON output even in terminal").action(
@@ -6988,6 +7015,10 @@ function buildProgram(programName = basename(process.argv[1] ?? "cup")) {
6988
7015
  assigneeIds = [Number(opts.assignee)];
6989
7016
  }
6990
7017
  }
7018
+ let resolvedSpaceId;
7019
+ if (opts.space) {
7020
+ resolvedSpaceId = await resolveSpaceNameToId(config, opts.space);
7021
+ }
6991
7022
  const parseDateFilter = (d) => {
6992
7023
  const parts = d.split("-");
6993
7024
  return new Date(Number(parts[0]), Number(parts[1]) - 1, Number(parts[2])).getTime();
@@ -7022,7 +7053,7 @@ function buildProgram(programName = basename(process.argv[1] ?? "cup")) {
7022
7053
  typeFilter: opts.type,
7023
7054
  statuses: opts.status ? [opts.status] : void 0,
7024
7055
  listIds: opts.list ? [opts.list] : void 0,
7025
- spaceIds: opts.space ? [opts.space] : void 0,
7056
+ spaceIds: resolvedSpaceId ? [resolvedSpaceId] : void 0,
7026
7057
  name: opts.name,
7027
7058
  all: opts.all,
7028
7059
  assignees: assigneeIds,
@@ -7334,7 +7365,9 @@ function buildProgram(programName = basename(process.argv[1] ?? "cup")) {
7334
7365
  await openTask(config, query, opts);
7335
7366
  })
7336
7367
  );
7337
- program.command("search <query>").description("Search my tasks by name (use --all for all tasks)").option("--status <status>", "Filter by status").option("--list <listId>", "Filter by list ID").option("--space <spaceId>", "Filter by space ID").option("--all", "Search all tasks, not just mine").option("--include-closed", "Include done/closed tasks in search").option("--assignee <userId>", 'Filter by assignee (user ID or "me")').option("--tag <tag>", "Filter by tag name").option("--due-before <date>", "Tasks due before date (YYYY-MM-DD)").option("--due-after <date>", "Tasks due after date (YYYY-MM-DD)").option("--created-after <date>", "Tasks created after date (YYYY-MM-DD)").option("--created-before <date>", "Tasks created before date (YYYY-MM-DD)").option("--field <nameAndValue...>", 'Filter by custom field: --field "Name" value').option("--json", "Force JSON output even in terminal").action(
7368
+ program.command("search <query>").description(
7369
+ "Search tasks assigned to you by default. Use --all to search across all assignees."
7370
+ ).option("--status <status>", "Filter by status").option("--list <listId>", "Filter by list ID").option("--space <spaceId|name>", "Filter by space ID or name (partial match)").option("--all", "Search all tasks, not just mine").option("--include-closed", "Include done/closed tasks in search").option("--assignee <userId>", 'Filter by assignee (user ID or "me")').option("--tag <tag>", "Filter by tag name").option("--due-before <date>", "Tasks due before date (YYYY-MM-DD)").option("--due-after <date>", "Tasks due after date (YYYY-MM-DD)").option("--created-after <date>", "Tasks created after date (YYYY-MM-DD)").option("--created-before <date>", "Tasks created before date (YYYY-MM-DD)").option("--field <nameAndValue...>", 'Filter by custom field: --field "Name" value').option("--json", "Force JSON output even in terminal").action(
7338
7371
  wrapAction(
7339
7372
  async (query, opts) => {
7340
7373
  const config = loadConfig(getProfileName());
@@ -7348,6 +7381,10 @@ function buildProgram(programName = basename(process.argv[1] ?? "cup")) {
7348
7381
  assigneeIds = [Number(opts.assignee)];
7349
7382
  }
7350
7383
  }
7384
+ let resolvedSpaceId;
7385
+ if (opts.space) {
7386
+ resolvedSpaceId = await resolveSpaceNameToId(config, opts.space);
7387
+ }
7351
7388
  const parseDateFilter = (d) => {
7352
7389
  const parts = d.split("-");
7353
7390
  return new Date(Number(parts[0]), Number(parts[1]) - 1, Number(parts[2])).getTime();
@@ -7383,7 +7420,7 @@ function buildProgram(programName = basename(process.argv[1] ?? "cup")) {
7383
7420
  all: opts.all,
7384
7421
  includeClosed: opts.includeClosed,
7385
7422
  listIds: opts.list ? [opts.list] : void 0,
7386
- spaceIds: opts.space ? [opts.space] : void 0,
7423
+ spaceIds: resolvedSpaceId ? [resolvedSpaceId] : void 0,
7387
7424
  assignees: assigneeIds,
7388
7425
  tags: opts.tag ? [opts.tag] : void 0,
7389
7426
  dueDateLt: opts.dueBefore ? parseDateFilter(opts.dueBefore) : void 0,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@krodak/clickup-cli",
3
- "version": "1.26.0",
3
+ "version": "1.26.2",
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.26.0
6
+ # ClickUp CLI (`cup`) - skill version 1.26.2
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.26.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.26.2, update with `npm install -g @krodak/clickup-cli` and refresh this skill with `cup skill`.
11
11
 
12
12
  ## Install & Configure
13
13
 
@@ -107,40 +107,40 @@ All commands support `--help` for full flag details. All commands support `--jso
107
107
 
108
108
  ### Read
109
109
 
110
- | Command | What it returns |
111
- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------- |
112
- | `cup tasks [--status s] [--name q] [--type t] [--list id] [--space id] [--all] [--include-closed] [--assignee id\|me] [--tag t] [--due-before d] [--due-after d] [--created-after d] [--created-before d] [--field "Name" val]` | My tasks (filter by status, name, type, list, space, assignee, tag, dates, custom fields). `--all` for all tasks in workspace |
113
- | `cup assigned [--status s] [--include-closed]` | All my tasks grouped by status |
114
- | `cup sprint [--status s] [--space nameOrId] [--folder id] [--include-closed]` | Tasks in active sprint (auto-detected) |
115
- | `cup sprints [--space nameOrId]` | List all sprints (marks active with \*) |
116
- | `cup search <query> [--status s] [--list id] [--space id] [--all] [--include-closed] [--assignee id\|me] [--tag t] [--due-before d] [--due-after d] [--created-after d] [--created-before d] [--field "Name" val]` | Search my tasks by name. `--all` for all tasks |
117
- | `cup task <id>` | Single task details (custom fields, checklists, attachments, deps, links) |
118
- | `cup subtasks <id> [--status s] [--name q] [--include-closed]` | Subtasks of a task |
119
- | `cup comments <id>` | Comments on a task |
120
- | `cup activity <id>` | Task details + comment history combined |
121
- | `cup inbox [--days n] [--include-closed]` | Tasks updated in last n days (default 30) |
122
- | `cup summary [--hours n]` | Standup: completed, in-progress, overdue |
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 |
128
- | `cup members` | Workspace members (username, ID, email) |
129
- | `cup fields <listId>` | Custom fields on a list (type, required, options) |
130
- | `cup tags <spaceId>` | Tags available in a space |
131
- | `cup goals` | Workspace goals with progress |
132
- | `cup key-results <goalId>` | Key results for a goal |
133
- | `cup docs [query]` | Workspace docs (optionally filter by name) |
134
- | `cup doc <docId> [pageId]` | Doc metadata + page tree, or a specific page |
135
- | `cup doc-pages <docId>` | All pages in a doc with content |
136
- | `cup task-types` | Custom task types (for `--custom-item-id`) |
137
- | `cup templates` | Task templates (for `--template`) |
138
- | `cup list-templates` | List templates (for `list-from-template`) |
139
- | `cup folder-templates` | Folder templates |
140
- | `cup views <listId>` | List views on a list |
141
- | `cup view <viewId>` | Get view details |
142
- | `cup open <query>` | Open task in browser by ID or name |
143
- | `cup auth` | Check authentication status |
110
+ | Command | What it returns |
111
+ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------- |
112
+ | `cup tasks [--status s] [--name q] [--type t] [--list id] [--space id] [--all] [--include-closed] [--assignee id\|me] [--tag t] [--due-before d] [--due-after d] [--created-after d] [--created-before d] [--field "Name" val]` | Tasks assigned to you (filter by status, name, type, list, space, assignee, tag, dates, custom fields). `--all` for all assignees |
113
+ | `cup assigned [--status s] [--include-closed]` | All my tasks grouped by status |
114
+ | `cup sprint [--status s] [--space nameOrId] [--folder id] [--include-closed]` | Tasks in active sprint (auto-detected) |
115
+ | `cup sprints [--space nameOrId]` | List all sprints (marks active with \*) |
116
+ | `cup search <query> [--status s] [--list id] [--space id] [--all] [--include-closed] [--assignee id\|me] [--tag t] [--due-before d] [--due-after d] [--created-after d] [--created-before d] [--field "Name" val]` | Search your tasks by name. `--all` for all assignees |
117
+ | `cup task <id>` | Single task details (custom fields, checklists, attachments, deps, links) |
118
+ | `cup subtasks <id> [--status s] [--name q] [--include-closed]` | Subtasks of a task |
119
+ | `cup comments <id>` | Comments on a task |
120
+ | `cup activity <id>` | Task details + comment history combined |
121
+ | `cup inbox [--days n] [--include-closed]` | Tasks updated in last n days (default 30) |
122
+ | `cup summary [--hours n]` | Standup: completed, in-progress, overdue |
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 |
128
+ | `cup members` | Workspace members (username, ID, email) |
129
+ | `cup fields <listId>` | Custom fields on a list (type, required, options) |
130
+ | `cup tags <spaceId>` | Tags available in a space |
131
+ | `cup goals` | Workspace goals with progress |
132
+ | `cup key-results <goalId>` | Key results for a goal |
133
+ | `cup docs [query]` | Workspace docs (optionally filter by name) |
134
+ | `cup doc <docId> [pageId]` | Doc metadata + page tree, or a specific page |
135
+ | `cup doc-pages <docId>` | All pages in a doc with content |
136
+ | `cup task-types` | Custom task types (for `--custom-item-id`) |
137
+ | `cup templates` | Task templates (for `--template`) |
138
+ | `cup list-templates` | List templates (for `list-from-template`) |
139
+ | `cup folder-templates` | Folder templates |
140
+ | `cup views <listId>` | List views on a list |
141
+ | `cup view <viewId>` | Get view details |
142
+ | `cup open <query>` | Open task in browser by ID or name |
143
+ | `cup auth` | Check authentication status |
144
144
 
145
145
  ### Write
146
146
 
@@ -252,6 +252,22 @@ All commands support `--help` for full flag details. All commands support `--jso
252
252
  | `cup link` | Both IDs must be the same type (both custom or both native) |
253
253
  | `cup delete` | DESTRUCTIVE. Requires `--confirm` in non-interactive mode. Cannot be undone |
254
254
  | Errors | stderr with exit code 1. Strict parsing - excess/unknown arguments rejected |
255
+ | Description quoting | Use `$'...'` quoting for `-d` / `-m` values containing backticks or newlines: `-d $'Use \`init()\` first.\n\n- Step 1'`. Heredocs and double quotes strip backticks |
256
+
257
+ > **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.
258
+
259
+ ## Interactive Mode (TTY)
260
+
261
+ When running in a terminal (not piped), task-listing commands (`cup tasks`, `cup search`, `cup sprint`, `cup overdue`, `cup assigned`, `cup inbox`, `cup summary`) present an interactive task picker:
262
+
263
+ - **↑/↓** or **j/k** to navigate the list
264
+ - **Space** to toggle task selection
265
+ - **Enter** to confirm and view details of selected tasks
266
+ - After viewing details, prompted to open tasks in browser
267
+
268
+ Other interactive prompts: sprint selection (when multiple match), workspace selection (`cup init`), agent selection (`cup skill`), destructive action confirmations (`cup delete`, `cup archive`, `cup view-delete`).
269
+
270
+ When piped or called with `--json`, all commands output non-interactive markdown or JSON. Agents should always use `--json` for structured data or pipe for markdown.
255
271
 
256
272
  ## Agent Workflow Examples
257
273