claude-mpm 3.9.9__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 +155 -0
- 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 +90 -49
- claude_mpm/cli/__main__.py +3 -2
- claude_mpm/cli/commands/__init__.py +21 -18
- 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 +143 -762
- 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 -1150
- 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 +217 -0
- claude_mpm/config/paths.py +94 -208
- claude_mpm/config/socketio_config.py +84 -73
- claude_mpm/constants.py +36 -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 +571 -0
- 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 +40 -23
- 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 +14 -21
- 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 +97 -93
- claude_mpm/services/mcp_gateway/main.py +307 -127
- claude_mpm/services/mcp_gateway/registry/__init__.py +1 -1
- claude_mpm/services/mcp_gateway/registry/service_registry.py +100 -101
- claude_mpm/services/mcp_gateway/registry/tool_registry.py +135 -126
- claude_mpm/services/mcp_gateway/server/__init__.py +4 -4
- claude_mpm/services/mcp_gateway/server/{mcp_server.py → mcp_gateway.py} +149 -153
- 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 +110 -121
- 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 +20 -534
- 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 +9 -0
- claude_mpm/storage/state_storage.py +552 -0
- 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.9.dist-info → claude_mpm-4.0.3.dist-info}/METADATA +51 -2
- claude_mpm-4.0.3.dist-info/RECORD +402 -0
- {claude_mpm-3.9.9.dist-info → claude_mpm-4.0.3.dist-info}/entry_points.txt +1 -0
- {claude_mpm-3.9.9.dist-info → claude_mpm-4.0.3.dist-info}/licenses/LICENSE +1 -1
- claude_mpm/config/memory_guardian_config.py +0 -325
- claude_mpm/core/config_paths.py +0 -150
- 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/memory_guardian.py +0 -770
- claude_mpm/services/mcp_gateway/server/mcp_server_simple.py +0 -444
- 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.9.dist-info/RECORD +0 -293
- {claude_mpm-3.9.9.dist-info → claude_mpm-4.0.3.dist-info}/WHEEL +0 -0
- {claude_mpm-3.9.9.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,134 +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
         | 
| 95 | 
            +
             | 
| 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
         | 
| 18 117 |  | 
| 19 | 
            -
             | 
| 20 | 
            -
            from claude_mpm.services.mcp_gateway.server.stdio_handler import StdioHandler
         | 
| 21 | 
            -
            from claude_mpm.services.mcp_gateway.registry.tool_registry import ToolRegistry
         | 
| 22 | 
            -
            from claude_mpm.services.mcp_gateway.tools.base_adapter import (
         | 
| 23 | 
            -
                EchoToolAdapter,
         | 
| 24 | 
            -
                CalculatorToolAdapter,
         | 
| 25 | 
            -
                SystemInfoToolAdapter
         | 
| 26 | 
            -
            )
         | 
| 27 | 
            -
            from claude_mpm.services.mcp_gateway.tools.document_summarizer import DocumentSummarizerTool
         | 
| 28 | 
            -
            from claude_mpm.services.mcp_gateway.config.configuration import MCPConfiguration
         | 
| 29 | 
            -
            from claude_mpm.core.logger import get_logger
         | 
| 118 | 
            +
            # Manager module removed - using simplified architecture
         | 
| 30 119 |  | 
| 31 120 |  | 
| 32 | 
            -
            class  | 
| 121 | 
            +
            class MCPGatewayOrchestrator:
         | 
| 33 122 | 
             
                """
         | 
| 34 123 | 
             
                Main MCP Gateway orchestrator.
         | 
| 35 | 
            -
             | 
| 124 | 
            +
             | 
| 36 125 | 
             
                WHY: This class coordinates all MCP components, managing their lifecycle
         | 
| 37 126 | 
             
                and ensuring proper initialization, startup, and shutdown sequences.
         | 
| 38 | 
            -
             | 
| 127 | 
            +
             | 
| 39 128 | 
             
                DESIGN DECISIONS:
         | 
| 40 129 | 
             
                - Use dependency injection to wire components together
         | 
| 41 130 | 
             
                - Implement graceful shutdown on SIGINT/SIGTERM
         | 
| 42 131 | 
             
                - Support both configuration file and CLI arguments
         | 
| 43 132 | 
             
                - Provide comprehensive logging for debugging
         | 
| 133 | 
            +
                - Renamed from MCPGateway to avoid naming conflict with server class
         | 
| 44 134 | 
             
                """
         | 
| 45 | 
            -
             | 
| 135 | 
            +
             | 
| 46 136 | 
             
                def __init__(self, config_path: Optional[Path] = None):
         | 
| 47 137 | 
             
                    """
         | 
| 48 138 | 
             
                    Initialize the MCP Gateway.
         | 
| 49 | 
            -
             | 
| 139 | 
            +
             | 
| 50 140 | 
             
                    Args:
         | 
| 51 141 | 
             
                        config_path: Optional path to configuration file
         | 
| 52 142 | 
             
                    """
         | 
| 53 143 | 
             
                    self.logger = get_logger(self.__class__.__name__)
         | 
| 54 144 | 
             
                    self.config_path = config_path
         | 
| 55 | 
            -
             | 
| 145 | 
            +
             | 
| 56 146 | 
             
                    # Core components
         | 
| 57 | 
            -
                    self.server: Optional[ | 
| 147 | 
            +
                    self.server: Optional[MCPGateway] = None
         | 
| 58 148 | 
             
                    self.registry: Optional[ToolRegistry] = None
         | 
| 59 149 | 
             
                    self.communication: Optional[StdioHandler] = None
         | 
| 60 150 | 
             
                    self.configuration: Optional[MCPConfiguration] = None
         | 
| 61 | 
            -
             | 
| 151 | 
            +
             | 
| 62 152 | 
             
                    # Shutdown handling
         | 
| 63 153 | 
             
                    self._shutdown_event = asyncio.Event()
         | 
| 64 154 | 
             
                    self._setup_signal_handlers()
         | 
| 65 | 
            -
             | 
| 155 | 
            +
             | 
| 66 156 | 
             
                def _setup_signal_handlers(self) -> None:
         | 
| 67 157 | 
             
                    """Setup signal handlers for graceful shutdown."""
         | 
| 158 | 
            +
             | 
| 68 159 | 
             
                    def signal_handler(sig, frame):
         | 
| 69 160 | 
             
                        self.logger.info(f"Received signal {sig}, initiating shutdown...")
         | 
| 70 161 | 
             
                        self._shutdown_event.set()
         | 
| 71 | 
            -
             | 
| 162 | 
            +
             | 
| 72 163 | 
             
                    signal.signal(signal.SIGINT, signal_handler)
         | 
| 73 164 | 
             
                    signal.signal(signal.SIGTERM, signal_handler)
         | 
| 74 | 
            -
             | 
| 165 | 
            +
             | 
| 75 166 | 
             
                async def initialize(self) -> bool:
         | 
| 76 167 | 
             
                    """
         | 
| 77 168 | 
             
                    Initialize all MCP Gateway components.
         | 
| 78 | 
            -
             | 
| 169 | 
            +
             | 
| 79 170 | 
             
                    Returns:
         | 
| 80 171 | 
             
                        True if initialization successful
         | 
| 81 172 | 
             
                    """
         | 
| 82 173 | 
             
                    try:
         | 
| 83 174 | 
             
                        self.logger.info("Initializing MCP Gateway")
         | 
| 84 | 
            -
             | 
| 175 | 
            +
             | 
| 85 176 | 
             
                        # Load configuration
         | 
| 86 177 | 
             
                        self.configuration = MCPConfiguration()
         | 
| 87 178 | 
             
                        if self.config_path and self.config_path.exists():
         | 
| 88 179 | 
             
                            if not self.configuration.load_config(self.config_path):
         | 
| 89 180 | 
             
                                self.logger.error("Failed to load configuration")
         | 
| 90 181 | 
             
                                return False
         | 
| 91 | 
            -
             | 
| 92 | 
            -
                        # Initialize tool registry
         | 
| 93 | 
            -
                         | 
| 94 | 
            -
             | 
| 95 | 
            -
                            self. | 
| 96 | 
            -
             | 
| 97 | 
            -
             | 
| 98 | 
            -
             | 
| 99 | 
            -
                         | 
| 100 | 
            -
             | 
| 101 | 
            -
             | 
| 102 | 
            -
             | 
| 103 | 
            -
                        if  | 
| 104 | 
            -
             | 
| 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
         | 
| 214 | 
            +
                        gateway_name = self.configuration.get("server.name", "claude-mpm-mcp")
         | 
| 109 215 | 
             
                        version = self.configuration.get("server.version", "1.0.0")
         | 
| 110 | 
            -
                        self.server =  | 
| 111 | 
            -
             | 
| 112 | 
            -
                        # Wire dependencies
         | 
| 113 | 
            -
                        self. | 
| 114 | 
            -
             | 
| 115 | 
            -
                        
         | 
| 216 | 
            +
                        self.server = MCPGateway(gateway_name=gateway_name, version=version)
         | 
| 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 | 
            +
             | 
| 116 229 | 
             
                        if not await self.server.initialize():
         | 
| 117 230 | 
             
                            self.logger.error("Failed to initialize MCP server")
         | 
| 118 231 | 
             
                            return False
         | 
| 119 | 
            -
             | 
| 232 | 
            +
             | 
| 120 233 | 
             
                        self.logger.info("MCP Gateway initialized successfully")
         | 
| 121 234 | 
             
                        return True
         | 
| 122 | 
            -
             | 
| 235 | 
            +
             | 
| 123 236 | 
             
                    except Exception as e:
         | 
| 124 237 | 
             
                        self.logger.error(f"Failed to initialize MCP Gateway: {e}")
         | 
| 125 238 | 
             
                        return False
         | 
| 126 | 
            -
             | 
| 239 | 
            +
             | 
| 127 240 | 
             
                async def _register_builtin_tools(self) -> None:
         | 
| 128 241 | 
             
                    """Register built-in tools with the registry."""
         | 
| 129 242 | 
             
                    self.logger.info("Registering built-in tools")
         | 
| 130 | 
            -
             | 
| 131 | 
            -
                    # Create tool adapters
         | 
| 132 | 
            -
                    tools = [
         | 
| 133 | 
            -
             | 
| 134 | 
            -
             | 
| 135 | 
            -
             | 
| 136 | 
            -
                         | 
| 137 | 
            -
             | 
| 138 | 
            -
             | 
| 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 | 
            +
             | 
| 139 277 | 
             
                    # Register each tool
         | 
| 140 278 | 
             
                    for tool in tools:
         | 
| 141 279 | 
             
                        try:
         | 
| @@ -143,76 +281,90 @@ class MCPGateway: | |
| 143 281 | 
             
                            if await tool.initialize():
         | 
| 144 282 | 
             
                                # Register with the registry
         | 
| 145 283 | 
             
                                if self.registry.register_tool(tool, category="builtin"):
         | 
| 146 | 
            -
                                    self.logger.info( | 
| 284 | 
            +
                                    self.logger.info(
         | 
| 285 | 
            +
                                        f"Registered tool: {tool.get_definition().name}"
         | 
| 286 | 
            +
                                    )
         | 
| 147 287 | 
             
                                else:
         | 
| 148 | 
            -
                                    self.logger.warning( | 
| 288 | 
            +
                                    self.logger.warning(
         | 
| 289 | 
            +
                                        f"Failed to register tool: {tool.get_definition().name}"
         | 
| 290 | 
            +
                                    )
         | 
| 149 291 | 
             
                            else:
         | 
| 150 | 
            -
                                self.logger.warning( | 
| 292 | 
            +
                                self.logger.warning(
         | 
| 293 | 
            +
                                    f"Failed to initialize tool: {tool.get_definition().name}"
         | 
| 294 | 
            +
                                )
         | 
| 151 295 | 
             
                        except Exception as e:
         | 
| 152 | 
            -
                            self.logger.error( | 
| 153 | 
            -
             | 
| 296 | 
            +
                            self.logger.error(
         | 
| 297 | 
            +
                                f"Error registering tool {tool.get_definition().name}: {e}"
         | 
| 298 | 
            +
                            )
         | 
| 299 | 
            +
             | 
| 154 300 | 
             
                async def start(self) -> bool:
         | 
| 155 301 | 
             
                    """
         | 
| 156 302 | 
             
                    Start the MCP Gateway server.
         | 
| 157 | 
            -
             | 
| 303 | 
            +
             | 
| 158 304 | 
             
                    Returns:
         | 
| 159 305 | 
             
                        True if startup successful
         | 
| 160 306 | 
             
                    """
         | 
| 161 307 | 
             
                    try:
         | 
| 162 308 | 
             
                        self.logger.info("Starting MCP Gateway")
         | 
| 163 | 
            -
             | 
| 309 | 
            +
             | 
| 164 310 | 
             
                        if not self.server:
         | 
| 165 311 | 
             
                            self.logger.error("Server not initialized")
         | 
| 166 312 | 
             
                            return False
         | 
| 167 | 
            -
             | 
| 313 | 
            +
             | 
| 168 314 | 
             
                        if not await self.server.start():
         | 
| 169 315 | 
             
                            self.logger.error("Failed to start MCP server")
         | 
| 170 316 | 
             
                            return False
         | 
| 171 | 
            -
             | 
| 317 | 
            +
             | 
| 172 318 | 
             
                        self.logger.info("MCP Gateway started successfully")
         | 
| 173 319 | 
             
                        return True
         | 
| 174 | 
            -
             | 
| 320 | 
            +
             | 
| 175 321 | 
             
                    except Exception as e:
         | 
| 176 322 | 
             
                        self.logger.error(f"Failed to start MCP Gateway: {e}")
         | 
| 177 323 | 
             
                        return False
         | 
| 178 | 
            -
             | 
| 324 | 
            +
             | 
| 179 325 | 
             
                async def run(self) -> None:
         | 
| 180 326 | 
             
                    """
         | 
| 181 327 | 
             
                    Run the MCP Gateway main loop.
         | 
| 182 | 
            -
             | 
| 328 | 
            +
             | 
| 183 329 | 
             
                    This method blocks until shutdown is requested.
         | 
| 184 330 | 
             
                    """
         | 
| 185 331 | 
             
                    try:
         | 
| 186 332 | 
             
                        self.logger.info("MCP Gateway running")
         | 
| 187 | 
            -
             | 
| 333 | 
            +
             | 
| 188 334 | 
             
                        # Wait for shutdown signal
         | 
| 189 335 | 
             
                        await self._shutdown_event.wait()
         | 
| 190 | 
            -
             | 
| 336 | 
            +
             | 
| 191 337 | 
             
                        self.logger.info("Shutdown signal received")
         | 
| 192 | 
            -
             | 
| 338 | 
            +
             | 
| 193 339 | 
             
                    except Exception as e:
         | 
| 194 340 | 
             
                        self.logger.error(f"Error in MCP Gateway main loop: {e}")
         | 
| 195 341 | 
             
                        raise
         | 
| 196 | 
            -
             | 
| 342 | 
            +
             | 
| 197 343 | 
             
                async def shutdown(self) -> None:
         | 
| 198 344 | 
             
                    """Shutdown the MCP Gateway gracefully."""
         | 
| 199 345 | 
             
                    try:
         | 
| 200 346 | 
             
                        self.logger.info("Shutting down MCP Gateway")
         | 
| 201 | 
            -
             | 
| 347 | 
            +
             | 
| 202 348 | 
             
                        # Shutdown server
         | 
| 203 349 | 
             
                        if self.server:
         | 
| 204 350 | 
             
                            await self.server.shutdown()
         | 
| 205 | 
            -
             | 
| 351 | 
            +
             | 
| 206 352 | 
             
                        # Shutdown registry (which will shutdown all tools)
         | 
| 207 353 | 
             
                        if self.registry:
         | 
| 208 | 
            -
                             | 
| 209 | 
            -
             | 
| 354 | 
            +
                            try:
         | 
| 355 | 
            +
                                await self.registry.shutdown()
         | 
| 356 | 
            +
                            except Exception as e:
         | 
| 357 | 
            +
                                self.logger.warning(f"Error during registry shutdown: {e}")
         | 
| 358 | 
            +
             | 
| 210 359 | 
             
                        # Shutdown communication handler
         | 
| 211 360 | 
             
                        if self.communication:
         | 
| 212 | 
            -
                             | 
| 213 | 
            -
             | 
| 361 | 
            +
                            try:
         | 
| 362 | 
            +
                                await self.communication.shutdown()
         | 
| 363 | 
            +
                            except Exception as e:
         | 
| 364 | 
            +
                                self.logger.warning(f"Error during communication shutdown: {e}")
         | 
| 365 | 
            +
             | 
| 214 366 | 
             
                        self.logger.info("MCP Gateway shutdown complete")
         | 
| 215 | 
            -
             | 
| 367 | 
            +
             | 
| 216 368 | 
             
                    except Exception as e:
         | 
| 217 369 | 
             
                        self.logger.error(f"Error during shutdown: {e}")
         | 
| 218 370 |  | 
| @@ -220,43 +372,42 @@ class MCPGateway: | |
| 220 372 | 
             
            async def main(args: argparse.Namespace) -> int:
         | 
| 221 373 | 
             
                """
         | 
| 222 374 | 
             
                Main entry point for the MCP Gateway.
         | 
| 223 | 
            -
             | 
| 375 | 
            +
             | 
| 224 376 | 
             
                Args:
         | 
| 225 377 | 
             
                    args: Command line arguments
         | 
| 226 | 
            -
             | 
| 378 | 
            +
             | 
| 227 379 | 
             
                Returns:
         | 
| 228 380 | 
             
                    Exit code (0 for success, 1 for failure)
         | 
| 229 381 | 
             
                """
         | 
| 230 382 | 
             
                # Setup logging
         | 
| 231 383 | 
             
                log_level = logging.DEBUG if args.debug else logging.INFO
         | 
| 232 384 | 
             
                logging.basicConfig(
         | 
| 233 | 
            -
                    level=log_level,
         | 
| 234 | 
            -
                    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
         | 
| 385 | 
            +
                    level=log_level, format="%(asctime)s - %(name)s - %(levelname)s - %(message)s"
         | 
| 235 386 | 
             
                )
         | 
| 236 | 
            -
             | 
| 237 | 
            -
                # Create gateway instance
         | 
| 387 | 
            +
             | 
| 388 | 
            +
                # Create gateway orchestrator instance
         | 
| 238 389 | 
             
                config_path = Path(args.config) if args.config else None
         | 
| 239 | 
            -
                gateway =  | 
| 240 | 
            -
             | 
| 390 | 
            +
                gateway = MCPGatewayOrchestrator(config_path=config_path)
         | 
| 391 | 
            +
             | 
| 241 392 | 
             
                try:
         | 
| 242 393 | 
             
                    # Initialize
         | 
| 243 394 | 
             
                    if not await gateway.initialize():
         | 
| 244 395 | 
             
                        logging.error("Failed to initialize MCP Gateway")
         | 
| 245 396 | 
             
                        return 1
         | 
| 246 | 
            -
             | 
| 397 | 
            +
             | 
| 247 398 | 
             
                    # Start
         | 
| 248 399 | 
             
                    if not await gateway.start():
         | 
| 249 400 | 
             
                        logging.error("Failed to start MCP Gateway")
         | 
| 250 401 | 
             
                        return 1
         | 
| 251 | 
            -
             | 
| 402 | 
            +
             | 
| 252 403 | 
             
                    # Run until shutdown
         | 
| 253 404 | 
             
                    await gateway.run()
         | 
| 254 | 
            -
             | 
| 405 | 
            +
             | 
| 255 406 | 
             
                    # Graceful shutdown
         | 
| 256 407 | 
             
                    await gateway.shutdown()
         | 
| 257 | 
            -
             | 
| 408 | 
            +
             | 
| 258 409 | 
             
                    return 0
         | 
| 259 | 
            -
             | 
| 410 | 
            +
             | 
| 260 411 | 
             
                except Exception as e:
         | 
| 261 412 | 
             
                    logging.error(f"Unhandled exception: {e}")
         | 
| 262 413 | 
             
                    await gateway.shutdown()
         | 
| @@ -266,7 +417,7 @@ async def main(args: argparse.Namespace) -> int: | |
| 266 417 | 
             
            def parse_arguments() -> argparse.Namespace:
         | 
| 267 418 | 
             
                """
         | 
| 268 419 | 
             
                Parse command line arguments.
         | 
| 269 | 
            -
             | 
| 420 | 
            +
             | 
| 270 421 | 
             
                Returns:
         | 
| 271 422 | 
             
                    Parsed arguments
         | 
| 272 423 | 
             
                """
         | 
| @@ -277,50 +428,79 @@ def parse_arguments() -> argparse.Namespace: | |
| 277 428 | 
             
            Examples:
         | 
| 278 429 | 
             
              # Run with default configuration
         | 
| 279 430 | 
             
              python -m claude_mpm.services.mcp_gateway.main
         | 
| 280 | 
            -
             | 
| 431 | 
            +
             | 
| 281 432 | 
             
              # Run with custom configuration file
         | 
| 282 433 | 
             
              python -m claude_mpm.services.mcp_gateway.main --config /path/to/config.yaml
         | 
| 283 | 
            -
             | 
| 434 | 
            +
             | 
| 284 435 | 
             
              # Run with debug logging
         | 
| 285 436 | 
             
              python -m claude_mpm.services.mcp_gateway.main --debug
         | 
| 286 | 
            -
             | 
| 437 | 
            +
             | 
| 287 438 | 
             
              # Run as MCP server for Claude Desktop
         | 
| 288 439 | 
             
              python -m claude_mpm.services.mcp_gateway.main --stdio
         | 
| 289 | 
            -
                    """
         | 
| 290 | 
            -
                )
         | 
| 291 | 
            -
                
         | 
| 292 | 
            -
                parser.add_argument(
         | 
| 293 | 
            -
                    "--config",
         | 
| 294 | 
            -
                    type=str,
         | 
| 295 | 
            -
                    help="Path to configuration file"
         | 
| 296 | 
            -
                )
         | 
| 297 | 
            -
                
         | 
| 298 | 
            -
                parser.add_argument(
         | 
| 299 | 
            -
                    "--debug",
         | 
| 300 | 
            -
                    action="store_true",
         | 
| 301 | 
            -
                    help="Enable debug logging"
         | 
| 440 | 
            +
                    """,
         | 
| 302 441 | 
             
                )
         | 
| 303 | 
            -
             | 
| 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 | 
            +
             | 
| 304 447 | 
             
                parser.add_argument(
         | 
| 305 448 | 
             
                    "--stdio",
         | 
| 306 449 | 
             
                    action="store_true",
         | 
| 307 450 | 
             
                    default=True,
         | 
| 308 | 
            -
                    help="Use stdio for communication (default)"
         | 
| 451 | 
            +
                    help="Use stdio for communication (default)",
         | 
| 309 452 | 
             
                )
         | 
| 310 | 
            -
             | 
| 453 | 
            +
             | 
| 311 454 | 
             
                parser.add_argument(
         | 
| 312 | 
            -
                    "--version",
         | 
| 313 | 
            -
                    action="version",
         | 
| 314 | 
            -
                    version="Claude MPM MCP Gateway 1.0.0"
         | 
| 455 | 
            +
                    "--version", action="version", version="Claude MPM MCP Gateway 1.0.0"
         | 
| 315 456 | 
             
                )
         | 
| 316 | 
            -
             | 
| 457 | 
            +
             | 
| 317 458 | 
             
                return parser.parse_args()
         | 
| 318 459 |  | 
| 319 460 |  | 
| 461 | 
            +
            async def run_standalone_gateway(
         | 
| 462 | 
            +
                gateway_name: str = "claude-mpm-mcp", version: str = "1.0.0"
         | 
| 463 | 
            +
            ):
         | 
| 464 | 
            +
                """
         | 
| 465 | 
            +
                Run the MCP Gateway as a standalone server.
         | 
| 466 | 
            +
             | 
| 467 | 
            +
                This creates a simple instance without complex management.
         | 
| 468 | 
            +
             | 
| 469 | 
            +
                Args:
         | 
| 470 | 
            +
                    gateway_name: Name for the gateway
         | 
| 471 | 
            +
                    version: Gateway version
         | 
| 472 | 
            +
                """
         | 
| 473 | 
            +
                logger = get_logger("MCPGatewayMain")
         | 
| 474 | 
            +
             | 
| 475 | 
            +
                try:
         | 
| 476 | 
            +
                    logger.info(f"Starting standalone MCP gateway: {gateway_name}")
         | 
| 477 | 
            +
             | 
| 478 | 
            +
                    # Create and run a simple orchestrator
         | 
| 479 | 
            +
                    orchestrator = MCPGatewayOrchestrator()
         | 
| 480 | 
            +
             | 
| 481 | 
            +
                    if not await orchestrator.initialize():
         | 
| 482 | 
            +
                        logger.error("Failed to initialize gateway")
         | 
| 483 | 
            +
                        return False
         | 
| 484 | 
            +
             | 
| 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 | 
            +
             | 
| 493 | 
            +
                    return True
         | 
| 494 | 
            +
             | 
| 495 | 
            +
                except Exception as e:
         | 
| 496 | 
            +
                    logger.error(f"Error running standalone gateway: {e}")
         | 
| 497 | 
            +
                    return False
         | 
| 498 | 
            +
             | 
| 499 | 
            +
             | 
| 320 500 | 
             
            if __name__ == "__main__":
         | 
| 321 501 | 
             
                # Parse arguments
         | 
| 322 502 | 
             
                args = parse_arguments()
         | 
| 323 | 
            -
             | 
| 503 | 
            +
             | 
| 324 504 | 
             
                # Run the gateway
         | 
| 325 505 | 
             
                exit_code = asyncio.run(main(args))
         | 
| 326 | 
            -
                sys.exit(exit_code)
         | 
| 506 | 
            +
                sys.exit(exit_code)
         |