claude-mpm 3.9.11__py3-none-any.whl → 4.0.3__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- claude_mpm/VERSION +1 -1
- claude_mpm/__init__.py +2 -2
- claude_mpm/__main__.py +3 -2
- claude_mpm/agents/__init__.py +85 -79
- claude_mpm/agents/agent_loader.py +464 -1003
- claude_mpm/agents/agent_loader_integration.py +45 -45
- claude_mpm/agents/agents_metadata.py +29 -30
- claude_mpm/agents/async_agent_loader.py +156 -138
- claude_mpm/agents/base_agent.json +1 -1
- claude_mpm/agents/base_agent_loader.py +179 -151
- claude_mpm/agents/frontmatter_validator.py +229 -130
- claude_mpm/agents/schema/agent_schema.json +1 -1
- claude_mpm/agents/system_agent_config.py +213 -147
- claude_mpm/agents/templates/__init__.py +13 -13
- claude_mpm/agents/templates/code_analyzer.json +2 -2
- claude_mpm/agents/templates/data_engineer.json +1 -1
- claude_mpm/agents/templates/documentation.json +23 -11
- claude_mpm/agents/templates/engineer.json +22 -6
- claude_mpm/agents/templates/memory_manager.json +1 -1
- claude_mpm/agents/templates/ops.json +2 -2
- claude_mpm/agents/templates/project_organizer.json +1 -1
- claude_mpm/agents/templates/qa.json +1 -1
- claude_mpm/agents/templates/refactoring_engineer.json +222 -0
- claude_mpm/agents/templates/research.json +20 -14
- claude_mpm/agents/templates/security.json +1 -1
- claude_mpm/agents/templates/ticketing.json +1 -1
- claude_mpm/agents/templates/version_control.json +1 -1
- claude_mpm/agents/templates/web_qa.json +3 -1
- claude_mpm/agents/templates/web_ui.json +2 -2
- claude_mpm/cli/__init__.py +79 -51
- claude_mpm/cli/__main__.py +3 -2
- claude_mpm/cli/commands/__init__.py +20 -20
- claude_mpm/cli/commands/agents.py +279 -247
- claude_mpm/cli/commands/aggregate.py +138 -157
- claude_mpm/cli/commands/cleanup.py +147 -147
- claude_mpm/cli/commands/config.py +93 -76
- claude_mpm/cli/commands/info.py +17 -16
- claude_mpm/cli/commands/mcp.py +140 -905
- claude_mpm/cli/commands/mcp_command_router.py +139 -0
- claude_mpm/cli/commands/mcp_config_commands.py +20 -0
- claude_mpm/cli/commands/mcp_install_commands.py +20 -0
- claude_mpm/cli/commands/mcp_server_commands.py +175 -0
- claude_mpm/cli/commands/mcp_tool_commands.py +34 -0
- claude_mpm/cli/commands/memory.py +239 -203
- claude_mpm/cli/commands/monitor.py +203 -81
- claude_mpm/cli/commands/run.py +380 -429
- claude_mpm/cli/commands/run_config_checker.py +160 -0
- claude_mpm/cli/commands/socketio_monitor.py +235 -0
- claude_mpm/cli/commands/tickets.py +305 -197
- claude_mpm/cli/parser.py +24 -1156
- claude_mpm/cli/parsers/__init__.py +29 -0
- claude_mpm/cli/parsers/agents_parser.py +136 -0
- claude_mpm/cli/parsers/base_parser.py +331 -0
- claude_mpm/cli/parsers/config_parser.py +85 -0
- claude_mpm/cli/parsers/mcp_parser.py +152 -0
- claude_mpm/cli/parsers/memory_parser.py +138 -0
- claude_mpm/cli/parsers/monitor_parser.py +104 -0
- claude_mpm/cli/parsers/run_parser.py +147 -0
- claude_mpm/cli/parsers/tickets_parser.py +203 -0
- claude_mpm/cli/ticket_cli.py +7 -3
- claude_mpm/cli/utils.py +55 -37
- claude_mpm/cli_module/__init__.py +6 -6
- claude_mpm/cli_module/args.py +188 -140
- claude_mpm/cli_module/commands.py +79 -70
- claude_mpm/cli_module/migration_example.py +38 -60
- claude_mpm/config/__init__.py +32 -25
- claude_mpm/config/agent_config.py +151 -119
- claude_mpm/config/experimental_features.py +71 -73
- claude_mpm/config/paths.py +94 -208
- claude_mpm/config/socketio_config.py +84 -73
- claude_mpm/constants.py +35 -18
- claude_mpm/core/__init__.py +9 -6
- claude_mpm/core/agent_name_normalizer.py +68 -71
- claude_mpm/core/agent_registry.py +372 -521
- claude_mpm/core/agent_session_manager.py +74 -63
- claude_mpm/core/base_service.py +116 -87
- claude_mpm/core/cache.py +119 -153
- claude_mpm/core/claude_runner.py +425 -1120
- claude_mpm/core/config.py +263 -168
- claude_mpm/core/config_aliases.py +69 -61
- claude_mpm/core/config_constants.py +292 -0
- claude_mpm/core/constants.py +57 -99
- claude_mpm/core/container.py +211 -178
- claude_mpm/core/exceptions.py +233 -89
- claude_mpm/core/factories.py +92 -54
- claude_mpm/core/framework_loader.py +378 -220
- claude_mpm/core/hook_manager.py +198 -83
- claude_mpm/core/hook_performance_config.py +136 -0
- claude_mpm/core/injectable_service.py +61 -55
- claude_mpm/core/interactive_session.py +165 -155
- claude_mpm/core/interfaces.py +221 -195
- claude_mpm/core/lazy.py +96 -96
- claude_mpm/core/logger.py +133 -107
- claude_mpm/core/logging_config.py +185 -157
- claude_mpm/core/minimal_framework_loader.py +20 -15
- claude_mpm/core/mixins.py +30 -29
- claude_mpm/core/oneshot_session.py +215 -181
- claude_mpm/core/optimized_agent_loader.py +134 -138
- claude_mpm/core/optimized_startup.py +159 -157
- claude_mpm/core/pm_hook_interceptor.py +85 -72
- claude_mpm/core/service_registry.py +103 -101
- claude_mpm/core/session_manager.py +97 -87
- claude_mpm/core/socketio_pool.py +212 -158
- claude_mpm/core/tool_access_control.py +58 -51
- claude_mpm/core/types.py +46 -24
- claude_mpm/core/typing_utils.py +166 -82
- claude_mpm/core/unified_agent_registry.py +721 -0
- claude_mpm/core/unified_config.py +550 -0
- claude_mpm/core/unified_paths.py +549 -0
- claude_mpm/dashboard/index.html +1 -1
- claude_mpm/dashboard/open_dashboard.py +51 -17
- claude_mpm/dashboard/static/css/dashboard.css +27 -8
- claude_mpm/dashboard/static/dist/components/agent-inference.js +2 -0
- claude_mpm/dashboard/static/dist/components/event-processor.js +2 -0
- claude_mpm/dashboard/static/dist/components/event-viewer.js +2 -0
- claude_mpm/dashboard/static/dist/components/export-manager.js +2 -0
- claude_mpm/dashboard/static/dist/components/file-tool-tracker.js +2 -0
- claude_mpm/dashboard/static/dist/components/hud-library-loader.js +2 -0
- claude_mpm/dashboard/static/dist/components/hud-manager.js +2 -0
- claude_mpm/dashboard/static/dist/components/hud-visualizer.js +2 -0
- claude_mpm/dashboard/static/dist/components/module-viewer.js +2 -0
- claude_mpm/dashboard/static/dist/components/session-manager.js +2 -0
- claude_mpm/dashboard/static/dist/components/socket-manager.js +2 -0
- claude_mpm/dashboard/static/dist/components/ui-state-manager.js +2 -0
- claude_mpm/dashboard/static/dist/components/working-directory.js +2 -0
- claude_mpm/dashboard/static/dist/dashboard.js +2 -0
- claude_mpm/dashboard/static/dist/socket-client.js +2 -0
- claude_mpm/dashboard/static/js/components/agent-inference.js +80 -76
- claude_mpm/dashboard/static/js/components/event-processor.js +71 -67
- claude_mpm/dashboard/static/js/components/event-viewer.js +74 -70
- claude_mpm/dashboard/static/js/components/export-manager.js +31 -28
- claude_mpm/dashboard/static/js/components/file-tool-tracker.js +106 -92
- claude_mpm/dashboard/static/js/components/hud-library-loader.js +11 -11
- claude_mpm/dashboard/static/js/components/hud-manager.js +73 -73
- claude_mpm/dashboard/static/js/components/hud-visualizer.js +163 -163
- claude_mpm/dashboard/static/js/components/module-viewer.js +305 -233
- claude_mpm/dashboard/static/js/components/session-manager.js +32 -29
- claude_mpm/dashboard/static/js/components/socket-manager.js +27 -20
- claude_mpm/dashboard/static/js/components/ui-state-manager.js +21 -18
- claude_mpm/dashboard/static/js/components/working-directory.js +74 -71
- claude_mpm/dashboard/static/js/dashboard.js +178 -453
- claude_mpm/dashboard/static/js/extension-error-handler.js +164 -0
- claude_mpm/dashboard/static/js/socket-client.js +120 -54
- claude_mpm/dashboard/templates/index.html +40 -50
- claude_mpm/experimental/cli_enhancements.py +60 -58
- claude_mpm/generators/__init__.py +1 -1
- claude_mpm/generators/agent_profile_generator.py +75 -65
- claude_mpm/hooks/__init__.py +1 -1
- claude_mpm/hooks/base_hook.py +33 -28
- claude_mpm/hooks/claude_hooks/__init__.py +1 -1
- claude_mpm/hooks/claude_hooks/connection_pool.py +120 -0
- claude_mpm/hooks/claude_hooks/event_handlers.py +743 -0
- claude_mpm/hooks/claude_hooks/hook_handler.py +415 -1331
- claude_mpm/hooks/claude_hooks/hook_wrapper.sh +4 -4
- claude_mpm/hooks/claude_hooks/memory_integration.py +221 -0
- claude_mpm/hooks/claude_hooks/response_tracking.py +348 -0
- claude_mpm/hooks/claude_hooks/tool_analysis.py +230 -0
- claude_mpm/hooks/memory_integration_hook.py +140 -100
- claude_mpm/hooks/tool_call_interceptor.py +89 -76
- claude_mpm/hooks/validation_hooks.py +57 -49
- claude_mpm/init.py +145 -121
- claude_mpm/models/__init__.py +9 -9
- claude_mpm/models/agent_definition.py +33 -23
- claude_mpm/models/agent_session.py +228 -200
- claude_mpm/scripts/__init__.py +1 -1
- claude_mpm/scripts/socketio_daemon.py +192 -75
- claude_mpm/scripts/socketio_server_manager.py +328 -0
- claude_mpm/scripts/start_activity_logging.py +25 -22
- claude_mpm/services/__init__.py +68 -43
- claude_mpm/services/agent_capabilities_service.py +271 -0
- claude_mpm/services/agents/__init__.py +23 -32
- claude_mpm/services/agents/deployment/__init__.py +3 -3
- claude_mpm/services/agents/deployment/agent_config_provider.py +310 -0
- claude_mpm/services/agents/deployment/agent_configuration_manager.py +359 -0
- claude_mpm/services/agents/deployment/agent_definition_factory.py +84 -0
- claude_mpm/services/agents/deployment/agent_deployment.py +415 -2113
- claude_mpm/services/agents/deployment/agent_discovery_service.py +387 -0
- claude_mpm/services/agents/deployment/agent_environment_manager.py +293 -0
- claude_mpm/services/agents/deployment/agent_filesystem_manager.py +387 -0
- claude_mpm/services/agents/deployment/agent_format_converter.py +453 -0
- claude_mpm/services/agents/deployment/agent_frontmatter_validator.py +161 -0
- claude_mpm/services/agents/deployment/agent_lifecycle_manager.py +345 -495
- claude_mpm/services/agents/deployment/agent_metrics_collector.py +279 -0
- claude_mpm/services/agents/deployment/agent_restore_handler.py +88 -0
- claude_mpm/services/agents/deployment/agent_template_builder.py +406 -0
- claude_mpm/services/agents/deployment/agent_validator.py +352 -0
- claude_mpm/services/agents/deployment/agent_version_manager.py +313 -0
- claude_mpm/services/agents/deployment/agent_versioning.py +6 -9
- claude_mpm/services/agents/deployment/agents_directory_resolver.py +79 -0
- claude_mpm/services/agents/deployment/async_agent_deployment.py +298 -234
- claude_mpm/services/agents/deployment/config/__init__.py +13 -0
- claude_mpm/services/agents/deployment/config/deployment_config.py +182 -0
- claude_mpm/services/agents/deployment/config/deployment_config_manager.py +200 -0
- claude_mpm/services/agents/deployment/deployment_config_loader.py +54 -0
- claude_mpm/services/agents/deployment/deployment_type_detector.py +124 -0
- claude_mpm/services/agents/deployment/facade/__init__.py +18 -0
- claude_mpm/services/agents/deployment/facade/async_deployment_executor.py +159 -0
- claude_mpm/services/agents/deployment/facade/deployment_executor.py +73 -0
- claude_mpm/services/agents/deployment/facade/deployment_facade.py +270 -0
- claude_mpm/services/agents/deployment/facade/sync_deployment_executor.py +178 -0
- claude_mpm/services/agents/deployment/interface_adapter.py +227 -0
- claude_mpm/services/agents/deployment/lifecycle_health_checker.py +85 -0
- claude_mpm/services/agents/deployment/lifecycle_performance_tracker.py +100 -0
- claude_mpm/services/agents/deployment/pipeline/__init__.py +32 -0
- claude_mpm/services/agents/deployment/pipeline/pipeline_builder.py +158 -0
- claude_mpm/services/agents/deployment/pipeline/pipeline_context.py +159 -0
- claude_mpm/services/agents/deployment/pipeline/pipeline_executor.py +169 -0
- claude_mpm/services/agents/deployment/pipeline/steps/__init__.py +19 -0
- claude_mpm/services/agents/deployment/pipeline/steps/agent_processing_step.py +195 -0
- claude_mpm/services/agents/deployment/pipeline/steps/base_step.py +119 -0
- claude_mpm/services/agents/deployment/pipeline/steps/configuration_step.py +79 -0
- claude_mpm/services/agents/deployment/pipeline/steps/target_directory_step.py +90 -0
- claude_mpm/services/agents/deployment/pipeline/steps/validation_step.py +100 -0
- claude_mpm/services/agents/deployment/processors/__init__.py +15 -0
- claude_mpm/services/agents/deployment/processors/agent_deployment_context.py +98 -0
- claude_mpm/services/agents/deployment/processors/agent_deployment_result.py +235 -0
- claude_mpm/services/agents/deployment/processors/agent_processor.py +258 -0
- claude_mpm/services/agents/deployment/refactored_agent_deployment_service.py +318 -0
- claude_mpm/services/agents/deployment/results/__init__.py +13 -0
- claude_mpm/services/agents/deployment/results/deployment_metrics.py +200 -0
- claude_mpm/services/agents/deployment/results/deployment_result_builder.py +249 -0
- claude_mpm/services/agents/deployment/strategies/__init__.py +25 -0
- claude_mpm/services/agents/deployment/strategies/base_strategy.py +119 -0
- claude_mpm/services/agents/deployment/strategies/project_strategy.py +150 -0
- claude_mpm/services/agents/deployment/strategies/strategy_selector.py +117 -0
- claude_mpm/services/agents/deployment/strategies/system_strategy.py +116 -0
- claude_mpm/services/agents/deployment/strategies/user_strategy.py +137 -0
- claude_mpm/services/agents/deployment/system_instructions_deployer.py +108 -0
- claude_mpm/services/agents/deployment/validation/__init__.py +19 -0
- claude_mpm/services/agents/deployment/validation/agent_validator.py +323 -0
- claude_mpm/services/agents/deployment/validation/deployment_validator.py +238 -0
- claude_mpm/services/agents/deployment/validation/template_validator.py +299 -0
- claude_mpm/services/agents/deployment/validation/validation_result.py +226 -0
- claude_mpm/services/agents/loading/__init__.py +2 -2
- claude_mpm/services/agents/loading/agent_profile_loader.py +259 -229
- claude_mpm/services/agents/loading/base_agent_manager.py +90 -81
- claude_mpm/services/agents/loading/framework_agent_loader.py +154 -129
- claude_mpm/services/agents/management/__init__.py +2 -2
- claude_mpm/services/agents/management/agent_capabilities_generator.py +72 -58
- claude_mpm/services/agents/management/agent_management_service.py +209 -156
- claude_mpm/services/agents/memory/__init__.py +9 -6
- claude_mpm/services/agents/memory/agent_memory_manager.py +218 -1152
- claude_mpm/services/agents/memory/agent_persistence_service.py +20 -16
- claude_mpm/services/agents/memory/analyzer.py +430 -0
- claude_mpm/services/agents/memory/content_manager.py +376 -0
- claude_mpm/services/agents/memory/template_generator.py +468 -0
- claude_mpm/services/agents/registry/__init__.py +7 -10
- claude_mpm/services/agents/registry/deployed_agent_discovery.py +122 -97
- claude_mpm/services/agents/registry/modification_tracker.py +351 -285
- claude_mpm/services/async_session_logger.py +187 -153
- claude_mpm/services/claude_session_logger.py +87 -72
- claude_mpm/services/command_handler_service.py +217 -0
- claude_mpm/services/communication/__init__.py +3 -2
- claude_mpm/services/core/__init__.py +50 -97
- claude_mpm/services/core/base.py +60 -53
- claude_mpm/services/core/interfaces/__init__.py +188 -0
- claude_mpm/services/core/interfaces/agent.py +351 -0
- claude_mpm/services/core/interfaces/communication.py +343 -0
- claude_mpm/services/core/interfaces/infrastructure.py +413 -0
- claude_mpm/services/core/interfaces/service.py +434 -0
- claude_mpm/services/core/interfaces.py +19 -944
- claude_mpm/services/event_aggregator.py +208 -170
- claude_mpm/services/exceptions.py +387 -308
- claude_mpm/services/framework_claude_md_generator/__init__.py +75 -79
- claude_mpm/services/framework_claude_md_generator/content_assembler.py +69 -60
- claude_mpm/services/framework_claude_md_generator/content_validator.py +65 -61
- claude_mpm/services/framework_claude_md_generator/deployment_manager.py +68 -49
- claude_mpm/services/framework_claude_md_generator/section_generators/__init__.py +34 -34
- claude_mpm/services/framework_claude_md_generator/section_generators/agents.py +25 -22
- claude_mpm/services/framework_claude_md_generator/section_generators/claude_pm_init.py +10 -10
- claude_mpm/services/framework_claude_md_generator/section_generators/core_responsibilities.py +4 -3
- claude_mpm/services/framework_claude_md_generator/section_generators/delegation_constraints.py +4 -3
- claude_mpm/services/framework_claude_md_generator/section_generators/environment_config.py +4 -3
- claude_mpm/services/framework_claude_md_generator/section_generators/footer.py +6 -5
- claude_mpm/services/framework_claude_md_generator/section_generators/header.py +8 -7
- claude_mpm/services/framework_claude_md_generator/section_generators/orchestration_principles.py +4 -3
- claude_mpm/services/framework_claude_md_generator/section_generators/role_designation.py +6 -5
- claude_mpm/services/framework_claude_md_generator/section_generators/subprocess_validation.py +9 -8
- claude_mpm/services/framework_claude_md_generator/section_generators/todo_task_tools.py +4 -3
- claude_mpm/services/framework_claude_md_generator/section_generators/troubleshooting.py +5 -4
- claude_mpm/services/framework_claude_md_generator/section_manager.py +28 -27
- claude_mpm/services/framework_claude_md_generator/version_manager.py +30 -28
- claude_mpm/services/hook_service.py +106 -114
- claude_mpm/services/infrastructure/__init__.py +7 -5
- claude_mpm/services/infrastructure/context_preservation.py +233 -199
- claude_mpm/services/infrastructure/daemon_manager.py +279 -0
- claude_mpm/services/infrastructure/logging.py +83 -76
- claude_mpm/services/infrastructure/monitoring.py +547 -404
- claude_mpm/services/mcp_gateway/__init__.py +30 -13
- claude_mpm/services/mcp_gateway/config/__init__.py +2 -2
- claude_mpm/services/mcp_gateway/config/config_loader.py +61 -56
- claude_mpm/services/mcp_gateway/config/config_schema.py +50 -41
- claude_mpm/services/mcp_gateway/config/configuration.py +82 -75
- claude_mpm/services/mcp_gateway/core/__init__.py +13 -20
- claude_mpm/services/mcp_gateway/core/base.py +80 -67
- claude_mpm/services/mcp_gateway/core/exceptions.py +60 -46
- claude_mpm/services/mcp_gateway/core/interfaces.py +87 -84
- claude_mpm/services/mcp_gateway/main.py +287 -137
- claude_mpm/services/mcp_gateway/registry/__init__.py +1 -1
- claude_mpm/services/mcp_gateway/registry/service_registry.py +97 -94
- claude_mpm/services/mcp_gateway/registry/tool_registry.py +135 -126
- claude_mpm/services/mcp_gateway/server/__init__.py +2 -2
- claude_mpm/services/mcp_gateway/server/mcp_gateway.py +105 -110
- claude_mpm/services/mcp_gateway/server/stdio_handler.py +105 -107
- claude_mpm/services/mcp_gateway/server/stdio_server.py +691 -0
- claude_mpm/services/mcp_gateway/tools/__init__.py +4 -2
- claude_mpm/services/mcp_gateway/tools/base_adapter.py +109 -119
- claude_mpm/services/mcp_gateway/tools/document_summarizer.py +283 -215
- claude_mpm/services/mcp_gateway/tools/hello_world.py +122 -120
- claude_mpm/services/mcp_gateway/tools/ticket_tools.py +652 -0
- claude_mpm/services/mcp_gateway/tools/unified_ticket_tool.py +606 -0
- claude_mpm/services/memory/__init__.py +2 -2
- claude_mpm/services/memory/builder.py +451 -362
- claude_mpm/services/memory/cache/__init__.py +2 -2
- claude_mpm/services/memory/cache/shared_prompt_cache.py +232 -194
- claude_mpm/services/memory/cache/simple_cache.py +107 -93
- claude_mpm/services/memory/indexed_memory.py +195 -193
- claude_mpm/services/memory/optimizer.py +267 -234
- claude_mpm/services/memory/router.py +571 -263
- claude_mpm/services/memory_hook_service.py +237 -0
- claude_mpm/services/port_manager.py +223 -0
- claude_mpm/services/project/__init__.py +3 -3
- claude_mpm/services/project/analyzer.py +451 -305
- claude_mpm/services/project/registry.py +262 -240
- claude_mpm/services/recovery_manager.py +287 -231
- claude_mpm/services/response_tracker.py +87 -67
- claude_mpm/services/runner_configuration_service.py +587 -0
- claude_mpm/services/session_management_service.py +304 -0
- claude_mpm/services/socketio/__init__.py +4 -4
- claude_mpm/services/socketio/client_proxy.py +174 -0
- claude_mpm/services/socketio/handlers/__init__.py +3 -3
- claude_mpm/services/socketio/handlers/base.py +44 -30
- claude_mpm/services/socketio/handlers/connection.py +145 -65
- claude_mpm/services/socketio/handlers/file.py +123 -108
- claude_mpm/services/socketio/handlers/git.py +607 -373
- claude_mpm/services/socketio/handlers/hook.py +170 -0
- claude_mpm/services/socketio/handlers/memory.py +4 -4
- claude_mpm/services/socketio/handlers/project.py +4 -4
- claude_mpm/services/socketio/handlers/registry.py +53 -38
- claude_mpm/services/socketio/server/__init__.py +18 -0
- claude_mpm/services/socketio/server/broadcaster.py +252 -0
- claude_mpm/services/socketio/server/core.py +399 -0
- claude_mpm/services/socketio/server/main.py +323 -0
- claude_mpm/services/socketio_client_manager.py +160 -133
- claude_mpm/services/socketio_server.py +36 -1885
- claude_mpm/services/subprocess_launcher_service.py +316 -0
- claude_mpm/services/system_instructions_service.py +258 -0
- claude_mpm/services/ticket_manager.py +19 -533
- claude_mpm/services/utility_service.py +285 -0
- claude_mpm/services/version_control/__init__.py +18 -21
- claude_mpm/services/version_control/branch_strategy.py +20 -10
- claude_mpm/services/version_control/conflict_resolution.py +37 -13
- claude_mpm/services/version_control/git_operations.py +52 -21
- claude_mpm/services/version_control/semantic_versioning.py +92 -53
- claude_mpm/services/version_control/version_parser.py +145 -125
- claude_mpm/services/version_service.py +270 -0
- claude_mpm/storage/__init__.py +2 -2
- claude_mpm/storage/state_storage.py +177 -181
- claude_mpm/ticket_wrapper.py +2 -2
- claude_mpm/utils/__init__.py +2 -2
- claude_mpm/utils/agent_dependency_loader.py +453 -243
- claude_mpm/utils/config_manager.py +157 -118
- claude_mpm/utils/console.py +1 -1
- claude_mpm/utils/dependency_cache.py +102 -107
- claude_mpm/utils/dependency_manager.py +52 -47
- claude_mpm/utils/dependency_strategies.py +131 -96
- claude_mpm/utils/environment_context.py +110 -102
- claude_mpm/utils/error_handler.py +75 -55
- claude_mpm/utils/file_utils.py +80 -67
- claude_mpm/utils/framework_detection.py +12 -11
- claude_mpm/utils/import_migration_example.py +12 -60
- claude_mpm/utils/imports.py +48 -45
- claude_mpm/utils/path_operations.py +100 -93
- claude_mpm/utils/robust_installer.py +172 -164
- claude_mpm/utils/session_logging.py +30 -23
- claude_mpm/utils/subprocess_utils.py +99 -61
- claude_mpm/validation/__init__.py +1 -1
- claude_mpm/validation/agent_validator.py +151 -111
- claude_mpm/validation/frontmatter_validator.py +92 -71
- {claude_mpm-3.9.11.dist-info → claude_mpm-4.0.3.dist-info}/METADATA +27 -1
- claude_mpm-4.0.3.dist-info/RECORD +402 -0
- {claude_mpm-3.9.11.dist-info → claude_mpm-4.0.3.dist-info}/entry_points.txt +1 -0
- {claude_mpm-3.9.11.dist-info → claude_mpm-4.0.3.dist-info}/licenses/LICENSE +1 -1
- claude_mpm/cli/commands/run_guarded.py +0 -511
- claude_mpm/config/memory_guardian_config.py +0 -325
- claude_mpm/config/memory_guardian_yaml.py +0 -335
- claude_mpm/core/config_paths.py +0 -150
- claude_mpm/core/memory_aware_runner.py +0 -353
- claude_mpm/dashboard/static/js/dashboard-original.js +0 -4134
- claude_mpm/deployment_paths.py +0 -261
- claude_mpm/hooks/claude_hooks/hook_handler_fixed.py +0 -454
- claude_mpm/models/state_models.py +0 -433
- claude_mpm/services/agent/__init__.py +0 -24
- claude_mpm/services/agent/deployment.py +0 -2548
- claude_mpm/services/agent/management.py +0 -598
- claude_mpm/services/agent/registry.py +0 -813
- claude_mpm/services/agents/registry/agent_registry.py +0 -813
- claude_mpm/services/communication/socketio.py +0 -1935
- claude_mpm/services/communication/websocket.py +0 -479
- claude_mpm/services/framework_claude_md_generator.py +0 -624
- claude_mpm/services/health_monitor.py +0 -893
- claude_mpm/services/infrastructure/graceful_degradation.py +0 -616
- claude_mpm/services/infrastructure/health_monitor.py +0 -775
- claude_mpm/services/infrastructure/memory_dashboard.py +0 -479
- claude_mpm/services/infrastructure/memory_guardian.py +0 -944
- claude_mpm/services/infrastructure/restart_protection.py +0 -642
- claude_mpm/services/infrastructure/state_manager.py +0 -774
- claude_mpm/services/mcp_gateway/manager.py +0 -334
- claude_mpm/services/optimized_hook_service.py +0 -542
- claude_mpm/services/project_analyzer.py +0 -864
- claude_mpm/services/project_registry.py +0 -608
- claude_mpm/services/standalone_socketio_server.py +0 -1300
- claude_mpm/services/ticket_manager_di.py +0 -318
- claude_mpm/services/ticketing_service_original.py +0 -510
- claude_mpm/utils/paths.py +0 -395
- claude_mpm/utils/platform_memory.py +0 -524
- claude_mpm-3.9.11.dist-info/RECORD +0 -306
- {claude_mpm-3.9.11.dist-info → claude_mpm-4.0.3.dist-info}/WHEEL +0 -0
- {claude_mpm-3.9.11.dist-info → claude_mpm-4.0.3.dist-info}/top_level.txt +0 -0
| @@ -0,0 +1,13 @@ | |
| 1 | 
            +
            """Configuration management for agent deployment.
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            This module provides configuration management specifically for agent deployment,
         | 
| 4 | 
            +
            including loading, validation, and processing of deployment-specific settings.
         | 
| 5 | 
            +
            """
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            from .deployment_config import DeploymentConfig
         | 
