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
| @@ -24,115 +24,132 @@ Structure: | |
| 24 24 | 
             
            # Version information
         | 
| 25 25 | 
             
            __version__ = "0.1.0"
         | 
| 26 26 |  | 
| 27 | 
            +
             | 
| 27 28 | 
             
            # Lazy imports to prevent circular dependencies and improve startup performance
         | 
| 28 29 | 
             
            def __getattr__(name):
         | 
| 29 30 | 
             
                """Lazy import mechanism for MCP Gateway components."""
         | 
| 30 | 
            -
             | 
| 31 | 
            +
             | 
| 31 32 | 
             
                # Core interfaces and base classes
         | 
| 32 | 
            -
                if name == " | 
| 33 | 
            -
                    from .core.interfaces import  | 
| 34 | 
            -
             | 
| 33 | 
            +
                if name == "IMCPGateway":
         | 
| 34 | 
            +
                    from .core.interfaces import IMCPGateway
         | 
| 35 | 
            +
             | 
| 36 | 
            +
                    return IMCPGateway
         | 
| 35 37 | 
             
                elif name == "IMCPToolRegistry":
         | 
| 36 38 | 
             
                    from .core.interfaces import IMCPToolRegistry
         | 
| 39 | 
            +
             | 
| 37 40 | 
             
                    return IMCPToolRegistry
         | 
| 38 41 | 
             
                elif name == "IMCPConfiguration":
         | 
| 39 42 | 
             
                    from .core.interfaces import IMCPConfiguration
         | 
| 43 | 
            +
             | 
| 40 44 | 
             
                    return IMCPConfiguration
         | 
| 41 45 | 
             
                elif name == "IMCPToolAdapter":
         | 
| 42 46 | 
             
                    from .core.interfaces import IMCPToolAdapter
         | 
| 47 | 
            +
             | 
| 43 48 | 
             
                    return IMCPToolAdapter
         | 
| 44 49 | 
             
                elif name == "BaseMCPService":
         | 
| 45 50 | 
             
                    from .core.base import BaseMCPService
         | 
| 51 | 
            +
             | 
| 46 52 | 
             
                    return BaseMCPService
         | 
| 47 | 
            -
             | 
| 48 | 
            -
                #  | 
| 49 | 
            -
                elif name == " | 
| 50 | 
            -
                    from .server. | 
| 51 | 
            -
             | 
| 53 | 
            +
             | 
| 54 | 
            +
                # Gateway implementations
         | 
| 55 | 
            +
                elif name == "MCPGateway":
         | 
| 56 | 
            +
                    from .server.mcp_gateway import MCPGateway
         | 
| 57 | 
            +
             | 
| 58 | 
            +
                    return MCPGateway
         | 
| 52 59 | 
             
                elif name == "StdioHandler":
         | 
| 53 60 | 
             
                    from .server.stdio_handler import StdioHandler
         | 
| 61 | 
            +
             | 
| 54 62 | 
             
                    return StdioHandler
         | 
| 55 63 | 
             
                elif name == "AlternativeStdioHandler":
         | 
| 56 64 | 
             
                    from .server.stdio_handler import AlternativeStdioHandler
         | 
| 65 | 
            +
             | 
| 57 66 | 
             
                    return AlternativeStdioHandler
         | 
| 58 | 
            -
             | 
| 67 | 
            +
             | 
| 59 68 | 
             
                # Tool registry and adapters
         | 
| 60 69 | 
             
                elif name == "ToolRegistry":
         | 
| 61 70 | 
             
                    from .registry.tool_registry import ToolRegistry
         | 
| 71 | 
            +
             | 
| 62 72 | 
             
                    return ToolRegistry
         | 
| 63 73 | 
             
                elif name == "BaseToolAdapter":
         | 
| 64 74 | 
             
                    from .tools.base_adapter import BaseToolAdapter
         | 
| 75 | 
            +
             | 
| 65 76 | 
             
                    return BaseToolAdapter
         | 
