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,227 @@ | |
| 1 | 
            +
            """Interface adapter for AgentDeploymentService compliance."""
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            from pathlib import Path
         | 
| 4 | 
            +
            from typing import Any, Dict, List, Optional, Tuple
         | 
| 5 | 
            +
             | 
| 6 | 
            +
            from claude_mpm.core.interfaces import AgentDeploymentInterface
         | 
| 7 | 
            +
            from claude_mpm.core.logger import get_logger
         | 
| 8 | 
            +
             | 
| 9 | 
            +
             | 
| 10 | 
            +
            class AgentDeploymentInterfaceAdapter(AgentDeploymentInterface):
         | 
| 11 | 
            +
                """Adapter to make AgentDeploymentService compliant with AgentDeploymentInterface.
         | 
| 12 | 
            +
             | 
| 13 | 
            +
                This adapter bridges the gap between the current implementation's method
         | 
| 14 | 
            +
                signatures and the required interface signatures, providing a clean
         | 
| 15 | 
            +
                interface compliance layer.
         | 
| 16 | 
            +
                """
         | 
| 17 | 
            +
             | 
| 18 | 
            +
                def __init__(self, deployment_service):
         | 
| 19 | 
            +
                    """Initialize the interface adapter.
         | 
| 20 | 
            +
             | 
| 21 | 
            +
                    Args:
         | 
| 22 | 
            +
                        deployment_service: The actual deployment service implementation
         | 
| 23 | 
            +
                    """
         | 
| 24 | 
            +
                    self.deployment_service = deployment_service
         | 
| 25 | 
            +
                    self.logger = get_logger(__name__)
         | 
| 26 | 
            +
             | 
| 27 | 
            +
                def deploy_agents(
         | 
| 28 | 
            +
                    self, force: bool = False, include_all: bool = False
         | 
| 29 | 
            +
                ) -> Dict[str, Any]:
         | 
| 30 | 
            +
                    """Deploy agents to target environment.
         | 
| 31 | 
            +
             | 
| 32 | 
            +
                    This method adapts the interface signature to the actual implementation.
         | 
| 33 | 
            +
             | 
| 34 | 
            +
                    Args:
         | 
| 35 | 
            +
                        force: Force deployment even if agents already exist
         | 
| 36 | 
            +
                        include_all: Include all agents, ignoring exclusion lists
         | 
| 37 | 
            +
             | 
| 38 | 
            +
                    Returns:
         | 
| 39 | 
            +
                        Dictionary with deployment results and status
         | 
| 40 | 
            +
                    """
         | 
| 41 | 
            +
                    try:
         | 
| 42 | 
            +
                        # Map interface parameters to implementation parameters
         | 
| 43 | 
            +
                        force_rebuild = force
         | 
| 44 | 
            +
             | 
| 45 | 
            +
                        # Determine deployment mode based on include_all
         | 
| 46 | 
            +
                        deployment_mode = "project" if include_all else "update"
         | 
| 47 | 
            +
             | 
| 48 | 
            +
                        # Call the actual implementation
         | 
| 49 | 
            +
                        results = self.deployment_service.deploy_agents(
         | 
| 50 | 
            +
                            target_dir=None,  # Use default target directory
         | 
| 51 | 
            +
                            force_rebuild=force_rebuild,
         | 
| 52 | 
            +
                            deployment_mode=deployment_mode,
         | 
| 53 | 
            +
                            config=None,  # Use default configuration
         | 
| 54 | 
            +
                            use_async=False,  # Default to sync for interface compliance
         | 
| 55 | 
            +
                        )
         | 
| 56 | 
            +
             | 
| 57 | 
            +
                        # Ensure the result has the expected structure
         | 
| 58 | 
            +
                        if not isinstance(results, dict):
         | 
| 59 | 
            +
                            return {
         | 
| 60 | 
            +
                                "success": False,
         | 
| 61 | 
            +
                                "error": "Invalid result format from deployment service",
         | 
| 62 | 
            +
                                "deployed": [],
         | 
| 63 | 
            +
                                "updated": [],
         | 
| 64 | 
            +
                                "migrated": [],
         | 
| 65 | 
            +
                                "skipped": [],
         | 
| 66 | 
            +
                                "errors": ["Invalid result format"],
         | 
| 67 | 
            +
                            }
         | 
| 68 | 
            +
             | 
| 69 | 
            +
                        # Add interface compliance metadata
         | 
| 70 | 
            +
                        results["interface_version"] = "1.0.0"
         | 
| 71 | 
            +
                        results["adapter_used"] = True
         | 
| 72 | 
            +
             | 
| 73 | 
            +
                        return results
         | 
| 74 | 
            +
             | 
| 75 | 
            +
                    except Exception as e:
         | 
| 76 | 
            +
                        self.logger.error(
         | 
| 77 | 
            +
                            f"Interface adapter deployment failed: {e}", exc_info=True
         | 
| 78 | 
            +
                        )
         | 
