hypercore-cli 1.1.2 → 1.4.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 (162) hide show
  1. package/LICENSE +92 -21
  2. package/README.md +8 -1
  3. package/dist/App-YMX7FSXR.js +1 -0
  4. package/dist/api-ELP6F4NC.js +1 -0
  5. package/dist/auth-SICBMA3P.js +1 -0
  6. package/dist/auth-X6CUT3DW.js +1 -0
  7. package/dist/background-ACODXSUG.js +1 -0
  8. package/dist/backlog-JD2IM336.js +1 -0
  9. package/dist/chunk-2QI2IU2V.js +1 -0
  10. package/dist/chunk-3KFRDIPQ.js +1 -0
  11. package/dist/chunk-42C5J7PN.js +1 -0
  12. package/dist/chunk-4D7XVJ7Q.js +1 -0
  13. package/dist/chunk-5KUSGQP2.js +1 -0
  14. package/dist/chunk-5OEFAGD5.js +1 -0
  15. package/dist/chunk-AUQ64BK2.js +1 -0
  16. package/dist/chunk-AV244H5C.js +1 -0
  17. package/dist/chunk-BQVBEFS4.js +1 -0
  18. package/dist/chunk-BYWQLFP2.js +1 -0
  19. package/dist/chunk-C6YL7UHE.js +1 -0
  20. package/dist/chunk-COITWWZJ.js +1 -0
  21. package/dist/chunk-CR7UUJVX.js +1 -0
  22. package/dist/chunk-E3MULLBX.js +1 -0
  23. package/dist/chunk-EZHYVJGQ.js +1 -0
  24. package/dist/chunk-FAMURNNH.js +1 -0
  25. package/dist/chunk-FGP56E4W.js +1 -0
  26. package/dist/chunk-FHGATV5B.js +1 -0
  27. package/dist/chunk-I2G27Y5P.js +1 -0
  28. package/dist/chunk-IKF43TX2.js +1 -0
  29. package/dist/chunk-INSPHCBN.js +1 -0
  30. package/dist/chunk-JHMV366T.js +1 -0
  31. package/dist/chunk-L52HX5SX.js +1 -0
  32. package/dist/chunk-LQMDUKIE.js +1 -0
  33. package/dist/chunk-M3MTKGA5.js +1 -0
  34. package/dist/chunk-MPO54FU3.js +1 -0
  35. package/dist/chunk-PVKCZI6A.js +1 -0
  36. package/dist/chunk-Q7KEPCYL.js +1 -0
  37. package/dist/chunk-ROBZ6PAL.js +1 -0
  38. package/dist/chunk-RXB5BS2N.js +1 -0
  39. package/dist/chunk-RZ3HNYMT.js +1 -0
  40. package/dist/chunk-UCGLRMTG.js +1 -0
  41. package/dist/chunk-UEHJVRKB.js +1 -0
  42. package/dist/chunk-UZYX5GGF.js +1 -0
  43. package/dist/chunk-XQJBB725.js +1 -0
  44. package/dist/chunk-YXCRL6K3.js +1 -0
  45. package/dist/claude-US2QPRBA.js +1 -0
  46. package/dist/commands-EKPWCB3T.js +1 -0
  47. package/dist/commands-GYNKP5WV.js +1 -0
  48. package/dist/commands-QHJLREPM.js +1 -0
  49. package/dist/config-2OUL5FLS.js +1 -0
  50. package/dist/config-loader-N7IBWN2P.js +1 -0
  51. package/dist/diagnose-NLHN4SAJ.js +1 -0
  52. package/dist/display-RYAW2GFB.js +1 -0
  53. package/dist/extractor-3KTM2IUL.js +1 -0
  54. package/dist/feature-flag-VVIF5FJG.js +1 -0
  55. package/dist/history-3R2UHRDQ.js +1 -0
  56. package/dist/index.js +1 -402
  57. package/dist/instance-registry-I5AIVJE2.js +1 -0
  58. package/dist/keybindings-RN3A7CRW.js +1 -0
  59. package/dist/loader-3IKPXP4R.js +1 -0
  60. package/dist/network-K5HRJE44.js +1 -0
  61. package/dist/notify-O6FNVHC4.js +1 -0
  62. package/dist/openai-compat-IPCMINVF.js +1 -0
  63. package/dist/panels-2R5YEFXH.js +1 -0
  64. package/dist/permissions-5O7KVAXU.js +1 -0
  65. package/dist/prompt-VWFPFM4N.js +1 -0
  66. package/dist/quality-GPQD25UL.js +1 -0
  67. package/dist/repl-CL4SYHU4.js +1 -0
  68. package/dist/roadmap-QRZODSNJ.js +1 -0
  69. package/dist/server-PKOHK5M2.js +1 -0
  70. package/dist/session-5HDDQQP6.js +1 -0
  71. package/dist/skills-DXWSVJSU.js +1 -0
  72. package/dist/store-WXXTKTTL.js +1 -0
  73. package/dist/team-N2GF4YYS.js +1 -0
  74. package/dist/telemetry-NT4UZLBS.js +1 -0
  75. package/dist/test-runner-F6B6RH3S.js +1 -0
  76. package/dist/theme-JJJ6ABR2.js +1 -0
  77. package/dist/upgrade-RUG3R7R5.js +1 -0
  78. package/dist/verify-6OGRY2PR.js +1 -0
  79. package/dist/version-4RHTDUNQ.js +1 -0
  80. package/dist/web/static/app.js +1 -562
  81. package/dist/web/static/index.html +114 -126
  82. package/dist/web/static/mirror.css +1 -1001
  83. package/dist/web/static/mirror.html +155 -178
  84. package/dist/web/static/mirror.js +1 -1125
  85. package/dist/web/static/onboard.css +1 -302
  86. package/dist/web/static/onboard.html +121 -145
  87. package/dist/web/static/onboard.js +1 -300
  88. package/dist/web/static/style.css +1 -602
  89. package/dist/web/static/utils.js +1 -0
  90. package/dist/web/static/workspace.css +1 -1568
  91. package/dist/web/static/workspace.html +369 -402
  92. package/dist/web/static/workspace.js +1 -1683
  93. package/dist/web-CIC7ZKBM.js +1 -0
  94. package/package.json +26 -4
  95. package/dist/api-JHHOZTL6.js +0 -162
  96. package/dist/auth-5QFJLW7J.js +0 -21
  97. package/dist/background-2EGCAAQH.js +0 -14
  98. package/dist/backlog-Q2NZCLNY.js +0 -24
  99. package/dist/chunk-2CMSCWQW.js +0 -162
  100. package/dist/chunk-4DVYJAJL.js +0 -57
  101. package/dist/chunk-5GDYH676.js +0 -271
  102. package/dist/chunk-5NLVGLD7.js +0 -66
  103. package/dist/chunk-6XTEAFZQ.js +0 -575
  104. package/dist/chunk-AQBSMYLT.js +0 -2025
  105. package/dist/chunk-BE46C7JW.js +0 -46
  106. package/dist/chunk-CLKIMCXZ.js +0 -139
  107. package/dist/chunk-DN4ASQ26.js +0 -167
  108. package/dist/chunk-DUWREZXK.js +0 -173
  109. package/dist/chunk-FCW3K6F2.js +0 -263
  110. package/dist/chunk-GFORWAMW.js +0 -251
  111. package/dist/chunk-GH7E2OJE.js +0 -223
  112. package/dist/chunk-GU2FZQ6A.js +0 -69
  113. package/dist/chunk-I7WI3BMB.js +0 -161
  114. package/dist/chunk-IOPKN5GD.js +0 -190
  115. package/dist/chunk-LBVHDGZE.js +0 -133
  116. package/dist/chunk-MGLJ53QN.js +0 -219
  117. package/dist/chunk-NETIY5UB.js +0 -134
  118. package/dist/chunk-NP47L7LG.js +0 -288
  119. package/dist/chunk-O6MG7TOH.js +0 -58
  120. package/dist/chunk-OPZYEVYR.js +0 -150
  121. package/dist/chunk-R3GPQC7I.js +0 -393
  122. package/dist/chunk-R5T3A2NQ.js +0 -166
  123. package/dist/chunk-RKB2JOV2.js +0 -43
  124. package/dist/chunk-RNG3K465.js +0 -80
  125. package/dist/chunk-TGTYKBGC.js +0 -86
  126. package/dist/chunk-UCX4VZCT.js +0 -681
  127. package/dist/chunk-WHLVZCQY.js +0 -245
  128. package/dist/chunk-Y6HMJZDJ.js +0 -1505
  129. package/dist/chunk-ZSBHUGWR.js +0 -262
  130. package/dist/claude-4BX3MJSK.js +0 -12
  131. package/dist/commands-2X4OB5RF.js +0 -128
  132. package/dist/commands-GLBCEVQK.js +0 -1044
  133. package/dist/commands-IINRNBYX.js +0 -232
  134. package/dist/config-RSNQJQPS.js +0 -8
  135. package/dist/config-loader-SXO674TF.js +0 -24
  136. package/dist/diagnose-7UPLS7I4.js +0 -12
  137. package/dist/display-IIUBEYWN.js +0 -58
  138. package/dist/extractor-D3XWOAXI.js +0 -129
  139. package/dist/history-6I6FADAU.js +0 -180
  140. package/dist/index.d.ts +0 -1
  141. package/dist/instance-registry-J7UJ7U4Z.js +0 -15
  142. package/dist/keybindings-PDXIOV3O.js +0 -15
  143. package/dist/loader-GKEYT6Y7.js +0 -58
  144. package/dist/network-JYGHQXAR.js +0 -279
  145. package/dist/notify-HPTALZDC.js +0 -14
  146. package/dist/openai-compat-R7EKWG6Z.js +0 -12
  147. package/dist/permissions-JUKXMNDH.js +0 -10
  148. package/dist/prompt-UWHSZU4P.js +0 -166
  149. package/dist/quality-ST7PPNFR.js +0 -16
  150. package/dist/repl-QHIZ2JGF.js +0 -3374
  151. package/dist/roadmap-5OBEKROY.js +0 -17
  152. package/dist/server-HCNIP7ZQ.js +0 -57
  153. package/dist/session-5EBECDUP.js +0 -21
  154. package/dist/skills-HBQQTYO4.js +0 -175
  155. package/dist/store-FKUTR7GW.js +0 -25
  156. package/dist/team-7BBBP5YQ.js +0 -385
  157. package/dist/telemetry-6R4EIE6O.js +0 -30
  158. package/dist/test-runner-AUAGIBNM.js +0 -619
  159. package/dist/theme-3SYJ3UQA.js +0 -14
  160. package/dist/upgrade-MZFH7OCN.js +0 -83
  161. package/dist/verify-JUDKTPKZ.js +0 -14
  162. package/dist/web-KS3FUGJA.js +0 -39
