@pennyfarthing/cyclist 10.0.3 → 10.2.0

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 (154) hide show
  1. package/dist/api/agent-load.d.ts +3 -0
  2. package/dist/api/agent-load.d.ts.map +1 -0
  3. package/dist/api/agent-load.js +124 -0
  4. package/dist/api/agent-load.js.map +1 -0
  5. package/dist/api/code-markers.d.ts +9 -0
  6. package/dist/api/code-markers.d.ts.map +1 -0
  7. package/dist/api/code-markers.js +62 -0
  8. package/dist/api/code-markers.js.map +1 -0
  9. package/dist/api/complexity.d.ts +3 -0
  10. package/dist/api/complexity.d.ts.map +1 -0
  11. package/dist/api/complexity.js +47 -0
  12. package/dist/api/complexity.js.map +1 -0
  13. package/dist/api/dead-code.d.ts +3 -0
  14. package/dist/api/dead-code.d.ts.map +1 -0
  15. package/dist/api/dead-code.js +70 -0
  16. package/dist/api/dead-code.js.map +1 -0
  17. package/dist/api/dependencies.d.ts +3 -0
  18. package/dist/api/dependencies.d.ts.map +1 -0
  19. package/dist/api/dependencies.js +43 -0
  20. package/dist/api/dependencies.js.map +1 -0
  21. package/dist/api/git.d.ts +3 -2
  22. package/dist/api/git.d.ts.map +1 -1
  23. package/dist/api/git.js +11 -6
  24. package/dist/api/git.js.map +1 -1
  25. package/dist/api/health-score.d.ts +3 -0
  26. package/dist/api/health-score.d.ts.map +1 -0
  27. package/dist/api/health-score.js +47 -0
  28. package/dist/api/health-score.js.map +1 -0
  29. package/dist/api/hotspots.d.ts.map +1 -1
  30. package/dist/api/hotspots.js +9 -1
  31. package/dist/api/hotspots.js.map +1 -1
  32. package/dist/api/index.d.ts +7 -1
  33. package/dist/api/index.d.ts.map +1 -1
  34. package/dist/api/index.js +12 -2
  35. package/dist/api/index.js.map +1 -1
  36. package/dist/api/persona.d.ts +2 -0
  37. package/dist/api/persona.d.ts.map +1 -1
  38. package/dist/api/persona.js +19 -1
  39. package/dist/api/persona.js.map +1 -1
  40. package/dist/api/settings.js +1 -1
  41. package/dist/api/settings.js.map +1 -1
  42. package/dist/claude-service.d.ts +8 -2
  43. package/dist/claude-service.d.ts.map +1 -1
  44. package/dist/claude-service.js +21 -2
  45. package/dist/claude-service.js.map +1 -1
  46. package/dist/git-diff.d.ts.map +1 -1
  47. package/dist/git-diff.js +6 -5
  48. package/dist/git-diff.js.map +1 -1
  49. package/dist/main.d.ts.map +1 -1
  50. package/dist/main.js +11 -2
  51. package/dist/main.js.map +1 -1
  52. package/dist/plugin-loader.d.ts +49 -0
  53. package/dist/plugin-loader.d.ts.map +1 -0
  54. package/dist/plugin-loader.js +92 -0
  55. package/dist/plugin-loader.js.map +1 -0
  56. package/dist/preload.js +12 -1
  57. package/dist/preload.js.map +1 -1
  58. package/dist/prime.d.ts +3 -2
  59. package/dist/prime.d.ts.map +1 -1
  60. package/dist/prime.js +25 -8
  61. package/dist/prime.js.map +1 -1
  62. package/dist/public/css/react.css +1 -1
  63. package/dist/public/js/react/react.js +50 -39
  64. package/dist/server.d.ts.map +1 -1
  65. package/dist/server.js +19 -16
  66. package/dist/server.js.map +1 -1
  67. package/dist/sprint-data.d.ts +6 -0
  68. package/dist/sprint-data.d.ts.map +1 -1
  69. package/dist/sprint-data.js +118 -67
  70. package/dist/sprint-data.js.map +1 -1
  71. package/dist/story-parser.js +1 -1
  72. package/dist/story-parser.js.map +1 -1
  73. package/dist/theme-metadata.js +2 -2
  74. package/dist/theme-metadata.js.map +1 -1
  75. package/dist/websocket.d.ts +0 -6
  76. package/dist/websocket.d.ts.map +1 -1
  77. package/dist/websocket.js +36 -40
  78. package/dist/websocket.js.map +1 -1
  79. package/package.json +2 -1
  80. package/portraits/fifth-element/large/cornelius-54343.png +0 -0
  81. package/portraits/fifth-element/large/diva-53453.png +0 -0
  82. package/portraits/fifth-element/large/korben-34232.png +0 -0
  83. package/portraits/fifth-element/large/leeloo-54333.png +0 -0
  84. package/portraits/fifth-element/large/lindberg-34432.png +0 -0
  85. package/portraits/fifth-element/large/mondoshawan-55131.png +0 -0
  86. package/portraits/fifth-element/large/munro-25321.png +0 -0
  87. package/portraits/fifth-element/large/pacoli-45232.png +0 -0
  88. package/portraits/fifth-element/large/ruby-53544.png +0 -0
  89. package/portraits/fifth-element/large/zorg-45312.png +0 -0
  90. package/portraits/fifth-element/medium/cornelius-54343.png +0 -0
  91. package/portraits/fifth-element/medium/diva-53453.png +0 -0
  92. package/portraits/fifth-element/medium/korben-34232.png +0 -0
  93. package/portraits/fifth-element/medium/leeloo-54333.png +0 -0
  94. package/portraits/fifth-element/medium/lindberg-34432.png +0 -0
  95. package/portraits/fifth-element/medium/mondoshawan-55131.png +0 -0
  96. package/portraits/fifth-element/medium/munro-25321.png +0 -0
  97. package/portraits/fifth-element/medium/pacoli-45232.png +0 -0
  98. package/portraits/fifth-element/medium/ruby-53544.png +0 -0
  99. package/portraits/fifth-element/medium/zorg-45312.png +0 -0
  100. package/src/public/App.tsx +0 -2
  101. package/src/public/components/AgentLoadDialog.tsx +202 -0
  102. package/src/public/components/AgentPopup.tsx +3 -5
  103. package/src/public/components/ContextSparkline.tsx +56 -0
  104. package/src/public/components/ControlBar.tsx +140 -6
  105. package/src/public/components/DeadCodeDialog.tsx +169 -0
  106. package/src/public/components/DockviewWorkspace.tsx +0 -3
  107. package/src/public/components/FullFileTree.tsx +18 -4
  108. package/src/public/components/HealthGauge.tsx +181 -0
  109. package/src/public/components/MessageView.tsx +23 -6
  110. package/src/public/components/PersonaHeader.tsx +46 -3
  111. package/src/public/components/TandemPortrait.tsx +71 -0
  112. package/src/public/components/ToolCallBlock.tsx +21 -6
  113. package/src/public/components/dialogs/CodeMarkersDialog.tsx +169 -0
  114. package/src/public/components/dialogs/ComplexityDialog.tsx +163 -0
  115. package/src/public/components/dialogs/DependenciesDialog.tsx +120 -0
  116. package/src/public/components/dialogs/HotspotsDialog.tsx +451 -0
  117. package/src/public/components/dialogs/ToolDialog.tsx +43 -0
  118. package/src/public/components/panels/ACPanel.tsx +1 -1
  119. package/src/public/components/panels/AcceptanceCriteriaPanel.tsx +15 -30
  120. package/src/public/components/panels/DebugPanel.tsx +79 -3
  121. package/src/public/components/panels/GitPanel.tsx +25 -30
  122. package/src/public/components/panels/MessagePanel.tsx +44 -2
  123. package/src/public/components/panels/SettingsPanel.tsx +4 -4
  124. package/src/public/components/panels/SprintPanel.tsx +247 -123
  125. package/src/public/components/panels/index.ts +0 -1
  126. package/src/public/components/ui/dialog.tsx +3 -3
  127. package/src/public/css/theme-system.css +98 -11
  128. package/src/public/hooks/index.ts +4 -0
  129. package/src/public/hooks/useAgentLoad.ts +105 -0
  130. package/src/public/hooks/useCodeMarkers.ts +101 -0
  131. package/src/public/hooks/useColorScheme.ts +25 -10
  132. package/src/public/hooks/useComplexity.ts +80 -0
  133. package/src/public/hooks/useDeadCode.ts +99 -0
  134. package/src/public/hooks/useDependencies.ts +82 -0
  135. package/src/public/hooks/useHealthScore.ts +69 -0
  136. package/src/public/hooks/useHotspots.ts +11 -1
  137. package/src/public/hooks/usePersona.ts +26 -3
  138. package/src/public/hooks/useSprint.ts +7 -1
  139. package/src/public/styles/tailwind.css +389 -83
  140. package/src/public/utils/messageFilters.ts +77 -6
  141. package/src/public/utils/slash-commands.ts +3 -35
  142. package/dist/hooks/cyclist-pretooluse-hook.d.ts +0 -60
  143. package/dist/hooks/cyclist-pretooluse-hook.d.ts.map +0 -1
  144. package/dist/hooks/cyclist-pretooluse-hook.js +0 -57
  145. package/dist/hooks/cyclist-pretooluse-hook.js.map +0 -1
  146. package/dist/hooks/pretooluse-hook.d.ts +0 -89
  147. package/dist/hooks/pretooluse-hook.d.ts.map +0 -1
  148. package/dist/hooks/pretooluse-hook.js +0 -235
  149. package/dist/hooks/pretooluse-hook.js.map +0 -1
  150. package/dist/notification-sound.d.ts +0 -59
  151. package/dist/notification-sound.d.ts.map +0 -1
  152. package/dist/notification-sound.js +0 -219
  153. package/dist/notification-sound.js.map +0 -1
  154. package/src/public/types/electron.d.ts +0 -18
