@oss-autopilot/core 0.42.0 → 0.42.2

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 (50) hide show
  1. package/dist/cli.bundle.cjs +1026 -1018
  2. package/dist/cli.js +18 -30
  3. package/dist/commands/check-integration.js +5 -4
  4. package/dist/commands/comments.js +24 -24
  5. package/dist/commands/daily.d.ts +0 -1
  6. package/dist/commands/daily.js +18 -16
  7. package/dist/commands/dashboard-components.d.ts +33 -0
  8. package/dist/commands/dashboard-components.js +57 -0
  9. package/dist/commands/dashboard-data.js +7 -6
  10. package/dist/commands/dashboard-formatters.d.ts +20 -0
  11. package/dist/commands/dashboard-formatters.js +33 -0
  12. package/dist/commands/dashboard-scripts.d.ts +7 -0
  13. package/dist/commands/dashboard-scripts.js +281 -0
  14. package/dist/commands/dashboard-server.js +3 -2
  15. package/dist/commands/dashboard-styles.d.ts +5 -0
  16. package/dist/commands/dashboard-styles.js +765 -0
  17. package/dist/commands/dashboard-templates.d.ts +6 -18
  18. package/dist/commands/dashboard-templates.js +30 -1134
  19. package/dist/commands/dashboard.js +2 -1
  20. package/dist/commands/dismiss.d.ts +6 -6
  21. package/dist/commands/dismiss.js +13 -13
  22. package/dist/commands/local-repos.js +2 -1
  23. package/dist/commands/parse-list.js +2 -1
  24. package/dist/commands/startup.js +6 -16
  25. package/dist/commands/validation.d.ts +3 -1
  26. package/dist/commands/validation.js +12 -6
  27. package/dist/core/errors.d.ts +9 -0
  28. package/dist/core/errors.js +17 -0
  29. package/dist/core/github-stats.d.ts +14 -21
  30. package/dist/core/github-stats.js +84 -138
  31. package/dist/core/http-cache.d.ts +6 -0
  32. package/dist/core/http-cache.js +16 -4
  33. package/dist/core/index.d.ts +3 -2
  34. package/dist/core/index.js +3 -2
  35. package/dist/core/issue-conversation.js +4 -4
  36. package/dist/core/issue-discovery.d.ts +5 -0
  37. package/dist/core/issue-discovery.js +70 -93
  38. package/dist/core/issue-vetting.js +17 -17
  39. package/dist/core/logger.d.ts +5 -0
  40. package/dist/core/logger.js +8 -0
  41. package/dist/core/pr-monitor.d.ts +6 -20
  42. package/dist/core/pr-monitor.js +16 -52
  43. package/dist/core/review-analysis.js +8 -6
  44. package/dist/core/state.js +4 -5
  45. package/dist/core/test-utils.d.ts +14 -0
  46. package/dist/core/test-utils.js +125 -0
  47. package/dist/core/utils.d.ts +11 -0
  48. package/dist/core/utils.js +21 -0
  49. package/dist/formatters/json.d.ts +0 -1
  50. package/package.json +1 -1
