claude-mpm 3.9.11__py3-none-any.whl → 4.0.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/VERSION +1 -1
- claude_mpm/__init__.py +2 -2
- claude_mpm/__main__.py +3 -2
- claude_mpm/agents/__init__.py +85 -79
- claude_mpm/agents/agent_loader.py +464 -1003
- claude_mpm/agents/agent_loader_integration.py +45 -45
- claude_mpm/agents/agents_metadata.py +29 -30
- claude_mpm/agents/async_agent_loader.py +156 -138
- claude_mpm/agents/base_agent.json +1 -1
- claude_mpm/agents/base_agent_loader.py +179 -151
- claude_mpm/agents/frontmatter_validator.py +229 -130
- claude_mpm/agents/schema/agent_schema.json +1 -1
- claude_mpm/agents/system_agent_config.py +213 -147
- claude_mpm/agents/templates/__init__.py +13 -13
- claude_mpm/agents/templates/code_analyzer.json +2 -2
- claude_mpm/agents/templates/data_engineer.json +1 -1
- claude_mpm/agents/templates/documentation.json +23 -11
- claude_mpm/agents/templates/engineer.json +22 -6
- claude_mpm/agents/templates/memory_manager.json +1 -1
- claude_mpm/agents/templates/ops.json +2 -2
- claude_mpm/agents/templates/project_organizer.json +1 -1
- claude_mpm/agents/templates/qa.json +1 -1
- claude_mpm/agents/templates/refactoring_engineer.json +222 -0
- claude_mpm/agents/templates/research.json +20 -14
- claude_mpm/agents/templates/security.json +1 -1
- claude_mpm/agents/templates/ticketing.json +1 -1
- claude_mpm/agents/templates/version_control.json +1 -1
- claude_mpm/agents/templates/web_qa.json +3 -1
- claude_mpm/agents/templates/web_ui.json +2 -2
- claude_mpm/cli/__init__.py +79 -51
- claude_mpm/cli/__main__.py +3 -2
- claude_mpm/cli/commands/__init__.py +20 -20
- claude_mpm/cli/commands/agents.py +279 -247
- claude_mpm/cli/commands/aggregate.py +138 -157
- claude_mpm/cli/commands/cleanup.py +147 -147
- claude_mpm/cli/commands/config.py +93 -76
- claude_mpm/cli/commands/info.py +17 -16
- claude_mpm/cli/commands/mcp.py +140 -905
- claude_mpm/cli/commands/mcp_command_router.py +139 -0
- claude_mpm/cli/commands/mcp_config_commands.py +20 -0
- claude_mpm/cli/commands/mcp_install_commands.py +20 -0
- claude_mpm/cli/commands/mcp_server_commands.py +175 -0
- claude_mpm/cli/commands/mcp_tool_commands.py +34 -0
- claude_mpm/cli/commands/memory.py +239 -203
- claude_mpm/cli/commands/monitor.py +203 -81
- claude_mpm/cli/commands/run.py +380 -429
- claude_mpm/cli/commands/run_config_checker.py +160 -0
- claude_mpm/cli/commands/socketio_monitor.py +235 -0
- claude_mpm/cli/commands/tickets.py +305 -197
- claude_mpm/cli/parser.py +24 -1156
- claude_mpm/cli/parsers/__init__.py +29 -0
- claude_mpm/cli/parsers/agents_parser.py +136 -0
- claude_mpm/cli/parsers/base_parser.py +331 -0
- claude_mpm/cli/parsers/config_parser.py +85 -0
- claude_mpm/cli/parsers/mcp_parser.py +152 -0
- claude_mpm/cli/parsers/memory_parser.py +138 -0
- claude_mpm/cli/parsers/monitor_parser.py +104 -0
- claude_mpm/cli/parsers/run_parser.py +147 -0
- claude_mpm/cli/parsers/tickets_parser.py +203 -0
- claude_mpm/cli/ticket_cli.py +7 -3
- claude_mpm/cli/utils.py +55 -37
- claude_mpm/cli_module/__init__.py +6 -6
- claude_mpm/cli_module/args.py +188 -140
- claude_mpm/cli_module/commands.py +79 -70
- claude_mpm/cli_module/migration_example.py +38 -60
- claude_mpm/config/__init__.py +32 -25
- claude_mpm/config/agent_config.py +151 -119
- claude_mpm/config/experimental_features.py +71 -73
- claude_mpm/config/paths.py +94 -208
- claude_mpm/config/socketio_config.py +84 -73
- claude_mpm/constants.py +35 -18
- claude_mpm/core/__init__.py +9 -6
- claude_mpm/core/agent_name_normalizer.py +68 -71
- claude_mpm/core/agent_registry.py +372 -521
- claude_mpm/core/agent_session_manager.py +74 -63
- claude_mpm/core/base_service.py +116 -87
- claude_mpm/core/cache.py +119 -153
- claude_mpm/core/claude_runner.py +425 -1120
- claude_mpm/core/config.py +263 -168
- claude_mpm/core/config_aliases.py +69 -61
- claude_mpm/core/config_constants.py +292 -0
- claude_mpm/core/constants.py +57 -99
- claude_mpm/core/container.py +211 -178
- claude_mpm/core/exceptions.py +233 -89
- claude_mpm/core/factories.py +92 -54
- claude_mpm/core/framework_loader.py +378 -220
- claude_mpm/core/hook_manager.py +198 -83
- claude_mpm/core/hook_performance_config.py +136 -0
- claude_mpm/core/injectable_service.py +61 -55
- claude_mpm/core/interactive_session.py +165 -155
- claude_mpm/core/interfaces.py +221 -195
- claude_mpm/core/lazy.py +96 -96
- claude_mpm/core/logger.py +133 -107
- claude_mpm/core/logging_config.py +185 -157
- claude_mpm/core/minimal_framework_loader.py +20 -15
- claude_mpm/core/mixins.py +30 -29
- claude_mpm/core/oneshot_session.py +215 -181
- claude_mpm/core/optimized_agent_loader.py +134 -138
- claude_mpm/core/optimized_startup.py +159 -157
- claude_mpm/core/pm_hook_interceptor.py +85 -72
- claude_mpm/core/service_registry.py +103 -101
- claude_mpm/core/session_manager.py +97 -87
- claude_mpm/core/socketio_pool.py +212 -158
- claude_mpm/core/tool_access_control.py +58 -51
- claude_mpm/core/types.py +46 -24
- claude_mpm/core/typing_utils.py +166 -82
- claude_mpm/core/unified_agent_registry.py +721 -0
- claude_mpm/core/unified_config.py +550 -0
- claude_mpm/core/unified_paths.py +549 -0
- claude_mpm/dashboard/index.html +1 -1
- claude_mpm/dashboard/open_dashboard.py +51 -17
- claude_mpm/dashboard/static/css/dashboard.css +27 -8
- claude_mpm/dashboard/static/dist/components/agent-inference.js +2 -0
- claude_mpm/dashboard/static/dist/components/event-processor.js +2 -0
- claude_mpm/dashboard/static/dist/components/event-viewer.js +2 -0
- claude_mpm/dashboard/static/dist/components/export-manager.js +2 -0
- claude_mpm/dashboard/static/dist/components/file-tool-tracker.js +2 -0
- claude_mpm/dashboard/static/dist/components/hud-library-loader.js +2 -0
- claude_mpm/dashboard/static/dist/components/hud-manager.js +2 -0
- claude_mpm/dashboard/static/dist/components/hud-visualizer.js +2 -0
- claude_mpm/dashboard/static/dist/components/module-viewer.js +2 -0
- claude_mpm/dashboard/static/dist/components/session-manager.js +2 -0
- claude_mpm/dashboard/static/dist/components/socket-manager.js +2 -0
- claude_mpm/dashboard/static/dist/components/ui-state-manager.js +2 -0
- claude_mpm/dashboard/static/dist/components/working-directory.js +2 -0
- claude_mpm/dashboard/static/dist/dashboard.js +2 -0
- claude_mpm/dashboard/static/dist/socket-client.js +2 -0
- claude_mpm/dashboard/static/js/components/agent-inference.js +80 -76
- claude_mpm/dashboard/static/js/components/event-processor.js +71 -67
- claude_mpm/dashboard/static/js/components/event-viewer.js +74 -70
- claude_mpm/dashboard/static/js/components/export-manager.js +31 -28
- claude_mpm/dashboard/static/js/components/file-tool-tracker.js +106 -92
- claude_mpm/dashboard/static/js/components/hud-library-loader.js +11 -11
- claude_mpm/dashboard/static/js/components/hud-manager.js +73 -73
- claude_mpm/dashboard/static/js/components/hud-visualizer.js +163 -163
- claude_mpm/dashboard/static/js/components/module-viewer.js +305 -233
- claude_mpm/dashboard/static/js/components/session-manager.js +32 -29
- claude_mpm/dashboard/static/js/components/socket-manager.js +27 -20
- claude_mpm/dashboard/static/js/components/ui-state-manager.js +21 -18
- claude_mpm/dashboard/static/js/components/working-directory.js +74 -71
- claude_mpm/dashboard/static/js/dashboard.js +178 -453
- claude_mpm/dashboard/static/js/extension-error-handler.js +164 -0
- claude_mpm/dashboard/static/js/socket-client.js +120 -54
- claude_mpm/dashboard/templates/index.html +40 -50
- claude_mpm/experimental/cli_enhancements.py +60 -58
- claude_mpm/generators/__init__.py +1 -1
- claude_mpm/generators/agent_profile_generator.py +75 -65
- claude_mpm/hooks/__init__.py +1 -1
- claude_mpm/hooks/base_hook.py +33 -28
- claude_mpm/hooks/claude_hooks/__init__.py +1 -1
- claude_mpm/hooks/claude_hooks/connection_pool.py +120 -0
- claude_mpm/hooks/claude_hooks/event_handlers.py +743 -0
- claude_mpm/hooks/claude_hooks/hook_handler.py +415 -1331
- claude_mpm/hooks/claude_hooks/hook_wrapper.sh +4 -4
- claude_mpm/hooks/claude_hooks/memory_integration.py +221 -0
- claude_mpm/hooks/claude_hooks/response_tracking.py +348 -0
- claude_mpm/hooks/claude_hooks/tool_analysis.py +230 -0
- claude_mpm/hooks/memory_integration_hook.py +140 -100
- claude_mpm/hooks/tool_call_interceptor.py +89 -76
- claude_mpm/hooks/validation_hooks.py +57 -49
- claude_mpm/init.py +145 -121
- claude_mpm/models/__init__.py +9 -9
- claude_mpm/models/agent_definition.py +33 -23
- claude_mpm/models/agent_session.py +228 -200
- claude_mpm/scripts/__init__.py +1 -1
- claude_mpm/scripts/socketio_daemon.py +192 -75
- claude_mpm/scripts/socketio_server_manager.py +328 -0
- claude_mpm/scripts/start_activity_logging.py +25 -22
- claude_mpm/services/__init__.py +68 -43
- claude_mpm/services/agent_capabilities_service.py +271 -0
- claude_mpm/services/agents/__init__.py +23 -32
- claude_mpm/services/agents/deployment/__init__.py +3 -3
- claude_mpm/services/agents/deployment/agent_config_provider.py +310 -0
- claude_mpm/services/agents/deployment/agent_configuration_manager.py +359 -0
- claude_mpm/services/agents/deployment/agent_definition_factory.py +84 -0
- claude_mpm/services/agents/deployment/agent_deployment.py +415 -2113
- claude_mpm/services/agents/deployment/agent_discovery_service.py +387 -0
- claude_mpm/services/agents/deployment/agent_environment_manager.py +293 -0
- claude_mpm/services/agents/deployment/agent_filesystem_manager.py +387 -0
- claude_mpm/services/agents/deployment/agent_format_converter.py +453 -0
- claude_mpm/services/agents/deployment/agent_frontmatter_validator.py +161 -0
- claude_mpm/services/agents/deployment/agent_lifecycle_manager.py +345 -495
- claude_mpm/services/agents/deployment/agent_metrics_collector.py +279 -0
- claude_mpm/services/agents/deployment/agent_restore_handler.py +88 -0
- claude_mpm/services/agents/deployment/agent_template_builder.py +406 -0
- claude_mpm/services/agents/deployment/agent_validator.py +352 -0
- claude_mpm/services/agents/deployment/agent_version_manager.py +313 -0
- claude_mpm/services/agents/deployment/agent_versioning.py +6 -9
- claude_mpm/services/agents/deployment/agents_directory_resolver.py +79 -0
- claude_mpm/services/agents/deployment/async_agent_deployment.py +298 -234
- claude_mpm/services/agents/deployment/config/__init__.py +13 -0
- claude_mpm/services/agents/deployment/config/deployment_config.py +182 -0
- claude_mpm/services/agents/deployment/config/deployment_config_manager.py +200 -0
- claude_mpm/services/agents/deployment/deployment_config_loader.py +54 -0
- claude_mpm/services/agents/deployment/deployment_type_detector.py +124 -0
- claude_mpm/services/agents/deployment/facade/__init__.py +18 -0
- claude_mpm/services/agents/deployment/facade/async_deployment_executor.py +159 -0
- claude_mpm/services/agents/deployment/facade/deployment_executor.py +73 -0
- claude_mpm/services/agents/deployment/facade/deployment_facade.py +270 -0
- claude_mpm/services/agents/deployment/facade/sync_deployment_executor.py +178 -0
- claude_mpm/services/agents/deployment/interface_adapter.py +227 -0
- claude_mpm/services/agents/deployment/lifecycle_health_checker.py +85 -0
- claude_mpm/services/agents/deployment/lifecycle_performance_tracker.py +100 -0
- claude_mpm/services/agents/deployment/pipeline/__init__.py +32 -0
- claude_mpm/services/agents/deployment/pipeline/pipeline_builder.py +158 -0
- claude_mpm/services/agents/deployment/pipeline/pipeline_context.py +159 -0
- claude_mpm/services/agents/deployment/pipeline/pipeline_executor.py +169 -0
- claude_mpm/services/agents/deployment/pipeline/steps/__init__.py +19 -0
- claude_mpm/services/agents/deployment/pipeline/steps/agent_processing_step.py +195 -0
- claude_mpm/services/agents/deployment/pipeline/steps/base_step.py +119 -0
- claude_mpm/services/agents/deployment/pipeline/steps/configuration_step.py +79 -0
- claude_mpm/services/agents/deployment/pipeline/steps/target_directory_step.py +90 -0
- claude_mpm/services/agents/deployment/pipeline/steps/validation_step.py +100 -0
- claude_mpm/services/agents/deployment/processors/__init__.py +15 -0
- claude_mpm/services/agents/deployment/processors/agent_deployment_context.py +98 -0
- claude_mpm/services/agents/deployment/processors/agent_deployment_result.py +235 -0
- claude_mpm/services/agents/deployment/processors/agent_processor.py +258 -0
- claude_mpm/services/agents/deployment/refactored_agent_deployment_service.py +318 -0
- claude_mpm/services/agents/deployment/results/__init__.py +13 -0
- claude_mpm/services/agents/deployment/results/deployment_metrics.py +200 -0
- claude_mpm/services/agents/deployment/results/deployment_result_builder.py +249 -0
- claude_mpm/services/agents/deployment/strategies/__init__.py +25 -0
- claude_mpm/services/agents/deployment/strategies/base_strategy.py +119 -0
- claude_mpm/services/agents/deployment/strategies/project_strategy.py +150 -0
- claude_mpm/services/agents/deployment/strategies/strategy_selector.py +117 -0
- claude_mpm/services/agents/deployment/strategies/system_strategy.py +116 -0
- claude_mpm/services/agents/deployment/strategies/user_strategy.py +137 -0
- claude_mpm/services/agents/deployment/system_instructions_deployer.py +108 -0
- claude_mpm/services/agents/deployment/validation/__init__.py +19 -0
- claude_mpm/services/agents/deployment/validation/agent_validator.py +323 -0
- claude_mpm/services/agents/deployment/validation/deployment_validator.py +238 -0
- claude_mpm/services/agents/deployment/validation/template_validator.py +299 -0
- claude_mpm/services/agents/deployment/validation/validation_result.py +226 -0
- claude_mpm/services/agents/loading/__init__.py +2 -2
- claude_mpm/services/agents/loading/agent_profile_loader.py +259 -229
- claude_mpm/services/agents/loading/base_agent_manager.py +90 -81
- claude_mpm/services/agents/loading/framework_agent_loader.py +154 -129
- claude_mpm/services/agents/management/__init__.py +2 -2
- claude_mpm/services/agents/management/agent_capabilities_generator.py +72 -58
- claude_mpm/services/agents/management/agent_management_service.py +209 -156
- claude_mpm/services/agents/memory/__init__.py +9 -6
- claude_mpm/services/agents/memory/agent_memory_manager.py +218 -1152
- claude_mpm/services/agents/memory/agent_persistence_service.py +20 -16
- claude_mpm/services/agents/memory/analyzer.py +430 -0
- claude_mpm/services/agents/memory/content_manager.py +376 -0
- claude_mpm/services/agents/memory/template_generator.py +468 -0
- claude_mpm/services/agents/registry/__init__.py +7 -10
- claude_mpm/services/agents/registry/deployed_agent_discovery.py +122 -97
- claude_mpm/services/agents/registry/modification_tracker.py +351 -285
- claude_mpm/services/async_session_logger.py +187 -153
- claude_mpm/services/claude_session_logger.py +87 -72
- claude_mpm/services/command_handler_service.py +217 -0
- claude_mpm/services/communication/__init__.py +3 -2
- claude_mpm/services/core/__init__.py +50 -97
- claude_mpm/services/core/base.py +60 -53
- claude_mpm/services/core/interfaces/__init__.py +188 -0
- claude_mpm/services/core/interfaces/agent.py +351 -0
- claude_mpm/services/core/interfaces/communication.py +343 -0
- claude_mpm/services/core/interfaces/infrastructure.py +413 -0
- claude_mpm/services/core/interfaces/service.py +434 -0
- claude_mpm/services/core/interfaces.py +19 -944
- claude_mpm/services/event_aggregator.py +208 -170
- claude_mpm/services/exceptions.py +387 -308
- claude_mpm/services/framework_claude_md_generator/__init__.py +75 -79
- claude_mpm/services/framework_claude_md_generator/content_assembler.py +69 -60
- claude_mpm/services/framework_claude_md_generator/content_validator.py +65 -61
- claude_mpm/services/framework_claude_md_generator/deployment_manager.py +68 -49
- claude_mpm/services/framework_claude_md_generator/section_generators/__init__.py +34 -34
- claude_mpm/services/framework_claude_md_generator/section_generators/agents.py +25 -22
- claude_mpm/services/framework_claude_md_generator/section_generators/claude_pm_init.py +10 -10
- claude_mpm/services/framework_claude_md_generator/section_generators/core_responsibilities.py +4 -3
- claude_mpm/services/framework_claude_md_generator/section_generators/delegation_constraints.py +4 -3
- claude_mpm/services/framework_claude_md_generator/section_generators/environment_config.py +4 -3
- claude_mpm/services/framework_claude_md_generator/section_generators/footer.py +6 -5
- claude_mpm/services/framework_claude_md_generator/section_generators/header.py +8 -7
- claude_mpm/services/framework_claude_md_generator/section_generators/orchestration_principles.py +4 -3
- claude_mpm/services/framework_claude_md_generator/section_generators/role_designation.py +6 -5
- claude_mpm/services/framework_claude_md_generator/section_generators/subprocess_validation.py +9 -8
- claude_mpm/services/framework_claude_md_generator/section_generators/todo_task_tools.py +4 -3
- claude_mpm/services/framework_claude_md_generator/section_generators/troubleshooting.py +5 -4
- claude_mpm/services/framework_claude_md_generator/section_manager.py +28 -27
- claude_mpm/services/framework_claude_md_generator/version_manager.py +30 -28
- claude_mpm/services/hook_service.py +106 -114
- claude_mpm/services/infrastructure/__init__.py +7 -5
- claude_mpm/services/infrastructure/context_preservation.py +233 -199
- claude_mpm/services/infrastructure/daemon_manager.py +279 -0
- claude_mpm/services/infrastructure/logging.py +83 -76
- claude_mpm/services/infrastructure/monitoring.py +547 -404
- claude_mpm/services/mcp_gateway/__init__.py +30 -13
- claude_mpm/services/mcp_gateway/config/__init__.py +2 -2
- claude_mpm/services/mcp_gateway/config/config_loader.py +61 -56
- claude_mpm/services/mcp_gateway/config/config_schema.py +50 -41
- claude_mpm/services/mcp_gateway/config/configuration.py +82 -75
- claude_mpm/services/mcp_gateway/core/__init__.py +13 -20
- claude_mpm/services/mcp_gateway/core/base.py +80 -67
- claude_mpm/services/mcp_gateway/core/exceptions.py +60 -46
- claude_mpm/services/mcp_gateway/core/interfaces.py +87 -84
- claude_mpm/services/mcp_gateway/main.py +287 -137
- claude_mpm/services/mcp_gateway/registry/__init__.py +1 -1
- claude_mpm/services/mcp_gateway/registry/service_registry.py +97 -94
- claude_mpm/services/mcp_gateway/registry/tool_registry.py +135 -126
- claude_mpm/services/mcp_gateway/server/__init__.py +2 -2
- claude_mpm/services/mcp_gateway/server/mcp_gateway.py +105 -110
- claude_mpm/services/mcp_gateway/server/stdio_handler.py +105 -107
- claude_mpm/services/mcp_gateway/server/stdio_server.py +691 -0
- claude_mpm/services/mcp_gateway/tools/__init__.py +4 -2
- claude_mpm/services/mcp_gateway/tools/base_adapter.py +109 -119
- claude_mpm/services/mcp_gateway/tools/document_summarizer.py +283 -215
- claude_mpm/services/mcp_gateway/tools/hello_world.py +122 -120
- claude_mpm/services/mcp_gateway/tools/ticket_tools.py +652 -0
- claude_mpm/services/mcp_gateway/tools/unified_ticket_tool.py +606 -0
- claude_mpm/services/memory/__init__.py +2 -2
- claude_mpm/services/memory/builder.py +451 -362
- claude_mpm/services/memory/cache/__init__.py +2 -2
- claude_mpm/services/memory/cache/shared_prompt_cache.py +232 -194
- claude_mpm/services/memory/cache/simple_cache.py +107 -93
- claude_mpm/services/memory/indexed_memory.py +195 -193
- claude_mpm/services/memory/optimizer.py +267 -234
- claude_mpm/services/memory/router.py +571 -263
- claude_mpm/services/memory_hook_service.py +237 -0
- claude_mpm/services/port_manager.py +223 -0
- claude_mpm/services/project/__init__.py +3 -3
- claude_mpm/services/project/analyzer.py +451 -305
- claude_mpm/services/project/registry.py +262 -240
- claude_mpm/services/recovery_manager.py +287 -231
- claude_mpm/services/response_tracker.py +87 -67
- claude_mpm/services/runner_configuration_service.py +587 -0
- claude_mpm/services/session_management_service.py +304 -0
- claude_mpm/services/socketio/__init__.py +4 -4
- claude_mpm/services/socketio/client_proxy.py +174 -0
- claude_mpm/services/socketio/handlers/__init__.py +3 -3
- claude_mpm/services/socketio/handlers/base.py +44 -30
- claude_mpm/services/socketio/handlers/connection.py +145 -65
- claude_mpm/services/socketio/handlers/file.py +123 -108
- claude_mpm/services/socketio/handlers/git.py +607 -373
- claude_mpm/services/socketio/handlers/hook.py +170 -0
- claude_mpm/services/socketio/handlers/memory.py +4 -4
- claude_mpm/services/socketio/handlers/project.py +4 -4
- claude_mpm/services/socketio/handlers/registry.py +53 -38
- claude_mpm/services/socketio/server/__init__.py +18 -0
- claude_mpm/services/socketio/server/broadcaster.py +252 -0
- claude_mpm/services/socketio/server/core.py +399 -0
- claude_mpm/services/socketio/server/main.py +323 -0
- claude_mpm/services/socketio_client_manager.py +160 -133
- claude_mpm/services/socketio_server.py +36 -1885
- claude_mpm/services/subprocess_launcher_service.py +316 -0
- claude_mpm/services/system_instructions_service.py +258 -0
- claude_mpm/services/ticket_manager.py +19 -533
- claude_mpm/services/utility_service.py +285 -0
- claude_mpm/services/version_control/__init__.py +18 -21
- claude_mpm/services/version_control/branch_strategy.py +20 -10
- claude_mpm/services/version_control/conflict_resolution.py +37 -13
- claude_mpm/services/version_control/git_operations.py +52 -21
- claude_mpm/services/version_control/semantic_versioning.py +92 -53
- claude_mpm/services/version_control/version_parser.py +145 -125
- claude_mpm/services/version_service.py +270 -0
- claude_mpm/storage/__init__.py +2 -2
- claude_mpm/storage/state_storage.py +177 -181
- claude_mpm/ticket_wrapper.py +2 -2
- claude_mpm/utils/__init__.py +2 -2
- claude_mpm/utils/agent_dependency_loader.py +453 -243
- claude_mpm/utils/config_manager.py +157 -118
- claude_mpm/utils/console.py +1 -1
- claude_mpm/utils/dependency_cache.py +102 -107
- claude_mpm/utils/dependency_manager.py +52 -47
- claude_mpm/utils/dependency_strategies.py +131 -96
- claude_mpm/utils/environment_context.py +110 -102
- claude_mpm/utils/error_handler.py +75 -55
- claude_mpm/utils/file_utils.py +80 -67
- claude_mpm/utils/framework_detection.py +12 -11
- claude_mpm/utils/import_migration_example.py +12 -60
- claude_mpm/utils/imports.py +48 -45
- claude_mpm/utils/path_operations.py +100 -93
- claude_mpm/utils/robust_installer.py +172 -164
- claude_mpm/utils/session_logging.py +30 -23
- claude_mpm/utils/subprocess_utils.py +99 -61
- claude_mpm/validation/__init__.py +1 -1
- claude_mpm/validation/agent_validator.py +151 -111
- claude_mpm/validation/frontmatter_validator.py +92 -71
- {claude_mpm-3.9.11.dist-info → claude_mpm-4.0.3.dist-info}/METADATA +27 -1
- claude_mpm-4.0.3.dist-info/RECORD +402 -0
- {claude_mpm-3.9.11.dist-info → claude_mpm-4.0.3.dist-info}/entry_points.txt +1 -0
- {claude_mpm-3.9.11.dist-info → claude_mpm-4.0.3.dist-info}/licenses/LICENSE +1 -1
- claude_mpm/cli/commands/run_guarded.py +0 -511
- claude_mpm/config/memory_guardian_config.py +0 -325
- claude_mpm/config/memory_guardian_yaml.py +0 -335
- claude_mpm/core/config_paths.py +0 -150
- claude_mpm/core/memory_aware_runner.py +0 -353
- claude_mpm/dashboard/static/js/dashboard-original.js +0 -4134
- claude_mpm/deployment_paths.py +0 -261
- claude_mpm/hooks/claude_hooks/hook_handler_fixed.py +0 -454
- claude_mpm/models/state_models.py +0 -433
- claude_mpm/services/agent/__init__.py +0 -24
- claude_mpm/services/agent/deployment.py +0 -2548
- claude_mpm/services/agent/management.py +0 -598
- claude_mpm/services/agent/registry.py +0 -813
- claude_mpm/services/agents/registry/agent_registry.py +0 -813
- claude_mpm/services/communication/socketio.py +0 -1935
- claude_mpm/services/communication/websocket.py +0 -479
- claude_mpm/services/framework_claude_md_generator.py +0 -624
- claude_mpm/services/health_monitor.py +0 -893
- claude_mpm/services/infrastructure/graceful_degradation.py +0 -616
- claude_mpm/services/infrastructure/health_monitor.py +0 -775
- claude_mpm/services/infrastructure/memory_dashboard.py +0 -479
- claude_mpm/services/infrastructure/memory_guardian.py +0 -944
- claude_mpm/services/infrastructure/restart_protection.py +0 -642
- claude_mpm/services/infrastructure/state_manager.py +0 -774
- claude_mpm/services/mcp_gateway/manager.py +0 -334
- claude_mpm/services/optimized_hook_service.py +0 -542
- claude_mpm/services/project_analyzer.py +0 -864
- claude_mpm/services/project_registry.py +0 -608
- claude_mpm/services/standalone_socketio_server.py +0 -1300
- claude_mpm/services/ticket_manager_di.py +0 -318
- claude_mpm/services/ticketing_service_original.py +0 -510
- claude_mpm/utils/paths.py +0 -395
- claude_mpm/utils/platform_memory.py +0 -524
- claude_mpm-3.9.11.dist-info/RECORD +0 -306
- {claude_mpm-3.9.11.dist-info → claude_mpm-4.0.3.dist-info}/WHEEL +0 -0
- {claude_mpm-3.9.11.dist-info → claude_mpm-4.0.3.dist-info}/top_level.txt +0 -0
| @@ -1,3 +1,5 @@ | |
| 1 | 
            +
            from pathlib import Path
         | 