| 79 | 
            +
                        return {
         | 
| 80 | 
            +
                            "success": False,
         | 
| 81 | 
            +
                            "error": str(e),
         | 
| 82 | 
            +
                            "deployed": [],
         | 
| 83 | 
            +
                            "updated": [],
         | 
| 84 | 
            +
                            "migrated": [],
         | 
| 85 | 
            +
                            "skipped": [],
         | 
| 86 | 
            +
                            "errors": [str(e)],
         | 
| 87 | 
            +
                            "interface_version": "1.0.0",
         | 
| 88 | 
            +
                            "adapter_used": True,
         | 
| 89 | 
            +
                        }
         | 
| 90 | 
            +
             | 
| 91 | 
            +
                def validate_agent(self, agent_path: Path) -> Tuple[bool, List[str]]:
         | 
| 92 | 
            +
                    """Validate agent configuration and structure.
         | 
| 93 | 
            +
             | 
| 94 | 
            +
                    Args:
         | 
| 95 | 
            +
                        agent_path: Path to agent configuration file
         | 
| 96 | 
            +
             | 
| 97 | 
            +
                    Returns:
         | 
| 98 | 
            +
                        Tuple of (is_valid, list_of_errors)
         | 
| 99 | 
            +
                    """
         | 
| 100 | 
            +
                    try:
         | 
| 101 | 
            +
                        # Delegate to the actual implementation
         | 
| 102 | 
            +
                        return self.deployment_service.validate_agent(agent_path)
         | 
| 103 | 
            +
                    except Exception as e:
         | 
| 104 | 
            +
                        self.logger.error(f"Agent validation failed: {e}", exc_info=True)
         | 
| 105 | 
            +
                        return False, [f"Validation error: {str(e)}"]
         | 
| 106 | 
            +
             | 
| 107 | 
            +
                def clean_deployment(self, preserve_user_agents: bool = True) -> bool:
         | 
| 108 | 
            +
                    """Clean up deployed agents.
         | 
| 109 | 
            +
             | 
| 110 | 
            +
                    Args:
         | 
| 111 | 
            +
                        preserve_user_agents: Whether to keep user-created agents
         | 
| 112 | 
            +
             | 
| 113 | 
            +
                    Returns:
         | 
| 114 | 
            +
                        True if cleanup successful
         | 
| 115 | 
            +
                    """
         | 
| 116 | 
            +
                    try:
         | 
| 117 | 
            +
                        # Check if the deployment service has a clean_deployment method
         | 
| 118 | 
            +
                        if hasattr(self.deployment_service, "clean_deployment"):
         | 
| 119 | 
            +
                            # Call the existing method (it has a different signature)
         | 
| 120 | 
            +
                            result = self.deployment_service.clean_deployment()
         | 
| 121 | 
            +
             | 
| 122 | 
            +
                            # The existing method returns a dict, we need to return a bool
         | 
| 123 | 
            +
                            if isinstance(result, dict):
         | 
| 124 | 
            +
                                return result.get("success", False)
         | 
| 125 | 
            +
                            else:
         | 
| 126 | 
            +
                                return bool(result)
         | 
| 127 | 
            +
                        else:
         | 
| 128 | 
            +
                            # Implement basic cleanup logic if method doesn't exist
         | 
| 129 | 
            +
                            return self._basic_cleanup(preserve_user_agents)
         | 
| 130 | 
            +
             | 
| 131 | 
            +
                    except Exception as e:
         | 
| 132 | 
            +
                        self.logger.error(f"Deployment cleanup failed: {e}", exc_info=True)
         | 
| 133 | 
            +
                        return False
         | 
| 134 | 
            +
             | 
| 135 | 
            +
                def _basic_cleanup(self, preserve_user_agents: bool) -> bool:
         | 
| 136 | 
            +
                    """Basic cleanup implementation.
         | 
| 137 | 
            +
             | 
| 138 | 
            +
                    Args:
         | 
| 139 | 
            +
                        preserve_user_agents: Whether to keep user-created agents
         | 
| 140 | 
            +
             | 
| 141 | 
            +
                    Returns:
         | 
| 142 | 
            +
                        True if cleanup successful
         | 
| 143 | 
            +
                    """
         | 
| 144 | 
            +
                    try:
         | 
| 145 | 
            +
                        # Get the working directory from the deployment service
         | 
| 146 | 
            +
                        working_dir = getattr(
         | 
| 147 | 
            +
                            self.deployment_service, "working_directory", Path.cwd()
         | 
| 148 | 
            +
                        )
         | 
| 149 | 
            +
                        agents_dir = working_dir / ".claude" / "agents"
         | 
| 150 | 
            +
             | 
| 151 | 
            +
                        if not agents_dir.exists():
         | 
| 152 | 
            +
                            self.logger.info("No agents directory to clean")
         | 
| 153 | 
            +
                            return True
         | 
