claude-mpm 4.1.0__py3-none-any.whl → 4.1.2__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- claude_mpm/BUILD_NUMBER +1 -1
- claude_mpm/VERSION +1 -1
- claude_mpm/__main__.py +1 -1
- claude_mpm/agents/BASE_PM.md +74 -46
- claude_mpm/agents/INSTRUCTIONS.md +11 -153
- claude_mpm/agents/WORKFLOW.md +61 -321
- claude_mpm/agents/__init__.py +11 -11
- claude_mpm/agents/agent_loader.py +23 -20
- claude_mpm/agents/agent_loader_integration.py +1 -1
- claude_mpm/agents/agents_metadata.py +27 -0
- claude_mpm/agents/async_agent_loader.py +5 -8
- claude_mpm/agents/base_agent_loader.py +36 -25
- claude_mpm/agents/frontmatter_validator.py +6 -6
- claude_mpm/agents/schema/agent_schema.json +1 -1
- claude_mpm/agents/system_agent_config.py +9 -9
- claude_mpm/agents/templates/api_qa.json +47 -2
- claude_mpm/agents/templates/imagemagick.json +256 -0
- claude_mpm/agents/templates/qa.json +41 -2
- claude_mpm/agents/templates/ticketing.json +5 -5
- claude_mpm/agents/templates/web_qa.json +133 -58
- claude_mpm/agents/templates/web_ui.json +3 -3
- claude_mpm/cli/__init__.py +51 -46
- claude_mpm/cli/__main__.py +1 -1
- claude_mpm/cli/commands/__init__.py +10 -12
- claude_mpm/cli/commands/agent_manager.py +186 -181
- claude_mpm/cli/commands/agents.py +271 -268
- claude_mpm/cli/commands/aggregate.py +30 -29
- claude_mpm/cli/commands/cleanup.py +50 -44
- claude_mpm/cli/commands/cleanup_orphaned_agents.py +25 -25
- claude_mpm/cli/commands/config.py +162 -127
- claude_mpm/cli/commands/doctor.py +52 -62
- claude_mpm/cli/commands/info.py +37 -25
- claude_mpm/cli/commands/mcp.py +3 -7
- claude_mpm/cli/commands/mcp_command_router.py +14 -18
- claude_mpm/cli/commands/mcp_install_commands.py +28 -23
- claude_mpm/cli/commands/mcp_pipx_config.py +58 -49
- claude_mpm/cli/commands/mcp_server_commands.py +23 -17
- claude_mpm/cli/commands/memory.py +192 -141
- claude_mpm/cli/commands/monitor.py +117 -88
- claude_mpm/cli/commands/run.py +120 -84
- claude_mpm/cli/commands/run_config_checker.py +4 -5
- claude_mpm/cli/commands/socketio_monitor.py +17 -19
- claude_mpm/cli/commands/tickets.py +92 -92
- claude_mpm/cli/parser.py +1 -5
- claude_mpm/cli/parsers/__init__.py +1 -1
- claude_mpm/cli/parsers/agent_manager_parser.py +50 -98
- claude_mpm/cli/parsers/agents_parser.py +2 -3
- claude_mpm/cli/parsers/base_parser.py +7 -5
- claude_mpm/cli/parsers/mcp_parser.py +4 -2
- claude_mpm/cli/parsers/monitor_parser.py +26 -18
- claude_mpm/cli/shared/__init__.py +10 -10
- claude_mpm/cli/shared/argument_patterns.py +57 -71
- claude_mpm/cli/shared/base_command.py +61 -53
- claude_mpm/cli/shared/error_handling.py +62 -58
- claude_mpm/cli/shared/output_formatters.py +78 -77
- claude_mpm/cli/startup_logging.py +204 -172
- claude_mpm/cli/utils.py +10 -11
- claude_mpm/cli_module/__init__.py +1 -1
- claude_mpm/cli_module/args.py +1 -1
- claude_mpm/cli_module/migration_example.py +5 -5
- claude_mpm/config/__init__.py +9 -9
- claude_mpm/config/agent_config.py +15 -14
- claude_mpm/config/experimental_features.py +4 -4
- claude_mpm/config/paths.py +0 -1
- claude_mpm/config/socketio_config.py +5 -6
- claude_mpm/constants.py +1 -2
- claude_mpm/core/__init__.py +8 -8
- claude_mpm/core/agent_name_normalizer.py +1 -1
- claude_mpm/core/agent_registry.py +20 -23
- claude_mpm/core/agent_session_manager.py +3 -3
- claude_mpm/core/base_service.py +7 -15
- claude_mpm/core/cache.py +4 -6
- claude_mpm/core/claude_runner.py +85 -113
- claude_mpm/core/config.py +43 -28
- claude_mpm/core/config_aliases.py +0 -9
- claude_mpm/core/config_constants.py +52 -30
- claude_mpm/core/constants.py +0 -1
- claude_mpm/core/container.py +18 -27
- claude_mpm/core/exceptions.py +2 -2
- claude_mpm/core/factories.py +10 -12
- claude_mpm/core/framework_loader.py +581 -280
- claude_mpm/core/hook_manager.py +26 -22
- claude_mpm/core/hook_performance_config.py +58 -47
- claude_mpm/core/injectable_service.py +1 -1
- claude_mpm/core/interactive_session.py +61 -152
- claude_mpm/core/interfaces.py +1 -100
- claude_mpm/core/lazy.py +5 -5
- claude_mpm/core/log_manager.py +587 -0
- claude_mpm/core/logger.py +125 -8
- claude_mpm/core/logging_config.py +15 -15
- claude_mpm/core/minimal_framework_loader.py +5 -8
- claude_mpm/core/oneshot_session.py +15 -33
- claude_mpm/core/optimized_agent_loader.py +4 -6
- claude_mpm/core/optimized_startup.py +2 -1
- claude_mpm/core/output_style_manager.py +147 -106
- claude_mpm/core/pm_hook_interceptor.py +0 -1
- claude_mpm/core/service_registry.py +11 -8
- claude_mpm/core/session_manager.py +1 -2
- claude_mpm/core/shared/__init__.py +1 -1
- claude_mpm/core/shared/config_loader.py +101 -97
- claude_mpm/core/shared/path_resolver.py +72 -68
- claude_mpm/core/shared/singleton_manager.py +56 -50
- claude_mpm/core/socketio_pool.py +26 -6
- claude_mpm/core/tool_access_control.py +4 -5
- claude_mpm/core/typing_utils.py +50 -59
- claude_mpm/core/unified_agent_registry.py +14 -19
- claude_mpm/core/unified_config.py +4 -6
- claude_mpm/core/unified_paths.py +197 -109
- claude_mpm/dashboard/open_dashboard.py +2 -4
- claude_mpm/experimental/cli_enhancements.py +51 -36
- claude_mpm/generators/agent_profile_generator.py +2 -4
- claude_mpm/hooks/base_hook.py +1 -2
- claude_mpm/hooks/claude_hooks/connection_pool.py +72 -26
- claude_mpm/hooks/claude_hooks/event_handlers.py +93 -38
- claude_mpm/hooks/claude_hooks/hook_handler.py +130 -76
- claude_mpm/hooks/claude_hooks/hook_handler_eventbus.py +104 -77
- claude_mpm/hooks/claude_hooks/memory_integration.py +2 -4
- claude_mpm/hooks/claude_hooks/response_tracking.py +15 -11
- claude_mpm/hooks/claude_hooks/tool_analysis.py +12 -18
- claude_mpm/hooks/memory_integration_hook.py +5 -5
- claude_mpm/hooks/tool_call_interceptor.py +1 -1
- claude_mpm/hooks/validation_hooks.py +4 -4
- claude_mpm/init.py +4 -9
- claude_mpm/models/__init__.py +2 -2
- claude_mpm/models/agent_session.py +11 -14
- claude_mpm/scripts/mcp_server.py +20 -11
- claude_mpm/scripts/mcp_wrapper.py +5 -5
- claude_mpm/scripts/mpm_doctor.py +321 -0
- claude_mpm/scripts/socketio_daemon.py +28 -25
- claude_mpm/scripts/socketio_daemon_hardened.py +298 -258
- claude_mpm/scripts/socketio_server_manager.py +116 -95
- claude_mpm/services/__init__.py +49 -49
- claude_mpm/services/agent_capabilities_service.py +12 -18
- claude_mpm/services/agents/__init__.py +22 -22
- claude_mpm/services/agents/agent_builder.py +140 -119
- claude_mpm/services/agents/deployment/__init__.py +3 -3
- claude_mpm/services/agents/deployment/agent_config_provider.py +9 -9
- claude_mpm/services/agents/deployment/agent_configuration_manager.py +19 -20
- claude_mpm/services/agents/deployment/agent_definition_factory.py +1 -5
- claude_mpm/services/agents/deployment/agent_deployment.py +136 -106
- claude_mpm/services/agents/deployment/agent_discovery_service.py +4 -8
- claude_mpm/services/agents/deployment/agent_environment_manager.py +2 -7
- claude_mpm/services/agents/deployment/agent_filesystem_manager.py +6 -10
- claude_mpm/services/agents/deployment/agent_format_converter.py +11 -15
- claude_mpm/services/agents/deployment/agent_frontmatter_validator.py +2 -3
- claude_mpm/services/agents/deployment/agent_lifecycle_manager.py +5 -5
- claude_mpm/services/agents/deployment/agent_metrics_collector.py +13 -19
- claude_mpm/services/agents/deployment/agent_restore_handler.py +0 -1
- claude_mpm/services/agents/deployment/agent_template_builder.py +26 -35
- claude_mpm/services/agents/deployment/agent_validator.py +0 -1
- claude_mpm/services/agents/deployment/agent_version_manager.py +7 -9
- claude_mpm/services/agents/deployment/agent_versioning.py +3 -3
- claude_mpm/services/agents/deployment/agents_directory_resolver.py +6 -7
- claude_mpm/services/agents/deployment/async_agent_deployment.py +51 -38
- claude_mpm/services/agents/deployment/config/__init__.py +1 -1
- claude_mpm/services/agents/deployment/config/deployment_config.py +7 -8
- claude_mpm/services/agents/deployment/deployment_type_detector.py +1 -1
- claude_mpm/services/agents/deployment/deployment_wrapper.py +18 -18
- claude_mpm/services/agents/deployment/facade/__init__.py +1 -1
- claude_mpm/services/agents/deployment/facade/deployment_executor.py +0 -3
- claude_mpm/services/agents/deployment/facade/deployment_facade.py +3 -4
- claude_mpm/services/agents/deployment/interface_adapter.py +5 -7
- claude_mpm/services/agents/deployment/multi_source_deployment_service.py +345 -276
- claude_mpm/services/agents/deployment/pipeline/__init__.py +2 -2
- claude_mpm/services/agents/deployment/pipeline/pipeline_builder.py +1 -1
- claude_mpm/services/agents/deployment/pipeline/pipeline_context.py +6 -4
- claude_mpm/services/agents/deployment/pipeline/pipeline_executor.py +3 -3
- claude_mpm/services/agents/deployment/pipeline/steps/__init__.py +2 -2
- claude_mpm/services/agents/deployment/pipeline/steps/agent_processing_step.py +14 -13
- claude_mpm/services/agents/deployment/pipeline/steps/base_step.py +0 -1
- claude_mpm/services/agents/deployment/pipeline/steps/configuration_step.py +1 -1
- claude_mpm/services/agents/deployment/pipeline/steps/target_directory_step.py +8 -9
- claude_mpm/services/agents/deployment/pipeline/steps/validation_step.py +1 -1
- claude_mpm/services/agents/deployment/processors/__init__.py +1 -1
- claude_mpm/services/agents/deployment/processors/agent_processor.py +20 -16
- claude_mpm/services/agents/deployment/refactored_agent_deployment_service.py +5 -12
- claude_mpm/services/agents/deployment/results/__init__.py +1 -1
- claude_mpm/services/agents/deployment/results/deployment_result_builder.py +1 -1
- claude_mpm/services/agents/deployment/strategies/__init__.py +2 -2
- claude_mpm/services/agents/deployment/strategies/base_strategy.py +1 -7
- claude_mpm/services/agents/deployment/strategies/project_strategy.py +1 -4
- claude_mpm/services/agents/deployment/strategies/system_strategy.py +2 -3
- claude_mpm/services/agents/deployment/strategies/user_strategy.py +3 -7
- claude_mpm/services/agents/deployment/validation/__init__.py +1 -1
- claude_mpm/services/agents/deployment/validation/agent_validator.py +1 -1
- claude_mpm/services/agents/deployment/validation/template_validator.py +2 -2
- claude_mpm/services/agents/deployment/validation/validation_result.py +2 -6
- claude_mpm/services/agents/loading/__init__.py +1 -1
- claude_mpm/services/agents/loading/agent_profile_loader.py +6 -12
- claude_mpm/services/agents/loading/base_agent_manager.py +5 -5
- claude_mpm/services/agents/loading/framework_agent_loader.py +2 -4
- claude_mpm/services/agents/management/__init__.py +1 -1
- claude_mpm/services/agents/management/agent_capabilities_generator.py +1 -3
- claude_mpm/services/agents/management/agent_management_service.py +5 -9
- claude_mpm/services/agents/memory/__init__.py +4 -4
- claude_mpm/services/agents/memory/agent_memory_manager.py +280 -160
- claude_mpm/services/agents/memory/agent_persistence_service.py +0 -2
- claude_mpm/services/agents/memory/content_manager.py +44 -38
- claude_mpm/services/agents/memory/template_generator.py +4 -6
- claude_mpm/services/agents/registry/__init__.py +10 -6
- claude_mpm/services/agents/registry/deployed_agent_discovery.py +30 -27
- claude_mpm/services/agents/registry/modification_tracker.py +3 -6
- claude_mpm/services/async_session_logger.py +1 -2
- claude_mpm/services/claude_session_logger.py +1 -2
- claude_mpm/services/command_deployment_service.py +173 -0
- claude_mpm/services/command_handler_service.py +20 -22
- claude_mpm/services/core/__init__.py +25 -25
- claude_mpm/services/core/base.py +0 -5
- claude_mpm/services/core/interfaces/__init__.py +32 -32
- claude_mpm/services/core/interfaces/agent.py +0 -21
- claude_mpm/services/core/interfaces/communication.py +0 -27
- claude_mpm/services/core/interfaces/infrastructure.py +0 -56
- claude_mpm/services/core/interfaces/service.py +0 -29
- claude_mpm/services/diagnostics/__init__.py +1 -1
- claude_mpm/services/diagnostics/checks/__init__.py +6 -6
- claude_mpm/services/diagnostics/checks/agent_check.py +89 -80
- claude_mpm/services/diagnostics/checks/base_check.py +12 -16
- claude_mpm/services/diagnostics/checks/claude_desktop_check.py +84 -81
- claude_mpm/services/diagnostics/checks/common_issues_check.py +99 -91
- claude_mpm/services/diagnostics/checks/configuration_check.py +82 -77
- claude_mpm/services/diagnostics/checks/filesystem_check.py +67 -68
- claude_mpm/services/diagnostics/checks/installation_check.py +254 -94
- claude_mpm/services/diagnostics/checks/mcp_check.py +90 -88
- claude_mpm/services/diagnostics/checks/monitor_check.py +75 -76
- claude_mpm/services/diagnostics/checks/startup_log_check.py +67 -73
- claude_mpm/services/diagnostics/diagnostic_runner.py +67 -59
- claude_mpm/services/diagnostics/doctor_reporter.py +107 -70
- claude_mpm/services/diagnostics/models.py +21 -19
- claude_mpm/services/event_aggregator.py +10 -17
- claude_mpm/services/event_bus/__init__.py +1 -1
- claude_mpm/services/event_bus/config.py +54 -35
- claude_mpm/services/event_bus/event_bus.py +76 -71
- claude_mpm/services/event_bus/relay.py +74 -64
- claude_mpm/services/events/__init__.py +11 -11
- claude_mpm/services/events/consumers/__init__.py +3 -3
- claude_mpm/services/events/consumers/dead_letter.py +71 -63
- claude_mpm/services/events/consumers/logging.py +39 -37
- claude_mpm/services/events/consumers/metrics.py +56 -57
- claude_mpm/services/events/consumers/socketio.py +82 -81
- claude_mpm/services/events/core.py +110 -99
- claude_mpm/services/events/interfaces.py +56 -72
- claude_mpm/services/events/producers/__init__.py +1 -1
- claude_mpm/services/events/producers/hook.py +38 -38
- claude_mpm/services/events/producers/system.py +46 -44
- claude_mpm/services/exceptions.py +81 -80
- claude_mpm/services/framework_claude_md_generator/__init__.py +2 -4
- claude_mpm/services/framework_claude_md_generator/content_assembler.py +3 -5
- claude_mpm/services/framework_claude_md_generator/content_validator.py +1 -1
- claude_mpm/services/framework_claude_md_generator/deployment_manager.py +4 -4
- claude_mpm/services/framework_claude_md_generator/section_generators/__init__.py +0 -1
- claude_mpm/services/framework_claude_md_generator/section_generators/agents.py +0 -2
- claude_mpm/services/framework_claude_md_generator/version_manager.py +4 -5
- claude_mpm/services/hook_service.py +6 -9
- claude_mpm/services/infrastructure/__init__.py +1 -1
- claude_mpm/services/infrastructure/context_preservation.py +8 -12
- claude_mpm/services/infrastructure/monitoring.py +21 -23
- claude_mpm/services/mcp_gateway/__init__.py +37 -37
- claude_mpm/services/mcp_gateway/auto_configure.py +95 -103
- claude_mpm/services/mcp_gateway/config/__init__.py +1 -1
- claude_mpm/services/mcp_gateway/config/config_loader.py +23 -25
- claude_mpm/services/mcp_gateway/config/config_schema.py +5 -5
- claude_mpm/services/mcp_gateway/config/configuration.py +9 -6
- claude_mpm/services/mcp_gateway/core/__init__.py +10 -10
- claude_mpm/services/mcp_gateway/core/base.py +0 -3
- claude_mpm/services/mcp_gateway/core/interfaces.py +1 -38
- claude_mpm/services/mcp_gateway/core/process_pool.py +99 -93
- claude_mpm/services/mcp_gateway/core/singleton_manager.py +65 -62
- claude_mpm/services/mcp_gateway/core/startup_verification.py +75 -74
- claude_mpm/services/mcp_gateway/main.py +2 -1
- claude_mpm/services/mcp_gateway/registry/service_registry.py +5 -8
- claude_mpm/services/mcp_gateway/registry/tool_registry.py +1 -1
- claude_mpm/services/mcp_gateway/server/__init__.py +1 -1
- claude_mpm/services/mcp_gateway/server/mcp_gateway.py +12 -19
- claude_mpm/services/mcp_gateway/server/stdio_handler.py +4 -3
- claude_mpm/services/mcp_gateway/server/stdio_server.py +79 -71
- claude_mpm/services/mcp_gateway/tools/__init__.py +2 -2
- claude_mpm/services/mcp_gateway/tools/base_adapter.py +5 -6
- claude_mpm/services/mcp_gateway/tools/document_summarizer.py +13 -22
- claude_mpm/services/mcp_gateway/tools/health_check_tool.py +79 -78
- claude_mpm/services/mcp_gateway/tools/hello_world.py +12 -14
- claude_mpm/services/mcp_gateway/tools/ticket_tools.py +42 -49
- claude_mpm/services/mcp_gateway/tools/unified_ticket_tool.py +51 -55
- claude_mpm/services/memory/__init__.py +3 -3
- claude_mpm/services/memory/builder.py +3 -6
- claude_mpm/services/memory/cache/__init__.py +1 -1
- claude_mpm/services/memory/cache/shared_prompt_cache.py +3 -5
- claude_mpm/services/memory/cache/simple_cache.py +1 -1
- claude_mpm/services/memory/indexed_memory.py +5 -7
- claude_mpm/services/memory/optimizer.py +7 -10
- claude_mpm/services/memory/router.py +8 -9
- claude_mpm/services/memory_hook_service.py +48 -34
- claude_mpm/services/monitor_build_service.py +77 -73
- claude_mpm/services/port_manager.py +130 -108
- claude_mpm/services/project/analyzer.py +12 -10
- claude_mpm/services/project/registry.py +11 -11
- claude_mpm/services/recovery_manager.py +10 -19
- claude_mpm/services/response_tracker.py +0 -1
- claude_mpm/services/runner_configuration_service.py +19 -20
- claude_mpm/services/session_management_service.py +7 -11
- claude_mpm/services/shared/__init__.py +1 -1
- claude_mpm/services/shared/async_service_base.py +58 -50
- claude_mpm/services/shared/config_service_base.py +73 -67
- claude_mpm/services/shared/lifecycle_service_base.py +82 -78
- claude_mpm/services/shared/manager_base.py +94 -82
- claude_mpm/services/shared/service_factory.py +96 -98
- claude_mpm/services/socketio/__init__.py +3 -3
- claude_mpm/services/socketio/client_proxy.py +5 -5
- claude_mpm/services/socketio/event_normalizer.py +199 -181
- claude_mpm/services/socketio/handlers/__init__.py +3 -3
- claude_mpm/services/socketio/handlers/base.py +5 -4
- claude_mpm/services/socketio/handlers/connection.py +163 -136
- claude_mpm/services/socketio/handlers/file.py +13 -14
- claude_mpm/services/socketio/handlers/git.py +12 -7
- claude_mpm/services/socketio/handlers/hook.py +49 -44
- claude_mpm/services/socketio/handlers/memory.py +0 -1
- claude_mpm/services/socketio/handlers/project.py +0 -1
- claude_mpm/services/socketio/handlers/registry.py +37 -19
- claude_mpm/services/socketio/migration_utils.py +98 -84
- claude_mpm/services/socketio/server/__init__.py +1 -1
- claude_mpm/services/socketio/server/broadcaster.py +81 -87
- claude_mpm/services/socketio/server/core.py +65 -54
- claude_mpm/services/socketio/server/eventbus_integration.py +95 -56
- claude_mpm/services/socketio/server/main.py +64 -38
- claude_mpm/services/socketio_client_manager.py +10 -12
- claude_mpm/services/subprocess_launcher_service.py +4 -7
- claude_mpm/services/system_instructions_service.py +13 -14
- claude_mpm/services/ticket_manager.py +2 -2
- claude_mpm/services/utility_service.py +5 -13
- claude_mpm/services/version_control/__init__.py +16 -16
- claude_mpm/services/version_control/branch_strategy.py +5 -8
- claude_mpm/services/version_control/conflict_resolution.py +9 -23
- claude_mpm/services/version_control/git_operations.py +5 -7
- claude_mpm/services/version_control/semantic_versioning.py +16 -17
- claude_mpm/services/version_control/version_parser.py +13 -18
- claude_mpm/services/version_service.py +10 -11
- claude_mpm/storage/__init__.py +1 -1
- claude_mpm/storage/state_storage.py +22 -28
- claude_mpm/utils/__init__.py +6 -6
- claude_mpm/utils/agent_dependency_loader.py +47 -33
- claude_mpm/utils/config_manager.py +11 -14
- claude_mpm/utils/dependency_cache.py +1 -1
- claude_mpm/utils/dependency_manager.py +13 -17
- claude_mpm/utils/dependency_strategies.py +8 -10
- claude_mpm/utils/environment_context.py +3 -9
- claude_mpm/utils/error_handler.py +3 -13
- claude_mpm/utils/file_utils.py +1 -1
- claude_mpm/utils/path_operations.py +8 -12
- claude_mpm/utils/robust_installer.py +110 -33
- claude_mpm/utils/subprocess_utils.py +5 -6
- claude_mpm/validation/agent_validator.py +3 -6
- claude_mpm/validation/frontmatter_validator.py +1 -1
- {claude_mpm-4.1.0.dist-info → claude_mpm-4.1.2.dist-info}/METADATA +1 -1
- claude_mpm-4.1.2.dist-info/RECORD +498 -0
- claude_mpm-4.1.0.dist-info/RECORD +0 -494
- {claude_mpm-4.1.0.dist-info → claude_mpm-4.1.2.dist-info}/WHEEL +0 -0
- {claude_mpm-4.1.0.dist-info → claude_mpm-4.1.2.dist-info}/entry_points.txt +0 -0
- {claude_mpm-4.1.0.dist-info → claude_mpm-4.1.2.dist-info}/licenses/LICENSE +0 -0
- {claude_mpm-4.1.0.dist-info → claude_mpm-4.1.2.dist-info}/top_level.txt +0 -0
|
@@ -18,7 +18,7 @@ from ..interfaces import IEventBus, IEventProducer
|
|
|
18
18
|
class SystemEventProducer(IEventProducer):
|
|
19
19
|
"""
|
|
20
20
|
Publishes system events to the event bus.
|
|
21
|
-
|
|
21
|
+
|
|
22
22
|
Used for:
|
|
23
23
|
- Service lifecycle events
|
|
24
24
|
- Configuration changes
|
|
@@ -26,11 +26,11 @@ class SystemEventProducer(IEventProducer):
|
|
|
26
26
|
- Performance metrics
|
|
27
27
|
- System errors
|
|
28
28
|
"""
|
|
29
|
-
|
|
29
|
+
|
|
30
30
|
def __init__(self, event_bus: IEventBus, source_name: str = "system"):
|
|
31
31
|
"""
|
|
32
32
|
Initialize system event producer.
|
|
33
|
-
|
|
33
|
+
|
|
34
34
|
Args:
|
|
35
35
|
event_bus: The event bus to publish to
|
|
36
36
|
source_name: Name of the system component
|
|
@@ -38,47 +38,47 @@ class SystemEventProducer(IEventProducer):
|
|
|
38
38
|
self.logger = get_logger("SystemEventProducer")
|
|
39
39
|
self.event_bus = event_bus
|
|
40
40
|
self._source_name = source_name
|
|
41
|
-
|
|
41
|
+
|
|
42
42
|
# Metrics
|
|
43
43
|
self._metrics = {
|
|
44
44
|
"events_published": 0,
|
|
45
45
|
"events_failed": 0,
|
|
46
46
|
}
|
|
47
|
-
|
|
47
|
+
|
|
48
48
|
async def publish(self, event: Event) -> bool:
|
|
49
49
|
"""Publish a system event to the bus."""
|
|
50
50
|
try:
|
|
51
51
|
success = await self.event_bus.publish(event)
|
|
52
|
-
|
|
52
|
+
|
|
53
53
|
if success:
|
|
54
54
|
self._metrics["events_published"] += 1
|
|
55
55
|
else:
|
|
56
56
|
self._metrics["events_failed"] += 1
|
|
57
|
-
|
|
57
|
+
|
|
58
58
|
return success
|
|
59
|
-
|
|
59
|
+
|
|
60
60
|
except Exception as e:
|
|
61
61
|
self.logger.error(f"Error publishing system event: {e}")
|
|
62
62
|
self._metrics["events_failed"] += 1
|
|
63
63
|
return False
|
|
64
|
-
|
|
64
|
+
|
|
65
65
|
async def publish_batch(self, events: List[Event]) -> int:
|
|
66
66
|
"""Publish multiple system events."""
|
|
67
67
|
successful = 0
|
|
68
|
-
|
|
68
|
+
|
|
69
69
|
for event in events:
|
|
70
70
|
if await self.publish(event):
|
|
71
71
|
successful += 1
|
|
72
|
-
|
|
72
|
+
|
|
73
73
|
return successful
|
|
74
|
-
|
|
74
|
+
|
|
75
75
|
@property
|
|
76
76
|
def source_name(self) -> str:
|
|
77
77
|
"""Get the name of this event source."""
|
|
78
78
|
return self._source_name
|
|
79
|
-
|
|
79
|
+
|
|
80
80
|
# Convenience methods for common system events
|
|
81
|
-
|
|
81
|
+
|
|
82
82
|
async def publish_startup(
|
|
83
83
|
self,
|
|
84
84
|
service_name: str,
|
|
@@ -87,12 +87,12 @@ class SystemEventProducer(IEventProducer):
|
|
|
87
87
|
) -> bool:
|
|
88
88
|
"""
|
|
89
89
|
Publish a service startup event.
|
|
90
|
-
|
|
90
|
+
|
|
91
91
|
Args:
|
|
92
92
|
service_name: Name of the service
|
|
93
93
|
version: Service version
|
|
94
94
|
config: Optional configuration data
|
|
95
|
-
|
|
95
|
+
|
|
96
96
|
Returns:
|
|
97
97
|
True if published successfully
|
|
98
98
|
"""
|
|
@@ -109,9 +109,9 @@ class SystemEventProducer(IEventProducer):
|
|
|
109
109
|
},
|
|
110
110
|
priority=EventPriority.HIGH,
|
|
111
111
|
)
|
|
112
|
-
|
|
112
|
+
|
|
113
113
|
return await self.publish(event)
|
|
114
|
-
|
|
114
|
+
|
|
115
115
|
async def publish_shutdown(
|
|
116
116
|
self,
|
|
117
117
|
service_name: str,
|
|
@@ -120,12 +120,12 @@ class SystemEventProducer(IEventProducer):
|
|
|
120
120
|
) -> bool:
|
|
121
121
|
"""
|
|
122
122
|
Publish a service shutdown event.
|
|
123
|
-
|
|
123
|
+
|
|
124
124
|
Args:
|
|
125
125
|
service_name: Name of the service
|
|
126
126
|
reason: Shutdown reason
|
|
127
127
|
details: Optional additional details
|
|
128
|
-
|
|
128
|
+
|
|
129
129
|
Returns:
|
|
130
130
|
True if published successfully
|
|
131
131
|
"""
|
|
@@ -142,9 +142,9 @@ class SystemEventProducer(IEventProducer):
|
|
|
142
142
|
},
|
|
143
143
|
priority=EventPriority.HIGH,
|
|
144
144
|
)
|
|
145
|
-
|
|
145
|
+
|
|
146
146
|
return await self.publish(event)
|
|
147
|
-
|
|
147
|
+
|
|
148
148
|
async def publish_health_status(
|
|
149
149
|
self,
|
|
150
150
|
service_name: str,
|
|
@@ -154,13 +154,13 @@ class SystemEventProducer(IEventProducer):
|
|
|
154
154
|
) -> bool:
|
|
155
155
|
"""
|
|
156
156
|
Publish a health status event.
|
|
157
|
-
|
|
157
|
+
|
|
158
158
|
Args:
|
|
159
159
|
service_name: Name of the service
|
|
160
160
|
status: Health status (healthy, degraded, unhealthy)
|
|
161
161
|
checks: Individual health checks
|
|
162
162
|
details: Optional additional details
|
|
163
|
-
|
|
163
|
+
|
|
164
164
|
Returns:
|
|
165
165
|
True if published successfully
|
|
166
166
|
"""
|
|
@@ -176,11 +176,13 @@ class SystemEventProducer(IEventProducer):
|
|
|
176
176
|
"checks": checks,
|
|
177
177
|
"details": details or {},
|
|
178
178
|
},
|
|
179
|
-
priority=
|
|
179
|
+
priority=(
|
|
180
|
+
EventPriority.NORMAL if status == "healthy" else EventPriority.HIGH
|
|
181
|
+
),
|
|
180
182
|
)
|
|
181
|
-
|
|
183
|
+
|
|
182
184
|
return await self.publish(event)
|
|
183
|
-
|
|
185
|
+
|
|
184
186
|
async def publish_config_change(
|
|
185
187
|
self,
|
|
186
188
|
service_name: str,
|
|
@@ -190,13 +192,13 @@ class SystemEventProducer(IEventProducer):
|
|
|
190
192
|
) -> bool:
|
|
191
193
|
"""
|
|
192
194
|
Publish a configuration change event.
|
|
193
|
-
|
|
195
|
+
|
|
194
196
|
Args:
|
|
195
197
|
service_name: Name of the service
|
|
196
198
|
config_key: Configuration key that changed
|
|
197
199
|
old_value: Previous value
|
|
198
200
|
new_value: New value
|
|
199
|
-
|
|
201
|
+
|
|
200
202
|
Returns:
|
|
201
203
|
True if published successfully
|
|
202
204
|
"""
|
|
@@ -214,9 +216,9 @@ class SystemEventProducer(IEventProducer):
|
|
|
214
216
|
},
|
|
215
217
|
priority=EventPriority.NORMAL,
|
|
216
218
|
)
|
|
217
|
-
|
|
219
|
+
|
|
218
220
|
return await self.publish(event)
|
|
219
|
-
|
|
221
|
+
|
|
220
222
|
async def publish_performance_metrics(
|
|
221
223
|
self,
|
|
222
224
|
service_name: str,
|
|
@@ -224,11 +226,11 @@ class SystemEventProducer(IEventProducer):
|
|
|
224
226
|
) -> bool:
|
|
225
227
|
"""
|
|
226
228
|
Publish performance metrics.
|
|
227
|
-
|
|
229
|
+
|
|
228
230
|
Args:
|
|
229
231
|
service_name: Name of the service
|
|
230
232
|
metrics: Performance metrics data
|
|
231
|
-
|
|
233
|
+
|
|
232
234
|
Returns:
|
|
233
235
|
True if published successfully
|
|
234
236
|
"""
|
|
@@ -244,9 +246,9 @@ class SystemEventProducer(IEventProducer):
|
|
|
244
246
|
},
|
|
245
247
|
priority=EventPriority.LOW,
|
|
246
248
|
)
|
|
247
|
-
|
|
249
|
+
|
|
248
250
|
return await self.publish(event)
|
|
249
|
-
|
|
251
|
+
|
|
250
252
|
async def publish_error(
|
|
251
253
|
self,
|
|
252
254
|
service_name: str,
|
|
@@ -257,14 +259,14 @@ class SystemEventProducer(IEventProducer):
|
|
|
257
259
|
) -> bool:
|
|
258
260
|
"""
|
|
259
261
|
Publish a system error event.
|
|
260
|
-
|
|
262
|
+
|
|
261
263
|
Args:
|
|
262
264
|
service_name: Name of the service
|
|
263
265
|
error_type: Type of error
|
|
264
266
|
error_message: Error message
|
|
265
267
|
stacktrace: Optional stack trace
|
|
266
268
|
context: Optional error context
|
|
267
|
-
|
|
269
|
+
|
|
268
270
|
Returns:
|
|
269
271
|
True if published successfully
|
|
270
272
|
"""
|
|
@@ -283,9 +285,9 @@ class SystemEventProducer(IEventProducer):
|
|
|
283
285
|
},
|
|
284
286
|
priority=EventPriority.CRITICAL,
|
|
285
287
|
)
|
|
286
|
-
|
|
288
|
+
|
|
287
289
|
return await self.publish(event)
|
|
288
|
-
|
|
290
|
+
|
|
289
291
|
async def publish_warning(
|
|
290
292
|
self,
|
|
291
293
|
service_name: str,
|
|
@@ -295,13 +297,13 @@ class SystemEventProducer(IEventProducer):
|
|
|
295
297
|
) -> bool:
|
|
296
298
|
"""
|
|
297
299
|
Publish a system warning event.
|
|
298
|
-
|
|
300
|
+
|
|
299
301
|
Args:
|
|
300
302
|
service_name: Name of the service
|
|
301
303
|
warning_type: Type of warning
|
|
302
304
|
message: Warning message
|
|
303
305
|
details: Optional additional details
|
|
304
|
-
|
|
306
|
+
|
|
305
307
|
Returns:
|
|
306
308
|
True if published successfully
|
|
307
309
|
"""
|
|
@@ -319,9 +321,9 @@ class SystemEventProducer(IEventProducer):
|
|
|
319
321
|
},
|
|
320
322
|
priority=EventPriority.HIGH,
|
|
321
323
|
)
|
|
322
|
-
|
|
324
|
+
|
|
323
325
|
return await self.publish(event)
|
|
324
|
-
|
|
326
|
+
|
|
325
327
|
def get_metrics(self) -> Dict[str, Any]:
|
|
326
328
|
"""Get producer metrics."""
|
|
327
|
-
return self._metrics
|
|
329
|
+
return self._metrics
|
|
@@ -13,9 +13,7 @@ Design Principles:
|
|
|
13
13
|
5. Structured error data for programmatic handling
|
|
14
14
|
"""
|
|
15
15
|
|
|
16
|
-
import os
|
|
17
16
|
import platform
|
|
18
|
-
import sys
|
|
19
17
|
import time
|
|
20
18
|
from datetime import datetime
|
|
21
19
|
from typing import Any, Dict, List, Optional
|
|
@@ -29,7 +27,10 @@ class SocketIOServerError(Exception):
|
|
|
29
27
|
"""
|
|
30
28
|
|
|
31
29
|
def __init__(
|
|
32
|
-
self,
|
|
30
|
+
self,
|
|
31
|
+
message: str,
|
|
32
|
+
error_code: Optional[str] = None,
|
|
33
|
+
context: Optional[Dict[str, Any]] = None,
|
|
33
34
|
):
|
|
34
35
|
"""Initialize base server error.
|
|
35
36
|
|
|
@@ -66,9 +67,9 @@ class DaemonConflictError(SocketIOServerError):
|
|
|
66
67
|
self,
|
|
67
68
|
port: int,
|
|
68
69
|
existing_pid: int,
|
|
69
|
-
existing_server_id: str = None,
|
|
70
|
-
process_info: Dict[str, Any] = None,
|
|
71
|
-
pidfile_path: Path = None,
|
|
70
|
+
existing_server_id: Optional[str] = None,
|
|
71
|
+
process_info: Optional[Dict[str, Any]] = None,
|
|
72
|
+
pidfile_path: Optional[Path] = None,
|
|
72
73
|
):
|
|
73
74
|
"""Initialize daemon conflict error with detailed context.
|
|
74
75
|
|
|
@@ -103,8 +104,8 @@ class DaemonConflictError(SocketIOServerError):
|
|
|
103
104
|
"""Build comprehensive error message with process details."""
|
|
104
105
|
lines = [
|
|
105
106
|
f"🚫 Socket.IO server conflict detected on port {self.port}",
|
|
106
|
-
|
|
107
|
-
|
|
107
|
+
"",
|
|
108
|
+
"CONFLICT DETAILS:",
|
|
108
109
|
f" • Existing PID: {self.existing_pid}",
|
|
109
110
|
f" • Server ID: {self.existing_server_id}",
|
|
110
111
|
]
|
|
@@ -145,8 +146,8 @@ class DaemonConflictError(SocketIOServerError):
|
|
|
145
146
|
|
|
146
147
|
lines.extend(
|
|
147
148
|
[
|
|
148
|
-
|
|
149
|
-
|
|
149
|
+
"",
|
|
150
|
+
"RESOLUTION STEPS:",
|
|
150
151
|
]
|
|
151
152
|
)
|
|
152
153
|
|
|
@@ -169,9 +170,9 @@ class DaemonConflictError(SocketIOServerError):
|
|
|
169
170
|
|
|
170
171
|
steps.extend(
|
|
171
172
|
[
|
|
172
|
-
|
|
173
|
+
"Wait a few seconds for port cleanup",
|
|
173
174
|
f"Try starting the server again on port {self.port}",
|
|
174
|
-
|
|
175
|
+
"Alternative: Use a different port with --port <new_port>",
|
|
175
176
|
]
|
|
176
177
|
)
|
|
177
178
|
|
|
@@ -189,7 +190,7 @@ class PortConflictError(SocketIOServerError):
|
|
|
189
190
|
self,
|
|
190
191
|
port: int,
|
|
191
192
|
host: str = "localhost",
|
|
192
|
-
conflicting_process: Dict[str, Any] = None,
|
|
193
|
+
conflicting_process: Optional[Dict[str, Any]] = None,
|
|
193
194
|
):
|
|
194
195
|
"""Initialize port conflict error.
|
|
195
196
|
|
|
@@ -216,9 +217,9 @@ class PortConflictError(SocketIOServerError):
|
|
|
216
217
|
def _build_error_message(self) -> str:
|
|
217
218
|
"""Build error message with port conflict details."""
|
|
218
219
|
lines = [
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
220
|
+
"🔌 Network port conflict detected",
|
|
221
|
+
"",
|
|
222
|
+
"PORT CONFLICT DETAILS:",
|
|
222
223
|
f" • Port: {self.port}",
|
|
223
224
|
f" • Host: {self.host}",
|
|
224
225
|
f" • Address: {self.host}:{self.port}",
|
|
@@ -232,8 +233,8 @@ class PortConflictError(SocketIOServerError):
|
|
|
232
233
|
|
|
233
234
|
lines.extend(
|
|
234
235
|
[
|
|
235
|
-
|
|
236
|
-
|
|
236
|
+
"",
|
|
237
|
+
"CONFLICTING PROCESS:",
|
|
237
238
|
f" • PID: {pid or 'unknown'}",
|
|
238
239
|
f" • Name: {name}",
|
|
239
240
|
]
|
|
@@ -244,8 +245,8 @@ class PortConflictError(SocketIOServerError):
|
|
|
244
245
|
|
|
245
246
|
lines.extend(
|
|
246
247
|
[
|
|
247
|
-
|
|
248
|
-
|
|
248
|
+
"",
|
|
249
|
+
"RESOLUTION STEPS:",
|
|
249
250
|
]
|
|
250
251
|
)
|
|
251
252
|
|
|
@@ -275,15 +276,15 @@ class PortConflictError(SocketIOServerError):
|
|
|
275
276
|
steps.extend(
|
|
276
277
|
[
|
|
277
278
|
f" • netstat -ano | findstr {self.port}",
|
|
278
|
-
|
|
279
|
+
' • tasklist /fi "PID eq <PID_FROM_NETSTAT>"',
|
|
279
280
|
]
|
|
280
281
|
)
|
|
281
282
|
|
|
282
283
|
steps.extend(
|
|
283
284
|
[
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
285
|
+
"Stop the conflicting process if it's safe to do so",
|
|
286
|
+
"Wait for port cleanup (may take 30-60 seconds)",
|
|
287
|
+
"Try again with the same port",
|
|
287
288
|
f"Alternative: Use a different port: --port {self.port + 1}",
|
|
288
289
|
]
|
|
289
290
|
)
|
|
@@ -301,9 +302,9 @@ class StaleProcessError(SocketIOServerError):
|
|
|
301
302
|
def __init__(
|
|
302
303
|
self,
|
|
303
304
|
pid: int,
|
|
304
|
-
pidfile_path: Path = None,
|
|
305
|
+
pidfile_path: Optional[Path] = None,
|
|
305
306
|
process_status: str = "not_found",
|
|
306
|
-
validation_errors: List[str] = None,
|
|
307
|
+
validation_errors: Optional[List[str]] = None,
|
|
307
308
|
):
|
|
308
309
|
"""Initialize stale process error.
|
|
309
310
|
|
|
@@ -345,9 +346,9 @@ class StaleProcessError(SocketIOServerError):
|
|
|
345
346
|
)
|
|
346
347
|
|
|
347
348
|
lines = [
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
349
|
+
"🧟 Stale process detected",
|
|
350
|
+
"",
|
|
351
|
+
"PROCESS DETAILS:",
|
|
351
352
|
f" • PID: {self.pid}",
|
|
352
353
|
f" • Status: {status_desc}",
|
|
353
354
|
]
|
|
@@ -363,8 +364,8 @@ class StaleProcessError(SocketIOServerError):
|
|
|
363
364
|
if self.validation_errors:
|
|
364
365
|
lines.extend(
|
|
365
366
|
[
|
|
366
|
-
|
|
367
|
-
|
|
367
|
+
"",
|
|
368
|
+
"VALIDATION ERRORS:",
|
|
368
369
|
]
|
|
369
370
|
)
|
|
370
371
|
for error in self.validation_errors:
|
|
@@ -372,8 +373,8 @@ class StaleProcessError(SocketIOServerError):
|
|
|
372
373
|
|
|
373
374
|
lines.extend(
|
|
374
375
|
[
|
|
375
|
-
|
|
376
|
-
|
|
376
|
+
"",
|
|
377
|
+
"RESOLUTION STEPS:",
|
|
377
378
|
]
|
|
378
379
|
)
|
|
379
380
|
|
|
@@ -431,8 +432,8 @@ class RecoveryFailedError(SocketIOServerError):
|
|
|
431
432
|
recovery_action: str,
|
|
432
433
|
failure_reason: str,
|
|
433
434
|
attempt_count: int = 1,
|
|
434
|
-
health_status: Dict[str, Any] = None,
|
|
435
|
-
last_successful_recovery: str = None,
|
|
435
|
+
health_status: Optional[Dict[str, Any]] = None,
|
|
436
|
+
last_successful_recovery: Optional[str] = None,
|
|
436
437
|
):
|
|
437
438
|
"""Initialize recovery failure error.
|
|
438
439
|
|
|
@@ -465,9 +466,9 @@ class RecoveryFailedError(SocketIOServerError):
|
|
|
465
466
|
def _build_error_message(self) -> str:
|
|
466
467
|
"""Build error message for recovery failure."""
|
|
467
468
|
lines = [
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
469
|
+
"🚨 Automatic recovery failed",
|
|
470
|
+
"",
|
|
471
|
+
"RECOVERY DETAILS:",
|
|
471
472
|
f" • Failed Action: {self.recovery_action}",
|
|
472
473
|
f" • Failure Reason: {self.failure_reason}",
|
|
473
474
|
f" • Attempt Count: {self.attempt_count}",
|
|
@@ -482,8 +483,8 @@ class RecoveryFailedError(SocketIOServerError):
|
|
|
482
483
|
if self.health_status:
|
|
483
484
|
lines.extend(
|
|
484
485
|
[
|
|
485
|
-
|
|
486
|
-
|
|
486
|
+
"",
|
|
487
|
+
"CURRENT HEALTH STATUS:",
|
|
487
488
|
]
|
|
488
489
|
)
|
|
489
490
|
|
|
@@ -500,8 +501,8 @@ class RecoveryFailedError(SocketIOServerError):
|
|
|
500
501
|
|
|
501
502
|
lines.extend(
|
|
502
503
|
[
|
|
503
|
-
|
|
504
|
-
|
|
504
|
+
"",
|
|
505
|
+
"MANUAL RESOLUTION REQUIRED:",
|
|
505
506
|
]
|
|
506
507
|
)
|
|
507
508
|
|
|
@@ -567,8 +568,8 @@ class HealthCheckError(SocketIOServerError):
|
|
|
567
568
|
self,
|
|
568
569
|
check_name: str,
|
|
569
570
|
check_status: str,
|
|
570
|
-
check_details: Dict[str, Any] = None,
|
|
571
|
-
threshold_exceeded: Dict[str, Any] = None,
|
|
571
|
+
check_details: Optional[Dict[str, Any]] = None,
|
|
572
|
+
threshold_exceeded: Optional[Dict[str, Any]] = None,
|
|
572
573
|
):
|
|
573
574
|
"""Initialize health check error.
|
|
574
575
|
|
|
@@ -603,8 +604,8 @@ class HealthCheckError(SocketIOServerError):
|
|
|
603
604
|
|
|
604
605
|
lines = [
|
|
605
606
|
f"{emoji} Health check failed: {self.check_name}",
|
|
606
|
-
|
|
607
|
-
|
|
607
|
+
"",
|
|
608
|
+
"CHECK DETAILS:",
|
|
608
609
|
f" • Check: {self.check_name}",
|
|
609
610
|
f" • Status: {self.check_status.upper()}",
|
|
610
611
|
]
|
|
@@ -619,8 +620,8 @@ class HealthCheckError(SocketIOServerError):
|
|
|
619
620
|
if self.threshold_exceeded:
|
|
620
621
|
lines.extend(
|
|
621
622
|
[
|
|
622
|
-
|
|
623
|
-
|
|
623
|
+
"",
|
|
624
|
+
"THRESHOLDS EXCEEDED:",
|
|
624
625
|
]
|
|
625
626
|
)
|
|
626
627
|
for metric, info in self.threshold_exceeded.items():
|
|
@@ -632,8 +633,8 @@ class HealthCheckError(SocketIOServerError):
|
|
|
632
633
|
|
|
633
634
|
lines.extend(
|
|
634
635
|
[
|
|
635
|
-
|
|
636
|
-
|
|
636
|
+
"",
|
|
637
|
+
"RECOMMENDED ACTIONS:",
|
|
637
638
|
]
|
|
638
639
|
)
|
|
639
640
|
|
|
@@ -706,39 +707,39 @@ def format_troubleshooting_guide(error: SocketIOServerError) -> str:
|
|
|
706
707
|
Formatted troubleshooting guide as a string
|
|
707
708
|
"""
|
|
708
709
|
lines = [
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
710
|
+
"═══════════════════════════════════════════════════════════════",
|
|
711
|
+
"🔧 CLAUDE MPM SOCKET.IO SERVER TROUBLESHOOTING GUIDE",
|
|
712
|
+
"═══════════════════════════════════════════════════════════════",
|
|
713
|
+
"",
|
|
713
714
|
f"ERROR TYPE: {error.__class__.__name__}",
|
|
714
715
|
f"ERROR CODE: {error.error_code}",
|
|
715
716
|
f"TIMESTAMP: {error.timestamp}",
|
|
716
|
-
|
|
717
|
+
"",
|
|
717
718
|
str(error),
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
719
|
+
"",
|
|
720
|
+
"ADDITIONAL TROUBLESHOOTING:",
|
|
721
|
+
"",
|
|
722
|
+
"🔍 DIAGNOSTIC COMMANDS:",
|
|
723
|
+
" • Check running processes: ps aux | grep socketio",
|
|
723
724
|
f" • Check port usage: lsof -i :{error.context.get('port', 'PORT')}",
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
725
|
+
" • Check system resources: top or htop",
|
|
726
|
+
" • Check disk space: df -h",
|
|
727
|
+
" • Check logs: tail -f /path/to/claude-mpm.log",
|
|
728
|
+
"",
|
|
729
|
+
"🛠️ COMMON SOLUTIONS:",
|
|
730
|
+
" 1. Restart the Socket.IO server completely",
|
|
731
|
+
" 2. Clear any stale PID files",
|
|
732
|
+
" 3. Check for zombie processes and clean them up",
|
|
733
|
+
" 4. Verify network port availability",
|
|
734
|
+
" 5. Check system resource availability (CPU, memory, disk)",
|
|
735
|
+
" 6. Review server configuration and permissions",
|
|
736
|
+
"",
|
|
737
|
+
"📞 GETTING HELP:",
|
|
738
|
+
" • Check the claude-mpm documentation",
|
|
739
|
+
" • Review server logs for additional context",
|
|
740
|
+
" • Report persistent issues with this error information",
|
|
741
|
+
"",
|
|
742
|
+
"🔗 ERROR CONTEXT DATA:",
|
|
742
743
|
]
|
|
743
744
|
|
|
744
745
|
# Add structured context data
|
|
@@ -748,8 +749,8 @@ def format_troubleshooting_guide(error: SocketIOServerError) -> str:
|
|
|
748
749
|
|
|
749
750
|
lines.extend(
|
|
750
751
|
[
|
|
751
|
-
|
|
752
|
-
|
|
752
|
+
"",
|
|
753
|
+
"═══════════════════════════════════════════════════════════════",
|
|
753
754
|
]
|
|
754
755
|
)
|
|
755
756
|
|
|
@@ -106,9 +106,7 @@ class FrameworkClaudeMdGenerator:
|
|
|
106
106
|
sections["header"] = (generator_func, metadata)
|
|
107
107
|
|
|
108
108
|
# Assemble content
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
return content
|
|
109
|
+
return self.assembler.assemble_content(sections, template_variables)
|
|
112
110
|
|
|
113
111
|
def validate_content(self, content: str) -> Tuple[bool, List[str]]:
|
|
114
112
|
"""
|
|
@@ -143,7 +141,7 @@ class FrameworkClaudeMdGenerator:
|
|
|
143
141
|
current_content = None
|
|
144
142
|
|
|
145
143
|
if target_file.exists():
|
|
146
|
-
with open(target_file
|
|
144
|
+
with open(target_file) as f:
|
|
147
145
|
current_content = f.read()
|
|
148
146
|
|
|
149
147
|
# Generate new content
|
|
@@ -8,7 +8,7 @@ import hashlib
|
|
|
8
8
|
import logging
|
|
9
9
|
from collections import OrderedDict
|
|
10
10
|
from datetime import datetime
|
|
11
|
-
from typing import Any, Dict,
|
|
11
|
+
from typing import Any, Dict, Optional
|
|
12
12
|
|
|
13
13
|
from claude_mpm.services.agents.management import AgentCapabilitiesGenerator
|
|
14
14
|
from claude_mpm.services.agents.registry import DeployedAgentDiscovery
|
|
@@ -58,7 +58,7 @@ class ContentAssembler:
|
|
|
58
58
|
|
|
59
59
|
# Generate all sections
|
|
60
60
|
content_parts = []
|
|
61
|
-
for
|
|
61
|
+
for _section_name, (generator_func, section_data) in sections.items():
|
|
62
62
|
section_content = generator_func(section_data)
|
|
63
63
|
content_parts.append(section_content)
|
|
64
64
|
|
|
@@ -66,9 +66,7 @@ class ContentAssembler:
|
|
|
66
66
|
full_content = "\n".join(content_parts)
|
|
67
67
|
|
|
68
68
|
# Apply template variable substitution
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
return full_content
|
|
69
|
+
return self.apply_template_variables(full_content)
|
|
72
70
|
|
|
73
71
|
def apply_template_variables(self, content: str) -> str:
|
|
74
72
|
"""
|