| 66 77 | 
             
                elif name == "EchoToolAdapter":
         | 
| 67 78 | 
             
                    from .tools.base_adapter import EchoToolAdapter
         | 
| 79 | 
            +
             | 
| 68 80 | 
             
                    return EchoToolAdapter
         | 
| 69 81 | 
             
                elif name == "CalculatorToolAdapter":
         | 
| 70 82 | 
             
                    from .tools.base_adapter import CalculatorToolAdapter
         | 
| 83 | 
            +
             | 
| 71 84 | 
             
                    return CalculatorToolAdapter
         | 
| 72 85 | 
             
                elif name == "SystemInfoToolAdapter":
         | 
| 73 86 | 
             
                    from .tools.base_adapter import SystemInfoToolAdapter
         | 
| 87 | 
            +
             | 
| 74 88 | 
             
                    return SystemInfoToolAdapter
         | 
| 75 | 
            -
             | 
| 89 | 
            +
             | 
| 76 90 | 
             
                # Configuration management
         | 
| 77 91 | 
             
                elif name == "MCPConfiguration":
         | 
| 78 92 | 
             
                    from .config.configuration import MCPConfiguration
         | 
| 93 | 
            +
             | 
| 79 94 | 
             
                    return MCPConfiguration
         | 
| 80 95 | 
             
                elif name == "MCPConfigLoader":
         | 
| 81 96 | 
             
                    from .config.config_loader import MCPConfigLoader
         | 
| 97 | 
            +
             | 
| 82 98 | 
             
                    return MCPConfigLoader
         | 
| 83 | 
            -
             | 
| 99 | 
            +
             | 
| 84 100 | 
             
                # Service registry
         | 
| 85 101 | 
             
                elif name == "MCPServiceRegistry":
         | 
| 86 102 | 
             
                    from .registry.service_registry import MCPServiceRegistry
         | 
| 103 | 
            +
             | 
| 87 104 | 
             
                    return MCPServiceRegistry
         | 
| 88 | 
            -
             | 
| 105 | 
            +
             | 
| 89 106 | 
             
                # Exceptions
         | 
| 90 107 | 
             
                elif name == "MCPException":
         | 
| 91 108 | 
             
                    from .core.exceptions import MCPException
         | 
| 109 | 
            +
             | 
| 92 110 | 
             
                    return MCPException
         | 
| 93 111 | 
             
                elif name == "MCPConfigurationError":
         | 
| 94 112 | 
             
                    from .core.exceptions import MCPConfigurationError
         | 
| 113 | 
            +
             | 
| 95 114 | 
             
                    return MCPConfigurationError
         | 
| 96 115 | 
             
                elif name == "MCPToolNotFoundError":
         | 
| 97 116 | 
             
                    from .core.exceptions import MCPToolNotFoundError
         | 
| 117 | 
            +
             | 
| 98 118 | 
             
                    return MCPToolNotFoundError
         | 
| 99 119 | 
             
                elif name == "MCPServerError":
         | 
| 100 120 | 
             
                    from .core.exceptions import MCPServerError
         | 
| 121 | 
            +
             | 
| 101 122 | 
             
                    return MCPServerError
         | 
| 102 | 
            -
             | 
| 123 | 
            +
             | 
| 103 124 | 
             
                raise AttributeError(f"module '{__name__}' has no attribute '{name}'")
         | 
| 104 125 |  | 
| 126 | 
            +
             | 
| 105 127 | 
             
            # Public API exports
         | 
