claude-mpm 4.1.7__py3-none-any.whl → 4.1.10__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 (109) hide show
  1. claude_mpm/VERSION +1 -1
  2. claude_mpm/agents/INSTRUCTIONS.md +26 -1
  3. claude_mpm/agents/OUTPUT_STYLE.md +73 -0
  4. claude_mpm/agents/agents_metadata.py +57 -0
  5. claude_mpm/agents/templates/.claude-mpm/memories/README.md +17 -0
  6. claude_mpm/agents/templates/.claude-mpm/memories/engineer_memories.md +3 -0
  7. claude_mpm/agents/templates/agent-manager.json +263 -17
  8. claude_mpm/agents/templates/agent-manager.md +248 -10
  9. claude_mpm/agents/templates/agentic_coder_optimizer.json +222 -0
  10. claude_mpm/agents/templates/code_analyzer.json +18 -8
  11. claude_mpm/agents/templates/engineer.json +1 -1
  12. claude_mpm/agents/templates/logs/prompts/agent_engineer_20250826_014258_728.md +39 -0
  13. claude_mpm/agents/templates/qa.json +1 -1
  14. claude_mpm/agents/templates/research.json +1 -1
  15. claude_mpm/cli/__init__.py +4 -0
  16. claude_mpm/cli/commands/__init__.py +6 -0
  17. claude_mpm/cli/commands/analyze.py +547 -0
  18. claude_mpm/cli/commands/analyze_code.py +524 -0
  19. claude_mpm/cli/commands/configure.py +223 -25
  20. claude_mpm/cli/commands/configure_tui.py +65 -61
  21. claude_mpm/cli/commands/debug.py +1387 -0
  22. claude_mpm/cli/parsers/analyze_code_parser.py +170 -0
  23. claude_mpm/cli/parsers/analyze_parser.py +135 -0
  24. claude_mpm/cli/parsers/base_parser.py +29 -0
  25. claude_mpm/cli/parsers/configure_parser.py +23 -0
  26. claude_mpm/cli/parsers/debug_parser.py +319 -0
  27. claude_mpm/config/socketio_config.py +21 -21
  28. claude_mpm/constants.py +3 -1
  29. claude_mpm/core/framework_loader.py +148 -6
  30. claude_mpm/core/log_manager.py +16 -13
  31. claude_mpm/core/logger.py +1 -1
  32. claude_mpm/core/unified_agent_registry.py +1 -1
  33. claude_mpm/dashboard/.claude-mpm/socketio-instances.json +1 -0
  34. claude_mpm/dashboard/analysis_runner.py +428 -0
  35. claude_mpm/dashboard/static/built/components/activity-tree.js +2 -0
  36. claude_mpm/dashboard/static/built/components/agent-inference.js +1 -1
  37. claude_mpm/dashboard/static/built/components/event-viewer.js +1 -1
  38. claude_mpm/dashboard/static/built/components/file-tool-tracker.js +1 -1
  39. claude_mpm/dashboard/static/built/components/module-viewer.js +1 -1
  40. claude_mpm/dashboard/static/built/components/session-manager.js +1 -1
  41. claude_mpm/dashboard/static/built/components/working-directory.js +1 -1
  42. claude_mpm/dashboard/static/built/dashboard.js +1 -1
  43. claude_mpm/dashboard/static/built/socket-client.js +1 -1
  44. claude_mpm/dashboard/static/css/activity.css +549 -0
  45. claude_mpm/dashboard/static/css/code-tree.css +846 -0
  46. claude_mpm/dashboard/static/css/dashboard.css +245 -0
  47. claude_mpm/dashboard/static/dist/components/activity-tree.js +2 -0
  48. claude_mpm/dashboard/static/dist/components/code-tree.js +2 -0
  49. claude_mpm/dashboard/static/dist/components/code-viewer.js +2 -0
  50. claude_mpm/dashboard/static/dist/components/event-viewer.js +1 -1
  51. claude_mpm/dashboard/static/dist/components/session-manager.js +1 -1
  52. claude_mpm/dashboard/static/dist/components/working-directory.js +1 -1
  53. claude_mpm/dashboard/static/dist/dashboard.js +1 -1
  54. claude_mpm/dashboard/static/dist/socket-client.js +1 -1
  55. claude_mpm/dashboard/static/js/components/activity-tree.js +1139 -0
  56. claude_mpm/dashboard/static/js/components/code-tree.js +1357 -0
  57. claude_mpm/dashboard/static/js/components/code-viewer.js +480 -0
  58. claude_mpm/dashboard/static/js/components/event-viewer.js +11 -0
  59. claude_mpm/dashboard/static/js/components/session-manager.js +40 -4
  60. claude_mpm/dashboard/static/js/components/socket-manager.js +12 -0
  61. claude_mpm/dashboard/static/js/components/ui-state-manager.js +4 -0
  62. claude_mpm/dashboard/static/js/components/working-directory.js +17 -1
  63. claude_mpm/dashboard/static/js/dashboard.js +39 -0
  64. claude_mpm/dashboard/static/js/socket-client.js +414 -20
  65. claude_mpm/dashboard/templates/index.html +184 -4
  66. claude_mpm/hooks/claude_hooks/hook_handler.py +182 -5
  67. claude_mpm/hooks/claude_hooks/installer.py +728 -0
  68. claude_mpm/scripts/claude-hook-handler.sh +161 -0
  69. claude_mpm/scripts/socketio_daemon.py +121 -8
  70. claude_mpm/services/agents/deployment/agent_config_provider.py +127 -27
  71. claude_mpm/services/agents/deployment/agent_lifecycle_manager_refactored.py +2 -2
  72. claude_mpm/services/agents/deployment/agent_record_service.py +1 -2
  73. claude_mpm/services/agents/memory/memory_format_service.py +1 -5
  74. claude_mpm/services/cli/agent_cleanup_service.py +1 -2
  75. claude_mpm/services/cli/agent_dependency_service.py +1 -1
  76. claude_mpm/services/cli/agent_validation_service.py +3 -4
  77. claude_mpm/services/cli/dashboard_launcher.py +2 -3
  78. claude_mpm/services/cli/startup_checker.py +0 -10
  79. claude_mpm/services/core/cache_manager.py +1 -2
  80. claude_mpm/services/core/path_resolver.py +1 -4
  81. claude_mpm/services/core/service_container.py +2 -2
  82. claude_mpm/services/diagnostics/checks/instructions_check.py +2 -5
  83. claude_mpm/services/event_bus/direct_relay.py +98 -20
  84. claude_mpm/services/infrastructure/monitoring/__init__.py +11 -11
  85. claude_mpm/services/infrastructure/monitoring.py +11 -11
  86. claude_mpm/services/project/architecture_analyzer.py +1 -1
  87. claude_mpm/services/project/dependency_analyzer.py +4 -4
  88. claude_mpm/services/project/language_analyzer.py +3 -3
  89. claude_mpm/services/project/metrics_collector.py +3 -6
  90. claude_mpm/services/socketio/handlers/__init__.py +2 -0
  91. claude_mpm/services/socketio/handlers/code_analysis.py +170 -0
  92. claude_mpm/services/socketio/handlers/registry.py +2 -0
  93. claude_mpm/services/socketio/server/connection_manager.py +95 -65
  94. claude_mpm/services/socketio/server/core.py +125 -17
  95. claude_mpm/services/socketio/server/main.py +44 -5
  96. claude_mpm/services/visualization/__init__.py +19 -0
  97. claude_mpm/services/visualization/mermaid_generator.py +938 -0
  98. claude_mpm/tools/__main__.py +208 -0
  99. claude_mpm/tools/code_tree_analyzer.py +778 -0
  100. claude_mpm/tools/code_tree_builder.py +632 -0
  101. claude_mpm/tools/code_tree_events.py +318 -0
  102. claude_mpm/tools/socketio_debug.py +671 -0
  103. {claude_mpm-4.1.7.dist-info → claude_mpm-4.1.10.dist-info}/METADATA +1 -1
  104. {claude_mpm-4.1.7.dist-info → claude_mpm-4.1.10.dist-info}/RECORD +108 -77
  105. claude_mpm/agents/schema/agent_schema.json +0 -314
  106. {claude_mpm-4.1.7.dist-info → claude_mpm-4.1.10.dist-info}/WHEEL +0 -0
  107. {claude_mpm-4.1.7.dist-info → claude_mpm-4.1.10.dist-info}/entry_points.txt +0 -0
  108. {claude_mpm-4.1.7.dist-info → claude_mpm-4.1.10.dist-info}/licenses/LICENSE +0 -0
  109. {claude_mpm-4.1.7.dist-info → claude_mpm-4.1.10.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,846 @@
1
+ /* Code Tree Styles */
2
+
3
+ .code-container {
4
+ height: 100%;
5
+ display: flex;
6
+ flex-direction: column;
7
+ background: #f8f9fa;
8
+ }
9
+
10
+ /* Compact Header Layout */
11
+ .code-header-compact {
12
+ display: flex;
13
+ justify-content: space-between;
14
+ align-items: center;
15
+ padding: 8px 12px;
16
+ background: white;
17
+ border-bottom: 1px solid #e2e8f0;
18
+ gap: 15px;
19
+ min-height: 40px;
20
+ }
21
+
22
+ .header-left,
23
+ .header-center,
24
+ .header-right {
25
+ display: flex;
26
+ align-items: center;
27
+ gap: 8px;
28
+ }
29
+
30
+ .header-left {
31
+ flex: 0 1 auto;
32
+ }
33
+
34
+ .header-center {
35
+ flex: 0 0 auto;
36
+ }
37
+
38
+ .header-right {
39
+ flex: 0 1 auto;
40
+ justify-content: flex-end;
41
+ }
42
+
43
+ /* Compact Input Elements */
44
+ .path-input-compact {
45
+ width: 150px;
46
+ padding: 4px 8px;
47
+ border: 1px solid #e2e8f0;
48
+ border-radius: 4px;
49
+ font-size: 13px;
50
+ }
51
+
52
+ .btn-compact {
53
+ padding: 4px 8px;
54
+ border: 1px solid #e2e8f0;
55
+ background: white;
56
+ border-radius: 4px;
57
+ cursor: pointer;
58
+ font-size: 14px;
59
+ transition: all 0.2s;
60
+ min-width: 28px;
61
+ height: 28px;
62
+ display: inline-flex;
63
+ align-items: center;
64
+ justify-content: center;
65
+ }
66
+
67
+ .btn-compact:hover {
68
+ background: #f8f9fa;
69
+ border-color: #94a3b8;
70
+ }
71
+
72
+ .btn-compact.btn-primary {
73
+ background: #3b82f6;
74
+ color: white;
75
+ border-color: #3b82f6;
76
+ }
77
+
78
+ .btn-compact.btn-danger {
79
+ background: #ef4444;
80
+ color: white;
81
+ border-color: #ef4444;
82
+ }
83
+
84
+ .stat-compact {
85
+ font-size: 13px;
86
+ color: #64748b;
87
+ white-space: nowrap;
88
+ }
89
+
90
+ .stat-compact span {
91
+ font-weight: 600;
92
+ color: #1e293b;
93
+ }
94
+
95
+ .select-compact {
96
+ padding: 4px 8px;
97
+ border: 1px solid #e2e8f0;
98
+ border-radius: 4px;
99
+ font-size: 13px;
100
+ background: white;
101
+ }
102
+
103
+ .search-compact {
104
+ width: 120px;
105
+ padding: 4px 8px;
106
+ border: 1px solid #e2e8f0;
107
+ border-radius: 4px;
108
+ font-size: 13px;
109
+ }
110
+
111
+ /* Advanced Options (collapsible) */
112
+ .code-advanced-options {
113
+ background: #f8f9fa;
114
+ border-bottom: 1px solid #e2e8f0;
115
+ font-size: 13px;
116
+ }
117
+
118
+ .code-advanced-options summary {
119
+ padding: 6px 12px;
120
+ cursor: pointer;
121
+ user-select: none;
122
+ color: #64748b;
123
+ font-size: 12px;
124
+ }
125
+
126
+ .code-advanced-options summary:hover {
127
+ color: #1e293b;
128
+ }
129
+
130
+ .advanced-content {
131
+ padding: 8px 12px;
132
+ display: flex;
133
+ gap: 20px;
134
+ }
135
+
136
+ .option-group {
137
+ display: flex;
138
+ align-items: center;
139
+ gap: 10px;
140
+ }
141
+
142
+ .option-group label {
143
+ display: flex;
144
+ align-items: center;
145
+ gap: 4px;
146
+ font-size: 12px;
147
+ color: #475569;
148
+ }
149
+
150
+ .input-compact {
151
+ width: 60px;
152
+ padding: 2px 6px;
153
+ border: 1px solid #e2e8f0;
154
+ border-radius: 3px;
155
+ font-size: 12px;
156
+ }
157
+
158
+ /* Analysis Options Panel - OLD STYLES DEPRECATED */
159
+ .code-analysis-options {
160
+ padding: 15px;
161
+ background: white;
162
+ border-bottom: 1px solid #e2e8f0;
163
+ }
164
+
165
+ .analysis-row {
166
+ display: flex;
167
+ align-items: center;
168
+ gap: 15px;
169
+ margin-bottom: 10px;
170
+ }
171
+
172
+ .analysis-row:last-child {
173
+ margin-bottom: 0;
174
+ }
175
+
176
+ .analysis-row label {
177
+ font-weight: 500;
178
+ color: #64748b;
179
+ min-width: 100px;
180
+ }
181
+
182
+ .analysis-row input[type="text"],
183
+ .analysis-row input[type="number"] {
184
+ flex: 1;
185
+ padding: 6px 10px;
186
+ background: #f8f9fa;
187
+ border: 1px solid #cbd5e0;
188
+ border-radius: 4px;
189
+ color: #1e293b;
190
+ }
191
+
192
+ .language-selection {
193
+ display: flex;
194
+ align-items: center;
195
+ gap: 15px;
196
+ flex: 1;
197
+ }
198
+
199
+ .language-selection label {
200
+ display: flex;
201
+ align-items: center;
202
+ gap: 5px;
203
+ min-width: auto;
204
+ cursor: pointer;
205
+ }
206
+
207
+ .language-checkbox {
208
+ cursor: pointer;
209
+ }
210
+
211
+ .analysis-options {
212
+ display: flex;
213
+ align-items: center;
214
+ gap: 10px;
215
+ }
216
+
217
+ .analysis-options input[type="number"] {
218
+ width: 80px;
219
+ }
220
+
221
+ #cancel-analysis {
222
+ margin-left: 10px;
223
+ }
224
+
225
+ .btn-danger {
226
+ background: #ef4444;
227
+ color: white;
228
+ border: none;
229
+ padding: 8px 16px;
230
+ border-radius: 6px;
231
+ cursor: pointer;
232
+ font-weight: 600;
233
+ transition: all 0.3s ease;
234
+ }
235
+
236
+ .btn-danger:hover {
237
+ background: #dc2626;
238
+ }
239
+
240
+ /* Notification Styles */
241
+ .code-notification {
242
+ position: fixed;
243
+ top: 20px;
244
+ right: 20px;
245
+ padding: 12px 20px;
246
+ border-radius: 4px;
247
+ background: #475569;
248
+ color: white;
249
+ box-shadow: 0 2px 10px rgba(0, 0, 0, 0.2);
250
+ z-index: 1000;
251
+ display: none;
252
+ animation: slideIn 0.3s ease;
253
+ }
254
+
255
+ .code-notification.success {
256
+ background: #10b981;
257
+ }
258
+
259
+ .code-notification.error {
260
+ background: #ef4444;
261
+ }
262
+
263
+ .code-notification.warning {
264
+ background: #f59e0b;
265
+ }
266
+
267
+ .code-notification.info {
268
+ background: #3b82f6;
269
+ }
270
+
271
+ @keyframes slideIn {
272
+ from {
273
+ transform: translateX(100%);
274
+ opacity: 0;
275
+ }
276
+ to {
277
+ transform: translateX(0);
278
+ opacity: 1;
279
+ }
280
+ }
281
+
282
+ .code-header {
283
+ display: flex;
284
+ justify-content: space-between;
285
+ align-items: center;
286
+ padding: 10px 15px;
287
+ background: white;
288
+ border-radius: 8px;
289
+ margin-bottom: 15px;
290
+ box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05);
291
+ }
292
+
293
+ .code-controls {
294
+ display: flex;
295
+ gap: 10px;
296
+ align-items: center;
297
+ }
298
+
299
+ .code-controls .btn-primary {
300
+ background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
301
+ color: white;
302
+ border: none;
303
+ padding: 8px 16px;
304
+ border-radius: 6px;
305
+ cursor: pointer;
306
+ font-weight: 600;
307
+ transition: all 0.3s ease;
308
+ }
309
+
310
+ .code-controls .btn-primary:hover {
311
+ transform: translateY(-1px);
312
+ box-shadow: 0 4px 8px rgba(102, 126, 234, 0.3);
313
+ }
314
+
315
+ .code-controls .btn-primary.analyzing {
316
+ background: linear-gradient(135deg, #94a3b8 0%, #64748b 100%);
317
+ animation: pulse 2s infinite;
318
+ }
319
+
320
+ @keyframes pulse {
321
+ 0% { opacity: 1; }
322
+ 50% { opacity: 0.7; }
323
+ 100% { opacity: 1; }
324
+ }
325
+
326
+ .code-controls .btn-sm {
327
+ padding: 6px 12px;
328
+ font-size: 12px;
329
+ background: #e2e8f0;
330
+ border: 1px solid #cbd5e0;
331
+ border-radius: 4px;
332
+ cursor: pointer;
333
+ transition: all 0.2s;
334
+ }
335
+
336
+ .code-controls .btn-sm:hover {
337
+ background: #cbd5e0;
338
+ }
339
+
340
+ .code-controls select {
341
+ padding: 6px 10px;
342
+ border: 1px solid #cbd5e0;
343
+ border-radius: 4px;
344
+ background: white;
345
+ cursor: pointer;
346
+ font-size: 13px;
347
+ }
348
+
349
+ .code-controls input[type="text"] {
350
+ padding: 6px 10px;
351
+ border: 1px solid #cbd5e0;
352
+ border-radius: 4px;
353
+ width: 200px;
354
+ font-size: 13px;
355
+ }
356
+
357
+ .code-stats {
358
+ display: flex;
359
+ gap: 20px;
360
+ }
361
+
362
+ .code-stats .stat-item {
363
+ display: flex;
364
+ align-items: center;
365
+ gap: 5px;
366
+ }
367
+
368
+ .code-stats .stat-label {
369
+ font-size: 12px;
370
+ color: #718096;
371
+ font-weight: 500;
372
+ }
373
+
374
+ .code-stats .stat-value {
375
+ font-size: 16px;
376
+ font-weight: bold;
377
+ color: #2d3748;
378
+ }
379
+
380
+ /* Code Tree Container */
381
+ .code-tree-container {
382
+ flex: 1;
383
+ background: white;
384
+ border-radius: 8px;
385
+ padding: 20px;
386
+ position: relative;
387
+ overflow: auto;
388
+ box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05);
389
+ }
390
+
391
+ #code-tree {
392
+ width: 100%;
393
+ height: 100%;
394
+ min-height: 500px;
395
+ }
396
+
397
+ /* Progress Bar */
398
+ .code-progress {
399
+ position: absolute;
400
+ top: 50%;
401
+ left: 50%;
402
+ transform: translate(-50%, -50%);
403
+ width: 300px;
404
+ text-align: center;
405
+ background: white;
406
+ padding: 20px;
407
+ border-radius: 8px;
408
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
409
+ }
410
+
411
+ .progress-bar {
412
+ width: 100%;
413
+ height: 8px;
414
+ background: #e2e8f0;
415
+ border-radius: 4px;
416
+ overflow: hidden;
417
+ margin-bottom: 10px;
418
+ }
419
+
420
+ .progress-fill {
421
+ height: 100%;
422
+ background: linear-gradient(90deg, #667eea, #764ba2);
423
+ transition: width 0.3s ease;
424
+ width: 0%;
425
+ }
426
+
427
+ .progress-text {
428
+ font-size: 14px;
429
+ color: #4a5568;
430
+ font-weight: 500;
431
+ }
432
+
433
+ /* Tree Legend - Collapsible and Compact */
434
+ .tree-legend {
435
+ position: fixed;
436
+ bottom: 20px;
437
+ right: 20px;
438
+ background: rgba(255, 255, 255, 0.98);
439
+ border: 1px solid #e2e8f0;
440
+ border-radius: 6px;
441
+ padding: 8px;
442
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
443
+ z-index: 1000;
444
+ max-width: 200px;
445
+ font-size: 12px;
446
+ }
447
+
448
+ .tree-legend.collapsed {
449
+ display: none;
450
+ }
451
+
452
+ .legend-close {
453
+ position: absolute;
454
+ top: 4px;
455
+ right: 4px;
456
+ background: none;
457
+ border: none;
458
+ color: #94a3b8;
459
+ cursor: pointer;
460
+ font-size: 14px;
461
+ padding: 2px 6px;
462
+ line-height: 1;
463
+ }
464
+
465
+ .legend-close:hover {
466
+ color: #475569;
467
+ }
468
+
469
+ .legend-content {
470
+ display: flex;
471
+ gap: 20px;
472
+ }
473
+
474
+ .legend-column {
475
+ display: flex;
476
+ flex-direction: column;
477
+ gap: 4px;
478
+ }
479
+
480
+ .legend-item {
481
+ display: flex;
482
+ align-items: center;
483
+ gap: 4px;
484
+ font-size: 11px;
485
+ color: #4a5568;
486
+ white-space: nowrap;
487
+ }
488
+
489
+ .legend-icon {
490
+ font-size: 14px;
491
+ }
492
+
493
+ .legend-icon.module {
494
+ color: #8b5cf6;
495
+ }
496
+
497
+ .legend-icon.class {
498
+ color: #3b82f6;
499
+ }
500
+
501
+ .legend-icon.function {
502
+ color: #f59e0b;
503
+ }
504
+
505
+ .legend-icon.method {
506
+ color: #10b981;
507
+ }
508
+
509
+ .legend-icon.complexity-low {
510
+ color: #10b981;
511
+ }
512
+
513
+ .legend-icon.complexity-medium {
514
+ color: #f59e0b;
515
+ }
516
+
517
+ .legend-icon.complexity-high {
518
+ color: #ef4444;
519
+ }
520
+
521
+ /* Breadcrumb */
522
+ /* Breadcrumb Ticker */
523
+ .code-breadcrumb {
524
+ padding: 8px 12px;
525
+ background: linear-gradient(90deg, #f8f9fa, white);
526
+ border-radius: 6px;
527
+ margin-top: 15px;
528
+ font-size: 12px;
529
+ color: #4a5568;
530
+ font-family: 'SF Mono', Monaco, 'Cascadia Code', monospace;
531
+ box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05);
532
+ overflow: hidden;
533
+ position: relative;
534
+ min-height: 32px;
535
+ }
536
+
537
+ .breadcrumb-ticker {
538
+ display: flex;
539
+ align-items: center;
540
+ white-space: nowrap;
541
+ transition: all 0.3s ease-out;
542
+ }
543
+
544
+ #breadcrumb-content {
545
+ display: inline-block;
546
+ font-size: 11px;
547
+ color: #475569;
548
+ transition: opacity 0.3s;
549
+ }
550
+
551
+ /* Event type styling in ticker */
552
+ .ticker-event {
553
+ animation: slideIn 0.3s ease-in;
554
+ }
555
+
556
+ .ticker-file {
557
+ color: #3b82f6;
558
+ }
559
+
560
+ .ticker-node {
561
+ color: #10b981;
562
+ }
563
+
564
+ .ticker-progress {
565
+ color: #8b5cf6;
566
+ }
567
+
568
+ .ticker-error {
569
+ color: #ef4444;
570
+ }
571
+
572
+ @keyframes slideIn {
573
+ from {
574
+ opacity: 0;
575
+ transform: translateX(-10px);
576
+ }
577
+ to {
578
+ opacity: 1;
579
+ transform: translateX(0);
580
+ }
581
+ }
582
+
583
+ /* D3 Tree Styles */
584
+ .code-node {
585
+ cursor: pointer;
586
+ }
587
+
588
+ .code-node circle {
589
+ stroke-width: 2px;
590
+ transition: all 0.3s ease;
591
+ }
592
+
593
+ .code-node circle:hover {
594
+ stroke-width: 3px;
595
+ filter: brightness(1.1);
596
+ }
597
+
598
+ .code-node text {
599
+ font: 12px sans-serif;
600
+ pointer-events: none;
601
+ }
602
+
603
+ .code-node.module circle {
604
+ fill: #8b5cf6;
605
+ stroke: #7c3aed;
606
+ }
607
+
608
+ .code-node.class circle {
609
+ fill: #3b82f6;
610
+ stroke: #2563eb;
611
+ }
612
+
613
+ .code-node.function circle {
614
+ fill: #f59e0b;
615
+ stroke: #d97706;
616
+ }
617
+
618
+ .code-node.method circle {
619
+ fill: #10b981;
620
+ stroke: #059669;
621
+ }
622
+
623
+ .code-link {
624
+ fill: none;
625
+ stroke: #cbd5e0;
626
+ stroke-width: 1.5px;
627
+ }
628
+
629
+ /* Complexity-based coloring */
630
+ .code-node.complexity-low circle {
631
+ stroke: #10b981 !important;
632
+ }
633
+
634
+ .code-node.complexity-medium circle {
635
+ stroke: #f59e0b !important;
636
+ }
637
+
638
+ .code-node.complexity-high circle {
639
+ stroke: #ef4444 !important;
640
+ }
641
+
642
+ /* Highlighted nodes (search results) */
643
+ .code-node.highlighted circle {
644
+ stroke: #ec4899 !important;
645
+ stroke-width: 3px;
646
+ filter: drop-shadow(0 0 8px rgba(236, 72, 153, 0.5));
647
+ }
648
+
649
+ .code-node.highlighted text {
650
+ font-weight: bold;
651
+ fill: #ec4899;
652
+ }
653
+
654
+ /* Collapsed node indicator */
655
+ .code-node.collapsed circle {
656
+ fill: #e2e8f0 !important;
657
+ }
658
+
659
+ /* Active/selected node */
660
+ .code-node.selected circle {
661
+ stroke: #9333ea !important;
662
+ stroke-width: 3px;
663
+ filter: drop-shadow(0 0 12px rgba(147, 51, 234, 0.5));
664
+ }
665
+
666
+ /* Tooltips */
667
+ .code-tooltip {
668
+ position: absolute;
669
+ padding: 8px 12px;
670
+ background: rgba(45, 55, 72, 0.95);
671
+ color: white;
672
+ font-size: 12px;
673
+ border-radius: 4px;
674
+ pointer-events: none;
675
+ white-space: nowrap;
676
+ z-index: 1000;
677
+ }
678
+
679
+ /* Code Viewer Modal Styles */
680
+ .code-viewer-modal {
681
+ display: none;
682
+ position: fixed;
683
+ top: 0;
684
+ left: 0;
685
+ width: 100%;
686
+ height: 100%;
687
+ background: rgba(0, 0, 0, 0.5);
688
+ z-index: 10000;
689
+ animation: fadeIn 0.3s ease;
690
+ }
691
+
692
+ .code-viewer-modal.show {
693
+ display: flex;
694
+ align-items: center;
695
+ justify-content: center;
696
+ }
697
+
698
+ .code-viewer-content {
699
+ background: white;
700
+ width: 90%;
701
+ max-width: 1200px;
702
+ height: 80%;
703
+ border-radius: 12px;
704
+ display: flex;
705
+ flex-direction: column;
706
+ box-shadow: 0 20px 60px rgba(0, 0, 0, 0.3);
707
+ animation: slideUp 0.3s ease;
708
+ }
709
+
710
+ .code-viewer-header {
711
+ padding: 20px;
712
+ border-bottom: 1px solid #e2e8f0;
713
+ display: flex;
714
+ justify-content: space-between;
715
+ align-items: center;
716
+ }
717
+
718
+ .code-viewer-title {
719
+ font-size: 16px;
720
+ font-weight: 600;
721
+ color: #2d3748;
722
+ font-family: 'SF Mono', Monaco, 'Cascadia Code', monospace;
723
+ }
724
+
725
+ .code-viewer-info {
726
+ display: flex;
727
+ gap: 20px;
728
+ font-size: 12px;
729
+ color: #718096;
730
+ }
731
+
732
+ .code-viewer-close {
733
+ background: none;
734
+ border: none;
735
+ font-size: 24px;
736
+ color: #718096;
737
+ cursor: pointer;
738
+ padding: 0;
739
+ width: 30px;
740
+ height: 30px;
741
+ display: flex;
742
+ align-items: center;
743
+ justify-content: center;
744
+ border-radius: 4px;
745
+ transition: all 0.2s;
746
+ }
747
+
748
+ .code-viewer-close:hover {
749
+ background: #f7fafc;
750
+ color: #2d3748;
751
+ }
752
+
753
+ .code-viewer-body {
754
+ flex: 1;
755
+ overflow: auto;
756
+ padding: 20px;
757
+ background: #282c34;
758
+ }
759
+
760
+ .code-viewer-code {
761
+ margin: 0;
762
+ min-height: 100%;
763
+ }
764
+
765
+ .code-viewer-navigation {
766
+ padding: 15px 20px;
767
+ border-top: 1px solid #e2e8f0;
768
+ display: flex;
769
+ justify-content: space-between;
770
+ background: #f8f9fa;
771
+ }
772
+
773
+ .code-nav-button {
774
+ padding: 8px 16px;
775
+ background: white;
776
+ border: 1px solid #cbd5e0;
777
+ border-radius: 4px;
778
+ cursor: pointer;
779
+ font-size: 13px;
780
+ transition: all 0.2s;
781
+ display: flex;
782
+ align-items: center;
783
+ gap: 5px;
784
+ }
785
+
786
+ .code-nav-button:hover:not(:disabled) {
787
+ background: #667eea;
788
+ color: white;
789
+ border-color: #667eea;
790
+ }
791
+
792
+ .code-nav-button:disabled {
793
+ opacity: 0.5;
794
+ cursor: not-allowed;
795
+ }
796
+
797
+ /* Animations */
798
+ @keyframes fadeIn {
799
+ from {
800
+ opacity: 0;
801
+ }
802
+ to {
803
+ opacity: 1;
804
+ }
805
+ }
806
+
807
+ @keyframes slideUp {
808
+ from {
809
+ transform: translateY(20px);
810
+ opacity: 0;
811
+ }
812
+ to {
813
+ transform: translateY(0);
814
+ opacity: 1;
815
+ }
816
+ }
817
+
818
+ /* Responsive adjustments */
819
+ @media (max-width: 768px) {
820
+ .code-header {
821
+ flex-direction: column;
822
+ gap: 15px;
823
+ }
824
+
825
+ .code-controls {
826
+ width: 100%;
827
+ justify-content: space-between;
828
+ flex-wrap: wrap;
829
+ }
830
+
831
+ .code-stats {
832
+ width: 100%;
833
+ justify-content: space-around;
834
+ }
835
+
836
+ .tree-legend {
837
+ position: static;
838
+ margin-top: 20px;
839
+ max-width: 100%;
840
+ }
841
+
842
+ .code-viewer-content {
843
+ width: 95%;
844
+ height: 90%;
845
+ }
846
+ }