claude-mpm 4.2.7__py3-none-any.whl → 4.2.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.
- claude_mpm/VERSION +1 -1
- claude_mpm/cli/commands/dashboard.py +62 -120
- claude_mpm/cli/commands/monitor.py +71 -212
- claude_mpm/cli/commands/run.py +33 -33
- claude_mpm/cli/parser.py +79 -2
- claude_mpm/cli/parsers/__init__.py +29 -0
- claude_mpm/dashboard/static/css/code-tree.css +16 -4
- claude_mpm/dashboard/static/css/dashboard.css +15 -1
- claude_mpm/dashboard/static/dist/components/code-tree.js +1 -1
- claude_mpm/dashboard/static/dist/components/file-viewer.js +2 -0
- claude_mpm/dashboard/static/dist/components/module-viewer.js +1 -1
- claude_mpm/dashboard/static/dist/components/unified-data-viewer.js +1 -1
- claude_mpm/dashboard/static/dist/dashboard.js +1 -1
- claude_mpm/dashboard/static/dist/socket-client.js +1 -1
- claude_mpm/dashboard/static/js/components/code-tree.js +775 -142
- claude_mpm/dashboard/static/js/components/file-viewer.js +538 -0
- claude_mpm/dashboard/static/js/components/module-viewer.js +26 -0
- claude_mpm/dashboard/static/js/components/unified-data-viewer.js +166 -14
- claude_mpm/dashboard/static/js/dashboard.js +108 -91
- claude_mpm/dashboard/static/js/socket-client.js +9 -7
- claude_mpm/dashboard/templates/index.html +5 -2
- claude_mpm/hooks/claude_hooks/hook_handler.py +1 -11
- claude_mpm/hooks/claude_hooks/services/connection_manager.py +54 -59
- claude_mpm/hooks/claude_hooks/services/connection_manager_http.py +112 -72
- claude_mpm/services/agents/deployment/agent_format_converter.py +3 -3
- claude_mpm/services/agents/deployment/agent_template_builder.py +3 -5
- claude_mpm/services/cli/unified_dashboard_manager.py +354 -0
- claude_mpm/services/monitor/__init__.py +20 -0
- claude_mpm/services/monitor/daemon.py +256 -0
- claude_mpm/services/monitor/event_emitter.py +279 -0
- claude_mpm/services/monitor/handlers/__init__.py +20 -0
- claude_mpm/services/monitor/handlers/code_analysis.py +334 -0
- claude_mpm/services/monitor/handlers/dashboard.py +298 -0
- claude_mpm/services/monitor/handlers/hooks.py +491 -0
- claude_mpm/services/monitor/management/__init__.py +18 -0
- claude_mpm/services/monitor/management/health.py +124 -0
- claude_mpm/services/monitor/management/lifecycle.py +298 -0
- claude_mpm/services/monitor/server.py +442 -0
- claude_mpm/services/socketio/client_proxy.py +20 -12
- claude_mpm/services/socketio/dashboard_server.py +4 -4
- claude_mpm/services/socketio/monitor_client.py +4 -6
- claude_mpm/tools/code_tree_analyzer.py +33 -17
- {claude_mpm-4.2.7.dist-info → claude_mpm-4.2.11.dist-info}/METADATA +1 -1
- {claude_mpm-4.2.7.dist-info → claude_mpm-4.2.11.dist-info}/RECORD +48 -43
- claude_mpm/cli/commands/socketio_monitor.py +0 -233
- claude_mpm/scripts/socketio_daemon.py +0 -571
- claude_mpm/scripts/socketio_daemon_hardened.py +0 -937
- claude_mpm/scripts/socketio_daemon_wrapper.py +0 -78
- claude_mpm/scripts/socketio_server_manager.py +0 -349
- claude_mpm/services/cli/dashboard_launcher.py +0 -423
- claude_mpm/services/cli/socketio_manager.py +0 -595
- claude_mpm/services/dashboard/stable_server.py +0 -962
- claude_mpm/services/socketio/monitor_server.py +0 -505
- {claude_mpm-4.2.7.dist-info → claude_mpm-4.2.11.dist-info}/WHEEL +0 -0
- {claude_mpm-4.2.7.dist-info → claude_mpm-4.2.11.dist-info}/entry_points.txt +0 -0
- {claude_mpm-4.2.7.dist-info → claude_mpm-4.2.11.dist-info}/licenses/LICENSE +0 -0
- {claude_mpm-4.2.7.dist-info → claude_mpm-4.2.11.dist-info}/top_level.txt +0 -0
claude_mpm/cli/commands/run.py
CHANGED
|
@@ -21,10 +21,11 @@ from typing import Optional
|
|
|
21
21
|
from ...constants import LogLevel
|
|
22
22
|
from ...core.logger import get_logger
|
|
23
23
|
from ...core.unified_paths import get_scripts_dir
|
|
24
|
-
from ...services.cli.dashboard_launcher import DashboardLauncher
|
|
25
24
|
from ...services.cli.session_manager import SessionManager
|
|
26
|
-
|
|
25
|
+
|
|
26
|
+
# SocketIOManager functionality now provided by UnifiedDashboardManager
|
|
27
27
|
from ...services.cli.startup_checker import StartupCheckerService
|
|
28
|
+
from ...services.cli.unified_dashboard_manager import UnifiedDashboardManager
|
|
28
29
|
from ..shared import BaseCommand, CommandResult
|
|
29
30
|
from ..startup_logging import (
|
|
30
31
|
cleanup_old_startup_logs,
|
|
@@ -423,16 +424,16 @@ class RunCommand(BaseCommand):
|
|
|
423
424
|
self.logger.warning(f"Dependency check failed: {e}")
|
|
424
425
|
|
|
425
426
|
def _setup_monitoring(self, args):
|
|
426
|
-
"""Setup monitoring configuration using
|
|
427
|
+
"""Setup monitoring configuration using UnifiedDashboardManager."""
|
|
427
428
|
monitor_mode = getattr(args, "monitor", False)
|
|
428
429
|
websocket_port = 8765 # Default port
|
|
429
430
|
|
|
430
431
|
if monitor_mode:
|
|
431
|
-
# Use
|
|
432
|
-
|
|
432
|
+
# Use UnifiedDashboardManager for server management
|
|
433
|
+
dashboard_manager = UnifiedDashboardManager(self.logger)
|
|
433
434
|
|
|
434
435
|
# Check dependencies
|
|
435
|
-
deps_ok, error_msg =
|
|
436
|
+
deps_ok, error_msg = dashboard_manager.ensure_dependencies()
|
|
436
437
|
if not deps_ok:
|
|
437
438
|
self.logger.warning(
|
|
438
439
|
f"Socket.IO dependencies not available: {error_msg}, disabling monitor mode"
|
|
@@ -440,8 +441,8 @@ class RunCommand(BaseCommand):
|
|
|
440
441
|
monitor_mode = False
|
|
441
442
|
else:
|
|
442
443
|
# Find available port and start server
|
|
443
|
-
websocket_port =
|
|
444
|
-
success, server_info =
|
|
444
|
+
websocket_port = dashboard_manager.find_available_port(8765)
|
|
445
|
+
success, server_info = dashboard_manager.start_server(
|
|
445
446
|
port=websocket_port
|
|
446
447
|
)
|
|
447
448
|
|
|
@@ -451,12 +452,12 @@ class RunCommand(BaseCommand):
|
|
|
451
452
|
)
|
|
452
453
|
monitor_mode = False
|
|
453
454
|
else:
|
|
454
|
-
# Use
|
|
455
|
-
|
|
456
|
-
monitor_url =
|
|
455
|
+
# Use UnifiedDashboardManager for browser opening only
|
|
456
|
+
dashboard_manager = UnifiedDashboardManager(self.logger)
|
|
457
|
+
monitor_url = dashboard_manager.get_dashboard_url(websocket_port)
|
|
457
458
|
|
|
458
459
|
# Try to open browser
|
|
459
|
-
browser_opened =
|
|
460
|
+
browser_opened = dashboard_manager.open_browser(monitor_url)
|
|
460
461
|
args._browser_opened_by_cli = browser_opened
|
|
461
462
|
|
|
462
463
|
if not browser_opened:
|
|
@@ -855,12 +856,12 @@ def run_session_legacy(args):
|
|
|
855
856
|
|
|
856
857
|
# Display Socket.IO server info if enabled
|
|
857
858
|
if enable_websocket:
|
|
858
|
-
# Use
|
|
859
|
-
|
|
859
|
+
# Use UnifiedDashboardManager for server management
|
|
860
|
+
dashboard_manager = UnifiedDashboardManager(logger)
|
|
860
861
|
|
|
861
862
|
# Check dependencies
|
|
862
863
|
print("🔧 Checking Socket.IO dependencies...")
|
|
863
|
-
deps_ok, error_msg =
|
|
864
|
+
deps_ok, error_msg = dashboard_manager.ensure_dependencies()
|
|
864
865
|
|
|
865
866
|
if not deps_ok:
|
|
866
867
|
print(f"❌ Failed to install Socket.IO dependencies: {error_msg}")
|
|
@@ -874,8 +875,8 @@ def run_session_legacy(args):
|
|
|
874
875
|
|
|
875
876
|
# Find available port and start server if in monitor mode
|
|
876
877
|
if monitor_mode:
|
|
877
|
-
websocket_port =
|
|
878
|
-
success, server_info =
|
|
878
|
+
websocket_port = dashboard_manager.find_available_port(websocket_port)
|
|
879
|
+
success, server_info = dashboard_manager.start_server(
|
|
879
880
|
port=websocket_port
|
|
880
881
|
)
|
|
881
882
|
|
|
@@ -886,10 +887,10 @@ def run_session_legacy(args):
|
|
|
886
887
|
" Note: Socket.IO monitoring using exec mode with Claude Code hooks"
|
|
887
888
|
)
|
|
888
889
|
|
|
889
|
-
# Use
|
|
890
|
-
|
|
891
|
-
monitor_url =
|
|
892
|
-
browser_opened =
|
|
890
|
+
# Use UnifiedDashboardManager for browser opening
|
|
891
|
+
dashboard_manager = UnifiedDashboardManager(logger)
|
|
892
|
+
monitor_url = dashboard_manager.get_dashboard_url(websocket_port)
|
|
893
|
+
browser_opened = dashboard_manager.open_browser(monitor_url)
|
|
893
894
|
args._browser_opened_by_cli = browser_opened
|
|
894
895
|
|
|
895
896
|
if not browser_opened:
|
|
@@ -971,16 +972,15 @@ def run_session_legacy(args):
|
|
|
971
972
|
runner.run_interactive(context)
|
|
972
973
|
|
|
973
974
|
|
|
974
|
-
# Legacy helper functions - now delegating to
|
|
975
|
+
# Legacy helper functions - now delegating to UnifiedDashboardManager
|
|
975
976
|
def launch_socketio_monitor(port, logger):
|
|
976
977
|
"""Launch the Socket.IO monitoring dashboard (legacy compatibility)."""
|
|
977
|
-
|
|
978
|
-
success, server_info =
|
|
978
|
+
dashboard_manager = UnifiedDashboardManager(logger)
|
|
979
|
+
success, server_info = dashboard_manager.start_server(port=port)
|
|
979
980
|
|
|
980
981
|
if success:
|
|
981
|
-
# Open browser using
|
|
982
|
-
|
|
983
|
-
browser_opened = launcher._open_browser(server_info.url)
|
|
982
|
+
# Open browser using UnifiedDashboardManager
|
|
983
|
+
browser_opened = dashboard_manager.open_browser(server_info.url)
|
|
984
984
|
return success, browser_opened
|
|
985
985
|
|
|
986
986
|
return False, False
|
|
@@ -988,21 +988,21 @@ def launch_socketio_monitor(port, logger):
|
|
|
988
988
|
|
|
989
989
|
def _check_socketio_server_running(port, logger):
|
|
990
990
|
"""Check if a Socket.IO server is running on the specified port (legacy compatibility)."""
|
|
991
|
-
|
|
992
|
-
return
|
|
991
|
+
dashboard_manager = UnifiedDashboardManager(logger)
|
|
992
|
+
return dashboard_manager.is_server_running(port)
|
|
993
993
|
|
|
994
994
|
|
|
995
995
|
def _start_standalone_socketio_server(port, logger):
|
|
996
996
|
"""Start a standalone Socket.IO server (legacy compatibility)."""
|
|
997
|
-
|
|
998
|
-
success, _ =
|
|
997
|
+
dashboard_manager = UnifiedDashboardManager(logger)
|
|
998
|
+
success, _ = dashboard_manager.start_server(port=port)
|
|
999
999
|
return success
|
|
1000
1000
|
|
|
1001
1001
|
|
|
1002
1002
|
def open_in_browser_tab(url, logger):
|
|
1003
1003
|
"""Open URL in browser, attempting to reuse existing tabs when possible."""
|
|
1004
|
-
|
|
1005
|
-
return
|
|
1004
|
+
manager = UnifiedDashboardManager(logger)
|
|
1005
|
+
return manager.open_browser(url)
|
|
1006
1006
|
|
|
1007
1007
|
|
|
1008
1008
|
def _check_claude_json_memory(args, logger):
|
claude_mpm/cli/parser.py
CHANGED
|
@@ -19,8 +19,85 @@ REFACTORING NOTE: The original 961-line create_parser function has been split in
|
|
|
19
19
|
- parsers/mcp_parser.py: MCP Gateway commands
|
|
20
20
|
"""
|
|
21
21
|
|
|
22
|
-
|
|
23
|
-
|
|
22
|
+
import argparse
|
|
23
|
+
import sys
|
|
24
|
+
from typing import List, Optional
|
|
25
|
+
|
|
26
|
+
# Try to import from the new modular structure with helpful error handling
|
|
27
|
+
try:
|
|
28
|
+
from .parsers import add_common_arguments, create_parser, preprocess_args
|
|
29
|
+
except ImportError as e:
|
|
30
|
+
# Provide a helpful error message for users with outdated installations
|
|
31
|
+
error_msg = f"""
|
|
32
|
+
╔══════════════════════════════════════════════════════════════════╗
|
|
33
|
+
║ Claude MPM Import Error ║
|
|
34
|
+
╠══════════════════════════════════════════════════════════════════╣
|
|
35
|
+
║ ║
|
|
36
|
+
║ Unable to import required modules: {e!s} ║
|
|
37
|
+
║ ║
|
|
38
|
+
║ This typically happens when: ║
|
|
39
|
+
║ • The installation is outdated or incomplete ║
|
|
40
|
+
║ • Files are missing from your installation ║
|
|
41
|
+
║ • You're using an old cached version from pipx ║
|
|
42
|
+
║ ║
|
|
43
|
+
║ ┌─────────────────────────────────────────────────────────┐ ║
|
|
44
|
+
║ │ To fix this issue, please try one of these solutions: │ ║
|
|
45
|
+
║ └─────────────────────────────────────────────────────────┘ ║
|
|
46
|
+
║ ║
|
|
47
|
+
║ 1. If installed with pipx (recommended): ║
|
|
48
|
+
║ ➜ pipx reinstall claude-mpm ║
|
|
49
|
+
║ ║
|
|
50
|
+
║ 2. If installed with pip: ║
|
|
51
|
+
║ ➜ pip install --upgrade --force-reinstall claude-mpm ║
|
|
52
|
+
║ ║
|
|
53
|
+
║ 3. For development installations: ║
|
|
54
|
+
║ ➜ pip install -e . --force-reinstall ║
|
|
55
|
+
║ ║
|
|
56
|
+
║ 4. Clear pipx cache and reinstall (if pipx issues persist): ║
|
|
57
|
+
║ ➜ pipx uninstall claude-mpm ║
|
|
58
|
+
║ ➜ pipx install claude-mpm ║
|
|
59
|
+
║ ║
|
|
60
|
+
╚══════════════════════════════════════════════════════════════════╝
|
|
61
|
+
"""
|
|
62
|
+
print(error_msg, file=sys.stderr)
|
|
63
|
+
|
|
64
|
+
# Provide minimal fallback functionality to at least show help
|
|
65
|
+
def create_parser(version: str = "Unknown") -> argparse.ArgumentParser:
|
|
66
|
+
"""Emergency fallback parser that shows reinstallation instructions."""
|
|
67
|
+
parser = argparse.ArgumentParser(
|
|
68
|
+
prog="claude-mpm",
|
|
69
|
+
description="Claude Multi-Agent Project Manager (Installation Error - Please Reinstall)",
|
|
70
|
+
formatter_class=argparse.RawDescriptionHelpFormatter,
|
|
71
|
+
epilog="""
|
|
72
|
+
This installation appears to be incomplete or outdated.
|
|
73
|
+
Please reinstall using one of the methods shown above.
|
|
74
|
+
""",
|
|
75
|
+
)
|
|
76
|
+
parser.add_argument(
|
|
77
|
+
"--version",
|
|
78
|
+
action="version",
|
|
79
|
+
version=f"{version} (installation error - please reinstall)",
|
|
80
|
+
)
|
|
81
|
+
return parser
|
|
82
|
+
|
|
83
|
+
def add_common_arguments(parser: argparse.ArgumentParser) -> None:
|
|
84
|
+
"""Emergency fallback - no common arguments available."""
|
|
85
|
+
|
|
86
|
+
def preprocess_args(args: Optional[List[str]] = None) -> List[str]:
|
|
87
|
+
"""Emergency fallback - return args unchanged."""
|
|
88
|
+
return args if args is not None else sys.argv[1:]
|
|
89
|
+
|
|
90
|
+
# Exit with error code to indicate the problem
|
|
91
|
+
# Don't exit immediately - let the user see --help if requested
|
|
92
|
+
import atexit
|
|
93
|
+
|
|
94
|
+
atexit.register(
|
|
95
|
+
lambda: (
|
|
96
|
+
sys.exit(1)
|
|
97
|
+
if "--help" not in sys.argv and "--version" not in sys.argv
|
|
98
|
+
else None
|
|
99
|
+
)
|
|
100
|
+
)
|
|
24
101
|
|
|
25
102
|
# Re-export for backward compatibility
|
|
26
103
|
__all__ = ["add_common_arguments", "create_parser", "preprocess_args"]
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"""
|
|
2
|
+
CLI parsers package for claude-mpm.
|
|
3
|
+
|
|
4
|
+
This package contains modular parser components that were extracted from the
|
|
5
|
+
monolithic parser.py file to improve maintainability and organization.
|
|
6
|
+
|
|
7
|
+
WHY: The original parser.py was 1,166 lines with a single 961-line function.
|
|
8
|
+
Breaking it into focused modules makes it easier to maintain and test.
|
|
9
|
+
|
|
10
|
+
DESIGN DECISION: Each parser module handles a specific command domain:
|
|
11
|
+
- base_parser.py: Common arguments and main parser setup
|
|
12
|
+
- run_parser.py: Run command arguments
|
|
13
|
+
- agent_parser.py: Agent management commands
|
|
14
|
+
- memory_parser.py: Memory management commands
|
|
15
|
+
- tickets_parser.py: Ticket management commands
|
|
16
|
+
- config_parser.py: Configuration commands
|
|
17
|
+
- monitor_parser.py: Monitoring commands
|
|
18
|
+
- mcp_parser.py: MCP Gateway commands
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
from .base_parser import add_common_arguments, create_parser, preprocess_args
|
|
22
|
+
from .run_parser import add_run_arguments
|
|
23
|
+
|
|
24
|
+
__all__ = [
|
|
25
|
+
"add_common_arguments",
|
|
26
|
+
"add_run_arguments",
|
|
27
|
+
"create_parser",
|
|
28
|
+
"preprocess_args",
|
|
29
|
+
]
|
|
@@ -7,6 +7,14 @@
|
|
|
7
7
|
background: #f8f9fa;
|
|
8
8
|
}
|
|
9
9
|
|
|
10
|
+
/* Container for Code Tree - Now full width */
|
|
11
|
+
.code-split-container {
|
|
12
|
+
display: flex;
|
|
13
|
+
flex: 1;
|
|
14
|
+
padding: 10px;
|
|
15
|
+
overflow: hidden;
|
|
16
|
+
}
|
|
17
|
+
|
|
10
18
|
/* Advanced Options - Always Visible */
|
|
11
19
|
.code-advanced-options-visible {
|
|
12
20
|
background: white;
|
|
@@ -452,22 +460,26 @@
|
|
|
452
460
|
color: #2d3748;
|
|
453
461
|
}
|
|
454
462
|
|
|
455
|
-
/* Code Tree Container */
|
|
463
|
+
/* Code Tree Container - Full Width */
|
|
456
464
|
.code-tree-container {
|
|
457
465
|
flex: 1;
|
|
458
466
|
background: white;
|
|
459
467
|
border-radius: 8px;
|
|
460
468
|
padding: 20px;
|
|
461
469
|
position: relative;
|
|
462
|
-
overflow:
|
|
470
|
+
overflow: auto;
|
|
463
471
|
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05);
|
|
464
|
-
border
|
|
472
|
+
border: 1px solid #e2e8f0;
|
|
465
473
|
}
|
|
466
474
|
|
|
475
|
+
/* Code Content Area - DEPRECATED (Removed duplicate pane) */
|
|
476
|
+
/* Content now displayed in main Structured Data section */
|
|
477
|
+
/* .code-module-data-content class removed */
|
|
478
|
+
|
|
467
479
|
/* Visual hierarchy improvements */
|
|
468
480
|
.code-tree-container:focus-within {
|
|
469
481
|
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
|
|
470
|
-
border-
|
|
482
|
+
border-color: #3b82f6;
|
|
471
483
|
}
|
|
472
484
|
|
|
473
485
|
/* Loading indicator */
|
|
@@ -2814,7 +2814,8 @@ button:disabled:hover {
|
|
|
2814
2814
|
color: #f1fa8c;
|
|
2815
2815
|
}
|
|
2816
2816
|
|
|
2817
|
-
.file-content-code .number
|
|
2817
|
+
.file-content-code .number,
|
|
2818
|
+
.source-line .number {
|
|
2818
2819
|
color: #bd93f9;
|
|
2819
2820
|
}
|
|
2820
2821
|
|
|
@@ -2826,6 +2827,19 @@ button:disabled:hover {
|
|
|
2826
2827
|
color: #8be9fd;
|
|
2827
2828
|
}
|
|
2828
2829
|
|
|
2830
|
+
/* JSON-specific syntax highlighting */
|
|
2831
|
+
.file-content-code .json-key,
|
|
2832
|
+
.source-line .json-key {
|
|
2833
|
+
color: #8be9fd;
|
|
2834
|
+
font-weight: 600;
|
|
2835
|
+
}
|
|
2836
|
+
|
|
2837
|
+
.file-content-code .literal,
|
|
2838
|
+
.source-line .literal {
|
|
2839
|
+
color: #ff79c6;
|
|
2840
|
+
font-weight: 600;
|
|
2841
|
+
}
|
|
2842
|
+
|
|
2829
2843
|
.file-content-code .selector {
|
|
2830
2844
|
color: #ff79c6;
|
|
2831
2845
|
}
|