| 8 | 
            +
            from .deployment_config_manager import DeploymentConfigManager
         | 
| 9 | 
            +
             | 
| 10 | 
            +
            __all__ = [
         | 
| 11 | 
            +
                "DeploymentConfigManager",
         | 
| 12 | 
            +
                "DeploymentConfig",
         | 
| 13 | 
            +
            ]
         | 
| @@ -0,0 +1,182 @@ | |
| 1 | 
            +
            """Deployment configuration data class."""
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            from dataclasses import dataclass, field
         | 
| 4 | 
            +
            from pathlib import Path
         | 
| 5 | 
            +
            from typing import Any, Dict, List, Optional
         | 
| 6 | 
            +
             | 
| 7 | 
            +
             | 
| 8 | 
            +
            @dataclass
         | 
| 9 | 
            +
            class DeploymentConfig:
         | 
| 10 | 
            +
                """Configuration for agent deployment operations.
         | 
| 11 | 
            +
             | 
| 12 | 
            +
                This class encapsulates all configuration settings related to
         | 
| 13 | 
            +
                agent deployment, providing a clean interface for accessing
         | 
| 14 | 
            +
                deployment-specific settings.
         | 
| 15 | 
            +
                """
         | 
| 16 | 
            +
             | 
| 17 | 
            +
                # Agent exclusion settings
         | 
