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
|
@@ -0,0 +1,395 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Agent Dependency Service
|
|
3
|
+
========================
|
|
4
|
+
|
|
5
|
+
WHY: This service manages all agent dependency operations including checking,
|
|
6
|
+
installing, listing, and fixing dependencies with robust retry logic. It provides
|
|
7
|
+
a clean interface for the CLI to manage agent dependencies without embedding
|
|
8
|
+
complex logic in the command module.
|
|
9
|
+
|
|
10
|
+
DESIGN DECISIONS:
|
|
11
|
+
- Uses AgentDependencyLoader for dependency discovery and analysis
|
|
12
|
+
- Integrates RobustPackageInstaller for reliable package installation
|
|
13
|
+
- Provides retry logic for network operations to handle transient failures
|
|
14
|
+
- Generates detailed dependency reports for user feedback
|
|
15
|
+
- Maintains separation between dependency logic and CLI presentation
|
|
16
|
+
"""
|
|
17
|
+
|
|
18
|
+
from abc import ABC, abstractmethod
|
|
19
|
+
from typing import Any, Dict, List, Optional, Tuple
|
|
20
|
+
|
|
21
|
+
from ...core.logger import get_logger
|
|
22
|
+
from ...utils.agent_dependency_loader import AgentDependencyLoader
|
|
23
|
+
from ...utils.robust_installer import RobustPackageInstaller
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class IAgentDependencyService(ABC):
|
|
27
|
+
"""Interface for agent dependency management operations."""
|
|
28
|
+
|
|
29
|
+
@abstractmethod
|
|
30
|
+
def check_dependencies(self, agent_name: Optional[str] = None) -> Dict[str, Any]:
|
|
31
|
+
"""Check dependencies for deployed agents."""
|
|
32
|
+
|
|
33
|
+
@abstractmethod
|
|
34
|
+
def install_dependencies(
|
|
35
|
+
self, agent_name: Optional[str] = None, dry_run: bool = False
|
|
36
|
+
) -> Dict[str, Any]:
|
|
37
|
+
"""Install missing dependencies for agents."""
|
|
38
|
+
|
|
39
|
+
@abstractmethod
|
|
40
|
+
def list_dependencies(self, format_type: str = "text") -> Dict[str, Any]:
|
|
41
|
+
"""List all dependencies from deployed agents."""
|
|
42
|
+
|
|
43
|
+
@abstractmethod
|
|
44
|
+
def fix_dependencies(
|
|
45
|
+
self, max_retries: int = 3, agent_name: Optional[str] = None
|
|
46
|
+
) -> Dict[str, Any]:
|
|
47
|
+
"""Auto-fix dependency issues with retry logic."""
|
|
48
|
+
|
|
49
|
+
@abstractmethod
|
|
50
|
+
def validate_compatibility(
|
|
51
|
+
self, packages: List[str]
|
|
52
|
+
) -> Tuple[List[str], List[str]]:
|
|
53
|
+
"""Check version compatibility for packages."""
|
|
54
|
+
|
|
55
|
+
@abstractmethod
|
|
56
|
+
def get_dependency_report(self) -> str:
|
|
57
|
+
"""Generate a formatted dependency report."""
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
class AgentDependencyService(IAgentDependencyService):
|
|
61
|
+
"""Service for managing agent dependencies with robust error handling."""
|
|
62
|
+
|
|
63
|
+
def __init__(self):
|
|
64
|
+
"""Initialize the dependency service."""
|
|
65
|
+
self.logger = get_logger(__name__)
|
|
66
|
+
self.loader = None # Lazy initialization
|
|
67
|
+
|
|
68
|
+
def _get_loader(self, auto_install: bool = False) -> AgentDependencyLoader:
|
|
69
|
+
"""Get or create dependency loader instance."""
|
|
70
|
+
if self.loader is None or self.loader.auto_install != auto_install:
|
|
71
|
+
self.loader = AgentDependencyLoader(auto_install=auto_install)
|
|
72
|
+
return self.loader
|
|
73
|
+
|
|
74
|
+
def check_dependencies(self, agent_name: Optional[str] = None) -> Dict[str, Any]:
|
|
75
|
+
"""
|
|
76
|
+
Check dependencies for deployed agents.
|
|
77
|
+
|
|
78
|
+
Args:
|
|
79
|
+
agent_name: Optional specific agent to check
|
|
80
|
+
|
|
81
|
+
Returns:
|
|
82
|
+
Dictionary containing check results
|
|
83
|
+
"""
|
|
84
|
+
try:
|
|
85
|
+
loader = self._get_loader(auto_install=False)
|
|
86
|
+
|
|
87
|
+
# Discover deployed agents
|
|
88
|
+
loader.discover_deployed_agents()
|
|
89
|
+
|
|
90
|
+
# Filter to specific agent if requested
|
|
91
|
+
if agent_name:
|
|
92
|
+
if agent_name not in loader.deployed_agents:
|
|
93
|
+
available = list(loader.deployed_agents.keys())
|
|
94
|
+
return {
|
|
95
|
+
"success": False,
|
|
96
|
+
"error": f"Agent '{agent_name}' is not deployed",
|
|
97
|
+
"available_agents": available,
|
|
98
|
+
}
|
|
99
|
+
# Keep only the specified agent
|
|
100
|
+
loader.deployed_agents = {
|
|
101
|
+
agent_name: loader.deployed_agents[agent_name]
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
# Load dependencies and check
|
|
105
|
+
loader.load_agent_dependencies()
|
|
106
|
+
results = loader.analyze_dependencies()
|
|
107
|
+
|
|
108
|
+
# Generate report
|
|
109
|
+
report = loader.format_report(results)
|
|
110
|
+
|
|
111
|
+
return {
|
|
112
|
+
"success": True,
|
|
113
|
+
"report": report,
|
|
114
|
+
"results": results,
|
|
115
|
+
"agent": agent_name,
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
except Exception as e:
|
|
119
|
+
self.logger.error(f"Dependency check failed: {e}")
|
|
120
|
+
return {
|
|
121
|
+
"success": False,
|
|
122
|
+
"error": str(e),
|
|
123
|
+
"agent": agent_name,
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
def install_dependencies(
|
|
127
|
+
self, agent_name: Optional[str] = None, dry_run: bool = False
|
|
128
|
+
) -> Dict[str, Any]:
|
|
129
|
+
"""
|
|
130
|
+
Install missing dependencies for agents.
|
|
131
|
+
|
|
132
|
+
Args:
|
|
133
|
+
agent_name: Optional specific agent to install for
|
|
134
|
+
dry_run: Whether to simulate installation
|
|
135
|
+
|
|
136
|
+
Returns:
|
|
137
|
+
Dictionary containing installation results
|
|
138
|
+
"""
|
|
139
|
+
try:
|
|
140
|
+
loader = self._get_loader(auto_install=not dry_run)
|
|
141
|
+
|
|
142
|
+
# Discover deployed agents
|
|
143
|
+
loader.discover_deployed_agents()
|
|
144
|
+
|
|
145
|
+
# Filter to specific agent if requested
|
|
146
|
+
if agent_name:
|
|
147
|
+
if agent_name not in loader.deployed_agents:
|
|
148
|
+
available = list(loader.deployed_agents.keys())
|
|
149
|
+
return {
|
|
150
|
+
"success": False,
|
|
151
|
+
"error": f"Agent '{agent_name}' is not deployed",
|
|
152
|
+
"available_agents": available,
|
|
153
|
+
}
|
|
154
|
+
loader.deployed_agents = {
|
|
155
|
+
agent_name: loader.deployed_agents[agent_name]
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
# Load dependencies
|
|
159
|
+
loader.load_agent_dependencies()
|
|
160
|
+
results = loader.analyze_dependencies()
|
|
161
|
+
|
|
162
|
+
missing_deps = results["summary"]["missing_python"]
|
|
163
|
+
|
|
164
|
+
if not missing_deps:
|
|
165
|
+
return {
|
|
166
|
+
"success": True,
|
|
167
|
+
"message": "All Python dependencies are already installed",
|
|
168
|
+
"missing_count": 0,
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
if dry_run:
|
|
172
|
+
return {
|
|
173
|
+
"success": True,
|
|
174
|
+
"dry_run": True,
|
|
175
|
+
"missing_dependencies": missing_deps,
|
|
176
|
+
"install_command": f"pip install {' '.join(missing_deps)}",
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
# Install missing dependencies
|
|
180
|
+
success, error = loader.install_missing_dependencies(missing_deps)
|
|
181
|
+
|
|
182
|
+
if success:
|
|
183
|
+
# Re-check after installation
|
|
184
|
+
loader.checked_packages.clear()
|
|
185
|
+
final_results = loader.analyze_dependencies()
|
|
186
|
+
still_missing = final_results["summary"]["missing_python"]
|
|
187
|
+
|
|
188
|
+
return {
|
|
189
|
+
"success": True,
|
|
190
|
+
"installed": missing_deps,
|
|
191
|
+
"still_missing": still_missing,
|
|
192
|
+
"fully_resolved": len(still_missing) == 0,
|
|
193
|
+
}
|
|
194
|
+
return {
|
|
195
|
+
"success": False,
|
|
196
|
+
"error": error,
|
|
197
|
+
"failed_dependencies": missing_deps,
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
except Exception as e:
|
|
201
|
+
self.logger.error(f"Dependency installation failed: {e}")
|
|
202
|
+
return {
|
|
203
|
+
"success": False,
|
|
204
|
+
"error": str(e),
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
def list_dependencies(self, format_type: str = "text") -> Dict[str, Any]:
|
|
208
|
+
"""
|
|
209
|
+
List all dependencies from deployed agents.
|
|
210
|
+
|
|
211
|
+
Args:
|
|
212
|
+
format_type: Output format (text, json, or pip)
|
|
213
|
+
|
|
214
|
+
Returns:
|
|
215
|
+
Dictionary containing dependency listing
|
|
216
|
+
"""
|
|
217
|
+
try:
|
|
218
|
+
loader = self._get_loader(auto_install=False)
|
|
219
|
+
|
|
220
|
+
# Discover and load
|
|
221
|
+
loader.discover_deployed_agents()
|
|
222
|
+
loader.load_agent_dependencies()
|
|
223
|
+
|
|
224
|
+
# Collect all unique dependencies
|
|
225
|
+
all_python_deps = set()
|
|
226
|
+
all_system_deps = set()
|
|
227
|
+
|
|
228
|
+
for agent_id, deps in loader.agent_dependencies.items():
|
|
229
|
+
if "python" in deps:
|
|
230
|
+
all_python_deps.update(deps["python"])
|
|
231
|
+
if "system" in deps:
|
|
232
|
+
all_system_deps.update(deps["system"])
|
|
233
|
+
|
|
234
|
+
# Format result based on requested format
|
|
235
|
+
if format_type == "pip":
|
|
236
|
+
return {
|
|
237
|
+
"success": True,
|
|
238
|
+
"format": "pip",
|
|
239
|
+
"dependencies": sorted(all_python_deps),
|
|
240
|
+
}
|
|
241
|
+
if format_type == "json":
|
|
242
|
+
return {
|
|
243
|
+
"success": True,
|
|
244
|
+
"format": "json",
|
|
245
|
+
"data": {
|
|
246
|
+
"python": sorted(all_python_deps),
|
|
247
|
+
"system": sorted(all_system_deps),
|
|
248
|
+
"agents": loader.agent_dependencies,
|
|
249
|
+
},
|
|
250
|
+
}
|
|
251
|
+
# text format
|
|
252
|
+
return {
|
|
253
|
+
"success": True,
|
|
254
|
+
"format": "text",
|
|
255
|
+
"python_dependencies": sorted(all_python_deps),
|
|
256
|
+
"system_dependencies": sorted(all_system_deps),
|
|
257
|
+
"per_agent": loader.agent_dependencies,
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
except Exception as e:
|
|
261
|
+
self.logger.error(f"Dependency listing failed: {e}")
|
|
262
|
+
return {
|
|
263
|
+
"success": False,
|
|
264
|
+
"error": str(e),
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
def fix_dependencies(
|
|
268
|
+
self, max_retries: int = 3, agent_name: Optional[str] = None
|
|
269
|
+
) -> Dict[str, Any]:
|
|
270
|
+
"""
|
|
271
|
+
Auto-fix dependency issues with retry logic.
|
|
272
|
+
|
|
273
|
+
Args:
|
|
274
|
+
max_retries: Maximum retry attempts per package
|
|
275
|
+
agent_name: Optional specific agent to fix
|
|
276
|
+
|
|
277
|
+
Returns:
|
|
278
|
+
Dictionary containing fix results
|
|
279
|
+
"""
|
|
280
|
+
try:
|
|
281
|
+
loader = self._get_loader(auto_install=False)
|
|
282
|
+
|
|
283
|
+
# Discover and analyze
|
|
284
|
+
loader.discover_deployed_agents()
|
|
285
|
+
|
|
286
|
+
if not loader.deployed_agents:
|
|
287
|
+
return {
|
|
288
|
+
"success": True,
|
|
289
|
+
"message": "No deployed agents found",
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
# Filter to specific agent if requested
|
|
293
|
+
if agent_name:
|
|
294
|
+
if agent_name not in loader.deployed_agents:
|
|
295
|
+
return {
|
|
296
|
+
"success": False,
|
|
297
|
+
"error": f"Agent '{agent_name}' is not deployed",
|
|
298
|
+
}
|
|
299
|
+
loader.deployed_agents = {
|
|
300
|
+
agent_name: loader.deployed_agents[agent_name]
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
loader.load_agent_dependencies()
|
|
304
|
+
results = loader.analyze_dependencies()
|
|
305
|
+
|
|
306
|
+
missing_python = results["summary"]["missing_python"]
|
|
307
|
+
missing_system = results["summary"]["missing_system"]
|
|
308
|
+
|
|
309
|
+
if not missing_python and not missing_system:
|
|
310
|
+
return {
|
|
311
|
+
"success": True,
|
|
312
|
+
"message": "All dependencies are already satisfied",
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
fix_results = {
|
|
316
|
+
"success": True,
|
|
317
|
+
"missing_python": missing_python,
|
|
318
|
+
"missing_system": missing_system,
|
|
319
|
+
"fixed_python": [],
|
|
320
|
+
"failed_python": [],
|
|
321
|
+
"incompatible": [],
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
# Fix Python dependencies with robust installer
|
|
325
|
+
if missing_python:
|
|
326
|
+
# Check compatibility
|
|
327
|
+
compatible, incompatible = loader.check_python_compatibility(
|
|
328
|
+
missing_python
|
|
329
|
+
)
|
|
330
|
+
fix_results["incompatible"] = incompatible
|
|
331
|
+
|
|
332
|
+
if compatible:
|
|
333
|
+
installer = RobustPackageInstaller(
|
|
334
|
+
max_retries=max_retries,
|
|
335
|
+
retry_delay=2.0,
|
|
336
|
+
timeout=300,
|
|
337
|
+
)
|
|
338
|
+
|
|
339
|
+
successful, failed, errors = installer.install_packages(compatible)
|
|
340
|
+
|
|
341
|
+
fix_results["fixed_python"] = successful
|
|
342
|
+
fix_results["failed_python"] = failed
|
|
343
|
+
fix_results["errors"] = errors
|
|
344
|
+
|
|
345
|
+
# Re-check after fixes
|
|
346
|
+
loader.checked_packages.clear()
|
|
347
|
+
final_results = loader.analyze_dependencies()
|
|
348
|
+
fix_results["still_missing"] = final_results["summary"][
|
|
349
|
+
"missing_python"
|
|
350
|
+
]
|
|
351
|
+
|
|
352
|
+
return fix_results
|
|
353
|
+
|
|
354
|
+
except Exception as e:
|
|
355
|
+
self.logger.error(f"Dependency fix failed: {e}")
|
|
356
|
+
return {
|
|
357
|
+
"success": False,
|
|
358
|
+
"error": str(e),
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
def validate_compatibility(
|
|
362
|
+
self, packages: List[str]
|
|
363
|
+
) -> Tuple[List[str], List[str]]:
|
|
364
|
+
"""
|
|
365
|
+
Check version compatibility for packages.
|
|
366
|
+
|
|
367
|
+
Args:
|
|
368
|
+
packages: List of package names to check
|
|
369
|
+
|
|
370
|
+
Returns:
|
|
371
|
+
Tuple of (compatible_packages, incompatible_packages)
|
|
372
|
+
"""
|
|
373
|
+
try:
|
|
374
|
+
loader = self._get_loader(auto_install=False)
|
|
375
|
+
return loader.check_python_compatibility(packages)
|
|
376
|
+
except Exception as e:
|
|
377
|
+
self.logger.error(f"Compatibility check failed: {e}")
|
|
378
|
+
return [], packages # Assume all incompatible on error
|
|
379
|
+
|
|
380
|
+
def get_dependency_report(self) -> str:
|
|
381
|
+
"""
|
|
382
|
+
Generate a formatted dependency report.
|
|
383
|
+
|
|
384
|
+
Returns:
|
|
385
|
+
Formatted report string
|
|
386
|
+
"""
|
|
387
|
+
try:
|
|
388
|
+
loader = self._get_loader(auto_install=False)
|
|
389
|
+
loader.discover_deployed_agents()
|
|
390
|
+
loader.load_agent_dependencies()
|
|
391
|
+
results = loader.analyze_dependencies()
|
|
392
|
+
return loader.format_report(results)
|
|
393
|
+
except Exception as e:
|
|
394
|
+
self.logger.error(f"Report generation failed: {e}")
|
|
395
|
+
return f"Failed to generate dependency report: {e}"
|