@dollhousemcp/mcp-server 2.0.2 → 2.0.4

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 (59) hide show
  1. package/CHANGELOG.md +35 -0
  2. package/README.github.md +8 -33
  3. package/README.md +10 -8
  4. package/README.md.backup +10 -8
  5. package/README.npm.md +10 -8
  6. package/dist/constants/version.d.ts +3 -0
  7. package/dist/constants/version.d.ts.map +1 -0
  8. package/dist/constants/version.js +4 -0
  9. package/dist/generated/version.d.ts +2 -2
  10. package/dist/generated/version.js +3 -3
  11. package/dist/logging/sinks/SSELogSink.d.ts +35 -0
  12. package/dist/logging/sinks/SSELogSink.d.ts.map +1 -0
  13. package/dist/logging/sinks/SSELogSink.js +181 -0
  14. package/dist/logging/viewer/viewerHtml.d.ts +8 -0
  15. package/dist/logging/viewer/viewerHtml.d.ts.map +1 -0
  16. package/dist/logging/viewer/viewerHtml.js +204 -0
  17. package/dist/security/audit/config/suppressions.d.ts.map +1 -1
  18. package/dist/security/audit/config/suppressions.js +6 -1
  19. package/dist/seed-elements/memories/dollhousemcp-baseline-knowledge.yaml +149 -0
  20. package/dist/seed-elements/memories/how-to-create-custom-auto-load-memories.yaml +455 -0
  21. package/dist/seed-elements/memories/priority-best-practices-for-teams.yaml +542 -0
  22. package/dist/seed-elements/memories/token-estimation-guidelines.yaml +602 -0
  23. package/dist/web/public/app.js +29 -10
  24. package/dist/web/public/fonts/ibmplexmono--F63fjptAgt5VM-kVkqdyU8n1i8q131nj-o.woff2 +0 -0
  25. package/dist/web/public/fonts/ibmplexmono--F63fjptAgt5VM-kVkqdyU8n1iAq131nj-otFQ.woff2 +0 -0
  26. package/dist/web/public/fonts/ibmplexmono--F63fjptAgt5VM-kVkqdyU8n1iEq131nj-otFQ.woff2 +0 -0
  27. package/dist/web/public/fonts/ibmplexmono--F63fjptAgt5VM-kVkqdyU8n1iIq131nj-otFQ.woff2 +0 -0
  28. package/dist/web/public/fonts/ibmplexmono--F63fjptAgt5VM-kVkqdyU8n1isq131nj-otFQ.woff2 +0 -0
  29. package/dist/web/public/fonts/ibmplexmono--F6qfjptAgt5VM-kVkqdyU8n3twJwl1FgsAXHNlYzg.woff2 +0 -0
  30. package/dist/web/public/fonts/ibmplexmono--F6qfjptAgt5VM-kVkqdyU8n3twJwl5FgsAXHNlYzg.woff2 +0 -0
  31. package/dist/web/public/fonts/ibmplexmono--F6qfjptAgt5VM-kVkqdyU8n3twJwl9FgsAXHNlYzg.woff2 +0 -0
  32. package/dist/web/public/fonts/ibmplexmono--F6qfjptAgt5VM-kVkqdyU8n3twJwlBFgsAXHNk.woff2 +0 -0
  33. package/dist/web/public/fonts/ibmplexmono--F6qfjptAgt5VM-kVkqdyU8n3twJwlRFgsAXHNlYzg.woff2 +0 -0
  34. package/dist/web/public/fonts/manrope-xn7gYHE41ni1AdIRggOxSvfedN62Zw.woff2 +0 -0
  35. package/dist/web/public/fonts/manrope-xn7gYHE41ni1AdIRggSxSvfedN62Zw.woff2 +0 -0
  36. package/dist/web/public/fonts/manrope-xn7gYHE41ni1AdIRggexSvfedN4.woff2 +0 -0
  37. package/dist/web/public/fonts/manrope-xn7gYHE41ni1AdIRggixSvfedN62Zw.woff2 +0 -0
  38. package/dist/web/public/fonts/manrope-xn7gYHE41ni1AdIRggmxSvfedN62Zw.woff2 +0 -0
  39. package/dist/web/public/fonts/manrope-xn7gYHE41ni1AdIRggqxSvfedN62Zw.woff2 +0 -0
  40. package/dist/web/public/fonts/plusjakartasans-LDIoaomQNQcsA88c7O9yZ4KMCoOg4Ko20yygg_vb.woff2 +0 -0
  41. package/dist/web/public/fonts/plusjakartasans-LDIoaomQNQcsA88c7O9yZ4KMCoOg4Ko40yygg_vbd-E.woff2 +0 -0
  42. package/dist/web/public/fonts/plusjakartasans-LDIoaomQNQcsA88c7O9yZ4KMCoOg4Ko50yygg_vbd-E.woff2 +0 -0
  43. package/dist/web/public/fonts/plusjakartasans-LDIoaomQNQcsA88c7O9yZ4KMCoOg4Ko70yygg_vbd-E.woff2 +0 -0
  44. package/dist/web/public/fonts.css +270 -0
  45. package/dist/web/public/index.html +365 -0
  46. package/dist/web/public/logs.css +472 -0
  47. package/dist/web/public/metrics.css +238 -0
  48. package/dist/web/public/permissions.css +364 -0
  49. package/dist/web/public/sessions.css +235 -0
  50. package/dist/web/public/setup.css +648 -0
  51. package/dist/web/public/setup.js +752 -0
  52. package/dist/web/public/styles.css +1717 -0
  53. package/dist/web/routes/setupRoutes.d.ts +18 -0
  54. package/dist/web/routes/setupRoutes.d.ts.map +1 -0
  55. package/dist/web/routes/setupRoutes.js +360 -0
  56. package/dist/web/server.d.ts.map +1 -1
  57. package/dist/web/server.js +11 -1
  58. package/package.json +4 -1
  59. package/server.json +2 -2
