archsight 0.1.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 (122) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +24 -0
  3. data/CODE_OF_CONDUCT.md +10 -0
  4. data/CONTRIBUTING.md +186 -0
  5. data/Dockerfile +39 -0
  6. data/LICENSE.txt +201 -0
  7. data/README.md +170 -0
  8. data/SECURITY.md +27 -0
  9. data/exe/archsight +9 -0
  10. data/lib/archsight/annotations/aggregators.rb +109 -0
  11. data/lib/archsight/annotations/annotation.rb +168 -0
  12. data/lib/archsight/annotations/architecture_annotations.rb +59 -0
  13. data/lib/archsight/annotations/backup_annotations.rb +21 -0
  14. data/lib/archsight/annotations/computed.rb +264 -0
  15. data/lib/archsight/annotations/email_recipient.rb +35 -0
  16. data/lib/archsight/annotations/generated_annotations.rb +17 -0
  17. data/lib/archsight/annotations/git_annotations.rb +21 -0
  18. data/lib/archsight/annotations/relation_resolver.rb +160 -0
  19. data/lib/archsight/cli.rb +120 -0
  20. data/lib/archsight/configuration.rb +36 -0
  21. data/lib/archsight/database.rb +183 -0
  22. data/lib/archsight/documentation.rb +171 -0
  23. data/lib/archsight/graph.rb +113 -0
  24. data/lib/archsight/helpers.rb +210 -0
  25. data/lib/archsight/linter.rb +77 -0
  26. data/lib/archsight/mcp/analyze_resource_tool.rb +222 -0
  27. data/lib/archsight/mcp/base.rb +48 -0
  28. data/lib/archsight/mcp/query_tool.rb +113 -0
  29. data/lib/archsight/mcp/resource_doc_tool.rb +87 -0
  30. data/lib/archsight/mcp.rb +6 -0
  31. data/lib/archsight/query/ast.rb +279 -0
  32. data/lib/archsight/query/errors.rb +39 -0
  33. data/lib/archsight/query/evaluator.rb +707 -0
  34. data/lib/archsight/query/lexer.rb +289 -0
  35. data/lib/archsight/query/parser.rb +506 -0
  36. data/lib/archsight/query.rb +68 -0
  37. data/lib/archsight/renderer.rb +134 -0
  38. data/lib/archsight/resources/application_component.rb +346 -0
  39. data/lib/archsight/resources/application_interface.rb +54 -0
  40. data/lib/archsight/resources/application_service.rb +222 -0
  41. data/lib/archsight/resources/base.rb +300 -0
  42. data/lib/archsight/resources/business_actor.rb +195 -0
  43. data/lib/archsight/resources/business_constraint.rb +32 -0
  44. data/lib/archsight/resources/business_process.rb +37 -0
  45. data/lib/archsight/resources/business_product.rb +206 -0
  46. data/lib/archsight/resources/business_requirement.rb +56 -0
  47. data/lib/archsight/resources/compliance_evidence.rb +42 -0
  48. data/lib/archsight/resources/data_object.rb +49 -0
  49. data/lib/archsight/resources/motivation_goal.rb +37 -0
  50. data/lib/archsight/resources/motivation_outcome.rb +33 -0
  51. data/lib/archsight/resources/motivation_stakeholder.rb +38 -0
  52. data/lib/archsight/resources/strategy_capability.rb +38 -0
  53. data/lib/archsight/resources/technology_artifact.rb +154 -0
  54. data/lib/archsight/resources/technology_interface.rb +34 -0
  55. data/lib/archsight/resources/technology_node.rb +42 -0
  56. data/lib/archsight/resources/technology_service.rb +35 -0
  57. data/lib/archsight/resources/technology_system_software.rb +37 -0
  58. data/lib/archsight/resources/view.rb +51 -0
  59. data/lib/archsight/resources.rb +49 -0
  60. data/lib/archsight/template.rb +49 -0
  61. data/lib/archsight/version.rb +5 -0
  62. data/lib/archsight/web/application.rb +290 -0
  63. data/lib/archsight/web/doc/archimate.md +215 -0
  64. data/lib/archsight/web/doc/computed_annotations.md +316 -0
  65. data/lib/archsight/web/doc/icons.md +303 -0
  66. data/lib/archsight/web/doc/index.md.erb +74 -0
  67. data/lib/archsight/web/doc/modeling.md +200 -0
  68. data/lib/archsight/web/doc/search.md +227 -0
  69. data/lib/archsight/web/doc/togaf.md +255 -0
  70. data/lib/archsight/web/doc/tool.md +90 -0
  71. data/lib/archsight/web/public/css/artifact.css +985 -0
  72. data/lib/archsight/web/public/css/base.css +201 -0
  73. data/lib/archsight/web/public/css/graph.css +106 -0
  74. data/lib/archsight/web/public/css/highlight.min.css +10 -0
  75. data/lib/archsight/web/public/css/iconoir.css +22 -0
  76. data/lib/archsight/web/public/css/instance.css +329 -0
  77. data/lib/archsight/web/public/css/layout.css +421 -0
  78. data/lib/archsight/web/public/css/mermaid-layers.css +188 -0
  79. data/lib/archsight/web/public/css/pico.min.css +4 -0
  80. data/lib/archsight/web/public/favicon.ico +0 -0
  81. data/lib/archsight/web/public/img/archimate.png +0 -0
  82. data/lib/archsight/web/public/img/togaf-high-level.png +0 -0
  83. data/lib/archsight/web/public/js/graph-zoom.js +18 -0
  84. data/lib/archsight/web/public/js/highlight.min.js +3899 -0
  85. data/lib/archsight/web/public/js/htmx.min.js +1 -0
  86. data/lib/archsight/web/public/js/mermaid-init.js +88 -0
  87. data/lib/archsight/web/public/js/mermaid.min.js +2811 -0
  88. data/lib/archsight/web/public/js/sparkline.js +42 -0
  89. data/lib/archsight/web/public/js/svg-pan-zoom.min.js +3 -0
  90. data/lib/archsight/web/public/js/svg-zoom-controls.js +93 -0
  91. data/lib/archsight/web/views/index.haml +12 -0
  92. data/lib/archsight/web/views/partials/artifact/_activity.haml +55 -0
  93. data/lib/archsight/web/views/partials/artifact/_agentic.haml +25 -0
  94. data/lib/archsight/web/views/partials/artifact/_deployment.haml +29 -0
  95. data/lib/archsight/web/views/partials/artifact/_git_info.haml +16 -0
  96. data/lib/archsight/web/views/partials/artifact/_language_stats.haml +53 -0
  97. data/lib/archsight/web/views/partials/artifact/_links.haml +24 -0
  98. data/lib/archsight/web/views/partials/artifact/_project_estimate.haml +26 -0
  99. data/lib/archsight/web/views/partials/artifact/_repositories.haml +55 -0
  100. data/lib/archsight/web/views/partials/artifact/_team.haml +83 -0
  101. data/lib/archsight/web/views/partials/artifact/_workflow.haml +69 -0
  102. data/lib/archsight/web/views/partials/components/_activity.haml +37 -0
  103. data/lib/archsight/web/views/partials/components/_git.haml +17 -0
  104. data/lib/archsight/web/views/partials/components/_jira.haml +18 -0
  105. data/lib/archsight/web/views/partials/components/_languages.haml +29 -0
  106. data/lib/archsight/web/views/partials/components/_owner.haml +15 -0
  107. data/lib/archsight/web/views/partials/components/_repositories.haml +37 -0
  108. data/lib/archsight/web/views/partials/components/_status.haml +23 -0
  109. data/lib/archsight/web/views/partials/instance/_detail.haml +99 -0
  110. data/lib/archsight/web/views/partials/instance/_graph.haml +6 -0
  111. data/lib/archsight/web/views/partials/instance/_list.haml +84 -0
  112. data/lib/archsight/web/views/partials/instance/_relations.haml +43 -0
  113. data/lib/archsight/web/views/partials/instance/_requirements.haml +41 -0
  114. data/lib/archsight/web/views/partials/instance/_view_detail.haml +57 -0
  115. data/lib/archsight/web/views/partials/layout/_content.haml +40 -0
  116. data/lib/archsight/web/views/partials/layout/_error.haml +22 -0
  117. data/lib/archsight/web/views/partials/layout/_head.haml +24 -0
  118. data/lib/archsight/web/views/partials/layout/_navigation.haml +20 -0
  119. data/lib/archsight/web/views/partials/layout/_sidebar.haml +27 -0
  120. data/lib/archsight/web/views/search.haml +53 -0
  121. data/lib/archsight.rb +17 -0
  122. metadata +311 -0