| 18 | 
            +
                excluded_agents: List[str] = field(default_factory=list)
         | 
| 19 | 
            +
                case_sensitive_exclusion: bool = True
         | 
| 20 | 
            +
                user_excluded_agents: List[str] = field(default_factory=list)
         | 
| 21 | 
            +
             | 
| 22 | 
            +
                # Deployment behavior settings
         | 
| 23 | 
            +
                force_rebuild: bool = False
         | 
| 24 | 
            +
                deployment_mode: str = "update"  # "update" or "project"
         | 
| 25 | 
            +
                use_async: bool = False
         | 
| 26 | 
            +
             | 
| 27 | 
            +
                # Directory settings
         | 
| 28 | 
            +
                target_dir: Optional[Path] = None
         | 
| 29 | 
            +
                templates_dir: Optional[Path] = None
         | 
| 30 | 
            +
                base_agent_path: Optional[Path] = None
         | 
| 31 | 
            +
                working_directory: Optional[Path] = None
         | 
| 32 | 
            +
             | 
| 33 | 
            +
                # System instructions settings
         | 
| 34 | 
            +
                deploy_system_instructions: bool = True
         | 
| 35 | 
            +
                deploy_user_instructions: bool = True
         | 
| 36 | 
            +
             | 
| 37 | 
            +
                # Validation and repair settings
         | 