@@ -0,0 +1,648 @@
1
+ /**
2
+ * DollhouseMCP Console — Setup Tab
3
+ *
4
+ * Platform-specific install instructions with OS detection,
5
+ * copy-to-clipboard code blocks, and verification steps.
6
+ */
7
+
8
+ /* ── Layout ────────────────────────────────────────────────────────────── */
9
+
10
+ .setup-page {
11
+ max-width: 52rem;
12
+ margin: 0 auto;
13
+ padding: var(--gutter) var(--gutter) 3rem;
14
+ }
15
+
16
+ /* ── Hero ──────────────────────────────────────────────────────────────── */
17
+
18
+ .setup-hero {
19
+ text-align: center;
20
+ margin-bottom: 2rem;
21
+ }
22
+
23
+ .setup-hero-status {
24
+ display: inline-flex;
25
+ align-items: center;
26
+ gap: 0.5rem;
27
+ padding: 0.35rem 1rem;
28
+ border-radius: 999px;
29
+ background: color-mix(in srgb, #22c55e 12%, var(--surface-1));
30
+ border: 1px solid color-mix(in srgb, #22c55e 30%, var(--line));
31
+ color: #16a34a;
32
+ font-family: var(--font-mono);
33
+ font-size: 0.82rem;
34
+ font-weight: 600;
35
+ margin-bottom: 1rem;
36
+ }
37
+
38
+ [data-theme="dark"] .setup-hero-status {
39
+ color: #4ade80;
40
+ }
41
+
42
+ .setup-status-dot {
43
+ width: 8px;
44
+ height: 8px;
45
+ border-radius: 50%;
46
+ background: #22c55e;
47
+ animation: setup-pulse 2s ease-in-out infinite;
48
+ }
49
+
50
+ @keyframes setup-pulse {
51
+ 0%, 100% { opacity: 1; }
52
+ 50% { opacity: 0.4; }
53
+ }
54
+
55
+ .setup-hero-title {
56
+ font-family: var(--font-heading);
57
+ font-size: var(--step-3);
58
+ font-weight: 700;
59
+ color: var(--ink-950);
60
+ margin: 0 0 0.4rem;
61
+ }
62
+
63
+ .setup-hero-sub {
64
+ font-size: var(--step-0);
65
+ color: var(--ink-500);
66
+ margin: 0;
67
+ }
68
+
69
+ /* ── Method toggle ─────────────────────────────────────────────────────── */
70
+
71
+ .setup-method-toggle {
72
+ display: grid;
73
+ grid-template-columns: 1fr 1fr;
74
+ gap: 0.5rem;
75
+ border: none;
76
+ padding: 0;
77
+ margin: 0 0 1.2rem;
78
+ }
79
+
80
+ .setup-method-btn {
81
+ appearance: none;
82
+ display: flex;
83
+ flex-direction: column;
84
+ gap: 0.15rem;
85
+ padding: 0.7rem 1rem;
86
+ border: 2px solid var(--line);
87
+ border-radius: var(--radius-md);
88
+ background: var(--surface-2);
89
+ cursor: pointer;
90
+ text-align: left;
91
+ transition: border-color 0.15s, background 0.15s;
92
+ }
93
+
94
+ .setup-method-btn:hover {
95
+ border-color: color-mix(in srgb, var(--signal) 40%, var(--line));
96
+ }
97
+
98
+ .setup-method-btn.is-active {
99
+ border-color: var(--signal);
100
+ background: color-mix(in srgb, var(--signal-2) 8%, var(--surface-2));
101
+ }
102
+
103
+ .setup-method-btn strong {
104
+ font-family: var(--font-heading);
105
+ font-size: var(--step-0);
106
+ color: var(--ink-950);
107
+ }
108
+
109
+ .setup-method-btn span {
110
+ font-size: var(--step--1);
111
+ color: var(--ink-500);
112
+ }
113
+
114
+ .setup-method-btn.is-active strong {
115
+ color: var(--signal);
116
+ }
117
+
118
+ .setup-pinned-prereq {
119
+ margin-bottom: 1.2rem;
120
+ }
121
+
122
+ .setup-method h4 {
123
+ font-family: var(--font-heading);
124
+ font-size: var(--step-0);
125
+ font-weight: 600;
126
+ color: var(--ink-900);
127
+ margin: 1rem 0 0.3rem;
128
+ }
129
+
130
+ .setup-method h4:first-of-type {
131
+ margin-top: 0.3rem;
132
+ }
133
+
134
+ /* ── Platform tabs ─────────────────────────────────────────────────────── */
135
+
136
+ .setup-platforms {
137
+ display: flex;
138
+ flex-wrap: wrap;
139
+ gap: 0.35rem;
140
+ justify-content: center;
141
+ margin-bottom: 1.5rem;
142
+ }
143
+
144
+ .setup-platform-tab {
145
+ appearance: none;
146
+ border: 1px solid var(--line);
147
+ border-radius: 999px;
148
+ background: var(--surface-2);
149
+ color: var(--ink-700);
150
+ font-family: var(--font-mono);
151
+ font-size: 0.82rem;
152
+ font-weight: 600;
153
+ padding: 0.42rem 0.9rem;
154
+ cursor: pointer;
155
+ white-space: nowrap;
156
+ transition: background 0.15s, color 0.15s, border-color 0.15s;
157
+ }
158
+
159
+ .setup-platform-tab:hover,
160
+ .setup-platform-tab:focus-visible {
161
+ background: color-mix(in srgb, var(--signal-2) 12%, var(--surface-1));
162
+ border-color: color-mix(in srgb, var(--signal) 30%, var(--line));
163
+ color: var(--ink-950);
164
+ }
165
+
166
+ .setup-platform-tab.is-active {
167
+ background: var(--signal);
168
+ border-color: var(--signal);
169
+ color: #fff;
170
+ }
171
+
172
+ /* ── Panels ────────────────────────────────────────────────────────────── */
173
+
174
+ .setup-panel {
175
+ display: grid;
176
+ gap: 1.2rem;
177
+ }
178
+
179
+ .setup-panel[hidden] {
180
+ display: none;
181
+ }
182
+
183
+ /* ── Method blocks ─────────────────────────────────────────────────────── */
184
+
185
+ .setup-method {
186
+ background: var(--surface-2);
187
+ border: 1px solid var(--line);
188
+ border-radius: var(--radius-md);
189
+ padding: 1.2rem 1.4rem;
190
+ }
191
+
192
+ .setup-method-primary {
193
+ background:
194
+ linear-gradient(135deg,
195
+ color-mix(in srgb, var(--signal-2) 6%, var(--surface-2)),
196
+ var(--surface-2) 60%);
197
+ border-color: color-mix(in srgb, var(--signal) 25%, var(--line));
198
+ }
199
+
200
+ .setup-method h3 {
201
+ font-family: var(--font-heading);
202
+ font-size: var(--step-1);
203
+ font-weight: 700;
204
+ color: var(--ink-950);
205
+ margin: 0 0 0.5rem;
206
+ }
207
+
208
+ .setup-method p {
209
+ color: var(--ink-700);
210
+ font-size: var(--step--1);
211
+ margin: 0 0 0.65rem;
212
+ line-height: 1.55;
213
+ }
214
+
215
+ .setup-method p:last-child {
216
+ margin-bottom: 0;
217
+ }
218
+
219
+ .setup-paths {
220
+ list-style: none;
221
+ margin: 0 0 0.8rem;
222
+ padding: 0;
223
+ display: grid;
224
+ gap: 0.3rem;
225
+ }
226
+
227
+ .setup-paths li {
228
+ font-size: var(--step--1);
229
+ color: var(--ink-700);
230
+ }
231
+
232
+ .setup-paths li strong {
233
+ color: var(--ink-900);
234
+ min-width: 5rem;
235
+ display: inline-block;
236
+ }
237
+
238
+ .setup-paths li.is-current {
239
+ color: var(--signal);
240
+ font-weight: 600;
241
+ }
242
+
243
+ .setup-paths li.is-current strong {
244
+ color: var(--signal);
245
+ }
246
+
247
+ /* ── Code blocks ───────────────────────────────────────────────────────── */
248
+
249
+ .setup-code-block {
250
+ position: relative;
251
+ margin: 0.5rem 0;
252
+ }
253
+
254
+ .setup-code-block pre {
255
+ margin: 0;
256
+ padding: 1rem 1.2rem;
257
+ padding-right: 4.5rem;
258
+ background: var(--ink-950);
259
+ color: #e2e8f0;
260
+ border-radius: var(--radius-sm);
261
+ font-family: var(--font-mono);
262
+ font-size: 0.82rem;
263
+ line-height: 1.6;
264
+ overflow-x: auto;
265
+ white-space: pre;
266
+ tab-size: 2;
267
+ }
268
+
269
+ [data-theme="dark"] .setup-code-block pre {
270
+ background: #0a0e18;
271
+ border: 1px solid var(--line);
272
+ }
273
+
274
+ .setup-code-block-sm pre {
275
+ padding: 0.7rem 1rem;
276
+ padding-right: 4.5rem;
277
+ }
278
+
279
+ .setup-copy-btn {
280
+ position: absolute;
281
+ top: 0.55rem;
282
+ right: 0.55rem;
283
+ z-index: 2;
284
+ appearance: none;
285
+ border: 1px solid color-mix(in srgb, #ffffff 18%, transparent);
286
+ border-radius: var(--radius-sm);
287
+ background: color-mix(in srgb, var(--ink-950) 80%, #1e293b);
288
+ color: #cbd5e1;
289
+ font-family: var(--font-mono);
290
+ font-size: 0.72rem;
291
+ font-weight: 600;
292
+ padding: 0.3rem 0.65rem;
293
+ cursor: pointer;
294
+ transition: background 0.15s, color 0.15s;
295
+ letter-spacing: 0.03em;
296
+ text-transform: uppercase;
297
+ }
298
+
299
+ .setup-copy-btn:hover {
300
+ background: color-mix(in srgb, var(--signal) 70%, var(--ink-950));
301
+ color: #fff;
302
+ }
303
+
304
+ .setup-copy-btn[data-copied] {
305
+ background: color-mix(in srgb, #22c55e 50%, var(--ink-950));
306
+ color: #fff;
307
+ }
308
+
309
+ /* ── CTA button ────────────────────────────────────────────────────────── */
310
+
311
+ .setup-btn {
312
+ display: inline-flex;
313
+ align-items: center;
314
+ gap: 0.45rem;
315
+ padding: 0.55rem 1.4rem;
316
+ border-radius: var(--radius-sm);
317
+ font-family: var(--font-mono);
318
+ font-size: 0.88rem;
319
+ font-weight: 700;
320
+ text-decoration: none;
321
+ cursor: pointer;
322
+ transition: transform 0.12s, box-shadow 0.12s;
323
+ }
324
+
325
+ .setup-btn:hover {
326
+ transform: translateY(-1px);
327
+ box-shadow: var(--shadow-soft);
328
+ }
329
+
330
+ .setup-btn-primary {
331
+ background: var(--signal);
332
+ color: #fff;
333
+ border: none;
334
+ }
335
+
336
+ .setup-btn-primary:hover {
337
+ background: var(--signal-2);
338
+ }
339
+
340
+ /* ── Install row ───────────────────────────────────────────────────────── */
341
+
342
+ .setup-install-row {
343
+ display: flex;
344
+ align-items: center;
345
+ gap: 0.8rem;
346
+ margin-bottom: 0.8rem;
347
+ }
348
+
349
+ .setup-install-btn.is-loading {
350
+ opacity: 0.7;
351
+ cursor: wait;
352
+ animation: setup-install-pulse 1.5s ease-in-out infinite;
353
+ }
354
+
355
+ @keyframes setup-install-pulse {
356
+ 0%, 100% { opacity: 0.7; }
357
+ 50% { opacity: 0.4; }
358
+ }
359
+
360
+ .setup-install-btn.is-success {
361
+ background: #16a34a;
362
+ cursor: default;
363
+ }
364
+
365
+ .setup-install-status {
366
+ font-family: var(--font-mono);
367
+ font-size: 0.8rem;
368
+ font-weight: 600;
369
+ }
370
+
371
+ .setup-install-status.is-success {
372
+ color: #16a34a;
373
+ }
374
+
375
+ [data-theme="dark"] .setup-install-status.is-success {
376
+ color: #4ade80;
377
+ }
378
+
379
+ .setup-install-status.is-error {
380
+ color: #dc2626;
381
+ }
382
+
383
+ [data-theme="dark"] .setup-install-status.is-error {
384
+ color: #f87171;
385
+ }
386
+
387
+ .setup-btn-secondary {
388
+ background: var(--surface-1);
389
+ color: var(--signal);
390
+ border: 1px solid color-mix(in srgb, var(--signal) 30%, var(--line));
391
+ }
392
+
393
+ .setup-btn-secondary:hover {
394
+ background: color-mix(in srgb, var(--signal-2) 12%, var(--surface-1));
395
+ }
396
+
397
+ /* ── Open config button ────────────────────────────────────────────────── */
398
+
399
+ .setup-open-btn {
400
+ appearance: none;
401
+ border: 1px solid var(--line);
402
+ border-radius: var(--radius-sm);
403
+ background: var(--surface-1);
404
+ color: var(--signal);
405
+ font-family: var(--font-mono);
406
+ font-size: 0.7rem;
407
+ font-weight: 600;
408
+ padding: 0.2rem 0.55rem;
409
+ cursor: pointer;
410
+ vertical-align: middle;
411
+ margin-left: 0.5rem;
412
+ transition: background 0.15s, border-color 0.15s;
413
+ }
414
+
415
+ .setup-open-btn:hover {
416
+ background: color-mix(in srgb, var(--signal-2) 12%, var(--surface-1));
417
+ border-color: color-mix(in srgb, var(--signal) 35%, var(--line));
418
+ }
419
+
420
+ .setup-open-btn[disabled] {
421
+ opacity: 0.5;
422
+ cursor: default;
423
+ }
424
+
425
+ /* ── Badges ────────────────────────────────────────────────────────────── */
426
+
427
+ .setup-badge {
428
+ display: inline-block;
429
+ padding: 0.15rem 0.5rem;
430
+ border-radius: 999px;
431
+ font-family: var(--font-mono);
432
+ font-size: 0.68rem;
433
+ font-weight: 700;
434
+ letter-spacing: 0.03em;
435
+ text-transform: uppercase;
436
+ vertical-align: middle;
437
+ background: color-mix(in srgb, #22c55e 15%, var(--surface-1));
438
+ border: 1px solid color-mix(in srgb, #22c55e 30%, var(--line));
439
+ color: #16a34a;
440
+ }
441
+
442
+ [data-theme="dark"] .setup-badge {
443
+ color: #4ade80;
444
+ }
445
+
446
+ .setup-badge-muted {
447
+ background: var(--surface-1);
448
+ border-color: var(--line);
449
+ color: var(--ink-500);
450
+ }
451
+
452
+ /* ── Hints ─────────────────────────────────────────────────────────────── */
453
+
454
+ .setup-hint {
455
+ font-size: var(--step--1);
456
+ color: var(--ink-500);
457
+ font-style: italic;
458
+ margin: 0.3rem 0 0;
459
+ }
460
+
461
+ /* ── Verify section ────────────────────────────────────────────────────── */
462
+
463
+ .setup-verify {
464
+ margin-top: 2rem;
465
+ padding: 1.4rem 1.6rem;
466
+ background:
467
+ linear-gradient(135deg,
468
+ color-mix(in srgb, var(--accent) 5%, var(--surface-2)),
469
+ var(--surface-2) 60%);
470
+ border: 1px solid color-mix(in srgb, var(--accent) 20%, var(--line));
471
+ border-radius: var(--radius-md);
472
+ }
473
+
474
+ .setup-verify h3 {
475
+ font-family: var(--font-heading);
476
+ font-size: var(--step-1);
477
+ font-weight: 700;
478
+ color: var(--ink-950);
479
+ margin: 0 0 0.5rem;
480
+ }
481
+
482
+ .setup-verify p {
483
+ color: var(--ink-700);
484
+ font-size: var(--step--1);
485
+ margin: 0 0 0.65rem;
486
+ line-height: 1.55;
487
+ }
488
+
489
+ .setup-try-prompts {
490
+ display: flex;
491
+ flex-wrap: wrap;
492
+ gap: 0.4rem;
493
+ }
494
+
495
+ .setup-try-prompts code {
496
+ display: inline-block;
497
+ padding: 0.3rem 0.7rem;
498
+ background: var(--surface-1);
499
+ border: 1px solid var(--line);
500
+ border-radius: var(--radius-sm);
501
+ font-family: var(--font-mono);
502
+ font-size: 0.78rem;
503
+ color: var(--ink-700);
504
+ white-space: nowrap;
505
+ }
506
+
507
+ /* ── Footer ────────────────────────────────────────────────────────────── */
508
+
509
+ .setup-footer {
510
+ margin-top: 1.5rem;
511
+ text-align: center;
512
+ }
513
+
514
+ .setup-footer p {
515
+ font-size: var(--step--1);
516
+ color: var(--ink-500);
517
+ }
518
+
519
+ .setup-footer a {
520
+ color: var(--signal);
521
+ text-decoration: none;
522
+ }
523
+
524
+ .setup-footer a:hover {
525
+ text-decoration: underline;
526
+ }
527
+
528
+ /* ── Detection: installed notice + tab badge ────────────────────────────── */
529
+
530
+ .setup-tab-badge {
531
+ display: inline-block;
532
+ margin-left: 0.3rem;
533
+ padding: 0.1rem 0.4rem;
534
+ border-radius: 999px;
535
+ font-size: 0.62rem;
536
+ font-weight: 700;
537
+ letter-spacing: 0.03em;
538
+ text-transform: uppercase;
539
+ background: color-mix(in srgb, #22c55e 18%, var(--surface-1));
540
+ color: #16a34a;
541
+ vertical-align: middle;
542
+ }
543
+
544
+ [data-theme="dark"] .setup-tab-badge {
545
+ color: #4ade80;
546
+ }
547
+
548
+ .setup-installed-notice {
549
+ padding: 0.8rem 1rem;
550
+ margin-bottom: 0.8rem;
551
+ border-radius: var(--radius-sm);
552
+ border: 1px solid color-mix(in srgb, var(--accent) 35%, var(--line));
553
+ background: color-mix(in srgb, var(--accent) 6%, var(--surface-2));
554
+ font-size: var(--step--1);
555
+ color: var(--ink-700);
556
+ line-height: 1.5;
557
+ }
558
+
559
+ .setup-installed-notice strong {
560
+ color: var(--accent);
561
+ }
562
+
563
+ /* Green match state — config matches what would be installed */
564
+ .setup-installed-notice.is-match {
565
+ border-color: color-mix(in srgb, #22c55e 35%, var(--line));
566
+ background: color-mix(in srgb, #22c55e 6%, var(--surface-2));
567
+ }
568
+
569
+ .setup-installed-notice.is-match strong {
570
+ color: #16a34a;
571
+ }
572
+
573
+ [data-theme="dark"] .setup-installed-notice.is-match strong {
574
+ color: #4ade80;
575
+ }
576
+
577
+ .setup-tab-badge.is-match {
578
+ background: color-mix(in srgb, #22c55e 25%, var(--surface-1));
579
+ color: #16a34a;
580
+ }
581
+
582
+ [data-theme="dark"] .setup-tab-badge.is-match {
583
+ color: #4ade80;
584
+ }
585
+
586
+ .setup-install-btn.is-match {
587
+ background: #16a34a;
588
+ cursor: default;
589
+ opacity: 0.85;
590
+ }
591
+
592
+ .setup-installed-notice details {
593
+ margin-top: 0.5rem;
594
+ }
595
+
596
+ .setup-installed-notice summary {
597
+ cursor: pointer;
598
+ color: var(--signal);
599
+ font-weight: 600;
600
+ font-size: 0.8rem;
601
+ }
602
+
603
+ .setup-installed-notice pre {
604
+ margin: 0.4rem 0 0;
605
+ padding: 0.6rem 0.8rem;
606
+ background: var(--ink-950);
607
+ color: #e2e8f0;
608
+ border-radius: var(--radius-sm);
609
+ font-family: var(--font-mono);
610
+ font-size: 0.78rem;
611
+ white-space: pre-wrap;
612
+ word-break: break-all;
613
+ }
614
+
615
+ [data-theme="dark"] .setup-installed-notice pre {
616
+ background: #0a0e18;
617
+ border: 1px solid var(--line);
618
+ }
619
+
620
+ /* ── Responsive ────────────────────────────────────────────────────────── */
621
+
622
+ @media (max-width: 640px) {
623
+ .setup-page {
624
+ padding: 1rem;
625
+ }
626
+
627
+ .setup-platforms {
628
+ gap: 0.25rem;
629
+ }
630
+
631
+ .setup-platform-tab {
632
+ font-size: 0.75rem;
633
+ padding: 0.35rem 0.65rem;
634
+ }
635
+
636
+ .setup-method {
637
+ padding: 1rem;
638
+ }
639
+
640
+ .setup-code-block pre {
641
+ font-size: 0.75rem;
642
+ padding-right: 3.8rem;
643
+ }
644
+
645
+ .setup-try-prompts {
646
+ flex-direction: column;
647
+ }
648
+ }