akm-cli 0.10.261005-beta → 0.10.261007-beta

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 (55) hide show
  1. package/CHANGELOG.md +65 -0
  2. package/STABILITY.md +9 -0
  3. package/dist/assets/ui/app.js +91 -0
  4. package/dist/assets/ui/asset.js +67 -0
  5. package/dist/assets/ui/bundles.js +80 -0
  6. package/dist/assets/ui/changes.js +32 -0
  7. package/dist/assets/ui/charts.js +93 -0
  8. package/dist/assets/ui/config.js +69 -0
  9. package/dist/assets/ui/diff-view.js +202 -0
  10. package/dist/assets/ui/diff.js +261 -0
  11. package/dist/assets/ui/index.html +30 -0
  12. package/dist/assets/ui/lib.js +238 -0
  13. package/dist/assets/ui/markdown.js +103 -0
  14. package/dist/assets/ui/overview.js +145 -0
  15. package/dist/assets/ui/proposal-actions.js +273 -0
  16. package/dist/assets/ui/proposals.js +219 -0
  17. package/dist/assets/ui/search.js +62 -0
  18. package/dist/assets/ui/styles.css +1415 -0
  19. package/dist/cli.js +3 -0
  20. package/dist/commands/health/checks.js +5 -3
  21. package/dist/commands/health/egress.js +5 -1
  22. package/dist/commands/health/engine-usage.js +2 -2
  23. package/dist/commands/health/llm-usage.js +2 -2
  24. package/dist/commands/health/windows.js +5 -5
  25. package/dist/commands/health.js +40 -8
  26. package/dist/commands/improve/reflect-noise.js +4 -0
  27. package/dist/commands/improve/reflect.js +14 -5
  28. package/dist/commands/metrics/metrics-cli.js +3 -3
  29. package/dist/commands/proposal/propose-cli.js +5 -0
  30. package/dist/commands/proposal/propose.js +6 -2
  31. package/dist/commands/proposal/repository.js +34 -29
  32. package/dist/commands/read/search.js +2 -1
  33. package/dist/commands/read/show.js +18 -12
  34. package/dist/commands/sources/source-clone.js +123 -11
  35. package/dist/commands/ui/api.js +556 -0
  36. package/dist/commands/ui/git-read.js +101 -0
  37. package/dist/commands/ui/open-browser.js +30 -0
  38. package/dist/commands/ui/proposal-actions.js +179 -0
  39. package/dist/commands/ui/redact.js +88 -0
  40. package/dist/commands/ui/server.js +352 -0
  41. package/dist/commands/ui/ui-cli.js +62 -0
  42. package/dist/core/asset/resolve-ref.js +7 -3
  43. package/dist/indexer/indexer.js +14 -2
  44. package/dist/indexer/search/db-search.js +7 -3
  45. package/dist/output/format-exempt.js +3 -0
  46. package/dist/storage/repositories/improve-runs-repository.js +6 -0
  47. package/dist/storage/repositories/index-db.js +10 -2
  48. package/dist/storage/repositories/metrics-repository.js +17 -0
  49. package/docs/architecture/0.10-process-rules.md +3 -4
  50. package/docs/architecture/improvement.md +2 -1
  51. package/docs/architecture/internals/improve-workflow.md +2 -2
  52. package/docs/reference/README.md +1 -0
  53. package/docs/reference/cli.md +68 -0
  54. package/docs/reference/ui-api.md +576 -0
  55. package/package.json +1 -1
