claude-mpm 3.9.11__py3-none-any.whl → 4.0.3__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/__init__.py +2 -2
- claude_mpm/__main__.py +3 -2
- claude_mpm/agents/__init__.py +85 -79
- claude_mpm/agents/agent_loader.py +464 -1003
- claude_mpm/agents/agent_loader_integration.py +45 -45
- claude_mpm/agents/agents_metadata.py +29 -30
- claude_mpm/agents/async_agent_loader.py +156 -138
- claude_mpm/agents/base_agent.json +1 -1
- claude_mpm/agents/base_agent_loader.py +179 -151
- claude_mpm/agents/frontmatter_validator.py +229 -130
- claude_mpm/agents/schema/agent_schema.json +1 -1
- claude_mpm/agents/system_agent_config.py +213 -147
- claude_mpm/agents/templates/__init__.py +13 -13
- claude_mpm/agents/templates/code_analyzer.json +2 -2
- claude_mpm/agents/templates/data_engineer.json +1 -1
- claude_mpm/agents/templates/documentation.json +23 -11
- claude_mpm/agents/templates/engineer.json +22 -6
- claude_mpm/agents/templates/memory_manager.json +1 -1
- claude_mpm/agents/templates/ops.json +2 -2
- claude_mpm/agents/templates/project_organizer.json +1 -1
- claude_mpm/agents/templates/qa.json +1 -1
- claude_mpm/agents/templates/refactoring_engineer.json +222 -0
- claude_mpm/agents/templates/research.json +20 -14
- claude_mpm/agents/templates/security.json +1 -1
- claude_mpm/agents/templates/ticketing.json +1 -1
- claude_mpm/agents/templates/version_control.json +1 -1
- claude_mpm/agents/templates/web_qa.json +3 -1
- claude_mpm/agents/templates/web_ui.json +2 -2
- claude_mpm/cli/__init__.py +79 -51
- claude_mpm/cli/__main__.py +3 -2
- claude_mpm/cli/commands/__init__.py +20 -20
- claude_mpm/cli/commands/agents.py +279 -247
- claude_mpm/cli/commands/aggregate.py +138 -157
- claude_mpm/cli/commands/cleanup.py +147 -147
- claude_mpm/cli/commands/config.py +93 -76
- claude_mpm/cli/commands/info.py +17 -16
- claude_mpm/cli/commands/mcp.py +140 -905
- claude_mpm/cli/commands/mcp_command_router.py +139 -0
- claude_mpm/cli/commands/mcp_config_commands.py +20 -0
- claude_mpm/cli/commands/mcp_install_commands.py +20 -0
- claude_mpm/cli/commands/mcp_server_commands.py +175 -0
- claude_mpm/cli/commands/mcp_tool_commands.py +34 -0
- claude_mpm/cli/commands/memory.py +239 -203
- claude_mpm/cli/commands/monitor.py +203 -81
- claude_mpm/cli/commands/run.py +380 -429
- claude_mpm/cli/commands/run_config_checker.py +160 -0
- claude_mpm/cli/commands/socketio_monitor.py +235 -0
- claude_mpm/cli/commands/tickets.py +305 -197
- claude_mpm/cli/parser.py +24 -1156
- claude_mpm/cli/parsers/__init__.py +29 -0
- claude_mpm/cli/parsers/agents_parser.py +136 -0
- claude_mpm/cli/parsers/base_parser.py +331 -0
- claude_mpm/cli/parsers/config_parser.py +85 -0
- claude_mpm/cli/parsers/mcp_parser.py +152 -0
- claude_mpm/cli/parsers/memory_parser.py +138 -0
- claude_mpm/cli/parsers/monitor_parser.py +104 -0
- claude_mpm/cli/parsers/run_parser.py +147 -0
- claude_mpm/cli/parsers/tickets_parser.py +203 -0
- claude_mpm/cli/ticket_cli.py +7 -3
- claude_mpm/cli/utils.py +55 -37
- claude_mpm/cli_module/__init__.py +6 -6
- claude_mpm/cli_module/args.py +188 -140
- claude_mpm/cli_module/commands.py +79 -70
- claude_mpm/cli_module/migration_example.py +38 -60
- claude_mpm/config/__init__.py +32 -25
- claude_mpm/config/agent_config.py +151 -119
- claude_mpm/config/experimental_features.py +71 -73
- claude_mpm/config/paths.py +94 -208
- claude_mpm/config/socketio_config.py +84 -73
- claude_mpm/constants.py +35 -18
- claude_mpm/core/__init__.py +9 -6
- claude_mpm/core/agent_name_normalizer.py +68 -71
- claude_mpm/core/agent_registry.py +372 -521
- claude_mpm/core/agent_session_manager.py +74 -63
- claude_mpm/core/base_service.py +116 -87
- claude_mpm/core/cache.py +119 -153
- claude_mpm/core/claude_runner.py +425 -1120
- claude_mpm/core/config.py +263 -168
- claude_mpm/core/config_aliases.py +69 -61
- claude_mpm/core/config_constants.py +292 -0
- claude_mpm/core/constants.py +57 -99
- claude_mpm/core/container.py +211 -178
- claude_mpm/core/exceptions.py +233 -89
- claude_mpm/core/factories.py +92 -54
- claude_mpm/core/framework_loader.py +378 -220
- claude_mpm/core/hook_manager.py +198 -83
- claude_mpm/core/hook_performance_config.py +136 -0
- claude_mpm/core/injectable_service.py +61 -55
- claude_mpm/core/interactive_session.py +165 -155
- claude_mpm/core/interfaces.py +221 -195
- claude_mpm/core/lazy.py +96 -96
- claude_mpm/core/logger.py +133 -107
- claude_mpm/core/logging_config.py +185 -157
- claude_mpm/core/minimal_framework_loader.py +20 -15
- claude_mpm/core/mixins.py +30 -29
- claude_mpm/core/oneshot_session.py +215 -181
- claude_mpm/core/optimized_agent_loader.py +134 -138
- claude_mpm/core/optimized_startup.py +159 -157
- claude_mpm/core/pm_hook_interceptor.py +85 -72
- claude_mpm/core/service_registry.py +103 -101
- claude_mpm/core/session_manager.py +97 -87
- claude_mpm/core/socketio_pool.py +212 -158
- claude_mpm/core/tool_access_control.py +58 -51
- claude_mpm/core/types.py +46 -24
- claude_mpm/core/typing_utils.py +166 -82
- claude_mpm/core/unified_agent_registry.py +721 -0
- claude_mpm/core/unified_config.py +550 -0
- claude_mpm/core/unified_paths.py +549 -0
- claude_mpm/dashboard/index.html +1 -1
- claude_mpm/dashboard/open_dashboard.py +51 -17
- claude_mpm/dashboard/static/css/dashboard.css +27 -8
- claude_mpm/dashboard/static/dist/components/agent-inference.js +2 -0
- claude_mpm/dashboard/static/dist/components/event-processor.js +2 -0
- claude_mpm/dashboard/static/dist/components/event-viewer.js +2 -0
- claude_mpm/dashboard/static/dist/components/export-manager.js +2 -0
- claude_mpm/dashboard/static/dist/components/file-tool-tracker.js +2 -0
- claude_mpm/dashboard/static/dist/components/hud-library-loader.js +2 -0
- claude_mpm/dashboard/static/dist/components/hud-manager.js +2 -0
- claude_mpm/dashboard/static/dist/components/hud-visualizer.js +2 -0
- claude_mpm/dashboard/static/dist/components/module-viewer.js +2 -0
- claude_mpm/dashboard/static/dist/components/session-manager.js +2 -0
- claude_mpm/dashboard/static/dist/components/socket-manager.js +2 -0
- claude_mpm/dashboard/static/dist/components/ui-state-manager.js +2 -0
- claude_mpm/dashboard/static/dist/components/working-directory.js +2 -0
- claude_mpm/dashboard/static/dist/dashboard.js +2 -0
- claude_mpm/dashboard/static/dist/socket-client.js +2 -0
- claude_mpm/dashboard/static/js/components/agent-inference.js +80 -76
- claude_mpm/dashboard/static/js/components/event-processor.js +71 -67
- claude_mpm/dashboard/static/js/components/event-viewer.js +74 -70
- claude_mpm/dashboard/static/js/components/export-manager.js +31 -28
- claude_mpm/dashboard/static/js/components/file-tool-tracker.js +106 -92
- claude_mpm/dashboard/static/js/components/hud-library-loader.js +11 -11
- claude_mpm/dashboard/static/js/components/hud-manager.js +73 -73
- claude_mpm/dashboard/static/js/components/hud-visualizer.js +163 -163
- claude_mpm/dashboard/static/js/components/module-viewer.js +305 -233
- claude_mpm/dashboard/static/js/components/session-manager.js +32 -29
- claude_mpm/dashboard/static/js/components/socket-manager.js +27 -20
- claude_mpm/dashboard/static/js/components/ui-state-manager.js +21 -18
- claude_mpm/dashboard/static/js/components/working-directory.js +74 -71
- claude_mpm/dashboard/static/js/dashboard.js +178 -453
- claude_mpm/dashboard/static/js/extension-error-handler.js +164 -0
- claude_mpm/dashboard/static/js/socket-client.js +120 -54
- claude_mpm/dashboard/templates/index.html +40 -50
- claude_mpm/experimental/cli_enhancements.py +60 -58
- claude_mpm/generators/__init__.py +1 -1
- claude_mpm/generators/agent_profile_generator.py +75 -65
- claude_mpm/hooks/__init__.py +1 -1
- claude_mpm/hooks/base_hook.py +33 -28
- claude_mpm/hooks/claude_hooks/__init__.py +1 -1
- claude_mpm/hooks/claude_hooks/connection_pool.py +120 -0
- claude_mpm/hooks/claude_hooks/event_handlers.py +743 -0
- claude_mpm/hooks/claude_hooks/hook_handler.py +415 -1331
- claude_mpm/hooks/claude_hooks/hook_wrapper.sh +4 -4
- claude_mpm/hooks/claude_hooks/memory_integration.py +221 -0
- claude_mpm/hooks/claude_hooks/response_tracking.py +348 -0
- claude_mpm/hooks/claude_hooks/tool_analysis.py +230 -0
- claude_mpm/hooks/memory_integration_hook.py +140 -100
- claude_mpm/hooks/tool_call_interceptor.py +89 -76
- claude_mpm/hooks/validation_hooks.py +57 -49
- claude_mpm/init.py +145 -121
- claude_mpm/models/__init__.py +9 -9
- claude_mpm/models/agent_definition.py +33 -23
- claude_mpm/models/agent_session.py +228 -200
- claude_mpm/scripts/__init__.py +1 -1
- claude_mpm/scripts/socketio_daemon.py +192 -75
- claude_mpm/scripts/socketio_server_manager.py +328 -0
- claude_mpm/scripts/start_activity_logging.py +25 -22
- claude_mpm/services/__init__.py +68 -43
- claude_mpm/services/agent_capabilities_service.py +271 -0
- claude_mpm/services/agents/__init__.py +23 -32
- claude_mpm/services/agents/deployment/__init__.py +3 -3
- claude_mpm/services/agents/deployment/agent_config_provider.py +310 -0
- claude_mpm/services/agents/deployment/agent_configuration_manager.py +359 -0
- claude_mpm/services/agents/deployment/agent_definition_factory.py +84 -0
- claude_mpm/services/agents/deployment/agent_deployment.py +415 -2113
- claude_mpm/services/agents/deployment/agent_discovery_service.py +387 -0
- claude_mpm/services/agents/deployment/agent_environment_manager.py +293 -0
- claude_mpm/services/agents/deployment/agent_filesystem_manager.py +387 -0
- claude_mpm/services/agents/deployment/agent_format_converter.py +453 -0
- claude_mpm/services/agents/deployment/agent_frontmatter_validator.py +161 -0
- claude_mpm/services/agents/deployment/agent_lifecycle_manager.py +345 -495
- claude_mpm/services/agents/deployment/agent_metrics_collector.py +279 -0
- claude_mpm/services/agents/deployment/agent_restore_handler.py +88 -0
- claude_mpm/services/agents/deployment/agent_template_builder.py +406 -0
- claude_mpm/services/agents/deployment/agent_validator.py +352 -0
- claude_mpm/services/agents/deployment/agent_version_manager.py +313 -0
- claude_mpm/services/agents/deployment/agent_versioning.py +6 -9
- claude_mpm/services/agents/deployment/agents_directory_resolver.py +79 -0
- claude_mpm/services/agents/deployment/async_agent_deployment.py +298 -234
- claude_mpm/services/agents/deployment/config/__init__.py +13 -0
- claude_mpm/services/agents/deployment/config/deployment_config.py +182 -0
- claude_mpm/services/agents/deployment/config/deployment_config_manager.py +200 -0
- claude_mpm/services/agents/deployment/deployment_config_loader.py +54 -0
- claude_mpm/services/agents/deployment/deployment_type_detector.py +124 -0
- claude_mpm/services/agents/deployment/facade/__init__.py +18 -0
- claude_mpm/services/agents/deployment/facade/async_deployment_executor.py +159 -0
- claude_mpm/services/agents/deployment/facade/deployment_executor.py +73 -0
- claude_mpm/services/agents/deployment/facade/deployment_facade.py +270 -0
- claude_mpm/services/agents/deployment/facade/sync_deployment_executor.py +178 -0
- claude_mpm/services/agents/deployment/interface_adapter.py +227 -0
- claude_mpm/services/agents/deployment/lifecycle_health_checker.py +85 -0
- claude_mpm/services/agents/deployment/lifecycle_performance_tracker.py +100 -0
- claude_mpm/services/agents/deployment/pipeline/__init__.py +32 -0
- claude_mpm/services/agents/deployment/pipeline/pipeline_builder.py +158 -0
- claude_mpm/services/agents/deployment/pipeline/pipeline_context.py +159 -0
- claude_mpm/services/agents/deployment/pipeline/pipeline_executor.py +169 -0
- claude_mpm/services/agents/deployment/pipeline/steps/__init__.py +19 -0
- claude_mpm/services/agents/deployment/pipeline/steps/agent_processing_step.py +195 -0
- claude_mpm/services/agents/deployment/pipeline/steps/base_step.py +119 -0
- claude_mpm/services/agents/deployment/pipeline/steps/configuration_step.py +79 -0
- claude_mpm/services/agents/deployment/pipeline/steps/target_directory_step.py +90 -0
- claude_mpm/services/agents/deployment/pipeline/steps/validation_step.py +100 -0
- claude_mpm/services/agents/deployment/processors/__init__.py +15 -0
- claude_mpm/services/agents/deployment/processors/agent_deployment_context.py +98 -0
- claude_mpm/services/agents/deployment/processors/agent_deployment_result.py +235 -0
- claude_mpm/services/agents/deployment/processors/agent_processor.py +258 -0
- claude_mpm/services/agents/deployment/refactored_agent_deployment_service.py +318 -0
- claude_mpm/services/agents/deployment/results/__init__.py +13 -0
- claude_mpm/services/agents/deployment/results/deployment_metrics.py +200 -0
- claude_mpm/services/agents/deployment/results/deployment_result_builder.py +249 -0
- claude_mpm/services/agents/deployment/strategies/__init__.py +25 -0
- claude_mpm/services/agents/deployment/strategies/base_strategy.py +119 -0
- claude_mpm/services/agents/deployment/strategies/project_strategy.py +150 -0
- claude_mpm/services/agents/deployment/strategies/strategy_selector.py +117 -0
- claude_mpm/services/agents/deployment/strategies/system_strategy.py +116 -0
- claude_mpm/services/agents/deployment/strategies/user_strategy.py +137 -0
- claude_mpm/services/agents/deployment/system_instructions_deployer.py +108 -0
- claude_mpm/services/agents/deployment/validation/__init__.py +19 -0
- claude_mpm/services/agents/deployment/validation/agent_validator.py +323 -0
- claude_mpm/services/agents/deployment/validation/deployment_validator.py +238 -0
- claude_mpm/services/agents/deployment/validation/template_validator.py +299 -0
- claude_mpm/services/agents/deployment/validation/validation_result.py +226 -0
- claude_mpm/services/agents/loading/__init__.py +2 -2
- claude_mpm/services/agents/loading/agent_profile_loader.py +259 -229
- claude_mpm/services/agents/loading/base_agent_manager.py +90 -81
- claude_mpm/services/agents/loading/framework_agent_loader.py +154 -129
- claude_mpm/services/agents/management/__init__.py +2 -2
- claude_mpm/services/agents/management/agent_capabilities_generator.py +72 -58
- claude_mpm/services/agents/management/agent_management_service.py +209 -156
- claude_mpm/services/agents/memory/__init__.py +9 -6
- claude_mpm/services/agents/memory/agent_memory_manager.py +218 -1152
- claude_mpm/services/agents/memory/agent_persistence_service.py +20 -16
- claude_mpm/services/agents/memory/analyzer.py +430 -0
- claude_mpm/services/agents/memory/content_manager.py +376 -0
- claude_mpm/services/agents/memory/template_generator.py +468 -0
- claude_mpm/services/agents/registry/__init__.py +7 -10
- claude_mpm/services/agents/registry/deployed_agent_discovery.py +122 -97
- claude_mpm/services/agents/registry/modification_tracker.py +351 -285
- claude_mpm/services/async_session_logger.py +187 -153
- claude_mpm/services/claude_session_logger.py +87 -72
- claude_mpm/services/command_handler_service.py +217 -0
- claude_mpm/services/communication/__init__.py +3 -2
- claude_mpm/services/core/__init__.py +50 -97
- claude_mpm/services/core/base.py +60 -53
- claude_mpm/services/core/interfaces/__init__.py +188 -0
- claude_mpm/services/core/interfaces/agent.py +351 -0
- claude_mpm/services/core/interfaces/communication.py +343 -0
- claude_mpm/services/core/interfaces/infrastructure.py +413 -0
- claude_mpm/services/core/interfaces/service.py +434 -0
- claude_mpm/services/core/interfaces.py +19 -944
- claude_mpm/services/event_aggregator.py +208 -170
- claude_mpm/services/exceptions.py +387 -308
- claude_mpm/services/framework_claude_md_generator/__init__.py +75 -79
- claude_mpm/services/framework_claude_md_generator/content_assembler.py +69 -60
- claude_mpm/services/framework_claude_md_generator/content_validator.py +65 -61
- claude_mpm/services/framework_claude_md_generator/deployment_manager.py +68 -49
- claude_mpm/services/framework_claude_md_generator/section_generators/__init__.py +34 -34
- claude_mpm/services/framework_claude_md_generator/section_generators/agents.py +25 -22
- claude_mpm/services/framework_claude_md_generator/section_generators/claude_pm_init.py +10 -10
- claude_mpm/services/framework_claude_md_generator/section_generators/core_responsibilities.py +4 -3
- claude_mpm/services/framework_claude_md_generator/section_generators/delegation_constraints.py +4 -3
- claude_mpm/services/framework_claude_md_generator/section_generators/environment_config.py +4 -3
- claude_mpm/services/framework_claude_md_generator/section_generators/footer.py +6 -5
- claude_mpm/services/framework_claude_md_generator/section_generators/header.py +8 -7
- claude_mpm/services/framework_claude_md_generator/section_generators/orchestration_principles.py +4 -3
- claude_mpm/services/framework_claude_md_generator/section_generators/role_designation.py +6 -5
- claude_mpm/services/framework_claude_md_generator/section_generators/subprocess_validation.py +9 -8
- claude_mpm/services/framework_claude_md_generator/section_generators/todo_task_tools.py +4 -3
- claude_mpm/services/framework_claude_md_generator/section_generators/troubleshooting.py +5 -4
- claude_mpm/services/framework_claude_md_generator/section_manager.py +28 -27
- claude_mpm/services/framework_claude_md_generator/version_manager.py +30 -28
- claude_mpm/services/hook_service.py +106 -114
- claude_mpm/services/infrastructure/__init__.py +7 -5
- claude_mpm/services/infrastructure/context_preservation.py +233 -199
- claude_mpm/services/infrastructure/daemon_manager.py +279 -0
- claude_mpm/services/infrastructure/logging.py +83 -76
- claude_mpm/services/infrastructure/monitoring.py +547 -404
- claude_mpm/services/mcp_gateway/__init__.py +30 -13
- claude_mpm/services/mcp_gateway/config/__init__.py +2 -2
- claude_mpm/services/mcp_gateway/config/config_loader.py +61 -56
- claude_mpm/services/mcp_gateway/config/config_schema.py +50 -41
- claude_mpm/services/mcp_gateway/config/configuration.py +82 -75
- claude_mpm/services/mcp_gateway/core/__init__.py +13 -20
- claude_mpm/services/mcp_gateway/core/base.py +80 -67
- claude_mpm/services/mcp_gateway/core/exceptions.py +60 -46
- claude_mpm/services/mcp_gateway/core/interfaces.py +87 -84
- claude_mpm/services/mcp_gateway/main.py +287 -137
- claude_mpm/services/mcp_gateway/registry/__init__.py +1 -1
- claude_mpm/services/mcp_gateway/registry/service_registry.py +97 -94
- claude_mpm/services/mcp_gateway/registry/tool_registry.py +135 -126
- claude_mpm/services/mcp_gateway/server/__init__.py +2 -2
- claude_mpm/services/mcp_gateway/server/mcp_gateway.py +105 -110
- claude_mpm/services/mcp_gateway/server/stdio_handler.py +105 -107
- claude_mpm/services/mcp_gateway/server/stdio_server.py +691 -0
- claude_mpm/services/mcp_gateway/tools/__init__.py +4 -2
- claude_mpm/services/mcp_gateway/tools/base_adapter.py +109 -119
- claude_mpm/services/mcp_gateway/tools/document_summarizer.py +283 -215
- claude_mpm/services/mcp_gateway/tools/hello_world.py +122 -120
- claude_mpm/services/mcp_gateway/tools/ticket_tools.py +652 -0
- claude_mpm/services/mcp_gateway/tools/unified_ticket_tool.py +606 -0
- claude_mpm/services/memory/__init__.py +2 -2
- claude_mpm/services/memory/builder.py +451 -362
- claude_mpm/services/memory/cache/__init__.py +2 -2
- claude_mpm/services/memory/cache/shared_prompt_cache.py +232 -194
- claude_mpm/services/memory/cache/simple_cache.py +107 -93
- claude_mpm/services/memory/indexed_memory.py +195 -193
- claude_mpm/services/memory/optimizer.py +267 -234
- claude_mpm/services/memory/router.py +571 -263
- claude_mpm/services/memory_hook_service.py +237 -0
- claude_mpm/services/port_manager.py +223 -0
- claude_mpm/services/project/__init__.py +3 -3
- claude_mpm/services/project/analyzer.py +451 -305
- claude_mpm/services/project/registry.py +262 -240
- claude_mpm/services/recovery_manager.py +287 -231
- claude_mpm/services/response_tracker.py +87 -67
- claude_mpm/services/runner_configuration_service.py +587 -0
- claude_mpm/services/session_management_service.py +304 -0
- claude_mpm/services/socketio/__init__.py +4 -4
- claude_mpm/services/socketio/client_proxy.py +174 -0
- claude_mpm/services/socketio/handlers/__init__.py +3 -3
- claude_mpm/services/socketio/handlers/base.py +44 -30
- claude_mpm/services/socketio/handlers/connection.py +145 -65
- claude_mpm/services/socketio/handlers/file.py +123 -108
- claude_mpm/services/socketio/handlers/git.py +607 -373
- claude_mpm/services/socketio/handlers/hook.py +170 -0
- claude_mpm/services/socketio/handlers/memory.py +4 -4
- claude_mpm/services/socketio/handlers/project.py +4 -4
- claude_mpm/services/socketio/handlers/registry.py +53 -38
- claude_mpm/services/socketio/server/__init__.py +18 -0
- claude_mpm/services/socketio/server/broadcaster.py +252 -0
- claude_mpm/services/socketio/server/core.py +399 -0
- claude_mpm/services/socketio/server/main.py +323 -0
- claude_mpm/services/socketio_client_manager.py +160 -133
- claude_mpm/services/socketio_server.py +36 -1885
- claude_mpm/services/subprocess_launcher_service.py +316 -0
- claude_mpm/services/system_instructions_service.py +258 -0
- claude_mpm/services/ticket_manager.py +19 -533
- claude_mpm/services/utility_service.py +285 -0
- claude_mpm/services/version_control/__init__.py +18 -21
- claude_mpm/services/version_control/branch_strategy.py +20 -10
- claude_mpm/services/version_control/conflict_resolution.py +37 -13
- claude_mpm/services/version_control/git_operations.py +52 -21
- claude_mpm/services/version_control/semantic_versioning.py +92 -53
- claude_mpm/services/version_control/version_parser.py +145 -125
- claude_mpm/services/version_service.py +270 -0
- claude_mpm/storage/__init__.py +2 -2
- claude_mpm/storage/state_storage.py +177 -181
- claude_mpm/ticket_wrapper.py +2 -2
- claude_mpm/utils/__init__.py +2 -2
- claude_mpm/utils/agent_dependency_loader.py +453 -243
- claude_mpm/utils/config_manager.py +157 -118
- claude_mpm/utils/console.py +1 -1
- claude_mpm/utils/dependency_cache.py +102 -107
- claude_mpm/utils/dependency_manager.py +52 -47
- claude_mpm/utils/dependency_strategies.py +131 -96
- claude_mpm/utils/environment_context.py +110 -102
- claude_mpm/utils/error_handler.py +75 -55
- claude_mpm/utils/file_utils.py +80 -67
- claude_mpm/utils/framework_detection.py +12 -11
- claude_mpm/utils/import_migration_example.py +12 -60
- claude_mpm/utils/imports.py +48 -45
- claude_mpm/utils/path_operations.py +100 -93
- claude_mpm/utils/robust_installer.py +172 -164
- claude_mpm/utils/session_logging.py +30 -23
- claude_mpm/utils/subprocess_utils.py +99 -61
- claude_mpm/validation/__init__.py +1 -1
- claude_mpm/validation/agent_validator.py +151 -111
- claude_mpm/validation/frontmatter_validator.py +92 -71
- {claude_mpm-3.9.11.dist-info → claude_mpm-4.0.3.dist-info}/METADATA +27 -1
- claude_mpm-4.0.3.dist-info/RECORD +402 -0
- {claude_mpm-3.9.11.dist-info → claude_mpm-4.0.3.dist-info}/entry_points.txt +1 -0
- {claude_mpm-3.9.11.dist-info → claude_mpm-4.0.3.dist-info}/licenses/LICENSE +1 -1
- claude_mpm/cli/commands/run_guarded.py +0 -511
- claude_mpm/config/memory_guardian_config.py +0 -325
- claude_mpm/config/memory_guardian_yaml.py +0 -335
- claude_mpm/core/config_paths.py +0 -150
- claude_mpm/core/memory_aware_runner.py +0 -353
- claude_mpm/dashboard/static/js/dashboard-original.js +0 -4134
- claude_mpm/deployment_paths.py +0 -261
- claude_mpm/hooks/claude_hooks/hook_handler_fixed.py +0 -454
- claude_mpm/models/state_models.py +0 -433
- claude_mpm/services/agent/__init__.py +0 -24
- claude_mpm/services/agent/deployment.py +0 -2548
- claude_mpm/services/agent/management.py +0 -598
- claude_mpm/services/agent/registry.py +0 -813
- claude_mpm/services/agents/registry/agent_registry.py +0 -813
- claude_mpm/services/communication/socketio.py +0 -1935
- claude_mpm/services/communication/websocket.py +0 -479
- claude_mpm/services/framework_claude_md_generator.py +0 -624
- claude_mpm/services/health_monitor.py +0 -893
- claude_mpm/services/infrastructure/graceful_degradation.py +0 -616
- claude_mpm/services/infrastructure/health_monitor.py +0 -775
- claude_mpm/services/infrastructure/memory_dashboard.py +0 -479
- claude_mpm/services/infrastructure/memory_guardian.py +0 -944
- claude_mpm/services/infrastructure/restart_protection.py +0 -642
- claude_mpm/services/infrastructure/state_manager.py +0 -774
- claude_mpm/services/mcp_gateway/manager.py +0 -334
- claude_mpm/services/optimized_hook_service.py +0 -542
- claude_mpm/services/project_analyzer.py +0 -864
- claude_mpm/services/project_registry.py +0 -608
- claude_mpm/services/standalone_socketio_server.py +0 -1300
- claude_mpm/services/ticket_manager_di.py +0 -318
- claude_mpm/services/ticketing_service_original.py +0 -510
- claude_mpm/utils/paths.py +0 -395
- claude_mpm/utils/platform_memory.py +0 -524
- claude_mpm-3.9.11.dist-info/RECORD +0 -306
- {claude_mpm-3.9.11.dist-info → claude_mpm-4.0.3.dist-info}/WHEEL +0 -0
- {claude_mpm-3.9.11.dist-info → claude_mpm-4.0.3.dist-info}/top_level.txt +0 -0
| @@ -9,68 +9,68 @@ that dispatches to specific subcommand handlers, maintaining consistency | |
| 9 9 | 
             
            with other command modules like agents.py and memory.py.
         | 
