@cwim/kanban 1.1.18 → 1.1.19

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,270 +1,270 @@
1
- # CWIM Kanban
2
-
3
- > Your AI's long-term memory. Visualized.
4
-
5
- **CWIM Kanban gives your AI agent a persistent memory layer.** It remembers what you were working on, recalls context automatically, and shows you everything on a live dashboard.
6
-
7
- Works with **Claude Code** and **OpenCode**.
8
-
9
- No more "what were we doing again?" between sessions.
10
-
11
- ## How It Works
12
-
13
- ```
14
- User: "Continue the auth refactor"
15
- |
16
- Claude: task_recall("auth refactor")
17
- |
18
- Memory: "Found: [in-progress] Refactor auth middleware"
19
- |
20
- Claude: "Ah yes, we were extracting JWT validation..."
21
- ```
22
-
23
- As Claude works through complex tasks, it creates cards, appends notes, and moves them across columns. You watch progress unfold in real time on the board. When you return tomorrow, Claude recalls exactly where you left off.
24
-
25
- ## Installation
26
-
27
- ```bash
28
- # Install globally
29
- npm install -g @cwim/kanban
30
-
31
- # Or run directly with npx
32
- npx @cwim/kanban
33
-
34
- # Short command (after global install)
35
- kanban
36
- ```
37
-
38
- ## Quick Start
39
-
40
- ```bash
41
- # Start the dashboard
42
- kanban
43
- ```
44
-
45
- ### Claude Code Setup
46
-
47
- Add to your Claude Code MCP config (`~/.claude/claude.json`):
48
-
49
- ```json
50
- {
51
- "mcpServers": {
52
- "kanban": {
53
- "command": "npx",
54
- "args": ["@cwim/kanban", "mcp"]
55
- }
56
- }
57
- }
58
- ```
59
-
60
- ### OpenCode Setup
61
-
62
- Add to your OpenCode config (`opencode.json` in project root or `~/.config/opencode/opencode.json`):
63
-
64
- ```json
65
- {
66
- "$schema": "https://opencode.ai/config.json",
67
- "mcp": {
68
- "kanban": {
69
- "type": "local",
70
- "command": ["npx", "-y", "@cwim/kanban", "mcp"],
71
- "enabled": true
72
- }
73
- }
74
- }
75
- ```
76
-
77
- ## Making Your AI Agent Use It
78
-
79
- Just installing the MCP isn't enough — your AI agent needs instructions to use it.
80
-
81
- ### For Claude Code
82
-
83
- Add a `CLAUDE.md` file to your project root:
84
-
85
- ```markdown
86
- ## Task Tracking
87
- Use the cwim-kanban MCP to track all work in this project.
88
-
89
- ### Workflow
90
- 1. **Before starting**: Call `task_recall` with what you're about to work on
91
- 2. **Starting a task**: Create or move to `in-progress`
92
- 3. **Making progress**: Append notes with discoveries, decisions, or blockers
93
- 4. **Finishing**: Move to `done` and append a summary note
94
- 5. **Blocked**: Move to `blocked` with a note explaining why
95
-
96
- ### Rules
97
- - Always check for existing tasks before creating new ones
98
- - **One task per unit of work** - If a request involves multiple distinct steps (e.g., "fix auth and update docs"), create separate tasks for each step instead of one combined task
99
- - **Always verify the active session before creating tasks** - Call `session_list` first, confirm the active session matches the current project, and call `session_switch` if it doesn't
100
- - Use tags consistently (e.g., "bug", "feature", "refactor", "docs")
101
- - Append notes liberally - they build context for future sessions
102
- - Move tasks to "blocked" immediately when stuck, with explanation
103
- - Keep task titles concise but descriptive
104
- ```
105
-
106
- This makes the behavior automatic — no need to ask Claude every session.
107
-
108
- ### For OpenCode
109
-
110
- Add an `AGENTS.md` file to your project root (or add to your existing one):
111
-
112
- ```markdown
113
- ## Task Tracking
114
- Use the cwim-kanban MCP to track all work in this project.
115
-
116
- ### Workflow
117
- 1. **Before starting**: Call `task_recall` with what you're about to work on
118
- 2. **Starting a task**: Create or move to `in-progress`
119
- 3. **Making progress**: Append notes with discoveries, decisions, or blockers
120
- 4. **Finishing**: Move to `done` and append a summary note
121
- 5. **Blocked**: Move to `blocked` with a note explaining why
122
-
123
- ### Rules
124
- - Always check for existing tasks before creating new ones
125
- - **One task per unit of work** - If a request involves multiple distinct steps (e.g., "fix auth and update docs"), create separate tasks for each step instead of one combined task
126
- - **Always verify the active session before creating tasks** - Call `session_list` first, confirm the active session matches the current project, and call `session_switch` if it doesn't
127
- - Use tags consistently (e.g., "bug", "feature", "refactor", "docs")
128
- - Append notes liberally - they build context for future sessions
129
- - Move tasks to "blocked" immediately when stuck, with explanation
130
- - Keep task titles concise but descriptive
131
- ```
132
-
133
- This makes the behavior automatic for OpenCode sessions as well.
134
-
135
- ## Memory Features
136
-
137
- ### Smart Context Recall
138
-
139
- Before starting complex work, Claude can recall relevant past tasks:
140
-
141
- ```
142
- task_recall({ context: "refactoring auth middleware" })
143
- ```
144
-
145
- Returns the most relevant tasks based on keyword matching, recency, and status. No more "what were we doing again?"
146
-
147
- ### Append Notes Without Overwriting
148
-
149
- Build context over time without losing previous work:
150
-
151
- ```
152
- task_append_note({
153
- id: "tf-abc123",
154
- note: "Discovered edge case with JWT refresh tokens"
155
- })
156
- ```
157
-
158
- Each note is timestamped and preserved. The task grows smarter as you work.
159
-
160
- ### Session Isolation
161
-
162
- Each project gets its own memory space. Work on multiple projects without context bleeding:
163
-
164
- - Auto-detected from `~/.claude/projects/` (Claude Code) and `~/.config/opencode/` (OpenCode)
165
- - Switch between sessions via dashboard, CLI, or MCP
166
- - "Independent Mode" for non-AI work
167
-
168
- ### Keyword Search
169
-
170
- Find anything instantly across your entire task history:
171
-
172
- ```
173
- task_list({ query: "auth" })
174
- ```
175
-
176
- ## Visual Dashboard
177
-
178
- While your AI works in the background, watch progress in real time:
179
-
180
- - **Real-time updates** - Board refreshes every 2 seconds
181
- - **4 columns** - To Do, In Progress, Done, Blocked
182
- - **Session switching** - Dropdown to browse projects
183
- - **Tag support** - Categorize tasks with badges
184
- - **Source tracking** - Distinguish AI-created vs manual tasks
185
- - **Keyboard shortcuts** - `r` to refresh, `1-4` to filter columns
186
-
187
- ## MCP Tools
188
-
189
- | Tool | Purpose |
190
- |------|---------|
191
- | `task_recall` | Intelligently recall relevant task context |
192
- | `task_create` | Create a new task card |
193
- | `task_append_note` | Append timestamped note to a task |
194
- | `task_update` | Edit task title, description, tags |
195
- | `task_move` | Move a task to another column |
196
- | `task_delete` | Remove a task |
197
- | `task_list` | List tasks (optionally filtered/search) |
198
- | `task_get` | Show details of a specific task |
199
- | `session_list` | List all available sessions |
200
- | `session_switch` | Switch to a different session |
201
-
202
- ## CLI Commands
203
-
204
- ### Launch Dashboard
205
- ```bash
206
- kanban # Start dashboard and open browser
207
- kanban --port 8080 # Custom port
208
- kanban --no-open # Don't auto-open browser
209
- ```
210
-
211
- ### Memory Operations
212
- ```bash
213
- kanban recall "auth" # Recall relevant tasks
214
- kanban note tf-abc123 "Edge case found" # Append note
215
- ```
216
-
217
- ### Task Management
218
- ```bash
219
- kanban add "Fix auth" -d "JWT validation" -t bug,auth
220
- kanban list --query "auth"
221
- kanban move tf-abc123 done
222
- kanban show tf-abc123
223
- kanban remove tf-abc123
224
- ```
225
-
226
- ### Session Management
227
- ```bash
228
- kanban sessions # List all sessions
229
- kanban switch my-project # Change active session
230
- ```
231
-
232
- ## Data Storage
233
-
234
- All data stored locally in `~/.kanban/sessions/`:
235
-
236
- ```
237
- ~/.kanban/
238
- ├── sessions/
239
- │ ├── my-project/
240
- │ │ └── tasks.json
241
- │ └── independent/
242
- │ └── tasks.json
243
- └── active-session.json
244
- ```
245
-
246
- - **Local-first** - No cloud, no accounts, no network required
247
- - **Human-readable** - Plain JSON you can edit directly
248
- - **Portable** - Back up or version-control your `~/.kanban/` directory
249
-
250
- ## Architecture
251
-
252
- ```
253
- Claude Code → MCP Server (stdio) → session tasks.json ← HTTP Server ← Dashboard UI
254
- | |
255
- task_recall, append_note, etc. polling /api/tasks
256
- ```
257
-
258
- - MCP Server and HTTP Server are separate processes
259
- - They communicate through per-session JSON files
260
- - Dashboard polls for updates every 2 seconds
261
- - Session switching persisted in `~/.kanban/active-session.json`
262
-
263
- ## Requirements
264
-
265
- - Node.js 18+
266
- - Claude Code or OpenCode (optional - dashboard works independently)
267
-
268
- ## License
269
-
270
- MIT
1
+ # CWIM Kanban
2
+
3
+ > Your AI's long-term memory. Visualized.
4
+
5
+ **CWIM Kanban gives your AI agent a persistent memory layer.** It remembers what you were working on, recalls context automatically, and shows you everything on a live dashboard.
6
+
7
+ Works with **Claude Code** and **OpenCode**.
8
+
9
+ No more "what were we doing again?" between sessions.
10
+
11
+ ## How It Works
12
+
13
+ ```
14
+ User: "Continue the auth refactor"
15
+ |
16
+ Claude: task_recall("auth refactor")
17
+ |
18
+ Memory: "Found: [in-progress] Refactor auth middleware"
19
+ |
20
+ Claude: "Ah yes, we were extracting JWT validation..."
21
+ ```
22
+
23
+ As Claude works through complex tasks, it creates cards, appends notes, and moves them across columns. You watch progress unfold in real time on the board. When you return tomorrow, Claude recalls exactly where you left off.
24
+
25
+ ## Installation
26
+
27
+ ```bash
28
+ # Install globally
29
+ npm install -g @cwim/kanban
30
+
31
+ # Or run directly with npx
32
+ npx @cwim/kanban
33
+
34
+ # Short command (after global install)
35
+ kanban
36
+ ```
37
+
38
+ ## Quick Start
39
+
40
+ ```bash
41
+ # Start the dashboard
42
+ kanban
43
+ ```
44
+
45
+ ### Claude Code Setup
46
+
47
+ Add to your Claude Code MCP config (`~/.claude/claude.json`):
48
+
49
+ ```json
50
+ {
51
+ "mcpServers": {
52
+ "kanban": {
53
+ "command": "npx",
54
+ "args": ["@cwim/kanban", "mcp"]
55
+ }
56
+ }
57
+ }
58
+ ```
59
+
60
+ ### OpenCode Setup
61
+
62
+ Add to your OpenCode config (`opencode.json` in project root or `~/.config/opencode/opencode.json`):
63
+
64
+ ```json
65
+ {
66
+ "$schema": "https://opencode.ai/config.json",
67
+ "mcp": {
68
+ "kanban": {
69
+ "type": "local",
70
+ "command": ["npx", "-y", "@cwim/kanban", "mcp"],
71
+ "enabled": true
72
+ }
73
+ }
74
+ }
75
+ ```
76
+
77
+ ## Making Your AI Agent Use It
78
+
79
+ Just installing the MCP isn't enough — your AI agent needs instructions to use it.
80
+
81
+ ### For Claude Code
82
+
83
+ Add a `CLAUDE.md` file to your project root:
84
+
85
+ ```markdown
86
+ ## Task Tracking
87
+ Use the cwim-kanban MCP to track all work in this project.
88
+
89
+ ### Workflow
90
+ 1. **Before starting**: Call `task_recall` with what you're about to work on
91
+ 2. **Starting a task**: Create or move to `in-progress`
92
+ 3. **Making progress**: Append notes with discoveries, decisions, or blockers
93
+ 4. **Finishing**: Move to `done` and append a summary note
94
+ 5. **Blocked**: Move to `blocked` with a note explaining why
95
+
96
+ ### Rules
97
+ - Always check for existing tasks before creating new ones
98
+ - **One task per unit of work** - If a request involves multiple distinct steps (e.g., "fix auth and update docs"), create separate tasks for each step instead of one combined task
99
+ - **Always verify the active session before creating tasks** - Call `session_list` first, confirm the active session matches the current project, and call `session_switch` if it doesn't
100
+ - Use tags consistently (e.g., "bug", "feature", "refactor", "docs")
101
+ - Append notes liberally - they build context for future sessions
102
+ - Move tasks to "blocked" immediately when stuck, with explanation
103
+ - Keep task titles concise but descriptive
104
+ ```
105
+
106
+ This makes the behavior automatic — no need to ask Claude every session.
107
+
108
+ ### For OpenCode
109
+
110
+ Add an `AGENTS.md` file to your project root (or add to your existing one):
111
+
112
+ ```markdown
113
+ ## Task Tracking
114
+ Use the cwim-kanban MCP to track all work in this project.
115
+
116
+ ### Workflow
117
+ 1. **Before starting**: Call `task_recall` with what you're about to work on
118
+ 2. **Starting a task**: Create or move to `in-progress`
119
+ 3. **Making progress**: Append notes with discoveries, decisions, or blockers
120
+ 4. **Finishing**: Move to `done` and append a summary note
121
+ 5. **Blocked**: Move to `blocked` with a note explaining why
122
+
123
+ ### Rules
124
+ - Always check for existing tasks before creating new ones
125
+ - **One task per unit of work** - If a request involves multiple distinct steps (e.g., "fix auth and update docs"), create separate tasks for each step instead of one combined task
126
+ - **Always verify the active session before creating tasks** - Call `session_list` first, confirm the active session matches the current project, and call `session_switch` if it doesn't
127
+ - Use tags consistently (e.g., "bug", "feature", "refactor", "docs")
128
+ - Append notes liberally - they build context for future sessions
129
+ - Move tasks to "blocked" immediately when stuck, with explanation
130
+ - Keep task titles concise but descriptive
131
+ ```
132
+
133
+ This makes the behavior automatic for OpenCode sessions as well.
134
+
135
+ ## Memory Features
136
+
137
+ ### Smart Context Recall
138
+
139
+ Before starting complex work, Claude can recall relevant past tasks:
140
+
141
+ ```
142
+ task_recall({ context: "refactoring auth middleware" })
143
+ ```
144
+
145
+ Returns the most relevant tasks based on keyword matching, recency, and status. No more "what were we doing again?"
146
+
147
+ ### Append Notes Without Overwriting
148
+
149
+ Build context over time without losing previous work:
150
+
151
+ ```
152
+ task_append_note({
153
+ id: "tf-abc123",
154
+ note: "Discovered edge case with JWT refresh tokens"
155
+ })
156
+ ```
157
+
158
+ Each note is timestamped and preserved. The task grows smarter as you work.
159
+
160
+ ### Session Isolation
161
+
162
+ Each project gets its own memory space. Work on multiple projects without context bleeding:
163
+
164
+ - Auto-detected from `~/.claude/projects/` (Claude Code) and `~/.config/opencode/` (OpenCode)
165
+ - Switch between sessions via dashboard, CLI, or MCP
166
+ - "Independent Mode" for non-AI work
167
+
168
+ ### Keyword Search
169
+
170
+ Find anything instantly across your entire task history:
171
+
172
+ ```
173
+ task_list({ query: "auth" })
174
+ ```
175
+
176
+ ## Visual Dashboard
177
+
178
+ While your AI works in the background, watch progress in real time:
179
+
180
+ - **Real-time updates** - Board refreshes every 2 seconds
181
+ - **4 columns** - To Do, In Progress, Done, Blocked
182
+ - **Session switching** - Dropdown to browse projects
183
+ - **Tag support** - Categorize tasks with badges
184
+ - **Source tracking** - Distinguish AI-created vs manual tasks
185
+ - **Keyboard shortcuts** - `r` to refresh, `1-4` to filter columns
186
+
187
+ ## MCP Tools
188
+
189
+ | Tool | Purpose |
190
+ |------|---------|
191
+ | `task_recall` | Intelligently recall relevant task context |
192
+ | `task_create` | Create a new task card |
193
+ | `task_append_note` | Append timestamped note to a task |
194
+ | `task_update` | Edit task title, description, tags |
195
+ | `task_move` | Move a task to another column |
196
+ | `task_delete` | Remove a task |
197
+ | `task_list` | List tasks (optionally filtered/search) |
198
+ | `task_get` | Show details of a specific task |
199
+ | `session_list` | List all available sessions |
200
+ | `session_switch` | Switch to a different session |
201
+
202
+ ## CLI Commands
203
+
204
+ ### Launch Dashboard
205
+ ```bash
206
+ kanban # Start dashboard and open browser
207
+ kanban --port 8080 # Custom port
208
+ kanban --no-open # Don't auto-open browser
209
+ ```
210
+
211
+ ### Memory Operations
212
+ ```bash
213
+ kanban recall "auth" # Recall relevant tasks
214
+ kanban note tf-abc123 "Edge case found" # Append note
215
+ ```
216
+
217
+ ### Task Management
218
+ ```bash
219
+ kanban add "Fix auth" -d "JWT validation" -t bug,auth
220
+ kanban list --query "auth"
221
+ kanban move tf-abc123 done
222
+ kanban show tf-abc123
223
+ kanban remove tf-abc123
224
+ ```
225
+
226
+ ### Session Management
227
+ ```bash
228
+ kanban sessions # List all sessions
229
+ kanban switch my-project # Change active session
230
+ ```
231
+
232
+ ## Data Storage
233
+
234
+ All data stored locally in `~/.kanban/sessions/`:
235
+
236
+ ```
237
+ ~/.kanban/
238
+ ├── sessions/
239
+ │ ├── my-project/
240
+ │ │ └── tasks.json
241
+ │ └── independent/
242
+ │ └── tasks.json
243
+ └── active-session.json
244
+ ```
245
+
246
+ - **Local-first** - No cloud, no accounts, no network required
247
+ - **Human-readable** - Plain JSON you can edit directly
248
+ - **Portable** - Back up or version-control your `~/.kanban/` directory
249
+
250
+ ## Architecture
251
+
252
+ ```
253
+ Claude Code → MCP Server (stdio) → session tasks.json ← HTTP Server ← Dashboard UI
254
+ | |
255
+ task_recall, append_note, etc. polling /api/tasks
256
+ ```
257
+
258
+ - MCP Server and HTTP Server are separate processes
259
+ - They communicate through per-session JSON files
260
+ - Dashboard polls for updates every 2 seconds
261
+ - Session switching persisted in `~/.kanban/active-session.json`
262
+
263
+ ## Requirements
264
+
265
+ - Node.js 18+
266
+ - Claude Code or OpenCode (optional - dashboard works independently)
267
+
268
+ ## License
269
+
270
+ MIT
@@ -1 +1 @@
1
- *,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}:root{--surface-0: #0A0A0F;--surface-1: #111118;--surface-2: #16161F;--surface-3: #1A1A24;--surface-4: #1E1E2A;--border-subtle: rgba(255, 255, 255, .04);--border-default: rgba(255, 255, 255, .06);--border-hover: rgba(255, 255, 255, .1);--text-primary: #E8E8F0;--text-secondary: #9CA3AF;--text-muted: #6B7280;--text-subtle: #4B5563;--accent: #22D3EE;--accent-subtle: rgba(34, 211, 238, .1);--shadow-sm: 0 1px 2px rgba(0, 0, 0, .3);--shadow-md: 0 4px 6px -1px rgba(0, 0, 0, .4), 0 2px 4px -1px rgba(0, 0, 0, .2);--shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, .5), 0 4px 6px -2px rgba(0, 0, 0, .3);--shadow-glow: 0 0 0 1px rgba(255, 255, 255, .04)}*{border-color:var(--border-default)}body{background-color:var(--surface-0);color:var(--text-primary);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-family:Inter,ui-sans-serif,system-ui,-apple-system,sans-serif}::-webkit-scrollbar{width:5px;height:5px}::-webkit-scrollbar-track{background:transparent}::-webkit-scrollbar-thumb{background:var(--surface-3);border-radius:10px}::-webkit-scrollbar-thumb:hover{background:var(--surface-4)}.skeleton{background:linear-gradient(90deg,var(--surface-2) 25%,var(--surface-3) 50%,var(--surface-2) 75%);background-size:200% 100%;animation:skeleton-loading 1.5s ease-in-out infinite;border-radius:6px}.skeleton-card{background:linear-gradient(90deg,var(--surface-2) 25%,var(--surface-3) 50%,var(--surface-2) 75%);background-size:200% 100%;animation:skeleton-loading 1.5s ease-in-out infinite;border-radius:6px;height:80px}.\!visible{visibility:visible!important}.visible{visibility:visible}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.inset-0{inset:0}.bottom-3{bottom:.75rem}.bottom-6{bottom:1.5rem}.left-1\/2{left:50%}.right-4{right:1rem}.top-full{top:100%}.z-50{z-index:50}.mb-1{margin-bottom:.25rem}.mb-1\.5{margin-bottom:.375rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.ml-auto{margin-left:auto}.mt-1{margin-top:.25rem}.mt-1\.5{margin-top:.375rem}.line-clamp-2{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2}.block{display:block}.inline-block{display:inline-block}.flex{display:flex}.inline-flex{display:inline-flex}.grid{display:grid}.h-1\.5{height:.375rem}.h-10{height:2.5rem}.h-12{height:3rem}.h-14{height:3.5rem}.h-3{height:.75rem}.h-4{height:1rem}.h-5{height:1.25rem}.h-8{height:2rem}.h-full{height:100%}.h-screen{height:100vh}.max-h-\[60vh\]{max-height:60vh}.min-h-0{min-height:0px}.w-1\.5{width:.375rem}.w-12{width:3rem}.w-20{width:5rem}.w-6{width:1.5rem}.w-64{width:16rem}.w-8{width:2rem}.w-full{width:100%}.min-w-0{min-width:0px}.min-w-\[20px\]{min-width:20px}.min-w-\[280px\]{min-width:280px}.min-w-max{min-width:-moz-max-content;min-width:max-content}.max-w-lg{max-width:32rem}.max-w-sm{max-width:24rem}.flex-1{flex:1 1 0%}.shrink-0{flex-shrink:0}.-translate-x-1\/2{--tw-translate-x: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rotate-180{--tw-rotate: 180deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.cursor-pointer{cursor:pointer}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-center{align-items:center}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-1{gap:.25rem}.gap-1\.5{gap:.375rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-5{gap:1.25rem}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem * var(--tw-space-y-reverse))}.space-y-5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.25rem * var(--tw-space-y-reverse))}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.overflow-y-hidden{overflow-y:hidden}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:1rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:var(--radius)}.rounded-md{border-radius:calc(var(--radius) - 2px)}.rounded-xl{border-radius:calc(var(--radius) + 4px)}.border{border-width:1px}.border-b{border-bottom-width:1px}.border-l-\[3px\]{border-left-width:3px}.border-t{border-top-width:1px}.border-\[\#3D3D5C\]{--tw-border-opacity: 1;border-color:rgb(61 61 92 / var(--tw-border-opacity, 1))}.border-\[var\(--border-default\)\]{border-color:var(--border-default)}.border-\[var\(--border-subtle\)\]{border-color:var(--border-subtle)}.border-l-transparent{border-left-color:transparent}.bg-\[\#0A0A0F\]{--tw-bg-opacity: 1;background-color:rgb(10 10 15 / var(--tw-bg-opacity, 1))}.bg-\[\#1E1E2A\]{--tw-bg-opacity: 1;background-color:rgb(30 30 42 / var(--tw-bg-opacity, 1))}.bg-\[var\(--accent-subtle\)\]{background-color:var(--accent-subtle)}.bg-\[var\(--surface-1\)\]{background-color:var(--surface-1)}.bg-\[var\(--surface-2\)\]{background-color:var(--surface-2)}.bg-\[var\(--surface-3\)\]{background-color:var(--surface-3)}.bg-black\/60{background-color:#0009}.bg-emerald-500{--tw-bg-opacity: 1;background-color:rgb(16 185 129 / var(--tw-bg-opacity, 1))}.p-3{padding:.75rem}.p-4{padding:1rem}.p-5{padding:1.25rem}.px-1{padding-left:.25rem;padding-right:.25rem}.px-1\.5{padding-left:.375rem;padding-right:.375rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-2\.5{padding-left:.625rem;padding-right:.625rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-12{padding-top:3rem;padding-bottom:3rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.pr-4{padding-right:1rem}.pt-0\.5{padding-top:.125rem}.pt-4{padding-top:1rem}.text-left{text-align:left}.text-center{text-align:center}.font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-\[13px\]{font-size:13px}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-medium{font-weight:500}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.leading-relaxed{line-height:1.625}.leading-snug{line-height:1.375}.tracking-\[0\.08em\]{letter-spacing:.08em}.tracking-tight{letter-spacing:-.025em}.tracking-wide{letter-spacing:.025em}.tracking-wider{letter-spacing:.05em}.text-\[\#22D3EE\]{--tw-text-opacity: 1;color:rgb(34 211 238 / var(--tw-text-opacity, 1))}.text-\[\#E8E8F0\]{--tw-text-opacity: 1;color:rgb(232 232 240 / var(--tw-text-opacity, 1))}.text-\[var\(--accent\)\]{color:var(--accent)}.text-\[var\(--text-muted\)\]{color:var(--text-muted)}.text-\[var\(--text-primary\)\]{color:var(--text-primary)}.text-\[var\(--text-secondary\)\]{color:var(--text-secondary)}.text-\[var\(--text-subtle\)\]{color:var(--text-subtle)}.text-emerald-500{--tw-text-opacity: 1;color:rgb(16 185 129 / var(--tw-text-opacity, 1))}.opacity-50{opacity:.5}.shadow-\[var\(--shadow-lg\)\]{--tw-shadow-color: var(--shadow-lg);--tw-shadow: var(--tw-shadow-colored)}.shadow-\[var\(--shadow-sm\)\]{--tw-shadow-color: var(--shadow-sm);--tw-shadow: var(--tw-shadow-colored)}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.backdrop-blur-sm{--tw-backdrop-blur: blur(4px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-150{transition-duration:.15s}.duration-200{transition-duration:.2s}.ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)}@keyframes enter{0%{opacity:var(--tw-enter-opacity, 1);transform:translate3d(var(--tw-enter-translate-x, 0),var(--tw-enter-translate-y, 0),0) scale3d(var(--tw-enter-scale, 1),var(--tw-enter-scale, 1),var(--tw-enter-scale, 1)) rotate(var(--tw-enter-rotate, 0))}}@keyframes exit{to{opacity:var(--tw-exit-opacity, 1);transform:translate3d(var(--tw-exit-translate-x, 0),var(--tw-exit-translate-y, 0),0) scale3d(var(--tw-exit-scale, 1),var(--tw-exit-scale, 1),var(--tw-exit-scale, 1)) rotate(var(--tw-exit-rotate, 0))}}.duration-150{animation-duration:.15s}.duration-200{animation-duration:.2s}.ease-out{animation-timing-function:cubic-bezier(0,0,.2,1)}@keyframes cardEnter{0%{opacity:0;transform:translateY(6px)}to{opacity:1;transform:translateY(0)}}.animate-card-enter{animation:cardEnter .25s cubic-bezier(.16,1,.3,1) forwards}@keyframes columnFlash{0%{border-left-width:3px;box-shadow:none}30%{border-left-width:5px}to{border-left-width:3px;box-shadow:none}}.animate-column-flash-todo{animation:columnFlash .5s ease-out;border-left-color:#f59e0b;box-shadow:0 0 6px #f59e0b4d}.animate-column-flash-inprogress{animation:columnFlash .5s ease-out;border-left-color:#3b82f6;box-shadow:0 0 6px #3b82f64d}.animate-column-flash-done{animation:columnFlash .5s ease-out;border-left-color:#10b981;box-shadow:0 0 6px #10b9814d}.animate-column-flash-blocked{animation:columnFlash .5s ease-out;border-left-color:#ef4444;box-shadow:0 0 6px #ef44444d}@keyframes toastIn{0%{opacity:0;transform:translateY(16px)}to{opacity:1;transform:translateY(0)}}@keyframes toastOut{0%{opacity:1;transform:translateY(0)}to{opacity:0;transform:translateY(16px)}}.animate-toast-in{animation:toastIn .25s cubic-bezier(.16,1,.3,1) forwards}@keyframes pulseRing{0%{transform:scale(1);opacity:.5}to{transform:scale(2.2);opacity:0}}.animate-pulse-ring{animation:pulseRing 2s ease-out infinite}@keyframes emptyFade{0%{opacity:0}to{opacity:1}}.animate-empty-fade{animation:emptyFade .2s ease forwards}@keyframes skeleton-loading{0%{background-position:200% 0}to{background-position:-200% 0}}.focus-ring{outline:2px solid transparent;outline-offset:2px}.focus-ring:focus-visible{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000);--tw-ring-color: var(--accent);--tw-ring-offset-width: 2px;--tw-ring-offset-color: var(--surface-0)}@keyframes modalIn{0%{opacity:0;transform:scale(.95) translateY(8px)}to{opacity:1;transform:scale(1) translateY(0)}}.animate-modal-in{animation:modalIn .2s cubic-bezier(.16,1,.3,1) forwards}.hover\:-translate-y-0\.5:hover{--tw-translate-y: -.125rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.hover\:bg-\[var\(--surface-3\)\]:hover{background-color:var(--surface-3)}.hover\:bg-\[var\(--surface-4\)\]:hover{background-color:var(--surface-4)}.hover\:text-\[var\(--text-primary\)\]:hover{color:var(--text-primary)}.hover\:shadow-\[var\(--shadow-md\)\]:hover{--tw-shadow-color: var(--shadow-md);--tw-shadow: var(--tw-shadow-colored)}
1
+ *,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}:root{--surface-0: #0A0A0F;--surface-1: #111118;--surface-2: #16161F;--surface-3: #1A1A24;--surface-4: #1E1E2A;--border-subtle: rgba(255, 255, 255, .04);--border-default: rgba(255, 255, 255, .06);--border-hover: rgba(255, 255, 255, .1);--text-primary: #E8E8F0;--text-secondary: #9CA3AF;--text-muted: #6B7280;--text-subtle: #4B5563;--accent: #22D3EE;--accent-subtle: rgba(34, 211, 238, .1);--shadow-sm: 0 1px 2px rgba(0, 0, 0, .3);--shadow-md: 0 4px 6px -1px rgba(0, 0, 0, .4), 0 2px 4px -1px rgba(0, 0, 0, .2);--shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, .5), 0 4px 6px -2px rgba(0, 0, 0, .3);--shadow-glow: 0 0 0 1px rgba(255, 255, 255, .04)}*{border-color:var(--border-default)}body{background-color:var(--surface-0);color:var(--text-primary);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-family:Inter,ui-sans-serif,system-ui,-apple-system,sans-serif}::-webkit-scrollbar{width:5px;height:5px}::-webkit-scrollbar-track{background:transparent}::-webkit-scrollbar-thumb{background:var(--surface-3);border-radius:10px}::-webkit-scrollbar-thumb:hover{background:var(--surface-4)}.skeleton{background:linear-gradient(90deg,var(--surface-2) 25%,var(--surface-3) 50%,var(--surface-2) 75%);background-size:200% 100%;animation:skeleton-loading 1.5s ease-in-out infinite;border-radius:6px}.skeleton-card{background:linear-gradient(90deg,var(--surface-2) 25%,var(--surface-3) 50%,var(--surface-2) 75%);background-size:200% 100%;animation:skeleton-loading 1.5s ease-in-out infinite;border-radius:6px;height:80px}.\!visible{visibility:visible!important}.visible{visibility:visible}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.inset-0{inset:0}.bottom-3{bottom:.75rem}.bottom-6{bottom:1.5rem}.left-1\/2{left:50%}.right-4{right:1rem}.top-full{top:100%}.z-50{z-index:50}.mb-1{margin-bottom:.25rem}.mb-1\.5{margin-bottom:.375rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.ml-auto{margin-left:auto}.mt-1{margin-top:.25rem}.mt-1\.5{margin-top:.375rem}.line-clamp-2{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2}.block{display:block}.inline-block{display:inline-block}.flex{display:flex}.inline-flex{display:inline-flex}.grid{display:grid}.h-1\.5{height:.375rem}.h-10{height:2.5rem}.h-12{height:3rem}.h-14{height:3.5rem}.h-3{height:.75rem}.h-4{height:1rem}.h-5{height:1.25rem}.h-8{height:2rem}.h-full{height:100%}.h-screen{height:100vh}.max-h-\[60vh\]{max-height:60vh}.min-h-0{min-height:0px}.w-1\.5{width:.375rem}.w-12{width:3rem}.w-20{width:5rem}.w-6{width:1.5rem}.w-64{width:16rem}.w-8{width:2rem}.w-full{width:100%}.min-w-0{min-width:0px}.min-w-\[20px\]{min-width:20px}.min-w-\[280px\]{min-width:280px}.min-w-max{min-width:-moz-max-content;min-width:max-content}.max-w-lg{max-width:32rem}.max-w-sm{max-width:24rem}.flex-1{flex:1 1 0%}.shrink-0{flex-shrink:0}.-translate-x-1\/2{--tw-translate-x: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rotate-180{--tw-rotate: 180deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.cursor-pointer{cursor:pointer}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-center{align-items:center}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-1{gap:.25rem}.gap-1\.5{gap:.375rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-5{gap:1.25rem}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem * var(--tw-space-y-reverse))}.space-y-5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.25rem * var(--tw-space-y-reverse))}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.overflow-y-hidden{overflow-y:hidden}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:1rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:var(--radius)}.rounded-md{border-radius:calc(var(--radius) - 2px)}.rounded-xl{border-radius:calc(var(--radius) + 4px)}.border{border-width:1px}.border-b{border-bottom-width:1px}.border-l-\[3px\]{border-left-width:3px}.border-t{border-top-width:1px}.border-\[\#3D3D5C\]{--tw-border-opacity: 1;border-color:rgb(61 61 92 / var(--tw-border-opacity, 1))}.border-\[var\(--border-default\)\]{border-color:var(--border-default)}.border-\[var\(--border-subtle\)\]{border-color:var(--border-subtle)}.border-l-transparent{border-left-color:transparent}.bg-\[\#0A0A0F\]{--tw-bg-opacity: 1;background-color:rgb(10 10 15 / var(--tw-bg-opacity, 1))}.bg-\[\#1E1E2A\]{--tw-bg-opacity: 1;background-color:rgb(30 30 42 / var(--tw-bg-opacity, 1))}.bg-\[var\(--accent-subtle\)\]{background-color:var(--accent-subtle)}.bg-\[var\(--surface-1\)\]{background-color:var(--surface-1)}.bg-\[var\(--surface-2\)\]{background-color:var(--surface-2)}.bg-\[var\(--surface-3\)\]{background-color:var(--surface-3)}.bg-black\/60{background-color:#0009}.bg-emerald-500{--tw-bg-opacity: 1;background-color:rgb(16 185 129 / var(--tw-bg-opacity, 1))}.p-3{padding:.75rem}.p-4{padding:1rem}.p-5{padding:1.25rem}.px-1{padding-left:.25rem;padding-right:.25rem}.px-1\.5{padding-left:.375rem;padding-right:.375rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-2\.5{padding-left:.625rem;padding-right:.625rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-12{padding-top:3rem;padding-bottom:3rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.pr-4{padding-right:1rem}.pt-0\.5{padding-top:.125rem}.pt-4{padding-top:1rem}.text-left{text-align:left}.text-center{text-align:center}.font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-\[13px\]{font-size:13px}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-medium{font-weight:500}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.leading-relaxed{line-height:1.625}.leading-snug{line-height:1.375}.tracking-\[0\.08em\]{letter-spacing:.08em}.tracking-tight{letter-spacing:-.025em}.tracking-wide{letter-spacing:.025em}.tracking-wider{letter-spacing:.05em}.text-\[\#22D3EE\]{--tw-text-opacity: 1;color:rgb(34 211 238 / var(--tw-text-opacity, 1))}.text-\[\#60A5FA\]{--tw-text-opacity: 1;color:rgb(96 165 250 / var(--tw-text-opacity, 1))}.text-\[\#D4A574\]{--tw-text-opacity: 1;color:rgb(212 165 116 / var(--tw-text-opacity, 1))}.text-\[\#E8E8F0\]{--tw-text-opacity: 1;color:rgb(232 232 240 / var(--tw-text-opacity, 1))}.text-\[var\(--accent\)\]{color:var(--accent)}.text-\[var\(--text-muted\)\]{color:var(--text-muted)}.text-\[var\(--text-primary\)\]{color:var(--text-primary)}.text-\[var\(--text-secondary\)\]{color:var(--text-secondary)}.text-\[var\(--text-subtle\)\]{color:var(--text-subtle)}.text-emerald-500{--tw-text-opacity: 1;color:rgb(16 185 129 / var(--tw-text-opacity, 1))}.opacity-50{opacity:.5}.shadow-\[var\(--shadow-lg\)\]{--tw-shadow-color: var(--shadow-lg);--tw-shadow: var(--tw-shadow-colored)}.shadow-\[var\(--shadow-sm\)\]{--tw-shadow-color: var(--shadow-sm);--tw-shadow: var(--tw-shadow-colored)}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.backdrop-blur-sm{--tw-backdrop-blur: blur(4px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-150{transition-duration:.15s}.duration-200{transition-duration:.2s}.ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)}@keyframes enter{0%{opacity:var(--tw-enter-opacity, 1);transform:translate3d(var(--tw-enter-translate-x, 0),var(--tw-enter-translate-y, 0),0) scale3d(var(--tw-enter-scale, 1),var(--tw-enter-scale, 1),var(--tw-enter-scale, 1)) rotate(var(--tw-enter-rotate, 0))}}@keyframes exit{to{opacity:var(--tw-exit-opacity, 1);transform:translate3d(var(--tw-exit-translate-x, 0),var(--tw-exit-translate-y, 0),0) scale3d(var(--tw-exit-scale, 1),var(--tw-exit-scale, 1),var(--tw-exit-scale, 1)) rotate(var(--tw-exit-rotate, 0))}}.duration-150{animation-duration:.15s}.duration-200{animation-duration:.2s}.ease-out{animation-timing-function:cubic-bezier(0,0,.2,1)}@keyframes cardEnter{0%{opacity:0;transform:translateY(6px)}to{opacity:1;transform:translateY(0)}}.animate-card-enter{animation:cardEnter .25s cubic-bezier(.16,1,.3,1) forwards}@keyframes columnFlash{0%{border-left-width:3px;box-shadow:none}30%{border-left-width:5px}to{border-left-width:3px;box-shadow:none}}.animate-column-flash-todo{animation:columnFlash .5s ease-out;border-left-color:#f59e0b;box-shadow:0 0 6px #f59e0b4d}.animate-column-flash-inprogress{animation:columnFlash .5s ease-out;border-left-color:#3b82f6;box-shadow:0 0 6px #3b82f64d}.animate-column-flash-done{animation:columnFlash .5s ease-out;border-left-color:#10b981;box-shadow:0 0 6px #10b9814d}.animate-column-flash-blocked{animation:columnFlash .5s ease-out;border-left-color:#ef4444;box-shadow:0 0 6px #ef44444d}@keyframes toastIn{0%{opacity:0;transform:translateY(16px)}to{opacity:1;transform:translateY(0)}}@keyframes toastOut{0%{opacity:1;transform:translateY(0)}to{opacity:0;transform:translateY(16px)}}.animate-toast-in{animation:toastIn .25s cubic-bezier(.16,1,.3,1) forwards}@keyframes pulseRing{0%{transform:scale(1);opacity:.5}to{transform:scale(2.2);opacity:0}}.animate-pulse-ring{animation:pulseRing 2s ease-out infinite}@keyframes emptyFade{0%{opacity:0}to{opacity:1}}.animate-empty-fade{animation:emptyFade .2s ease forwards}@keyframes skeleton-loading{0%{background-position:200% 0}to{background-position:-200% 0}}.focus-ring{outline:2px solid transparent;outline-offset:2px}.focus-ring:focus-visible{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000);--tw-ring-color: var(--accent);--tw-ring-offset-width: 2px;--tw-ring-offset-color: var(--surface-0)}@keyframes modalIn{0%{opacity:0;transform:scale(.95) translateY(8px)}to{opacity:1;transform:scale(1) translateY(0)}}.animate-modal-in{animation:modalIn .2s cubic-bezier(.16,1,.3,1) forwards}.hover\:-translate-y-0\.5:hover{--tw-translate-y: -.125rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.hover\:bg-\[var\(--surface-3\)\]:hover{background-color:var(--surface-3)}.hover\:bg-\[var\(--surface-4\)\]:hover{background-color:var(--surface-4)}.hover\:text-\[var\(--text-primary\)\]:hover{color:var(--text-primary)}.hover\:shadow-\[var\(--shadow-md\)\]:hover{--tw-shadow-color: var(--shadow-md);--tw-shadow: var(--tw-shadow-colored)}