| 154 | 
            +
             | 
| 155 | 
            +
                        cleaned_count = 0
         | 
| 156 | 
            +
             | 
| 157 | 
            +
                        # Clean up agent files
         | 
| 158 | 
            +
                        for agent_file in agents_dir.glob("*.md"):
         | 
| 159 | 
            +
                            try:
         | 
| 160 | 
            +
                                if preserve_user_agents:
         | 
| 161 | 
            +
                                    # Check if this is a system agent (authored by claude-mpm)
         | 
| 162 | 
            +
                                    content = agent_file.read_text(encoding="utf-8")
         | 
| 163 | 
            +
                                    if (
         | 
| 164 | 
            +
                                        "author: claude-mpm" not in content
         | 
| 165 | 
            +
                                        and "author: 'claude-mpm'" not in content
         | 
| 166 | 
            +
                                    ):
         | 
| 167 | 
            +
                                        self.logger.debug(
         | 
| 168 | 
            +
                                            f"Preserving user agent: {agent_file.name}"
         | 
| 169 | 
            +
                                        )
         | 
| 170 | 
            +
                                        continue
         | 
| 171 | 
            +
             | 
| 172 | 
            +
                                # Remove the agent file
         | 
| 173 | 
            +
                                agent_file.unlink()
         | 
| 174 | 
            +
                                cleaned_count += 1
         | 
| 175 | 
            +
                                self.logger.debug(f"Cleaned agent: {agent_file.name}")
         | 
| 176 | 
            +
             | 
| 177 | 
            +
                            except Exception as e:
         | 
| 178 | 
            +
                                self.logger.warning(f"Failed to clean agent {agent_file.name}: {e}")
         | 
| 179 | 
            +
             | 
| 180 | 
            +
                        self.logger.info(f"Cleaned {cleaned_count} agent files")
         | 
| 181 | 
            +
                        return True
         | 
| 182 | 
            +
             | 
| 183 | 
            +
                    except Exception as e:
         | 
| 184 | 
            +
                        self.logger.error(f"Basic cleanup failed: {e}", exc_info=True)
         | 
| 185 | 
            +
                        return False
         | 
| 186 | 
            +
             | 
| 187 | 
            +
                def get_deployment_status(self) -> Dict[str, Any]:
         | 
| 188 | 
            +
                    """Get current deployment status and metrics.
         | 
| 189 | 
            +
             | 
| 190 | 
            +
                    Returns:
         | 
| 191 | 
            +
                        Dictionary with deployment status information
         | 
| 192 | 
            +
                    """
         | 
| 193 | 
            +
                    try:
         | 
| 194 | 
            +
                        # Delegate to the actual implementation
         | 
| 195 | 
            +
                        status = self.deployment_service.get_deployment_status()
         | 
| 196 | 
            +
             | 
| 197 | 
            +
                        # Ensure the result is a dictionary
         | 
| 198 | 
            +
                        if not isinstance(status, dict):
         | 
| 199 | 
            +
                            return {
         | 
| 200 | 
            +
                                "status": "unknown",
         | 
| 201 | 
            +
                                "error": "Invalid status format from deployment service",
         | 
| 202 | 
            +
                                "interface_version": "1.0.0",
         | 
| 203 | 
            +
                                "adapter_used": True,
         | 
| 204 | 
            +
                            }
         | 
| 205 | 
            +
             | 
| 206 | 
            +
                        # Add interface compliance metadata
         | 
| 207 | 
            +
                        status["interface_version"] = "1.0.0"
         | 
| 208 | 
            +
                        status["adapter_used"] = True
         | 
| 209 | 
            +
             | 
| 210 | 
            +
                        return status
         | 
| 211 | 
            +
             | 
| 212 | 
            +
                    except Exception as e:
         | 
| 213 | 
            +
                        self.logger.error(f"Failed to get deployment status: {e}", exc_info=True)
         | 
| 214 | 
            +
                        return {
         | 
| 215 | 
            +
                            "status": "error",
         | 
| 216 | 
            +
                            "error": str(e),
         | 
| 217 | 
            +
                            "interface_version": "1.0.0",
         | 
| 218 | 
            +
                            "adapter_used": True,
         | 
| 219 | 
            +
                        }
         | 
| 220 | 
            +
             | 
| 221 | 
            +
                def get_wrapped_service(self):
         | 
| 222 | 
            +
                    """Get the wrapped deployment service.
         | 
| 223 | 
            +
             | 
| 224 | 
            +
                    Returns:
         | 
| 225 | 
            +
                        The actual deployment service implementation
         | 
| 226 | 
            +
                    """
         | 
| 227 | 
            +
                    return self.deployment_service
         | 
| @@ -0,0 +1,85 @@ | |
| 1 | 
            +
            """Health checker for agent lifecycle manager.
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            This module provides health checking functionality for the AgentLifecycleManager.
         | 
| 4 | 
            +
            Extracted to reduce complexity and improve maintainability.
         | 
| 5 | 
            +
            """
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            from typing import TYPE_CHECKING, Dict
         | 
