@kb-labs/clickup-entry 2.118.2 → 2.119.0-canary.0c078654e

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 (43) hide show
  1. package/README.md +25 -24
  2. package/dist/commands/folder-create.js.map +1 -1
  3. package/dist/commands/folder-delete.js.map +1 -1
  4. package/dist/commands/folder-update.js.map +1 -1
  5. package/dist/commands/list-create.js.map +1 -1
  6. package/dist/commands/list-delete.js.map +1 -1
  7. package/dist/commands/list-statuses.js.map +1 -1
  8. package/dist/commands/list-tasks.js.map +1 -1
  9. package/dist/commands/list-update.js.map +1 -1
  10. package/dist/commands/space-create.js.map +1 -1
  11. package/dist/commands/space-delete.js.map +1 -1
  12. package/dist/commands/space-update.js.map +1 -1
  13. package/dist/commands/task-comment-add.js.map +1 -1
  14. package/dist/commands/task-comment-list.js.map +1 -1
  15. package/dist/commands/task-create.js.map +1 -1
  16. package/dist/commands/task-delete.js.map +1 -1
  17. package/dist/commands/task-get.js.map +1 -1
  18. package/dist/commands/task-search.js.map +1 -1
  19. package/dist/commands/task-update.js.map +1 -1
  20. package/dist/commands/workspace.js.map +1 -1
  21. package/dist/index.js.map +1 -1
  22. package/dist/manifest.js.map +1 -1
  23. package/dist/rest/handlers/folder-create-handler.js.map +1 -1
  24. package/dist/rest/handlers/folder-delete-handler.js.map +1 -1
  25. package/dist/rest/handlers/folder-update-handler.js.map +1 -1
  26. package/dist/rest/handlers/list-create-handler.js.map +1 -1
  27. package/dist/rest/handlers/list-delete-handler.js.map +1 -1
  28. package/dist/rest/handlers/list-statuses-handler.js.map +1 -1
  29. package/dist/rest/handlers/list-tasks-handler.js.map +1 -1
  30. package/dist/rest/handlers/list-update-handler.js.map +1 -1
  31. package/dist/rest/handlers/search-handler.js.map +1 -1
  32. package/dist/rest/handlers/space-create-handler.js.map +1 -1
  33. package/dist/rest/handlers/space-delete-handler.js.map +1 -1
  34. package/dist/rest/handlers/space-update-handler.js.map +1 -1
  35. package/dist/rest/handlers/task-comment-add-handler.js.map +1 -1
  36. package/dist/rest/handlers/task-comments-handler.js.map +1 -1
  37. package/dist/rest/handlers/task-create-handler.js.map +1 -1
  38. package/dist/rest/handlers/task-delete-handler.js.map +1 -1
  39. package/dist/rest/handlers/task-get-handler.js.map +1 -1
  40. package/dist/rest/handlers/task-update-handler.js.map +1 -1
  41. package/dist/rest/handlers/workspace-handler.js.map +1 -1
  42. package/package.json +7 -7
  43. package/dist/manifest.json +0 -819
package/README.md CHANGED
@@ -13,7 +13,7 @@ kb marketplace install kb:kirill/@kb-labs/clickup-entry
13
13
  Set your ClickUp API token:
14
14
 
15
15
  ```bash
16
- export CLICKUP_API_TOKEN=your_token_here
16
+ export CLICKUP_API_KEY=your_token_here
17
17
  export CLICKUP_TEAM_ID=your_team_id
18
18
  ```
19
19
 
@@ -25,45 +25,46 @@ Get your API token from **ClickUp → Settings → Apps → API Token**.
25
25
 
26
26
  | Command | Description |
27
27
  |---|---|
28
- | `kb clickup:task-get` | Get task details by ID |
29
- | `kb clickup:task-create` | Create a new task |
30
- | `kb clickup:task-update` | Update task fields |
31
- | `kb clickup:task-delete` | Delete a task |
32
- | `kb clickup:task-search` | Search tasks by query |
33
- | `kb clickup:task-comment-add` | Add a comment to a task |
34
- | `kb clickup:task-comment-list` | List task comments |
28
+ | `kb clickup task get <taskId>` | Get task details by ID |
29
+ | `kb clickup task create --list <listId> --name "<name>"` | Create a new task |
30
+ | `kb clickup task update <taskId> --status "<status>"` | Update task fields |
31
+ | `kb clickup task delete <taskId> --yes` | Delete a task |
32
+ | `kb clickup task search "<query>"` | Search tasks by query |
33
+ | `kb clickup task comments add <taskId> --text "<text>"` | Add a comment to a task |
34
+ | `kb clickup task comments list <taskId>` | List task comments |
35
35
 
36
36
  ### Lists & Folders
37
37
 
38
38
  | Command | Description |
39
39
  |---|---|
40
- | `kb clickup:list-tasks` | List tasks in a list |
41
- | `kb clickup:list-create` | Create a new list |
42
- | `kb clickup:list-update` | Update list settings |
43
- | `kb clickup:list-delete` | Delete a list |
44
- | `kb clickup:list-statuses` | Get statuses for a list |
45
- | `kb clickup:folder-create` | Create a folder |
46
- | `kb clickup:folder-update` | Update a folder |
47
- | `kb clickup:folder-delete` | Delete a folder |
40
+ | `kb clickup list tasks <listId>` | List tasks in a list |
41
+ | `kb clickup list create --folder <folderId> --name "<name>"` | Create a new list |
42
+ | `kb clickup list update <listId> --name "<name>"` | Update list settings |
43
+ | `kb clickup list delete <listId> --force` | Delete a list |
44
+ | `kb clickup list statuses <listId>` | Get statuses for a list |
45
+ | `kb clickup folder create --space <spaceId> --name "<name>"` | Create a folder |
46
+ | `kb clickup folder update <folderId> --name "<name>"` | Update a folder |
47
+ | `kb clickup folder delete <folderId> --force` | Delete a folder |
48
48
 
49
49
  ### Spaces & Workspace
50
50
 
51
51
  | Command | Description |
52
52
  |---|---|
53
- | `kb clickup:space-create` | Create a space |
54
- | `kb clickup:space-update` | Update a space |
55
- | `kb clickup:space-delete` | Delete a space |
56
- | `kb clickup:workspace` | Show workspace info |
53
+ | `kb clickup space create --name "<name>"` | Create a space |
54
+ | `kb clickup space update <spaceId> --name "<name>"` | Update a space |
55
+ | `kb clickup space delete <spaceId> --force` | Delete a space |
56
+ | `kb clickup workspace` | Show workspace info |
57
57
 
58
58
  ## Example
59
59
 