| 10 10 | 
             
            """
         | 
| 11 11 |  | 
| 12 | 
            +
            import subprocess
         | 
| 12 13 | 
             
            import sys
         | 
| 13 | 
            -
            from pathlib import Path
         | 
| 14 14 |  | 
| 15 | 
            -
            from ...core.logger import get_logger
         | 
| 16 15 | 
             
            from ...constants import MonitorCommands
         | 
| 16 | 
            +
            from ...core.logger import get_logger
         | 
| 17 17 |  | 
| 18 18 |  | 
| 19 19 | 
             
            def manage_monitor(args):
         | 
| 20 20 | 
             
                """
         | 
| 21 21 | 
             
                Manage Socket.IO monitoring server.
         | 
| 22 | 
            -
             | 
| 22 | 
            +
             | 
| 23 23 | 
             
                WHY: The monitoring server provides real-time insights into Claude MPM sessions,
         | 
| 24 24 | 
             
                websocket connections, and system performance. This command provides a unified
         | 
| 25 25 | 
             
                interface for all monitor-related operations.
         | 
| 26 | 
            -
             | 
| 26 | 
            +
             | 
| 27 27 | 
             
                DESIGN DECISION: When no subcommand is provided, we show the server status
         | 
| 28 28 | 
             
                as the default action, giving users a quick overview of the monitoring system.
         | 