| 8 | 
            +
             | 
| 9 | 
            +
            if TYPE_CHECKING:
         | 
| 10 | 
            +
                from .agent_lifecycle_manager import AgentLifecycleManager
         | 
| 11 | 
            +
             | 
| 12 | 
            +
             | 
| 13 | 
            +
            class LifecycleHealthChecker:
         | 
| 14 | 
            +
                """Handles health checking for the lifecycle manager."""
         | 
| 15 | 
            +
             | 
| 16 | 
            +
                def __init__(self, lifecycle_manager: "AgentLifecycleManager"):
         | 
| 17 | 
            +
                    """Initialize the health checker."""
         | 
| 18 | 
            +
                    self.lifecycle_manager = lifecycle_manager
         | 
| 19 | 
            +
                    self.logger = lifecycle_manager.logger
         | 
| 20 | 
            +
             | 
| 21 | 
            +
                async def perform_health_check(self) -> Dict[str, bool]:
         | 
| 22 | 
            +
                    """Perform comprehensive health checks."""
         | 
| 23 | 
            +
                    checks = {}
         | 
| 24 | 
            +
             | 
| 25 | 
            +
                    try:
         | 
| 26 | 
            +
                        # Check core service availability
         | 
| 27 | 
            +
                        checks["cache_service"] = self.lifecycle_manager.shared_cache is not None
         | 
| 28 | 
            +
                        checks["registry_service"] = (
         | 
| 29 | 
            +
                            self.lifecycle_manager.agent_registry is not None
         | 
| 30 | 
            +
                        )
         | 
| 31 | 
            +
                        checks["tracker_service"] = (
         | 
| 32 | 
            +
                            self.lifecycle_manager.modification_tracker is not None
         | 
| 33 | 
            +
                        )
         | 
| 34 | 
            +
                        checks["persistence_service"] = (
         | 
| 35 | 
            +
                            self.lifecycle_manager.persistence_service is not None
         | 
| 36 | 
            +
                        )
         | 
| 37 | 
            +
             | 
| 38 | 
            +
                        # Check operation capabilities
         | 
| 39 | 
            +
                        checks["can_create_agents"] = await self._test_create_capability()
         | 
| 40 | 
            +
                        checks["can_modify_agents"] = await self._test_modify_capability()
         | 
| 41 | 
            +
                        checks["can_delete_agents"] = await self._test_delete_capability()
         | 
| 42 | 
            +
             | 
| 43 | 
            +
                        # Check data integrity
         | 
| 44 | 
            +
                        checks["agent_records_valid"] = (
         | 
| 45 | 
            +
                            len(self.lifecycle_manager.agent_records) >= 0
         | 
| 46 | 
            +
                        )
         | 
| 47 | 
            +
                        checks["operation_history_valid"] = (
         | 
| 48 | 
            +
                            len(self.lifecycle_manager.operation_history) >= 0
         | 
| 49 | 
            +
                        )
         | 
| 50 | 
            +
             | 
| 51 | 
            +
                    except Exception as e:
         | 
| 52 | 
            +
                        self.logger.error(f"Lifecycle manager health check failed: {e}")
         | 
| 53 | 
            +
                        checks["health_check_error"] = False
         | 
| 54 | 
            +
             | 
| 55 | 
            +
                    return checks
         | 
| 56 | 
            +
             | 
| 57 | 
            +
                async def _test_create_capability(self) -> bool:
         | 
| 58 | 
            +
                    """Test agent creation capability."""
         | 
| 59 | 
            +
                    try:
         | 
| 60 | 
            +
                        # This would test if we can create agents in the configured tiers
         | 
| 61 | 
            +
                        return (
         | 
| 62 | 
            +
                            self.lifecycle_manager.modification_tracker is not None
         | 
| 63 | 
            +
                            and self.lifecycle_manager.persistence_service is not None
         | 
| 64 | 
            +
                        )
         | 
| 65 | 
            +
                    except Exception:
         | 
| 66 | 
            +
                        return False
         | 
| 67 | 
            +
             | 
| 68 | 
            +
                async def _test_modify_capability(self) -> bool:
         | 
| 69 | 
            +
                    """Test agent modification capability."""
         | 
| 70 | 
            +
                    try:
         | 
| 71 | 
            +
                        # This would test if we can modify existing agents
         | 
| 72 | 
            +
                        return (
         | 
| 73 | 
            +
                            self.lifecycle_manager.modification_tracker is not None
         | 
| 74 | 
            +
                            and self.lifecycle_manager.persistence_service is not None
         | 
| 75 | 
            +
                        )
         | 
| 76 | 
            +
                    except Exception:
         | 
| 77 | 
            +
                        return False
         | 
| 78 | 
            +
             | 
| 79 | 
            +
                async def _test_delete_capability(self) -> bool:
         | 
