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.
Files changed (57) hide show
  1. claude_mpm/VERSION +1 -1
  2. claude_mpm/cli/commands/dashboard.py +62 -120
  3. claude_mpm/cli/commands/monitor.py +71 -212
  4. claude_mpm/cli/commands/run.py +33 -33
  5. claude_mpm/cli/parser.py +79 -2
  6. claude_mpm/cli/parsers/__init__.py +29 -0
  7. claude_mpm/dashboard/static/css/code-tree.css +16 -4
  8. claude_mpm/dashboard/static/css/dashboard.css +15 -1
  9. claude_mpm/dashboard/static/dist/components/code-tree.js +1 -1
  10. claude_mpm/dashboard/static/dist/components/file-viewer.js +2 -0
  11. claude_mpm/dashboard/static/dist/components/module-viewer.js +1 -1
  12. claude_mpm/dashboard/static/dist/components/unified-data-viewer.js +1 -1
  13. claude_mpm/dashboard/static/dist/dashboard.js +1 -1
  14. claude_mpm/dashboard/static/dist/socket-client.js +1 -1
  15. claude_mpm/dashboard/static/js/components/code-tree.js +775 -142
  16. claude_mpm/dashboard/static/js/components/file-viewer.js +538 -0
  17. claude_mpm/dashboard/static/js/components/module-viewer.js +26 -0
  18. claude_mpm/dashboard/static/js/components/unified-data-viewer.js +166 -14
  19. claude_mpm/dashboard/static/js/dashboard.js +108 -91
  20. claude_mpm/dashboard/static/js/socket-client.js +9 -7
  21. claude_mpm/dashboard/templates/index.html +5 -2
  22. claude_mpm/hooks/claude_hooks/hook_handler.py +1 -11
  23. claude_mpm/hooks/claude_hooks/services/connection_manager.py +54 -59
  24. claude_mpm/hooks/claude_hooks/services/connection_manager_http.py +112 -72
  25. claude_mpm/services/agents/deployment/agent_format_converter.py +3 -3
  26. claude_mpm/services/agents/deployment/agent_template_builder.py +3 -5
  27. claude_mpm/services/cli/unified_dashboard_manager.py +354 -0
  28. claude_mpm/services/monitor/__init__.py +20 -0
  29. claude_mpm/services/monitor/daemon.py +256 -0
  30. claude_mpm/services/monitor/event_emitter.py +279 -0
  31. claude_mpm/services/monitor/handlers/__init__.py +20 -0
  32. claude_mpm/services/monitor/handlers/code_analysis.py +334 -0
  33. claude_mpm/services/monitor/handlers/dashboard.py +298 -0
  34. claude_mpm/services/monitor/handlers/hooks.py +491 -0
  35. claude_mpm/services/monitor/management/__init__.py +18 -0
  36. claude_mpm/services/monitor/management/health.py +124 -0
  37. claude_mpm/services/monitor/management/lifecycle.py +298 -0
  38. claude_mpm/services/monitor/server.py +442 -0
  39. claude_mpm/services/socketio/client_proxy.py +20 -12
  40. claude_mpm/services/socketio/dashboard_server.py +4 -4
  41. claude_mpm/services/socketio/monitor_client.py +4 -6
  42. claude_mpm/tools/code_tree_analyzer.py +33 -17
  43. {claude_mpm-4.2.7.dist-info → claude_mpm-4.2.11.dist-info}/METADATA +1 -1
  44. {claude_mpm-4.2.7.dist-info → claude_mpm-4.2.11.dist-info}/RECORD +48 -43
  45. claude_mpm/cli/commands/socketio_monitor.py +0 -233
  46. claude_mpm/scripts/socketio_daemon.py +0 -571
  47. claude_mpm/scripts/socketio_daemon_hardened.py +0 -937
  48. claude_mpm/scripts/socketio_daemon_wrapper.py +0 -78
  49. claude_mpm/scripts/socketio_server_manager.py +0 -349
  50. claude_mpm/services/cli/dashboard_launcher.py +0 -423
  51. claude_mpm/services/cli/socketio_manager.py +0 -595
  52. claude_mpm/services/dashboard/stable_server.py +0 -962
  53. claude_mpm/services/socketio/monitor_server.py +0 -505
  54. {claude_mpm-4.2.7.dist-info → claude_mpm-4.2.11.dist-info}/WHEEL +0 -0
  55. {claude_mpm-4.2.7.dist-info → claude_mpm-4.2.11.dist-info}/entry_points.txt +0 -0
  56. {claude_mpm-4.2.7.dist-info → claude_mpm-4.2.11.dist-info}/licenses/LICENSE +0 -0
  57. {claude_mpm-4.2.7.dist-info → claude_mpm-4.2.11.dist-info}/top_level.txt +0 -0
@@ -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
- from ...services.cli.socketio_manager import SocketIOManager
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 SocketIOManager."""
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 SocketIOManager for server management
432
- socketio_manager = SocketIOManager(self.logger)
432
+ # Use UnifiedDashboardManager for server management
433
+ dashboard_manager = UnifiedDashboardManager(self.logger)
433
434
 
434
435
  # Check dependencies
435
- deps_ok, error_msg = socketio_manager.ensure_dependencies()
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 = socketio_manager.find_available_port(8765)
444
- success, server_info = socketio_manager.start_server(
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 DashboardLauncher for browser opening only
455
- dashboard_launcher = DashboardLauncher(self.logger)
456
- monitor_url = dashboard_launcher.get_dashboard_url(websocket_port)
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 = dashboard_launcher._open_browser(monitor_url)
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 SocketIOManager for server management
859
- socketio_manager = SocketIOManager(logger)
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 = socketio_manager.ensure_dependencies()
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 = socketio_manager.find_available_port(websocket_port)
878
- success, server_info = socketio_manager.start_server(
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 DashboardLauncher for browser opening
890
- dashboard_launcher = DashboardLauncher(logger)
891
- monitor_url = dashboard_launcher.get_dashboard_url(websocket_port)
892
- browser_opened = dashboard_launcher._open_browser(monitor_url)
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 SocketIOManager
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
- socketio_manager = SocketIOManager(logger)
978
- success, server_info = socketio_manager.start_server(port=port)
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 DashboardLauncher
982
- launcher = DashboardLauncher(logger)
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
- socketio_manager = SocketIOManager(logger)
992
- return socketio_manager.is_server_running(port)
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
- socketio_manager = SocketIOManager(logger)
998
- success, _ = socketio_manager.start_server(port=port)
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
- launcher = DashboardLauncher(logger)
1005
- return launcher._open_browser(url)
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
- # Import from the new modular structure
23
- from .parsers import add_common_arguments, create_parser, preprocess_args
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: hidden;
470
+ overflow: auto;
463
471
  box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05);
464
- border-left: 1px solid #e2e8f0;
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-left-color: #3b82f6;
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
  }