claude-mpm 4.1.1__py3-none-any.whl → 4.1.2__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/BUILD_NUMBER +1 -1
- claude_mpm/VERSION +1 -1
- claude_mpm/__main__.py +1 -1
- claude_mpm/agents/BASE_PM.md +74 -46
- claude_mpm/agents/INSTRUCTIONS.md +11 -153
- claude_mpm/agents/WORKFLOW.md +61 -321
- claude_mpm/agents/__init__.py +11 -11
- claude_mpm/agents/agent_loader.py +23 -20
- claude_mpm/agents/agent_loader_integration.py +1 -1
- claude_mpm/agents/agents_metadata.py +27 -0
- claude_mpm/agents/async_agent_loader.py +5 -8
- claude_mpm/agents/base_agent_loader.py +36 -25
- claude_mpm/agents/frontmatter_validator.py +6 -6
- claude_mpm/agents/schema/agent_schema.json +1 -1
- claude_mpm/agents/system_agent_config.py +9 -9
- claude_mpm/agents/templates/api_qa.json +47 -2
- claude_mpm/agents/templates/imagemagick.json +256 -0
- claude_mpm/agents/templates/qa.json +41 -2
- claude_mpm/agents/templates/ticketing.json +5 -5
- claude_mpm/agents/templates/web_qa.json +50 -2
- claude_mpm/cli/__init__.py +51 -46
- claude_mpm/cli/__main__.py +1 -1
- claude_mpm/cli/commands/__init__.py +10 -12
- claude_mpm/cli/commands/agent_manager.py +186 -181
- claude_mpm/cli/commands/agents.py +271 -268
- claude_mpm/cli/commands/aggregate.py +30 -29
- claude_mpm/cli/commands/cleanup.py +50 -44
- claude_mpm/cli/commands/cleanup_orphaned_agents.py +25 -25
- claude_mpm/cli/commands/config.py +162 -127
- claude_mpm/cli/commands/doctor.py +52 -62
- claude_mpm/cli/commands/info.py +37 -25
- claude_mpm/cli/commands/mcp.py +3 -7
- claude_mpm/cli/commands/mcp_command_router.py +14 -18
- claude_mpm/cli/commands/mcp_install_commands.py +28 -23
- claude_mpm/cli/commands/mcp_pipx_config.py +58 -49
- claude_mpm/cli/commands/mcp_server_commands.py +23 -17
- claude_mpm/cli/commands/memory.py +192 -141
- claude_mpm/cli/commands/monitor.py +117 -88
- claude_mpm/cli/commands/run.py +120 -84
- claude_mpm/cli/commands/run_config_checker.py +4 -5
- claude_mpm/cli/commands/socketio_monitor.py +17 -19
- claude_mpm/cli/commands/tickets.py +92 -92
- claude_mpm/cli/parser.py +1 -5
- claude_mpm/cli/parsers/__init__.py +1 -1
- claude_mpm/cli/parsers/agent_manager_parser.py +50 -98
- claude_mpm/cli/parsers/agents_parser.py +2 -3
- claude_mpm/cli/parsers/base_parser.py +7 -5
- claude_mpm/cli/parsers/mcp_parser.py +4 -2
- claude_mpm/cli/parsers/monitor_parser.py +26 -18
- claude_mpm/cli/shared/__init__.py +10 -10
- claude_mpm/cli/shared/argument_patterns.py +57 -71
- claude_mpm/cli/shared/base_command.py +61 -53
- claude_mpm/cli/shared/error_handling.py +62 -58
- claude_mpm/cli/shared/output_formatters.py +78 -77
- claude_mpm/cli/startup_logging.py +204 -172
- claude_mpm/cli/utils.py +10 -11
- claude_mpm/cli_module/__init__.py +1 -1
- claude_mpm/cli_module/args.py +1 -1
- claude_mpm/cli_module/migration_example.py +5 -5
- claude_mpm/config/__init__.py +9 -9
- claude_mpm/config/agent_config.py +15 -14
- claude_mpm/config/experimental_features.py +4 -4
- claude_mpm/config/paths.py +0 -1
- claude_mpm/config/socketio_config.py +5 -6
- claude_mpm/constants.py +1 -2
- claude_mpm/core/__init__.py +8 -8
- claude_mpm/core/agent_name_normalizer.py +1 -1
- claude_mpm/core/agent_registry.py +20 -23
- claude_mpm/core/agent_session_manager.py +3 -3
- claude_mpm/core/base_service.py +7 -15
- claude_mpm/core/cache.py +4 -6
- claude_mpm/core/claude_runner.py +85 -113
- claude_mpm/core/config.py +43 -28
- claude_mpm/core/config_aliases.py +0 -9
- claude_mpm/core/config_constants.py +52 -30
- claude_mpm/core/constants.py +0 -1
- claude_mpm/core/container.py +18 -27
- claude_mpm/core/exceptions.py +2 -2
- claude_mpm/core/factories.py +10 -12
- claude_mpm/core/framework_loader.py +581 -280
- claude_mpm/core/hook_manager.py +26 -22
- claude_mpm/core/hook_performance_config.py +58 -47
- claude_mpm/core/injectable_service.py +1 -1
- claude_mpm/core/interactive_session.py +61 -152
- claude_mpm/core/interfaces.py +1 -100
- claude_mpm/core/lazy.py +5 -5
- claude_mpm/core/log_manager.py +587 -0
- claude_mpm/core/logger.py +125 -8
- claude_mpm/core/logging_config.py +15 -15
- claude_mpm/core/minimal_framework_loader.py +5 -8
- claude_mpm/core/oneshot_session.py +15 -33
- claude_mpm/core/optimized_agent_loader.py +4 -6
- claude_mpm/core/optimized_startup.py +2 -1
- claude_mpm/core/output_style_manager.py +147 -106
- claude_mpm/core/pm_hook_interceptor.py +0 -1
- claude_mpm/core/service_registry.py +11 -8
- claude_mpm/core/session_manager.py +1 -2
- claude_mpm/core/shared/__init__.py +1 -1
- claude_mpm/core/shared/config_loader.py +101 -97
- claude_mpm/core/shared/path_resolver.py +72 -68
- claude_mpm/core/shared/singleton_manager.py +56 -50
- claude_mpm/core/socketio_pool.py +26 -6
- claude_mpm/core/tool_access_control.py +4 -5
- claude_mpm/core/typing_utils.py +50 -59
- claude_mpm/core/unified_agent_registry.py +14 -19
- claude_mpm/core/unified_config.py +4 -6
- claude_mpm/core/unified_paths.py +197 -109
- claude_mpm/dashboard/open_dashboard.py +2 -4
- claude_mpm/experimental/cli_enhancements.py +51 -36
- claude_mpm/generators/agent_profile_generator.py +2 -4
- claude_mpm/hooks/base_hook.py +1 -2
- claude_mpm/hooks/claude_hooks/connection_pool.py +72 -26
- claude_mpm/hooks/claude_hooks/event_handlers.py +93 -38
- claude_mpm/hooks/claude_hooks/hook_handler.py +130 -76
- claude_mpm/hooks/claude_hooks/hook_handler_eventbus.py +104 -77
- claude_mpm/hooks/claude_hooks/memory_integration.py +2 -4
- claude_mpm/hooks/claude_hooks/response_tracking.py +15 -11
- claude_mpm/hooks/claude_hooks/tool_analysis.py +12 -18
- claude_mpm/hooks/memory_integration_hook.py +5 -5
- claude_mpm/hooks/tool_call_interceptor.py +1 -1
- claude_mpm/hooks/validation_hooks.py +4 -4
- claude_mpm/init.py +4 -9
- claude_mpm/models/__init__.py +2 -2
- claude_mpm/models/agent_session.py +11 -14
- claude_mpm/scripts/mcp_server.py +20 -11
- claude_mpm/scripts/mcp_wrapper.py +5 -5
- claude_mpm/scripts/mpm_doctor.py +321 -0
- claude_mpm/scripts/socketio_daemon.py +28 -25
- claude_mpm/scripts/socketio_daemon_hardened.py +298 -258
- claude_mpm/scripts/socketio_server_manager.py +116 -95
- claude_mpm/services/__init__.py +49 -49
- claude_mpm/services/agent_capabilities_service.py +12 -18
- claude_mpm/services/agents/__init__.py +22 -22
- claude_mpm/services/agents/agent_builder.py +140 -119
- claude_mpm/services/agents/deployment/__init__.py +3 -3
- claude_mpm/services/agents/deployment/agent_config_provider.py +9 -9
- claude_mpm/services/agents/deployment/agent_configuration_manager.py +19 -20
- claude_mpm/services/agents/deployment/agent_definition_factory.py +1 -5
- claude_mpm/services/agents/deployment/agent_deployment.py +136 -106
- claude_mpm/services/agents/deployment/agent_discovery_service.py +4 -8
- claude_mpm/services/agents/deployment/agent_environment_manager.py +2 -7
- claude_mpm/services/agents/deployment/agent_filesystem_manager.py +6 -10
- claude_mpm/services/agents/deployment/agent_format_converter.py +11 -15
- claude_mpm/services/agents/deployment/agent_frontmatter_validator.py +2 -3
- claude_mpm/services/agents/deployment/agent_lifecycle_manager.py +5 -5
- claude_mpm/services/agents/deployment/agent_metrics_collector.py +13 -19
- claude_mpm/services/agents/deployment/agent_restore_handler.py +0 -1
- claude_mpm/services/agents/deployment/agent_template_builder.py +26 -35
- claude_mpm/services/agents/deployment/agent_validator.py +0 -1
- claude_mpm/services/agents/deployment/agent_version_manager.py +7 -9
- claude_mpm/services/agents/deployment/agent_versioning.py +3 -3
- claude_mpm/services/agents/deployment/agents_directory_resolver.py +6 -7
- claude_mpm/services/agents/deployment/async_agent_deployment.py +51 -38
- claude_mpm/services/agents/deployment/config/__init__.py +1 -1
- claude_mpm/services/agents/deployment/config/deployment_config.py +7 -8
- claude_mpm/services/agents/deployment/deployment_type_detector.py +1 -1
- claude_mpm/services/agents/deployment/deployment_wrapper.py +18 -18
- claude_mpm/services/agents/deployment/facade/__init__.py +1 -1
- claude_mpm/services/agents/deployment/facade/deployment_executor.py +0 -3
- claude_mpm/services/agents/deployment/facade/deployment_facade.py +3 -4
- claude_mpm/services/agents/deployment/interface_adapter.py +5 -7
- claude_mpm/services/agents/deployment/multi_source_deployment_service.py +345 -276
- claude_mpm/services/agents/deployment/pipeline/__init__.py +2 -2
- claude_mpm/services/agents/deployment/pipeline/pipeline_builder.py +1 -1
- claude_mpm/services/agents/deployment/pipeline/pipeline_context.py +6 -4
- claude_mpm/services/agents/deployment/pipeline/pipeline_executor.py +3 -3
- claude_mpm/services/agents/deployment/pipeline/steps/__init__.py +2 -2
- claude_mpm/services/agents/deployment/pipeline/steps/agent_processing_step.py +14 -13
- claude_mpm/services/agents/deployment/pipeline/steps/base_step.py +0 -1
- claude_mpm/services/agents/deployment/pipeline/steps/configuration_step.py +1 -1
- claude_mpm/services/agents/deployment/pipeline/steps/target_directory_step.py +8 -9
- claude_mpm/services/agents/deployment/pipeline/steps/validation_step.py +1 -1
- claude_mpm/services/agents/deployment/processors/__init__.py +1 -1
- claude_mpm/services/agents/deployment/processors/agent_processor.py +20 -16
- claude_mpm/services/agents/deployment/refactored_agent_deployment_service.py +5 -12
- claude_mpm/services/agents/deployment/results/__init__.py +1 -1
- claude_mpm/services/agents/deployment/results/deployment_result_builder.py +1 -1
- claude_mpm/services/agents/deployment/strategies/__init__.py +2 -2
- claude_mpm/services/agents/deployment/strategies/base_strategy.py +1 -7
- claude_mpm/services/agents/deployment/strategies/project_strategy.py +1 -4
- claude_mpm/services/agents/deployment/strategies/system_strategy.py +2 -3
- claude_mpm/services/agents/deployment/strategies/user_strategy.py +3 -7
- claude_mpm/services/agents/deployment/validation/__init__.py +1 -1
- claude_mpm/services/agents/deployment/validation/agent_validator.py +1 -1
- claude_mpm/services/agents/deployment/validation/template_validator.py +2 -2
- claude_mpm/services/agents/deployment/validation/validation_result.py +2 -6
- claude_mpm/services/agents/loading/__init__.py +1 -1
- claude_mpm/services/agents/loading/agent_profile_loader.py +6 -12
- claude_mpm/services/agents/loading/base_agent_manager.py +5 -5
- claude_mpm/services/agents/loading/framework_agent_loader.py +2 -4
- claude_mpm/services/agents/management/__init__.py +1 -1
- claude_mpm/services/agents/management/agent_capabilities_generator.py +1 -3
- claude_mpm/services/agents/management/agent_management_service.py +5 -9
- claude_mpm/services/agents/memory/__init__.py +4 -4
- claude_mpm/services/agents/memory/agent_memory_manager.py +280 -160
- claude_mpm/services/agents/memory/agent_persistence_service.py +0 -2
- claude_mpm/services/agents/memory/content_manager.py +44 -38
- claude_mpm/services/agents/memory/template_generator.py +4 -6
- claude_mpm/services/agents/registry/__init__.py +10 -6
- claude_mpm/services/agents/registry/deployed_agent_discovery.py +30 -27
- claude_mpm/services/agents/registry/modification_tracker.py +3 -6
- claude_mpm/services/async_session_logger.py +1 -2
- claude_mpm/services/claude_session_logger.py +1 -2
- claude_mpm/services/command_deployment_service.py +173 -0
- claude_mpm/services/command_handler_service.py +20 -22
- claude_mpm/services/core/__init__.py +25 -25
- claude_mpm/services/core/base.py +0 -5
- claude_mpm/services/core/interfaces/__init__.py +32 -32
- claude_mpm/services/core/interfaces/agent.py +0 -21
- claude_mpm/services/core/interfaces/communication.py +0 -27
- claude_mpm/services/core/interfaces/infrastructure.py +0 -56
- claude_mpm/services/core/interfaces/service.py +0 -29
- claude_mpm/services/diagnostics/__init__.py +1 -1
- claude_mpm/services/diagnostics/checks/__init__.py +6 -6
- claude_mpm/services/diagnostics/checks/agent_check.py +89 -80
- claude_mpm/services/diagnostics/checks/base_check.py +12 -16
- claude_mpm/services/diagnostics/checks/claude_desktop_check.py +84 -81
- claude_mpm/services/diagnostics/checks/common_issues_check.py +99 -91
- claude_mpm/services/diagnostics/checks/configuration_check.py +82 -77
- claude_mpm/services/diagnostics/checks/filesystem_check.py +67 -68
- claude_mpm/services/diagnostics/checks/installation_check.py +254 -94
- claude_mpm/services/diagnostics/checks/mcp_check.py +90 -88
- claude_mpm/services/diagnostics/checks/monitor_check.py +75 -76
- claude_mpm/services/diagnostics/checks/startup_log_check.py +67 -73
- claude_mpm/services/diagnostics/diagnostic_runner.py +67 -59
- claude_mpm/services/diagnostics/doctor_reporter.py +107 -70
- claude_mpm/services/diagnostics/models.py +21 -19
- claude_mpm/services/event_aggregator.py +10 -17
- claude_mpm/services/event_bus/__init__.py +1 -1
- claude_mpm/services/event_bus/config.py +54 -35
- claude_mpm/services/event_bus/event_bus.py +76 -71
- claude_mpm/services/event_bus/relay.py +74 -64
- claude_mpm/services/events/__init__.py +11 -11
- claude_mpm/services/events/consumers/__init__.py +3 -3
- claude_mpm/services/events/consumers/dead_letter.py +71 -63
- claude_mpm/services/events/consumers/logging.py +39 -37
- claude_mpm/services/events/consumers/metrics.py +56 -57
- claude_mpm/services/events/consumers/socketio.py +82 -81
- claude_mpm/services/events/core.py +110 -99
- claude_mpm/services/events/interfaces.py +56 -72
- claude_mpm/services/events/producers/__init__.py +1 -1
- claude_mpm/services/events/producers/hook.py +38 -38
- claude_mpm/services/events/producers/system.py +46 -44
- claude_mpm/services/exceptions.py +81 -80
- claude_mpm/services/framework_claude_md_generator/__init__.py +2 -4
- claude_mpm/services/framework_claude_md_generator/content_assembler.py +3 -5
- claude_mpm/services/framework_claude_md_generator/content_validator.py +1 -1
- claude_mpm/services/framework_claude_md_generator/deployment_manager.py +4 -4
- claude_mpm/services/framework_claude_md_generator/section_generators/__init__.py +0 -1
- claude_mpm/services/framework_claude_md_generator/section_generators/agents.py +0 -2
- claude_mpm/services/framework_claude_md_generator/version_manager.py +4 -5
- claude_mpm/services/hook_service.py +6 -9
- claude_mpm/services/infrastructure/__init__.py +1 -1
- claude_mpm/services/infrastructure/context_preservation.py +8 -12
- claude_mpm/services/infrastructure/monitoring.py +21 -23
- claude_mpm/services/mcp_gateway/__init__.py +37 -37
- claude_mpm/services/mcp_gateway/auto_configure.py +95 -103
- claude_mpm/services/mcp_gateway/config/__init__.py +1 -1
- claude_mpm/services/mcp_gateway/config/config_loader.py +23 -25
- claude_mpm/services/mcp_gateway/config/config_schema.py +5 -5
- claude_mpm/services/mcp_gateway/config/configuration.py +9 -6
- claude_mpm/services/mcp_gateway/core/__init__.py +10 -10
- claude_mpm/services/mcp_gateway/core/base.py +0 -3
- claude_mpm/services/mcp_gateway/core/interfaces.py +1 -38
- claude_mpm/services/mcp_gateway/core/process_pool.py +99 -93
- claude_mpm/services/mcp_gateway/core/singleton_manager.py +65 -62
- claude_mpm/services/mcp_gateway/core/startup_verification.py +75 -74
- claude_mpm/services/mcp_gateway/main.py +2 -1
- claude_mpm/services/mcp_gateway/registry/service_registry.py +5 -8
- claude_mpm/services/mcp_gateway/registry/tool_registry.py +1 -1
- claude_mpm/services/mcp_gateway/server/__init__.py +1 -1
- claude_mpm/services/mcp_gateway/server/mcp_gateway.py +12 -19
- claude_mpm/services/mcp_gateway/server/stdio_handler.py +4 -3
- claude_mpm/services/mcp_gateway/server/stdio_server.py +79 -71
- claude_mpm/services/mcp_gateway/tools/__init__.py +2 -2
- claude_mpm/services/mcp_gateway/tools/base_adapter.py +5 -6
- claude_mpm/services/mcp_gateway/tools/document_summarizer.py +13 -22
- claude_mpm/services/mcp_gateway/tools/health_check_tool.py +79 -78
- claude_mpm/services/mcp_gateway/tools/hello_world.py +12 -14
- claude_mpm/services/mcp_gateway/tools/ticket_tools.py +42 -49
- claude_mpm/services/mcp_gateway/tools/unified_ticket_tool.py +51 -55
- claude_mpm/services/memory/__init__.py +3 -3
- claude_mpm/services/memory/builder.py +3 -6
- claude_mpm/services/memory/cache/__init__.py +1 -1
- claude_mpm/services/memory/cache/shared_prompt_cache.py +3 -5
- claude_mpm/services/memory/cache/simple_cache.py +1 -1
- claude_mpm/services/memory/indexed_memory.py +5 -7
- claude_mpm/services/memory/optimizer.py +7 -10
- claude_mpm/services/memory/router.py +8 -9
- claude_mpm/services/memory_hook_service.py +48 -34
- claude_mpm/services/monitor_build_service.py +77 -73
- claude_mpm/services/port_manager.py +130 -108
- claude_mpm/services/project/analyzer.py +12 -10
- claude_mpm/services/project/registry.py +11 -11
- claude_mpm/services/recovery_manager.py +10 -19
- claude_mpm/services/response_tracker.py +0 -1
- claude_mpm/services/runner_configuration_service.py +19 -20
- claude_mpm/services/session_management_service.py +7 -11
- claude_mpm/services/shared/__init__.py +1 -1
- claude_mpm/services/shared/async_service_base.py +58 -50
- claude_mpm/services/shared/config_service_base.py +73 -67
- claude_mpm/services/shared/lifecycle_service_base.py +82 -78
- claude_mpm/services/shared/manager_base.py +94 -82
- claude_mpm/services/shared/service_factory.py +96 -98
- claude_mpm/services/socketio/__init__.py +3 -3
- claude_mpm/services/socketio/client_proxy.py +5 -5
- claude_mpm/services/socketio/event_normalizer.py +199 -181
- claude_mpm/services/socketio/handlers/__init__.py +3 -3
- claude_mpm/services/socketio/handlers/base.py +5 -4
- claude_mpm/services/socketio/handlers/connection.py +163 -136
- claude_mpm/services/socketio/handlers/file.py +13 -14
- claude_mpm/services/socketio/handlers/git.py +12 -7
- claude_mpm/services/socketio/handlers/hook.py +49 -44
- claude_mpm/services/socketio/handlers/memory.py +0 -1
- claude_mpm/services/socketio/handlers/project.py +0 -1
- claude_mpm/services/socketio/handlers/registry.py +37 -19
- claude_mpm/services/socketio/migration_utils.py +98 -84
- claude_mpm/services/socketio/server/__init__.py +1 -1
- claude_mpm/services/socketio/server/broadcaster.py +81 -87
- claude_mpm/services/socketio/server/core.py +65 -54
- claude_mpm/services/socketio/server/eventbus_integration.py +95 -56
- claude_mpm/services/socketio/server/main.py +64 -38
- claude_mpm/services/socketio_client_manager.py +10 -12
- claude_mpm/services/subprocess_launcher_service.py +4 -7
- claude_mpm/services/system_instructions_service.py +13 -14
- claude_mpm/services/ticket_manager.py +2 -2
- claude_mpm/services/utility_service.py +5 -13
- claude_mpm/services/version_control/__init__.py +16 -16
- claude_mpm/services/version_control/branch_strategy.py +5 -8
- claude_mpm/services/version_control/conflict_resolution.py +9 -23
- claude_mpm/services/version_control/git_operations.py +5 -7
- claude_mpm/services/version_control/semantic_versioning.py +16 -17
- claude_mpm/services/version_control/version_parser.py +13 -18
- claude_mpm/services/version_service.py +10 -11
- claude_mpm/storage/__init__.py +1 -1
- claude_mpm/storage/state_storage.py +22 -28
- claude_mpm/utils/__init__.py +6 -6
- claude_mpm/utils/agent_dependency_loader.py +47 -33
- claude_mpm/utils/config_manager.py +11 -14
- claude_mpm/utils/dependency_cache.py +1 -1
- claude_mpm/utils/dependency_manager.py +13 -17
- claude_mpm/utils/dependency_strategies.py +8 -10
- claude_mpm/utils/environment_context.py +3 -9
- claude_mpm/utils/error_handler.py +3 -13
- claude_mpm/utils/file_utils.py +1 -1
- claude_mpm/utils/path_operations.py +8 -12
- claude_mpm/utils/robust_installer.py +110 -33
- claude_mpm/utils/subprocess_utils.py +5 -6
- claude_mpm/validation/agent_validator.py +3 -6
- claude_mpm/validation/frontmatter_validator.py +1 -1
- {claude_mpm-4.1.1.dist-info → claude_mpm-4.1.2.dist-info}/METADATA +1 -1
- claude_mpm-4.1.2.dist-info/RECORD +498 -0
- claude_mpm-4.1.1.dist-info/RECORD +0 -494
- {claude_mpm-4.1.1.dist-info → claude_mpm-4.1.2.dist-info}/WHEEL +0 -0
- {claude_mpm-4.1.1.dist-info → claude_mpm-4.1.2.dist-info}/entry_points.txt +0 -0
- {claude_mpm-4.1.1.dist-info → claude_mpm-4.1.2.dist-info}/licenses/LICENSE +0 -0
- {claude_mpm-4.1.1.dist-info → claude_mpm-4.1.2.dist-info}/top_level.txt +0 -0
|
@@ -29,7 +29,7 @@ class MonitorCommand(BaseCommand):
|
|
|
29
29
|
def validate_args(self, args) -> Optional[str]:
|
|
30
30
|
"""Validate command arguments."""
|
|
31
31
|
# Monitor command allows no subcommand (defaults to status)
|
|
32
|
-
if hasattr(args,
|
|
32
|
+
if hasattr(args, "monitor_command") and args.monitor_command:
|
|
33
33
|
valid_commands = [cmd.value for cmd in MonitorCommands]
|
|
34
34
|
if args.monitor_command not in valid_commands:
|
|
35
35
|
return f"Unknown monitor command: {args.monitor_command}. Valid commands: {', '.join(valid_commands)}"
|
|
@@ -41,16 +41,18 @@ class MonitorCommand(BaseCommand):
|
|
|
41
41
|
try:
|
|
42
42
|
# Import ServerManager
|
|
43
43
|
from ...scripts.socketio_server_manager import ServerManager
|
|
44
|
+
|
|
44
45
|
server_manager = ServerManager()
|
|
45
46
|
|
|
46
47
|
# Handle default case (no subcommand)
|
|
47
|
-
if not hasattr(args,
|
|
48
|
+
if not hasattr(args, "monitor_command") or not args.monitor_command:
|
|
48
49
|
# Default to status
|
|
49
50
|
success = self._status_server(args, server_manager)
|
|
50
51
|
if success:
|
|
51
|
-
return CommandResult.success_result(
|
|
52
|
-
|
|
53
|
-
|
|
52
|
+
return CommandResult.success_result(
|
|
53
|
+
"Monitor status retrieved successfully"
|
|
54
|
+
)
|
|
55
|
+
return CommandResult.error_result("Failed to retrieve monitor status")
|
|
54
56
|
|
|
55
57
|
# Route to specific subcommand handlers
|
|
56
58
|
command_map = {
|
|
@@ -64,11 +66,15 @@ class MonitorCommand(BaseCommand):
|
|
|
64
66
|
if args.monitor_command in command_map:
|
|
65
67
|
success = command_map[args.monitor_command](args, server_manager)
|
|
66
68
|
if success:
|
|
67
|
-
return CommandResult.success_result(
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
69
|
+
return CommandResult.success_result(
|
|
70
|
+
f"Monitor {args.monitor_command} completed successfully"
|
|
71
|
+
)
|
|
72
|
+
return CommandResult.error_result(
|
|
73
|
+
f"Monitor {args.monitor_command} failed"
|
|
74
|
+
)
|
|
75
|
+
return CommandResult.error_result(
|
|
76
|
+
f"Unknown monitor command: {args.monitor_command}"
|
|
77
|
+
)
|
|
72
78
|
|
|
73
79
|
except Exception as e:
|
|
74
80
|
self.logger.error(f"Error executing monitor command: {e}", exc_info=True)
|
|
@@ -105,7 +111,7 @@ def manage_monitor(args):
|
|
|
105
111
|
result = command.execute(args)
|
|
106
112
|
|
|
107
113
|
# Print result if structured output format is requested
|
|
108
|
-
if hasattr(args,
|
|
114
|
+
if hasattr(args, "format") and args.format in ["json", "yaml"]:
|
|
109
115
|
command.print_result(result, args)
|
|
110
116
|
|
|
111
117
|
return result.exit_code
|
|
@@ -143,27 +149,26 @@ def manage_monitor_legacy(args):
|
|
|
143
149
|
success = _start_server(args, server_manager)
|
|
144
150
|
return 0 if success else 1
|
|
145
151
|
|
|
146
|
-
|
|
152
|
+
if args.monitor_command == MonitorCommands.STOP.value:
|
|
147
153
|
success = _stop_server(args, server_manager)
|
|
148
154
|
return 0 if success else 1
|
|
149
155
|
|
|
150
|
-
|
|
156
|
+
if args.monitor_command == MonitorCommands.RESTART.value:
|
|
151
157
|
success = _restart_server(args, server_manager)
|
|
152
158
|
return 0 if success else 1
|
|
153
159
|
|
|
154
|
-
|
|
160
|
+
if args.monitor_command == MonitorCommands.STATUS.value:
|
|
155
161
|
success = _status_server(args, server_manager)
|
|
156
162
|
return 0 if success else 1
|
|
157
163
|
|
|
158
|
-
|
|
164
|
+
if args.monitor_command == MonitorCommands.PORT.value:
|
|
159
165
|
success = _port_server(args, server_manager)
|
|
160
166
|
return 0 if success else 1
|
|
161
167
|
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
return 1
|
|
168
|
+
logger.error(f"Unknown monitor command: {args.monitor_command}")
|
|
169
|
+
print(f"Unknown monitor command: {args.monitor_command}")
|
|
170
|
+
print("Available commands: start, stop, restart, status, port")
|
|
171
|
+
return 1
|
|
167
172
|
|
|
168
173
|
except ImportError as e:
|
|
169
174
|
logger.error(f"Server manager not available: {e}")
|
|
@@ -206,47 +211,50 @@ def _port_server(args, server_manager):
|
|
|
206
211
|
try:
|
|
207
212
|
# Import PortManager to check port status
|
|
208
213
|
from ...services.port_manager import PortManager
|
|
214
|
+
|
|
209
215
|
port_manager = PortManager()
|
|
210
|
-
|
|
216
|
+
|
|
211
217
|
# Get detailed port status
|
|
212
218
|
port_status = port_manager.get_port_status(port)
|
|
213
|
-
|
|
219
|
+
|
|
214
220
|
# Check if port is in use
|
|
215
221
|
if not port_status["available"]:
|
|
216
222
|
process_info = port_status.get("process")
|
|
217
223
|
if process_info:
|
|
218
224
|
print(f"⚠️ Port {port} is in use:")
|
|
219
225
|
print(f" Process: {process_info['name']} (PID: {process_info['pid']})")
|
|
220
|
-
|
|
221
|
-
if process_info[
|
|
222
|
-
if process_info[
|
|
223
|
-
print(
|
|
226
|
+
|
|
227
|
+
if process_info["is_ours"]:
|
|
228
|
+
if process_info["is_debug"]:
|
|
229
|
+
print(" Type: Debug/Test script (can be reclaimed)")
|
|
224
230
|
if reclaim:
|
|
225
|
-
print(
|
|
231
|
+
print(" Action: Attempting to reclaim port...")
|
|
226
232
|
if port_manager.kill_process_on_port(port, force=force):
|
|
227
233
|
print(f" ✅ Successfully reclaimed port {port}")
|
|
228
234
|
else:
|
|
229
235
|
print(f" ❌ Failed to reclaim port {port}")
|
|
230
236
|
return False
|
|
231
|
-
elif process_info[
|
|
232
|
-
print(
|
|
237
|
+
elif process_info["is_daemon"]:
|
|
238
|
+
print(" Type: Daemon process")
|
|
233
239
|
if force:
|
|
234
|
-
print(
|
|
240
|
+
print(
|
|
241
|
+
" Action: Force killing daemon (--force flag used)..."
|
|
242
|
+
)
|
|
235
243
|
if port_manager.kill_process_on_port(port, force=True):
|
|
236
244
|
print(f" ✅ Successfully killed daemon on port {port}")
|
|
237
245
|
else:
|
|
238
246
|
print(f" ❌ Failed to kill daemon on port {port}")
|
|
239
247
|
return False
|
|
240
248
|
else:
|
|
241
|
-
print(
|
|
249
|
+
print(" ❌ Cannot start: Daemon already running")
|
|
242
250
|
print(f" Recommendation: {port_status['recommendation']}")
|
|
243
251
|
return False
|
|
244
252
|
else:
|
|
245
|
-
print(
|
|
253
|
+
print(" Type: External process")
|
|
246
254
|
print(f" ❌ Cannot start: {port_status['recommendation']}")
|
|
247
255
|
return False
|
|
248
256
|
print()
|
|
249
|
-
|
|
257
|
+
|
|
250
258
|
# Check if there are any running servers
|
|
251
259
|
running_servers = server_manager.list_running_servers()
|
|
252
260
|
|
|
@@ -280,7 +288,7 @@ def _port_server(args, server_manager):
|
|
|
280
288
|
print(f"Monitor server {action} successfully on port {port}")
|
|
281
289
|
print()
|
|
282
290
|
print("Server management commands:")
|
|
283
|
-
print(
|
|
291
|
+
print(" Status: ps aux | grep socketio")
|
|
284
292
|
print(f" Stop: claude-mpm monitor stop --port {port}")
|
|
285
293
|
print(f" Restart: claude-mpm monitor restart --port {port}")
|
|
286
294
|
print()
|
|
@@ -325,19 +333,22 @@ def _start_server(args, server_manager):
|
|
|
325
333
|
force = getattr(args, "force", False)
|
|
326
334
|
reclaim = getattr(args, "reclaim", True)
|
|
327
335
|
|
|
328
|
-
print(
|
|
329
|
-
|
|
336
|
+
print("Starting Socket.IO monitoring server...")
|
|
337
|
+
|
|
330
338
|
try:
|
|
331
339
|
# Import PortManager for smart port selection
|
|
332
340
|
from ...services.port_manager import PortManager
|
|
341
|
+
|
|
333
342
|
port_manager = PortManager()
|
|
334
|
-
|
|
343
|
+
|
|
335
344
|
# If no port specified, find an available one with smart reclaim
|
|
336
345
|
if port is None:
|
|
337
346
|
port = port_manager.find_available_port(reclaim=reclaim)
|
|
338
347
|
if port is None:
|
|
339
348
|
print("❌ No available ports found")
|
|
340
|
-
print(
|
|
349
|
+
print(
|
|
350
|
+
"Try specifying a port with --port or use --force to reclaim daemon ports"
|
|
351
|
+
)
|
|
341
352
|
return False
|
|
342
353
|
print(f"Selected port: {port}")
|
|
343
354
|
else:
|
|
@@ -346,9 +357,11 @@ def _start_server(args, server_manager):
|
|
|
346
357
|
if not port_status["available"]:
|
|
347
358
|
process_info = port_status.get("process")
|
|
348
359
|
if process_info:
|
|
349
|
-
print(
|
|
350
|
-
|
|
351
|
-
|
|
360
|
+
print(
|
|
361
|
+
f"⚠️ Port {port} is in use by {process_info['name']} (PID: {process_info['pid']})"
|
|
362
|
+
)
|
|
363
|
+
|
|
364
|
+
if process_info["is_ours"] and (process_info["is_debug"] or force):
|
|
352
365
|
if reclaim:
|
|
353
366
|
print(f"Attempting to reclaim port {port}...")
|
|
354
367
|
if not port_manager.kill_process_on_port(port, force=force):
|
|
@@ -356,15 +369,19 @@ def _start_server(args, server_manager):
|
|
|
356
369
|
return False
|
|
357
370
|
print(f"✅ Successfully reclaimed port {port}")
|
|
358
371
|
else:
|
|
359
|
-
print(
|
|
372
|
+
print(
|
|
373
|
+
f"❌ Port {port} unavailable and --no-reclaim specified"
|
|
374
|
+
)
|
|
360
375
|
return False
|
|
361
376
|
else:
|
|
362
|
-
print(
|
|
377
|
+
print(
|
|
378
|
+
f"❌ Cannot reclaim port: {port_status['recommendation']}"
|
|
379
|
+
)
|
|
363
380
|
return False
|
|
364
|
-
|
|
381
|
+
|
|
365
382
|
print(f"Target: {host}:{port}")
|
|
366
383
|
print()
|
|
367
|
-
|
|
384
|
+
|
|
368
385
|
success = server_manager.start_server(
|
|
369
386
|
port=port, host=host, server_id="monitor-server"
|
|
370
387
|
)
|
|
@@ -372,9 +389,9 @@ def _start_server(args, server_manager):
|
|
|
372
389
|
if success:
|
|
373
390
|
print()
|
|
374
391
|
print("Monitor server management commands:")
|
|
375
|
-
print(
|
|
376
|
-
print(
|
|
377
|
-
print(
|
|
392
|
+
print(" Status: claude-mpm monitor status")
|
|
393
|
+
print(" Stop: claude-mpm monitor stop")
|
|
394
|
+
print(" Restart: claude-mpm monitor restart")
|
|
378
395
|
print()
|
|
379
396
|
print(f"WebSocket URL: ws://{host}:{port}")
|
|
380
397
|
|
|
@@ -428,20 +445,19 @@ def _stop_server(args, server_manager):
|
|
|
428
445
|
success = False
|
|
429
446
|
|
|
430
447
|
return success
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
success = server_manager.stop_server(port=port)
|
|
448
|
+
# Stop specific server on given port
|
|
449
|
+
success = server_manager.stop_server(port=port)
|
|
434
450
|
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
451
|
+
if success:
|
|
452
|
+
print(f"Monitor server stopped on port {port}")
|
|
453
|
+
else:
|
|
454
|
+
print(f"Failed to stop server on port {port}")
|
|
455
|
+
print()
|
|
456
|
+
print("Troubleshooting:")
|
|
457
|
+
print(" • Check if server is running: claude-mpm monitor status")
|
|
458
|
+
print(f" • Try force kill: kill $(lsof -ti :{port})")
|
|
443
459
|
|
|
444
|
-
|
|
460
|
+
return success
|
|
445
461
|
|
|
446
462
|
except Exception as e:
|
|
447
463
|
print(f"Error stopping server: {e}")
|
|
@@ -465,10 +481,10 @@ def _status_server(args, server_manager):
|
|
|
465
481
|
"""
|
|
466
482
|
verbose = getattr(args, "verbose", False)
|
|
467
483
|
show_ports = getattr(args, "show_ports", False)
|
|
468
|
-
|
|
484
|
+
|
|
469
485
|
print("Checking Socket.IO monitoring server status...")
|
|
470
486
|
print()
|
|
471
|
-
|
|
487
|
+
|
|
472
488
|
try:
|
|
473
489
|
# Check for daemon server using socketio_daemon.py
|
|
474
490
|
daemon_script = server_manager.daemon_script
|
|
@@ -477,18 +493,19 @@ def _status_server(args, server_manager):
|
|
|
477
493
|
result = subprocess.run(
|
|
478
494
|
[sys.executable, str(daemon_script), "status"],
|
|
479
495
|
capture_output=True,
|
|
480
|
-
text=True
|
|
496
|
+
text=True,
|
|
497
|
+
check=False,
|
|
481
498
|
)
|
|
482
|
-
|
|
499
|
+
|
|
483
500
|
if result.returncode == 0 and result.stdout:
|
|
484
501
|
# Daemon provided status information
|
|
485
502
|
print(result.stdout)
|
|
486
|
-
|
|
503
|
+
|
|
487
504
|
if verbose:
|
|
488
505
|
# Show additional information
|
|
489
506
|
print("\nAdditional Details:")
|
|
490
507
|
print("─" * 40)
|
|
491
|
-
|
|
508
|
+
|
|
492
509
|
# List all running servers from ServerManager
|
|
493
510
|
running_servers = server_manager.list_running_servers()
|
|
494
511
|
if running_servers:
|
|
@@ -502,12 +519,12 @@ def _status_server(args, server_manager):
|
|
|
502
519
|
print(f" PID: {server_pid}")
|
|
503
520
|
else:
|
|
504
521
|
print("No additional servers found via ServerManager")
|
|
505
|
-
|
|
522
|
+
|
|
506
523
|
return True
|
|
507
|
-
|
|
524
|
+
|
|
508
525
|
# Fall back to ServerManager's list_running_servers
|
|
509
526
|
running_servers = server_manager.list_running_servers()
|
|
510
|
-
|
|
527
|
+
|
|
511
528
|
if not running_servers:
|
|
512
529
|
print("❌ No Socket.IO monitoring servers are currently running")
|
|
513
530
|
print()
|
|
@@ -515,50 +532,54 @@ def _status_server(args, server_manager):
|
|
|
515
532
|
print(" claude-mpm monitor start")
|
|
516
533
|
print(" claude-mpm monitor start --port 8765")
|
|
517
534
|
return True
|
|
518
|
-
|
|
535
|
+
|
|
519
536
|
# Import PortManager for enhanced status
|
|
520
537
|
from ...services.port_manager import PortManager
|
|
538
|
+
|
|
521
539
|
port_manager = PortManager()
|
|
522
|
-
|
|
540
|
+
|
|
523
541
|
# Display server information
|
|
524
542
|
print(f"✅ Found {len(running_servers)} running server(s):")
|
|
525
543
|
print()
|
|
526
|
-
|
|
544
|
+
|
|
527
545
|
for server in running_servers:
|
|
528
546
|
server_port = server.get("port", "unknown")
|
|
529
547
|
server_id = server.get("server_id", "unknown")
|
|
530
548
|
server_pid = server.get("pid", "unknown")
|
|
531
549
|
server_host = server.get("host", "localhost")
|
|
532
|
-
|
|
550
|
+
|
|
533
551
|
print(f"Server: {server_id}")
|
|
534
552
|
print(f" • PID: {server_pid}")
|
|
535
553
|
print(f" • Port: {server_port}")
|
|
536
554
|
print(f" • Host: {server_host}")
|
|
537
555
|
print(f" • WebSocket URL: ws://{server_host}:{server_port}")
|
|
538
|
-
|
|
556
|
+
|
|
539
557
|
# Show port status if verbose
|
|
540
558
|
if verbose and server_port != "unknown":
|
|
541
559
|
port_status = port_manager.get_port_status(int(server_port))
|
|
542
560
|
if port_status.get("process"):
|
|
543
561
|
process = port_status["process"]
|
|
544
|
-
print(
|
|
545
|
-
|
|
562
|
+
print(
|
|
563
|
+
f" • Process Type: {'Debug' if process['is_debug'] else 'Daemon' if process['is_daemon'] else 'Regular'}"
|
|
564
|
+
)
|
|
565
|
+
|
|
546
566
|
if verbose:
|
|
547
567
|
# Check if port is actually listening
|
|
548
568
|
try:
|
|
549
569
|
import socket
|
|
570
|
+
|
|
550
571
|
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
|
551
572
|
result = sock.connect_ex((server_host, server_port))
|
|
552
573
|
sock.close()
|
|
553
574
|
if result == 0:
|
|
554
|
-
print(
|
|
575
|
+
print(" • Status: ✅ Listening")
|
|
555
576
|
else:
|
|
556
|
-
print(
|
|
577
|
+
print(" • Status: ⚠️ Not responding on port")
|
|
557
578
|
except Exception as e:
|
|
558
579
|
print(f" • Status: ❌ Error checking: {e}")
|
|
559
|
-
|
|
580
|
+
|
|
560
581
|
print()
|
|
561
|
-
|
|
582
|
+
|
|
562
583
|
# Show port range status if requested
|
|
563
584
|
if show_ports or verbose:
|
|
564
585
|
print("\nPort Range Status (8765-8785):")
|
|
@@ -572,17 +593,25 @@ def _status_server(args, server_manager):
|
|
|
572
593
|
if process:
|
|
573
594
|
if process["is_ours"]:
|
|
574
595
|
if process["is_debug"]:
|
|
575
|
-
print(
|
|
596
|
+
print(
|
|
597
|
+
f" Port {check_port}: 🔧 Debug script (PID: {process['pid']})"
|
|
598
|
+
)
|
|
576
599
|
elif process["is_daemon"]:
|
|
577
|
-
print(
|
|
600
|
+
print(
|
|
601
|
+
f" Port {check_port}: 🚀 Daemon (PID: {process['pid']})"
|
|
602
|
+
)
|
|
578
603
|
else:
|
|
579
|
-
print(
|
|
604
|
+
print(
|
|
605
|
+
f" Port {check_port}: 📦 Our process (PID: {process['pid']})"
|
|
606
|
+
)
|
|
580
607
|
else:
|
|
581
|
-
print(
|
|
608
|
+
print(
|
|
609
|
+
f" Port {check_port}: ⛔ External ({process['name']})"
|
|
610
|
+
)
|
|
582
611
|
else:
|
|
583
612
|
print(f" Port {check_port}: ❓ In use (unknown process)")
|
|
584
613
|
print()
|
|
585
|
-
|
|
614
|
+
|
|
586
615
|
print("Server management commands:")
|
|
587
616
|
print(" Stop all: claude-mpm monitor stop")
|
|
588
617
|
print(" Restart: claude-mpm monitor restart")
|
|
@@ -590,9 +619,9 @@ def _status_server(args, server_manager):
|
|
|
590
619
|
if len(running_servers) == 1:
|
|
591
620
|
port = running_servers[0].get("port", 8765)
|
|
592
621
|
print(f" Stop this: claude-mpm monitor stop --port {port}")
|
|
593
|
-
|
|
622
|
+
|
|
594
623
|
return True
|
|
595
|
-
|
|
624
|
+
|
|
596
625
|
except Exception as e:
|
|
597
626
|
print(f"Error checking server status: {e}")
|
|
598
627
|
print()
|
|
@@ -643,7 +672,7 @@ def _restart_server(args, server_manager):
|
|
|
643
672
|
print(f"Monitor server restarted successfully on port {port}")
|
|
644
673
|
print()
|
|
645
674
|
print("Server management commands:")
|
|
646
|
-
print(
|
|
675
|
+
print(" Status: claude-mpm monitor status")
|
|
647
676
|
print(f" Stop: claude-mpm monitor stop --port {port}")
|
|
648
677
|
print(f" Start: claude-mpm monitor start --port {port}")
|
|
649
678
|
else:
|