| 2 | 
            +
             | 
| 1 3 | 
             
            """
         | 
| 2 4 | 
             
            MCP Gateway Main Entry Point
         | 
| 3 5 | 
             
            =============================
         | 
| @@ -8,135 +10,270 @@ Orchestrates server initialization, tool registration, and lifecycle management. | |
| 8 10 | 
             
            Part of ISS-0035: MCP Server Implementation - Core Server and Tool Registry
         | 
| 9 11 | 
             
            """
         | 
| 10 12 |  | 
| 11 | 
            -
            import asyncio
         | 
| 12 | 
            -
            import sys
         | 
| 13 | 
            -
            import signal
         | 
| 14 | 
            -
            from pathlib import Path
         | 
| 15 | 
            -
            from typing import Optional, List
         | 
| 16 13 | 
             
            import argparse
         | 
| 14 | 
            +
            import asyncio
         | 
| 17 15 | 
             
            import logging
         | 
| 16 | 
            +
            import signal
         | 
| 17 | 
            +
            import sys
         | 
| 18 | 
            +
            from typing import List, Optional
         | 
| 19 | 
            +
             | 
| 20 | 
            +
            # Import with fallback handling for missing dependencies
         | 
| 21 | 
            +
            try:
         | 
| 22 | 
            +
                from claude_mpm.core.logger import get_logger
         | 
