@krodak/clickup-cli 1.16.2 → 1.17.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/plugin.json +1 -1
- package/dist/index.js +165 -6
- package/package.json +1 -1
- package/skills/clickup-cli/SKILL.md +63 -55
|
@@ -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.17.0",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Krzysztof Rodak"
|
|
7
7
|
},
|
package/dist/index.js
CHANGED
|
@@ -176,9 +176,22 @@ var ClickUpClient = class {
|
|
|
176
176
|
const me = await this.getMe();
|
|
177
177
|
baseParams.append("assignees[]", String(me.id));
|
|
178
178
|
}
|
|
179
|
+
if (filters.assignees) {
|
|
180
|
+
for (const id of filters.assignees) baseParams.append("assignees[]", String(id));
|
|
181
|
+
}
|
|
179
182
|
for (const s of filters.statuses ?? []) baseParams.append("statuses[]", s);
|
|
180
183
|
for (const id of filters.listIds ?? []) baseParams.append("list_ids[]", id);
|
|
181
184
|
for (const id of filters.spaceIds ?? []) baseParams.append("space_ids[]", id);
|
|
185
|
+
for (const tag of filters.tags ?? []) baseParams.append("tags[]", tag);
|
|
186
|
+
if (filters.dueDateGt) baseParams.set("due_date_gt", String(filters.dueDateGt));
|
|
187
|
+
if (filters.dueDateLt) baseParams.set("due_date_lt", String(filters.dueDateLt));
|
|
188
|
+
if (filters.dateCreatedGt) baseParams.set("date_created_gt", String(filters.dateCreatedGt));
|
|
189
|
+
if (filters.dateCreatedLt) baseParams.set("date_created_lt", String(filters.dateCreatedLt));
|
|
190
|
+
if (filters.dateUpdatedGt) baseParams.set("date_updated_gt", String(filters.dateUpdatedGt));
|
|
191
|
+
if (filters.dateUpdatedLt) baseParams.set("date_updated_lt", String(filters.dateUpdatedLt));
|
|
192
|
+
if (filters.customFields?.length) {
|
|
193
|
+
baseParams.set("custom_fields", JSON.stringify(filters.customFields));
|
|
194
|
+
}
|
|
182
195
|
return this.paginate((page) => {
|
|
183
196
|
const params = new URLSearchParams(baseParams);
|
|
184
197
|
params.set("page", String(page));
|
|
@@ -2855,6 +2868,13 @@ var commandMetadata = [
|
|
|
2855
2868
|
"--type",
|
|
2856
2869
|
"--all",
|
|
2857
2870
|
"--include-closed",
|
|
2871
|
+
"--assignee",
|
|
2872
|
+
"--tag",
|
|
2873
|
+
"--due-before",
|
|
2874
|
+
"--due-after",
|
|
2875
|
+
"--created-after",
|
|
2876
|
+
"--created-before",
|
|
2877
|
+
"--field",
|
|
2858
2878
|
"--json"
|
|
2859
2879
|
],
|
|
2860
2880
|
quickReference: [
|
|
@@ -3059,7 +3079,21 @@ var commandMetadata = [
|
|
|
3059
3079
|
{
|
|
3060
3080
|
name: "search",
|
|
3061
3081
|
description: "Search my tasks by name (use --all for all tasks)",
|
|
3062
|
-
flags: [
|
|
3082
|
+
flags: [
|
|
3083
|
+
"--status",
|
|
3084
|
+
"--list",
|
|
3085
|
+
"--space",
|
|
3086
|
+
"--all",
|
|
3087
|
+
"--include-closed",
|
|
3088
|
+
"--assignee",
|
|
3089
|
+
"--tag",
|
|
3090
|
+
"--due-before",
|
|
3091
|
+
"--due-after",
|
|
3092
|
+
"--created-after",
|
|
3093
|
+
"--created-before",
|
|
3094
|
+
"--field",
|
|
3095
|
+
"--json"
|
|
3096
|
+
],
|
|
3063
3097
|
quickReference: [
|
|
3064
3098
|
{ section: "read", usage: "search <query>", description: "Search my tasks by name" }
|
|
3065
3099
|
]
|
|
@@ -3819,7 +3853,15 @@ ${renderZshTopLevelCommands(name)}
|
|
|
3819
3853
|
'--space[Filter by space ID]:space_id:' \\
|
|
3820
3854
|
'--name[Filter by name]:query:' \\
|
|
3821
3855
|
'--type[Filter by task type]:type:' \\
|
|
3856
|
+
'--all[Include all tasks, not just mine]' \\
|
|
3822
3857
|
'--include-closed[Include done/closed tasks]' \\
|
|
3858
|
+
'--assignee[Filter by assignee]:user_id:' \\
|
|
3859
|
+
'--tag[Filter by tag name]:tag:' \\
|
|
3860
|
+
'--due-before[Tasks due before date]:date:' \\
|
|
3861
|
+
'--due-after[Tasks due after date]:date:' \\
|
|
3862
|
+
'--created-after[Tasks created after date]:date:' \\
|
|
3863
|
+
'--created-before[Tasks created before date]:date:' \\
|
|
3864
|
+
'--field[Filter by custom field]:field_name_and_value:' \\
|
|
3823
3865
|
'--json[Force JSON output]'
|
|
3824
3866
|
;;
|
|
3825
3867
|
task)
|
|
@@ -3933,8 +3975,17 @@ ${renderZshTopLevelCommands(name)}
|
|
|
3933
3975
|
_arguments \\
|
|
3934
3976
|
'1:query:' \\
|
|
3935
3977
|
'--status[Filter by status]:status:(open "in progress" "in review" done closed)' \\
|
|
3936
|
-
'--
|
|
3978
|
+
'--list[Filter by list ID]:list_id:' \\
|
|
3979
|
+
'--space[Filter by space ID]:space_id:' \\
|
|
3937
3980
|
'--all[Search all workspace tasks, not just mine]' \\
|
|
3981
|
+
'--include-closed[Include done/closed tasks in search]' \\
|
|
3982
|
+
'--assignee[Filter by assignee]:user_id:' \\
|
|
3983
|
+
'--tag[Filter by tag name]:tag:' \\
|
|
3984
|
+
'--due-before[Tasks due before date]:date:' \\
|
|
3985
|
+
'--due-after[Tasks due after date]:date:' \\
|
|
3986
|
+
'--created-after[Tasks created after date]:date:' \\
|
|
3987
|
+
'--created-before[Tasks created before date]:date:' \\
|
|
3988
|
+
'--field[Filter by custom field]:field_name_and_value:' \\
|
|
3938
3989
|
'--json[Force JSON output]'
|
|
3939
3990
|
;;
|
|
3940
3991
|
summary)
|
|
@@ -4623,7 +4674,19 @@ async function searchTasks(config, query, opts = {}) {
|
|
|
4623
4674
|
}
|
|
4624
4675
|
const client = new ClickUpClient(config);
|
|
4625
4676
|
const [allTasks, customTypes] = await Promise.all([
|
|
4626
|
-
client.getMyTasks(config.teamId, {
|
|
4677
|
+
client.getMyTasks(config.teamId, {
|
|
4678
|
+
all: opts.all,
|
|
4679
|
+
includeClosed: opts.includeClosed,
|
|
4680
|
+
listIds: opts.listIds,
|
|
4681
|
+
spaceIds: opts.spaceIds,
|
|
4682
|
+
assignees: opts.assignees,
|
|
4683
|
+
tags: opts.tags,
|
|
4684
|
+
dueDateGt: opts.dueDateGt,
|
|
4685
|
+
dueDateLt: opts.dueDateLt,
|
|
4686
|
+
dateCreatedGt: opts.dateCreatedGt,
|
|
4687
|
+
dateCreatedLt: opts.dateCreatedLt,
|
|
4688
|
+
customFields: opts.customFields
|
|
4689
|
+
}),
|
|
4627
4690
|
client.getCustomTaskTypes(config.teamId)
|
|
4628
4691
|
]);
|
|
4629
4692
|
const typeMap = buildTypeMap(customTypes);
|
|
@@ -5923,9 +5986,49 @@ function buildProgram(programName = basename(process.argv[1] ?? "cup")) {
|
|
|
5923
5986
|
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(
|
|
5924
5987
|
"--type <type>",
|
|
5925
5988
|
'Filter by task type (e.g. "task", "initiative", or custom type name/ID)'
|
|
5926
|
-
).option("--all", "Include all tasks, not just mine").option("--include-closed", "Include done/closed tasks").option("--json", "Force JSON output even in terminal").action(
|
|
5989
|
+
).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(
|
|
5927
5990
|
wrapAction(async (opts) => {
|
|
5928
5991
|
const config = loadConfig(getProfileName());
|
|
5992
|
+
let assigneeIds;
|
|
5993
|
+
if (opts.assignee) {
|
|
5994
|
+
if (opts.assignee === "me") {
|
|
5995
|
+
const client = new ClickUpClient(config);
|
|
5996
|
+
const me = await client.getMe();
|
|
5997
|
+
assigneeIds = [me.id];
|
|
5998
|
+
} else {
|
|
5999
|
+
assigneeIds = [Number(opts.assignee)];
|
|
6000
|
+
}
|
|
6001
|
+
}
|
|
6002
|
+
const parseDateFilter = (d) => {
|
|
6003
|
+
const parts = d.split("-");
|
|
6004
|
+
return new Date(Number(parts[0]), Number(parts[1]) - 1, Number(parts[2])).getTime();
|
|
6005
|
+
};
|
|
6006
|
+
let customFields;
|
|
6007
|
+
if (opts.field?.length) {
|
|
6008
|
+
if (opts.field.length % 2 !== 0) {
|
|
6009
|
+
throw new Error('--field requires pairs: --field "Name" value');
|
|
6010
|
+
}
|
|
6011
|
+
if (!opts.list) {
|
|
6012
|
+
throw new Error("--field filtering requires --list to resolve field names");
|
|
6013
|
+
}
|
|
6014
|
+
const client = new ClickUpClient(config);
|
|
6015
|
+
const fields = await client.getListCustomFields(opts.list);
|
|
6016
|
+
customFields = [];
|
|
6017
|
+
for (let i = 0; i < opts.field.length; i += 2) {
|
|
6018
|
+
const fieldName = opts.field[i];
|
|
6019
|
+
const fieldValue = opts.field[i + 1];
|
|
6020
|
+
const match = fields.find((f) => f.name.toLowerCase() === fieldName.toLowerCase());
|
|
6021
|
+
if (!match) {
|
|
6022
|
+
const available = fields.map((f) => f.name).join(", ");
|
|
6023
|
+
throw new Error(`Field "${fieldName}" not found. Available: ${available}`);
|
|
6024
|
+
}
|
|
6025
|
+
customFields.push({
|
|
6026
|
+
field_id: match.id,
|
|
6027
|
+
operator: "=",
|
|
6028
|
+
value: fieldValue
|
|
6029
|
+
});
|
|
6030
|
+
}
|
|
6031
|
+
}
|
|
5929
6032
|
const tasks = await fetchMyTasks(config, {
|
|
5930
6033
|
typeFilter: opts.type,
|
|
5931
6034
|
statuses: opts.status ? [opts.status] : void 0,
|
|
@@ -5933,6 +6036,13 @@ function buildProgram(programName = basename(process.argv[1] ?? "cup")) {
|
|
|
5933
6036
|
spaceIds: opts.space ? [opts.space] : void 0,
|
|
5934
6037
|
name: opts.name,
|
|
5935
6038
|
all: opts.all,
|
|
6039
|
+
assignees: assigneeIds,
|
|
6040
|
+
tags: opts.tag ? [opts.tag] : void 0,
|
|
6041
|
+
dueDateLt: opts.dueBefore ? parseDateFilter(opts.dueBefore) : void 0,
|
|
6042
|
+
dueDateGt: opts.dueAfter ? parseDateFilter(opts.dueAfter) : void 0,
|
|
6043
|
+
dateCreatedGt: opts.createdAfter ? parseDateFilter(opts.createdAfter) : void 0,
|
|
6044
|
+
dateCreatedLt: opts.createdBefore ? parseDateFilter(opts.createdBefore) : void 0,
|
|
6045
|
+
customFields,
|
|
5936
6046
|
includeClosed: opts.includeClosed
|
|
5937
6047
|
});
|
|
5938
6048
|
await printTasks(tasks, opts.json ?? false, config);
|
|
@@ -6159,14 +6269,63 @@ function buildProgram(programName = basename(process.argv[1] ?? "cup")) {
|
|
|
6159
6269
|
await openTask(config, query, opts);
|
|
6160
6270
|
})
|
|
6161
6271
|
);
|
|
6162
|
-
program.command("search <query>").description("Search my tasks by name (use --all for all tasks)").option("--status <status>", "Filter by status").option("--all", "Search all tasks, not just mine").option("--include-closed", "Include done/closed tasks in search").option("--json", "Force JSON output even in terminal").action(
|
|
6272
|
+
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(
|
|
6163
6273
|
wrapAction(
|
|
6164
6274
|
async (query, opts) => {
|
|
6165
6275
|
const config = loadConfig(getProfileName());
|
|
6276
|
+
let assigneeIds;
|
|
6277
|
+
if (opts.assignee) {
|
|
6278
|
+
if (opts.assignee === "me") {
|
|
6279
|
+
const client = new ClickUpClient(config);
|
|
6280
|
+
const me = await client.getMe();
|
|
6281
|
+
assigneeIds = [me.id];
|
|
6282
|
+
} else {
|
|
6283
|
+
assigneeIds = [Number(opts.assignee)];
|
|
6284
|
+
}
|
|
6285
|
+
}
|
|
6286
|
+
const parseDateFilter = (d) => {
|
|
6287
|
+
const parts = d.split("-");
|
|
6288
|
+
return new Date(Number(parts[0]), Number(parts[1]) - 1, Number(parts[2])).getTime();
|
|
6289
|
+
};
|
|
6290
|
+
let customFields;
|
|
6291
|
+
if (opts.field?.length) {
|
|
6292
|
+
if (opts.field.length % 2 !== 0) {
|
|
6293
|
+
throw new Error('--field requires pairs: --field "Name" value');
|
|
6294
|
+
}
|
|
6295
|
+
if (!opts.list) {
|
|
6296
|
+
throw new Error("--field filtering requires --list to resolve field names");
|
|
6297
|
+
}
|
|
6298
|
+
const client = new ClickUpClient(config);
|
|
6299
|
+
const fields = await client.getListCustomFields(opts.list);
|
|
6300
|
+
customFields = [];
|
|
6301
|
+
for (let i = 0; i < opts.field.length; i += 2) {
|
|
6302
|
+
const fieldName = opts.field[i];
|
|
6303
|
+
const fieldValue = opts.field[i + 1];
|
|
6304
|
+
const match = fields.find((f) => f.name.toLowerCase() === fieldName.toLowerCase());
|
|
6305
|
+
if (!match) {
|
|
6306
|
+
const available = fields.map((f) => f.name).join(", ");
|
|
6307
|
+
throw new Error(`Field "${fieldName}" not found. Available: ${available}`);
|
|
6308
|
+
}
|
|
6309
|
+
customFields.push({
|
|
6310
|
+
field_id: match.id,
|
|
6311
|
+
operator: "=",
|
|
6312
|
+
value: fieldValue
|
|
6313
|
+
});
|
|
6314
|
+
}
|
|
6315
|
+
}
|
|
6166
6316
|
const tasks = await searchTasks(config, query, {
|
|
6167
6317
|
status: opts.status,
|
|
6168
6318
|
all: opts.all,
|
|
6169
|
-
includeClosed: opts.includeClosed
|
|
6319
|
+
includeClosed: opts.includeClosed,
|
|
6320
|
+
listIds: opts.list ? [opts.list] : void 0,
|
|
6321
|
+
spaceIds: opts.space ? [opts.space] : void 0,
|
|
6322
|
+
assignees: assigneeIds,
|
|
6323
|
+
tags: opts.tag ? [opts.tag] : void 0,
|
|
6324
|
+
dueDateLt: opts.dueBefore ? parseDateFilter(opts.dueBefore) : void 0,
|
|
6325
|
+
dueDateGt: opts.dueAfter ? parseDateFilter(opts.dueAfter) : void 0,
|
|
6326
|
+
dateCreatedGt: opts.createdAfter ? parseDateFilter(opts.createdAfter) : void 0,
|
|
6327
|
+
dateCreatedLt: opts.createdBefore ? parseDateFilter(opts.createdBefore) : void 0,
|
|
6328
|
+
customFields
|
|
6170
6329
|
});
|
|
6171
6330
|
await printTasks(tasks, opts.json ?? false, config);
|
|
6172
6331
|
}
|
package/package.json
CHANGED
|
@@ -48,39 +48,39 @@ All commands support `--help` for full flag details. All commands support `--jso
|
|
|
48
48
|
|
|
49
49
|
### Read
|
|
50
50
|
|
|
51
|
-
| Command
|
|
52
|
-
|
|
|
53
|
-
| `cup tasks [--status s] [--name q] [--type t] [--list id] [--space id] [--all] [--include-closed]` | My tasks (filter by status, name, type, list, space). `--all` for all tasks in workspace |
|
|
54
|
-
| `cup assigned [--status s] [--include-closed]`
|
|
55
|
-
| `cup sprint [--status s] [--space nameOrId] [--folder id] [--include-closed]`
|
|
56
|
-
| `cup sprints [--space nameOrId]`
|
|
57
|
-
| `cup search <query> [--status s] [--all] [--include-closed]`
|
|
58
|
-
| `cup task <id>`
|
|
59
|
-
| `cup subtasks <id> [--status s] [--name q] [--include-closed]`
|
|
60
|
-
| `cup comments <id>`
|
|
61
|
-
| `cup activity <id>`
|
|
62
|
-
| `cup inbox [--days n] [--include-closed]`
|
|
63
|
-
| `cup summary [--hours n]`
|
|
64
|
-
| `cup overdue [--include-closed]`
|
|
65
|
-
| `cup spaces [--name partial] [--my]`
|
|
66
|
-
| `cup lists <spaceId> [--name partial]`
|
|
67
|
-
| `cup folders <spaceId> [--name partial]`
|
|
68
|
-
| `cup members`
|
|
69
|
-
| `cup fields <listId>`
|
|
70
|
-
| `cup tags <spaceId>`
|
|
71
|
-
| `cup goals`
|
|
72
|
-
| `cup key-results <goalId>`
|
|
73
|
-
| `cup docs [query]`
|
|
74
|
-
| `cup doc <docId> [pageId]`
|
|
75
|
-
| `cup doc-pages <docId>`
|
|
76
|
-
| `cup task-types`
|
|
77
|
-
| `cup templates`
|
|
78
|
-
| `cup list-templates`
|
|
79
|
-
| `cup folder-templates`
|
|
80
|
-
| `cup views <listId>`
|
|
81
|
-
| `cup view <viewId>`
|
|
82
|
-
| `cup open <query>`
|
|
83
|
-
| `cup auth`
|
|
51
|
+
| Command | What it returns |
|
|
52
|
+
| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------- |
|
|
53
|
+
| `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 |
|
|
54
|
+
| `cup assigned [--status s] [--include-closed]` | All my tasks grouped by status |
|
|
55
|
+
| `cup sprint [--status s] [--space nameOrId] [--folder id] [--include-closed]` | Tasks in active sprint (auto-detected) |
|
|
56
|
+
| `cup sprints [--space nameOrId]` | List all sprints (marks active with \*) |
|
|
57
|
+
| `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 |
|
|
58
|
+
| `cup task <id>` | Single task details (custom fields, checklists, attachments, deps, links) |
|
|
59
|
+
| `cup subtasks <id> [--status s] [--name q] [--include-closed]` | Subtasks of a task |
|
|
60
|
+
| `cup comments <id>` | Comments on a task |
|
|
61
|
+
| `cup activity <id>` | Task details + comment history combined |
|
|
62
|
+
| `cup inbox [--days n] [--include-closed]` | Tasks updated in last n days (default 30) |
|
|
63
|
+
| `cup summary [--hours n]` | Standup: completed, in-progress, overdue |
|
|
64
|
+
| `cup overdue [--include-closed]` | Tasks past due date (most overdue first) |
|
|
65
|
+
| `cup spaces [--name partial] [--my]` | List/filter workspace spaces |
|
|
66
|
+
| `cup lists <spaceId> [--name partial]` | Lists in a space (including folder lists) |
|
|
67
|
+
| `cup folders <spaceId> [--name partial]` | Folders in a space (with their lists) |
|
|
68
|
+
| `cup members` | Workspace members (username, ID, email) |
|
|
69
|
+
| `cup fields <listId>` | Custom fields on a list (type, required, options) |
|
|
70
|
+
| `cup tags <spaceId>` | Tags available in a space |
|
|
71
|
+
| `cup goals` | Workspace goals with progress |
|
|
72
|
+
| `cup key-results <goalId>` | Key results for a goal |
|
|
73
|
+
| `cup docs [query]` | Workspace docs (optionally filter by name) |
|
|
74
|
+
| `cup doc <docId> [pageId]` | Doc metadata + page tree, or a specific page |
|
|
75
|
+
| `cup doc-pages <docId>` | All pages in a doc with content |
|
|
76
|
+
| `cup task-types` | Custom task types (for `--custom-item-id`) |
|
|
77
|
+
| `cup templates` | Task templates (for `--template`) |
|
|
78
|
+
| `cup list-templates` | List templates (for `list-from-template`) |
|
|
79
|
+
| `cup folder-templates` | Folder templates |
|
|
80
|
+
| `cup views <listId>` | List views on a list |
|
|
81
|
+
| `cup view <viewId>` | Get view details |
|
|
82
|
+
| `cup open <query>` | Open task in browser by ID or name |
|
|
83
|
+
| `cup auth` | Check authentication status |
|
|
84
84
|
|
|
85
85
|
### Write
|
|
86
86
|
|
|
@@ -157,28 +157,31 @@ All commands support `--help` for full flag details. All commands support `--jso
|
|
|
157
157
|
|
|
158
158
|
## Flags & Conventions
|
|
159
159
|
|
|
160
|
-
| Topic
|
|
161
|
-
|
|
|
162
|
-
| Task IDs
|
|
163
|
-
| `--status`
|
|
164
|
-
| `--priority`
|
|
165
|
-
| `--due-date`
|
|
166
|
-
| `--assignee`
|
|
167
|
-
| `--tags`
|
|
168
|
-
| `--time-estimate`
|
|
169
|
-
| `--type`
|
|
170
|
-
| `--custom-item-id`
|
|
171
|
-
| `--space`
|
|
172
|
-
| `--name`
|
|
173
|
-
| `--all`
|
|
174
|
-
| `--include-closed`
|
|
175
|
-
| `--list` on create
|
|
176
|
-
| `cup field --set`
|
|
177
|
-
| `cup field-create`
|
|
178
|
-
| `
|
|
179
|
-
| `
|
|
180
|
-
| `
|
|
181
|
-
|
|
|
160
|
+
| Topic | Detail |
|
|
161
|
+
| ------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
162
|
+
| Task IDs | Native (`abc123def`) or custom (`PROJ-123`). Custom IDs auto-detected by `PREFIX-DIGITS` format |
|
|
163
|
+
| `--status` | Fuzzy matching: exact > starts-with > contains. Prints match to stderr |
|
|
164
|
+
| `--priority` | Names (`urgent`, `high`, `normal`, `low`) or numbers (1-4) |
|
|
165
|
+
| `--due-date` | `YYYY-MM-DD` format |
|
|
166
|
+
| `--assignee` | User ID or `me` |
|
|
167
|
+
| `--tags` | Comma-separated (e.g. `--tags "bug,frontend"`) |
|
|
168
|
+
| `--time-estimate` | Duration: `"2h"`, `"30m"`, `"1h30m"`, or raw milliseconds |
|
|
169
|
+
| `--type` | `task` (regular) or custom type name/ID (e.g. `initiative`, `Bug`) |
|
|
170
|
+
| `--custom-item-id` | Custom task type ID for `cup create` (find with `cup task-types`) |
|
|
171
|
+
| `--space` | Partial name match or exact ID |
|
|
172
|
+
| `--name` | Partial match, case-insensitive |
|
|
173
|
+
| `--all` | Show all tasks in workspace, not just assigned to me. Available on `tasks`, `search`, `overdue`. Default: my tasks only (smaller output for agent context windows) |
|
|
174
|
+
| `--include-closed` | Include closed/done tasks |
|
|
175
|
+
| `--list` on create | Optional when `--parent` is given (auto-detected) |
|
|
176
|
+
| `cup field --set` | Supports: text, number, checkbox (true/false), dropdown (option name), date (YYYY-MM-DD), url, email. Names resolved case-insensitively; errors list available fields/options |
|
|
177
|
+
| `cup field-create` | Use `--options "a,b,c"` for `drop_down` and `labels` types (required). Other types don't need `--options` |
|
|
178
|
+
| `--field` filter | `--field "Name" value` on `tasks` and `search` requires `--list` to resolve field names to IDs |
|
|
179
|
+
| `--due-before/after` | `YYYY-MM-DD` date filters for due date range |
|
|
180
|
+
| `--created-before/after` | `YYYY-MM-DD` date filters for creation date range |
|
|
181
|
+
| `cup sprint` | Auto-detects active sprint by folder name (sprint/iteration/cycle/scrum), parses multiple date formats. Override with `--folder <id>` or `cup config set sprintFolderId <id>` |
|
|
182
|
+
| `cup link` | Both IDs must be the same type (both custom or both native) |
|
|
183
|
+
| `cup delete` | DESTRUCTIVE. Requires `--confirm` in non-interactive mode. Cannot be undone |
|
|
184
|
+
| Errors | stderr with exit code 1. Strict parsing - excess/unknown arguments rejected |
|
|
182
185
|
|
|
183
186
|
## Agent Workflow Examples
|
|
184
187
|
|
|
@@ -199,8 +202,13 @@ cup tasks --status "in progress" # by status
|
|
|
199
202
|
cup tasks --name "login" # by partial name
|
|
200
203
|
cup tasks --type initiative # initiatives only
|
|
201
204
|
cup tasks --list 12345 --all # all tasks in list, not just mine
|
|
205
|
+
cup tasks --tag "bug" --status "to do" # by tag and status
|
|
206
|
+
cup tasks --list 123 --field "Sprint" "Week 1" # by custom field
|
|
207
|
+
cup tasks --due-before 2026-04-01 # due before a date
|
|
208
|
+
cup tasks --assignee me --created-after 2026-03-01 # my tasks created recently
|
|
202
209
|
cup search "payment flow" # multi-word search
|
|
203
210
|
cup search auth --status "prog" # fuzzy status match
|
|
211
|
+
cup search "auth" --list 123 --space 456 # search within list and space
|
|
204
212
|
cup sprint # current sprint
|
|
205
213
|
cup assigned # all my tasks by status
|
|
206
214
|
cup overdue # past due date
|