claude-mpm 4.2.44__py3-none-any.whl → 4.3.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 (153) hide show
  1. claude_mpm/VERSION +1 -1
  2. claude_mpm/agents/BASE_PM.md +77 -405
  3. claude_mpm/agents/{INSTRUCTIONS.md → INSTRUCTIONS_OLD_DEPRECATED.md} +75 -1
  4. claude_mpm/agents/OUTPUT_STYLE.md +0 -39
  5. claude_mpm/agents/PM_INSTRUCTIONS.md +122 -0
  6. claude_mpm/agents/WORKFLOW.md +74 -323
  7. claude_mpm/agents/frontmatter_validator.py +20 -12
  8. claude_mpm/agents/templates/nextjs_engineer.json +277 -0
  9. claude_mpm/agents/templates/prompt-engineer.json +294 -0
  10. claude_mpm/agents/templates/python_engineer.json +289 -0
  11. claude_mpm/agents/templates/react_engineer.json +11 -3
  12. claude_mpm/agents/templates/security.json +50 -9
  13. claude_mpm/cli/commands/agents.py +2 -2
  14. claude_mpm/cli/commands/uninstall.py +1 -3
  15. claude_mpm/cli/interactive/agent_wizard.py +3 -3
  16. claude_mpm/cli/parsers/agent_manager_parser.py +3 -3
  17. claude_mpm/cli/parsers/agents_parser.py +1 -1
  18. claude_mpm/constants.py +1 -1
  19. claude_mpm/core/error_handler.py +2 -4
  20. claude_mpm/core/file_utils.py +4 -12
  21. claude_mpm/core/framework_loader.py +72 -24
  22. claude_mpm/core/log_manager.py +60 -5
  23. claude_mpm/core/logger.py +1 -1
  24. claude_mpm/core/logging_utils.py +36 -18
  25. claude_mpm/core/unified_agent_registry.py +18 -4
  26. claude_mpm/dashboard/react/components/DataInspector/DataInspector.module.css +188 -0
  27. claude_mpm/dashboard/react/components/EventViewer/EventViewer.module.css +156 -0
  28. claude_mpm/dashboard/react/components/shared/ConnectionStatus.module.css +38 -0
  29. claude_mpm/dashboard/react/components/shared/FilterBar.module.css +92 -0
  30. claude_mpm/dashboard/static/archive/activity_dashboard_fixed.html +248 -0
  31. claude_mpm/dashboard/static/archive/activity_dashboard_test.html +61 -0
  32. claude_mpm/dashboard/static/archive/test_activity_connection.html +179 -0
  33. claude_mpm/dashboard/static/archive/test_claude_tree_tab.html +68 -0
  34. claude_mpm/dashboard/static/archive/test_dashboard.html +409 -0
  35. claude_mpm/dashboard/static/archive/test_dashboard_fixed.html +519 -0
  36. claude_mpm/dashboard/static/archive/test_dashboard_verification.html +181 -0
  37. claude_mpm/dashboard/static/archive/test_file_data.html +315 -0
  38. claude_mpm/dashboard/static/archive/test_file_tree_empty_state.html +243 -0
  39. claude_mpm/dashboard/static/archive/test_file_tree_fix.html +234 -0
  40. claude_mpm/dashboard/static/archive/test_file_tree_rename.html +117 -0
  41. claude_mpm/dashboard/static/archive/test_file_tree_tab.html +115 -0
  42. claude_mpm/dashboard/static/archive/test_file_viewer.html +224 -0
  43. claude_mpm/dashboard/static/archive/test_final_activity.html +220 -0
  44. claude_mpm/dashboard/static/archive/test_tab_fix.html +139 -0
  45. claude_mpm/dashboard/static/built/assets/events.DjpNxWNo.css +1 -0
  46. claude_mpm/dashboard/static/built/components/activity-tree.js +1 -1
  47. claude_mpm/dashboard/static/built/components/agent-hierarchy.js +777 -0
  48. claude_mpm/dashboard/static/built/components/agent-inference.js +1 -1
  49. claude_mpm/dashboard/static/built/components/build-tracker.js +333 -0
  50. claude_mpm/dashboard/static/built/components/code-simple.js +857 -0
  51. claude_mpm/dashboard/static/built/components/code-tree/tree-breadcrumb.js +353 -0
  52. claude_mpm/dashboard/static/built/components/code-tree/tree-constants.js +235 -0
  53. claude_mpm/dashboard/static/built/components/code-tree/tree-search.js +409 -0
  54. claude_mpm/dashboard/static/built/components/code-tree/tree-utils.js +435 -0
  55. claude_mpm/dashboard/static/built/components/code-viewer.js +2 -1076
  56. claude_mpm/dashboard/static/built/components/connection-debug.js +654 -0
  57. claude_mpm/dashboard/static/built/components/diff-viewer.js +891 -0
  58. claude_mpm/dashboard/static/built/components/event-processor.js +1 -1
  59. claude_mpm/dashboard/static/built/components/event-viewer.js +1 -1
  60. claude_mpm/dashboard/static/built/components/export-manager.js +1 -1
  61. claude_mpm/dashboard/static/built/components/file-change-tracker.js +443 -0
  62. claude_mpm/dashboard/static/built/components/file-change-viewer.js +690 -0
  63. claude_mpm/dashboard/static/built/components/file-tool-tracker.js +1 -1
  64. claude_mpm/dashboard/static/built/components/module-viewer.js +1 -1
  65. claude_mpm/dashboard/static/built/components/nav-bar.js +145 -0
  66. claude_mpm/dashboard/static/built/components/page-structure.js +429 -0
  67. claude_mpm/dashboard/static/built/components/session-manager.js +1 -1
  68. claude_mpm/dashboard/static/built/components/ui-state-manager.js +2 -465
  69. claude_mpm/dashboard/static/built/components/working-directory.js +1 -1
  70. claude_mpm/dashboard/static/built/connection-manager.js +536 -0
  71. claude_mpm/dashboard/static/built/dashboard.js +1 -1
  72. claude_mpm/dashboard/static/built/extension-error-handler.js +164 -0
  73. claude_mpm/dashboard/static/built/react/events.js +30 -0
  74. claude_mpm/dashboard/static/built/shared/dom-helpers.js +396 -0
  75. claude_mpm/dashboard/static/built/shared/event-bus.js +330 -0
  76. claude_mpm/dashboard/static/built/shared/event-filter-service.js +540 -0
  77. claude_mpm/dashboard/static/built/shared/logger.js +385 -0
  78. claude_mpm/dashboard/static/built/shared/page-structure.js +251 -0
  79. claude_mpm/dashboard/static/built/shared/tooltip-service.js +253 -0
  80. claude_mpm/dashboard/static/built/socket-client.js +1 -1
  81. claude_mpm/dashboard/static/built/tab-isolation-fix.js +185 -0
  82. claude_mpm/dashboard/static/css/dashboard.css +28 -5
  83. claude_mpm/dashboard/static/dist/assets/events.DjpNxWNo.css +1 -0
  84. claude_mpm/dashboard/static/dist/components/activity-tree.js +1 -1
  85. claude_mpm/dashboard/static/dist/components/agent-inference.js +1 -1
  86. claude_mpm/dashboard/static/dist/components/code-viewer.js +2 -0
  87. claude_mpm/dashboard/static/dist/components/event-processor.js +1 -1
  88. claude_mpm/dashboard/static/dist/components/event-viewer.js +1 -1
  89. claude_mpm/dashboard/static/dist/components/export-manager.js +1 -1
  90. claude_mpm/dashboard/static/dist/components/file-tool-tracker.js +1 -1
  91. claude_mpm/dashboard/static/dist/components/module-viewer.js +1 -1
  92. claude_mpm/dashboard/static/dist/components/session-manager.js +1 -1
  93. claude_mpm/dashboard/static/dist/components/working-directory.js +1 -1
  94. claude_mpm/dashboard/static/dist/dashboard.js +1 -1
  95. claude_mpm/dashboard/static/dist/react/events.js +30 -0
  96. claude_mpm/dashboard/static/dist/socket-client.js +1 -1
  97. claude_mpm/dashboard/static/events.html +607 -0
  98. claude_mpm/dashboard/static/index.html +713 -0
  99. claude_mpm/dashboard/static/js/components/activity-tree.js +3 -17
  100. claude_mpm/dashboard/static/js/components/agent-hierarchy.js +4 -1
  101. claude_mpm/dashboard/static/js/components/agent-inference.js +3 -0
  102. claude_mpm/dashboard/static/js/components/build-tracker.js +8 -0
  103. claude_mpm/dashboard/static/js/components/code-viewer.js +306 -66
  104. claude_mpm/dashboard/static/js/components/event-processor.js +3 -0
  105. claude_mpm/dashboard/static/js/components/event-viewer.js +39 -2
  106. claude_mpm/dashboard/static/js/components/export-manager.js +3 -0
  107. claude_mpm/dashboard/static/js/components/file-tool-tracker.js +30 -10
  108. claude_mpm/dashboard/static/js/components/socket-manager.js +4 -0
  109. claude_mpm/dashboard/static/js/components/ui-state-manager.js +285 -85
  110. claude_mpm/dashboard/static/js/components/working-directory.js +3 -0
  111. claude_mpm/dashboard/static/js/dashboard.js +61 -33
  112. claude_mpm/dashboard/static/js/socket-client.js +12 -8
  113. claude_mpm/dashboard/static/js/stores/dashboard-store.js +562 -0
  114. claude_mpm/dashboard/static/js/tab-isolation-fix.js +185 -0
  115. claude_mpm/dashboard/static/legacy/activity.html +736 -0
  116. claude_mpm/dashboard/static/legacy/agents.html +786 -0
  117. claude_mpm/dashboard/static/legacy/files.html +747 -0
  118. claude_mpm/dashboard/static/legacy/tools.html +831 -0
  119. claude_mpm/dashboard/static/monitors-index.html +218 -0
  120. claude_mpm/dashboard/static/monitors.html +431 -0
  121. claude_mpm/dashboard/static/production/events.html +659 -0
  122. claude_mpm/dashboard/static/production/main.html +715 -0
  123. claude_mpm/dashboard/static/production/monitors.html +483 -0
  124. claude_mpm/dashboard/static/socket.io.min.js +7 -0
  125. claude_mpm/dashboard/static/socket.io.v4.8.1.backup.js +7 -0
  126. claude_mpm/dashboard/static/test-archive/dashboard.html +635 -0
  127. claude_mpm/dashboard/static/test-archive/debug-events.html +147 -0
  128. claude_mpm/dashboard/static/test-archive/test-navigation.html +256 -0
  129. claude_mpm/dashboard/static/test-archive/test-react-exports.html +180 -0
  130. claude_mpm/dashboard/templates/index.html +79 -9
  131. claude_mpm/hooks/claude_hooks/services/connection_manager_http.py +1 -1
  132. claude_mpm/services/agents/deployment/agent_discovery_service.py +3 -0
  133. claude_mpm/services/agents/deployment/agent_template_builder.py +285 -26
  134. claude_mpm/services/agents/deployment/agent_validator.py +3 -0
  135. claude_mpm/services/agents/deployment/validation/template_validator.py +13 -4
  136. claude_mpm/services/agents/local_template_manager.py +2 -7
  137. claude_mpm/services/monitor/daemon.py +1 -2
  138. claude_mpm/services/monitor/daemon_manager.py +2 -7
  139. claude_mpm/services/monitor/event_emitter.py +6 -2
  140. claude_mpm/services/monitor/handlers/code_analysis.py +4 -6
  141. claude_mpm/services/monitor/handlers/hooks.py +2 -6
  142. claude_mpm/services/monitor/server.py +27 -4
  143. claude_mpm/tools/code_tree_analyzer.py +2 -4
  144. claude_mpm/utils/log_cleanup.py +612 -0
  145. {claude_mpm-4.2.44.dist-info → claude_mpm-4.3.0.dist-info}/METADATA +1 -1
  146. {claude_mpm-4.2.44.dist-info → claude_mpm-4.3.0.dist-info}/RECORD +151 -83
  147. claude_mpm/dashboard/static/test-browser-monitor.html +0 -470
  148. claude_mpm/dashboard/static/test-simple.html +0 -97
  149. /claude_mpm/dashboard/static/{test_debug.html → test-archive/test_debug.html} +0 -0
  150. {claude_mpm-4.2.44.dist-info → claude_mpm-4.3.0.dist-info}/WHEEL +0 -0
  151. {claude_mpm-4.2.44.dist-info → claude_mpm-4.3.0.dist-info}/entry_points.txt +0 -0
  152. {claude_mpm-4.2.44.dist-info → claude_mpm-4.3.0.dist-info}/licenses/LICENSE +0 -0
  153. {claude_mpm-4.2.44.dist-info → claude_mpm-4.3.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,156 @@
1
+ .eventsContainer {
2
+ background: rgba(255, 255, 255, 0.05);
3
+ backdrop-filter: blur(10px);
4
+ border-radius: 12px;
5
+ border: 1px solid rgba(255, 255, 255, 0.1);
6
+ overflow: hidden;
7
+ flex: 1;
8
+ display: flex;
9
+ flex-direction: column;
10
+ min-height: 0;
11
+ }
12
+
13
+ .eventsHeader {
14
+ padding: 15px 20px;
15
+ background: rgba(255, 255, 255, 0.05);
16
+ border-bottom: 1px solid rgba(255, 255, 255, 0.1);
17
+ display: flex;
18
+ justify-content: space-between;
19
+ align-items: center;
20
+ }
21
+
22
+ .eventsTitle {
23
+ font-weight: 600;
24
+ font-size: 16px;
25
+ }
26
+
27
+ .eventsInfo {
28
+ font-size: 12px;
29
+ color: rgba(255, 255, 255, 0.6);
30
+ }
31
+
32
+ .eventsList {
33
+ flex: 1;
34
+ position: relative;
35
+ min-height: 300px;
36
+ }
37
+
38
+ .eventItem {
39
+ padding: 12px 20px;
40
+ border-bottom: 1px solid rgba(255, 255, 255, 0.05);
41
+ transition: background 0.2s;
42
+ cursor: pointer;
43
+ font-family: 'Courier New', monospace;
44
+ font-size: 13px;
45
+ position: relative;
46
+ animation: slideIn 0.3s ease;
47
+ }
48
+
49
+ @keyframes slideIn {
50
+ from {
51
+ opacity: 0;
52
+ transform: translateX(-20px);
53
+ }
54
+ to {
55
+ opacity: 1;
56
+ transform: translateX(0);
57
+ }
58
+ }
59
+
60
+ .eventItem:hover {
61
+ background: rgba(255, 255, 255, 0.05);
62
+ }
63
+
64
+ .eventItem.expanded {
65
+ background: rgba(255, 255, 255, 0.08);
66
+ }
67
+
68
+ .eventHeader {
69
+ width: 100%;
70
+ }
71
+
72
+ .eventHeaderRow {
73
+ display: flex;
74
+ gap: 10px;
75
+ align-items: center;
76
+ margin-bottom: 5px;
77
+ }
78
+
79
+ .eventType {
80
+ padding: 3px 8px;
81
+ border-radius: 10px;
82
+ font-size: 11px;
83
+ font-weight: 600;
84
+ text-transform: uppercase;
85
+ }
86
+
87
+ .eventType.agent {
88
+ background: rgba(167, 139, 250, 0.2);
89
+ color: #a78bfa;
90
+ }
91
+
92
+ .eventType.tool {
93
+ background: rgba(96, 165, 250, 0.2);
94
+ color: #60a5fa;
95
+ }
96
+
97
+ .eventType.file {
98
+ background: rgba(251, 191, 36, 0.2);
99
+ color: #fbbf24;
100
+ }
101
+
102
+ .eventType.session {
103
+ background: rgba(74, 222, 128, 0.2);
104
+ color: #4ade80;
105
+ }
106
+
107
+ .eventType.error {
108
+ background: rgba(248, 113, 113, 0.2);
109
+ color: #f87171;
110
+ }
111
+
112
+ .eventType.info {
113
+ background: rgba(134, 239, 172, 0.2);
114
+ color: #86efac;
115
+ }
116
+
117
+ .eventTime {
118
+ font-size: 11px;
119
+ color: rgba(255, 255, 255, 0.5);
120
+ }
121
+
122
+ .sourceIndicator {
123
+ font-size: 10px;
124
+ color: rgba(255, 255, 255, 0.4);
125
+ font-style: italic;
126
+ }
127
+
128
+ .eventPreview {
129
+ color: rgba(255, 255, 255, 0.7);
130
+ white-space: nowrap;
131
+ overflow: hidden;
132
+ text-overflow: ellipsis;
133
+ max-width: 100%;
134
+ }
135
+
136
+ .eventDetails {
137
+ margin-top: 10px;
138
+ padding: 10px;
139
+ background: rgba(0, 0, 0, 0.2);
140
+ border-radius: 6px;
141
+ }
142
+
143
+ .noEvents {
144
+ text-align: center;
145
+ padding: 60px 20px;
146
+ color: rgba(255, 255, 255, 0.5);
147
+ }
148
+
149
+ .noEvents h3 {
150
+ margin-bottom: 10px;
151
+ font-size: 18px;
152
+ }
153
+
154
+ .noEvents p {
155
+ font-size: 14px;
156
+ }
@@ -0,0 +1,38 @@
1
+ .statusBar {
2
+ display: flex;
3
+ gap: 20px;
4
+ align-items: center;
5
+ flex-wrap: wrap;
6
+ }
7
+
8
+ .statusIndicator {
9
+ display: flex;
10
+ align-items: center;
11
+ gap: 8px;
12
+ padding: 8px 16px;
13
+ background: rgba(255, 255, 255, 0.05);
14
+ border-radius: 20px;
15
+ font-size: 14px;
16
+ }
17
+
18
+ .statusDot {
19
+ width: 10px;
20
+ height: 10px;
21
+ border-radius: 50%;
22
+ animation: pulse 2s infinite;
23
+ }
24
+
25
+ .statusDot.connected {
26
+ background: #4ade80;
27
+ box-shadow: 0 0 10px #4ade80;
28
+ }
29
+
30
+ .statusDot.disconnected {
31
+ background: #f87171;
32
+ box-shadow: 0 0 10px #f87171;
33
+ }
34
+
35
+ @keyframes pulse {
36
+ 0%, 100% { opacity: 1; }
37
+ 50% { opacity: 0.5; }
38
+ }
@@ -0,0 +1,92 @@
1
+ .controlsPanel {
2
+ background: rgba(255, 255, 255, 0.05);
3
+ backdrop-filter: blur(10px);
4
+ border: 1px solid rgba(255, 255, 255, 0.1);
5
+ border-radius: 10px;
6
+ padding: 15px;
7
+ margin-bottom: 20px;
8
+ display: flex;
9
+ gap: 15px;
10
+ align-items: center;
11
+ flex-wrap: wrap;
12
+ }
13
+
14
+ .controlGroup {
15
+ display: flex;
16
+ align-items: center;
17
+ gap: 10px;
18
+ }
19
+
20
+ .controlLabel {
21
+ font-size: 14px;
22
+ color: #94a3b8;
23
+ }
24
+
25
+ .btn {
26
+ padding: 10px 20px;
27
+ background: linear-gradient(135deg, #10b981 0%, #06b6d4 100%);
28
+ border: none;
29
+ border-radius: 8px;
30
+ color: white;
31
+ cursor: pointer;
32
+ font-size: 14px;
33
+ transition: transform 0.2s, box-shadow 0.2s;
34
+ }
35
+
36
+ .btn:hover {
37
+ transform: translateY(-2px);
38
+ box-shadow: 0 5px 15px rgba(16, 185, 129, 0.4);
39
+ }
40
+
41
+ .btn.secondary {
42
+ background: rgba(255, 255, 255, 0.1);
43
+ }
44
+
45
+ .btn.danger {
46
+ background: linear-gradient(135deg, #ef4444 0%, #dc2626 100%);
47
+ }
48
+
49
+ .searchBox {
50
+ flex: 1;
51
+ min-width: 200px;
52
+ padding: 10px 15px;
53
+ background: rgba(255, 255, 255, 0.05);
54
+ border: 1px solid rgba(255, 255, 255, 0.1);
55
+ border-radius: 8px;
56
+ color: white;
57
+ font-size: 14px;
58
+ }
59
+
60
+ .searchBox::placeholder {
61
+ color: rgba(255, 255, 255, 0.5);
62
+ }
63
+
64
+ .filterSelect {
65
+ padding: 10px 15px;
66
+ background: rgba(255, 255, 255, 0.05);
67
+ border: 1px solid rgba(255, 255, 255, 0.1);
68
+ border-radius: 8px;
69
+ color: white;
70
+ font-size: 14px;
71
+ cursor: pointer;
72
+ }
73
+
74
+ .filterSelect option {
75
+ background: #0f172a;
76
+ }
77
+
78
+ .checkboxLabel {
79
+ display: flex;
80
+ align-items: center;
81
+ gap: 8px;
82
+ padding: 10px 15px;
83
+ background: rgba(255, 255, 255, 0.05);
84
+ border: 1px solid rgba(255, 255, 255, 0.1);
85
+ border-radius: 8px;
86
+ cursor: pointer;
87
+ font-size: 14px;
88
+ }
89
+
90
+ .checkboxLabel input {
91
+ cursor: pointer;
92
+ }
@@ -0,0 +1,248 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>Activity Dashboard - Fixed</title>
7
+
8
+ <!-- Load Socket.IO first -->
9
+ <script src="https://cdn.socket.io/4.8.1/socket.io.min.js"></script>
10
+
11
+ <style>
12
+ body {
13
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
14
+ background: linear-gradient(135deg, #0f172a 0%, #1e293b 100%);
15
+ color: #e0e0e0;
16
+ padding: 20px;
17
+ }
18
+
19
+ .header {
20
+ background: rgba(255, 255, 255, 0.05);
21
+ backdrop-filter: blur(10px);
22
+ border-radius: 12px;
23
+ padding: 20px;
24
+ margin-bottom: 20px;
25
+ border: 1px solid rgba(255, 255, 255, 0.1);
26
+ }
27
+
28
+ .header h1 {
29
+ font-size: 24px;
30
+ margin-bottom: 10px;
31
+ background: linear-gradient(135deg, #10b981 0%, #06b6d4 100%);
32
+ -webkit-background-clip: text;
33
+ -webkit-text-fill-color: transparent;
34
+ }
35
+
36
+ .status-bar {
37
+ display: flex;
38
+ gap: 20px;
39
+ align-items: center;
40
+ }
41
+
42
+ .status-indicator {
43
+ display: flex;
44
+ align-items: center;
45
+ gap: 8px;
46
+ padding: 8px 16px;
47
+ background: rgba(255, 255, 255, 0.05);
48
+ border-radius: 20px;
49
+ font-size: 14px;
50
+ }
51
+
52
+ .status-dot {
53
+ width: 10px;
54
+ height: 10px;
55
+ border-radius: 50%;
56
+ animation: pulse 2s infinite;
57
+ }
58
+
59
+ .status-dot.connected {
60
+ background: #4ade80;
61
+ box-shadow: 0 0 10px #4ade80;
62
+ }
63
+
64
+ .status-dot.disconnected {
65
+ background: #f87171;
66
+ box-shadow: 0 0 10px #f87171;
67
+ }
68
+
69
+ @keyframes pulse {
70
+ 0%, 100% { opacity: 1; }
71
+ 50% { opacity: 0.5; }
72
+ }
73
+
74
+ .content {
75
+ background: rgba(255, 255, 255, 0.05);
76
+ backdrop-filter: blur(10px);
77
+ border-radius: 12px;
78
+ padding: 20px;
79
+ border: 1px solid rgba(255, 255, 255, 0.1);
80
+ }
81
+
82
+ .log {
83
+ background: rgba(0, 0, 0, 0.3);
84
+ padding: 15px;
85
+ border-radius: 8px;
86
+ max-height: 400px;
87
+ overflow-y: auto;
88
+ font-family: monospace;
89
+ font-size: 13px;
90
+ }
91
+
92
+ .log-entry {
93
+ margin: 2px 0;
94
+ padding: 2px;
95
+ }
96
+
97
+ .error { color: #f87171; }
98
+ .success { color: #4ade80; }
99
+ .info { color: #60a5fa; }
100
+ </style>
101
+ </head>
102
+ <body>
103
+ <div class="header">
104
+ <h1>🎯 Activity Dashboard - Fixed Version</h1>
105
+ <div class="status-bar">
106
+ <div class="status-indicator">
107
+ <span class="status-dot disconnected" id="connection-status"></span>
108
+ <span id="connection-text">Disconnected</span>
109
+ </div>
110
+ <div class="status-indicator">
111
+ <span>📊</span>
112
+ <span id="event-count">0 events</span>
113
+ </div>
114
+ <div class="status-indicator">
115
+ <span>🎯</span>
116
+ <span id="session-count">0 sessions</span>
117
+ </div>
118
+ </div>
119
+ </div>
120
+
121
+ <div class="content">
122
+ <h2>Connection Log</h2>
123
+ <div class="log" id="log"></div>
124
+ </div>
125
+
126
+ <script type="module">
127
+ // Import SocketClient
128
+ import { SocketClient } from 'http://localhost:8765/static/built/socket-client.js';
129
+ import { ActivityTree } from 'http://localhost:8765/static/built/components/activity-tree.js';
130
+ import { SessionManager } from 'http://localhost:8765/static/built/components/session-manager.js';
131
+
132
+ const logEl = document.getElementById('log');
133
+
134
+ function log(message, type = 'info') {
135
+ const entry = document.createElement('div');
136
+ entry.className = `log-entry ${type}`;
137
+ entry.textContent = `[${new Date().toLocaleTimeString()}] ${message}`;
138
+ logEl.appendChild(entry);
139
+ logEl.scrollTop = logEl.scrollHeight;
140
+ console.log(`[${type}] ${message}`);
141
+ }
142
+
143
+ function updateConnectionStatus(connected) {
144
+ const statusDot = document.getElementById('connection-status');
145
+ const statusText = document.getElementById('connection-text');
146
+
147
+ if (connected) {
148
+ statusDot.className = 'status-dot connected';
149
+ statusText.textContent = 'Connected';
150
+ } else {
151
+ statusDot.className = 'status-dot disconnected';
152
+ statusText.textContent = 'Disconnected';
153
+ }
154
+ }
155
+
156
+ // Wait for Socket.IO to load
157
+ function waitForSocketIO() {
158
+ return new Promise((resolve) => {
159
+ if (typeof io !== 'undefined') {
160
+ log(`Socket.IO loaded: version ${io.version || 'unknown'}`, 'success');
161
+ resolve();
162
+ } else {
163
+ log('Waiting for Socket.IO...', 'info');
164
+ setTimeout(() => waitForSocketIO().then(resolve), 100);
165
+ }
166
+ });
167
+ }
168
+
169
+ // Initialize
170
+ async function initialize() {
171
+ log('Starting initialization...', 'info');
172
+
173
+ // Wait for Socket.IO
174
+ await waitForSocketIO();
175
+
176
+ try {
177
+ // Create instances
178
+ log('Creating SocketClient instance...', 'info');
179
+ const socketClient = new SocketClient();
180
+ window.socketClient = socketClient;
181
+
182
+ log('Creating SessionManager instance...', 'info');
183
+ const sessionManager = new SessionManager();
184
+ window.sessionManager = sessionManager;
185
+
186
+ log('Creating ActivityTree instance...', 'info');
187
+ const activityTree = new ActivityTree();
188
+ window.activityTree = activityTree;
189
+
190
+ // Set up event handlers
191
+ log('Setting up event handlers...', 'info');
192
+
193
+ socketClient.onConnection('connect', () => {
194
+ log('✅ CONNECTED to Socket.IO server!', 'success');
195
+ updateConnectionStatus(true);
196
+ });
197
+
198
+ socketClient.onConnection('disconnect', (reason) => {
199
+ log(`❌ DISCONNECTED: ${reason}`, 'error');
200
+ updateConnectionStatus(false);
201
+ });
202
+
203
+ socketClient.onConnection('error', (error) => {
204
+ log(`Socket error: ${error}`, 'error');
205
+ });
206
+
207
+ socketClient.onEventUpdate((events, sessions) => {
208
+ const eventCount = events.length;
209
+ const sessionCount = sessions.size;
210
+ log(`Event update: ${eventCount} events, ${sessionCount} sessions`, 'info');
211
+ document.getElementById('event-count').textContent = `${eventCount} events`;
212
+ document.getElementById('session-count').textContent = `${sessionCount} sessions`;
213
+ });
214
+
215
+ // Connect
216
+ log('Calling socketClient.connect()...', 'info');
217
+ socketClient.connect();
218
+
219
+ // Check status after a moment
220
+ setTimeout(() => {
221
+ if (socketClient.socket) {
222
+ const status = {
223
+ connected: socketClient.socket.connected,
224
+ connecting: socketClient.socket.connecting,
225
+ id: socketClient.socket.id || 'none'
226
+ };
227
+ log(`Socket status: connected=${status.connected}, id=${status.id}`,
228
+ status.connected ? 'success' : 'error');
229
+
230
+ if (!status.connected && !status.connecting) {
231
+ log('Connection failed. Check browser console for errors.', 'error');
232
+ }
233
+ } else {
234
+ log('Socket object was not created!', 'error');
235
+ }
236
+ }, 2000);
237
+
238
+ } catch (error) {
239
+ log(`Initialization error: ${error.message}`, 'error');
240
+ console.error(error);
241
+ }
242
+ }
243
+
244
+ // Start initialization
245
+ initialize();
246
+ </script>
247
+ </body>
248
+ </html>
@@ -0,0 +1,61 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <title>Activity Dashboard Test</title>
6
+ </head>
7
+ <body>
8
+ <h1>Activity Dashboard Test Results</h1>
9
+
10
+ <h2>Dashboard Accessibility Check:</h2>
11
+ <iframe id="dashboard-frame" src="http://localhost:8765/static/activity.html"
12
+ width="100%" height="600" style="border: 2px solid #333;"></iframe>
13
+
14
+ <h2>Test Status:</h2>
15
+ <div id="test-status">
16
+ <p>✅ Monitor server is running on port 8765</p>
17
+ <p>✅ Activity dashboard HTML file created at: /src/claude_mpm/dashboard/static/activity.html</p>
18
+ <p>✅ Dashboard is being served at: http://localhost:8765/static/activity.html</p>
19
+ <p>✅ Navigation links to other dashboards are included</p>
20
+ <p>✅ Activity tree component is integrated</p>
21
+ <p>✅ Real-time WebSocket connection is configured</p>
22
+ </div>
23
+
24
+ <h2>Dashboard Features:</h2>
25
+ <ul>
26
+ <li>🎯 Hierarchical tree view of PM → Agent → Tool activities</li>
27
+ <li>🔄 Real-time updates via WebSocket</li>
28
+ <li>📊 Session-based organization</li>
29
+ <li>🔍 Search and filtering capabilities</li>
30
+ <li>📈 Statistics panel showing nodes, active items, tree depth</li>
31
+ <li>🎨 Dark theme consistent with other monitors</li>
32
+ <li>🔗 Navigation tabs to other dashboards</li>
33
+ <li>⚡ Connection status indicator</li>
34
+ <li>⏱️ Uptime counter</li>
35
+ <li>🌳 Expandable/collapsible tree nodes</li>
36
+ </ul>
37
+
38
+ <h2>Visual Hierarchy:</h2>
39
+ <ul>
40
+ <li>Level 0: PM Sessions (gradient background)</li>
41
+ <li>Level 1: User Instructions (purple border)</li>
42
+ <li>Level 1: TodoWrite (pink border)</li>
43
+ <li>Level 1: Agents (blue border)</li>
44
+ <li>Level 2: Tools (yellow border)</li>
45
+ <li>Level 3: Todo items (checkbox icons)</li>
46
+ </ul>
47
+
48
+ <script>
49
+ // Try to check if the dashboard loads
50
+ window.addEventListener('load', () => {
51
+ const iframe = document.getElementById('dashboard-frame');
52
+ iframe.addEventListener('load', () => {
53
+ console.log('Dashboard loaded successfully!');
54
+ });
55
+ iframe.addEventListener('error', () => {
56
+ console.error('Failed to load dashboard');
57
+ });
58
+ });
59
+ </script>
60
+ </body>
61
+ </html>