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
|
@@ -21,19 +21,29 @@ from claude_mpm.core.logging_config import get_logger
|
|
|
21
21
|
|
|
22
22
|
from .agent_discovery_service import AgentDiscoveryService
|
|
23
23
|
from .agent_version_manager import AgentVersionManager
|
|
24
|
+
from .remote_agent_discovery_service import RemoteAgentDiscoveryService
|
|
24
25
|
|
|
25
26
|
|
|
26
27
|
class MultiSourceAgentDeploymentService:
|
|
27
28
|
"""Service for deploying agents from multiple sources with version comparison.
|
|
28
29
|
|
|
29
30
|
This service ensures that the highest version of each agent is deployed,
|
|
30
|
-
regardless of whether it comes from system templates, project agents,
|
|
31
|
-
user agents.
|
|
31
|
+
regardless of whether it comes from system templates, project agents,
|
|
32
|
+
user agents, or remote agents.
|
|
33
|
+
|
|
34
|
+
4-Tier Agent Discovery:
|
|
35
|
+
1. System templates (lowest priority) - Built-in agents
|
|
36
|
+
2. User agents (DEPRECATED) - User-level customizations (~/.claude-mpm/agents/)
|
|
37
|
+
3. Remote agents - Agents cached from GitHub
|
|
38
|
+
4. Project agents (highest priority) - Project-specific customizations
|
|
32
39
|
|
|
33
40
|
WHY: The current system processes agents from a single source at a time,
|
|
34
41
|
which can result in lower version agents being deployed if they exist in
|
|
35
42
|
a higher priority source. This service fixes that by comparing versions
|
|
36
43
|
across all sources.
|
|
44
|
+
|
|
45
|
+
DEPRECATION: User-level agents (~/.claude-mpm/agents/) are deprecated and
|
|
46
|
+
will be removed in v5.0.0. Use project-level agents instead.
|
|
37
47
|
"""
|
|
38
48
|
|
|
39
49
|
def __init__(self):
|
|
@@ -46,18 +56,30 @@ class MultiSourceAgentDeploymentService:
|
|
|
46
56
|
system_templates_dir: Optional[Path] = None,
|
|
47
57
|
project_agents_dir: Optional[Path] = None,
|
|
48
58
|
user_agents_dir: Optional[Path] = None,
|
|
59
|
+
remote_agents_dir: Optional[Path] = None,
|
|
49
60
|
working_directory: Optional[Path] = None,
|
|
50
61
|
) -> Dict[str, List[Dict[str, Any]]]:
|
|
51
|
-
"""Discover agents from all
|
|
62
|
+
"""Discover agents from all 4 tiers (system, user, remote, project).
|
|
63
|
+
|
|
64
|
+
Priority hierarchy (highest to lowest):
|
|
65
|
+
4. Project agents - Highest priority, project-specific customizations
|
|
66
|
+
3. Remote agents - GitHub-synced agents from cache
|
|
67
|
+
2. User agents - DEPRECATED, user-level customizations
|
|
68
|
+
1. System templates - Lowest priority, built-in agents
|
|
52
69
|
|
|
53
70
|
Args:
|
|
54
71
|
system_templates_dir: Directory containing system agent templates
|
|
55
72
|
project_agents_dir: Directory containing project-specific agents
|
|
56
|
-
user_agents_dir: Directory containing user custom agents
|
|
73
|
+
user_agents_dir: Directory containing user custom agents (DEPRECATED)
|
|
74
|
+
remote_agents_dir: Directory containing cached remote agents
|
|
57
75
|
working_directory: Current working directory for finding project agents
|
|
58
76
|
|
|
59
77
|
Returns:
|
|
60
78
|
Dictionary mapping agent names to list of agent info from different sources
|
|
79
|
+
|
|
80
|
+
Deprecation Warning:
|
|
81
|
+
User-level agents are deprecated and will show a warning if found.
|
|
82
|
+
Use 'claude-mpm agents migrate-to-project' to migrate them.
|
|
61
83
|
"""
|
|
62
84
|
agents_by_name = {}
|
|
63
85
|
|
|
@@ -80,24 +102,53 @@ class MultiSourceAgentDeploymentService:
|
|
|
80
102
|
if not user_agents_dir.exists():
|
|
81
103
|
user_agents_dir = None
|
|
82
104
|
|
|
83
|
-
|
|
105
|
+
if not remote_agents_dir:
|
|
106
|
+
# Check for remote agents in cache directory
|
|
107
|
+
cache_dir = Path.home() / ".claude-mpm" / "cache"
|
|
108
|
+
remote_agents_dir = cache_dir / "remote-agents"
|
|
109
|
+
if not remote_agents_dir.exists():
|
|
110
|
+
remote_agents_dir = None
|
|
111
|
+
|
|
112
|
+
# Discover agents from each source in priority order
|
|
113
|
+
# Note: We process in reverse priority order (system first) and build up the dictionary
|
|
114
|
+
# The select_highest_version_agents() method will handle the actual prioritization
|
|
84
115
|
sources = [
|
|
85
116
|
("system", system_templates_dir),
|
|
86
|
-
("project", project_agents_dir),
|
|
87
117
|
("user", user_agents_dir),
|
|
118
|
+
("remote", remote_agents_dir),
|
|
119
|
+
("project", project_agents_dir),
|
|
88
120
|
]
|
|
89
121
|
|
|
122
|
+
# Track if we found user agents for deprecation warning
|
|
123
|
+
user_agents_found = False
|
|
124
|
+
|
|
90
125
|
for source_name, source_dir in sources:
|
|
91
126
|
if source_dir and source_dir.exists():
|
|
92
127
|
self.logger.debug(
|
|
93
128
|
f"Discovering agents from {source_name} source: {source_dir}"
|
|
94
129
|
)
|
|
95
|
-
|
|
96
|
-
#
|
|
97
|
-
|
|
130
|
+
|
|
131
|
+
# Use appropriate discovery service based on source type
|
|
132
|
+
if source_name == "remote":
|
|
133
|
+
# Remote agents are Markdown, use RemoteAgentDiscoveryService
|
|
134
|
+
remote_service = RemoteAgentDiscoveryService(source_dir)
|
|
135
|
+
agents = remote_service.discover_remote_agents()
|
|
136
|
+
else:
|
|
137
|
+
# Other sources are JSON, use AgentDiscoveryService
|
|
138
|
+
discovery_service = AgentDiscoveryService(source_dir)
|
|
139
|
+
# Pass log_discovery=False to avoid duplicate logging
|
|
140
|
+
agents = discovery_service.list_available_agents(
|
|
141
|
+
log_discovery=False
|
|
142
|
+
)
|
|
143
|
+
|
|
144
|
+
# Track user agents for deprecation warning
|
|
145
|
+
if source_name == "user" and agents:
|
|
146
|
+
user_agents_found = True
|
|
98
147
|
|
|
99
148
|
for agent_info in agents:
|
|
100
|
-
agent_name = agent_info.get("name")
|
|
149
|
+
agent_name = agent_info.get("name") or agent_info.get(
|
|
150
|
+
"metadata", {}
|
|
151
|
+
).get("name")
|
|
101
152
|
if not agent_name:
|
|
102
153
|
continue
|
|
103
154
|
|
|
@@ -116,6 +167,26 @@ class MultiSourceAgentDeploymentService:
|
|
|
116
167
|
f"Discovered {len(agents)} {source_name} agent templates from {source_dir.name}"
|
|
117
168
|
)
|
|
118
169
|
|
|
170
|
+
# Show deprecation warning if user agents found
|
|
171
|
+
if user_agents_found:
|
|
172
|
+
self.logger.warning(
|
|
173
|
+
"\n"
|
|
174
|
+
"⚠️ DEPRECATION WARNING: User-level agents found in ~/.claude-mpm/agents/\n"
|
|
175
|
+
" User-level agent deployment is deprecated and will be removed in v5.0.0\n"
|
|
176
|
+
"\n"
|
|
177
|
+
" Why this change?\n"
|
|
178
|
+
" - Project isolation: Agents should be project-specific\n"
|
|
179
|
+
" - Version control: Project agents can be versioned with your code\n"
|
|
180
|
+
" - Team consistency: All team members use the same agents\n"
|
|
181
|
+
"\n"
|
|
182
|
+
" Migration:\n"
|
|
183
|
+
" 1. Run: claude-mpm agents migrate-to-project\n"
|
|
184
|
+
" 2. Verify agents work in .claude-mpm/agents/\n"
|
|
185
|
+
" 3. Remove: rm -rf ~/.claude-mpm/agents/\n"
|
|
186
|
+
"\n"
|
|
187
|
+
" Learn more: https://docs.claude-mpm.dev/agents/migration\n"
|
|
188
|
+
)
|
|
189
|
+
|
|
119
190
|
return agents_by_name
|
|
120
191
|
|
|
121
192
|
def select_highest_version_agents(
|
|
@@ -176,23 +247,47 @@ class MultiSourceAgentDeploymentService:
|
|
|
176
247
|
# Log if a higher priority source was overridden by version
|
|
177
248
|
for other_agent in agent_versions:
|
|
178
249
|
if other_agent != highest_version_agent:
|
|
179
|
-
|
|
250
|
+
# Parse both versions for comparison
|
|
251
|
+
other_version = self.version_manager.parse_version(
|
|
180
252
|
other_agent.get("version", "0.0.0")
|
|
181
253
|
)
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
254
|
+
highest_version = self.version_manager.parse_version(
|
|
255
|
+
highest_version_agent.get("version", "0.0.0")
|
|
256
|
+
)
|
|
257
|
+
|
|
258
|
+
# Compare the versions
|
|
259
|
+
version_comparison = self.version_manager.compare_versions(
|
|
260
|
+
other_version, highest_version
|
|
261
|
+
)
|
|
262
|
+
|
|
263
|
+
# Only warn if the other version is actually lower
|
|
264
|
+
if version_comparison < 0:
|
|
265
|
+
if (
|
|
266
|
+
other_agent["source"] == "project"
|
|
267
|
+
and highest_version_agent["source"] == "system"
|
|
268
|
+
):
|
|
269
|
+
self.logger.warning(
|
|
270
|
+
f"Project agent '{agent_name}' v{other_agent['version']} "
|
|
271
|
+
f"overridden by higher system version v{highest_version_agent['version']}"
|
|
272
|
+
)
|
|
273
|
+
elif other_agent[
|
|
274
|
+
"source"
|
|
275
|
+
] == "user" and highest_version_agent["source"] in [
|
|
276
|
+
"system",
|
|
277
|
+
"project",
|
|
278
|
+
]:
|
|
279
|
+
self.logger.warning(
|
|
280
|
+
f"User agent '{agent_name}' v{other_agent['version']} "
|
|
281
|
+
f"overridden by higher {highest_version_agent['source']} version v{highest_version_agent['version']}"
|
|
282
|
+
)
|
|
283
|
+
elif (
|
|
284
|
+
version_comparison == 0
|
|
285
|
+
and other_agent["source"] != highest_version_agent["source"]
|
|
185
286
|
):
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
f"
|
|
189
|
-
|
|
190
|
-
elif other_agent["source"] == "user" and highest_version_agent[
|
|
191
|
-
"source"
|
|
192
|
-
] in ["system", "project"]:
|
|
193
|
-
self.logger.warning(
|
|
194
|
-
f"User agent '{agent_name}' v{other_agent['version']} "
|
|
195
|
-
f"overridden by higher {highest_version_agent['source']} version v{highest_version_agent['version']}"
|
|
287
|
+
# Log info when versions are equal but different sources
|
|
288
|
+
self.logger.info(
|
|
289
|
+
f"Using {highest_version_agent['source']} source for '{agent_name}' "
|
|
290
|
+
f"(same version v{highest_version_agent['version']} as {other_agent['source']} source)"
|
|
196
291
|
)
|
|
197
292
|
|
|
198
293
|
return selected_agents
|
|
@@ -202,17 +297,19 @@ class MultiSourceAgentDeploymentService:
|
|
|
202
297
|
system_templates_dir: Optional[Path] = None,
|
|
203
298
|
project_agents_dir: Optional[Path] = None,
|
|
204
299
|
user_agents_dir: Optional[Path] = None,
|
|
300
|
+
remote_agents_dir: Optional[Path] = None,
|
|
205
301
|
working_directory: Optional[Path] = None,
|
|
206
302
|
excluded_agents: Optional[List[str]] = None,
|
|
207
303
|
config: Optional[Config] = None,
|
|
208
304
|
cleanup_outdated: bool = True,
|
|
209
305
|
) -> Tuple[Dict[str, Path], Dict[str, str], Dict[str, Any]]:
|
|
210
|
-
"""Get the highest version agents from all
|
|
306
|
+
"""Get the highest version agents from all 4 tiers for deployment.
|
|
211
307
|
|
|
212
308
|
Args:
|
|
213
309
|
system_templates_dir: Directory containing system agent templates
|
|
214
310
|
project_agents_dir: Directory containing project-specific agents
|
|
215
|
-
user_agents_dir: Directory containing user custom agents
|
|
311
|
+
user_agents_dir: Directory containing user custom agents (DEPRECATED)
|
|
312
|
+
remote_agents_dir: Directory containing cached remote agents
|
|
216
313
|
working_directory: Current working directory for finding project agents
|
|
217
314
|
excluded_agents: List of agent names to exclude from deployment
|
|
218
315
|
config: Configuration object for additional filtering
|
|
@@ -224,11 +321,12 @@ class MultiSourceAgentDeploymentService:
|
|
|
224
321
|
- Dictionary mapping agent names to their source
|
|
225
322
|
- Dictionary with cleanup results (removed, preserved, errors)
|
|
226
323
|
"""
|
|
227
|
-
# Discover all available agents
|
|
324
|
+
# Discover all available agents from 4 tiers
|
|
228
325
|
agents_by_name = self.discover_agents_from_all_sources(
|
|
229
326
|
system_templates_dir=system_templates_dir,
|
|
230
327
|
project_agents_dir=project_agents_dir,
|
|
231
328
|
user_agents_dir=user_agents_dir,
|
|
329
|
+
remote_agents_dir=remote_agents_dir,
|
|
232
330
|
working_directory=working_directory,
|
|
233
331
|
)
|
|
234
332
|
|
|
@@ -276,7 +374,21 @@ class MultiSourceAgentDeploymentService:
|
|
|
276
374
|
agent_sources = {}
|
|
277
375
|
|
|
278
376
|
for agent_name, agent_info in selected_agents.items():
|
|
279
|
-
|
|
377
|
+
# Defensive: Try multiple path fields for backward compatibility (ticket 1M-480)
|
|
378
|
+
# Priority: 'path' -> 'file_path' -> 'source_file'
|
|
379
|
+
path_str = (
|
|
380
|
+
agent_info.get("path")
|
|
381
|
+
or agent_info.get("file_path")
|
|
382
|
+
or agent_info.get("source_file")
|
|
383
|
+
)
|
|
384
|
+
|
|
385
|
+
if not path_str:
|
|
386
|
+
self.logger.warning(
|
|
387
|
+
f"Agent '{agent_name}' missing path information (no 'path', 'file_path', or 'source_file' field)"
|
|
388
|
+
)
|
|
389
|
+
continue
|
|
390
|
+
|
|
391
|
+
template_path = Path(path_str)
|
|
280
392
|
if template_path.exists():
|
|
281
393
|
# Use the file stem as the key for consistency
|
|
282
394
|
file_stem = template_path.stem
|
|
@@ -347,8 +459,20 @@ class MultiSourceAgentDeploymentService:
|
|
|
347
459
|
if agent_info["source"] != "user":
|
|
348
460
|
continue
|
|
349
461
|
|
|
462
|
+
# Defensive: Get path from agent_info (ticket 1M-480)
|
|
463
|
+
path_str = (
|
|
464
|
+
agent_info.get("path")
|
|
465
|
+
or agent_info.get("file_path")
|
|
466
|
+
or agent_info.get("source_file")
|
|
467
|
+
)
|
|
468
|
+
if not path_str:
|
|
469
|
+
self.logger.warning(
|
|
470
|
+
f"User agent '{agent_name}' missing path information, skipping cleanup"
|
|
471
|
+
)
|
|
472
|
+
continue
|
|
473
|
+
|
|
350
474
|
# Safety check - ensure path is within user agents directory
|
|
351
|
-
user_agent_path = Path(
|
|
475
|
+
user_agent_path = Path(path_str)
|
|
352
476
|
try:
|
|
353
477
|
# Resolve paths to compare them safely
|
|
354
478
|
resolved_user_path = user_agent_path.resolve()
|
|
@@ -469,6 +593,47 @@ class MultiSourceAgentDeploymentService:
|
|
|
469
593
|
|
|
470
594
|
return cleanup_results
|
|
471
595
|
|
|
596
|
+
def _is_user_created_agent(self, agent_file: Path) -> bool:
|
|
597
|
+
"""Check if an agent is user-created based on metadata.
|
|
598
|
+
|
|
599
|
+
User agents are identified by:
|
|
600
|
+
- Lack of MPM authorship indicators
|
|
601
|
+
- Missing version or v0.0.0
|
|
602
|
+
- Certain naming patterns
|
|
603
|
+
|
|
604
|
+
Args:
|
|
605
|
+
agent_file: Path to the agent file to check
|
|
606
|
+
|
|
607
|
+
Returns:
|
|
608
|
+
True if the agent appears to be user-created, False otherwise
|
|
609
|
+
"""
|
|
610
|
+
try:
|
|
611
|
+
content = agent_file.read_text()
|
|
612
|
+
|
|
613
|
+
# Check for MPM authorship indicators
|
|
614
|
+
mpm_indicators = [
|
|
615
|
+
"author: claude-mpm",
|
|
616
|
+
"author: 'claude-mpm'",
|
|
617
|
+
'author: "claude-mpm"',
|
|
618
|
+
"author: Claude MPM",
|
|
619
|
+
"Claude MPM Team",
|
|
620
|
+
"Generated by Claude MPM",
|
|
621
|
+
"claude-mpm-project",
|
|
622
|
+
]
|
|
623
|
+
|
|
624
|
+
for indicator in mpm_indicators:
|
|
625
|
+
if indicator.lower() in content.lower():
|
|
626
|
+
return False # This is an MPM agent
|
|
627
|
+
|
|
628
|
+
# Check for version 0.0.0 (typical user agent default)
|
|
629
|
+
if "version: 0.0.0" in content or "version: '0.0.0'" in content:
|
|
630
|
+
return True
|
|
631
|
+
|
|
632
|
+
return True # Default to user-created if no MPM indicators
|
|
633
|
+
|
|
634
|
+
except Exception:
|
|
635
|
+
return True # Default to user-created if we can't read it
|
|
636
|
+
|
|
472
637
|
def _apply_config_filters(
|
|
473
638
|
self, selected_agents: Dict[str, Dict[str, Any]], config: Config
|
|
474
639
|
) -> Dict[str, Dict[str, Any]]:
|
|
@@ -534,7 +699,8 @@ class MultiSourceAgentDeploymentService:
|
|
|
534
699
|
"needs_update": [],
|
|
535
700
|
"up_to_date": [],
|
|
536
701
|
"new_agents": [],
|
|
537
|
-
"orphaned_agents": [], #
|
|
702
|
+
"orphaned_agents": [], # System agents without templates
|
|
703
|
+
"user_agents": [], # User-created agents (no templates required)
|
|
538
704
|
"version_upgrades": [],
|
|
539
705
|
"version_downgrades": [],
|
|
540
706
|
"source_changes": [],
|
|
@@ -655,10 +821,11 @@ class MultiSourceAgentDeploymentService:
|
|
|
655
821
|
)
|
|
656
822
|
|
|
657
823
|
# Check for orphaned agents (deployed but no template)
|
|
658
|
-
|
|
824
|
+
system_orphaned, user_orphaned = self._detect_orphaned_agents_simple(
|
|
659
825
|
deployed_agents_dir, agents_to_deploy
|
|
660
826
|
)
|
|
661
|
-
comparison_results["orphaned_agents"] =
|
|
827
|
+
comparison_results["orphaned_agents"] = system_orphaned
|
|
828
|
+
comparison_results["user_agents"] = user_orphaned
|
|
662
829
|
|
|
663
830
|
# Log summary
|
|
664
831
|
summary_parts = [
|
|
@@ -668,23 +835,29 @@ class MultiSourceAgentDeploymentService:
|
|
|
668
835
|
]
|
|
669
836
|
if comparison_results["orphaned_agents"]:
|
|
670
837
|
summary_parts.append(
|
|
671
|
-
f"{len(comparison_results['orphaned_agents'])} orphaned"
|
|
838
|
+
f"{len(comparison_results['orphaned_agents'])} system orphaned"
|
|
839
|
+
)
|
|
840
|
+
if comparison_results["user_agents"]:
|
|
841
|
+
summary_parts.append(
|
|
842
|
+
f"{len(comparison_results['user_agents'])} user agents"
|
|
672
843
|
)
|
|
673
844
|
|
|
674
845
|
self.logger.info(f"Version comparison complete: {', '.join(summary_parts)}")
|
|
675
846
|
|
|
847
|
+
# Don't log upgrades here - let the caller decide when to log
|
|
848
|
+
# This prevents repeated upgrade messages on every startup
|
|
676
849
|
if comparison_results["version_upgrades"]:
|
|
677
850
|
for upgrade in comparison_results["version_upgrades"]:
|
|
678
|
-
self.logger.
|
|
679
|
-
f" Upgrade: {upgrade['name']} "
|
|
851
|
+
self.logger.debug(
|
|
852
|
+
f" Upgrade available: {upgrade['name']} "
|
|
680
853
|
f"{upgrade['deployed_version']} -> {upgrade['new_version']} "
|
|
681
854
|
f"(from {upgrade['source']})"
|
|
682
855
|
)
|
|
683
856
|
|
|
684
857
|
if comparison_results["source_changes"]:
|
|
685
858
|
for change in comparison_results["source_changes"]:
|
|
686
|
-
self.logger.
|
|
687
|
-
f" Source change: {change['name']} "
|
|
859
|
+
self.logger.debug(
|
|
860
|
+
f" Source change available: {change['name']} "
|
|
688
861
|
f"from {change['from_source']} to {change['to_source']}"
|
|
689
862
|
)
|
|
690
863
|
|
|
@@ -698,10 +871,10 @@ class MultiSourceAgentDeploymentService:
|
|
|
698
871
|
f"{downgrade['template_version']} (keeping deployed version)"
|
|
699
872
|
)
|
|
700
873
|
|
|
701
|
-
# Log orphaned agents if found
|
|
874
|
+
# Log system orphaned agents if found
|
|
702
875
|
if comparison_results["orphaned_agents"]:
|
|
703
876
|
self.logger.info(
|
|
704
|
-
f"Found {len(comparison_results['orphaned_agents'])} orphaned agent(s) "
|
|
877
|
+
f"Found {len(comparison_results['orphaned_agents'])} system orphaned agent(s) "
|
|
705
878
|
f"(deployed without templates):"
|
|
706
879
|
)
|
|
707
880
|
for orphan in comparison_results["orphaned_agents"]:
|
|
@@ -710,6 +883,18 @@ class MultiSourceAgentDeploymentService:
|
|
|
710
883
|
f"(consider removing or creating a template)"
|
|
711
884
|
)
|
|
712
885
|
|
|
886
|
+
# Log user agents at debug level if found
|
|
887
|
+
if comparison_results["user_agents"]:
|
|
888
|
+
self.logger.debug(
|
|
889
|
+
f"Found {len(comparison_results['user_agents'])} user-created agent(s) "
|
|
890
|
+
f"(no templates required):"
|
|
891
|
+
)
|
|
892
|
+
for user_agent in comparison_results["user_agents"]:
|
|
893
|
+
self.logger.debug(
|
|
894
|
+
f" - {user_agent['name']} v{user_agent['version']} "
|
|
895
|
+
f"(user-created agent)"
|
|
896
|
+
)
|
|
897
|
+
|
|
713
898
|
return comparison_results
|
|
714
899
|
|
|
715
900
|
def _infer_agent_source_from_context(
|
|
@@ -767,11 +952,13 @@ class MultiSourceAgentDeploymentService:
|
|
|
767
952
|
):
|
|
768
953
|
# In development mode, unknown agents are likely system agents being tested
|
|
769
954
|
return "system"
|
|
770
|
-
if
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
|
|
774
|
-
|
|
955
|
+
if (
|
|
956
|
+
deployment_context == DeploymentContext.PIPX_INSTALL
|
|
957
|
+
and agent_name.count("-") <= 2
|
|
958
|
+
and len(agent_name) <= 20
|
|
959
|
+
):
|
|
960
|
+
# In pipx mode, check if agent follows system naming patterns
|
|
961
|
+
return "system"
|
|
775
962
|
except Exception:
|
|
776
963
|
pass
|
|
777
964
|
|
|
@@ -860,7 +1047,7 @@ class MultiSourceAgentDeploymentService:
|
|
|
860
1047
|
|
|
861
1048
|
def _detect_orphaned_agents_simple(
|
|
862
1049
|
self, deployed_agents_dir: Path, agents_to_deploy: Dict[str, Path]
|
|
863
|
-
) -> List[Dict[str, Any]]:
|
|
1050
|
+
) -> Tuple[List[Dict[str, Any]], List[Dict[str, Any]]]:
|
|
864
1051
|
"""Simple orphan detection that works with agents_to_deploy structure.
|
|
865
1052
|
|
|
866
1053
|
Args:
|
|
@@ -868,12 +1055,13 @@ class MultiSourceAgentDeploymentService:
|
|
|
868
1055
|
agents_to_deploy: Dictionary mapping file stems to template paths
|
|
869
1056
|
|
|
870
1057
|
Returns:
|
|
871
|
-
|
|
1058
|
+
Tuple of (system_orphaned_agents, user_orphaned_agents)
|
|
872
1059
|
"""
|
|
873
|
-
|
|
1060
|
+
system_orphaned = []
|
|
1061
|
+
user_orphaned = []
|
|
874
1062
|
|
|
875
1063
|
if not deployed_agents_dir.exists():
|
|
876
|
-
return
|
|
1064
|
+
return system_orphaned, user_orphaned
|
|
877
1065
|
|
|
878
1066
|
# agents_to_deploy already contains file stems as keys
|
|
879
1067
|
available_stems = set(agents_to_deploy.keys())
|
|
@@ -885,7 +1073,7 @@ class MultiSourceAgentDeploymentService:
|
|
|
885
1073
|
if agent_stem in available_stems:
|
|
886
1074
|
continue
|
|
887
1075
|
|
|
888
|
-
# This is an orphaned agent
|
|
1076
|
+
# This is an orphaned agent - determine if it's user-created or system
|
|
889
1077
|
try:
|
|
890
1078
|
deployed_content = deployed_file.read_text()
|
|
891
1079
|
deployed_version, _, _ = (
|
|
@@ -899,11 +1087,19 @@ class MultiSourceAgentDeploymentService:
|
|
|
899
1087
|
except Exception:
|
|
900
1088
|
version_str = "unknown"
|
|
901
1089
|
|
|
902
|
-
|
|
903
|
-
|
|
904
|
-
|
|
1090
|
+
orphan_info = {
|
|
1091
|
+
"name": agent_stem,
|
|
1092
|
+
"file": str(deployed_file),
|
|
1093
|
+
"version": version_str,
|
|
1094
|
+
}
|
|
905
1095
|
|
|
906
|
-
|
|
1096
|
+
# Determine if this is a user-created agent
|
|
1097
|
+
if self._is_user_created_agent(deployed_file):
|
|
1098
|
+
user_orphaned.append(orphan_info)
|
|
1099
|
+
else:
|
|
1100
|
+
system_orphaned.append(orphan_info)
|
|
1101
|
+
|
|
1102
|
+
return system_orphaned, user_orphaned
|
|
907
1103
|
|
|
908
1104
|
def cleanup_orphaned_agents(
|
|
909
1105
|
self, deployed_agents_dir: Path, dry_run: bool = True
|
|
@@ -51,11 +51,11 @@ class DeploymentPipelineExecutor:
|
|
|
51
51
|
try:
|
|
52
52
|
# Check if step should be executed
|
|
53
53
|
if not step.should_execute(context):
|
|
54
|
-
self.logger.info(f"Skipping step {i+1}/{len(steps)}: {step.name}")
|
|
54
|
+
self.logger.info(f"Skipping step {i + 1}/{len(steps)}: {step.name}")
|
|
55
55
|
skipped_steps.append(step.name)
|
|
56
56
|
continue
|
|
57
57
|
|
|
58
|
-
self.logger.info(f"Executing step {i+1}/{len(steps)}: {step.name}")
|
|
58
|
+
self.logger.info(f"Executing step {i + 1}/{len(steps)}: {step.name}")
|
|
59
59
|
|
|
60
60
|
# Execute the step
|
|
61
61
|
result = step.execute(context)
|
|
@@ -3,13 +3,14 @@
|
|
|
3
3
|
import time
|
|
4
4
|
from pathlib import Path
|
|
5
5
|
|
|
6
|
+
from claude_mpm.core.enums import OperationResult
|
|
6
7
|
from claude_mpm.services.agents.deployment.processors import (
|
|
7
8
|
AgentDeploymentContext,
|
|
8
9
|
AgentDeploymentResult,
|
|
9
10
|
AgentProcessor,
|
|
10
11
|
)
|
|
11
12
|
|
|
12
|
-
from .base_step import BaseDeploymentStep, StepResult
|
|
13
|
+
from .base_step import BaseDeploymentStep, StepResult
|
|
13
14
|
|
|
14
15
|
|
|
15
16
|
class AgentProcessingStep(BaseDeploymentStep):
|
|
@@ -37,7 +38,7 @@ class AgentProcessingStep(BaseDeploymentStep):
|
|
|
37
38
|
if not context.template_files:
|
|
38
39
|
self.logger.warning("No template files to process")
|
|
39
40
|
return StepResult(
|
|
40
|
-
status=
|
|
41
|
+
status=OperationResult.SKIPPED,
|
|
41
42
|
message="No template files found to process",
|
|
42
43
|
execution_time=time.time() - start_time,
|
|
43
44
|
)
|
|
@@ -103,13 +104,13 @@ class AgentProcessingStep(BaseDeploymentStep):
|
|
|
103
104
|
|
|
104
105
|
# Determine step status
|
|
105
106
|
if failed_count == 0:
|
|
106
|
-
status =
|
|
107
|
+
status = OperationResult.SUCCESS
|
|
107
108
|
message = f"Successfully processed {processed_count} agents in {execution_time:.3f}s"
|
|
108
109
|
elif processed_count > 0:
|
|
109
|
-
status =
|
|
110
|
+
status = OperationResult.WARNING
|
|
110
111
|
message = f"Processed {processed_count} agents with {failed_count} failures in {execution_time:.3f}s"
|
|
111
112
|
else:
|
|
112
|
-
status =
|
|
113
|
+
status = OperationResult.FAILED
|
|
113
114
|
message = f"Failed to process any agents ({failed_count} failures) in {execution_time:.3f}s"
|
|
114
115
|
|
|
115
116
|
self.logger.info(message)
|
|
@@ -127,7 +128,7 @@ class AgentProcessingStep(BaseDeploymentStep):
|
|
|
127
128
|
context.add_error(error_msg)
|
|
128
129
|
|
|
129
130
|
return StepResult(
|
|
130
|
-
status=
|
|
131
|
+
status=OperationResult.FAILED,
|
|
131
132
|
message=error_msg,
|
|
132
133
|
error=e,
|
|
133
134
|
execution_time=execution_time,
|
|
@@ -229,7 +230,7 @@ class AgentProcessingStep(BaseDeploymentStep):
|
|
|
229
230
|
cwd = Path.cwd()
|
|
230
231
|
if str(cwd) in template_str:
|
|
231
232
|
return "project"
|
|
232
|
-
except:
|
|
233
|
+
except Exception:
|
|
233
234
|
pass
|
|
234
235
|
|
|
235
236
|
# Check if it's a user agent
|
|
@@ -2,26 +2,17 @@
|
|
|
2
2
|
|
|
3
3
|
from abc import ABC, abstractmethod
|
|
4
4
|
from dataclasses import dataclass
|
|
5
|
-
from enum import Enum
|
|
6
5
|
from typing import Optional
|
|
7
6
|
|
|
7
|
+
from claude_mpm.core.enums import OperationResult
|
|
8
8
|
from claude_mpm.core.logger import get_logger
|
|
9
9
|
|
|
10
10
|
|
|
11
|
-
class StepStatus(Enum):
|
|
12
|
-
"""Status of a pipeline step execution."""
|
|
13
|
-
|
|
14
|
-
SUCCESS = "success"
|
|
15
|
-
FAILURE = "failure"
|
|
16
|
-
SKIPPED = "skipped"
|
|
17
|
-
WARNING = "warning"
|
|
18
|
-
|
|
19
|
-
|
|
20
11
|
@dataclass
|
|
21
12
|
class StepResult:
|
|
22
13
|
"""Result of executing a pipeline step."""
|
|
23
14
|
|
|
24
|
-
status:
|
|
15
|
+
status: OperationResult
|
|
25
16
|
message: Optional[str] = None
|
|
26
17
|
error: Optional[Exception] = None
|
|
27
18
|
execution_time: Optional[float] = None
|
|
@@ -29,22 +20,22 @@ class StepResult:
|
|
|
29
20
|
@property
|
|
30
21
|
def is_success(self) -> bool:
|
|
31
22
|
"""Check if the step was successful."""
|
|
32
|
-
return self.status ==
|
|
23
|
+
return self.status == OperationResult.SUCCESS
|
|
33
24
|
|
|
34
25
|
@property
|
|
35
26
|
def is_failure(self) -> bool:
|
|
36
27
|
"""Check if the step failed."""
|
|
37
|
-
return self.status ==
|
|
28
|
+
return self.status == OperationResult.FAILED
|
|
38
29
|
|
|
39
30
|
@property
|
|
40
31
|
def is_skipped(self) -> bool:
|
|
41
32
|
"""Check if the step was skipped."""
|
|
42
|
-
return self.status ==
|
|
33
|
+
return self.status == OperationResult.SKIPPED
|
|
43
34
|
|
|
44
35
|
@property
|
|
45
36
|
def is_warning(self) -> bool:
|
|
46
37
|
"""Check if the step completed with warnings."""
|
|
47
|
-
return self.status ==
|
|
38
|
+
return self.status == OperationResult.WARNING
|
|
48
39
|
|
|
49
40
|
|
|
50
41
|
class BaseDeploymentStep(ABC):
|
|
@@ -67,7 +58,7 @@ class BaseDeploymentStep(ABC):
|
|
|
67
58
|
self.logger = get_logger(f"{__name__}.{self.__class__.__name__}")
|
|
68
59
|
|
|
69
60
|
@abstractmethod
|
|
70
|
-
def execute(self, context) -> StepResult:
|
|
61
|
+
def execute(self, context) -> "StepResult":
|
|
71
62
|
"""Execute this deployment step.
|
|
72
63
|
|
|
73
64
|
Args:
|
|
@@ -3,8 +3,9 @@
|
|
|
3
3
|
import time
|
|
4
4
|
|
|
5
5
|
from claude_mpm.core.config import Config
|
|
6
|
+
from claude_mpm.core.enums import OperationResult
|
|
6
7
|
|
|
7
|
-
from .base_step import BaseDeploymentStep, StepResult
|
|
8
|
+
from .base_step import BaseDeploymentStep, StepResult
|
|
8
9
|
|
|
9
10
|
|
|
10
11
|
class ConfigurationLoadStep(BaseDeploymentStep):
|
|
@@ -54,7 +55,7 @@ class ConfigurationLoadStep(BaseDeploymentStep):
|
|
|
54
55
|
context.step_timings[self.name] = execution_time
|
|
55
56
|
|
|
56
57
|
return StepResult(
|
|
57
|
-
status=
|
|
58
|
+
status=OperationResult.SUCCESS,
|
|
58
59
|
message=f"Configuration loaded successfully in {execution_time:.3f}s",
|
|
59
60
|
execution_time=execution_time,
|
|
60
61
|
)
|
|
@@ -68,7 +69,7 @@ class ConfigurationLoadStep(BaseDeploymentStep):
|
|
|
68
69
|
context.add_error(error_msg)
|
|
69
70
|
|
|
70
71
|
return StepResult(
|
|
71
|
-
status=
|
|
72
|
+
status=OperationResult.FAILED,
|
|
72
73
|
message=error_msg,
|
|
73
74
|
error=e,
|
|
74
75
|
execution_time=execution_time,
|