| 38 | 
            +
                repair_existing_agents: bool = True
         | 
| 39 | 
            +
                validate_agents: bool = True
         | 
| 40 | 
            +
             | 
| 41 | 
            +
                # Metrics and logging settings
         | 
| 42 | 
            +
                collect_metrics: bool = True
         | 
| 43 | 
            +
                log_level: str = "INFO"
         | 
| 44 | 
            +
             | 
| 45 | 
            +
                # Performance settings
         | 
| 46 | 
            +
                max_concurrent_operations: int = 10
         | 
| 47 | 
            +
                timeout_seconds: int = 300
         | 
| 48 | 
            +
             | 
| 49 | 
            +
                # Environment settings
         | 
| 50 | 
            +
                environment: str = "production"  # "development", "testing", "production"
         | 
| 51 | 
            +
             | 
| 52 | 
            +
                # Additional settings
         | 
| 53 | 
            +
                extra_settings: Dict[str, Any] = field(default_factory=dict)
         | 
| 54 | 
            +
             | 
| 55 | 
            +
                def is_development_mode(self) -> bool:
         | 
| 56 | 
            +
                    """Check if running in development mode.
         | 
| 57 | 
            +
             | 
| 58 | 
            +
                    Returns:
         | 
| 59 | 
            +
                        True if in development mode
         | 
| 60 | 
            +
                    """
         | 
