claude-mpm 4.1.26__py3-none-any.whl → 5.0.9__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/BUILD_NUMBER +1 -1
- claude_mpm/VERSION +1 -1
- claude_mpm/__init__.py +20 -5
- claude_mpm/agents/BASE_AGENT_TEMPLATE.md +118 -0
- claude_mpm/agents/BASE_DOCUMENTATION.md +53 -0
- claude_mpm/agents/BASE_ENGINEER.md +658 -0
- claude_mpm/agents/BASE_OPS.md +219 -0
- claude_mpm/agents/BASE_PM.md +432 -158
- claude_mpm/agents/BASE_PROMPT_ENGINEER.md +787 -0
- claude_mpm/agents/BASE_QA.md +167 -0
- claude_mpm/agents/BASE_RESEARCH.md +53 -0
- claude_mpm/agents/OUTPUT_STYLE.md +254 -29
- claude_mpm/agents/PM_INSTRUCTIONS.md +969 -0
- claude_mpm/agents/PM_INSTRUCTIONS_TEACH.md +1322 -0
- claude_mpm/agents/WORKFLOW.md +355 -191
- claude_mpm/agents/__init__.py +6 -0
- claude_mpm/agents/agent_loader.py +41 -14
- claude_mpm/agents/agent_loader_integration.py +3 -2
- claude_mpm/agents/async_agent_loader.py +3 -3
- claude_mpm/agents/base_agent.json +6 -3
- claude_mpm/agents/base_agent_loader.py +21 -44
- claude_mpm/agents/frontmatter_validator.py +292 -252
- claude_mpm/agents/system_agent_config.py +3 -2
- claude_mpm/agents/templates/README.md +465 -0
- claude_mpm/agents/templates/circuit-breakers.md +1005 -0
- claude_mpm/agents/templates/context-management-examples.md +544 -0
- claude_mpm/agents/templates/git-file-tracking.md +584 -0
- claude_mpm/agents/templates/pm-examples.md +474 -0
- claude_mpm/agents/templates/pm-red-flags.md +310 -0
- claude_mpm/agents/templates/pr-workflow-examples.md +427 -0
- claude_mpm/agents/templates/research-gate-examples.md +669 -0
- claude_mpm/agents/templates/response-format.md +583 -0
- claude_mpm/agents/templates/structured-questions-examples.md +615 -0
- claude_mpm/agents/templates/ticket-completeness-examples.md +139 -0
- claude_mpm/agents/templates/ticketing-examples.md +277 -0
- claude_mpm/agents/templates/validation-templates.md +312 -0
- claude_mpm/cli/__init__.py +72 -376
- claude_mpm/cli/commands/__init__.py +4 -0
- claude_mpm/cli/commands/agent_manager.py +675 -20
- claude_mpm/cli/commands/agent_source.py +774 -0
- claude_mpm/cli/commands/agent_state_manager.py +344 -0
- claude_mpm/cli/commands/agents.py +1673 -178
- claude_mpm/cli/commands/agents_cleanup.py +210 -0
- claude_mpm/cli/commands/agents_detect.py +380 -0
- claude_mpm/cli/commands/agents_discover.py +338 -0
- claude_mpm/cli/commands/agents_recommend.py +309 -0
- claude_mpm/cli/commands/aggregate.py +11 -7
- claude_mpm/cli/commands/analyze.py +18 -13
- claude_mpm/cli/commands/analyze_code.py +8 -4
- claude_mpm/cli/commands/auto_configure.py +566 -0
- claude_mpm/cli/commands/cleanup.py +12 -12
- claude_mpm/cli/commands/config.py +54 -17
- claude_mpm/cli/commands/configure.py +1184 -1055
- claude_mpm/cli/commands/configure_agent_display.py +261 -0
- claude_mpm/cli/commands/configure_behavior_manager.py +204 -0
- claude_mpm/cli/commands/configure_hook_manager.py +225 -0
- claude_mpm/cli/commands/configure_models.py +18 -0
- claude_mpm/cli/commands/configure_navigation.py +184 -0
- claude_mpm/cli/commands/configure_paths.py +104 -0
- claude_mpm/cli/commands/configure_persistence.py +254 -0
- claude_mpm/cli/commands/configure_startup_manager.py +646 -0
- claude_mpm/cli/commands/configure_template_editor.py +497 -0
- claude_mpm/cli/commands/configure_validators.py +73 -0
- claude_mpm/cli/commands/dashboard.py +50 -52
- claude_mpm/cli/commands/debug.py +19 -19
- claude_mpm/cli/commands/doctor.py +51 -7
- claude_mpm/cli/commands/hook_errors.py +277 -0
- claude_mpm/cli/commands/info.py +3 -4
- claude_mpm/cli/commands/local_deploy.py +534 -0
- claude_mpm/cli/commands/mcp.py +17 -10
- claude_mpm/cli/commands/mcp_command_router.py +11 -0
- claude_mpm/cli/commands/mcp_config.py +154 -0
- claude_mpm/cli/commands/mcp_external_commands.py +249 -0
- claude_mpm/cli/commands/mcp_install_commands.py +101 -32
- claude_mpm/cli/commands/mcp_pipx_config.py +2 -2
- claude_mpm/cli/commands/mcp_setup_external.py +868 -0
- claude_mpm/cli/commands/memory.py +55 -21
- claude_mpm/cli/commands/monitor.py +160 -70
- claude_mpm/cli/commands/mpm_init/__init__.py +73 -0
- claude_mpm/cli/commands/mpm_init/core.py +573 -0
- claude_mpm/cli/commands/mpm_init/display.py +341 -0
- claude_mpm/cli/commands/mpm_init/git_activity.py +427 -0
- claude_mpm/cli/commands/mpm_init/modes.py +397 -0
- claude_mpm/cli/commands/mpm_init/prompts.py +442 -0
- claude_mpm/cli/commands/mpm_init_cli.py +396 -0
- claude_mpm/cli/commands/mpm_init_handler.py +114 -4
- claude_mpm/cli/commands/postmortem.py +401 -0
- claude_mpm/cli/commands/run.py +252 -167
- claude_mpm/cli/commands/search.py +458 -0
- claude_mpm/cli/commands/skill_source.py +694 -0
- claude_mpm/cli/commands/skills.py +1225 -0
- claude_mpm/cli/commands/uninstall.py +176 -0
- claude_mpm/cli/commands/upgrade.py +152 -0
- claude_mpm/cli/commands/verify.py +119 -0
- claude_mpm/cli/executor.py +279 -0
- claude_mpm/cli/helpers.py +105 -0
- claude_mpm/cli/interactive/__init__.py +21 -0
- claude_mpm/cli/interactive/agent_wizard.py +1872 -0
- claude_mpm/cli/interactive/skills_wizard.py +491 -0
- claude_mpm/cli/parser.py +79 -2
- claude_mpm/cli/parsers/__init__.py +7 -1
- claude_mpm/cli/parsers/agent_manager_parser.py +161 -1
- claude_mpm/cli/parsers/agent_source_parser.py +171 -0
- claude_mpm/cli/parsers/agents_parser.py +369 -1
- claude_mpm/cli/parsers/auto_configure_parser.py +245 -0
- claude_mpm/cli/parsers/base_parser.py +196 -3
- claude_mpm/cli/parsers/config_parser.py +96 -43
- claude_mpm/cli/parsers/configure_parser.py +11 -15
- claude_mpm/cli/parsers/local_deploy_parser.py +227 -0
- claude_mpm/cli/parsers/mcp_parser.py +15 -0
- claude_mpm/cli/parsers/monitor_parser.py +12 -2
- claude_mpm/cli/parsers/mpm_init_parser.py +179 -9
- claude_mpm/cli/parsers/run_parser.py +5 -0
- claude_mpm/cli/parsers/search_parser.py +245 -0
- claude_mpm/cli/parsers/skill_source_parser.py +169 -0
- claude_mpm/cli/parsers/skills_parser.py +282 -0
- claude_mpm/cli/parsers/source_parser.py +138 -0
- claude_mpm/cli/shared/argument_patterns.py +20 -13
- claude_mpm/cli/shared/base_command.py +2 -2
- claude_mpm/cli/shared/output_formatters.py +28 -19
- claude_mpm/cli/startup.py +994 -0
- claude_mpm/cli/startup_display.py +480 -0
- claude_mpm/cli/startup_logging.py +179 -13
- claude_mpm/cli/utils.py +54 -3
- claude_mpm/cli_module/commands.py +1 -1
- claude_mpm/commands/mpm-agents-auto-configure.md +278 -0
- claude_mpm/commands/mpm-agents-detect.md +177 -0
- claude_mpm/commands/mpm-agents-list.md +131 -0
- claude_mpm/commands/mpm-agents-recommend.md +223 -0
- claude_mpm/commands/mpm-config-view.md +150 -0
- claude_mpm/commands/mpm-doctor.md +9 -0
- claude_mpm/commands/mpm-help.md +297 -5
- claude_mpm/commands/mpm-init.md +401 -17
- claude_mpm/commands/mpm-monitor.md +418 -0
- claude_mpm/commands/mpm-postmortem.md +123 -0
- claude_mpm/commands/mpm-session-resume.md +381 -0
- claude_mpm/commands/mpm-status.md +79 -8
- claude_mpm/commands/mpm-ticket-organize.md +304 -0
- claude_mpm/commands/mpm-ticket-view.md +552 -0
- claude_mpm/commands/mpm-version.md +122 -0
- claude_mpm/commands/mpm.md +12 -0
- claude_mpm/config/agent_config.py +4 -4
- claude_mpm/config/agent_presets.py +488 -0
- claude_mpm/config/agent_sources.py +325 -0
- claude_mpm/config/experimental_features.py +7 -7
- claude_mpm/config/model_config.py +428 -0
- claude_mpm/config/paths.py +3 -2
- claude_mpm/config/skill_presets.py +392 -0
- claude_mpm/config/skill_sources.py +590 -0
- claude_mpm/config/socketio_config.py +3 -3
- claude_mpm/constants.py +28 -1
- claude_mpm/core/__init__.py +53 -17
- claude_mpm/core/agent_name_normalizer.py +3 -2
- claude_mpm/core/agent_registry.py +2 -2
- claude_mpm/core/agent_session_manager.py +10 -10
- claude_mpm/core/api_validator.py +330 -0
- claude_mpm/core/base_service.py +33 -23
- claude_mpm/core/cache.py +9 -9
- claude_mpm/core/claude_runner.py +24 -42
- claude_mpm/core/config.py +101 -8
- claude_mpm/core/config_aliases.py +7 -6
- claude_mpm/core/constants.py +66 -1
- claude_mpm/core/container.py +11 -5
- claude_mpm/core/enums.py +452 -0
- claude_mpm/core/error_handler.py +623 -0
- claude_mpm/core/factories.py +1 -1
- claude_mpm/core/file_utils.py +764 -0
- claude_mpm/core/framework/__init__.py +25 -0
- claude_mpm/core/framework/formatters/__init__.py +11 -0
- claude_mpm/core/framework/formatters/capability_generator.py +367 -0
- claude_mpm/core/framework/formatters/content_formatter.py +288 -0
- claude_mpm/core/framework/formatters/context_generator.py +185 -0
- claude_mpm/core/framework/loaders/__init__.py +13 -0
- claude_mpm/core/framework/loaders/agent_loader.py +210 -0
- claude_mpm/core/framework/loaders/file_loader.py +176 -0
- claude_mpm/core/framework/loaders/instruction_loader.py +181 -0
- claude_mpm/core/framework/loaders/packaged_loader.py +232 -0
- claude_mpm/core/framework/processors/__init__.py +11 -0
- claude_mpm/core/framework/processors/memory_processor.py +230 -0
- claude_mpm/core/framework/processors/metadata_processor.py +146 -0
- claude_mpm/core/framework/processors/template_processor.py +244 -0
- claude_mpm/core/framework_loader.py +321 -1631
- claude_mpm/core/hook_error_memory.py +381 -0
- claude_mpm/core/hook_manager.py +49 -8
- claude_mpm/core/injectable_service.py +11 -8
- claude_mpm/core/instruction_reinforcement_hook.py +4 -3
- claude_mpm/core/interactive_session.py +146 -18
- claude_mpm/core/interfaces.py +56 -1
- claude_mpm/core/lazy.py +3 -3
- claude_mpm/core/log_manager.py +92 -23
- claude_mpm/core/logger.py +22 -15
- claude_mpm/core/logging_config.py +6 -2
- claude_mpm/core/logging_utils.py +520 -0
- claude_mpm/core/oneshot_session.py +122 -15
- claude_mpm/core/optimized_agent_loader.py +9 -9
- claude_mpm/core/optimized_startup.py +1 -1
- claude_mpm/core/output_style_manager.py +12 -192
- claude_mpm/core/pm_hook_interceptor.py +18 -12
- claude_mpm/core/protocols/__init__.py +23 -0
- claude_mpm/core/protocols/runner_protocol.py +103 -0
- claude_mpm/core/protocols/session_protocol.py +131 -0
- claude_mpm/core/service_registry.py +7 -3
- claude_mpm/core/session_manager.py +14 -12
- claude_mpm/core/shared/config_loader.py +1 -1
- claude_mpm/core/shared/singleton_manager.py +11 -4
- claude_mpm/core/socketio_pool.py +15 -15
- claude_mpm/core/system_context.py +38 -0
- claude_mpm/core/tool_access_control.py +3 -2
- claude_mpm/core/types.py +4 -11
- claude_mpm/core/typing_utils.py +7 -6
- claude_mpm/core/unified_agent_registry.py +115 -11
- claude_mpm/core/unified_config.py +6 -6
- claude_mpm/core/unified_paths.py +23 -20
- claude_mpm/dashboard/analysis_runner.py +4 -4
- claude_mpm/dashboard/api/simple_directory.py +261 -0
- claude_mpm/dashboard/static/css/activity.css +69 -69
- claude_mpm/dashboard/static/css/connection-status.css +10 -10
- claude_mpm/dashboard/static/css/dashboard.css +600 -18
- claude_mpm/dashboard/static/js/components/activity-tree.js +181 -195
- claude_mpm/dashboard/static/js/components/agent-hierarchy.js +105 -102
- claude_mpm/dashboard/static/js/components/agent-inference.js +34 -31
- claude_mpm/dashboard/static/js/components/build-tracker.js +67 -59
- claude_mpm/dashboard/static/js/components/code-simple.js +857 -0
- claude_mpm/dashboard/static/js/components/connection-debug.js +101 -101
- claude_mpm/dashboard/static/js/components/diff-viewer.js +891 -0
- claude_mpm/dashboard/static/js/components/event-processor.js +3 -0
- claude_mpm/dashboard/static/js/components/event-viewer.js +50 -13
- claude_mpm/dashboard/static/js/components/export-manager.js +3 -0
- claude_mpm/dashboard/static/js/components/file-change-tracker.js +443 -0
- claude_mpm/dashboard/static/js/components/file-change-viewer.js +690 -0
- claude_mpm/dashboard/static/js/components/file-tool-tracker.js +36 -16
- claude_mpm/dashboard/static/js/components/file-viewer.js +580 -0
- claude_mpm/dashboard/static/js/components/module-viewer.js +49 -23
- claude_mpm/dashboard/static/js/components/session-manager.js +19 -19
- claude_mpm/dashboard/static/js/components/socket-manager.js +5 -1
- claude_mpm/dashboard/static/js/components/ui-state-manager.js +356 -41
- claude_mpm/dashboard/static/js/components/unified-data-viewer.js +520 -88
- claude_mpm/dashboard/static/js/components/working-directory.js +46 -11
- claude_mpm/dashboard/static/js/connection-manager.js +76 -76
- claude_mpm/dashboard/static/js/dashboard.js +309 -178
- claude_mpm/dashboard/static/js/extension-error-handler.js +22 -22
- claude_mpm/dashboard/static/js/socket-client.js +183 -139
- claude_mpm/dashboard/static/js/tab-isolation-fix.js +185 -0
- claude_mpm/dashboard/static/socket.io.min.js +7 -0
- claude_mpm/dashboard/static/socket.io.v4.8.1.backup.js +7 -0
- claude_mpm/dashboard/templates/code_simple.html +153 -0
- claude_mpm/dashboard/templates/index.html +125 -122
- claude_mpm/experimental/cli_enhancements.py +5 -7
- claude_mpm/generators/agent_profile_generator.py +5 -3
- claude_mpm/hooks/__init__.py +37 -1
- claude_mpm/hooks/base_hook.py +5 -4
- claude_mpm/hooks/claude_hooks/__pycache__/__init__.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/event_handlers.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/hook_handler.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/memory_integration.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/response_tracking.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/tool_analysis.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/connection_pool.py +4 -4
- claude_mpm/hooks/claude_hooks/event_handlers.py +24 -19
- claude_mpm/hooks/claude_hooks/hook_handler.py +29 -22
- claude_mpm/hooks/claude_hooks/installer.py +67 -22
- claude_mpm/hooks/claude_hooks/memory_integration.py +3 -3
- claude_mpm/hooks/claude_hooks/response_tracking.py +57 -17
- claude_mpm/hooks/claude_hooks/services/__pycache__/__init__.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager_http.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/duplicate_detector.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/state_manager.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/subagent_processor.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/connection_manager.py +62 -64
- claude_mpm/hooks/claude_hooks/services/connection_manager_http.py +140 -76
- claude_mpm/hooks/claude_hooks/services/state_manager.py +11 -9
- claude_mpm/hooks/claude_hooks/services/subagent_processor.py +3 -3
- claude_mpm/hooks/failure_learning/__init__.py +54 -0
- claude_mpm/hooks/failure_learning/failure_detection_hook.py +230 -0
- claude_mpm/hooks/failure_learning/fix_detection_hook.py +212 -0
- claude_mpm/hooks/failure_learning/learning_extraction_hook.py +281 -0
- claude_mpm/hooks/instruction_reinforcement.py +301 -0
- claude_mpm/hooks/kuzu_enrichment_hook.py +263 -0
- claude_mpm/hooks/kuzu_memory_hook.py +386 -0
- claude_mpm/hooks/kuzu_response_hook.py +179 -0
- claude_mpm/hooks/memory_integration_hook.py +1 -1
- claude_mpm/hooks/session_resume_hook.py +121 -0
- claude_mpm/hooks/templates/pre_tool_use_simple.py +78 -0
- claude_mpm/hooks/templates/pre_tool_use_template.py +323 -0
- claude_mpm/hooks/tool_call_interceptor.py +8 -5
- claude_mpm/hooks/validation_hooks.py +3 -3
- claude_mpm/init.py +23 -4
- claude_mpm/models/agent_session.py +8 -6
- claude_mpm/models/git_repository.py +198 -0
- claude_mpm/models/resume_log.py +340 -0
- claude_mpm/scripts/claude-hook-handler.sh +35 -9
- claude_mpm/scripts/launch_monitor.py +85 -0
- claude_mpm/scripts/mcp_server.py +3 -5
- claude_mpm/scripts/mpm_doctor.py +3 -2
- claude_mpm/scripts/socketio_daemon.py +159 -512
- claude_mpm/scripts/start_activity_logging.py +3 -1
- claude_mpm/services/__init__.py +144 -160
- claude_mpm/services/agents/__init__.py +18 -5
- claude_mpm/services/agents/agent_builder.py +56 -18
- claude_mpm/services/agents/agent_preset_service.py +238 -0
- claude_mpm/services/agents/agent_selection_service.py +484 -0
- claude_mpm/services/agents/auto_config_manager.py +796 -0
- claude_mpm/services/agents/auto_deploy_index_parser.py +569 -0
- claude_mpm/services/agents/cache_git_manager.py +621 -0
- claude_mpm/services/agents/deployment/agent_configuration_manager.py +1 -1
- claude_mpm/services/agents/deployment/agent_deployment.py +164 -17
- claude_mpm/services/agents/deployment/agent_discovery_service.py +191 -41
- claude_mpm/services/agents/deployment/agent_filesystem_manager.py +5 -5
- claude_mpm/services/agents/deployment/agent_format_converter.py +56 -12
- claude_mpm/services/agents/deployment/agent_lifecycle_manager.py +5 -7
- claude_mpm/services/agents/deployment/agent_metrics_collector.py +3 -3
- claude_mpm/services/agents/deployment/agent_operation_service.py +2 -2
- claude_mpm/services/agents/deployment/agent_record_service.py +4 -4
- claude_mpm/services/agents/deployment/agent_restore_handler.py +1 -4
- claude_mpm/services/agents/deployment/agent_state_service.py +2 -2
- claude_mpm/services/agents/deployment/agent_template_builder.py +939 -50
- claude_mpm/services/agents/deployment/agent_validator.py +31 -7
- claude_mpm/services/agents/deployment/agent_version_manager.py +8 -5
- claude_mpm/services/agents/deployment/agent_versioning.py +1 -1
- claude_mpm/services/agents/deployment/agents_directory_resolver.py +101 -15
- claude_mpm/services/agents/deployment/async_agent_deployment.py +3 -2
- claude_mpm/services/agents/deployment/deployment_config_loader.py +131 -7
- claude_mpm/services/agents/deployment/deployment_type_detector.py +10 -14
- claude_mpm/services/agents/deployment/deployment_wrapper.py +58 -0
- claude_mpm/services/agents/deployment/facade/deployment_facade.py +3 -3
- claude_mpm/services/agents/deployment/interface_adapter.py +3 -2
- claude_mpm/services/agents/deployment/local_template_deployment.py +360 -0
- claude_mpm/services/agents/deployment/multi_source_deployment_service.py +249 -53
- claude_mpm/services/agents/deployment/pipeline/pipeline_executor.py +2 -2
- claude_mpm/services/agents/deployment/pipeline/steps/agent_processing_step.py +8 -7
- claude_mpm/services/agents/deployment/pipeline/steps/base_step.py +7 -16
- claude_mpm/services/agents/deployment/pipeline/steps/configuration_step.py +4 -3
- claude_mpm/services/agents/deployment/pipeline/steps/target_directory_step.py +7 -5
- claude_mpm/services/agents/deployment/pipeline/steps/validation_step.py +6 -5
- claude_mpm/services/agents/deployment/refactored_agent_deployment_service.py +10 -10
- claude_mpm/services/agents/deployment/remote_agent_discovery_service.py +363 -0
- claude_mpm/services/agents/deployment/single_agent_deployer.py +2 -2
- claude_mpm/services/agents/deployment/system_instructions_deployer.py +168 -43
- claude_mpm/services/agents/deployment/validation/__init__.py +3 -1
- claude_mpm/services/agents/deployment/validation/deployment_validator.py +2 -2
- claude_mpm/services/agents/deployment/validation/template_validator.py +64 -44
- claude_mpm/services/agents/deployment/validation/validation_result.py +1 -9
- claude_mpm/services/agents/git_source_manager.py +629 -0
- claude_mpm/services/agents/loading/agent_profile_loader.py +10 -9
- claude_mpm/services/agents/loading/base_agent_manager.py +16 -6
- claude_mpm/services/agents/loading/framework_agent_loader.py +11 -14
- claude_mpm/services/agents/local_template_manager.py +784 -0
- claude_mpm/services/agents/management/agent_capabilities_generator.py +3 -2
- claude_mpm/services/agents/management/agent_management_service.py +5 -5
- claude_mpm/services/agents/memory/agent_memory_manager.py +32 -29
- claude_mpm/services/agents/memory/content_manager.py +17 -9
- claude_mpm/services/agents/memory/memory_categorization_service.py +4 -2
- claude_mpm/services/agents/memory/memory_file_service.py +32 -6
- claude_mpm/services/agents/memory/memory_format_service.py +6 -4
- claude_mpm/services/agents/memory/memory_limits_service.py +4 -2
- claude_mpm/services/agents/memory/template_generator.py +3 -3
- claude_mpm/services/agents/observers.py +547 -0
- claude_mpm/services/agents/recommender.py +615 -0
- claude_mpm/services/agents/registry/deployed_agent_discovery.py +3 -3
- claude_mpm/services/agents/registry/modification_tracker.py +30 -19
- claude_mpm/services/agents/single_tier_deployment_service.py +696 -0
- claude_mpm/services/agents/sources/__init__.py +13 -0
- claude_mpm/services/agents/sources/agent_sync_state.py +516 -0
- claude_mpm/services/agents/sources/git_source_sync_service.py +1087 -0
- claude_mpm/services/agents/startup_sync.py +239 -0
- claude_mpm/services/agents/toolchain_detector.py +474 -0
- claude_mpm/services/analysis/__init__.py +25 -0
- claude_mpm/services/analysis/postmortem_reporter.py +474 -0
- claude_mpm/services/analysis/postmortem_service.py +765 -0
- claude_mpm/services/async_session_logger.py +141 -98
- claude_mpm/services/claude_session_logger.py +82 -74
- claude_mpm/services/cli/agent_cleanup_service.py +5 -0
- claude_mpm/services/cli/agent_listing_service.py +5 -5
- claude_mpm/services/cli/agent_validation_service.py +3 -1
- claude_mpm/services/cli/memory_crud_service.py +12 -7
- claude_mpm/services/cli/memory_output_formatter.py +2 -2
- claude_mpm/services/cli/resume_service.py +617 -0
- claude_mpm/services/cli/session_manager.py +104 -13
- claude_mpm/services/cli/session_pause_manager.py +504 -0
- claude_mpm/services/cli/session_resume_helper.py +372 -0
- claude_mpm/services/cli/startup_checker.py +13 -10
- claude_mpm/services/cli/unified_dashboard_manager.py +439 -0
- claude_mpm/services/command_deployment_service.py +209 -13
- claude_mpm/services/command_handler_service.py +11 -5
- claude_mpm/services/core/__init__.py +33 -1
- claude_mpm/services/core/base.py +31 -11
- claude_mpm/services/core/interfaces/__init__.py +88 -3
- claude_mpm/services/core/interfaces/agent.py +184 -0
- claude_mpm/services/core/interfaces/health.py +169 -0
- claude_mpm/services/core/interfaces/model.py +281 -0
- claude_mpm/services/core/interfaces/process.py +372 -0
- claude_mpm/services/core/interfaces/project.py +121 -0
- claude_mpm/services/core/interfaces/restart.py +307 -0
- claude_mpm/services/core/interfaces/stability.py +260 -0
- claude_mpm/services/core/interfaces.py +56 -1
- claude_mpm/services/core/memory_manager.py +92 -47
- claude_mpm/services/core/models/__init__.py +70 -0
- claude_mpm/services/core/models/agent_config.py +384 -0
- claude_mpm/services/core/models/health.py +162 -0
- claude_mpm/services/core/models/process.py +239 -0
- claude_mpm/services/core/models/restart.py +302 -0
- claude_mpm/services/core/models/stability.py +264 -0
- claude_mpm/services/core/models/toolchain.py +306 -0
- claude_mpm/services/core/path_resolver.py +36 -14
- claude_mpm/services/diagnostics/__init__.py +2 -2
- claude_mpm/services/diagnostics/checks/__init__.py +8 -2
- claude_mpm/services/diagnostics/checks/agent_check.py +30 -34
- claude_mpm/services/diagnostics/checks/agent_sources_check.py +577 -0
- claude_mpm/services/diagnostics/checks/claude_code_check.py +270 -0
- claude_mpm/services/diagnostics/checks/common_issues_check.py +28 -27
- claude_mpm/services/diagnostics/checks/configuration_check.py +26 -25
- claude_mpm/services/diagnostics/checks/filesystem_check.py +18 -17
- claude_mpm/services/diagnostics/checks/installation_check.py +165 -60
- claude_mpm/services/diagnostics/checks/instructions_check.py +21 -21
- claude_mpm/services/diagnostics/checks/mcp_check.py +57 -44
- claude_mpm/services/diagnostics/checks/mcp_services_check.py +1058 -0
- claude_mpm/services/diagnostics/checks/monitor_check.py +24 -24
- claude_mpm/services/diagnostics/checks/skill_sources_check.py +587 -0
- claude_mpm/services/diagnostics/checks/startup_log_check.py +14 -11
- claude_mpm/services/diagnostics/diagnostic_runner.py +31 -13
- claude_mpm/services/diagnostics/doctor_reporter.py +305 -47
- claude_mpm/services/diagnostics/models.py +37 -21
- claude_mpm/services/event_aggregator.py +5 -3
- claude_mpm/services/event_bus/direct_relay.py +11 -7
- claude_mpm/services/event_bus/event_bus.py +51 -9
- claude_mpm/services/event_bus/relay.py +33 -14
- claude_mpm/services/events/consumers/dead_letter.py +7 -5
- claude_mpm/services/events/consumers/logging.py +1 -2
- claude_mpm/services/events/core.py +5 -6
- claude_mpm/services/events/producers/hook.py +6 -6
- claude_mpm/services/events/producers/system.py +8 -8
- claude_mpm/services/exceptions.py +5 -5
- claude_mpm/services/framework_claude_md_generator/__init__.py +1 -1
- claude_mpm/services/framework_claude_md_generator/content_assembler.py +5 -5
- claude_mpm/services/framework_claude_md_generator/content_validator.py +2 -2
- claude_mpm/services/framework_claude_md_generator/deployment_manager.py +3 -3
- claude_mpm/services/framework_claude_md_generator/section_generators/__init__.py +2 -2
- claude_mpm/services/framework_claude_md_generator/version_manager.py +1 -1
- claude_mpm/services/git/__init__.py +21 -0
- claude_mpm/services/git/git_operations_service.py +494 -0
- claude_mpm/services/github/__init__.py +21 -0
- claude_mpm/services/github/github_cli_service.py +397 -0
- claude_mpm/services/hook_installer_service.py +506 -0
- claude_mpm/services/hook_service.py +5 -6
- claude_mpm/services/infrastructure/context_preservation.py +13 -11
- claude_mpm/services/infrastructure/daemon_manager.py +9 -9
- claude_mpm/services/infrastructure/logging.py +2 -2
- claude_mpm/services/infrastructure/monitoring/__init__.py +2 -6
- claude_mpm/services/infrastructure/monitoring/aggregator.py +13 -18
- claude_mpm/services/infrastructure/monitoring/base.py +5 -13
- claude_mpm/services/infrastructure/monitoring/network.py +7 -6
- claude_mpm/services/infrastructure/monitoring/process.py +13 -12
- claude_mpm/services/infrastructure/monitoring/resources.py +8 -7
- claude_mpm/services/infrastructure/monitoring/service.py +16 -15
- claude_mpm/services/infrastructure/resume_log_generator.py +439 -0
- claude_mpm/services/instructions/__init__.py +9 -0
- claude_mpm/services/instructions/instruction_cache_service.py +374 -0
- claude_mpm/services/local_ops/__init__.py +155 -0
- claude_mpm/services/local_ops/crash_detector.py +257 -0
- claude_mpm/services/local_ops/health_checks/__init__.py +26 -0
- claude_mpm/services/local_ops/health_checks/http_check.py +224 -0
- claude_mpm/services/local_ops/health_checks/process_check.py +236 -0
- claude_mpm/services/local_ops/health_checks/resource_check.py +255 -0
- claude_mpm/services/local_ops/health_manager.py +427 -0
- claude_mpm/services/local_ops/log_monitor.py +396 -0
- claude_mpm/services/local_ops/memory_leak_detector.py +294 -0
- claude_mpm/services/local_ops/process_manager.py +595 -0
- claude_mpm/services/local_ops/resource_monitor.py +331 -0
- claude_mpm/services/local_ops/restart_manager.py +401 -0
- claude_mpm/services/local_ops/restart_policy.py +387 -0
- claude_mpm/services/local_ops/state_manager.py +372 -0
- claude_mpm/services/local_ops/unified_manager.py +600 -0
- claude_mpm/services/mcp_config_manager.py +1542 -0
- claude_mpm/services/mcp_gateway/__init__.py +97 -93
- claude_mpm/services/mcp_gateway/auto_configure.py +43 -38
- claude_mpm/services/mcp_gateway/config/config_loader.py +3 -3
- claude_mpm/services/mcp_gateway/config/configuration.py +24 -5
- claude_mpm/services/mcp_gateway/core/__init__.py +1 -2
- claude_mpm/services/mcp_gateway/core/base.py +20 -33
- claude_mpm/services/mcp_gateway/core/process_pool.py +591 -31
- claude_mpm/services/mcp_gateway/core/singleton_manager.py +2 -2
- claude_mpm/services/mcp_gateway/core/startup_verification.py +3 -3
- claude_mpm/services/mcp_gateway/main.py +90 -15
- claude_mpm/services/mcp_gateway/registry/service_registry.py +4 -2
- claude_mpm/services/mcp_gateway/registry/tool_registry.py +12 -9
- claude_mpm/services/mcp_gateway/server/mcp_gateway.py +5 -10
- claude_mpm/services/mcp_gateway/server/stdio_server.py +9 -17
- claude_mpm/services/mcp_gateway/tools/__init__.py +14 -2
- claude_mpm/services/mcp_gateway/tools/base_adapter.py +15 -15
- claude_mpm/services/mcp_gateway/tools/document_summarizer.py +10 -9
- claude_mpm/services/mcp_gateway/tools/external_mcp_services.py +654 -0
- claude_mpm/services/mcp_gateway/tools/health_check_tool.py +36 -34
- claude_mpm/services/mcp_gateway/tools/hello_world.py +8 -8
- claude_mpm/services/mcp_gateway/tools/kuzu_memory_service.py +555 -0
- claude_mpm/services/mcp_gateway/utils/__init__.py +14 -0
- claude_mpm/services/mcp_gateway/utils/package_version_checker.py +160 -0
- claude_mpm/services/mcp_gateway/utils/update_preferences.py +170 -0
- claude_mpm/services/mcp_service_verifier.py +732 -0
- claude_mpm/services/memory/builder.py +9 -8
- claude_mpm/services/memory/cache/shared_prompt_cache.py +2 -1
- claude_mpm/services/memory/cache/simple_cache.py +2 -2
- claude_mpm/services/memory/failure_tracker.py +578 -0
- claude_mpm/services/memory/indexed_memory.py +8 -8
- claude_mpm/services/memory/optimizer.py +8 -9
- claude_mpm/services/memory/router.py +3 -3
- claude_mpm/services/memory_hook_service.py +165 -4
- claude_mpm/services/model/__init__.py +147 -0
- claude_mpm/services/model/base_provider.py +365 -0
- claude_mpm/services/model/claude_provider.py +412 -0
- claude_mpm/services/model/model_router.py +452 -0
- claude_mpm/services/model/ollama_provider.py +415 -0
- claude_mpm/services/monitor/__init__.py +20 -0
- claude_mpm/services/monitor/daemon.py +691 -0
- claude_mpm/services/monitor/daemon_manager.py +1040 -0
- claude_mpm/services/monitor/event_emitter.py +350 -0
- claude_mpm/services/monitor/handlers/__init__.py +21 -0
- claude_mpm/services/monitor/handlers/code_analysis.py +332 -0
- claude_mpm/services/monitor/handlers/dashboard.py +299 -0
- claude_mpm/services/monitor/handlers/file.py +264 -0
- claude_mpm/services/monitor/handlers/hooks.py +512 -0
- claude_mpm/services/monitor/management/__init__.py +18 -0
- claude_mpm/services/monitor/management/health.py +124 -0
- claude_mpm/services/monitor/management/lifecycle.py +724 -0
- claude_mpm/services/monitor/server.py +817 -0
- claude_mpm/services/monitor_build_service.py +2 -2
- claude_mpm/services/native_agent_converter.py +356 -0
- claude_mpm/services/orphan_detection.py +786 -0
- claude_mpm/services/port_manager.py +3 -3
- claude_mpm/services/pr/__init__.py +14 -0
- claude_mpm/services/pr/pr_template_service.py +329 -0
- claude_mpm/services/project/__init__.py +23 -0
- claude_mpm/services/project/analyzer.py +3 -3
- claude_mpm/services/project/architecture_analyzer.py +5 -5
- claude_mpm/services/project/archive_manager.py +1045 -0
- claude_mpm/services/project/dependency_analyzer.py +4 -4
- claude_mpm/services/project/detection_strategies.py +719 -0
- claude_mpm/services/project/documentation_manager.py +554 -0
- claude_mpm/services/project/enhanced_analyzer.py +572 -0
- claude_mpm/services/project/metrics_collector.py +4 -4
- claude_mpm/services/project/project_organizer.py +1005 -0
- claude_mpm/services/project/registry.py +13 -7
- claude_mpm/services/project/toolchain_analyzer.py +583 -0
- claude_mpm/services/project_port_allocator.py +596 -0
- claude_mpm/services/response_tracker.py +21 -10
- claude_mpm/services/runner_configuration_service.py +17 -3
- claude_mpm/services/self_upgrade_service.py +500 -0
- claude_mpm/services/session_management_service.py +23 -9
- claude_mpm/services/session_manager.py +380 -0
- claude_mpm/services/shared/__init__.py +2 -1
- claude_mpm/services/shared/async_service_base.py +16 -27
- claude_mpm/services/shared/config_service_base.py +17 -14
- claude_mpm/services/shared/lifecycle_service_base.py +1 -14
- claude_mpm/services/shared/service_factory.py +8 -5
- claude_mpm/services/skills/__init__.py +18 -0
- claude_mpm/services/skills/git_skill_source_manager.py +1169 -0
- claude_mpm/services/skills/skill_discovery_service.py +568 -0
- claude_mpm/services/skills_config.py +547 -0
- claude_mpm/services/skills_deployer.py +955 -0
- claude_mpm/services/socketio/client_proxy.py +60 -5
- claude_mpm/services/socketio/dashboard_server.py +361 -0
- claude_mpm/services/socketio/event_normalizer.py +10 -6
- claude_mpm/services/socketio/handlers/__init__.py +5 -2
- claude_mpm/services/socketio/handlers/base.py +2 -2
- claude_mpm/services/socketio/handlers/code_analysis.py +90 -27
- claude_mpm/services/socketio/handlers/connection.py +22 -41
- claude_mpm/services/socketio/handlers/connection_handler.py +13 -10
- claude_mpm/services/socketio/handlers/file.py +46 -10
- claude_mpm/services/socketio/handlers/git.py +9 -9
- claude_mpm/services/socketio/handlers/hook.py +29 -17
- claude_mpm/services/socketio/handlers/registry.py +4 -2
- claude_mpm/services/socketio/monitor_client.py +364 -0
- claude_mpm/services/socketio/server/broadcaster.py +9 -7
- claude_mpm/services/socketio/server/connection_manager.py +2 -2
- claude_mpm/services/socketio/server/core.py +142 -8
- claude_mpm/services/socketio/server/eventbus_integration.py +20 -14
- claude_mpm/services/socketio/server/main.py +24 -24
- claude_mpm/services/socketio_client_manager.py +4 -4
- claude_mpm/services/subprocess_launcher_service.py +19 -15
- claude_mpm/services/system_instructions_service.py +3 -5
- claude_mpm/services/ticket_services/formatter_service.py +1 -1
- claude_mpm/services/ticket_services/validation_service.py +5 -5
- claude_mpm/services/unified/__init__.py +65 -0
- claude_mpm/services/unified/analyzer_strategies/__init__.py +44 -0
- claude_mpm/services/unified/analyzer_strategies/code_analyzer.py +518 -0
- claude_mpm/services/unified/analyzer_strategies/dependency_analyzer.py +680 -0
- claude_mpm/services/unified/analyzer_strategies/performance_analyzer.py +900 -0
- claude_mpm/services/unified/analyzer_strategies/security_analyzer.py +745 -0
- claude_mpm/services/unified/analyzer_strategies/structure_analyzer.py +733 -0
- claude_mpm/services/unified/config_strategies/__init__.py +175 -0
- claude_mpm/services/unified/config_strategies/config_schema.py +731 -0
- claude_mpm/services/unified/config_strategies/context_strategy.py +747 -0
- claude_mpm/services/unified/config_strategies/error_handling_strategy.py +1005 -0
- claude_mpm/services/unified/config_strategies/file_loader_strategy.py +881 -0
- claude_mpm/services/unified/config_strategies/unified_config_service.py +823 -0
- claude_mpm/services/unified/config_strategies/validation_strategy.py +1148 -0
- claude_mpm/services/unified/deployment_strategies/__init__.py +97 -0
- claude_mpm/services/unified/deployment_strategies/base.py +553 -0
- claude_mpm/services/unified/deployment_strategies/cloud_strategies.py +573 -0
- claude_mpm/services/unified/deployment_strategies/local.py +607 -0
- claude_mpm/services/unified/deployment_strategies/utils.py +667 -0
- claude_mpm/services/unified/deployment_strategies/vercel.py +471 -0
- claude_mpm/services/unified/interfaces.py +475 -0
- claude_mpm/services/unified/migration.py +509 -0
- claude_mpm/services/unified/strategies.py +534 -0
- claude_mpm/services/unified/unified_analyzer.py +542 -0
- claude_mpm/services/unified/unified_config.py +691 -0
- claude_mpm/services/unified/unified_deployment.py +466 -0
- claude_mpm/services/utility_service.py +6 -3
- claude_mpm/services/version_control/branch_strategy.py +2 -2
- claude_mpm/services/version_control/conflict_resolution.py +14 -8
- claude_mpm/services/version_control/git_operations.py +26 -24
- claude_mpm/services/version_control/semantic_versioning.py +14 -14
- claude_mpm/services/version_control/version_parser.py +14 -11
- claude_mpm/services/version_service.py +104 -1
- claude_mpm/services/visualization/__init__.py +1 -5
- claude_mpm/services/visualization/mermaid_generator.py +2 -3
- claude_mpm/skills/__init__.py +42 -0
- claude_mpm/skills/agent_skills_injector.py +324 -0
- claude_mpm/skills/bundled/LICENSE_ATTRIBUTIONS.md +79 -0
- claude_mpm/skills/bundled/__init__.py +6 -0
- claude_mpm/skills/bundled/api-documentation.md +393 -0
- claude_mpm/skills/bundled/async-testing.md +571 -0
- claude_mpm/skills/bundled/code-review.md +143 -0
- claude_mpm/skills/bundled/database-migration.md +199 -0
- claude_mpm/skills/bundled/docker-containerization.md +194 -0
- claude_mpm/skills/bundled/express-local-dev.md +1429 -0
- claude_mpm/skills/bundled/fastapi-local-dev.md +1199 -0
- claude_mpm/skills/bundled/git-workflow.md +414 -0
- claude_mpm/skills/bundled/imagemagick.md +204 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/scripts/validate_env.py +576 -0
- claude_mpm/skills/bundled/json-data-handling.md +223 -0
- claude_mpm/skills/bundled/main/mcp-builder/scripts/connections.py +157 -0
- claude_mpm/skills/bundled/main/mcp-builder/scripts/evaluation.py +425 -0
- claude_mpm/skills/bundled/main/skill-creator/scripts/init_skill.py +303 -0
- claude_mpm/skills/bundled/main/skill-creator/scripts/package_skill.py +113 -0
- claude_mpm/skills/bundled/main/skill-creator/scripts/quick_validate.py +72 -0
- claude_mpm/skills/bundled/nextjs-local-dev.md +807 -0
- claude_mpm/skills/bundled/pdf.md +141 -0
- claude_mpm/skills/bundled/performance-profiling.md +573 -0
- claude_mpm/skills/bundled/refactoring-patterns.md +180 -0
- claude_mpm/skills/bundled/security-scanning.md +327 -0
- claude_mpm/skills/bundled/systematic-debugging.md +473 -0
- claude_mpm/skills/bundled/test-driven-development.md +378 -0
- claude_mpm/skills/bundled/testing/webapp-testing/examples/console_logging.py +35 -0
- claude_mpm/skills/bundled/testing/webapp-testing/examples/element_discovery.py +44 -0
- claude_mpm/skills/bundled/testing/webapp-testing/examples/static_html_automation.py +34 -0
- claude_mpm/skills/bundled/testing/webapp-testing/scripts/with_server.py +129 -0
- claude_mpm/skills/bundled/vite-local-dev.md +1061 -0
- claude_mpm/skills/bundled/web-performance-optimization.md +2305 -0
- claude_mpm/skills/bundled/xlsx.md +157 -0
- claude_mpm/skills/registry.py +286 -0
- claude_mpm/skills/skill_manager.py +310 -0
- claude_mpm/skills/skills_registry.py +347 -0
- claude_mpm/skills/skills_service.py +739 -0
- claude_mpm/storage/state_storage.py +31 -31
- claude_mpm/templates/questions/__init__.py +38 -0
- claude_mpm/templates/questions/base.py +193 -0
- claude_mpm/templates/questions/pr_strategy.py +311 -0
- claude_mpm/templates/questions/project_init.py +385 -0
- claude_mpm/templates/questions/ticket_mgmt.py +394 -0
- claude_mpm/tools/__main__.py +9 -9
- claude_mpm/tools/code_tree_analyzer/__init__.py +45 -0
- claude_mpm/tools/code_tree_analyzer/analysis.py +299 -0
- claude_mpm/tools/code_tree_analyzer/cache.py +131 -0
- claude_mpm/tools/code_tree_analyzer/core.py +380 -0
- claude_mpm/tools/code_tree_analyzer/discovery.py +403 -0
- claude_mpm/tools/code_tree_analyzer/events.py +168 -0
- claude_mpm/tools/code_tree_analyzer/gitignore.py +308 -0
- claude_mpm/tools/code_tree_analyzer/models.py +39 -0
- claude_mpm/tools/code_tree_analyzer/multilang_analyzer.py +224 -0
- claude_mpm/tools/code_tree_analyzer/python_analyzer.py +284 -0
- claude_mpm/tools/code_tree_builder.py +6 -6
- claude_mpm/tools/code_tree_events.py +14 -10
- claude_mpm/tools/socketio_debug.py +11 -11
- claude_mpm/utils/agent_dependency_loader.py +184 -36
- claude_mpm/utils/agent_filters.py +288 -0
- claude_mpm/utils/common.py +544 -0
- claude_mpm/utils/config_manager.py +12 -6
- claude_mpm/utils/database_connector.py +298 -0
- claude_mpm/utils/dependency_cache.py +5 -3
- claude_mpm/utils/dependency_strategies.py +15 -10
- claude_mpm/utils/display_helper.py +260 -0
- claude_mpm/utils/environment_context.py +4 -3
- claude_mpm/utils/error_handler.py +5 -3
- claude_mpm/utils/file_utils.py +13 -14
- claude_mpm/utils/git_analyzer.py +407 -0
- claude_mpm/utils/gitignore.py +241 -0
- claude_mpm/utils/log_cleanup.py +627 -0
- claude_mpm/utils/migration.py +372 -0
- claude_mpm/utils/path_operations.py +7 -4
- claude_mpm/utils/progress.py +387 -0
- claude_mpm/utils/robust_installer.py +131 -24
- claude_mpm/utils/session_logging.py +2 -2
- claude_mpm/utils/structured_questions.py +619 -0
- claude_mpm/utils/subprocess_utils.py +9 -8
- claude_mpm/validation/agent_validator.py +6 -6
- claude_mpm/validation/frontmatter_validator.py +6 -6
- claude_mpm-5.0.9.dist-info/METADATA +1028 -0
- claude_mpm-5.0.9.dist-info/RECORD +864 -0
- {claude_mpm-4.1.26.dist-info → claude_mpm-5.0.9.dist-info}/entry_points.txt +1 -0
- claude_mpm/agents/INSTRUCTIONS.md +0 -261
- claude_mpm/agents/templates/.claude-mpm/memories/README.md +0 -17
- claude_mpm/agents/templates/.claude-mpm/memories/engineer_memories.md +0 -3
- claude_mpm/agents/templates/agent-manager.json +0 -270
- claude_mpm/agents/templates/agent-manager.md +0 -619
- claude_mpm/agents/templates/agentic_coder_optimizer.json +0 -222
- claude_mpm/agents/templates/api_qa.json +0 -171
- claude_mpm/agents/templates/code_analyzer.json +0 -95
- claude_mpm/agents/templates/data_engineer.json +0 -152
- claude_mpm/agents/templates/documentation.json +0 -175
- claude_mpm/agents/templates/engineer.json +0 -176
- claude_mpm/agents/templates/imagemagick.json +0 -261
- claude_mpm/agents/templates/logs/prompts/agent_engineer_20250826_014258_728.md +0 -39
- claude_mpm/agents/templates/memory_manager.json +0 -155
- claude_mpm/agents/templates/ops.json +0 -175
- claude_mpm/agents/templates/project_organizer.json +0 -130
- claude_mpm/agents/templates/qa.json +0 -223
- claude_mpm/agents/templates/refactoring_engineer.json +0 -266
- claude_mpm/agents/templates/research.json +0 -163
- claude_mpm/agents/templates/security.json +0 -153
- claude_mpm/agents/templates/ticketing.json +0 -169
- claude_mpm/agents/templates/vercel_ops_agent.json +0 -281
- claude_mpm/agents/templates/version_control.json +0 -147
- claude_mpm/agents/templates/web_qa.json +0 -254
- claude_mpm/agents/templates/web_ui.json +0 -176
- claude_mpm/cli/commands/configure_tui.py +0 -1927
- claude_mpm/cli/commands/mpm_init.py +0 -594
- claude_mpm/cli/commands/socketio_monitor.py +0 -233
- claude_mpm/commands/mpm-agents.md +0 -12
- claude_mpm/commands/mpm-config.md +0 -18
- claude_mpm/commands/mpm-tickets.md +0 -102
- claude_mpm/dashboard/.claude-mpm/socketio-instances.json +0 -1
- claude_mpm/dashboard/static/built/components/activity-tree.js +0 -2
- claude_mpm/dashboard/static/built/components/agent-inference.js +0 -2
- claude_mpm/dashboard/static/built/components/code-tree.js +0 -2
- claude_mpm/dashboard/static/built/components/code-viewer.js +0 -2
- claude_mpm/dashboard/static/built/components/event-processor.js +0 -2
- claude_mpm/dashboard/static/built/components/event-viewer.js +0 -2
- claude_mpm/dashboard/static/built/components/export-manager.js +0 -2
- claude_mpm/dashboard/static/built/components/file-tool-tracker.js +0 -2
- claude_mpm/dashboard/static/built/components/hud-library-loader.js +0 -2
- claude_mpm/dashboard/static/built/components/hud-manager.js +0 -2
- claude_mpm/dashboard/static/built/components/hud-visualizer.js +0 -2
- claude_mpm/dashboard/static/built/components/module-viewer.js +0 -2
- claude_mpm/dashboard/static/built/components/session-manager.js +0 -2
- claude_mpm/dashboard/static/built/components/socket-manager.js +0 -2
- claude_mpm/dashboard/static/built/components/ui-state-manager.js +0 -2
- claude_mpm/dashboard/static/built/components/unified-data-viewer.js +0 -2
- claude_mpm/dashboard/static/built/components/working-directory.js +0 -2
- claude_mpm/dashboard/static/built/dashboard.js +0 -2
- claude_mpm/dashboard/static/built/socket-client.js +0 -2
- claude_mpm/dashboard/static/css/code-tree.css +0 -1408
- claude_mpm/dashboard/static/dist/components/activity-tree.js +0 -2
- claude_mpm/dashboard/static/dist/components/agent-inference.js +0 -2
- claude_mpm/dashboard/static/dist/components/code-tree.js +0 -2
- claude_mpm/dashboard/static/dist/components/code-viewer.js +0 -2
- claude_mpm/dashboard/static/dist/components/event-processor.js +0 -2
- claude_mpm/dashboard/static/dist/components/event-viewer.js +0 -2
- claude_mpm/dashboard/static/dist/components/export-manager.js +0 -2
- claude_mpm/dashboard/static/dist/components/file-tool-tracker.js +0 -2
- claude_mpm/dashboard/static/dist/components/hud-library-loader.js +0 -2
- claude_mpm/dashboard/static/dist/components/hud-manager.js +0 -2
- claude_mpm/dashboard/static/dist/components/hud-visualizer.js +0 -2
- claude_mpm/dashboard/static/dist/components/module-viewer.js +0 -2
- claude_mpm/dashboard/static/dist/components/session-manager.js +0 -2
- claude_mpm/dashboard/static/dist/components/socket-manager.js +0 -2
- claude_mpm/dashboard/static/dist/components/ui-state-manager.js +0 -2
- claude_mpm/dashboard/static/dist/components/unified-data-viewer.js +0 -2
- claude_mpm/dashboard/static/dist/components/working-directory.js +0 -2
- claude_mpm/dashboard/static/dist/dashboard.js +0 -2
- claude_mpm/dashboard/static/dist/socket-client.js +0 -2
- claude_mpm/dashboard/static/js/components/code-tree.js +0 -3220
- claude_mpm/dashboard/static/js/components/code-viewer.js +0 -480
- claude_mpm/hooks/claude_hooks/hook_handler_eventbus.py +0 -425
- claude_mpm/hooks/claude_hooks/hook_handler_original.py +0 -1040
- claude_mpm/hooks/claude_hooks/hook_handler_refactored.py +0 -347
- claude_mpm/scripts/socketio_daemon_hardened.py +0 -937
- claude_mpm/scripts/socketio_daemon_wrapper.py +0 -78
- claude_mpm/scripts/socketio_server_manager.py +0 -349
- claude_mpm/services/agents/deployment/agent_lifecycle_manager_refactored.py +0 -575
- claude_mpm/services/cli/dashboard_launcher.py +0 -423
- claude_mpm/services/cli/socketio_manager.py +0 -537
- claude_mpm/services/diagnostics/checks/claude_desktop_check.py +0 -286
- claude_mpm/services/mcp_gateway/tools/ticket_tools.py +0 -645
- claude_mpm/services/mcp_gateway/tools/unified_ticket_tool.py +0 -602
- claude_mpm/services/project/analyzer_refactored.py +0 -450
- claude_mpm/tools/code_tree_analyzer.py +0 -1693
- claude_mpm-4.1.26.dist-info/METADATA +0 -332
- claude_mpm-4.1.26.dist-info/RECORD +0 -606
- {claude_mpm-4.1.26.dist-info → claude_mpm-5.0.9.dist-info}/WHEEL +0 -0
- {claude_mpm-4.1.26.dist-info → claude_mpm-5.0.9.dist-info}/licenses/LICENSE +0 -0
- {claude_mpm-4.1.26.dist-info → claude_mpm-5.0.9.dist-info}/top_level.txt +0 -0
|
@@ -10,10 +10,14 @@ This service handles:
|
|
|
10
10
|
5. Hook service registration
|
|
11
11
|
|
|
12
12
|
Extracted from ClaudeRunner to follow Single Responsibility Principle.
|
|
13
|
+
|
|
14
|
+
DEPENDENCY INJECTION:
|
|
15
|
+
This service uses protocol-based dependency injection to avoid circular imports
|
|
16
|
+
when registering the SessionManagementService.
|
|
13
17
|
"""
|
|
14
18
|
|
|
15
19
|
import os
|
|
16
|
-
from typing import Any, Dict, List, Optional, Tuple
|
|
20
|
+
from typing import TYPE_CHECKING, Any, Dict, List, Optional, Tuple
|
|
17
21
|
|
|
18
22
|
from claude_mpm.core.base_service import BaseService
|
|
19
23
|
from claude_mpm.core.config import Config
|
|
@@ -22,6 +26,13 @@ from claude_mpm.core.logger import get_project_logger
|
|
|
22
26
|
from claude_mpm.core.shared.config_loader import ConfigLoader
|
|
23
27
|
from claude_mpm.services.core.interfaces import RunnerConfigurationInterface
|
|
24
28
|
|
|
29
|
+
# Protocol imports for type checking without circular dependencies
|
|
30
|
+
if TYPE_CHECKING:
|
|
31
|
+
from claude_mpm.core.protocols import ClaudeRunnerProtocol
|
|
32
|
+
else:
|
|
33
|
+
# At runtime, accept any object with matching interface
|
|
34
|
+
ClaudeRunnerProtocol = Any
|
|
35
|
+
|
|
25
36
|
|
|
26
37
|
class RunnerConfigurationService(BaseService, RunnerConfigurationInterface):
|
|
27
38
|
"""Service for configuring and initializing ClaudeRunner components."""
|
|
@@ -168,6 +179,7 @@ class RunnerConfigurationService(BaseService, RunnerConfigurationInterface):
|
|
|
168
179
|
"launch_method": kwargs.get("launch_method", "exec"),
|
|
169
180
|
"enable_websocket": kwargs.get("enable_websocket", False),
|
|
170
181
|
"websocket_port": kwargs.get("websocket_port", 8765),
|
|
182
|
+
"use_native_agents": kwargs.get("use_native_agents", False),
|
|
171
183
|
}
|
|
172
184
|
|
|
173
185
|
# Initialize main configuration using ConfigLoader
|
|
@@ -494,12 +506,14 @@ class RunnerConfigurationService(BaseService, RunnerConfigurationInterface):
|
|
|
494
506
|
)
|
|
495
507
|
return None
|
|
496
508
|
|
|
497
|
-
def register_session_management_service(
|
|
509
|
+
def register_session_management_service(
|
|
510
|
+
self, container, runner: "ClaudeRunnerProtocol"
|
|
511
|
+
):
|
|
498
512
|
"""Register session management service in the DI container.
|
|
499
513
|
|
|
500
514
|
Args:
|
|
501
515
|
container: DI container instance
|
|
502
|
-
runner: ClaudeRunner instance
|
|
516
|
+
runner: ClaudeRunner instance (or any object matching ClaudeRunnerProtocol)
|
|
503
517
|
|
|
504
518
|
Returns:
|
|
505
519
|
Initialized session management service or None if failed
|
|
@@ -0,0 +1,500 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Self-Upgrade Service
|
|
3
|
+
====================
|
|
4
|
+
|
|
5
|
+
Handles version checking and self-upgrade functionality for claude-mpm.
|
|
6
|
+
Supports pip, pipx, and npm installations with automatic detection.
|
|
7
|
+
Also checks Claude Code version compatibility.
|
|
8
|
+
|
|
9
|
+
WHY: Users should be notified of updates and have an easy way to upgrade
|
|
10
|
+
without manually running installation commands. Claude Code version checking
|
|
11
|
+
ensures compatibility with required features.
|
|
12
|
+
|
|
13
|
+
DESIGN DECISIONS:
|
|
14
|
+
- Detects installation method (pip/pipx/npm/editable)
|
|
15
|
+
- Non-blocking version checks with caching
|
|
16
|
+
- Interactive upgrade prompts with confirmation
|
|
17
|
+
- Automatic restart after upgrade
|
|
18
|
+
- Graceful failure handling (never breaks existing installation)
|
|
19
|
+
- Claude Code version detection and compatibility checking
|
|
20
|
+
"""
|
|
21
|
+
|
|
22
|
+
import os
|
|
23
|
+
import re
|
|
24
|
+
import subprocess
|
|
25
|
+
import sys
|
|
26
|
+
from datetime import datetime, timezone
|
|
27
|
+
from pathlib import Path
|
|
28
|
+
from typing import Dict, Optional, Tuple
|
|
29
|
+
|
|
30
|
+
from packaging import version
|
|
31
|
+
|
|
32
|
+
from ..core.logger import get_logger
|
|
33
|
+
from ..core.unified_paths import PathContext
|
|
34
|
+
from .mcp_gateway.utils.package_version_checker import PackageVersionChecker
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
class InstallationMethod:
|
|
38
|
+
"""Installation method enumeration."""
|
|
39
|
+
|
|
40
|
+
PIP = "pip"
|
|
41
|
+
PIPX = "pipx"
|
|
42
|
+
NPM = "npm"
|
|
43
|
+
EDITABLE = "editable"
|
|
44
|
+
UNKNOWN = "unknown"
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
class SelfUpgradeService:
|
|
48
|
+
"""
|
|
49
|
+
Service for checking and performing self-upgrades.
|
|
50
|
+
|
|
51
|
+
Capabilities:
|
|
52
|
+
- Detect current installation method
|
|
53
|
+
- Check PyPI/npm for latest version
|
|
54
|
+
- Check Claude Code version and compatibility
|
|
55
|
+
- Prompt user for upgrade confirmation
|
|
56
|
+
- Execute upgrade command
|
|
57
|
+
- Restart after upgrade
|
|
58
|
+
"""
|
|
59
|
+
|
|
60
|
+
# Claude Code version requirements
|
|
61
|
+
CLAUDE_CODE_MIN_VERSION = "1.0.92"
|
|
62
|
+
CLAUDE_CODE_RECOMMENDED_VERSION = "2.0.30"
|
|
63
|
+
|
|
64
|
+
def __init__(self):
|
|
65
|
+
"""Initialize the self-upgrade service."""
|
|
66
|
+
self.logger = get_logger("SelfUpgradeService")
|
|
67
|
+
self.version_checker = PackageVersionChecker()
|
|
68
|
+
self.current_version = self._get_current_version()
|
|
69
|
+
self.installation_method = self._detect_installation_method()
|
|
70
|
+
self.claude_code_version = self._get_claude_code_version()
|
|
71
|
+
|
|
72
|
+
def _get_current_version(self) -> str:
|
|
73
|
+
"""
|
|
74
|
+
Get the current installed version.
|
|
75
|
+
|
|
76
|
+
Returns:
|
|
77
|
+
Version string (e.g., "4.7.10")
|
|
78
|
+
"""
|
|
79
|
+
try:
|
|
80
|
+
from .. import __version__
|
|
81
|
+
|
|
82
|
+
return __version__
|
|
83
|
+
except ImportError:
|
|
84
|
+
# Fallback to VERSION file
|
|
85
|
+
try:
|
|
86
|
+
version_file = Path(__file__).parent.parent / "VERSION"
|
|
87
|
+
if version_file.exists():
|
|
88
|
+
return version_file.read_text().strip()
|
|
89
|
+
except Exception:
|
|
90
|
+
pass
|
|
91
|
+
|
|
92
|
+
return "unknown"
|
|
93
|
+
|
|
94
|
+
def _detect_installation_method(self) -> str:
|
|
95
|
+
"""
|
|
96
|
+
Detect how claude-mpm was installed.
|
|
97
|
+
|
|
98
|
+
Returns:
|
|
99
|
+
Installation method constant
|
|
100
|
+
"""
|
|
101
|
+
# Check for editable install
|
|
102
|
+
if PathContext.detect_deployment_context().name in [
|
|
103
|
+
"DEVELOPMENT",
|
|
104
|
+
"EDITABLE_INSTALL",
|
|
105
|
+
]:
|
|
106
|
+
return InstallationMethod.EDITABLE
|
|
107
|
+
|
|
108
|
+
# Check for pipx by looking at executable path
|
|
109
|
+
executable = sys.executable
|
|
110
|
+
if "pipx" in executable:
|
|
111
|
+
return InstallationMethod.PIPX
|
|
112
|
+
|
|
113
|
+
# Check if npm wrapper is present
|
|
114
|
+
try:
|
|
115
|
+
result = subprocess.run(
|
|
116
|
+
["npm", "list", "-g", "claude-mpm"],
|
|
117
|
+
check=False,
|
|
118
|
+
capture_output=True,
|
|
119
|
+
text=True,
|
|
120
|
+
timeout=5,
|
|
121
|
+
)
|
|
122
|
+
if result.returncode == 0 and "claude-mpm" in result.stdout:
|
|
123
|
+
return InstallationMethod.NPM
|
|
124
|
+
except Exception:
|
|
125
|
+
pass
|
|
126
|
+
|
|
127
|
+
# Default to pip
|
|
128
|
+
return InstallationMethod.PIP
|
|
129
|
+
|
|
130
|
+
def _get_claude_code_version(self) -> Optional[str]:
|
|
131
|
+
"""
|
|
132
|
+
Get the installed Claude Code version.
|
|
133
|
+
|
|
134
|
+
Returns:
|
|
135
|
+
Version string (e.g., "2.0.30") or None if not installed
|
|
136
|
+
"""
|
|
137
|
+
try:
|
|
138
|
+
# Try to get Claude Code version via CLI
|
|
139
|
+
result = subprocess.run(
|
|
140
|
+
["claude", "--version"],
|
|
141
|
+
check=False,
|
|
142
|
+
capture_output=True,
|
|
143
|
+
text=True,
|
|
144
|
+
timeout=5,
|
|
145
|
+
)
|
|
146
|
+
if result.returncode == 0:
|
|
147
|
+
# Parse version from output
|
|
148
|
+
# Expected format: "Claude Code 2.0.30" or similar
|
|
149
|
+
match = re.search(r"(\d+\.\d+\.\d+)", result.stdout)
|
|
150
|
+
if match:
|
|
151
|
+
return match.group(1)
|
|
152
|
+
except (FileNotFoundError, subprocess.TimeoutExpired):
|
|
153
|
+
# Claude Code not installed or command not found
|
|
154
|
+
pass
|
|
155
|
+
except Exception as e:
|
|
156
|
+
self.logger.debug(f"Failed to detect Claude Code version: {e}")
|
|
157
|
+
|
|
158
|
+
return None
|
|
159
|
+
|
|
160
|
+
def check_claude_code_compatibility(self) -> Dict[str, any]:
|
|
161
|
+
"""
|
|
162
|
+
Check Claude Code version compatibility.
|
|
163
|
+
|
|
164
|
+
Returns:
|
|
165
|
+
Dict with compatibility information:
|
|
166
|
+
{
|
|
167
|
+
"installed": bool,
|
|
168
|
+
"version": str or None,
|
|
169
|
+
"meets_minimum": bool,
|
|
170
|
+
"is_recommended": bool,
|
|
171
|
+
"status": str,
|
|
172
|
+
"message": str
|
|
173
|
+
}
|
|
174
|
+
"""
|
|
175
|
+
if not self.claude_code_version:
|
|
176
|
+
return {
|
|
177
|
+
"installed": False,
|
|
178
|
+
"version": None,
|
|
179
|
+
"meets_minimum": False,
|
|
180
|
+
"is_recommended": False,
|
|
181
|
+
"status": "not_installed",
|
|
182
|
+
"message": (
|
|
183
|
+
"Claude Code is not installed or not in PATH.\n"
|
|
184
|
+
" Install from: https://docs.anthropic.com/en/docs/claude-code"
|
|
185
|
+
),
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
try:
|
|
189
|
+
current = version.parse(self.claude_code_version)
|
|
190
|
+
minimum = version.parse(self.CLAUDE_CODE_MIN_VERSION)
|
|
191
|
+
recommended = version.parse(self.CLAUDE_CODE_RECOMMENDED_VERSION)
|
|
192
|
+
|
|
193
|
+
meets_minimum = current >= minimum
|
|
194
|
+
is_recommended = current >= recommended
|
|
195
|
+
|
|
196
|
+
if is_recommended:
|
|
197
|
+
status = "optimal"
|
|
198
|
+
message = f"Claude Code v{self.claude_code_version} (optimal version)"
|
|
199
|
+
elif meets_minimum:
|
|
200
|
+
status = "compatible"
|
|
201
|
+
message = (
|
|
202
|
+
f"Claude Code v{self.claude_code_version} is compatible\n"
|
|
203
|
+
f" Recommended: Upgrade to v{self.CLAUDE_CODE_RECOMMENDED_VERSION}+ for best experience"
|
|
204
|
+
)
|
|
205
|
+
else:
|
|
206
|
+
status = "outdated"
|
|
207
|
+
message = (
|
|
208
|
+
f"Claude Code v{self.claude_code_version} is outdated\n"
|
|
209
|
+
f" Minimum required: v{self.CLAUDE_CODE_MIN_VERSION}\n"
|
|
210
|
+
f" Recommended: v{self.CLAUDE_CODE_RECOMMENDED_VERSION}+"
|
|
211
|
+
)
|
|
212
|
+
|
|
213
|
+
return {
|
|
214
|
+
"installed": True,
|
|
215
|
+
"version": self.claude_code_version,
|
|
216
|
+
"meets_minimum": meets_minimum,
|
|
217
|
+
"is_recommended": is_recommended,
|
|
218
|
+
"status": status,
|
|
219
|
+
"message": message,
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
except Exception as e:
|
|
223
|
+
self.logger.debug(f"Version comparison failed: {e}")
|
|
224
|
+
return {
|
|
225
|
+
"installed": True,
|
|
226
|
+
"version": self.claude_code_version,
|
|
227
|
+
"meets_minimum": False,
|
|
228
|
+
"is_recommended": False,
|
|
229
|
+
"status": "unknown",
|
|
230
|
+
"message": f"Unable to verify Claude Code version: {e}",
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
async def check_for_update(
|
|
234
|
+
self, cache_ttl: Optional[int] = None
|
|
235
|
+
) -> Optional[Dict[str, any]]:
|
|
236
|
+
"""
|
|
237
|
+
Check if an update is available.
|
|
238
|
+
|
|
239
|
+
Args:
|
|
240
|
+
cache_ttl: Cache time-to-live in seconds (default: 24 hours)
|
|
241
|
+
|
|
242
|
+
Returns:
|
|
243
|
+
Dict with update info or None:
|
|
244
|
+
{
|
|
245
|
+
"current": "4.7.10",
|
|
246
|
+
"latest": "4.7.11",
|
|
247
|
+
"update_available": True,
|
|
248
|
+
"installation_method": "pipx",
|
|
249
|
+
"upgrade_command": "pipx upgrade claude-mpm"
|
|
250
|
+
}
|
|
251
|
+
"""
|
|
252
|
+
if self.current_version == "unknown":
|
|
253
|
+
self.logger.warning("Cannot check for updates: version unknown")
|
|
254
|
+
return None
|
|
255
|
+
|
|
256
|
+
# Check PyPI for Python installations
|
|
257
|
+
if self.installation_method in [
|
|
258
|
+
InstallationMethod.PIP,
|
|
259
|
+
InstallationMethod.PIPX,
|
|
260
|
+
]:
|
|
261
|
+
result = await self.version_checker.check_for_update(
|
|
262
|
+
"claude-mpm", self.current_version, cache_ttl
|
|
263
|
+
)
|
|
264
|
+
if result and result.get("update_available"):
|
|
265
|
+
result["installation_method"] = self.installation_method
|
|
266
|
+
result["upgrade_command"] = self._get_upgrade_command()
|
|
267
|
+
return result
|
|
268
|
+
|
|
269
|
+
# Check npm for npm installations
|
|
270
|
+
elif self.installation_method == InstallationMethod.NPM:
|
|
271
|
+
npm_version = await self._check_npm_version()
|
|
272
|
+
if npm_version:
|
|
273
|
+
current_ver = version.parse(self.current_version)
|
|
274
|
+
latest_ver = version.parse(npm_version)
|
|
275
|
+
if latest_ver > current_ver:
|
|
276
|
+
return {
|
|
277
|
+
"current": self.current_version,
|
|
278
|
+
"latest": npm_version,
|
|
279
|
+
"update_available": True,
|
|
280
|
+
"installation_method": InstallationMethod.NPM,
|
|
281
|
+
"upgrade_command": self._get_upgrade_command(),
|
|
282
|
+
"checked_at": datetime.now(timezone.utc).isoformat(),
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
return None
|
|
286
|
+
|
|
287
|
+
async def _check_npm_version(self) -> Optional[str]:
|
|
288
|
+
"""
|
|
289
|
+
Check npm registry for latest version.
|
|
290
|
+
|
|
291
|
+
Returns:
|
|
292
|
+
Latest version string or None
|
|
293
|
+
"""
|
|
294
|
+
try:
|
|
295
|
+
result = subprocess.run(
|
|
296
|
+
["npm", "view", "claude-mpm", "version"],
|
|
297
|
+
check=False,
|
|
298
|
+
capture_output=True,
|
|
299
|
+
text=True,
|
|
300
|
+
timeout=10,
|
|
301
|
+
)
|
|
302
|
+
if result.returncode == 0:
|
|
303
|
+
return result.stdout.strip()
|
|
304
|
+
except Exception as e:
|
|
305
|
+
self.logger.debug(f"npm version check failed: {e}")
|
|
306
|
+
|
|
307
|
+
return None
|
|
308
|
+
|
|
309
|
+
def _get_upgrade_command(self) -> str:
|
|
310
|
+
"""
|
|
311
|
+
Get the appropriate upgrade command for current installation method.
|
|
312
|
+
|
|
313
|
+
Returns:
|
|
314
|
+
Shell command string to upgrade claude-mpm
|
|
315
|
+
"""
|
|
316
|
+
if self.installation_method == InstallationMethod.PIPX:
|
|
317
|
+
return "pipx upgrade claude-mpm"
|
|
318
|
+
if self.installation_method == InstallationMethod.NPM:
|
|
319
|
+
return "npm update -g claude-mpm"
|
|
320
|
+
if self.installation_method == InstallationMethod.PIP:
|
|
321
|
+
return f"{sys.executable} -m pip install --upgrade claude-mpm"
|
|
322
|
+
if self.installation_method == InstallationMethod.EDITABLE:
|
|
323
|
+
return "git pull && pip install -e ."
|
|
324
|
+
return "pip install --upgrade claude-mpm"
|
|
325
|
+
|
|
326
|
+
def prompt_for_upgrade(self, update_info: Dict[str, any]) -> bool:
|
|
327
|
+
"""
|
|
328
|
+
Prompt user to upgrade with enhanced formatting.
|
|
329
|
+
|
|
330
|
+
Args:
|
|
331
|
+
update_info: Update information dict
|
|
332
|
+
|
|
333
|
+
Returns:
|
|
334
|
+
True if user confirms upgrade, False otherwise
|
|
335
|
+
"""
|
|
336
|
+
current = update_info["current"]
|
|
337
|
+
latest = update_info["latest"]
|
|
338
|
+
method = update_info.get("installation_method", "unknown")
|
|
339
|
+
|
|
340
|
+
# Enhanced notification with release notes link
|
|
341
|
+
print("\n" + "=" * 70)
|
|
342
|
+
print("📢 Update Available for claude-mpm")
|
|
343
|
+
print("=" * 70)
|
|
344
|
+
print(f" Current: v{current}")
|
|
345
|
+
print(f" Latest: v{latest}")
|
|
346
|
+
print(f" Method: {method}")
|
|
347
|
+
print()
|
|
348
|
+
print(f" Upgrade: {update_info['upgrade_command']}")
|
|
349
|
+
print(
|
|
350
|
+
f" Release: https://github.com/bobmatnyc/claude-mpm/releases/tag/v{latest}"
|
|
351
|
+
)
|
|
352
|
+
print("=" * 70)
|
|
353
|
+
|
|
354
|
+
try:
|
|
355
|
+
response = input("\nWould you like to upgrade now? [y/N]: ").strip().lower()
|
|
356
|
+
return response in ["y", "yes"]
|
|
357
|
+
except (KeyboardInterrupt, EOFError):
|
|
358
|
+
print("\n")
|
|
359
|
+
return False
|
|
360
|
+
|
|
361
|
+
def display_update_notification(self, update_info: Dict[str, any]) -> None:
|
|
362
|
+
"""
|
|
363
|
+
Display a non-interactive update notification.
|
|
364
|
+
|
|
365
|
+
Args:
|
|
366
|
+
update_info: Update information dict
|
|
367
|
+
"""
|
|
368
|
+
current = update_info["current"]
|
|
369
|
+
latest = update_info["latest"]
|
|
370
|
+
command = update_info.get("upgrade_command", "pip install --upgrade claude-mpm")
|
|
371
|
+
|
|
372
|
+
print(f"\nℹ️ Update available: v{current} → v{latest}")
|
|
373
|
+
print(f" Run: {command}")
|
|
374
|
+
print(
|
|
375
|
+
f" Release notes: https://github.com/bobmatnyc/claude-mpm/releases/tag/v{latest}"
|
|
376
|
+
)
|
|
377
|
+
print()
|
|
378
|
+
|
|
379
|
+
def perform_upgrade(self, update_info: Dict[str, any]) -> Tuple[bool, str]:
|
|
380
|
+
"""
|
|
381
|
+
Perform the upgrade.
|
|
382
|
+
|
|
383
|
+
Args:
|
|
384
|
+
update_info: Update information dict
|
|
385
|
+
|
|
386
|
+
Returns:
|
|
387
|
+
Tuple of (success: bool, message: str)
|
|
388
|
+
"""
|
|
389
|
+
command = update_info["upgrade_command"]
|
|
390
|
+
|
|
391
|
+
# Don't upgrade editable installs automatically
|
|
392
|
+
if self.installation_method == InstallationMethod.EDITABLE:
|
|
393
|
+
return (
|
|
394
|
+
False,
|
|
395
|
+
"Editable installation detected. Please update manually with: git pull && pip install -e .",
|
|
396
|
+
)
|
|
397
|
+
|
|
398
|
+
print("\n⏳ Upgrading claude-mpm...")
|
|
399
|
+
print(f" Running: {command}")
|
|
400
|
+
|
|
401
|
+
try:
|
|
402
|
+
# Execute upgrade command
|
|
403
|
+
result = subprocess.run(
|
|
404
|
+
command,
|
|
405
|
+
check=False,
|
|
406
|
+
shell=True,
|
|
407
|
+
capture_output=True,
|
|
408
|
+
text=True,
|
|
409
|
+
timeout=300, # 5 minutes
|
|
410
|
+
)
|
|
411
|
+
|
|
412
|
+
if result.returncode == 0:
|
|
413
|
+
return (True, f"✅ Successfully upgraded to v{update_info['latest']}")
|
|
414
|
+
error_msg = result.stderr or result.stdout or "Unknown error"
|
|
415
|
+
return (False, f"❌ Upgrade failed: {error_msg}")
|
|
416
|
+
|
|
417
|
+
except subprocess.TimeoutExpired:
|
|
418
|
+
return (False, "❌ Upgrade timed out")
|
|
419
|
+
except Exception as e:
|
|
420
|
+
return (False, f"❌ Upgrade failed: {e!s}")
|
|
421
|
+
|
|
422
|
+
def restart_after_upgrade(self) -> None:
|
|
423
|
+
"""
|
|
424
|
+
Restart claude-mpm after a successful upgrade.
|
|
425
|
+
|
|
426
|
+
Preserves original command line arguments.
|
|
427
|
+
"""
|
|
428
|
+
print("\n🔄 Restarting claude-mpm...")
|
|
429
|
+
|
|
430
|
+
try:
|
|
431
|
+
# Get current command line arguments
|
|
432
|
+
args = sys.argv[:]
|
|
433
|
+
|
|
434
|
+
# Replace current process with new one
|
|
435
|
+
if self.installation_method == InstallationMethod.PIPX:
|
|
436
|
+
# Use pipx run
|
|
437
|
+
os.execvp("pipx", ["pipx", "run", "claude-mpm", *args[1:]])
|
|
438
|
+
elif self.installation_method == InstallationMethod.NPM:
|
|
439
|
+
# Use npm executable
|
|
440
|
+
os.execvp("claude-mpm", args)
|
|
441
|
+
else:
|
|
442
|
+
# Use Python executable
|
|
443
|
+
os.execvp(sys.executable, [sys.executable, *args])
|
|
444
|
+
|
|
445
|
+
except Exception as e:
|
|
446
|
+
self.logger.error(f"Failed to restart: {e}")
|
|
447
|
+
print(f"\n⚠️ Restart failed: {e}")
|
|
448
|
+
print("Please restart claude-mpm manually.")
|
|
449
|
+
|
|
450
|
+
async def check_and_prompt_on_startup(
|
|
451
|
+
self, auto_upgrade: bool = False, check_claude_code: bool = True
|
|
452
|
+
) -> Optional[Dict[str, any]]:
|
|
453
|
+
"""
|
|
454
|
+
Check for updates on startup and optionally prompt user.
|
|
455
|
+
Also checks Claude Code version compatibility.
|
|
456
|
+
|
|
457
|
+
Args:
|
|
458
|
+
auto_upgrade: If True, upgrade without prompting (use with caution)
|
|
459
|
+
check_claude_code: If True, also check Claude Code compatibility
|
|
460
|
+
|
|
461
|
+
Returns:
|
|
462
|
+
Update info if available, None otherwise
|
|
463
|
+
"""
|
|
464
|
+
# Skip for editable installs
|
|
465
|
+
if self.installation_method == InstallationMethod.EDITABLE:
|
|
466
|
+
return None
|
|
467
|
+
|
|
468
|
+
try:
|
|
469
|
+
# Check Claude Code compatibility first
|
|
470
|
+
if check_claude_code:
|
|
471
|
+
claude_compat = self.check_claude_code_compatibility()
|
|
472
|
+
if not claude_compat["installed"]:
|
|
473
|
+
print("\n⚠️ Claude Code Not Detected")
|
|
474
|
+
print(" " + claude_compat["message"])
|
|
475
|
+
elif claude_compat["status"] == "outdated":
|
|
476
|
+
print("\n⚠️ Claude Code Outdated")
|
|
477
|
+
print(" " + claude_compat["message"].replace("\n", "\n "))
|
|
478
|
+
elif claude_compat["status"] == "compatible":
|
|
479
|
+
# Only show if verbose or debug
|
|
480
|
+
self.logger.debug(claude_compat["message"])
|
|
481
|
+
|
|
482
|
+
# Check for claude-mpm updates
|
|
483
|
+
update_info = await self.check_for_update()
|
|
484
|
+
|
|
485
|
+
if update_info and update_info.get("update_available"):
|
|
486
|
+
if auto_upgrade:
|
|
487
|
+
success, message = self.perform_upgrade(update_info)
|
|
488
|
+
print(message)
|
|
489
|
+
if success:
|
|
490
|
+
self.restart_after_upgrade()
|
|
491
|
+
else:
|
|
492
|
+
# Just display notification, don't prompt during startup
|
|
493
|
+
self.display_update_notification(update_info)
|
|
494
|
+
|
|
495
|
+
return update_info
|
|
496
|
+
|
|
497
|
+
except Exception as e:
|
|
498
|
+
self.logger.debug(f"Startup version check failed: {e}")
|
|
499
|
+
|
|
500
|
+
return None
|
|
@@ -9,27 +9,41 @@ This service handles:
|
|
|
9
9
|
4. Session logging and cleanup
|
|
10
10
|
|
|
11
11
|
Extracted from ClaudeRunner to follow Single Responsibility Principle.
|
|
12
|
+
|
|
13
|
+
DEPENDENCY INJECTION:
|
|
14
|
+
This service uses protocol-based dependency injection to avoid circular imports.
|
|
15
|
+
It accepts a ClaudeRunnerProtocol instead of importing ClaudeRunner directly.
|
|
12
16
|
"""
|
|
13
17
|
|
|
14
18
|
import time
|
|
15
19
|
import uuid
|
|
16
|
-
from
|
|
20
|
+
from datetime import timezone
|
|
21
|
+
from typing import TYPE_CHECKING, Any, Dict, List, Optional
|
|
17
22
|
|
|
18
23
|
from claude_mpm.core.base_service import BaseService
|
|
24
|
+
from claude_mpm.core.enums import OperationResult, ServiceState
|
|
19
25
|
from claude_mpm.services.core.interfaces import SessionManagementInterface
|
|
20
26
|
|
|
27
|
+
# Protocol imports for type checking without circular dependencies
|
|
28
|
+
if TYPE_CHECKING:
|
|
29
|
+
from claude_mpm.core.protocols import ClaudeRunnerProtocol
|
|
30
|
+
else:
|
|
31
|
+
# At runtime, accept any object with matching interface
|
|
32
|
+
ClaudeRunnerProtocol = Any
|
|
33
|
+
|
|
21
34
|
|
|
22
35
|
class SessionManagementService(BaseService, SessionManagementInterface):
|
|
23
36
|
"""Service for managing Claude session orchestration."""
|
|
24
37
|
|
|
25
|
-
def __init__(self, runner=None):
|
|
38
|
+
def __init__(self, runner: Optional["ClaudeRunnerProtocol"] = None):
|
|
26
39
|
"""Initialize the session management service.
|
|
27
40
|
|
|
28
41
|
Args:
|
|
29
|
-
runner: ClaudeRunner instance
|
|
42
|
+
runner: ClaudeRunner instance (or any object matching ClaudeRunnerProtocol)
|
|
43
|
+
for delegation
|
|
30
44
|
"""
|
|
31
45
|
super().__init__(name="session_management_service")
|
|
32
|
-
self.runner = runner
|
|
46
|
+
self.runner: Optional[ClaudeRunnerProtocol] = runner
|
|
33
47
|
self.active_sessions = {} # Track active sessions
|
|
34
48
|
|
|
35
49
|
async def _initialize(self) -> None:
|
|
@@ -153,7 +167,7 @@ class SessionManagementService(BaseService, SessionManagementInterface):
|
|
|
153
167
|
session_logs_dir.mkdir(parents=True, exist_ok=True)
|
|
154
168
|
|
|
155
169
|
# Generate unique session log filename
|
|
156
|
-
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
|
|
170
|
+
timestamp = datetime.now(timezone.utc).strftime("%Y%m%d_%H%M%S")
|
|
157
171
|
session_id = str(uuid.uuid4())[:8]
|
|
158
172
|
log_filename = f"session_{timestamp}_{session_id}.jsonl"
|
|
159
173
|
log_file = session_logs_dir / log_filename
|
|
@@ -183,10 +197,10 @@ class SessionManagementService(BaseService, SessionManagementInterface):
|
|
|
183
197
|
from datetime import datetime
|
|
184
198
|
|
|
185
199
|
# Add timestamp to event data
|
|
186
|
-
event_data["timestamp"] = datetime.now().isoformat()
|
|
200
|
+
event_data["timestamp"] = datetime.now(timezone.utc).isoformat()
|
|
187
201
|
|
|
188
202
|
# Append to log file as JSONL
|
|
189
|
-
with open(
|
|
203
|
+
with log_file.open("a") as f:
|
|
190
204
|
f.write(json.dumps(event_data) + "\n")
|
|
191
205
|
|
|
192
206
|
except Exception as e:
|
|
@@ -222,7 +236,7 @@ class SessionManagementService(BaseService, SessionManagementInterface):
|
|
|
222
236
|
"id": session_id,
|
|
223
237
|
"config": session_config,
|
|
224
238
|
"start_time": time.time(),
|
|
225
|
-
"status":
|
|
239
|
+
"status": ServiceState.RUNNING,
|
|
226
240
|
"type": session_config.get("type", "interactive"),
|
|
227
241
|
}
|
|
228
242
|
|
|
@@ -266,7 +280,7 @@ class SessionManagementService(BaseService, SessionManagementInterface):
|
|
|
266
280
|
return self.active_sessions[session_id].copy()
|
|
267
281
|
return {
|
|
268
282
|
"id": session_id,
|
|
269
|
-
"status":
|
|
283
|
+
"status": OperationResult.ERROR,
|
|
270
284
|
"error": "Session not found",
|
|
271
285
|
}
|
|
272
286
|
|