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.
Files changed (61) hide show
  1. {clickup_cli-1.4.0 → clickup_cli-1.6.0}/.claude/skills/clickup-cli.md +34 -0
  2. clickup_cli-1.6.0/.claude/skills/release/SKILL.md +105 -0
  3. {clickup_cli-1.4.0 → clickup_cli-1.6.0}/.github/workflows/ci.yml +4 -0
  4. {clickup_cli-1.4.0 → clickup_cli-1.6.0}/CHANGELOG.md +17 -0
  5. {clickup_cli-1.4.0 → clickup_cli-1.6.0}/CLAUDE.md +4 -4
  6. {clickup_cli-1.4.0 → clickup_cli-1.6.0}/PKG-INFO +18 -8
  7. {clickup_cli-1.4.0 → clickup_cli-1.6.0}/README.md +17 -7
  8. clickup_cli-1.6.0/clickup-config.example.json +12 -0
  9. clickup_cli-1.6.0/docs/superpowers/plans/2026-04-18-gsd-public-repo-autonomous-rollout.md +542 -0
  10. clickup_cli-1.6.0/docs/superpowers/specs/2026-04-18-gsd-public-repo-autonomous-design.md +236 -0
  11. {clickup_cli-1.4.0 → clickup_cli-1.6.0}/src/clickup_cli/__init__.py +1 -1
  12. {clickup_cli-1.4.0 → clickup_cli-1.6.0}/src/clickup_cli/cli.py +20 -22
  13. {clickup_cli-1.4.0 → clickup_cli-1.6.0}/src/clickup_cli/client.py +6 -1
  14. clickup_cli-1.6.0/src/clickup_cli/commands/__init__.py +27 -0
  15. {clickup_cli-1.4.0 → clickup_cli-1.6.0}/src/clickup_cli/commands/comments.py +25 -10
  16. {clickup_cli-1.4.0 → clickup_cli-1.6.0}/src/clickup_cli/commands/docs.py +43 -25
  17. {clickup_cli-1.4.0 → clickup_cli-1.6.0}/src/clickup_cli/commands/folders.py +63 -7
  18. {clickup_cli-1.4.0 → clickup_cli-1.6.0}/src/clickup_cli/commands/init.py +6 -11
  19. {clickup_cli-1.4.0 → clickup_cli-1.6.0}/src/clickup_cli/commands/lists.py +63 -7
  20. clickup_cli-1.6.0/src/clickup_cli/commands/privacy.py +55 -0
  21. {clickup_cli-1.4.0 → clickup_cli-1.6.0}/src/clickup_cli/commands/spaces.py +65 -8
  22. {clickup_cli-1.4.0 → clickup_cli-1.6.0}/src/clickup_cli/commands/tags.py +10 -0
  23. clickup_cli-1.6.0/src/clickup_cli/commands/tasks.py +32 -0
  24. clickup_cli-1.6.0/src/clickup_cli/commands/tasks_internal/__init__.py +16 -0
  25. 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
  26. clickup_cli-1.6.0/src/clickup_cli/commands/tasks_internal/read.py +184 -0
  27. clickup_cli-1.6.0/src/clickup_cli/commands/tasks_internal/shared.py +155 -0
  28. clickup_cli-1.6.0/src/clickup_cli/commands/tasks_internal/write.py +209 -0
  29. {clickup_cli-1.4.0 → clickup_cli-1.6.0}/src/clickup_cli/commands/team.py +10 -3
  30. {clickup_cli-1.4.0 → clickup_cli-1.6.0}/src/clickup_cli/config.py +1 -8
  31. {clickup_cli-1.4.0 → clickup_cli-1.6.0}/src/clickup_cli/helpers.py +36 -18
  32. clickup_cli-1.6.0/src/clickup_cli/runtime.py +10 -0
  33. clickup_cli-1.6.0/tests/command_fakes.py +59 -0
  34. {clickup_cli-1.4.0 → clickup_cli-1.6.0}/tests/test_cli.py +173 -20
  35. {clickup_cli-1.4.0 → clickup_cli-1.6.0}/tests/test_client.py +41 -0
  36. clickup_cli-1.6.0/tests/test_command_manifest.py +38 -0
  37. clickup_cli-1.6.0/tests/test_commands_docs_comments.py +541 -0
  38. clickup_cli-1.6.0/tests/test_commands_misc.py +494 -0
  39. clickup_cli-1.6.0/tests/test_commands_spaces_lists_folders.py +418 -0
  40. clickup_cli-1.6.0/tests/test_commands_tasks.py +1091 -0
  41. {clickup_cli-1.4.0 → clickup_cli-1.6.0}/tests/test_config.py +18 -8
  42. {clickup_cli-1.4.0 → clickup_cli-1.6.0}/tests/test_helpers.py +25 -6
  43. clickup_cli-1.6.0/tests/test_tasks_facade.py +36 -0
  44. clickup_cli-1.4.0/.claude/skills/release/SKILL.md +0 -66
  45. clickup_cli-1.4.0/clickup-config.example.json +0 -8
  46. clickup_cli-1.4.0/src/clickup_cli/commands/__init__.py +0 -73
  47. clickup_cli-1.4.0/tests/test_commands.py +0 -1734
  48. {clickup_cli-1.4.0 → clickup_cli-1.6.0}/.claude/agents/api-compatibility-checker.md +0 -0
  49. {clickup_cli-1.4.0 → clickup_cli-1.6.0}/.claude/agents/test-writer.md +0 -0
  50. {clickup_cli-1.4.0 → clickup_cli-1.6.0}/.claude/settings.json +0 -0
  51. {clickup_cli-1.4.0 → clickup_cli-1.6.0}/.claude/skills/add-command.md +0 -0
  52. {clickup_cli-1.4.0 → clickup_cli-1.6.0}/.claude/skills/changelog/SKILL.md +0 -0
  53. {clickup_cli-1.4.0 → clickup_cli-1.6.0}/.claude/skills/validate-output/SKILL.md +0 -0
  54. {clickup_cli-1.4.0 → clickup_cli-1.6.0}/.gitignore +0 -0
  55. {clickup_cli-1.4.0 → clickup_cli-1.6.0}/.mcp.json +0 -0
  56. {clickup_cli-1.4.0 → clickup_cli-1.6.0}/CONTRIBUTING.md +0 -0
  57. {clickup_cli-1.4.0 → clickup_cli-1.6.0}/LICENSE +0 -0
  58. {clickup_cli-1.4.0 → clickup_cli-1.6.0}/pyproject.toml +0 -0
  59. {clickup_cli-1.4.0 → clickup_cli-1.6.0}/scripts/validate-cli-output.sh +0 -0
  60. {clickup_cli-1.4.0 → clickup_cli-1.6.0}/src/clickup_cli/__main__.py +0 -0
  61. {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
+
@@ -24,6 +24,10 @@ jobs:
24
24
  - name: Install dependencies
25
25
  run: pip install -e ".[dev]"
26
26
 
27
+ - name: Validate CLI output contract
28
+ if: matrix.python-version == '3.11'
29
+ run: bash scripts/validate-cli-output.sh
30
+
27
31
  - name: Lint
28
32
  run: ruff check src/ tests/
29
33
 
@@ -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.4.0
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", "list_id": "222"}
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, custom fields, task relationships, attachments, goals, webhooks, automations.
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", "list_id": "222"}
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, custom fields, task relationships, attachments, goals, webhooks, automations.
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
+ }