@@ -0,0 +1,765 @@
1
+ /**
2
+ * Dashboard CSS styles: theme variables, layout, component styles.
3
+ * Extracted from dashboard-templates.ts for maintainability.
4
+ */
5
+ export const DASHBOARD_CSS = `
6
+ :root, [data-theme="dark"] {
7
+ --bg-base: #080b10;
8
+ --bg-surface: rgba(22, 27, 34, 0.65);
9
+ --bg-elevated: rgba(28, 33, 40, 0.8);
10
+ --border: rgba(48, 54, 61, 0.6);
11
+ --border-muted: rgba(33, 38, 45, 0.5);
12
+ --text-primary: #e6edf3;
13
+ --text-secondary: #8b949e;
14
+ --text-muted: #6e7681;
15
+ --accent-merged: #a855f7;
16
+ --accent-merged-dim: rgba(168, 85, 247, 0.12);
17
+ --accent-open: #3fb950;
18
+ --accent-open-dim: rgba(63, 185, 80, 0.12);
19
+ --accent-warning: #d29922;
20
+ --accent-warning-dim: rgba(210, 153, 34, 0.12);
21
+ --accent-error: #f85149;
22
+ --accent-error-dim: rgba(248, 81, 73, 0.10);
23
+ --accent-conflict: #da3633;
24
+ --accent-info: #58a6ff;
25
+ --accent-info-dim: rgba(88, 166, 255, 0.08);
26
+ --chart-border: rgba(8, 11, 16, 0.8);
27
+ --chart-grid: rgba(48, 54, 61, 0.3);
28
+ --scrollbar-track: rgba(28, 33, 40, 0.8);
29
+ --scrollbar-thumb: rgba(48, 54, 61, 0.6);
30
+ }
31
+
32
+ [data-theme="light"] {
33
+ --bg-base: #f6f8fa;
34
+ --bg-surface: rgba(255, 255, 255, 0.85);
35
+ --bg-elevated: rgba(246, 248, 250, 0.95);
36
+ --border: rgba(208, 215, 222, 0.6);
37
+ --border-muted: rgba(216, 222, 228, 0.5);
38
+ --text-primary: #1f2328;
39
+ --text-secondary: #656d76;
40
+ --text-muted: #8b949e;
41
+ --accent-merged: #8250df;
42
+ --accent-merged-dim: rgba(130, 80, 223, 0.1);
43
+ --accent-open: #1a7f37;
44
+ --accent-open-dim: rgba(26, 127, 55, 0.1);
45
+ --accent-warning: #9a6700;
46
+ --accent-warning-dim: rgba(154, 103, 0, 0.1);
47
+ --accent-error: #cf222e;
48
+ --accent-error-dim: rgba(207, 34, 46, 0.08);
49
+ --accent-conflict: #cf222e;
50
+ --accent-info: #0969da;
51
+ --accent-info-dim: rgba(9, 105, 218, 0.08);
52
+ --chart-border: rgba(255, 255, 255, 0.8);
53
+ --chart-grid: rgba(208, 215, 222, 0.4);
54
+ --scrollbar-track: rgba(246, 248, 250, 0.95);
55
+ --scrollbar-thumb: rgba(208, 215, 222, 0.6);
56
+ }
57
+
58
+ @media (prefers-color-scheme: light) {
59
+ :root:not([data-theme="dark"]) {
60
+ --bg-base: #f6f8fa;
61
+ --bg-surface: rgba(255, 255, 255, 0.85);
62
+ --bg-elevated: rgba(246, 248, 250, 0.95);
63
+ --border: rgba(208, 215, 222, 0.6);
64
+ --border-muted: rgba(216, 222, 228, 0.5);
65
+ --text-primary: #1f2328;
66
+ --text-secondary: #656d76;
67
+ --text-muted: #8b949e;
68
+ --accent-merged: #8250df;
69
+ --accent-merged-dim: rgba(130, 80, 223, 0.1);
70
+ --accent-open: #1a7f37;
71
+ --accent-open-dim: rgba(26, 127, 55, 0.1);
72
+ --accent-warning: #9a6700;
73
+ --accent-warning-dim: rgba(154, 103, 0, 0.1);
74
+ --accent-error: #cf222e;
75
+ --accent-error-dim: rgba(207, 34, 46, 0.08);
76
+ --accent-conflict: #cf222e;
77
+ --accent-info: #0969da;
78
+ --accent-info-dim: rgba(9, 105, 218, 0.08);
79
+ --chart-border: rgba(255, 255, 255, 0.8);
80
+ --chart-grid: rgba(208, 215, 222, 0.4);
81
+ --scrollbar-track: rgba(246, 248, 250, 0.95);
82
+ --scrollbar-thumb: rgba(208, 215, 222, 0.6);
83
+ }
84
+ }
85
+
86
+ * { margin: 0; padding: 0; box-sizing: border-box; }
87
+
88
+ body {
89
+ font-family: 'Geist', -apple-system, BlinkMacSystemFont, sans-serif;
90
+ background: var(--bg-base);
91
+ color: var(--text-primary);
92
+ min-height: 100vh;
93
+ line-height: 1.5;
94
+ overflow-x: hidden;
95
+ }
96
+
97
+ body::before {
98
+ content: '';
99
+ position: fixed;
100
+ top: -20%; left: -10%;
101
+ width: 60%; height: 60%;
102
+ background: radial-gradient(ellipse, rgba(88, 166, 255, 0.06) 0%, transparent 70%);
103
+ pointer-events: none;
104
+ z-index: 0;
105
+ }
106
+
107
+ body::after {
108
+ content: '';
109
+ position: fixed;
110
+ bottom: -20%; right: -10%;
111
+ width: 50%; height: 50%;
112
+ background: radial-gradient(ellipse, rgba(168, 85, 247, 0.05) 0%, transparent 70%);
113
+ pointer-events: none;
114
+ z-index: 0;
115
+ }
116
+
117
+ [data-theme="light"] body::before,
118
+ [data-theme="light"] body::after {
119
+ display: none;
120
+ }
121
+
122
+ .container {
123
+ max-width: 1400px;
124
+ margin: 0 auto;
125
+ padding: 2rem;
126
+ position: relative;
127
+ z-index: 1;
128
+ }
129
+
130
+ .header {
131
+ display: flex;
132
+ align-items: center;
133
+ justify-content: space-between;
134
+ margin-bottom: 1.5rem;
135
+ padding-bottom: 1rem;
136
+ border-bottom: 1px solid var(--border-muted);
137
+ }
138
+
139
+ .header-left {
140
+ display: flex;
141
+ align-items: center;
142
+ gap: 1rem;
143
+ }
144
+
145
+ .logo {
146
+ width: 44px;
147
+ height: 44px;
148
+ background: linear-gradient(135deg, var(--accent-info) 0%, var(--accent-merged) 50%, #f778ba 100%);
149
+ border-radius: 12px;
150
+ display: flex;
151
+ align-items: center;
152
+ justify-content: center;
153
+ font-size: 1.5rem;
154
+ box-shadow: 0 0 24px rgba(168, 85, 247, 0.3), 0 0 48px rgba(88, 166, 255, 0.15);
155
+ }
156
+
157
+ .header h1 {
158
+ font-size: 1.75rem;
159
+ font-weight: 600;
160
+ letter-spacing: -0.02em;
161
+ background: linear-gradient(135deg, var(--text-primary) 0%, var(--text-secondary) 100%);
162
+ -webkit-background-clip: text;
163
+ -webkit-text-fill-color: transparent;
164
+ background-clip: text;
165
+ }
166
+
167
+ .header-subtitle {
168
+ font-family: 'Geist Mono', monospace;
169
+ font-size: 0.75rem;
170
+ color: var(--text-muted);
171
+ text-transform: uppercase;
172
+ letter-spacing: 0.1em;
173
+ }
174
+
175
+ .timestamp {
176
+ font-family: 'Geist Mono', monospace;
177
+ font-size: 0.8rem;
178
+ color: var(--text-muted);
179
+ display: flex;
180
+ align-items: center;
181
+ gap: 0.5rem;
182
+ }
183
+
184
+ .timestamp::before {
185
+ content: '';
186
+ width: 8px;
187
+ height: 8px;
188
+ background: var(--accent-open);
189
+ border-radius: 50%;
190
+ animation: pulse 2s ease-in-out infinite;
191
+ }
192
+
193
+ @keyframes pulse {
194
+ 0%, 100% { opacity: 1; box-shadow: 0 0 0 0 rgba(35, 134, 54, 0.4); }
195
+ 50% { opacity: 0.8; box-shadow: 0 0 0 8px rgba(35, 134, 54, 0); }
196
+ }
197
+
198
+ .stats-grid {
199
+ display: flex;
200
+ background: var(--bg-surface);
201
+ border: 1px solid var(--border-muted);
202
+ border-radius: 12px;
203
+ margin-bottom: 1.5rem;
204
+ overflow: hidden;
205
+ }
206
+
207
+ @media (max-width: 768px) {
208
+ .stats-grid { flex-wrap: wrap; }
209
+ .stat-card { flex: 1 1 33%; }
210
+ }
211
+
212
+ .stat-card {
213
+ flex: 1;
214
+ padding: 1rem 1.25rem;
215
+ position: relative;
216
+ transition: background 0.2s ease;
217
+ }
218
+
219
+ .stat-card + .stat-card {
220
+ border-left: 1px solid var(--border-muted);
221
+ }
222
+
223
+ .stat-card:hover {
224
+ background: rgba(255, 255, 255, 0.02);
225
+ }
226
+
227
+ .stat-card::after {
228
+ content: '';
229
+ position: absolute;
230
+ bottom: 0; left: 0.75rem; right: 0.75rem;
231
+ height: 2px;
232
+ background: var(--accent-color, var(--border));
233
+ border-radius: 2px;
234
+ opacity: 0.7;
235
+ }
236
+
237
+ .stat-card.active { --accent-color: var(--accent-open); }
238
+ .stat-card.merged { --accent-color: var(--accent-merged); }
239
+ .stat-card.closed { --accent-color: var(--text-muted); }
240
+ .stat-card.rate { --accent-color: var(--accent-info); }
241
+
242
+ .stat-value {
243
+ font-family: 'Geist Mono', monospace;
244
+ font-size: 1.75rem;
245
+ font-weight: 600;
246
+ line-height: 1;
247
+ margin-bottom: 0.25rem;
248
+ }
249
+
250
+ .stat-card.active .stat-value { color: var(--accent-open); }
251
+ .stat-card.merged .stat-value { color: var(--accent-merged); }
252
+ .stat-card.closed .stat-value { color: var(--text-muted); }
253
+ .stat-card.rate .stat-value { color: var(--accent-info); }
254
+
255
+ .stat-label {
256
+ font-size: 0.7rem;
257
+ color: var(--text-secondary);
258
+ text-transform: uppercase;
259
+ letter-spacing: 0.05em;
260
+ }
261
+
262
+ .health-section {
263
+ background: var(--bg-surface);
264
+ border: 1px solid var(--border-muted);
265
+ border-radius: 10px;
266
+ padding: 1.25rem;
267
+ margin-bottom: 1.25rem;
268
+ }
269
+
270
+ .health-header {
271
+ display: flex;
272
+ align-items: center;
273
+ gap: 0.75rem;
274
+ margin-bottom: 1rem;
275
+ }
276
+
277
+ .health-header h2 {
278
+ font-size: 1rem;
279
+ font-weight: 600;
280
+ color: var(--text-primary);
281
+ }
282
+
283
+ .health-badge {
284
+ font-family: 'Geist Mono', monospace;
285
+ font-size: 0.7rem;
286
+ padding: 0.25rem 0.5rem;
287
+ border-radius: 4px;
288
+ background: var(--accent-error-dim);
289
+ color: var(--accent-error);
290
+ }
291
+
292
+ .health-items {
293
+ display: grid;
294
+ grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
295
+ gap: 0.75rem;
296
+ }
297
+
298
+ .health-item {
299
+ display: flex;
300
+ align-items: center;
301
+ gap: 0.75rem;
302
+ padding: 0.75rem 1rem;
303
+ background: var(--bg-elevated);
304
+ border-radius: 8px;
305
+ border-left: 3px solid;
306
+ transition: transform 0.15s ease;
307
+ }
308
+
309
+ .health-item:hover { transform: translateX(4px); }
310
+
311
+ .health-item.ci-failing {
312
+ border-left-color: var(--accent-error);
313
+ background: var(--accent-error-dim);
314
+ }
315
+
316
+ .health-item.conflict {
317
+ border-left-color: var(--accent-conflict);
318
+ background: rgba(218, 54, 51, 0.1);
319
+ }
320
+
321
+ .health-item.incomplete-checklist {
322
+ border-left-color: var(--accent-info);
323
+ }
324
+ .health-item.needs-response,
325
+ .health-item.needs-changes {
326
+ border-left-color: var(--accent-warning);
327
+ background: var(--accent-warning-dim);
328
+ }
329
+
330
+ .health-item.changes-addressed,
331
+ .health-item.waiting-maintainer {
332
+ border-left-color: var(--accent-info);
333
+ background: var(--accent-info-dim);
334
+ }
335
+
336
+ .health-item.ci-not-running {
337
+ border-left-color: var(--text-muted);
338
+ background: rgba(110, 118, 129, 0.1);
339
+ }
340
+
341
+ .health-item.missing-files {
342
+ border-left-color: var(--accent-warning);
343
+ background: var(--accent-warning-dim);
344
+ }
345
+
346
+ .health-item.ci-blocked {
347
+ border-left-color: var(--text-muted);
348
+ background: rgba(110, 118, 129, 0.1);
349
+ }
350
+
351
+ .health-item.needs-rebase {
352
+ border-left-color: var(--accent-warning);
353
+ background: var(--accent-warning-dim);
354
+ }
355
+
356
+ .health-item.shelved {
357
+ border-left-color: var(--text-muted);
358
+ background: rgba(110, 118, 129, 0.06);
359
+ opacity: 0.6;
360
+ }
361
+
362
+ .health-item.shelved .health-icon { background: rgba(110, 118, 129, 0.12); color: var(--text-muted); }
363
+
364
+ .health-item.auto-unshelved {
365
+ border-left-color: var(--accent-info);
366
+ background: var(--accent-info-dim);
367
+ }
368
+
369
+ .health-item.auto-unshelved .health-icon { background: var(--accent-info-dim); color: var(--accent-info); }
370
+
371
+ .stat-card.shelved { --accent-color: var(--text-muted); }
372
+ .stat-card.shelved .stat-value { color: var(--text-muted); }
373
+
374
+ .waiting-section {
375
+ border-color: rgba(88, 166, 255, 0.2);
376
+ }
377
+
378
+ .health-icon {
379
+ width: 32px;
380
+ height: 32px;
381
+ border-radius: 8px;
382
+ display: flex;
383
+ align-items: center;
384
+ justify-content: center;
385
+ font-size: 1rem;
386
+ flex-shrink: 0;
387
+ }
388
+
389
+ .health-item.ci-failing .health-icon { background: var(--accent-error-dim); color: var(--accent-error); }
390
+ .health-item.conflict .health-icon { background: rgba(218, 54, 51, 0.15); color: var(--accent-conflict); }
391
+ .health-item.incomplete-checklist .health-icon { background: var(--accent-info-dim); color: var(--accent-info); }
392
+ .health-item.needs-response .health-icon,
393
+ .health-item.needs-changes .health-icon { background: var(--accent-warning-dim); color: var(--accent-warning); }
394
+ .health-item.changes-addressed .health-icon,
395
+ .health-item.waiting-maintainer .health-icon { background: var(--accent-info-dim); color: var(--accent-info); }
396
+ .health-item.ci-not-running .health-icon { background: rgba(110, 118, 129, 0.15); color: var(--text-muted); }
397
+ .health-item.missing-files .health-icon { background: var(--accent-warning-dim); color: var(--accent-warning); }
398
+ .health-item.ci-blocked .health-icon { background: rgba(110, 118, 129, 0.15); color: var(--text-muted); }
399
+ .health-item.needs-rebase .health-icon { background: var(--accent-warning-dim); color: var(--accent-warning); }
400
+
401
+ .health-content { flex: 1; min-width: 0; }
402
+
403
+ .health-title {
404
+ font-size: 0.85rem;
405
+ font-weight: 500;
406
+ color: var(--text-primary);
407
+ white-space: nowrap;
408
+ overflow: hidden;
409
+ text-overflow: ellipsis;
410
+ }
411
+
412
+ .health-title a { color: inherit; text-decoration: none; }
413
+ .health-title a:hover { color: var(--accent-info); }
414
+
415
+ .health-meta {
416
+ font-family: 'Geist Mono', monospace;
417
+ font-size: 0.7rem;
418
+ color: var(--text-muted);
419
+ }
420
+
421
+ .health-empty {
422
+ display: flex;
423
+ align-items: center;
424
+ justify-content: center;
425
+ padding: 2rem;
426
+ color: var(--text-muted);
427
+ font-size: 0.9rem;
428
+ }
429
+
430
+ .health-empty::before {
431
+ content: '\\2713';
432
+ display: inline-flex;
433
+ align-items: center;
434
+ justify-content: center;
435
+ width: 24px;
436
+ height: 24px;
437
+ background: var(--accent-open-dim);
438
+ color: var(--accent-open);
439
+ border-radius: 50%;
440
+ margin-right: 0.75rem;
441
+ font-weight: bold;
442
+ }
443
+
444
+ .main-grid {
445
+ display: grid;
446
+ grid-template-columns: 1fr 1fr;
447
+ gap: 1.25rem;
448
+ margin-bottom: 1.25rem;
449
+ }
450
+
451
+ @media (max-width: 1024px) { .main-grid { grid-template-columns: 1fr; } }
452
+
453
+ .card {
454
+ background: var(--bg-surface);
455
+ border: 1px solid var(--border-muted);
456
+ border-radius: 10px;
457
+ overflow: hidden;
458
+ }
459
+
460
+ .card-header {
461
+ display: flex;
462
+ align-items: center;
463
+ justify-content: space-between;
464
+ padding: 0.75rem 1.125rem;
465
+ border-bottom: 1px solid var(--border-muted);
466
+ }
467
+
468
+ .card-title {
469
+ font-size: 0.75rem;
470
+ font-weight: 600;
471
+ color: var(--text-secondary);
472
+ text-transform: uppercase;
473
+ letter-spacing: 0.04em;
474
+ }
475
+
476
+ .card-body { padding: 1rem 1.125rem; }
477
+
478
+ .chart-container {
479
+ position: relative;
480
+ height: 260px;
481
+ }
482
+
483
+ .pr-list-section {
484
+ background: var(--bg-surface);
485
+ border: 1px solid var(--border-muted);
486
+ border-radius: 10px;
487
+ overflow: hidden;
488
+ }
489
+
490
+ .pr-list-header {
491
+ display: flex;
492
+ align-items: center;
493
+ justify-content: space-between;
494
+ padding: 0.75rem 1.125rem;
495
+ border-bottom: 1px solid var(--border-muted);
496
+ }
497
+
498
+ .pr-list-title {
499
+ font-size: 0.75rem;
500
+ font-weight: 600;
501
+ color: var(--text-secondary);
502
+ text-transform: uppercase;
503
+ letter-spacing: 0.04em;
504
+ }
505
+
506
+ .pr-count {
507
+ font-family: 'Geist Mono', monospace;
508
+ font-size: 0.75rem;
509
+ padding: 0.25rem 0.5rem;
510
+ background: var(--accent-open-dim);
511
+ color: var(--accent-open);
512
+ border-radius: 4px;
513
+ }
514
+
515
+ .pr-list {
516
+ max-height: 600px;
517
+ overflow-y: auto;
518
+ }
519
+
520
+ .pr-list::-webkit-scrollbar { width: 6px; }
521
+ .pr-list::-webkit-scrollbar-track { background: var(--scrollbar-track, var(--bg-elevated)); }
522
+ .pr-list::-webkit-scrollbar-thumb { background: var(--scrollbar-thumb, var(--border)); border-radius: 3px; }
523
+
524
+ .pr-item {
525
+ display: flex;
526
+ align-items: flex-start;
527
+ gap: 1rem;
528
+ padding: 1rem 1.25rem;
529
+ border-bottom: 1px solid var(--border-muted);
530
+ transition: background 0.15s ease;
531
+ }
532
+
533
+ .pr-item:last-child { border-bottom: none; }
534
+ .pr-item:hover { background: var(--bg-elevated); }
535
+
536
+ .pr-status-indicator {
537
+ width: 40px;
538
+ height: 40px;
539
+ border-radius: 10px;
540
+ display: flex;
541
+ align-items: center;
542
+ justify-content: center;
543
+ flex-shrink: 0;
544
+ font-size: 1.1rem;
545
+ background: var(--accent-open-dim);
546
+ color: var(--accent-open);
547
+ }
548
+
549
+ .pr-item.has-issues .pr-status-indicator {
550
+ background: var(--accent-error-dim);
551
+ color: var(--accent-error);
552
+ animation: attention-pulse 2s ease-in-out infinite;
553
+ }
554
+
555
+ .pr-item.stale .pr-status-indicator {
556
+ background: var(--accent-warning-dim);
557
+ color: var(--accent-warning);
558
+ }
559
+
560
+ @keyframes attention-pulse {
561
+ 0%, 100% { box-shadow: 0 0 0 0 rgba(248, 81, 73, 0.4); }
562
+ 50% { box-shadow: 0 0 0 6px rgba(248, 81, 73, 0); }
563
+ }
564
+
565
+ .pr-content { flex: 1; min-width: 0; }
566
+
567
+ .pr-title-row {
568
+ display: flex;
569
+ align-items: center;
570
+ gap: 0.5rem;
571
+ margin-bottom: 0.25rem;
572
+ }
573
+
574
+ .pr-title {
575
+ font-size: 0.9rem;
576
+ font-weight: 500;
577
+ color: var(--text-primary);
578
+ text-decoration: none;
579
+ white-space: nowrap;
580
+ overflow: hidden;
581
+ text-overflow: ellipsis;
582
+ }
583
+
584
+ .pr-title:hover { color: var(--accent-info); }
585
+
586
+ .pr-repo {
587
+ font-family: 'Geist Mono', monospace;
588
+ font-size: 0.75rem;
589
+ color: var(--text-muted);
590
+ flex-shrink: 0;
591
+ }
592
+
593
+ .pr-badges {
594
+ display: flex;
595
+ flex-wrap: wrap;
596
+ gap: 0.5rem;
597
+ }
598
+
599
+ .badge {
600
+ font-family: 'Geist Mono', monospace;
601
+ font-size: 0.65rem;
602
+ font-weight: 500;
603
+ padding: 0.2rem 0.5rem;
604
+ border-radius: 4px;
605
+ text-transform: uppercase;
606
+ letter-spacing: 0.03em;
607
+ }
608
+
609
+ .badge-ci-failing { background: var(--accent-error-dim); color: var(--accent-error); }
610
+ .badge-conflict { background: rgba(218, 54, 51, 0.15); color: var(--accent-conflict); }
611
+ .badge-needs-response { background: var(--accent-warning-dim); color: var(--accent-warning); }
612
+ .badge-stale { background: var(--accent-warning-dim); color: var(--accent-warning); }
613
+ .badge-passing { background: var(--accent-open-dim); color: var(--accent-open); }
614
+ .badge-pending { background: var(--accent-info-dim); color: var(--accent-info); }
615
+ .badge-days { background: var(--bg-elevated); color: var(--text-muted); }
616
+ .badge-changes-requested { background: var(--accent-warning-dim); color: var(--accent-warning); }
617
+ .badge-changes-addressed { background: var(--accent-info-dim); color: var(--accent-info); }
618
+
619
+ .pr-activity {
620
+ font-family: 'Geist Mono', monospace;
621
+ font-size: 0.7rem;
622
+ color: var(--text-muted);
623
+ margin-left: auto;
624
+ text-align: right;
625
+ flex-shrink: 0;
626
+ }
627
+
628
+ .empty-state {
629
+ display: flex;
630
+ flex-direction: column;
631
+ align-items: center;
632
+ justify-content: center;
633
+ padding: 3rem;
634
+ color: var(--text-muted);
635
+ }
636
+
637
+ .empty-state-icon {
638
+ font-size: 2.5rem;
639
+ margin-bottom: 1rem;
640
+ opacity: 0.5;
641
+ }
642
+
643
+ .footer {
644
+ text-align: center;
645
+ padding-top: 1.5rem;
646
+ border-top: 1px solid var(--border-muted);
647
+ margin-top: 1.5rem;
648
+ }
649
+
650
+ .footer p {
651
+ font-family: 'Geist Mono', monospace;
652
+ font-size: 0.7rem;
653
+ color: var(--text-muted);
654
+ }
655
+
656
+ @keyframes fadeInUp {
657
+ from { opacity: 0; transform: translateY(12px); }
658
+ to { opacity: 1; transform: translateY(0); }
659
+ }
660
+
661
+ .stats-grid, .health-section, .pr-list-section {
662
+ animation: fadeInUp 0.35s ease;
663
+ }
664
+
665
+ .theme-toggle {
666
+ background: var(--bg-elevated);
667
+ border: 1px solid var(--border-muted);
668
+ border-radius: 8px;
669
+ padding: 0.4rem 0.6rem;
670
+ cursor: pointer;
671
+ color: var(--text-secondary);
672
+ display: flex;
673
+ align-items: center;
674
+ gap: 0.4rem;
675
+ font-family: 'Geist Mono', monospace;
676
+ font-size: 0.7rem;
677
+ transition: background 0.2s ease, color 0.2s ease;
678
+ }
679
+
680
+ .theme-toggle:hover {
681
+ background: var(--bg-surface);
682
+ color: var(--text-primary);
683
+ }
684
+
685
+ .theme-toggle svg { flex-shrink: 0; }
686
+
687
+ .header-controls {
688
+ display: flex;
689
+ align-items: center;
690
+ gap: 0.75rem;
691
+ }
692
+
693
+ .filter-toolbar {
694
+ display: flex;
695
+ align-items: center;
696
+ gap: 0.75rem;
697
+ padding: 0.75rem 1rem;
698
+ background: var(--bg-surface);
699
+ border: 1px solid var(--border-muted);
700
+ border-radius: 10px;
701
+ margin-bottom: 1.25rem;
702
+ flex-wrap: wrap;
703
+ }
704
+
705
+ .filter-toolbar label {
706
+ font-family: 'Geist Mono', monospace;
707
+ font-size: 0.7rem;
708
+ color: var(--text-muted);
709
+ text-transform: uppercase;
710
+ letter-spacing: 0.04em;
711
+ flex-shrink: 0;
712
+ }
713
+
714
+ .filter-search {
715
+ flex: 1;
716
+ min-width: 180px;
717
+ padding: 0.4rem 0.75rem;
718
+ background: var(--bg-elevated);
719
+ border: 1px solid var(--border-muted);
720
+ border-radius: 6px;
721
+ color: var(--text-primary);
722
+ font-family: 'Geist', sans-serif;
723
+ font-size: 0.8rem;
724
+ outline: none;
725
+ transition: border-color 0.2s ease;
726
+ }
727
+
728
+ .filter-search:focus {
729
+ border-color: var(--accent-info);
730
+ }
731
+
732
+ .filter-search::placeholder {
733
+ color: var(--text-muted);
734
+ }
735
+
736
+ .filter-select {
737
+ padding: 0.4rem 0.75rem;
738
+ background: var(--bg-elevated);
739
+ border: 1px solid var(--border-muted);
740
+ border-radius: 6px;
741
+ color: var(--text-primary);
742
+ font-family: 'Geist', sans-serif;
743
+ font-size: 0.8rem;
744
+ outline: none;
745
+ cursor: pointer;
746
+ transition: border-color 0.2s ease;
747
+ }
748
+
749
+ .filter-select:focus {
750
+ border-color: var(--accent-info);
751
+ }
752
+
753
+ .filter-count {
754
+ font-family: 'Geist Mono', monospace;
755
+ font-size: 0.7rem;
756
+ color: var(--text-muted);
757
+ margin-left: auto;
758
+ flex-shrink: 0;
759
+ }
760
+
761
+ .pr-item[data-hidden="true"],
762
+ .health-item[data-hidden="true"] {
763
+ display: none;
764
+ }
765
+ `;