| 80 | 
            +
                    """Test agent deletion capability."""
         | 
| 81 | 
            +
                    try:
         | 
| 82 | 
            +
                        # This would test if we can delete agents
         | 
| 83 | 
            +
                        return self.lifecycle_manager.modification_tracker is not None
         | 
| 84 | 
            +
                    except Exception:
         | 
| 85 | 
            +
                        return False
         | 
| @@ -0,0 +1,100 @@ | |
| 1 | 
            +
            """Performance tracking for agent lifecycle manager.
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            This module provides performance metrics tracking functionality for the AgentLifecycleManager.
         | 
| 4 | 
            +
            Extracted to reduce complexity and improve maintainability.
         | 
| 5 | 
            +
            """
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            from typing import TYPE_CHECKING, Any, Dict
         | 
| 8 | 
            +
             | 
| 9 | 
            +
            if TYPE_CHECKING:
         | 
| 10 | 
            +
                from .agent_lifecycle_manager import LifecycleOperationResult
         | 
| 11 | 
            +
             | 
| 12 | 
            +
             | 
| 13 | 
            +
            class LifecyclePerformanceTracker:
         | 
| 14 | 
            +
                """Handles performance metrics tracking for the lifecycle manager."""
         | 
| 15 | 
            +
             | 
| 16 | 
            +
                def __init__(self, performance_metrics: Dict[str, Any]):
         | 
| 17 | 
            +
                    """Initialize the performance tracker."""
         | 
| 18 | 
            +
                    self.performance_metrics = performance_metrics
         | 
| 19 | 
            +
             | 
| 20 | 
            +
                def update_metrics(self, result: "LifecycleOperationResult") -> None:
         | 
| 21 | 
            +
                    """Update performance metrics with operation result.
         | 
| 22 | 
            +
             | 
| 23 | 
            +
                    METRICS COLLECTION:
         | 
| 24 | 
            +
                    This method demonstrates a simple ETL pipeline for operational metrics:
         | 
| 25 | 
            +
             | 
| 26 | 
            +
                    1. EXTRACT: Pull raw data from operation results
         | 
| 27 | 
            +
                       - Success/failure status
         | 
| 28 | 
            +
                       - Operation duration
         | 
| 29 | 
            +
                       - Cache invalidation events
         | 
| 30 | 
            +
                       - Operation type and agent tier
         | 
| 31 | 
            +
             | 
| 32 | 
            +
                    2. TRANSFORM: Calculate derived metrics
         | 
| 33 | 
            +
                       - Success rates and failure percentages
         | 
| 34 | 
            +
                       - Rolling averages for performance
         | 
| 35 | 
            +
                       - Operation distribution by type
         | 
| 36 | 
            +
                       - Performance by agent tier
         | 
| 37 | 
            +
             | 
| 38 | 
            +
                    3. LOAD: Store in metrics structure
         | 
| 39 | 
            +
                       - In-memory storage for real-time access
         | 
| 40 | 
            +
                       - Could be extended to push to:
         | 
| 41 | 
            +
                         * Time-series databases (Prometheus, InfluxDB)
         | 
| 42 | 
            +
                         * AI observability platforms (Datadog, New Relic)
         | 
| 43 | 
            +
                         * Custom analytics pipelines
         | 
| 44 | 
            +
             | 
| 45 | 
            +
                    OPTIMIZATION OPPORTUNITIES:
         | 
| 46 | 
            +
                    - Add percentile calculations (p50, p95, p99)
         | 
| 47 | 
            +
                    - Track operation queuing times
         | 
| 48 | 
            +
                    - Monitor resource usage per operation
         | 
| 49 | 
            +
                    - Implement sliding window metrics
         | 
| 50 | 
            +
                    """
         | 
| 51 | 
            +
                    self.performance_metrics["total_operations"] += 1
         | 
| 52 | 
            +
             | 
| 53 | 
            +
                    if result.success:
         | 
| 54 | 
            +
                        self.performance_metrics["successful_operations"] += 1
         | 
| 55 | 
            +
                    else:
         | 
| 56 | 
            +
                        self.performance_metrics["failed_operations"] += 1
         | 
| 57 | 
            +
             | 
| 58 | 
            +
                    # Update average duration using incremental calculation
         | 
| 59 | 
            +
                    # This avoids storing all durations in memory
         | 
| 60 | 
            +
                    total_ops = self.performance_metrics["total_operations"]
         | 
| 61 | 
            +
                    current_avg = self.performance_metrics["average_duration_ms"]
         | 
| 62 | 
            +
                    new_avg = ((current_avg * (total_ops - 1)) + result.duration_ms) / total_ops
         | 
| 63 | 
            +
                    self.performance_metrics["average_duration_ms"] = new_avg
         | 
| 64 | 
            +
             | 
| 65 | 
            +
                    # METRICS: Track operation type distribution
         | 
| 66 | 
            +
                    # This helps identify which operations are most common
         | 
