claude-code-workflow 6.3.36 → 6.3.37

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 (134) hide show
  1. package/.claude/commands/workflow/lite-fix.md +108 -9
  2. package/.claude/skills/ccw-loop/README.md +303 -0
  3. package/.claude/skills/ccw-loop/SKILL.md +259 -0
  4. package/.claude/skills/ccw-loop/phases/actions/action-complete.md +320 -0
  5. package/.claude/skills/ccw-loop/phases/actions/action-debug-with-file.md +485 -0
  6. package/.claude/skills/ccw-loop/phases/actions/action-develop-with-file.md +365 -0
  7. package/.claude/skills/ccw-loop/phases/actions/action-init.md +200 -0
  8. package/.claude/skills/ccw-loop/phases/actions/action-menu.md +192 -0
  9. package/.claude/skills/ccw-loop/phases/actions/action-validate-with-file.md +307 -0
  10. package/.claude/skills/ccw-loop/phases/orchestrator.md +486 -0
  11. package/.claude/skills/ccw-loop/phases/state-schema.md +474 -0
  12. package/.claude/skills/ccw-loop/specs/action-catalog.md +300 -0
  13. package/.claude/skills/ccw-loop/specs/loop-requirements.md +192 -0
  14. package/.claude/skills/ccw-loop/templates/progress-template.md +175 -0
  15. package/.claude/skills/ccw-loop/templates/understanding-template.md +303 -0
  16. package/.claude/skills/ccw-loop/templates/validation-template.md +258 -0
  17. package/ccw/dist/cli.d.ts.map +1 -1
  18. package/ccw/dist/cli.js +8 -1
  19. package/ccw/dist/cli.js.map +1 -1
  20. package/ccw/dist/commands/cli.d.ts.map +1 -1
  21. package/ccw/dist/commands/cli.js +14 -1
  22. package/ccw/dist/commands/cli.js.map +1 -1
  23. package/ccw/dist/commands/loop.d.ts +10 -0
  24. package/ccw/dist/commands/loop.d.ts.map +1 -0
  25. package/ccw/dist/commands/loop.js +289 -0
  26. package/ccw/dist/commands/loop.js.map +1 -0
  27. package/ccw/dist/core/dashboard-generator.d.ts.map +1 -1
  28. package/ccw/dist/core/dashboard-generator.js +4 -1
  29. package/ccw/dist/core/dashboard-generator.js.map +1 -1
  30. package/ccw/dist/core/routes/claude-routes.d.ts.map +1 -1
  31. package/ccw/dist/core/routes/claude-routes.js +5 -3
  32. package/ccw/dist/core/routes/claude-routes.js.map +1 -1
  33. package/ccw/dist/core/routes/cli-routes.d.ts +6 -0
  34. package/ccw/dist/core/routes/cli-routes.d.ts.map +1 -1
  35. package/ccw/dist/core/routes/cli-routes.js +42 -13
  36. package/ccw/dist/core/routes/cli-routes.js.map +1 -1
  37. package/ccw/dist/core/routes/cli-settings-routes.d.ts.map +1 -1
  38. package/ccw/dist/core/routes/cli-settings-routes.js +44 -0
  39. package/ccw/dist/core/routes/cli-settings-routes.js.map +1 -1
  40. package/ccw/dist/core/routes/codexlens/semantic-handlers.d.ts.map +1 -1
  41. package/ccw/dist/core/routes/codexlens/semantic-handlers.js +3 -2
  42. package/ccw/dist/core/routes/codexlens/semantic-handlers.js.map +1 -1
  43. package/ccw/dist/core/routes/core-memory-routes.d.ts.map +1 -1
  44. package/ccw/dist/core/routes/core-memory-routes.js +4 -2
  45. package/ccw/dist/core/routes/core-memory-routes.js.map +1 -1
  46. package/ccw/dist/core/routes/files-routes.d.ts.map +1 -1
  47. package/ccw/dist/core/routes/files-routes.js +4 -2
  48. package/ccw/dist/core/routes/files-routes.js.map +1 -1
  49. package/ccw/dist/core/routes/loop-routes.d.ts +24 -0
  50. package/ccw/dist/core/routes/loop-routes.d.ts.map +1 -0
  51. package/ccw/dist/core/routes/loop-routes.js +334 -0
  52. package/ccw/dist/core/routes/loop-routes.js.map +1 -0
  53. package/ccw/dist/core/routes/loop-v2-routes.d.ts +35 -0
  54. package/ccw/dist/core/routes/loop-v2-routes.d.ts.map +1 -0
  55. package/ccw/dist/core/routes/loop-v2-routes.js +1208 -0
  56. package/ccw/dist/core/routes/loop-v2-routes.js.map +1 -0
  57. package/ccw/dist/core/routes/memory-routes.d.ts.map +1 -1
  58. package/ccw/dist/core/routes/memory-routes.js +2 -1
  59. package/ccw/dist/core/routes/memory-routes.js.map +1 -1
  60. package/ccw/dist/core/routes/task-routes.d.ts +12 -0
  61. package/ccw/dist/core/routes/task-routes.d.ts.map +1 -0
  62. package/ccw/dist/core/routes/task-routes.js +321 -0
  63. package/ccw/dist/core/routes/task-routes.js.map +1 -0
  64. package/ccw/dist/core/routes/test-loop-routes.d.ts +11 -0
  65. package/ccw/dist/core/routes/test-loop-routes.d.ts.map +1 -0
  66. package/ccw/dist/core/routes/test-loop-routes.js +298 -0
  67. package/ccw/dist/core/routes/test-loop-routes.js.map +1 -0
  68. package/ccw/dist/core/server.d.ts.map +1 -1
  69. package/ccw/dist/core/server.js +43 -3
  70. package/ccw/dist/core/server.js.map +1 -1
  71. package/ccw/dist/core/websocket.d.ts +59 -0
  72. package/ccw/dist/core/websocket.d.ts.map +1 -1
  73. package/ccw/dist/core/websocket.js +34 -0
  74. package/ccw/dist/core/websocket.js.map +1 -1
  75. package/ccw/dist/tools/claude-cli-tools.d.ts +40 -0
  76. package/ccw/dist/tools/claude-cli-tools.d.ts.map +1 -1
  77. package/ccw/dist/tools/claude-cli-tools.js +119 -0
  78. package/ccw/dist/tools/claude-cli-tools.js.map +1 -1
  79. package/ccw/dist/tools/loop-manager.d.ts +84 -0
  80. package/ccw/dist/tools/loop-manager.d.ts.map +1 -0
  81. package/ccw/dist/tools/loop-manager.js +425 -0
  82. package/ccw/dist/tools/loop-manager.js.map +1 -0
  83. package/ccw/dist/tools/loop-state-manager.d.ts +47 -0
  84. package/ccw/dist/tools/loop-state-manager.d.ts.map +1 -0
  85. package/ccw/dist/tools/loop-state-manager.js +149 -0
  86. package/ccw/dist/tools/loop-state-manager.js.map +1 -0
  87. package/ccw/dist/tools/loop-task-manager.d.ts +138 -0
  88. package/ccw/dist/tools/loop-task-manager.d.ts.map +1 -0
  89. package/ccw/dist/tools/loop-task-manager.js +270 -0
  90. package/ccw/dist/tools/loop-task-manager.js.map +1 -0
  91. package/ccw/dist/types/index.d.ts +1 -0
  92. package/ccw/dist/types/index.d.ts.map +1 -1
  93. package/ccw/dist/types/index.js +1 -0
  94. package/ccw/dist/types/index.js.map +1 -1
  95. package/ccw/dist/types/loop.d.ts +257 -0
  96. package/ccw/dist/types/loop.d.ts.map +1 -0
  97. package/ccw/dist/types/loop.js +17 -0
  98. package/ccw/dist/types/loop.js.map +1 -0
  99. package/ccw/src/cli.ts +9 -1
  100. package/ccw/src/commands/cli.ts +14 -1
  101. package/ccw/src/commands/loop.ts +344 -0
  102. package/ccw/src/core/dashboard-generator.ts +4 -1
  103. package/ccw/src/core/routes/claude-routes.ts +5 -3
  104. package/ccw/src/core/routes/cli-routes.ts +47 -15
  105. package/ccw/src/core/routes/cli-settings-routes.ts +47 -0
  106. package/ccw/src/core/routes/codexlens/semantic-handlers.ts +3 -2
  107. package/ccw/src/core/routes/core-memory-routes.ts +4 -2
  108. package/ccw/src/core/routes/files-routes.ts +4 -2
  109. package/ccw/src/core/routes/loop-routes.ts +386 -0
  110. package/ccw/src/core/routes/loop-v2-routes.ts +1412 -0
  111. package/ccw/src/core/routes/memory-routes.ts +2 -1
  112. package/ccw/src/core/routes/task-routes.ts +361 -0
  113. package/ccw/src/core/routes/test-loop-routes.ts +312 -0
  114. package/ccw/src/core/server.ts +44 -3
  115. package/ccw/src/core/websocket.ts +104 -0
  116. package/ccw/src/templates/dashboard-css/12-cli-legacy.css +56 -0
  117. package/ccw/src/templates/dashboard-css/33-cli-stream-viewer.css +55 -0
  118. package/ccw/src/templates/dashboard-css/36-loop-monitor.css +1896 -0
  119. package/ccw/src/templates/dashboard-css/36-loop-monitor.css.backup +1877 -0
  120. package/ccw/src/templates/dashboard-js/components/cli-status.js +64 -3
  121. package/ccw/src/templates/dashboard-js/components/cli-stream-viewer.js +251 -110
  122. package/ccw/src/templates/dashboard-js/components/navigation.js +10 -0
  123. package/ccw/src/templates/dashboard-js/components/notifications.js +16 -0
  124. package/ccw/src/templates/dashboard-js/i18n.js +475 -1
  125. package/ccw/src/templates/dashboard-js/views/cli-manager.js +3 -2
  126. package/ccw/src/templates/dashboard-js/views/loop-monitor.js +3244 -0
  127. package/ccw/src/templates/dashboard.html +20 -2
  128. package/ccw/src/tools/claude-cli-tools.ts +143 -0
  129. package/ccw/src/tools/loop-manager.ts +519 -0
  130. package/ccw/src/tools/loop-state-manager.ts +173 -0
  131. package/ccw/src/tools/loop-task-manager.ts +380 -0
  132. package/ccw/src/types/index.ts +1 -0
  133. package/ccw/src/types/loop.ts +316 -0
  134. package/package.json +1 -1