| 29 | 
            -
             | 
| 29 | 
            +
             | 
| 30 30 | 
             
                Args:
         | 
| 31 31 | 
             
                    args: Parsed command line arguments with monitor_command attribute
         | 
| 32 32 | 
             
                """
         | 
| 33 33 | 
             
                logger = get_logger("cli")
         | 
| 34 | 
            -
             | 
| 34 | 
            +
             | 
| 35 35 | 
             
                try:
         | 
| 36 36 | 
             
                    # Import ServerManager from socketio_server_manager.py
         | 
| 37 37 | 
             
                    from ...scripts.socketio_server_manager import ServerManager
         | 
| 38 | 
            +
             | 
| 38 39 | 
             
                    server_manager = ServerManager()
         | 
| 39 | 
            -
             | 
| 40 | 
            +
             | 
| 40 41 | 
             
                    if not args.monitor_command:
         | 
| 41 | 
            -
                        # No subcommand - show  | 
| 42 | 
            -
                        # WHY:  | 
| 43 | 
            -
                         | 
| 44 | 
            -
                         | 
| 45 | 
            -
                         | 
| 46 | 
            -
             | 
| 47 | 
            -
                        print("  port <N> - Start/restart on specific port")
         | 
| 48 | 
            -
                        print()
         | 
| 49 | 
            -
                        print("Use 'claude-mpm monitor <command> --help' for more information")
         | 
| 50 | 
            -
                        return 0
         | 
| 51 | 
            -
                    
         | 
| 42 | 
            +
                        # No subcommand - show status as default
         | 
| 43 | 
            +
                        # WHY: Status is the most common operation users want when running monitor without args
         | 
| 44 | 
            +
                        args.verbose = False  # Set default for verbose flag
         | 
| 45 | 
            +
                        success = _status_server(args, server_manager)
         | 
| 46 | 
            +
                        return 0 if success else 1
         | 
| 47 | 
            +
             | 
| 52 48 | 
             
                    if args.monitor_command == MonitorCommands.START.value:
         | 
| 53 49 | 
             
                        success = _start_server(args, server_manager)
         | 
| 54 50 | 
             
                        return 0 if success else 1
         | 
| 55 | 
            -
             | 
| 51 | 
            +
             | 
| 56 52 | 
             
                    elif args.monitor_command == MonitorCommands.STOP.value:
         | 
| 57 53 | 
             
                        success = _stop_server(args, server_manager)
         | 
| 58 54 | 
             
                        return 0 if success else 1
         | 
| 59 | 
            -
             | 
| 55 | 
            +
             | 
| 60 56 | 
             
                    elif args.monitor_command == MonitorCommands.RESTART.value:
         | 
| 61 57 | 
             
                        success = _restart_server(args, server_manager)
         | 
| 62 58 | 
             
                        return 0 if success else 1
         | 
| 63 | 
            -
             | 
| 59 | 
            +
             | 
| 60 | 
            +
                    elif args.monitor_command == MonitorCommands.STATUS.value:
         | 
| 61 | 
            +
                        success = _status_server(args, server_manager)
         | 
| 62 | 
            +
                        return 0 if success else 1
         | 
| 63 | 
            +
             | 
| 64 64 | 
             
                    elif args.monitor_command == MonitorCommands.PORT.value:
         | 
| 65 65 | 
             
                        success = _port_server(args, server_manager)
         | 
| 66 66 | 
             
                        return 0 if success else 1
         | 
| 67 | 
            -
             | 
| 67 | 
            +
             | 
| 68 68 | 
             
                    else:
         | 
| 69 69 | 
             
                        logger.error(f"Unknown monitor command: {args.monitor_command}")
         | 
| 70 70 | 
             
                        print(f"Unknown monitor command: {args.monitor_command}")
         | 
| 71 | 
            -
                        print("Available commands: start, stop, restart, port")
         | 
| 71 | 
            +
                        print("Available commands: start, stop, restart, status, port")
         | 
| 72 72 | 
             
                        return 1
         | 
| 73 | 
            -
             | 
| 73 | 
            +
             | 
| 74 74 | 
             
                except ImportError as e:
         | 
| 75 75 | 
             
                    logger.error(f"Server manager not available: {e}")
         | 
| 76 76 | 
             
                    print("Error: Socket.IO server manager not available")
         | 
| @@ -80,39 +80,39 @@ def manage_monitor(args): | |
| 80 80 | 
             
                    logger.error(f"Error managing monitor: {e}")
         | 
| 81 81 | 
             
                    print(f"Error: {e}")
         | 
| 82 82 | 
             
                    return 1
         | 
| 83 | 
            -
             | 
| 83 | 
            +
             | 
| 84 84 | 
             
                return 0
         | 
| 85 85 |  | 
| 86 86 |  | 
| 87 87 | 
             
            def _port_server(args, server_manager):
         | 
| 88 88 | 
             
                """
         | 