| 23 | 
            +
            except ImportError:
         | 
| 24 | 
            +
                import logging
         | 
| 25 | 
            +
             | 
| 26 | 
            +
                def get_logger(name):
         | 
| 27 | 
            +
                    return logging.getLogger(name)
         | 
| 28 | 
            +
             | 
| 29 | 
            +
             | 
| 30 | 
            +
            try:
         | 
| 31 | 
            +
                from claude_mpm.services.mcp_gateway.config.configuration import MCPConfiguration
         | 
| 32 | 
            +
            except ImportError:
         | 
| 33 | 
            +
                # Fallback configuration class
         | 
| 34 | 
            +
                class MCPConfiguration:
         | 
| 35 | 
            +
                    def __init__(self):
         | 
| 36 | 
            +
                        self.config = {}
         | 
| 37 | 
            +
             | 
| 38 | 
            +
                    def load_config(self, path):
         | 
| 39 | 
            +
                        return True
         | 
| 40 | 
            +
             | 
| 41 | 
            +
                    def get(self, key, default=None):
         | 
| 42 | 
            +
                        return default
         | 
| 43 | 
            +
             | 
| 44 | 
            +
             | 
| 45 | 
            +
            try:
         | 
| 46 | 
            +
                from claude_mpm.services.mcp_gateway.registry.tool_registry import ToolRegistry
         | 