| 106 128 | 
             
            __all__ = [
         | 
| 107 129 | 
             
                # Core interfaces
         | 
| 108 | 
            -
                " | 
| 130 | 
            +
                "IMCPGateway",
         | 
| 109 131 | 
             
                "IMCPToolRegistry",
         | 
| 110 132 | 
             
                "IMCPConfiguration",
         | 
| 111 133 | 
             
                "IMCPToolAdapter",
         | 
| 112 134 | 
             
                "BaseMCPService",
         | 
| 113 | 
            -
                
         | 
| 114 | 
            -
                 | 
| 115 | 
            -
                "MCPServer",
         | 
| 135 | 
            +
                # Gateway implementations
         | 
| 136 | 
            +
                "MCPGateway",
         | 
| 116 137 | 
             
                "StdioHandler",
         | 
| 117 138 | 
             
                "AlternativeStdioHandler",
         | 
| 118 | 
            -
                
         | 
| 119 139 | 
             
                # Tool management
         | 
| 120 140 | 
             
                "ToolRegistry",
         | 
| 121 141 | 
             
                "BaseToolAdapter",
         | 
| 122 142 | 
             
                "EchoToolAdapter",
         | 
| 123 143 | 
             
                "CalculatorToolAdapter",
         | 
| 124 144 | 
             
                "SystemInfoToolAdapter",
         | 
| 125 | 
            -
                
         | 
| 126 145 | 
             
                # Configuration
         | 
| 127 146 | 
             
                "MCPConfiguration",
         | 
| 128 147 | 
             
                "MCPConfigLoader",
         | 
| 129 | 
            -
                
         | 
| 130 148 | 
             
                # Service registry
         | 
| 131 149 | 
             
                "MCPServiceRegistry",
         | 
| 132 | 
            -
                
         | 
| 133 150 | 
             
                # Exceptions
         | 
| 134 151 | 
             
                "MCPException",
         | 
| 135 152 | 
             
                "MCPConfigurationError",
         | 
| 136 153 | 
             
                "MCPToolNotFoundError",
         | 
| 137 154 | 
             
                "MCPServerError",
         | 
| 138 | 
            -
            ]
         | 
| 155 | 
            +
            ]
         | 
| @@ -5,13 +5,13 @@ MCP Gateway Configuration Module | |
| 5 5 | 
             
            Configuration management for the MCP Gateway service.
         | 
| 6 6 | 
             
            """
         | 
| 7 7 |  | 
| 8 | 
            -
            from .configuration import MCPConfiguration
         | 
| 9 8 | 
             
            from .config_loader import MCPConfigLoader
         | 
| 10 9 | 
             
            from .config_schema import MCPConfigSchema, validate_config
         | 
| 10 | 
            +
            from .configuration import MCPConfiguration
         | 
| 11 11 |  | 
| 12 12 | 
             
            __all__ = [
         | 
| 13 13 | 
             
                "MCPConfiguration",
         | 
| 14 14 | 
             
                "MCPConfigLoader",
         | 
| 15 15 | 
             
                "MCPConfigSchema",
         | 
| 16 16 | 
             
                "validate_config",
         | 
| 17 | 
            -
            ]
         | 
| 17 | 
            +
            ]
         | 
| @@ -1,3 +1,5 @@ | |
| 1 | 
            +
            from pathlib import Path
         | 
| 2 | 
            +
             | 
| 1 3 | 
             
            """
         | 
| 2 4 | 
             
            MCP Gateway Configuration Loader
         | 
| 3 5 | 
             
            ================================
         | 
| @@ -8,8 +10,8 @@ Part of ISS-0034: Infrastructure Setup - MCP Gateway Project Foundation | |
| 8 10 | 
             
            """
         | 
| 9 11 |  | 
| 10 12 | 
             
            import os
         | 
| 11 | 
            -
            from  | 
| 12 | 
            -
             | 
| 13 | 
            +
            from typing import List, Optional
         | 
| 14 | 
            +
             | 
| 13 15 | 
             
            import yaml
         | 
| 14 16 |  | 
| 15 17 | 
             
            from claude_mpm.core.logger import get_logger
         | 
| @@ -18,42 +20,40 @@ from claude_mpm.core.logger import get_logger | |
| 18 20 | 
             
            class MCPConfigLoader:
         | 
| 19 21 | 
             
                """
         | 
| 20 22 | 
             
                Configuration loader for MCP Gateway.
         | 