| 89 89 | 
             
                Start or restart the Socket.IO monitoring server on a specific port.
         | 
| 90 | 
            -
             | 
| 90 | 
            +
             | 
| 91 91 | 
             
                WHY: Users need to be able to start/restart the monitoring server on a specific
         | 
| 92 92 | 
             
                port, either if no server is running (start) or if a server is already running
         | 
| 93 93 | 
             
                on a different port (restart).
         | 
| 94 | 
            -
             | 
| 94 | 
            +
             | 
| 95 95 | 
             
                Args:
         | 
| 96 96 | 
             
                    args: Command arguments with required port and optional host
         | 
| 97 97 | 
             
                    server_manager: ServerManager instance
         | 
| 98 | 
            -
             | 
| 98 | 
            +
             | 
| 99 99 | 
             
                Returns:
         | 
| 100 100 | 
             
                    bool: True if server started/restarted successfully, False otherwise
         | 
| 101 101 | 
             
                """
         | 
| 102 102 | 
             
                port = args.port
         | 
| 103 | 
            -
                host = getattr(args,  | 
| 104 | 
            -
             | 
| 103 | 
            +
                host = getattr(args, "host", "localhost")
         | 
| 104 | 
            +
             | 
| 105 105 | 
             
                print(f"Managing Socket.IO monitoring server on port {port}...")
         | 
| 106 106 | 
             
                print(f"Target: {host}:{port}")
         | 
| 107 107 | 
             
                print()
         | 
| 108 | 
            -
             | 
| 108 | 
            +
             | 
| 109 109 | 
             
                try:
         | 
| 110 110 | 
             
                    # Check if there are any running servers
         | 
| 111 111 | 
             
                    running_servers = server_manager.list_running_servers()
         | 
| 112 | 
            -
             | 
| 112 | 
            +
             | 
| 113 113 | 
             
                    # Check if server is already running on this port
         | 
| 114 | 
            -
                    server_on_port = any(server.get( | 
| 115 | 
            -
             | 
| 114 | 
            +
                    server_on_port = any(server.get("port") == port for server in running_servers)
         | 
| 115 | 
            +
             | 
| 116 116 | 
             
                    if server_on_port:
         | 
| 117 117 | 
             
                        print(f"Server already running on port {port}. Restarting...")
         | 
| 118 118 | 
             
                        success = server_manager.restart_server(port=port)
         | 
| @@ -122,17 +122,19 @@ def _port_server(args, server_manager): | |
| 122 122 | 
             
                        if running_servers:
         | 
| 123 123 | 
             
                            print("Servers running on other ports:")
         | 
| 124 124 | 
             
                            for server in running_servers:
         | 
| 125 | 
            -
                                server_port = server.get( | 
| 126 | 
            -
                                server_id = server.get( | 
| 125 | 
            +
                                server_port = server.get("port")
         | 
| 126 | 
            +
                                server_id = server.get("server_id", "unknown")
         | 
| 127 127 | 
             
                                print(f"  • Server '{server_id}' on port {server_port}")
         | 
| 128 128 | 
             
                            print()
         | 
| 129 129 | 
             
                            print(f"Starting new server on port {port}...")
         | 
| 130 130 | 
             
                        else:
         | 
| 131 131 | 
             
                            print("No servers currently running. Starting new server...")
         | 
| 132 | 
            -
             | 
| 133 | 
            -
                        success = server_manager.start_server( | 
| 132 | 
            +
             | 
| 133 | 
            +
                        success = server_manager.start_server(
         | 
| 134 | 
            +
                            port=port, host=host, server_id="monitor-server"
         | 
| 135 | 
            +
                        )
         | 
| 134 136 | 
             
                        action = "started"
         | 
| 135 | 
            -
             | 
| 137 | 
            +
             | 
| 136 138 | 
             
                    if success:
         | 
| 137 139 | 
             
                        print()
         | 
| 138 140 | 
             
                        print(f"Monitor server {action} successfully on port {port}")
         | 
| @@ -150,9 +152,9 @@ def _port_server(args, server_manager): | |
| 150 152 | 
             
                        print(f"  • Check if port {port} is available: lsof -i :{port}")
         | 
| 151 153 | 
             
                        print(f"  • Try a different port: claude-mpm monitor port {port + 1}")
         | 
| 152 154 | 
             
                        print("  • Check system resources: free -h && df -h")
         | 
| 153 | 
            -
             | 
| 155 | 
            +
             | 
| 154 156 | 
             
                    return success
         | 
| 155 | 
            -
             | 
| 157 | 
            +
             | 
| 156 158 | 
             
                except Exception as e:
         | 
| 157 159 | 
             
                    print(f"Error managing server on port {port}: {e}")
         | 
| 158 160 | 
             
                    print()
         | 
| @@ -166,27 +168,29 @@ def _port_server(args, server_manager): | |
| 166 168 | 
             
            def _start_server(args, server_manager):
         | 
| 167 169 | 
             
                """
         | 
