@kb-labs/clickup-core 2.96.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/README.md +5 -0
- package/dist/index.d.ts +53 -0
- package/dist/index.js +244 -0
- package/dist/index.js.map +1 -0
- package/package.json +43 -0
package/README.md
ADDED
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { ClickUpComment, CreateFolderInput, ClickUpFolder, CreateListInput, ClickUpList, CreateSpaceInput, ClickUpSpaceDetail, CreateTaskInput, ClickUpTask, ClickUpStatus, ClickUpWorkspace, UpdateFolderInput, UpdateListInput, UpdateSpaceInput, UpdateTaskInput } from '@kb-labs/clickup-contracts';
|
|
2
|
+
|
|
3
|
+
declare function requireApiKey(): string;
|
|
4
|
+
declare function requireTeamId(): string;
|
|
5
|
+
|
|
6
|
+
declare class ClickUpApiError extends Error {
|
|
7
|
+
readonly status: number;
|
|
8
|
+
readonly code: string;
|
|
9
|
+
constructor(status: number, code: string, message: string);
|
|
10
|
+
}
|
|
11
|
+
declare function clickupFetch<T>(path: string, apiKey: string, options?: RequestInit): Promise<T>;
|
|
12
|
+
|
|
13
|
+
declare function getWorkspaceHierarchy(apiKey: string, teamId: string): Promise<ClickUpWorkspace>;
|
|
14
|
+
interface SearchTasksParams {
|
|
15
|
+
query?: string;
|
|
16
|
+
list_ids?: string[];
|
|
17
|
+
statuses?: string[];
|
|
18
|
+
assignees?: string[];
|
|
19
|
+
limit?: number;
|
|
20
|
+
page?: number;
|
|
21
|
+
include_closed?: boolean;
|
|
22
|
+
}
|
|
23
|
+
declare function searchTasks(apiKey: string, teamId: string, params?: SearchTasksParams): Promise<ClickUpTask[]>;
|
|
24
|
+
declare function getTask(apiKey: string, taskId: string): Promise<ClickUpTask>;
|
|
25
|
+
declare function createTask(apiKey: string, listId: string, body: CreateTaskInput): Promise<ClickUpTask>;
|
|
26
|
+
declare function updateTask(apiKey: string, taskId: string, body: UpdateTaskInput): Promise<ClickUpTask>;
|
|
27
|
+
declare function deleteTask(apiKey: string, taskId: string): Promise<void>;
|
|
28
|
+
interface ListTasksParams {
|
|
29
|
+
statuses?: string[];
|
|
30
|
+
assignees?: string[];
|
|
31
|
+
limit?: number;
|
|
32
|
+
page?: number;
|
|
33
|
+
include_closed?: boolean;
|
|
34
|
+
}
|
|
35
|
+
declare function getListTasks(apiKey: string, listId: string, params?: ListTasksParams): Promise<ClickUpTask[]>;
|
|
36
|
+
declare function getListStatuses(apiKey: string, listId: string): Promise<ClickUpStatus[]>;
|
|
37
|
+
declare function getTaskComments(apiKey: string, taskId: string): Promise<ClickUpComment[]>;
|
|
38
|
+
declare function addTaskComment(apiKey: string, taskId: string, commentText: string, options?: {
|
|
39
|
+
assignee?: number;
|
|
40
|
+
notifyAll?: boolean;
|
|
41
|
+
}): Promise<ClickUpComment>;
|
|
42
|
+
declare function createSpace(apiKey: string, teamId: string, body: CreateSpaceInput): Promise<ClickUpSpaceDetail>;
|
|
43
|
+
declare function updateSpace(apiKey: string, spaceId: string, body: UpdateSpaceInput): Promise<ClickUpSpaceDetail>;
|
|
44
|
+
declare function deleteSpace(apiKey: string, spaceId: string): Promise<void>;
|
|
45
|
+
declare function createFolder(apiKey: string, spaceId: string, body: CreateFolderInput): Promise<ClickUpFolder>;
|
|
46
|
+
declare function updateFolder(apiKey: string, folderId: string, body: UpdateFolderInput): Promise<ClickUpFolder>;
|
|
47
|
+
declare function deleteFolder(apiKey: string, folderId: string): Promise<void>;
|
|
48
|
+
declare function createListInFolder(apiKey: string, folderId: string, body: CreateListInput): Promise<ClickUpList>;
|
|
49
|
+
declare function createListInSpace(apiKey: string, spaceId: string, body: CreateListInput): Promise<ClickUpList>;
|
|
50
|
+
declare function updateList(apiKey: string, listId: string, body: UpdateListInput): Promise<ClickUpList>;
|
|
51
|
+
declare function deleteList(apiKey: string, listId: string): Promise<void>;
|
|
52
|
+
|
|
53
|
+
export { ClickUpApiError, type ListTasksParams, type SearchTasksParams, addTaskComment, clickupFetch, createFolder, createListInFolder, createListInSpace, createSpace, createTask, deleteFolder, deleteList, deleteSpace, deleteTask, getListStatuses, getListTasks, getTask, getTaskComments, getWorkspaceHierarchy, requireApiKey, requireTeamId, searchTasks, updateFolder, updateList, updateSpace, updateTask };
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
import { useEnv } from '@kb-labs/sdk';
|
|
2
|
+
|
|
3
|
+
// src/env.ts
|
|
4
|
+
function requireApiKey() {
|
|
5
|
+
const key = useEnv("CLICKUP_API_KEY");
|
|
6
|
+
if (!key) {
|
|
7
|
+
throw new Error("CLICKUP_API_KEY is not set");
|
|
8
|
+
}
|
|
9
|
+
return key;
|
|
10
|
+
}
|
|
11
|
+
function requireTeamId() {
|
|
12
|
+
const id = useEnv("CLICKUP_TEAM_ID");
|
|
13
|
+
if (!id) {
|
|
14
|
+
throw new Error("CLICKUP_TEAM_ID is not set");
|
|
15
|
+
}
|
|
16
|
+
return id;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
// src/client.ts
|
|
20
|
+
var BASE_URL = "https://api.clickup.com/api/v2";
|
|
21
|
+
var ClickUpApiError = class extends Error {
|
|
22
|
+
constructor(status, code, message) {
|
|
23
|
+
super(message);
|
|
24
|
+
this.status = status;
|
|
25
|
+
this.code = code;
|
|
26
|
+
this.name = "ClickUpApiError";
|
|
27
|
+
}
|
|
28
|
+
status;
|
|
29
|
+
code;
|
|
30
|
+
};
|
|
31
|
+
async function clickupFetch(path, apiKey, options = {}) {
|
|
32
|
+
const url = `${BASE_URL}${path}`;
|
|
33
|
+
const res = await fetch(url, {
|
|
34
|
+
...options,
|
|
35
|
+
headers: {
|
|
36
|
+
"Authorization": apiKey,
|
|
37
|
+
"Content-Type": "application/json",
|
|
38
|
+
...options.headers
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
if (!res.ok) {
|
|
42
|
+
let code = "UNKNOWN";
|
|
43
|
+
let message = `ClickUp API error ${res.status}`;
|
|
44
|
+
try {
|
|
45
|
+
const body = await res.json();
|
|
46
|
+
if (body.err) {
|
|
47
|
+
message = body.err;
|
|
48
|
+
}
|
|
49
|
+
if (body.ECODE) {
|
|
50
|
+
code = body.ECODE;
|
|
51
|
+
}
|
|
52
|
+
} catch {
|
|
53
|
+
}
|
|
54
|
+
throw new ClickUpApiError(res.status, code, message);
|
|
55
|
+
}
|
|
56
|
+
const text = await res.text();
|
|
57
|
+
if (!text) {
|
|
58
|
+
return {};
|
|
59
|
+
}
|
|
60
|
+
return JSON.parse(text);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// src/api.ts
|
|
64
|
+
async function resolveTeam(apiKey, teamIdHint) {
|
|
65
|
+
const res = await clickupFetch("/team", apiKey);
|
|
66
|
+
const team = res.teams.find((t) => t.id === teamIdHint) ?? res.teams[0];
|
|
67
|
+
if (!team) {
|
|
68
|
+
throw new Error(`No ClickUp team found for CLICKUP_TEAM_ID=${teamIdHint}`);
|
|
69
|
+
}
|
|
70
|
+
return team;
|
|
71
|
+
}
|
|
72
|
+
async function getWorkspaceHierarchy(apiKey, teamId) {
|
|
73
|
+
const team = await resolveTeam(apiKey, teamId);
|
|
74
|
+
const spacesRes = await clickupFetch(
|
|
75
|
+
`/team/${team.id}/space?archived=false`,
|
|
76
|
+
apiKey
|
|
77
|
+
);
|
|
78
|
+
const spaces = await Promise.all(
|
|
79
|
+
spacesRes.spaces.map(async (space) => {
|
|
80
|
+
const [foldersRes, listsRes] = await Promise.all([
|
|
81
|
+
clickupFetch(`/space/${space.id}/folder?archived=false`, apiKey),
|
|
82
|
+
clickupFetch(`/space/${space.id}/list?archived=false`, apiKey)
|
|
83
|
+
]);
|
|
84
|
+
const folders = await Promise.all(
|
|
85
|
+
foldersRes.folders.map(async (folder) => {
|
|
86
|
+
const folderListsRes = await clickupFetch(
|
|
87
|
+
`/folder/${folder.id}/list?archived=false`,
|
|
88
|
+
apiKey
|
|
89
|
+
);
|
|
90
|
+
return { ...folder, lists: folderListsRes.lists };
|
|
91
|
+
})
|
|
92
|
+
);
|
|
93
|
+
return { ...space, folders, lists: listsRes.lists };
|
|
94
|
+
})
|
|
95
|
+
);
|
|
96
|
+
return { id: team.id, name: team.name, spaces };
|
|
97
|
+
}
|
|
98
|
+
async function searchTasks(apiKey, teamId, params = {}) {
|
|
99
|
+
const qs = new URLSearchParams();
|
|
100
|
+
if (params.query) {
|
|
101
|
+
qs.set("query", params.query);
|
|
102
|
+
}
|
|
103
|
+
if (params.list_ids?.length) {
|
|
104
|
+
params.list_ids.forEach((id) => qs.append("list_ids[]", id));
|
|
105
|
+
}
|
|
106
|
+
if (params.statuses?.length) {
|
|
107
|
+
params.statuses.forEach((s) => qs.append("statuses[]", s));
|
|
108
|
+
}
|
|
109
|
+
if (params.assignees?.length) {
|
|
110
|
+
params.assignees.forEach((a) => qs.append("assignees[]", a));
|
|
111
|
+
}
|
|
112
|
+
qs.set("page", String(params.page ?? 0));
|
|
113
|
+
qs.set("limit", String(Math.min(params.limit ?? 20, 100)));
|
|
114
|
+
if (params.include_closed) {
|
|
115
|
+
qs.set("include_closed", "true");
|
|
116
|
+
}
|
|
117
|
+
qs.set("subtasks", "true");
|
|
118
|
+
const team = await resolveTeam(apiKey, teamId);
|
|
119
|
+
const res = await clickupFetch(
|
|
120
|
+
`/team/${team.id}/task?${qs}`,
|
|
121
|
+
apiKey
|
|
122
|
+
);
|
|
123
|
+
return res.tasks;
|
|
124
|
+
}
|
|
125
|
+
async function getTask(apiKey, taskId) {
|
|
126
|
+
return clickupFetch(
|
|
127
|
+
`/task/${taskId}?include_subtasks=true`,
|
|
128
|
+
apiKey
|
|
129
|
+
);
|
|
130
|
+
}
|
|
131
|
+
async function createTask(apiKey, listId, body) {
|
|
132
|
+
return clickupFetch(`/list/${listId}/task`, apiKey, {
|
|
133
|
+
method: "POST",
|
|
134
|
+
body: JSON.stringify(body)
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
async function updateTask(apiKey, taskId, body) {
|
|
138
|
+
return clickupFetch(`/task/${taskId}`, apiKey, {
|
|
139
|
+
method: "PUT",
|
|
140
|
+
body: JSON.stringify(body)
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
async function deleteTask(apiKey, taskId) {
|
|
144
|
+
await clickupFetch(`/task/${taskId}`, apiKey, { method: "DELETE" });
|
|
145
|
+
}
|
|
146
|
+
async function getListTasks(apiKey, listId, params = {}) {
|
|
147
|
+
const qs = new URLSearchParams();
|
|
148
|
+
if (params.statuses?.length) {
|
|
149
|
+
params.statuses.forEach((s) => qs.append("statuses[]", s));
|
|
150
|
+
}
|
|
151
|
+
if (params.assignees?.length) {
|
|
152
|
+
params.assignees.forEach((a) => qs.append("assignees[]", a));
|
|
153
|
+
}
|
|
154
|
+
qs.set("page", String(params.page ?? 0));
|
|
155
|
+
if (params.include_closed) {
|
|
156
|
+
qs.set("include_closed", "true");
|
|
157
|
+
}
|
|
158
|
+
qs.set("subtasks", "true");
|
|
159
|
+
const res = await clickupFetch(
|
|
160
|
+
`/list/${listId}/task?${qs}`,
|
|
161
|
+
apiKey
|
|
162
|
+
);
|
|
163
|
+
return res.tasks;
|
|
164
|
+
}
|
|
165
|
+
async function getListStatuses(apiKey, listId) {
|
|
166
|
+
const res = await clickupFetch(
|
|
167
|
+
`/list/${listId}`,
|
|
168
|
+
apiKey
|
|
169
|
+
);
|
|
170
|
+
return res.statuses ?? [];
|
|
171
|
+
}
|
|
172
|
+
async function getTaskComments(apiKey, taskId) {
|
|
173
|
+
const res = await clickupFetch(
|
|
174
|
+
`/task/${taskId}/comment`,
|
|
175
|
+
apiKey
|
|
176
|
+
);
|
|
177
|
+
return res.comments ?? [];
|
|
178
|
+
}
|
|
179
|
+
async function addTaskComment(apiKey, taskId, commentText, options = {}) {
|
|
180
|
+
return clickupFetch(`/task/${taskId}/comment`, apiKey, {
|
|
181
|
+
method: "POST",
|
|
182
|
+
body: JSON.stringify({
|
|
183
|
+
comment_text: commentText,
|
|
184
|
+
assignee: options.assignee,
|
|
185
|
+
notify_all: options.notifyAll ?? false
|
|
186
|
+
})
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
async function createSpace(apiKey, teamId, body) {
|
|
190
|
+
const team = await resolveTeam(apiKey, teamId);
|
|
191
|
+
return clickupFetch(`/team/${team.id}/space`, apiKey, {
|
|
192
|
+
method: "POST",
|
|
193
|
+
body: JSON.stringify(body)
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
async function updateSpace(apiKey, spaceId, body) {
|
|
197
|
+
return clickupFetch(`/space/${spaceId}`, apiKey, {
|
|
198
|
+
method: "PUT",
|
|
199
|
+
body: JSON.stringify(body)
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
async function deleteSpace(apiKey, spaceId) {
|
|
203
|
+
await clickupFetch(`/space/${spaceId}`, apiKey, { method: "DELETE" });
|
|
204
|
+
}
|
|
205
|
+
async function createFolder(apiKey, spaceId, body) {
|
|
206
|
+
return clickupFetch(`/space/${spaceId}/folder`, apiKey, {
|
|
207
|
+
method: "POST",
|
|
208
|
+
body: JSON.stringify(body)
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
async function updateFolder(apiKey, folderId, body) {
|
|
212
|
+
return clickupFetch(`/folder/${folderId}`, apiKey, {
|
|
213
|
+
method: "PUT",
|
|
214
|
+
body: JSON.stringify(body)
|
|
215
|
+
});
|
|
216
|
+
}
|
|
217
|
+
async function deleteFolder(apiKey, folderId) {
|
|
218
|
+
await clickupFetch(`/folder/${folderId}`, apiKey, { method: "DELETE" });
|
|
219
|
+
}
|
|
220
|
+
async function createListInFolder(apiKey, folderId, body) {
|
|
221
|
+
return clickupFetch(`/folder/${folderId}/list`, apiKey, {
|
|
222
|
+
method: "POST",
|
|
223
|
+
body: JSON.stringify(body)
|
|
224
|
+
});
|
|
225
|
+
}
|
|
226
|
+
async function createListInSpace(apiKey, spaceId, body) {
|
|
227
|
+
return clickupFetch(`/space/${spaceId}/list`, apiKey, {
|
|
228
|
+
method: "POST",
|
|
229
|
+
body: JSON.stringify(body)
|
|
230
|
+
});
|
|
231
|
+
}
|
|
232
|
+
async function updateList(apiKey, listId, body) {
|
|
233
|
+
return clickupFetch(`/list/${listId}`, apiKey, {
|
|
234
|
+
method: "PUT",
|
|
235
|
+
body: JSON.stringify(body)
|
|
236
|
+
});
|
|
237
|
+
}
|
|
238
|
+
async function deleteList(apiKey, listId) {
|
|
239
|
+
await clickupFetch(`/list/${listId}`, apiKey, { method: "DELETE" });
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
export { ClickUpApiError, addTaskComment, clickupFetch, createFolder, createListInFolder, createListInSpace, createSpace, createTask, deleteFolder, deleteList, deleteSpace, deleteTask, getListStatuses, getListTasks, getTask, getTaskComments, getWorkspaceHierarchy, requireApiKey, requireTeamId, searchTasks, updateFolder, updateList, updateSpace, updateTask };
|
|
243
|
+
//# sourceMappingURL=index.js.map
|
|
244
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/env.ts","../src/client.ts","../src/api.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import { useEnv } from '@kb-labs/sdk';\n\nexport function requireApiKey(): string {\n const key = useEnv('CLICKUP_API_KEY');\n if (!key) { throw new Error('CLICKUP_API_KEY is not set'); }\n return key;\n}\n\nexport function requireTeamId(): string {\n const id = useEnv('CLICKUP_TEAM_ID');\n if (!id) { throw new Error('CLICKUP_TEAM_ID is not set'); }\n return id;\n}\n","const BASE_URL = 'https://api.clickup.com/api/v2';\n\nexport class ClickUpApiError extends Error {\n constructor(\n public readonly status: number,\n public readonly code: string,\n message: string,\n ) {\n super(message);\n this.name = 'ClickUpApiError';\n }\n}\n\nexport async function clickupFetch<T>(\n path: string,\n apiKey: string,\n options: RequestInit = {},\n): Promise<T> {\n const url = `${BASE_URL}${path}`;\n const res = await fetch(url, {\n ...options,\n headers: {\n 'Authorization': apiKey,\n 'Content-Type': 'application/json',\n ...options.headers,\n },\n });\n\n if (!res.ok) {\n let code = 'UNKNOWN';\n let message = `ClickUp API error ${res.status}`;\n try {\n const body = await res.json() as { err?: string; ECODE?: string };\n if (body.err) { message = body.err; }\n if (body.ECODE) { code = body.ECODE; }\n } catch {\n // ignore parse error\n }\n throw new ClickUpApiError(res.status, code, message);\n }\n\n const text = await res.text();\n if (!text) { return {} as T; }\n return JSON.parse(text) as T;\n}\n","import { clickupFetch } from './client.js';\nimport type {\n ClickUpWorkspace,\n ClickUpSpace,\n ClickUpSpaceDetail,\n ClickUpFolder,\n ClickUpList,\n ClickUpTask,\n ClickUpComment,\n ClickUpStatus,\n CreateTaskInput,\n UpdateTaskInput,\n CreateSpaceInput,\n UpdateSpaceInput,\n CreateFolderInput,\n UpdateFolderInput,\n CreateListInput,\n UpdateListInput,\n} from '@kb-labs/clickup-contracts';\n\n// ── Workspace / Hierarchy ────────────────────────────────────────────────────\n\nasync function resolveTeam(\n apiKey: string,\n teamIdHint: string,\n): Promise<{ id: string; name: string }> {\n const res = await clickupFetch<{ teams: Array<{ id: string; name: string }> }>('/team', apiKey);\n const team = res.teams.find(t => t.id === teamIdHint) ?? res.teams[0];\n if (!team) { throw new Error(`No ClickUp team found for CLICKUP_TEAM_ID=${teamIdHint}`); }\n return team;\n}\n\nexport async function getWorkspaceHierarchy(\n apiKey: string,\n teamId: string,\n): Promise<ClickUpWorkspace> {\n const team = await resolveTeam(apiKey, teamId);\n\n const spacesRes = await clickupFetch<{ spaces: ClickUpSpace[] }>(\n `/team/${team.id}/space?archived=false`,\n apiKey,\n );\n\n const spaces = await Promise.all(\n spacesRes.spaces.map(async space => {\n const [foldersRes, listsRes] = await Promise.all([\n clickupFetch<{ folders: ClickUpFolder[] }>(`/space/${space.id}/folder?archived=false`, apiKey),\n clickupFetch<{ lists: ClickUpList[] }>(`/space/${space.id}/list?archived=false`, apiKey),\n ]);\n\n const folders = await Promise.all(\n foldersRes.folders.map(async folder => {\n const folderListsRes = await clickupFetch<{ lists: ClickUpList[] }>(\n `/folder/${folder.id}/list?archived=false`,\n apiKey,\n );\n return { ...folder, lists: folderListsRes.lists };\n }),\n );\n\n return { ...space, folders, lists: listsRes.lists };\n }),\n );\n\n return { id: team.id, name: team.name, spaces };\n}\n\n// ── Tasks ────────────────────────────────────────────────────────────────────\n\nexport interface SearchTasksParams {\n query?: string;\n list_ids?: string[];\n statuses?: string[];\n assignees?: string[];\n limit?: number;\n page?: number;\n include_closed?: boolean;\n}\n\nexport async function searchTasks(\n apiKey: string,\n teamId: string,\n params: SearchTasksParams = {},\n): Promise<ClickUpTask[]> {\n const qs = new URLSearchParams();\n if (params.query) { qs.set('query', params.query); }\n if (params.list_ids?.length) { params.list_ids.forEach(id => qs.append('list_ids[]', id)); }\n if (params.statuses?.length) { params.statuses.forEach(s => qs.append('statuses[]', s)); }\n if (params.assignees?.length) { params.assignees.forEach(a => qs.append('assignees[]', a)); }\n qs.set('page', String(params.page ?? 0));\n qs.set('limit', String(Math.min(params.limit ?? 20, 100)));\n if (params.include_closed) { qs.set('include_closed', 'true'); }\n qs.set('subtasks', 'true');\n\n const team = await resolveTeam(apiKey, teamId);\n const res = await clickupFetch<{ tasks: ClickUpTask[] }>(\n `/team/${team.id}/task?${qs}`,\n apiKey,\n );\n return res.tasks;\n}\n\nexport async function getTask(apiKey: string, taskId: string): Promise<ClickUpTask> {\n return clickupFetch<ClickUpTask>(\n `/task/${taskId}?include_subtasks=true`,\n apiKey,\n );\n}\n\nexport async function createTask(\n apiKey: string,\n listId: string,\n body: CreateTaskInput,\n): Promise<ClickUpTask> {\n return clickupFetch<ClickUpTask>(`/list/${listId}/task`, apiKey, {\n method: 'POST',\n body: JSON.stringify(body),\n });\n}\n\nexport async function updateTask(\n apiKey: string,\n taskId: string,\n body: UpdateTaskInput,\n): Promise<ClickUpTask> {\n return clickupFetch<ClickUpTask>(`/task/${taskId}`, apiKey, {\n method: 'PUT',\n body: JSON.stringify(body),\n });\n}\n\nexport async function deleteTask(apiKey: string, taskId: string): Promise<void> {\n await clickupFetch<void>(`/task/${taskId}`, apiKey, { method: 'DELETE' });\n}\n\n// ── List ─────────────────────────────────────────────────────────────────────\n\nexport interface ListTasksParams {\n statuses?: string[];\n assignees?: string[];\n limit?: number;\n page?: number;\n include_closed?: boolean;\n}\n\nexport async function getListTasks(\n apiKey: string,\n listId: string,\n params: ListTasksParams = {},\n): Promise<ClickUpTask[]> {\n const qs = new URLSearchParams();\n if (params.statuses?.length) { params.statuses.forEach(s => qs.append('statuses[]', s)); }\n if (params.assignees?.length) { params.assignees.forEach(a => qs.append('assignees[]', a)); }\n qs.set('page', String(params.page ?? 0));\n if (params.include_closed) { qs.set('include_closed', 'true'); }\n qs.set('subtasks', 'true');\n\n const res = await clickupFetch<{ tasks: ClickUpTask[] }>(\n `/list/${listId}/task?${qs}`,\n apiKey,\n );\n return res.tasks;\n}\n\nexport async function getListStatuses(\n apiKey: string,\n listId: string,\n): Promise<ClickUpStatus[]> {\n const res = await clickupFetch<{ statuses: ClickUpStatus[] }>(\n `/list/${listId}`,\n apiKey,\n );\n return res.statuses ?? [];\n}\n\n// ── Comments ─────────────────────────────────────────────────────────────────\n\nexport async function getTaskComments(\n apiKey: string,\n taskId: string,\n): Promise<ClickUpComment[]> {\n const res = await clickupFetch<{ comments: ClickUpComment[] }>(\n `/task/${taskId}/comment`,\n apiKey,\n );\n return res.comments ?? [];\n}\n\nexport async function addTaskComment(\n apiKey: string,\n taskId: string,\n commentText: string,\n options: { assignee?: number; notifyAll?: boolean } = {},\n): Promise<ClickUpComment> {\n return clickupFetch<ClickUpComment>(`/task/${taskId}/comment`, apiKey, {\n method: 'POST',\n body: JSON.stringify({\n comment_text: commentText,\n assignee: options.assignee,\n notify_all: options.notifyAll ?? false,\n }),\n });\n}\n\n// ── Spaces ────────────────────────────────────────────────────────────────────\n\nexport async function createSpace(\n apiKey: string,\n teamId: string,\n body: CreateSpaceInput,\n): Promise<ClickUpSpaceDetail> {\n const team = await resolveTeam(apiKey, teamId);\n return clickupFetch<ClickUpSpaceDetail>(`/team/${team.id}/space`, apiKey, {\n method: 'POST',\n body: JSON.stringify(body),\n });\n}\n\nexport async function updateSpace(\n apiKey: string,\n spaceId: string,\n body: UpdateSpaceInput,\n): Promise<ClickUpSpaceDetail> {\n return clickupFetch<ClickUpSpaceDetail>(`/space/${spaceId}`, apiKey, {\n method: 'PUT',\n body: JSON.stringify(body),\n });\n}\n\nexport async function deleteSpace(apiKey: string, spaceId: string): Promise<void> {\n await clickupFetch<void>(`/space/${spaceId}`, apiKey, { method: 'DELETE' });\n}\n\n// ── Folders ───────────────────────────────────────────────────────────────────\n\nexport async function createFolder(\n apiKey: string,\n spaceId: string,\n body: CreateFolderInput,\n): Promise<ClickUpFolder> {\n return clickupFetch<ClickUpFolder>(`/space/${spaceId}/folder`, apiKey, {\n method: 'POST',\n body: JSON.stringify(body),\n });\n}\n\nexport async function updateFolder(\n apiKey: string,\n folderId: string,\n body: UpdateFolderInput,\n): Promise<ClickUpFolder> {\n return clickupFetch<ClickUpFolder>(`/folder/${folderId}`, apiKey, {\n method: 'PUT',\n body: JSON.stringify(body),\n });\n}\n\nexport async function deleteFolder(apiKey: string, folderId: string): Promise<void> {\n await clickupFetch<void>(`/folder/${folderId}`, apiKey, { method: 'DELETE' });\n}\n\n// ── Lists (create/update/delete) ──────────────────────────────────────────────\n\nexport async function createListInFolder(\n apiKey: string,\n folderId: string,\n body: CreateListInput,\n): Promise<ClickUpList> {\n return clickupFetch<ClickUpList>(`/folder/${folderId}/list`, apiKey, {\n method: 'POST',\n body: JSON.stringify(body),\n });\n}\n\nexport async function createListInSpace(\n apiKey: string,\n spaceId: string,\n body: CreateListInput,\n): Promise<ClickUpList> {\n return clickupFetch<ClickUpList>(`/space/${spaceId}/list`, apiKey, {\n method: 'POST',\n body: JSON.stringify(body),\n });\n}\n\nexport async function updateList(\n apiKey: string,\n listId: string,\n body: UpdateListInput,\n): Promise<ClickUpList> {\n return clickupFetch<ClickUpList>(`/list/${listId}`, apiKey, {\n method: 'PUT',\n body: JSON.stringify(body),\n });\n}\n\nexport async function deleteList(apiKey: string, listId: string): Promise<void> {\n await clickupFetch<void>(`/list/${listId}`, apiKey, { method: 'DELETE' });\n}\n"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@kb-labs/clickup-core",
|
|
3
|
+
"version": "2.96.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"description": "Business logic for clickup (pure, testable in isolation).",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"import": "./dist/index.js",
|
|
11
|
+
"types": "./dist/index.d.ts"
|
|
12
|
+
}
|
|
13
|
+
},
|
|
14
|
+
"files": [
|
|
15
|
+
"dist"
|
|
16
|
+
],
|
|
17
|
+
"sideEffects": false,
|
|
18
|
+
"dependencies": {
|
|
19
|
+
"@kb-labs/sdk": "2.21.2",
|
|
20
|
+
"@kb-labs/clickup-contracts": "2.96.0"
|
|
21
|
+
},
|
|
22
|
+
"devDependencies": {
|
|
23
|
+
"@types/node": "^24.0.0",
|
|
24
|
+
"rimraf": "^6.0.1",
|
|
25
|
+
"tsup": "^8.5.0",
|
|
26
|
+
"typescript": "^5.6.3",
|
|
27
|
+
"vitest": "^3.2.6",
|
|
28
|
+
"@kb-labs/devkit": "2.96.0"
|
|
29
|
+
},
|
|
30
|
+
"engines": {
|
|
31
|
+
"node": ">=20.0.0",
|
|
32
|
+
"pnpm": ">=9.0.0"
|
|
33
|
+
},
|
|
34
|
+
"scripts": {
|
|
35
|
+
"clean": "rimraf dist",
|
|
36
|
+
"build": "tsup",
|
|
37
|
+
"dev": "tsup --watch",
|
|
38
|
+
"lint": "eslint src --ext .ts",
|
|
39
|
+
"lint:fix": "eslint . --fix",
|
|
40
|
+
"type-check": "tsc --noEmit",
|
|
41
|
+
"test": "vitest run --passWithNoTests"
|
|
42
|
+
}
|
|
43
|
+
}
|