| 47 | 
            +
            except ImportError:
         | 
| 48 | 
            +
                # Minimal fallback registry
         | 
| 49 | 
            +
                class ToolRegistry:
         | 
| 50 | 
            +
                    def __init__(self):
         | 
| 51 | 
            +
                        self.tools = []
         | 
| 52 | 
            +
             | 
| 53 | 
            +
                    async def initialize(self):
         | 
| 54 | 
            +
                        return True
         | 
| 55 | 
            +
             | 
| 56 | 
            +
                    def register_tool(self, tool, category="builtin"):
         | 
| 57 | 
            +
                        return True
         | 
| 58 | 
            +
             | 
| 59 | 
            +
                    async def shutdown(self):
         | 
| 60 | 
            +
                        pass
         | 
| 61 | 
            +
             | 
| 62 | 
            +
             | 
| 63 | 
            +
            try:
         | 
| 64 | 
            +
                from claude_mpm.services.mcp_gateway.server.mcp_gateway import MCPGateway
         | 
| 65 | 
            +
            except ImportError as e:
         | 
| 66 | 
            +
                raise ImportError(f"Critical: Cannot import MCPGateway server: {e}")
         | 
| 67 | 
            +
             | 
| 68 | 
            +
            try:
         | 
| 69 | 
            +
                from claude_mpm.services.mcp_gateway.server.stdio_handler import StdioHandler
         | 