| 168 170 | 
             
                Start the Socket.IO monitoring server.
         | 
| 169 | 
            -
             | 
| 171 | 
            +
             | 
| 170 172 | 
             
                WHY: Users need to start the monitoring server to enable real-time monitoring
         | 
| 171 173 | 
             
                of Claude MPM sessions and websocket connections.
         | 
| 172 | 
            -
             | 
| 174 | 
            +
             | 
| 173 175 | 
             
                Args:
         | 
| 174 176 | 
             
                    args: Command arguments with optional port and host
         | 
| 175 177 | 
             
                    server_manager: ServerManager instance
         | 
| 176 | 
            -
             | 
| 178 | 
            +
             | 
| 177 179 | 
             
                Returns:
         | 
| 178 180 | 
             
                    bool: True if server started successfully, False otherwise
         | 
| 179 181 | 
             
                """
         | 
| 180 | 
            -
                port = getattr(args,  | 
| 181 | 
            -
                host = getattr(args,  | 
| 182 | 
            -
             | 
| 182 | 
            +
                port = getattr(args, "port", 8765)
         | 
| 183 | 
            +
                host = getattr(args, "host", "localhost")
         | 
| 184 | 
            +
             | 
| 183 185 | 
             
                print(f"Starting Socket.IO monitoring server...")
         | 
| 184 186 | 
             
                print(f"Target: {host}:{port}")
         | 
| 185 187 | 
             
                print()
         | 
| 186 | 
            -
             | 
| 188 | 
            +
             | 
| 187 189 | 
             
                try:
         | 
| 188 | 
            -
                    success = server_manager.start_server( | 
| 189 | 
            -
             | 
| 190 | 
            +
                    success = server_manager.start_server(
         | 
| 191 | 
            +
                        port=port, host=host, server_id="monitor-server"
         | 
| 192 | 
            +
                    )
         | 
| 193 | 
            +
             | 
| 190 194 | 
             
                    if success:
         | 
| 191 195 | 
             
                        print()
         | 
| 192 196 | 
             
                        print("Monitor server management commands:")
         | 
| @@ -195,9 +199,9 @@ def _start_server(args, server_manager): | |
| 195 199 | 
             
                        print(f"  Restart: claude-mpm monitor restart")
         | 
| 196 200 | 
             
                        print()
         | 
| 197 201 | 
             
                        print(f"WebSocket URL: ws://{host}:{port}")
         | 
| 198 | 
            -
             | 
| 202 | 
            +
             | 
| 199 203 | 
             
                    return success
         | 
| 200 | 
            -
             | 
| 204 | 
            +
             | 
| 201 205 | 
             
                except Exception as e:
         | 
| 202 206 | 
             
                    print(f"Failed to start monitoring server: {e}")
         | 
| 203 207 | 
             
                    print()
         | 
| @@ -211,21 +215,21 @@ def _start_server(args, server_manager): | |
| 211 215 | 
             
            def _stop_server(args, server_manager):
         | 
| 212 216 | 
             
                """
         | 
