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
| @@ -20,17 +20,17 @@ import sys | |
| 20 20 | 
             
            import time
         | 
| 21 21 | 
             
            from concurrent.futures import ThreadPoolExecutor
         | 
| 22 22 | 
             
            from dataclasses import dataclass, field
         | 
| 23 | 
            -
            from pathlib import Path
         | 
| 24 23 | 
             
            from typing import Any, Callable, Dict, List, Optional, Set, Tuple
         | 
| 25 24 |  | 
| 26 | 
            -
            from .lazy import LazyService, lazy_load
         | 
| 27 | 
            -
            from .cache import get_file_cache
         | 
| 28 25 | 
             
            from ..core.logger import get_logger
         | 
| 26 | 
            +
            from .cache import get_file_cache
         | 
| 27 | 
            +
            from .lazy import LazyService, lazy_load
         | 
| 29 28 |  | 
| 30 29 |  | 
| 31 30 | 
             
            @dataclass
         | 
| 32 31 | 
             
            class StartupMetrics:
         | 
| 33 32 | 
             
                """Metrics for startup performance."""
         | 
| 33 | 
            +
             | 
| 34 34 | 
             
                total_time: float = 0.0
         | 
| 35 35 | 
             
                import_time: float = 0.0
         | 
| 36 36 | 
             
                config_time: float = 0.0
         | 
| @@ -42,41 +42,49 @@ class StartupMetrics: | |
| 42 42 |  | 
| 43 43 | 
             
            class OptimizedStartup:
         | 
| 44 44 | 
             
                """Manager for optimized application startup.
         | 
| 45 | 
            -
             | 
| 45 | 
            +
             | 
| 46 46 | 
             
                WHY this design:
         | 
| 47 47 | 
             
                - Phase-based initialization for progressive loading
         | 
| 48 48 | 
             
                - Critical-path optimization
         | 
| 49 49 | 
             
                - Deferred loading for optional features
         | 
| 50 50 | 
             
                - Parallel initialization where possible
         | 
| 51 | 
            -
             | 
| 51 | 
            +
             | 
| 52 52 | 
             
                Example:
         | 
| 53 53 | 
             
                    startup = OptimizedStartup()
         | 
| 54 | 
            -
             | 
| 54 | 
            +
             | 
| 55 55 | 
             
                    # Fast minimal startup
         | 
| 56 56 | 
             
                    startup.initialize_minimal()
         | 
| 57 | 
            -
             | 
| 57 | 
            +
             | 
| 58 58 | 
             
                    # Progressive enhancement
         | 
| 59 59 | 
             
                    startup.initialize_services()
         | 
| 60 60 | 
             
                    startup.initialize_agents()
         | 
| 61 61 | 
             
                """
         | 
| 62 | 
            -
             | 
| 62 | 
            +
             | 
| 63 63 | 
             
                # Critical services needed immediately
         | 
| 64 | 
            -
                CRITICAL_SERVICES = {
         | 
| 65 | 
            -
             | 
| 66 | 
            -
                }
         | 
| 67 | 
            -
                
         | 
| 64 | 
            +
                CRITICAL_SERVICES = {"logger", "config", "paths", "cli_parser"}
         | 
| 65 | 
            +
             | 
| 68 66 | 
             
                # Services that can be deferred
         | 
| 69 67 | 
             
                DEFERRED_SERVICES = {
         | 
| 70 | 
            -
                     | 
| 71 | 
            -
                     | 
| 68 | 
            +
                    "socketio",
         | 
| 69 | 
            +
                    "dashboard",
         | 
| 70 | 
            +
                    "memory",
         | 
| 71 | 
            +
                    "hooks",
         | 
| 72 | 
            +
                    "project_analyzer",
         | 
| 73 | 
            +
                    "tree_sitter",
         | 
| 74 | 
            +
                    "monitoring",
         | 
| 72 75 | 
             
                }
         | 
| 73 | 
            -
             | 
| 76 | 
            +
             | 
| 74 77 | 
             
                # Heavy imports to defer
         | 
| 75 78 | 
             
                HEAVY_IMPORTS = {
         | 
| 76 | 
            -
                     | 
| 77 | 
            -
                     | 
| 79 | 
            +
                    "numpy",
         | 
| 80 | 
            +
                    "pandas",
         | 
| 81 | 
            +
                    "matplotlib",
         | 
| 82 | 
            +
                    "scipy",
         | 
| 83 | 
            +
                    "tensorflow",
         | 
| 84 | 
            +
                    "torch",
         | 
| 85 | 
            +
                    "transformers",
         | 
| 78 86 | 
             
                }
         | 
| 79 | 
            -
             | 