| 61 | 
            +
                    return self.environment == "development"
         | 
| 62 | 
            +
             | 
| 63 | 
            +
                def is_testing_mode(self) -> bool:
         | 
| 64 | 
            +
                    """Check if running in testing mode.
         | 
| 65 | 
            +
             | 
| 66 | 
            +
                    Returns:
         | 
| 67 | 
            +
                        True if in testing mode
         | 
| 68 | 
            +
                    """
         | 
| 69 | 
            +
                    return self.environment == "testing"
         | 
| 70 | 
            +
             | 
| 71 | 
            +
                def is_production_mode(self) -> bool:
         | 
| 72 | 
            +
                    """Check if running in production mode.
         | 
| 73 | 
            +
             | 
| 74 | 
            +
                    Returns:
         | 
| 75 | 
            +
                        True if in production mode
         | 
| 76 | 
            +
                    """
         | 
| 77 | 
            +
                    return self.environment == "production"
         | 
| 78 | 
            +
             | 
| 79 | 
            +
                def should_exclude_agent(self, agent_name: str) -> bool:
         | 
| 80 | 
            +
                    """Check if an agent should be excluded from deployment.
         | 
| 81 | 
            +
             | 
| 82 | 
            +
                    Args:
         | 
| 83 | 
            +
                        agent_name: Name of the agent to check
         | 
| 84 | 
            +
             | 
| 85 | 
            +
                    Returns:
         | 
| 86 | 
            +
                        True if the agent should be excluded
         | 
| 87 | 
            +
                    """
         | 
| 88 | 
            +
                    if self.case_sensitive_exclusion:
         | 
| 89 | 
            +
                        return agent_name in self.excluded_agents
         | 
| 90 | 
            +
                    else:
         | 
| 91 | 
            +
                        return agent_name.lower() in [name.lower() for name in self.excluded_agents]
         | 
| 92 | 
            +
             | 
| 93 | 
            +
                def get_effective_excluded_agents(self) -> List[str]:
         | 
| 94 | 
            +
                    """Get the effective list of excluded agents.
         | 
| 95 | 
            +
             | 
| 96 | 
            +
                    Combines regular excluded agents with user-specific exclusions.
         | 
| 97 | 
            +
             | 
| 98 | 
            +
                    Returns:
         | 
| 99 | 
            +
                        List of all excluded agent names
         | 
| 100 | 
            +
                    """
         | 
| 101 | 
            +
                    all_excluded = self.excluded_agents.copy()
         | 
| 102 | 
            +
                    all_excluded.extend(self.user_excluded_agents)
         | 
| 103 | 
            +
                    return list(set(all_excluded))  # Remove duplicates
         | 
| 104 | 
            +
             | 
| 105 | 
            +
                def merge_with_dict(self, config_dict: Dict[str, Any]) -> "DeploymentConfig":
         | 
| 106 | 
            +
                    """Merge this config with a dictionary of settings.
         | 
| 107 | 
            +
             | 
| 108 | 
            +
                    Args:
         | 
| 109 | 
            +
                        config_dict: Dictionary of configuration settings
         | 
| 110 | 
            +
             | 
| 111 | 
            +
                    Returns:
         | 
| 112 | 
            +
                        New DeploymentConfig with merged settings
         | 
| 113 | 
            +
                    """
         | 
| 114 | 
            +
                    # Create a copy of current config
         | 
| 115 | 
            +
                    new_config = DeploymentConfig(
         | 
| 116 | 
            +
                        excluded_agents=self.excluded_agents.copy(),
         | 
| 117 | 
            +
                        case_sensitive_exclusion=self.case_sensitive_exclusion,
         | 
| 118 | 
            +
                        user_excluded_agents=self.user_excluded_agents.copy(),
         | 
| 119 | 
            +
                        force_rebuild=self.force_rebuild,
         | 
| 120 | 
            +
                        deployment_mode=self.deployment_mode,
         | 
| 121 | 
            +
                        use_async=self.use_async,
         | 
| 122 | 
            +
                        target_dir=self.target_dir,
         | 
| 123 | 
            +
                        templates_dir=self.templates_dir,
         | 
| 124 | 
            +
                        base_agent_path=self.base_agent_path,
         | 
| 125 | 
            +
                        working_directory=self.working_directory,
         | 
| 126 | 
            +
                        deploy_system_instructions=self.deploy_system_instructions,
         | 
| 127 | 
            +
                        deploy_user_instructions=self.deploy_user_instructions,
         | 
| 128 | 
            +
                        repair_existing_agents=self.repair_existing_agents,
         | 
| 129 | 
            +
                        validate_agents=self.validate_agents,
         | 
| 130 | 
            +
                        collect_metrics=self.collect_metrics,
         | 
| 131 | 
            +
                        log_level=self.log_level,
         | 
| 132 | 
            +
                        max_concurrent_operations=self.max_concurrent_operations,
         | 
| 133 | 
            +
                        timeout_seconds=self.timeout_seconds,
         | 
| 134 | 
            +
                        environment=self.environment,
         | 
| 135 | 
            +
                        extra_settings=self.extra_settings.copy(),
         | 
| 136 | 
            +
                    )
         | 
| 137 | 
            +
             | 
| 138 | 
            +
                    # Update with values from dictionary
         | 
| 139 | 
            +
                    for key, value in config_dict.items():
         | 
| 140 | 
            +
                        if hasattr(new_config, key):
         | 
| 141 | 
            +
                            setattr(new_config, key, value)
         | 
| 142 | 
            +
                        else:
         | 
| 143 | 
            +
                            new_config.extra_settings[key] = value
         | 
| 144 | 
            +
             | 
| 145 | 
            +
                    return new_config
         | 
| 146 | 
            +
             | 
| 147 | 
            +
                def to_dict(self) -> Dict[str, Any]:
         | 
| 148 | 
            +
                    """Convert configuration to dictionary.
         | 
| 149 | 
            +
             | 
| 150 | 
            +
                    Returns:
         | 
| 151 | 
            +
                        Dictionary representation of the configuration
         | 
| 152 | 
            +
                    """
         | 
| 153 | 
            +
                    result = {
         | 
| 154 | 
            +
                        "excluded_agents": self.excluded_agents,
         | 
| 155 | 
            +
                        "case_sensitive_exclusion": self.case_sensitive_exclusion,
         | 
| 156 | 
            +
                        "user_excluded_agents": self.user_excluded_agents,
         | 
| 157 | 
            +
                        "force_rebuild": self.force_rebuild,
         | 
| 158 | 
            +
                        "deployment_mode": self.deployment_mode,
         | 
| 159 | 
            +
                        "use_async": self.use_async,
         | 
| 160 | 
            +
                        "target_dir": str(self.target_dir) if self.target_dir else None,
         | 
| 161 | 
            +
                        "templates_dir": str(self.templates_dir) if self.templates_dir else None,
         | 
| 162 | 
            +
                        "base_agent_path": str(self.base_agent_path)
         | 
| 163 | 
            +
                        if self.base_agent_path
         | 
| 164 | 
            +
                        else None,
         | 
| 165 | 
            +
                        "working_directory": str(self.working_directory)
         | 
| 166 | 
            +
                        if self.working_directory
         | 
| 167 | 
            +
                        else None,
         | 
| 168 | 
            +
                        "deploy_system_instructions": self.deploy_system_instructions,
         | 
| 169 | 
            +
                        "deploy_user_instructions": self.deploy_user_instructions,
         | 
| 170 | 
            +
                        "repair_existing_agents": self.repair_existing_agents,
         | 
| 171 | 
            +
                        "validate_agents": self.validate_agents,
         | 
| 172 | 
            +
                        "collect_metrics": self.collect_metrics,
         | 
| 173 | 
            +
                        "log_level": self.log_level,
         | 
| 174 | 
            +
                        "max_concurrent_operations": self.max_concurrent_operations,
         | 
| 175 | 
            +
                        "timeout_seconds": self.timeout_seconds,
         | 
| 176 | 
            +
                        "environment": self.environment,
         | 
| 177 | 
            +
                    }
         | 
| 178 | 
            +
             | 
| 179 | 
            +
                    # Add extra settings
         | 
| 180 | 
            +
                    result.update(self.extra_settings)
         | 
| 181 | 
            +
             | 
| 182 | 
            +
                    return result
         | 
| @@ -0,0 +1,200 @@ | |
| 1 | 
            +
            """Deployment configuration manager."""
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            from pathlib import Path
         | 