60
60
  ```bash
61
- # List tasks in a list
62
- kb clickup:list-tasks --list-id 123456
61
+ # Inspect the workspace and list tasks
62
+ kb clickup workspace --json
63
+ kb clickup list tasks 123456
63
64
 
64
65
  # Create a task
65
- kb clickup:task-create --list-id 123456 --name "Fix login bug" --priority high
66
+ kb clickup task create --list 123456 --name "Fix login bug" --priority 2
66
67
 
67
68
  # Search tasks
68
- kb clickup:task-search --query "login" --team-id $CLICKUP_TEAM_ID
69
+ kb clickup task search "login"
69
70
  ```
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utils/error.ts","../../src/commands/folder-create.ts"],"names":[],"mappings":"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","file":"folder-create.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 { ok: false, error: 'Command failed', 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 { defineCommand, type CLIInput, type PluginContextV3 } from '@kb-labs/sdk';\nimport { requireApiKey, createFolder } from '@kb-labs/clickup-core';\nimport { handleError, validationError } from '../utils/error.js';\n\ntype FolderCreateFlags = {\n space: string;\n name: string;\n json?: boolean;\n full?: boolean;\n};\n\nexport default defineCommand({\n id: 'clickup:folder.create',\n description: 'Create a new folder in a space',\n\n handler: {\n async intent(_ctx: PluginContextV3, input: CLIInput<FolderCreateFlags>) {\n const { space, name } = input.flags;\n return {\n summary: `Create folder \"${name ?? '(unnamed)'}\" in space ${space ?? '(unknown)'}`,\n operations: [{ type: 'create' as const, resource: 'folder', details: { space, name } }],\n };\n },\n\n async execute(ctx: PluginContextV3, input: CLIInput<FolderCreateFlags>) {\n const { space, name, json, full } = input.flags;\n if (!space) {\n validationError(ctx, '--space is required', 'Use `kb clickup workspace` to find the space ID', json);\n return { ok: false, error: 'Command failed', result: null };\n }\n if (!name) {\n validationError(ctx, '--name is required', undefined, json);\n return { ok: false, error: 'Command failed', result: null };\n }\n\n try {\n const folder = await createFolder(requireApiKey(), space, { name });\n\n if (json) {\n ctx.ui?.json?.(full ? folder : { id: folder.id, name: folder.name });\n } else {\n ctx.ui?.success?.('Folder created', {\n sections: [{ items: [`id: ${folder.id}`, `name: ${folder.name}`] }],\n });\n }\n\n return { ok: true, result: folder };\n } catch (err) {\n handleError(ctx, err, json);\n return { ok: false, error: 'Command failed', result: null };\n }\n },\n },\n});\n"]}
1
+ {"version":3,"sources":["../../../home/runner/work/kb-labs/kb-labs/plugins/clickup/entry/src/utils/error.ts","../../../home/runner/work/kb-labs/kb-labs/plugins/clickup/entry/src/commands/folder-create.ts"],"names":[],"mappings":"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","file":"folder-create.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 { ok: false, error: 'Command failed', 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 { defineCommand, type CLIInput, type PluginContextV3 } from '@kb-labs/sdk';\nimport { requireApiKey, createFolder } from '@kb-labs/clickup-core';\nimport { handleError, validationError } from '../utils/error.js';\n\ntype FolderCreateFlags = {\n space: string;\n name: string;\n json?: boolean;\n full?: boolean;\n};\n\nexport default defineCommand({\n id: 'clickup:folder.create',\n description: 'Create a new folder in a space',\n\n handler: {\n async intent(_ctx: PluginContextV3, input: CLIInput<FolderCreateFlags>) {\n const { space, name } = input.flags;\n return {\n summary: `Create folder \"${name ?? '(unnamed)'}\" in space ${space ?? '(unknown)'}`,\n operations: [{ type: 'create' as const, resource: 'folder', details: { space, name } }],\n };\n },\n\n async execute(ctx: PluginContextV3, input: CLIInput<FolderCreateFlags>) {\n const { space, name, json, full } = input.flags;\n if (!space) {\n validationError(ctx, '--space is required', 'Use `kb clickup workspace` to find the space ID', json);\n return { ok: false, error: 'Command failed', result: null };\n }\n if (!name) {\n validationError(ctx, '--name is required', undefined, json);\n return { ok: false, error: 'Command failed', result: null };\n }\n\n try {\n const folder = await createFolder(requireApiKey(), space, { name });\n\n if (json) {\n ctx.ui?.json?.(full ? folder : { id: folder.id, name: folder.name });\n } else {\n ctx.ui?.success?.('Folder created', {\n sections: [{ items: [`id: ${folder.id}`, `name: ${folder.name}`] }],\n });\n }\n\n return { ok: true, result: folder };\n } catch (err) {\n handleError(ctx, err, json);\n return { ok: false, error: 'Command failed', result: null };\n }\n },\n },\n});\n"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utils/error.ts","../../src/commands/folder-delete.ts"],"names":[],"mappings":"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","file":"folder-delete.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 { ok: false, error: 'Command failed', 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 { defineCommand, type CLIInput, type PluginContextV3 } from '@kb-labs/sdk';\nimport { requireApiKey, deleteFolder } from '@kb-labs/clickup-core';\nimport { handleError, validationError } from '../utils/error.js';\n\ntype FolderDeleteFlags = {\n force?: boolean;\n json?: boolean;\n 'dry-run'?: boolean;\n};\n\nexport default defineCommand({\n id: 'clickup:folder.delete',\n description: 'Delete a folder',\n\n handler: {\n async intent(_ctx: PluginContextV3, input: CLIInput<FolderDeleteFlags>) {\n const [folderId] = input.argv;\n return {\n summary: `Delete folder ${folderId ?? '(unknown)'}`,\n operations: [{ type: 'delete' as const, resource: 'folder', details: { folderId } }],\n };\n },\n\n async execute(ctx: PluginContextV3, input: CLIInput<FolderDeleteFlags>) {\n const folderId = input.argv[0] as string | undefined;\n if (!folderId) {\n validationError(ctx, 'folderId is required', 'Usage: kb clickup folder delete <folderId> --force', input.flags.json);\n return { ok: false, error: 'Command failed', result: null };\n }\n if (!input.flags.force) {\n validationError(ctx, `--force is required to delete folder ${folderId}`, 'Add --force to confirm deletion', input.flags.json);\n return { ok: false, error: 'Command failed', result: null };\n }\n\n try {\n await deleteFolder(requireApiKey(), folderId);\n\n if (input.flags.json) {\n ctx.ui?.json?.({ ok: true, deleted: true, folderId });\n } else {\n ctx.ui?.success?.(`Deleted folder ${folderId}`);\n }\n\n return { ok: true, result: { deleted: true, folderId } };\n } catch (err) {\n handleError(ctx, err, input.flags.json);\n return { ok: false, error: 'Command failed', result: null };\n }\n },\n },\n});\n"]}
1
+ {"version":3,"sources":["../../../home/runner/work/kb-labs/kb-labs/plugins/clickup/entry/src/utils/error.ts","../../../home/runner/work/kb-labs/kb-labs/plugins/clickup/entry/src/commands/folder-delete.ts"],"names":[],"mappings":"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","file":"folder-delete.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 { ok: false, error: 'Command failed', 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 { defineCommand, type CLIInput, type PluginContextV3 } from '@kb-labs/sdk';\nimport { requireApiKey, deleteFolder } from '@kb-labs/clickup-core';\nimport { handleError, validationError } from '../utils/error.js';\n\ntype FolderDeleteFlags = {\n force?: boolean;\n json?: boolean;\n 'dry-run'?: boolean;\n};\n\nexport default defineCommand({\n id: 'clickup:folder.delete',\n description: 'Delete a folder',\n\n handler: {\n async intent(_ctx: PluginContextV3, input: CLIInput<FolderDeleteFlags>) {\n const [folderId] = input.argv;\n return {\n summary: `Delete folder ${folderId ?? '(unknown)'}`,\n operations: [{ type: 'delete' as const, resource: 'folder', details: { folderId } }],\n };\n },\n\n async execute(ctx: PluginContextV3, input: CLIInput<FolderDeleteFlags>) {\n const folderId = input.argv[0] as string | undefined;\n if (!folderId) {\n validationError(ctx, 'folderId is required', 'Usage: kb clickup folder delete <folderId> --force', input.flags.json);\n return { ok: false, error: 'Command failed', result: null };\n }\n if (!input.flags.force) {\n validationError(ctx, `--force is required to delete folder ${folderId}`, 'Add --force to confirm deletion', input.flags.json);\n return { ok: false, error: 'Command failed', result: null };\n }\n\n try {\n await deleteFolder(requireApiKey(), folderId);\n\n if (input.flags.json) {\n ctx.ui?.json?.({ ok: true, deleted: true, folderId });\n } else {\n ctx.ui?.success?.(`Deleted folder ${folderId}`);\n }\n\n return { ok: true, result: { deleted: true, folderId } };\n } catch (err) {\n handleError(ctx, err, input.flags.json);\n return { ok: false, error: 'Command failed', result: null };\n }\n },\n },\n});\n"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utils/error.ts","../../src/commands/folder-update.ts"],"names":[],"mappings":"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","file":"folder-update.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 { ok: false, error: 'Command failed', 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 { defineCommand, type CLIInput, type PluginContextV3 } from '@kb-labs/sdk';\nimport { requireApiKey, updateFolder } from '@kb-labs/clickup-core';\nimport { handleError, validationError } from '../utils/error.js';\n\ntype FolderUpdateFlags = {\n name: string;\n json?: boolean;\n full?: boolean;\n 'dry-run'?: boolean;\n};\n\nexport default defineCommand({\n id: 'clickup:folder.update',\n description: 'Rename a folder',\n\n handler: {\n async intent(_ctx: PluginContextV3, input: CLIInput<FolderUpdateFlags>) {\n const [folderId] = input.argv;\n return {\n summary: `Rename folder ${folderId ?? '(unknown)'} to \"${input.flags.name ?? '(unnamed)'}\"`,\n operations: [{ type: 'update' as const, resource: 'folder', details: { folderId, name: input.flags.name } }],\n };\n },\n\n async execute(ctx: PluginContextV3, input: CLIInput<FolderUpdateFlags>) {\n const folderId = input.argv[0] as string | undefined;\n if (!folderId) {\n validationError(ctx, 'folderId is required', 'Usage: kb clickup folder update <folderId> --name \"new name\"', input.flags.json);\n return { ok: false, error: 'Command failed', result: null };\n }\n if (!input.flags.name) {\n validationError(ctx, '--name is required', undefined, input.flags.json);\n return { ok: false, error: 'Command failed', result: null };\n }\n\n try {\n const folder = await updateFolder(requireApiKey(), folderId, { name: input.flags.name });\n\n if (input.flags.json) {\n ctx.ui?.json?.(input.flags.full ? folder : { id: folder.id, name: folder.name });\n } else {\n ctx.ui?.success?.('Folder updated', {\n sections: [{ items: [`id: ${folder.id}`, `name: ${folder.name}`] }],\n });\n }\n\n return { ok: true, result: folder };\n } catch (err) {\n handleError(ctx, err, input.flags.json);\n return { ok: false, error: 'Command failed', result: null };\n }\n },\n },\n});\n"]}
1
+ {"version":3,"sources":["../../../home/runner/work/kb-labs/kb-labs/plugins/clickup/entry/src/utils/error.ts","../../../home/runner/work/kb-labs/kb-labs/plugins/clickup/entry/src/commands/folder-update.ts"],"names":[],"mappings":"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","file":"folder-update.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 { ok: false, error: 'Command failed', 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 { defineCommand, type CLIInput, type PluginContextV3 } from '@kb-labs/sdk';\nimport { requireApiKey, updateFolder } from '@kb-labs/clickup-core';\nimport { handleError, validationError } from '../utils/error.js';\n\ntype FolderUpdateFlags = {\n name: string;\n json?: boolean;\n full?: boolean;\n 'dry-run'?: boolean;\n};\n\nexport default defineCommand({\n id: 'clickup:folder.update',\n description: 'Rename a folder',\n\n handler: {\n async intent(_ctx: PluginContextV3, input: CLIInput<FolderUpdateFlags>) {\n const [folderId] = input.argv;\n return {\n summary: `Rename folder ${folderId ?? '(unknown)'} to \"${input.flags.name ?? '(unnamed)'}\"`,\n operations: [{ type: 'update' as const, resource: 'folder', details: { folderId, name: input.flags.name } }],\n };\n },\n\n async execute(ctx: PluginContextV3, input: CLIInput<FolderUpdateFlags>) {\n const folderId = input.argv[0] as string | undefined;\n if (!folderId) {\n validationError(ctx, 'folderId is required', 'Usage: kb clickup folder update <folderId> --name \"new name\"', input.flags.json);\n return { ok: false, error: 'Command failed', result: null };\n }\n if (!input.flags.name) {\n validationError(ctx, '--name is required', undefined, input.flags.json);\n return { ok: false, error: 'Command failed', result: null };\n }\n\n try {\n const folder = await updateFolder(requireApiKey(), folderId, { name: input.flags.name });\n\n if (input.flags.json) {\n ctx.ui?.json?.(input.flags.full ? folder : { id: folder.id, name: folder.name });\n } else {\n ctx.ui?.success?.('Folder updated', {\n sections: [{ items: [`id: ${folder.id}`, `name: ${folder.name}`] }],\n });\n }\n\n return { ok: true, result: folder };\n } catch (err) {\n handleError(ctx, err, input.flags.json);\n return { ok: false, error: 'Command failed', result: null };\n }\n },\n },\n});\n"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utils/error.ts","../../src/commands/list-create.ts"],"names":[],"mappings":"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","file":"list-create.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 { ok: false, error: 'Command failed', 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 { defineCommand, type CLIInput, type PluginContextV3 } from '@kb-labs/sdk';\nimport { requireApiKey, createListInFolder, createListInSpace } from '@kb-labs/clickup-core';\nimport { handleError, validationError } from '../utils/error.js';\n\ntype ListCreateFlags = {\n folder?: string;\n space?: string;\n name: string;\n json?: boolean;\n full?: boolean;\n 'dry-run'?: boolean;\n};\n\nexport default defineCommand({\n id: 'clickup:list.create',\n description: 'Create a new list in a folder or space',\n\n handler: {\n async intent(_ctx: PluginContextV3, input: CLIInput<ListCreateFlags>) {\n const { folder, space, name } = input.flags;\n const parent = folder ? `folder ${folder}` : space ? `space ${space}` : '(unknown)';\n return {\n summary: `Create list \"${name}\" in ${parent}`,\n operations: [{ type: 'create' as const, resource: 'list', details: { folder, space, name } }],\n };\n },\n\n async execute(ctx: PluginContextV3, input: CLIInput<ListCreateFlags>) {\n const { folder, space, name, json, full } = input.flags;\n if (!name) {\n validationError(ctx, '--name is required', undefined, json);\n return { ok: false, error: 'Command failed', result: null };\n }\n if (!folder && !space) {\n validationError(ctx, '--folder or --space is required', 'Use `kb clickup workspace` to find IDs', json);\n return { ok: false, error: 'Command failed', result: null };\n }\n\n try {\n const apiKey = requireApiKey();\n const list = folder\n ? await createListInFolder(apiKey, folder, { name })\n : await createListInSpace(apiKey, space!, { name });\n\n if (json) {\n ctx.ui?.json?.(full ? list : { id: list.id, name: list.name });\n } else {\n ctx.ui?.success?.('List created', {\n sections: [{ items: [`id: ${list.id}`, `name: ${list.name}`] }],\n });\n }\n\n return { ok: true, result: list };\n } catch (err) {\n handleError(ctx, err, json);\n return { ok: false, error: 'Command failed', result: null };\n }\n },\n },\n});\n"]}
1
+ {"version":3,"sources":["../../../home/runner/work/kb-labs/kb-labs/plugins/clickup/entry/src/utils/error.ts","../../../home/runner/work/kb-labs/kb-labs/plugins/clickup/entry/src/commands/list-create.ts"],"names":[],"mappings":"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","file":"list-create.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 { ok: false, error: 'Command failed', 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 { defineCommand, type CLIInput, type PluginContextV3 } from '@kb-labs/sdk';\nimport { requireApiKey, createListInFolder, createListInSpace } from '@kb-labs/clickup-core';\nimport { handleError, validationError } from '../utils/error.js';\n\ntype ListCreateFlags = {\n folder?: string;\n space?: string;\n name: string;\n json?: boolean;\n full?: boolean;\n 'dry-run'?: boolean;\n};\n\nexport default defineCommand({\n id: 'clickup:list.create',\n description: 'Create a new list in a folder or space',\n\n handler: {\n async intent(_ctx: PluginContextV3, input: CLIInput<ListCreateFlags>) {\n const { folder, space, name } = input.flags;\n const parent = folder ? `folder ${folder}` : space ? `space ${space}` : '(unknown)';\n return {\n summary: `Create list \"${name}\" in ${parent}`,\n operations: [{ type: 'create' as const, resource: 'list', details: { folder, space, name } }],\n };\n },\n\n async execute(ctx: PluginContextV3, input: CLIInput<ListCreateFlags>) {\n const { folder, space, name, json, full } = input.flags;\n if (!name) {\n validationError(ctx, '--name is required', undefined, json);\n return { ok: false, error: 'Command failed', result: null };\n }\n if (!folder && !space) {\n validationError(ctx, '--folder or --space is required', 'Use `kb clickup workspace` to find IDs', json);\n return { ok: false, error: 'Command failed', result: null };\n }\n\n try {\n const apiKey = requireApiKey();\n const list = folder\n ? await createListInFolder(apiKey, folder, { name })\n : await createListInSpace(apiKey, space!, { name });\n\n if (json) {\n ctx.ui?.json?.(full ? list : { id: list.id, name: list.name });\n } else {\n ctx.ui?.success?.('List created', {\n sections: [{ items: [`id: ${list.id}`, `name: ${list.name}`] }],\n });\n }\n\n return { ok: true, result: list };\n } catch (err) {\n handleError(ctx, err, json);\n return { ok: false, error: 'Command failed', result: null };\n }\n },\n },\n});\n"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utils/error.ts","../../src/commands/list-delete.ts"],"names":[],"mappings":"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","file":"list-delete.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 { ok: false, error: 'Command failed', 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 { defineCommand, type CLIInput, type PluginContextV3 } from '@kb-labs/sdk';\nimport { requireApiKey, deleteList } from '@kb-labs/clickup-core';\nimport { handleError, validationError } from '../utils/error.js';\n\ntype ListDeleteFlags = {\n force?: boolean;\n json?: boolean;\n 'dry-run'?: boolean;\n};\n\nexport default defineCommand({\n id: 'clickup:list.delete',\n description: 'Delete a list',\n\n handler: {\n async intent(_ctx: PluginContextV3, input: CLIInput<ListDeleteFlags>) {\n const [listId] = input.argv;\n return {\n summary: `Delete list ${listId ?? '(unknown)'}`,\n operations: [{ type: 'delete' as const, resource: 'list', details: { listId } }],\n };\n },\n\n async execute(ctx: PluginContextV3, input: CLIInput<ListDeleteFlags>) {\n const listId = input.argv[0] as string | undefined;\n if (!listId) {\n validationError(ctx, 'listId is required', 'Usage: kb clickup list delete <listId> --force', input.flags.json);\n return { ok: false, error: 'Command failed', result: null };\n }\n if (!input.flags.force) {\n validationError(ctx, `--force is required to delete list ${listId}`, 'Add --force to confirm deletion', input.flags.json);\n return { ok: false, error: 'Command failed', result: null };\n }\n\n try {\n await deleteList(requireApiKey(), listId);\n\n if (input.flags.json) {\n ctx.ui?.json?.({ ok: true, deleted: true, listId });\n } else {\n ctx.ui?.success?.(`Deleted list ${listId}`);\n }\n\n return { ok: true, result: { deleted: true, listId } };\n } catch (err) {\n handleError(ctx, err, input.flags.json);\n return { ok: false, error: 'Command failed', result: null };\n }\n },\n },\n});\n"]}
1
+ {"version":3,"sources":["../../../home/runner/work/kb-labs/kb-labs/plugins/clickup/entry/src/utils/error.ts","../../../home/runner/work/kb-labs/kb-labs/plugins/clickup/entry/src/commands/list-delete.ts"],"names":[],"mappings":"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","file":"list-delete.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 { ok: false, error: 'Command failed', 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 { defineCommand, type CLIInput, type PluginContextV3 } from '@kb-labs/sdk';\nimport { requireApiKey, deleteList } from '@kb-labs/clickup-core';\nimport { handleError, validationError } from '../utils/error.js';\n\ntype ListDeleteFlags = {\n force?: boolean;\n json?: boolean;\n 'dry-run'?: boolean;\n};\n\nexport default defineCommand({\n id: 'clickup:list.delete',\n description: 'Delete a list',\n\n handler: {\n async intent(_ctx: PluginContextV3, input: CLIInput<ListDeleteFlags>) {\n const [listId] = input.argv;\n return {\n summary: `Delete list ${listId ?? '(unknown)'}`,\n operations: [{ type: 'delete' as const, resource: 'list', details: { listId } }],\n };\n },\n\n async execute(ctx: PluginContextV3, input: CLIInput<ListDeleteFlags>) {\n const listId = input.argv[0] as string | undefined;\n if (!listId) {\n validationError(ctx, 'listId is required', 'Usage: kb clickup list delete <listId> --force', input.flags.json);\n return { ok: false, error: 'Command failed', result: null };\n }\n if (!input.flags.force) {\n validationError(ctx, `--force is required to delete list ${listId}`, 'Add --force to confirm deletion', input.flags.json);\n return { ok: false, error: 'Command failed', result: null };\n }\n\n try {\n await deleteList(requireApiKey(), listId);\n\n if (input.flags.json) {\n ctx.ui?.json?.({ ok: true, deleted: true, listId });\n } else {\n ctx.ui?.success?.(`Deleted list ${listId}`);\n }\n\n return { ok: true, result: { deleted: true, listId } };\n } catch (err) {\n handleError(ctx, err, input.flags.json);\n return { ok: false, error: 'Command failed', result: null };\n }\n },\n },\n});\n"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utils/error.ts","../../src/commands/list-statuses.ts"],"names":[],"mappings":"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","file":"list-statuses.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 { ok: false, error: 'Command failed', 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 { defineCommand, type CLIInput, type PluginContextV3 } from '@kb-labs/sdk';\nimport { requireApiKey, getListStatuses } from '@kb-labs/clickup-core';\nimport { handleError, validationError } from '../utils/error.js';\n\ntype ListStatusesFlags = { json?: boolean; full?: boolean };\n\nexport default defineCommand({\n id: 'clickup:list.statuses',\n description: 'List available statuses for a list',\n\n handler: {\n async execute(ctx: PluginContextV3, input: CLIInput<ListStatusesFlags>) {\n const [listId] = input.argv;\n if (!listId) {\n validationError(ctx, 'List ID is required', 'Usage: kb clickup list statuses <listId> (get IDs via `kb clickup workspace`)', input.flags.json);\n return { ok: false, error: 'Command failed', result: null };\n }\n\n try {\n const statuses = await getListStatuses(requireApiKey(), listId);\n\n if (input.flags.json) {\n ctx.ui?.json?.(input.flags.full ? statuses : statuses.map(s => ({ status: s.status, type: s.type, color: s.color })));\n return { ok: true, result: statuses };\n }\n\n ctx.ui?.table?.(\n statuses.map(s => ({ Status: s.status, Type: s.type, Color: s.color })),\n [\n { header: 'Status', key: 'Status' },\n { header: 'Type', key: 'Type' },\n { header: 'Color', key: 'Color' },\n ],\n );\n\n return { ok: true, result: statuses };\n } catch (err) {\n handleError(ctx, err, input.flags.json);\n return { ok: false, error: 'Command failed', result: null };\n }\n },\n },\n});\n"]}
1
+ {"version":3,"sources":["../../../home/runner/work/kb-labs/kb-labs/plugins/clickup/entry/src/utils/error.ts","../../../home/runner/work/kb-labs/kb-labs/plugins/clickup/entry/src/commands/list-statuses.ts"],"names":[],"mappings":"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","file":"list-statuses.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 { ok: false, error: 'Command failed', 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 { defineCommand, type CLIInput, type PluginContextV3 } from '@kb-labs/sdk';\nimport { requireApiKey, getListStatuses } from '@kb-labs/clickup-core';\nimport { handleError, validationError } from '../utils/error.js';\n\ntype ListStatusesFlags = { json?: boolean; full?: boolean };\n\nexport default defineCommand({\n id: 'clickup:list.statuses',\n description: 'List available statuses for a list',\n\n handler: {\n async execute(ctx: PluginContextV3, input: CLIInput<ListStatusesFlags>) {\n const [listId] = input.argv;\n if (!listId) {\n validationError(ctx, 'List ID is required', 'Usage: kb clickup list statuses <listId> (get IDs via `kb clickup workspace`)', input.flags.json);\n return { ok: false, error: 'Command failed', result: null };\n }\n\n try {\n const statuses = await getListStatuses(requireApiKey(), listId);\n\n if (input.flags.json) {\n ctx.ui?.json?.(input.flags.full ? statuses : statuses.map(s => ({ status: s.status, type: s.type, color: s.color })));\n return { ok: true, result: statuses };\n }\n\n ctx.ui?.table?.(\n statuses.map(s => ({ Status: s.status, Type: s.type, Color: s.color })),\n [\n { header: 'Status', key: 'Status' },\n { header: 'Type', key: 'Type' },\n { header: 'Color', key: 'Color' },\n ],\n );\n\n return { ok: true, result: statuses };\n } catch (err) {\n handleError(ctx, err, input.flags.json);\n return { ok: false, error: 'Command failed', result: null };\n }\n },\n },\n});\n"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utils/error.ts","../../src/utils/slim.ts","../../src/commands/list-tasks.ts"],"names":[],"mappings":"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","file":"list-tasks.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 { ok: false, error: 'Command failed', 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 type { ClickUpTask } from '@kb-labs/clickup-contracts';\n\nexport function slimTask(task: ClickUpTask) {\n return {\n id: task.id,\n name: task.name,\n status: task.status.status,\n priority: task.priority?.id ? Number(task.priority.id) : null,\n due_date: task.due_date ? Number(task.due_date) : null,\n url: task.url,\n };\n}\n\nexport function slimTaskWithDesc(task: ClickUpTask) {\n return { ...slimTask(task), description: task.description ?? '' };\n}\n","import { defineCommand, type CLIInput, type PluginContextV3 } from '@kb-labs/sdk';\nimport { requireApiKey, getListTasks } from '@kb-labs/clickup-core';\nimport { handleError, validationError } from '../utils/error.js';\nimport { slimTask } from '../utils/slim.js';\n\ntype ListTasksFlags = {\n status?: string;\n assignee?: string;\n limit?: number;\n page?: number;\n closed?: boolean;\n json?: boolean;\n full?: boolean;\n};\n\nexport default defineCommand({\n id: 'clickup:list.tasks',\n description: 'List tasks in a specific list',\n\n handler: {\n async execute(ctx: PluginContextV3, input: CLIInput<ListTasksFlags>) {\n const [listId] = input.argv;\n if (!listId) {\n validationError(ctx, 'List ID is required', 'Usage: kb clickup list tasks <listId> (get IDs via `kb clickup workspace`)', input.flags.json);\n return { ok: false, error: 'Command failed', result: null };\n }\n\n try {\n const tasks = await getListTasks(requireApiKey(), listId, {\n statuses: input.flags.status ? input.flags.status.split(',') : undefined,\n assignees: input.flags.assignee ? input.flags.assignee.split(',') : undefined,\n limit: input.flags.limit ?? 50,\n page: input.flags.page ?? 0,\n include_closed: input.flags.closed,\n });\n\n if (input.flags.json) {\n ctx.ui?.json?.(input.flags.full ? tasks : tasks.map(slimTask));\n return { ok: true, result: tasks };\n }\n\n if (!tasks.length) {\n ctx.ui?.info?.('No tasks found.');\n return { ok: true, result: tasks };\n }\n\n ctx.ui?.table?.(\n tasks.map(task => ({\n ID: task.id,\n Name: task.name,\n Status: task.status.status,\n Priority: task.priority?.priority ?? '–',\n Assignees: task.assignees.map(a => a.username).join(', ') || '–',\n })),\n [\n { header: 'ID', key: 'ID' },\n { header: 'Name', key: 'Name' },\n { header: 'Status', key: 'Status' },\n { header: 'Priority', key: 'Priority' },\n { header: 'Assignees', key: 'Assignees' },\n ],\n );\n\n return { ok: true, result: tasks };\n } catch (err) {\n handleError(ctx, err, input.flags.json);\n return { ok: false, error: 'Command failed', result: null };\n }\n },\n },\n});\n"]}
1
+ {"version":3,"sources":["../../../home/runner/work/kb-labs/kb-labs/plugins/clickup/entry/src/utils/error.ts","../../../home/runner/work/kb-labs/kb-labs/plugins/clickup/entry/src/utils/slim.ts","../../../home/runner/work/kb-labs/kb-labs/plugins/clickup/entry/src/commands/list-tasks.ts"],"names":[],"mappings":"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","file":"list-tasks.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 { ok: false, error: 'Command failed', 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 type { ClickUpTask } from '@kb-labs/clickup-contracts';\n\nexport function slimTask(task: ClickUpTask) {\n return {\n id: task.id,\n name: task.name,\n status: task.status.status,\n priority: task.priority?.id ? Number(task.priority.id) : null,\n due_date: task.due_date ? Number(task.due_date) : null,\n url: task.url,\n };\n}\n\nexport function slimTaskWithDesc(task: ClickUpTask) {\n return { ...slimTask(task), description: task.description ?? '' };\n}\n","import { defineCommand, type CLIInput, type PluginContextV3 } from '@kb-labs/sdk';\nimport { requireApiKey, getListTasks } from '@kb-labs/clickup-core';\nimport { handleError, validationError } from '../utils/error.js';\nimport { slimTask } from '../utils/slim.js';\n\ntype ListTasksFlags = {\n status?: string;\n assignee?: string;\n limit?: number;\n page?: number;\n closed?: boolean;\n json?: boolean;\n full?: boolean;\n};\n\nexport default defineCommand({\n id: 'clickup:list.tasks',\n description: 'List tasks in a specific list',\n\n handler: {\n async execute(ctx: PluginContextV3, input: CLIInput<ListTasksFlags>) {\n const [listId] = input.argv;\n if (!listId) {\n validationError(ctx, 'List ID is required', 'Usage: kb clickup list tasks <listId> (get IDs via `kb clickup workspace`)', input.flags.json);\n return { ok: false, error: 'Command failed', result: null };\n }\n\n try {\n const tasks = await getListTasks(requireApiKey(), listId, {\n statuses: input.flags.status ? input.flags.status.split(',') : undefined,\n assignees: input.flags.assignee ? input.flags.assignee.split(',') : undefined,\n limit: input.flags.limit ?? 50,\n page: input.flags.page ?? 0,\n include_closed: input.flags.closed,\n });\n\n if (input.flags.json) {\n ctx.ui?.json?.(input.flags.full ? tasks : tasks.map(slimTask));\n return { ok: true, result: tasks };\n }\n\n if (!tasks.length) {\n ctx.ui?.info?.('No tasks found.');\n return { ok: true, result: tasks };\n }\n\n ctx.ui?.table?.(\n tasks.map(task => ({\n ID: task.id,\n Name: task.name,\n Status: task.status.status,\n Priority: task.priority?.priority ?? '–',\n Assignees: task.assignees.map(a => a.username).join(', ') || '–',\n })),\n [\n { header: 'ID', key: 'ID' },\n { header: 'Name', key: 'Name' },\n { header: 'Status', key: 'Status' },\n { header: 'Priority', key: 'Priority' },\n { header: 'Assignees', key: 'Assignees' },\n ],\n );\n\n return { ok: true, result: tasks };\n } catch (err) {\n handleError(ctx, err, input.flags.json);\n return { ok: false, error: 'Command failed', result: null };\n }\n },\n },\n});\n"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utils/error.ts","../../src/commands/list-update.ts"],"names":[],"mappings":"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","file":"list-update.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 { ok: false, error: 'Command failed', 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 { defineCommand, type CLIInput, type PluginContextV3 } from '@kb-labs/sdk';\nimport { requireApiKey, updateList } from '@kb-labs/clickup-core';\nimport { handleError, validationError } from '../utils/error.js';\n\ntype ListUpdateFlags = {\n name?: string;\n json?: boolean;\n full?: boolean;\n 'dry-run'?: boolean;\n};\n\nexport default defineCommand({\n id: 'clickup:list.update',\n description: 'Update a list',\n\n handler: {\n async intent(_ctx: PluginContextV3, input: CLIInput<ListUpdateFlags>) {\n const [listId] = input.argv;\n const skipKeys = new Set(['json', 'full', 'dry-run']);\n const changes = Object.entries(input.flags)\n .filter(([k, v]) => !skipKeys.has(k) && v !== undefined)\n .map(([k, v]) => `${k}=${JSON.stringify(v)}`);\n return {\n summary: `Update list ${listId ?? '(unknown)'}`,\n operations: [{ type: 'update' as const, resource: 'list', details: { listId, changes } }],\n };\n },\n\n async execute(ctx: PluginContextV3, input: CLIInput<ListUpdateFlags>) {\n const listId = input.argv[0] as string | undefined;\n if (!listId) {\n validationError(ctx, 'listId is required', 'Usage: kb clickup list update <listId> --name \"new name\"', input.flags.json);\n return { ok: false, error: 'Command failed', result: null };\n }\n\n try {\n const list = await updateList(requireApiKey(), listId, { name: input.flags.name });\n\n if (input.flags.json) {\n ctx.ui?.json?.(input.flags.full ? list : { id: list.id, name: list.name });\n } else {\n ctx.ui?.success?.('List updated', {\n sections: [{ items: [`id: ${list.id}`, `name: ${list.name}`] }],\n });\n }\n\n return { ok: true, result: list };\n } catch (err) {\n handleError(ctx, err, input.flags.json);\n return { ok: false, error: 'Command failed', result: null };\n }\n },\n },\n});\n"]}
1
+ {"version":3,"sources":["../../../home/runner/work/kb-labs/kb-labs/plugins/clickup/entry/src/utils/error.ts","../../../home/runner/work/kb-labs/kb-labs/plugins/clickup/entry/src/commands/list-update.ts"],"names":[],"mappings":"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","file":"list-update.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 { ok: false, error: 'Command failed', 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 { defineCommand, type CLIInput, type PluginContextV3 } from '@kb-labs/sdk';\nimport { requireApiKey, updateList } from '@kb-labs/clickup-core';\nimport { handleError, validationError } from '../utils/error.js';\n\ntype ListUpdateFlags = {\n name?: string;\n json?: boolean;\n full?: boolean;\n 'dry-run'?: boolean;\n};\n\nexport default defineCommand({\n id: 'clickup:list.update',\n description: 'Update a list',\n\n handler: {\n async intent(_ctx: PluginContextV3, input: CLIInput<ListUpdateFlags>) {\n const [listId] = input.argv;\n const skipKeys = new Set(['json', 'full', 'dry-run']);\n const changes = Object.entries(input.flags)\n .filter(([k, v]) => !skipKeys.has(k) && v !== undefined)\n .map(([k, v]) => `${k}=${JSON.stringify(v)}`);\n return {\n summary: `Update list ${listId ?? '(unknown)'}`,\n operations: [{ type: 'update' as const, resource: 'list', details: { listId, changes } }],\n };\n },\n\n async execute(ctx: PluginContextV3, input: CLIInput<ListUpdateFlags>) {\n const listId = input.argv[0] as string | undefined;\n if (!listId) {\n validationError(ctx, 'listId is required', 'Usage: kb clickup list update <listId> --name \"new name\"', input.flags.json);\n return { ok: false, error: 'Command failed', result: null };\n }\n\n try {\n const list = await updateList(requireApiKey(), listId, { name: input.flags.name });\n\n if (input.flags.json) {\n ctx.ui?.json?.(input.flags.full ? list : { id: list.id, name: list.name });\n } else {\n ctx.ui?.success?.('List updated', {\n sections: [{ items: [`id: ${list.id}`, `name: ${list.name}`] }],\n });\n }\n\n return { ok: true, result: list };\n } catch (err) {\n handleError(ctx, err, input.flags.json);\n return { ok: false, error: 'Command failed', result: null };\n }\n },\n },\n});\n"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utils/error.ts","../../src/commands/space-create.ts"],"names":[],"mappings":"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","file":"space-create.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 { ok: false, error: 'Command failed', 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 { defineCommand, type CLIInput, type PluginContextV3 } from '@kb-labs/sdk';\nimport { requireApiKey, requireTeamId, createSpace } from '@kb-labs/clickup-core';\nimport { handleError, validationError } from '../utils/error.js';\n\ntype SpaceCreateFlags = {\n name: string;\n color?: string;\n private?: boolean;\n json?: boolean;\n full?: boolean;\n 'dry-run'?: boolean;\n};\n\nexport default defineCommand({\n id: 'clickup:space.create',\n description: 'Create a new space',\n\n handler: {\n async intent(_ctx: PluginContextV3, input: CLIInput<SpaceCreateFlags>) {\n const { name } = input.flags;\n return {\n summary: `Create space \"${name ?? '(unnamed)'}\"`,\n operations: [{ type: 'create' as const, resource: 'space', details: { name } }],\n };\n },\n\n async execute(ctx: PluginContextV3, input: CLIInput<SpaceCreateFlags>) {\n const { name, color, json, full } = input.flags;\n if (!name) {\n validationError(ctx, '--name is required', undefined, json);\n return { ok: false, error: 'Command failed', result: null };\n }\n\n try {\n const space = await createSpace(requireApiKey(), requireTeamId(), {\n name,\n color,\n private: input.flags.private ?? false,\n });\n\n if (json) {\n ctx.ui?.json?.(full ? space : { id: space.id, name: space.name });\n } else {\n ctx.ui?.success?.('Space created', {\n sections: [{ items: [`id: ${space.id}`, `name: ${space.name}`] }],\n });\n }\n\n return { ok: true, result: space };\n } catch (err) {\n handleError(ctx, err, json);\n return { ok: false, error: 'Command failed', result: null };\n }\n },\n },\n});\n"]}
1
+ {"version":3,"sources":["../../../home/runner/work/kb-labs/kb-labs/plugins/clickup/entry/src/utils/error.ts","../../../home/runner/work/kb-labs/kb-labs/plugins/clickup/entry/src/commands/space-create.ts"],"names":[],"mappings":"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","file":"space-create.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 { ok: false, error: 'Command failed', 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 { defineCommand, type CLIInput, type PluginContextV3 } from '@kb-labs/sdk';\nimport { requireApiKey, requireTeamId, createSpace } from '@kb-labs/clickup-core';\nimport { handleError, validationError } from '../utils/error.js';\n\ntype SpaceCreateFlags = {\n name: string;\n color?: string;\n private?: boolean;\n json?: boolean;\n full?: boolean;\n 'dry-run'?: boolean;\n};\n\nexport default defineCommand({\n id: 'clickup:space.create',\n description: 'Create a new space',\n\n handler: {\n async intent(_ctx: PluginContextV3, input: CLIInput<SpaceCreateFlags>) {\n const { name } = input.flags;\n return {\n summary: `Create space \"${name ?? '(unnamed)'}\"`,\n operations: [{ type: 'create' as const, resource: 'space', details: { name } }],\n };\n },\n\n async execute(ctx: PluginContextV3, input: CLIInput<SpaceCreateFlags>) {\n const { name, color, json, full } = input.flags;\n if (!name) {\n validationError(ctx, '--name is required', undefined, json);\n return { ok: false, error: 'Command failed', result: null };\n }\n\n try {\n const space = await createSpace(requireApiKey(), requireTeamId(), {\n name,\n color,\n private: input.flags.private ?? false,\n });\n\n if (json) {\n ctx.ui?.json?.(full ? space : { id: space.id, name: space.name });\n } else {\n ctx.ui?.success?.('Space created', {\n sections: [{ items: [`id: ${space.id}`, `name: ${space.name}`] }],\n });\n }\n\n return { ok: true, result: space };\n } catch (err) {\n handleError(ctx, err, json);\n return { ok: false, error: 'Command failed', result: null };\n }\n },\n },\n});\n"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utils/error.ts","../../src/commands/space-delete.ts"],"names":[],"mappings":"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","file":"space-delete.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 { ok: false, error: 'Command failed', 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 { defineCommand, type CLIInput, type PluginContextV3 } from '@kb-labs/sdk';\nimport { requireApiKey, deleteSpace } from '@kb-labs/clickup-core';\nimport { handleError, validationError } from '../utils/error.js';\n\ntype SpaceDeleteFlags = {\n force?: boolean;\n json?: boolean;\n 'dry-run'?: boolean;\n};\n\nexport default defineCommand({\n id: 'clickup:space.delete',\n description: 'Delete a space',\n\n handler: {\n async intent(_ctx: PluginContextV3, input: CLIInput<SpaceDeleteFlags>) {\n const [spaceId] = input.argv;\n return {\n summary: `Delete space ${spaceId ?? '(unknown)'}`,\n operations: [{ type: 'delete' as const, resource: 'space', details: { spaceId } }],\n };\n },\n\n async execute(ctx: PluginContextV3, input: CLIInput<SpaceDeleteFlags>) {\n const spaceId = input.argv[0] as string | undefined;\n if (!spaceId) {\n validationError(ctx, 'spaceId is required', 'Usage: kb clickup space delete <spaceId> --force', input.flags.json);\n return { ok: false, error: 'Command failed', result: null };\n }\n if (!input.flags.force) {\n validationError(ctx, `--force is required to delete space ${spaceId}`, 'Add --force to confirm deletion', input.flags.json);\n return { ok: false, error: 'Command failed', result: null };\n }\n\n try {\n await deleteSpace(requireApiKey(), spaceId);\n\n if (input.flags.json) {\n ctx.ui?.json?.({ ok: true, deleted: true, spaceId });\n } else {\n ctx.ui?.success?.(`Deleted space ${spaceId}`);\n }\n\n return { ok: true, result: { deleted: true, spaceId } };\n } catch (err) {\n handleError(ctx, err, input.flags.json);\n return { ok: false, error: 'Command failed', result: null };\n }\n },\n },\n});\n"]}
1
+ {"version":3,"sources":["../../../home/runner/work/kb-labs/kb-labs/plugins/clickup/entry/src/utils/error.ts","../../../home/runner/work/kb-labs/kb-labs/plugins/clickup/entry/src/commands/space-delete.ts"],"names":[],"mappings":"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","file":"space-delete.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 { ok: false, error: 'Command failed', 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 { defineCommand, type CLIInput, type PluginContextV3 } from '@kb-labs/sdk';\nimport { requireApiKey, deleteSpace } from '@kb-labs/clickup-core';\nimport { handleError, validationError } from '../utils/error.js';\n\ntype SpaceDeleteFlags = {\n force?: boolean;\n json?: boolean;\n 'dry-run'?: boolean;\n};\n\nexport default defineCommand({\n id: 'clickup:space.delete',\n description: 'Delete a space',\n\n handler: {\n async intent(_ctx: PluginContextV3, input: CLIInput<SpaceDeleteFlags>) {\n const [spaceId] = input.argv;\n return {\n summary: `Delete space ${spaceId ?? '(unknown)'}`,\n operations: [{ type: 'delete' as const, resource: 'space', details: { spaceId } }],\n };\n },\n\n async execute(ctx: PluginContextV3, input: CLIInput<SpaceDeleteFlags>) {\n const spaceId = input.argv[0] as string | undefined;\n if (!spaceId) {\n validationError(ctx, 'spaceId is required', 'Usage: kb clickup space delete <spaceId> --force', input.flags.json);\n return { ok: false, error: 'Command failed', result: null };\n }\n if (!input.flags.force) {\n validationError(ctx, `--force is required to delete space ${spaceId}`, 'Add --force to confirm deletion', input.flags.json);\n return { ok: false, error: 'Command failed', result: null };\n }\n\n try {\n await deleteSpace(requireApiKey(), spaceId);\n\n if (input.flags.json) {\n ctx.ui?.json?.({ ok: true, deleted: true, spaceId });\n } else {\n ctx.ui?.success?.(`Deleted space ${spaceId}`);\n }\n\n return { ok: true, result: { deleted: true, spaceId } };\n } catch (err) {\n handleError(ctx, err, input.flags.json);\n return { ok: false, error: 'Command failed', result: null };\n }\n },\n },\n});\n"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utils/error.ts","../../src/commands/space-update.ts"],"names":[],"mappings":"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","file":"space-update.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 { ok: false, error: 'Command failed', 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 { defineCommand, type CLIInput, type PluginContextV3 } from '@kb-labs/sdk';\nimport { requireApiKey, updateSpace } from '@kb-labs/clickup-core';\nimport { handleError, validationError } from '../utils/error.js';\n\ntype SpaceUpdateFlags = {\n name?: string;\n color?: string;\n json?: boolean;\n full?: boolean;\n 'dry-run'?: boolean;\n};\n\nexport default defineCommand({\n id: 'clickup:space.update',\n description: 'Update a space',\n\n handler: {\n async intent(_ctx: PluginContextV3, input: CLIInput<SpaceUpdateFlags>) {\n const [spaceId] = input.argv;\n const skipKeys = new Set(['json', 'full', 'dry-run']);\n const changes = Object.entries(input.flags)\n .filter(([k, v]) => !skipKeys.has(k) && v !== undefined)\n .map(([k, v]) => `${k}=${JSON.stringify(v)}`);\n return {\n summary: `Update space ${spaceId ?? '(unknown)'}`,\n operations: [{ type: 'update' as const, resource: 'space', details: { spaceId, changes } }],\n };\n },\n\n async execute(ctx: PluginContextV3, input: CLIInput<SpaceUpdateFlags>) {\n const spaceId = input.argv[0] as string | undefined;\n if (!spaceId) {\n validationError(ctx, 'spaceId is required', 'Usage: kb clickup space update <spaceId> --name \"new name\"', input.flags.json);\n return { ok: false, error: 'Command failed', result: null };\n }\n\n const { name, color, json, full } = input.flags;\n\n try {\n const space = await updateSpace(requireApiKey(), spaceId, { name, color });\n\n if (json) {\n ctx.ui?.json?.(full ? space : { id: space.id, name: space.name });\n } else {\n ctx.ui?.success?.('Space updated', {\n sections: [{ items: [`id: ${space.id}`, `name: ${space.name}`] }],\n });\n }\n\n return { ok: true, result: space };\n } catch (err) {\n handleError(ctx, err, json);\n return { ok: false, error: 'Command failed', result: null };\n }\n },\n },\n});\n"]}
1
+ {"version":3,"sources":["../../../home/runner/work/kb-labs/kb-labs/plugins/clickup/entry/src/utils/error.ts","../../../home/runner/work/kb-labs/kb-labs/plugins/clickup/entry/src/commands/space-update.ts"],"names":[],"mappings":"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","file":"space-update.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 { ok: false, error: 'Command failed', 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 { defineCommand, type CLIInput, type PluginContextV3 } from '@kb-labs/sdk';\nimport { requireApiKey, updateSpace } from '@kb-labs/clickup-core';\nimport { handleError, validationError } from '../utils/error.js';\n\ntype SpaceUpdateFlags = {\n name?: string;\n color?: string;\n json?: boolean;\n full?: boolean;\n 'dry-run'?: boolean;\n};\n\nexport default defineCommand({\n id: 'clickup:space.update',\n description: 'Update a space',\n\n handler: {\n async intent(_ctx: PluginContextV3, input: CLIInput<SpaceUpdateFlags>) {\n const [spaceId] = input.argv;\n const skipKeys = new Set(['json', 'full', 'dry-run']);\n const changes = Object.entries(input.flags)\n .filter(([k, v]) => !skipKeys.has(k) && v !== undefined)\n .map(([k, v]) => `${k}=${JSON.stringify(v)}`);\n return {\n summary: `Update space ${spaceId ?? '(unknown)'}`,\n operations: [{ type: 'update' as const, resource: 'space', details: { spaceId, changes } }],\n };\n },\n\n async execute(ctx: PluginContextV3, input: CLIInput<SpaceUpdateFlags>) {\n const spaceId = input.argv[0] as string | undefined;\n if (!spaceId) {\n validationError(ctx, 'spaceId is required', 'Usage: kb clickup space update <spaceId> --name \"new name\"', input.flags.json);\n return { ok: false, error: 'Command failed', result: null };\n }\n\n const { name, color, json, full } = input.flags;\n\n try {\n const space = await updateSpace(requireApiKey(), spaceId, { name, color });\n\n if (json) {\n ctx.ui?.json?.(full ? space : { id: space.id, name: space.name });\n } else {\n ctx.ui?.success?.('Space updated', {\n sections: [{ items: [`id: ${space.id}`, `name: ${space.name}`] }],\n });\n }\n\n return { ok: true, result: space };\n } catch (err) {\n handleError(ctx, err, json);\n return { ok: false, error: 'Command failed', result: null };\n }\n },\n },\n});\n"]}