gator-command 1.0.0__py3-none-any.whl

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 (110) hide show
  1. gator_command/__init__.py +2 -0
  2. gator_command/cli.py +137 -0
  3. gator_command/scripts/crawler.py +633 -0
  4. gator_command/scripts/dashboard/dashboard.css +982 -0
  5. gator_command/scripts/dashboard/dashboard.html +84 -0
  6. gator_command/scripts/dashboard/dashboard.js +419 -0
  7. gator_command/scripts/dashboard/views/audit.js +270 -0
  8. gator_command/scripts/dashboard/views/fleet.js +307 -0
  9. gator_command/scripts/dashboard/views/repo.js +599 -0
  10. gator_command/scripts/dashboard/views/settings.js +173 -0
  11. gator_command/scripts/dashboard/views/updates.js +308 -0
  12. gator_command/scripts/enforcer-prompt.md +22 -0
  13. gator_command/scripts/extract-claude-sessions.py +489 -0
  14. gator_command/scripts/extract-codex-sessions.py +477 -0
  15. gator_command/scripts/extract-gemini-sessions.py +410 -0
  16. gator_command/scripts/gator-audit.py +956 -0
  17. gator_command/scripts/gator-charter-draft.py +919 -0
  18. gator_command/scripts/gator-charter-lint.py +427 -0
  19. gator_command/scripts/gator-charter-verify.py +606 -0
  20. gator_command/scripts/gator-dashboard.py +1271 -0
  21. gator_command/scripts/gator-deploy.py +916 -0
  22. gator_command/scripts/gator-drift.py +569 -0
  23. gator_command/scripts/gator-enforce.py +82 -0
  24. gator_command/scripts/gator-fleet-intel.py +460 -0
  25. gator_command/scripts/gator-fleet-report.py +615 -0
  26. gator_command/scripts/gator-init-command-post.py +315 -0
  27. gator_command/scripts/gator-init.py +434 -0
  28. gator_command/scripts/gator-machine-id.py +153 -0
  29. gator_command/scripts/gator-policy-status.py +631 -0
  30. gator_command/scripts/gator-pulse.py +459 -0
  31. gator_command/scripts/gator-repo-status.py +649 -0
  32. gator_command/scripts/gator-session-common.py +372 -0
  33. gator_command/scripts/gator-session-sink.py +831 -0
  34. gator_command/scripts/gator-sessions.py +1244 -0
  35. gator_command/scripts/gator-update.py +615 -0
  36. gator_command/scripts/gator-version.py +38 -0
  37. gator_command/scripts/gator_core.py +489 -0
  38. gator_command/scripts/gator_remote.py +381 -0
  39. gator_command/scripts/gator_runtime.py +142 -0
  40. gator_command/scripts/gatorize-actions.sh +989 -0
  41. gator_command/scripts/gatorize-lib.sh +166 -0
  42. gator_command/scripts/gatorize-post.sh +394 -0
  43. gator_command/scripts/gatorize.py +1163 -0
  44. gator_command/scripts/gatorize.sh +185 -0
  45. gator_command/scripts/generate_markdown.py +212 -0
  46. gator_command/scripts/generate_wiki.py +424 -0
  47. gator_command/scripts/graph_health.py +780 -0
  48. gator_command/scripts/memex-lint.py +286 -0
  49. gator_command/scripts/memex-lint.sh +205 -0
  50. gator_command/scripts/memex.py +1472 -0
  51. gator_command/scripts/memex_formatters.py +191 -0
  52. gator_command/scripts/memex_state.py +236 -0
  53. gator_command/scripts/spawn.py +650 -0
  54. gator_command/templates/gator-starter/blueprints/README.md +32 -0
  55. gator_command/templates/gator-starter/charterignore +53 -0
  56. gator_command/templates/gator-starter/charters/README.md +178 -0
  57. gator_command/templates/gator-starter/charters/_template.md +31 -0
  58. gator_command/templates/gator-starter/commands/commit.md +33 -0
  59. gator_command/templates/gator-starter/commands/init.md +11 -0
  60. gator_command/templates/gator-starter/commands/update.md +5 -0
  61. gator_command/templates/gator-starter/constitution.md +165 -0
  62. gator_command/templates/gator-starter/field-guides/README.md +25 -0
  63. gator_command/templates/gator-starter/gator-start-up.md +119 -0
  64. gator_command/templates/gator-starter/procedures/charter-alignment.md +83 -0
  65. gator_command/templates/gator-starter/procedures/enforcer-review.md +317 -0
  66. gator_command/templates/gator-starter/procedures/field-guide-generation.md +176 -0
  67. gator_command/templates/gator-starter/procedures/knowledge-capture.md +57 -0
  68. gator_command/templates/gator-starter/procedures/significance-check.md +69 -0
  69. gator_command/templates/gator-starter/reference-notes/concierge-responses.md +535 -0
  70. gator_command/templates/gator-starter/reference-notes/dangerous-patterns.md +91 -0
  71. gator_command/templates/gator-starter/reference-notes/dashboard-operations.md +22 -0
  72. gator_command/templates/gator-starter/reference-notes/enforcer-configuration.md +232 -0
  73. gator_command/templates/gator-starter/reference-notes/example-project.md +289 -0
  74. gator_command/templates/gator-starter/reference-notes/failure-modes-and-self-correction.md +72 -0
  75. gator_command/templates/gator-starter/reference-notes/git-workflow.md +60 -0
  76. gator_command/templates/gator-starter/reference-notes/identity-and-ownership.md +37 -0
  77. gator_command/templates/gator-starter/reference-notes/refactor-approach.md +155 -0
  78. gator_command/templates/gator-starter/reference-notes/what-gator-requires-from-a-model.md +108 -0
  79. gator_command/templates/gator-starter/reference-notes/why-navigation-coding-feels-different.md +99 -0
  80. gator_command/templates/gator-starter/reference-notes/workflow-profiles.md +155 -0
  81. gator_command/templates/gator-starter/scripts/__pycache__/enforcer-review.cpython-313.pyc +0 -0
  82. gator_command/templates/gator-starter/scripts/__pycache__/gator-approve.cpython-313.pyc +0 -0
  83. gator_command/templates/gator-starter/scripts/__pycache__/gator-init.cpython-313.pyc +0 -0
  84. gator_command/templates/gator-starter/scripts/__pycache__/gator-pre-commit.cpython-313.pyc +0 -0
  85. gator_command/templates/gator-starter/scripts/__pycache__/gator-update.cpython-313.pyc +0 -0
  86. gator_command/templates/gator-starter/scripts/enforcer-prompt.md +55 -0
  87. gator_command/templates/gator-starter/scripts/enforcer-review.py +1551 -0
  88. gator_command/templates/gator-starter/scripts/gator-approve.py +139 -0
  89. gator_command/templates/gator-starter/scripts/gator-enforce.py +82 -0
  90. gator_command/templates/gator-starter/scripts/gator-init.py +434 -0
  91. gator_command/templates/gator-starter/scripts/gator-pre-commit.py +2670 -0
  92. gator_command/templates/gator-starter/scripts/gator-pulse.py +459 -0
  93. gator_command/templates/gator-starter/scripts/gator-update.py +615 -0
  94. gator_command/templates/gator-starter/scripts/gator-version.py +38 -0
  95. gator_command/templates/gator-starter/scripts/gator_core.py +487 -0
  96. gator_command/templates/gator-starter/scripts/hooks/__pycache__/commit-msgcpython-313.pyc +0 -0
  97. gator_command/templates/gator-starter/scripts/hooks/__pycache__/post-commitcpython-313.pyc +0 -0
  98. gator_command/templates/gator-starter/scripts/hooks/__pycache__/pre-commitcpython-313.pyc +0 -0
  99. gator_command/templates/gator-starter/scripts/hooks/commit-msg +5 -0
  100. gator_command/templates/gator-starter/scripts/hooks/post-commit +7 -0
  101. gator_command/templates/gator-starter/scripts/hooks/pre-commit +5 -0
  102. gator_command/templates/gator-starter/sessions/.gitignore +7 -0
  103. gator_command/templates/gator-starter/vault/.gitkeep +0 -0
  104. gator_command/templates/gator-starter/whiteboard.md +5 -0
  105. gator_command-1.0.0.dist-info/METADATA +122 -0
  106. gator_command-1.0.0.dist-info/RECORD +110 -0
  107. gator_command-1.0.0.dist-info/WHEEL +5 -0
  108. gator_command-1.0.0.dist-info/entry_points.txt +2 -0
  109. gator_command-1.0.0.dist-info/licenses/LICENSE +21 -0
  110. gator_command-1.0.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,982 @@