| 4 | 
            +
            from typing import Any, Dict, Optional
         | 
| 5 | 
            +
             | 
| 6 | 
            +
            from claude_mpm.core.config import Config
         | 
| 7 | 
            +
            from claude_mpm.core.logger import get_logger
         | 
| 8 | 
            +
             | 
| 9 | 
            +
            from .deployment_config import DeploymentConfig
         | 
| 10 | 
            +
             | 
| 11 | 
            +
             | 
| 12 | 
            +
            class DeploymentConfigManager:
         | 
| 13 | 
            +
                """Manager for deployment configuration.
         | 
| 14 | 
            +
             | 
| 15 | 
            +
                This class handles loading, processing, and validation of
         | 
| 16 | 
            +
                deployment-specific configuration settings.
         | 
| 17 | 
            +
                """
         | 
| 18 | 
            +
             | 
| 19 | 
            +
                def __init__(self):
         | 
| 20 | 
            +
                    """Initialize the deployment configuration manager."""
         | 
| 21 | 
            +
                    self.logger = get_logger(__name__)
         | 
| 22 | 
            +
             | 
| 23 | 
            +
                def load_deployment_config(
         | 
| 24 | 
            +
                    self, config: Optional[Config] = None, **overrides
         | 
| 25 | 
            +
                ) -> DeploymentConfig:
         | 
| 26 | 
            +
                    """Load deployment configuration from various sources.
         | 
| 27 | 
            +
             | 
| 28 | 
            +
                    Args:
         | 
| 29 | 
            +
                        config: Optional Config object to load from
         | 
| 30 | 
            +
                        **overrides: Configuration overrides
         | 
| 31 | 
            +
             | 
| 32 | 
            +
                    Returns:
         | 
| 33 | 
            +
                        DeploymentConfig object with loaded settings
         | 
| 34 | 
            +
                    """
         | 
| 35 | 
            +
                    # Start with default configuration
         | 
| 36 | 
            +
                    deployment_config = DeploymentConfig()
         | 
| 37 | 
            +
             | 
| 38 | 
            +
                    # Load from Config object if provided
         | 
| 39 | 
            +
                    if config:
         | 
| 40 | 
            +
                        config_dict = self._extract_deployment_config(config)
         | 
| 41 | 
            +
                        deployment_config = deployment_config.merge_with_dict(config_dict)
         | 
| 42 | 
            +
             | 
| 43 | 
            +
                    # Apply overrides
         | 
| 44 | 
            +
                    if overrides:
         | 
| 45 | 
            +
                        deployment_config = deployment_config.merge_with_dict(overrides)
         | 
| 46 | 
            +
             | 
| 47 | 
            +
                    # Validate configuration
         | 
| 48 | 
            +
                    self._validate_config(deployment_config)
         | 
| 49 | 
            +
             | 
| 50 | 
            +
                    self.logger.debug(
         | 
| 51 | 
            +
                        f"Loaded deployment configuration: {deployment_config.environment} mode"
         | 
| 52 | 
            +
                    )
         | 
| 53 | 
            +
                    return deployment_config
         | 
| 54 | 
            +
             | 
| 55 | 
            +
                def _extract_deployment_config(self, config: Config) -> Dict[str, Any]:
         | 
| 56 | 
            +
                    """Extract deployment-specific configuration from Config object.
         | 
| 57 | 
            +
             | 
| 58 | 
            +
                    Args:
         | 
| 59 | 
            +
                        config: Config object to extract from
         | 
| 60 | 
            +
             | 
| 61 | 
            +
                    Returns:
         | 
| 62 | 
            +
                        Dictionary of deployment configuration settings
         | 
| 63 | 
            +
                    """
         | 
| 64 | 
            +
                    config_dict = {}
         | 
| 65 | 
            +
             | 
| 66 | 
            +
                    # Extract agent deployment settings
         | 
| 67 | 
            +
                    config_dict["excluded_agents"] = config.get(
         | 
| 68 | 
            +
                        "agent_deployment.excluded_agents", []
         | 
| 69 | 
            +
                    )
         | 
| 70 | 
            +
                    config_dict["case_sensitive_exclusion"] = config.get(
         | 
| 71 | 
            +
                        "agent_deployment.case_sensitive_exclusion", True
         | 
| 72 | 
            +
                    )
         | 
| 73 | 
            +
                    config_dict["user_excluded_agents"] = config.get(
         | 
| 74 | 
            +
                        "agent_deployment.user_excluded_agents", []
         | 
| 75 | 
            +
                    )
         | 
| 76 | 
            +
             | 
| 77 | 
            +
                    # Extract system instruction settings
         | 
| 78 | 
            +
                    config_dict["deploy_system_instructions"] = config.get(
         | 
| 79 | 
            +
                        "agent_deployment.deploy_system_instructions", True
         | 
| 80 | 
            +
                    )
         | 
| 81 | 
            +
                    config_dict["deploy_user_instructions"] = config.get(
         | 
| 82 | 
            +
                        "agent_deployment.deploy_user_instructions", True
         | 
| 83 | 
            +
                    )
         | 
| 84 | 
            +
             | 
| 85 | 
            +
                    # Extract validation settings
         | 
| 86 | 
            +
                    config_dict["repair_existing_agents"] = config.get(
         | 
| 87 | 
            +
                        "agent_deployment.repair_existing_agents", True
         | 
| 88 | 
            +
                    )
         | 
| 89 | 
            +
                    config_dict["validate_agents"] = config.get(
         | 
| 90 | 
            +
                        "agent_deployment.validate_agents", True
         | 
| 91 | 
            +
                    )
         | 
| 92 | 
            +
             | 
| 93 | 
            +
                    # Extract performance settings
         | 
| 94 | 
            +
                    config_dict["use_async"] = config.get("agent_deployment.use_async", False)
         | 
| 95 | 
            +
                    config_dict["max_concurrent_operations"] = config.get(
         | 
| 96 | 
            +
                        "agent_deployment.max_concurrent_operations", 10
         | 
| 97 | 
            +
                    )
         | 
| 98 | 
            +
                    config_dict["timeout_seconds"] = config.get(
         | 
| 99 | 
            +
                        "agent_deployment.timeout_seconds", 300
         | 
| 100 | 
            +
                    )
         | 
| 101 | 
            +
             | 
| 102 | 
            +
                    # Extract environment settings
         | 
| 103 | 
            +
                    config_dict["environment"] = config.get("environment", "production")
         | 
| 104 | 
            +
                    config_dict["log_level"] = config.get("logging.level", "INFO")
         | 
| 105 | 
            +
             | 
| 106 | 
            +
                    # Extract metrics settings
         | 
| 107 | 
            +
                    config_dict["collect_metrics"] = config.get(
         | 
| 108 | 
            +
                        "agent_deployment.collect_metrics", True
         | 
| 109 | 
            +
                    )
         | 
| 110 | 
            +
             | 
| 111 | 
            +
                    return config_dict
         | 
| 112 | 
            +
             | 
| 113 | 
            +
                def _validate_config(self, config: DeploymentConfig) -> None:
         | 
| 114 | 
            +
                    """Validate deployment configuration.
         | 
| 115 | 
            +
             | 
| 116 | 
            +
                    Args:
         | 
| 117 | 
            +
                        config: Configuration to validate
         | 
| 118 | 
            +
             | 
| 119 | 
            +
                    Raises:
         | 
| 120 | 
            +
                        ValueError: If configuration is invalid
         | 
| 121 | 
            +
                    """
         | 
| 122 | 
            +
                    # Validate deployment mode
         | 
| 123 | 
            +
                    valid_modes = ["update", "project"]
         | 
| 124 | 
            +
                    if config.deployment_mode not in valid_modes:
         | 
| 125 | 
            +
                        raise ValueError(
         | 
| 126 | 
            +
                            f"Invalid deployment mode: {config.deployment_mode}. Must be one of: {valid_modes}"
         | 
| 127 | 
            +
                        )
         | 
| 128 | 
            +
             | 
| 129 | 
            +
                    # Validate environment
         | 
| 130 | 
            +
                    valid_environments = ["development", "testing", "production"]
         | 
| 131 | 
            +
                    if config.environment not in valid_environments:
         | 
| 132 | 
            +
                        raise ValueError(
         | 
| 133 | 
            +
                            f"Invalid environment: {config.environment}. Must be one of: {valid_environments}"
         | 
| 134 | 
            +
                        )
         | 
| 135 | 
            +
             | 
| 136 | 
            +
                    # Validate paths if provided
         | 