| 67 | 
            +
                    op_type = result.operation.value
         | 
| 68 | 
            +
                    if "operation_distribution" not in self.performance_metrics:
         | 
| 69 | 
            +
                        self.performance_metrics["operation_distribution"] = {}
         | 
| 70 | 
            +
                    self.performance_metrics["operation_distribution"][op_type] = (
         | 
| 71 | 
            +
                        self.performance_metrics["operation_distribution"].get(op_type, 0) + 1
         | 
| 72 | 
            +
                    )
         | 
| 73 | 
            +
             | 
| 74 | 
            +
                    # METRICS: Track performance by agent tier
         | 
| 75 | 
            +
                    # Useful for identifying tier-specific performance issues
         | 
| 76 | 
            +
                    if hasattr(result, "tier") and result.tier:
         | 
| 77 | 
            +
                        if "tier_performance" not in self.performance_metrics:
         | 
| 78 | 
            +
                            self.performance_metrics["tier_performance"] = {}
         | 
| 79 | 
            +
                        tier_name = (
         | 
| 80 | 
            +
                            result.tier.value if hasattr(result.tier, "value") else str(result.tier)
         | 
| 81 | 
            +
                        )
         | 
| 82 | 
            +
                        if tier_name not in self.performance_metrics["tier_performance"]:
         | 
| 83 | 
            +
                            self.performance_metrics["tier_performance"][tier_name] = {
         | 
| 84 | 
            +
                                "count": 0,
         | 
| 85 | 
            +
                                "total_duration_ms": 0,
         | 
| 86 | 
            +
                                "average_duration_ms": 0,
         | 
| 87 | 
            +
                            }
         | 
| 88 | 
            +
                        tier_metrics = self.performance_metrics["tier_performance"][tier_name]
         | 
| 89 | 
            +
                        tier_metrics["count"] += 1
         | 
| 90 | 
            +
                        tier_metrics["total_duration_ms"] += result.duration_ms
         | 
| 91 | 
            +
                        tier_metrics["average_duration_ms"] = (
         | 
| 92 | 
            +
                            tier_metrics["total_duration_ms"] / tier_metrics["count"]
         | 
| 93 | 
            +
                        )
         | 
| 94 | 
            +
             | 
| 95 | 
            +
                    # Update cache hit rate if cache was involved
         | 
| 96 | 
            +
                    if result.cache_invalidated:
         | 
| 97 | 
            +
                        # Track cache invalidation frequency
         | 
| 98 | 
            +
                        if "cache_invalidations" not in self.performance_metrics:
         | 
| 99 | 
            +
                            self.performance_metrics["cache_invalidations"] = 0
         | 
| 100 | 
            +
                        self.performance_metrics["cache_invalidations"] += 1
         | 
| @@ -0,0 +1,32 @@ | |
| 1 | 
            +
            """Deployment pipeline for agent deployment.
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            This module provides a pipeline-based approach to agent deployment,
         | 
| 4 | 
            +
            breaking down the complex deployment process into discrete, testable steps.
         | 
| 5 | 
            +
             | 
| 6 | 
            +
            The pipeline pattern allows for:
         | 
| 7 | 
            +
            - Modular deployment steps that can be tested independently
         | 
| 8 | 
            +
            - Configurable deployment flows for different scenarios
         | 
| 9 | 
            +
            - Easy addition of new deployment steps
         | 
| 10 | 
            +
            - Better error handling and recovery
         | 
| 11 | 
            +
            - Comprehensive logging and metrics collection
         | 
| 12 | 
            +
            """
         | 
| 13 | 
            +
             | 
| 14 | 
            +
            from .pipeline_builder import DeploymentPipelineBuilder
         | 
| 15 | 
            +
            from .pipeline_context import PipelineContext
         | 
| 16 | 
            +
            from .pipeline_executor import DeploymentPipelineExecutor
         | 
| 17 | 
            +
            from .steps import (
         | 
| 18 | 
            +
                BaseDeploymentStep,
         | 
| 19 | 
            +
                ConfigurationLoadStep,
         | 
| 20 | 
            +
                StepResult,
         | 
| 21 | 
            +
                TargetDirectorySetupStep,
         | 
| 22 | 
            +
            )
         | 
| 23 | 
            +
             | 
| 24 | 
            +
            __all__ = [
         | 
| 25 | 
            +
                "DeploymentPipelineBuilder",
         | 
| 26 | 
            +
                "DeploymentPipelineExecutor",
         | 
| 27 | 
            +
                "PipelineContext",
         | 
| 28 | 
            +
                "BaseDeploymentStep",
         | 
| 29 | 
            +
                "StepResult",
         | 
| 30 | 
            +
                "ConfigurationLoadStep",
         | 
| 31 | 
            +
                "TargetDirectorySetupStep",
         | 
| 32 | 
            +
            ]
         | 