@@ -0,0 +1,985 @@
1
+ /* Artifact Styles - Activity, Git, Deployment, Workflow, etc. */
2
+
3
+ /* Language Distribution Bar */
4
+ .language-distribution {
5
+ display: flex;
6
+ flex-direction: column;
7
+ gap: 8px;
8
+ min-width: 200px;
9
+ padding: 8px 12px;
10
+ background-color: var(--card-background-color);
11
+ border-radius: 6px;
12
+ border: 1px solid var(--muted-border-color);
13
+ }
14
+
15
+ .language-total {
16
+ display: flex;
17
+ align-items: baseline;
18
+ gap: 6px;
19
+ }
20
+
21
+ .language-total .language-count {
22
+ font-size: 1.5em;
23
+ font-weight: 600;
24
+ color: var(--color);
25
+ }
26
+
27
+ .language-total .language-label {
28
+ color: var(--muted-color);
29
+ font-size: 0.9em;
30
+ }
31
+
32
+ .language-bar {
33
+ display: flex;
34
+ height: 8px;
35
+ border-radius: 4px;
36
+ overflow: hidden;
37
+ background-color: var(--muted-border-color);
38
+ }
39
+
40
+ .language-bar-segment {
41
+ height: 100%;
42
+ min-width: 2px;
43
+ }
44
+
45
+ /* Language colors - inspired by GitHub language colors */
46
+ .language-bar-segment.lang-0,
47
+ .language-legend-dot.lang-0 { background-color: #3178c6; } /* Blue - primary */
48
+ .language-bar-segment.lang-1,
49
+ .language-legend-dot.lang-1 { background-color: #00add8; } /* Cyan */
50
+ .language-bar-segment.lang-2,
51
+ .language-legend-dot.lang-2 { background-color: #f1e05a; } /* Yellow */
52
+ .language-bar-segment.lang-3,
53
+ .language-legend-dot.lang-3 { background-color: #e34c26; } /* Orange-red */
54
+ .language-bar-segment.lang-4,
55
+ .language-legend-dot.lang-4 { background-color: #563d7c; } /* Purple */
56
+ .language-bar-segment.lang-5,
57
+ .language-legend-dot.lang-5 { background-color: #89e051; } /* Green */
58
+ .language-bar-segment.lang-6,
59
+ .language-legend-dot.lang-6 { background-color: #f34b7d; } /* Pink */
60
+ .language-bar-segment.lang-7,
61
+ .language-legend-dot.lang-7 { background-color: #b07219; } /* Brown */
62
+ .language-bar-segment.lang-8,
63
+ .language-legend-dot.lang-8 { background-color: #4f5d95; } /* Slate blue */
64
+ .language-bar-segment.lang-9,
65
+ .language-legend-dot.lang-9 { background-color: #6b7280; } /* Gray */
66
+ .language-bar-segment.lang-other,
67
+ .language-legend-dot.lang-other { background-color: #9ca3af; } /* Light gray for Other */
68
+
69
+ .language-legend {
70
+ display: flex;
71
+ flex-wrap: wrap;
72
+ gap: 12px;
73
+ font-size: 0.85em;
74
+ }
75
+
76
+ .language-legend-item {
77
+ display: flex;
78
+ align-items: center;
79
+ gap: 4px;
80
+ }
81
+
82
+ .language-legend-item a {
83
+ color: var(--muted-color);
84
+ text-decoration: none;
85
+ }
86
+
87
+ .language-legend-item a:hover {
88
+ color: var(--primary);
89
+ text-decoration: underline;
90
+ }
91
+
92
+ .language-legend-dot {
93
+ width: 8px;
94
+ height: 8px;
95
+ border-radius: 50%;
96
+ flex-shrink: 0;
97
+ }
98
+
99
+ /* Project estimate */
100
+ .project-estimate {
101
+ display: flex;
102
+ flex-wrap: wrap;
103
+ gap: 16px;
104
+ padding: 4px 0;
105
+ }
106
+
107
+ .estimate-item {
108
+ display: flex;
109
+ align-items: center;
110
+ gap: 6px;
111
+ padding: 6px 12px;
112
+ background-color: var(--card-background-color);
113
+ border-radius: 6px;
114
+ border: 1px solid var(--muted-border-color);
115
+ }
116
+
117
+ .estimate-item i {
118
+ font-size: 1.2em;
119
+ color: var(--primary);
120
+ }
121
+
122
+ .estimate-label {
123
+ color: var(--muted-color);
124
+ font-size: 0.9em;
125
+ }
126
+
127
+ .estimate-value {
128
+ font-weight: 600;
129
+ color: var(--color);
130
+ }
131
+
132
+ /* Activity summary */
133
+ .activity-summary {
134
+ display: flex;
135
+ flex-wrap: wrap;
136
+ gap: 16px;
137
+ padding: 4px 0;
138
+ }
139
+
140
+ .activity-item {
141
+ display: flex;
142
+ align-items: center;
143
+ gap: 6px;
144
+ padding: 6px 12px;
145
+ background-color: var(--card-background-color);
146
+ border-radius: 6px;
147
+ border: 1px solid var(--muted-border-color);
148
+ }
149
+
150
+ .activity-item i {
151
+ font-size: 1.2em;
152
+ color: var(--primary);
153
+ }
154
+
155
+ .activity-label {
156
+ color: var(--muted-color);
157
+ font-size: 0.9em;
158
+ }
159
+
160
+ .activity-value {
161
+ font-weight: 600;
162
+ color: var(--color);
163
+ }
164
+
165
+ .activity-value.status-abandoned {
166
+ color: #dc2626;
167
+ font-weight: 700;
168
+ }
169
+
170
+ .activity-value.status-bot-only {
171
+ color: #f59e0b;
172
+ font-style: italic;
173
+ }
174
+
175
+ .activity-value.status-archived {
176
+ color: #6b7280;
177
+ font-weight: 600;
178
+ text-decoration: line-through;
179
+ }
180
+
181
+ .activity-value.bus-factor-high {
182
+ color: #dc2626;
183
+ font-weight: 700;
184
+ }
185
+
186
+ .activity-value.bus-factor-medium {
187
+ color: #f59e0b;
188
+ font-weight: 600;
189
+ }
190
+
191
+ /* Activity Sparkline */
192
+ .activity-sparkline {
193
+ display: inline-flex;
194
+ align-items: flex-end;
195
+ gap: 1px;
196
+ height: 20px;
197
+ padding: 2px 4px;
198
+ background-color: var(--card-background-color);
199
+ border-radius: 4px;
200
+ border: 1px solid var(--muted-border-color);
201
+ }
202
+
203
+ .activity-sparkline-bar {
204
+ width: 2px;
205
+ min-height: 2px;
206
+ background-color: #3178c6;
207
+ border-radius: 1px;
208
+ transition: background-color 0.2s ease;
209
+ }
210
+
211
+ .activity-sparkline-bar.empty {
212
+ min-height: 0;
213
+ background-color: transparent;
214
+ }
215
+
216
+ .activity-sparkline-bar:hover {
217
+ background-color: #2563eb;
218
+ }
219
+
220
+ .activity-sparkline-bar.empty:hover {
221
+ background-color: transparent;
222
+ }
223
+
224
+ /* Contributors sparkline - green color */
225
+ .contributors-sparkline .activity-sparkline-bar {
226
+ background-color: #10b981;
227
+ }
228
+
229
+ .contributors-sparkline .activity-sparkline-bar:hover {
230
+ background-color: #059669;
231
+ }
232
+
233
+ .sparkline-total {
234
+ margin-left: 6px;
235
+ font-size: 0.85em;
236
+ color: var(--muted-color);
237
+ }
238
+
239
+ .contributors-total {
240
+ margin-left: 4px;
241
+ font-size: 0.8em;
242
+ font-weight: 400;
243
+ color: var(--muted-color);
244
+ opacity: 0.8;
245
+ }
246
+
247
+ /* Repository Distribution Bar */
248
+ .repository-distribution {
249
+ display: flex;
250
+ flex-direction: column;
251
+ gap: 8px;
252
+ min-width: 200px;
253
+ padding: 8px 12px;
254
+ background-color: var(--card-background-color);
255
+ border-radius: 6px;
256
+ border: 1px solid var(--muted-border-color);
257
+ }
258
+
259
+ .repository-total {
260
+ display: flex;
261
+ align-items: baseline;
262
+ gap: 6px;
263
+ }
264
+
265
+ .repository-total .repository-count {
266
+ font-size: 1.5em;
267
+ font-weight: 600;
268
+ color: var(--color);
269
+ }
270
+
271
+ .repository-total .repository-label {
272
+ color: var(--muted-color);
273
+ font-size: 0.9em;
274
+ }
275
+
276
+ .repository-bar {
277
+ display: flex;
278
+ height: 8px;
279
+ border-radius: 4px;
280
+ overflow: hidden;
281
+ background-color: var(--muted-border-color);
282
+ }
283
+
284
+ .repository-bar-segment {
285
+ height: 100%;
286
+ min-width: 2px;
287
+ }
288
+
289
+ .repository-bar-segment.status-active {
290
+ background-color: #10b981;
291
+ }
292
+
293
+ .repository-bar-segment.status-high-bus-factor {
294
+ background-color: #f59e0b;
295
+ }
296
+
297
+ .repository-bar-segment.status-abandoned {
298
+ background-color: #dc2626;
299
+ }
300
+
301
+ .repository-bar-segment.status-other {
302
+ background-color: #6b7280;
303
+ }
304
+
305
+ .repository-bar-segment.status-archived {
306
+ background-color: #9ca3af;
307
+ }
308
+
309
+ .repository-legend {
310
+ display: flex;
311
+ flex-wrap: wrap;
312
+ gap: 12px;
313
+ font-size: 0.85em;
314
+ }
315
+
316
+ .repository-legend-item {
317
+ display: flex;
318
+ align-items: center;
319
+ gap: 4px;
320
+ color: var(--muted-color);
321
+ }
322
+
323
+ .repository-legend-dot {
324
+ width: 8px;
325
+ height: 8px;
326
+ border-radius: 50%;
327
+ }
328
+
329
+ .repository-legend-dot.status-active {
330
+ background-color: #10b981;
331
+ }
332
+
333
+ .repository-legend-dot.status-high-bus-factor {
334
+ background-color: #f59e0b;
335
+ }
336
+
337
+ .repository-legend-dot.status-abandoned {
338
+ background-color: #dc2626;
339
+ }
340
+
341
+ .repository-legend-dot.status-other {
342
+ background-color: #6b7280;
343
+ }
344
+
345
+ .repository-legend-dot.status-archived {
346
+ background-color: #9ca3af;
347
+ }
348
+
349
+ @media (prefers-color-scheme: dark) {
350
+ .repository-bar-segment.status-active,
351
+ .repository-legend-dot.status-active {
352
+ background-color: #34d399;
353
+ }
354
+
355
+ .repository-bar-segment.status-high-bus-factor,
356
+ .repository-legend-dot.status-high-bus-factor {
357
+ background-color: #fbbf24;
358
+ }
359
+
360
+ .repository-bar-segment.status-abandoned,
361
+ .repository-legend-dot.status-abandoned {
362
+ background-color: #f87171;
363
+ }
364
+
365
+ .repository-bar-segment.status-other,
366
+ .repository-legend-dot.status-other {
367
+ background-color: #9ca3af;
368
+ }
369
+
370
+ .repository-bar-segment.status-archived,
371
+ .repository-legend-dot.status-archived {
372
+ background-color: #d1d5db;
373
+ }
374
+ }
375
+
376
+ /* Team */
377
+ .team-stats {
378
+ display: flex;
379
+ flex-wrap: wrap;
380
+ gap: 16px;
381
+ padding: 8px 12px;
382
+ background-color: var(--card-background-color);
383
+ border-radius: 6px;
384
+ border: 1px solid var(--muted-border-color);
385
+ }
386
+
387
+ .team-stat-item {
388
+ display: flex;
389
+ align-items: baseline;
390
+ gap: 6px;
391
+ }
392
+
393
+ .team-stat-value {
394
+ font-size: 1.5em;
395
+ font-weight: 600;
396
+ color: var(--color);
397
+ }
398
+
399
+ .team-stat-label {
400
+ color: var(--muted-color);
401
+ font-size: 0.9em;
402
+ }
403
+
404
+ .team-value {
405
+ color: var(--color);
406
+ }
407
+
408
+ a.team-value {
409
+ color: var(--primary);
410
+ text-decoration: none;
411
+ }
412
+
413
+ a.team-value:hover {
414
+ text-decoration: underline;
415
+ }
416
+
417
+ .team-members {
418
+ display: flex;
419
+ flex-direction: column;
420
+ gap: 2px;
421
+ }
422
+
423
+ .team-member {
424
+ color: var(--color);
425
+ }
426
+
427
+ a.team-member {
428
+ color: var(--primary);
429
+ text-decoration: none;
430
+ }
431
+
432
+ a.team-member:hover {
433
+ text-decoration: underline;
434
+ }
435
+
436
+ /* Jira info - inline layout with wrap */
437
+ .jira-info {
438
+ display: flex;
439
+ flex-wrap: wrap;
440
+ align-items: center;
441
+ gap: 10px;
442
+ }
443
+
444
+ .jira-metric {
445
+ display: flex;
446
+ align-items: center;
447
+ gap: 6px;
448
+ }
449
+
450
+ .jira-metric-label {
451
+ font-size: 0.85em;
452
+ color: var(--muted-color);
453
+ }
454
+
455
+ .jira-metric-total {
456
+ font-size: 0.85em;
457
+ font-weight: 600;
458
+ color: var(--color);
459
+ }
460
+
461
+ /* Jira sparkline colors - created = orange, resolved = green */
462
+ .jira-created-sparkline .activity-sparkline-bar {
463
+ background-color: #f59e0b;
464
+ }
465
+
466
+ .jira-created-sparkline .activity-sparkline-bar:hover {
467
+ background-color: #d97706;
468
+ }
469
+
470
+ .jira-resolved-sparkline .activity-sparkline-bar {
471
+ background-color: #10b981;
472
+ }
473
+
474
+ .jira-resolved-sparkline .activity-sparkline-bar:hover {
475
+ background-color: #059669;
476
+ }
477
+
478
+ /* Jira trend indicator - compact */
479
+ .jira-trend {
480
+ display: flex;
481
+ align-items: center;
482
+ gap: 4px;
483
+ font-size: 0.85em;
484
+ cursor: help;
485
+ }
486
+
487
+ .jira-trend i {
488
+ font-size: 1em;
489
+ }
490
+
491
+ .jira-trend-text {
492
+ font-weight: 600;
493
+ }
494
+
495
+ /* Trend states */
496
+ .jira-trend-positive i,
497
+ .jira-trend-positive .jira-trend-text {
498
+ color: #10b981;
499
+ }
500
+
501
+ .jira-trend-negative i,
502
+ .jira-trend-negative .jira-trend-text {
503
+ color: #ef4444;
504
+ }
505
+
506
+ .jira-trend-neutral i,
507
+ .jira-trend-neutral .jira-trend-text {
508
+ color: var(--muted-color);
509
+ }
510
+
511
+ @media (prefers-color-scheme: dark) {
512
+ .jira-created-sparkline .activity-sparkline-bar {
513
+ background-color: #fbbf24;
514
+ }
515
+
516
+ .jira-resolved-sparkline .activity-sparkline-bar {
517
+ background-color: #34d399;
518
+ }
519
+
520
+ .jira-trend-positive i,
521
+ .jira-trend-positive .jira-trend-text {
522
+ color: #34d399;
523
+ }
524
+
525
+ .jira-trend-negative i,
526
+ .jira-trend-negative .jira-trend-text {
527
+ color: #f87171;
528
+ }
529
+ }
530
+
531
+ /* View components - table cell styles */
532
+ .component-jira,
533
+ .component-activity,
534
+ .component-language,
535
+ .component-repos,
536
+ .component-status {
537
+ display: flex;
538
+ align-items: center;
539
+ gap: 10px;
540
+ white-space: nowrap;
541
+ }
542
+
543
+ .badge-sm {
544
+ font-size: 0.9em;
545
+ padding: 4px 10px;
546
+ }
547
+
548
+ .component-trend {
549
+ display: flex;
550
+ align-items: center;
551
+ gap: 2px;
552
+ font-size: 0.9em;
553
+ font-weight: 600;
554
+ margin-left: auto;
555
+ }
556
+
557
+ .component-trend.trend-positive {
558
+ color: #10b981;
559
+ }
560
+
561
+ .component-trend.trend-negative {
562
+ color: #ef4444;
563
+ }
564
+
565
+ .component-trend.trend-neutral {
566
+ color: var(--muted-color);
567
+ }
568
+
569
+ .component-total,
570
+ .component-count {
571
+ font-weight: 600;
572
+ font-size: 1.1em;
573
+ }
574
+
575
+ .component-lang {
576
+ font-weight: 600;
577
+ font-size: 1em;
578
+ }
579
+
580
+ .component-loc {
581
+ color: var(--muted-color);
582
+ font-size: 0.95em;
583
+ }
584
+
585
+ .component-lang-bar {
586
+ display: flex;
587
+ width: 160px;
588
+ height: 8px;
589
+ border-radius: 4px;
590
+ overflow: hidden;
591
+ background: var(--muted-border-color);
592
+ }
593
+
594
+ .component-lang-bar .lang-bar-segment {
595
+ height: 100%;
596
+ }
597
+
598
+ .lang-bar-segment.lang-0 { background-color: #3178c6; }
599
+ .lang-bar-segment.lang-1 { background-color: #00add8; }
600
+ .lang-bar-segment.lang-2 { background-color: #f1e05a; }
601
+ .lang-bar-segment.lang-3 { background-color: #e34c26; }
602
+ .lang-bar-segment.lang-4 { background-color: #563d7c; }
603
+ .lang-bar-segment.lang-other { background-color: #9ca3af; }
604
+
605
+ .component-badge {
606
+ font-size: 0.85em;
607
+ padding: 4px 10px;
608
+ border-radius: 4px;
609
+ background-color: var(--muted-border-color);
610
+ }
611
+
612
+ .component-badge.status-active {
613
+ background-color: rgba(16, 185, 129, 0.15);
614
+ color: #10b981;
615
+ }
616
+
617
+ .component-badge.status-abandoned {
618
+ background-color: rgba(239, 68, 68, 0.15);
619
+ color: #ef4444;
620
+ }
621
+
622
+ .component-badge.status-archived {
623
+ background-color: rgba(107, 114, 128, 0.15);
624
+ color: #6b7280;
625
+ }
626
+
627
+ .component-badge.bus-factor-high {
628
+ background-color: rgba(239, 68, 68, 0.15);
629
+ color: #ef4444;
630
+ }
631
+
632
+ .component-badge.bus-factor-medium {
633
+ background-color: rgba(245, 158, 11, 0.15);
634
+ color: #f59e0b;
635
+ }
636
+
637
+ .sparkline-sm {
638
+ height: 28px;
639
+ gap: 2px;
640
+ }
641
+
642
+ .sparkline-sm .activity-sparkline-bar {
643
+ width: 4px;
644
+ border-radius: 1px;
645
+ }
646
+
647
+ .component-bar-mini {
648
+ display: flex;
649
+ width: 120px;
650
+ height: 12px;
651
+ border-radius: 4px;
652
+ overflow: hidden;
653
+ background: var(--muted-border-color);
654
+ }
655
+
656
+ .component-bar-mini .bar-segment {
657
+ height: 100%;
658
+ }
659
+
660
+ .component-bar-mini .bar-segment.status-active {
661
+ background-color: #10b981;
662
+ }
663
+
664
+ .component-bar-mini .bar-segment.status-high-bus-factor {
665
+ background-color: #f59e0b;
666
+ }
667
+
668
+ .component-bar-mini .bar-segment.status-archived {
669
+ background-color: #9ca3af;
670
+ }
671
+
672
+ .component-bar-mini .bar-segment.status-other {
673
+ background-color: #6b7280;
674
+ }
675
+
676
+ .component-bar-mini .bar-segment.status-abandoned {
677
+ background-color: #ef4444;
678
+ }
679
+
680
+ .component-link {
681
+ display: flex;
682
+ align-items: center;
683
+ gap: 8px;
684
+ color: var(--primary);
685
+ text-decoration: none;
686
+ font-size: 1em;
687
+ }
688
+
689
+ .component-link:hover {
690
+ text-decoration: underline;
691
+ }
692
+
693
+ .component-link i {
694
+ font-size: 1.3em;
695
+ }
696
+
697
+ @media (prefers-color-scheme: dark) {
698
+ .component-trend.trend-positive {
699
+ color: #34d399;
700
+ }
701
+
702
+ .component-trend.trend-negative {
703
+ color: #f87171;
704
+ }
705
+
706
+ .component-badge.status-active {
707
+ background-color: rgba(52, 211, 153, 0.2);
708
+ color: #34d399;
709
+ }
710
+
711
+ .component-badge.status-abandoned {
712
+ background-color: rgba(248, 113, 113, 0.2);
713
+ color: #f87171;
714
+ }
715
+
716
+ .component-badge.bus-factor-high {
717
+ background-color: rgba(248, 113, 113, 0.2);
718
+ color: #f87171;
719
+ }
720
+
721
+ .component-badge.bus-factor-medium {
722
+ background-color: rgba(251, 191, 36, 0.2);
723
+ color: #fbbf24;
724
+ }
725
+
726
+ .component-bar-mini .bar-segment.status-active {
727
+ background-color: #34d399;
728
+ }
729
+
730
+ .component-bar-mini .bar-segment.status-high-bus-factor {
731
+ background-color: #fbbf24;
732
+ }
733
+
734
+ .component-bar-mini .bar-segment.status-archived {
735
+ background-color: #d1d5db;
736
+ }
737
+
738
+ .component-bar-mini .bar-segment.status-other {
739
+ background-color: #9ca3af;
740
+ }
741
+
742
+ .component-bar-mini .bar-segment.status-abandoned {
743
+ background-color: #f87171;
744
+ }
745
+ }
746
+
747
+ /* Git info */
748
+ .git-info {
749
+ display: flex;
750
+ flex-wrap: wrap;
751
+ gap: 16px;
752
+ padding: 4px 0;
753
+ }
754
+
755
+ .git-item {
756
+ display: flex;
757
+ align-items: center;
758
+ gap: 6px;
759
+ padding: 6px 12px;
760
+ background-color: var(--card-background-color);
761
+ border-radius: 6px;
762
+ border: 1px solid var(--muted-border-color);
763
+ }
764
+
765
+ .git-item i {
766
+ font-size: 1.2em;
767
+ color: var(--primary);
768
+ }
769
+
770
+ .git-link {
771
+ font-weight: 600;
772
+ color: var(--primary);
773
+ text-decoration: none;
774
+ }
775
+
776
+ .git-link:hover {
777
+ text-decoration: underline;
778
+ }
779
+
780
+ .git-clone-command {
781
+ color: var(--muted-color);
782
+ font-size: 0.9em;
783
+ font-family: monospace;
784
+ background-color: var(--code-background-color);
785
+ padding: 2px 6px;
786
+ border-radius: 3px;
787
+ }
788
+
789
+ .copy-button {
790
+ padding: 6px;
791
+ background-color: transparent;
792
+ color: var(--primary);
793
+ border: 1px solid var(--muted-border-color);
794
+ border-radius: 4px;
795
+ cursor: pointer;
796
+ transition: all 0.2s ease;
797
+ display: flex;
798
+ align-items: center;
799
+ justify-content: center;
800
+ min-width: 32px;
801
+ height: 32px;
802
+ }
803
+
804
+ .copy-button:hover {
805
+ background-color: var(--card-background-color);
806
+ border-color: var(--primary);
807
+ transform: scale(1.1);
808
+ }
809
+
810
+ .copy-button.copied {
811
+ background-color: #10b981;
812
+ border-color: #10b981;
813
+ color: white;
814
+ }
815
+
816
+ .copy-button i {
817
+ font-size: 1.1em;
818
+ }
819
+
820
+ /* Deployment info styles */
821
+ .deployment-types {
822
+ display: grid;
823
+ grid-template-columns: repeat(2, 1fr);
824
+ gap: 0.5rem;
825
+ }
826
+
827
+ .deployment-item {
828
+ display: flex;
829
+ align-items: center;
830
+ gap: 0.5rem;
831
+ padding: 0.5rem;
832
+ background-color: var(--card-background-color);
833
+ border: 1px solid var(--muted-border-color);
834
+ border-radius: 6px;
835
+ text-decoration: none;
836
+ color: var(--color);
837
+ transition: border-color 0.2s ease;
838
+ }
839
+
840
+ .deployment-item:hover {
841
+ border-color: var(--primary);
842
+ }
843
+
844
+ .deployment-item i {
845
+ color: var(--primary);
846
+ font-size: 1.2em;
847
+ flex-shrink: 0;
848
+ }
849
+
850
+ /* Workflow info styles */
851
+ .workflow-platforms {
852
+ display: grid;
853
+ grid-template-columns: repeat(2, 1fr);
854
+ gap: 0.5rem;
855
+ }
856
+
857
+ .workflow-platform-item {
858
+ display: flex;
859
+ align-items: center;
860
+ gap: 0.5rem;
861
+ padding: 0.5rem;
862
+ background-color: var(--card-background-color);
863
+ border: 1px solid var(--muted-border-color);
864
+ border-radius: 6px;
865
+ text-decoration: none;
866
+ color: var(--color);
867
+ transition: border-color 0.2s ease;
868
+ }
869
+
870
+ .workflow-platform-item:hover {
871
+ border-color: var(--primary);
872
+ }
873
+
874
+ .workflow-platform-item input[type="checkbox"] {
875
+ margin: 0;
876
+ pointer-events: none;
877
+ }
878
+
879
+ .workflow-types ul {
880
+ list-style: none;
881
+ padding-left: 0;
882
+ margin: 0.25rem 0 0 0;
883
+ }
884
+
885
+ .workflow-types li {
886
+ display: flex;
887
+ align-items: center;
888
+ gap: 0.5rem;
889
+ }
890
+
891
+ .workflow-types li input[type="checkbox"] {
892
+ margin: 0;
893
+ pointer-events: none;
894
+ }
895
+
896
+ .workflow-types li a {
897
+ text-decoration: none;
898
+ color: var(--color);
899
+ transition: color 0.2s ease;
900
+ }
901
+
902
+ .workflow-types li a:hover {
903
+ color: var(--primary);
904
+ text-decoration: underline;
905
+ }
906
+
907
+ .workflow-types li.grayed-out {
908
+ opacity: 0.4;
909
+ }
910
+
911
+ .workflow-types {
912
+ padding-left: 1rem;
913
+ margin-top: 0.5rem;
914
+ }
915
+
916
+ .workflow-types>div {
917
+ display: grid;
918
+ grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
919
+ gap: 0.5rem;
920
+ }
921
+
922
+ .workflow-category strong {
923
+ display: block;
924
+ margin-bottom: 0.25rem;
925
+ }
926
+
927
+ /* Agentic tools styles */
928
+ .agentic-tools {
929
+ display: grid;
930
+ grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
931
+ gap: 1rem;
932
+ }
933
+
934
+ .tool-item {
935
+ padding: 0.75rem;
936
+ background-color: var(--card-background-color);
937
+ border: 1px solid var(--muted-border-color);
938
+ border-radius: 6px;
939
+ transition: opacity 0.2s ease, border-color 0.2s ease;
940
+ text-decoration: none;
941
+ color: var(--color);
942
+ display: block;
943
+ }
944
+
945
+ .tool-item:hover {
946
+ border-color: var(--primary);
947
+ }
948
+
949
+ .tool-item.not-implemented {
950
+ opacity: 0.4;
951
+ }
952
+
953
+ .tool-item-header {
954
+ display: flex;
955
+ align-items: center;
956
+ gap: 0.5rem;
957
+ margin-bottom: 0.25rem;
958
+ }
959
+
960
+ .tool-item-header input[type="checkbox"] {
961
+ margin: 0;
962
+ pointer-events: none;
963
+ }
964
+
965
+ .tool-item-header i {
966
+ font-size: 1.2em;
967
+ }
968
+
969
+ .tool-item-header i.implemented {
970
+ color: var(--primary);
971
+ }
972
+
973
+ .tool-item-header i.not-implemented {
974
+ color: var(--muted-color);
975
+ }
976
+
977
+ .tool-item-description {
978
+ font-size: 0.85em;
979
+ color: var(--muted-color);
980
+ }
981
+
982
+ /* Common info section cell padding */
983
+ .info-section-cell {
984
+ padding: 0.5rem 1rem;
985
+ }