| 87 | 
            +
             | 
| 80 88 | 
             
                def __init__(self):
         | 
| 81 89 | 
             
                    self.metrics = StartupMetrics()
         | 
| 82 90 | 
             
                    self.logger = get_logger("startup")
         | 
| @@ -84,44 +92,44 @@ class OptimizedStartup: | |
| 84 92 | 
             
                    self.lazy_services: Dict[str, LazyService] = {}
         | 
| 85 93 | 
             
                    self.import_cache: Dict[str, Any] = {}
         | 
| 86 94 | 
             
                    self.executor = ThreadPoolExecutor(max_workers=4)
         | 
| 87 | 
            -
             | 
| 95 | 
            +
             | 
| 88 96 | 
             
                    # Start timer
         | 
| 89 97 | 
             
                    self.start_time = time.time()
         | 
| 90 | 
            -
             | 
| 98 | 
            +
             | 
| 91 99 | 
             
                def initialize_minimal(self) -> float:
         | 
| 92 100 | 
             
                    """Initialize only critical components for fast startup.
         | 
| 93 | 
            -
             | 
| 101 | 
            +
             | 
| 94 102 | 
             
                    Returns:
         | 
| 95 103 | 
             
                        Time taken for minimal initialization
         | 
| 96 104 | 
             
                    """
         | 
| 97 105 | 
             
                    phase_start = time.time()
         | 
| 98 | 
            -
             | 
| 106 | 
            +
             | 
| 99 107 | 
             
                    # 1. Setup basic logging (synchronous, required immediately)
         | 
| 100 108 | 
             
                    self._setup_logging()
         | 
| 101 | 
            -
             | 
| 109 | 
            +
             | 
| 102 110 | 
             
                    # 2. Load minimal config (only required settings)
         | 
| 103 111 | 
             
                    self._load_minimal_config()
         | 
| 104 | 
            -
             | 
| 112 | 
            +
             | 
| 105 113 | 
             
                    # 3. Setup CLI parser (needed for argument processing)
         | 
| 106 114 | 
             
                    self._setup_cli_parser()
         | 
| 107 | 
            -
             | 
| 115 | 
            +
             | 
| 108 116 | 
             
                    elapsed = time.time() - phase_start
         | 