@@ -20,6 +20,12 @@ export interface SprintStory {
20
20
  status: 'backlog' | 'in_progress' | 'done' | 'cancelled' | 'blocked';
21
21
  jiraKey: string | null;
22
22
  hasContext?: boolean;
23
+ assignedTo?: string | null;
24
+ completed?: string | null;
25
+ started?: string | null;
26
+ workflow?: string | null;
27
+ priority?: string | null;
28
+ description?: string | null;
23
29
  }
24
30
 
25
31
  export interface SprintEpic {
@@ -94,7 +100,7 @@ export function useSprint(): UseSprintResult {
94
100
  const msg = JSON.parse(event.data) as SprintMessage;
95
101
  if (msg.type === 'init' || msg.type === 'update') {
96
102
  // Extract data, excluding type field
97
- const { type, ...sprintData } = msg;
103
+ const { type: _type, ...sprintData } = msg;
98
104
  setData((prev) => {
99
105
  if (!prev) return sprintData as SprintData;
100
106
  // Merge partial updates
@@ -7,6 +7,19 @@
7
7
  Docking Workspace Styles
8
8
  ============================================================================= */
9
9
 
10
+ /* Screen reader only — visually hidden but accessible */
11
+ .visually-hidden {
12
+ position: absolute;
13
+ width: 1px;
14
+ height: 1px;
15
+ padding: 0;
16
+ margin: -1px;
17
+ overflow: hidden;
18
+ clip: rect(0, 0, 0, 0);
19
+ white-space: nowrap;
20
+ border: 0;
21
+ }
22
+
10
23
  .cyclist-app {
11
24
  position: absolute;
12
25
  top: 0;
@@ -266,6 +279,8 @@
266
279
  border-bottom: 1px solid var(--border-color, #3c3c3c);
267
280
  flex-shrink: 0;
268
281
  position: relative;
282
+ overflow: visible;
283
+ min-width: 0;
269
284
  }
270
285
 
271
286
  .persona-header.empty {
@@ -287,10 +302,23 @@
287
302
  outline-offset: 2px;
288
303
  }
289
304
 
290
- /* Portrait group: portrait + badge positioned together */
305
+ /* Portrait group: portrait + tandem positioned together */
291
306
  .persona-portrait-group {
292
- position: relative;
307
+ container-type: inline-size;
308
+ container-name: portrait-group;
309
+ display: flex;
310
+ flex-direction: column;
311
+ align-items: flex-start;
312
+ gap: 8px;
293
313
  flex-shrink: 0;
314
+ width: 100px;
315
+ }
316
+
317
+ /* Container query: hide backseat portrait when panel is narrow */
318
+ @container portrait-group (max-width: 180px) {
319
+ .persona-tandem-portrait {
320
+ display: none;
321
+ }
294
322
  }
295
323
 
296
324
  .persona-portrait {
@@ -299,6 +327,9 @@
299
327
  border-radius: 50%;
300
328
  overflow: hidden;
301
329
  flex-shrink: 0;
330
+ min-width: 48px;
331
+ min-height: 48px;
332
+ aspect-ratio: 1;
302
333
  background: var(--bg-tertiary, #2d2d2d);
303
334
  display: flex;
304
335
  align-items: center;
@@ -333,8 +364,10 @@
333
364
  display: flex;
334
365
  flex-direction: column;
335
366
  gap: 2px;
336
- min-width: 0;
337
367
  flex: 1;
368
+ min-width: 0;
369
+ width: 0;
370
+ overflow: hidden;
338
371
  }
339
372
 
340
373
  .persona-branding {
@@ -356,10 +389,48 @@
356
389
  font-size: 1.2rem;
357
390
  }
358
391
 
392
+ .persona-header.compact .persona-tandem-portrait {
393
+ display: none;
394
+ }
395
+
359
396
  .persona-header.compact .persona-branding {
360
397
  height: 32px;
361
398
  }
362
399
 
400
+ /* Tandem portrait: backseat agent below primary (Story 96-1) */
401
+ .persona-tandem-portrait {
402
+ width: 48px;
403
+ height: 48px;
404
+ border-radius: 50%;
405
+ opacity: 0.55;
406
+ transition: opacity 300ms ease-in-out;
407
+ position: relative;
408
+ overflow: hidden;
409
+ }
410
+
411
+ .persona-tandem-portrait .tandem-portrait-image {
412
+ width: 100%;
413
+ height: 100%;
414
+ object-fit: cover;
415
+ }
416
+
417
+ .persona-tandem-portrait .tandem-portrait-fallback {
418
+ font-size: 1.2rem;
419
+ }
420
+
421
+ .tandem-role-badge {
422
+ position: absolute;
423
+ bottom: -2px;
424
+ right: -2px;
425
+ font-size: 9px;
426
+ font-weight: 700;
427
+ line-height: 16px;
428
+ padding: 0 4px;
429
+ border-radius: 8px;
430
+ background: var(--accent-color, #007acc);
431
+ color: #fff;
432
+ }
433
+
363
434
  .persona-header.compact .persona-catchphrase {
364
435
  display: none;
365
436
  }
@@ -391,18 +462,25 @@
391
462
  display: flex;
392
463
  align-items: center;
393
464
  gap: 8px;
394
- flex-wrap: wrap;
465
+ flex-wrap: nowrap;
466
+ overflow: hidden;
395
467
  }
396
468
 
397
469
  .persona-character {
398
470
  font-weight: 600;
399
471
  color: var(--text-primary, #d4d4d4);
400
472
  font-size: 0.95rem;
473
+ overflow: hidden;
474
+ text-overflow: ellipsis;
475
+ white-space: nowrap;
401
476
  }
402
477
 
403
478
  .persona-theme {
404
479
  color: var(--text-secondary, #8b8b8b);
405
480
  font-size: 0.8rem;
481
+ overflow: hidden;
482
+ text-overflow: ellipsis;
483
+ white-space: nowrap;
406
484
  }
407
485
 
408
486
  .persona-catchphrase {
@@ -429,10 +507,25 @@
429
507
  min-height: 0;
430
508
  }
431
509
 
510
+ .message-panel-resize-handle {
511
+ height: 4px;
512
+ flex-shrink: 0;
513
+ cursor: row-resize;
514
+ background: var(--border-color, #3c3c3c);
515
+ transition: background 0.15s ease;
516
+ }
517
+
518
+ .message-panel-resize-handle:hover {
519
+ background: var(--accent-color, #007acc);
520
+ }
521
+
432
522
  .message-panel-editor {
433
523
  flex-shrink: 0;
434
- border-top: 1px solid var(--border-color, #3c3c3c);
435
524
  background: var(--bg-secondary, #252526);
525
+ overflow: visible;
526
+ display: flex;
527
+ flex-direction: column;
528
+ min-height: 120px;
436
529
  }
437
530
 
438
531
  /* Message View - the conversation area */
@@ -616,6 +709,7 @@
616
709
  gap: 0.5rem;
617
710
  padding: 0.25rem 0;
618
711
  margin-bottom: 0.25rem;
712
+ padding-left: 2.75rem; /* align with message content: avatar 2rem + gap 0.75rem */
619
713
  }
620
714
 
621
715
  .turn-speaker {
@@ -752,6 +846,54 @@
752
846
  animation: avatar-throb 1.2s ease-in-out infinite;
753
847
  }
754
848
 
849
+ /* Backseat thinking indicator - subtler throb for tandem portrait */
850
+ @keyframes tandem-throb {
851
+ 0%, 100% {
852
+ transform: scale(1);
853
+ box-shadow: 0 0 0 0 var(--accent-color, #007acc);
854
+ }
855
+ 50% {
856
+ transform: scale(1.04);
857
+ box-shadow: 0 0 6px 1px var(--accent-color, #007acc);
858
+ }
859
+ }
860
+
861
+ .avatar-tandem-thinking {
862
+ animation: tandem-throb 1.8s ease-in-out infinite;
863
+ }
864
+
865
+ /* Observation pulse - one-shot on primary portrait when backseat observation injected */
866
+ @keyframes observation-pulse {
867
+ 0% {
868
+ box-shadow: 0 0 12px 4px var(--accent-color, #007acc);
869
+ }
870
+ 100% {
871
+ box-shadow: 0 0 0 0 var(--accent-color, #007acc);
872
+ }
873
+ }
874
+
875
+ .avatar-observation-pulse {
876
+ animation: observation-pulse 600ms ease-out 1;
877
+ }
878
+
879
+ @media (prefers-reduced-motion: reduce) {
880
+ .avatar-thinking {
881
+ animation: none;
882
+ opacity: 0.85;
883
+ border: 2px solid var(--accent-color, #007acc);
884
+ }
885
+ .avatar-tandem-thinking {
886
+ animation: none;
887
+ opacity: 0.85;
888
+ border: 2px solid var(--accent-color, #007acc);
889
+ }
890
+ .avatar-observation-pulse {
891
+ animation: none;
892
+ opacity: 0.9;
893
+ border: 2px solid var(--accent-color, #007acc);
894
+ }
895
+ }
896
+
755
897
  .message-avatar.avatar-fallback::after {
756
898
  content: '🤖';
757
899
  font-size: 1.25rem;
@@ -958,7 +1100,7 @@
958
1100
  display: flex;
959
1101
  align-items: center;
960
1102
  justify-content: center;
961
- height: 100%;
1103
+ flex: 1;
962
1104
  color: var(--text-secondary, #8b8b8b);
963
1105
  font-size: 0.875rem;
964
1106
  text-align: center;
@@ -986,12 +1128,15 @@
986
1128
  .editor-with-controls {
987
1129
  display: flex;
988
1130
  gap: 8px;
989
- align-items: flex-end;
1131
+ align-items: stretch;
1132
+ height: 100%;
990
1133
  }
991
1134
 
992
1135
  .editor-area {
993
1136
  flex: 1;
994
1137
  min-width: 0; /* Prevent overflow */
1138
+ display: flex;
1139
+ flex-direction: column;
995
1140
  }
996
1141
 
997
1142
  .editor-container {
@@ -999,6 +1144,7 @@
999
1144
  flex-direction: column;
1000
1145
  padding: 8px;
1001
1146
  min-width: 0; /* Prevent overflow */
1147
+ flex: 1;
1002
1148
  }
1003
1149
 
1004
1150
  .mode-toolbar {
@@ -1032,12 +1178,15 @@
1032
1178
  .editor-wrapper {
1033
1179
  position: relative;
1034
1180
  min-width: 0; /* Prevent overflow */
1181
+ flex: 1;
1182
+ display: flex;
1183
+ flex-direction: column;
1035
1184
  }
1036
1185
 
1037
1186
  .editor-textarea {
1038
1187
  width: 100%;
1039
1188
  min-height: 60px;
1040
- max-height: 200px;
1189
+ flex: 1;
1041
1190
  padding: 8px;
1042
1191
  background: var(--bg-primary, #1e1e1e);
1043
1192
  border: 1px solid var(--border-color, #3c3c3c);
@@ -1181,6 +1330,7 @@
1181
1330
  gap: 4px;
1182
1331
  padding: 8px;
1183
1332
  flex-shrink: 0;
1333
+ align-self: flex-end;
1184
1334
  }
1185
1335
 
1186
1336
  .btn-stop {
@@ -1396,6 +1546,16 @@
1396
1546
  opacity: 0.7;
1397
1547
  }
1398
1548
 
1549
+ /* Completed Epics Section */
1550
+ .enhanced-sprint-panel [data-section="completed-epics"] .epic-group {
1551
+ opacity: 0.5;
1552
+ border-color: var(--border-color, #3c3c3c);
1553
+ }
1554
+
1555
+ .enhanced-sprint-panel [data-section="completed-epics"] .epic-group:hover {
1556
+ opacity: 0.7;
1557
+ }
1558
+
1399
1559
  /* Epic Header */
1400
1560
  .enhanced-sprint-panel .epic-header {
1401
1561
  display: flex;
@@ -1510,15 +1670,59 @@
1510
1670
  background: var(--bg-hover, rgba(255, 255, 255, 0.03));
1511
1671
  }
1512
1672
 
1513
- .enhanced-sprint-panel .story-item .story-title {
1673
+ .enhanced-sprint-panel .story-item .story-info {
1514
1674
  flex: 1;
1515
1675
  min-width: 0;
1676
+ display: flex;
1677
+ flex-direction: column;
1678
+ gap: 1px;
1679
+ }
1680
+
1681
+ .enhanced-sprint-panel .story-item .story-title {
1516
1682
  overflow: hidden;
1517
1683
  text-overflow: ellipsis;
1518
1684
  white-space: nowrap;
1519
1685
  font-size: 0.75rem;
1520
1686
  }
1521
1687
 
1688
+ .enhanced-sprint-panel .story-item .story-meta {
1689
+ display: flex;
1690
+ align-items: center;
1691
+ gap: 6px;
1692
+ }
1693
+
1694
+ .enhanced-sprint-panel .story-item .story-assignee {
1695
+ font-size: 0.625rem;
1696
+ color: var(--text-tertiary, #6b6b6b);
1697
+ font-style: italic;
1698
+ }
1699
+
1700
+ .enhanced-sprint-panel .story-item .story-workflow-badge {
1701
+ font-size: 0.5625rem;
1702
+ text-transform: uppercase;
1703
+ letter-spacing: 0.05em;
1704
+ color: var(--text-secondary, #8b8b8b);
1705
+ background: var(--bg-tertiary, #2d2d2d);
1706
+ padding: 0 4px;
1707
+ border-radius: 2px;
1708
+ }
1709
+
1710
+ .enhanced-sprint-panel .story-item .story-completed-date {
1711
+ font-size: 0.625rem;
1712
+ font-variant-numeric: tabular-nums;
1713
+ font-family: var(--font-mono, monospace);
1714
+ color: var(--text-tertiary, #6b6b6b);
1715
+ }
1716
+
1717
+ .enhanced-sprint-panel .story-item .priority-label {
1718
+ font-size: 0.6rem;
1719
+ font-weight: 500;
1720
+ color: var(--text-tertiary, #6b6b6b);
1721
+ flex-shrink: 0;
1722
+ opacity: 0.7;
1723
+ font-family: var(--font-mono, 'SF Mono', Monaco, monospace);
1724
+ }
1725
+
1522
1726
  .enhanced-sprint-panel .story-item .story-points {
1523
1727
  font-size: 0.65rem;
1524
1728
  color: var(--text-secondary, #8b8b8b);
@@ -1791,42 +1995,41 @@
1791
1995
  margin-bottom: 4px;
1792
1996
  }
1793
1997
 
1794
- /* Develop behind warning */
1795
- .git-panel .develop-behind-warning {
1998
+ /* Develop-behind indicator */
1999
+ .git-panel .develop-behind {
2000
+ color: var(--status-warning, #cca700);
2001
+ }
2002
+
2003
+ /* Sync all repos action bar */
2004
+ .git-panel .git-panel-actions {
2005
+ padding: 0 0 4px;
2006
+ }
2007
+
2008
+ .git-panel .sync-all-btn {
1796
2009
  display: flex;
1797
2010
  align-items: center;
2011
+ justify-content: center;
1798
2012
  gap: 6px;
1799
- padding: 6px 8px;
1800
- margin-bottom: 8px;
1801
- background: rgba(204, 167, 0, 0.15);
1802
- border: 1px solid var(--warning-color, #cca700);
2013
+ width: 100%;
2014
+ padding: 6px 10px;
2015
+ border: 1px solid var(--border-secondary, rgba(255, 255, 255, 0.08));
1803
2016
  border-radius: 4px;
2017
+ background: var(--bg-tertiary, #2d2d2d);
2018
+ color: var(--text-secondary, #8b8b8b);
1804
2019
  font-size: 0.75rem;
2020
+ font-family: var(--font-mono, 'SF Mono', Monaco, monospace);
2021
+ cursor: pointer;
2022
+ transition: background-color 0.15s ease, color 0.15s ease, border-color 0.15s ease;
1805
2023
  }
1806
2024
 
1807
- .git-panel .develop-behind-warning .warning-icon {
1808
- flex-shrink: 0;
1809
- }
1810
-
1811
- .git-panel .develop-behind-warning .warning-text {
1812
- flex: 1;
1813
- color: var(--warning-color, #cca700);
1814
- }
1815
-
1816
- .git-panel .develop-behind-warning .pull-develop-btn {
1817
- padding: 2px 8px;
1818
- background: var(--warning-color, #cca700);
1819
- color: #000;
1820
- border: none;
1821
- border-radius: 3px;
1822
- font-size: 0.7rem;
1823
- font-weight: 600;
1824
- cursor: pointer;
1825
- text-transform: uppercase;
2025
+ .git-panel .sync-all-btn:hover {
2026
+ background: var(--bg-hover, #3d3d3d);
2027
+ color: var(--text-primary, #e0e0e0);
2028
+ border-color: var(--accent-color, #007acc);
1826
2029
  }
1827
2030
 
1828
- .git-panel .develop-behind-warning .pull-develop-btn:hover {
1829
- opacity: 0.9;
2031
+ .git-panel .sync-all-btn:active {
2032
+ background: var(--bg-active, #4d4d4d);
1830
2033
  }
1831
2034
 
1832
2035
  .git-panel .repo-status .file-status {
@@ -2196,38 +2399,6 @@
2196
2399
  padding: 8px 0;
2197
2400
  }
2198
2401
 
2199
- /* AC content within Progress panel */
2200
- .ac-content {
2201
- padding: 4px 0;
2202
- }
2203
-
2204
- .ac-content .ac-list {
2205
- margin-top: 8px;
2206
- }
2207
-
2208
- .ac-content .ac-item {
2209
- display: flex;
2210
- align-items: flex-start;
2211
- gap: 6px;
2212
- padding: 4px 0;
2213
- font-size: 0.8rem;
2214
- color: var(--text-primary, #d4d4d4);
2215
- }
2216
-
2217
- .ac-content .ac-item.ac-done {
2218
- color: var(--success-color, #4ec9b0);
2219
- }
2220
-
2221
- .ac-content .ac-icon {
2222
- flex-shrink: 0;
2223
- width: 14px;
2224
- }
2225
-
2226
- .ac-content .ac-text {
2227
- flex: 1;
2228
- line-height: 1.3;
2229
- }
2230
-
2231
2402
  /* Todo content wrapper */
2232
2403
  .todo-content {
2233
2404
  padding: 4px 0;
@@ -2457,6 +2628,17 @@
2457
2628
  background: var(--accent-color, #007acc);
2458
2629
  }
2459
2630
 
2631
+ .context-sparkline {
2632
+ width: 100%;
2633
+ height: 32px;
2634
+ margin: 4px 0;
2635
+ }
2636
+
2637
+ .context-sparkline svg {
2638
+ width: 100%;
2639
+ height: 100%;
2640
+ }
2641
+
2460
2642
  .debug-panel .context-text {
2461
2643
  font-size: 0.75rem;
2462
2644
  color: var(--text-primary, #d4d4d4);
@@ -2626,6 +2808,84 @@
2626
2808
  font-family: var(--font-mono, 'SF Mono', Monaco, monospace);
2627
2809
  }
2628
2810
 
2811
+ /* HealthGauge header and controls */
2812
+
2813
+ .health-gauge-header {
2814
+ display: flex;
2815
+ justify-content: space-between;
2816
+ align-items: center;
2817
+ margin-bottom: 0.25rem;
2818
+ }
2819
+
2820
+ .health-gauge-age {
2821
+ font-size: 0.75rem;
2822
+ color: var(--text-muted);
2823
+ }
2824
+
2825
+ .health-gauge-error {
2826
+ font-size: 0.75rem;
2827
+ color: var(--color-danger, #ef4444);
2828
+ }
2829
+
2830
+ /* HealthGauge SVG */
2831
+
2832
+ [data-testid="health-gauge"] svg {
2833
+ display: block;
2834
+ margin: 0 auto;
2835
+ }
2836
+
2837
+ /* HealthGauge dimension breakdown */
2838
+
2839
+ .health-gauge-partial {
2840
+ text-align: center;
2841
+ font-size: 0.75rem;
2842
+ color: var(--text-muted);
2843
+ margin-top: 0.25rem;
2844
+ }
2845
+
2846
+ .health-gauge-breakdown {
2847
+ display: flex;
2848
+ flex-direction: column;
2849
+ gap: 0.25rem;
2850
+ margin-top: 0.5rem;
2851
+ padding: 0.5rem 0;
2852
+ border-top: 1px solid var(--border);
2853
+ }
2854
+
2855
+ .health-gauge-dimension {
2856
+ display: flex;
2857
+ justify-content: space-between;
2858
+ align-items: center;
2859
+ cursor: pointer;
2860
+ padding: 0.25rem 0.5rem;
2861
+ border-radius: 4px;
2862
+ }
2863
+
2864
+ .health-gauge-dimension:hover {
2865
+ background: var(--border);
2866
+ }
2867
+
2868
+ .dimension-label {
2869
+ font-size: 0.8125rem;
2870
+ color: var(--text-secondary);
2871
+ text-decoration: underline;
2872
+ text-decoration-color: transparent;
2873
+ transition: text-decoration-color 0.15s, color 0.15s;
2874
+ }
2875
+
2876
+ .health-gauge-dimension:hover .dimension-label {
2877
+ text-decoration-color: currentColor;
2878
+ color: var(--text-primary);
2879
+ }
2880
+
2881
+ .dimension-score {
2882
+ font-size: 0.8125rem;
2883
+ font-variant-numeric: tabular-nums;
2884
+ text-align: right;
2885
+ font-family: var(--font-mono, monospace);
2886
+ color: var(--text-primary);
2887
+ }
2888
+
2629
2889
  /* Settings panel */
2630
2890
  .settings-panel {
2631
2891
  padding: 8px;
@@ -3998,6 +4258,54 @@
3998
4258
  margin-bottom: 4px;
3999
4259
  }
4000
4260
 
4261
+ /* Agent Quick Picker (MSSCI-14762) */
4262
+ .agent-quick-picker-wrapper {
4263
+ position: relative;
4264
+ }
4265
+
4266
+ .agent-quick-picker-dropdown {
4267
+ position: absolute;
4268
+ bottom: 100%;
4269
+ left: 0;
4270
+ margin-bottom: 4px;
4271
+ min-width: 120px;
4272
+ max-height: 300px;
4273
+ overflow-y: auto;
4274
+ background: var(--bg-secondary, #1e1e1e);
4275
+ border: 1px solid var(--border-color, #3c3c3c);
4276
+ border-radius: 6px;
4277
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
4278
+ z-index: 100;
4279
+ padding: 4px;
4280
+ }
4281
+
4282
+ .agent-quick-picker-option {
4283
+ display: flex;
4284
+ align-items: center;
4285
+ gap: 8px;
4286
+ padding: 6px 8px;
4287
+ border-radius: 4px;
4288
+ cursor: pointer;
4289
+ transition: background 0.1s ease;
4290
+ }
4291
+
4292
+ .agent-quick-picker-option:hover {
4293
+ background: var(--bg-hover, #3c3c3c);
4294
+ }
4295
+
4296
+ .agent-quick-picker-option.current {
4297
+ background: var(--bg-tertiary, #2d2d2d);
4298
+ border-left: 2px solid var(--accent, #007acc);
4299
+ }
4300
+
4301
+ .agent-option-role {
4302
+ font-size: 0.7rem;
4303
+ text-transform: uppercase;
4304
+ color: var(--text-secondary, #8b8b8b);
4305
+ min-width: 64px;
4306
+ }
4307
+
4308
+
4001
4309
  .btn-toggle {
4002
4310
  display: flex;
4003
4311
  align-items: center;
@@ -4017,15 +4325,13 @@
4017
4325
  border-color: var(--text-secondary, #8b8b8b);
4018
4326
  }
4019
4327
 
4020
- .btn-toggle .toggle-icon {
4021
- font-size: 1rem;
4022
- line-height: 1;
4023
- filter: grayscale(100%) opacity(0.5);
4024
- transition: filter 0.15s ease;
4328
+ .btn-toggle svg {
4329
+ opacity: 0.5;
4330
+ transition: opacity 0.15s ease;
4025
4331
  }
4026
4332
 
4027
- .btn-toggle:hover .toggle-icon {
4028
- filter: grayscale(50%) opacity(0.8);
4333
+ .btn-toggle:hover svg {
4334
+ opacity: 0.8;
4029
4335
  }
4030
4336
 
4031
4337
  /* Bell mode active */
@@ -4034,8 +4340,8 @@
4034
4340
  border-color: var(--color-warning, #f59e0b);
4035
4341
  }
4036
4342
 
4037
- .btn-toggle.bell-toggle.active .toggle-icon {
4038
- filter: none;
4343
+ .btn-toggle.bell-toggle.active svg {
4344
+ opacity: 1;
4039
4345
  }
4040
4346
 
4041
4347
  /* Relay mode active */
@@ -4044,8 +4350,8 @@
4044
4350
  border-color: var(--color-purple, #8b5cf6);
4045
4351
  }
4046
4352
 
4047
- .btn-toggle.relay-toggle.active .toggle-icon {
4048
- filter: none;
4353
+ .btn-toggle.relay-toggle.active svg {
4354
+ opacity: 1;
4049
4355
  }
4050
4356
 
4051
4357
  /* Active toggle colors (no animation - too distracting) */
@@ -4063,8 +4369,8 @@
4063
4369
  border-color: var(--color-cyan, #06b6d4);
4064
4370
  }
4065
4371
 
4066
- .btn-toggle.pump-toggle .toggle-icon {
4067
- filter: none;
4372
+ .btn-toggle.pump-toggle svg {
4373
+ opacity: 1;
4068
4374
  }
4069
4375
 
4070
4376
  /* TirePump warning state at 70%+ context */
@@ -4074,8 +4380,8 @@
4074
4380
  animation: pump-pulse 1.5s ease-in-out infinite;
4075
4381
  }
4076
4382
 
4077
- .btn-toggle.pump-toggle.warning .toggle-icon {
4078
- filter: none;
4383
+ .btn-toggle.pump-toggle.warning svg {
4384
+ opacity: 1;
4079
4385
  }
4080
4386
 
4081
4387
  @keyframes pump-pulse {