| 21 | 
            -
             | 
| 23 | 
            +
             | 
| 22 24 | 
             
                This class handles discovering and loading configuration files from
         | 
| 23 25 | 
             
                standard locations, supporting both user and system configurations.
         | 
| 24 | 
            -
             | 
| 26 | 
            +
             | 
| 25 27 | 
             
                WHY: We separate configuration loading from the main configuration
         | 
| 26 28 | 
             
                service to support multiple configuration sources and provide a clean
         | 
| 27 29 | 
             
                abstraction for configuration discovery.
         | 
| 28 30 | 
             
                """
         | 
| 29 | 
            -
             | 
| 31 | 
            +
             | 
| 30 32 | 
             
                # Standard configuration file search paths
         | 
| 31 33 | 
             
                CONFIG_SEARCH_PATHS = [
         | 
| 32 34 | 
             
                    # User-specific configurations
         | 
| 33 35 | 
             
                    Path("~/.claude/mcp/config.yaml"),
         | 
| 34 36 | 
             
                    Path("~/.claude/mcp_gateway.yaml"),
         | 
| 35 37 | 
             
                    Path("~/.config/claude-mpm/mcp_gateway.yaml"),
         | 
| 36 | 
            -
                    
         | 
| 37 38 | 
             
                    # Project-specific configurations
         | 
| 38 39 | 
             
                    Path("./mcp_gateway.yaml"),
         | 
| 39 40 | 
             
                    Path("./config/mcp_gateway.yaml"),
         | 
| 40 41 | 
             
                    Path("./.claude/mcp_gateway.yaml"),
         | 
| 41 | 
            -
                    
         | 
| 42 42 | 
             
                    # System-wide configurations
         | 
| 43 43 | 
             
                    Path("/etc/claude-mpm/mcp_gateway.yaml"),
         | 
| 44 44 | 
             
                ]
         | 
| 45 | 
            -
             | 
| 45 | 
            +
             | 
| 46 46 | 
             
                def __init__(self):
         | 
| 47 47 | 
             
                    """Initialize configuration loader."""
         | 
| 48 48 | 
             
                    self.logger = get_logger("MCPConfigLoader")
         | 
| 49 | 
            -
             | 
| 49 | 
            +
             | 
| 50 50 | 
             
                def find_config_file(self) -> Optional[Path]:
         | 
| 51 51 | 
             
                    """
         | 
| 52 52 | 
             
                    Find the first available configuration file.
         | 
| 53 | 
            -
             | 
| 53 | 
            +
             | 
| 54 54 | 
             
                    Searches through standard locations and returns the first
         | 
| 55 55 | 
             
                    existing configuration file.
         | 
| 56 | 
            -
             | 
| 56 | 
            +
             | 
| 57 57 | 
             
                    Returns:
         | 
| 58 58 | 
             
                        Path to configuration file if found, None otherwise
         | 
| 59 59 | 
             
                    """
         | 
| @@ -62,171 +62,176 @@ class MCPConfigLoader: | |
| 62 62 | 
             
                        if expanded_path.exists() and expanded_path.is_file():
         | 
| 63 63 | 
             
                            self.logger.info(f"Found configuration file: {expanded_path}")
         | 
| 64 64 | 
             
                            return expanded_path
         | 
| 65 | 
            -
             | 
| 65 | 
            +
             | 
| 66 66 | 
             
                    self.logger.debug("No configuration file found in standard locations")
         | 
| 67 67 | 
             
                    return None
         | 
| 68 | 
            -
             | 
| 68 | 
            +
             | 
| 69 69 | 
             
                def load_from_file(self, config_path: Path) -> Optional[dict]:
         | 
| 70 70 | 
             
                    """
         | 
| 71 71 | 
             
                    Load configuration from a specific file.
         | 
| 72 | 
            -
             | 
| 72 | 
            +
             | 
| 73 73 | 
             
                    Args:
         | 
| 74 74 | 
             
                        config_path: Path to configuration file
         | 