1
+ /* Gator Dashboard — platform shell, no framework, system font stack */
2
+
3
+ *, *::before, *::after {
4
+ box-sizing: border-box;
5
+ margin: 0;
6
+ padding: 0;
7
+ }
8
+
9
+ :root {
10
+ /* status colors */
11
+ --color-healthy: #2d7a2d;
12
+ --color-drifted: #b8860b;
13
+ --color-critical: #a02020;
14
+ --color-ungoverned: #666;
15
+
16
+ /* surfaces */
17
+ --color-bg: #f4f5f7;
18
+ --color-surface: #ffffff;
19
+ --color-border: #e1e4e8;
20
+ --color-text: #1a1a1a;
21
+ --color-muted: #6b7280;
22
+ --color-link: #1a5fa8;
23
+
24
+ /* sidebar */
25
+ --sidebar-width: 220px;
26
+ --sidebar-bg: #1e1e2e;
27
+ --sidebar-text: #a0a4b8;
28
+ --sidebar-active: #ffffff;
29
+ --sidebar-hover-bg: rgba(255,255,255,0.06);
30
+ --sidebar-active-bg: rgba(255,255,255,0.10);
31
+
32
+ /* topbar */
33
+ --topbar-height: 56px;
34
+
35
+ /* typography */
36
+ --font: system-ui, -apple-system, "Segoe UI", sans-serif;
37
+ --mono: "Consolas", "Menlo", "Liberation Mono", monospace;
38
+ }
39
+
40
+ html, body {
41
+ height: 100%;
42
+ font-family: var(--font);
43
+ font-size: 14px;
44
+ color: var(--color-text);
45
+ background: var(--color-bg);
46
+ line-height: 1.5;
47
+ }
48
+
49
+ /* ── app shell ─────────────────────────────────────────────────────────── */
50
+
51
+ #app-shell {
52
+ display: flex;
53
+ height: 100vh;
54
+ overflow: hidden;
55
+ }
56
+
57
+ /* ── sidebar ───────────────────────────────────────────────────────────── */
58
+
59
+ #sidebar {
60
+ width: var(--sidebar-width);
61
+ min-width: var(--sidebar-width);
62
+ background: var(--sidebar-bg);
63
+ color: var(--sidebar-text);
64
+ display: flex;
65
+ flex-direction: column;
66
+ overflow-y: auto;
67
+ transition: width 0.15s, min-width 0.15s;
68
+ }
69
+
70
+ #sidebar.collapsed {
71
+ width: 0;
72
+ min-width: 0;
73
+ overflow: hidden;
74
+ }
75
+
76
+ #sidebar-toggle {
77
+ position: fixed;
78
+ top: 8px;
79
+ left: 8px;
80
+ z-index: 100;
81
+ width: 28px;
82
+ height: 28px;
83
+ border: 1px solid #ddd;
84
+ border-radius: 4px;
85
+ background: #fff;
86
+ cursor: pointer;
87
+ font-size: 14px;
88
+ line-height: 26px;
89
+ text-align: center;
90
+ color: #555;
91
+ }
92
+
93
+ #sidebar-toggle:hover {
94
+ background: #f0f0f0;
95
+ }
96
+
97
+ #sidebar:not(.collapsed) ~ #main-shell #sidebar-toggle {
98
+ left: calc(var(--sidebar-width) + 8px);
99
+ }
100
+
101
+ #sidebar-brand {
102
+ display: flex;
103
+ align-items: center;
104
+ gap: 10px;
105
+ padding: 20px 20px 24px;
106
+ }
107
+
108
+ #brand-icon {
109
+ font-size: 20px;
110
+ line-height: 1;
111
+ }
112
+
113
+ #brand-name {
114
+ font-size: 18px;
115
+ font-weight: 700;
116
+ color: #fff;
117
+ letter-spacing: 0.04em;
118
+ }
119
+
120
+ #sidebar-nav {
121
+ flex: 1;
122
+ padding: 0 12px;
123
+ }
124
+
125
+ .nav-group-label {
126
+ font-size: 10px;
127
+ font-weight: 600;
128
+ text-transform: uppercase;
129
+ letter-spacing: 0.08em;
130
+ color: #5a5e72;
131
+ padding: 16px 8px 6px;
132
+ }
133
+
134
+ .sidebar-item {
135
+ display: flex;
136
+ align-items: center;
137
+ gap: 8px;
138
+ width: 100%;
139
+ padding: 8px 12px;
140
+ border: none;
141
+ background: transparent;
142
+ color: var(--sidebar-text);
143
+ font-size: 13px;
144
+ font-family: var(--font);
145
+ cursor: pointer;
146
+ border-radius: 6px;
147
+ transition: background 0.12s, color 0.12s;
148
+ text-align: left;
149
+ }
150
+
151
+ .sidebar-item:hover:not(.dimmed):not(.placeholder):not(.active) {
152
+ background: var(--sidebar-hover-bg);
153
+ color: #d0d4e0;
154
+ }
155
+
156
+ .sidebar-item.active {
157
+ background: var(--sidebar-active-bg);
158
+ color: var(--sidebar-active);
159
+ font-weight: 600;
160
+ }
161
+
162
+ .sidebar-item.dimmed {
163
+ color: #4a4e60;
164
+ cursor: default;
165
+ }
166
+
167
+ .sidebar-item.placeholder {
168
+ color: #4a4e60;
169
+ cursor: default;
170
+ }
171
+
172
+ .sidebar-icon {
173
+ font-size: 14px;
174
+ width: 18px;
175
+ text-align: center;
176
+ flex-shrink: 0;
177
+ }
178
+
179
+ .coming-soon {
180
+ margin-left: auto;
181
+ font-size: 9px;
182
+ text-transform: uppercase;
183
+ letter-spacing: 0.05em;
184
+ color: #4a4e60;
185
+ background: rgba(255,255,255,0.05);
186
+ padding: 1px 5px;
187
+ border-radius: 3px;
188
+ }
189
+
190
+ #sidebar-footer {
191
+ padding: 16px 20px 20px;
192
+ border-top: 1px solid rgba(255,255,255,0.06);
193
+ margin-top: auto;
194
+ }
195
+
196
+ #sidebar-footer-text {
197
+ font-size: 11px;
198
+ color: #4a4e60;
199
+ line-height: 1.5;
200
+ }
201
+
202
+ /* ── main shell ────────────────────────────────────────────────────────── */
203
+
204
+ #main-shell {
205
+ flex: 1;
206
+ display: flex;
207
+ flex-direction: column;
208
+ overflow: hidden;
209
+ }
210
+
211
+ /* ── topbar ────────────────────────────────────────────────────────────── */
212
+
213
+ #topbar {
214
+ display: flex;
215
+ align-items: center;
216
+ justify-content: space-between;
217
+ height: var(--topbar-height);
218
+ padding: 0 28px;
219
+ background: var(--color-surface);
220
+ border-bottom: 1px solid var(--color-border);
221
+ flex-shrink: 0;
222
+ }
223
+
224
+ #topbar-left {
225
+ display: flex;
226
+ align-items: baseline;
227
+ gap: 12px;
228
+ padding-left: 36px;
229
+ }
230
+
231
+ #topbar-title {
232
+ font-size: 20px;
233
+ font-weight: 700;
234
+ color: var(--color-text);
235
+ }
236
+
237
+ #topbar-subtitle {
238
+ font-size: 13px;
239
+ color: var(--color-muted);
240
+ }
241
+
242
+ #topbar-right {
243
+ display: flex;
244
+ align-items: center;
245
+ gap: 14px;
246
+ }
247
+
248
+ #generated-at {
249
+ font-size: 11px;
250
+ color: var(--color-muted);
251
+ font-family: var(--mono);
252
+ white-space: nowrap;
253
+ }
254
+
255
+ #refresh-btn {
256
+ background: var(--color-surface);
257
+ border: 1px solid var(--color-border);
258
+ color: var(--color-text);
259
+ padding: 6px 14px;
260
+ font-size: 12px;
261
+ font-family: var(--font);
262
+ cursor: pointer;
263
+ border-radius: 6px;
264
+ transition: background 0.12s, border-color 0.12s;
265
+ }
266
+
267
+ #refresh-btn:hover {
268
+ background: var(--color-bg);
269
+ border-color: #c0c4c8;
270
+ }
271
+
272
+ #refresh-btn.spinning {
273
+ opacity: 0.5;
274
+ cursor: wait;
275
+ }
276
+
277
+ /* ── view slot ─────────────────────────────────────────────────────────── */
278
+
279
+ #view-slot {
280
+ flex: 1;
281
+ overflow-y: auto;
282
+ padding: 24px 28px;
283
+ }
284
+
285
+ #loading {
286
+ padding: 60px;
287
+ color: var(--color-muted);
288
+ text-align: center;
289
+ }
290
+
291
+ /* ── view headers ──────────────────────────────────────────────────────── */
292
+
293
+ .view-header {
294
+ display: flex;
295
+ align-items: baseline;
296
+ gap: 12px;
297
+ margin-bottom: 20px;
298
+ padding-bottom: 12px;
299
+ border-bottom: 1px solid var(--color-border);
300
+ }
301
+
302
+ .view-title {
303
+ font-size: 18px;
304
+ font-weight: 700;
305
+ }
306
+
307
+ .view-subtitle {
308
+ font-size: 13px;
309
+ color: var(--color-muted);
310
+ }
311
+
312
+ .section {
313
+ margin-bottom: 28px;
314
+ }
315
+
316
+ .section-title {
317
+ font-size: 11px;
318
+ font-weight: 600;
319
+ text-transform: uppercase;
320
+ letter-spacing: 0.06em;
321
+ color: var(--color-muted);
322
+ margin-bottom: 10px;
323
+ }
324
+
325
+ /* ── tables ────────────────────────────────────────────────────────────── */
326
+
327
+ .data-table {
328
+ width: 100%;
329
+ border-collapse: collapse;
330
+ font-size: 13px;
331
+ background: var(--color-surface);
332
+ border: 1px solid var(--color-border);
333
+ border-radius: 8px;
334
+ overflow: hidden;
335
+ }
336
+
337
+ .data-table th {
338
+ text-align: left;
339
+ padding: 10px 14px;
340
+ background: #f8f9fb;
341
+ font-weight: 600;
342
+ font-size: 11px;
343
+ color: var(--color-muted);
344
+ text-transform: uppercase;
345
+ letter-spacing: 0.04em;
346
+ border-bottom: 1px solid var(--color-border);
347
+ }
348
+
349
+ .data-table td {
350
+ padding: 10px 14px;
351
+ border-bottom: 1px solid #f0f1f3;
352
+ vertical-align: middle;
353
+ }
354
+
355
+ .data-table tr:last-child td {
356
+ border-bottom: none;
357
+ }
358
+
359
+ .data-table tr:hover td {
360
+ background: #f8f9fb;
361
+ }
362
+
363
+ /* ── health badges ─────────────────────────────────────────────────────── */
364
+
365
+ .badge {
366
+ display: inline-block;
367
+ padding: 2px 10px;
368
+ border-radius: 10px;
369
+ font-size: 11px;
370
+ font-weight: 600;
371
+ white-space: nowrap;
372
+ }
373
+
374
+ .badge-healthy { background: #e8f5e8; color: var(--color-healthy); }
375
+ .badge-drifted { background: #fdf5e0; color: var(--color-drifted); }
376
+ .badge-critical { background: #fde8e8; color: var(--color-critical); }
377
+ .badge-ungoverned { background: #f0f0f0; color: var(--color-ungoverned); }
378
+ .badge-present { background: #e8f5e8; color: var(--color-healthy); }
379
+ .badge-missing { background: #fde8e8; color: var(--color-critical); }
380
+
381
+ /* ── summary cards ─────────────────────────────────────────────────────── */
382
+
383
+ .card-row {
384
+ display: flex;
385
+ gap: 14px;
386
+ margin-bottom: 24px;
387
+ flex-wrap: wrap;
388
+ }
389
+
390
+ .card {
391
+ flex: 1;
392
+ min-width: 150px;
393
+ background: var(--color-surface);
394
+ border: 1px solid var(--color-border);
395
+ border-radius: 8px;
396
+ padding: 16px 18px;
397
+ }
398
+
399
+ .card-label {
400
+ font-size: 11px;
401
+ color: var(--color-muted);
402
+ text-transform: uppercase;
403
+ letter-spacing: 0.05em;
404
+ margin-bottom: 6px;
405
+ }
406
+
407
+ .card-value {
408
+ font-size: 28px;
409
+ font-weight: 700;
410
+ font-family: var(--mono);
411
+ line-height: 1;
412
+ }
413
+
414
+ .card-note {
415
+ font-size: 11px;
416
+ color: var(--color-muted);
417
+ margin-top: 6px;
418
+ }
419
+
420
+ /* ── links ─────────────────────────────────────────────────────────────── */
421
+
422
+ a, .link-btn {
423
+ color: var(--color-link);
424
+ text-decoration: none;
425
+ cursor: pointer;
426
+ background: none;
427
+ border: none;
428
+ font: inherit;
429
+ padding: 0;
430
+ }
431
+
432
+ a:hover, .link-btn:hover {
433
+ text-decoration: underline;
434
+ }
435
+
436
+ /* ── significance bar ──────────────────────────────────────────────────── */
437
+
438
+ .sig-bar {
439
+ display: flex;
440
+ align-items: center;
441
+ gap: 8px;
442
+ margin: 4px 0;
443
+ }
444
+
445
+ .sig-bar-label {
446
+ width: 70px;
447
+ font-size: 12px;
448
+ color: var(--color-muted);
449
+ text-align: right;
450
+ }
451
+
452
+ .sig-bar-track {
453
+ flex: 1;
454
+ height: 14px;
455
+ background: #eee;
456
+ border-radius: 4px;
457
+ overflow: hidden;
458
+ }
459
+
460
+ .sig-bar-fill {
461
+ height: 100%;
462
+ border-radius: 4px;
463
+ transition: width 0.3s;
464
+ }
465
+
466
+ .sig-bar-count {
467
+ width: 40px;
468
+ font-size: 12px;
469
+ font-family: var(--mono);
470
+ color: var(--color-muted);
471
+ }
472
+
473
+ /* ── repo view ─────────────────────────────────────────────────────────── */
474
+
475
+ .repo-spinner {
476
+ padding: 60px;
477
+ text-align: center;
478
+ color: var(--color-muted);
479
+ }
480
+
481
+ .stale-list {
482
+ font-size: 12px;
483
+ color: var(--color-drifted);
484
+ }
485
+
486
+ .stale-list li {
487
+ list-style: none;
488
+ margin: 4px 0;
489
+ }
490
+
491
+ .stale-file {
492
+ font-family: var(--mono);
493
+ font-size: 11px;
494
+ color: var(--color-muted);
495
+ margin-left: 12px;
496
+ }
497
+
498
+ /* ── error state ───────────────────────────────────────────────────────── */
499
+
500
+ .error-block {
501
+ padding: 16px 20px;
502
+ background: #fff8f8;
503
+ border: 1px solid #fcc;
504
+ border-radius: 8px;
505
+ color: var(--color-critical);
506
+ font-size: 13px;
507
+ }
508
+
509
+ /* ── misc ──────────────────────────────────────────────────────────────── */
510
+
511
+ .mono { font-family: var(--mono); }
512
+ .muted { color: var(--color-muted); }
513
+ .nowrap { white-space: nowrap; }
514
+
515
+ .coverage-pct {
516
+ font-family: var(--mono);
517
+ font-size: 12px;
518
+ }
519
+
520
+ /* ── update button ─────────────────────────────────────────────────────── */
521
+
522
+ .update-btn {
523
+ background: var(--color-surface);
524
+ border: 1px solid var(--color-border);
525
+ color: var(--color-text);
526
+ padding: 4px 12px;
527
+ font-size: 12px;
528
+ font-family: var(--font);
529
+ cursor: pointer;
530
+ border-radius: 6px;
531
+ white-space: nowrap;
532
+ transition: background 0.12s, border-color 0.12s;
533
+ }
534
+
535
+ .update-btn:hover:not(:disabled) {
536
+ background: var(--color-bg);
537
+ border-color: #c0c4c8;
538
+ }
539
+
540
+ .update-btn:disabled {
541
+ opacity: 0.4;
542
+ cursor: not-allowed;
543
+ }
544
+
545
+ .update-cell {
546
+ white-space: nowrap;
547
+ }
548
+
549
+ .update-result {
550
+ margin-left: 8px;
551
+ font-size: 12px;
552
+ font-weight: 600;
553
+ }
554
+
555
+ /* ── snapshot banner ───────────────────────────────────────────────────── */
556
+
557
+ .snapshot-note {
558
+ padding: 10px 28px;
559
+ background: #fffde0;
560
+ border-bottom: 1px solid #e8e000;
561
+ font-size: 12px;
562
+ color: #666;
563
+ }
564
+
565
+ /* ── responsive ────────────────────────────────────────────────────────── */
566
+
567
+ @media (max-width: 768px) {
568
+ #app-shell {
569
+ flex-direction: column;
570
+ }
571
+
572
+ #sidebar {
573
+ width: 100%;
574
+ min-width: 100%;
575
+ flex-direction: row;
576
+ overflow-x: auto;
577
+ overflow-y: hidden;
578
+ height: auto;
579
+ }
580
+
581
+ #sidebar-brand {
582
+ padding: 12px 16px;
583
+ }
584
+
585
+ #sidebar-nav {
586
+ display: flex;
587
+ align-items: center;
588
+ gap: 4px;
589
+ padding: 8px 12px;
590
+ flex-wrap: nowrap;
591
+ }
592
+
593
+ .nav-group-label {
594
+ display: none;
595
+ }
596
+
597
+ .sidebar-item {
598
+ padding: 6px 12px;
599
+ white-space: nowrap;
600
+ }
601
+
602
+ #sidebar-footer {
603
+ display: none;
604
+ }
605
+
606
+ #main-shell {
607
+ flex: 1;
608
+ overflow: auto;
609
+ }
610
+
611
+ #view-slot {
612
+ padding: 16px;
613
+ }
614
+
615
+ #topbar {
616
+ padding: 0 16px;
617
+ }
618
+ }
619
+
620
+ /* ── session modal overlay ────────────────────────────────────────────── */
621
+
622
+ .session-overlay {
623
+ position: fixed;
624
+ inset: 0;
625
+ background: rgba(0, 0, 0, 0.45);
626
+ z-index: 1000;
627
+ display: flex;
628
+ align-items: center;
629
+ justify-content: center;
630
+ }
631
+
632
+ .session-modal {
633
+ background: var(--color-surface);
634
+ border: 1px solid var(--color-border);
635
+ border-radius: 10px;
636
+ width: min(90vw, 760px);
637
+ max-height: 80vh;
638
+ display: flex;
639
+ flex-direction: column;
640
+ box-shadow: 0 8px 32px rgba(0, 0, 0, 0.18);
641
+ }
642
+
643
+ .session-modal-header {
644
+ display: flex;
645
+ align-items: center;
646
+ justify-content: space-between;
647
+ padding: 14px 20px;
648
+ border-bottom: 1px solid var(--color-border);
649
+ flex-shrink: 0;
650
+ }
651
+
652
+ .session-modal-title {
653
+ font-size: 14px;
654
+ font-weight: 600;
655
+ font-family: var(--mono);
656
+ color: var(--color-text);
657
+ overflow: hidden;
658
+ text-overflow: ellipsis;
659
+ white-space: nowrap;
660
+ }
661
+
662
+ .session-modal-close {
663
+ background: none;
664
+ border: none;
665
+ font-size: 18px;
666
+ cursor: pointer;
667
+ color: var(--color-muted);
668
+ padding: 0 4px;
669
+ line-height: 1;
670
+ }
671
+
672
+ .session-modal-close:hover {
673
+ color: var(--color-text);
674
+ }
675
+
676
+ .session-modal-body {
677
+ overflow-y: auto;
678
+ padding: 16px 20px;
679
+ flex: 1;
680
+ }
681
+
682
+ .session-markdown {
683
+ font-family: var(--mono);
684
+ font-size: 12px;
685
+ line-height: 1.6;
686
+ white-space: pre-wrap;
687
+ word-break: break-word;
688
+ color: var(--color-text);
689
+ }
690
+
691
+ .session-modal-error {
692
+ color: var(--color-critical);
693
+ font-size: 13px;
694
+ padding: 20px;
695
+ }
696
+
697
+ /* ── view button (for session evidence tables) ────────────────────────── */
698
+
699
+ .view-btn {
700
+ background: var(--color-surface);
701
+ border: 1px solid var(--color-border);
702
+ color: var(--color-link);
703
+ padding: 3px 10px;
704
+ font-size: 11px;
705
+ font-family: var(--font);
706
+ cursor: pointer;
707
+ border-radius: 4px;
708
+ transition: background 0.12s, border-color 0.12s;
709
+ }
710
+
711
+ .view-btn:hover {
712
+ background: var(--color-bg);
713
+ border-color: #c0c4c8;
714
+ }
715
+
716
+ /* ── Repo file browser ─────────────────────────────────────────────────── */
717
+
718
+ .repo-browser {
719
+ display: flex;
720
+ height: calc(100vh - 80px);
721
+ overflow: hidden;
722
+ }
723
+
724
+ .repo-sidebar {
725
+ width: 220px;
726
+ min-width: 120px;
727
+ max-width: 500px;
728
+ overflow-y: auto;
729
+ background: #fafbfc;
730
+ flex-shrink: 0;
731
+ }
732
+
733
+ .repo-sidebar-resize {
734
+ width: 5px;
735
+ flex-shrink: 0;
736
+ cursor: col-resize;
737
+ background: #e0e0e0;
738
+ transition: background 0.15s;
739
+ }
740
+
741
+ .repo-sidebar-resize:hover,
742
+ .repo-sidebar-resize.dragging {
743
+ background: #0366d6;
744
+ }
745
+
746
+ .repo-sidebar-header {
747
+ padding: 12px;
748
+ font-size: 13px;
749
+ font-weight: 600;
750
+ color: #333;
751
+ border-bottom: 1px solid #e0e0e0;
752
+ font-family: var(--font-mono);
753
+ }
754
+
755
+ .repo-sidebar-section {
756
+ display: block;
757
+ width: 100%;
758
+ padding: 8px 12px;
759
+ border: none;
760
+ background: #f0f2f4;
761
+ text-align: left;
762
+ font-size: 13px;
763
+ font-weight: 600;
764
+ color: #333;
765
+ cursor: pointer;
766
+ font-family: var(--font-mono);
767
+ border-bottom: 1px solid #e0e0e0;
768
+ }
769
+
770
+ .repo-sidebar-section:hover {
771
+ background: #e8ecf0;
772
+ }
773
+
774
+ .repo-sidebar-group {
775
+ display: block;
776
+ width: 100%;
777
+ padding: 6px 12px;
778
+ border: none;
779
+ background: none;
780
+ text-align: left;
781
+ font-size: 11px;
782
+ font-weight: 600;
783
+ color: #888;
784
+ text-transform: lowercase;
785
+ cursor: pointer;
786
+ }
787
+
788
+ .repo-sidebar-group:hover {
789
+ background: #f0f2f4;
790
+ color: #555;
791
+ }
792
+
793
+ .group-arrow {
794
+ display: inline-block;
795
+ width: 10px;
796
+ font-size: 10px;
797
+ }
798
+
799
+ .repo-dir-contents {
800
+ /* children are indented via fileItem padding */
801
+ }
802
+
803
+ .repo-file-item {
804
+ display: block;
805
+ width: 100%;
806
+ padding: 5px 12px;
807
+ border: none;
808
+ background: none;
809
+ text-align: left;
810
+ font-size: 13px;
811
+ font-family: var(--font);
812
+ color: #555;
813
+ cursor: pointer;
814
+ border-left: 3px solid transparent;
815
+ }
816
+
817
+ .repo-file-item:hover {
818
+ background: #f0f2f4;
819
+ color: #333;
820
+ }
821
+
822
+ .repo-file-item.active {
823
+ background: #e8ecf0;
824
+ color: #111;
825
+ border-left-color: var(--color-healthy, #2ea043);
826
+ font-weight: 500;
827
+ }
828
+
829
+ .repo-content {
830
+ flex: 1;
831
+ overflow-y: auto;
832
+ padding: 24px 32px;
833
+ }
834
+
835
+ .repo-file-header {
836
+ font-size: 12px;
837
+ font-family: var(--font-mono);
838
+ color: #888;
839
+ margin-bottom: 16px;
840
+ padding-bottom: 8px;
841
+ border-bottom: 1px solid #eee;
842
+ display: flex;
843
+ justify-content: space-between;
844
+ align-items: baseline;
845
+ }
846
+
847
+ .repo-file-date {
848
+ font-size: 11px;
849
+ color: #aaa;
850
+ }
851
+
852
+ /* History dropdown */
853
+ .history-toggle-btn {
854
+ border: none;
855
+ background: none;
856
+ cursor: pointer;
857
+ color: #aaa;
858
+ font-size: 11px;
859
+ padding: 0 4px;
860
+ vertical-align: middle;
861
+ }
862
+ .history-toggle-btn:hover { color: #666; }
863
+
864
+ .history-dropdown {
865
+ position: absolute;
866
+ top: 100%;
867
+ right: 0;
868
+ background: #fff;
869
+ border: 1px solid var(--color-border);
870
+ border-radius: 4px;
871
+ box-shadow: 0 4px 12px rgba(0,0,0,0.1);
872
+ z-index: 100;
873
+ min-width: 420px;
874
+ max-height: 440px;
875
+ overflow-y: auto;
876
+ font-size: 11px;
877
+ }
878
+ .history-item {
879
+ display: flex;
880
+ gap: 8px;
881
+ padding: 6px 10px;
882
+ cursor: pointer;
883
+ border-bottom: 1px solid #f0f0f0;
884
+ align-items: baseline;
885
+ }
886
+ .history-item:last-child { border-bottom: none; }
887
+ .history-item:hover { background: #f8f8f6; }
888
+ .history-active { background: #f0f4ff; }
889
+ .history-hash {
890
+ font-family: var(--font-mono);
891
+ color: var(--color-link);
892
+ min-width: 60px;
893
+ }
894
+ .history-date {
895
+ color: #999;
896
+ min-width: 140px;
897
+ }
898
+ .history-msg {
899
+ color: #666;
900
+ overflow: hidden;
901
+ text-overflow: ellipsis;
902
+ white-space: nowrap;
903
+ }
904
+
905
+ .copy-path-btn {
906
+ border: none;
907
+ background: none;
908
+ cursor: pointer;
909
+ font-size: 13px;
910
+ color: #aaa;
911
+ padding: 0 4px;
912
+ vertical-align: middle;
913
+ }
914
+
915
+ .copy-path-btn:hover {
916
+ color: #0366d6;
917
+ }
918
+
919
+ /* ── Markdown rendering ────────────────────────────────────────────────── */
920
+
921
+ .repo-markdown h1 { font-size: 22px; font-weight: 600; margin: 20px 0 12px; color: #111; }
922
+ .repo-markdown h2 { font-size: 18px; font-weight: 600; margin: 18px 0 10px; color: #222; }
923
+ .repo-markdown h3 { font-size: 15px; font-weight: 600; margin: 14px 0 8px; color: #333; }
924
+ .repo-markdown h4 { font-size: 14px; font-weight: 600; margin: 12px 0 6px; color: #444; }
925
+ .repo-markdown h5, .repo-markdown h6 { font-size: 13px; font-weight: 600; margin: 10px 0 4px; color: #555; }
926
+
927
+ .repo-markdown p { margin: 8px 0; line-height: 1.6; color: #333; }
928
+ .repo-markdown ul { margin: 8px 0; padding-left: 24px; }
929
+ .repo-markdown li { margin: 4px 0; line-height: 1.5; color: #333; }
930
+ .repo-markdown hr { border: none; border-top: 1px solid #e0e0e0; margin: 16px 0; }
931
+ .repo-markdown a { color: #0366d6; text-decoration: none; }
932
+ .repo-markdown a:hover { text-decoration: underline; }
933
+ .repo-markdown strong { font-weight: 600; }
934
+
935
+ .md-code-block {
936
+ background: #f6f8fa;
937
+ border: 1px solid #e0e0e0;
938
+ border-radius: 4px;
939
+ padding: 12px 16px;
940
+ font-size: 13px;
941
+ font-family: var(--font-mono);
942
+ overflow-x: auto;
943
+ margin: 8px 0;
944
+ line-height: 1.5;
945
+ }
946
+
947
+ .md-inline-code {
948
+ background: #f0f2f4;
949
+ padding: 2px 5px;
950
+ border-radius: 3px;
951
+ font-size: 12px;
952
+ font-family: var(--font-mono);
953
+ }
954
+
955
+ .md-blockquote {
956
+ border-left: 3px solid #ddd;
957
+ padding: 4px 12px;
958
+ margin: 8px 0;
959
+ color: #666;
960
+ }
961
+
962
+ .md-table {
963
+ border-collapse: collapse;
964
+ margin: 10px 0;
965
+ font-size: 13px;
966
+ width: 100%;
967
+ }
968
+
969
+ .md-table th, .md-table td {
970
+ border: 1px solid #ddd;
971
+ padding: 6px 10px;
972
+ text-align: left;
973
+ }
974
+
975
+ .md-table th {
976
+ background: #f6f8fa;
977
+ font-weight: 600;
978
+ }
979
+
980
+ .md-table tr:nth-child(even) {
981
+ background: #fafbfc;
982
+ }