claude-mpm 4.1.8__py3-none-any.whl → 4.1.11__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 (111) hide show
  1. claude_mpm/VERSION +1 -1
  2. claude_mpm/agents/INSTRUCTIONS.md +26 -1
  3. claude_mpm/agents/agents_metadata.py +57 -0
  4. claude_mpm/agents/templates/.claude-mpm/memories/README.md +17 -0
  5. claude_mpm/agents/templates/.claude-mpm/memories/engineer_memories.md +3 -0
  6. claude_mpm/agents/templates/agent-manager.json +263 -17
  7. claude_mpm/agents/templates/agentic_coder_optimizer.json +222 -0
  8. claude_mpm/agents/templates/code_analyzer.json +18 -8
  9. claude_mpm/agents/templates/engineer.json +1 -1
  10. claude_mpm/agents/templates/logs/prompts/agent_engineer_20250826_014258_728.md +39 -0
  11. claude_mpm/agents/templates/qa.json +1 -1
  12. claude_mpm/agents/templates/research.json +1 -1
  13. claude_mpm/cli/__init__.py +15 -0
  14. claude_mpm/cli/commands/__init__.py +6 -0
  15. claude_mpm/cli/commands/analyze.py +548 -0
  16. claude_mpm/cli/commands/analyze_code.py +524 -0
  17. claude_mpm/cli/commands/configure.py +78 -28
  18. claude_mpm/cli/commands/configure_tui.py +62 -60
  19. claude_mpm/cli/commands/dashboard.py +288 -0
  20. claude_mpm/cli/commands/debug.py +1386 -0
  21. claude_mpm/cli/commands/mpm_init.py +427 -0
  22. claude_mpm/cli/commands/mpm_init_handler.py +83 -0
  23. claude_mpm/cli/parsers/analyze_code_parser.py +170 -0
  24. claude_mpm/cli/parsers/analyze_parser.py +135 -0
  25. claude_mpm/cli/parsers/base_parser.py +44 -0
  26. claude_mpm/cli/parsers/dashboard_parser.py +113 -0
  27. claude_mpm/cli/parsers/debug_parser.py +319 -0
  28. claude_mpm/cli/parsers/mpm_init_parser.py +122 -0
  29. claude_mpm/constants.py +13 -1
  30. claude_mpm/core/framework_loader.py +148 -6
  31. claude_mpm/core/log_manager.py +16 -13
  32. claude_mpm/core/logger.py +1 -1
  33. claude_mpm/core/unified_agent_registry.py +1 -1
  34. claude_mpm/dashboard/.claude-mpm/socketio-instances.json +1 -0
  35. claude_mpm/dashboard/analysis_runner.py +455 -0
  36. claude_mpm/dashboard/static/built/components/activity-tree.js +2 -0
  37. claude_mpm/dashboard/static/built/components/agent-inference.js +1 -1
  38. claude_mpm/dashboard/static/built/components/code-tree.js +2 -0
  39. claude_mpm/dashboard/static/built/components/code-viewer.js +2 -0
  40. claude_mpm/dashboard/static/built/components/event-viewer.js +1 -1
  41. claude_mpm/dashboard/static/built/components/file-tool-tracker.js +1 -1
  42. claude_mpm/dashboard/static/built/components/module-viewer.js +1 -1
  43. claude_mpm/dashboard/static/built/components/session-manager.js +1 -1
  44. claude_mpm/dashboard/static/built/components/working-directory.js +1 -1
  45. claude_mpm/dashboard/static/built/dashboard.js +1 -1
  46. claude_mpm/dashboard/static/built/socket-client.js +1 -1
  47. claude_mpm/dashboard/static/css/activity.css +549 -0
  48. claude_mpm/dashboard/static/css/code-tree.css +1175 -0
  49. claude_mpm/dashboard/static/css/dashboard.css +245 -0
  50. claude_mpm/dashboard/static/dist/components/activity-tree.js +2 -0
  51. claude_mpm/dashboard/static/dist/components/code-tree.js +2 -0
  52. claude_mpm/dashboard/static/dist/components/code-viewer.js +2 -0
  53. claude_mpm/dashboard/static/dist/components/event-viewer.js +1 -1
  54. claude_mpm/dashboard/static/dist/components/session-manager.js +1 -1
  55. claude_mpm/dashboard/static/dist/components/working-directory.js +1 -1
  56. claude_mpm/dashboard/static/dist/dashboard.js +1 -1
  57. claude_mpm/dashboard/static/dist/socket-client.js +1 -1
  58. claude_mpm/dashboard/static/js/components/activity-tree.js +1338 -0
  59. claude_mpm/dashboard/static/js/components/code-tree.js +2535 -0
  60. claude_mpm/dashboard/static/js/components/code-viewer.js +480 -0
  61. claude_mpm/dashboard/static/js/components/event-viewer.js +59 -9
  62. claude_mpm/dashboard/static/js/components/session-manager.js +40 -4
  63. claude_mpm/dashboard/static/js/components/socket-manager.js +12 -0
  64. claude_mpm/dashboard/static/js/components/ui-state-manager.js +4 -0
  65. claude_mpm/dashboard/static/js/components/working-directory.js +17 -1
  66. claude_mpm/dashboard/static/js/dashboard.js +51 -0
  67. claude_mpm/dashboard/static/js/socket-client.js +465 -29
  68. claude_mpm/dashboard/templates/index.html +182 -4
  69. claude_mpm/hooks/claude_hooks/hook_handler.py +182 -5
  70. claude_mpm/hooks/claude_hooks/installer.py +386 -113
  71. claude_mpm/scripts/claude-hook-handler.sh +161 -0
  72. claude_mpm/scripts/socketio_daemon.py +121 -8
  73. claude_mpm/services/agents/deployment/agent_lifecycle_manager_refactored.py +2 -2
  74. claude_mpm/services/agents/deployment/agent_record_service.py +1 -2
  75. claude_mpm/services/agents/memory/memory_format_service.py +1 -3
  76. claude_mpm/services/cli/agent_cleanup_service.py +1 -5
  77. claude_mpm/services/cli/agent_dependency_service.py +1 -1
  78. claude_mpm/services/cli/agent_validation_service.py +3 -4
  79. claude_mpm/services/cli/dashboard_launcher.py +2 -3
  80. claude_mpm/services/cli/startup_checker.py +0 -11
  81. claude_mpm/services/core/cache_manager.py +1 -3
  82. claude_mpm/services/core/path_resolver.py +1 -4
  83. claude_mpm/services/core/service_container.py +2 -2
  84. claude_mpm/services/diagnostics/checks/instructions_check.py +1 -2
  85. claude_mpm/services/infrastructure/monitoring/__init__.py +11 -11
  86. claude_mpm/services/infrastructure/monitoring.py +11 -11
  87. claude_mpm/services/project/architecture_analyzer.py +1 -1
  88. claude_mpm/services/project/dependency_analyzer.py +4 -4
  89. claude_mpm/services/project/language_analyzer.py +3 -3
  90. claude_mpm/services/project/metrics_collector.py +3 -6
  91. claude_mpm/services/socketio/event_normalizer.py +64 -0
  92. claude_mpm/services/socketio/handlers/__init__.py +2 -0
  93. claude_mpm/services/socketio/handlers/code_analysis.py +672 -0
  94. claude_mpm/services/socketio/handlers/registry.py +2 -0
  95. claude_mpm/services/socketio/server/connection_manager.py +6 -4
  96. claude_mpm/services/socketio/server/core.py +100 -11
  97. claude_mpm/services/socketio/server/main.py +8 -2
  98. claude_mpm/services/visualization/__init__.py +19 -0
  99. claude_mpm/services/visualization/mermaid_generator.py +938 -0
  100. claude_mpm/tools/__main__.py +208 -0
  101. claude_mpm/tools/code_tree_analyzer.py +1596 -0
  102. claude_mpm/tools/code_tree_builder.py +631 -0
  103. claude_mpm/tools/code_tree_events.py +416 -0
  104. claude_mpm/tools/socketio_debug.py +671 -0
  105. {claude_mpm-4.1.8.dist-info → claude_mpm-4.1.11.dist-info}/METADATA +2 -1
  106. {claude_mpm-4.1.8.dist-info → claude_mpm-4.1.11.dist-info}/RECORD +110 -74
  107. claude_mpm/agents/schema/agent_schema.json +0 -314
  108. {claude_mpm-4.1.8.dist-info → claude_mpm-4.1.11.dist-info}/WHEEL +0 -0
  109. {claude_mpm-4.1.8.dist-info → claude_mpm-4.1.11.dist-info}/entry_points.txt +0 -0
  110. {claude_mpm-4.1.8.dist-info → claude_mpm-4.1.11.dist-info}/licenses/LICENSE +0 -0
  111. {claude_mpm-4.1.8.dist-info → claude_mpm-4.1.11.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,1175 @@
1
+ /* Code Tree Styles */
2
+
3
+ .code-container {
4
+ height: 100%;
5
+ display: flex;
6
+ flex-direction: column;
7
+ background: #f8f9fa;
8
+ }
9
+
10
+ /* Advanced Options - Always Visible */
11
+ .code-advanced-options-visible {
12
+ background: white;
13
+ border-bottom: 1px solid #e2e8f0;
14
+ padding: 8px 12px;
15
+ }
16
+
17
+ .code-advanced-options-visible .advanced-content {
18
+ display: flex;
19
+ justify-content: space-between;
20
+ align-items: center;
21
+ gap: 20px;
22
+ }
23
+
24
+ .code-advanced-options-visible .option-group {
25
+ display: flex;
26
+ align-items: center;
27
+ gap: 10px;
28
+ }
29
+
30
+ .code-advanced-options-visible .option-group label {
31
+ display: inline-flex;
32
+ align-items: center;
33
+ gap: 4px;
34
+ font-size: 13px;
35
+ color: #4a5568;
36
+ }
37
+
38
+ .code-advanced-options-visible .option-group input[type="checkbox"] {
39
+ margin: 0;
40
+ }
41
+
42
+ /* Compact Header Layout */
43
+ .code-header-compact {
44
+ display: flex;
45
+ justify-content: space-between;
46
+ align-items: center;
47
+ padding: 8px 12px;
48
+ background: white;
49
+ border-bottom: 1px solid #e2e8f0;
50
+ gap: 15px;
51
+ min-height: 40px;
52
+ }
53
+
54
+ .header-left,
55
+ .header-center,
56
+ .header-right {
57
+ display: flex;
58
+ align-items: center;
59
+ gap: 8px;
60
+ }
61
+
62
+ .header-left {
63
+ flex: 0 1 auto;
64
+ }
65
+
66
+ .header-center {
67
+ flex: 0 0 auto;
68
+ }
69
+
70
+ .header-right {
71
+ flex: 0 1 auto;
72
+ justify-content: flex-end;
73
+ }
74
+
75
+ /* Compact Input Elements */
76
+ .path-input-compact {
77
+ width: 150px;
78
+ padding: 4px 8px;
79
+ border: 1px solid #e2e8f0;
80
+ border-radius: 4px;
81
+ font-size: 13px;
82
+ }
83
+
84
+ .btn-compact {
85
+ padding: 4px 8px;
86
+ border: 1px solid #e2e8f0;
87
+ background: white;
88
+ border-radius: 4px;
89
+ cursor: pointer;
90
+ font-size: 14px;
91
+ transition: all 0.2s;
92
+ min-width: 28px;
93
+ height: 28px;
94
+ display: inline-flex;
95
+ align-items: center;
96
+ justify-content: center;
97
+ }
98
+
99
+ .btn-compact:hover {
100
+ background: #f8f9fa;
101
+ border-color: #94a3b8;
102
+ }
103
+
104
+ .btn-compact.btn-primary {
105
+ background: linear-gradient(135deg, #3b82f6 0%, #2563eb 100%);
106
+ color: white;
107
+ border-color: #3b82f6;
108
+ font-weight: 500;
109
+ }
110
+
111
+ .btn-compact.btn-primary:hover {
112
+ background: linear-gradient(135deg, #2563eb 0%, #1d4ed8 100%);
113
+ transform: translateY(-1px);
114
+ box-shadow: 0 2px 4px rgba(59, 130, 246, 0.3);
115
+ }
116
+
117
+ .btn-compact.btn-primary:disabled {
118
+ background: #94a3b8;
119
+ border-color: #94a3b8;
120
+ cursor: not-allowed;
121
+ opacity: 0.7;
122
+ }
123
+
124
+ .btn-compact.btn-primary.analyzing {
125
+ background: linear-gradient(135deg, #f59e0b 0%, #f97316 100%);
126
+ border-color: #f59e0b;
127
+ animation: pulse 1.5s infinite;
128
+ position: relative;
129
+ }
130
+
131
+ .btn-compact.btn-primary.analyzing::after {
132
+ content: '';
133
+ position: absolute;
134
+ top: 0;
135
+ left: 0;
136
+ right: 0;
137
+ bottom: 0;
138
+ background: linear-gradient(90deg, transparent 0%, rgba(255,255,255,0.3) 50%, transparent 100%);
139
+ animation: shimmer 2s infinite;
140
+ }
141
+
142
+ @keyframes shimmer {
143
+ 0% { transform: translateX(-100%); }
144
+ 100% { transform: translateX(100%); }
145
+ }
146
+
147
+ .btn-compact.btn-danger {
148
+ background: #ef4444;
149
+ color: white;
150
+ border-color: #ef4444;
151
+ }
152
+
153
+ .btn-compact.btn-danger:hover {
154
+ background: #dc2626;
155
+ transform: translateY(-1px);
156
+ box-shadow: 0 2px 4px rgba(239, 68, 68, 0.3);
157
+ }
158
+
159
+ .stat-compact {
160
+ font-size: 13px;
161
+ color: #64748b;
162
+ white-space: nowrap;
163
+ }
164
+
165
+ .stat-compact span {
166
+ font-weight: 600;
167
+ color: #1e293b;
168
+ }
169
+
170
+ .select-compact {
171
+ padding: 4px 8px;
172
+ border: 1px solid #e2e8f0;
173
+ border-radius: 4px;
174
+ font-size: 13px;
175
+ background: white;
176
+ }
177
+
178
+ .search-compact {
179
+ width: 120px;
180
+ padding: 4px 8px;
181
+ border: 1px solid #e2e8f0;
182
+ border-radius: 4px;
183
+ font-size: 13px;
184
+ }
185
+
186
+ /* Advanced Options (collapsible) */
187
+ .code-advanced-options {
188
+ background: #f8f9fa;
189
+ border-bottom: 1px solid #e2e8f0;
190
+ font-size: 13px;
191
+ }
192
+
193
+ .code-advanced-options summary {
194
+ padding: 6px 12px;
195
+ cursor: pointer;
196
+ user-select: none;
197
+ color: #64748b;
198
+ font-size: 12px;
199
+ }
200
+
201
+ .code-advanced-options summary:hover {
202
+ color: #1e293b;
203
+ }
204
+
205
+ .advanced-content {
206
+ padding: 8px 12px;
207
+ display: flex;
208
+ gap: 20px;
209
+ }
210
+
211
+ .option-group {
212
+ display: flex;
213
+ align-items: center;
214
+ gap: 10px;
215
+ }
216
+
217
+ .option-group label {
218
+ display: flex;
219
+ align-items: center;
220
+ gap: 4px;
221
+ font-size: 12px;
222
+ color: #475569;
223
+ }
224
+
225
+ .input-compact {
226
+ width: 60px;
227
+ padding: 2px 6px;
228
+ border: 1px solid #e2e8f0;
229
+ border-radius: 3px;
230
+ font-size: 12px;
231
+ }
232
+
233
+ /* Analysis Options Panel - OLD STYLES DEPRECATED */
234
+ .code-analysis-options {
235
+ padding: 15px;
236
+ background: white;
237
+ border-bottom: 1px solid #e2e8f0;
238
+ }
239
+
240
+ .analysis-row {
241
+ display: flex;
242
+ align-items: center;
243
+ gap: 15px;
244
+ margin-bottom: 10px;
245
+ }
246
+
247
+ .analysis-row:last-child {
248
+ margin-bottom: 0;
249
+ }
250
+
251
+ .analysis-row label {
252
+ font-weight: 500;
253
+ color: #64748b;
254
+ min-width: 100px;
255
+ }
256
+
257
+ .analysis-row input[type="text"],
258
+ .analysis-row input[type="number"] {
259
+ flex: 1;
260
+ padding: 6px 10px;
261
+ background: #f8f9fa;
262
+ border: 1px solid #cbd5e0;
263
+ border-radius: 4px;
264
+ color: #1e293b;
265
+ }
266
+
267
+ .language-selection {
268
+ display: flex;
269
+ align-items: center;
270
+ gap: 15px;
271
+ flex: 1;
272
+ }
273
+
274
+ .language-selection label {
275
+ display: flex;
276
+ align-items: center;
277
+ gap: 5px;
278
+ min-width: auto;
279
+ cursor: pointer;
280
+ }
281
+
282
+ .language-checkbox {
283
+ cursor: pointer;
284
+ }
285
+
286
+ .analysis-options {
287
+ display: flex;
288
+ align-items: center;
289
+ gap: 10px;
290
+ }
291
+
292
+ .analysis-options input[type="number"] {
293
+ width: 80px;
294
+ }
295
+
296
+ #cancel-analysis {
297
+ margin-left: 10px;
298
+ }
299
+
300
+ .btn-danger {
301
+ background: #ef4444;
302
+ color: white;
303
+ border: none;
304
+ padding: 8px 16px;
305
+ border-radius: 6px;
306
+ cursor: pointer;
307
+ font-weight: 600;
308
+ transition: all 0.3s ease;
309
+ }
310
+
311
+ .btn-danger:hover {
312
+ background: #dc2626;
313
+ }
314
+
315
+ /* Notification Styles */
316
+ .code-notification {
317
+ position: fixed;
318
+ top: 20px;
319
+ right: 20px;
320
+ padding: 12px 20px;
321
+ border-radius: 4px;
322
+ background: #475569;
323
+ color: white;
324
+ box-shadow: 0 2px 10px rgba(0, 0, 0, 0.2);
325
+ z-index: 1000;
326
+ display: none;
327
+ animation: slideIn 0.3s ease;
328
+ }
329
+
330
+ .code-notification.success {
331
+ background: #10b981;
332
+ }
333
+
334
+ .code-notification.error {
335
+ background: #ef4444;
336
+ }
337
+
338
+ .code-notification.warning {
339
+ background: #f59e0b;
340
+ }
341
+
342
+ .code-notification.info {
343
+ background: #3b82f6;
344
+ }
345
+
346
+ @keyframes slideIn {
347
+ from {
348
+ transform: translateX(100%);
349
+ opacity: 0;
350
+ }
351
+ to {
352
+ transform: translateX(0);
353
+ opacity: 1;
354
+ }
355
+ }
356
+
357
+ .code-header {
358
+ display: flex;
359
+ justify-content: space-between;
360
+ align-items: center;
361
+ padding: 10px 15px;
362
+ background: white;
363
+ border-radius: 8px;
364
+ margin-bottom: 15px;
365
+ box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05);
366
+ }
367
+
368
+ .code-controls {
369
+ display: flex;
370
+ gap: 10px;
371
+ align-items: center;
372
+ }
373
+
374
+ .code-controls .btn-primary {
375
+ background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
376
+ color: white;
377
+ border: none;
378
+ padding: 8px 16px;
379
+ border-radius: 6px;
380
+ cursor: pointer;
381
+ font-weight: 600;
382
+ transition: all 0.3s ease;
383
+ }
384
+
385
+ .code-controls .btn-primary:hover {
386
+ transform: translateY(-1px);
387
+ box-shadow: 0 4px 8px rgba(102, 126, 234, 0.3);
388
+ }
389
+
390
+ .code-controls .btn-primary.analyzing {
391
+ background: linear-gradient(135deg, #94a3b8 0%, #64748b 100%);
392
+ animation: pulse 2s infinite;
393
+ }
394
+
395
+ @keyframes pulse {
396
+ 0% { opacity: 1; }
397
+ 50% { opacity: 0.7; }
398
+ 100% { opacity: 1; }
399
+ }
400
+
401
+ .code-controls .btn-sm {
402
+ padding: 6px 12px;
403
+ font-size: 12px;
404
+ background: #e2e8f0;
405
+ border: 1px solid #cbd5e0;
406
+ border-radius: 4px;
407
+ cursor: pointer;
408
+ transition: all 0.2s;
409
+ }
410
+
411
+ .code-controls .btn-sm:hover {
412
+ background: #cbd5e0;
413
+ }
414
+
415
+ .code-controls select {
416
+ padding: 6px 10px;
417
+ border: 1px solid #cbd5e0;
418
+ border-radius: 4px;
419
+ background: white;
420
+ cursor: pointer;
421
+ font-size: 13px;
422
+ }
423
+
424
+ .code-controls input[type="text"] {
425
+ padding: 6px 10px;
426
+ border: 1px solid #cbd5e0;
427
+ border-radius: 4px;
428
+ width: 200px;
429
+ font-size: 13px;
430
+ }
431
+
432
+ .code-stats {
433
+ display: flex;
434
+ gap: 20px;
435
+ }
436
+
437
+ .code-stats .stat-item {
438
+ display: flex;
439
+ align-items: center;
440
+ gap: 5px;
441
+ }
442
+
443
+ .code-stats .stat-label {
444
+ font-size: 12px;
445
+ color: #718096;
446
+ font-weight: 500;
447
+ }
448
+
449
+ .code-stats .stat-value {
450
+ font-size: 16px;
451
+ font-weight: bold;
452
+ color: #2d3748;
453
+ }
454
+
455
+ /* Code Tree Container */
456
+ .code-tree-container {
457
+ flex: 1;
458
+ background: white;
459
+ border-radius: 8px;
460
+ padding: 20px;
461
+ position: relative;
462
+ overflow: auto;
463
+ box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05);
464
+ }
465
+
466
+ /* Loading indicator */
467
+ #code-tree-loading {
468
+ position: absolute;
469
+ top: 50%;
470
+ left: 50%;
471
+ transform: translate(-50%, -50%);
472
+ text-align: center;
473
+ z-index: 100;
474
+ }
475
+
476
+ #code-tree-loading.hidden {
477
+ display: none;
478
+ }
479
+
480
+ .code-tree-spinner {
481
+ width: 50px;
482
+ height: 50px;
483
+ border: 5px solid #e2e8f0;
484
+ border-top: 5px solid #3b82f6;
485
+ border-radius: 50%;
486
+ animation: spin 1s linear infinite;
487
+ margin: 0 auto 15px;
488
+ }
489
+
490
+ @keyframes spin {
491
+ 0% { transform: rotate(0deg); }
492
+ 100% { transform: rotate(360deg); }
493
+ }
494
+
495
+ .code-tree-loading-text {
496
+ font-size: 14px;
497
+ color: #64748b;
498
+ font-weight: 500;
499
+ }
500
+
501
+ #code-tree {
502
+ width: 100%;
503
+ height: 100%;
504
+ min-height: 500px;
505
+ }
506
+
507
+ /* Progress Bar */
508
+ .code-progress {
509
+ position: absolute;
510
+ top: 50%;
511
+ left: 50%;
512
+ transform: translate(-50%, -50%);
513
+ width: 300px;
514
+ text-align: center;
515
+ background: white;
516
+ padding: 20px;
517
+ border-radius: 8px;
518
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
519
+ }
520
+
521
+ .progress-bar {
522
+ width: 100%;
523
+ height: 8px;
524
+ background: #e2e8f0;
525
+ border-radius: 4px;
526
+ overflow: hidden;
527
+ margin-bottom: 10px;
528
+ }
529
+
530
+ .progress-fill {
531
+ height: 100%;
532
+ background: linear-gradient(90deg, #667eea, #764ba2);
533
+ transition: width 0.3s ease;
534
+ width: 0%;
535
+ }
536
+
537
+ .progress-text {
538
+ font-size: 14px;
539
+ color: #4a5568;
540
+ font-weight: 500;
541
+ }
542
+
543
+ /* Tree Legend - Collapsible and Compact */
544
+ .tree-legend {
545
+ position: fixed;
546
+ bottom: 20px;
547
+ right: 20px;
548
+ background: rgba(255, 255, 255, 0.98);
549
+ border: 1px solid #e2e8f0;
550
+ border-radius: 6px;
551
+ padding: 8px;
552
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
553
+ z-index: 1000;
554
+ max-width: 200px;
555
+ font-size: 12px;
556
+ }
557
+
558
+ .tree-legend.collapsed {
559
+ display: none;
560
+ }
561
+
562
+ .legend-close {
563
+ position: absolute;
564
+ top: 4px;
565
+ right: 4px;
566
+ background: none;
567
+ border: none;
568
+ color: #94a3b8;
569
+ cursor: pointer;
570
+ font-size: 14px;
571
+ padding: 2px 6px;
572
+ line-height: 1;
573
+ }
574
+
575
+ .legend-close:hover {
576
+ color: #475569;
577
+ }
578
+
579
+ .legend-content {
580
+ display: flex;
581
+ gap: 20px;
582
+ }
583
+
584
+ .legend-column {
585
+ display: flex;
586
+ flex-direction: column;
587
+ gap: 4px;
588
+ }
589
+
590
+ .legend-item {
591
+ display: flex;
592
+ align-items: center;
593
+ gap: 4px;
594
+ font-size: 11px;
595
+ color: #4a5568;
596
+ white-space: nowrap;
597
+ }
598
+
599
+ .legend-icon {
600
+ font-size: 14px;
601
+ }
602
+
603
+ .legend-icon.module {
604
+ color: #8b5cf6;
605
+ }
606
+
607
+ .legend-icon.class {
608
+ color: #3b82f6;
609
+ }
610
+
611
+ .legend-icon.function {
612
+ color: #f59e0b;
613
+ }
614
+
615
+ .legend-icon.method {
616
+ color: #10b981;
617
+ }
618
+
619
+ .legend-icon.complexity-low {
620
+ color: #10b981;
621
+ }
622
+
623
+ .legend-icon.complexity-medium {
624
+ color: #f59e0b;
625
+ }
626
+
627
+ .legend-icon.complexity-high {
628
+ color: #ef4444;
629
+ }
630
+
631
+ /* Breadcrumb */
632
+ /* Breadcrumb Ticker */
633
+ .code-breadcrumb {
634
+ padding: 8px 12px;
635
+ background: linear-gradient(90deg, #f8f9fa, white);
636
+ border-radius: 6px;
637
+ margin-top: 15px;
638
+ font-size: 12px;
639
+ color: #4a5568;
640
+ font-family: 'SF Mono', Monaco, 'Cascadia Code', monospace;
641
+ box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05);
642
+ overflow: hidden;
643
+ position: relative;
644
+ min-height: 32px;
645
+ }
646
+
647
+ .breadcrumb-ticker {
648
+ display: flex;
649
+ align-items: center;
650
+ white-space: nowrap;
651
+ transition: all 0.3s ease-out;
652
+ }
653
+
654
+ #breadcrumb-content {
655
+ display: inline-block;
656
+ font-size: 11px;
657
+ color: #475569;
658
+ transition: opacity 0.3s;
659
+ }
660
+
661
+ /* Event type styling in ticker */
662
+ .ticker-event {
663
+ animation: slideIn 0.3s ease-in;
664
+ }
665
+
666
+ .ticker-file {
667
+ color: #3b82f6;
668
+ }
669
+
670
+ .ticker-node {
671
+ color: #10b981;
672
+ }
673
+
674
+ .ticker-progress {
675
+ color: #8b5cf6;
676
+ }
677
+
678
+ .ticker-success {
679
+ color: #10b981;
680
+ font-weight: 500;
681
+ }
682
+
683
+ .ticker-error {
684
+ color: #ef4444;
685
+ }
686
+
687
+ @keyframes slideIn {
688
+ from {
689
+ opacity: 0;
690
+ transform: translateX(-10px);
691
+ }
692
+ to {
693
+ opacity: 1;
694
+ transform: translateX(0);
695
+ }
696
+ }
697
+
698
+ /* D3 Tree Styles */
699
+ .code-node {
700
+ cursor: pointer;
701
+ }
702
+
703
+ .code-node circle {
704
+ stroke-width: 2px;
705
+ transition: all 0.3s ease;
706
+ }
707
+
708
+ .code-node circle:hover {
709
+ stroke-width: 3px;
710
+ filter: brightness(1.1);
711
+ }
712
+
713
+ /* Visualization Controls */
714
+ .viz-controls {
715
+ position: absolute;
716
+ top: 10px;
717
+ left: 10px;
718
+ z-index: 100;
719
+ }
720
+
721
+ .layout-toggle {
722
+ cursor: pointer;
723
+ transition: all 0.2s;
724
+ }
725
+
726
+ .layout-toggle:hover rect {
727
+ opacity: 1;
728
+ filter: brightness(1.1);
729
+ }
730
+
731
+ /* Radial layout specific styles */
732
+ .radial-layout .link {
733
+ fill: none;
734
+ stroke: #cbd5e0;
735
+ stroke-width: 1.5px;
736
+ opacity: 0.6;
737
+ }
738
+
739
+ .radial-layout .node text {
740
+ font: 11px sans-serif;
741
+ text-anchor: middle;
742
+ }
743
+
744
+ .radial-layout .node.root text {
745
+ font-size: 14px;
746
+ font-weight: bold;
747
+ }
748
+
749
+ .code-node text {
750
+ font: 12px sans-serif;
751
+ pointer-events: none;
752
+ }
753
+
754
+ .code-node.module circle {
755
+ fill: #8b5cf6;
756
+ stroke: #7c3aed;
757
+ }
758
+
759
+ .code-node.class circle {
760
+ fill: #3b82f6;
761
+ stroke: #2563eb;
762
+ }
763
+
764
+ .code-node.function circle {
765
+ fill: #f59e0b;
766
+ stroke: #d97706;
767
+ }
768
+
769
+ .code-node.method circle {
770
+ fill: #10b981;
771
+ stroke: #059669;
772
+ }
773
+
774
+ .code-link {
775
+ fill: none;
776
+ stroke: #cbd5e0;
777
+ stroke-width: 1.5px;
778
+ }
779
+
780
+ /* Complexity-based coloring */
781
+ .code-node.complexity-low circle {
782
+ stroke: #10b981 !important;
783
+ }
784
+
785
+ .code-node.complexity-medium circle {
786
+ stroke: #f59e0b !important;
787
+ }
788
+
789
+ .code-node.complexity-high circle {
790
+ stroke: #ef4444 !important;
791
+ }
792
+
793
+ /* Highlighted nodes (search results) */
794
+ .code-node.highlighted circle {
795
+ stroke: #ec4899 !important;
796
+ stroke-width: 3px;
797
+ filter: drop-shadow(0 0 8px rgba(236, 72, 153, 0.5));
798
+ }
799
+
800
+ .code-node.highlighted text {
801
+ font-weight: bold;
802
+ fill: #ec4899;
803
+ }
804
+
805
+ /* Collapsed node indicator */
806
+ .code-node.collapsed circle {
807
+ fill: #e2e8f0 !important;
808
+ }
809
+
810
+ /* Active/selected node */
811
+ .code-node.selected circle {
812
+ stroke: #9333ea !important;
813
+ stroke-width: 3px;
814
+ filter: drop-shadow(0 0 12px rgba(147, 51, 234, 0.5));
815
+ }
816
+
817
+ /* Active node styling (larger icon) */
818
+ .node-circle.active {
819
+ stroke: #3b82f6 !important;
820
+ stroke-width: 3px;
821
+ filter: drop-shadow(0 0 8px rgba(59, 130, 246, 0.5));
822
+ transition: all 0.3s ease;
823
+ }
824
+
825
+ /* Parent context styling */
826
+ .node-circle.parent-context {
827
+ stroke: #10b981 !important;
828
+ stroke-width: 2px;
829
+ opacity: 0.8;
830
+ }
831
+
832
+ /* Loading pulse animation */
833
+ @keyframes nodePulse {
834
+ 0% {
835
+ transform: scale(1);
836
+ opacity: 1;
837
+ }
838
+ 50% {
839
+ transform: scale(1.3);
840
+ opacity: 0.6;
841
+ }
842
+ 100% {
843
+ transform: scale(1);
844
+ opacity: 1;
845
+ }
846
+ }
847
+
848
+ .node-circle.loading-pulse {
849
+ animation: nodePulse 1.2s ease-in-out infinite;
850
+ stroke: #f59e0b !important;
851
+ fill: #fef3c7 !important;
852
+ }
853
+
854
+ /* Tooltips */
855
+ .code-tooltip {
856
+ position: absolute;
857
+ padding: 8px 12px;
858
+ background: rgba(45, 55, 72, 0.95);
859
+ color: white;
860
+ font-size: 12px;
861
+ border-radius: 4px;
862
+ pointer-events: none;
863
+ white-space: nowrap;
864
+ z-index: 1000;
865
+ }
866
+
867
+ /* Code tree notifications */
868
+ .code-tree-notification {
869
+ position: absolute;
870
+ top: 10px;
871
+ right: 10px;
872
+ padding: 12px 20px;
873
+ border-radius: 6px;
874
+ background: white;
875
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
876
+ font-size: 14px;
877
+ font-weight: 500;
878
+ z-index: 1000;
879
+ animation: slideInRight 0.3s ease;
880
+ max-width: 300px;
881
+ }
882
+
883
+ .code-tree-notification.info {
884
+ background: #3b82f6;
885
+ color: white;
886
+ }
887
+
888
+ .code-tree-notification.success {
889
+ background: #10b981;
890
+ color: white;
891
+ }
892
+
893
+ .code-tree-notification.warning {
894
+ background: #f59e0b;
895
+ color: white;
896
+ }
897
+
898
+ .code-tree-notification.error {
899
+ background: #ef4444;
900
+ color: white;
901
+ }
902
+
903
+ @keyframes slideInRight {
904
+ from {
905
+ transform: translateX(100%);
906
+ opacity: 0;
907
+ }
908
+ to {
909
+ transform: translateX(0);
910
+ opacity: 1;
911
+ }
912
+ }
913
+
914
+ @keyframes slideOutRight {
915
+ from {
916
+ transform: translateX(0);
917
+ opacity: 1;
918
+ }
919
+ to {
920
+ transform: translateX(100%);
921
+ opacity: 0;
922
+ }
923
+ }
924
+
925
+ /* Ensure container has relative positioning for notifications */
926
+ #code-tree-container {
927
+ position: relative;
928
+ }
929
+
930
+ /* Code Viewer Modal Styles */
931
+ .code-viewer-modal {
932
+ display: none;
933
+ position: fixed;
934
+ top: 0;
935
+ left: 0;
936
+ width: 100%;
937
+ height: 100%;
938
+ background: rgba(0, 0, 0, 0.5);
939
+ z-index: 10000;
940
+ animation: fadeIn 0.3s ease;
941
+ }
942
+
943
+ .code-viewer-modal.show {
944
+ display: flex;
945
+ align-items: center;
946
+ justify-content: center;
947
+ }
948
+
949
+ .code-viewer-content {
950
+ background: white;
951
+ width: 90%;
952
+ max-width: 1200px;
953
+ height: 80%;
954
+ border-radius: 12px;
955
+ display: flex;
956
+ flex-direction: column;
957
+ box-shadow: 0 20px 60px rgba(0, 0, 0, 0.3);
958
+ animation: slideUp 0.3s ease;
959
+ }
960
+
961
+ .code-viewer-header {
962
+ padding: 20px;
963
+ border-bottom: 1px solid #e2e8f0;
964
+ display: flex;
965
+ justify-content: space-between;
966
+ align-items: center;
967
+ }
968
+
969
+ .code-viewer-title {
970
+ font-size: 16px;
971
+ font-weight: 600;
972
+ color: #2d3748;
973
+ font-family: 'SF Mono', Monaco, 'Cascadia Code', monospace;
974
+ }
975
+
976
+ .code-viewer-info {
977
+ display: flex;
978
+ gap: 20px;
979
+ font-size: 12px;
980
+ color: #718096;
981
+ }
982
+
983
+ .code-viewer-close {
984
+ background: none;
985
+ border: none;
986
+ font-size: 24px;
987
+ color: #718096;
988
+ cursor: pointer;
989
+ padding: 0;
990
+ width: 30px;
991
+ height: 30px;
992
+ display: flex;
993
+ align-items: center;
994
+ justify-content: center;
995
+ border-radius: 4px;
996
+ transition: all 0.2s;
997
+ }
998
+
999
+ .code-viewer-close:hover {
1000
+ background: #f7fafc;
1001
+ color: #2d3748;
1002
+ }
1003
+
1004
+ .code-viewer-body {
1005
+ flex: 1;
1006
+ overflow: auto;
1007
+ padding: 20px;
1008
+ background: #282c34;
1009
+ }
1010
+
1011
+ .code-viewer-code {
1012
+ margin: 0;
1013
+ min-height: 100%;
1014
+ }
1015
+
1016
+ .code-viewer-navigation {
1017
+ padding: 15px 20px;
1018
+ border-top: 1px solid #e2e8f0;
1019
+ display: flex;
1020
+ justify-content: space-between;
1021
+ background: #f8f9fa;
1022
+ }
1023
+
1024
+ .code-nav-button {
1025
+ padding: 8px 16px;
1026
+ background: white;
1027
+ border: 1px solid #cbd5e0;
1028
+ border-radius: 4px;
1029
+ cursor: pointer;
1030
+ font-size: 13px;
1031
+ transition: all 0.2s;
1032
+ display: flex;
1033
+ align-items: center;
1034
+ gap: 5px;
1035
+ }
1036
+
1037
+ .code-nav-button:hover:not(:disabled) {
1038
+ background: #667eea;
1039
+ color: white;
1040
+ border-color: #667eea;
1041
+ }
1042
+
1043
+ .code-nav-button:disabled {
1044
+ opacity: 0.5;
1045
+ cursor: not-allowed;
1046
+ }
1047
+
1048
+ /* Animations */
1049
+ @keyframes fadeIn {
1050
+ from {
1051
+ opacity: 0;
1052
+ }
1053
+ to {
1054
+ opacity: 1;
1055
+ }
1056
+ }
1057
+
1058
+ @keyframes slideUp {
1059
+ from {
1060
+ transform: translateY(20px);
1061
+ opacity: 0;
1062
+ }
1063
+ to {
1064
+ transform: translateY(0);
1065
+ opacity: 1;
1066
+ }
1067
+ }
1068
+
1069
+ /* Responsive adjustments */
1070
+ @media (max-width: 768px) {
1071
+ .code-header {
1072
+ flex-direction: column;
1073
+ gap: 15px;
1074
+ }
1075
+
1076
+ .code-controls {
1077
+ width: 100%;
1078
+ justify-content: space-between;
1079
+ flex-wrap: wrap;
1080
+ }
1081
+
1082
+ .code-stats {
1083
+ width: 100%;
1084
+ justify-content: space-around;
1085
+ }
1086
+
1087
+ .tree-legend {
1088
+ position: static;
1089
+ margin-top: 20px;
1090
+ max-width: 100%;
1091
+ }
1092
+
1093
+ .code-viewer-content {
1094
+ width: 95%;
1095
+ height: 90%;
1096
+ }
1097
+ }
1098
+
1099
+ /* Analyze button states */
1100
+ #analyze-code {
1101
+ transition: all 0.3s ease;
1102
+ min-width: 80px;
1103
+ }
1104
+
1105
+ #analyze-code.analyzing {
1106
+ background: #f59e0b;
1107
+ border-color: #f59e0b;
1108
+ color: white;
1109
+ animation: pulse 1.5s infinite;
1110
+ }
1111
+
1112
+ #analyze-code.analyzing:before {
1113
+ content: '⏳ ';
1114
+ }
1115
+
1116
+ #analyze-code:disabled {
1117
+ opacity: 0.6;
1118
+ cursor: not-allowed;
1119
+ }
1120
+
1121
+ @keyframes pulse {
1122
+ 0% {
1123
+ box-shadow: 0 0 0 0 rgba(245, 158, 11, 0.7);
1124
+ }
1125
+ 70% {
1126
+ box-shadow: 0 0 0 10px rgba(245, 158, 11, 0);
1127
+ }
1128
+ 100% {
1129
+ box-shadow: 0 0 0 0 rgba(245, 158, 11, 0);
1130
+ }
1131
+ }
1132
+
1133
+ /* Analysis events display */
1134
+ .analysis-events {
1135
+ border-top: 2px solid #e2e8f0;
1136
+ margin-top: 15px;
1137
+ padding-top: 10px;
1138
+ max-height: 250px;
1139
+ overflow-y: auto;
1140
+ font-family: 'SF Mono', Monaco, monospace;
1141
+ font-size: 12px;
1142
+ background: linear-gradient(to bottom, #f8f9fa, #ffffff);
1143
+ border-radius: 6px;
1144
+ padding: 12px;
1145
+ box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05);
1146
+ }
1147
+
1148
+ .analysis-event {
1149
+ padding: 6px 10px;
1150
+ margin: 3px 0;
1151
+ border-left: 3px solid #3b82f6;
1152
+ background: white;
1153
+ border-radius: 3px;
1154
+ animation: slideIn 0.3s ease;
1155
+ transition: all 0.2s ease;
1156
+ display: flex;
1157
+ align-items: center;
1158
+ gap: 8px;
1159
+ }
1160
+
1161
+ .analysis-event:hover {
1162
+ background: #f0f9ff;
1163
+ transform: translateX(2px);
1164
+ }
1165
+
1166
+ @keyframes slideIn {
1167
+ from {
1168
+ transform: translateX(-10px);
1169
+ opacity: 0;
1170
+ }
1171
+ to {
1172
+ transform: translateX(0);
1173
+ opacity: 1;
1174
+ }
1175
+ }