@@ -0,0 +1,1896 @@
1
+ /* ===================================
2
+ Loop Monitor Styles
3
+ Redesigned: 2026-01-22
4
+ Target: ~500 lines, consistent with Dashboard design
5
+ =================================== */
6
+
7
+ /* ==========================================
8
+ ANIMATIONS
9
+ ========================================== */
10
+
11
+ @keyframes slideInUp {
12
+ from {
13
+ opacity: 0;
14
+ transform: translateY(10px);
15
+ }
16
+ to {
17
+ opacity: 1;
18
+ transform: translateY(0);
19
+ }
20
+ }
21
+
22
+ @keyframes fadeIn {
23
+ from {
24
+ opacity: 0;
25
+ }
26
+ to {
27
+ opacity: 1;
28
+ }
29
+ }
30
+
31
+ @keyframes slideInDown {
32
+ from {
33
+ opacity: 0;
34
+ transform: translateY(-10px);
35
+ }
36
+ to {
37
+ opacity: 1;
38
+ transform: translateY(0);
39
+ }
40
+ }
41
+
42
+ @keyframes modalFadeIn {
43
+ from {
44
+ opacity: 0;
45
+ transform: scale(0.95);
46
+ }
47
+ to {
48
+ opacity: 1;
49
+ transform: scale(1);
50
+ }
51
+ }
52
+
53
+ @keyframes pulse {
54
+ 0%, 100% {
55
+ opacity: 1;
56
+ }
57
+ 50% {
58
+ opacity: 0.5;
59
+ }
60
+ }
61
+
62
+ /* Modal overlay animations */
63
+ .modal-overlay {
64
+ animation: fadeIn 0.2s ease;
65
+ }
66
+
67
+ .modal-content {
68
+ animation: modalFadeIn 0.3s cubic-bezier(0.4, 0, 0.2, 1);
69
+ }
70
+
71
+ /* Loading spinner animation */
72
+ .loading-spinner {
73
+ animation: pulse 1.5s ease-in-out infinite;
74
+ }
75
+
76
+ /* Notification animations */
77
+ .notification {
78
+ animation: slideInUp 0.3s ease;
79
+ }
80
+
81
+ .notification.error {
82
+ background: hsl(var(--destructive) / 0.1);
83
+ border-left: 3px solid hsl(var(--destructive));
84
+ }
85
+
86
+ .notification.success {
87
+ background: hsl(var(--success) / 0.1);
88
+ border-left: 3px solid hsl(var(--success));
89
+ }
90
+
91
+ .notification.warning {
92
+ background: hsl(var(--warning) / 0.1);
93
+ border-left: 3px solid hsl(var(--warning));
94
+ }
95
+
96
+ /* Loop card animations */
97
+ .loop-card {
98
+ animation: slideInUp 0.3s ease;
99
+ }
100
+
101
+ /* Loop group animations */
102
+ .loop-group {
103
+ animation: slideInUp 0.3s ease;
104
+ }
105
+
106
+ /* ==========================================
107
+ LAYOUT
108
+ ========================================== */
109
+
110
+ .loop-monitor-layout {
111
+ display: grid;
112
+ grid-template-columns: 350px 1fr;
113
+ gap: 1.5rem;
114
+ height: calc(100vh - 200px);
115
+ min-height: 500px;
116
+ }
117
+
118
+ @media (max-width: 1024px) {
119
+ .loop-monitor-layout {
120
+ grid-template-columns: 1fr;
121
+ height: auto;
122
+ }
123
+
124
+ .loop-kanban-board {
125
+ min-height: 500px;
126
+ }
127
+ }
128
+
129
+ @media (max-width: 768px) {
130
+ .loop-monitor-layout {
131
+ grid-template-columns: 1fr;
132
+ gap: 1rem;
133
+ min-height: auto;
134
+ }
135
+
136
+ .loop-list-panel {
137
+ max-height: 300px;
138
+ }
139
+
140
+ .loop-kanban-board {
141
+ flex-wrap: wrap;
142
+ height: auto;
143
+ }
144
+
145
+ .loop-kanban-column {
146
+ width: calc(50% - 0.5rem);
147
+ min-width: 150px;
148
+ }
149
+
150
+ .detail-header {
151
+ flex-direction: column;
152
+ gap: 0.75rem;
153
+ align-items: flex-start;
154
+ }
155
+
156
+ .detail-actions {
157
+ width: 100%;
158
+ flex-wrap: wrap;
159
+ }
160
+ }
161
+
162
+ /* ==========================================
163
+ LOOP LIST PANEL
164
+ ========================================== */
165
+
166
+ .loop-list-panel {
167
+ background: hsl(var(--card));
168
+ border: 1px solid hsl(var(--border));
169
+ border-radius: 0.5rem;
170
+ display: flex;
171
+ flex-direction: column;
172
+ overflow: hidden;
173
+ }
174
+
175
+ /* Panel Header - Row 1: Tabs + New Button */
176
+ .panel-header-row {
177
+ display: flex;
178
+ align-items: center;
179
+ justify-content: space-between;
180
+ padding: 1rem 1rem 0.75rem 1rem;
181
+ gap: 0.75rem;
182
+ }
183
+
184
+ /* Panel Filter - Row 2: Filter Dropdown */
185
+ .panel-filter-row {
186
+ padding: 0 1rem 0.75rem 1rem;
187
+ border-bottom: 1px solid hsl(var(--border));
188
+ }
189
+
190
+ .panel-filter-row .filter-select {
191
+ width: 100%;
192
+ }
193
+
194
+ /* Legacy panel-header support */
195
+ .panel-header {
196
+ display: flex;
197
+ align-items: center;
198
+ justify-content: space-between;
199
+ padding: 1rem;
200
+ border-bottom: 1px solid hsl(var(--border));
201
+ }
202
+
203
+ .panel-header h3 {
204
+ margin: 0;
205
+ font-size: 0.875rem;
206
+ font-weight: 600;
207
+ display: flex;
208
+ align-items: center;
209
+ gap: 0.5rem;
210
+ color: hsl(var(--foreground));
211
+ }
212
+
213
+ .panel-header h3 i,
214
+ .panel-header h3 svg {
215
+ color: hsl(var(--primary));
216
+ }
217
+
218
+ .header-actions {
219
+ display: flex;
220
+ align-items: center;
221
+ gap: 0.75rem;
222
+ }
223
+
224
+ /* View Tabs for Loops/Tasks switch */
225
+ .view-tabs {
226
+ display: flex;
227
+ gap: 0.25rem;
228
+ padding: 0.25rem;
229
+ background: hsl(var(--muted) / 0.3);
230
+ border-radius: 0.5rem;
231
+ }
232
+
233
+ .tab-button {
234
+ display: flex;
235
+ align-items: center;
236
+ gap: 0.375rem;
237
+ padding: 0.5rem 0.875rem;
238
+ background: transparent;
239
+ border: none;
240
+ border-radius: 0.375rem;
241
+ color: hsl(var(--muted-foreground));
242
+ font-size: 0.8125rem;
243
+ font-weight: 500;
244
+ cursor: pointer;
245
+ transition: all 0.2s ease;
246
+ }
247
+
248
+ .tab-button:hover {
249
+ background: hsl(var(--background));
250
+ color: hsl(var(--foreground));
251
+ }
252
+
253
+ .tab-button.active {
254
+ background: hsl(var(--background));
255
+ color: hsl(var(--primary));
256
+ box-shadow: 0 1px 3px hsl(var(--foreground) / 0.1);
257
+ }
258
+
259
+ .tab-button i,
260
+ .tab-button svg {
261
+ width: 1rem;
262
+ height: 1rem;
263
+ }
264
+
265
+ /* Button Styles Enhancement */
266
+ .btn {
267
+ display: inline-flex;
268
+ align-items: center;
269
+ gap: 0.5rem;
270
+ padding: 0.5rem 1rem;
271
+ border: none;
272
+ border-radius: 0.5rem;
273
+ font-size: 0.8125rem;
274
+ font-weight: 500;
275
+ cursor: pointer;
276
+ transition: all 0.2s ease;
277
+ }
278
+
279
+ .btn-primary {
280
+ background: hsl(var(--primary));
281
+ color: white;
282
+ }
283
+
284
+ .btn-primary:hover {
285
+ background: hsl(var(--primary) / 0.9);
286
+ transform: translateY(-1px);
287
+ box-shadow: 0 2px 8px hsl(var(--primary) / 0.3);
288
+ }
289
+
290
+ .btn i,
291
+ .btn svg {
292
+ width: 1rem;
293
+ height: 1rem;
294
+ }
295
+
296
+ .filter-select,
297
+ .filter-group select {
298
+ padding: 0.375rem 0.75rem;
299
+ border: 1px solid hsl(var(--border));
300
+ border-radius: 0.375rem;
301
+ background: hsl(var(--background));
302
+ color: hsl(var(--foreground));
303
+ font-size: 0.75rem;
304
+ cursor: pointer;
305
+ transition: border-color 0.2s;
306
+ }
307
+
308
+ .filter-select:hover,
309
+ .filter-group select:hover {
310
+ border-color: hsl(var(--primary));
311
+ }
312
+
313
+ .filter-select:focus,
314
+ .filter-group select:focus {
315
+ outline: none;
316
+ border-color: hsl(var(--primary));
317
+ box-shadow: 0 0 0 2px hsl(var(--primary) / 0.1);
318
+ }
319
+
320
+ .loop-list {
321
+ flex: 1;
322
+ overflow-y: auto;
323
+ padding: 0.5rem;
324
+ }
325
+
326
+ /* ==========================================
327
+ LOOP CARDS
328
+ ========================================== */
329
+
330
+ .loop-card {
331
+ padding: 1rem;
332
+ margin-bottom: 0.75rem;
333
+ background: hsl(var(--card));
334
+ border: 1px solid hsl(var(--border));
335
+ border-radius: 0.625rem;
336
+ cursor: pointer;
337
+ transition: all 0.2s ease;
338
+ box-shadow: 0 1px 3px hsl(var(--foreground) / 0.04);
339
+ }
340
+
341
+ .loop-card:hover {
342
+ transform: translateY(-1px);
343
+ box-shadow: 0 4px 12px hsl(var(--foreground) / 0.1);
344
+ border-color: hsl(var(--primary) / 0.5);
345
+ }
346
+
347
+ .loop-card.selected {
348
+ background: hsl(var(--primary) / 0.08);
349
+ border-color: hsl(var(--primary));
350
+ box-shadow: 0 0 0 2px hsl(var(--primary) / 0.15);
351
+ }
352
+
353
+ .loop-card-header {
354
+ display: flex;
355
+ align-items: center;
356
+ gap: 0.625rem;
357
+ margin-bottom: 0.625rem;
358
+ }
359
+
360
+ .loop-status-indicator {
361
+ width: 24px;
362
+ height: 24px;
363
+ display: flex;
364
+ align-items: center;
365
+ justify-content: center;
366
+ border-radius: 50%;
367
+ font-size: 0.75rem;
368
+ flex-shrink: 0;
369
+ }
370
+
371
+ .loop-status-indicator.created { background: hsl(var(--muted)); color: hsl(var(--muted-foreground)); }
372
+ .loop-status-indicator.running { background: hsl(var(--info) / 0.15); color: hsl(var(--info)); }
373
+ .loop-status-indicator.paused { background: hsl(var(--warning) / 0.15); color: hsl(var(--warning)); }
374
+ .loop-status-indicator.completed { background: hsl(var(--success) / 0.15); color: hsl(var(--success)); }
375
+ .loop-status-indicator.failed { background: hsl(var(--destructive) / 0.15); color: hsl(var(--destructive)); }
376
+
377
+ .loop-status-indicator.running {
378
+ animation: pulse 2s ease-in-out infinite;
379
+ }
380
+
381
+ @keyframes pulse {
382
+ 0%, 100% { opacity: 1; }
383
+ 50% { opacity: 0.6; }
384
+ }
385
+
386
+ .loop-title {
387
+ font-weight: 600;
388
+ font-size: 0.875rem;
389
+ color: hsl(var(--foreground));
390
+ overflow: hidden;
391
+ text-overflow: ellipsis;
392
+ white-space: nowrap;
393
+ flex: 1;
394
+ }
395
+
396
+ .version-badge {
397
+ font-size: 0.625rem;
398
+ font-weight: 600;
399
+ text-transform: uppercase;
400
+ padding: 0.125rem 0.375rem;
401
+ border-radius: 9999px;
402
+ background: hsl(var(--muted));
403
+ color: hsl(var(--muted-foreground));
404
+ }
405
+
406
+ .loop-card-body {
407
+ display: flex;
408
+ flex-direction: column;
409
+ gap: 0.5rem;
410
+ }
411
+
412
+ .loop-description {
413
+ font-size: 0.75rem;
414
+ color: hsl(var(--muted-foreground));
415
+ line-height: 1.4;
416
+ overflow: hidden;
417
+ text-overflow: ellipsis;
418
+ display: -webkit-box;
419
+ -webkit-line-clamp: 2;
420
+ -webkit-box-orient: vertical;
421
+ }
422
+
423
+ .loop-meta {
424
+ display: flex;
425
+ justify-content: space-between;
426
+ font-size: 0.75rem;
427
+ color: hsl(var(--muted-foreground));
428
+ }
429
+
430
+ .loop-progress {
431
+ display: flex;
432
+ align-items: center;
433
+ gap: 0.5rem;
434
+ }
435
+
436
+ /* ==========================================
437
+ STATUS BADGES
438
+ ========================================== */
439
+
440
+ .status-badge,
441
+ .detail-status {
442
+ display: inline-flex;
443
+ align-items: center;
444
+ gap: 0.375rem;
445
+ padding: 0.125rem 0.5rem;
446
+ border-radius: 9999px;
447
+ font-size: 0.6875rem;
448
+ font-weight: 500;
449
+ text-transform: uppercase;
450
+ letter-spacing: 0.025em;
451
+ }
452
+
453
+ .status-badge.created,
454
+ .detail-status.created {
455
+ background: hsl(var(--muted));
456
+ color: hsl(var(--muted-foreground));
457
+ }
458
+
459
+ .status-badge.running,
460
+ .detail-status.running {
461
+ background: hsl(var(--info) / 0.15);
462
+ color: hsl(var(--info));
463
+ }
464
+
465
+ .status-badge.paused,
466
+ .detail-status.paused {
467
+ background: hsl(var(--warning) / 0.15);
468
+ color: hsl(var(--warning));
469
+ }
470
+
471
+ .status-badge.completed,
472
+ .detail-status.completed {
473
+ background: hsl(var(--success) / 0.15);
474
+ color: hsl(var(--success));
475
+ }
476
+
477
+ .status-badge.failed,
478
+ .detail-status.failed {
479
+ background: hsl(var(--destructive) / 0.15);
480
+ color: hsl(var(--destructive));
481
+ }
482
+
483
+ /* ==========================================
484
+ PROGRESS BARS
485
+ ========================================== */
486
+
487
+ .progress-bar {
488
+ flex: 1;
489
+ height: 0.5rem;
490
+ background: hsl(var(--muted));
491
+ border-radius: 9999px;
492
+ overflow: hidden;
493
+ }
494
+
495
+ .progress-fill {
496
+ height: 100%;
497
+ background: linear-gradient(90deg, hsl(var(--primary)), hsl(var(--primary) / 0.8));
498
+ border-radius: 9999px;
499
+ transition: width 0.3s ease;
500
+ }
501
+
502
+ .progress-text {
503
+ font-size: 0.75rem;
504
+ color: hsl(var(--muted-foreground));
505
+ min-width: 48px;
506
+ text-align: right;
507
+ }
508
+
509
+ /* ==========================================
510
+ DETAIL PANEL
511
+ ========================================== */
512
+
513
+ .loop-detail-panel {
514
+ background: hsl(var(--card));
515
+ border: 1px solid hsl(var(--border));
516
+ border-radius: 0.5rem;
517
+ overflow-y: auto;
518
+ padding: 1.5rem;
519
+ }
520
+
521
+ @media (max-width: 1024px) {
522
+ .loop-detail-panel {
523
+ min-height: 400px;
524
+ }
525
+ }
526
+
527
+ .loop-detail {
528
+ display: flex;
529
+ flex-direction: column;
530
+ gap: 1.5rem;
531
+ }
532
+
533
+ .detail-header {
534
+ display: flex;
535
+ align-items: center;
536
+ justify-content: space-between;
537
+ padding-bottom: 1rem;
538
+ border-bottom: 1px solid hsl(var(--border));
539
+ }
540
+
541
+ .kanban-header-left {
542
+ display: flex;
543
+ align-items: center;
544
+ gap: 0.75rem;
545
+ }
546
+
547
+ .kanban-loop-title {
548
+ font-size: 0.875rem;
549
+ font-weight: 500;
550
+ color: hsl(var(--foreground));
551
+ opacity: 0.85;
552
+ }
553
+
554
+ .detail-actions {
555
+ display: flex;
556
+ gap: 0.5rem;
557
+ }
558
+
559
+ .detail-info {
560
+ padding: 1rem;
561
+ background: hsl(var(--muted) / 0.25);
562
+ border-radius: 0.625rem;
563
+ border: 1px solid hsl(var(--border) / 0.5);
564
+ }
565
+
566
+ .detail-title {
567
+ margin: 0 0 0.5rem 0;
568
+ font-size: 1.125rem;
569
+ font-weight: 600;
570
+ color: hsl(var(--foreground));
571
+ }
572
+
573
+ .detail-description {
574
+ font-size: 0.875rem;
575
+ color: hsl(var(--muted-foreground));
576
+ line-height: 1.5;
577
+ margin: 0 0 0.75rem 0;
578
+ }
579
+
580
+ .detail-meta {
581
+ display: flex;
582
+ flex-wrap: wrap;
583
+ gap: 0.75rem 1.25rem;
584
+ font-size: 0.75rem;
585
+ color: hsl(var(--muted-foreground));
586
+ margin-top: 0.5rem;
587
+ padding-top: 0.75rem;
588
+ border-top: 1px dashed hsl(var(--border) / 0.6);
589
+ }
590
+
591
+ .detail-meta span {
592
+ display: inline-flex;
593
+ align-items: center;
594
+ gap: 0.375rem;
595
+ padding: 0.25rem 0.5rem;
596
+ background: hsl(var(--muted) / 0.4);
597
+ border-radius: 0.375rem;
598
+ }
599
+
600
+ /* Detail Section */
601
+ .detail-section {
602
+ display: flex;
603
+ flex-direction: column;
604
+ gap: 1rem;
605
+ padding: 1rem;
606
+ background: hsl(var(--muted) / 0.25);
607
+ border-radius: 0.625rem;
608
+ border: 1px solid hsl(var(--border) / 0.5);
609
+ }
610
+
611
+ .detail-section h4 {
612
+ margin: 0;
613
+ font-size: 0.8125rem;
614
+ font-weight: 600;
615
+ color: hsl(var(--foreground));
616
+ display: flex;
617
+ align-items: center;
618
+ gap: 0.5rem;
619
+ padding-bottom: 0.75rem;
620
+ border-bottom: 1px solid hsl(var(--border) / 0.5);
621
+ }
622
+
623
+ .progress-group {
624
+ display: flex;
625
+ flex-direction: column;
626
+ gap: 0.75rem;
627
+ }
628
+
629
+ .progress-item {
630
+ display: flex;
631
+ flex-direction: column;
632
+ gap: 0.5rem;
633
+ padding: 0.875rem;
634
+ background: hsl(var(--background));
635
+ border-radius: 0.5rem;
636
+ border: 1px solid hsl(var(--border) / 0.6);
637
+ }
638
+
639
+ .progress-item label {
640
+ font-size: 0.75rem;
641
+ font-weight: 600;
642
+ color: hsl(var(--foreground));
643
+ display: flex;
644
+ align-items: center;
645
+ gap: 0.375rem;
646
+ }
647
+
648
+ /* Info Box for V2 Loops */
649
+ .info-box {
650
+ padding: 1rem;
651
+ background: hsl(var(--background));
652
+ border-radius: 0.5rem;
653
+ border: 1px solid hsl(var(--border) / 0.6);
654
+ }
655
+
656
+ .info-box p {
657
+ margin: 0 0 1rem 0;
658
+ font-size: 0.875rem;
659
+ color: hsl(var(--muted-foreground));
660
+ line-height: 1.5;
661
+ }
662
+
663
+ .info-box .btn {
664
+ margin-top: 0;
665
+ }
666
+
667
+ /* ==========================================
668
+ CLI SEQUENCE / STEPS
669
+ ========================================== */
670
+
671
+ .cli-sequence,
672
+ .steps-list {
673
+ display: flex;
674
+ flex-direction: column;
675
+ gap: 0.5rem;
676
+ }
677
+
678
+ .cli-step,
679
+ .step-item {
680
+ display: flex;
681
+ gap: 0.75rem;
682
+ padding: 0.875rem;
683
+ background: hsl(var(--background));
684
+ border-radius: 0.5rem;
685
+ border: 1px solid hsl(var(--border) / 0.6);
686
+ border-left: 3px solid hsl(var(--muted-foreground) / 0.5);
687
+ transition: all 0.2s ease;
688
+ }
689
+
690
+ .cli-step:hover,
691
+ .step-item:hover {
692
+ background: hsl(var(--muted) / 0.15);
693
+ border-left-color: hsl(var(--primary) / 0.6);
694
+ }
695
+
696
+ .cli-step.current,
697
+ .step-item.current {
698
+ border-left-color: hsl(var(--primary));
699
+ background: hsl(var(--primary) / 0.05);
700
+ }
701
+
702
+ .cli-step.completed,
703
+ .step-item.completed {
704
+ border-left-color: hsl(var(--success));
705
+ }
706
+
707
+ .step-marker,
708
+ .step-number {
709
+ width: 24px;
710
+ height: 24px;
711
+ display: flex;
712
+ align-items: center;
713
+ justify-content: center;
714
+ border-radius: 50%;
715
+ background: hsl(var(--muted));
716
+ font-size: 0.75rem;
717
+ font-weight: 600;
718
+ flex-shrink: 0;
719
+ }
720
+
721
+ .cli-step.current .step-marker,
722
+ .step-item.current .step-number {
723
+ background: hsl(var(--primary));
724
+ color: white;
725
+ }
726
+
727
+ .cli-step.completed .step-marker,
728
+ .step-item.completed .step-number {
729
+ background: hsl(var(--success));
730
+ color: white;
731
+ }
732
+
733
+ .step-content {
734
+ flex: 1;
735
+ min-width: 0;
736
+ }
737
+
738
+ .step-name,
739
+ .step-id {
740
+ font-weight: 600;
741
+ font-size: 0.875rem;
742
+ color: hsl(var(--foreground));
743
+ }
744
+
745
+ .step-prompt,
746
+ .step-command {
747
+ font-size: 0.75rem;
748
+ color: hsl(var(--muted-foreground));
749
+ margin-top: 0.25rem;
750
+ }
751
+
752
+ .step-tool {
753
+ font-size: 0.6875rem;
754
+ padding: 0.125rem 0.375rem;
755
+ background: hsl(var(--info) / 0.15);
756
+ color: hsl(var(--info));
757
+ border-radius: 9999px;
758
+ }
759
+
760
+ /* ==========================================
761
+ TIMELINE
762
+ ========================================== */
763
+
764
+ .execution-timeline {
765
+ display: flex;
766
+ flex-direction: column;
767
+ gap: 0.75rem;
768
+ }
769
+
770
+ .timeline-item {
771
+ position: relative;
772
+ padding-left: 2rem;
773
+ padding-bottom: 1rem;
774
+ }
775
+
776
+ .timeline-item::before {
777
+ content: '';
778
+ position: absolute;
779
+ left: 0.625rem;
780
+ top: 1.5rem;
781
+ bottom: -0.5rem;
782
+ width: 2px;
783
+ background: hsl(var(--border));
784
+ }
785
+
786
+ .timeline-item:last-child::before {
787
+ display: none;
788
+ }
789
+
790
+ .timeline-marker {
791
+ position: absolute;
792
+ left: 0;
793
+ top: 0.25rem;
794
+ width: 1.5rem;
795
+ height: 1.5rem;
796
+ border-radius: 50%;
797
+ display: flex;
798
+ align-items: center;
799
+ justify-content: center;
800
+ font-size: 0.75rem;
801
+ background: hsl(var(--muted));
802
+ color: hsl(var(--muted-foreground));
803
+ }
804
+
805
+ .timeline-item.success .timeline-marker {
806
+ background: hsl(var(--success));
807
+ color: white;
808
+ }
809
+
810
+ .timeline-item.failed .timeline-marker {
811
+ background: hsl(var(--destructive));
812
+ color: white;
813
+ }
814
+
815
+ .timeline-item.current .timeline-marker {
816
+ background: hsl(var(--primary));
817
+ color: white;
818
+ }
819
+
820
+ .timeline-content {
821
+ font-size: 0.875rem;
822
+ }
823
+
824
+ .timeline-title {
825
+ font-weight: 500;
826
+ color: hsl(var(--foreground));
827
+ }
828
+
829
+ .timeline-time {
830
+ font-size: 0.75rem;
831
+ color: hsl(var(--muted-foreground));
832
+ }
833
+
834
+ /* ==========================================
835
+ EMPTY STATES
836
+ ========================================== */
837
+
838
+ .empty-state,
839
+ .empty-detail-state {
840
+ display: flex;
841
+ flex-direction: column;
842
+ align-items: center;
843
+ justify-content: center;
844
+ padding: 3rem 1.5rem;
845
+ color: hsl(var(--muted-foreground));
846
+ text-align: center;
847
+ }
848
+
849
+ .empty-state-icon,
850
+ .empty-icon-large {
851
+ width: 56px;
852
+ height: 56px;
853
+ display: flex;
854
+ align-items: center;
855
+ justify-content: center;
856
+ background: hsl(var(--muted) / 0.3);
857
+ border-radius: 50%;
858
+ margin-bottom: 1rem;
859
+ }
860
+
861
+ .empty-state-icon i,
862
+ .empty-state-icon svg,
863
+ .empty-icon-large i,
864
+ .empty-icon-large svg {
865
+ width: 28px;
866
+ height: 28px;
867
+ opacity: 0.5;
868
+ color: hsl(var(--primary));
869
+ }
870
+
871
+ .empty-state-title {
872
+ font-size: 0.875rem;
873
+ font-weight: 500;
874
+ color: hsl(var(--foreground));
875
+ margin-bottom: 0.5rem;
876
+ }
877
+
878
+ .empty-state-hint,
879
+ .empty-hint {
880
+ font-size: 0.75rem;
881
+ color: hsl(var(--muted-foreground));
882
+ max-width: 280px;
883
+ line-height: 1.5;
884
+ }
885
+
886
+ .empty-state .btn,
887
+ .empty-detail-state .btn {
888
+ margin-top: 1rem;
889
+ }
890
+
891
+ /* ==========================================
892
+ TASK LIST
893
+ ========================================== */
894
+
895
+ .task-list {
896
+ display: flex;
897
+ flex-direction: column;
898
+ gap: 0.5rem;
899
+ max-height: 400px;
900
+ overflow-y: auto;
901
+ }
902
+
903
+ /* Task List Header */
904
+ .tasks-list-header {
905
+ display: flex;
906
+ align-items: center;
907
+ justify-content: space-between;
908
+ padding-bottom: 0.75rem;
909
+ border-bottom: 1px solid hsl(var(--border) / 0.6);
910
+ margin-bottom: 0.75rem;
911
+ }
912
+
913
+ .tasks-list-header h4 {
914
+ margin: 0;
915
+ font-size: 0.875rem;
916
+ font-weight: 600;
917
+ color: hsl(var(--foreground));
918
+ display: flex;
919
+ align-items: center;
920
+ gap: 0.5rem;
921
+ }
922
+
923
+ .tasks-list-header .text-sm {
924
+ font-size: 0.75rem;
925
+ color: hsl(var(--muted-foreground));
926
+ }
927
+
928
+ /* Task List Empty State */
929
+ .task-list-empty {
930
+ display: flex;
931
+ flex-direction: column;
932
+ align-items: center;
933
+ justify-content: center;
934
+ gap: 1rem;
935
+ padding: 3rem 1rem;
936
+ text-align: center;
937
+ color: hsl(var(--muted-foreground));
938
+ }
939
+
940
+ .task-list-empty i {
941
+ color: hsl(var(--muted-foreground) / 0.6);
942
+ }
943
+
944
+ .task-list-empty .empty-state-title {
945
+ margin: 0;
946
+ font-size: 1rem;
947
+ font-weight: 600;
948
+ color: hsl(var(--foreground));
949
+ }
950
+
951
+ .task-list-empty .empty-state-hint {
952
+ margin: 0;
953
+ font-size: 0.875rem;
954
+ color: hsl(var(--muted-foreground));
955
+ max-width: 300px;
956
+ }
957
+
958
+ .task-list-empty .btn {
959
+ margin-top: 0.5rem;
960
+ }
961
+
962
+ .task-item {
963
+ display: flex;
964
+ align-items: center;
965
+ gap: 0.75rem;
966
+ padding: 0.75rem 1rem;
967
+ background: hsl(var(--card));
968
+ border: 1px solid hsl(var(--border));
969
+ border-radius: 0.5rem;
970
+ cursor: grab;
971
+ transition: all 0.2s ease;
972
+ }
973
+
974
+ .task-item:hover {
975
+ border-color: hsl(var(--primary));
976
+ box-shadow: 0 2px 8px hsl(var(--foreground) / 0.06);
977
+ }
978
+
979
+ .task-item-drag {
980
+ color: hsl(var(--muted-foreground));
981
+ cursor: grab;
982
+ }
983
+
984
+ .task-item-content {
985
+ flex: 1;
986
+ min-width: 0;
987
+ }
988
+
989
+ .task-item-description {
990
+ font-size: 0.875rem;
991
+ font-weight: 500;
992
+ color: hsl(var(--foreground));
993
+ }
994
+
995
+ .task-item-meta {
996
+ display: flex;
997
+ align-items: center;
998
+ gap: 0.5rem;
999
+ margin-top: 0.25rem;
1000
+ }
1001
+
1002
+ .task-status-badge,
1003
+ .task-tool-badge {
1004
+ font-size: 0.625rem;
1005
+ font-weight: 500;
1006
+ padding: 0.125rem 0.375rem;
1007
+ border-radius: 9999px;
1008
+ }
1009
+
1010
+ .task-status-badge { background: hsl(var(--info) / 0.15); color: hsl(var(--info)); }
1011
+ .task-tool-badge { background: hsl(var(--muted)); color: hsl(var(--muted-foreground)); }
1012
+
1013
+ .task-item-actions {
1014
+ display: flex;
1015
+ gap: 0.25rem;
1016
+ opacity: 0;
1017
+ transition: opacity 0.2s;
1018
+ }
1019
+
1020
+ .task-item:hover .task-item-actions {
1021
+ opacity: 1;
1022
+ }
1023
+
1024
+ /* ==========================================
1025
+ MODALS
1026
+ ========================================== */
1027
+
1028
+ .modal-overlay {
1029
+ position: fixed;
1030
+ inset: 0;
1031
+ background: hsl(var(--foreground) / 0.5);
1032
+ display: flex;
1033
+ align-items: center;
1034
+ justify-content: center;
1035
+ z-index: 1000;
1036
+ padding: 1rem;
1037
+ }
1038
+
1039
+ .modal-content {
1040
+ background: hsl(var(--card));
1041
+ border-radius: 0.5rem;
1042
+ width: 100%;
1043
+ max-width: 600px;
1044
+ max-height: 90vh;
1045
+ overflow: hidden;
1046
+ display: flex;
1047
+ flex-direction: column;
1048
+ box-shadow: 0 20px 25px hsl(var(--foreground) / 0.15);
1049
+ }
1050
+
1051
+ .modal-content.modal-lg {
1052
+ max-width: 800px;
1053
+ }
1054
+
1055
+ .modal-header {
1056
+ display: flex;
1057
+ justify-content: space-between;
1058
+ align-items: center;
1059
+ padding: 1rem 1.5rem;
1060
+ border-bottom: 1px solid hsl(var(--border));
1061
+ }
1062
+
1063
+ .modal-header h3 {
1064
+ margin: 0;
1065
+ font-size: 1rem;
1066
+ font-weight: 600;
1067
+ }
1068
+
1069
+ .modal-close {
1070
+ background: none;
1071
+ border: none;
1072
+ cursor: pointer;
1073
+ padding: 0.25rem;
1074
+ border-radius: 0.25rem;
1075
+ color: hsl(var(--muted-foreground));
1076
+ transition: background 0.2s;
1077
+ }
1078
+
1079
+ .modal-close:hover {
1080
+ background: hsl(var(--muted));
1081
+ }
1082
+
1083
+ .modal-body {
1084
+ padding: 1.5rem;
1085
+ overflow-y: auto;
1086
+ flex: 1;
1087
+ }
1088
+
1089
+ .modal-footer {
1090
+ display: flex;
1091
+ justify-content: flex-end;
1092
+ gap: 0.5rem;
1093
+ padding: 1rem 1.5rem;
1094
+ border-top: 1px solid hsl(var(--border));
1095
+ }
1096
+
1097
+ /* ==========================================
1098
+ FORMS
1099
+ ========================================== */
1100
+
1101
+ .form-section {
1102
+ margin-bottom: 1.5rem;
1103
+ padding-bottom: 1.5rem;
1104
+ border-bottom: 1px solid hsl(var(--border));
1105
+ }
1106
+
1107
+ .form-section:last-child {
1108
+ border-bottom: none;
1109
+ margin-bottom: 0;
1110
+ padding-bottom: 0;
1111
+ }
1112
+
1113
+ .form-section h4 {
1114
+ margin: 0 0 1rem 0;
1115
+ font-size: 0.875rem;
1116
+ font-weight: 600;
1117
+ display: flex;
1118
+ align-items: center;
1119
+ gap: 0.5rem;
1120
+ }
1121
+
1122
+ .form-group {
1123
+ margin-bottom: 1rem;
1124
+ }
1125
+
1126
+ .form-group:last-child {
1127
+ margin-bottom: 0;
1128
+ }
1129
+
1130
+ .form-group label {
1131
+ display: block;
1132
+ margin-bottom: 0.375rem;
1133
+ font-size: 0.75rem;
1134
+ font-weight: 500;
1135
+ color: hsl(var(--foreground));
1136
+ }
1137
+
1138
+ .form-control {
1139
+ width: 100%;
1140
+ padding: 0.5rem 0.75rem;
1141
+ border: 1px solid hsl(var(--border));
1142
+ border-radius: 0.375rem;
1143
+ font-size: 0.875rem;
1144
+ background: hsl(var(--background));
1145
+ color: hsl(var(--foreground));
1146
+ transition: border-color 0.2s, box-shadow 0.2s;
1147
+ }
1148
+
1149
+ .form-control:focus {
1150
+ outline: none;
1151
+ border-color: hsl(var(--primary));
1152
+ box-shadow: 0 0 0 2px hsl(var(--primary) / 0.1);
1153
+ }
1154
+
1155
+ textarea.form-control {
1156
+ resize: vertical;
1157
+ min-height: 80px;
1158
+ }
1159
+
1160
+ .form-row {
1161
+ display: flex;
1162
+ gap: 1rem;
1163
+ }
1164
+
1165
+ .form-row .form-group {
1166
+ flex: 1;
1167
+ }
1168
+
1169
+ .form-group small {
1170
+ display: block;
1171
+ margin-top: 0.25rem;
1172
+ font-size: 0.6875rem;
1173
+ color: hsl(var(--muted-foreground));
1174
+ }
1175
+
1176
+ .required {
1177
+ color: hsl(var(--destructive));
1178
+ }
1179
+
1180
+ /* ==========================================
1181
+ BUTTONS
1182
+ ========================================== */
1183
+
1184
+ .btn {
1185
+ display: inline-flex;
1186
+ align-items: center;
1187
+ gap: 0.375rem;
1188
+ padding: 0.5rem 1rem;
1189
+ border-radius: 0.375rem;
1190
+ font-size: 0.875rem;
1191
+ font-weight: 500;
1192
+ cursor: pointer;
1193
+ border: none;
1194
+ transition: all 0.2s;
1195
+ }
1196
+
1197
+ .btn:disabled {
1198
+ opacity: 0.5;
1199
+ cursor: not-allowed;
1200
+ }
1201
+
1202
+ .btn-primary { background: hsl(var(--primary)); color: white; }
1203
+ .btn-primary:hover:not(:disabled) { background: hsl(var(--primary) / 0.9); }
1204
+
1205
+ .btn-success { background: hsl(var(--success)); color: white; }
1206
+ .btn-success:hover:not(:disabled) { background: hsl(var(--success) / 0.9); }
1207
+
1208
+ .btn-warning { background: hsl(var(--warning)); color: white; }
1209
+ .btn-warning:hover:not(:disabled) { background: hsl(var(--warning) / 0.9); }
1210
+
1211
+ .btn-danger { background: hsl(var(--destructive)); color: white; }
1212
+ .btn-danger:hover:not(:disabled) { background: hsl(var(--destructive) / 0.9); }
1213
+
1214
+ .btn-secondary {
1215
+ background: hsl(var(--muted));
1216
+ color: hsl(var(--foreground));
1217
+ }
1218
+ .btn-secondary:hover:not(:disabled) {
1219
+ background: hsl(var(--muted) / 0.8);
1220
+ }
1221
+
1222
+ .btn-outline {
1223
+ background: transparent;
1224
+ border: 1px solid hsl(var(--border));
1225
+ color: hsl(var(--foreground));
1226
+ }
1227
+ .btn-outline:hover:not(:disabled) {
1228
+ background: hsl(var(--accent));
1229
+ border-color: hsl(var(--primary));
1230
+ }
1231
+
1232
+ .btn-text {
1233
+ background: none;
1234
+ border: none;
1235
+ color: hsl(var(--muted-foreground));
1236
+ padding: 0.25rem 0.5rem;
1237
+ }
1238
+ .btn-text:hover { color: hsl(var(--foreground)); }
1239
+
1240
+ .btn-sm {
1241
+ padding: 0.25rem 0.5rem;
1242
+ font-size: 0.75rem;
1243
+ }
1244
+
1245
+ /* ==========================================
1246
+ ALERTS & ERRORS
1247
+ ========================================== */
1248
+
1249
+ .alert {
1250
+ padding: 0.75rem 1rem;
1251
+ border-radius: 0.375rem;
1252
+ font-size: 0.875rem;
1253
+ margin-bottom: 1rem;
1254
+ }
1255
+
1256
+ .alert-error {
1257
+ background: hsl(var(--destructive) / 0.1);
1258
+ border: 1px solid hsl(var(--destructive) / 0.3);
1259
+ color: hsl(var(--destructive));
1260
+ }
1261
+
1262
+ .alert-warning {
1263
+ background: hsl(var(--warning) / 0.1);
1264
+ border: 1px solid hsl(var(--warning) / 0.3);
1265
+ color: hsl(var(--warning));
1266
+ }
1267
+
1268
+ .alert-success {
1269
+ background: hsl(var(--success) / 0.1);
1270
+ border: 1px solid hsl(var(--success) / 0.3);
1271
+ color: hsl(var(--success));
1272
+ }
1273
+
1274
+ .error-section {
1275
+ padding: 1rem;
1276
+ background: hsl(var(--destructive) / 0.1);
1277
+ border: 1px solid hsl(var(--destructive) / 0.3);
1278
+ border-radius: 0.5rem;
1279
+ }
1280
+
1281
+ .error-section h4 {
1282
+ margin: 0 0 0.5rem 0;
1283
+ color: hsl(var(--destructive));
1284
+ }
1285
+
1286
+ .error-message {
1287
+ font-family: monospace;
1288
+ font-size: 0.875rem;
1289
+ color: hsl(var(--destructive));
1290
+ white-space: pre-wrap;
1291
+ word-break: break-word;
1292
+ }
1293
+
1294
+ /* ==========================================
1295
+ CONFIG DISPLAY
1296
+ ========================================== */
1297
+
1298
+ .config-grid {
1299
+ display: grid;
1300
+ grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
1301
+ gap: 1rem;
1302
+ }
1303
+
1304
+ .config-item {
1305
+ display: flex;
1306
+ flex-direction: column;
1307
+ gap: 0.25rem;
1308
+ }
1309
+
1310
+ .config-label {
1311
+ font-size: 0.6875rem;
1312
+ color: hsl(var(--muted-foreground));
1313
+ text-transform: uppercase;
1314
+ letter-spacing: 0.05em;
1315
+ }
1316
+
1317
+ .config-value {
1318
+ font-size: 0.875rem;
1319
+ font-weight: 500;
1320
+ color: hsl(var(--foreground));
1321
+ }
1322
+
1323
+ .config-code {
1324
+ display: block;
1325
+ padding: 0.5rem 0.75rem;
1326
+ background: hsl(var(--muted));
1327
+ border-radius: 0.375rem;
1328
+ font-size: 0.875rem;
1329
+ font-family: monospace;
1330
+ overflow-x: auto;
1331
+ }
1332
+
1333
+ /* ==========================================
1334
+ UTILITIES
1335
+ ========================================== */
1336
+
1337
+ .flex { display: flex; }
1338
+ .flex-1 { flex: 1; }
1339
+ .items-center { align-items: center; }
1340
+ .justify-between { justify-content: space-between; }
1341
+ .w-full { width: 100%; }
1342
+ .text-sm { font-size: 0.875rem; }
1343
+ .small { font-size: 0.75rem; color: hsl(var(--muted-foreground)); }
1344
+
1345
+ .loading-spinner {
1346
+ display: flex;
1347
+ align-items: center;
1348
+ justify-content: center;
1349
+ padding: 2rem;
1350
+ color: hsl(var(--muted-foreground));
1351
+ }
1352
+
1353
+ /* Notification */
1354
+ .notification {
1355
+ position: fixed;
1356
+ bottom: 1rem;
1357
+ right: 1rem;
1358
+ padding: 0.75rem 1.5rem;
1359
+ border-radius: 0.5rem;
1360
+ font-weight: 500;
1361
+ z-index: 1000;
1362
+ animation: slideIn 0.3s ease-out;
1363
+ }
1364
+
1365
+ .notification.success { background: hsl(var(--success)); color: white; }
1366
+ .notification.error { background: hsl(var(--destructive)); color: white; }
1367
+
1368
+ @keyframes slideIn {
1369
+ from { transform: translateX(100%); opacity: 0; }
1370
+ to { transform: translateX(0); opacity: 1; }
1371
+ }
1372
+
1373
+ /* Scrollbar */
1374
+ .loop-list::-webkit-scrollbar,
1375
+ .task-list::-webkit-scrollbar {
1376
+ width: 6px;
1377
+ }
1378
+
1379
+ .loop-list::-webkit-scrollbar-track,
1380
+ .task-list::-webkit-scrollbar-track {
1381
+ background: hsl(var(--muted) / 0.3);
1382
+ border-radius: 3px;
1383
+ }
1384
+
1385
+ .loop-list::-webkit-scrollbar-thumb,
1386
+ .task-list::-webkit-scrollbar-thumb {
1387
+ background: hsl(var(--muted-foreground) / 0.3);
1388
+ border-radius: 3px;
1389
+ }
1390
+
1391
+ .loop-list::-webkit-scrollbar-thumb:hover,
1392
+ .task-list::-webkit-scrollbar-thumb:hover {
1393
+ background: hsl(var(--muted-foreground) / 0.5);
1394
+ }
1395
+
1396
+ /* Mobile Responsive */
1397
+ @media (max-width: 768px) {
1398
+ .task-item-actions {
1399
+ opacity: 1;
1400
+ }
1401
+
1402
+ .detail-header {
1403
+ flex-direction: column;
1404
+ gap: 1rem;
1405
+ align-items: flex-start;
1406
+ }
1407
+
1408
+ .detail-actions {
1409
+ width: 100%;
1410
+ }
1411
+
1412
+ .detail-actions .btn {
1413
+ flex: 1;
1414
+ justify-content: center;
1415
+ }
1416
+ }
1417
+
1418
+ /* ==========================================
1419
+ KANBAN BOARD
1420
+ ========================================== */
1421
+
1422
+ .loop-kanban-container {
1423
+ padding: 1rem;
1424
+ height: 100%;
1425
+ overflow-x: auto;
1426
+ }
1427
+
1428
+ .loop-kanban-header {
1429
+ display: flex;
1430
+ align-items: center;
1431
+ justify-content: space-between;
1432
+ margin-bottom: 1rem;
1433
+ padding: 0 0.5rem;
1434
+ }
1435
+
1436
+ .loop-kanban-title {
1437
+ font-size: 1rem;
1438
+ font-weight: 600;
1439
+ color: hsl(var(--foreground));
1440
+ display: flex;
1441
+ align-items: center;
1442
+ gap: 0.5rem;
1443
+ }
1444
+
1445
+ .loop-kanban-title i,
1446
+ .loop-kanban-title svg {
1447
+ color: hsl(var(--primary));
1448
+ }
1449
+
1450
+ .loop-kanban-actions {
1451
+ display: flex;
1452
+ gap: 0.5rem;
1453
+ }
1454
+
1455
+ .loop-kanban-board {
1456
+ display: flex;
1457
+ gap: 1rem;
1458
+ height: calc(100% - 4rem);
1459
+ min-width: max-content;
1460
+ }
1461
+
1462
+ .loop-kanban-column {
1463
+ width: 280px;
1464
+ min-width: 280px;
1465
+ background: hsl(var(--muted) / 0.2);
1466
+ border-radius: 0.5rem;
1467
+ display: flex;
1468
+ flex-direction: column;
1469
+ max-height: 100%;
1470
+ }
1471
+
1472
+ .loop-kanban-column-header {
1473
+ display: flex;
1474
+ align-items: center;
1475
+ justify-content: space-between;
1476
+ padding: 0.75rem 1rem;
1477
+ border-bottom: 1px solid hsl(var(--border));
1478
+ }
1479
+
1480
+ .loop-kanban-column-title {
1481
+ font-size: 0.8125rem;
1482
+ font-weight: 600;
1483
+ color: hsl(var(--foreground));
1484
+ display: flex;
1485
+ align-items: center;
1486
+ gap: 0.5rem;
1487
+ }
1488
+
1489
+ .loop-kanban-column-count {
1490
+ font-size: 0.6875rem;
1491
+ padding: 0.125rem 0.5rem;
1492
+ background: hsl(var(--muted));
1493
+ color: hsl(var(--muted-foreground));
1494
+ border-radius: 999px;
1495
+ font-weight: 600;
1496
+ }
1497
+
1498
+ /* Column status colors */
1499
+ .loop-kanban-column[data-status="created"] .loop-kanban-column-title { color: hsl(var(--muted-foreground)); }
1500
+ .loop-kanban-column[data-status="running"] .loop-kanban-column-title { color: hsl(var(--info)); }
1501
+ .loop-kanban-column[data-status="paused"] .loop-kanban-column-title { color: hsl(var(--warning)); }
1502
+ .loop-kanban-column[data-status="completed"] .loop-kanban-column-title { color: hsl(var(--success)); }
1503
+ .loop-kanban-column[data-status="failed"] .loop-kanban-column-title { color: hsl(var(--destructive)); }
1504
+
1505
+ .loop-kanban-column-body {
1506
+ flex: 1;
1507
+ overflow-y: auto;
1508
+ padding: 0.5rem;
1509
+ transition: all 0.2s ease;
1510
+ min-height: 100px;
1511
+ }
1512
+
1513
+ /* Drag-over state for columns */
1514
+ .loop-kanban-column-body.drag-over {
1515
+ background: hsl(var(--primary) / 0.08);
1516
+ border: 2px dashed hsl(var(--primary) / 0.4);
1517
+ border-radius: 0.5rem;
1518
+ }
1519
+
1520
+ /* Empty column placeholder */
1521
+ .kanban-empty-column {
1522
+ display: flex;
1523
+ flex-direction: column;
1524
+ align-items: center;
1525
+ justify-content: center;
1526
+ padding: 2rem 1rem;
1527
+ color: hsl(var(--muted-foreground));
1528
+ font-size: 0.75rem;
1529
+ text-align: center;
1530
+ min-height: 80px;
1531
+ }
1532
+
1533
+ /* Kanban Task Card */
1534
+ .loop-task-card {
1535
+ background: hsl(var(--card));
1536
+ border: 1px solid hsl(var(--border));
1537
+ border-radius: 0.5rem;
1538
+ padding: 0.875rem;
1539
+ margin-bottom: 0.5rem;
1540
+ cursor: grab;
1541
+ transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);
1542
+ position: relative;
1543
+ will-change: transform;
1544
+ }
1545
+
1546
+ .loop-task-card:hover {
1547
+ transform: translateY(-2px);
1548
+ box-shadow: 0 4px 12px hsl(var(--foreground) / 0.08);
1549
+ border-color: hsl(var(--primary));
1550
+ }
1551
+
1552
+ .loop-task-card:active {
1553
+ cursor: grabbing;
1554
+ }
1555
+
1556
+ /* Dragging state */
1557
+ .loop-task-card.dragging {
1558
+ opacity: 0.5;
1559
+ cursor: grabbing;
1560
+ transform: rotate(3deg) scale(1.02);
1561
+ box-shadow: 0 8px 24px hsl(var(--foreground) / 0.15);
1562
+ }
1563
+
1564
+ /* Focus state for keyboard navigation */
1565
+ .loop-task-card:focus {
1566
+ outline: 2px solid hsl(var(--primary));
1567
+ outline-offset: 2px;
1568
+ }
1569
+
1570
+ .loop-task-card-header {
1571
+ display: flex;
1572
+ align-items: flex-start;
1573
+ justify-content: space-between;
1574
+ margin-bottom: 0.5rem;
1575
+ }
1576
+
1577
+ .loop-task-card-title {
1578
+ font-size: 0.8125rem;
1579
+ font-weight: 500;
1580
+ color: hsl(var(--foreground));
1581
+ line-height: 1.4;
1582
+ flex: 1;
1583
+ margin-right: 0.5rem;
1584
+ }
1585
+
1586
+ .loop-task-card-badge {
1587
+ font-size: 0.625rem;
1588
+ padding: 0.125rem 0.375rem;
1589
+ border-radius: 0.25rem;
1590
+ font-weight: 600;
1591
+ text-transform: uppercase;
1592
+ flex-shrink: 0;
1593
+ }
1594
+
1595
+ .loop-task-card-badge.tool {
1596
+ background: hsl(var(--primary) / 0.15);
1597
+ color: hsl(var(--primary));
1598
+ }
1599
+
1600
+ .loop-task-card-badge.mode-analysis {
1601
+ background: hsl(var(--info) / 0.15);
1602
+ color: hsl(var(--info));
1603
+ }
1604
+
1605
+ .loop-task-card-badge.mode-write {
1606
+ background: hsl(var(--success) / 0.15);
1607
+ color: hsl(var(--success));
1608
+ }
1609
+
1610
+ .loop-task-card-description {
1611
+ font-size: 0.75rem;
1612
+ color: hsl(var(--muted-foreground));
1613
+ line-height: 1.5;
1614
+ margin-bottom: 0.5rem;
1615
+ display: -webkit-box;
1616
+ -webkit-line-clamp: 2;
1617
+ -webkit-box-orient: vertical;
1618
+ overflow: hidden;
1619
+ }
1620
+
1621
+ .loop-task-card-meta {
1622
+ display: flex;
1623
+ align-items: center;
1624
+ gap: 0.75rem;
1625
+ font-size: 0.6875rem;
1626
+ color: hsl(var(--muted-foreground));
1627
+ }
1628
+
1629
+ .loop-task-card-meta-item {
1630
+ display: flex;
1631
+ align-items: center;
1632
+ gap: 0.25rem;
1633
+ }
1634
+
1635
+ .loop-task-card-meta-item i,
1636
+ .loop-task-card-meta-item svg {
1637
+ width: 0.75rem;
1638
+ height: 0.75rem;
1639
+ }
1640
+
1641
+ /* Kanban Empty State */
1642
+ .loop-kanban-empty {
1643
+ display: flex;
1644
+ flex-direction: column;
1645
+ align-items: center;
1646
+ justify-content: center;
1647
+ padding: 2rem 1rem;
1648
+ text-align: center;
1649
+ color: hsl(var(--muted-foreground));
1650
+ }
1651
+
1652
+ .loop-kanban-empty i,
1653
+ .loop-kanban-empty svg {
1654
+ width: 2rem;
1655
+ height: 2rem;
1656
+ margin-bottom: 0.75rem;
1657
+ opacity: 0.5;
1658
+ }
1659
+
1660
+ .loop-kanban-empty-text {
1661
+ font-size: 0.75rem;
1662
+ }
1663
+
1664
+ /* ==========================================
1665
+ PRIORITY BADGES
1666
+ ========================================== */
1667
+
1668
+ .priority-badge {
1669
+ display: inline-flex;
1670
+ align-items: center;
1671
+ gap: 0.25rem;
1672
+ font-size: 0.625rem;
1673
+ font-weight: 600;
1674
+ padding: 0.125rem 0.375rem;
1675
+ border-radius: 0.25rem;
1676
+ text-transform: uppercase;
1677
+ }
1678
+
1679
+ .priority-badge.low {
1680
+ background: hsl(var(--muted) / 0.5);
1681
+ color: hsl(var(--muted-foreground));
1682
+ }
1683
+
1684
+ .priority-badge.medium {
1685
+ background: hsl(var(--warning) / 0.15);
1686
+ color: hsl(var(--warning));
1687
+ }
1688
+
1689
+ .priority-badge.high {
1690
+ background: hsl(var(--destructive) / 0.15);
1691
+ color: hsl(var(--destructive));
1692
+ }
1693
+
1694
+ /* ==========================================
1695
+ STATUS UPDATE PANEL
1696
+ ========================================== */
1697
+
1698
+ .status-update-panel {
1699
+ display: flex;
1700
+ flex-direction: column;
1701
+ gap: 0.75rem;
1702
+ padding: 1rem;
1703
+ background: hsl(var(--muted) / 0.2);
1704
+ border-radius: 0.5rem;
1705
+ margin-top: 1rem;
1706
+ }
1707
+
1708
+ .status-update-header {
1709
+ display: flex;
1710
+ align-items: center;
1711
+ justify-content: space-between;
1712
+ }
1713
+
1714
+ .status-update-title {
1715
+ font-size: 0.875rem;
1716
+ font-weight: 600;
1717
+ color: hsl(var(--foreground));
1718
+ }
1719
+
1720
+ .status-update-time {
1721
+ font-size: 0.6875rem;
1722
+ color: hsl(var(--muted-foreground));
1723
+ }
1724
+
1725
+ .status-select-group {
1726
+ display: flex;
1727
+ gap: 0.5rem;
1728
+ flex-wrap: wrap;
1729
+ }
1730
+
1731
+ .status-option {
1732
+ padding: 0.5rem 1rem;
1733
+ border: 1px solid hsl(var(--border));
1734
+ border-radius: 0.5rem;
1735
+ background: hsl(var(--background));
1736
+ color: hsl(var(--muted-foreground));
1737
+ font-size: 0.75rem;
1738
+ font-weight: 500;
1739
+ cursor: pointer;
1740
+ transition: all 0.2s;
1741
+ }
1742
+
1743
+ .status-option:hover {
1744
+ border-color: hsl(var(--primary));
1745
+ color: hsl(var(--primary));
1746
+ }
1747
+
1748
+ .status-option.active {
1749
+ background: hsl(var(--primary) / 0.1);
1750
+ border-color: hsl(var(--primary));
1751
+ color: hsl(var(--primary));
1752
+ }
1753
+
1754
+ .status-option.created { --status-color: var(--muted-foreground); }
1755
+ .status-option.running { --status-color: var(--info); }
1756
+ .status-option.paused { --status-color: var(--warning); }
1757
+ .status-option.completed { --status-color: var(--success); }
1758
+ .status-option.failed { --status-color: var(--destructive); }
1759
+
1760
+ .status-option.active.created,
1761
+ .status-option.active.running,
1762
+ .status-option.active.paused,
1763
+ .status-option.active.completed,
1764
+ .status-option.active.failed {
1765
+ background: hsl(var(--status-color) / 0.1);
1766
+ border-color: hsl(var(--status-color));
1767
+ color: hsl(var(--status-color));
1768
+ }
1769
+
1770
+ /* ==========================================
1771
+ DETAIL TABS (View Switcher)
1772
+ ========================================== */
1773
+
1774
+ .detail-view-tabs {
1775
+ display: flex;
1776
+ gap: 0.25rem;
1777
+ margin-bottom: 1rem;
1778
+ padding: 0.25rem;
1779
+ background: hsl(var(--muted) / 0.3);
1780
+ border-radius: 0.5rem;
1781
+ width: fit-content;
1782
+ }
1783
+
1784
+ .detail-tab-btn {
1785
+ display: flex;
1786
+ align-items: center;
1787
+ gap: 0.375rem;
1788
+ padding: 0.5rem 1rem;
1789
+ background: transparent;
1790
+ border: none;
1791
+ border-radius: 0.375rem;
1792
+ color: hsl(var(--muted-foreground));
1793
+ font-size: 0.8125rem;
1794
+ font-weight: 500;
1795
+ cursor: pointer;
1796
+ transition: all 0.2s ease;
1797
+ }
1798
+
1799
+ .detail-tab-btn:hover {
1800
+ background: hsl(var(--background));
1801
+ color: hsl(var(--foreground));
1802
+ }
1803
+
1804
+ .detail-tab-btn.active {
1805
+ background: hsl(var(--background));
1806
+ color: hsl(var(--primary));
1807
+ box-shadow: 0 1px 3px hsl(var(--foreground) / 0.1);
1808
+ }
1809
+
1810
+ .detail-tab-btn i,
1811
+ .detail-tab-btn svg {
1812
+ width: 1rem;
1813
+ height: 1rem;
1814
+ }
1815
+
1816
+ /* Detail Tab Content */
1817
+ .detail-tab-content {
1818
+ display: none;
1819
+ }
1820
+
1821
+ .detail-tab-content.active {
1822
+ display: block;
1823
+ }
1824
+
1825
+ /* ==========================================
1826
+ NOTES AND TAGS
1827
+ ========================================== */
1828
+
1829
+ .loop-notes {
1830
+ margin-top: 1rem;
1831
+ padding: 1rem;
1832
+ background: hsl(var(--muted) / 0.2);
1833
+ border-radius: 0.5rem;
1834
+ }
1835
+
1836
+ .loop-notes-label {
1837
+ font-size: 0.75rem;
1838
+ font-weight: 600;
1839
+ color: hsl(var(--muted-foreground));
1840
+ margin-bottom: 0.5rem;
1841
+ text-transform: uppercase;
1842
+ letter-spacing: 0.05em;
1843
+ }
1844
+
1845
+ .loop-notes-content {
1846
+ font-size: 0.8125rem;
1847
+ color: hsl(var(--foreground));
1848
+ line-height: 1.6;
1849
+ }
1850
+
1851
+ .loop-tags {
1852
+ display: flex;
1853
+ flex-wrap: wrap;
1854
+ gap: 0.375rem;
1855
+ margin-top: 0.75rem;
1856
+ }
1857
+
1858
+ .loop-tag {
1859
+ display: inline-flex;
1860
+ align-items: center;
1861
+ padding: 0.25rem 0.5rem;
1862
+ background: hsl(var(--primary) / 0.1);
1863
+ color: hsl(var(--primary));
1864
+ border-radius: 0.25rem;
1865
+ font-size: 0.6875rem;
1866
+ font-weight: 500;
1867
+ }
1868
+
1869
+ /* ==========================================
1870
+ KANBAN RESPONSIVE
1871
+ ========================================== */
1872
+
1873
+ @media (max-width: 1024px) {
1874
+ .loop-kanban-board {
1875
+ gap: 0.75rem;
1876
+ }
1877
+
1878
+ .loop-kanban-column {
1879
+ width: 250px;
1880
+ min-width: 250px;
1881
+ }
1882
+ }
1883
+
1884
+ @media (max-width: 768px) {
1885
+ .loop-kanban-board {
1886
+ flex-direction: column;
1887
+ height: auto;
1888
+ min-width: auto;
1889
+ }
1890
+
1891
+ .loop-kanban-column {
1892
+ width: 100%;
1893
+ min-width: 100%;
1894
+ max-height: 400px;
1895
+ }
1896
+ }