| @@ -0,0 +1,158 @@ | |
| 1 | 
            +
            """Pipeline builder for creating deployment pipelines."""
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            from typing import Any, Dict, List, Type
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            from claude_mpm.core.logger import get_logger
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            from .steps.base_step import BaseDeploymentStep
         | 
| 8 | 
            +
            from .steps.configuration_step import ConfigurationLoadStep
         | 
| 9 | 
            +
            from .steps.target_directory_step import TargetDirectorySetupStep
         | 
| 10 | 
            +
             | 
| 11 | 
            +
             | 
| 12 | 
            +
            class DeploymentPipelineBuilder:
         | 
| 13 | 
            +
                """Builder for creating deployment pipelines.
         | 
| 14 | 
            +
             | 
| 15 | 
            +
                This builder allows for flexible construction of deployment pipelines
         | 
| 16 | 
            +
                with different steps based on deployment requirements.
         | 
| 17 | 
            +
                """
         | 
| 18 | 
            +
             | 
| 19 | 
            +
                def __init__(self):
         | 
| 20 | 
            +
                    """Initialize the pipeline builder."""
         | 
| 21 | 
            +
                    self.logger = get_logger(__name__)
         | 
| 22 | 
            +
                    self._steps: List[BaseDeploymentStep] = []
         | 
| 23 | 
            +
                    self._step_registry: Dict[str, Type[BaseDeploymentStep]] = {}
         | 
| 24 | 
            +
             | 
| 25 | 
            +
                    # Register default steps
         | 
| 26 | 
            +
                    self._register_default_steps()
         | 
| 27 | 
            +
             | 
| 28 | 
            +
                def _register_default_steps(self) -> None:
         | 
| 29 | 
            +
                    """Register default deployment steps."""
         | 
| 30 | 
            +
                    self._step_registry.update(
         | 
| 31 | 
            +
                        {
         | 
| 32 | 
            +
                            "configuration": ConfigurationLoadStep,
         | 
| 33 | 
            +
                            "target_directory": TargetDirectorySetupStep,
         | 
| 34 | 
            +
                            # Additional steps will be registered as they're created
         | 
| 35 | 
            +
                        }
         | 
| 36 | 
            +
                    )
         | 
| 37 | 
            +
             | 
| 38 | 
            +
                def add_step(self, step: BaseDeploymentStep) -> "DeploymentPipelineBuilder":
         | 
| 39 | 
            +
                    """Add a step to the pipeline.
         | 
| 40 | 
            +
             | 
| 41 | 
            +
                    Args:
         | 
| 42 | 
            +
                        step: The deployment step to add
         | 
| 43 | 
            +
             | 
| 44 | 
            +
                    Returns:
         | 
| 45 | 
            +
                        Self for method chaining
         | 
| 46 | 
            +
                    """
         | 
| 47 | 
            +
                    self._steps.append(step)
         | 
| 48 | 
            +
                    self.logger.debug(f"Added step: {step.name}")
         | 
| 49 | 
            +
                    return self
         | 
| 50 | 
            +
             | 
| 51 | 
            +
                def add_step_by_name(self, step_name: str, **kwargs) -> "DeploymentPipelineBuilder":
         | 
| 52 | 
            +
                    """Add a step by its registered name.
         | 
| 53 | 
            +
             | 
| 54 | 
            +
                    Args:
         | 
| 55 | 
            +
                        step_name: Name of the registered step
         | 
| 56 | 
            +
                        **kwargs: Arguments to pass to the step constructor
         | 
| 57 | 
            +
             | 
| 58 | 
            +
                    Returns:
         | 
| 59 | 
            +
                        Self for method chaining
         | 
| 60 | 
            +
             | 
| 61 | 
            +
                    Raises:
         | 
| 62 | 
            +
                        ValueError: If step name is not registered
         | 
| 63 | 
            +
                    """
         | 
| 64 | 
            +
                    if step_name not in self._step_registry:
         | 
| 65 | 
            +
                        raise ValueError(f"Unknown step name: {step_name}")
         | 
| 66 | 
            +
             | 
| 67 | 
            +
                    step_class = self._step_registry[step_name]
         | 
| 68 | 
            +
                    step = step_class(**kwargs)
         | 
| 69 | 
            +
                    return self.add_step(step)
         | 
| 70 | 
            +
             | 
| 71 | 
            +
                def create_standard_pipeline(self) -> List[BaseDeploymentStep]:
         | 
| 72 | 
            +
                    """Create a standard deployment pipeline with all common steps.
         | 
| 73 | 
            +
             | 
| 74 | 
            +
                    Returns:
         | 
| 75 | 
            +
                        List of deployment steps in execution order
         | 
| 76 | 
            +
                    """
         | 
| 77 | 
            +
                    return [
         | 
| 78 | 
            +
                        ConfigurationLoadStep(),
         | 
| 79 | 
            +
                        TargetDirectorySetupStep(),
         | 
| 80 | 
            +
                        # Additional steps will be added as they're implemented
         | 
| 81 | 
            +
                    ]
         | 