| 213 217 | 
             
                Stop the Socket.IO monitoring server.
         | 
| 214 | 
            -
             | 
| 218 | 
            +
             | 
| 215 219 | 
             
                WHY: Users need to stop the monitoring server when it's no longer needed
         | 
| 216 220 | 
             
                or when troubleshooting connection issues.
         | 
| 217 | 
            -
             | 
| 221 | 
            +
             | 
| 218 222 | 
             
                Args:
         | 
| 219 223 | 
             
                    args: Command arguments with optional port
         | 
| 220 224 | 
             
                    server_manager: ServerManager instance
         | 
| 221 | 
            -
             | 
| 225 | 
            +
             | 
| 222 226 | 
             
                Returns:
         | 
| 223 227 | 
             
                    bool: True if server stopped successfully, False otherwise
         | 
| 224 228 | 
             
                """
         | 
| 225 | 
            -
                port = getattr(args,  | 
| 226 | 
            -
             | 
| 229 | 
            +
                port = getattr(args, "port", None)
         | 
| 230 | 
            +
             | 
| 227 231 | 
             
                print("Stopping Socket.IO monitoring server...")
         | 
| 228 | 
            -
             | 
| 232 | 
            +
             | 
| 229 233 | 
             
                try:
         | 
| 230 234 | 
             
                    # If no port specified, try to find running servers and stop them
         | 
| 231 235 | 
             
                    if port is None:
         | 
| @@ -233,23 +237,23 @@ def _stop_server(args, server_manager): | |
| 233 237 | 
             
                        if not running_servers:
         | 
| 234 238 | 
             
                            print("No running servers found to stop")
         | 
| 235 239 | 
             
                            return True
         | 
| 236 | 
            -
             | 
| 240 | 
            +
             | 
| 237 241 | 
             
                        # Stop the first server (or all if multiple)
         | 
| 238 242 | 
             
                        success = True
         | 
| 239 243 | 
             
                        for server in running_servers:
         | 
| 240 | 
            -
                            server_port = server.get( | 
| 241 | 
            -
                            server_id = server.get( | 
| 244 | 
            +
                            server_port = server.get("port")
         | 
| 245 | 
            +
                            server_id = server.get("server_id", "unknown")
         | 
| 242 246 | 
             
                            print(f"Stopping server '{server_id}' on port {server_port}...")
         | 
| 243 | 
            -
             | 
| 247 | 
            +
             | 
| 244 248 | 
             
                            if not server_manager.stop_server(port=server_port):
         | 
| 245 249 | 
             
                                print(f"Failed to stop server on port {server_port}")
         | 
| 246 250 | 
             
                                success = False
         | 
| 247 | 
            -
             | 
| 251 | 
            +
             | 
| 248 252 | 
             
                        return success
         | 
| 249 253 | 
             
                    else:
         | 
| 250 254 | 
             
                        # Stop specific server on given port
         | 
| 251 255 | 
             
                        success = server_manager.stop_server(port=port)
         | 
| 252 | 
            -
             | 
| 256 | 
            +
             | 
| 253 257 | 
             
                        if success:
         | 
| 254 258 | 
             
                            print(f"Monitor server stopped on port {port}")
         | 
| 255 259 | 
             
                        else:
         | 
| @@ -258,49 +262,167 @@ def _stop_server(args, server_manager): | |
| 258 262 | 
             
                            print("Troubleshooting:")
         | 
| 259 263 | 
             
                            print(f"  • Check if server is running: claude-mpm monitor status")
         | 
| 260 264 | 
             
                            print(f"  • Try force kill: kill $(lsof -ti :{port})")
         | 
| 261 | 
            -
             | 
| 265 | 
            +
             | 
| 262 266 | 
             
                        return success
         | 
| 263 | 
            -
             | 
| 267 | 
            +
             | 
| 264 268 | 
             
                except Exception as e:
         | 
| 265 269 | 
             
                    print(f"Error stopping server: {e}")
         | 
| 266 270 | 
             
                    return False
         | 
| 267 271 |  | 
| 268 272 |  | 
| 273 | 
            +
            def _status_server(args, server_manager):
         | 
| 274 | 
            +
                """
         | 