| 75 | 
            -
             | 
| 75 | 
            +
             | 
| 76 76 | 
             
                    Returns:
         | 
| 77 77 | 
             
                        Configuration dictionary if successful, None otherwise
         | 
| 78 78 | 
             
                    """
         | 
| 79 79 | 
             
                    try:
         | 
| 80 80 | 
             
                        expanded_path = config_path.expanduser()
         | 
| 81 | 
            -
             | 
| 81 | 
            +
             | 
| 82 82 | 
             
                        if not expanded_path.exists():
         | 
| 83 83 | 
             
                            self.logger.error(f"Configuration file not found: {expanded_path}")
         | 
| 84 84 | 
             
                            return None
         | 
| 85 | 
            -
             | 
| 86 | 
            -
                        with open(expanded_path,  | 
| 85 | 
            +
             | 
| 86 | 
            +
                        with open(expanded_path, "r") as f:
         | 
| 87 87 | 
             
                            config = yaml.safe_load(f)
         | 
| 88 | 
            -
             | 
| 88 | 
            +
             | 
| 89 89 | 
             
                        self.logger.info(f"Configuration loaded from {expanded_path}")
         | 
| 90 90 | 
             
                        return config or {}
         | 
| 91 | 
            -
             | 
| 91 | 
            +
             | 
| 92 92 | 
             
                    except yaml.YAMLError as e:
         | 
| 93 93 | 
             
                        self.logger.error(f"Failed to parse YAML configuration: {e}")
         | 
| 94 94 | 
             
                        return None
         | 
| 95 95 | 
             
                    except Exception as e:
         | 
| 96 96 | 
             
                        self.logger.error(f"Failed to load configuration: {e}")
         | 
| 97 97 | 
             
                        return None
         | 
| 98 | 
            -
             | 
| 98 | 
            +
             | 
| 99 99 | 
             
                def load_from_env(self) -> dict:
         | 
| 100 100 | 
             
                    """
         | 
| 101 101 | 
             
                    Load configuration from environment variables.
         | 
| 102 | 
            -
             | 
| 102 | 
            +
             | 
| 103 103 | 
             
                    Environment variables follow the pattern: MCP_GATEWAY_<SECTION>_<KEY>
         | 
| 104 | 
            -
             | 
| 104 | 
            +
             | 
| 105 105 | 
             
                    Returns:
         | 
| 106 106 | 
             
                        Configuration dictionary built from environment variables
         | 
| 107 107 | 
             
                    """
         | 
| 108 108 | 
             
                    config = {}
         | 
| 109 109 | 
             
                    prefix = "MCP_GATEWAY_"
         | 
| 110 | 
            -
             | 
| 110 | 
            +
             | 
| 111 111 | 
             
                    for env_key, env_value in os.environ.items():
         | 
| 112 112 | 
             
                        if not env_key.startswith(prefix):
         | 
| 113 113 | 
             
                            continue
         | 
| 114 | 
            -
             | 
| 114 | 
            +
             | 
| 115 115 | 
             
                        # Parse environment variable into configuration path
         | 
| 116 | 
            -
                        config_path = env_key[len(prefix):].lower().split( | 
| 117 | 
            -
             | 
| 116 | 
            +
                        config_path = env_key[len(prefix) :].lower().split("_")
         | 
| 117 | 
            +
             | 
| 118 118 | 
             
                        # Build nested configuration structure
         | 
| 119 119 | 
             
                        current = config
         | 
| 120 120 | 
             
                        for part in config_path[:-1]:
         | 
| 121 121 | 
             
                            if part not in current:
         | 
| 122 122 | 
             
                                current[part] = {}
         | 
| 123 123 | 
             
                            current = current[part]
         | 
| 124 | 
            -
             | 
| 124 | 
            +
             | 
| 125 125 | 
             
                        # Set the value
         | 
| 126 126 | 
             
                        key = config_path[-1]
         | 
| 127 127 | 
             
                        try:
         | 
| 128 128 | 
             
                            # Try to parse as JSON for complex types
         | 
| 129 129 | 
             
                            import json
         | 
| 130 | 
            +
             | 
| 130 131 | 
             
                            current[key] = json.loads(env_value)
         | 
| 131 132 | 
             
                        except:
         | 
| 132 133 | 
             
                            # Fall back to string value
         | 
| 133 134 | 
             
                            current[key] = env_value
         | 
| 134 | 
            -
             | 
| 135 | 
            +
             | 
| 135 136 | 
             
                        self.logger.debug(f"Loaded from environment: {env_key}")
         | 
| 136 | 
            -
             | 
| 137 | 
            +
             | 
| 137 138 | 
             
                    return config
         | 
| 138 | 
            -
             | 
| 139 | 
            +
             | 
| 139 140 | 
             
                def load(self, config_path: Optional[Path] = None) -> dict:
         | 
| 140 141 | 
             
                    """
         | 