| 82 | 
            +
             | 
| 83 | 
            +
                def create_minimal_pipeline(self) -> List[BaseDeploymentStep]:
         | 
| 84 | 
            +
                    """Create a minimal deployment pipeline with only essential steps.
         | 
| 85 | 
            +
             | 
| 86 | 
            +
                    Returns:
         | 
| 87 | 
            +
                        List of essential deployment steps
         | 
| 88 | 
            +
                    """
         | 
| 89 | 
            +
                    return [
         | 
| 90 | 
            +
                        ConfigurationLoadStep(),
         | 
| 91 | 
            +
                        TargetDirectorySetupStep(),
         | 
| 92 | 
            +
                    ]
         | 
| 93 | 
            +
             | 
| 94 | 
            +
                def create_custom_pipeline(self, step_names: List[str]) -> List[BaseDeploymentStep]:
         | 
| 95 | 
            +
                    """Create a custom pipeline from step names.
         | 
| 96 | 
            +
             | 
| 97 | 
            +
                    Args:
         | 
| 98 | 
            +
                        step_names: List of step names to include in the pipeline
         | 
| 99 | 
            +
             | 
| 100 | 
            +
                    Returns:
         | 
| 101 | 
            +
                        List of deployment steps
         | 
| 102 | 
            +
             | 
| 103 | 
            +
                    Raises:
         | 
| 104 | 
            +
                        ValueError: If any step name is not registered
         | 
| 105 | 
            +
                    """
         | 
| 106 | 
            +
                    steps = []
         | 
| 107 | 
            +
                    for step_name in step_names:
         | 
| 108 | 
            +
                        if step_name not in self._step_registry:
         | 
| 109 | 
            +
                            raise ValueError(f"Unknown step name: {step_name}")
         | 
| 110 | 
            +
             | 
| 111 | 
            +
                        step_class = self._step_registry[step_name]
         | 
| 112 | 
            +
                        steps.append(step_class())
         | 
| 113 | 
            +
             | 
| 114 | 
            +
                    return steps
         | 
| 115 | 
            +
             | 
| 116 | 
            +
                def build(self) -> List[BaseDeploymentStep]:
         | 
| 117 | 
            +
                    """Build the pipeline from added steps.
         | 
| 118 | 
            +
             | 
| 119 | 
            +
                    Returns:
         | 
| 120 | 
            +
                        List of deployment steps in the order they were added
         | 
| 121 | 
            +
                    """
         | 
| 122 | 
            +
                    if not self._steps:
         | 
| 123 | 
            +
                        self.logger.warning(
         | 
| 124 | 
            +
                            "No steps added to pipeline, creating standard pipeline"
         | 
| 125 | 
            +
                        )
         | 
| 126 | 
            +
                        return self.create_standard_pipeline()
         | 
| 127 | 
            +
             | 
| 128 | 
            +
                    # Sort steps based on dependencies (simplified for now)
         | 
| 129 | 
            +
                    # In a full implementation, this would do topological sorting
         | 
| 130 | 
            +
                    return self._steps.copy()
         | 
| 131 | 
            +
             | 
| 132 | 
            +
                def register_step(self, name: str, step_class: Type[BaseDeploymentStep]) -> None:
         | 
| 133 | 
            +
                    """Register a new step type.
         | 
| 134 | 
            +
             | 
| 135 | 
            +
                    Args:
         | 
| 136 | 
            +
                        name: Name to register the step under
         | 
| 137 | 
            +
                        step_class: The step class to register
         | 
| 138 | 
            +
                    """
         | 
| 139 | 
            +
                    self._step_registry[name] = step_class
         | 
| 140 | 
            +
                    self.logger.debug(f"Registered step: {name} -> {step_class.__name__}")
         | 
| 141 | 
            +
             | 
| 142 | 
            +
                def get_registered_steps(self) -> Dict[str, Type[BaseDeploymentStep]]:
         | 
| 143 | 
            +
                    """Get all registered step types.
         | 
| 144 | 
            +
             | 
| 145 | 
            +
                    Returns:
         | 
| 146 | 
            +
                        Dictionary of step names to step classes
         | 
| 147 | 
            +
                    """
         | 
| 148 | 
            +
                    return self._step_registry.copy()
         | 
| 149 | 
            +
             | 
| 150 | 
            +
                def clear(self) -> "DeploymentPipelineBuilder":
         | 
| 151 | 
            +
                    """Clear all added steps.
         | 
| 152 | 
            +
             | 
| 153 | 
            +
                    Returns:
         | 
| 154 | 
            +
                        Self for method chaining
         | 
| 155 | 
            +
                    """
         | 
| 156 | 
            +
                    self._steps.clear()
         | 
| 157 | 
            +
                    self.logger.debug("Cleared all steps from pipeline builder")
         | 
| 158 | 
            +
                    return self
         |