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
|
@@ -6,7 +6,6 @@ properly configured and accessible for real-time updates.
|
|
|
6
6
|
"""
|
|
7
7
|
|
|
8
8
|
import socket
|
|
9
|
-
from typing import Dict, Any
|
|
10
9
|
|
|
11
10
|
from ..models import DiagnosticResult, DiagnosticStatus
|
|
12
11
|
from .base_check import BaseDiagnosticCheck
|
|
@@ -14,43 +13,44 @@ from .base_check import BaseDiagnosticCheck
|
|
|
14
13
|
|
|
15
14
|
class MonitorCheck(BaseDiagnosticCheck):
|
|
16
15
|
"""Check monitoring and SocketIO server."""
|
|
17
|
-
|
|
16
|
+
|
|
18
17
|
@property
|
|
19
18
|
def name(self) -> str:
|
|
20
19
|
return "monitor_check"
|
|
21
|
-
|
|
20
|
+
|
|
22
21
|
@property
|
|
23
22
|
def category(self) -> str:
|
|
24
23
|
return "Monitor"
|
|
25
|
-
|
|
24
|
+
|
|
26
25
|
def run(self) -> DiagnosticResult:
|
|
27
26
|
"""Run monitor diagnostics."""
|
|
28
27
|
try:
|
|
29
|
-
|
|
30
|
-
|
|
28
|
+
|
|
31
29
|
sub_results = []
|
|
32
30
|
details = {}
|
|
33
|
-
|
|
31
|
+
|
|
34
32
|
# Check SocketIO availability
|
|
35
33
|
socketio_result = self._check_socketio()
|
|
36
34
|
sub_results.append(socketio_result)
|
|
37
|
-
details["socketio_available"] =
|
|
38
|
-
|
|
35
|
+
details["socketio_available"] = (
|
|
36
|
+
socketio_result.status == DiagnosticStatus.OK
|
|
37
|
+
)
|
|
38
|
+
|
|
39
39
|
# Check port availability
|
|
40
40
|
port_result = self._check_ports()
|
|
41
41
|
sub_results.append(port_result)
|
|
42
42
|
details["ports"] = port_result.details
|
|
43
|
-
|
|
43
|
+
|
|
44
44
|
# Check response logging
|
|
45
45
|
logging_result = self._check_response_logging()
|
|
46
46
|
sub_results.append(logging_result)
|
|
47
47
|
details["response_logging"] = logging_result.details.get("enabled", False)
|
|
48
|
-
|
|
48
|
+
|
|
49
49
|
# Check hook service
|
|
50
50
|
hook_result = self._check_hook_service()
|
|
51
51
|
sub_results.append(hook_result)
|
|
52
52
|
details["hooks_enabled"] = hook_result.status == DiagnosticStatus.OK
|
|
53
|
-
|
|
53
|
+
|
|
54
54
|
# Determine overall status
|
|
55
55
|
if any(r.status == DiagnosticStatus.ERROR for r in sub_results):
|
|
56
56
|
status = DiagnosticStatus.ERROR
|
|
@@ -61,33 +61,36 @@ class MonitorCheck(BaseDiagnosticCheck):
|
|
|
61
61
|
else:
|
|
62
62
|
status = DiagnosticStatus.OK
|
|
63
63
|
message = "Monitoring properly configured"
|
|
64
|
-
|
|
64
|
+
|
|
65
65
|
return DiagnosticResult(
|
|
66
66
|
category=self.category,
|
|
67
67
|
status=status,
|
|
68
68
|
message=message,
|
|
69
69
|
details=details,
|
|
70
|
-
sub_results=sub_results if self.verbose else []
|
|
70
|
+
sub_results=sub_results if self.verbose else [],
|
|
71
71
|
)
|
|
72
|
-
|
|
72
|
+
|
|
73
73
|
except Exception as e:
|
|
74
74
|
return DiagnosticResult(
|
|
75
75
|
category=self.category,
|
|
76
76
|
status=DiagnosticStatus.ERROR,
|
|
77
|
-
message=f"Monitor check failed: {
|
|
78
|
-
details={"error": str(e)}
|
|
77
|
+
message=f"Monitor check failed: {e!s}",
|
|
78
|
+
details={"error": str(e)},
|
|
79
79
|
)
|
|
80
|
-
|
|
80
|
+
|
|
81
81
|
def _check_socketio(self) -> DiagnosticResult:
|
|
82
82
|
"""Check if SocketIO is available."""
|
|
83
83
|
try:
|
|
84
84
|
import socketio
|
|
85
|
-
|
|
85
|
+
|
|
86
86
|
return DiagnosticResult(
|
|
87
87
|
category="SocketIO",
|
|
88
88
|
status=DiagnosticStatus.OK,
|
|
89
89
|
message="SocketIO library available",
|
|
90
|
-
details={
|
|
90
|
+
details={
|
|
91
|
+
"available": True,
|
|
92
|
+
"version": getattr(socketio, "__version__", "unknown"),
|
|
93
|
+
},
|
|
91
94
|
)
|
|
92
95
|
except ImportError:
|
|
93
96
|
return DiagnosticResult(
|
|
@@ -96,26 +99,26 @@ class MonitorCheck(BaseDiagnosticCheck):
|
|
|
96
99
|
message="SocketIO not installed",
|
|
97
100
|
details={"available": False},
|
|
98
101
|
fix_command="pip install python-socketio[asyncio]",
|
|
99
|
-
fix_description="Install SocketIO for real-time monitoring"
|
|
102
|
+
fix_description="Install SocketIO for real-time monitoring",
|
|
100
103
|
)
|
|
101
|
-
|
|
104
|
+
|
|
102
105
|
def _check_ports(self) -> DiagnosticResult:
|
|
103
106
|
"""Check port availability for monitoring services."""
|
|
104
107
|
try:
|
|
105
108
|
from ....services.port_manager import PortManager
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
+
|
|
110
|
+
PortManager()
|
|
111
|
+
|
|
109
112
|
# Check default monitoring port range
|
|
110
113
|
available_ports = []
|
|
111
114
|
blocked_ports = []
|
|
112
|
-
|
|
115
|
+
|
|
113
116
|
for port in range(8765, 8786):
|
|
114
117
|
if self._is_port_available(port):
|
|
115
118
|
available_ports.append(port)
|
|
116
119
|
else:
|
|
117
120
|
blocked_ports.append(port)
|
|
118
|
-
|
|
121
|
+
|
|
119
122
|
if not available_ports:
|
|
120
123
|
return DiagnosticResult(
|
|
121
124
|
category="Port Availability",
|
|
@@ -124,11 +127,11 @@ class MonitorCheck(BaseDiagnosticCheck):
|
|
|
124
127
|
details={
|
|
125
128
|
"available": [],
|
|
126
129
|
"blocked": blocked_ports,
|
|
127
|
-
"checked_range": "8765-8785"
|
|
130
|
+
"checked_range": "8765-8785",
|
|
128
131
|
},
|
|
129
|
-
fix_description="Free up ports in the 8765-8785 range"
|
|
132
|
+
fix_description="Free up ports in the 8765-8785 range",
|
|
130
133
|
)
|
|
131
|
-
|
|
134
|
+
|
|
132
135
|
# Check if default port is available
|
|
133
136
|
default_port = 8765
|
|
134
137
|
if default_port not in available_ports:
|
|
@@ -139,10 +142,10 @@ class MonitorCheck(BaseDiagnosticCheck):
|
|
|
139
142
|
details={
|
|
140
143
|
"available": available_ports,
|
|
141
144
|
"blocked": blocked_ports,
|
|
142
|
-
"default_port": default_port
|
|
143
|
-
}
|
|
145
|
+
"default_port": default_port,
|
|
146
|
+
},
|
|
144
147
|
)
|
|
145
|
-
|
|
148
|
+
|
|
146
149
|
return DiagnosticResult(
|
|
147
150
|
category="Port Availability",
|
|
148
151
|
status=DiagnosticStatus.OK,
|
|
@@ -150,64 +153,67 @@ class MonitorCheck(BaseDiagnosticCheck):
|
|
|
150
153
|
details={
|
|
151
154
|
"available": available_ports,
|
|
152
155
|
"blocked": blocked_ports,
|
|
153
|
-
"default_port": default_port
|
|
154
|
-
}
|
|
156
|
+
"default_port": default_port,
|
|
157
|
+
},
|
|
155
158
|
)
|
|
156
|
-
|
|
159
|
+
|
|
157
160
|
except Exception as e:
|
|
158
161
|
return DiagnosticResult(
|
|
159
162
|
category="Port Availability",
|
|
160
163
|
status=DiagnosticStatus.WARNING,
|
|
161
|
-
message=f"Could not check ports: {
|
|
162
|
-
details={"error": str(e)}
|
|
164
|
+
message=f"Could not check ports: {e!s}",
|
|
165
|
+
details={"error": str(e)},
|
|
163
166
|
)
|
|
164
|
-
|
|
167
|
+
|
|
165
168
|
def _is_port_available(self, port: int) -> bool:
|
|
166
169
|
"""Check if a specific port is available."""
|
|
167
170
|
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
|
168
171
|
sock.settimeout(0.1)
|
|
169
172
|
try:
|
|
170
|
-
result = sock.connect_ex((
|
|
173
|
+
result = sock.connect_ex(("localhost", port))
|
|
171
174
|
return result != 0
|
|
172
175
|
finally:
|
|
173
176
|
sock.close()
|
|
174
|
-
|
|
177
|
+
|
|
175
178
|
def _check_response_logging(self) -> DiagnosticResult:
|
|
176
179
|
"""Check response logging configuration."""
|
|
177
180
|
from pathlib import Path
|
|
181
|
+
|
|
178
182
|
import yaml
|
|
179
|
-
|
|
183
|
+
|
|
180
184
|
# Check user config
|
|
181
185
|
config_paths = [
|
|
182
186
|
Path.home() / ".claude" / "claude-mpm.yaml",
|
|
183
|
-
Path.cwd() / ".claude" / "claude-mpm.yaml"
|
|
187
|
+
Path.cwd() / ".claude" / "claude-mpm.yaml",
|
|
184
188
|
]
|
|
185
|
-
|
|
189
|
+
|
|
186
190
|
response_logging_enabled = False
|
|
187
191
|
log_path = None
|
|
188
|
-
|
|
192
|
+
|
|
189
193
|
for config_path in config_paths:
|
|
190
194
|
if config_path.exists():
|
|
191
195
|
try:
|
|
192
|
-
with open(config_path
|
|
196
|
+
with open(config_path) as f:
|
|
193
197
|
config = yaml.safe_load(f)
|
|
194
198
|
if config and isinstance(config, dict):
|
|
195
199
|
response_config = config.get("response_logging", {})
|
|
196
200
|
if response_config.get("enabled", False):
|
|
197
201
|
response_logging_enabled = True
|
|
198
|
-
log_path = response_config.get(
|
|
202
|
+
log_path = response_config.get(
|
|
203
|
+
"path", "~/.claude/responses"
|
|
204
|
+
)
|
|
199
205
|
break
|
|
200
206
|
except Exception:
|
|
201
207
|
pass
|
|
202
|
-
|
|
208
|
+
|
|
203
209
|
if not response_logging_enabled:
|
|
204
210
|
return DiagnosticResult(
|
|
205
211
|
category="Response Logging",
|
|
206
212
|
status=DiagnosticStatus.OK,
|
|
207
213
|
message="Response logging disabled (default)",
|
|
208
|
-
details={"enabled": False}
|
|
214
|
+
details={"enabled": False},
|
|
209
215
|
)
|
|
210
|
-
|
|
216
|
+
|
|
211
217
|
# Check log directory
|
|
212
218
|
log_dir = Path(log_path).expanduser()
|
|
213
219
|
if not log_dir.exists():
|
|
@@ -215,30 +221,23 @@ class MonitorCheck(BaseDiagnosticCheck):
|
|
|
215
221
|
category="Response Logging",
|
|
216
222
|
status=DiagnosticStatus.WARNING,
|
|
217
223
|
message="Response logging enabled but directory missing",
|
|
218
|
-
details={
|
|
219
|
-
"enabled": True,
|
|
220
|
-
"path": str(log_dir),
|
|
221
|
-
"exists": False
|
|
222
|
-
},
|
|
224
|
+
details={"enabled": True, "path": str(log_dir), "exists": False},
|
|
223
225
|
fix_command=f"mkdir -p {log_dir}",
|
|
224
|
-
fix_description="Create response logging directory"
|
|
226
|
+
fix_description="Create response logging directory",
|
|
225
227
|
)
|
|
226
|
-
|
|
228
|
+
|
|
227
229
|
import os
|
|
230
|
+
|
|
228
231
|
if not os.access(log_dir, os.W_OK):
|
|
229
232
|
return DiagnosticResult(
|
|
230
233
|
category="Response Logging",
|
|
231
234
|
status=DiagnosticStatus.WARNING,
|
|
232
235
|
message="Response logging directory not writable",
|
|
233
|
-
details={
|
|
234
|
-
"enabled": True,
|
|
235
|
-
"path": str(log_dir),
|
|
236
|
-
"writable": False
|
|
237
|
-
},
|
|
236
|
+
details={"enabled": True, "path": str(log_dir), "writable": False},
|
|
238
237
|
fix_command=f"chmod 755 {log_dir}",
|
|
239
|
-
fix_description="Fix permissions on logging directory"
|
|
238
|
+
fix_description="Fix permissions on logging directory",
|
|
240
239
|
)
|
|
241
|
-
|
|
240
|
+
|
|
242
241
|
return DiagnosticResult(
|
|
243
242
|
category="Response Logging",
|
|
244
243
|
status=DiagnosticStatus.OK,
|
|
@@ -247,36 +246,36 @@ class MonitorCheck(BaseDiagnosticCheck):
|
|
|
247
246
|
"enabled": True,
|
|
248
247
|
"path": str(log_dir),
|
|
249
248
|
"exists": True,
|
|
250
|
-
"writable": True
|
|
251
|
-
}
|
|
249
|
+
"writable": True,
|
|
250
|
+
},
|
|
252
251
|
)
|
|
253
|
-
|
|
252
|
+
|
|
254
253
|
def _check_hook_service(self) -> DiagnosticResult:
|
|
255
254
|
"""Check hook service configuration."""
|
|
256
255
|
try:
|
|
257
256
|
from ....services.hook_service import HookService
|
|
258
|
-
|
|
257
|
+
|
|
259
258
|
# Try to create hook service instance
|
|
260
|
-
|
|
261
|
-
|
|
259
|
+
HookService()
|
|
260
|
+
|
|
262
261
|
return DiagnosticResult(
|
|
263
262
|
category="Hook Service",
|
|
264
263
|
status=DiagnosticStatus.OK,
|
|
265
264
|
message="Hook service available",
|
|
266
|
-
details={"available": True}
|
|
265
|
+
details={"available": True},
|
|
267
266
|
)
|
|
268
|
-
|
|
267
|
+
|
|
269
268
|
except ImportError:
|
|
270
269
|
return DiagnosticResult(
|
|
271
270
|
category="Hook Service",
|
|
272
271
|
status=DiagnosticStatus.WARNING,
|
|
273
272
|
message="Hook service not available",
|
|
274
|
-
details={"available": False}
|
|
273
|
+
details={"available": False},
|
|
275
274
|
)
|
|
276
275
|
except Exception as e:
|
|
277
276
|
return DiagnosticResult(
|
|
278
277
|
category="Hook Service",
|
|
279
278
|
status=DiagnosticStatus.WARNING,
|
|
280
|
-
message=f"Hook service error: {
|
|
281
|
-
details={"available": False, "error": str(e)}
|
|
282
|
-
)
|
|
279
|
+
message=f"Hook service error: {e!s}",
|
|
280
|
+
details={"available": False, "error": str(e)},
|
|
281
|
+
)
|