| 141 142 | 
             
                    Load configuration from all sources.
         | 
| 142 | 
            -
             | 
| 143 | 
            +
             | 
| 143 144 | 
             
                    Loads configuration in the following priority order:
         | 
| 144 145 | 
             
                    1. Default configuration
         | 
| 145 146 | 
             
                    2. File configuration (if found or specified)
         | 
| 146 147 | 
             
                    3. Environment variable overrides
         | 
| 147 | 
            -
             | 
| 148 | 
            +
             | 
| 148 149 | 
             
                    Args:
         | 
| 149 150 | 
             
                        config_path: Optional specific configuration file path
         | 
| 150 | 
            -
             | 
| 151 | 
            +
             | 
| 151 152 | 
             
                    Returns:
         | 
| 152 153 | 
             
                        Merged configuration dictionary
         | 
| 153 154 | 
             
                    """
         | 
| 154 155 | 
             
                    from .configuration import MCPConfiguration
         | 
| 155 | 
            -
             | 
| 156 | 
            +
             | 
| 156 157 | 
             
                    # Start with defaults
         | 
| 157 158 | 
             
                    config = MCPConfiguration.DEFAULT_CONFIG.copy()
         | 
| 158 | 
            -
             | 
| 159 | 
            +
             | 
| 159 160 | 
             
                    # Load from file
         | 
| 160 161 | 
             
                    file_path = config_path or self.find_config_file()
         | 
| 161 162 | 
             
                    if file_path:
         | 
| 162 163 | 
             
                        file_config = self.load_from_file(file_path)
         | 
| 163 164 | 
             
                        if file_config:
         | 
| 164 165 | 
             
                            config = self._merge_configs(config, file_config)
         | 
| 165 | 
            -
             | 
| 166 | 
            +
             | 
| 166 167 | 
             
                    # Apply environment overrides
         | 
| 167 168 | 
             
                    env_config = self.load_from_env()
         | 
| 168 169 | 
             
                    if env_config:
         | 
| 169 170 | 
             
                        config = self._merge_configs(config, env_config)
         | 
| 170 | 
            -
             | 
| 171 | 
            +
             | 
| 171 172 | 
             
                    return config
         | 
| 172 | 
            -
             | 
| 173 | 
            +
             | 
| 173 174 | 
             
                def _merge_configs(self, base: dict, overlay: dict) -> dict:
         | 
| 174 175 | 
             
                    """
         | 
| 175 176 | 
             
                    Recursively merge two configuration dictionaries.
         | 
| 176 | 
            -
             | 
| 177 | 
            +
             | 
| 177 178 | 
             
                    Args:
         | 
| 178 179 | 
             
                        base: Base configuration
         | 
| 179 180 | 
             
                        overlay: Configuration to merge in
         | 
| 180 | 
            -
             | 
| 181 | 
            +
             | 
| 181 182 | 
             
                    Returns:
         | 
| 182 183 | 
             
                        Merged configuration
         | 