| 70 | 
            +
            except ImportError:
         | 
| 71 | 
            +
                # Fallback stdio handler
         | 
| 72 | 
            +
                class StdioHandler:
         | 
| 73 | 
            +
                    async def initialize(self):
         | 
| 74 | 
            +
                        return True
         | 
| 75 | 
            +
             | 
| 76 | 
            +
                    async def shutdown(self):
         | 
| 77 | 
            +
                        pass
         | 
| 78 | 
            +
             | 
| 79 | 
            +
             | 
| 80 | 
            +
            # Import tools with individual fallbacks
         | 
| 81 | 
            +
            try:
         | 
| 82 | 
            +
                from claude_mpm.services.mcp_gateway.tools.base_adapter import (
         | 
| 83 | 
            +
                    CalculatorToolAdapter,
         | 
| 84 | 
            +
                    EchoToolAdapter,
         | 
| 85 | 
            +
                    SystemInfoToolAdapter,
         | 
| 86 | 
            +
                )
         | 
| 87 | 
            +
            except ImportError:
         | 
| 88 | 
            +
                # Create dummy tool adapters
         | 
| 89 | 
            +
                class BaseToolAdapter:
         | 
| 90 | 
            +
                    def __init__(self):
         | 
| 91 | 
            +
                        pass
         | 
| 92 | 
            +
             | 
| 93 | 
            +
                    async def initialize(self):
         | 
| 94 | 
            +
                        return True
         | 
| 18 95 |  | 
| 19 | 
            -
             | 
| 20 | 
            -
             | 
| 21 | 
            -
             | 
| 22 | 
            -
             | 
| 23 | 
            -
                EchoToolAdapter | 
| 24 | 
            -
                 | 
| 25 | 
            -
             | 
| 26 | 
            -
             | 
| 27 | 
            -
            from claude_mpm.services.mcp_gateway.tools.document_summarizer import  | 
| 28 | 
            -
             | 
| 29 | 
            -
             | 
| 30 | 
            -
             | 
| 31 | 
            -
             | 
| 32 | 
            -
             | 
| 33 | 
            -
             | 
| 96 | 
            +
                    def get_definition(self):
         | 
| 97 | 
            +
                        return type("ToolDef", (), {"name": "unknown"})
         | 
| 98 | 
            +
             | 
| 99 | 
            +
                CalculatorToolAdapter = BaseToolAdapter
         | 
| 100 | 
            +
                EchoToolAdapter = BaseToolAdapter
         | 
| 101 | 
            +
                SystemInfoToolAdapter = BaseToolAdapter
         | 
| 102 | 
            +
             | 
| 103 | 
            +
            try:
         | 
| 104 | 
            +
                from claude_mpm.services.mcp_gateway.tools.document_summarizer import (
         | 
| 105 | 
            +
                    DocumentSummarizerTool,
         | 
| 106 | 
            +
                )
         | 
| 107 | 
            +
            except ImportError:
         | 
| 108 | 
            +
                DocumentSummarizerTool = None
         | 
| 109 | 
            +
             | 
| 110 | 
            +
            try:
         | 
| 111 | 
            +
                from claude_mpm.services.mcp_gateway.tools.unified_ticket_tool import (
         | 
| 112 | 
            +
                    UnifiedTicketTool,
         | 
| 113 | 
            +
                )
         | 
| 114 | 
            +
            except ImportError:
         | 
| 115 | 
            +
                # Unified ticket tool is optional
         | 
| 116 | 
            +
                UnifiedTicketTool = None
         | 
| 117 | 
            +
             | 
| 118 | 
            +
            # Manager module removed - using simplified architecture
         | 
| 119 | 
            +
             | 
| 120 | 
            +
             | 
| 121 | 
            +
            class MCPGatewayOrchestrator:
         | 
| 34 122 | 
             
                """
         | 
| 35 123 | 
             
                Main MCP Gateway orchestrator.
         | 
| 36 | 
            -
             | 
| 124 | 
            +
             | 
| 37 125 | 
             
                WHY: This class coordinates all MCP components, managing their lifecycle
         | 
| 38 126 | 
             
                and ensuring proper initialization, startup, and shutdown sequences.
         | 
| 39 | 
            -
             | 
| 127 | 
            +
             | 
| 40 128 | 
             
                DESIGN DECISIONS:
         | 
| 41 129 | 
             
                - Use dependency injection to wire components together
         | 
| 42 130 | 
             
                - Implement graceful shutdown on SIGINT/SIGTERM
         | 
| 43 131 | 
             
                - Support both configuration file and CLI arguments
         | 
| 44 132 | 
             
                - Provide comprehensive logging for debugging
         | 
| 133 | 
            +
                - Renamed from MCPGateway to avoid naming conflict with server class
         | 
| 45 134 | 
             
                """
         | 
| 46 | 
            -
             | 
| 135 | 
            +
             | 
| 47 136 | 
             
                def __init__(self, config_path: Optional[Path] = None):
         | 
| 48 137 | 
             
                    """
         | 
| 49 138 | 
             
                    Initialize the MCP Gateway.
         | 
| 50 | 
            -
             | 
| 139 | 
            +
             | 
| 51 140 | 
             
                    Args:
         | 
| 52 141 | 
             
                        config_path: Optional path to configuration file
         | 
| 53 142 | 
             
                    """
         | 
| 54 143 | 
             
                    self.logger = get_logger(self.__class__.__name__)
         | 
| 55 144 | 
             
                    self.config_path = config_path
         | 
| 56 | 
            -
             | 
| 145 | 
            +
             | 
| 57 146 | 
             
                    # Core components
         | 
