claude-mpm 4.1.1__py3-none-any.whl → 4.1.3__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- claude_mpm/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/engineer.json +33 -11
- claude_mpm/agents/templates/imagemagick.json +256 -0
- claude_mpm/agents/templates/qa.json +41 -2
- claude_mpm/agents/templates/ticketing.json +5 -5
- claude_mpm/agents/templates/web_qa.json +50 -2
- claude_mpm/cli/__init__.py +51 -46
- claude_mpm/cli/__main__.py +1 -1
- claude_mpm/cli/commands/__init__.py +10 -12
- claude_mpm/cli/commands/agent_manager.py +186 -181
- claude_mpm/cli/commands/agents.py +648 -1098
- 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 +339 -967
- claude_mpm/cli/commands/monitor.py +117 -88
- claude_mpm/cli/commands/run.py +233 -542
- 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 +280 -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 +22 -29
- 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 +500 -680
- 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 -17
- 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 +99 -154
- claude_mpm/hooks/claude_hooks/hook_handler.py +110 -720
- claude_mpm/hooks/claude_hooks/hook_handler_eventbus.py +104 -77
- claude_mpm/hooks/claude_hooks/hook_handler_original.py +1040 -0
- claude_mpm/hooks/claude_hooks/hook_handler_refactored.py +347 -0
- 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/services/__init__.py +13 -0
- claude_mpm/hooks/claude_hooks/services/connection_manager.py +190 -0
- claude_mpm/hooks/claude_hooks/services/duplicate_detector.py +106 -0
- claude_mpm/hooks/claude_hooks/services/state_manager.py +282 -0
- claude_mpm/hooks/claude_hooks/services/subagent_processor.py +374 -0
- 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 +129 -511
- 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/base_agent_locator.py +132 -0
- 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_results_manager.py +185 -0
- 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/single_agent_deployer.py +315 -0
- 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 +157 -503
- 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/memory_categorization_service.py +165 -0
- claude_mpm/services/agents/memory/memory_file_service.py +103 -0
- claude_mpm/services/agents/memory/memory_format_service.py +201 -0
- claude_mpm/services/agents/memory/memory_limits_service.py +99 -0
- claude_mpm/services/agents/memory/template_generator.py +4 -6
- claude_mpm/services/agents/registry/__init__.py +11 -7
- 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/cli/__init__.py +18 -0
- claude_mpm/services/cli/agent_cleanup_service.py +407 -0
- claude_mpm/services/cli/agent_dependency_service.py +395 -0
- claude_mpm/services/cli/agent_listing_service.py +463 -0
- claude_mpm/services/cli/agent_output_formatter.py +605 -0
- claude_mpm/services/cli/agent_validation_service.py +589 -0
- claude_mpm/services/cli/dashboard_launcher.py +424 -0
- claude_mpm/services/cli/memory_crud_service.py +617 -0
- claude_mpm/services/cli/memory_output_formatter.py +604 -0
- claude_mpm/services/cli/session_manager.py +513 -0
- claude_mpm/services/cli/socketio_manager.py +498 -0
- claude_mpm/services/cli/startup_checker.py +370 -0
- 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/cache_manager.py +311 -0
- 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/core/memory_manager.py +637 -0
- claude_mpm/services/core/path_resolver.py +498 -0
- claude_mpm/services/core/service_container.py +520 -0
- claude_mpm/services/core/service_interfaces.py +436 -0
- 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 +152 -97
- claude_mpm/services/diagnostics/checks/base_check.py +12 -16
- claude_mpm/services/diagnostics/checks/claude_desktop_check.py +84 -81
- claude_mpm/services/diagnostics/checks/common_issues_check.py +99 -91
- claude_mpm/services/diagnostics/checks/configuration_check.py +82 -77
- claude_mpm/services/diagnostics/checks/filesystem_check.py +67 -68
- claude_mpm/services/diagnostics/checks/installation_check.py +254 -94
- claude_mpm/services/diagnostics/checks/mcp_check.py +90 -88
- claude_mpm/services/diagnostics/checks/monitor_check.py +75 -76
- claude_mpm/services/diagnostics/checks/startup_log_check.py +67 -73
- claude_mpm/services/diagnostics/diagnostic_runner.py +67 -59
- claude_mpm/services/diagnostics/doctor_reporter.py +107 -70
- claude_mpm/services/diagnostics/models.py +21 -19
- claude_mpm/services/event_aggregator.py +10 -17
- claude_mpm/services/event_bus/__init__.py +1 -1
- claude_mpm/services/event_bus/config.py +54 -35
- claude_mpm/services/event_bus/event_bus.py +76 -71
- claude_mpm/services/event_bus/relay.py +74 -64
- claude_mpm/services/events/__init__.py +11 -11
- claude_mpm/services/events/consumers/__init__.py +3 -3
- claude_mpm/services/events/consumers/dead_letter.py +71 -63
- claude_mpm/services/events/consumers/logging.py +39 -37
- claude_mpm/services/events/consumers/metrics.py +56 -57
- claude_mpm/services/events/consumers/socketio.py +82 -81
- claude_mpm/services/events/core.py +110 -99
- claude_mpm/services/events/interfaces.py +56 -72
- claude_mpm/services/events/producers/__init__.py +1 -1
- claude_mpm/services/events/producers/hook.py +38 -38
- claude_mpm/services/events/producers/system.py +46 -44
- claude_mpm/services/exceptions.py +81 -80
- claude_mpm/services/framework_claude_md_generator/__init__.py +2 -4
- claude_mpm/services/framework_claude_md_generator/content_assembler.py +3 -5
- claude_mpm/services/framework_claude_md_generator/content_validator.py +1 -1
- claude_mpm/services/framework_claude_md_generator/deployment_manager.py +4 -4
- claude_mpm/services/framework_claude_md_generator/section_generators/__init__.py +0 -1
- claude_mpm/services/framework_claude_md_generator/section_generators/agents.py +0 -2
- claude_mpm/services/framework_claude_md_generator/version_manager.py +4 -5
- claude_mpm/services/hook_service.py +6 -9
- claude_mpm/services/infrastructure/__init__.py +1 -1
- claude_mpm/services/infrastructure/context_preservation.py +8 -12
- claude_mpm/services/infrastructure/monitoring.py +21 -23
- claude_mpm/services/mcp_gateway/__init__.py +37 -37
- claude_mpm/services/mcp_gateway/auto_configure.py +95 -103
- claude_mpm/services/mcp_gateway/config/__init__.py +1 -1
- claude_mpm/services/mcp_gateway/config/config_loader.py +23 -25
- claude_mpm/services/mcp_gateway/config/config_schema.py +5 -5
- claude_mpm/services/mcp_gateway/config/configuration.py +9 -6
- claude_mpm/services/mcp_gateway/core/__init__.py +10 -10
- claude_mpm/services/mcp_gateway/core/base.py +0 -3
- claude_mpm/services/mcp_gateway/core/interfaces.py +1 -38
- claude_mpm/services/mcp_gateway/core/process_pool.py +99 -93
- claude_mpm/services/mcp_gateway/core/singleton_manager.py +65 -62
- claude_mpm/services/mcp_gateway/core/startup_verification.py +75 -74
- claude_mpm/services/mcp_gateway/main.py +2 -1
- claude_mpm/services/mcp_gateway/registry/service_registry.py +5 -8
- claude_mpm/services/mcp_gateway/registry/tool_registry.py +1 -1
- claude_mpm/services/mcp_gateway/server/__init__.py +1 -1
- claude_mpm/services/mcp_gateway/server/mcp_gateway.py +12 -19
- claude_mpm/services/mcp_gateway/server/stdio_handler.py +4 -3
- claude_mpm/services/mcp_gateway/server/stdio_server.py +79 -71
- claude_mpm/services/mcp_gateway/tools/__init__.py +2 -2
- claude_mpm/services/mcp_gateway/tools/base_adapter.py +5 -6
- claude_mpm/services/mcp_gateway/tools/document_summarizer.py +13 -22
- claude_mpm/services/mcp_gateway/tools/health_check_tool.py +79 -78
- claude_mpm/services/mcp_gateway/tools/hello_world.py +12 -14
- claude_mpm/services/mcp_gateway/tools/ticket_tools.py +42 -49
- claude_mpm/services/mcp_gateway/tools/unified_ticket_tool.py +51 -55
- claude_mpm/services/memory/__init__.py +3 -3
- claude_mpm/services/memory/builder.py +3 -6
- claude_mpm/services/memory/cache/__init__.py +1 -1
- claude_mpm/services/memory/cache/shared_prompt_cache.py +3 -5
- claude_mpm/services/memory/cache/simple_cache.py +1 -1
- claude_mpm/services/memory/indexed_memory.py +5 -7
- claude_mpm/services/memory/optimizer.py +7 -10
- claude_mpm/services/memory/router.py +8 -9
- claude_mpm/services/memory_hook_service.py +48 -34
- claude_mpm/services/monitor_build_service.py +77 -73
- claude_mpm/services/port_manager.py +130 -108
- claude_mpm/services/project/analyzer.py +12 -10
- claude_mpm/services/project/registry.py +11 -11
- claude_mpm/services/recovery_manager.py +10 -19
- claude_mpm/services/response_tracker.py +0 -1
- claude_mpm/services/runner_configuration_service.py +19 -20
- claude_mpm/services/session_management_service.py +7 -11
- claude_mpm/services/shared/__init__.py +1 -1
- claude_mpm/services/shared/async_service_base.py +58 -50
- claude_mpm/services/shared/config_service_base.py +73 -67
- claude_mpm/services/shared/lifecycle_service_base.py +82 -78
- claude_mpm/services/shared/manager_base.py +94 -82
- claude_mpm/services/shared/service_factory.py +96 -98
- claude_mpm/services/socketio/__init__.py +3 -3
- claude_mpm/services/socketio/client_proxy.py +5 -5
- claude_mpm/services/socketio/event_normalizer.py +199 -181
- claude_mpm/services/socketio/handlers/__init__.py +3 -3
- claude_mpm/services/socketio/handlers/base.py +5 -4
- claude_mpm/services/socketio/handlers/connection.py +163 -136
- claude_mpm/services/socketio/handlers/file.py +13 -14
- claude_mpm/services/socketio/handlers/git.py +12 -7
- claude_mpm/services/socketio/handlers/hook.py +49 -44
- claude_mpm/services/socketio/handlers/memory.py +0 -1
- claude_mpm/services/socketio/handlers/project.py +0 -1
- claude_mpm/services/socketio/handlers/registry.py +37 -19
- claude_mpm/services/socketio/migration_utils.py +98 -84
- claude_mpm/services/socketio/server/__init__.py +1 -1
- claude_mpm/services/socketio/server/broadcaster.py +81 -87
- claude_mpm/services/socketio/server/core.py +65 -54
- claude_mpm/services/socketio/server/eventbus_integration.py +95 -56
- claude_mpm/services/socketio/server/main.py +64 -38
- claude_mpm/services/socketio_client_manager.py +10 -12
- claude_mpm/services/subprocess_launcher_service.py +4 -7
- claude_mpm/services/system_instructions_service.py +13 -14
- claude_mpm/services/ticket_manager.py +2 -2
- claude_mpm/services/utility_service.py +5 -13
- claude_mpm/services/version_control/__init__.py +16 -16
- claude_mpm/services/version_control/branch_strategy.py +5 -8
- claude_mpm/services/version_control/conflict_resolution.py +9 -23
- claude_mpm/services/version_control/git_operations.py +5 -7
- claude_mpm/services/version_control/semantic_versioning.py +16 -17
- claude_mpm/services/version_control/version_parser.py +13 -18
- claude_mpm/services/version_service.py +10 -11
- claude_mpm/storage/__init__.py +1 -1
- claude_mpm/storage/state_storage.py +22 -28
- claude_mpm/utils/__init__.py +6 -6
- claude_mpm/utils/agent_dependency_loader.py +47 -33
- claude_mpm/utils/config_manager.py +11 -14
- claude_mpm/utils/dependency_cache.py +1 -1
- claude_mpm/utils/dependency_manager.py +13 -17
- claude_mpm/utils/dependency_strategies.py +8 -10
- claude_mpm/utils/environment_context.py +3 -9
- claude_mpm/utils/error_handler.py +3 -13
- claude_mpm/utils/file_utils.py +1 -1
- claude_mpm/utils/path_operations.py +8 -12
- claude_mpm/utils/robust_installer.py +110 -33
- claude_mpm/utils/subprocess_utils.py +5 -6
- claude_mpm/validation/agent_validator.py +3 -6
- claude_mpm/validation/frontmatter_validator.py +1 -1
- {claude_mpm-4.1.1.dist-info → claude_mpm-4.1.3.dist-info}/METADATA +1 -1
- claude_mpm-4.1.3.dist-info/RECORD +528 -0
- claude_mpm/cli/commands/run_config_checker.py +0 -160
- claude_mpm-4.1.1.dist-info/RECORD +0 -494
- {claude_mpm-4.1.1.dist-info → claude_mpm-4.1.3.dist-info}/WHEEL +0 -0
- {claude_mpm-4.1.1.dist-info → claude_mpm-4.1.3.dist-info}/entry_points.txt +0 -0
- {claude_mpm-4.1.1.dist-info → claude_mpm-4.1.3.dist-info}/licenses/LICENSE +0 -0
- {claude_mpm-4.1.1.dist-info → claude_mpm-4.1.3.dist-info}/top_level.txt +0 -0
|
@@ -8,21 +8,23 @@ WHY separate relay component:
|
|
|
8
8
|
- Supports batching and retry logic in one place
|
|
9
9
|
"""
|
|
10
10
|
|
|
11
|
-
import asyncio
|
|
12
11
|
import logging
|
|
13
12
|
import os
|
|
14
13
|
import time
|
|
15
|
-
from typing import Any, Dict, Optional
|
|
16
14
|
from datetime import datetime
|
|
15
|
+
from typing import Any, Dict, Optional
|
|
17
16
|
|
|
18
17
|
# Socket.IO imports
|
|
19
18
|
try:
|
|
20
19
|
import socketio
|
|
20
|
+
|
|
21
21
|
SOCKETIO_AVAILABLE = True
|
|
22
22
|
except ImportError:
|
|
23
23
|
SOCKETIO_AVAILABLE = False
|
|
24
24
|
socketio = None
|
|
25
25
|
|
|
26
|
+
import contextlib
|
|
27
|
+
|
|
26
28
|
from .event_bus import EventBus
|
|
27
29
|
|
|
28
30
|
# Configure logger
|
|
@@ -31,7 +33,7 @@ logger = logging.getLogger(__name__)
|
|
|
31
33
|
|
|
32
34
|
class SocketIORelay:
|
|
33
35
|
"""Relay events from EventBus to Socket.IO clients.
|
|
34
|
-
|
|
36
|
+
|
|
35
37
|
WHY relay pattern:
|
|
36
38
|
- Decouples event production from Socket.IO emission
|
|
37
39
|
- Handles connection failures without affecting producers
|
|
@@ -39,10 +41,10 @@ class SocketIORelay:
|
|
|
39
41
|
- Enables event batching and optimization
|
|
40
42
|
- Simplifies debugging with centralized logging
|
|
41
43
|
"""
|
|
42
|
-
|
|
44
|
+
|
|
43
45
|
def __init__(self, port: Optional[int] = None):
|
|
44
46
|
"""Initialize the Socket.IO relay.
|
|
45
|
-
|
|
47
|
+
|
|
46
48
|
Args:
|
|
47
49
|
port: Socket.IO server port (defaults to env var or 8765)
|
|
48
50
|
"""
|
|
@@ -52,25 +54,25 @@ class SocketIORelay:
|
|
|
52
54
|
self.connected = False
|
|
53
55
|
self.enabled = True
|
|
54
56
|
self.debug = os.environ.get("CLAUDE_MPM_RELAY_DEBUG", "false").lower() == "true"
|
|
55
|
-
|
|
57
|
+
|
|
56
58
|
# Connection retry settings
|
|
57
59
|
self.max_retries = 3
|
|
58
60
|
self.retry_delay = 0.5
|
|
59
61
|
self.last_connection_attempt = 0
|
|
60
62
|
self.connection_cooldown = 5.0 # Seconds between connection attempts
|
|
61
|
-
|
|
63
|
+
|
|
62
64
|
# Statistics
|
|
63
65
|
self.stats = {
|
|
64
66
|
"events_relayed": 0,
|
|
65
67
|
"events_failed": 0,
|
|
66
68
|
"connection_failures": 0,
|
|
67
|
-
"last_relay_time": None
|
|
69
|
+
"last_relay_time": None,
|
|
68
70
|
}
|
|
69
|
-
|
|
71
|
+
|
|
70
72
|
if not SOCKETIO_AVAILABLE:
|
|
71
73
|
logger.warning("Socket.IO not available, relay will be disabled")
|
|
72
74
|
self.enabled = False
|
|
73
|
-
|
|
75
|
+
|
|
74
76
|
def enable(self) -> None:
|
|
75
77
|
"""Enable the relay."""
|
|
76
78
|
if not SOCKETIO_AVAILABLE:
|
|
@@ -78,33 +80,31 @@ class SocketIORelay:
|
|
|
78
80
|
return
|
|
79
81
|
self.enabled = True
|
|
80
82
|
logger.info("SocketIO relay enabled")
|
|
81
|
-
|
|
83
|
+
|
|
82
84
|
def disable(self) -> None:
|
|
83
85
|
"""Disable the relay."""
|
|
84
86
|
self.enabled = False
|
|
85
87
|
if self.client and self.connected:
|
|
86
|
-
|
|
88
|
+
with contextlib.suppress(Exception):
|
|
87
89
|
self.client.disconnect()
|
|
88
|
-
except:
|
|
89
|
-
pass
|
|
90
90
|
logger.info("SocketIO relay disabled")
|
|
91
|
-
|
|
91
|
+
|
|
92
92
|
def _create_client(self) -> bool:
|
|
93
93
|
"""Create and connect Socket.IO client.
|
|
94
|
-
|
|
94
|
+
|
|
95
95
|
Returns:
|
|
96
96
|
bool: True if connection successful
|
|
97
97
|
"""
|
|
98
98
|
if not SOCKETIO_AVAILABLE or not self.enabled:
|
|
99
99
|
return False
|
|
100
|
-
|
|
100
|
+
|
|
101
101
|
# Check connection cooldown
|
|
102
102
|
current_time = time.time()
|
|
103
103
|
if current_time - self.last_connection_attempt < self.connection_cooldown:
|
|
104
104
|
return False
|
|
105
|
-
|
|
105
|
+
|
|
106
106
|
self.last_connection_attempt = current_time
|
|
107
|
-
|
|
107
|
+
|
|
108
108
|
try:
|
|
109
109
|
# Create new client with better connection settings
|
|
110
110
|
self.client = socketio.Client(
|
|
@@ -113,21 +113,21 @@ class SocketIORelay:
|
|
|
113
113
|
reconnection_delay=2,
|
|
114
114
|
reconnection_delay_max=10,
|
|
115
115
|
logger=False,
|
|
116
|
-
engineio_logger=False
|
|
116
|
+
engineio_logger=False,
|
|
117
117
|
)
|
|
118
|
-
|
|
118
|
+
|
|
119
119
|
# Connect to server with longer timeout
|
|
120
120
|
self.client.connect(
|
|
121
121
|
f"http://localhost:{self.port}",
|
|
122
122
|
wait=True,
|
|
123
123
|
wait_timeout=10.0, # Increase timeout for stability
|
|
124
|
-
transports=[
|
|
124
|
+
transports=["websocket", "polling"],
|
|
125
125
|
)
|
|
126
|
-
|
|
126
|
+
|
|
127
127
|
self.connected = True
|
|
128
128
|
logger.info(f"SocketIO relay connected to port {self.port}")
|
|
129
129
|
return True
|
|
130
|
-
|
|
130
|
+
|
|
131
131
|
except Exception as e:
|
|
132
132
|
self.stats["connection_failures"] += 1
|
|
133
133
|
if self.debug:
|
|
@@ -135,16 +135,16 @@ class SocketIORelay:
|
|
|
135
135
|
self.connected = False
|
|
136
136
|
self.client = None
|
|
137
137
|
return False
|
|
138
|
-
|
|
138
|
+
|
|
139
139
|
def _ensure_connection(self) -> bool:
|
|
140
140
|
"""Ensure Socket.IO client is connected.
|
|
141
|
-
|
|
141
|
+
|
|
142
142
|
Returns:
|
|
143
143
|
bool: True if connected or reconnected
|
|
144
144
|
"""
|
|
145
145
|
if not self.enabled:
|
|
146
146
|
return False
|
|
147
|
-
|
|
147
|
+
|
|
148
148
|
# Check existing connection
|
|
149
149
|
if self.client and self.connected:
|
|
150
150
|
try:
|
|
@@ -153,48 +153,55 @@ class SocketIORelay:
|
|
|
153
153
|
return True
|
|
154
154
|
except:
|
|
155
155
|
pass
|
|
156
|
-
|
|
156
|
+
|
|
157
157
|
# Need to create or reconnect
|
|
158
158
|
return self._create_client()
|
|
159
|
-
|
|
159
|
+
|
|
160
160
|
async def relay_event(self, event_type: str, data: Any) -> bool:
|
|
161
161
|
"""Relay an event to Socket.IO.
|
|
162
|
-
|
|
162
|
+
|
|
163
163
|
Args:
|
|
164
164
|
event_type: The event type
|
|
165
165
|
data: The event data
|
|
166
|
-
|
|
166
|
+
|
|
167
167
|
Returns:
|
|
168
168
|
bool: True if successfully relayed
|
|
169
169
|
"""
|
|
170
170
|
if not self.enabled:
|
|
171
171
|
return False
|
|
172
|
-
|
|
172
|
+
|
|
173
173
|
# Ensure we have a connection
|
|
174
174
|
if not self._ensure_connection():
|
|
175
175
|
self.stats["events_failed"] += 1
|
|
176
176
|
return False
|
|
177
|
-
|
|
177
|
+
|
|
178
178
|
try:
|
|
179
179
|
# Emit to Socket.IO
|
|
180
|
-
self.client.emit(
|
|
181
|
-
"
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
180
|
+
self.client.emit(
|
|
181
|
+
"claude_event",
|
|
182
|
+
{
|
|
183
|
+
"event": "claude_event",
|
|
184
|
+
"type": (
|
|
185
|
+
event_type.split(".")[0] if "." in event_type else event_type
|
|
186
|
+
),
|
|
187
|
+
"subtype": (
|
|
188
|
+
event_type.split(".", 1)[1] if "." in event_type else "generic"
|
|
189
|
+
),
|
|
190
|
+
"timestamp": data.get("timestamp", datetime.now().isoformat()),
|
|
191
|
+
"data": data,
|
|
192
|
+
"source": "event_bus",
|
|
193
|
+
},
|
|
194
|
+
)
|
|
195
|
+
|
|
189
196
|
# Update statistics
|
|
190
197
|
self.stats["events_relayed"] += 1
|
|
191
198
|
self.stats["last_relay_time"] = datetime.now().isoformat()
|
|
192
|
-
|
|
199
|
+
|
|
193
200
|
if self.debug:
|
|
194
201
|
logger.debug(f"Relayed event to Socket.IO: {event_type}")
|
|
195
|
-
|
|
202
|
+
|
|
196
203
|
return True
|
|
197
|
-
|
|
204
|
+
|
|
198
205
|
except Exception as e:
|
|
199
206
|
self.stats["events_failed"] += 1
|
|
200
207
|
if self.debug:
|
|
@@ -202,49 +209,52 @@ class SocketIORelay:
|
|
|
202
209
|
# Mark connection as failed for retry
|
|
203
210
|
self.connected = False
|
|
204
211
|
return False
|
|
205
|
-
|
|
212
|
+
|
|
206
213
|
def start(self) -> None:
|
|
207
214
|
"""Start the relay by subscribing to EventBus events.
|
|
208
|
-
|
|
215
|
+
|
|
209
216
|
This sets up listeners for all hook events and relays them
|
|
210
217
|
to Socket.IO clients.
|
|
211
218
|
"""
|
|
212
219
|
if not self.enabled:
|
|
213
220
|
logger.warning("Cannot start relay: disabled or Socket.IO not available")
|
|
214
221
|
return
|
|
215
|
-
|
|
222
|
+
|
|
216
223
|
# Define async handler for events
|
|
217
224
|
async def handle_hook_event(event_type: str, data: Any):
|
|
218
225
|
"""Handle events from the event bus."""
|
|
226
|
+
# Debug logging
|
|
227
|
+
print(f"[Relay] Received event: {event_type}", flush=True)
|
|
228
|
+
|
|
219
229
|
# Only relay hook events by default
|
|
220
230
|
if event_type.startswith("hook."):
|
|
231
|
+
print(f"[Relay] Relaying hook event: {event_type}", flush=True)
|
|
221
232
|
await self.relay_event(event_type, data)
|
|
222
|
-
|
|
233
|
+
|
|
223
234
|
# Subscribe to all hook events via wildcard
|
|
224
235
|
# This will catch ALL hook.* events
|
|
225
236
|
self.event_bus.on("hook.*", handle_hook_event)
|
|
226
|
-
|
|
237
|
+
|
|
227
238
|
logger.info("SocketIO relay started and subscribed to events")
|
|
228
|
-
|
|
239
|
+
print("[Relay] Started and subscribed to hook.* events", flush=True)
|
|
240
|
+
|
|
229
241
|
def stop(self) -> None:
|
|
230
242
|
"""Stop the relay and clean up resources."""
|
|
231
243
|
# Disconnect Socket.IO client
|
|
232
244
|
if self.client and self.connected:
|
|
233
|
-
|
|
245
|
+
with contextlib.suppress(Exception):
|
|
234
246
|
self.client.disconnect()
|
|
235
|
-
|
|
236
|
-
pass
|
|
237
|
-
|
|
247
|
+
|
|
238
248
|
# Could remove event bus listeners here if needed
|
|
239
249
|
# For now, let them be cleaned up naturally
|
|
240
|
-
|
|
250
|
+
|
|
241
251
|
self.connected = False
|
|
242
252
|
self.client = None
|
|
243
253
|
logger.info("SocketIO relay stopped")
|
|
244
|
-
|
|
254
|
+
|
|
245
255
|
def get_stats(self) -> Dict[str, Any]:
|
|
246
256
|
"""Get relay statistics.
|
|
247
|
-
|
|
257
|
+
|
|
248
258
|
Returns:
|
|
249
259
|
dict: Statistics about relay operation
|
|
250
260
|
"""
|
|
@@ -252,7 +262,7 @@ class SocketIORelay:
|
|
|
252
262
|
**self.stats,
|
|
253
263
|
"enabled": self.enabled,
|
|
254
264
|
"connected": self.connected,
|
|
255
|
-
"port": self.port
|
|
265
|
+
"port": self.port,
|
|
256
266
|
}
|
|
257
267
|
|
|
258
268
|
|
|
@@ -262,10 +272,10 @@ _relay_instance: Optional[SocketIORelay] = None
|
|
|
262
272
|
|
|
263
273
|
def get_relay(port: Optional[int] = None) -> SocketIORelay:
|
|
264
274
|
"""Get or create the global SocketIO relay instance.
|
|
265
|
-
|
|
275
|
+
|
|
266
276
|
Args:
|
|
267
277
|
port: Optional port number
|
|
268
|
-
|
|
278
|
+
|
|
269
279
|
Returns:
|
|
270
280
|
SocketIORelay: The relay instance
|
|
271
281
|
"""
|
|
@@ -277,10 +287,10 @@ def get_relay(port: Optional[int] = None) -> SocketIORelay:
|
|
|
277
287
|
|
|
278
288
|
def start_relay(port: Optional[int] = None) -> SocketIORelay:
|
|
279
289
|
"""Start the global SocketIO relay.
|
|
280
|
-
|
|
290
|
+
|
|
281
291
|
Args:
|
|
282
292
|
port: Optional port number
|
|
283
|
-
|
|
293
|
+
|
|
284
294
|
Returns:
|
|
285
295
|
SocketIORelay: The started relay instance
|
|
286
296
|
"""
|
|
@@ -294,4 +304,4 @@ def stop_relay() -> None:
|
|
|
294
304
|
global _relay_instance
|
|
295
305
|
if _relay_instance:
|
|
296
306
|
_relay_instance.stop()
|
|
297
|
-
_relay_instance = None
|
|
307
|
+
_relay_instance = None
|
|
@@ -13,32 +13,32 @@ Key Components:
|
|
|
13
13
|
- Various consumer implementations
|
|
14
14
|
"""
|
|
15
15
|
|
|
16
|
-
from .core import Event, EventBus, EventMetadata, EventPriority
|
|
17
|
-
from .interfaces import IEventConsumer, IEventProducer, ConsumerConfig
|
|
18
16
|
from .consumers import (
|
|
19
|
-
|
|
17
|
+
DeadLetterConsumer,
|
|
20
18
|
LoggingConsumer,
|
|
21
19
|
MetricsConsumer,
|
|
22
|
-
|
|
20
|
+
SocketIOConsumer,
|
|
23
21
|
)
|
|
22
|
+
from .core import Event, EventBus, EventMetadata, EventPriority
|
|
23
|
+
from .interfaces import ConsumerConfig, IEventConsumer, IEventProducer
|
|
24
24
|
from .producers import HookEventProducer, SystemEventProducer
|
|
25
25
|
|
|
26
26
|
__all__ = [
|
|
27
|
+
"ConsumerConfig",
|
|
28
|
+
"DeadLetterConsumer",
|
|
27
29
|
# Core
|
|
28
30
|
"Event",
|
|
29
31
|
"EventBus",
|
|
30
32
|
"EventMetadata",
|
|
31
33
|
"EventPriority",
|
|
34
|
+
# Producers
|
|
35
|
+
"HookEventProducer",
|
|
32
36
|
# Interfaces
|
|
33
37
|
"IEventConsumer",
|
|
34
38
|
"IEventProducer",
|
|
35
|
-
"ConsumerConfig",
|
|
36
|
-
# Consumers
|
|
37
|
-
"SocketIOConsumer",
|
|
38
39
|
"LoggingConsumer",
|
|
39
40
|
"MetricsConsumer",
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
"HookEventProducer",
|
|
41
|
+
# Consumers
|
|
42
|
+
"SocketIOConsumer",
|
|
43
43
|
"SystemEventProducer",
|
|
44
|
-
]
|
|
44
|
+
]
|