| 275 | 
            +
                Check the status of Socket.IO monitoring servers.
         | 
| 276 | 
            +
             | 
| 277 | 
            +
                WHY: Users need to check if the monitoring server is running, what port
         | 
| 278 | 
            +
                it's using, and other diagnostic information without starting/stopping it.
         | 
| 279 | 
            +
             | 
| 280 | 
            +
                Args:
         | 
| 281 | 
            +
                    args: Command arguments with optional verbose flag
         | 
| 282 | 
            +
                    server_manager: ServerManager instance
         | 
| 283 | 
            +
             | 
| 284 | 
            +
                Returns:
         | 
| 285 | 
            +
                    bool: True if status check succeeded, False otherwise
         | 
| 286 | 
            +
                """
         | 
| 287 | 
            +
                verbose = getattr(args, "verbose", False)
         | 
| 288 | 
            +
                
         | 
| 289 | 
            +
                print("Checking Socket.IO monitoring server status...")
         | 
| 290 | 
            +
                print()
         | 
| 291 | 
            +
                
         | 
| 292 | 
            +
                try:
         | 
| 293 | 
            +
                    # Check for daemon server using socketio_daemon.py
         | 
| 294 | 
            +
                    daemon_script = server_manager.daemon_script
         | 
| 295 | 
            +
                    if daemon_script and daemon_script.exists():
         | 
| 296 | 
            +
                        # Try to get status from daemon
         | 
| 297 | 
            +
                        result = subprocess.run(
         | 
| 298 | 
            +
                            [sys.executable, str(daemon_script), "status"],
         | 
| 299 | 
            +
                            capture_output=True,
         | 
| 300 | 
            +
                            text=True
         | 
| 301 | 
            +
                        )
         | 
| 302 | 
            +
                        
         | 
| 303 | 
            +
                        if result.returncode == 0 and result.stdout:
         | 
| 304 | 
            +
                            # Daemon provided status information
         | 
| 305 | 
            +
                            print(result.stdout)
         | 
| 306 | 
            +
                            
         | 
| 307 | 
            +
                            if verbose:
         | 
| 308 | 
            +
                                # Show additional information
         | 
| 309 | 
            +
                                print("\nAdditional Details:")
         | 
| 310 | 
            +
                                print("─" * 40)
         | 
| 311 | 
            +
                                
         | 
| 312 | 
            +
                                # List all running servers from ServerManager
         | 
| 313 | 
            +
                                running_servers = server_manager.list_running_servers()
         | 
| 314 | 
            +
                                if running_servers:
         | 
| 315 | 
            +
                                    print(f"Found {len(running_servers)} running server(s):")
         | 
| 316 | 
            +
                                    for server in running_servers:
         | 
| 317 | 
            +
                                        server_port = server.get("port", "unknown")
         | 
| 318 | 
            +
                                        server_id = server.get("server_id", "unknown")
         | 
| 319 | 
            +
                                        server_pid = server.get("pid", "unknown")
         | 
| 320 | 
            +
                                        print(f"  • Server '{server_id}'")
         | 
| 321 | 
            +
                                        print(f"    Port: {server_port}")
         | 
| 322 | 
            +
                                        print(f"    PID: {server_pid}")
         | 
| 323 | 
            +
                                else:
         | 
| 324 | 
            +
                                    print("No additional servers found via ServerManager")
         | 
| 325 | 
            +
                            
         | 
| 326 | 
            +
                            return True
         | 
| 327 | 
            +
                    
         | 
| 328 | 
            +
                    # Fall back to ServerManager's list_running_servers
         | 
| 329 | 
            +
                    running_servers = server_manager.list_running_servers()
         | 
| 330 | 
            +
                    
         | 
| 331 | 
            +
                    if not running_servers:
         | 
| 332 | 
            +
                        print("❌ No Socket.IO monitoring servers are currently running")
         | 
| 333 | 
            +
                        print()
         | 
| 334 | 
            +
                        print("To start a server:")
         | 
| 335 | 
            +
                        print("  claude-mpm monitor start")
         | 
| 336 | 
            +
                        print("  claude-mpm monitor start --port 8765")
         | 
| 337 | 
            +
                        return True
         | 
| 338 | 
            +
                    
         | 
| 339 | 
            +
                    # Display server information
         | 
| 340 | 
            +
                    print(f"✅ Found {len(running_servers)} running server(s):")
         | 
| 341 | 
            +
                    print()
         | 
| 342 | 
            +
                    
         | 
| 343 | 
            +
                    for server in running_servers:
         | 
| 344 | 
            +
                        server_port = server.get("port", "unknown")
         | 
| 345 | 
            +
                        server_id = server.get("server_id", "unknown")
         | 
| 346 | 
            +
                        server_pid = server.get("pid", "unknown")
         | 
| 347 | 
            +
                        server_host = server.get("host", "localhost")
         | 
| 348 | 
            +
                        
         | 
| 349 | 
            +
                        print(f"Server: {server_id}")
         | 
| 350 | 
            +
                        print(f"  • PID: {server_pid}")
         | 
| 351 | 
            +
                        print(f"  • Port: {server_port}")
         | 
| 352 | 
            +
                        print(f"  • Host: {server_host}")
         | 
| 353 | 
            +
                        print(f"  • WebSocket URL: ws://{server_host}:{server_port}")
         | 
| 354 | 
            +
                        
         | 
| 355 | 
            +
                        if verbose:
         | 
| 356 | 
            +
                            # Check if port is actually listening
         | 
| 357 | 
            +
                            try:
         | 
| 358 | 
            +
                                import socket
         | 
| 359 | 
            +
                                sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
         | 
| 360 | 
            +
                                result = sock.connect_ex((server_host, server_port))
         | 
| 361 | 
            +
                                sock.close()
         | 
| 362 | 
            +
                                if result == 0:
         | 
| 363 | 
            +
                                    print(f"  • Status: ✅ Listening")
         | 
| 364 | 
            +
                                else:
         | 
| 365 | 
            +
                                    print(f"  • Status: ⚠️ Not responding on port")
         | 
| 366 | 
            +
                            except Exception as e:
         | 
| 367 | 
            +
                                print(f"  • Status: ❌ Error checking: {e}")
         | 
| 368 | 
            +
                        
         | 
| 369 | 
            +
                        print()
         | 
| 370 | 
            +
                    
         | 
| 371 | 
            +
                    print("Server management commands:")
         | 
| 372 | 
            +
                    print("  Stop all:    claude-mpm monitor stop")
         | 
| 373 | 
            +
                    print("  Restart:     claude-mpm monitor restart")
         | 
| 374 | 
            +
                    if len(running_servers) == 1:
         | 
| 375 | 
            +
                        port = running_servers[0].get("port", 8765)
         | 
| 376 | 
            +
                        print(f"  Stop this:   claude-mpm monitor stop --port {port}")
         | 
| 377 | 
            +
                    
         | 
| 378 | 
            +
                    return True
         | 
| 379 | 
            +
                    
         | 
| 380 | 
            +
                except Exception as e:
         | 
| 381 | 
            +
                    print(f"Error checking server status: {e}")
         | 
| 382 | 
            +
                    print()
         | 
| 383 | 
            +
                    print("Try manual checks:")
         | 
| 384 | 
            +
                    print("  • Process list: ps aux | grep socketio")
         | 
| 385 | 
            +
                    print("  • Port usage: lsof -i :8765")
         | 
| 386 | 
            +
                    return False
         | 
| 387 | 
            +
             | 
| 388 | 
            +
             | 
| 269 389 | 
             
            def _restart_server(args, server_manager):
         | 
| 270 390 | 
             
                """
         | 