| 58 | 
            -
                    self.server: Optional[ | 
| 147 | 
            +
                    self.server: Optional[MCPGateway] = None
         | 
| 59 148 | 
             
                    self.registry: Optional[ToolRegistry] = None
         | 
| 60 149 | 
             
                    self.communication: Optional[StdioHandler] = None
         | 
| 61 150 | 
             
                    self.configuration: Optional[MCPConfiguration] = None
         | 
| 62 | 
            -
             | 
| 151 | 
            +
             | 
| 63 152 | 
             
                    # Shutdown handling
         | 
| 64 153 | 
             
                    self._shutdown_event = asyncio.Event()
         | 
| 65 154 | 
             
                    self._setup_signal_handlers()
         | 
| 66 | 
            -
             | 
| 155 | 
            +
             | 
| 67 156 | 
             
                def _setup_signal_handlers(self) -> None:
         | 
| 68 157 | 
             
                    """Setup signal handlers for graceful shutdown."""
         | 
| 158 | 
            +
             | 
| 69 159 | 
             
                    def signal_handler(sig, frame):
         | 
| 70 160 | 
             
                        self.logger.info(f"Received signal {sig}, initiating shutdown...")
         | 
| 71 161 | 
             
                        self._shutdown_event.set()
         | 
| 72 | 
            -
             | 
| 162 | 
            +
             | 
| 73 163 | 
             
                    signal.signal(signal.SIGINT, signal_handler)
         | 
| 74 164 | 
             
                    signal.signal(signal.SIGTERM, signal_handler)
         | 
| 75 | 
            -
             | 
| 165 | 
            +
             | 
| 76 166 | 
             
                async def initialize(self) -> bool:
         | 
| 77 167 | 
             
                    """
         | 
| 78 168 | 
             
                    Initialize all MCP Gateway components.
         | 
| 79 | 
            -
             | 
| 169 | 
            +
             | 
| 80 170 | 
             
                    Returns:
         | 
| 81 171 | 
             
                        True if initialization successful
         | 
| 82 172 | 
             
                    """
         | 
| 83 173 | 
             
                    try:
         | 
| 84 174 | 
             
                        self.logger.info("Initializing MCP Gateway")
         | 
| 85 | 
            -
             | 
| 175 | 
            +
             | 
| 86 176 | 
             
                        # Load configuration
         | 
| 87 177 | 
             
                        self.configuration = MCPConfiguration()
         | 
| 88 178 | 
             
                        if self.config_path and self.config_path.exists():
         | 
| 89 179 | 
             
                            if not self.configuration.load_config(self.config_path):
         | 
| 90 180 | 
             
                                self.logger.error("Failed to load configuration")
         | 
| 91 181 | 
             
                                return False
         | 
| 92 | 
            -
             | 
| 93 | 
            -
                        # Initialize tool registry
         | 
| 94 | 
            -
                         | 
| 95 | 
            -
             | 
| 96 | 
            -
                            self. | 
| 97 | 
            -
             | 
| 98 | 
            -
             | 
| 99 | 
            -
             | 
| 100 | 
            -
                         | 
| 101 | 
            -
             | 
| 102 | 
            -
             | 
| 103 | 
            -
             | 
| 104 | 
            -
                        if  | 
| 105 | 
            -
             | 
| 106 | 
            -
                             | 
| 107 | 
            -
             | 
| 108 | 
            -
             | 
| 182 | 
            +
             | 
| 183 | 
            +
                        # Initialize tool registry with error handling
         | 
| 184 | 
            +
                        try:
         | 
| 185 | 
            +
                            self.registry = ToolRegistry()
         | 
| 186 | 
            +
                            if not await self.registry.initialize():
         | 
| 187 | 
            +
                                self.logger.error("Failed to initialize tool registry")
         | 
| 188 | 
            +
                                # Continue anyway - server can run without tools
         | 
| 189 | 
            +
                                self.registry = None
         | 
| 190 | 
            +
                        except Exception as e:
         | 
| 191 | 
            +
                            self.logger.warning(f"Tool registry initialization failed: {e}")
         | 
| 192 | 
            +
                            self.registry = None
         | 
| 193 | 
            +
             | 
| 194 | 
            +
                        # Register built-in tools if registry is available
         | 
| 195 | 
            +
                        if self.registry:
         | 
| 196 | 
            +
                            try:
         | 
| 197 | 
            +
                                await self._register_builtin_tools()
         | 
| 198 | 
            +
                            except Exception as e:
         | 
| 199 | 
            +
                                self.logger.warning(f"Failed to register some tools: {e}")
         | 
| 200 | 
            +
                                # Continue - server can run with partial tools
         | 
| 201 | 
            +
             | 
| 202 | 
            +
                        # Initialize communication handler with fallback
         | 
| 203 | 
            +
                        try:
         | 
| 204 | 
            +
                            self.communication = StdioHandler()
         | 
| 205 | 
            +
                            if not await self.communication.initialize():
         | 
| 206 | 
            +
                                self.logger.warning("Failed to initialize communication handler")
         | 
| 207 | 
            +
                                # Communication is optional for the server
         | 
| 208 | 
            +
                                self.communication = None
         | 
| 209 | 
            +
                        except Exception as e:
         | 
| 210 | 
            +
                            self.logger.warning(f"Communication handler initialization failed: {e}")
         | 
| 211 | 
            +
                            self.communication = None
         | 
| 212 | 
            +
             | 
| 213 | 
            +
                        # Initialize MCP gateway server
         | 
| 109 214 | 
             
                        gateway_name = self.configuration.get("server.name", "claude-mpm-mcp")
         | 
| 110 215 | 
             
                        version = self.configuration.get("server.version", "1.0.0")
         | 
| 111 216 | 
             
                        self.server = MCPGateway(gateway_name=gateway_name, version=version)
         | 
| 112 | 
            -
             | 
| 113 | 
            -
                        # Wire dependencies
         | 
| 114 | 
            -
                        self. | 
| 115 | 
            -
             | 
| 116 | 
            -
                        
         | 
| 217 | 
            +
             | 
| 218 | 
            +
                        # Wire dependencies (only if available)
         | 
| 219 | 
            +
                        if self.registry:
         | 
| 220 | 
            +
                            self.server.set_tool_registry(self.registry)
         | 
| 221 | 
            +
                        else:
         | 
| 222 | 
            +
                            self.logger.warning("Running without tool registry")
         | 
| 223 | 
            +
             | 
| 224 | 
            +
                        if self.communication:
         | 
| 225 | 
            +
                            self.server.set_communication(self.communication)
         | 
| 226 | 
            +
                        else:
         | 
| 227 | 
            +
                            self.logger.info("Running without custom communication handler")
         | 
| 228 | 
            +
             | 
| 117 229 | 
             
                        if not await self.server.initialize():
         | 
| 118 230 | 
             
                            self.logger.error("Failed to initialize MCP server")
         | 
| 119 231 | 
             
                            return False
         | 
| 120 | 
            -
             | 
| 232 | 
            +
             | 
| 121 233 | 
             
                        self.logger.info("MCP Gateway initialized successfully")
         | 
| 122 234 | 
             
                        return True
         | 
| 123 | 
            -
             | 
| 235 | 
            +
             | 
| 124 236 | 
             
                    except Exception as e:
         | 
| 125 237 | 
             
                        self.logger.error(f"Failed to initialize MCP Gateway: {e}")
         | 
| 126 238 | 
             
                        return False
         | 
| 127 | 
            -
             | 
| 239 | 
            +
             | 
| 128 240 | 
             
                async def _register_builtin_tools(self) -> None:
         | 
| 129 241 | 
             
                    """Register built-in tools with the registry."""
         | 
| 130 242 | 
             
                    self.logger.info("Registering built-in tools")
         | 
| 131 | 
            -
             | 
| 132 | 
            -
                    # Create tool adapters
         | 
| 133 | 
            -
                    tools = [
         | 
| 134 | 
            -
             | 
| 135 | 
            -
             | 
| 136 | 
            -
             | 
| 137 | 
            -
                         | 
| 138 | 
            -
             | 
| 139 | 
            -
             | 
| 243 | 
            +
             | 
| 244 | 
            +
                    # Create tool adapters (only include available tools)
         | 
| 245 | 
            +
                    tools = []
         | 
| 246 | 
            +
             | 
| 247 | 
            +
                    # Always include basic tools
         | 
| 248 | 
            +
                    try:
         | 
| 249 | 
            +
                        tools.extend(
         | 
| 250 | 
            +
                            [
         | 
| 251 | 
            +
                                EchoToolAdapter(),
         | 
| 252 | 
            +
                                CalculatorToolAdapter(),
         | 
| 253 | 
            +
                                SystemInfoToolAdapter(),
         | 
| 254 | 
            +
                            ]
         | 
| 255 | 
            +
                        )
         | 
| 256 | 
            +
                    except Exception as e:
         | 
| 257 | 
            +
                        self.logger.warning(f"Could not load basic tools: {e}")
         | 
| 258 | 
            +
             | 
| 259 | 
            +
                    # Optional: Document summarizer
         | 
| 260 | 
            +
                    if DocumentSummarizerTool is not None:
         | 
| 261 | 
            +
                        try:
         | 
| 262 | 
            +
                            tools.append(DocumentSummarizerTool())
         | 
| 263 | 
            +
                        except Exception as e:
         | 
| 264 | 
            +
                            self.logger.warning(f"Could not load document summarizer: {e}")
         | 
| 265 | 
            +
             | 
| 266 | 
            +
                    # Optional: Unified ticket management tool
         | 
| 267 | 
            +
                    if UnifiedTicketTool is not None:
         | 
| 268 | 
            +
                        try:
         | 
| 269 | 
            +
                            tools.append(UnifiedTicketTool())
         | 
| 270 | 
            +
                        except Exception as e:
         | 
| 271 | 
            +
                            self.logger.warning(f"Could not load unified ticket tool: {e}")
         | 
| 272 | 
            +
             | 
| 273 | 
            +
                    if not tools:
         | 
| 274 | 
            +
                        self.logger.warning("No tools available to register")
         | 
| 275 | 
            +
                        return
         | 
| 276 | 
            +
             | 
| 140 277 | 
             
                    # Register each tool
         | 
| 141 278 | 
             
                    for tool in tools:
         | 
| 142 279 | 
             
                        try:
         | 
| @@ -144,76 +281,90 @@ class MCPGateway: | |
| 144 281 | 
             
                            if await tool.initialize():
         | 
| 145 282 | 
             
                                # Register with the registry
         | 
| 146 283 | 
             
                                if self.registry.register_tool(tool, category="builtin"):
         | 
| 147 | 
            -
                                    self.logger.info( | 
| 284 | 
            +
                                    self.logger.info(
         | 
| 285 | 
            +
                                        f"Registered tool: {tool.get_definition().name}"
         | 
| 286 | 
            +
                                    )
         | 
| 148 287 | 
             
                                else:
         | 
| 149 | 
            -
                                    self.logger.warning( | 
| 288 | 
            +
                                    self.logger.warning(
         | 
| 289 | 
            +
                                        f"Failed to register tool: {tool.get_definition().name}"
         | 
| 290 | 
            +
                                    )
         | 
| 150 291 | 
             
                            else:
         | 
| 151 | 
            -
                                self.logger.warning( | 
| 292 | 
            +
                                self.logger.warning(
         | 
| 293 | 
            +
                                    f"Failed to initialize tool: {tool.get_definition().name}"
         | 
| 294 | 
            +
                                )
         | 
| 152 295 | 
             
                        except Exception as e:
         | 
| 153 | 
            -
                            self.logger.error( | 
| 154 | 
            -
             | 
| 296 | 
            +
                            self.logger.error(
         | 
| 297 | 
            +
                                f"Error registering tool {tool.get_definition().name}: {e}"
         | 
| 298 | 
            +
                            )
         | 
| 299 | 
            +
             | 
| 155 300 | 
             
                async def start(self) -> bool:
         | 
| 156 301 | 
             
                    """
         | 
| 157 302 | 
             
                    Start the MCP Gateway server.
         | 
| 158 | 
            -
             | 
| 303 | 
            +
             | 
| 159 304 | 
             
                    Returns:
         | 
| 160 305 | 
             
                        True if startup successful
         | 
| 161 306 | 
             
                    """
         | 
| 162 307 | 
             
                    try:
         | 
| 163 308 | 
             
                        self.logger.info("Starting MCP Gateway")
         | 
| 164 | 
            -
             | 
| 309 | 
            +
             | 
| 165 310 | 
             
                        if not self.server:
         | 
| 166 311 | 
             
                            self.logger.error("Server not initialized")
         | 
| 167 312 | 
             
                            return False
         | 
| 168 | 
            -
             | 
| 313 | 
            +
             | 
| 169 314 | 
             
                        if not await self.server.start():
         | 
| 170 315 | 
             
                            self.logger.error("Failed to start MCP server")
         | 
| 171 316 | 
             
                            return False
         | 
| 172 | 
            -
             | 
| 317 | 
            +
             | 
| 173 318 | 
             
                        self.logger.info("MCP Gateway started successfully")
         | 
| 174 319 | 
             
                        return True
         | 
| 175 | 
            -
             | 
| 320 | 
            +
             | 
| 176 321 | 
             
                    except Exception as e:
         | 
| 177 322 | 
             
                        self.logger.error(f"Failed to start MCP Gateway: {e}")
         | 
| 178 323 | 
             
                        return False
         | 
| 179 | 
            -
             | 
| 324 | 
            +
             | 
| 180 325 | 
             
                async def run(self) -> None:
         | 
| 181 326 | 
             
                    """
         | 
| 182 327 | 
             
                    Run the MCP Gateway main loop.
         | 
| 183 | 
            -
             | 
| 328 | 
            +
             | 
| 184 329 | 
             
                    This method blocks until shutdown is requested.
         | 
| 185 330 | 
             
                    """
         | 
| 186 331 | 
             
                    try:
         | 
| 187 332 | 
             
                        self.logger.info("MCP Gateway running")
         | 
| 188 | 
            -
             | 
| 333 | 
            +
             | 
| 189 334 | 
             
                        # Wait for shutdown signal
         | 
| 190 335 | 
             
                        await self._shutdown_event.wait()
         | 
| 191 | 
            -
             | 
| 336 | 
            +
             | 
| 192 337 | 
             
                        self.logger.info("Shutdown signal received")
         | 
| 193 | 
            -
             | 
| 338 | 
            +
             | 
| 194 339 | 
             
                    except Exception as e:
         | 
| 195 340 | 
             
                        self.logger.error(f"Error in MCP Gateway main loop: {e}")
         | 
| 196 341 | 
             
                        raise
         | 
| 197 | 
            -
             | 
| 342 | 
            +
             | 
| 198 343 | 
             
                async def shutdown(self) -> None:
         | 
| 199 344 | 
             
                    """Shutdown the MCP Gateway gracefully."""
         | 
| 200 345 | 
             
                    try:
         | 
| 201 346 | 
             
                        self.logger.info("Shutting down MCP Gateway")
         | 
| 202 | 
            -
             | 
| 347 | 
            +
             | 
| 203 348 | 
             
                        # Shutdown server
         | 
| 204 349 | 
             
                        if self.server:
         | 
| 205 350 | 
             
                            await self.server.shutdown()
         | 
| 206 | 
            -
             | 
| 351 | 
            +
             | 
| 207 352 | 
             
                        # Shutdown registry (which will shutdown all tools)
         | 
| 208 353 | 
             
                        if self.registry:
         | 
| 209 | 
            -
                             | 
| 210 | 
            -
             | 
| 354 | 
            +
                            try:
         | 
| 355 | 
            +
                                await self.registry.shutdown()
         | 
| 356 | 
            +
                            except Exception as e:
         | 
| 357 | 
            +
                                self.logger.warning(f"Error during registry shutdown: {e}")
         | 
| 358 | 
            +
             | 
| 211 359 | 
             
                        # Shutdown communication handler
         | 
| 212 360 | 
             
                        if self.communication:
         | 
| 213 | 
            -
                             | 
| 214 | 
            -
             | 
| 361 | 
            +
                            try:
         | 
| 362 | 
            +
                                await self.communication.shutdown()
         | 
| 363 | 
            +
                            except Exception as e:
         | 
| 364 | 
            +
                                self.logger.warning(f"Error during communication shutdown: {e}")
         | 
| 365 | 
            +
             | 
| 215 366 | 
             
                        self.logger.info("MCP Gateway shutdown complete")
         | 
| 216 | 
            -
             | 
| 367 | 
            +
             | 
| 217 368 | 
             
                    except Exception as e:
         | 
| 218 369 | 
             
                        self.logger.error(f"Error during shutdown: {e}")
         | 
| 219 370 |  | 
| @@ -221,43 +372,42 @@ class MCPGateway: | |
| 221 372 | 
             
            async def main(args: argparse.Namespace) -> int:
         | 
| 222 373 | 
             
                """
         | 
| 223 374 | 
             
                Main entry point for the MCP Gateway.
         | 
| 224 | 
            -
             | 
| 375 | 
            +
             | 
| 225 376 | 
             
                Args:
         | 
| 226 377 | 
             
                    args: Command line arguments
         | 
| 227 | 
            -
             | 
| 378 | 
            +
             | 
| 228 379 | 
             
                Returns:
         | 
| 229 380 | 
             
                    Exit code (0 for success, 1 for failure)
         | 
| 230 381 | 
             
                """
         | 
| 231 382 | 
             
                # Setup logging
         | 
| 232 383 | 
             
                log_level = logging.DEBUG if args.debug else logging.INFO
         | 
| 233 384 | 
             
                logging.basicConfig(
         | 
| 234 | 
            -
                    level=log_level,
         | 
| 235 | 
            -
                    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
         | 
| 385 | 
            +
                    level=log_level, format="%(asctime)s - %(name)s - %(levelname)s - %(message)s"
         | 
| 236 386 | 
             
                )
         | 
| 237 | 
            -
             | 
| 238 | 
            -
                # Create gateway instance
         | 
| 387 | 
            +
             | 
| 388 | 
            +
                # Create gateway orchestrator instance
         | 
| 239 389 | 
             
                config_path = Path(args.config) if args.config else None
         | 
| 240 | 
            -
                gateway =  | 
| 241 | 
            -
             | 
| 390 | 
            +
                gateway = MCPGatewayOrchestrator(config_path=config_path)
         | 
| 391 | 
            +
             | 
| 242 392 | 
             
                try:
         | 
| 243 393 | 
             
                    # Initialize
         | 
| 244 394 | 
             
                    if not await gateway.initialize():
         | 
| 245 395 | 
             
                        logging.error("Failed to initialize MCP Gateway")
         | 
| 246 396 | 
             
                        return 1
         | 
| 247 | 
            -
             | 
| 397 | 
            +
             | 
| 248 398 | 
             
                    # Start
         | 
| 249 399 | 
             
                    if not await gateway.start():
         | 
| 250 400 | 
             
                        logging.error("Failed to start MCP Gateway")
         | 
| 251 401 | 
             
                        return 1
         | 
| 252 | 
            -
             | 
| 402 | 
            +
             | 
| 253 403 | 
             
                    # Run until shutdown
         | 
| 254 404 | 
             
                    await gateway.run()
         | 
| 255 | 
            -
             | 
| 405 | 
            +
             | 
| 256 406 | 
             
                    # Graceful shutdown
         | 
| 257 407 | 
             
                    await gateway.shutdown()
         | 
| 258 | 
            -
             | 
| 408 | 
            +
             | 
| 259 409 | 
             
                    return 0
         | 
| 260 | 
            -
             | 
| 410 | 
            +
             | 
| 261 411 | 
             
                except Exception as e:
         | 
| 262 412 | 
             
                    logging.error(f"Unhandled exception: {e}")
         | 
| 263 413 | 
             
                    await gateway.shutdown()
         | 
| @@ -267,7 +417,7 @@ async def main(args: argparse.Namespace) -> int: | |
| 267 417 | 
             
            def parse_arguments() -> argparse.Namespace:
         | 
| 268 418 | 
             
                """
         | 
| 269 419 | 
             
                Parse command line arguments.
         | 
| 270 | 
            -
             | 
| 420 | 
            +
             | 
| 271 421 | 
             
                Returns:
         | 
| 272 422 | 
             
                    Parsed arguments
         | 
| 273 423 | 
             
                """
         | 
| @@ -278,51 +428,43 @@ def parse_arguments() -> argparse.Namespace: | |
| 278 428 | 
             
            Examples:
         | 
| 279 429 | 
             
              # Run with default configuration
         | 
| 280 430 | 
             
              python -m claude_mpm.services.mcp_gateway.main
         | 
| 281 | 
            -
             | 
| 431 | 
            +
             | 
| 282 432 | 
             
              # Run with custom configuration file
         | 
| 283 433 | 
             
              python -m claude_mpm.services.mcp_gateway.main --config /path/to/config.yaml
         | 
| 284 | 
            -
             | 
| 434 | 
            +
             | 
| 285 435 | 
             
              # Run with debug logging
         | 
| 286 436 | 
             
              python -m claude_mpm.services.mcp_gateway.main --debug
         | 
| 287 | 
            -
             | 
| 437 | 
            +
             | 
| 288 438 | 
             
              # Run as MCP server for Claude Desktop
         | 
| 289 439 | 
             
              python -m claude_mpm.services.mcp_gateway.main --stdio
         | 
| 290 | 
            -
                    """
         | 
| 291 | 
            -
                )
         | 
| 292 | 
            -
                
         | 
| 293 | 
            -
                parser.add_argument(
         | 
| 294 | 
            -
                    "--config",
         | 
| 295 | 
            -
                    type=str,
         | 
| 296 | 
            -
                    help="Path to configuration file"
         | 
| 297 | 
            -
                )
         | 
| 298 | 
            -
                
         | 
| 299 | 
            -
                parser.add_argument(
         | 
| 300 | 
            -
                    "--debug",
         | 
| 301 | 
            -
                    action="store_true",
         | 
| 302 | 
            -
                    help="Enable debug logging"
         | 
| 440 | 
            +
                    """,
         | 
| 303 441 | 
             
                )
         | 
| 304 | 
            -
             | 
| 442 | 
            +
             | 
| 443 | 
            +
                parser.add_argument("--config", type=str, help="Path to configuration file")
         | 
| 444 | 
            +
             | 
| 445 | 
            +
                parser.add_argument("--debug", action="store_true", help="Enable debug logging")
         | 
| 446 | 
            +
             | 
| 305 447 | 
             
                parser.add_argument(
         | 
| 306 448 | 
             
                    "--stdio",
         | 
| 307 449 | 
             
                    action="store_true",
         | 
| 308 450 | 
             
                    default=True,
         | 
| 309 | 
            -
                    help="Use stdio for communication (default)"
         | 
| 451 | 
            +
                    help="Use stdio for communication (default)",
         | 
| 310 452 | 
             
                )
         | 
| 311 | 
            -
             | 
| 453 | 
            +
             | 
| 312 454 | 
             
                parser.add_argument(
         | 
| 313 | 
            -
                    "--version",
         | 
| 314 | 
            -
                    action="version",
         | 
| 315 | 
            -
                    version="Claude MPM MCP Gateway 1.0.0"
         | 
| 455 | 
            +
                    "--version", action="version", version="Claude MPM MCP Gateway 1.0.0"
         | 
| 316 456 | 
             
                )
         | 
| 317 | 
            -
             | 
| 457 | 
            +
             | 
| 318 458 | 
             
                return parser.parse_args()
         | 
| 319 459 |  | 
| 320 460 |  | 
| 321 | 
            -
            async def  | 
| 461 | 
            +
            async def run_standalone_gateway(
         | 
| 462 | 
            +
                gateway_name: str = "claude-mpm-mcp", version: str = "1.0.0"
         | 
| 463 | 
            +
            ):
         | 
| 322 464 | 
             
                """
         | 
| 323 | 
            -
                Run the MCP Gateway  | 
| 465 | 
            +
                Run the MCP Gateway as a standalone server.
         | 
| 324 466 |  | 
| 325 | 
            -
                This  | 
| 467 | 
            +
                This creates a simple instance without complex management.
         | 
| 326 468 |  | 
| 327 469 | 
             
                Args:
         | 
| 328 470 | 
             
                    gateway_name: Name for the gateway
         | 
| @@ -331,19 +473,27 @@ async def run_global_mcp_gateway(gateway_name: str = "claude-mpm-mcp", version: | |
| 331 473 | 
             
                logger = get_logger("MCPGatewayMain")
         | 
| 332 474 |  | 
| 333 475 | 
             
                try:
         | 
| 334 | 
            -
                    logger.info(f"Starting  | 
| 476 | 
            +
                    logger.info(f"Starting standalone MCP gateway: {gateway_name}")
         | 
| 477 | 
            +
             | 
| 478 | 
            +
                    # Create and run a simple orchestrator
         | 
| 479 | 
            +
                    orchestrator = MCPGatewayOrchestrator()
         | 
| 335 480 |  | 
| 336 | 
            -
                     | 
| 337 | 
            -
             | 
| 338 | 
            -
                        logger.error("Failed to start global gateway")
         | 
| 481 | 
            +
                    if not await orchestrator.initialize():
         | 
| 482 | 
            +
                        logger.error("Failed to initialize gateway")
         | 
| 339 483 | 
             
                        return False
         | 
| 340 484 |  | 
| 341 | 
            -
                     | 
| 342 | 
            -
             | 
| 485 | 
            +
                    if not await orchestrator.start():
         | 
| 486 | 
            +
                        logger.error("Failed to start gateway")
         | 
| 487 | 
            +
                        return False
         | 
| 488 | 
            +
             | 
| 489 | 
            +
                    # Run until shutdown
         | 
| 490 | 
            +
                    await orchestrator.run()
         | 
| 491 | 
            +
                    await orchestrator.shutdown()
         | 
| 492 | 
            +
             | 
| 343 493 | 
             
                    return True
         | 
| 344 494 |  | 
| 345 495 | 
             
                except Exception as e:
         | 
| 346 | 
            -
                    logger.error(f"Error running  | 
| 496 | 
            +
                    logger.error(f"Error running standalone gateway: {e}")
         | 
| 347 497 | 
             
                    return False
         | 
| 348 498 |  | 
| 349 499 |  | 
| @@ -353,4 +503,4 @@ if __name__ == "__main__": | |
| 353 503 |  | 
| 354 504 | 
             
                # Run the gateway
         | 
| 355 505 | 
             
                exit_code = asyncio.run(main(args))
         | 
| 356 | 
            -
                sys.exit(exit_code)
         | 
| 506 | 
            +
                sys.exit(exit_code)
         |