packages/desktop/apps/electron/resources/docs/statuses.md
Session statuses represent workflow states. Each workspace has its own status configuration.
~/.craft-agent/workspaces/{id}/statuses/config.json~/.craft-agent/workspaces/{id}/statuses/icons/| ID | Label | Default Color | Category | Type |
|---|---|---|---|---|
backlog | Backlog | foreground/50 | open | Default |
todo | Todo | foreground/50 | open | Fixed |
needs-review | Needs Review | info | open | Default |
done | Done | accent | closed | Fixed |
cancelled | Cancelled | foreground/50 | closed | Fixed |
Note: Color is optional. When omitted, the design system default is used.
Colors use the EntityColor type — either a system color string or a custom color object.
Auto-adapt to light/dark theme via CSS variables. No hex values needed.
| Name | Appearance | Example |
|---|---|---|
"accent" | Purple (brand) | "accent" |
"info" | Amber | "info" |
"success" | Green | "success" |
"destructive" | Red | "destructive" |
"foreground" | Text color | "foreground" |
Add /opacity (integer 0–100) for transparency: "foreground/50", "info/80".
Object with explicit CSS color values for light and dark themes:
{ "light": "#EF4444", "dark": "#F87171" }
If dark is omitted, it's auto-derived from light (brightened ~30%).
Supported CSS color formats for light/dark values:
| Format | Example |
|---|---|
| Hex (3-digit) | "#F00" |
| Hex (6-digit) | "#EF4444" |
| Hex (8-digit, with alpha) | "#EF444480" |
| OKLCH | "oklch(0.7 0.15 20)" |
| RGB | "rgb(239, 68, 68)" |
| HSL | "hsl(0, 84%, 60%)" |
"red", "blue") are not supported — use hex or system colors"text-red-500") are not valid — use system color names directly# prefix ("EF4444") is invalid — always include #"foreground/50" not "foreground/0.5")isFixed: true): Cannot be deleted or renamed. Required statuses: todo, done, cancelled.isDefault: true): Ships with app, can be modified but not deleted.isFixed: false, isDefault: false): User-created, fully editable and deletable.{
"version": 1,
"statuses": [
{
"id": "todo",
"label": "Todo",
"category": "open",
"isFixed": true,
"isDefault": false,
"order": 0
}
],
"defaultStatusId": "todo"
}
Note: The icon field is optional. Default statuses use auto-discovered SVG files from statuses/icons/{id}.svg.
| Property | Type | Description |
|---|---|---|
id | string | Unique slug (lowercase, hyphens) |
label | string | Display name |
color | string? | Optional color (hex or Tailwind class). Uses design system default if omitted. |
icon | string? | Optional emoji (e.g., "🔥") or URL. Omit to use auto-discovered file. |
category | "open" | "closed" | Inbox vs archive |
isFixed | boolean | Cannot delete/rename if true |
isDefault | boolean | Ships with app, cannot delete |
order | number | Display order (lower = first) |
Icon resolution priority:
statuses/icons/{id}.svg (or .png, .jpg, .jpeg)icon field is an emoji string (e.g., "🔥")File-based icons (recommended for default statuses):
statuses/icons/{status-id}.svgstatuses/icons/blocked.svg for status ID blockedEmoji icons (quick and easy):
"icon": "🔥"
URL icons (auto-downloaded):
"icon": "https://example.com/icon.svg"
URLs are automatically downloaded to statuses/icons/{id}.{ext}.
⚠️ Icon Sourcing Rules:
Edit the workspace's statuses/config.json:
{
"id": "blocked",
"label": "Blocked",
"color": "destructive",
"icon": "🚫",
"category": "open",
"isFixed": false,
"isDefault": false,
"order": 3
}
Or with a custom hex color:
{
"id": "blocked",
"label": "Blocked",
"color": { "light": "#EF4444", "dark": "#F87171" },
"icon": "🚫",
"category": "open",
"isFixed": false,
"isDefault": false,
"order": 3
}
Adjust order values for existing statuses as needed.
currentColor for stroke/fill (theming support)todoIMPORTANT: Always validate after creating or editing statuses:
config_validate({ target: "statuses" })
This validates:
todo, done, cancelled)defaultStatusId references an existing statusInvalid configs will fall back to defaults at runtime, but validation catches issues before they cause problems.