| 271 391 | 
             
                Restart the Socket.IO monitoring server.
         | 
| 272 | 
            -
             | 
| 392 | 
            +
             | 
| 273 393 | 
             
                WHY: Users need to restart the monitoring server to apply configuration
         | 
| 274 394 | 
             
                changes or recover from error states.
         | 
| 275 | 
            -
             | 
| 395 | 
            +
             | 
| 276 396 | 
             
                Args:
         | 
| 277 397 | 
             
                    args: Command arguments with optional port
         | 
| 278 398 | 
             
                    server_manager: ServerManager instance
         | 
| 279 | 
            -
             | 
| 399 | 
            +
             | 
| 280 400 | 
             
                Returns:
         | 
| 281 401 | 
             
                    bool: True if server restarted successfully, False otherwise
         | 
| 282 402 | 
             
                """
         | 
| 283 | 
            -
                port = getattr(args,  | 
| 284 | 
            -
             | 
| 403 | 
            +
                port = getattr(args, "port", None)
         | 
| 404 | 
            +
             | 
| 285 405 | 
             
                print("Restarting Socket.IO monitoring server...")
         | 
| 286 | 
            -
             | 
| 406 | 
            +
             | 
| 287 407 | 
             
                try:
         | 
| 288 408 | 
             
                    # If no port specified, find running servers to restart
         | 
| 289 409 | 
             
                    if port is None:
         | 
| 290 410 | 
             
                        running_servers = server_manager.list_running_servers()
         | 
| 291 411 | 
             
                        if not running_servers:
         | 
| 292 | 
            -
                            print( | 
| 412 | 
            +
                            print(
         | 
| 413 | 
            +
                                "No running servers found. Starting new server on default port..."
         | 
| 414 | 
            +
                            )
         | 
| 293 415 | 
             
                            return _start_server(args, server_manager)
         | 
| 294 | 
            -
             | 
| 416 | 
            +
             | 
| 295 417 | 
             
                        # Restart the first server found
         | 
| 296 418 | 
             
                        server = running_servers[0]
         | 
| 297 | 
            -
                        port = server.get( | 
| 298 | 
            -
             | 
| 419 | 
            +
                        port = server.get("port", 8765)
         | 
| 420 | 
            +
             | 
| 299 421 | 
             
                    print(f"Using port {port} for restart...")
         | 
| 300 | 
            -
             | 
| 422 | 
            +
             | 
| 301 423 | 
             
                    # Use ServerManager's restart method
         | 
| 302 424 | 
             
                    success = server_manager.restart_server(port=port)
         | 
| 303 | 
            -
             | 
| 425 | 
            +
             | 
| 304 426 | 
             
                    if success:
         | 
| 305 427 | 
             
                        print(f"Monitor server restarted successfully on port {port}")
         | 
| 306 428 | 
             
                        print()
         | 
| @@ -316,13 +438,13 @@ def _restart_server(args, server_manager): | |
| 316 438 | 
             
                        print(f"    claude-mpm monitor stop --port {port}")
         | 
| 317 439 | 
             
                        print(f"    claude-mpm monitor start --port {port}")
         | 
| 318 440 | 
             
                        print("  • Check server logs for errors")
         | 
| 319 | 
            -
             | 
| 441 | 
            +
             | 
| 320 442 | 
             
                    return success
         | 
| 321 | 
            -
             | 
| 443 | 
            +
             | 
| 322 444 | 
             
                except Exception as e:
         | 
| 323 445 | 
             
                    print(f"Error restarting server: {e}")
         | 
| 324 446 | 
             
                    print()
         | 
| 325 447 | 
             
                    print("Fallback options:")
         | 
| 326 448 | 
             
                    print("  • Manual restart: stop then start")
         | 
| 327 449 | 
             
                    print("  • Check system resources and try again")
         | 
| 328 | 
            -
                    return False
         | 
| 450 | 
            +
                    return False
         |