@@ -0,0 +1,1415 @@
1
+ /* akm ui. Colours are tokens on :root; the dark set follows prefers-color-scheme. */
2
+ :root {
3
+ color-scheme: light dark;
4
+ --bg: #f5f6f8;
5
+ --surface: #ffffff;
6
+ --surface-2: #eef0f4;
7
+ --border: #dde1e8;
8
+ --text: #1a2230;
9
+ --muted: #586274;
10
+ --accent: #2354c7;
11
+ --accent-bg: #e6edfc;
12
+ --ok: #17753a;
13
+ --ok-bg: #dff3e6;
14
+ --warn: #8a5a00;
15
+ --warn-bg: #fbeccb;
16
+ --fail: #c4202c;
17
+ --fail-bg: #fbe0e2;
18
+ --info: #1f5fa8;
19
+ --info-bg: #e0eefb;
20
+ --add-bg: #dff3e6;
21
+ --del-bg: #fbe0e2;
22
+ --add-strong: #a8e0bb;
23
+ --del-strong: #f5b3b9;
24
+ --hunk-bg: #e6edfc;
25
+ --grid: #dde1e8;
26
+ --s1: #2f64d0;
27
+ --s2: #c0560b;
28
+ --s3: #12806f;
29
+ --s4: #8645c0;
30
+ --s5: #a8841a;
31
+ --s6: #6b7280;
32
+ --font: system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;
33
+ --mono: ui-monospace, "SF Mono", Menlo, Consolas, monospace;
34
+ }
35
+
36
+ @media (prefers-color-scheme: dark) {
37
+ :root {
38
+ --bg: #0e1218;
39
+ --surface: #161b23;
40
+ --surface-2: #1e2530;
41
+ --border: #2b3340;
42
+ --text: #e6eaf1;
43
+ --muted: #9aa5b6;
44
+ --accent: #7ea6ff;
45
+ --accent-bg: #1c2a4a;
46
+ --ok: #4cc26b;
47
+ --ok-bg: #153020;
48
+ --warn: #e8b84a;
49
+ --warn-bg: #3a2f12;
50
+ --fail: #ff8179;
51
+ --fail-bg: #3d1a1c;
52
+ --info: #6cb4ff;
53
+ --info-bg: #14283f;
54
+ --add-bg: #153020;
55
+ --del-bg: #3d1a1c;
56
+ --add-strong: #24663b;
57
+ --del-strong: #7d2b30;
58
+ --hunk-bg: #1c2a4a;
59
+ --grid: #2b3340;
60
+ --s1: #6e9cff;
61
+ --s2: #f0903e;
62
+ --s3: #3ec9b0;
63
+ --s4: #be8cff;
64
+ --s5: #e0bc4a;
65
+ --s6: #94a0b2;
66
+ }
67
+ }
68
+
69
+ * {
70
+ box-sizing: border-box;
71
+ }
72
+
73
+ body {
74
+ margin: 0;
75
+ background: var(--bg);
76
+ color: var(--text);
77
+ font: 15px / 1.55 var(--font);
78
+ -webkit-text-size-adjust: 100%;
79
+ }
80
+
81
+ summary {
82
+ cursor: pointer;
83
+ }
84
+
85
+ a {
86
+ color: var(--accent);
87
+ text-underline-offset: 2px;
88
+ }
89
+
90
+ code,
91
+ pre,
92
+ .mono {
93
+ font-family: var(--mono);
94
+ font-size: 0.92em;
95
+ }
96
+
97
+ .num,
98
+ td.r,
99
+ th.r {
100
+ font-variant-numeric: tabular-nums;
101
+ }
102
+
103
+ .r {
104
+ text-align: right;
105
+ }
106
+
107
+ .muted {
108
+ color: var(--muted);
109
+ }
110
+
111
+ .small {
112
+ font-size: 0.85em;
113
+ }
114
+
115
+ .big {
116
+ font-size: 1.5rem;
117
+ font-weight: 600;
118
+ }
119
+
120
+ .wrap {
121
+ overflow-wrap: anywhere;
122
+ }
123
+
124
+ .pre-wrap {
125
+ white-space: pre-wrap;
126
+ }
127
+
128
+ .text-ok {
129
+ color: var(--ok);
130
+ }
131
+
132
+ .text-warn {
133
+ color: var(--warn);
134
+ }
135
+
136
+ .text-fail {
137
+ color: var(--fail);
138
+ }
139
+
140
+ /* ---- shell ---- */
141
+ .shell {
142
+ display: grid;
143
+ grid-template-columns: 220px minmax(0, 1fr);
144
+ min-height: 100vh;
145
+ }
146
+
147
+ .sidebar {
148
+ position: sticky;
149
+ top: 0;
150
+ align-self: start;
151
+ height: 100vh;
152
+ display: flex;
153
+ flex-direction: column;
154
+ gap: 24px;
155
+ padding: 24px 16px;
156
+ background: var(--surface);
157
+ border-right: 1px solid var(--border);
158
+ }
159
+
160
+ .brand {
161
+ font-size: 1.25rem;
162
+ font-weight: 700;
163
+ letter-spacing: -0.02em;
164
+ color: var(--text);
165
+ text-decoration: none;
166
+ white-space: nowrap;
167
+ flex: none;
168
+ }
169
+
170
+ .brand span {
171
+ color: var(--accent);
172
+ }
173
+
174
+ .nav-links {
175
+ list-style: none;
176
+ margin: 0;
177
+ padding: 0;
178
+ display: flex;
179
+ flex-direction: column;
180
+ gap: 2px;
181
+ }
182
+
183
+ .nav-links a {
184
+ display: block;
185
+ padding: 8px 12px;
186
+ border-radius: 8px;
187
+ color: var(--muted);
188
+ text-decoration: none;
189
+ font-weight: 500;
190
+ }
191
+
192
+ .nav-links a:hover {
193
+ background: var(--surface-2);
194
+ color: var(--text);
195
+ }
196
+
197
+ .nav-links a[aria-current="page"] {
198
+ background: var(--accent-bg);
199
+ color: var(--accent);
200
+ }
201
+
202
+ .nav-meta {
203
+ margin-top: auto;
204
+ display: flex;
205
+ flex-direction: column;
206
+ gap: 2px;
207
+ }
208
+
209
+ main {
210
+ min-width: 0;
211
+ max-width: 1100px;
212
+ width: 100%;
213
+ padding: 32px 40px 64px;
214
+ }
215
+
216
+ @media (max-width: 800px) {
217
+ .shell {
218
+ display: block;
219
+ }
220
+
221
+ .sidebar {
222
+ position: static;
223
+ height: auto;
224
+ flex-direction: row;
225
+ align-items: center;
226
+ gap: 12px;
227
+ padding: 10px 16px;
228
+ border-right: 0;
229
+ border-bottom: 1px solid var(--border);
230
+ }
231
+
232
+ .nav-links {
233
+ flex-direction: row;
234
+ overflow-x: auto;
235
+ min-width: 0;
236
+ }
237
+
238
+ .nav-links a {
239
+ white-space: nowrap;
240
+ padding: 6px 10px;
241
+ }
242
+
243
+ .nav-meta {
244
+ display: none;
245
+ }
246
+
247
+ main {
248
+ padding: 20px 16px 48px;
249
+ }
250
+ }
251
+
252
+ /* ---- type ---- */
253
+ h1 {
254
+ margin: 0;
255
+ font-size: 1.6rem;
256
+ line-height: 1.25;
257
+ letter-spacing: -0.02em;
258
+ }
259
+
260
+ h2 {
261
+ margin: 0 0 12px;
262
+ font-size: 1.1rem;
263
+ letter-spacing: -0.01em;
264
+ }
265
+
266
+ h3 {
267
+ margin: 0;
268
+ font-size: 1rem;
269
+ }
270
+
271
+ h4 {
272
+ margin: 16px 0 8px;
273
+ font-size: 0.78rem;
274
+ text-transform: uppercase;
275
+ letter-spacing: 0.06em;
276
+ color: var(--muted);
277
+ }
278
+
279
+ section {
280
+ margin-top: 36px;
281
+ }
282
+
283
+ section > h3 {
284
+ margin: 20px 0 8px;
285
+ }
286
+
287
+ p {
288
+ margin: 0 0 12px;
289
+ }
290
+
291
+ .page-head {
292
+ margin-bottom: 8px;
293
+ }
294
+
295
+ .page-head p {
296
+ margin: 4px 0 0;
297
+ }
298
+
299
+ .crumbs {
300
+ margin: 0 0 8px;
301
+ color: var(--muted);
302
+ font-size: 0.9em;
303
+ }
304
+
305
+ /* ---- states ---- */
306
+ .state {
307
+ padding: 24px;
308
+ border: 1px dashed var(--border);
309
+ border-radius: 10px;
310
+ color: var(--muted);
311
+ }
312
+
313
+ .state p:last-child {
314
+ margin-bottom: 0;
315
+ }
316
+
317
+ .state-title {
318
+ color: var(--text);
319
+ font-weight: 600;
320
+ }
321
+
322
+ .state-error {
323
+ border-style: solid;
324
+ border-color: var(--fail);
325
+ background: var(--fail-bg);
326
+ color: var(--text);
327
+ }
328
+
329
+ .state-loading {
330
+ display: flex;
331
+ align-items: center;
332
+ gap: 10px;
333
+ border-style: none;
334
+ }
335
+
336
+ .spinner {
337
+ width: 16px;
338
+ height: 16px;
339
+ border: 2px solid var(--border);
340
+ border-top-color: var(--accent);
341
+ border-radius: 50%;
342
+ animation: spin 0.8s linear infinite;
343
+ }
344
+
345
+ @keyframes spin {
346
+ to {
347
+ transform: rotate(360deg);
348
+ }
349
+ }
350
+
351
+ @media (prefers-reduced-motion: reduce) {
352
+ .spinner {
353
+ animation: none;
354
+ }
355
+ }
356
+
357
+ .notice {
358
+ margin: 16px 0;
359
+ padding: 12px 16px;
360
+ border-radius: 8px;
361
+ background: var(--surface-2);
362
+ border: 1px solid var(--border);
363
+ }
364
+
365
+ .notice-warn {
366
+ background: var(--warn-bg);
367
+ border-color: var(--warn);
368
+ }
369
+
370
+ .notice ul {
371
+ margin: 6px 0 0;
372
+ padding-left: 20px;
373
+ }
374
+
375
+ /* ---- badges ---- */
376
+ .badge {
377
+ display: inline-block;
378
+ padding: 1px 9px;
379
+ border-radius: 999px;
380
+ font-size: 0.78rem;
381
+ font-weight: 600;
382
+ line-height: 1.6;
383
+ border: 1px solid transparent;
384
+ white-space: nowrap;
385
+ }
386
+
387
+ .badge-ok {
388
+ color: var(--ok);
389
+ background: var(--ok-bg);
390
+ }
391
+
392
+ .badge-warn {
393
+ color: var(--warn);
394
+ background: var(--warn-bg);
395
+ }
396
+
397
+ .badge-fail {
398
+ color: var(--fail);
399
+ background: var(--fail-bg);
400
+ }
401
+
402
+ .badge-info {
403
+ color: var(--info);
404
+ background: var(--info-bg);
405
+ }
406
+
407
+ .badge-accent {
408
+ color: var(--s4);
409
+ background: var(--surface-2);
410
+ }
411
+
412
+ .badge-neutral {
413
+ color: var(--muted);
414
+ background: var(--surface-2);
415
+ border-color: var(--border);
416
+ }
417
+
418
+ .badges {
419
+ display: flex;
420
+ flex-wrap: wrap;
421
+ gap: 6px;
422
+ margin: 8px 0 0;
423
+ }
424
+
425
+ .dot {
426
+ display: inline-block;
427
+ width: 10px;
428
+ height: 10px;
429
+ border-radius: 50%;
430
+ background: var(--muted);
431
+ flex: none;
432
+ }
433
+
434
+ .dot-ok {
435
+ background: var(--ok);
436
+ }
437
+
438
+ .dot-warn {
439
+ background: var(--warn);
440
+ }
441
+
442
+ .dot-fail {
443
+ background: var(--fail);
444
+ }
445
+
446
+ /* ---- overview ---- */
447
+ .strip {
448
+ display: flex;
449
+ flex-wrap: wrap;
450
+ align-items: center;
451
+ gap: 8px 28px;
452
+ margin-top: 20px;
453
+ padding: 16px 20px;
454
+ background: var(--surface);
455
+ border: 1px solid var(--border);
456
+ border-radius: 12px;
457
+ }
458
+
459
+ .strip-main {
460
+ display: flex;
461
+ align-items: center;
462
+ gap: 10px;
463
+ }
464
+
465
+ .strip-main .badge {
466
+ font-size: 0.95rem;
467
+ padding: 3px 14px;
468
+ text-transform: uppercase;
469
+ }
470
+
471
+ .strip-label {
472
+ color: var(--muted);
473
+ }
474
+
475
+ .strip-item {
476
+ display: flex;
477
+ align-items: baseline;
478
+ gap: 6px;
479
+ }
480
+
481
+ .strip-right {
482
+ margin-left: auto;
483
+ flex-direction: column;
484
+ align-items: flex-end;
485
+ gap: 0;
486
+ }
487
+
488
+ @media (max-width: 800px) {
489
+ .strip-right {
490
+ margin-left: 0;
491
+ align-items: flex-start;
492
+ }
493
+ }
494
+
495
+ .group {
496
+ margin-bottom: 8px;
497
+ border: 1px solid var(--border);
498
+ border-radius: 10px;
499
+ background: var(--surface);
500
+ }
501
+
502
+ .group > summary {
503
+ display: flex;
504
+ align-items: center;
505
+ gap: 8px;
506
+ padding: 10px 16px;
507
+ cursor: pointer;
508
+ font-weight: 600;
509
+ }
510
+
511
+ .checks {
512
+ list-style: none;
513
+ margin: 0;
514
+ padding: 0;
515
+ border-top: 1px solid var(--border);
516
+ }
517
+
518
+ .check {
519
+ padding: 12px 16px;
520
+ border-bottom: 1px solid var(--border);
521
+ }
522
+
523
+ .check:last-child {
524
+ border-bottom: 0;
525
+ }
526
+
527
+ .check-head {
528
+ display: flex;
529
+ flex-wrap: wrap;
530
+ align-items: center;
531
+ gap: 4px 10px;
532
+ }
533
+
534
+ .check-msg {
535
+ margin: 4px 0 0 20px;
536
+ overflow-wrap: anywhere;
537
+ }
538
+
539
+ .check details {
540
+ margin: 4px 0 0 20px;
541
+ }
542
+
543
+ .tiles {
544
+ display: grid;
545
+ grid-template-columns: repeat(auto-fill, minmax(170px, 1fr));
546
+ gap: 12px;
547
+ }
548
+
549
+ .tile {
550
+ padding: 14px 16px;
551
+ background: var(--surface);
552
+ border: 1px solid var(--border);
553
+ border-radius: 10px;
554
+ }
555
+
556
+ .tile-label {
557
+ color: var(--muted);
558
+ font-size: 0.85rem;
559
+ }
560
+
561
+ .tile-value {
562
+ font-size: 1.6rem;
563
+ font-weight: 600;
564
+ line-height: 1.3;
565
+ }
566
+
567
+ .tile-sub {
568
+ font-size: 0.82rem;
569
+ }
570
+
571
+ /* ---- tables ---- */
572
+ .table-wrap {
573
+ overflow-x: auto;
574
+ border: 1px solid var(--border);
575
+ border-radius: 10px;
576
+ background: var(--surface);
577
+ }
578
+
579
+ table {
580
+ width: 100%;
581
+ border-collapse: collapse;
582
+ }
583
+
584
+ th,
585
+ td {
586
+ padding: 9px 14px;
587
+ text-align: left;
588
+ vertical-align: top;
589
+ border-bottom: 1px solid var(--border);
590
+ }
591
+
592
+ th.r,
593
+ td.r {
594
+ text-align: right;
595
+ }
596
+
597
+ tr:last-child > td,
598
+ tr:last-child > th {
599
+ border-bottom: 0;
600
+ }
601
+
602
+ thead th {
603
+ font-size: 0.78rem;
604
+ font-weight: 600;
605
+ text-transform: uppercase;
606
+ letter-spacing: 0.05em;
607
+ color: var(--muted);
608
+ background: var(--surface-2);
609
+ white-space: nowrap;
610
+ }
611
+
612
+ table.fm th {
613
+ width: 1%;
614
+ white-space: nowrap;
615
+ font-weight: 600;
616
+ }
617
+
618
+ .runs td {
619
+ white-space: nowrap;
620
+ }
621
+
622
+ .runs td:nth-child(7),
623
+ .runs td:nth-child(8) {
624
+ white-space: normal;
625
+ min-width: 140px;
626
+ }
627
+
628
+ /* ---- charts ---- */
629
+ .chart-scroll {
630
+ overflow-x: auto;
631
+ padding: 12px 8px 4px;
632
+ background: var(--surface);
633
+ border: 1px solid var(--border);
634
+ border-radius: 10px;
635
+ }
636
+
637
+ .chart {
638
+ display: block;
639
+ width: 100%;
640
+ min-width: 520px;
641
+ height: auto;
642
+ }
643
+
644
+ .chart .grid {
645
+ stroke: var(--grid);
646
+ stroke-width: 1;
647
+ }
648
+
649
+ .chart .axis {
650
+ fill: var(--muted);
651
+ font: 11px var(--font);
652
+ }
653
+
654
+ .chart .axis.total {
655
+ fill: var(--text);
656
+ font-weight: 600;
657
+ }
658
+
659
+ .s1 {
660
+ fill: var(--s1);
661
+ background: var(--s1);
662
+ }
663
+
664
+ .s2 {
665
+ fill: var(--s2);
666
+ background: var(--s2);
667
+ }
668
+
669
+ .s3 {
670
+ fill: var(--s3);
671
+ background: var(--s3);
672
+ }
673
+
674
+ .s4 {
675
+ fill: var(--s4);
676
+ background: var(--s4);
677
+ }
678
+
679
+ .s5 {
680
+ fill: var(--s5);
681
+ background: var(--s5);
682
+ }
683
+
684
+ .s6 {
685
+ fill: var(--s6);
686
+ background: var(--s6);
687
+ }
688
+
689
+ .legend {
690
+ display: flex;
691
+ flex-wrap: wrap;
692
+ gap: 4px 18px;
693
+ list-style: none;
694
+ margin: 8px 0 0;
695
+ padding: 0;
696
+ font-size: 0.88rem;
697
+ }
698
+
699
+ .swatch {
700
+ display: inline-block;
701
+ width: 10px;
702
+ height: 10px;
703
+ margin-right: 6px;
704
+ border-radius: 2px;
705
+ }
706
+
707
+ .minibar {
708
+ display: block;
709
+ }
710
+
711
+ .minibar .track {
712
+ fill: var(--surface-2);
713
+ }
714
+
715
+ .minibar .fill {
716
+ fill: var(--s1);
717
+ }
718
+
719
+ .minibar .fail {
720
+ fill: var(--fail);
721
+ }
722
+
723
+ .propbar {
724
+ display: flex;
725
+ height: 10px;
726
+ margin: 12px 0 0;
727
+ overflow: hidden;
728
+ border-radius: 5px;
729
+ background: var(--surface-2);
730
+ }
731
+
732
+ .propbar span {
733
+ display: block;
734
+ height: 100%;
735
+ min-width: 2px;
736
+ }
737
+
738
+ /* ---- cards and key/value ---- */
739
+ .cards {
740
+ display: grid;
741
+ grid-template-columns: repeat(auto-fill, minmax(min(100%, 420px), 1fr));
742
+ gap: 16px;
743
+ }
744
+
745
+ .card {
746
+ padding: 18px 20px;
747
+ background: var(--surface);
748
+ border: 1px solid var(--border);
749
+ border-radius: 12px;
750
+ min-width: 0;
751
+ }
752
+
753
+ .card-head {
754
+ display: flex;
755
+ flex-wrap: wrap;
756
+ align-items: center;
757
+ gap: 6px;
758
+ margin-bottom: 12px;
759
+ }
760
+
761
+ .card-head h3 {
762
+ margin-right: 6px;
763
+ font-size: 1.1rem;
764
+ }
765
+
766
+ .kv {
767
+ display: grid;
768
+ grid-template-columns: max-content minmax(0, 1fr);
769
+ gap: 6px 18px;
770
+ margin: 0;
771
+ }
772
+
773
+ .kv dt {
774
+ color: var(--muted);
775
+ }
776
+
777
+ .kv dd {
778
+ margin: 0;
779
+ min-width: 0;
780
+ overflow-wrap: anywhere;
781
+ }
782
+
783
+ @media (max-width: 500px) {
784
+ .kv {
785
+ grid-template-columns: minmax(0, 1fr);
786
+ gap: 0;
787
+ }
788
+
789
+ .kv dd {
790
+ margin-bottom: 8px;
791
+ }
792
+ }
793
+
794
+ ul.plain {
795
+ list-style: none;
796
+ margin: 0;
797
+ padding: 0;
798
+ }
799
+
800
+ .plain > li {
801
+ margin: 2px 0;
802
+ }
803
+
804
+ /* ---- config tree ---- */
805
+ .tree {
806
+ list-style: none;
807
+ margin: 0;
808
+ padding: 0 0 0 20px;
809
+ border-left: 1px solid var(--border);
810
+ }
811
+
812
+ .tree.root {
813
+ padding: 12px 16px;
814
+ border: 1px solid var(--border);
815
+ border-radius: 10px;
816
+ background: var(--surface);
817
+ }
818
+
819
+ .tree li {
820
+ margin: 3px 0;
821
+ }
822
+
823
+ .tree summary {
824
+ padding: 2px 0;
825
+ }
826
+
827
+ .leaf {
828
+ display: flex;
829
+ flex-wrap: wrap;
830
+ align-items: baseline;
831
+ gap: 2px 12px;
832
+ }
833
+
834
+ .leaf-value {
835
+ min-width: 0;
836
+ overflow-wrap: anywhere;
837
+ }
838
+
839
+ .key {
840
+ font-weight: 600;
841
+ }
842
+
843
+ .v-str {
844
+ color: var(--s3);
845
+ font-family: var(--mono);
846
+ font-size: 0.92em;
847
+ }
848
+
849
+ .v-lit {
850
+ color: var(--s2);
851
+ font-family: var(--mono);
852
+ font-size: 0.92em;
853
+ }
854
+
855
+ .redacted {
856
+ color: var(--muted);
857
+ font-style: italic;
858
+ font-family: var(--mono);
859
+ font-size: 0.92em;
860
+ }
861
+
862
+ .legend-line {
863
+ color: var(--muted);
864
+ font-size: 0.9rem;
865
+ }
866
+
867
+ details.inline {
868
+ display: inline-block;
869
+ }
870
+
871
+ /* ---- proposals, diff ---- */
872
+ .tabs {
873
+ display: flex;
874
+ gap: 4px;
875
+ margin: 20px 0 16px;
876
+ border-bottom: 1px solid var(--border);
877
+ }
878
+
879
+ .tab {
880
+ padding: 8px 16px;
881
+ margin-bottom: -1px;
882
+ color: var(--muted);
883
+ text-decoration: none;
884
+ font-weight: 500;
885
+ border-bottom: 2px solid transparent;
886
+ }
887
+
888
+ .tab.active {
889
+ color: var(--accent);
890
+ border-bottom-color: var(--accent);
891
+ }
892
+
893
+ .chips {
894
+ display: flex;
895
+ flex-wrap: wrap;
896
+ gap: 8px;
897
+ margin-bottom: 8px;
898
+ }
899
+
900
+ .chip {
901
+ padding: 3px 12px;
902
+ border: 1px solid var(--border);
903
+ border-radius: 999px;
904
+ color: var(--text);
905
+ text-decoration: none;
906
+ font-size: 0.9rem;
907
+ background: var(--surface);
908
+ }
909
+
910
+ .chip.active {
911
+ border-color: var(--accent);
912
+ background: var(--accent-bg);
913
+ color: var(--accent);
914
+ }
915
+
916
+ pre {
917
+ margin: 0;
918
+ overflow-x: auto;
919
+ }
920
+
921
+ pre.code {
922
+ padding: 12px 14px;
923
+ background: var(--surface-2);
924
+ border: 1px solid var(--border);
925
+ border-radius: 8px;
926
+ font-size: 0.85rem;
927
+ }
928
+
929
+ pre.diff {
930
+ padding: 8px 0;
931
+ background: var(--surface);
932
+ border: 1px solid var(--border);
933
+ border-radius: 10px;
934
+ font-size: 0.85rem;
935
+ line-height: 1.5;
936
+ }
937
+
938
+ .dl {
939
+ display: block;
940
+ padding: 0 14px;
941
+ white-space: pre;
942
+ min-width: max-content;
943
+ }
944
+
945
+ .dl.add {
946
+ background: var(--add-bg);
947
+ color: var(--ok);
948
+ }
949
+
950
+ .dl.del {
951
+ background: var(--del-bg);
952
+ color: var(--fail);
953
+ }
954
+
955
+ .dl.hunk {
956
+ background: var(--hunk-bg);
957
+ color: var(--accent);
958
+ }
959
+
960
+ .dl.meta {
961
+ color: var(--muted);
962
+ font-weight: 600;
963
+ }
964
+
965
+ /* ---- changes ---- */
966
+ .day {
967
+ padding-bottom: 6px;
968
+ border-bottom: 1px solid var(--border);
969
+ }
970
+
971
+ .commits {
972
+ list-style: none;
973
+ margin: 0;
974
+ padding: 0 0 0 16px;
975
+ border-left: 2px solid var(--border);
976
+ }
977
+
978
+ .commit {
979
+ position: relative;
980
+ padding: 8px 0 8px 12px;
981
+ }
982
+
983
+ .commit::before {
984
+ content: "";
985
+ position: absolute;
986
+ left: -22px;
987
+ top: 17px;
988
+ width: 10px;
989
+ height: 10px;
990
+ border-radius: 50%;
991
+ background: var(--accent);
992
+ border: 2px solid var(--bg);
993
+ }
994
+
995
+ .commit-head {
996
+ display: flex;
997
+ flex-wrap: wrap;
998
+ align-items: center;
999
+ gap: 4px 10px;
1000
+ }
1001
+
1002
+ .commit-subject {
1003
+ font-weight: 500;
1004
+ overflow-wrap: anywhere;
1005
+ }
1006
+
1007
+ .commit details {
1008
+ margin-top: 4px;
1009
+ }
1010
+
1011
+ /* ---- search, asset ---- */
1012
+ .search-form {
1013
+ display: flex;
1014
+ flex-wrap: wrap;
1015
+ gap: 8px;
1016
+ margin: 20px 0 16px;
1017
+ }
1018
+
1019
+ input[type="search"],
1020
+ select,
1021
+ button {
1022
+ font: inherit;
1023
+ color: var(--text);
1024
+ background: var(--surface);
1025
+ border: 1px solid var(--border);
1026
+ border-radius: 8px;
1027
+ padding: 8px 12px;
1028
+ }
1029
+
1030
+ input[type="search"] {
1031
+ flex: 1 1 260px;
1032
+ min-width: 0;
1033
+ }
1034
+
1035
+ button {
1036
+ background: var(--accent);
1037
+ border-color: var(--accent);
1038
+ color: var(--bg);
1039
+ font-weight: 600;
1040
+ cursor: pointer;
1041
+ }
1042
+
1043
+ /* Aligned diff: side by side (two scrolling panes) or inline (one). Rows are one line high so the panes stay in step. */
1044
+ .diff-bar {
1045
+ display: flex;
1046
+ flex-wrap: wrap;
1047
+ align-items: center;
1048
+ gap: 12px;
1049
+ margin: 0 0 10px;
1050
+ }
1051
+
1052
+ .seg {
1053
+ display: inline-flex;
1054
+ border: 1px solid var(--border);
1055
+ border-radius: 8px;
1056
+ overflow: hidden;
1057
+ background: var(--surface);
1058
+ }
1059
+
1060
+ .seg button {
1061
+ padding: 5px 14px;
1062
+ border: 0;
1063
+ border-radius: 0;
1064
+ background: transparent;
1065
+ color: var(--text);
1066
+ font-size: 0.9rem;
1067
+ font-weight: 500;
1068
+ }
1069
+
1070
+ .seg button + button {
1071
+ border-left: 1px solid var(--border);
1072
+ }
1073
+
1074
+ .seg button[aria-pressed="true"] {
1075
+ background: var(--accent-bg);
1076
+ color: var(--accent);
1077
+ }
1078
+
1079
+ .sbs {
1080
+ display: grid;
1081
+ grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
1082
+ gap: 10px;
1083
+ }
1084
+
1085
+ .sbs-head {
1086
+ padding: 4px 14px;
1087
+ font-size: 0.8rem;
1088
+ font-weight: 600;
1089
+ color: var(--muted);
1090
+ }
1091
+
1092
+ .dcol {
1093
+ overflow-x: auto;
1094
+ background: var(--surface);
1095
+ border: 1px solid var(--border);
1096
+ border-radius: 10px;
1097
+ font: 0.85rem / 1.5 var(--mono);
1098
+ }
1099
+
1100
+ .dcol-body {
1101
+ min-width: max-content;
1102
+ padding: 4px 0;
1103
+ }
1104
+
1105
+ .drow {
1106
+ display: flex;
1107
+ min-height: 1.5em;
1108
+ white-space: pre;
1109
+ tab-size: 4;
1110
+ }
1111
+
1112
+ .drow .ln {
1113
+ flex: none;
1114
+ width: calc(5ch + 12px);
1115
+ padding: 0 8px 0 4px;
1116
+ text-align: right;
1117
+ color: var(--muted);
1118
+ font-variant-numeric: tabular-nums;
1119
+ user-select: none;
1120
+ }
1121
+
1122
+ .drow .sign {
1123
+ flex: none;
1124
+ width: 2ch;
1125
+ color: var(--muted);
1126
+ user-select: none;
1127
+ }
1128
+
1129
+ .drow .code {
1130
+ flex: 1;
1131
+ padding-right: 14px;
1132
+ }
1133
+
1134
+ .drow.add {
1135
+ background: var(--add-bg);
1136
+ }
1137
+
1138
+ .drow.del {
1139
+ background: var(--del-bg);
1140
+ }
1141
+
1142
+ .drow.fill {
1143
+ background: var(--surface-2);
1144
+ }
1145
+
1146
+ .drow.add .sign {
1147
+ color: var(--ok);
1148
+ }
1149
+
1150
+ .drow.del .sign {
1151
+ color: var(--fail);
1152
+ }
1153
+
1154
+ .drow .w {
1155
+ border-radius: 3px;
1156
+ }
1157
+
1158
+ .drow.add .w {
1159
+ background: var(--add-strong);
1160
+ }
1161
+
1162
+ .drow.del .w {
1163
+ background: var(--del-strong);
1164
+ }
1165
+
1166
+ .drow.gap {
1167
+ background: var(--hunk-bg);
1168
+ padding: 0 14px;
1169
+ align-items: center;
1170
+ }
1171
+
1172
+ .gap-label {
1173
+ color: var(--muted);
1174
+ }
1175
+
1176
+ .gap-btn {
1177
+ padding: 0;
1178
+ border: 0;
1179
+ background: transparent;
1180
+ color: var(--accent);
1181
+ font: inherit;
1182
+ text-decoration: underline;
1183
+ }
1184
+
1185
+ .dcol.inline {
1186
+ margin-top: 0;
1187
+ }
1188
+
1189
+ @media (max-width: 799px) {
1190
+ .sbs {
1191
+ grid-template-columns: minmax(0, 1fr);
1192
+ }
1193
+ }
1194
+
1195
+ :focus-visible {
1196
+ outline: 2px solid var(--accent);
1197
+ outline-offset: 2px;
1198
+ }
1199
+
1200
+ .hits {
1201
+ list-style: none;
1202
+ margin: 0;
1203
+ padding: 0;
1204
+ }
1205
+
1206
+ .hit {
1207
+ padding: 14px 0;
1208
+ border-bottom: 1px solid var(--border);
1209
+ }
1210
+
1211
+ .hit p {
1212
+ margin: 4px 0 0;
1213
+ }
1214
+
1215
+ .hit-head {
1216
+ display: flex;
1217
+ flex-wrap: wrap;
1218
+ align-items: center;
1219
+ gap: 4px 12px;
1220
+ }
1221
+
1222
+ .tags {
1223
+ display: flex;
1224
+ flex-wrap: wrap;
1225
+ gap: 6px;
1226
+ margin-top: 6px;
1227
+ }
1228
+
1229
+ .tag {
1230
+ padding: 0 8px;
1231
+ border-radius: 4px;
1232
+ background: var(--surface-2);
1233
+ color: var(--muted);
1234
+ font-size: 0.8rem;
1235
+ }
1236
+
1237
+ .md {
1238
+ padding: 20px 24px;
1239
+ background: var(--surface);
1240
+ border: 1px solid var(--border);
1241
+ border-radius: 10px;
1242
+ overflow-wrap: anywhere;
1243
+ }
1244
+
1245
+ .md > :first-child {
1246
+ margin-top: 0;
1247
+ }
1248
+
1249
+ .md > :last-child {
1250
+ margin-bottom: 0;
1251
+ }
1252
+
1253
+ .md h1,
1254
+ .md h2,
1255
+ .md h3,
1256
+ .md h4,
1257
+ .md h5,
1258
+ .md h6 {
1259
+ margin: 1.4em 0 0.5em;
1260
+ line-height: 1.3;
1261
+ }
1262
+
1263
+ .md h2 {
1264
+ font-size: 1.35rem;
1265
+ }
1266
+
1267
+ .md h3 {
1268
+ font-size: 1.15rem;
1269
+ }
1270
+
1271
+ .md code {
1272
+ padding: 1px 5px;
1273
+ border-radius: 4px;
1274
+ background: var(--surface-2);
1275
+ }
1276
+
1277
+ .md pre.code code {
1278
+ padding: 0;
1279
+ background: none;
1280
+ }
1281
+
1282
+ /* ---- proposal actions ---- */
1283
+ .sr-only {
1284
+ position: absolute;
1285
+ width: 1px;
1286
+ height: 1px;
1287
+ overflow: hidden;
1288
+ clip: rect(0 0 0 0);
1289
+ white-space: nowrap;
1290
+ }
1291
+
1292
+ a.btn {
1293
+ display: inline-block;
1294
+ padding: 8px 12px;
1295
+ border: 1px solid var(--accent);
1296
+ border-radius: 8px;
1297
+ background: var(--accent);
1298
+ color: var(--bg);
1299
+ font-weight: 600;
1300
+ text-decoration: none;
1301
+ }
1302
+
1303
+ button.btn-secondary,
1304
+ a.btn.btn-secondary {
1305
+ background: var(--surface);
1306
+ border-color: var(--border);
1307
+ color: var(--text);
1308
+ }
1309
+
1310
+ button.btn-danger {
1311
+ background: var(--fail);
1312
+ border-color: var(--fail);
1313
+ color: var(--bg);
1314
+ }
1315
+
1316
+ button:disabled {
1317
+ opacity: 0.55;
1318
+ cursor: not-allowed;
1319
+ }
1320
+
1321
+ .actions {
1322
+ margin: 16px 0;
1323
+ padding: 14px 16px;
1324
+ border: 1px solid var(--border);
1325
+ border-radius: 10px;
1326
+ background: var(--surface);
1327
+ }
1328
+
1329
+ .btn-row {
1330
+ display: flex;
1331
+ flex-wrap: wrap;
1332
+ align-items: center;
1333
+ gap: 8px;
1334
+ margin: 8px 0 0;
1335
+ }
1336
+
1337
+ .actions textarea {
1338
+ display: block;
1339
+ width: 100%;
1340
+ margin-top: 8px;
1341
+ font: inherit;
1342
+ color: var(--text);
1343
+ background: var(--bg);
1344
+ border: 1px solid var(--border);
1345
+ border-radius: 8px;
1346
+ padding: 8px 12px;
1347
+ resize: vertical;
1348
+ }
1349
+
1350
+ .field-error {
1351
+ margin: 6px 0 0;
1352
+ color: var(--fail);
1353
+ }
1354
+
1355
+ .notice {
1356
+ padding: 12px 14px;
1357
+ border: 1px solid var(--border);
1358
+ border-radius: 8px;
1359
+ }
1360
+
1361
+ .notice p {
1362
+ margin: 0 0 4px;
1363
+ }
1364
+
1365
+ .notice-ok {
1366
+ border-color: var(--ok);
1367
+ background: var(--ok-bg);
1368
+ }
1369
+
1370
+ .notice-fail {
1371
+ border-color: var(--fail);
1372
+ background: var(--fail-bg);
1373
+ }
1374
+
1375
+ .select {
1376
+ width: 1%;
1377
+ white-space: nowrap;
1378
+ }
1379
+
1380
+ .select-group {
1381
+ display: inline-flex;
1382
+ align-items: center;
1383
+ gap: 6px;
1384
+ margin: 0 0 8px;
1385
+ font-size: 0.9rem;
1386
+ color: var(--muted);
1387
+ }
1388
+
1389
+ .batch-bar {
1390
+ position: sticky;
1391
+ bottom: 0;
1392
+ z-index: 5;
1393
+ display: flex;
1394
+ flex-wrap: wrap;
1395
+ align-items: center;
1396
+ gap: 8px 16px;
1397
+ margin-top: 16px;
1398
+ padding: 12px 16px;
1399
+ border: 1px solid var(--border);
1400
+ border-radius: 10px;
1401
+ background: var(--surface);
1402
+ box-shadow: 0 -2px 12px rgba(0, 0, 0, 0.12);
1403
+ }
1404
+
1405
+ .batch-bar[hidden] {
1406
+ display: none;
1407
+ }
1408
+
1409
+ .batch-results {
1410
+ flex: 1 1 100%;
1411
+ }
1412
+
1413
+ .batch-results ul {
1414
+ margin: 8px 0 0;
1415
+ }