@@ -1,1001 +1 @@
1
- /* HyperMirror - 内观引擎 Dashboard Styles */
2
-
3
- /* ─── Override body/main scroll for mirror page ─── */
4
- body {
5
- overflow: hidden;
6
- }
7
- .main {
8
- flex: 1;
9
- overflow: hidden;
10
- }
11
- .panel-center {
12
- height: 100%;
13
- overflow: hidden;
14
- }
15
- .tab-content {
16
- display: none;
17
- height: calc(100vh - 48px);
18
- overflow-y: auto;
19
- }
20
- .tab-content.active {
21
- display: block;
22
- }
23
-
24
- /* ─── Grid Layout ─── */
25
- .mirror-grid {
26
- display: grid;
27
- grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
28
- gap: 16px;
29
- padding: 16px;
30
- }
31
-
32
- .mirror-card {
33
- background: var(--bg-secondary);
34
- border: 1px solid var(--border);
35
- border-radius: var(--radius);
36
- overflow: hidden;
37
- }
38
- .mirror-card.card-wide {
39
- grid-column: 1 / -1;
40
- }
41
-
42
- /* ─── Health Score ─── */
43
- .health-row {
44
- display: flex;
45
- align-items: center;
46
- gap: 24px;
47
- padding: 8px 0;
48
- }
49
- .health-score {
50
- font-size: 48px;
51
- font-weight: 700;
52
- font-family: var(--font-mono);
53
- line-height: 1;
54
- min-width: 80px;
55
- text-align: center;
56
- }
57
- .health-score.score-high { color: var(--green); }
58
- .health-score.score-mid { color: var(--yellow); }
59
- .health-score.score-low { color: var(--red); }
60
-
61
- .health-checks {
62
- display: flex;
63
- flex-wrap: wrap;
64
- gap: 8px;
65
- flex: 1;
66
- }
67
- .health-check {
68
- display: flex;
69
- align-items: center;
70
- gap: 6px;
71
- padding: 4px 10px;
72
- background: var(--bg-tertiary);
73
- border-radius: var(--radius-sm);
74
- font-size: 12px;
75
- color: var(--text-secondary);
76
- }
77
- .health-check .dot {
78
- width: 8px;
79
- height: 8px;
80
- border-radius: 50%;
81
- flex-shrink: 0;
82
- }
83
- .health-check .dot.ok { background: var(--green); }
84
- .health-check .dot.fail { background: var(--red); }
85
-
86
- /* ─── Stat Pairs ─── */
87
- .stat-grid {
88
- display: grid;
89
- grid-template-columns: repeat(auto-fill, minmax(100px, 1fr));
90
- gap: 8px;
91
- }
92
- .stat-item {
93
- text-align: center;
94
- padding: 8px;
95
- background: var(--bg-tertiary);
96
- border-radius: var(--radius-sm);
97
- }
98
- .stat-value {
99
- font-size: 20px;
100
- font-weight: 700;
101
- font-family: var(--font-mono);
102
- color: var(--text-primary);
103
- }
104
- .stat-label {
105
- font-size: 11px;
106
- color: var(--text-muted);
107
- margin-top: 2px;
108
- }
109
-
110
- /* ─── Wuxing Bar ─── */
111
- .wuxing-bars {
112
- display: flex;
113
- flex-direction: column;
114
- gap: 6px;
115
- }
116
- .wuxing-row {
117
- display: flex;
118
- align-items: center;
119
- gap: 8px;
120
- font-size: 13px;
121
- }
122
- .wuxing-icon {
123
- width: 24px;
124
- text-align: center;
125
- font-size: 14px;
126
- }
127
- .wuxing-name {
128
- width: 24px;
129
- color: var(--text-secondary);
130
- }
131
- .wuxing-bar-track {
132
- flex: 1;
133
- height: 16px;
134
- background: var(--bg-tertiary);
135
- border-radius: 3px;
136
- overflow: hidden;
137
- }
138
- .wuxing-bar-fill {
139
- height: 100%;
140
- border-radius: 3px;
141
- transition: width 0.4s ease;
142
- }
143
- .wuxing-bar-fill.wx-wood { background: #3fb950; }
144
- .wuxing-bar-fill.wx-fire { background: #f85149; }
145
- .wuxing-bar-fill.wx-water { background: #58a6ff; }
146
- .wuxing-bar-fill.wx-metal { background: #8b949e; }
147
- .wuxing-bar-fill.wx-earth { background: #d29922; }
148
-
149
- .wuxing-count {
150
- width: 28px;
151
- text-align: right;
152
- font-family: var(--font-mono);
153
- font-size: 12px;
154
- color: var(--text-muted);
155
- }
156
-
157
- /* ─── Toolbar & Filters ─── */
158
- .tab-toolbar {
159
- display: flex;
160
- align-items: center;
161
- gap: 8px;
162
- padding: 12px 16px;
163
- border-bottom: 1px solid var(--border);
164
- background: var(--bg-secondary);
165
- }
166
- .filter-group {
167
- display: flex;
168
- gap: 8px;
169
- flex-wrap: wrap;
170
- }
171
- .tab-toolbar select {
172
- background: var(--bg-tertiary);
173
- color: var(--text-primary);
174
- border: 1px solid var(--border);
175
- border-radius: var(--radius-sm);
176
- padding: 4px 8px;
177
- font-size: 12px;
178
- font-family: var(--font-sans);
179
- cursor: pointer;
180
- }
181
- .tab-toolbar select:focus {
182
- outline: none;
183
- border-color: var(--accent);
184
- }
185
-
186
- /* ─── Test Runner Card ─── */
187
- .test-toolbar {
188
- display: flex;
189
- align-items: center;
190
- justify-content: space-between;
191
- gap: 12px;
192
- margin-bottom: 10px;
193
- flex-wrap: wrap;
194
- }
195
- .test-toolbar-left {
196
- display: flex;
197
- align-items: center;
198
- gap: 8px;
199
- flex-wrap: wrap;
200
- font-size: 12px;
201
- color: var(--text-secondary);
202
- }
203
- .test-toolbar-left select {
204
- background: var(--bg-tertiary);
205
- color: var(--text-primary);
206
- border: 1px solid var(--border);
207
- border-radius: var(--radius-sm);
208
- padding: 4px 8px;
209
- font-size: 12px;
210
- }
211
- .test-schema {
212
- font-family: var(--font-mono);
213
- color: var(--text-muted);
214
- font-size: 11px;
215
- }
216
- .btn-run-tests {
217
- border: 1px solid var(--accent);
218
- color: var(--accent);
219
- background: transparent;
220
- border-radius: var(--radius-sm);
221
- padding: 5px 10px;
222
- font-size: 12px;
223
- cursor: pointer;
224
- }
225
- .btn-run-tests:hover:not(:disabled) {
226
- background: color-mix(in srgb, var(--accent) 15%, transparent);
227
- }
228
- .btn-run-tests:disabled {
229
- opacity: 0.6;
230
- cursor: not-allowed;
231
- }
232
- .test-running-line {
233
- font-size: 12px;
234
- color: var(--yellow);
235
- margin-bottom: 8px;
236
- }
237
- .test-latest-row {
238
- display: grid;
239
- grid-template-columns: 1fr auto auto;
240
- gap: 8px;
241
- align-items: center;
242
- margin-bottom: 8px;
243
- font-size: 12px;
244
- }
245
- .test-latest-title {
246
- color: var(--text-primary);
247
- overflow: hidden;
248
- text-overflow: ellipsis;
249
- white-space: nowrap;
250
- }
251
- .test-latest-meta {
252
- color: var(--text-muted);
253
- font-family: var(--font-mono);
254
- font-size: 11px;
255
- }
256
- .test-status {
257
- font-family: var(--font-mono);
258
- font-size: 11px;
259
- padding: 2px 6px;
260
- border-radius: 3px;
261
- border: 1px solid transparent;
262
- }
263
- .test-status-running {
264
- color: var(--yellow);
265
- border-color: color-mix(in srgb, var(--yellow) 40%, transparent);
266
- }
267
- .test-status-passed {
268
- color: var(--green);
269
- border-color: color-mix(in srgb, var(--green) 40%, transparent);
270
- }
271
- .test-status-failed,
272
- .test-status-timeout {
273
- color: var(--red);
274
- border-color: color-mix(in srgb, var(--red) 40%, transparent);
275
- }
276
- .test-status-idle {
277
- color: var(--text-muted);
278
- border-color: var(--border);
279
- }
280
- .test-log {
281
- margin: 0;
282
- max-height: 220px;
283
- overflow: auto;
284
- white-space: pre-wrap;
285
- word-break: break-word;
286
- background: var(--bg-tertiary);
287
- border: 1px solid var(--border);
288
- border-radius: var(--radius-sm);
289
- padding: 10px;
290
- font-family: var(--font-mono);
291
- font-size: 11px;
292
- line-height: 1.45;
293
- color: var(--text-secondary);
294
- }
295
- .test-log-empty {
296
- font-size: 12px;
297
- color: var(--text-muted);
298
- padding: 8px 0;
299
- }
300
- .test-auto-panel {
301
- margin-top: 10px;
302
- margin-bottom: 10px;
303
- border: 1px solid var(--border);
304
- border-radius: var(--radius-sm);
305
- background: var(--bg-tertiary);
306
- padding: 10px;
307
- }
308
- .test-auto-header {
309
- display: flex;
310
- align-items: center;
311
- justify-content: space-between;
312
- gap: 10px;
313
- margin-bottom: 8px;
314
- }
315
- .test-auto-title {
316
- font-size: 12px;
317
- color: var(--text-primary);
318
- font-weight: 600;
319
- }
320
- .test-auto-controls {
321
- display: flex;
322
- flex-wrap: wrap;
323
- align-items: center;
324
- gap: 8px;
325
- }
326
- .test-auto-controls label {
327
- display: inline-flex;
328
- align-items: center;
329
- gap: 6px;
330
- font-size: 11px;
331
- color: var(--text-secondary);
332
- }
333
- .test-auto-controls select,
334
- .test-auto-controls input {
335
- background: var(--bg-secondary);
336
- color: var(--text-primary);
337
- border: 1px solid var(--border);
338
- border-radius: var(--radius-sm);
339
- padding: 4px 8px;
340
- font-size: 11px;
341
- }
342
- .test-auto-toggle {
343
- margin-right: 4px;
344
- }
345
- .btn-test-secondary {
346
- border: 1px solid var(--border);
347
- color: var(--text-secondary);
348
- background: transparent;
349
- border-radius: var(--radius-sm);
350
- padding: 4px 8px;
351
- font-size: 11px;
352
- cursor: pointer;
353
- }
354
- .btn-test-secondary:hover:not(:disabled) {
355
- border-color: var(--accent);
356
- color: var(--accent);
357
- }
358
- .btn-test-secondary:disabled {
359
- opacity: 0.6;
360
- cursor: not-allowed;
361
- }
362
- .test-auto-meta {
363
- margin-top: 8px;
364
- display: flex;
365
- flex-wrap: wrap;
366
- gap: 10px;
367
- font-size: 11px;
368
- color: var(--text-muted);
369
- }
370
- .test-auto-meta strong {
371
- color: var(--text-secondary);
372
- font-family: var(--font-mono);
373
- font-weight: 600;
374
- }
375
- .test-auto-error {
376
- margin-top: 6px;
377
- font-size: 11px;
378
- color: var(--text-muted);
379
- }
380
- .test-auto-error.has-error {
381
- color: var(--red);
382
- }
383
- .test-inline-error {
384
- margin-bottom: 8px;
385
- font-size: 12px;
386
- color: var(--red);
387
- }
388
- .test-history-title {
389
- margin-top: 10px;
390
- margin-bottom: 6px;
391
- font-size: 12px;
392
- color: var(--text-secondary);
393
- }
394
- .test-history-summary {
395
- display: flex;
396
- flex-wrap: wrap;
397
- gap: 6px;
398
- margin-bottom: 8px;
399
- }
400
- .test-summary-chip {
401
- display: inline-flex;
402
- align-items: center;
403
- gap: 4px;
404
- padding: 3px 8px;
405
- border-radius: 999px;
406
- border: 1px solid var(--border);
407
- background: var(--bg-tertiary);
408
- color: var(--text-secondary);
409
- font-size: 11px;
410
- }
411
- .test-summary-chip strong {
412
- color: var(--text-primary);
413
- font-family: var(--font-mono);
414
- font-weight: 700;
415
- }
416
- .test-history-filters {
417
- display: flex;
418
- flex-wrap: wrap;
419
- align-items: center;
420
- gap: 8px;
421
- margin-bottom: 8px;
422
- }
423
- .test-history-filters label {
424
- display: inline-flex;
425
- align-items: center;
426
- gap: 6px;
427
- font-size: 11px;
428
- color: var(--text-secondary);
429
- }
430
- .test-history-filters select,
431
- .test-history-filters input {
432
- background: var(--bg-tertiary);
433
- color: var(--text-primary);
434
- border: 1px solid var(--border);
435
- border-radius: var(--radius-sm);
436
- padding: 4px 8px;
437
- font-size: 11px;
438
- }
439
- .test-query-label input {
440
- min-width: 220px;
441
- }
442
- .btn-test-filter-reset {
443
- border: 1px solid var(--border);
444
- color: var(--text-secondary);
445
- background: transparent;
446
- border-radius: var(--radius-sm);
447
- padding: 4px 8px;
448
- font-size: 11px;
449
- cursor: pointer;
450
- }
451
- .btn-test-filter-reset:hover {
452
- border-color: var(--accent);
453
- color: var(--accent);
454
- }
455
- .test-history-count {
456
- font-size: 11px;
457
- color: var(--text-muted);
458
- margin-left: auto;
459
- }
460
- .test-history-list {
461
- display: flex;
462
- flex-direction: column;
463
- gap: 4px;
464
- }
465
- .test-history-row {
466
- display: grid;
467
- grid-template-columns: 1fr auto auto auto;
468
- gap: 8px;
469
- align-items: center;
470
- font-size: 11px;
471
- padding: 6px 8px;
472
- border: 1px solid var(--border);
473
- border-radius: var(--radius-sm);
474
- background: var(--bg-tertiary);
475
- cursor: pointer;
476
- }
477
- .test-history-row:hover {
478
- border-color: var(--accent);
479
- }
480
- .test-history-row.active {
481
- border-color: var(--accent);
482
- box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--accent) 40%, transparent);
483
- }
484
- .test-history-suite {
485
- color: var(--text-primary);
486
- overflow: hidden;
487
- text-overflow: ellipsis;
488
- white-space: nowrap;
489
- }
490
- .test-history-duration {
491
- color: var(--text-secondary);
492
- font-family: var(--font-mono);
493
- }
494
- .test-history-time {
495
- color: var(--text-muted);
496
- font-family: var(--font-mono);
497
- }
498
- .test-history-empty {
499
- font-size: 12px;
500
- color: var(--text-muted);
501
- padding: 6px 0;
502
- }
503
- .test-detail-panel {
504
- margin-top: 10px;
505
- border: 1px solid var(--border);
506
- border-radius: var(--radius-sm);
507
- background: var(--bg-tertiary);
508
- padding: 10px;
509
- }
510
- .test-detail-title {
511
- font-size: 12px;
512
- color: var(--text-primary);
513
- }
514
- .test-detail-meta {
515
- margin-top: 4px;
516
- margin-bottom: 8px;
517
- font-size: 11px;
518
- color: var(--text-muted);
519
- font-family: var(--font-mono);
520
- }
521
- .test-detail-actions {
522
- display: flex;
523
- gap: 6px;
524
- flex-wrap: wrap;
525
- margin-bottom: 8px;
526
- }
527
- .btn-test-rerun-suite,
528
- .btn-test-log-download,
529
- .btn-test-json-download {
530
- border: 1px solid var(--border);
531
- color: var(--text-secondary);
532
- background: transparent;
533
- border-radius: var(--radius-sm);
534
- padding: 4px 8px;
535
- font-size: 11px;
536
- cursor: pointer;
537
- }
538
- .btn-test-rerun-suite {
539
- border-color: color-mix(in srgb, var(--accent) 30%, var(--border));
540
- color: var(--accent);
541
- }
542
- .btn-test-rerun-suite:hover:not(:disabled),
543
- .btn-test-log-download:hover,
544
- .btn-test-json-download:hover {
545
- border-color: var(--accent);
546
- color: var(--accent);
547
- }
548
- .btn-test-rerun-suite:disabled {
549
- opacity: 0.6;
550
- cursor: not-allowed;
551
- }
552
- .test-detail-log {
553
- margin: 0;
554
- max-height: 280px;
555
- overflow: auto;
556
- white-space: pre-wrap;
557
- word-break: break-word;
558
- font-family: var(--font-mono);
559
- font-size: 11px;
560
- line-height: 1.45;
561
- color: var(--text-secondary);
562
- }
563
- .test-detail-loading,
564
- .test-detail-error {
565
- margin-top: 6px;
566
- font-size: 12px;
567
- }
568
- .test-detail-loading {
569
- color: var(--yellow);
570
- }
571
- .test-detail-error {
572
- color: var(--red);
573
- }
574
-
575
- /* ─── Item List (Backlog, Diagnose, Verify) ─── */
576
- .item-list {
577
- padding: 8px 16px;
578
- overflow-y: auto;
579
- max-height: calc(100vh - 140px);
580
- }
581
-
582
- .list-item {
583
- display: flex;
584
- align-items: flex-start;
585
- gap: 12px;
586
- padding: 10px 12px;
587
- border-bottom: 1px solid var(--border);
588
- transition: background 0.1s;
589
- }
590
- .list-item:hover {
591
- background: var(--bg-secondary);
592
- }
593
- .list-item:last-child {
594
- border-bottom: none;
595
- }
596
-
597
- .item-id {
598
- font-family: var(--font-mono);
599
- font-size: 11px;
600
- color: var(--text-muted);
601
- min-width: 28px;
602
- }
603
- .item-body {
604
- flex: 1;
605
- min-width: 0;
606
- }
607
- .item-title {
608
- font-size: 13px;
609
- color: var(--text-primary);
610
- margin-bottom: 4px;
611
- word-break: break-word;
612
- }
613
- .item-meta {
614
- display: flex;
615
- flex-wrap: wrap;
616
- gap: 6px;
617
- font-size: 11px;
618
- }
619
-
620
- /* ─── Tags / Badges ─── */
621
- .badge {
622
- display: inline-flex;
623
- align-items: center;
624
- padding: 1px 6px;
625
- border-radius: 3px;
626
- font-size: 10px;
627
- font-weight: 600;
628
- letter-spacing: 0.3px;
629
- }
630
- .badge-priority-S { background: #f8514922; color: #f85149; border: 1px solid #f8514944; }
631
- .badge-priority-A { background: #f0883e22; color: #f0883e; border: 1px solid #f0883e44; }
632
- .badge-priority-B { background: #58a6ff22; color: #58a6ff; border: 1px solid #58a6ff44; }
633
- .badge-priority-C { background: #8b949e22; color: #8b949e; border: 1px solid #8b949e44; }
634
-
635
- .badge-status {
636
- padding: 1px 6px;
637
- border-radius: 3px;
638
- font-size: 10px;
639
- }
640
- .badge-status-idea { background: #8b949e22; color: #8b949e; }
641
- .badge-status-planned { background: #58a6ff22; color: #58a6ff; }
642
- .badge-status-developing { background: #d2992222; color: #d29922; }
643
- .badge-status-done { background: #3fb95022; color: #3fb950; }
644
- .badge-status-archived { background: #6e768122; color: #6e7681; }
645
-
646
- .badge-wuxing {
647
- font-size: 12px;
648
- padding: 0 2px;
649
- }
650
-
651
- .badge-type {
652
- padding: 1px 6px;
653
- border-radius: 3px;
654
- font-size: 10px;
655
- background: var(--bg-tertiary);
656
- color: var(--text-secondary);
657
- }
658
-
659
- .badge-verdict {
660
- padding: 2px 8px;
661
- border-radius: 3px;
662
- font-size: 11px;
663
- font-weight: 600;
664
- }
665
- .badge-verdict-effective { background: #3fb95022; color: #3fb950; }
666
- .badge-verdict-ineffective { background: #f8514922; color: #f85149; }
667
- .badge-verdict-pending { background: #d2992222; color: #d29922; }
668
- .badge-verdict-no-data { background: #8b949e22; color: #8b949e; }
669
-
670
- .badge-severity {
671
- padding: 1px 6px;
672
- border-radius: 3px;
673
- font-size: 10px;
674
- font-weight: 600;
675
- }
676
- .badge-severity-high { background: #f8514922; color: #f85149; }
677
- .badge-severity-medium { background: #d2992222; color: #d29922; }
678
- .badge-severity-low { background: #58a6ff22; color: #58a6ff; }
679
-
680
- /* ─── Quality Grid ─── */
681
- .quality-grid {
682
- padding: 16px;
683
- }
684
- .quality-score-header {
685
- display: flex;
686
- align-items: center;
687
- gap: 16px;
688
- margin-bottom: 16px;
689
- padding: 16px;
690
- background: var(--bg-secondary);
691
- border: 1px solid var(--border);
692
- border-radius: var(--radius);
693
- }
694
- .quality-checks-grid {
695
- display: grid;
696
- grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));
697
- gap: 12px;
698
- }
699
- .quality-check-card {
700
- background: var(--bg-secondary);
701
- border: 1px solid var(--border);
702
- border-radius: var(--radius);
703
- padding: 14px;
704
- }
705
- .quality-check-card.check-ok {
706
- border-left: 3px solid var(--green);
707
- }
708
- .quality-check-card.check-fail {
709
- border-left: 3px solid var(--red);
710
- }
711
- .quality-check-name {
712
- font-size: 13px;
713
- font-weight: 600;
714
- margin-bottom: 6px;
715
- }
716
- .quality-check-detail {
717
- font-size: 12px;
718
- color: var(--text-secondary);
719
- }
720
- .quality-check-value {
721
- font-family: var(--font-mono);
722
- font-size: 18px;
723
- font-weight: 700;
724
- margin-top: 6px;
725
- }
726
-
727
- /* ─── Verify Summary Bar ─── */
728
- .verify-summary-bar {
729
- display: flex;
730
- gap: 12px;
731
- padding: 12px 16px;
732
- background: var(--bg-secondary);
733
- border-bottom: 1px solid var(--border);
734
- }
735
- .verify-stat {
736
- display: flex;
737
- align-items: center;
738
- gap: 6px;
739
- font-size: 12px;
740
- color: var(--text-secondary);
741
- }
742
- .verify-stat strong {
743
- font-family: var(--font-mono);
744
- color: var(--text-primary);
745
- }
746
-
747
- /* ─── Roadmap ─── */
748
- #roadmap-content {
749
- padding: 16px;
750
- }
751
- .roadmap-version {
752
- margin-bottom: 24px;
753
- }
754
- .roadmap-version-header {
755
- display: flex;
756
- align-items: center;
757
- gap: 12px;
758
- margin-bottom: 12px;
759
- padding-bottom: 8px;
760
- border-bottom: 1px solid var(--border);
761
- }
762
- .roadmap-version-tag {
763
- font-family: var(--font-mono);
764
- font-size: 14px;
765
- font-weight: 700;
766
- color: var(--accent);
767
- padding: 2px 10px;
768
- background: #58a6ff15;
769
- border: 1px solid #58a6ff33;
770
- border-radius: var(--radius-sm);
771
- }
772
- .roadmap-progress {
773
- display: flex;
774
- align-items: center;
775
- gap: 8px;
776
- font-size: 12px;
777
- color: var(--text-secondary);
778
- }
779
- .roadmap-progress-bar {
780
- width: 100px;
781
- height: 6px;
782
- background: var(--bg-tertiary);
783
- border-radius: 3px;
784
- overflow: hidden;
785
- }
786
- .roadmap-progress-fill {
787
- height: 100%;
788
- background: var(--green);
789
- border-radius: 3px;
790
- transition: width 0.3s;
791
- }
792
- .roadmap-items {
793
- display: flex;
794
- flex-direction: column;
795
- gap: 6px;
796
- padding-left: 16px;
797
- }
798
- .roadmap-item {
799
- display: flex;
800
- align-items: center;
801
- gap: 8px;
802
- padding: 6px 10px;
803
- font-size: 13px;
804
- border-radius: var(--radius-sm);
805
- transition: background 0.1s;
806
- }
807
- .roadmap-item:hover {
808
- background: var(--bg-secondary);
809
- }
810
- .roadmap-item-dot {
811
- width: 8px;
812
- height: 8px;
813
- border-radius: 50%;
814
- flex-shrink: 0;
815
- }
816
- .roadmap-item-dot.done { background: var(--green); }
817
- .roadmap-item-dot.developing { background: var(--yellow); }
818
- .roadmap-item-dot.planned { background: var(--accent); }
819
- .roadmap-item-dot.idea { background: var(--text-muted); }
820
-
821
- /* ─── Milestone Cards ─── */
822
- .milestone-mini {
823
- display: flex;
824
- align-items: center;
825
- gap: 8px;
826
- padding: 6px 0;
827
- font-size: 12px;
828
- border-bottom: 1px solid var(--border);
829
- }
830
- .milestone-mini:last-child { border-bottom: none; }
831
- .milestone-progress-mini {
832
- width: 40px;
833
- height: 4px;
834
- background: var(--bg-tertiary);
835
- border-radius: 2px;
836
- overflow: hidden;
837
- }
838
- .milestone-progress-mini-fill {
839
- height: 100%;
840
- background: var(--accent);
841
- border-radius: 2px;
842
- }
843
- .milestone-title {
844
- flex: 1;
845
- color: var(--text-secondary);
846
- overflow: hidden;
847
- text-overflow: ellipsis;
848
- white-space: nowrap;
849
- }
850
- .milestone-percent {
851
- font-family: var(--font-mono);
852
- font-size: 11px;
853
- color: var(--text-muted);
854
- min-width: 32px;
855
- text-align: right;
856
- }
857
-
858
- /* ─── Telemetry ─── */
859
- #telemetry-content {
860
- padding: 16px;
861
- }
862
- .telemetry-grid {
863
- display: grid;
864
- grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
865
- gap: 16px;
866
- }
867
- .telemetry-card {
868
- background: var(--bg-secondary);
869
- border: 1px solid var(--border);
870
- border-radius: var(--radius);
871
- padding: 14px;
872
- }
873
- .telemetry-card-title {
874
- font-size: 12px;
875
- color: var(--text-muted);
876
- margin-bottom: 10px;
877
- text-transform: uppercase;
878
- letter-spacing: 0.5px;
879
- }
880
- .cmd-row {
881
- display: flex;
882
- justify-content: space-between;
883
- padding: 4px 0;
884
- font-size: 12px;
885
- border-bottom: 1px solid var(--border);
886
- }
887
- .cmd-row:last-child { border-bottom: none; }
888
- .cmd-name {
889
- font-family: var(--font-mono);
890
- color: var(--accent);
891
- }
892
- .cmd-stats {
893
- color: var(--text-secondary);
894
- }
895
- .cmd-fail {
896
- color: var(--red);
897
- }
898
- .error-row {
899
- padding: 6px 0;
900
- border-bottom: 1px solid var(--border);
901
- font-size: 12px;
902
- }
903
- .error-row:last-child { border-bottom: none; }
904
- .error-msg {
905
- font-family: var(--font-mono);
906
- font-size: 11px;
907
- color: var(--red);
908
- word-break: break-all;
909
- }
910
- .error-count {
911
- font-size: 11px;
912
- color: var(--text-muted);
913
- }
914
-
915
- /* ─── Developing List (mini) ─── */
916
- .dev-item {
917
- display: flex;
918
- align-items: center;
919
- gap: 8px;
920
- padding: 6px 0;
921
- font-size: 12px;
922
- border-bottom: 1px solid var(--border);
923
- }
924
- .dev-item:last-child { border-bottom: none; }
925
- .dev-id {
926
- font-family: var(--font-mono);
927
- color: var(--text-muted);
928
- font-size: 11px;
929
- }
930
- .dev-title {
931
- flex: 1;
932
- color: var(--text-secondary);
933
- overflow: hidden;
934
- text-overflow: ellipsis;
935
- white-space: nowrap;
936
- }
937
-
938
- /* ─── Empty State ─── */
939
- .mirror-empty {
940
- text-align: center;
941
- padding: 32px 16px;
942
- color: var(--text-muted);
943
- font-size: 13px;
944
- }
945
- .mirror-empty-icon {
946
- font-size: 32px;
947
- margin-bottom: 8px;
948
- opacity: 0.5;
949
- }
950
-
951
- /* ─── Responsive ─── */
952
- @media (max-width: 768px) {
953
- .mirror-grid {
954
- grid-template-columns: 1fr;
955
- }
956
- .quality-checks-grid {
957
- grid-template-columns: 1fr;
958
- }
959
- .telemetry-grid {
960
- grid-template-columns: 1fr;
961
- }
962
- .filter-group {
963
- flex-direction: column;
964
- }
965
- .health-row {
966
- flex-direction: column;
967
- text-align: center;
968
- }
969
- .test-latest-row {
970
- grid-template-columns: 1fr;
971
- gap: 4px;
972
- }
973
- .test-history-count {
974
- margin-left: 0;
975
- width: 100%;
976
- }
977
- .test-query-label input {
978
- min-width: 0;
979
- width: 100%;
980
- }
981
- .test-history-row {
982
- grid-template-columns: 1fr;
983
- gap: 3px;
984
- }
985
- .test-auto-controls {
986
- flex-direction: column;
987
- align-items: stretch;
988
- }
989
- .test-auto-controls label {
990
- width: 100%;
991
- justify-content: space-between;
992
- }
993
- .test-auto-controls select,
994
- .test-auto-controls input,
995
- .btn-test-secondary {
996
- width: 100%;
997
- }
998
- .test-auto-toggle {
999
- justify-content: flex-start !important;
1000
- }
1001
- }
1
+ body{overflow:hidden}.main{flex:1;overflow:hidden}.panel-center{height:100%;overflow:hidden}.tab-content{display:none;height:calc(100vh - 48px);overflow-y:auto}.tab-content.active{display:block}.mirror-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(300px,1fr));gap:16px;padding:16px}.mirror-card{background:var(--bg-secondary);border:1px solid var(--border);border-radius:var(--radius);overflow:hidden}.mirror-card.card-wide{grid-column:1 / -1}.health-row{display:flex;align-items:center;gap:24px;padding:8px 0}.health-score{font-size:48px;font-weight:700;font-family:var(--font-mono);line-height:1;min-width:80px;text-align:center}.health-score.score-high{color:var(--green)}.health-score.score-mid{color:var(--yellow)}.health-score.score-low{color:var(--red)}.health-checks{display:flex;flex-wrap:wrap;gap:8px;flex:1}.health-check{display:flex;align-items:center;gap:6px;padding:4px 10px;background:var(--bg-tertiary);border-radius:var(--radius-sm);font-size:12px;color:var(--text-secondary)}.health-check .dot{width:8px;height:8px;border-radius:50%;flex-shrink:0}.health-check .dot.ok{background:var(--green)}.health-check .dot.fail{background:var(--red)}.stat-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(100px,1fr));gap:8px}.stat-item{text-align:center;padding:8px;background:var(--bg-tertiary);border-radius:var(--radius-sm)}.stat-value{font-size:20px;font-weight:700;font-family:var(--font-mono);color:var(--text-primary)}.stat-label{font-size:11px;color:var(--text-muted);margin-top:2px}.wuxing-bars{display:flex;flex-direction:column;gap:6px}.wuxing-row{display:flex;align-items:center;gap:8px;font-size:13px}.wuxing-icon{width:24px;text-align:center;font-size:14px}.wuxing-name{width:24px;color:var(--text-secondary)}.wuxing-bar-track{flex:1;height:16px;background:var(--bg-tertiary);border-radius:3px;overflow:hidden}.wuxing-bar-fill{height:100%;border-radius:3px;transition:width .4s ease}.wuxing-bar-fill.wx-wood{background:#3fb950}.wuxing-bar-fill.wx-fire{background:#f85149}.wuxing-bar-fill.wx-water{background:#58a6ff}.wuxing-bar-fill.wx-metal{background:#8b949e}.wuxing-bar-fill.wx-earth{background:#d29922}.wuxing-count{width:28px;text-align:right;font-family:var(--font-mono);font-size:12px;color:var(--text-muted)}.tab-toolbar{display:flex;align-items:center;gap:8px;padding:12px 16px;border-bottom:1px solid var(--border);background:var(--bg-secondary)}.filter-group{display:flex;gap:8px;flex-wrap:wrap}.tab-toolbar select{background:var(--bg-tertiary);color:var(--text-primary);border:1px solid var(--border);border-radius:var(--radius-sm);padding:4px 8px;font-size:12px;font-family:var(--font-sans);cursor:pointer}.tab-toolbar select:focus{outline:none;border-color:var(--accent)}.test-toolbar{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-bottom:10px;flex-wrap:wrap}.test-toolbar-left{display:flex;align-items:center;gap:8px;flex-wrap:wrap;font-size:12px;color:var(--text-secondary)}.test-toolbar-left select{background:var(--bg-tertiary);color:var(--text-primary);border:1px solid var(--border);border-radius:var(--radius-sm);padding:4px 8px;font-size:12px}.test-schema{font-family:var(--font-mono);color:var(--text-muted);font-size:11px}.btn-run-tests{border:1px solid var(--accent);color:var(--accent);background:transparent;border-radius:var(--radius-sm);padding:5px 10px;font-size:12px;cursor:pointer}.btn-run-tests:hover:not(:disabled){background:color-mix(in srgb,var(--accent) 15%,transparent)}.btn-run-tests:disabled{opacity:.6;cursor:not-allowed}.test-suite-meta-card{margin-bottom:10px;border:1px solid var(--border);border-radius:var(--radius-sm);background:var(--bg-tertiary);padding:10px}.test-suite-meta-row{display:flex;align-items:center;gap:8px;margin-bottom:6px;flex-wrap:wrap}.test-suite-tier{font-family:var(--font-mono);font-size:11px;padding:2px 6px;border-radius:3px;border:1px solid var(--border);color:var(--text-secondary)}.test-suite-tier-smoke{color:var(--green);border-color:color-mix(in srgb,var(--green) 35%,transparent)}.test-suite-tier-api{color:var(--accent);border-color:color-mix(in srgb,var(--accent) 35%,transparent)}.test-suite-tier-full{color:var(--yellow);border-color:color-mix(in srgb,var(--yellow) 35%,transparent)}.test-suite-tier-ui{color:var(--accent-2, #7cc6ff);border-color:color-mix(in srgb,var(--accent-2, #7cc6ff) 35%,transparent)}.test-suite-tier-cli{color:var(--text-primary);border-color:color-mix(in srgb,var(--text-primary) 25%,transparent)}.test-suite-tier-chaos{color:var(--red);border-color:color-mix(in srgb,var(--red) 35%,transparent)}.test-suite-duration{font-family:var(--font-mono);font-size:11px;color:var(--text-muted)}.test-suite-description{font-size:12px;line-height:1.5;color:var(--text-secondary)}.test-suite-guidance{margin-top:8px;display:flex;align-items:center;flex-wrap:wrap;gap:6px}.test-suite-guidance-label{font-size:11px;color:var(--text-muted)}.test-suite-guidance-chip{font-family:var(--font-mono);font-size:11px;padding:2px 6px;border-radius:3px;border:1px solid var(--border);color:var(--text-secondary)}.test-suite-guidance-chip-dev{color:var(--accent);border-color:color-mix(in srgb,var(--accent) 35%,transparent)}.test-suite-guidance-chip-release{color:var(--yellow);border-color:color-mix(in srgb,var(--yellow) 35%,transparent)}.test-running-line{font-size:12px;color:var(--yellow);margin-bottom:8px}.test-latest-row{display:grid;grid-template-columns:1fr auto auto;gap:8px;align-items:center;margin-bottom:8px;font-size:12px}.test-latest-title{color:var(--text-primary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.test-latest-meta{color:var(--text-muted);font-family:var(--font-mono);font-size:11px}.test-status{font-family:var(--font-mono);font-size:11px;padding:2px 6px;border-radius:3px;border:1px solid transparent}.test-status-running{color:var(--yellow);border-color:color-mix(in srgb,var(--yellow) 40%,transparent)}.test-status-passed{color:var(--green);border-color:color-mix(in srgb,var(--green) 40%,transparent)}.test-status-failed,.test-status-timeout{color:var(--red);border-color:color-mix(in srgb,var(--red) 40%,transparent)}.test-status-idle{color:var(--text-muted);border-color:var(--border)}.test-log{margin:0;max-height:220px;overflow:auto;white-space:pre-wrap;word-break:break-word;background:var(--bg-tertiary);border:1px solid var(--border);border-radius:var(--radius-sm);padding:10px;font-family:var(--font-mono);font-size:11px;line-height:1.45;color:var(--text-secondary)}.test-log-empty{font-size:12px;color:var(--text-muted);padding:8px 0}.test-auto-panel{margin-top:10px;margin-bottom:10px;border:1px solid var(--border);border-radius:var(--radius-sm);background:var(--bg-tertiary);padding:10px}.test-auto-header{display:flex;align-items:center;justify-content:space-between;gap:10px;margin-bottom:8px}.test-auto-title{font-size:12px;color:var(--text-primary);font-weight:600}.test-auto-controls{display:flex;flex-wrap:wrap;align-items:center;gap:8px}.test-auto-controls label{display:inline-flex;align-items:center;gap:6px;font-size:11px;color:var(--text-secondary)}.test-auto-controls select,.test-auto-controls input{background:var(--bg-secondary);color:var(--text-primary);border:1px solid var(--border);border-radius:var(--radius-sm);padding:4px 8px;font-size:11px}.test-auto-toggle{margin-right:4px}.btn-test-secondary{border:1px solid var(--border);color:var(--text-secondary);background:transparent;border-radius:var(--radius-sm);padding:4px 8px;font-size:11px;cursor:pointer}.btn-test-secondary:hover:not(:disabled){border-color:var(--accent);color:var(--accent)}.btn-test-secondary:disabled{opacity:.6;cursor:not-allowed}.test-auto-meta{margin-top:8px;display:flex;flex-wrap:wrap;gap:10px;font-size:11px;color:var(--text-muted)}.test-auto-meta strong{color:var(--text-secondary);font-family:var(--font-mono);font-weight:600}.test-auto-error{margin-top:6px;font-size:11px;color:var(--text-muted)}.test-auto-error.has-error{color:var(--red)}.test-inline-error{margin-bottom:8px;font-size:12px;color:var(--red)}.test-history-title{margin-top:10px;margin-bottom:6px;font-size:12px;color:var(--text-secondary)}.test-history-summary{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:8px}.test-summary-chip{display:inline-flex;align-items:center;gap:4px;padding:3px 8px;border-radius:999px;border:1px solid var(--border);background:var(--bg-tertiary);color:var(--text-secondary);font-size:11px}.test-summary-chip strong{color:var(--text-primary);font-family:var(--font-mono);font-weight:700}.test-history-filters{display:flex;flex-wrap:wrap;align-items:center;gap:8px;margin-bottom:8px}.test-history-filters label{display:inline-flex;align-items:center;gap:6px;font-size:11px;color:var(--text-secondary)}.test-history-filters select,.test-history-filters input{background:var(--bg-tertiary);color:var(--text-primary);border:1px solid var(--border);border-radius:var(--radius-sm);padding:4px 8px;font-size:11px}.test-query-label input{min-width:220px}.btn-test-filter-reset{border:1px solid var(--border);color:var(--text-secondary);background:transparent;border-radius:var(--radius-sm);padding:4px 8px;font-size:11px;cursor:pointer}.btn-test-filter-reset:hover{border-color:var(--accent);color:var(--accent)}.test-history-count{font-size:11px;color:var(--text-muted);margin-left:auto}.test-history-list{display:flex;flex-direction:column;gap:4px}.test-history-row{display:grid;grid-template-columns:1fr auto auto auto;gap:8px;align-items:center;font-size:11px;padding:6px 8px;border:1px solid var(--border);border-radius:var(--radius-sm);background:var(--bg-tertiary);cursor:pointer}.test-history-row:hover{border-color:var(--accent)}.test-history-row.active{border-color:var(--accent);box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--accent) 40%,transparent)}.test-history-suite{color:var(--text-primary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.test-history-duration{color:var(--text-secondary);font-family:var(--font-mono)}.test-history-time{color:var(--text-muted);font-family:var(--font-mono)}.test-history-empty{font-size:12px;color:var(--text-muted);padding:6px 0}.test-detail-panel{margin-top:10px;border:1px solid var(--border);border-radius:var(--radius-sm);background:var(--bg-tertiary);padding:10px}.test-detail-title{font-size:12px;color:var(--text-primary)}.test-detail-meta{margin-top:4px;margin-bottom:8px;font-size:11px;color:var(--text-muted);font-family:var(--font-mono)}.test-detail-actions{display:flex;gap:6px;flex-wrap:wrap;margin-bottom:8px}.btn-test-rerun-suite,.btn-test-log-download,.btn-test-json-download{border:1px solid var(--border);color:var(--text-secondary);background:transparent;border-radius:var(--radius-sm);padding:4px 8px;font-size:11px;cursor:pointer}.btn-test-rerun-suite{border-color:color-mix(in srgb,var(--accent) 30%,var(--border));color:var(--accent)}.btn-test-rerun-suite:hover:not(:disabled),.btn-test-log-download:hover,.btn-test-json-download:hover{border-color:var(--accent);color:var(--accent)}.btn-test-rerun-suite:disabled{opacity:.6;cursor:not-allowed}.test-detail-log{margin:0;max-height:280px;overflow:auto;white-space:pre-wrap;word-break:break-word;font-family:var(--font-mono);font-size:11px;line-height:1.45;color:var(--text-secondary)}.test-detail-loading,.test-detail-error{margin-top:6px;font-size:12px}.test-detail-loading{color:var(--yellow)}.test-detail-error{color:var(--red)}.item-list{padding:8px 16px;overflow-y:auto;max-height:calc(100vh - 140px)}.list-item{display:flex;align-items:flex-start;gap:12px;padding:10px 12px;border-bottom:1px solid var(--border);transition:background .1s}.list-item:hover{background:var(--bg-secondary)}.list-item:last-child{border-bottom:none}.item-id{font-family:var(--font-mono);font-size:11px;color:var(--text-muted);min-width:28px}.item-body{flex:1;min-width:0}.item-title{font-size:13px;color:var(--text-primary);margin-bottom:4px;word-break:break-word}.item-meta{display:flex;flex-wrap:wrap;gap:6px;font-size:11px}.badge{display:inline-flex;align-items:center;padding:1px 6px;border-radius:3px;font-size:10px;font-weight:600;letter-spacing:.3px}.badge-priority-S{background:#f8514922;color:#f85149;border:1px solid #f8514944}.badge-priority-A{background:#f0883e22;color:#f0883e;border:1px solid #f0883e44}.badge-priority-B{background:#58a6ff22;color:#58a6ff;border:1px solid #58a6ff44}.badge-priority-C{background:#8b949e22;color:#8b949e;border:1px solid #8b949e44}.badge-status{padding:1px 6px;border-radius:3px;font-size:10px}.badge-status-idea{background:#8b949e22;color:#8b949e}.badge-status-planned{background:#58a6ff22;color:#58a6ff}.badge-status-developing{background:#d2992222;color:#d29922}.badge-status-done{background:#3fb95022;color:#3fb950}.badge-status-archived{background:#6e768122;color:#6e7681}.badge-wuxing{font-size:12px;padding:0 2px}.badge-type{padding:1px 6px;border-radius:3px;font-size:10px;background:var(--bg-tertiary);color:var(--text-secondary)}.badge-verdict{padding:2px 8px;border-radius:3px;font-size:11px;font-weight:600}.badge-verdict-effective{background:#3fb95022;color:#3fb950}.badge-verdict-ineffective{background:#f8514922;color:#f85149}.badge-verdict-pending{background:#d2992222;color:#d29922}.badge-verdict-no-data{background:#8b949e22;color:#8b949e}.badge-severity{padding:1px 6px;border-radius:3px;font-size:10px;font-weight:600}.badge-severity-high{background:#f8514922;color:#f85149}.badge-severity-medium{background:#d2992222;color:#d29922}.badge-severity-low{background:#58a6ff22;color:#58a6ff}.quality-grid{padding:16px}.quality-score-header{display:flex;align-items:center;gap:16px;margin-bottom:16px;padding:16px;background:var(--bg-secondary);border:1px solid var(--border);border-radius:var(--radius)}.quality-checks-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(240px,1fr));gap:12px}.quality-check-card{background:var(--bg-secondary);border:1px solid var(--border);border-radius:var(--radius);padding:14px}.quality-check-card.check-ok{border-left:3px solid var(--green)}.quality-check-card.check-fail{border-left:3px solid var(--red)}.quality-check-name{font-size:13px;font-weight:600;margin-bottom:6px}.quality-check-detail{font-size:12px;color:var(--text-secondary)}.quality-check-value{font-family:var(--font-mono);font-size:18px;font-weight:700;margin-top:6px}.verify-summary-bar{display:flex;gap:12px;padding:12px 16px;background:var(--bg-secondary);border-bottom:1px solid var(--border)}.verify-stat{display:flex;align-items:center;gap:6px;font-size:12px;color:var(--text-secondary)}.verify-stat strong{font-family:var(--font-mono);color:var(--text-primary)}#roadmap-content{padding:16px}.roadmap-version{margin-bottom:24px}.roadmap-version-header{display:flex;align-items:center;gap:12px;margin-bottom:12px;padding-bottom:8px;border-bottom:1px solid var(--border)}.roadmap-version-tag{font-family:var(--font-mono);font-size:14px;font-weight:700;color:var(--accent);padding:2px 10px;background:#58a6ff15;border:1px solid #58a6ff33;border-radius:var(--radius-sm)}.roadmap-progress{display:flex;align-items:center;gap:8px;font-size:12px;color:var(--text-secondary)}.roadmap-progress-bar{width:100px;height:6px;background:var(--bg-tertiary);border-radius:3px;overflow:hidden}.roadmap-progress-fill{height:100%;background:var(--green);border-radius:3px;transition:width .3s}.roadmap-items{display:flex;flex-direction:column;gap:6px;padding-left:16px}.roadmap-item{display:flex;align-items:center;gap:8px;padding:6px 10px;font-size:13px;border-radius:var(--radius-sm);transition:background .1s}.roadmap-item:hover{background:var(--bg-secondary)}.roadmap-item-dot{width:8px;height:8px;border-radius:50%;flex-shrink:0}.roadmap-item-dot.done{background:var(--green)}.roadmap-item-dot.developing{background:var(--yellow)}.roadmap-item-dot.planned{background:var(--accent)}.roadmap-item-dot.idea{background:var(--text-muted)}.milestone-mini{display:flex;align-items:center;gap:8px;padding:6px 0;font-size:12px;border-bottom:1px solid var(--border)}.milestone-mini:last-child{border-bottom:none}.milestone-progress-mini{width:40px;height:4px;background:var(--bg-tertiary);border-radius:2px;overflow:hidden}.milestone-progress-mini-fill{height:100%;background:var(--accent);border-radius:2px}.milestone-title{flex:1;color:var(--text-secondary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.milestone-percent{font-family:var(--font-mono);font-size:11px;color:var(--text-muted);min-width:32px;text-align:right}#telemetry-content{padding:16px}.telemetry-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:16px}.telemetry-card{background:var(--bg-secondary);border:1px solid var(--border);border-radius:var(--radius);padding:14px}.telemetry-card-title{font-size:12px;color:var(--text-muted);margin-bottom:10px;text-transform:uppercase;letter-spacing:.5px}.cmd-row{display:flex;justify-content:space-between;padding:4px 0;font-size:12px;border-bottom:1px solid var(--border)}.cmd-row:last-child{border-bottom:none}.cmd-name{font-family:var(--font-mono);color:var(--accent)}.cmd-stats{color:var(--text-secondary)}.cmd-fail{color:var(--red)}.error-row{padding:6px 0;border-bottom:1px solid var(--border);font-size:12px}.error-row:last-child{border-bottom:none}.error-msg{font-family:var(--font-mono);font-size:11px;color:var(--red);word-break:break-all}.error-count{font-size:11px;color:var(--text-muted)}.dev-item{display:flex;align-items:center;gap:8px;padding:6px 0;font-size:12px;border-bottom:1px solid var(--border)}.dev-item:last-child{border-bottom:none}.dev-id{font-family:var(--font-mono);color:var(--text-muted);font-size:11px}.dev-title{flex:1;color:var(--text-secondary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.mirror-empty{text-align:center;padding:32px 16px;color:var(--text-muted);font-size:13px}.mirror-empty-icon{font-size:32px;margin-bottom:8px;opacity:.5}@media(max-width:768px){.mirror-grid,.quality-checks-grid,.telemetry-grid{grid-template-columns:1fr}.filter-group{flex-direction:column}.health-row{flex-direction:column;text-align:center}.test-latest-row{grid-template-columns:1fr;gap:4px}.test-history-count{margin-left:0;width:100%}.test-query-label input{min-width:0;width:100%}.test-history-row{grid-template-columns:1fr;gap:3px}.test-auto-controls{flex-direction:column;align-items:stretch}.test-auto-controls label{width:100%;justify-content:space-between}.test-auto-controls select,.test-auto-controls input,.btn-test-secondary{width:100%}.test-auto-toggle{justify-content:flex-start!important}}