clickup-cli 1.4.0__tar.gz → 1.6.0__tar.gz
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.
- {clickup_cli-1.4.0 → clickup_cli-1.6.0}/.claude/skills/clickup-cli.md +34 -0
- clickup_cli-1.6.0/.claude/skills/release/SKILL.md +105 -0
- {clickup_cli-1.4.0 → clickup_cli-1.6.0}/.github/workflows/ci.yml +4 -0
- {clickup_cli-1.4.0 → clickup_cli-1.6.0}/CHANGELOG.md +17 -0
- {clickup_cli-1.4.0 → clickup_cli-1.6.0}/CLAUDE.md +4 -4
- {clickup_cli-1.4.0 → clickup_cli-1.6.0}/PKG-INFO +18 -8
- {clickup_cli-1.4.0 → clickup_cli-1.6.0}/README.md +17 -7
- clickup_cli-1.6.0/clickup-config.example.json +12 -0
- clickup_cli-1.6.0/docs/superpowers/plans/2026-04-18-gsd-public-repo-autonomous-rollout.md +542 -0
- clickup_cli-1.6.0/docs/superpowers/specs/2026-04-18-gsd-public-repo-autonomous-design.md +236 -0
- {clickup_cli-1.4.0 → clickup_cli-1.6.0}/src/clickup_cli/__init__.py +1 -1
- {clickup_cli-1.4.0 → clickup_cli-1.6.0}/src/clickup_cli/cli.py +20 -22
- {clickup_cli-1.4.0 → clickup_cli-1.6.0}/src/clickup_cli/client.py +6 -1
- clickup_cli-1.6.0/src/clickup_cli/commands/__init__.py +27 -0
- {clickup_cli-1.4.0 → clickup_cli-1.6.0}/src/clickup_cli/commands/comments.py +25 -10
- {clickup_cli-1.4.0 → clickup_cli-1.6.0}/src/clickup_cli/commands/docs.py +43 -25
- {clickup_cli-1.4.0 → clickup_cli-1.6.0}/src/clickup_cli/commands/folders.py +63 -7
- {clickup_cli-1.4.0 → clickup_cli-1.6.0}/src/clickup_cli/commands/init.py +6 -11
- {clickup_cli-1.4.0 → clickup_cli-1.6.0}/src/clickup_cli/commands/lists.py +63 -7
- clickup_cli-1.6.0/src/clickup_cli/commands/privacy.py +55 -0
- {clickup_cli-1.4.0 → clickup_cli-1.6.0}/src/clickup_cli/commands/spaces.py +65 -8
- {clickup_cli-1.4.0 → clickup_cli-1.6.0}/src/clickup_cli/commands/tags.py +10 -0
- clickup_cli-1.6.0/src/clickup_cli/commands/tasks.py +32 -0
- clickup_cli-1.6.0/src/clickup_cli/commands/tasks_internal/__init__.py +16 -0
- clickup_cli-1.4.0/src/clickup_cli/commands/tasks.py → clickup_cli-1.6.0/src/clickup_cli/commands/tasks_internal/parser.py +35 -440
- clickup_cli-1.6.0/src/clickup_cli/commands/tasks_internal/read.py +184 -0
- clickup_cli-1.6.0/src/clickup_cli/commands/tasks_internal/shared.py +155 -0
- clickup_cli-1.6.0/src/clickup_cli/commands/tasks_internal/write.py +209 -0
- {clickup_cli-1.4.0 → clickup_cli-1.6.0}/src/clickup_cli/commands/team.py +10 -3
- {clickup_cli-1.4.0 → clickup_cli-1.6.0}/src/clickup_cli/config.py +1 -8
- {clickup_cli-1.4.0 → clickup_cli-1.6.0}/src/clickup_cli/helpers.py +36 -18
- clickup_cli-1.6.0/src/clickup_cli/runtime.py +10 -0
- clickup_cli-1.6.0/tests/command_fakes.py +59 -0
- {clickup_cli-1.4.0 → clickup_cli-1.6.0}/tests/test_cli.py +173 -20
- {clickup_cli-1.4.0 → clickup_cli-1.6.0}/tests/test_client.py +41 -0
- clickup_cli-1.6.0/tests/test_command_manifest.py +38 -0
- clickup_cli-1.6.0/tests/test_commands_docs_comments.py +541 -0
- clickup_cli-1.6.0/tests/test_commands_misc.py +494 -0
- clickup_cli-1.6.0/tests/test_commands_spaces_lists_folders.py +418 -0
- clickup_cli-1.6.0/tests/test_commands_tasks.py +1091 -0
- {clickup_cli-1.4.0 → clickup_cli-1.6.0}/tests/test_config.py +18 -8
- {clickup_cli-1.4.0 → clickup_cli-1.6.0}/tests/test_helpers.py +25 -6
- clickup_cli-1.6.0/tests/test_tasks_facade.py +36 -0
- clickup_cli-1.4.0/.claude/skills/release/SKILL.md +0 -66
- clickup_cli-1.4.0/clickup-config.example.json +0 -8
- clickup_cli-1.4.0/src/clickup_cli/commands/__init__.py +0 -73
- clickup_cli-1.4.0/tests/test_commands.py +0 -1734
- {clickup_cli-1.4.0 → clickup_cli-1.6.0}/.claude/agents/api-compatibility-checker.md +0 -0
- {clickup_cli-1.4.0 → clickup_cli-1.6.0}/.claude/agents/test-writer.md +0 -0
- {clickup_cli-1.4.0 → clickup_cli-1.6.0}/.claude/settings.json +0 -0
- {clickup_cli-1.4.0 → clickup_cli-1.6.0}/.claude/skills/add-command.md +0 -0
- {clickup_cli-1.4.0 → clickup_cli-1.6.0}/.claude/skills/changelog/SKILL.md +0 -0
- {clickup_cli-1.4.0 → clickup_cli-1.6.0}/.claude/skills/validate-output/SKILL.md +0 -0
- {clickup_cli-1.4.0 → clickup_cli-1.6.0}/.gitignore +0 -0
- {clickup_cli-1.4.0 → clickup_cli-1.6.0}/.mcp.json +0 -0
- {clickup_cli-1.4.0 → clickup_cli-1.6.0}/CONTRIBUTING.md +0 -0
- {clickup_cli-1.4.0 → clickup_cli-1.6.0}/LICENSE +0 -0
- {clickup_cli-1.4.0 → clickup_cli-1.6.0}/pyproject.toml +0 -0
- {clickup_cli-1.4.0 → clickup_cli-1.6.0}/scripts/validate-cli-output.sh +0 -0
- {clickup_cli-1.4.0 → clickup_cli-1.6.0}/src/clickup_cli/__main__.py +0 -0
- {clickup_cli-1.4.0 → clickup_cli-1.6.0}/tests/conftest.py +0 -0
|
@@ -48,6 +48,29 @@ clickup --dry-run tasks create --space <space_name> --name "Fix auth" --desc "De
|
|
|
48
48
|
clickup tasks create --space <space_name> --name "Fix auth" --desc "Details"
|
|
49
49
|
```
|
|
50
50
|
|
|
51
|
+
### Update a task (including tags, assignees, custom fields)
|
|
52
|
+
```bash
|
|
53
|
+
clickup tasks update <task_id> --status "in progress"
|
|
54
|
+
clickup tasks update <task_id> --add-tag urgent --remove-tag draft
|
|
55
|
+
clickup tasks update <task_id> --add-assignee <user_id>
|
|
56
|
+
clickup tasks update <task_id> --custom-field <field_uuid>=high
|
|
57
|
+
clickup --dry-run tasks update <task_id> --add-tag urgent # returns a plan
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
### Manage task dependencies
|
|
61
|
+
```bash
|
|
62
|
+
clickup tasks depend add <task_id> --depends-on <blocker_task_id>
|
|
63
|
+
clickup tasks depend add <task_id> --depended-on-by <blocked_task_id>
|
|
64
|
+
clickup tasks depend list <task_id>
|
|
65
|
+
clickup tasks depend remove <task_id> --depends-on <blocker_task_id>
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
### See archived tasks alongside live ones
|
|
69
|
+
```bash
|
|
70
|
+
clickup tasks list --space <space_name> --include-archived
|
|
71
|
+
clickup tasks search "bug" --include-archived
|
|
72
|
+
```
|
|
73
|
+
|
|
51
74
|
### Add a comment
|
|
52
75
|
```bash
|
|
53
76
|
clickup comments add <task_id> --text "Work complete"
|
|
@@ -71,6 +94,17 @@ clickup lists list --folder <folder_id>
|
|
|
71
94
|
clickup spaces statuses <space_name>
|
|
72
95
|
```
|
|
73
96
|
|
|
97
|
+
### Toggle privacy on a space, folder, or list
|
|
98
|
+
```bash
|
|
99
|
+
clickup spaces privacy <space_name> --private
|
|
100
|
+
clickup folders privacy <folder_id> --public
|
|
101
|
+
clickup lists privacy <list_id> --private
|
|
102
|
+
clickup --dry-run lists privacy <list_id> --private # preview body
|
|
103
|
+
```
|
|
104
|
+
Each command requires exactly one of `--private` / `--public`. This flips the
|
|
105
|
+
private/public boolean only — granular member or guest grants must be done in
|
|
106
|
+
the ClickUp UI. Hits the v3 ACLs endpoint.
|
|
107
|
+
|
|
74
108
|
## Configuration
|
|
75
109
|
|
|
76
110
|
The CLI loads config from (in order):
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: release
|
|
3
|
+
description: Bump version, validate, tag, and build for PyPI release
|
|
4
|
+
disable-model-invocation: true
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Release Workflow
|
|
8
|
+
|
|
9
|
+
Follow these steps to publish a new release of clickup-cli.
|
|
10
|
+
|
|
11
|
+
## 1. Pre-flight checks
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
ruff check src/ tests/
|
|
15
|
+
pytest -v
|
|
16
|
+
clickup --help # smoke test
|
|
17
|
+
bash scripts/validate-cli-output.sh # JSON stdout contract
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
All must pass before proceeding.
|
|
21
|
+
|
|
22
|
+
Also verify the tag for the current `__version__` doesn't already exist on git or PyPI — previous releases were shipped to PyPI without a matching git tag once, which left a gap. If a gap exists, backfill the missing tag at the correct commit (`git tag v<missing> <sha> && git push origin v<missing>`) and add a CHANGELOG entry for it before the new version.
|
|
23
|
+
|
|
24
|
+
## 2. Bump version
|
|
25
|
+
|
|
26
|
+
The version is dynamic (read by Hatch from `src/clickup_cli/__init__.py`). Update it following semver:
|
|
27
|
+
- **patch** (1.x.Y): bug fixes
|
|
28
|
+
- **minor** (1.X.0): new commands or features
|
|
29
|
+
- **major** (X.0.0): breaking changes
|
|
30
|
+
|
|
31
|
+
Also update `tests/test_cli.py::test_version_flag` — the assertion string must match.
|
|
32
|
+
|
|
33
|
+
## 3. Update CHANGELOG
|
|
34
|
+
|
|
35
|
+
Summarize changes since the last tag. Start from:
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
git log $(git describe --tags --abbrev=0)..HEAD --oneline
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
Group entries into Features / Fixes / Internal. Keep the top of `CHANGELOG.md` the same format as prior entries (one dated section per version, newest first).
|
|
42
|
+
|
|
43
|
+
## 4. Commit and tag
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
git add -A
|
|
47
|
+
git commit -m "release: v<version>"
|
|
48
|
+
git tag v<version>
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
Do NOT push yet — everything local until the build is verified.
|
|
52
|
+
|
|
53
|
+
## 5. Build
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
pip install build
|
|
57
|
+
rm -rf dist/ build/
|
|
58
|
+
python -m build
|
|
59
|
+
python -m twine check dist/*
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
Verify both the sdist and the wheel are present, file sizes look sane, and the version number is in the filenames.
|
|
63
|
+
|
|
64
|
+
## 6. Publish to PyPI (requires user confirmation)
|
|
65
|
+
|
|
66
|
+
**Ask Efe before running this step.**
|
|
67
|
+
|
|
68
|
+
Claude Code's `!` bash prompt cannot allocate a tty, so `twine upload` run inline will `EOFError` on the getpass prompt. Use one of these two paths:
|
|
69
|
+
|
|
70
|
+
```bash
|
|
71
|
+
# Option A — separate real terminal (safest):
|
|
72
|
+
# Efe runs `python3 -m twine upload dist/*` in a new terminal tab.
|
|
73
|
+
# Option B — inline with env token (exposes token in shell history):
|
|
74
|
+
# TWINE_USERNAME=__token__ TWINE_PASSWORD='pypi-...' python3 -m twine upload dist/*
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
Wait for confirmation that PyPI shows the new version before moving on. Verify with:
|
|
78
|
+
|
|
79
|
+
```bash
|
|
80
|
+
curl -s https://pypi.org/pypi/clickup-cli/json | python3 -c "import json,sys; print(json.load(sys.stdin)['info']['version'])"
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
## 7. Push main + tag
|
|
84
|
+
|
|
85
|
+
```bash
|
|
86
|
+
git push origin main
|
|
87
|
+
git push origin v<version>
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
## 8. Create the GitHub Release
|
|
91
|
+
|
|
92
|
+
Pushing a tag does NOT create a GitHub Release — Releases are a separate object layered on top of tags. Without this step, `github.com/<repo>/releases` still shows the previous version as "Latest" even though the tag is live.
|
|
93
|
+
|
|
94
|
+
```bash
|
|
95
|
+
gh release create v<version> \
|
|
96
|
+
dist/clickup_cli-<version>-py3-none-any.whl \
|
|
97
|
+
dist/clickup_cli-<version>.tar.gz \
|
|
98
|
+
--title "v<version>" \
|
|
99
|
+
--notes "$(...release notes from CHANGELOG...)"
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
Attach both dist artifacts. Use the CHANGELOG entry for the notes (or inline them if the CHANGELOG entry is too terse).
|
|
103
|
+
|
|
104
|
+
Verify `gh release list` shows the new version with the `Latest` marker.
|
|
105
|
+
|
|
@@ -1,5 +1,22 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 1.6.0 (2026-04-18)
|
|
4
|
+
|
|
5
|
+
- **Space-scoped task search and docs filtering now match the requested scope.** `tasks search --space <alias-or-id>` expands to every list in the resolved space, preserves explicit `--list` / `--folder` overrides, handles archived-only and empty-space edge cases without widening scope, and keeps the existing dry-run envelope intact. `docs list` and `docs create` now resolve `--space` through the shared alias-or-raw-ID path and fail fast on bad non-numeric space names.
|
|
6
|
+
- **Task payloads are bounded by default, with explicit exhaustive flags when you need everything.** `tasks get` now returns bounded comments by default with `--all-comments` as the exhaustive opt-in, while `tasks list` and `tasks search` share a default page budget and expose `--all-pages` as the explicit escape hatch. Each command adds machine-readable completeness metadata inside the existing JSON response envelope.
|
|
7
|
+
- **Task create/update request shaping is stricter and more predictable.** Repeated `--tag` values on `tasks list` are preserved, update/edit flows now accept explicit empty-string clears for descriptions, doc page content, and comment text, and `tasks create` still omits empty descriptions instead of sending empty strings by accident.
|
|
8
|
+
- **Config and runtime identity handling are cleaner.** `clickup init` now persists canonical `space_id` values without eager per-space list discovery, runtime workspace context flows through the client instead of ambient globals, and alias-based task flows lazily resolve default lists only when needed.
|
|
9
|
+
- **The CLI contract is enforced more aggressively in automation and local config writes are hardened.** CI now runs the JSON stdout/stderr contract validator on Python 3.11, init/config rewrite paths enforce owner-only file permissions, and existing config directories are re-hardened on write.
|
|
10
|
+
- **Internal command wiring is easier to maintain without changing how users invoke the CLI.** Privacy handlers now share one helper, command registration is manifest-driven, task internals are split behind a compatibility facade, and the large command-handler test module is split by command family.
|
|
11
|
+
|
|
12
|
+
## 1.5.0 (2026-04-12)
|
|
13
|
+
|
|
14
|
+
- **New `privacy` subcommand on `spaces`, `folders`, and `lists`.** Toggle the privacy of a space, folder, or list via the v3 ACLs endpoint without leaving the terminal. Each subcommand takes a positional ID (or its `--<id>` flag form) plus a required mutually exclusive `--private` / `--public` flag. Hits `PATCH /v3/workspaces/{wid}/{space|folder|list}/{id}/acls` with a minimal `{"private": true|false}` body. Granular ACL entries (member or guest grants) are intentionally not exposed — use the ClickUp UI for that.
|
|
15
|
+
- **`--dry-run` support** on every privacy command. Returns a structured plan (`{"dry_run": true, "action": "set_privacy", "object_type": ..., "object_id": ..., "body": ...}`) with zero API calls.
|
|
16
|
+
- **Consistent return shape across all three groups.** On success: `{"status": "ok", "action": "set_privacy", "object_type": "space"|"folder"|"list", "object_id": "...", "private": true|false}`. Same keys regardless of which group invoked it — agent scripts can parse one shape.
|
|
17
|
+
- **Client: `patch_v3` method** added to `ClickUpClient` for v3 PATCH endpoints (used by the new privacy commands; first PATCH consumer in the codebase).
|
|
18
|
+
- Test suite: 332 → 356 tests. Added coverage for `patch_v3` (real + dry-run), the three new privacy handlers (private/public/dry-run, plus raw-ID resolution on spaces), and parser-level mutex tests for each group.
|
|
19
|
+
|
|
3
20
|
## 1.4.0 (2026-04-11)
|
|
4
21
|
|
|
5
22
|
- **`tasks update` now handles tags, assignees, and custom fields.** Five new repeatable flags: `--add-assignee` / `--remove-assignee` (packed into the PUT body), `--add-tag` / `--remove-tag` (issues one POST/DELETE per tag), and `--custom-field FIELD_ID=VALUE` (issues one POST per field). When no PUT body is needed, the task is re-fetched at the end so the returned JSON always reflects final state. `--dry-run` returns a structured plan with no API calls.
|
|
@@ -14,12 +14,12 @@ src/clickup_cli/
|
|
|
14
14
|
├── helpers.py # output(), error(), compact_task(), etc.
|
|
15
15
|
└── commands/
|
|
16
16
|
├── __init__.py # HANDLERS dict
|
|
17
|
-
├── tasks.py # tasks parser + handlers (list/get/create/update/search/delete/move/merge)
|
|
17
|
+
├── tasks.py # tasks parser + handlers (list/get/create/update/search/delete/move/merge/depend)
|
|
18
18
|
├── comments.py # comments parser + handlers (list/add/update/delete/thread/reply)
|
|
19
19
|
├── docs.py # docs parser + handlers (list/get/create/pages/get-page/edit-page/create-page)
|
|
20
|
-
├── folders.py # folders parser + handlers (list/get/create/update/delete)
|
|
21
|
-
├── lists.py # lists parser + handlers (list/get/create/update/delete)
|
|
22
|
-
├── spaces.py # spaces parser + handlers (list/get/statuses)
|
|
20
|
+
├── folders.py # folders parser + handlers (list/get/create/update/delete/privacy)
|
|
21
|
+
├── lists.py # lists parser + handlers (list/get/create/update/delete/privacy)
|
|
22
|
+
├── spaces.py # spaces parser + handlers (list/get/statuses/privacy)
|
|
23
23
|
├── tags.py # tags parser + handlers (list/add/remove)
|
|
24
24
|
├── team.py # team parser + handlers (whoami/members)
|
|
25
25
|
└── init.py # clickup init setup command
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: clickup-cli
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.6.0
|
|
4
4
|
Summary: The missing ClickUp CLI. Built for developers and AI agents.
|
|
5
5
|
Project-URL: Homepage, https://github.com/efetoker/clickup-cli
|
|
6
6
|
Project-URL: Repository, https://github.com/efetoker/clickup-cli
|
|
@@ -54,6 +54,8 @@ clickup init
|
|
|
54
54
|
|
|
55
55
|
This prompts for your API token, discovers your workspaces and spaces, identifies your user, and writes a config file to `~/.config/clickup-cli/config.json`.
|
|
56
56
|
|
|
57
|
+
`clickup init` stores each configured space alias with its canonical `space_id`. It does not preload one list per space during setup. Add `list_id` later only if you want a cached default list for list-bound commands.
|
|
58
|
+
|
|
57
59
|
If you have a single workspace, it's selected automatically. Same for user detection in single-member workspaces.
|
|
58
60
|
|
|
59
61
|
Get your API token at [app.clickup.com/settings/apps](https://app.clickup.com/settings/apps).
|
|
@@ -98,12 +100,12 @@ Output is JSON on stdout; errors go to stderr.
|
|
|
98
100
|
| Group | Subcommands | Description |
|
|
99
101
|
|-------|-------------|-------------|
|
|
100
102
|
| `init` | — | Interactive workspace setup |
|
|
101
|
-
| `tasks` | list, get, create, update, search, delete, move, merge | Full task CRUD |
|
|
103
|
+
| `tasks` | list, get, create, update, search, delete, move, merge, depend | Full task CRUD + dependencies |
|
|
102
104
|
| `comments` | list, add, update, delete, thread, reply | Full comment CRUD with threading |
|
|
103
105
|
| `docs` | list, get, create, pages, get-page, edit-page, create-page | Docs and page management |
|
|
104
|
-
| `folders` | list, get, create, update, delete | Folder CRUD |
|
|
105
|
-
| `lists` | list, get, create, update, delete | List CRUD |
|
|
106
|
-
| `spaces` | list, get, statuses | Space inspection |
|
|
106
|
+
| `folders` | list, get, create, update, delete, privacy | Folder CRUD + privacy toggle |
|
|
107
|
+
| `lists` | list, get, create, update, delete, privacy | List CRUD + privacy toggle |
|
|
108
|
+
| `spaces` | list, get, statuses, privacy | Space inspection + privacy toggle |
|
|
107
109
|
| `team` | whoami, members | Workspace and member info |
|
|
108
110
|
| `tags` | list, add, remove | Tag management |
|
|
109
111
|
|
|
@@ -128,7 +130,12 @@ clickup tasks list --space <name> --pretty
|
|
|
128
130
|
## Key Behaviors
|
|
129
131
|
|
|
130
132
|
- **Flag aliases** — every positional argument also accepts a `--flag` form. `tasks get abc123` and `tasks get --task-id abc123` are equivalent. Same for `--query`, `--doc-id`, `--page-id`, `--folder-id`, `--list-id`, `--comment-id`, `--space`.
|
|
133
|
+
- **Raw numeric IDs** on `--space` and `--folder` flags are accepted transparently alongside config aliases. On tasks commands, list-bound commands may resolve a raw space ID to its first folderless list via one API call.
|
|
131
134
|
- **`tasks create`** auto-infers `--space` from `--list` via API lookup. You can omit `--space` if `--list` is provided.
|
|
135
|
+
- **`tasks update`** handles core fields, assignee diffs (`--add-assignee` / `--remove-assignee`), tag diffs (`--add-tag` / `--remove-tag`), and custom fields (`--custom-field FIELD_ID=VALUE`) in one call. All flags are repeatable; `--dry-run` returns a structured plan.
|
|
136
|
+
- **`tasks depend`** — `add`, `remove`, and `list` for task dependencies. Direction required on add/remove via `--depends-on` or `--depended-on-by`.
|
|
137
|
+
- **`tasks list` / `tasks search --include-archived`** — second paginated call with `archived=true`, merged into the default results. Since ClickUp's `archived` param is a filter, this is the only way to see both in one command.
|
|
138
|
+
- **`tasks list --full`** returns `status` as a consistent dict shape (`{status, color, type, orderindex}`). Compact mode and `--fields` continue returning a flat string — one contract per output mode.
|
|
132
139
|
- **`tasks get`** auto-fetches comments and appends them to the output. Use `--no-comments` to skip.
|
|
133
140
|
- **`tasks search`** auto-detects task ID patterns like `PROJ-39` and applies prefix filtering.
|
|
134
141
|
- **`docs edit-page --append`** reads the current page content, appends your new content, and sends one update.
|
|
@@ -147,11 +154,14 @@ clickup tasks list --space <name> --pretty
|
|
|
147
154
|
"workspace_id": "12345",
|
|
148
155
|
"user_id": "67890",
|
|
149
156
|
"spaces": {
|
|
150
|
-
"myspace": {"space_id": "111",
|
|
157
|
+
"myspace": {"space_id": "111"},
|
|
158
|
+
"myspace-with-default-list": {"space_id": "111", "list_id": "222"}
|
|
151
159
|
}
|
|
152
160
|
}
|
|
153
161
|
```
|
|
154
162
|
|
|
163
|
+
`space_id` is the identity of a configured alias. `list_id` is optional convenience for commands that need a default list; space-scoped commands should still target the full space. Reverting Phase 3 restores the older eager list caching setup and example shape.
|
|
164
|
+
|
|
155
165
|
### Config resolution order
|
|
156
166
|
|
|
157
167
|
1. `CLICKUP_CONFIG_PATH` env var → exact file path
|
|
@@ -171,9 +181,9 @@ You can run without a config file by setting just `CLICKUP_API_TOKEN` — the wo
|
|
|
171
181
|
|
|
172
182
|
## Coverage and Gaps
|
|
173
183
|
|
|
174
|
-
**Covered:** tasks, comments, docs/pages, folders, lists, spaces, tags, team/workspace info.
|
|
184
|
+
**Covered:** tasks (including dependencies and custom field writes), comments, docs/pages, folders, lists, spaces, tags, team/workspace info.
|
|
175
185
|
|
|
176
|
-
**Not yet covered:** checklists, time tracking,
|
|
186
|
+
**Not yet covered:** checklists, time tracking, attachments, goals, webhooks, automations.
|
|
177
187
|
|
|
178
188
|
## Development Tools
|
|
179
189
|
|
|
@@ -22,6 +22,8 @@ clickup init
|
|
|
22
22
|
|
|
23
23
|
This prompts for your API token, discovers your workspaces and spaces, identifies your user, and writes a config file to `~/.config/clickup-cli/config.json`.
|
|
24
24
|
|
|
25
|
+
`clickup init` stores each configured space alias with its canonical `space_id`. It does not preload one list per space during setup. Add `list_id` later only if you want a cached default list for list-bound commands.
|
|
26
|
+
|
|
25
27
|
If you have a single workspace, it's selected automatically. Same for user detection in single-member workspaces.
|
|
26
28
|
|
|
27
29
|
Get your API token at [app.clickup.com/settings/apps](https://app.clickup.com/settings/apps).
|
|
@@ -66,12 +68,12 @@ Output is JSON on stdout; errors go to stderr.
|
|
|
66
68
|
| Group | Subcommands | Description |
|
|
67
69
|
|-------|-------------|-------------|
|
|
68
70
|
| `init` | — | Interactive workspace setup |
|
|
69
|
-
| `tasks` | list, get, create, update, search, delete, move, merge | Full task CRUD |
|
|
71
|
+
| `tasks` | list, get, create, update, search, delete, move, merge, depend | Full task CRUD + dependencies |
|
|
70
72
|
| `comments` | list, add, update, delete, thread, reply | Full comment CRUD with threading |
|
|
71
73
|
| `docs` | list, get, create, pages, get-page, edit-page, create-page | Docs and page management |
|
|
72
|
-
| `folders` | list, get, create, update, delete | Folder CRUD |
|
|
73
|
-
| `lists` | list, get, create, update, delete | List CRUD |
|
|
74
|
-
| `spaces` | list, get, statuses | Space inspection |
|
|
74
|
+
| `folders` | list, get, create, update, delete, privacy | Folder CRUD + privacy toggle |
|
|
75
|
+
| `lists` | list, get, create, update, delete, privacy | List CRUD + privacy toggle |
|
|
76
|
+
| `spaces` | list, get, statuses, privacy | Space inspection + privacy toggle |
|
|
75
77
|
| `team` | whoami, members | Workspace and member info |
|
|
76
78
|
| `tags` | list, add, remove | Tag management |
|
|
77
79
|
|
|
@@ -96,7 +98,12 @@ clickup tasks list --space <name> --pretty
|
|
|
96
98
|
## Key Behaviors
|
|
97
99
|
|
|
98
100
|
- **Flag aliases** — every positional argument also accepts a `--flag` form. `tasks get abc123` and `tasks get --task-id abc123` are equivalent. Same for `--query`, `--doc-id`, `--page-id`, `--folder-id`, `--list-id`, `--comment-id`, `--space`.
|
|
101
|
+
- **Raw numeric IDs** on `--space` and `--folder` flags are accepted transparently alongside config aliases. On tasks commands, list-bound commands may resolve a raw space ID to its first folderless list via one API call.
|
|
99
102
|
- **`tasks create`** auto-infers `--space` from `--list` via API lookup. You can omit `--space` if `--list` is provided.
|
|
103
|
+
- **`tasks update`** handles core fields, assignee diffs (`--add-assignee` / `--remove-assignee`), tag diffs (`--add-tag` / `--remove-tag`), and custom fields (`--custom-field FIELD_ID=VALUE`) in one call. All flags are repeatable; `--dry-run` returns a structured plan.
|
|
104
|
+
- **`tasks depend`** — `add`, `remove`, and `list` for task dependencies. Direction required on add/remove via `--depends-on` or `--depended-on-by`.
|
|
105
|
+
- **`tasks list` / `tasks search --include-archived`** — second paginated call with `archived=true`, merged into the default results. Since ClickUp's `archived` param is a filter, this is the only way to see both in one command.
|
|
106
|
+
- **`tasks list --full`** returns `status` as a consistent dict shape (`{status, color, type, orderindex}`). Compact mode and `--fields` continue returning a flat string — one contract per output mode.
|
|
100
107
|
- **`tasks get`** auto-fetches comments and appends them to the output. Use `--no-comments` to skip.
|
|
101
108
|
- **`tasks search`** auto-detects task ID patterns like `PROJ-39` and applies prefix filtering.
|
|
102
109
|
- **`docs edit-page --append`** reads the current page content, appends your new content, and sends one update.
|
|
@@ -115,11 +122,14 @@ clickup tasks list --space <name> --pretty
|
|
|
115
122
|
"workspace_id": "12345",
|
|
116
123
|
"user_id": "67890",
|
|
117
124
|
"spaces": {
|
|
118
|
-
"myspace": {"space_id": "111",
|
|
125
|
+
"myspace": {"space_id": "111"},
|
|
126
|
+
"myspace-with-default-list": {"space_id": "111", "list_id": "222"}
|
|
119
127
|
}
|
|
120
128
|
}
|
|
121
129
|
```
|
|
122
130
|
|
|
131
|
+
`space_id` is the identity of a configured alias. `list_id` is optional convenience for commands that need a default list; space-scoped commands should still target the full space. Reverting Phase 3 restores the older eager list caching setup and example shape.
|
|
132
|
+
|
|
123
133
|
### Config resolution order
|
|
124
134
|
|
|
125
135
|
1. `CLICKUP_CONFIG_PATH` env var → exact file path
|
|
@@ -139,9 +149,9 @@ You can run without a config file by setting just `CLICKUP_API_TOKEN` — the wo
|
|
|
139
149
|
|
|
140
150
|
## Coverage and Gaps
|
|
141
151
|
|
|
142
|
-
**Covered:** tasks, comments, docs/pages, folders, lists, spaces, tags, team/workspace info.
|
|
152
|
+
**Covered:** tasks (including dependencies and custom field writes), comments, docs/pages, folders, lists, spaces, tags, team/workspace info.
|
|
143
153
|
|
|
144
|
-
**Not yet covered:** checklists, time tracking,
|
|
154
|
+
**Not yet covered:** checklists, time tracking, attachments, goals, webhooks, automations.
|
|
145
155
|
|
|
146
156
|
## Development Tools
|
|
147
157
|
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
{
|
|
2
|
+
"api_token": "YOUR_CLICKUP_API_TOKEN_HERE",
|
|
3
|
+
"workspace_id": "YOUR_WORKSPACE_ID",
|
|
4
|
+
"user_id": "YOUR_USER_ID",
|
|
5
|
+
"spaces": {
|
|
6
|
+
"myspace": {"space_id": "SPACE_ID"},
|
|
7
|
+
"myspace-with-default-list": {
|
|
8
|
+
"space_id": "SPACE_ID",
|
|
9
|
+
"list_id": "OPTIONAL_DEFAULT_LIST_ID"
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
}
|