| 137 | 
            +
                    if config.target_dir and not isinstance(config.target_dir, Path):
         | 
| 138 | 
            +
                        try:
         | 
| 139 | 
            +
                            config.target_dir = Path(config.target_dir)
         | 
| 140 | 
            +
                        except Exception as e:
         | 
| 141 | 
            +
                            raise ValueError(f"Invalid target_dir path: {config.target_dir}") from e
         | 
| 142 | 
            +
             | 
| 143 | 
            +
                    if config.templates_dir and not isinstance(config.templates_dir, Path):
         | 
| 144 | 
            +
                        try:
         | 
| 145 | 
            +
                            config.templates_dir = Path(config.templates_dir)
         | 
| 146 | 
            +
                        except Exception as e:
         | 
| 147 | 
            +
                            raise ValueError(
         | 
| 148 | 
            +
                                f"Invalid templates_dir path: {config.templates_dir}"
         | 
| 149 | 
            +
                            ) from e
         | 
| 150 | 
            +
             | 
| 151 | 
            +
                    if config.base_agent_path and not isinstance(config.base_agent_path, Path):
         | 
| 152 | 
            +
                        try:
         | 
| 153 | 
            +
                            config.base_agent_path = Path(config.base_agent_path)
         | 
| 154 | 
            +
                        except Exception as e:
         | 
| 155 | 
            +
                            raise ValueError(
         | 
| 156 | 
            +
                                f"Invalid base_agent_path: {config.base_agent_path}"
         | 
| 157 | 
            +
                            ) from e
         | 
| 158 | 
            +
             | 
| 159 | 
            +
                    if config.working_directory and not isinstance(config.working_directory, Path):
         | 
| 160 | 
            +
                        try:
         | 
| 161 | 
            +
                            config.working_directory = Path(config.working_directory)
         | 
| 162 | 
            +
                        except Exception as e:
         | 
| 163 | 
            +
                            raise ValueError(
         | 
| 164 | 
            +
                                f"Invalid working_directory path: {config.working_directory}"
         | 
| 165 | 
            +
                            ) from e
         | 
| 166 | 
            +
             | 
| 167 | 
            +
                    # Validate numeric settings
         | 
| 168 | 
            +
                    if config.max_concurrent_operations <= 0:
         | 
| 169 | 
            +
                        raise ValueError("max_concurrent_operations must be positive")
         | 
| 170 | 
            +
             | 
| 171 | 
            +
                    if config.timeout_seconds <= 0:
         | 
| 172 | 
            +
                        raise ValueError("timeout_seconds must be positive")
         | 
| 173 | 
            +
             | 
| 174 | 
            +
                    self.logger.debug("Configuration validation passed")
         | 
| 175 | 
            +
             | 
| 176 | 
            +
                def create_config_from_context(self, context) -> DeploymentConfig:
         | 
| 177 | 
            +
                    """Create deployment config from pipeline context.
         | 
| 178 | 
            +
             | 
| 179 | 
            +
                    Args:
         | 
| 180 | 
            +
                        context: Pipeline context or deployment context
         | 
| 181 | 
            +
             | 
| 182 | 
            +
                    Returns:
         | 
| 183 | 
            +
                        DeploymentConfig object
         | 
| 184 | 
            +
                    """
         | 
| 185 | 
            +
                    config_dict = {
         | 
| 186 | 
            +
                        "target_dir": getattr(context, "target_dir", None),
         | 
| 187 | 
            +
                        "force_rebuild": getattr(context, "force_rebuild", False),
         | 
| 188 | 
            +
                        "deployment_mode": getattr(context, "deployment_mode", "update"),
         | 
| 189 | 
            +
                        "use_async": getattr(context, "use_async", False),
         | 
| 190 | 
            +
                        "working_directory": getattr(context, "working_directory", None),
         | 
| 191 | 
            +
                        "templates_dir": getattr(context, "templates_dir", None),
         | 
| 192 | 
            +
                        "base_agent_path": getattr(context, "base_agent_path", None),
         | 
| 193 | 
            +
                    }
         | 
| 194 | 
            +
             | 
| 195 | 
            +
                    # Remove None values
         | 
| 196 | 
            +
                    config_dict = {k: v for k, v in config_dict.items() if v is not None}
         | 
| 197 | 
            +
             | 
| 198 | 
            +
                    return self.load_deployment_config(
         | 
| 199 | 
            +
                        config=getattr(context, "config", None), **config_dict
         | 
| 200 | 
            +
                    )
         | 
| @@ -0,0 +1,54 @@ | |
| 1 | 
            +
            """Deployment configuration loading for agent deployment service.
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            This module handles loading and processing of deployment configuration.
         | 
| 4 | 
            +
            Extracted from AgentDeploymentService to reduce complexity and improve maintainability.
         | 
| 5 | 
            +
            """
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            import logging
         | 
| 8 | 
            +
            from typing import Optional, Tuple
         | 
| 9 | 
            +
             | 
| 10 | 
            +
            from claude_mpm.core.config import Config
         | 
| 11 | 
            +
             | 
| 12 | 
            +
             | 
| 13 | 
            +
            class DeploymentConfigLoader:
         | 
| 14 | 
            +
                """Handles loading and processing of deployment configuration."""
         | 
| 15 | 
            +
             | 
| 16 | 
            +
                def __init__(self, logger: logging.Logger):
         | 
| 17 | 
            +
                    """Initialize the config loader with a logger."""
         | 
| 18 | 
            +
                    self.logger = logger
         | 
| 19 | 
            +
             | 
| 20 | 
            +
                def load_deployment_config(self, config: Optional[Config]) -> Tuple[Config, list]:
         | 
| 21 | 
            +
                    """
         | 
| 22 | 
            +
                    Load and process deployment configuration.
         | 
| 23 | 
            +
             | 
| 24 | 
            +
                    Centralized configuration loading reduces duplication
         | 
| 25 | 
            +
                    and ensures consistent handling of exclusion settings.
         | 
| 26 | 
            +
             | 
| 27 | 
            +
                    Args:
         | 
| 28 | 
            +
                        config: Optional configuration object
         | 
| 29 | 
            +
             | 
| 30 | 
            +
                    Returns:
         | 
| 31 | 
            +
                        Tuple of (config, excluded_agents)
         | 
| 32 | 
            +
                    """
         | 
| 33 | 
            +
                    # Load configuration if not provided
         | 
| 34 | 
            +
                    if config is None:
         | 
| 35 | 
            +
                        config = Config()
         | 
| 36 | 
            +
             | 
| 37 | 
            +
                    # Get agent exclusion configuration
         | 
| 38 | 
            +
                    excluded_agents = config.get("agent_deployment.excluded_agents", [])
         | 
| 39 | 
            +
                    case_sensitive = config.get("agent_deployment.case_sensitive", False)
         | 
| 40 | 
            +
                    exclude_dependencies = config.get(
         | 
| 41 | 
            +
                        "agent_deployment.exclude_dependencies", False
         | 
| 42 | 
            +
                    )
         | 
| 43 | 
            +
             | 
| 44 | 
            +
                    # Normalize excluded agents list for comparison
         | 
| 45 | 
            +
                    if not case_sensitive:
         | 
| 46 | 
            +
                        excluded_agents = [agent.lower() for agent in excluded_agents]
         | 
| 47 | 
            +
             | 
| 48 | 
            +
                    # Log exclusion configuration if agents are being excluded
         | 
| 49 | 
            +
                    if excluded_agents:
         | 
| 50 | 
            +
                        self.logger.info(f"Excluding agents from deployment: {excluded_agents}")
         | 
| 51 | 
            +
                        self.logger.debug(f"Case sensitive matching: {case_sensitive}")
         | 
| 52 | 
            +
                        self.logger.debug(f"Exclude dependencies: {exclude_dependencies}")
         | 
| 53 | 
            +
             | 
| 54 | 
            +
                    return config, excluded_agents
         | 
| @@ -0,0 +1,124 @@ | |
| 1 | 
            +
            """Deployment type detection for agent deployment service.
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            This module provides utilities to detect the type of agent deployment
         | 
| 4 | 
            +
            (system, project-specific, or user custom) based on template directory paths.
         | 
| 5 | 
            +
            Extracted from AgentDeploymentService to reduce complexity.
         | 
| 6 | 
            +
            """
         | 
| 7 | 
            +
             | 
| 8 | 
            +
            from pathlib import Path
         | 
| 9 | 
            +
            from typing import Optional
         | 
| 10 | 
            +
             | 