| 183 184 | 
             
                    """
         | 
| 184 185 | 
             
                    result = base.copy()
         | 
| 185 | 
            -
             | 
| 186 | 
            +
             | 
| 186 187 | 
             
                    for key, value in overlay.items():
         | 
| 187 | 
            -
                        if  | 
| 188 | 
            +
                        if (
         | 
| 189 | 
            +
                            key in result
         | 
| 190 | 
            +
                            and isinstance(result[key], dict)
         | 
| 191 | 
            +
                            and isinstance(value, dict)
         | 
| 192 | 
            +
                        ):
         | 
| 188 193 | 
             
                            result[key] = self._merge_configs(result[key], value)
         | 
| 189 194 | 
             
                        else:
         | 
| 190 195 | 
             
                            result[key] = value
         | 
| 191 | 
            -
             | 
| 196 | 
            +
             | 
| 192 197 | 
             
                    return result
         | 
| 193 | 
            -
             | 
| 198 | 
            +
             | 
| 194 199 | 
             
                def create_default_config(self, path: Path) -> bool:
         | 
| 195 200 | 
             
                    """
         | 
| 196 201 | 
             
                    Create a default configuration file.
         | 
| 197 | 
            -
             | 
| 202 | 
            +
             | 
| 198 203 | 
             
                    Args:
         | 
| 199 204 | 
             
                        path: Path where to create the configuration file
         | 
| 200 | 
            -
             | 
| 205 | 
            +
             | 
| 201 206 | 
             
                    Returns:
         | 
| 202 207 | 
             
                        True if file created successfully
         | 
| 203 208 | 
             
                    """
         | 
| 204 209 | 
             
                    from .configuration import MCPConfiguration
         | 
| 205 | 
            -
             | 
| 210 | 
            +
             | 
| 206 211 | 
             
                    try:
         | 
| 207 212 | 
             
                        expanded_path = path.expanduser()
         | 
| 208 213 | 
             
                        expanded_path.parent.mkdir(parents=True, exist_ok=True)
         | 
| 209 | 
            -
             | 
| 210 | 
            -
                        with open(expanded_path,  | 
| 214 | 
            +
             | 
| 215 | 
            +
                        with open(expanded_path, "w") as f:
         | 
| 211 216 | 
             
                            yaml.dump(
         | 
| 212 217 | 
             
                                MCPConfiguration.DEFAULT_CONFIG,
         | 
| 213 218 | 
             
                                f,
         | 
| 214 219 | 
             
                                default_flow_style=False,
         | 
| 215 | 
            -
                                sort_keys=True
         | 
| 220 | 
            +
                                sort_keys=True,
         | 
| 216 221 | 
             
                            )
         | 
| 217 | 
            -
             | 
| 222 | 
            +
             | 
| 218 223 | 
             
                        self.logger.info(f"Created default configuration at {expanded_path}")
         | 
| 219 224 | 
             
                        return True
         | 
| 220 | 
            -
             | 
| 225 | 
            +
             | 
| 221 226 | 
             
                    except Exception as e:
         | 
| 222 227 | 
             
                        self.logger.error(f"Failed to create default configuration: {e}")
         | 
| 223 228 | 
             
                        return False
         | 
| 224 | 
            -
             | 
| 229 | 
            +
             | 
| 225 230 | 
             
                def list_config_locations(self) -> List[str]:
         | 
| 226 231 | 
             
                    """
         | 
| 227 232 | 
             
                    List all configuration file search locations.
         | 
| 228 | 
            -
             | 
| 233 | 
            +
             | 
| 229 234 | 
             
                    Returns:
         | 
| 230 235 | 
             
                        List of configuration file paths (as strings)
         | 
| 231 236 | 
             
                    """
         | 
| 232 | 
            -
                    return [str(path.expanduser()) for path in self.CONFIG_SEARCH_PATHS]
         | 
| 237 | 
            +
                    return [str(path.expanduser()) for path in self.CONFIG_SEARCH_PATHS]
         |