claude-mpm 3.9.11__py3-none-any.whl → 4.0.4__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 +2 -2
- 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 +330 -86
- 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 +363 -220
- 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 +124 -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/built/components/agent-inference.js +2 -0
- claude_mpm/dashboard/static/built/components/event-processor.js +2 -0
- claude_mpm/dashboard/static/built/components/event-viewer.js +2 -0
- claude_mpm/dashboard/static/built/components/export-manager.js +2 -0
- claude_mpm/dashboard/static/built/components/file-tool-tracker.js +2 -0
- claude_mpm/dashboard/static/built/components/hud-library-loader.js +2 -0
- claude_mpm/dashboard/static/built/components/hud-manager.js +2 -0
- claude_mpm/dashboard/static/built/components/hud-visualizer.js +2 -0
- claude_mpm/dashboard/static/built/components/module-viewer.js +2 -0
- claude_mpm/dashboard/static/built/components/session-manager.js +2 -0
- claude_mpm/dashboard/static/built/components/socket-manager.js +2 -0
- claude_mpm/dashboard/static/built/components/ui-state-manager.js +2 -0
- claude_mpm/dashboard/static/built/components/working-directory.js +2 -0
- claude_mpm/dashboard/static/built/dashboard.js +2 -0
- claude_mpm/dashboard/static/built/socket-client.js +2 -0
- 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 +93 -72
- claude_mpm/dashboard/static/js/components/export-manager.js +31 -28
- claude_mpm/dashboard/static/js/components/file-tool-tracker.js +110 -96
- 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 +133 -53
- 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 +575 -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 +166 -64
- 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 +185 -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.4.dist-info}/METADATA +90 -22
- claude_mpm-4.0.4.dist-info/RECORD +417 -0
- {claude_mpm-3.9.11.dist-info → claude_mpm-4.0.4.dist-info}/entry_points.txt +1 -0
- {claude_mpm-3.9.11.dist-info → claude_mpm-4.0.4.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.4.dist-info}/WHEEL +0 -0
- {claude_mpm-3.9.11.dist-info → claude_mpm-4.0.4.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,85 @@ 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 | 
            -
                on a different port (restart).
         | 
| 94 | 
            -
                
         | 
| 93 | 
            +
                on a different port (restart). Enhanced with smart process detection to reclaim
         | 
| 94 | 
            +
                ports from debug processes.
         | 
| 95 | 
            +
             | 
| 95 96 | 
             
                Args:
         | 
| 96 | 
            -
                    args: Command arguments with required port and optional host
         | 
| 97 | 
            +
                    args: Command arguments with required port and optional host, force, reclaim flags
         | 
| 97 98 | 
             
                    server_manager: ServerManager instance
         | 
| 98 | 
            -
             | 
| 99 | 
            +
             | 
| 99 100 | 
             
                Returns:
         | 
| 100 101 | 
             
                    bool: True if server started/restarted successfully, False otherwise
         | 
| 101 102 | 
             
                """
         | 
| 102 103 | 
             
                port = args.port
         | 
| 103 | 
            -
                host = getattr(args,  | 
| 104 | 
            -
                
         | 
| 104 | 
            +
                host = getattr(args, "host", "localhost")
         | 
| 105 | 
            +
                force = getattr(args, "force", False)
         | 
| 106 | 
            +
                reclaim = getattr(args, "reclaim", True)
         | 
| 107 | 
            +
             | 
| 105 108 | 
             
                print(f"Managing Socket.IO monitoring server on port {port}...")
         | 
| 106 109 | 
             
                print(f"Target: {host}:{port}")
         | 
| 107 110 | 
             
                print()
         | 
| 108 | 
            -
             | 
| 111 | 
            +
             | 
| 109 112 | 
             
                try:
         | 
| 110 | 
            -
                    #  | 
| 111 | 
            -
                     | 
| 113 | 
            +
                    # Import PortManager to check port status
         | 
| 114 | 
            +
                    from ...services.port_manager import PortManager
         | 
| 115 | 
            +
                    port_manager = PortManager()
         | 
| 116 | 
            +
                    
         | 
| 117 | 
            +
                    # Get detailed port status
         | 
| 118 | 
            +
                    port_status = port_manager.get_port_status(port)
         | 
| 112 119 |  | 
| 113 | 
            -
                    # Check if  | 
| 114 | 
            -
                     | 
| 120 | 
            +
                    # Check if port is in use
         | 
| 121 | 
            +
                    if not port_status["available"]:
         | 
| 122 | 
            +
                        process_info = port_status.get("process")
         | 
| 123 | 
            +
                        if process_info:
         | 
| 124 | 
            +
                            print(f"⚠️ Port {port} is in use:")
         | 
| 125 | 
            +
                            print(f"  Process: {process_info['name']} (PID: {process_info['pid']})")
         | 
| 126 | 
            +
                            
         | 
| 127 | 
            +
                            if process_info['is_ours']:
         | 
| 128 | 
            +
                                if process_info['is_debug']:
         | 
| 129 | 
            +
                                    print(f"  Type: Debug/Test script (can be reclaimed)")
         | 
| 130 | 
            +
                                    if reclaim:
         | 
| 131 | 
            +
                                        print(f"  Action: Attempting to reclaim port...")
         | 
| 132 | 
            +
                                        if port_manager.kill_process_on_port(port, force=force):
         | 
| 133 | 
            +
                                            print(f"  ✅ Successfully reclaimed port {port}")
         | 
| 134 | 
            +
                                        else:
         | 
| 135 | 
            +
                                            print(f"  ❌ Failed to reclaim port {port}")
         | 
| 136 | 
            +
                                            return False
         | 
| 137 | 
            +
                                elif process_info['is_daemon']:
         | 
| 138 | 
            +
                                    print(f"  Type: Daemon process")
         | 
| 139 | 
            +
                                    if force:
         | 
| 140 | 
            +
                                        print(f"  Action: Force killing daemon (--force flag used)...")
         | 
| 141 | 
            +
                                        if port_manager.kill_process_on_port(port, force=True):
         | 
| 142 | 
            +
                                            print(f"  ✅ Successfully killed daemon on port {port}")
         | 
| 143 | 
            +
                                        else:
         | 
| 144 | 
            +
                                            print(f"  ❌ Failed to kill daemon on port {port}")
         | 
| 145 | 
            +
                                            return False
         | 
| 146 | 
            +
                                    else:
         | 
| 147 | 
            +
                                        print(f"  ❌ Cannot start: Daemon already running")
         | 
| 148 | 
            +
                                        print(f"  Recommendation: {port_status['recommendation']}")
         | 
| 149 | 
            +
                                        return False
         | 
| 150 | 
            +
                            else:
         | 
| 151 | 
            +
                                print(f"  Type: External process")
         | 
| 152 | 
            +
                                print(f"  ❌ Cannot start: {port_status['recommendation']}")
         | 
| 153 | 
            +
                                return False
         | 
| 154 | 
            +
                            print()
         | 
| 115 155 |  | 
| 156 | 
            +
                    # Check if there are any running servers
         | 
| 157 | 
            +
                    running_servers = server_manager.list_running_servers()
         | 
| 158 | 
            +
             | 
| 159 | 
            +
                    # Check if server is already running on this port after reclaim
         | 
| 160 | 
            +
                    server_on_port = any(server.get("port") == port for server in running_servers)
         | 
| 161 | 
            +
             | 
| 116 162 | 
             
                    if server_on_port:
         | 
| 117 163 | 
             
                        print(f"Server already running on port {port}. Restarting...")
         | 
| 118 164 | 
             
                        success = server_manager.restart_server(port=port)
         | 
| @@ -122,17 +168,19 @@ def _port_server(args, server_manager): | |
| 122 168 | 
             
                        if running_servers:
         | 
| 123 169 | 
             
                            print("Servers running on other ports:")
         | 
| 124 170 | 
             
                            for server in running_servers:
         | 
| 125 | 
            -
                                server_port = server.get( | 
| 126 | 
            -
                                server_id = server.get( | 
| 171 | 
            +
                                server_port = server.get("port")
         | 
| 172 | 
            +
                                server_id = server.get("server_id", "unknown")
         | 
| 127 173 | 
             
                                print(f"  • Server '{server_id}' on port {server_port}")
         | 
| 128 174 | 
             
                            print()
         | 
| 129 175 | 
             
                            print(f"Starting new server on port {port}...")
         | 
| 130 176 | 
             
                        else:
         | 
| 131 177 | 
             
                            print("No servers currently running. Starting new server...")
         | 
| 132 | 
            -
             | 
| 133 | 
            -
                        success = server_manager.start_server( | 
| 178 | 
            +
             | 
| 179 | 
            +
                        success = server_manager.start_server(
         | 
| 180 | 
            +
                            port=port, host=host, server_id="monitor-server"
         | 
| 181 | 
            +
                        )
         | 
| 134 182 | 
             
                        action = "started"
         | 
| 135 | 
            -
             | 
| 183 | 
            +
             | 
| 136 184 | 
             
                    if success:
         | 
| 137 185 | 
             
                        print()
         | 
| 138 186 | 
             
                        print(f"Monitor server {action} successfully on port {port}")
         | 
| @@ -150,9 +198,9 @@ def _port_server(args, server_manager): | |
| 150 198 | 
             
                        print(f"  • Check if port {port} is available: lsof -i :{port}")
         | 
| 151 199 | 
             
                        print(f"  • Try a different port: claude-mpm monitor port {port + 1}")
         | 
| 152 200 | 
             
                        print("  • Check system resources: free -h && df -h")
         | 
| 153 | 
            -
             | 
| 201 | 
            +
             | 
| 154 202 | 
             
                    return success
         | 
| 155 | 
            -
             | 
| 203 | 
            +
             | 
| 156 204 | 
             
                except Exception as e:
         | 
| 157 205 | 
             
                    print(f"Error managing server on port {port}: {e}")
         | 
| 158 206 | 
             
                    print()
         | 
| @@ -166,27 +214,67 @@ def _port_server(args, server_manager): | |
| 166 214 | 
             
            def _start_server(args, server_manager):
         | 
| 167 215 | 
             
                """
         | 
| 168 216 | 
             
                Start the Socket.IO monitoring server.
         | 
| 169 | 
            -
             | 
| 217 | 
            +
             | 
| 170 218 | 
             
                WHY: Users need to start the monitoring server to enable real-time monitoring
         | 
| 171 | 
            -
                of Claude MPM sessions and websocket connections.
         | 
| 172 | 
            -
                
         | 
| 219 | 
            +
                of Claude MPM sessions and websocket connections. Enhanced with smart process
         | 
| 220 | 
            +
                detection to automatically reclaim ports from debug scripts.
         | 
| 221 | 
            +
             | 
| 173 222 | 
             
                Args:
         | 
| 174 | 
            -
                    args: Command arguments with optional port and  | 
| 223 | 
            +
                    args: Command arguments with optional port, host, force, and reclaim flags
         | 
| 175 224 | 
             
                    server_manager: ServerManager instance
         | 
| 176 | 
            -
             | 
| 225 | 
            +
             | 
| 177 226 | 
             
                Returns:
         | 
| 178 227 | 
             
                    bool: True if server started successfully, False otherwise
         | 
| 179 228 | 
             
                """
         | 
| 180 | 
            -
                port = getattr(args,  | 
| 181 | 
            -
                host = getattr(args,  | 
| 182 | 
            -
                
         | 
| 229 | 
            +
                port = getattr(args, "port", None)
         | 
| 230 | 
            +
                host = getattr(args, "host", "localhost")
         | 
| 231 | 
            +
                force = getattr(args, "force", False)
         | 
| 232 | 
            +
                reclaim = getattr(args, "reclaim", True)
         | 
| 233 | 
            +
             | 
| 183 234 | 
             
                print(f"Starting Socket.IO monitoring server...")
         | 
| 184 | 
            -
                print(f"Target: {host}:{port}")
         | 
| 185 | 
            -
                print()
         | 
| 186 235 |  | 
| 187 236 | 
             
                try:
         | 
| 188 | 
            -
                     | 
| 237 | 
            +
                    # Import PortManager for smart port selection
         | 
| 238 | 
            +
                    from ...services.port_manager import PortManager
         | 
| 239 | 
            +
                    port_manager = PortManager()
         | 
| 240 | 
            +
                    
         | 
| 241 | 
            +
                    # If no port specified, find an available one with smart reclaim
         | 
| 242 | 
            +
                    if port is None:
         | 
| 243 | 
            +
                        port = port_manager.find_available_port(reclaim=reclaim)
         | 
| 244 | 
            +
                        if port is None:
         | 
| 245 | 
            +
                            print("❌ No available ports found")
         | 
| 246 | 
            +
                            print("Try specifying a port with --port or use --force to reclaim daemon ports")
         | 
| 247 | 
            +
                            return False
         | 
| 248 | 
            +
                        print(f"Selected port: {port}")
         | 
| 249 | 
            +
                    else:
         | 
| 250 | 
            +
                        # Check if specified port needs reclaiming
         | 
| 251 | 
            +
                        port_status = port_manager.get_port_status(port)
         | 
| 252 | 
            +
                        if not port_status["available"]:
         | 
| 253 | 
            +
                            process_info = port_status.get("process")
         | 
| 254 | 
            +
                            if process_info:
         | 
| 255 | 
            +
                                print(f"⚠️ Port {port} is in use by {process_info['name']} (PID: {process_info['pid']})")
         | 
| 256 | 
            +
                                
         | 
| 257 | 
            +
                                if process_info['is_ours'] and (process_info['is_debug'] or force):
         | 
| 258 | 
            +
                                    if reclaim:
         | 
| 259 | 
            +
                                        print(f"Attempting to reclaim port {port}...")
         | 
| 260 | 
            +
                                        if not port_manager.kill_process_on_port(port, force=force):
         | 
| 261 | 
            +
                                            print(f"❌ Failed to reclaim port {port}")
         | 
| 262 | 
            +
                                            return False
         | 
| 263 | 
            +
                                        print(f"✅ Successfully reclaimed port {port}")
         | 
| 264 | 
            +
                                    else:
         | 
| 265 | 
            +
                                        print(f"❌ Port {port} unavailable and --no-reclaim specified")
         | 
| 266 | 
            +
                                        return False
         | 
| 267 | 
            +
                                else:
         | 
| 268 | 
            +
                                    print(f"❌ Cannot reclaim port: {port_status['recommendation']}")
         | 
| 269 | 
            +
                                    return False
         | 
| 189 270 |  | 
| 271 | 
            +
                    print(f"Target: {host}:{port}")
         | 
| 272 | 
            +
                    print()
         | 
| 273 | 
            +
                    
         | 
| 274 | 
            +
                    success = server_manager.start_server(
         | 
| 275 | 
            +
                        port=port, host=host, server_id="monitor-server"
         | 
| 276 | 
            +
                    )
         | 
| 277 | 
            +
             | 
| 190 278 | 
             
                    if success:
         | 
| 191 279 | 
             
                        print()
         | 
| 192 280 | 
             
                        print("Monitor server management commands:")
         | 
| @@ -195,9 +283,9 @@ def _start_server(args, server_manager): | |
| 195 283 | 
             
                        print(f"  Restart: claude-mpm monitor restart")
         | 
| 196 284 | 
             
                        print()
         | 
| 197 285 | 
             
                        print(f"WebSocket URL: ws://{host}:{port}")
         | 
| 198 | 
            -
             | 
| 286 | 
            +
             | 
| 199 287 | 
             
                    return success
         | 
| 200 | 
            -
             | 
| 288 | 
            +
             | 
| 201 289 | 
             
                except Exception as e:
         | 
| 202 290 | 
             
                    print(f"Failed to start monitoring server: {e}")
         | 
| 203 291 | 
             
                    print()
         | 
| @@ -211,21 +299,21 @@ def _start_server(args, server_manager): | |
| 211 299 | 
             
            def _stop_server(args, server_manager):
         | 
| 212 300 | 
             
                """
         | 
| 213 301 | 
             
                Stop the Socket.IO monitoring server.
         | 
| 214 | 
            -
             | 
| 302 | 
            +
             | 
| 215 303 | 
             
                WHY: Users need to stop the monitoring server when it's no longer needed
         | 
| 216 304 | 
             
                or when troubleshooting connection issues.
         | 
| 217 | 
            -
             | 
| 305 | 
            +
             | 
| 218 306 | 
             
                Args:
         | 
| 219 307 | 
             
                    args: Command arguments with optional port
         | 
| 220 308 | 
             
                    server_manager: ServerManager instance
         | 
| 221 | 
            -
             | 
| 309 | 
            +
             | 
| 222 310 | 
             
                Returns:
         | 
| 223 311 | 
             
                    bool: True if server stopped successfully, False otherwise
         | 
| 224 312 | 
             
                """
         | 
| 225 | 
            -
                port = getattr(args,  | 
| 226 | 
            -
             | 
| 313 | 
            +
                port = getattr(args, "port", None)
         | 
| 314 | 
            +
             | 
| 227 315 | 
             
                print("Stopping Socket.IO monitoring server...")
         | 
| 228 | 
            -
             | 
| 316 | 
            +
             | 
| 229 317 | 
             
                try:
         | 
| 230 318 | 
             
                    # If no port specified, try to find running servers and stop them
         | 
| 231 319 | 
             
                    if port is None:
         | 
| @@ -233,23 +321,23 @@ def _stop_server(args, server_manager): | |
| 233 321 | 
             
                        if not running_servers:
         | 
| 234 322 | 
             
                            print("No running servers found to stop")
         | 
| 235 323 | 
             
                            return True
         | 
| 236 | 
            -
             | 
| 324 | 
            +
             | 
| 237 325 | 
             
                        # Stop the first server (or all if multiple)
         | 
| 238 326 | 
             
                        success = True
         | 
| 239 327 | 
             
                        for server in running_servers:
         | 
| 240 | 
            -
                            server_port = server.get( | 
| 241 | 
            -
                            server_id = server.get( | 
| 328 | 
            +
                            server_port = server.get("port")
         | 
| 329 | 
            +
                            server_id = server.get("server_id", "unknown")
         | 
| 242 330 | 
             
                            print(f"Stopping server '{server_id}' on port {server_port}...")
         | 
| 243 | 
            -
             | 
| 331 | 
            +
             | 
| 244 332 | 
             
                            if not server_manager.stop_server(port=server_port):
         | 
| 245 333 | 
             
                                print(f"Failed to stop server on port {server_port}")
         | 
| 246 334 | 
             
                                success = False
         | 
| 247 | 
            -
             | 
| 335 | 
            +
             | 
| 248 336 | 
             
                        return success
         | 
| 249 337 | 
             
                    else:
         | 
| 250 338 | 
             
                        # Stop specific server on given port
         | 
| 251 339 | 
             
                        success = server_manager.stop_server(port=port)
         | 
| 252 | 
            -
             | 
| 340 | 
            +
             | 
| 253 341 | 
             
                        if success:
         | 
| 254 342 | 
             
                            print(f"Monitor server stopped on port {port}")
         | 
| 255 343 | 
             
                        else:
         | 
| @@ -258,49 +346,205 @@ def _stop_server(args, server_manager): | |
| 258 346 | 
             
                            print("Troubleshooting:")
         | 
| 259 347 | 
             
                            print(f"  • Check if server is running: claude-mpm monitor status")
         | 
| 260 348 | 
             
                            print(f"  • Try force kill: kill $(lsof -ti :{port})")
         | 
| 261 | 
            -
             | 
| 349 | 
            +
             | 
| 262 350 | 
             
                        return success
         | 
| 263 | 
            -
             | 
| 351 | 
            +
             | 
| 264 352 | 
             
                except Exception as e:
         | 
| 265 353 | 
             
                    print(f"Error stopping server: {e}")
         | 
| 266 354 | 
             
                    return False
         | 
| 267 355 |  | 
| 268 356 |  | 
| 357 | 
            +
            def _status_server(args, server_manager):
         | 
| 358 | 
            +
                """
         | 
| 359 | 
            +
                Check the status of Socket.IO monitoring servers.
         | 
| 360 | 
            +
             | 
| 361 | 
            +
                WHY: Users need to check if the monitoring server is running, what port
         | 
| 362 | 
            +
                it's using, and other diagnostic information without starting/stopping it.
         | 
| 363 | 
            +
                Enhanced to show what processes are using ports.
         | 
| 364 | 
            +
             | 
| 365 | 
            +
                Args:
         | 
| 366 | 
            +
                    args: Command arguments with optional verbose flag
         | 
| 367 | 
            +
                    server_manager: ServerManager instance
         | 
| 368 | 
            +
             | 
| 369 | 
            +
                Returns:
         | 
| 370 | 
            +
                    bool: True if status check succeeded, False otherwise
         | 
| 371 | 
            +
                """
         | 
| 372 | 
            +
                verbose = getattr(args, "verbose", False)
         | 
| 373 | 
            +
                show_ports = getattr(args, "show_ports", False)
         | 
| 374 | 
            +
                
         | 
| 375 | 
            +
                print("Checking Socket.IO monitoring server status...")
         | 
| 376 | 
            +
                print()
         | 
| 377 | 
            +
                
         | 
| 378 | 
            +
                try:
         | 
| 379 | 
            +
                    # Check for daemon server using socketio_daemon.py
         | 
| 380 | 
            +
                    daemon_script = server_manager.daemon_script
         | 
| 381 | 
            +
                    if daemon_script and daemon_script.exists():
         | 
| 382 | 
            +
                        # Try to get status from daemon
         | 
| 383 | 
            +
                        result = subprocess.run(
         | 
| 384 | 
            +
                            [sys.executable, str(daemon_script), "status"],
         | 
| 385 | 
            +
                            capture_output=True,
         | 
| 386 | 
            +
                            text=True
         | 
| 387 | 
            +
                        )
         | 
| 388 | 
            +
                        
         | 
| 389 | 
            +
                        if result.returncode == 0 and result.stdout:
         | 
| 390 | 
            +
                            # Daemon provided status information
         | 
| 391 | 
            +
                            print(result.stdout)
         | 
| 392 | 
            +
                            
         | 
| 393 | 
            +
                            if verbose:
         | 
| 394 | 
            +
                                # Show additional information
         | 
| 395 | 
            +
                                print("\nAdditional Details:")
         | 
| 396 | 
            +
                                print("─" * 40)
         | 
| 397 | 
            +
                                
         | 
| 398 | 
            +
                                # List all running servers from ServerManager
         | 
| 399 | 
            +
                                running_servers = server_manager.list_running_servers()
         | 
| 400 | 
            +
                                if running_servers:
         | 
| 401 | 
            +
                                    print(f"Found {len(running_servers)} running server(s):")
         | 
| 402 | 
            +
                                    for server in running_servers:
         | 
| 403 | 
            +
                                        server_port = server.get("port", "unknown")
         | 
| 404 | 
            +
                                        server_id = server.get("server_id", "unknown")
         | 
| 405 | 
            +
                                        server_pid = server.get("pid", "unknown")
         | 
| 406 | 
            +
                                        print(f"  • Server '{server_id}'")
         | 
| 407 | 
            +
                                        print(f"    Port: {server_port}")
         | 
| 408 | 
            +
                                        print(f"    PID: {server_pid}")
         | 
| 409 | 
            +
                                else:
         | 
| 410 | 
            +
                                    print("No additional servers found via ServerManager")
         | 
| 411 | 
            +
                            
         | 
| 412 | 
            +
                            return True
         | 
| 413 | 
            +
                    
         | 
| 414 | 
            +
                    # Fall back to ServerManager's list_running_servers
         | 
| 415 | 
            +
                    running_servers = server_manager.list_running_servers()
         | 
| 416 | 
            +
                    
         | 
| 417 | 
            +
                    if not running_servers:
         | 
| 418 | 
            +
                        print("❌ No Socket.IO monitoring servers are currently running")
         | 
| 419 | 
            +
                        print()
         | 
| 420 | 
            +
                        print("To start a server:")
         | 
| 421 | 
            +
                        print("  claude-mpm monitor start")
         | 
| 422 | 
            +
                        print("  claude-mpm monitor start --port 8765")
         | 
| 423 | 
            +
                        return True
         | 
| 424 | 
            +
                    
         | 
| 425 | 
            +
                    # Import PortManager for enhanced status
         | 
| 426 | 
            +
                    from ...services.port_manager import PortManager
         | 
| 427 | 
            +
                    port_manager = PortManager()
         | 
| 428 | 
            +
                    
         | 
| 429 | 
            +
                    # Display server information
         | 
| 430 | 
            +
                    print(f"✅ Found {len(running_servers)} running server(s):")
         | 
| 431 | 
            +
                    print()
         | 
| 432 | 
            +
                    
         | 
| 433 | 
            +
                    for server in running_servers:
         | 
| 434 | 
            +
                        server_port = server.get("port", "unknown")
         | 
| 435 | 
            +
                        server_id = server.get("server_id", "unknown")
         | 
| 436 | 
            +
                        server_pid = server.get("pid", "unknown")
         | 
| 437 | 
            +
                        server_host = server.get("host", "localhost")
         | 
| 438 | 
            +
                        
         | 
| 439 | 
            +
                        print(f"Server: {server_id}")
         | 
| 440 | 
            +
                        print(f"  • PID: {server_pid}")
         | 
| 441 | 
            +
                        print(f"  • Port: {server_port}")
         | 
| 442 | 
            +
                        print(f"  • Host: {server_host}")
         | 
| 443 | 
            +
                        print(f"  • WebSocket URL: ws://{server_host}:{server_port}")
         | 
| 444 | 
            +
                        
         | 
| 445 | 
            +
                        # Show port status if verbose
         | 
| 446 | 
            +
                        if verbose and server_port != "unknown":
         | 
| 447 | 
            +
                            port_status = port_manager.get_port_status(int(server_port))
         | 
| 448 | 
            +
                            if port_status.get("process"):
         | 
| 449 | 
            +
                                process = port_status["process"]
         | 
| 450 | 
            +
                                print(f"  • Process Type: {'Debug' if process['is_debug'] else 'Daemon' if process['is_daemon'] else 'Regular'}")
         | 
| 451 | 
            +
                        
         | 
| 452 | 
            +
                        if verbose:
         | 
| 453 | 
            +
                            # Check if port is actually listening
         | 
| 454 | 
            +
                            try:
         | 
| 455 | 
            +
                                import socket
         | 
| 456 | 
            +
                                sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
         | 
| 457 | 
            +
                                result = sock.connect_ex((server_host, server_port))
         | 
| 458 | 
            +
                                sock.close()
         | 
| 459 | 
            +
                                if result == 0:
         | 
| 460 | 
            +
                                    print(f"  • Status: ✅ Listening")
         | 
| 461 | 
            +
                                else:
         | 
| 462 | 
            +
                                    print(f"  • Status: ⚠️ Not responding on port")
         | 
| 463 | 
            +
                            except Exception as e:
         | 
| 464 | 
            +
                                print(f"  • Status: ❌ Error checking: {e}")
         | 
| 465 | 
            +
                        
         | 
| 466 | 
            +
                        print()
         | 
| 467 | 
            +
                    
         | 
| 468 | 
            +
                    # Show port range status if requested
         | 
| 469 | 
            +
                    if show_ports or verbose:
         | 
| 470 | 
            +
                        print("\nPort Range Status (8765-8785):")
         | 
| 471 | 
            +
                        print("─" * 40)
         | 
| 472 | 
            +
                        for check_port in range(8765, 8771):  # Show first 6 ports
         | 
| 473 | 
            +
                            status = port_manager.get_port_status(check_port)
         | 
| 474 | 
            +
                            if status["available"]:
         | 
| 475 | 
            +
                                print(f"  Port {check_port}: ✅ Available")
         | 
| 476 | 
            +
                            else:
         | 
| 477 | 
            +
                                process = status.get("process")
         | 
| 478 | 
            +
                                if process:
         | 
| 479 | 
            +
                                    if process["is_ours"]:
         | 
| 480 | 
            +
                                        if process["is_debug"]:
         | 
| 481 | 
            +
                                            print(f"  Port {check_port}: 🔧 Debug script (PID: {process['pid']})")
         | 
| 482 | 
            +
                                        elif process["is_daemon"]:
         | 
| 483 | 
            +
                                            print(f"  Port {check_port}: 🚀 Daemon (PID: {process['pid']})")
         | 
| 484 | 
            +
                                        else:
         | 
| 485 | 
            +
                                            print(f"  Port {check_port}: 📦 Our process (PID: {process['pid']})")
         | 
| 486 | 
            +
                                    else:
         | 
| 487 | 
            +
                                        print(f"  Port {check_port}: ⛔ External ({process['name']})")
         | 
| 488 | 
            +
                                else:
         | 
| 489 | 
            +
                                    print(f"  Port {check_port}: ❓ In use (unknown process)")
         | 
| 490 | 
            +
                        print()
         | 
| 491 | 
            +
                    
         | 
| 492 | 
            +
                    print("Server management commands:")
         | 
| 493 | 
            +
                    print("  Stop all:    claude-mpm monitor stop")
         | 
| 494 | 
            +
                    print("  Restart:     claude-mpm monitor restart")
         | 
| 495 | 
            +
                    print("  Reclaim:     claude-mpm monitor start --force  # Kill debug scripts")
         | 
| 496 | 
            +
                    if len(running_servers) == 1:
         | 
| 497 | 
            +
                        port = running_servers[0].get("port", 8765)
         | 
| 498 | 
            +
                        print(f"  Stop this:   claude-mpm monitor stop --port {port}")
         | 
| 499 | 
            +
                    
         | 
| 500 | 
            +
                    return True
         | 
| 501 | 
            +
                    
         | 
| 502 | 
            +
                except Exception as e:
         | 
| 503 | 
            +
                    print(f"Error checking server status: {e}")
         | 
| 504 | 
            +
                    print()
         | 
| 505 | 
            +
                    print("Try manual checks:")
         | 
| 506 | 
            +
                    print("  • Process list: ps aux | grep socketio")
         | 
| 507 | 
            +
                    print("  • Port usage: lsof -i :8765")
         | 
| 508 | 
            +
                    return False
         | 
| 509 | 
            +
             | 
| 510 | 
            +
             | 
| 269 511 | 
             
            def _restart_server(args, server_manager):
         | 
| 270 512 | 
             
                """
         | 
| 271 513 | 
             
                Restart the Socket.IO monitoring server.
         | 
| 272 | 
            -
             | 
| 514 | 
            +
             | 
| 273 515 | 
             
                WHY: Users need to restart the monitoring server to apply configuration
         | 
| 274 516 | 
             
                changes or recover from error states.
         | 
| 275 | 
            -
             | 
| 517 | 
            +
             | 
| 276 518 | 
             
                Args:
         | 
| 277 519 | 
             
                    args: Command arguments with optional port
         | 
| 278 520 | 
             
                    server_manager: ServerManager instance
         | 
| 279 | 
            -
             | 
| 521 | 
            +
             | 
| 280 522 | 
             
                Returns:
         | 
| 281 523 | 
             
                    bool: True if server restarted successfully, False otherwise
         | 
| 282 524 | 
             
                """
         | 
| 283 | 
            -
                port = getattr(args,  | 
| 284 | 
            -
             | 
| 525 | 
            +
                port = getattr(args, "port", None)
         | 
| 526 | 
            +
             | 
| 285 527 | 
             
                print("Restarting Socket.IO monitoring server...")
         | 
| 286 | 
            -
             | 
| 528 | 
            +
             | 
| 287 529 | 
             
                try:
         | 
| 288 530 | 
             
                    # If no port specified, find running servers to restart
         | 
| 289 531 | 
             
                    if port is None:
         | 
| 290 532 | 
             
                        running_servers = server_manager.list_running_servers()
         | 
| 291 533 | 
             
                        if not running_servers:
         | 
| 292 | 
            -
                            print( | 
| 534 | 
            +
                            print(
         | 
| 535 | 
            +
                                "No running servers found. Starting new server on default port..."
         | 
| 536 | 
            +
                            )
         | 
| 293 537 | 
             
                            return _start_server(args, server_manager)
         | 
| 294 | 
            -
             | 
| 538 | 
            +
             | 
| 295 539 | 
             
                        # Restart the first server found
         | 
| 296 540 | 
             
                        server = running_servers[0]
         | 
| 297 | 
            -
                        port = server.get( | 
| 298 | 
            -
             | 
| 541 | 
            +
                        port = server.get("port", 8765)
         | 
| 542 | 
            +
             | 
| 299 543 | 
             
                    print(f"Using port {port} for restart...")
         | 
| 300 | 
            -
             | 
| 544 | 
            +
             | 
| 301 545 | 
             
                    # Use ServerManager's restart method
         | 
| 302 546 | 
             
                    success = server_manager.restart_server(port=port)
         | 
| 303 | 
            -
             | 
| 547 | 
            +
             | 
| 304 548 | 
             
                    if success:
         | 
| 305 549 | 
             
                        print(f"Monitor server restarted successfully on port {port}")
         | 
| 306 550 | 
             
                        print()
         | 
| @@ -316,13 +560,13 @@ def _restart_server(args, server_manager): | |
| 316 560 | 
             
                        print(f"    claude-mpm monitor stop --port {port}")
         | 
| 317 561 | 
             
                        print(f"    claude-mpm monitor start --port {port}")
         | 
| 318 562 | 
             
                        print("  • Check server logs for errors")
         | 
| 319 | 
            -
             | 
| 563 | 
            +
             | 
| 320 564 | 
             
                    return success
         | 
| 321 | 
            -
             | 
| 565 | 
            +
             | 
| 322 566 | 
             
                except Exception as e:
         | 
| 323 567 | 
             
                    print(f"Error restarting server: {e}")
         | 
| 324 568 | 
             
                    print()
         | 
| 325 569 | 
             
                    print("Fallback options:")
         | 
| 326 570 | 
             
                    print("  • Manual restart: stop then start")
         | 
| 327 571 | 
             
                    print("  • Check system resources and try again")
         | 
| 328 | 
            -
                    return False
         | 
| 572 | 
            +
                    return False
         |