<!-- source-hash: 84402bbfdf1a37e83bafc681331451ac -->
Resolves ClickUp `custom_item_id` numeric values to human-readable label strings for use in chat-inline cards and activity feeds.

## Key Components

- **`CUSTOM_ITEM_ID`** — Const enum-style object mapping 14 ClickUp standard task type names to their numeric IDs (`1000`–`1014`).
- **`getTaskTypeLabel(customItemId)`** — Returns a display string for a given `custom_item_id`, or `null` for unknown IDs so callers can fall back to a generic label.

## Usage Example

```typescript
import { getTaskTypeLabel, CUSTOM_ITEM_ID } from './clickup-task-type-utils'

// Resolve a raw ID from a ClickUp task payload
const label = getTaskTypeLabel(task.custom_item_id) ?? 'Task'
console.log(label) // e.g. "Bug", "Epic", "Milestone"

// Use the constant directly when constructing queries or comparisons
if (task.custom_item_id === CUSTOM_ITEM_ID.EPIC) {
  // handle epic-specific logic
}

// null and undefined both resolve gracefully
getTaskTypeLabel(null)      // → null (fall back to "Task")
getTaskTypeLabel(undefined) // → null
getTaskTypeLabel(9999)      // → null (unknown ID)
```

## ID Reference

| Constant | ID | Label |
|---|---|---|
| `TASK` | 1000 | Task |
| `MILESTONE` | 1001 | Milestone |
| `RECURRING` | 1002 | Recurring |
| `SUBTASK` | 1003 | Subtask |
| `FORM` | 1004 | Form |
| `PLAN` | 1006 | Plan |
| `STRATEGY` | 1007 | Strategy |
| `BUG` | 1008 | Bug |
| `REQUEST` | 1009 | Request |
| `FEATURE` | 1010 | Feature |
| `STORY` | 1011 | Story |
| `EPIC` | 1012 | Epic |
| `COMPONENT` | 1013 | Component |
| `INITIATIVE` | 1014 | Initiative |

> `null` input and unrecognized IDs both return `null` — callers should default to `"Task"` as the fallback affordance.