| 11 | 
            +
            from claude_mpm.config.paths import paths
         | 
| 12 | 
            +
             | 
| 13 | 
            +
             | 
| 14 | 
            +
            class DeploymentTypeDetector:
         | 
| 15 | 
            +
                """Detects the type of agent deployment based on template directory."""
         | 
| 16 | 
            +
             | 
| 17 | 
            +
                @staticmethod
         | 
| 18 | 
            +
                def is_system_agent_deployment(templates_dir: Optional[Path]) -> bool:
         | 
| 19 | 
            +
                    """
         | 
| 20 | 
            +
                    Check if this is a deployment of system agents.
         | 
| 21 | 
            +
             | 
| 22 | 
            +
                    System agents are those provided by the claude-mpm package itself,
         | 
| 23 | 
            +
                    located in the package's agents/templates directory.
         | 
| 24 | 
            +
             | 
| 25 | 
            +
                    Args:
         | 
| 26 | 
            +
                        templates_dir: Directory containing agent templates
         | 
| 27 | 
            +
             | 
| 28 | 
            +
                    Returns:
         | 
| 29 | 
            +
                        True if deploying system agents, False otherwise
         | 
| 30 | 
            +
                    """
         | 
| 31 | 
            +
                    # Check if templates_dir points to the system templates
         | 
| 32 | 
            +
                    if templates_dir and templates_dir.exists():
         | 
| 33 | 
            +
                        # System agents are in the package's agents/templates directory
         | 
| 34 | 
            +
                        try:
         | 
| 35 | 
            +
                            # Check if templates_dir is within the claude_mpm package structure
         | 
| 36 | 
            +
                            templates_str = str(templates_dir.resolve())
         | 
| 37 | 
            +
                            return (
         | 
| 38 | 
            +
                                "site-packages/claude_mpm" in templates_str
         | 
| 39 | 
            +
                                or "src/claude_mpm/agents/templates" in templates_str
         | 
| 40 | 
            +
                                or (paths.agents_dir / "templates").resolve()
         | 
| 41 | 
            +
                                == templates_dir.resolve()
         | 
| 42 | 
            +
                            )
         | 
| 43 | 
            +
                        except Exception:
         | 
| 44 | 
            +
                            pass
         | 
| 45 | 
            +
                    return False
         | 
| 46 | 
            +
             | 
| 47 | 
            +
                @staticmethod
         | 
| 48 | 
            +
                def is_project_specific_deployment(
         | 
| 49 | 
            +
                    templates_dir: Optional[Path], working_directory: Path
         | 
| 50 | 
            +
                ) -> bool:
         | 
| 51 | 
            +
                    """
         | 
| 52 | 
            +
                    Check if deploying project-specific agents.
         | 
| 53 | 
            +
             | 
| 54 | 
            +
                    Project-specific agents are those found in the project's
         | 
| 55 | 
            +
                    .claude-mpm/agents/ directory.
         | 
| 56 | 
            +
             | 
| 57 | 
            +
                    Args:
         | 
| 58 | 
            +
                        templates_dir: Directory containing agent templates
         | 
| 59 | 
            +
                        working_directory: Current working directory
         | 
| 60 | 
            +
             | 
| 61 | 
            +
                    Returns:
         | 
| 62 | 
            +
                        True if deploying project-specific agents, False otherwise
         | 
| 63 | 
            +
                    """
         | 
| 64 | 
            +
                    # Check if we're in a project directory with .claude-mpm/agents
         | 
| 65 | 
            +
                    project_agents_dir = working_directory / ".claude-mpm" / "agents"
         | 
| 66 | 
            +
                    if project_agents_dir.exists():
         | 
| 67 | 
            +
                        # Check if templates_dir points to project agents
         | 
| 68 | 
            +
                        if templates_dir and templates_dir.exists():
         | 
| 69 | 
            +
                            try:
         | 
| 70 | 
            +
                                return project_agents_dir.resolve() == templates_dir.resolve()
         | 
| 71 | 
            +
                            except Exception:
         | 
| 72 | 
            +
                                pass
         | 
| 73 | 
            +
                    return False
         | 
| 74 | 
            +
             | 
| 75 | 
            +
                @staticmethod
         | 
| 76 | 
            +
                def is_user_custom_deployment(templates_dir: Optional[Path]) -> bool:
         | 
| 77 | 
            +
                    """
         | 
| 78 | 
            +
                    Check if deploying user custom agents.
         | 
| 79 | 
            +
             | 
| 80 | 
            +
                    User custom agents are those in ~/.claude-mpm/agents/
         | 
| 81 | 
            +
             | 
| 82 | 
            +
                    Args:
         | 
| 83 | 
            +
                        templates_dir: Directory containing agent templates
         | 
| 84 | 
            +
             | 
| 85 | 
            +
                    Returns:
         | 
| 86 | 
            +
                        True if deploying user custom agents, False otherwise
         | 
| 87 | 
            +
                    """
         | 
| 88 | 
            +
                    user_agents_dir = Path.home() / ".claude-mpm" / "agents"
         | 
| 89 | 
            +
                    if user_agents_dir.exists():
         | 
| 90 | 
            +
                        # Check if templates_dir points to user agents
         | 
| 91 | 
            +
                        if templates_dir and templates_dir.exists():
         | 
| 92 | 
            +
                            try:
         | 
| 93 | 
            +
                                return user_agents_dir.resolve() == templates_dir.resolve()
         | 
| 94 | 
            +
                            except Exception:
         | 
| 95 | 
            +
                                pass
         | 
| 96 | 
            +
                    return False
         | 
| 97 | 
            +
             | 
| 98 | 
            +
                @staticmethod
         | 
| 99 | 
            +
                def determine_source_tier(templates_dir: Optional[Path]) -> str:
         | 
| 100 | 
            +
                    """
         | 
| 101 | 
            +
                    Determine the source tier for logging.
         | 
| 102 | 
            +
             | 
| 103 | 
            +
                    Understanding which tier (SYSTEM/USER/PROJECT) agents
         | 
| 104 | 
            +
                    are being deployed from helps with debugging and auditing.
         | 
| 105 | 
            +
             | 
| 106 | 
            +
                    Args:
         | 
| 107 | 
            +
                        templates_dir: Directory containing agent templates
         | 
| 108 | 
            +
             | 
| 109 | 
            +
                    Returns:
         | 
| 110 | 
            +
                        Source tier string: "SYSTEM", "USER", or "PROJECT"
         | 
| 111 | 
            +
                    """
         | 
| 112 | 
            +
                    if templates_dir:
         | 
| 113 | 
            +
                        templates_str = str(templates_dir)
         | 
| 114 | 
            +
                        if (
         | 
| 115 | 
            +
                            ".claude-mpm/agents" in templates_str
         | 
| 116 | 
            +
                            and "/templates" not in templates_str
         | 
| 117 | 
            +
                        ):
         | 
| 118 | 
            +
                            return "PROJECT"
         | 
| 119 | 
            +
                        elif (
         | 
| 120 | 
            +
                            "/.claude-mpm/agents" in templates_str
         | 
| 121 | 
            +
                            and "/templates" not in templates_str
         | 
| 122 | 
            +
                        ):
         | 
| 123 | 
            +
                            return "USER"
         | 
| 124 | 
            +
                    return "SYSTEM"
         | 
| @@ -0,0 +1,18 @@ | |
| 1 | 
            +
            """Deployment facade for handling async/sync deployment modes.
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            This module provides a clean facade pattern for handling different
         | 
| 4 | 
            +
            deployment execution modes (async vs sync) without cluttering the
         | 
| 5 | 
            +
            main deployment logic with conditional complexity.
         | 
| 6 | 
            +
            """
         | 
| 7 | 
            +
             | 
| 8 | 
            +
            from .async_deployment_executor import AsyncDeploymentExecutor
         | 
| 9 | 
            +
            from .deployment_executor import DeploymentExecutor
         | 
| 10 | 
            +
            from .deployment_facade import DeploymentFacade
         | 
| 11 | 
            +
            from .sync_deployment_executor import SyncDeploymentExecutor
         | 
| 12 | 
            +
             | 
| 13 | 
            +
            __all__ = [
         | 
| 14 | 
            +
                "DeploymentExecutor",
         | 
| 15 | 
            +
                "DeploymentFacade",
         | 
| 16 | 
            +
                "AsyncDeploymentExecutor",
         | 
| 17 | 
            +
                "SyncDeploymentExecutor",
         | 
| 18 | 
            +
            ]
         |