| 109 | 
            -
                    self.metrics.phases[ | 
| 117 | 
            +
                    self.metrics.phases["minimal"] = elapsed
         | 
| 110 118 | 
             
                    self.logger.info(f"Minimal initialization completed in {elapsed:.2f}s")
         | 
| 111 | 
            -
             | 
| 119 | 
            +
             | 
| 112 120 | 
             
                    return elapsed
         | 
| 113 | 
            -
             | 
| 121 | 
            +
             | 
| 114 122 | 
             
                def initialize_services(self, lazy: bool = True) -> float:
         | 
| 115 123 | 
             
                    """Initialize service layer with optional lazy loading.
         | 
| 116 | 
            -
             | 
| 124 | 
            +
             | 
| 117 125 | 
             
                    Args:
         | 
| 118 126 | 
             
                        lazy: Whether to use lazy loading for services
         | 
| 119 | 
            -
             | 
| 127 | 
            +
             | 
| 120 128 | 
             
                    Returns:
         | 
| 121 129 | 
             
                        Time taken for service initialization
         | 
| 122 130 | 
             
                    """
         | 
| 123 131 | 
             
                    phase_start = time.time()
         | 
| 124 | 
            -
             | 
| 132 | 
            +
             | 
| 125 133 | 
             
                    if lazy:
         | 
| 126 134 | 
             
                        # Create lazy wrappers for deferred services
         | 
| 127 135 | 
             
                        self._create_lazy_services()
         | 
| @@ -129,257 +137,252 @@ class OptimizedStartup: | |
| 129 137 | 
             
                    else:
         | 
| 130 138 | 
             
                        # Initialize all services immediately
         | 
| 131 139 | 
             
                        self._initialize_all_services()
         | 
| 132 | 
            -
             | 
| 140 | 
            +
             | 
| 133 141 | 
             
                    elapsed = time.time() - phase_start
         | 
| 134 | 
            -
                    self.metrics.phases[ | 
| 142 | 
            +
                    self.metrics.phases["services"] = elapsed
         | 
| 135 143 | 
             
                    self.metrics.service_time = elapsed
         | 
| 136 | 
            -
             | 
| 144 | 
            +
             | 
| 137 145 | 
             
                    return elapsed
         | 
| 138 | 
            -
             | 
| 146 | 
            +
             | 
| 139 147 | 
             
                def initialize_agents(self, preload: bool = False) -> float:
         | 
| 140 148 | 
             
                    """Initialize agent system with optional preloading.
         | 
| 141 | 
            -
             | 
| 149 | 
            +
             | 
| 142 150 | 
             
                    Args:
         | 
| 143 151 | 
             
                        preload: Whether to preload all agents
         | 
| 144 | 
            -
             | 
| 152 | 
            +
             | 
| 145 153 | 
             
                    Returns:
         | 
| 146 154 | 
             
                        Time taken for agent initialization
         | 
| 147 155 | 
             
                    """
         | 
| 148 156 | 
             
                    phase_start = time.time()
         | 
| 149 | 
            -
             | 
| 157 | 
            +
             | 
| 150 158 | 
             
                    if preload:
         | 
| 151 159 | 
             
                        # Load all agents immediately
         | 
| 152 160 | 
             
                        from .optimized_agent_loader import preload_system_agents
         | 
| 161 | 
            +
             | 
| 153 162 | 
             
                        preload_system_agents()
         | 
| 154 163 | 
             
                    else:
         | 
| 155 164 | 
             
                        # Just setup agent registry, load on demand
         | 
| 156 165 | 
             
                        self._setup_agent_registry()
         | 
| 157 | 
            -
             | 
| 166 | 
            +
             | 
| 158 167 | 
             
                    elapsed = time.time() - phase_start
         | 
| 159 | 
            -
                    self.metrics.phases[ | 
| 168 | 
            +
                    self.metrics.phases["agents"] = elapsed
         | 
| 160 169 | 
             
                    self.metrics.agent_time = elapsed
         | 
| 161 | 
            -
             | 
| 170 | 
            +
             | 
| 162 171 | 
             
                    return elapsed
         | 
| 163 | 
            -
             | 
| 172 | 
            +
             | 
| 164 173 | 
             
                async def initialize_async(self) -> StartupMetrics:
         | 
| 165 174 | 
             
                    """Fully async initialization for maximum performance.
         | 
| 166 | 
            -
             | 
| 175 | 
            +
             | 
| 167 176 | 
             
                    Returns:
         | 
| 168 177 | 
             
                        Complete startup metrics
         | 
| 169 178 | 
             
                    """
         | 
| 170 179 | 
             
                    start = time.time()
         | 
| 171 | 
            -
             | 
| 180 | 
            +
             | 
| 172 181 | 
             
                    # Run initialization phases concurrently where possible
         | 
| 173 182 | 
             
                    tasks = [
         | 
| 174 183 | 
             
                        self._async_load_config(),
         | 
| 175 184 | 
             
                        self._async_setup_services(),
         | 
| 176 | 
            -
                        self._async_load_agents()
         | 
| 185 | 
            +
                        self._async_load_agents(),
         | 
| 177 186 | 
             
                    ]
         | 
| 178 | 
            -
             | 
| 187 | 
            +
             | 
| 179 188 | 
             
                    results = await asyncio.gather(*tasks, return_exceptions=True)
         | 
| 180 | 
            -
             | 
| 189 | 
            +
             | 
| 181 190 | 
             
                    # Handle any errors
         | 
| 182 191 | 
             
                    for i, result in enumerate(results):
         | 
| 183 192 | 
             
                        if isinstance(result, Exception):
         | 
| 184 193 | 
             
                            self.logger.error(f"Async initialization error in task {i}: {result}")
         | 
| 185 | 
            -
             | 
| 194 | 
            +
             | 
| 186 195 | 
             
                    self.metrics.total_time = time.time() - start
         | 
| 187 196 | 
             
                    self.logger.info(f"Async startup completed in {self.metrics.total_time:.2f}s")
         | 
| 188 | 
            -
             | 
| 197 | 
            +
             | 
| 189 198 | 
             
                    return self.metrics
         | 
| 190 | 
            -
             | 
| 199 | 
            +
             | 
| 191 200 | 
             
                def _setup_logging(self):
         | 
| 192 201 | 
             
                    """Setup basic logging (critical path)."""
         | 
| 193 202 | 
             
                    # Minimal logging setup - already handled by logger module
         | 
| 194 | 
            -
                    self.initialized_services.add( | 
| 195 | 
            -
             | 
| 203 | 
            +
                    self.initialized_services.add("logger")
         | 
| 204 | 
            +
             | 
| 196 205 | 
             
                def _load_minimal_config(self):
         | 
| 197 206 | 
             
                    """Load only essential configuration."""
         | 
| 198 207 | 
             
                    try:
         | 
| 199 208 | 
             
                        # Use cache for config if available
         | 
| 200 209 | 
             
                        cache = get_file_cache()
         | 
| 201 210 | 
             
                        config_path = Path.home() / ".claude-mpm" / "config.yaml"
         | 
| 202 | 
            -
             | 
| 211 | 
            +
             | 
| 203 212 | 
             
                        if config_path.exists():
         | 
| 204 213 | 
             
                            config = cache.get_or_compute(
         | 
| 205 214 | 
             
                                f"config:{config_path}",
         | 
| 206 215 | 
             
                                lambda: self._parse_config(config_path),
         | 
| 207 | 
            -
                                ttl=60
         | 
| 216 | 
            +
                                ttl=60,
         | 
| 208 217 | 
             
                            )
         | 
| 209 218 | 
             
                            # Store in a lightweight way
         | 
| 210 219 | 
             
                            self._store_config(config)
         | 
| 211 | 
            -
             | 
| 212 | 
            -
                        self.initialized_services.add( | 
| 220 | 
            +
             | 
| 221 | 
            +
                        self.initialized_services.add("config")
         | 
| 213 222 | 
             
                    except Exception as e:
         | 
| 214 223 | 
             
                        self.logger.warning(f"Failed to load config: {e}")
         | 
| 215 | 
            -
             | 
| 224 | 
            +
             | 
| 216 225 | 
             
                def _parse_config(self, path: Path) -> Dict[str, Any]:
         | 
| 217 226 | 
             
                    """Parse configuration file."""
         | 
| 218 227 | 
             
                    import yaml
         | 
| 228 | 
            +
             | 
| 219 229 | 
             
                    with open(path) as f:
         | 
| 220 230 | 
             
                        return yaml.safe_load(f) or {}
         | 
| 221 | 
            -
             | 
| 231 | 
            +
             | 
| 222 232 | 
             
                def _store_config(self, config: Dict[str, Any]):
         | 
| 223 233 | 
             
                    """Store configuration for later use."""
         | 
| 224 234 | 
             
                    # Simple storage without heavy Config class
         | 
| 225 | 
            -
                    sys.modules[ | 
| 226 | 
            -
             | 
| 235 | 
            +
                    sys.modules["__claude_mpm_config__"] = type("Config", (), config)()
         | 
| 236 | 
            +
             | 
| 227 237 | 
             
                def _setup_cli_parser(self):
         | 
| 228 238 | 
             
                    """Setup CLI argument parser."""
         | 
| 229 239 | 
             
                    # Defer actual parser creation until needed
         | 
| 230 | 
            -
                    self.lazy_services[ | 
| 231 | 
            -
                        service_class=self._create_cli_parser,
         | 
| 232 | 
            -
                        name='cli_parser'
         | 
| 240 | 
            +
                    self.lazy_services["cli_parser"] = LazyService(
         | 
| 241 | 
            +
                        service_class=self._create_cli_parser, name="cli_parser"
         | 
| 233 242 | 
             
                    )
         | 
| 234 | 
            -
                    self.initialized_services.add( | 
| 235 | 
            -
             | 
| 243 | 
            +
                    self.initialized_services.add("cli_parser")
         | 
| 244 | 
            +
             | 
| 236 245 | 
             
                def _create_cli_parser(self):
         | 
| 237 246 | 
             
                    """Actually create the CLI parser when needed."""
         | 
| 238 247 | 
             
                    from ..cli.parser import create_parser
         | 
| 248 | 
            +
             | 
| 239 249 | 
             
                    return create_parser()
         | 
| 240 | 
            -
             | 
| 250 | 
            +
             | 
| 241 251 | 
             
                def _create_lazy_services(self):
         | 
| 242 252 | 
             
                    """Create lazy wrappers for deferred services."""
         | 
| 243 253 | 
             
                    # SocketIO service (heavy, often not needed)
         | 
| 244 | 
            -
                    self.lazy_services[ | 
| 245 | 
            -
                        self._create_socketio_service,
         | 
| 246 | 
            -
                        name='socketio'
         | 
| 254 | 
            +
                    self.lazy_services["socketio"] = lazy_load(
         | 
| 255 | 
            +
                        self._create_socketio_service, name="socketio"
         | 
| 247 256 | 
             
                    )
         | 
| 248 | 
            -
             | 
| 257 | 
            +
             | 
| 249 258 | 
             
                    # Dashboard service
         | 
| 250 | 
            -
                    self.lazy_services[ | 
| 251 | 
            -
                        self._create_dashboard_service,
         | 
| 252 | 
            -
                        name='dashboard'
         | 
| 259 | 
            +
                    self.lazy_services["dashboard"] = lazy_load(
         | 
| 260 | 
            +
                        self._create_dashboard_service, name="dashboard"
         | 
| 253 261 | 
             
                    )
         | 
| 254 | 
            -
             | 
| 262 | 
            +
             | 
| 255 263 | 
             
                    # Memory service
         | 
| 256 | 
            -
                    self.lazy_services[ | 
| 257 | 
            -
                        self._create_memory_service,
         | 
| 258 | 
            -
                        name='memory'
         | 
| 264 | 
            +
                    self.lazy_services["memory"] = lazy_load(
         | 
| 265 | 
            +
                        self._create_memory_service, name="memory"
         | 
| 259 266 | 
             
                    )
         | 
| 260 | 
            -
             | 
| 267 | 
            +
             | 
| 261 268 | 
             
                    # Hook service
         | 
| 262 | 
            -
                    self.lazy_services[ | 
| 263 | 
            -
             | 
| 264 | 
            -
                        name='hooks'
         | 
| 265 | 
            -
                    )
         | 
| 266 | 
            -
                    
         | 
| 269 | 
            +
                    self.lazy_services["hooks"] = lazy_load(self._create_hook_service, name="hooks")
         | 
| 270 | 
            +
             | 
| 267 271 | 
             
                    # Project analyzer (very heavy)
         | 
| 268 | 
            -
                    self.lazy_services[ | 
| 269 | 
            -
                        self._create_project_analyzer,
         | 
| 270 | 
            -
                        name='project_analyzer'
         | 
| 272 | 
            +
                    self.lazy_services["project_analyzer"] = lazy_load(
         | 
| 273 | 
            +
                        self._create_project_analyzer, name="project_analyzer"
         | 
| 271 274 | 
             
                    )
         | 
| 272 | 
            -
             | 
| 275 | 
            +
             | 
| 273 276 | 
             
                    # Track deferred services
         | 
| 274 277 | 
             
                    self.metrics.deferred_services = list(self.lazy_services.keys())
         | 
| 275 | 
            -
             | 
| 278 | 
            +
             | 
| 276 279 | 
             
                def _create_socketio_service(self):
         | 
| 277 280 | 
             
                    """Create SocketIO service when needed."""
         | 
| 278 281 | 
             
                    from ..core.socketio_pool import get_connection_pool
         | 
| 282 | 
            +
             | 
| 279 283 | 
             
                    return get_connection_pool()
         | 
| 280 | 
            -
             | 
| 284 | 
            +
             | 
| 281 285 | 
             
                def _create_dashboard_service(self):
         | 
| 282 286 | 
             
                    """Create dashboard service when needed."""
         | 
| 283 287 | 
             
                    # Import only when needed
         | 
| 284 288 | 
             
                    from ..services.dashboard import DashboardService
         | 
| 289 | 
            +
             | 
| 285 290 | 
             
                    return DashboardService()
         | 
| 286 | 
            -
             | 
| 291 | 
            +
             | 
| 287 292 | 
             
                def _create_memory_service(self):
         | 
| 288 293 | 
             
                    """Create memory service when needed."""
         | 
| 289 294 | 
             
                    from ..services.memory.indexed_memory import get_indexed_memory
         | 
| 295 | 
            +
             | 
| 290 296 | 
             
                    return get_indexed_memory()
         | 
| 291 | 
            -
             | 
| 297 | 
            +
             | 
| 292 298 | 
             
                def _create_hook_service(self):
         | 
| 293 299 | 
             
                    """Create hook service when needed."""
         | 
| 294 300 | 
             
                    from ..services.hook_service import HookService
         | 
| 301 | 
            +
             | 
| 295 302 | 
             
                    return HookService()
         | 
| 296 | 
            -
             | 
| 303 | 
            +
             | 
| 297 304 | 
             
                def _create_project_analyzer(self):
         | 
| 298 305 | 
             
                    """Create project analyzer when needed."""
         | 
| 299 306 | 
             
                    # This is typically very heavy
         | 
| 300 | 
            -
                    from ..services. | 
| 307 | 
            +
                    from ..services.project.analyzer import ProjectAnalyzer
         | 
| 308 | 
            +
             | 
| 301 309 | 
             
                    return ProjectAnalyzer()
         | 
| 302 | 
            -
             | 
| 310 | 
            +
             | 
| 303 311 | 
             
                def _initialize_all_services(self):
         | 
| 304 312 | 
             
                    """Initialize all services immediately (non-lazy mode)."""
         | 
| 305 | 
            -
                    services = [
         | 
| 306 | 
            -
             | 
| 307 | 
            -
                    ]
         | 
| 308 | 
            -
                    
         | 
| 313 | 
            +
                    services = ["socketio", "dashboard", "memory", "hooks", "project_analyzer"]
         | 
| 314 | 
            +
             | 
| 309 315 | 
             
                    for service_name in services:
         | 
| 310 316 | 
             
                        try:
         | 
| 311 | 
            -
                            creator = getattr(self, f | 
| 317 | 
            +
                            creator = getattr(self, f"_create_{service_name}_service", None)
         | 
| 312 318 | 
             
                            if creator:
         | 
| 313 319 | 
             
                                creator()
         | 
| 314 320 | 
             
                                self.initialized_services.add(service_name)
         | 
| 315 321 | 
             
                        except Exception as e:
         | 
| 316 322 | 
             
                            self.logger.warning(f"Failed to initialize {service_name}: {e}")
         | 
| 317 | 
            -
             | 
| 323 | 
            +
             | 
| 318 324 | 
             
                def _setup_agent_registry(self):
         | 
| 319 325 | 
             
                    """Setup agent registry for on-demand loading."""
         | 
| 320 | 
            -
                    self.lazy_services[ | 
| 321 | 
            -
                        self._create_agent_registry,
         | 
| 322 | 
            -
                        name='agent_registry'
         | 
| 326 | 
            +
                    self.lazy_services["agent_registry"] = lazy_load(
         | 
| 327 | 
            +
                        self._create_agent_registry, name="agent_registry"
         | 
| 323 328 | 
             
                    )
         | 
| 324 | 
            -
                    self.initialized_services.add( | 
| 325 | 
            -
             | 
| 329 | 
            +
                    self.initialized_services.add("agent_registry")
         | 
| 330 | 
            +
             | 
| 326 331 | 
             
                def _create_agent_registry(self):
         | 
| 327 332 | 
             
                    """Create agent registry when needed."""
         | 
| 328 | 
            -
                    from ..core.agent_registry import SimpleAgentRegistry
         | 
| 329 333 | 
             
                    from pathlib import Path
         | 
| 334 | 
            +
             | 
| 335 | 
            +
                    from ..core.agent_registry import SimpleAgentRegistry
         | 
| 336 | 
            +
             | 
| 330 337 | 
             
                    return SimpleAgentRegistry(Path.cwd())
         | 
| 331 | 
            -
             | 
| 338 | 
            +
             | 
| 332 339 | 
             
                async def _async_load_config(self):
         | 
| 333 340 | 
             
                    """Load configuration asynchronously."""
         | 
| 334 341 | 
             
                    loop = asyncio.get_event_loop()
         | 
| 335 342 | 
             
                    config_path = Path.home() / ".claude-mpm" / "config.yaml"
         | 
| 336 | 
            -
             | 
| 343 | 
            +
             | 
| 337 344 | 
             
                    if config_path.exists():
         | 
| 338 | 
            -
                        config = await loop.run_in_executor(
         | 
| 339 | 
            -
                            None,
         | 
| 340 | 
            -
                            self._parse_config,
         | 
| 341 | 
            -
                            config_path
         | 
| 342 | 
            -
                        )
         | 
| 345 | 
            +
                        config = await loop.run_in_executor(None, self._parse_config, config_path)
         | 
| 343 346 | 
             
                        self._store_config(config)
         | 
| 344 | 
            -
             | 
| 347 | 
            +
             | 
| 345 348 | 
             
                async def _async_setup_services(self):
         | 
| 346 349 | 
             
                    """Setup services asynchronously."""
         | 
| 347 350 | 
             
                    # Create all lazy services concurrently
         | 
| 348 351 | 
             
                    loop = asyncio.get_event_loop()
         | 
| 349 352 | 
             
                    await loop.run_in_executor(None, self._create_lazy_services)
         | 
| 350 | 
            -
             | 
| 353 | 
            +
             | 
| 351 354 | 
             
                async def _async_load_agents(self):
         | 
| 352 355 | 
             
                    """Load agents asynchronously."""
         | 
| 353 356 | 
             
                    from .optimized_agent_loader import get_optimized_loader
         | 
| 354 | 
            -
             | 
| 357 | 
            +
             | 
| 355 358 | 
             
                    loader = get_optimized_loader()
         | 
| 356 359 | 
             
                    agent_paths = self._discover_agent_paths()
         | 
| 357 | 
            -
             | 
| 360 | 
            +
             | 
| 358 361 | 
             
                    if agent_paths:
         | 
| 359 362 | 
             
                        await loader.load_agents_async(agent_paths)
         | 
| 360 | 
            -
             | 
| 363 | 
            +
             | 
| 361 364 | 
             
                def _discover_agent_paths(self) -> List[Path]:
         | 
| 362 365 | 
             
                    """Discover agent file paths."""
         | 
| 363 366 | 
             
                    paths = []
         | 
| 364 367 | 
             
                    agent_dirs = [
         | 
| 365 368 | 
             
                        Path.cwd() / ".claude" / "agents",
         | 
| 366 369 | 
             
                        Path.cwd() / ".claude-mpm" / "agents",
         | 
| 367 | 
            -
                        Path.home() / ".claude-mpm" / "agents"
         | 
| 370 | 
            +
                        Path.home() / ".claude-mpm" / "agents",
         | 
| 368 371 | 
             
                    ]
         | 
| 369 | 
            -
             | 
| 372 | 
            +
             | 
| 370 373 | 
             
                    for dir_path in agent_dirs:
         | 
| 371 374 | 
             
                        if dir_path.exists():
         | 
| 372 | 
            -
                            paths.extend(dir_path.glob( | 
| 373 | 
            -
                            paths.extend(dir_path.glob( | 
| 374 | 
            -
             | 
| 375 | 
            +
                            paths.extend(dir_path.glob("*.json"))
         | 
| 376 | 
            +
                            paths.extend(dir_path.glob("*.md"))
         | 
| 377 | 
            +
             | 
| 375 378 | 
             
                    return paths
         | 
| 376 | 
            -
             | 
| 379 | 
            +
             | 
| 377 380 | 
             
                def defer_import(self, module_name: str) -> Optional[Any]:
         | 
| 378 381 | 
             
                    """Defer heavy imports until actually needed.
         | 
| 379 | 
            -
             | 
| 382 | 
            +
             | 
| 380 383 | 
             
                    Args:
         | 
| 381 384 | 
             
                        module_name: Name of module to import
         | 
| 382 | 
            -
             | 
| 385 | 
            +
             | 
| 383 386 | 
             
                    Returns:
         | 
| 384 387 | 
             
                        Imported module or None if not needed yet
         | 
| 385 388 | 
             
                    """
         | 
| @@ -387,11 +390,11 @@ class OptimizedStartup: | |
| 387 390 | 
             
                        # Don't import heavy modules during startup
         | 
| 388 391 | 
             
                        self.logger.debug(f"Deferring import of {module_name}")
         | 
| 389 392 | 
             
                        return None
         | 
| 390 | 
            -
             | 
| 393 | 
            +
             | 
| 391 394 | 
             
                    # Check cache
         | 
| 392 395 | 
             
                    if module_name in self.import_cache:
         | 
| 393 396 | 
             
                        return self.import_cache[module_name]
         | 
| 394 | 
            -
             | 
| 397 | 
            +
             | 
| 395 398 | 
             
                    # Import and cache
         | 
| 396 399 | 
             
                    try:
         | 
| 397 400 | 
             
                        module = importlib.import_module(module_name)
         | 
| @@ -400,81 +403,80 @@ class OptimizedStartup: | |
| 400 403 | 
             
                    except ImportError as e:
         | 
| 401 404 | 
             
                        self.logger.warning(f"Failed to import {module_name}: {e}")
         | 
| 402 405 | 
             
                        return None
         | 
| 403 | 
            -
             | 
| 406 | 
            +
             | 
| 404 407 | 
             
                def get_service(self, name: str) -> Any:
         | 
| 405 408 | 
             
                    """Get a service, initializing if needed.
         | 
| 406 | 
            -
             | 
| 409 | 
            +
             | 
| 407 410 | 
             
                    Args:
         | 
| 408 411 | 
             
                        name: Service name
         | 
| 409 | 
            -
             | 
| 412 | 
            +
             | 
| 410 413 | 
             
                    Returns:
         | 
| 411 414 | 
             
                        Service instance
         | 
| 412 415 | 
             
                    """
         | 
| 413 416 | 
             
                    if name in self.lazy_services:
         | 
| 414 417 | 
             
                        # Lazy service will initialize on first access
         | 
| 415 418 | 
             
                        return self.lazy_services[name]
         | 
| 416 | 
            -
             | 
| 419 | 
            +
             | 
| 417 420 | 
             
                    # Try to create service
         | 
| 418 | 
            -
                    creator = getattr(self, f | 
| 421 | 
            +
                    creator = getattr(self, f"_create_{name}_service", None)
         | 
| 419 422 | 
             
                    if creator:
         | 
| 420 423 | 
             
                        service = creator()
         | 
| 421 424 | 
             
                        self.initialized_services.add(name)
         | 
| 422 425 | 
             
                        return service
         | 
| 423 | 
            -
             | 
| 426 | 
            +
             | 
| 424 427 | 
             
                    return None
         | 
| 425 | 
            -
             | 
| 428 | 
            +
             | 
| 426 429 | 
             
                def get_metrics(self) -> Dict[str, Any]:
         | 
| 427 430 | 
             
                    """Get startup performance metrics."""
         | 
| 428 431 | 
             
                    self.metrics.total_time = time.time() - self.start_time
         | 
| 429 | 
            -
             | 
| 432 | 
            +
             | 
| 430 433 | 
             
                    return {
         | 
| 431 | 
            -
                         | 
| 432 | 
            -
                         | 
| 433 | 
            -
                         | 
| 434 | 
            -
                         | 
| 435 | 
            -
                         | 
| 436 | 
            -
                         | 
| 437 | 
            -
                         | 
| 438 | 
            -
                            1 for s in self.lazy_services.values()
         | 
| 439 | 
            -
             | 
| 440 | 
            -
                        )
         | 
| 434 | 
            +
                        "total_time": self.metrics.total_time,
         | 
| 435 | 
            +
                        "phases": self.metrics.phases,
         | 
| 436 | 
            +
                        "service_time": self.metrics.service_time,
         | 
| 437 | 
            +
                        "agent_time": self.metrics.agent_time,
         | 
| 438 | 
            +
                        "initialized_services": list(self.initialized_services),
         | 
| 439 | 
            +
                        "deferred_services": self.metrics.deferred_services,
         | 
| 440 | 
            +
                        "lazy_services_initialized": sum(
         | 
| 441 | 
            +
                            1 for s in self.lazy_services.values() if s.is_initialized
         | 
| 442 | 
            +
                        ),
         | 
| 441 443 | 
             
                    }
         | 
| 442 444 |  | 
| 443 445 |  | 
| 444 | 
            -
            def optimize_startup(mode: str =  | 
| 446 | 
            +
            def optimize_startup(mode: str = "lazy") -> OptimizedStartup:
         | 
| 445 447 | 
             
                """Optimize application startup.
         | 
| 446 | 
            -
             | 
| 448 | 
            +
             | 
| 447 449 | 
             
                Args:
         | 
| 448 450 | 
             
                    mode: Startup mode ('lazy', 'eager', 'async')
         | 
| 449 | 
            -
             | 
| 451 | 
            +
             | 
| 450 452 | 
             
                Returns:
         | 
| 451 453 | 
             
                    Configured startup manager
         | 
| 452 | 
            -
             | 
| 454 | 
            +
             | 
| 453 455 | 
             
                Example:
         | 
| 454 456 | 
             
                    # Fast lazy startup
         | 
| 455 457 | 
             
                    startup = optimize_startup('lazy')
         | 
| 456 458 | 
             
                    startup.initialize_minimal()
         | 
| 457 459 | 
             
                    startup.initialize_services(lazy=True)
         | 
| 458 | 
            -
             | 
| 460 | 
            +
             | 
| 459 461 | 
             
                    # Access services as needed (they initialize on first use)
         | 
| 460 462 | 
             
                    memory = startup.get_service('memory')
         | 
| 461 463 | 
             
                """
         | 
| 462 464 | 
             
                startup = OptimizedStartup()
         | 
| 463 | 
            -
             | 
| 464 | 
            -
                if mode ==  | 
| 465 | 
            +
             | 
| 466 | 
            +
                if mode == "lazy":
         | 
| 465 467 | 
             
                    # Minimal startup with lazy loading
         | 
| 466 468 | 
             
                    startup.initialize_minimal()
         | 
| 467 469 | 
             
                    startup.initialize_services(lazy=True)
         | 
| 468 470 | 
             
                    startup.initialize_agents(preload=False)
         | 
| 469 | 
            -
                elif mode ==  | 
| 471 | 
            +
                elif mode == "eager":
         | 
| 470 472 | 
             
                    # Full initialization upfront
         | 
| 471 473 | 
             
                    startup.initialize_minimal()
         | 
| 472 474 | 
             
                    startup.initialize_services(lazy=False)
         | 
| 473 475 | 
             
                    startup.initialize_agents(preload=True)
         | 
| 474 | 
            -
                elif mode ==  | 
| 476 | 
            +
                elif mode == "async":
         | 
| 475 477 | 
             
                    # Async initialization
         | 
| 476 478 | 
             
                    asyncio.run(startup.initialize_async())
         | 
| 477 | 
            -
             | 
| 479 | 
            +
             | 
| 478 480 | 
             
                return startup
         | 
| 479 481 |  | 
| 480 482 |  | 
| @@ -487,4 +489,4 @@ def get_startup_manager() -> OptimizedStartup: | |
| 487 489 | 
             
                global _startup_manager
         | 
| 488 490 | 
             
                if _startup_manager is None:
         | 
| 489 491 | 
             
                    _startup_manager = OptimizedStartup()
         | 
| 490 | 
            -
                return _startup_manager
         | 
| 492 | 
            +
                return _startup_manager
         |