clickup-markdown-mcp 1.0.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.
Files changed (39) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +188 -0
  3. package/dist/api/clickup-client.d.ts +66 -0
  4. package/dist/api/clickup-client.d.ts.map +1 -0
  5. package/dist/api/clickup-client.js +154 -0
  6. package/dist/api/clickup-client.js.map +1 -0
  7. package/dist/cli.d.ts +3 -0
  8. package/dist/cli.d.ts.map +1 -0
  9. package/dist/cli.js +250 -0
  10. package/dist/cli.js.map +1 -0
  11. package/dist/config/config.d.ts +3 -0
  12. package/dist/config/config.d.ts.map +1 -0
  13. package/dist/config/config.js +58 -0
  14. package/dist/config/config.js.map +1 -0
  15. package/dist/discovery/environment-scanner.d.ts +10 -0
  16. package/dist/discovery/environment-scanner.d.ts.map +1 -0
  17. package/dist/discovery/environment-scanner.js +185 -0
  18. package/dist/discovery/environment-scanner.js.map +1 -0
  19. package/dist/generators/markdown-generator.d.ts +8 -0
  20. package/dist/generators/markdown-generator.d.ts.map +1 -0
  21. package/dist/generators/markdown-generator.js +88 -0
  22. package/dist/generators/markdown-generator.js.map +1 -0
  23. package/dist/index.d.ts +3 -0
  24. package/dist/index.d.ts.map +1 -0
  25. package/dist/index.js +19 -0
  26. package/dist/index.js.map +1 -0
  27. package/dist/parsers/markdown-parser.d.ts +23 -0
  28. package/dist/parsers/markdown-parser.d.ts.map +1 -0
  29. package/dist/parsers/markdown-parser.js +216 -0
  30. package/dist/parsers/markdown-parser.js.map +1 -0
  31. package/dist/server.d.ts +3 -0
  32. package/dist/server.d.ts.map +1 -0
  33. package/dist/server.js +450 -0
  34. package/dist/server.js.map +1 -0
  35. package/dist/types/index.d.ts +189 -0
  36. package/dist/types/index.d.ts.map +1 -0
  37. package/dist/types/index.js +6 -0
  38. package/dist/types/index.js.map +1 -0
  39. package/package.json +48 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 Renato Costa
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,188 @@
1
+ # clickup-markdown-mcp
2
+
3
+ **EN:** MCP server for [ClickUp](https://clickup.com/) with Markdown import/export, environment discovery, and task tools for AI assistants.
4
+
5
+ **PT-BR:** Servidor MCP para ClickUp com importação/exportação em Markdown, descoberta de ambiente e ferramentas de tarefas para assistentes de IA.
6
+
7
+ > **Note on the npm package name:** The name `clickup-mcp-server` is already used on npm by another project. This package is published as **`clickup-markdown-mcp`**. The functionality is the same: MCP over stdio plus a CLI for Markdown workflows.
8
+
9
+ ---
10
+
11
+ ## English
12
+
13
+ ### Features
14
+
15
+ - **MCP (stdio):** Full tool surface for lists, tasks, time entries, bulk updates, and **`import_from_md`** (create sprints and subtasks from `tasks.md` content).
16
+ - **CLI:** `clickup-mcp-cli` — discover list metadata, validate/import/export Markdown, close tasks, list custom fields.
17
+ - **Config:** `CLICKUP_API_TOKEN` or `.clickup-mcp.json` (see below).
18
+
19
+ ### Quick start with `npx` (MCP server)
20
+
21
+ Use this in **Cursor**, **Claude Desktop**, or any MCP host that spawns a local command.
22
+
23
+ ```json
24
+ {
25
+ "mcpServers": {
26
+ "clickup": {
27
+ "command": "npx",
28
+ "args": ["-y", "clickup-markdown-mcp"],
29
+ "env": {
30
+ "CLICKUP_API_TOKEN": "pk_your_token_here"
31
+ }
32
+ }
33
+ }
34
+ }
35
+ ```
36
+
37
+ - **`npx -y clickup-markdown-mcp`** runs the **stdio MCP server** (`dist/index.js`).
38
+ - For repeated use, `npx` caches the package; keep your token only in `env`, not in the repo.
39
+
40
+ ### CLI via `npx`
41
+
42
+ The CLI binary is **`clickup-mcp-cli`** (same install, different executable):
43
+
44
+ ```bash
45
+ npx -y -p clickup-markdown-mcp clickup-mcp-cli -- help
46
+ npx -y -p clickup-markdown-mcp clickup-mcp-cli discover --list <LIST_ID>
47
+ npx -y -p clickup-markdown-mcp clickup-mcp-cli validate path/to/tasks.md
48
+ npx -y -p clickup-markdown-mcp clickup-mcp-cli import path/to/tasks.md --parent <PARENT_TASK_ID> --list <LIST_ID>
49
+ ```
50
+
51
+ ### Configuration
52
+
53
+ | Method | Details |
54
+ |--------|---------|
55
+ | Environment | `CLICKUP_API_TOKEN` (required). Optional: `CLICKUP_DEFAULT_LIST_ID`, `CLICKUP_DEFAULT_ASSIGNEES` (comma-separated user IDs). |
56
+ | File | `.clickup-mcp.json` in the current directory or in the user home folder. Example: `{ "apiToken": "pk_...", "defaultListId": "...", "defaultAssignees": [123] }` |
57
+
58
+ ### Tool: `import_from_md`
59
+
60
+ Parameters (conceptually):
61
+
62
+ - **`content`:** Full `tasks.md` string.
63
+ - **`list_id`:** Target list ID.
64
+ - **`parent_task_id`:** Parent task ID (sprints are created as subtasks under it).
65
+ - **`assignees`:** Optional array of ClickUp user IDs.
66
+ - **`custom_fields`:** Optional `{ id, value }[]` for required or default fields.
67
+ - **`start_from_sprint`:** Optional: skip sprints below this number (default `1`).
68
+ - **`mark_as_closed`:** Optional: mark created tasks closed after creation.
69
+
70
+ Markdown format: sprint headers like **`**Sprint 1 - Name**`**, then a table with columns including subtask title, description, estimated time, and real time (see `clickup-mcp-cli guide`).
71
+
72
+ ### Development
73
+
74
+ ```bash
75
+ git clone <your-fork>
76
+ cd clickup-mcp-server
77
+ npm install
78
+ npm run build
79
+ npm run inspect
80
+ ```
81
+
82
+ ### Testing `import_from_md` via MCP locally
83
+
84
+ Requires a real ClickUp token and IDs:
85
+
86
+ ```bash
87
+ export CLICKUP_API_TOKEN=pk_...
88
+ export CLICKUP_TEST_LIST_ID=...
89
+ export CLICKUP_TEST_PARENT_TASK_ID=...
90
+ npm run test:mcp-import
91
+ ```
92
+
93
+ This spawns the same stdio server as production and calls `import_from_md` through the MCP client.
94
+
95
+ ### License
96
+
97
+ MIT — see [LICENSE](./LICENSE).
98
+
99
+ ---
100
+
101
+ ## Português (PT-BR)
102
+
103
+ ### Recursos
104
+
105
+ - **MCP (stdio):** Ferramentas para listas, tarefas, lançamentos de tempo, atualizações em lote e **`import_from_md`** (cria sprints e subtarefas a partir do conteúdo de um `tasks.md`).
106
+ - **CLI:** `clickup-mcp-cli` — descobrir metadados da lista, validar/importar/exportar Markdown, fechar tarefas, listar campos personalizados.
107
+ - **Configuração:** variável de ambiente ou arquivo `.clickup-mcp.json`.
108
+
109
+ ### Uso rápido com `npx` (servidor MCP)
110
+
111
+ Exemplo para **Cursor** ou outro host MCP:
112
+
113
+ ```json
114
+ {
115
+ "mcpServers": {
116
+ "clickup": {
117
+ "command": "npx",
118
+ "args": ["-y", "clickup-markdown-mcp"],
119
+ "env": {
120
+ "CLICKUP_API_TOKEN": "pk_seu_token"
121
+ }
122
+ }
123
+ }
124
+ }
125
+ ```
126
+
127
+ - **`npx -y clickup-markdown-mcp`** inicia o **servidor MCP em stdio** (entrada/saída padrão).
128
+ - Mantenha o token só em `env` ou em arquivo local ignorado pelo Git.
129
+
130
+ ### CLI com `npx`
131
+
132
+ O executável da CLI é **`clickup-mcp-cli`**:
133
+
134
+ ```bash
135
+ npx -y -p clickup-markdown-mcp clickup-mcp-cli -- help
136
+ npx -y -p clickup-markdown-mcp clickup-mcp-cli discover --list <ID_DA_LISTA>
137
+ npx -y -p clickup-markdown-mcp clickup-mcp-cli validate caminho/tasks.md
138
+ npx -y -p clickup-markdown-mcp clickup-mcp-cli import caminho/tasks.md --parent <ID_TAREFA_PAI> --list <ID_DA_LISTA>
139
+ ```
140
+
141
+ ### Configuração
142
+
143
+ | Método | Detalhes |
144
+ |--------|----------|
145
+ | Ambiente | `CLICKUP_API_TOKEN` (obrigatório). Opcional: `CLICKUP_DEFAULT_LIST_ID`, `CLICKUP_DEFAULT_ASSIGNEES` (IDs separados por vírgula). |
146
+ | Arquivo | `.clickup-mcp.json` no diretório atual ou na pasta do usuário. Exemplo: `{ "apiToken": "pk_...", "defaultListId": "...", "defaultAssignees": [123] }` |
147
+
148
+ ### Ferramenta `import_from_md`
149
+
150
+ Parâmetros principais:
151
+
152
+ - **`content`:** Texto completo do `tasks.md`.
153
+ - **`list_id`:** ID da lista onde as tarefas serão criadas.
154
+ - **`parent_task_id`:** ID da tarefa pai (cada sprint vira subtarefa desse pai).
155
+ - **`assignees`:** Opcional — IDs numéricos de usuários ClickUp.
156
+ - **`custom_fields`:** Opcional — lista de `{ id, value }` para campos obrigatórios ou padrões.
157
+ - **`start_from_sprint`:** Opcional — ignorar sprints com número menor (padrão `1`).
158
+ - **`mark_as_closed`:** Opcional — após criar, marcar como concluídas.
159
+
160
+ Formato Markdown: cabeçalhos **`**Sprint N - Nome**`** e tabela com título da subtarefa, descrição, tempo estimado e tempo real (use `clickup-mcp-cli guide` para o guia completo).
161
+
162
+ ### Publicação npm
163
+
164
+ O pacote é **`clickup-markdown-mcp`** porque o nome `clickup-mcp-server` já está registrado no npm por outro mantenedor.
165
+
166
+ Para publicar (mantenedor):
167
+
168
+ ```bash
169
+ npm login
170
+ npm publish --access public
171
+ ```
172
+
173
+ ### Teste local de `import_from_md` via MCP
174
+
175
+ Com token e IDs reais:
176
+
177
+ ```bash
178
+ set CLICKUP_API_TOKEN=pk_...
179
+ set CLICKUP_TEST_LIST_ID=...
180
+ set CLICKUP_TEST_PARENT_TASK_ID=...
181
+ npm run test:mcp-import
182
+ ```
183
+
184
+ No Linux/macOS, use `export` em vez de `set`.
185
+
186
+ ### Licença
187
+
188
+ MIT — veja [LICENSE](./LICENSE).
@@ -0,0 +1,66 @@
1
+ import type { ClickUpWorkspace, ClickUpSpace, ClickUpFolder, ClickUpList, ClickUpTask, ClickUpTimeEntry } from '../types/index.js';
2
+ export declare class ClickUpClient {
3
+ private token;
4
+ private rateLimitDelay;
5
+ constructor(token: string);
6
+ private request;
7
+ listWorkspaces(): Promise<ClickUpWorkspace[]>;
8
+ listSpaces(teamId: string): Promise<ClickUpSpace[]>;
9
+ listFolders(spaceId: string): Promise<ClickUpFolder[]>;
10
+ listLists(folderId: string): Promise<ClickUpList[]>;
11
+ listFolderlessLists(spaceId: string): Promise<ClickUpList[]>;
12
+ getList(listId: string): Promise<ClickUpList & {
13
+ statuses: any[];
14
+ custom_fields: any[];
15
+ }>;
16
+ createTask(listId: string, task: {
17
+ name: string;
18
+ description?: string;
19
+ parent?: string;
20
+ assignees?: number[];
21
+ status?: string;
22
+ custom_fields?: Array<{
23
+ id: string;
24
+ value: string;
25
+ }>;
26
+ }): Promise<ClickUpTask>;
27
+ getTask(taskId: string, includeSubtasks?: boolean): Promise<ClickUpTask>;
28
+ updateTask(taskId: string, updates: {
29
+ name?: string;
30
+ description?: string;
31
+ status?: string;
32
+ assignees?: {
33
+ add?: number[];
34
+ rem?: number[];
35
+ };
36
+ }): Promise<ClickUpTask>;
37
+ deleteTask(taskId: string): Promise<void>;
38
+ searchTasks(listId: string, options?: {
39
+ name?: string;
40
+ statuses?: string[];
41
+ include_subtasks?: boolean;
42
+ }): Promise<ClickUpTask[]>;
43
+ addTimeEntry(taskId: string, entry: {
44
+ duration: number;
45
+ start: number;
46
+ end: number;
47
+ description?: string;
48
+ }): Promise<ClickUpTimeEntry>;
49
+ getTimeEntries(taskId: string): Promise<ClickUpTimeEntry[]>;
50
+ getWorkspaceMembers(teamId: string): Promise<Array<{
51
+ id: number;
52
+ username: string;
53
+ email: string;
54
+ }>>;
55
+ bulkUpdateStatus(taskIds: string[], status: string): Promise<{
56
+ updated: number;
57
+ errors: number;
58
+ details: Array<{
59
+ taskId: string;
60
+ success: boolean;
61
+ error?: string;
62
+ }>;
63
+ }>;
64
+ getSubtasksRecursive(taskId: string): Promise<string[]>;
65
+ }
66
+ //# sourceMappingURL=clickup-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clickup-client.d.ts","sourceRoot":"","sources":["../../src/api/clickup-client.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,gBAAgB,EAChB,YAAY,EACZ,aAAa,EACb,WAAW,EACX,WAAW,EACX,gBAAgB,EACjB,MAAM,mBAAmB,CAAC;AAU3B,qBAAa,aAAa;IACxB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,cAAc,CAAO;gBAEjB,KAAK,EAAE,MAAM;YAMX,OAAO;IAoCf,cAAc,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAO7C,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IASnD,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IAStD,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAOnD,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAO5D,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG;QAAE,QAAQ,EAAE,GAAG,EAAE,CAAC;QAAC,aAAa,EAAE,GAAG,EAAE,CAAA;KAAE,CAAC;IAMzF,UAAU,CACd,MAAM,EAAE,MAAM,EACd,IAAI,EAAE;QACJ,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;QACrB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,aAAa,CAAC,EAAE,KAAK,CAAC;YAAE,EAAE,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;KACtD,GACA,OAAO,CAAC,WAAW,CAAC;IAOjB,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,eAAe,UAAO,GAAG,OAAO,CAAC,WAAW,CAAC;IAMrE,UAAU,CACd,MAAM,EAAE,MAAM,EACd,OAAO,EAAE;QACP,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,SAAS,CAAC,EAAE;YAAE,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC;YAAC,GAAG,CAAC,EAAE,MAAM,EAAE,CAAA;SAAE,CAAC;KAChD,GACA,OAAO,CAAC,WAAW,CAAC;IAOjB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIzC,WAAW,CACf,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE;QACR,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;QACpB,gBAAgB,CAAC,EAAE,OAAO,CAAC;KAC5B,GACA,OAAO,CAAC,WAAW,EAAE,CAAC;IAenB,YAAY,CAChB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE;QACL,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,EAAE,MAAM,CAAC;QACd,GAAG,EAAE,MAAM,CAAC;QACZ,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,GACA,OAAO,CAAC,gBAAgB,CAAC;IAOtB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAS3D,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAapG,gBAAgB,CACpB,OAAO,EAAE,MAAM,EAAE,EACjB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,KAAK,CAAC;YAAE,MAAM,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,OAAO,CAAC;YAAC,KAAK,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC,CAAA;KAAE,CAAC;IAoB/G,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;CAY9D"}
@@ -0,0 +1,154 @@
1
+ "use strict";
2
+ // ============================================================
3
+ // ClickUp MCP Server — ClickUp API v2 Client
4
+ // ============================================================
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.ClickUpClient = void 0;
7
+ const BASE_URL = 'https://api.clickup.com/api/v2';
8
+ class ClickUpClient {
9
+ token;
10
+ rateLimitDelay = 200; // ms between requests
11
+ constructor(token) {
12
+ this.token = token;
13
+ }
14
+ // --- Core HTTP ---
15
+ async request(path, options = {}) {
16
+ const { method = 'GET', body, params } = options;
17
+ let url = `${BASE_URL}${path}`;
18
+ if (params) {
19
+ const qs = new URLSearchParams(params).toString();
20
+ url += `?${qs}`;
21
+ }
22
+ const headers = {
23
+ Authorization: this.token,
24
+ 'Content-Type': 'application/json',
25
+ };
26
+ const fetchOptions = { method, headers };
27
+ if (body) {
28
+ fetchOptions.body = JSON.stringify(body);
29
+ }
30
+ // Simple rate limiting
31
+ await new Promise((r) => setTimeout(r, this.rateLimitDelay));
32
+ const response = await fetch(url, fetchOptions);
33
+ if (!response.ok) {
34
+ const errorBody = await response.text();
35
+ throw new Error(`ClickUp API error ${response.status}: ${errorBody}`);
36
+ }
37
+ return response.json();
38
+ }
39
+ // --- Workspaces ---
40
+ async listWorkspaces() {
41
+ const data = await this.request('/team');
42
+ return data.teams;
43
+ }
44
+ // --- Spaces ---
45
+ async listSpaces(teamId) {
46
+ const data = await this.request(`/team/${teamId}/space`);
47
+ return data.spaces;
48
+ }
49
+ // --- Folders ---
50
+ async listFolders(spaceId) {
51
+ const data = await this.request(`/space/${spaceId}/folder`);
52
+ return data.folders;
53
+ }
54
+ // --- Lists ---
55
+ async listLists(folderId) {
56
+ const data = await this.request(`/folder/${folderId}/list`);
57
+ return data.lists;
58
+ }
59
+ async listFolderlessLists(spaceId) {
60
+ const data = await this.request(`/space/${spaceId}/list`);
61
+ return data.lists;
62
+ }
63
+ async getList(listId) {
64
+ return this.request(`/list/${listId}`);
65
+ }
66
+ // --- Tasks ---
67
+ async createTask(listId, task) {
68
+ return this.request(`/list/${listId}/task`, {
69
+ method: 'POST',
70
+ body: task,
71
+ });
72
+ }
73
+ async getTask(taskId, includeSubtasks = true) {
74
+ return this.request(`/task/${taskId}`, {
75
+ params: includeSubtasks ? { include_subtasks: 'true' } : {},
76
+ });
77
+ }
78
+ async updateTask(taskId, updates) {
79
+ return this.request(`/task/${taskId}`, {
80
+ method: 'PUT',
81
+ body: updates,
82
+ });
83
+ }
84
+ async deleteTask(taskId) {
85
+ await this.request(`/task/${taskId}`, { method: 'DELETE' });
86
+ }
87
+ async searchTasks(listId, options) {
88
+ const params = {};
89
+ if (options?.name)
90
+ params.name = options.name;
91
+ if (options?.statuses)
92
+ params.statuses = options.statuses.join(',');
93
+ if (options?.include_subtasks)
94
+ params.include_subtasks = 'true';
95
+ const data = await this.request(`/list/${listId}/task`, { params });
96
+ return data.tasks;
97
+ }
98
+ // --- Time Tracking ---
99
+ async addTimeEntry(taskId, entry) {
100
+ return this.request(`/task/${taskId}/time`, {
101
+ method: 'POST',
102
+ body: entry,
103
+ });
104
+ }
105
+ async getTimeEntries(taskId) {
106
+ const data = await this.request(`/task/${taskId}/time`);
107
+ return data.data;
108
+ }
109
+ // --- Workspace Members ---
110
+ async getWorkspaceMembers(teamId) {
111
+ const workspaces = await this.listWorkspaces();
112
+ const ws = workspaces.find((w) => w.id === teamId);
113
+ if (!ws)
114
+ return [];
115
+ return ws.members.map((m) => ({
116
+ id: m.id,
117
+ username: m.username,
118
+ email: m.email,
119
+ }));
120
+ }
121
+ // --- Bulk Operations ---
122
+ async bulkUpdateStatus(taskIds, status) {
123
+ const details = [];
124
+ let updated = 0;
125
+ let errors = 0;
126
+ for (const taskId of taskIds) {
127
+ try {
128
+ await this.updateTask(taskId, { status });
129
+ details.push({ taskId, success: true });
130
+ updated++;
131
+ }
132
+ catch (e) {
133
+ const error = e instanceof Error ? e.message : String(e);
134
+ details.push({ taskId, success: false, error });
135
+ errors++;
136
+ }
137
+ }
138
+ return { updated, errors, details };
139
+ }
140
+ async getSubtasksRecursive(taskId) {
141
+ const ids = [];
142
+ const task = await this.getTask(taskId, true);
143
+ ids.push(task.id);
144
+ if (task.subtasks) {
145
+ for (const sub of task.subtasks) {
146
+ const childIds = await this.getSubtasksRecursive(sub.id);
147
+ ids.push(...childIds);
148
+ }
149
+ }
150
+ return ids;
151
+ }
152
+ }
153
+ exports.ClickUpClient = ClickUpClient;
154
+ //# sourceMappingURL=clickup-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clickup-client.js","sourceRoot":"","sources":["../../src/api/clickup-client.ts"],"names":[],"mappings":"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"}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}