@kb-labs/clickup-entry 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 +69 -0
- package/dist/commands/folder-create.d.ts +13 -0
- package/dist/commands/folder-create.js +94 -0
- package/dist/commands/folder-create.js.map +1 -0
- package/dist/commands/folder-delete.d.ts +14 -0
- package/dist/commands/folder-delete.js +92 -0
- package/dist/commands/folder-delete.js.map +1 -0
- package/dist/commands/folder-update.d.ts +13 -0
- package/dist/commands/folder-update.js +94 -0
- package/dist/commands/folder-update.js.map +1 -0
- package/dist/commands/list-create.d.ts +15 -0
- package/dist/commands/list-create.js +96 -0
- package/dist/commands/list-create.js.map +1 -0
- package/dist/commands/list-delete.d.ts +14 -0
- package/dist/commands/list-delete.js +92 -0
- package/dist/commands/list-delete.js.map +1 -0
- package/dist/commands/list-statuses.d.ts +11 -0
- package/dist/commands/list-statuses.js +88 -0
- package/dist/commands/list-statuses.js.map +1 -0
- package/dist/commands/list-tasks.d.ts +16 -0
- package/dist/commands/list-tasks.js +118 -0
- package/dist/commands/list-tasks.js.map +1 -0
- package/dist/commands/list-update.d.ts +13 -0
- package/dist/commands/list-update.js +92 -0
- package/dist/commands/list-update.js.map +1 -0
- package/dist/commands/space-create.d.ts +15 -0
- package/dist/commands/space-create.js +94 -0
- package/dist/commands/space-create.js.map +1 -0
- package/dist/commands/space-delete.d.ts +14 -0
- package/dist/commands/space-delete.js +92 -0
- package/dist/commands/space-delete.js.map +1 -0
- package/dist/commands/space-update.d.ts +14 -0
- package/dist/commands/space-update.js +93 -0
- package/dist/commands/space-update.js.map +1 -0
- package/dist/commands/task-comment-add.d.ts +15 -0
- package/dist/commands/task-comment-add.js +95 -0
- package/dist/commands/task-comment-add.js.map +1 -0
- package/dist/commands/task-comment-list.d.ts +11 -0
- package/dist/commands/task-comment-list.js +91 -0
- package/dist/commands/task-comment-list.js.map +1 -0
- package/dist/commands/task-create.d.ts +20 -0
- package/dist/commands/task-create.js +116 -0
- package/dist/commands/task-create.js.map +1 -0
- package/dist/commands/task-delete.d.ts +14 -0
- package/dist/commands/task-delete.js +92 -0
- package/dist/commands/task-delete.js.map +1 -0
- package/dist/commands/task-get.d.ts +14 -0
- package/dist/commands/task-get.js +128 -0
- package/dist/commands/task-get.js.map +1 -0
- package/dist/commands/task-search.d.ts +16 -0
- package/dist/commands/task-search.js +112 -0
- package/dist/commands/task-search.js.map +1 -0
- package/dist/commands/task-update.d.ts +19 -0
- package/dist/commands/task-update.js +124 -0
- package/dist/commands/task-update.js.map +1 -0
- package/dist/commands/workspace.d.ts +11 -0
- package/dist/commands/workspace.js +102 -0
- package/dist/commands/workspace.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +474 -0
- package/dist/index.js.map +1 -0
- package/dist/manifest.d.ts +171 -0
- package/dist/manifest.js +474 -0
- package/dist/manifest.js.map +1 -0
- package/dist/rest/handlers/folder-create-handler.d.ts +11 -0
- package/dist/rest/handlers/folder-create-handler.js +57 -0
- package/dist/rest/handlers/folder-create-handler.js.map +1 -0
- package/dist/rest/handlers/folder-delete-handler.d.ts +11 -0
- package/dist/rest/handlers/folder-delete-handler.js +57 -0
- package/dist/rest/handlers/folder-delete-handler.js.map +1 -0
- package/dist/rest/handlers/folder-update-handler.d.ts +11 -0
- package/dist/rest/handlers/folder-update-handler.js +57 -0
- package/dist/rest/handlers/folder-update-handler.js.map +1 -0
- package/dist/rest/handlers/list-create-handler.d.ts +17 -0
- package/dist/rest/handlers/list-create-handler.js +59 -0
- package/dist/rest/handlers/list-create-handler.js.map +1 -0
- package/dist/rest/handlers/list-delete-handler.d.ts +11 -0
- package/dist/rest/handlers/list-delete-handler.js +57 -0
- package/dist/rest/handlers/list-delete-handler.js.map +1 -0
- package/dist/rest/handlers/list-statuses-handler.d.ts +9 -0
- package/dist/rest/handlers/list-statuses-handler.js +57 -0
- package/dist/rest/handlers/list-statuses-handler.js.map +1 -0
- package/dist/rest/handlers/list-tasks-handler.d.ts +16 -0
- package/dist/rest/handlers/list-tasks-handler.js +64 -0
- package/dist/rest/handlers/list-tasks-handler.js.map +1 -0
- package/dist/rest/handlers/list-update-handler.d.ts +15 -0
- package/dist/rest/handlers/list-update-handler.js +57 -0
- package/dist/rest/handlers/list-update-handler.js.map +1 -0
- package/dist/rest/handlers/search-handler.d.ts +16 -0
- package/dist/rest/handlers/search-handler.js +65 -0
- package/dist/rest/handlers/search-handler.js.map +1 -0
- package/dist/rest/handlers/space-create-handler.d.ts +11 -0
- package/dist/rest/handlers/space-create-handler.js +55 -0
- package/dist/rest/handlers/space-create-handler.js.map +1 -0
- package/dist/rest/handlers/space-delete-handler.d.ts +11 -0
- package/dist/rest/handlers/space-delete-handler.js +57 -0
- package/dist/rest/handlers/space-delete-handler.js.map +1 -0
- package/dist/rest/handlers/space-update-handler.d.ts +13 -0
- package/dist/rest/handlers/space-update-handler.js +57 -0
- package/dist/rest/handlers/space-update-handler.js.map +1 -0
- package/dist/rest/handlers/task-comment-add-handler.d.ts +13 -0
- package/dist/rest/handlers/task-comment-add-handler.js +61 -0
- package/dist/rest/handlers/task-comment-add-handler.js.map +1 -0
- package/dist/rest/handlers/task-comments-handler.d.ts +9 -0
- package/dist/rest/handlers/task-comments-handler.js +57 -0
- package/dist/rest/handlers/task-comments-handler.js.map +1 -0
- package/dist/rest/handlers/task-create-handler.d.ts +18 -0
- package/dist/rest/handlers/task-create-handler.js +58 -0
- package/dist/rest/handlers/task-create-handler.js.map +1 -0
- package/dist/rest/handlers/task-delete-handler.d.ts +11 -0
- package/dist/rest/handlers/task-delete-handler.js +58 -0
- package/dist/rest/handlers/task-delete-handler.js.map +1 -0
- package/dist/rest/handlers/task-get-handler.d.ts +12 -0
- package/dist/rest/handlers/task-get-handler.js +61 -0
- package/dist/rest/handlers/task-get-handler.js.map +1 -0
- package/dist/rest/handlers/task-update-handler.d.ts +19 -0
- package/dist/rest/handlers/task-update-handler.js +58 -0
- package/dist/rest/handlers/task-update-handler.js.map +1 -0
- package/dist/rest/handlers/workspace-handler.d.ts +6 -0
- package/dist/rest/handlers/workspace-handler.js +56 -0
- package/dist/rest/handlers/workspace-handler.js.map +1 -0
- package/package.json +54 -0
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import * as _kb_labs_shared_command_kit from '@kb-labs/shared-command-kit';
|
|
2
|
+
import { RestInput } from '@kb-labs/sdk';
|
|
3
|
+
|
|
4
|
+
declare const _default: _kb_labs_shared_command_kit.Handler<unknown, RestInput<Record<string, never>, never, {
|
|
5
|
+
folderId: string;
|
|
6
|
+
}>, {
|
|
7
|
+
deleted: boolean;
|
|
8
|
+
folderId: string;
|
|
9
|
+
}>;
|
|
10
|
+
|
|
11
|
+
export { _default as default };
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { defineHandler } from '@kb-labs/sdk';
|
|
2
|
+
import { deleteFolder, requireApiKey, ClickUpApiError } from '@kb-labs/clickup-core';
|
|
3
|
+
|
|
4
|
+
// src/rest/handlers/folder-delete-handler.ts
|
|
5
|
+
function apiHint(err) {
|
|
6
|
+
switch (err.status) {
|
|
7
|
+
case 401:
|
|
8
|
+
return "CLICKUP_API_KEY is invalid or expired \u2014 check the token in your environment";
|
|
9
|
+
case 403:
|
|
10
|
+
return "You don't have permission for this action in ClickUp \u2014 check workspace access";
|
|
11
|
+
case 404:
|
|
12
|
+
return "Resource not found \u2014 verify the ID is correct (use `kb clickup workspace` to browse IDs)";
|
|
13
|
+
case 429:
|
|
14
|
+
return "ClickUp rate limit reached \u2014 wait a moment and retry";
|
|
15
|
+
default:
|
|
16
|
+
return "Unexpected ClickUp API error";
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
function rethrowForRest(err) {
|
|
20
|
+
if (err instanceof ClickUpApiError) {
|
|
21
|
+
const hint = apiHint(err);
|
|
22
|
+
const restErr = Object.assign(new Error(err.message), {
|
|
23
|
+
statusCode: err.status,
|
|
24
|
+
code: err.code,
|
|
25
|
+
details: { hint }
|
|
26
|
+
});
|
|
27
|
+
throw restErr;
|
|
28
|
+
}
|
|
29
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
30
|
+
const isEnvMissing = /CLICKUP_API_KEY|CLICKUP_TEAM_ID/.test(message);
|
|
31
|
+
if (isEnvMissing) {
|
|
32
|
+
throw Object.assign(new Error(message), {
|
|
33
|
+
statusCode: 400,
|
|
34
|
+
code: "ENV_MISSING",
|
|
35
|
+
details: { hint: "Set CLICKUP_API_KEY (and CLICKUP_TEAM_ID for workspace commands) as environment variables" }
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
throw err;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// src/rest/handlers/folder-delete-handler.ts
|
|
42
|
+
var folder_delete_handler_default = defineHandler({
|
|
43
|
+
async execute(_ctx, input) {
|
|
44
|
+
try {
|
|
45
|
+
const folderId = input.params?.folderId;
|
|
46
|
+
if (!folderId) throw new Error("folderId is required");
|
|
47
|
+
await deleteFolder(requireApiKey(), folderId);
|
|
48
|
+
return { deleted: true, folderId };
|
|
49
|
+
} catch (err) {
|
|
50
|
+
rethrowForRest(err);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
export { folder_delete_handler_default as default };
|
|
56
|
+
//# sourceMappingURL=folder-delete-handler.js.map
|
|
57
|
+
//# sourceMappingURL=folder-delete-handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/utils/error.ts","../../../src/rest/handlers/folder-delete-handler.ts"],"names":[],"mappings":";;;;AAKA,SAAS,QAAQ,GAAA,EAA8B;AAC7C,EAAA,QAAQ,IAAI,MAAA;AAAQ,IAClB,KAAK,GAAA;AAAK,MAAA,OAAO,kFAAA;AAAA,IACjB,KAAK,GAAA;AAAK,MAAA,OAAO,oFAAA;AAAA,IACjB,KAAK,GAAA;AAAK,MAAA,OAAO,+FAAA;AAAA,IACjB,KAAK,GAAA;AAAK,MAAA,OAAO,2DAAA;AAAA,IACjB;AAAU,MAAA,OAAO,8BAAA;AAAA;AAErB;AA+CO,SAAS,eAAe,GAAA,EAAqB;AAClD,EAAA,IAAI,eAAe,eAAA,EAAiB;AAClC,IAAA,MAAM,IAAA,GAAO,QAAQ,GAAG,CAAA;AACxB,IAAA,MAAM,UAAU,MAAA,CAAO,MAAA,CAAO,IAAI,KAAA,CAAM,GAAA,CAAI,OAAO,CAAA,EAAG;AAAA,MACpD,YAAY,GAAA,CAAI,MAAA;AAAA,MAChB,MAAM,GAAA,CAAI,IAAA;AAAA,MACV,OAAA,EAAS,EAAE,IAAA;AAAK,KACjB,CAAA;AACD,IAAA,MAAM,OAAA;AAAA,EACR;AACA,EAAA,MAAM,UAAU,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG,CAAA;AAC/D,EAAA,MAAM,YAAA,GAAe,iCAAA,CAAkC,IAAA,CAAK,OAAO,CAAA;AACnE,EAAA,IAAI,YAAA,EAAc;AAChB,IAAA,MAAM,MAAA,CAAO,MAAA,CAAO,IAAI,KAAA,CAAM,OAAO,CAAA,EAAG;AAAA,MACtC,UAAA,EAAY,GAAA;AAAA,MACZ,IAAA,EAAM,aAAA;AAAA,MACN,OAAA,EAAS,EAAE,IAAA,EAAM,2FAAA;AAA4F,KAC9G,CAAA;AAAA,EACH;AACA,EAAA,MAAM,GAAA;AACR;;;AC5EA,IAAO,gCAAQ,aAAA,CAAc;AAAA,EAC3B,MAAM,OAAA,CACJ,IAAA,EACA,KAAA,EACA;AACA,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,EAAQ,QAAA;AAC/B,MAAA,IAAI,CAAC,QAAA,EAAU,MAAM,IAAI,MAAM,sBAAsB,CAAA;AACrD,MAAA,MAAM,YAAA,CAAa,aAAA,EAAc,EAAG,QAAQ,CAAA;AAC5C,MAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,QAAA,EAAS;AAAA,IACnC,SAAS,GAAA,EAAK;AACZ,MAAA,cAAA,CAAe,GAAG,CAAA;AAAA,IACpB;AAAA,EACF;AACF,CAAC","file":"folder-delete-handler.js","sourcesContent":["import type { PluginContextV3 } from '@kb-labs/sdk';\nimport { ClickUpApiError } from '@kb-labs/clickup-core';\n\nexport { validationError } from '@kb-labs/sdk';\n\nfunction apiHint(err: ClickUpApiError): string {\n switch (err.status) {\n case 401: return 'CLICKUP_API_KEY is invalid or expired — check the token in your environment';\n case 403: return 'You don\\'t have permission for this action in ClickUp — check workspace access';\n case 404: return 'Resource not found — verify the ID is correct (use `kb clickup workspace` to browse IDs)';\n case 429: return 'ClickUp rate limit reached — wait a moment and retry';\n default: return 'Unexpected ClickUp API error';\n }\n}\n\n/**\n * Output a structured error and return — call right before `return { exitCode: 1, result: null }`.\n * In JSON mode emits `{ ok: false, error: { code, message, hint?, status? } }`.\n * In CLI mode uses ctx.ui.error() with hint and cause.\n */\nexport function handleError(ctx: PluginContextV3, err: unknown, isJson?: boolean): void {\n if (err instanceof ClickUpApiError) {\n const hint = apiHint(err);\n if (isJson) {\n ctx.ui?.json?.({ ok: false, error: { code: err.code, message: err.message, status: err.status, hint } });\n } else {\n ctx.ui?.error?.(err.message, { hint, cause: `ClickUp API ${err.status} (${err.code})` });\n }\n return;\n }\n\n const message = err instanceof Error ? err.message : String(err);\n const isEnvMissing = /CLICKUP_API_KEY|CLICKUP_TEAM_ID/.test(message);\n\n if (isJson) {\n ctx.ui?.json?.({\n ok: false,\n error: {\n code: isEnvMissing ? 'ENV_MISSING' : 'INTERNAL_ERROR',\n message,\n ...(isEnvMissing && {\n hint: 'Set CLICKUP_API_KEY (and CLICKUP_TEAM_ID for workspace commands) as environment variables',\n }),\n },\n });\n } else {\n ctx.ui?.error?.(message, {\n ...(isEnvMissing && {\n hint: 'Set CLICKUP_API_KEY (and CLICKUP_TEAM_ID for workspace commands) as environment variables',\n command: 'export CLICKUP_API_KEY=pk_xxx CLICKUP_TEAM_ID=yyy',\n }),\n });\n }\n}\n\n/**\n * Re-throws `err` as an HTTP-aware error for REST handlers.\n * `ClickUpApiError` → preserves HTTP status code; env errors → 400; others → 500.\n * The envelope middleware in rest-api reads `err.statusCode` to set the response status.\n */\nexport function rethrowForRest(err: unknown): never {\n if (err instanceof ClickUpApiError) {\n const hint = apiHint(err);\n const restErr = Object.assign(new Error(err.message), {\n statusCode: err.status,\n code: err.code,\n details: { hint },\n });\n throw restErr;\n }\n const message = err instanceof Error ? err.message : String(err);\n const isEnvMissing = /CLICKUP_API_KEY|CLICKUP_TEAM_ID/.test(message);\n if (isEnvMissing) {\n throw Object.assign(new Error(message), {\n statusCode: 400,\n code: 'ENV_MISSING',\n details: { hint: 'Set CLICKUP_API_KEY (and CLICKUP_TEAM_ID for workspace commands) as environment variables' },\n });\n }\n throw err;\n}\n","import { defineHandler, type PluginContextV3, type RestInput } from '@kb-labs/sdk';\nimport { requireApiKey, deleteFolder } from '@kb-labs/clickup-core';\nimport { rethrowForRest } from '../../utils/error.js';\n\nexport default defineHandler({\n async execute(\n _ctx: PluginContextV3,\n input: RestInput<Record<string, never>, never, { folderId: string }>,\n ) {\n try {\n const folderId = input.params?.folderId;\n if (!folderId) throw new Error('folderId is required');\n await deleteFolder(requireApiKey(), folderId);\n return { deleted: true, folderId };\n } catch (err) {\n rethrowForRest(err);\n }\n },\n});\n"]}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import * as _kb_labs_shared_command_kit from '@kb-labs/shared-command-kit';
|
|
2
|
+
import * as _kb_labs_clickup_contracts from '@kb-labs/clickup-contracts';
|
|
3
|
+
import { RestInput } from '@kb-labs/sdk';
|
|
4
|
+
|
|
5
|
+
declare const _default: _kb_labs_shared_command_kit.Handler<unknown, RestInput<Record<string, never>, {
|
|
6
|
+
name: string;
|
|
7
|
+
}, {
|
|
8
|
+
folderId: string;
|
|
9
|
+
}>, _kb_labs_clickup_contracts.ClickUpFolder>;
|
|
10
|
+
|
|
11
|
+
export { _default as default };
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { defineHandler } from '@kb-labs/sdk';
|
|
2
|
+
import { updateFolder, requireApiKey, ClickUpApiError } from '@kb-labs/clickup-core';
|
|
3
|
+
|
|
4
|
+
// src/rest/handlers/folder-update-handler.ts
|
|
5
|
+
function apiHint(err) {
|
|
6
|
+
switch (err.status) {
|
|
7
|
+
case 401:
|
|
8
|
+
return "CLICKUP_API_KEY is invalid or expired \u2014 check the token in your environment";
|
|
9
|
+
case 403:
|
|
10
|
+
return "You don't have permission for this action in ClickUp \u2014 check workspace access";
|
|
11
|
+
case 404:
|
|
12
|
+
return "Resource not found \u2014 verify the ID is correct (use `kb clickup workspace` to browse IDs)";
|
|
13
|
+
case 429:
|
|
14
|
+
return "ClickUp rate limit reached \u2014 wait a moment and retry";
|
|
15
|
+
default:
|
|
16
|
+
return "Unexpected ClickUp API error";
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
function rethrowForRest(err) {
|
|
20
|
+
if (err instanceof ClickUpApiError) {
|
|
21
|
+
const hint = apiHint(err);
|
|
22
|
+
const restErr = Object.assign(new Error(err.message), {
|
|
23
|
+
statusCode: err.status,
|
|
24
|
+
code: err.code,
|
|
25
|
+
details: { hint }
|
|
26
|
+
});
|
|
27
|
+
throw restErr;
|
|
28
|
+
}
|
|
29
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
30
|
+
const isEnvMissing = /CLICKUP_API_KEY|CLICKUP_TEAM_ID/.test(message);
|
|
31
|
+
if (isEnvMissing) {
|
|
32
|
+
throw Object.assign(new Error(message), {
|
|
33
|
+
statusCode: 400,
|
|
34
|
+
code: "ENV_MISSING",
|
|
35
|
+
details: { hint: "Set CLICKUP_API_KEY (and CLICKUP_TEAM_ID for workspace commands) as environment variables" }
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
throw err;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// src/rest/handlers/folder-update-handler.ts
|
|
42
|
+
var folder_update_handler_default = defineHandler({
|
|
43
|
+
async execute(_ctx, input) {
|
|
44
|
+
try {
|
|
45
|
+
const folderId = input.params?.folderId;
|
|
46
|
+
if (!folderId) throw new Error("folderId is required");
|
|
47
|
+
if (!input.body) throw new Error("body is required");
|
|
48
|
+
return updateFolder(requireApiKey(), folderId, input.body);
|
|
49
|
+
} catch (err) {
|
|
50
|
+
rethrowForRest(err);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
export { folder_update_handler_default as default };
|
|
56
|
+
//# sourceMappingURL=folder-update-handler.js.map
|
|
57
|
+
//# sourceMappingURL=folder-update-handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/utils/error.ts","../../../src/rest/handlers/folder-update-handler.ts"],"names":[],"mappings":";;;;AAKA,SAAS,QAAQ,GAAA,EAA8B;AAC7C,EAAA,QAAQ,IAAI,MAAA;AAAQ,IAClB,KAAK,GAAA;AAAK,MAAA,OAAO,kFAAA;AAAA,IACjB,KAAK,GAAA;AAAK,MAAA,OAAO,oFAAA;AAAA,IACjB,KAAK,GAAA;AAAK,MAAA,OAAO,+FAAA;AAAA,IACjB,KAAK,GAAA;AAAK,MAAA,OAAO,2DAAA;AAAA,IACjB;AAAU,MAAA,OAAO,8BAAA;AAAA;AAErB;AA+CO,SAAS,eAAe,GAAA,EAAqB;AAClD,EAAA,IAAI,eAAe,eAAA,EAAiB;AAClC,IAAA,MAAM,IAAA,GAAO,QAAQ,GAAG,CAAA;AACxB,IAAA,MAAM,UAAU,MAAA,CAAO,MAAA,CAAO,IAAI,KAAA,CAAM,GAAA,CAAI,OAAO,CAAA,EAAG;AAAA,MACpD,YAAY,GAAA,CAAI,MAAA;AAAA,MAChB,MAAM,GAAA,CAAI,IAAA;AAAA,MACV,OAAA,EAAS,EAAE,IAAA;AAAK,KACjB,CAAA;AACD,IAAA,MAAM,OAAA;AAAA,EACR;AACA,EAAA,MAAM,UAAU,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG,CAAA;AAC/D,EAAA,MAAM,YAAA,GAAe,iCAAA,CAAkC,IAAA,CAAK,OAAO,CAAA;AACnE,EAAA,IAAI,YAAA,EAAc;AAChB,IAAA,MAAM,MAAA,CAAO,MAAA,CAAO,IAAI,KAAA,CAAM,OAAO,CAAA,EAAG;AAAA,MACtC,UAAA,EAAY,GAAA;AAAA,MACZ,IAAA,EAAM,aAAA;AAAA,MACN,OAAA,EAAS,EAAE,IAAA,EAAM,2FAAA;AAA4F,KAC9G,CAAA;AAAA,EACH;AACA,EAAA,MAAM,GAAA;AACR;;;AC3EA,IAAO,gCAAQ,aAAA,CAAc;AAAA,EAC3B,MAAM,OAAA,CACJ,IAAA,EACA,KAAA,EACA;AACA,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,MAAA,EAAQ,QAAA;AAC/B,MAAA,IAAI,CAAC,QAAA,EAAU,MAAM,IAAI,MAAM,sBAAsB,CAAA;AACrD,MAAA,IAAI,CAAC,KAAA,CAAM,IAAA,EAAM,MAAM,IAAI,MAAM,kBAAkB,CAAA;AACnD,MAAA,OAAO,YAAA,CAAa,aAAA,EAAc,EAAG,QAAA,EAAU,MAAM,IAAI,CAAA;AAAA,IAC3D,SAAS,GAAA,EAAK;AACZ,MAAA,cAAA,CAAe,GAAG,CAAA;AAAA,IACpB;AAAA,EACF;AACF,CAAC","file":"folder-update-handler.js","sourcesContent":["import type { PluginContextV3 } from '@kb-labs/sdk';\nimport { ClickUpApiError } from '@kb-labs/clickup-core';\n\nexport { validationError } from '@kb-labs/sdk';\n\nfunction apiHint(err: ClickUpApiError): string {\n switch (err.status) {\n case 401: return 'CLICKUP_API_KEY is invalid or expired — check the token in your environment';\n case 403: return 'You don\\'t have permission for this action in ClickUp — check workspace access';\n case 404: return 'Resource not found — verify the ID is correct (use `kb clickup workspace` to browse IDs)';\n case 429: return 'ClickUp rate limit reached — wait a moment and retry';\n default: return 'Unexpected ClickUp API error';\n }\n}\n\n/**\n * Output a structured error and return — call right before `return { exitCode: 1, result: null }`.\n * In JSON mode emits `{ ok: false, error: { code, message, hint?, status? } }`.\n * In CLI mode uses ctx.ui.error() with hint and cause.\n */\nexport function handleError(ctx: PluginContextV3, err: unknown, isJson?: boolean): void {\n if (err instanceof ClickUpApiError) {\n const hint = apiHint(err);\n if (isJson) {\n ctx.ui?.json?.({ ok: false, error: { code: err.code, message: err.message, status: err.status, hint } });\n } else {\n ctx.ui?.error?.(err.message, { hint, cause: `ClickUp API ${err.status} (${err.code})` });\n }\n return;\n }\n\n const message = err instanceof Error ? err.message : String(err);\n const isEnvMissing = /CLICKUP_API_KEY|CLICKUP_TEAM_ID/.test(message);\n\n if (isJson) {\n ctx.ui?.json?.({\n ok: false,\n error: {\n code: isEnvMissing ? 'ENV_MISSING' : 'INTERNAL_ERROR',\n message,\n ...(isEnvMissing && {\n hint: 'Set CLICKUP_API_KEY (and CLICKUP_TEAM_ID for workspace commands) as environment variables',\n }),\n },\n });\n } else {\n ctx.ui?.error?.(message, {\n ...(isEnvMissing && {\n hint: 'Set CLICKUP_API_KEY (and CLICKUP_TEAM_ID for workspace commands) as environment variables',\n command: 'export CLICKUP_API_KEY=pk_xxx CLICKUP_TEAM_ID=yyy',\n }),\n });\n }\n}\n\n/**\n * Re-throws `err` as an HTTP-aware error for REST handlers.\n * `ClickUpApiError` → preserves HTTP status code; env errors → 400; others → 500.\n * The envelope middleware in rest-api reads `err.statusCode` to set the response status.\n */\nexport function rethrowForRest(err: unknown): never {\n if (err instanceof ClickUpApiError) {\n const hint = apiHint(err);\n const restErr = Object.assign(new Error(err.message), {\n statusCode: err.status,\n code: err.code,\n details: { hint },\n });\n throw restErr;\n }\n const message = err instanceof Error ? err.message : String(err);\n const isEnvMissing = /CLICKUP_API_KEY|CLICKUP_TEAM_ID/.test(message);\n if (isEnvMissing) {\n throw Object.assign(new Error(message), {\n statusCode: 400,\n code: 'ENV_MISSING',\n details: { hint: 'Set CLICKUP_API_KEY (and CLICKUP_TEAM_ID for workspace commands) as environment variables' },\n });\n }\n throw err;\n}\n","import { defineHandler, type PluginContextV3, type RestInput } from '@kb-labs/sdk';\nimport { requireApiKey, updateFolder } from '@kb-labs/clickup-core';\nimport type { UpdateFolderInput } from '@kb-labs/clickup-contracts';\nimport { rethrowForRest } from '../../utils/error.js';\n\nexport default defineHandler({\n async execute(\n _ctx: PluginContextV3,\n input: RestInput<Record<string, never>, UpdateFolderInput, { folderId: string }>,\n ) {\n try {\n const folderId = input.params?.folderId;\n if (!folderId) throw new Error('folderId is required');\n if (!input.body) throw new Error('body is required');\n return updateFolder(requireApiKey(), folderId, input.body);\n } catch (err) {\n rethrowForRest(err);\n }\n },\n});\n"]}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import * as _kb_labs_shared_command_kit from '@kb-labs/shared-command-kit';
|
|
2
|
+
import * as _kb_labs_clickup_contracts from '@kb-labs/clickup-contracts';
|
|
3
|
+
import { RestInput } from '@kb-labs/sdk';
|
|
4
|
+
|
|
5
|
+
declare const _default: _kb_labs_shared_command_kit.Handler<unknown, RestInput<Record<string, never>, {
|
|
6
|
+
name: string;
|
|
7
|
+
status?: string | undefined;
|
|
8
|
+
priority?: number | undefined;
|
|
9
|
+
due_date?: number | undefined;
|
|
10
|
+
assignee?: number | undefined;
|
|
11
|
+
content?: string | undefined;
|
|
12
|
+
}, {
|
|
13
|
+
folderId?: string;
|
|
14
|
+
spaceId?: string;
|
|
15
|
+
}>, _kb_labs_clickup_contracts.ClickUpList>;
|
|
16
|
+
|
|
17
|
+
export { _default as default };
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { defineHandler } from '@kb-labs/sdk';
|
|
2
|
+
import { requireApiKey, createListInFolder, createListInSpace, ClickUpApiError } from '@kb-labs/clickup-core';
|
|
3
|
+
|
|
4
|
+
// src/rest/handlers/list-create-handler.ts
|
|
5
|
+
function apiHint(err) {
|
|
6
|
+
switch (err.status) {
|
|
7
|
+
case 401:
|
|
8
|
+
return "CLICKUP_API_KEY is invalid or expired \u2014 check the token in your environment";
|
|
9
|
+
case 403:
|
|
10
|
+
return "You don't have permission for this action in ClickUp \u2014 check workspace access";
|
|
11
|
+
case 404:
|
|
12
|
+
return "Resource not found \u2014 verify the ID is correct (use `kb clickup workspace` to browse IDs)";
|
|
13
|
+
case 429:
|
|
14
|
+
return "ClickUp rate limit reached \u2014 wait a moment and retry";
|
|
15
|
+
default:
|
|
16
|
+
return "Unexpected ClickUp API error";
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
function rethrowForRest(err) {
|
|
20
|
+
if (err instanceof ClickUpApiError) {
|
|
21
|
+
const hint = apiHint(err);
|
|
22
|
+
const restErr = Object.assign(new Error(err.message), {
|
|
23
|
+
statusCode: err.status,
|
|
24
|
+
code: err.code,
|
|
25
|
+
details: { hint }
|
|
26
|
+
});
|
|
27
|
+
throw restErr;
|
|
28
|
+
}
|
|
29
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
30
|
+
const isEnvMissing = /CLICKUP_API_KEY|CLICKUP_TEAM_ID/.test(message);
|
|
31
|
+
if (isEnvMissing) {
|
|
32
|
+
throw Object.assign(new Error(message), {
|
|
33
|
+
statusCode: 400,
|
|
34
|
+
code: "ENV_MISSING",
|
|
35
|
+
details: { hint: "Set CLICKUP_API_KEY (and CLICKUP_TEAM_ID for workspace commands) as environment variables" }
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
throw err;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// src/rest/handlers/list-create-handler.ts
|
|
42
|
+
var list_create_handler_default = defineHandler({
|
|
43
|
+
async execute(_ctx, input) {
|
|
44
|
+
try {
|
|
45
|
+
const { folderId, spaceId } = input.params ?? {};
|
|
46
|
+
if (!input.body) throw new Error("body is required");
|
|
47
|
+
const apiKey = requireApiKey();
|
|
48
|
+
if (folderId) return createListInFolder(apiKey, folderId, input.body);
|
|
49
|
+
if (spaceId) return createListInSpace(apiKey, spaceId, input.body);
|
|
50
|
+
throw new Error("folderId or spaceId is required");
|
|
51
|
+
} catch (err) {
|
|
52
|
+
rethrowForRest(err);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
export { list_create_handler_default as default };
|
|
58
|
+
//# sourceMappingURL=list-create-handler.js.map
|
|
59
|
+
//# sourceMappingURL=list-create-handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/utils/error.ts","../../../src/rest/handlers/list-create-handler.ts"],"names":[],"mappings":";;;;AAKA,SAAS,QAAQ,GAAA,EAA8B;AAC7C,EAAA,QAAQ,IAAI,MAAA;AAAQ,IAClB,KAAK,GAAA;AAAK,MAAA,OAAO,kFAAA;AAAA,IACjB,KAAK,GAAA;AAAK,MAAA,OAAO,oFAAA;AAAA,IACjB,KAAK,GAAA;AAAK,MAAA,OAAO,+FAAA;AAAA,IACjB,KAAK,GAAA;AAAK,MAAA,OAAO,2DAAA;AAAA,IACjB;AAAU,MAAA,OAAO,8BAAA;AAAA;AAErB;AA+CO,SAAS,eAAe,GAAA,EAAqB;AAClD,EAAA,IAAI,eAAe,eAAA,EAAiB;AAClC,IAAA,MAAM,IAAA,GAAO,QAAQ,GAAG,CAAA;AACxB,IAAA,MAAM,UAAU,MAAA,CAAO,MAAA,CAAO,IAAI,KAAA,CAAM,GAAA,CAAI,OAAO,CAAA,EAAG;AAAA,MACpD,YAAY,GAAA,CAAI,MAAA;AAAA,MAChB,MAAM,GAAA,CAAI,IAAA;AAAA,MACV,OAAA,EAAS,EAAE,IAAA;AAAK,KACjB,CAAA;AACD,IAAA,MAAM,OAAA;AAAA,EACR;AACA,EAAA,MAAM,UAAU,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG,CAAA;AAC/D,EAAA,MAAM,YAAA,GAAe,iCAAA,CAAkC,IAAA,CAAK,OAAO,CAAA;AACnE,EAAA,IAAI,YAAA,EAAc;AAChB,IAAA,MAAM,MAAA,CAAO,MAAA,CAAO,IAAI,KAAA,CAAM,OAAO,CAAA,EAAG;AAAA,MACtC,UAAA,EAAY,GAAA;AAAA,MACZ,IAAA,EAAM,aAAA;AAAA,MACN,OAAA,EAAS,EAAE,IAAA,EAAM,2FAAA;AAA4F,KAC9G,CAAA;AAAA,EACH;AACA,EAAA,MAAM,GAAA;AACR;;;AC3EA,IAAO,8BAAQ,aAAA,CAAc;AAAA,EAC3B,MAAM,OAAA,CACJ,IAAA,EACA,KAAA,EACA;AACA,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,QAAA,EAAU,OAAA,EAAQ,GAAI,KAAA,CAAM,UAAU,EAAC;AAC/C,MAAA,IAAI,CAAC,KAAA,CAAM,IAAA,EAAM,MAAM,IAAI,MAAM,kBAAkB,CAAA;AACnD,MAAA,MAAM,SAAS,aAAA,EAAc;AAC7B,MAAA,IAAI,UAAU,OAAO,kBAAA,CAAmB,MAAA,EAAQ,QAAA,EAAU,MAAM,IAAI,CAAA;AACpE,MAAA,IAAI,SAAS,OAAO,iBAAA,CAAkB,MAAA,EAAQ,OAAA,EAAS,MAAM,IAAI,CAAA;AACjE,MAAA,MAAM,IAAI,MAAM,iCAAiC,CAAA;AAAA,IACnD,SAAS,GAAA,EAAK;AACZ,MAAA,cAAA,CAAe,GAAG,CAAA;AAAA,IACpB;AAAA,EACF;AACF,CAAC","file":"list-create-handler.js","sourcesContent":["import type { PluginContextV3 } from '@kb-labs/sdk';\nimport { ClickUpApiError } from '@kb-labs/clickup-core';\n\nexport { validationError } from '@kb-labs/sdk';\n\nfunction apiHint(err: ClickUpApiError): string {\n switch (err.status) {\n case 401: return 'CLICKUP_API_KEY is invalid or expired — check the token in your environment';\n case 403: return 'You don\\'t have permission for this action in ClickUp — check workspace access';\n case 404: return 'Resource not found — verify the ID is correct (use `kb clickup workspace` to browse IDs)';\n case 429: return 'ClickUp rate limit reached — wait a moment and retry';\n default: return 'Unexpected ClickUp API error';\n }\n}\n\n/**\n * Output a structured error and return — call right before `return { exitCode: 1, result: null }`.\n * In JSON mode emits `{ ok: false, error: { code, message, hint?, status? } }`.\n * In CLI mode uses ctx.ui.error() with hint and cause.\n */\nexport function handleError(ctx: PluginContextV3, err: unknown, isJson?: boolean): void {\n if (err instanceof ClickUpApiError) {\n const hint = apiHint(err);\n if (isJson) {\n ctx.ui?.json?.({ ok: false, error: { code: err.code, message: err.message, status: err.status, hint } });\n } else {\n ctx.ui?.error?.(err.message, { hint, cause: `ClickUp API ${err.status} (${err.code})` });\n }\n return;\n }\n\n const message = err instanceof Error ? err.message : String(err);\n const isEnvMissing = /CLICKUP_API_KEY|CLICKUP_TEAM_ID/.test(message);\n\n if (isJson) {\n ctx.ui?.json?.({\n ok: false,\n error: {\n code: isEnvMissing ? 'ENV_MISSING' : 'INTERNAL_ERROR',\n message,\n ...(isEnvMissing && {\n hint: 'Set CLICKUP_API_KEY (and CLICKUP_TEAM_ID for workspace commands) as environment variables',\n }),\n },\n });\n } else {\n ctx.ui?.error?.(message, {\n ...(isEnvMissing && {\n hint: 'Set CLICKUP_API_KEY (and CLICKUP_TEAM_ID for workspace commands) as environment variables',\n command: 'export CLICKUP_API_KEY=pk_xxx CLICKUP_TEAM_ID=yyy',\n }),\n });\n }\n}\n\n/**\n * Re-throws `err` as an HTTP-aware error for REST handlers.\n * `ClickUpApiError` → preserves HTTP status code; env errors → 400; others → 500.\n * The envelope middleware in rest-api reads `err.statusCode` to set the response status.\n */\nexport function rethrowForRest(err: unknown): never {\n if (err instanceof ClickUpApiError) {\n const hint = apiHint(err);\n const restErr = Object.assign(new Error(err.message), {\n statusCode: err.status,\n code: err.code,\n details: { hint },\n });\n throw restErr;\n }\n const message = err instanceof Error ? err.message : String(err);\n const isEnvMissing = /CLICKUP_API_KEY|CLICKUP_TEAM_ID/.test(message);\n if (isEnvMissing) {\n throw Object.assign(new Error(message), {\n statusCode: 400,\n code: 'ENV_MISSING',\n details: { hint: 'Set CLICKUP_API_KEY (and CLICKUP_TEAM_ID for workspace commands) as environment variables' },\n });\n }\n throw err;\n}\n","import { defineHandler, type PluginContextV3, type RestInput } from '@kb-labs/sdk';\nimport { requireApiKey, createListInFolder, createListInSpace } from '@kb-labs/clickup-core';\nimport type { CreateListInput } from '@kb-labs/clickup-contracts';\nimport { rethrowForRest } from '../../utils/error.js';\n\nexport default defineHandler({\n async execute(\n _ctx: PluginContextV3,\n input: RestInput<Record<string, never>, CreateListInput, { folderId?: string; spaceId?: string }>,\n ) {\n try {\n const { folderId, spaceId } = input.params ?? {};\n if (!input.body) throw new Error('body is required');\n const apiKey = requireApiKey();\n if (folderId) return createListInFolder(apiKey, folderId, input.body);\n if (spaceId) return createListInSpace(apiKey, spaceId, input.body);\n throw new Error('folderId or spaceId is required');\n } catch (err) {\n rethrowForRest(err);\n }\n },\n});\n"]}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import * as _kb_labs_shared_command_kit from '@kb-labs/shared-command-kit';
|
|
2
|
+
import { RestInput } from '@kb-labs/sdk';
|
|
3
|
+
|
|
4
|
+
declare const _default: _kb_labs_shared_command_kit.Handler<unknown, RestInput<Record<string, never>, never, {
|
|
5
|
+
listId: string;
|
|
6
|
+
}>, {
|
|
7
|
+
deleted: boolean;
|
|
8
|
+
listId: string;
|
|
9
|
+
}>;
|
|
10
|
+
|
|
11
|
+
export { _default as default };
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { defineHandler } from '@kb-labs/sdk';
|
|
2
|
+
import { deleteList, requireApiKey, ClickUpApiError } from '@kb-labs/clickup-core';
|
|
3
|
+
|
|
4
|
+
// src/rest/handlers/list-delete-handler.ts
|
|
5
|
+
function apiHint(err) {
|
|
6
|
+
switch (err.status) {
|
|
7
|
+
case 401:
|
|
8
|
+
return "CLICKUP_API_KEY is invalid or expired \u2014 check the token in your environment";
|
|
9
|
+
case 403:
|
|
10
|
+
return "You don't have permission for this action in ClickUp \u2014 check workspace access";
|
|
11
|
+
case 404:
|
|
12
|
+
return "Resource not found \u2014 verify the ID is correct (use `kb clickup workspace` to browse IDs)";
|
|
13
|
+
case 429:
|
|
14
|
+
return "ClickUp rate limit reached \u2014 wait a moment and retry";
|
|
15
|
+
default:
|
|
16
|
+
return "Unexpected ClickUp API error";
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
function rethrowForRest(err) {
|
|
20
|
+
if (err instanceof ClickUpApiError) {
|
|
21
|
+
const hint = apiHint(err);
|
|
22
|
+
const restErr = Object.assign(new Error(err.message), {
|
|
23
|
+
statusCode: err.status,
|
|
24
|
+
code: err.code,
|
|
25
|
+
details: { hint }
|
|
26
|
+
});
|
|
27
|
+
throw restErr;
|
|
28
|
+
}
|
|
29
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
30
|
+
const isEnvMissing = /CLICKUP_API_KEY|CLICKUP_TEAM_ID/.test(message);
|
|
31
|
+
if (isEnvMissing) {
|
|
32
|
+
throw Object.assign(new Error(message), {
|
|
33
|
+
statusCode: 400,
|
|
34
|
+
code: "ENV_MISSING",
|
|
35
|
+
details: { hint: "Set CLICKUP_API_KEY (and CLICKUP_TEAM_ID for workspace commands) as environment variables" }
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
throw err;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// src/rest/handlers/list-delete-handler.ts
|
|
42
|
+
var list_delete_handler_default = defineHandler({
|
|
43
|
+
async execute(_ctx, input) {
|
|
44
|
+
try {
|
|
45
|
+
const listId = input.params?.listId;
|
|
46
|
+
if (!listId) throw new Error("listId is required");
|
|
47
|
+
await deleteList(requireApiKey(), listId);
|
|
48
|
+
return { deleted: true, listId };
|
|
49
|
+
} catch (err) {
|
|
50
|
+
rethrowForRest(err);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
export { list_delete_handler_default as default };
|
|
56
|
+
//# sourceMappingURL=list-delete-handler.js.map
|
|
57
|
+
//# sourceMappingURL=list-delete-handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/utils/error.ts","../../../src/rest/handlers/list-delete-handler.ts"],"names":[],"mappings":";;;;AAKA,SAAS,QAAQ,GAAA,EAA8B;AAC7C,EAAA,QAAQ,IAAI,MAAA;AAAQ,IAClB,KAAK,GAAA;AAAK,MAAA,OAAO,kFAAA;AAAA,IACjB,KAAK,GAAA;AAAK,MAAA,OAAO,oFAAA;AAAA,IACjB,KAAK,GAAA;AAAK,MAAA,OAAO,+FAAA;AAAA,IACjB,KAAK,GAAA;AAAK,MAAA,OAAO,2DAAA;AAAA,IACjB;AAAU,MAAA,OAAO,8BAAA;AAAA;AAErB;AA+CO,SAAS,eAAe,GAAA,EAAqB;AAClD,EAAA,IAAI,eAAe,eAAA,EAAiB;AAClC,IAAA,MAAM,IAAA,GAAO,QAAQ,GAAG,CAAA;AACxB,IAAA,MAAM,UAAU,MAAA,CAAO,MAAA,CAAO,IAAI,KAAA,CAAM,GAAA,CAAI,OAAO,CAAA,EAAG;AAAA,MACpD,YAAY,GAAA,CAAI,MAAA;AAAA,MAChB,MAAM,GAAA,CAAI,IAAA;AAAA,MACV,OAAA,EAAS,EAAE,IAAA;AAAK,KACjB,CAAA;AACD,IAAA,MAAM,OAAA;AAAA,EACR;AACA,EAAA,MAAM,UAAU,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG,CAAA;AAC/D,EAAA,MAAM,YAAA,GAAe,iCAAA,CAAkC,IAAA,CAAK,OAAO,CAAA;AACnE,EAAA,IAAI,YAAA,EAAc;AAChB,IAAA,MAAM,MAAA,CAAO,MAAA,CAAO,IAAI,KAAA,CAAM,OAAO,CAAA,EAAG;AAAA,MACtC,UAAA,EAAY,GAAA;AAAA,MACZ,IAAA,EAAM,aAAA;AAAA,MACN,OAAA,EAAS,EAAE,IAAA,EAAM,2FAAA;AAA4F,KAC9G,CAAA;AAAA,EACH;AACA,EAAA,MAAM,GAAA;AACR;;;AC5EA,IAAO,8BAAQ,aAAA,CAAc;AAAA,EAC3B,MAAM,OAAA,CACJ,IAAA,EACA,KAAA,EACA;AACA,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,MAAA,EAAQ,MAAA;AAC7B,MAAA,IAAI,CAAC,MAAA,EAAQ,MAAM,IAAI,MAAM,oBAAoB,CAAA;AACjD,MAAA,MAAM,UAAA,CAAW,aAAA,EAAc,EAAG,MAAM,CAAA;AACxC,MAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,MAAA,EAAO;AAAA,IACjC,SAAS,GAAA,EAAK;AACZ,MAAA,cAAA,CAAe,GAAG,CAAA;AAAA,IACpB;AAAA,EACF;AACF,CAAC","file":"list-delete-handler.js","sourcesContent":["import type { PluginContextV3 } from '@kb-labs/sdk';\nimport { ClickUpApiError } from '@kb-labs/clickup-core';\n\nexport { validationError } from '@kb-labs/sdk';\n\nfunction apiHint(err: ClickUpApiError): string {\n switch (err.status) {\n case 401: return 'CLICKUP_API_KEY is invalid or expired — check the token in your environment';\n case 403: return 'You don\\'t have permission for this action in ClickUp — check workspace access';\n case 404: return 'Resource not found — verify the ID is correct (use `kb clickup workspace` to browse IDs)';\n case 429: return 'ClickUp rate limit reached — wait a moment and retry';\n default: return 'Unexpected ClickUp API error';\n }\n}\n\n/**\n * Output a structured error and return — call right before `return { exitCode: 1, result: null }`.\n * In JSON mode emits `{ ok: false, error: { code, message, hint?, status? } }`.\n * In CLI mode uses ctx.ui.error() with hint and cause.\n */\nexport function handleError(ctx: PluginContextV3, err: unknown, isJson?: boolean): void {\n if (err instanceof ClickUpApiError) {\n const hint = apiHint(err);\n if (isJson) {\n ctx.ui?.json?.({ ok: false, error: { code: err.code, message: err.message, status: err.status, hint } });\n } else {\n ctx.ui?.error?.(err.message, { hint, cause: `ClickUp API ${err.status} (${err.code})` });\n }\n return;\n }\n\n const message = err instanceof Error ? err.message : String(err);\n const isEnvMissing = /CLICKUP_API_KEY|CLICKUP_TEAM_ID/.test(message);\n\n if (isJson) {\n ctx.ui?.json?.({\n ok: false,\n error: {\n code: isEnvMissing ? 'ENV_MISSING' : 'INTERNAL_ERROR',\n message,\n ...(isEnvMissing && {\n hint: 'Set CLICKUP_API_KEY (and CLICKUP_TEAM_ID for workspace commands) as environment variables',\n }),\n },\n });\n } else {\n ctx.ui?.error?.(message, {\n ...(isEnvMissing && {\n hint: 'Set CLICKUP_API_KEY (and CLICKUP_TEAM_ID for workspace commands) as environment variables',\n command: 'export CLICKUP_API_KEY=pk_xxx CLICKUP_TEAM_ID=yyy',\n }),\n });\n }\n}\n\n/**\n * Re-throws `err` as an HTTP-aware error for REST handlers.\n * `ClickUpApiError` → preserves HTTP status code; env errors → 400; others → 500.\n * The envelope middleware in rest-api reads `err.statusCode` to set the response status.\n */\nexport function rethrowForRest(err: unknown): never {\n if (err instanceof ClickUpApiError) {\n const hint = apiHint(err);\n const restErr = Object.assign(new Error(err.message), {\n statusCode: err.status,\n code: err.code,\n details: { hint },\n });\n throw restErr;\n }\n const message = err instanceof Error ? err.message : String(err);\n const isEnvMissing = /CLICKUP_API_KEY|CLICKUP_TEAM_ID/.test(message);\n if (isEnvMissing) {\n throw Object.assign(new Error(message), {\n statusCode: 400,\n code: 'ENV_MISSING',\n details: { hint: 'Set CLICKUP_API_KEY (and CLICKUP_TEAM_ID for workspace commands) as environment variables' },\n });\n }\n throw err;\n}\n","import { defineHandler, type PluginContextV3, type RestInput } from '@kb-labs/sdk';\nimport { requireApiKey, deleteList } from '@kb-labs/clickup-core';\nimport { rethrowForRest } from '../../utils/error.js';\n\nexport default defineHandler({\n async execute(\n _ctx: PluginContextV3,\n input: RestInput<Record<string, never>, never, { listId: string }>,\n ) {\n try {\n const listId = input.params?.listId;\n if (!listId) throw new Error('listId is required');\n await deleteList(requireApiKey(), listId);\n return { deleted: true, listId };\n } catch (err) {\n rethrowForRest(err);\n }\n },\n});\n"]}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import * as _kb_labs_shared_command_kit from '@kb-labs/shared-command-kit';
|
|
2
|
+
import * as _kb_labs_clickup_contracts from '@kb-labs/clickup-contracts';
|
|
3
|
+
import { RestInput } from '@kb-labs/sdk';
|
|
4
|
+
|
|
5
|
+
declare const _default: _kb_labs_shared_command_kit.Handler<unknown, RestInput<Record<string, never>, never, {
|
|
6
|
+
listId: string;
|
|
7
|
+
}>, _kb_labs_clickup_contracts.ClickUpStatus[]>;
|
|
8
|
+
|
|
9
|
+
export { _default as default };
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { defineHandler } from '@kb-labs/sdk';
|
|
2
|
+
import { requireApiKey, getListStatuses, ClickUpApiError } from '@kb-labs/clickup-core';
|
|
3
|
+
|
|
4
|
+
// src/rest/handlers/list-statuses-handler.ts
|
|
5
|
+
function apiHint(err) {
|
|
6
|
+
switch (err.status) {
|
|
7
|
+
case 401:
|
|
8
|
+
return "CLICKUP_API_KEY is invalid or expired \u2014 check the token in your environment";
|
|
9
|
+
case 403:
|
|
10
|
+
return "You don't have permission for this action in ClickUp \u2014 check workspace access";
|
|
11
|
+
case 404:
|
|
12
|
+
return "Resource not found \u2014 verify the ID is correct (use `kb clickup workspace` to browse IDs)";
|
|
13
|
+
case 429:
|
|
14
|
+
return "ClickUp rate limit reached \u2014 wait a moment and retry";
|
|
15
|
+
default:
|
|
16
|
+
return "Unexpected ClickUp API error";
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
function rethrowForRest(err) {
|
|
20
|
+
if (err instanceof ClickUpApiError) {
|
|
21
|
+
const hint = apiHint(err);
|
|
22
|
+
const restErr = Object.assign(new Error(err.message), {
|
|
23
|
+
statusCode: err.status,
|
|
24
|
+
code: err.code,
|
|
25
|
+
details: { hint }
|
|
26
|
+
});
|
|
27
|
+
throw restErr;
|
|
28
|
+
}
|
|
29
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
30
|
+
const isEnvMissing = /CLICKUP_API_KEY|CLICKUP_TEAM_ID/.test(message);
|
|
31
|
+
if (isEnvMissing) {
|
|
32
|
+
throw Object.assign(new Error(message), {
|
|
33
|
+
statusCode: 400,
|
|
34
|
+
code: "ENV_MISSING",
|
|
35
|
+
details: { hint: "Set CLICKUP_API_KEY (and CLICKUP_TEAM_ID for workspace commands) as environment variables" }
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
throw err;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// src/rest/handlers/list-statuses-handler.ts
|
|
42
|
+
var list_statuses_handler_default = defineHandler({
|
|
43
|
+
async execute(_ctx, input) {
|
|
44
|
+
try {
|
|
45
|
+
const apiKey = requireApiKey();
|
|
46
|
+
const listId = input.params?.listId;
|
|
47
|
+
if (!listId) throw new Error("listId is required");
|
|
48
|
+
return getListStatuses(apiKey, listId);
|
|
49
|
+
} catch (err) {
|
|
50
|
+
rethrowForRest(err);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
export { list_statuses_handler_default as default };
|
|
56
|
+
//# sourceMappingURL=list-statuses-handler.js.map
|
|
57
|
+
//# sourceMappingURL=list-statuses-handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/utils/error.ts","../../../src/rest/handlers/list-statuses-handler.ts"],"names":[],"mappings":";;;;AAKA,SAAS,QAAQ,GAAA,EAA8B;AAC7C,EAAA,QAAQ,IAAI,MAAA;AAAQ,IAClB,KAAK,GAAA;AAAK,MAAA,OAAO,kFAAA;AAAA,IACjB,KAAK,GAAA;AAAK,MAAA,OAAO,oFAAA;AAAA,IACjB,KAAK,GAAA;AAAK,MAAA,OAAO,+FAAA;AAAA,IACjB,KAAK,GAAA;AAAK,MAAA,OAAO,2DAAA;AAAA,IACjB;AAAU,MAAA,OAAO,8BAAA;AAAA;AAErB;AA+CO,SAAS,eAAe,GAAA,EAAqB;AAClD,EAAA,IAAI,eAAe,eAAA,EAAiB;AAClC,IAAA,MAAM,IAAA,GAAO,QAAQ,GAAG,CAAA;AACxB,IAAA,MAAM,UAAU,MAAA,CAAO,MAAA,CAAO,IAAI,KAAA,CAAM,GAAA,CAAI,OAAO,CAAA,EAAG;AAAA,MACpD,YAAY,GAAA,CAAI,MAAA;AAAA,MAChB,MAAM,GAAA,CAAI,IAAA;AAAA,MACV,OAAA,EAAS,EAAE,IAAA;AAAK,KACjB,CAAA;AACD,IAAA,MAAM,OAAA;AAAA,EACR;AACA,EAAA,MAAM,UAAU,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG,CAAA;AAC/D,EAAA,MAAM,YAAA,GAAe,iCAAA,CAAkC,IAAA,CAAK,OAAO,CAAA;AACnE,EAAA,IAAI,YAAA,EAAc;AAChB,IAAA,MAAM,MAAA,CAAO,MAAA,CAAO,IAAI,KAAA,CAAM,OAAO,CAAA,EAAG;AAAA,MACtC,UAAA,EAAY,GAAA;AAAA,MACZ,IAAA,EAAM,aAAA;AAAA,MACN,OAAA,EAAS,EAAE,IAAA,EAAM,2FAAA;AAA4F,KAC9G,CAAA;AAAA,EACH;AACA,EAAA,MAAM,GAAA;AACR;;;AC5EA,IAAO,gCAAQ,aAAA,CAAc;AAAA,EAC3B,MAAM,OAAA,CACJ,IAAA,EACA,KAAA,EACA;AACA,IAAA,IAAI;AACF,MAAA,MAAM,SAAS,aAAA,EAAc;AAC7B,MAAA,MAAM,MAAA,GAAS,MAAM,MAAA,EAAQ,MAAA;AAC7B,MAAA,IAAI,CAAC,MAAA,EAAQ,MAAM,IAAI,MAAM,oBAAoB,CAAA;AAEjD,MAAA,OAAO,eAAA,CAAgB,QAAQ,MAAM,CAAA;AAAA,IACvC,SAAS,GAAA,EAAK;AACZ,MAAA,cAAA,CAAe,GAAG,CAAA;AAAA,IACpB;AAAA,EACF;AACF,CAAC","file":"list-statuses-handler.js","sourcesContent":["import type { PluginContextV3 } from '@kb-labs/sdk';\nimport { ClickUpApiError } from '@kb-labs/clickup-core';\n\nexport { validationError } from '@kb-labs/sdk';\n\nfunction apiHint(err: ClickUpApiError): string {\n switch (err.status) {\n case 401: return 'CLICKUP_API_KEY is invalid or expired — check the token in your environment';\n case 403: return 'You don\\'t have permission for this action in ClickUp — check workspace access';\n case 404: return 'Resource not found — verify the ID is correct (use `kb clickup workspace` to browse IDs)';\n case 429: return 'ClickUp rate limit reached — wait a moment and retry';\n default: return 'Unexpected ClickUp API error';\n }\n}\n\n/**\n * Output a structured error and return — call right before `return { exitCode: 1, result: null }`.\n * In JSON mode emits `{ ok: false, error: { code, message, hint?, status? } }`.\n * In CLI mode uses ctx.ui.error() with hint and cause.\n */\nexport function handleError(ctx: PluginContextV3, err: unknown, isJson?: boolean): void {\n if (err instanceof ClickUpApiError) {\n const hint = apiHint(err);\n if (isJson) {\n ctx.ui?.json?.({ ok: false, error: { code: err.code, message: err.message, status: err.status, hint } });\n } else {\n ctx.ui?.error?.(err.message, { hint, cause: `ClickUp API ${err.status} (${err.code})` });\n }\n return;\n }\n\n const message = err instanceof Error ? err.message : String(err);\n const isEnvMissing = /CLICKUP_API_KEY|CLICKUP_TEAM_ID/.test(message);\n\n if (isJson) {\n ctx.ui?.json?.({\n ok: false,\n error: {\n code: isEnvMissing ? 'ENV_MISSING' : 'INTERNAL_ERROR',\n message,\n ...(isEnvMissing && {\n hint: 'Set CLICKUP_API_KEY (and CLICKUP_TEAM_ID for workspace commands) as environment variables',\n }),\n },\n });\n } else {\n ctx.ui?.error?.(message, {\n ...(isEnvMissing && {\n hint: 'Set CLICKUP_API_KEY (and CLICKUP_TEAM_ID for workspace commands) as environment variables',\n command: 'export CLICKUP_API_KEY=pk_xxx CLICKUP_TEAM_ID=yyy',\n }),\n });\n }\n}\n\n/**\n * Re-throws `err` as an HTTP-aware error for REST handlers.\n * `ClickUpApiError` → preserves HTTP status code; env errors → 400; others → 500.\n * The envelope middleware in rest-api reads `err.statusCode` to set the response status.\n */\nexport function rethrowForRest(err: unknown): never {\n if (err instanceof ClickUpApiError) {\n const hint = apiHint(err);\n const restErr = Object.assign(new Error(err.message), {\n statusCode: err.status,\n code: err.code,\n details: { hint },\n });\n throw restErr;\n }\n const message = err instanceof Error ? err.message : String(err);\n const isEnvMissing = /CLICKUP_API_KEY|CLICKUP_TEAM_ID/.test(message);\n if (isEnvMissing) {\n throw Object.assign(new Error(message), {\n statusCode: 400,\n code: 'ENV_MISSING',\n details: { hint: 'Set CLICKUP_API_KEY (and CLICKUP_TEAM_ID for workspace commands) as environment variables' },\n });\n }\n throw err;\n}\n","import { defineHandler, type PluginContextV3, type RestInput } from '@kb-labs/sdk';\nimport { requireApiKey, getListStatuses } from '@kb-labs/clickup-core';\nimport { rethrowForRest } from '../../utils/error.js';\n\nexport default defineHandler({\n async execute(\n _ctx: PluginContextV3,\n input: RestInput<Record<string, never>, never, { listId: string }>,\n ) {\n try {\n const apiKey = requireApiKey();\n const listId = input.params?.listId;\n if (!listId) throw new Error('listId is required');\n\n return getListStatuses(apiKey, listId);\n } catch (err) {\n rethrowForRest(err);\n }\n },\n});\n"]}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import * as _kb_labs_shared_command_kit from '@kb-labs/shared-command-kit';
|
|
2
|
+
import * as _kb_labs_clickup_contracts from '@kb-labs/clickup-contracts';
|
|
3
|
+
import { RestInput } from '@kb-labs/sdk';
|
|
4
|
+
|
|
5
|
+
type ListTasksQuery = {
|
|
6
|
+
statuses?: string;
|
|
7
|
+
assignees?: string;
|
|
8
|
+
limit?: string;
|
|
9
|
+
page?: string;
|
|
10
|
+
include_closed?: string;
|
|
11
|
+
};
|
|
12
|
+
declare const _default: _kb_labs_shared_command_kit.Handler<unknown, RestInput<ListTasksQuery, never, {
|
|
13
|
+
listId: string;
|
|
14
|
+
}>, _kb_labs_clickup_contracts.ClickUpTask[]>;
|
|
15
|
+
|
|
16
|
+
export { _default as default };
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { defineHandler } from '@kb-labs/sdk';
|
|
2
|
+
import { requireApiKey, getListTasks, ClickUpApiError } from '@kb-labs/clickup-core';
|
|
3
|
+
|
|
4
|
+
// src/rest/handlers/list-tasks-handler.ts
|
|
5
|
+
function apiHint(err) {
|
|
6
|
+
switch (err.status) {
|
|
7
|
+
case 401:
|
|
8
|
+
return "CLICKUP_API_KEY is invalid or expired \u2014 check the token in your environment";
|
|
9
|
+
case 403:
|
|
10
|
+
return "You don't have permission for this action in ClickUp \u2014 check workspace access";
|
|
11
|
+
case 404:
|
|
12
|
+
return "Resource not found \u2014 verify the ID is correct (use `kb clickup workspace` to browse IDs)";
|
|
13
|
+
case 429:
|
|
14
|
+
return "ClickUp rate limit reached \u2014 wait a moment and retry";
|
|
15
|
+
default:
|
|
16
|
+
return "Unexpected ClickUp API error";
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
function rethrowForRest(err) {
|
|
20
|
+
if (err instanceof ClickUpApiError) {
|
|
21
|
+
const hint = apiHint(err);
|
|
22
|
+
const restErr = Object.assign(new Error(err.message), {
|
|
23
|
+
statusCode: err.status,
|
|
24
|
+
code: err.code,
|
|
25
|
+
details: { hint }
|
|
26
|
+
});
|
|
27
|
+
throw restErr;
|
|
28
|
+
}
|
|
29
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
30
|
+
const isEnvMissing = /CLICKUP_API_KEY|CLICKUP_TEAM_ID/.test(message);
|
|
31
|
+
if (isEnvMissing) {
|
|
32
|
+
throw Object.assign(new Error(message), {
|
|
33
|
+
statusCode: 400,
|
|
34
|
+
code: "ENV_MISSING",
|
|
35
|
+
details: { hint: "Set CLICKUP_API_KEY (and CLICKUP_TEAM_ID for workspace commands) as environment variables" }
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
throw err;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// src/rest/handlers/list-tasks-handler.ts
|
|
42
|
+
var list_tasks_handler_default = defineHandler({
|
|
43
|
+
async execute(_ctx, input) {
|
|
44
|
+
try {
|
|
45
|
+
const apiKey = requireApiKey();
|
|
46
|
+
const listId = input.params?.listId;
|
|
47
|
+
if (!listId) throw new Error("listId is required");
|
|
48
|
+
const q = input.query ?? {};
|
|
49
|
+
return getListTasks(apiKey, listId, {
|
|
50
|
+
statuses: q.statuses ? q.statuses.split(",") : void 0,
|
|
51
|
+
assignees: q.assignees ? q.assignees.split(",") : void 0,
|
|
52
|
+
limit: q.limit ? Math.min(Number(q.limit), 100) : 50,
|
|
53
|
+
page: q.page ? Number(q.page) : 0,
|
|
54
|
+
include_closed: q.include_closed === "true"
|
|
55
|
+
});
|
|
56
|
+
} catch (err) {
|
|
57
|
+
rethrowForRest(err);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
export { list_tasks_handler_default as default };
|
|
63
|
+
//# sourceMappingURL=list-tasks-handler.js.map
|
|
64
|
+
//# sourceMappingURL=list-tasks-handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/utils/error.ts","../../../src/rest/handlers/list-tasks-handler.ts"],"names":[],"mappings":";;;;AAKA,SAAS,QAAQ,GAAA,EAA8B;AAC7C,EAAA,QAAQ,IAAI,MAAA;AAAQ,IAClB,KAAK,GAAA;AAAK,MAAA,OAAO,kFAAA;AAAA,IACjB,KAAK,GAAA;AAAK,MAAA,OAAO,oFAAA;AAAA,IACjB,KAAK,GAAA;AAAK,MAAA,OAAO,+FAAA;AAAA,IACjB,KAAK,GAAA;AAAK,MAAA,OAAO,2DAAA;AAAA,IACjB;AAAU,MAAA,OAAO,8BAAA;AAAA;AAErB;AA+CO,SAAS,eAAe,GAAA,EAAqB;AAClD,EAAA,IAAI,eAAe,eAAA,EAAiB;AAClC,IAAA,MAAM,IAAA,GAAO,QAAQ,GAAG,CAAA;AACxB,IAAA,MAAM,UAAU,MAAA,CAAO,MAAA,CAAO,IAAI,KAAA,CAAM,GAAA,CAAI,OAAO,CAAA,EAAG;AAAA,MACpD,YAAY,GAAA,CAAI,MAAA;AAAA,MAChB,MAAM,GAAA,CAAI,IAAA;AAAA,MACV,OAAA,EAAS,EAAE,IAAA;AAAK,KACjB,CAAA;AACD,IAAA,MAAM,OAAA;AAAA,EACR;AACA,EAAA,MAAM,UAAU,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG,CAAA;AAC/D,EAAA,MAAM,YAAA,GAAe,iCAAA,CAAkC,IAAA,CAAK,OAAO,CAAA;AACnE,EAAA,IAAI,YAAA,EAAc;AAChB,IAAA,MAAM,MAAA,CAAO,MAAA,CAAO,IAAI,KAAA,CAAM,OAAO,CAAA,EAAG;AAAA,MACtC,UAAA,EAAY,GAAA;AAAA,MACZ,IAAA,EAAM,aAAA;AAAA,MACN,OAAA,EAAS,EAAE,IAAA,EAAM,2FAAA;AAA4F,KAC9G,CAAA;AAAA,EACH;AACA,EAAA,MAAM,GAAA;AACR;;;ACpEA,IAAO,6BAAQ,aAAA,CAAc;AAAA,EAC3B,MAAM,OAAA,CACJ,IAAA,EACA,KAAA,EACA;AACA,IAAA,IAAI;AACF,MAAA,MAAM,SAAS,aAAA,EAAc;AAC7B,MAAA,MAAM,MAAA,GAAS,MAAM,MAAA,EAAQ,MAAA;AAC7B,MAAA,IAAI,CAAC,MAAA,EAAQ,MAAM,IAAI,MAAM,oBAAoB,CAAA;AACjD,MAAA,MAAM,CAAA,GAAI,KAAA,CAAM,KAAA,IAAS,EAAC;AAE1B,MAAA,OAAO,YAAA,CAAa,QAAQ,MAAA,EAAQ;AAAA,QAClC,UAAU,CAAA,CAAE,QAAA,GAAW,EAAE,QAAA,CAAS,KAAA,CAAM,GAAG,CAAA,GAAI,KAAA,CAAA;AAAA,QAC/C,WAAW,CAAA,CAAE,SAAA,GAAY,EAAE,SAAA,CAAU,KAAA,CAAM,GAAG,CAAA,GAAI,KAAA,CAAA;AAAA,QAClD,KAAA,EAAO,CAAA,CAAE,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,OAAO,CAAA,CAAE,KAAK,CAAA,EAAG,GAAG,CAAA,GAAI,EAAA;AAAA,QAClD,MAAM,CAAA,CAAE,IAAA,GAAO,MAAA,CAAO,CAAA,CAAE,IAAI,CAAA,GAAI,CAAA;AAAA,QAChC,cAAA,EAAgB,EAAE,cAAA,KAAmB;AAAA,OACtC,CAAA;AAAA,IACH,SAAS,GAAA,EAAK;AACZ,MAAA,cAAA,CAAe,GAAG,CAAA;AAAA,IACpB;AAAA,EACF;AACF,CAAC","file":"list-tasks-handler.js","sourcesContent":["import type { PluginContextV3 } from '@kb-labs/sdk';\nimport { ClickUpApiError } from '@kb-labs/clickup-core';\n\nexport { validationError } from '@kb-labs/sdk';\n\nfunction apiHint(err: ClickUpApiError): string {\n switch (err.status) {\n case 401: return 'CLICKUP_API_KEY is invalid or expired — check the token in your environment';\n case 403: return 'You don\\'t have permission for this action in ClickUp — check workspace access';\n case 404: return 'Resource not found — verify the ID is correct (use `kb clickup workspace` to browse IDs)';\n case 429: return 'ClickUp rate limit reached — wait a moment and retry';\n default: return 'Unexpected ClickUp API error';\n }\n}\n\n/**\n * Output a structured error and return — call right before `return { exitCode: 1, result: null }`.\n * In JSON mode emits `{ ok: false, error: { code, message, hint?, status? } }`.\n * In CLI mode uses ctx.ui.error() with hint and cause.\n */\nexport function handleError(ctx: PluginContextV3, err: unknown, isJson?: boolean): void {\n if (err instanceof ClickUpApiError) {\n const hint = apiHint(err);\n if (isJson) {\n ctx.ui?.json?.({ ok: false, error: { code: err.code, message: err.message, status: err.status, hint } });\n } else {\n ctx.ui?.error?.(err.message, { hint, cause: `ClickUp API ${err.status} (${err.code})` });\n }\n return;\n }\n\n const message = err instanceof Error ? err.message : String(err);\n const isEnvMissing = /CLICKUP_API_KEY|CLICKUP_TEAM_ID/.test(message);\n\n if (isJson) {\n ctx.ui?.json?.({\n ok: false,\n error: {\n code: isEnvMissing ? 'ENV_MISSING' : 'INTERNAL_ERROR',\n message,\n ...(isEnvMissing && {\n hint: 'Set CLICKUP_API_KEY (and CLICKUP_TEAM_ID for workspace commands) as environment variables',\n }),\n },\n });\n } else {\n ctx.ui?.error?.(message, {\n ...(isEnvMissing && {\n hint: 'Set CLICKUP_API_KEY (and CLICKUP_TEAM_ID for workspace commands) as environment variables',\n command: 'export CLICKUP_API_KEY=pk_xxx CLICKUP_TEAM_ID=yyy',\n }),\n });\n }\n}\n\n/**\n * Re-throws `err` as an HTTP-aware error for REST handlers.\n * `ClickUpApiError` → preserves HTTP status code; env errors → 400; others → 500.\n * The envelope middleware in rest-api reads `err.statusCode` to set the response status.\n */\nexport function rethrowForRest(err: unknown): never {\n if (err instanceof ClickUpApiError) {\n const hint = apiHint(err);\n const restErr = Object.assign(new Error(err.message), {\n statusCode: err.status,\n code: err.code,\n details: { hint },\n });\n throw restErr;\n }\n const message = err instanceof Error ? err.message : String(err);\n const isEnvMissing = /CLICKUP_API_KEY|CLICKUP_TEAM_ID/.test(message);\n if (isEnvMissing) {\n throw Object.assign(new Error(message), {\n statusCode: 400,\n code: 'ENV_MISSING',\n details: { hint: 'Set CLICKUP_API_KEY (and CLICKUP_TEAM_ID for workspace commands) as environment variables' },\n });\n }\n throw err;\n}\n","import { defineHandler, type PluginContextV3, type RestInput } from '@kb-labs/sdk';\nimport { requireApiKey, getListTasks } from '@kb-labs/clickup-core';\nimport { rethrowForRest } from '../../utils/error.js';\n\ntype ListTasksQuery = {\n statuses?: string;\n assignees?: string;\n limit?: string;\n page?: string;\n include_closed?: string;\n};\n\nexport default defineHandler({\n async execute(\n _ctx: PluginContextV3,\n input: RestInput<ListTasksQuery, never, { listId: string }>,\n ) {\n try {\n const apiKey = requireApiKey();\n const listId = input.params?.listId;\n if (!listId) throw new Error('listId is required');\n const q = input.query ?? {};\n\n return getListTasks(apiKey, listId, {\n statuses: q.statuses ? q.statuses.split(',') : undefined,\n assignees: q.assignees ? q.assignees.split(',') : undefined,\n limit: q.limit ? Math.min(Number(q.limit), 100) : 50,\n page: q.page ? Number(q.page) : 0,\n include_closed: q.include_closed === 'true',\n });\n } catch (err) {\n rethrowForRest(err);\n }\n },\n});\n"]}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import * as _kb_labs_shared_command_kit from '@kb-labs/shared-command-kit';
|
|
2
|
+
import * as _kb_labs_clickup_contracts from '@kb-labs/clickup-contracts';
|
|
3
|
+
import { RestInput } from '@kb-labs/sdk';
|
|
4
|
+
|
|
5
|
+
declare const _default: _kb_labs_shared_command_kit.Handler<unknown, RestInput<Record<string, never>, {
|
|
6
|
+
name?: string | undefined;
|
|
7
|
+
status?: string | undefined;
|
|
8
|
+
priority?: number | null | undefined;
|
|
9
|
+
due_date?: number | null | undefined;
|
|
10
|
+
content?: string | undefined;
|
|
11
|
+
}, {
|
|
12
|
+
listId: string;
|
|
13
|
+
}>, _kb_labs_clickup_contracts.ClickUpList>;
|
|
14
|
+
|
|
15
|
+
export { _default as default };
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { defineHandler } from '@kb-labs/sdk';
|
|
2
|
+
import { updateList, requireApiKey, ClickUpApiError } from '@kb-labs/clickup-core';
|
|
3
|
+
|
|
4
|
+
// src/rest/handlers/list-update-handler.ts
|
|
5
|
+
function apiHint(err) {
|
|
6
|
+
switch (err.status) {
|
|
7
|
+
case 401:
|
|
8
|
+
return "CLICKUP_API_KEY is invalid or expired \u2014 check the token in your environment";
|
|
9
|
+
case 403:
|
|
10
|
+
return "You don't have permission for this action in ClickUp \u2014 check workspace access";
|
|
11
|
+
case 404:
|
|
12
|
+
return "Resource not found \u2014 verify the ID is correct (use `kb clickup workspace` to browse IDs)";
|
|
13
|
+
case 429:
|
|
14
|
+
return "ClickUp rate limit reached \u2014 wait a moment and retry";
|
|
15
|
+
default:
|
|
16
|
+
return "Unexpected ClickUp API error";
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
function rethrowForRest(err) {
|
|
20
|
+
if (err instanceof ClickUpApiError) {
|
|
21
|
+
const hint = apiHint(err);
|
|
22
|
+
const restErr = Object.assign(new Error(err.message), {
|
|
23
|
+
statusCode: err.status,
|
|
24
|
+
code: err.code,
|
|
25
|
+
details: { hint }
|
|
26
|
+
});
|
|
27
|
+
throw restErr;
|
|
28
|
+
}
|
|
29
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
30
|
+
const isEnvMissing = /CLICKUP_API_KEY|CLICKUP_TEAM_ID/.test(message);
|
|
31
|
+
if (isEnvMissing) {
|
|
32
|
+
throw Object.assign(new Error(message), {
|
|
33
|
+
statusCode: 400,
|
|
34
|
+
code: "ENV_MISSING",
|
|
35
|
+
details: { hint: "Set CLICKUP_API_KEY (and CLICKUP_TEAM_ID for workspace commands) as environment variables" }
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
throw err;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// src/rest/handlers/list-update-handler.ts
|
|
42
|
+
var list_update_handler_default = defineHandler({
|
|
43
|
+
async execute(_ctx, input) {
|
|
44
|
+
try {
|
|
45
|
+
const listId = input.params?.listId;
|
|
46
|
+
if (!listId) throw new Error("listId is required");
|
|
47
|
+
if (!input.body) throw new Error("body is required");
|
|
48
|
+
return updateList(requireApiKey(), listId, input.body);
|
|
49
|
+
} catch (err) {
|
|
50
|
+
rethrowForRest(err);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
export { list_update_handler_default as default };
|
|
56
|
+
//# sourceMappingURL=list-update-handler.js.map
|
|
57
|
+
//# sourceMappingURL=list-update-handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/utils/error.ts","../../../src/rest/handlers/list-update-handler.ts"],"names":[],"mappings":";;;;AAKA,SAAS,QAAQ,GAAA,EAA8B;AAC7C,EAAA,QAAQ,IAAI,MAAA;AAAQ,IAClB,KAAK,GAAA;AAAK,MAAA,OAAO,kFAAA;AAAA,IACjB,KAAK,GAAA;AAAK,MAAA,OAAO,oFAAA;AAAA,IACjB,KAAK,GAAA;AAAK,MAAA,OAAO,+FAAA;AAAA,IACjB,KAAK,GAAA;AAAK,MAAA,OAAO,2DAAA;AAAA,IACjB;AAAU,MAAA,OAAO,8BAAA;AAAA;AAErB;AA+CO,SAAS,eAAe,GAAA,EAAqB;AAClD,EAAA,IAAI,eAAe,eAAA,EAAiB;AAClC,IAAA,MAAM,IAAA,GAAO,QAAQ,GAAG,CAAA;AACxB,IAAA,MAAM,UAAU,MAAA,CAAO,MAAA,CAAO,IAAI,KAAA,CAAM,GAAA,CAAI,OAAO,CAAA,EAAG;AAAA,MACpD,YAAY,GAAA,CAAI,MAAA;AAAA,MAChB,MAAM,GAAA,CAAI,IAAA;AAAA,MACV,OAAA,EAAS,EAAE,IAAA;AAAK,KACjB,CAAA;AACD,IAAA,MAAM,OAAA;AAAA,EACR;AACA,EAAA,MAAM,UAAU,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG,CAAA;AAC/D,EAAA,MAAM,YAAA,GAAe,iCAAA,CAAkC,IAAA,CAAK,OAAO,CAAA;AACnE,EAAA,IAAI,YAAA,EAAc;AAChB,IAAA,MAAM,MAAA,CAAO,MAAA,CAAO,IAAI,KAAA,CAAM,OAAO,CAAA,EAAG;AAAA,MACtC,UAAA,EAAY,GAAA;AAAA,MACZ,IAAA,EAAM,aAAA;AAAA,MACN,OAAA,EAAS,EAAE,IAAA,EAAM,2FAAA;AAA4F,KAC9G,CAAA;AAAA,EACH;AACA,EAAA,MAAM,GAAA;AACR;;;AC3EA,IAAO,8BAAQ,aAAA,CAAc;AAAA,EAC3B,MAAM,OAAA,CACJ,IAAA,EACA,KAAA,EACA;AACA,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,MAAA,EAAQ,MAAA;AAC7B,MAAA,IAAI,CAAC,MAAA,EAAQ,MAAM,IAAI,MAAM,oBAAoB,CAAA;AACjD,MAAA,IAAI,CAAC,KAAA,CAAM,IAAA,EAAM,MAAM,IAAI,MAAM,kBAAkB,CAAA;AACnD,MAAA,OAAO,UAAA,CAAW,aAAA,EAAc,EAAG,MAAA,EAAQ,MAAM,IAAI,CAAA;AAAA,IACvD,SAAS,GAAA,EAAK;AACZ,MAAA,cAAA,CAAe,GAAG,CAAA;AAAA,IACpB;AAAA,EACF;AACF,CAAC","file":"list-update-handler.js","sourcesContent":["import type { PluginContextV3 } from '@kb-labs/sdk';\nimport { ClickUpApiError } from '@kb-labs/clickup-core';\n\nexport { validationError } from '@kb-labs/sdk';\n\nfunction apiHint(err: ClickUpApiError): string {\n switch (err.status) {\n case 401: return 'CLICKUP_API_KEY is invalid or expired — check the token in your environment';\n case 403: return 'You don\\'t have permission for this action in ClickUp — check workspace access';\n case 404: return 'Resource not found — verify the ID is correct (use `kb clickup workspace` to browse IDs)';\n case 429: return 'ClickUp rate limit reached — wait a moment and retry';\n default: return 'Unexpected ClickUp API error';\n }\n}\n\n/**\n * Output a structured error and return — call right before `return { exitCode: 1, result: null }`.\n * In JSON mode emits `{ ok: false, error: { code, message, hint?, status? } }`.\n * In CLI mode uses ctx.ui.error() with hint and cause.\n */\nexport function handleError(ctx: PluginContextV3, err: unknown, isJson?: boolean): void {\n if (err instanceof ClickUpApiError) {\n const hint = apiHint(err);\n if (isJson) {\n ctx.ui?.json?.({ ok: false, error: { code: err.code, message: err.message, status: err.status, hint } });\n } else {\n ctx.ui?.error?.(err.message, { hint, cause: `ClickUp API ${err.status} (${err.code})` });\n }\n return;\n }\n\n const message = err instanceof Error ? err.message : String(err);\n const isEnvMissing = /CLICKUP_API_KEY|CLICKUP_TEAM_ID/.test(message);\n\n if (isJson) {\n ctx.ui?.json?.({\n ok: false,\n error: {\n code: isEnvMissing ? 'ENV_MISSING' : 'INTERNAL_ERROR',\n message,\n ...(isEnvMissing && {\n hint: 'Set CLICKUP_API_KEY (and CLICKUP_TEAM_ID for workspace commands) as environment variables',\n }),\n },\n });\n } else {\n ctx.ui?.error?.(message, {\n ...(isEnvMissing && {\n hint: 'Set CLICKUP_API_KEY (and CLICKUP_TEAM_ID for workspace commands) as environment variables',\n command: 'export CLICKUP_API_KEY=pk_xxx CLICKUP_TEAM_ID=yyy',\n }),\n });\n }\n}\n\n/**\n * Re-throws `err` as an HTTP-aware error for REST handlers.\n * `ClickUpApiError` → preserves HTTP status code; env errors → 400; others → 500.\n * The envelope middleware in rest-api reads `err.statusCode` to set the response status.\n */\nexport function rethrowForRest(err: unknown): never {\n if (err instanceof ClickUpApiError) {\n const hint = apiHint(err);\n const restErr = Object.assign(new Error(err.message), {\n statusCode: err.status,\n code: err.code,\n details: { hint },\n });\n throw restErr;\n }\n const message = err instanceof Error ? err.message : String(err);\n const isEnvMissing = /CLICKUP_API_KEY|CLICKUP_TEAM_ID/.test(message);\n if (isEnvMissing) {\n throw Object.assign(new Error(message), {\n statusCode: 400,\n code: 'ENV_MISSING',\n details: { hint: 'Set CLICKUP_API_KEY (and CLICKUP_TEAM_ID for workspace commands) as environment variables' },\n });\n }\n throw err;\n}\n","import { defineHandler, type PluginContextV3, type RestInput } from '@kb-labs/sdk';\nimport { requireApiKey, updateList } from '@kb-labs/clickup-core';\nimport type { UpdateListInput } from '@kb-labs/clickup-contracts';\nimport { rethrowForRest } from '../../utils/error.js';\n\nexport default defineHandler({\n async execute(\n _ctx: PluginContextV3,\n input: RestInput<Record<string, never>, UpdateListInput, { listId: string }>,\n ) {\n try {\n const listId = input.params?.listId;\n if (!listId) throw new Error('listId is required');\n if (!input.body) throw new Error('body is required');\n return updateList(requireApiKey(), listId, input.body);\n } catch (err) {\n rethrowForRest(err);\n }\n },\n});\n"]}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import * as _kb_labs_shared_command_kit from '@kb-labs/shared-command-kit';
|
|
2
|
+
import * as _kb_labs_clickup_contracts from '@kb-labs/clickup-contracts';
|
|
3
|
+
import { RestInput } from '@kb-labs/sdk';
|
|
4
|
+
|
|
5
|
+
type SearchQuery = {
|
|
6
|
+
q?: string;
|
|
7
|
+
list_ids?: string;
|
|
8
|
+
statuses?: string;
|
|
9
|
+
assignees?: string;
|
|
10
|
+
limit?: string;
|
|
11
|
+
page?: string;
|
|
12
|
+
include_closed?: string;
|
|
13
|
+
};
|
|
14
|
+
declare const _default: _kb_labs_shared_command_kit.Handler<unknown, RestInput<SearchQuery, unknown, unknown>, _kb_labs_clickup_contracts.ClickUpTask[]>;
|
|
15
|
+
|
|
16
|
+
export { _default as default };
|