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
|
@@ -14,8 +14,9 @@ import logging
|
|
|
14
14
|
import subprocess
|
|
15
15
|
import sys
|
|
16
16
|
import time
|
|
17
|
-
from typing import Dict, List, Optional, Set, Tuple
|
|
17
|
+
from typing import Any, Dict, List, Optional, Set, Tuple
|
|
18
18
|
|
|
19
|
+
import yaml
|
|
19
20
|
from packaging.requirements import InvalidRequirement, Requirement
|
|
20
21
|
|
|
21
22
|
from ..core.logger import get_logger
|
|
@@ -31,6 +32,22 @@ class AgentDependencyLoader:
|
|
|
31
32
|
and being used, rather than all possible agents.
|
|
32
33
|
"""
|
|
33
34
|
|
|
35
|
+
# Optional database packages - if one fails, try alternatives
|
|
36
|
+
OPTIONAL_DB_PACKAGES = {
|
|
37
|
+
"mysqlclient": ["pymysql"], # PyMySQL is a pure Python alternative
|
|
38
|
+
"psycopg2": ["psycopg2-binary"], # Binary version doesn't require compilation
|
|
39
|
+
"cx_Oracle": [], # No good alternative, mark as optional
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
# Packages that commonly fail compilation on certain platforms
|
|
43
|
+
COMPILATION_PRONE = [
|
|
44
|
+
"mysqlclient", # Requires MySQL development headers
|
|
45
|
+
"psycopg2", # Requires PostgreSQL development headers (use psycopg2-binary instead)
|
|
46
|
+
"cx_Oracle", # Requires Oracle client libraries
|
|
47
|
+
"pycairo", # Requires Cairo development headers
|
|
48
|
+
"lxml", # Can fail if libxml2 dev headers missing
|
|
49
|
+
]
|
|
50
|
+
|
|
34
51
|
def __init__(self, auto_install: bool = False):
|
|
35
52
|
"""
|
|
36
53
|
Initialize the agent dependency loader.
|
|
@@ -44,6 +61,7 @@ class AgentDependencyLoader:
|
|
|
44
61
|
self.agent_dependencies: Dict[str, Dict] = {}
|
|
45
62
|
self.missing_dependencies: Dict[str, List[str]] = {}
|
|
46
63
|
self.checked_packages: Set[str] = set()
|
|
64
|
+
self.optional_failed: Dict[str, str] = {} # Track optional packages that failed
|
|
47
65
|
self.deployment_state_file = (
|
|
48
66
|
Path.cwd() / ".claude" / "agents" / ".mpm_deployment_state"
|
|
49
67
|
)
|
|
@@ -55,7 +73,7 @@ class AgentDependencyLoader:
|
|
|
55
73
|
Returns:
|
|
56
74
|
Dictionary mapping agent IDs to their file paths
|
|
57
75
|
"""
|
|
58
|
-
deployed_agents = {}
|
|
76
|
+
deployed_agents: Dict[str, Path] = {}
|
|
59
77
|
claude_agents_dir = Path.cwd() / ".claude" / "agents"
|
|
60
78
|
|
|
61
79
|
if not claude_agents_dir.exists():
|
|
@@ -68,14 +86,52 @@ class AgentDependencyLoader:
|
|
|
68
86
|
deployed_agents[agent_id] = agent_file
|
|
69
87
|
logger.debug(f"Found deployed agent: {agent_id}")
|
|
70
88
|
|
|
71
|
-
logger.
|
|
89
|
+
logger.debug(f"Discovered {len(deployed_agents)} deployed agents")
|
|
72
90
|
self.deployed_agents = deployed_agents
|
|
73
91
|
return deployed_agents
|
|
74
92
|
|
|
93
|
+
def _extract_yaml_frontmatter(self, content: str) -> Optional[Dict[str, Any]]:
|
|
94
|
+
"""
|
|
95
|
+
Extract and parse YAML frontmatter from markdown.
|
|
96
|
+
|
|
97
|
+
Frontmatter must be at the start of the file, delimited by '---'.
|
|
98
|
+
Example:
|
|
99
|
+
---
|
|
100
|
+
name: agent_name
|
|
101
|
+
dependencies:
|
|
102
|
+
python:
|
|
103
|
+
- package>=1.0.0
|
|
104
|
+
---
|
|
105
|
+
# Agent content...
|
|
106
|
+
|
|
107
|
+
Args:
|
|
108
|
+
content: File content to parse
|
|
109
|
+
|
|
110
|
+
Returns:
|
|
111
|
+
Parsed YAML frontmatter as dict, or None if not found/invalid
|
|
112
|
+
"""
|
|
113
|
+
if not content.strip().startswith("---"):
|
|
114
|
+
return None
|
|
115
|
+
|
|
116
|
+
# Split on --- delimiters
|
|
117
|
+
parts = content.split("---", 2)
|
|
118
|
+
if len(parts) < 3:
|
|
119
|
+
return None
|
|
120
|
+
|
|
121
|
+
try:
|
|
122
|
+
return yaml.safe_load(parts[1])
|
|
123
|
+
except yaml.YAMLError as e:
|
|
124
|
+
logger.warning(f"Failed to parse YAML frontmatter: {e}")
|
|
125
|
+
return None
|
|
126
|
+
|
|
75
127
|
def load_agent_dependencies(self) -> Dict[str, Dict]:
|
|
76
128
|
"""
|
|
77
129
|
Load dependency information for deployed agents from their source configs.
|
|
78
130
|
|
|
131
|
+
Searches for agent configuration in both markdown (.md) and JSON (.json) formats.
|
|
132
|
+
Markdown files with YAML frontmatter are searched first for better maintainability.
|
|
133
|
+
Falls back to JSON format for backward compatibility.
|
|
134
|
+
|
|
79
135
|
Returns:
|
|
80
136
|
Dictionary mapping agent IDs to their dependency requirements
|
|
81
137
|
"""
|
|
@@ -89,22 +145,50 @@ class AgentDependencyLoader:
|
|
|
89
145
|
]
|
|
90
146
|
|
|
91
147
|
for agent_id in self.deployed_agents:
|
|
92
|
-
|
|
148
|
+
found = False
|
|
149
|
+
|
|
150
|
+
# Try to find the agent's config (markdown first, then JSON)
|
|
93
151
|
for config_dir in config_paths:
|
|
94
|
-
|
|
95
|
-
|
|
152
|
+
if found:
|
|
153
|
+
break
|
|
154
|
+
|
|
155
|
+
# Try markdown first (current format with YAML frontmatter)
|
|
156
|
+
md_file = config_dir / f"{agent_id}.md"
|
|
157
|
+
if md_file.exists():
|
|
96
158
|
try:
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
159
|
+
content = md_file.read_text(encoding="utf-8")
|
|
160
|
+
frontmatter = self._extract_yaml_frontmatter(content)
|
|
161
|
+
if frontmatter and "dependencies" in frontmatter:
|
|
162
|
+
agent_dependencies[agent_id] = frontmatter["dependencies"]
|
|
163
|
+
logger.debug(
|
|
164
|
+
f"Loaded dependencies for {agent_id} from markdown"
|
|
165
|
+
)
|
|
166
|
+
found = True
|
|
167
|
+
break
|
|
103
168
|
except Exception as e:
|
|
104
|
-
logger.warning(f"Failed to load
|
|
169
|
+
logger.warning(f"Failed to load markdown for {agent_id}: {e}")
|
|
170
|
+
|
|
171
|
+
# Fall back to JSON for backward compatibility
|
|
172
|
+
if not found:
|
|
173
|
+
json_file = config_dir / f"{agent_id}.json"
|
|
174
|
+
if json_file.exists():
|
|
175
|
+
try:
|
|
176
|
+
with json_file.open() as f:
|
|
177
|
+
config = json.load(f)
|
|
178
|
+
if "dependencies" in config:
|
|
179
|
+
agent_dependencies[agent_id] = config[
|
|
180
|
+
"dependencies"
|
|
181
|
+
]
|
|
182
|
+
logger.debug(
|
|
183
|
+
f"Loaded dependencies for {agent_id} from JSON"
|
|
184
|
+
)
|
|
185
|
+
found = True
|
|
186
|
+
break
|
|
187
|
+
except Exception as e:
|
|
188
|
+
logger.warning(f"Failed to load JSON for {agent_id}: {e}")
|
|
105
189
|
|
|
106
190
|
self.agent_dependencies = agent_dependencies
|
|
107
|
-
logger.
|
|
191
|
+
logger.debug(f"Loaded dependencies for {len(agent_dependencies)} agents")
|
|
108
192
|
return agent_dependencies
|
|
109
193
|
|
|
110
194
|
def check_python_dependency(self, package_spec: str) -> Tuple[bool, Optional[str]]:
|
|
@@ -130,6 +214,13 @@ class AgentDependencyLoader:
|
|
|
130
214
|
self.checked_packages.add(package_name)
|
|
131
215
|
return True, "built-in"
|
|
132
216
|
|
|
217
|
+
# Check if this is an optional package that already failed
|
|
218
|
+
if package_name in self.optional_failed:
|
|
219
|
+
logger.debug(
|
|
220
|
+
f"Skipping optional package {package_name} (previously failed)"
|
|
221
|
+
)
|
|
222
|
+
return True, "optional-skipped"
|
|
223
|
+
|
|
133
224
|
# Try to import and check version
|
|
134
225
|
try:
|
|
135
226
|
import importlib.metadata
|
|
@@ -147,6 +238,24 @@ class AgentDependencyLoader:
|
|
|
147
238
|
return False, version
|
|
148
239
|
|
|
149
240
|
except importlib.metadata.PackageNotFoundError:
|
|
241
|
+
# Check if there's an alternative for this optional package
|
|
242
|
+
if package_name in self.OPTIONAL_DB_PACKAGES:
|
|
243
|
+
for alternative in self.OPTIONAL_DB_PACKAGES[package_name]:
|
|
244
|
+
try:
|
|
245
|
+
alt_version = importlib.metadata.version(alternative)
|
|
246
|
+
logger.info(
|
|
247
|
+
f"Using {alternative} as alternative to {package_name}"
|
|
248
|
+
)
|
|
249
|
+
self.checked_packages.add(package_name)
|
|
250
|
+
return True, f"{alternative}:{alt_version}"
|
|
251
|
+
except importlib.metadata.PackageNotFoundError:
|
|
252
|
+
continue
|
|
253
|
+
# If no alternatives work, mark as optional failure
|
|
254
|
+
self.optional_failed[package_name] = "No alternatives available"
|
|
255
|
+
logger.warning(
|
|
256
|
+
f"Optional package {package_name} not found, marking as optional"
|
|
257
|
+
)
|
|
258
|
+
return True, "optional-not-found"
|
|
150
259
|
return False, None
|
|
151
260
|
|
|
152
261
|
except ImportError:
|
|
@@ -162,6 +271,25 @@ class AgentDependencyLoader:
|
|
|
162
271
|
return False, version
|
|
163
272
|
|
|
164
273
|
except pkg_resources.DistributionNotFound:
|
|
274
|
+
# Check alternatives for optional packages
|
|
275
|
+
if package_name in self.OPTIONAL_DB_PACKAGES:
|
|
276
|
+
for alternative in self.OPTIONAL_DB_PACKAGES[package_name]:
|
|
277
|
+
try:
|
|
278
|
+
alt_version = pkg_resources.get_distribution(
|
|
279
|
+
alternative
|
|
280
|
+
).version
|
|
281
|
+
logger.info(
|
|
282
|
+
f"Using {alternative} as alternative to {package_name}"
|
|
283
|
+
)
|
|
284
|
+
self.checked_packages.add(package_name)
|
|
285
|
+
return True, f"{alternative}:{alt_version}"
|
|
286
|
+
except pkg_resources.DistributionNotFound:
|
|
287
|
+
continue
|
|
288
|
+
self.optional_failed[package_name] = "No alternatives available"
|
|
289
|
+
logger.warning(
|
|
290
|
+
f"Optional package {package_name} not found, marking as optional"
|
|
291
|
+
)
|
|
292
|
+
return True, "optional-not-found"
|
|
165
293
|
return False, None
|
|
166
294
|
|
|
167
295
|
except InvalidRequirement as e:
|
|
@@ -348,7 +476,7 @@ class AgentDependencyLoader:
|
|
|
348
476
|
Returns:
|
|
349
477
|
Analysis results including missing and satisfied dependencies
|
|
350
478
|
"""
|
|
351
|
-
results = {
|
|
479
|
+
results: Dict[str, Any] = {
|
|
352
480
|
"agents": {},
|
|
353
481
|
"summary": {
|
|
354
482
|
"total_agents": len(self.deployed_agents),
|
|
@@ -361,7 +489,7 @@ class AgentDependencyLoader:
|
|
|
361
489
|
}
|
|
362
490
|
|
|
363
491
|
for agent_id, deps in self.agent_dependencies.items():
|
|
364
|
-
agent_result = {
|
|
492
|
+
agent_result: Dict[str, Dict[str, List[str]]] = {
|
|
365
493
|
"python": {"satisfied": [], "missing": [], "outdated": []},
|
|
366
494
|
"system": {"satisfied": [], "missing": []},
|
|
367
495
|
}
|
|
@@ -415,8 +543,8 @@ class AgentDependencyLoader:
|
|
|
415
543
|
"""
|
|
416
544
|
import sys
|
|
417
545
|
|
|
418
|
-
compatible = []
|
|
419
|
-
incompatible = []
|
|
546
|
+
compatible: List[str] = []
|
|
547
|
+
incompatible: List[str] = []
|
|
420
548
|
|
|
421
549
|
for dep in dependencies:
|
|
422
550
|
try:
|
|
@@ -532,20 +660,37 @@ class AgentDependencyLoader:
|
|
|
532
660
|
try:
|
|
533
661
|
cmd = [sys.executable, "-m", "pip", "install"]
|
|
534
662
|
|
|
535
|
-
# Check
|
|
663
|
+
# Check environment and add appropriate flags
|
|
664
|
+
import os
|
|
536
665
|
import sysconfig
|
|
537
666
|
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
667
|
+
# Check if in virtualenv
|
|
668
|
+
in_virtualenv = (
|
|
669
|
+
(hasattr(sys, "base_prefix") and sys.base_prefix != sys.prefix)
|
|
670
|
+
or (hasattr(sys, "real_prefix"))
|
|
671
|
+
or (os.environ.get("VIRTUAL_ENV") is not None)
|
|
672
|
+
)
|
|
541
673
|
|
|
542
|
-
if
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
)
|
|
548
|
-
|
|
674
|
+
if in_virtualenv:
|
|
675
|
+
# In virtualenv - no special flags needed
|
|
676
|
+
logger.debug("Installing in virtualenv (no special flags)")
|
|
677
|
+
else:
|
|
678
|
+
# Check for PEP 668 managed environment
|
|
679
|
+
stdlib_path = sysconfig.get_path("stdlib")
|
|
680
|
+
marker_file = Path(stdlib_path) / "EXTERNALLY-MANAGED"
|
|
681
|
+
parent_marker = marker_file.parent.parent / "EXTERNALLY-MANAGED"
|
|
682
|
+
|
|
683
|
+
if marker_file.exists() or parent_marker.exists():
|
|
684
|
+
logger.warning(
|
|
685
|
+
"PEP 668 managed environment detected. "
|
|
686
|
+
"Installing with --break-system-packages flag. "
|
|
687
|
+
"Consider using a virtual environment instead."
|
|
688
|
+
)
|
|
689
|
+
cmd.append("--break-system-packages")
|
|
690
|
+
else:
|
|
691
|
+
# Normal system Python - use --user
|
|
692
|
+
cmd.append("--user")
|
|
693
|
+
logger.debug("Installing with --user flag")
|
|
549
694
|
|
|
550
695
|
cmd.extend(compatible)
|
|
551
696
|
|
|
@@ -600,7 +745,7 @@ class AgentDependencyLoader:
|
|
|
600
745
|
logger.info(
|
|
601
746
|
f"Auto-installing {len(results['summary']['missing_python'])} missing dependencies..."
|
|
602
747
|
)
|
|
603
|
-
success,
|
|
748
|
+
success, _error = self.install_missing_dependencies(
|
|
604
749
|
results["summary"]["missing_python"]
|
|
605
750
|
)
|
|
606
751
|
if success:
|
|
@@ -699,7 +844,7 @@ class AgentDependencyLoader:
|
|
|
699
844
|
import sys
|
|
700
845
|
|
|
701
846
|
if sys.version_info >= (3, 13):
|
|
702
|
-
|
|
847
|
+
_compatible, incompatible = self.check_python_compatibility(
|
|
703
848
|
summary["missing_python"]
|
|
704
849
|
)
|
|
705
850
|
if incompatible:
|
|
@@ -774,7 +919,7 @@ class AgentDependencyLoader:
|
|
|
774
919
|
hash_obj.update(str(stat.st_size).encode("utf-8"))
|
|
775
920
|
|
|
776
921
|
# Include file content for comprehensive change detection
|
|
777
|
-
with open(
|
|
922
|
+
with agent_path.open("rb") as f:
|
|
778
923
|
hash_obj.update(f.read())
|
|
779
924
|
except Exception as e:
|
|
780
925
|
logger.debug(f"Could not hash agent file {agent_path}: {e}")
|
|
@@ -794,7 +939,7 @@ class AgentDependencyLoader:
|
|
|
794
939
|
return {}
|
|
795
940
|
|
|
796
941
|
try:
|
|
797
|
-
with
|
|
942
|
+
with self.deployment_state_file.open() as f:
|
|
798
943
|
return json.load(f)
|
|
799
944
|
except Exception as e:
|
|
800
945
|
logger.debug(f"Could not load deployment state: {e}")
|
|
@@ -811,7 +956,7 @@ class AgentDependencyLoader:
|
|
|
811
956
|
# Ensure directory exists
|
|
812
957
|
self.deployment_state_file.parent.mkdir(parents=True, exist_ok=True)
|
|
813
958
|
|
|
814
|
-
with
|
|
959
|
+
with self.deployment_state_file.open("w") as f:
|
|
815
960
|
json.dump(state, f, indent=2)
|
|
816
961
|
except Exception as e:
|
|
817
962
|
logger.debug(f"Could not save deployment state: {e}")
|
|
@@ -871,7 +1016,7 @@ class AgentDependencyLoader:
|
|
|
871
1016
|
Returns:
|
|
872
1017
|
Cached results or None if not available/valid.
|
|
873
1018
|
"""
|
|
874
|
-
has_changed,
|
|
1019
|
+
has_changed, _current_hash = self.has_agents_changed()
|
|
875
1020
|
|
|
876
1021
|
if not has_changed:
|
|
877
1022
|
state = self.load_deployment_state()
|
|
@@ -885,13 +1030,16 @@ class AgentDependencyLoader:
|
|
|
885
1030
|
|
|
886
1031
|
def check_deployed_agent_dependencies(
|
|
887
1032
|
auto_install: bool = False, verbose: bool = False
|
|
888
|
-
) ->
|
|
1033
|
+
) -> int:
|
|
889
1034
|
"""
|
|
890
1035
|
Check dependencies for currently deployed agents.
|
|
891
1036
|
|
|
892
1037
|
Args:
|
|
893
1038
|
auto_install: If True, automatically install missing Python dependencies
|
|
894
1039
|
verbose: If True, enable verbose logging
|
|
1040
|
+
|
|
1041
|
+
Returns:
|
|
1042
|
+
Status code: 0 if all dependencies satisfied, 1 if missing dependencies
|
|
895
1043
|
"""
|
|
896
1044
|
if verbose:
|
|
897
1045
|
logging.getLogger().setLevel(logging.DEBUG)
|
|
@@ -0,0 +1,288 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Agent filtering utilities for claude-mpm.
|
|
3
|
+
|
|
4
|
+
WHY: This module provides centralized filtering logic to remove non-deployable
|
|
5
|
+
agents (BASE_AGENT) and already-deployed agents from user-facing displays.
|
|
6
|
+
|
|
7
|
+
DESIGN DECISIONS:
|
|
8
|
+
- BASE_AGENT is a build tool, not a deployable agent - filter everywhere
|
|
9
|
+
- Deployed agent detection supports both new (.claude-mpm/agents/) and
|
|
10
|
+
legacy (.claude/agents/)
|
|
11
|
+
- Case-insensitive BASE_AGENT detection for robustness
|
|
12
|
+
- Pure functions for easy testing and reuse
|
|
13
|
+
|
|
14
|
+
IMPLEMENTATION NOTES:
|
|
15
|
+
- Related to ticket 1M-502 Phase 1: UX improvements for agent filtering
|
|
16
|
+
- Addresses user confusion from seeing BASE_AGENT and deployed agents in lists
|
|
17
|
+
"""
|
|
18
|
+
|
|
19
|
+
from pathlib import Path
|
|
20
|
+
from typing import Dict, List, Optional, Set
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def is_base_agent(agent_id: str) -> bool:
|
|
24
|
+
"""Check if agent is BASE_AGENT (build tool, not deployable).
|
|
25
|
+
|
|
26
|
+
BASE_AGENT is an internal build tool used to construct other agents.
|
|
27
|
+
It should never appear in user-facing agent lists or deployment menus.
|
|
28
|
+
|
|
29
|
+
Args:
|
|
30
|
+
agent_id: Agent identifier to check (may include path like "qa/BASE-AGENT")
|
|
31
|
+
|
|
32
|
+
Returns:
|
|
33
|
+
True if agent is BASE_AGENT (case-insensitive), False otherwise
|
|
34
|
+
|
|
35
|
+
Examples:
|
|
36
|
+
>>> is_base_agent("BASE_AGENT")
|
|
37
|
+
True
|
|
38
|
+
>>> is_base_agent("base-agent")
|
|
39
|
+
True
|
|
40
|
+
>>> is_base_agent("qa/BASE-AGENT")
|
|
41
|
+
True
|
|
42
|
+
>>> is_base_agent("ENGINEER")
|
|
43
|
+
False
|
|
44
|
+
"""
|
|
45
|
+
if not agent_id:
|
|
46
|
+
return False
|
|
47
|
+
|
|
48
|
+
# Extract filename from path (handle cases like "qa/BASE-AGENT")
|
|
49
|
+
# 1M-502: Remote agents may have path prefixes like "qa/", "pm/", etc.
|
|
50
|
+
agent_name = agent_id.split("/")[-1]
|
|
51
|
+
|
|
52
|
+
normalized_id = agent_name.lower().replace("-", "").replace("_", "")
|
|
53
|
+
return normalized_id == "baseagent"
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
def filter_base_agents(agents: List[Dict]) -> List[Dict]:
|
|
57
|
+
"""Remove BASE_AGENT from agent list.
|
|
58
|
+
|
|
59
|
+
Filters out any agent with agent_id matching BASE_AGENT (case-insensitive).
|
|
60
|
+
This prevents users from seeing or selecting the internal build tool.
|
|
61
|
+
|
|
62
|
+
Args:
|
|
63
|
+
agents: List of agent dictionaries, each containing at least 'agent_id' key
|
|
64
|
+
|
|
65
|
+
Returns:
|
|
66
|
+
Filtered list with BASE_AGENT removed
|
|
67
|
+
|
|
68
|
+
Examples:
|
|
69
|
+
>>> agents = [
|
|
70
|
+
... {"agent_id": "ENGINEER", "name": "Engineer"},
|
|
71
|
+
... {"agent_id": "BASE_AGENT", "name": "Base Agent"},
|
|
72
|
+
... {"agent_id": "PM", "name": "PM"}
|
|
73
|
+
... ]
|
|
74
|
+
>>> filtered = filter_base_agents(agents)
|
|
75
|
+
>>> len(filtered)
|
|
76
|
+
2
|
|
77
|
+
>>> "BASE_AGENT" in [a["agent_id"] for a in filtered]
|
|
78
|
+
False
|
|
79
|
+
"""
|
|
80
|
+
return [a for a in agents if not is_base_agent(a.get("agent_id", ""))]
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
def get_deployed_agent_ids(project_dir: Optional[Path] = None) -> Set[str]:
|
|
84
|
+
"""Get set of currently deployed agent IDs.
|
|
85
|
+
|
|
86
|
+
Checks virtual deployment state (.mpm_deployment_state) first, then falls back
|
|
87
|
+
to physical .md files for backward compatibility. This ensures agents are detected
|
|
88
|
+
whether deployed virtually or as physical files.
|
|
89
|
+
|
|
90
|
+
Args:
|
|
91
|
+
project_dir: Project directory to check, defaults to current working directory
|
|
92
|
+
|
|
93
|
+
Returns:
|
|
94
|
+
Set of deployed agent IDs (leaf names like "python-engineer", "qa")
|
|
95
|
+
|
|
96
|
+
Examples:
|
|
97
|
+
>>> deployed = get_deployed_agent_ids()
|
|
98
|
+
>>> "python-engineer" in deployed # If agent exists in deployment state
|
|
99
|
+
True
|
|
100
|
+
>>> "ENGINEER" in deployed # If ENGINEER.md exists
|
|
101
|
+
True
|
|
102
|
+
|
|
103
|
+
Design Rationale:
|
|
104
|
+
- Primary detection: Virtual deployment state (.mpm_deployment_state)
|
|
105
|
+
- Fallback detection: Physical .md files (.claude-mpm/agents/, .claude/agents/)
|
|
106
|
+
- Returns leaf names for consistent comparison with agent_id formats
|
|
107
|
+
- Combines both detection methods for complete coverage
|
|
108
|
+
- Graceful error handling for malformed or missing state files
|
|
109
|
+
|
|
110
|
+
Related:
|
|
111
|
+
- Fixes checkbox interface showing all agents as "○ [Available]" instead of "● [Installed]"
|
|
112
|
+
- Matches detection logic from _is_agent_deployed() in agent_state_manager.py
|
|
113
|
+
- Related to ticket 1M-502: Virtual deployment state detection
|
|
114
|
+
"""
|
|
115
|
+
deployed = set()
|
|
116
|
+
|
|
117
|
+
# Track if project_dir was explicitly provided
|
|
118
|
+
explicit_project_dir = project_dir is not None
|
|
119
|
+
|
|
120
|
+
if project_dir is None:
|
|
121
|
+
project_dir = Path.cwd()
|
|
122
|
+
|
|
123
|
+
# NEW: Check virtual deployment state (primary method)
|
|
124
|
+
# This is the current deployment model used by Claude Code
|
|
125
|
+
deployment_state_paths = [
|
|
126
|
+
project_dir / ".claude" / "agents" / ".mpm_deployment_state",
|
|
127
|
+
]
|
|
128
|
+
|
|
129
|
+
# Only check user-level state if using default project directory
|
|
130
|
+
# This prevents test isolation issues when explicit project_dir is provided
|
|
131
|
+
if not explicit_project_dir:
|
|
132
|
+
deployment_state_paths.append(
|
|
133
|
+
Path.home() / ".claude" / "agents" / ".mpm_deployment_state"
|
|
134
|
+
)
|
|
135
|
+
|
|
136
|
+
for state_path in deployment_state_paths:
|
|
137
|
+
if state_path.exists():
|
|
138
|
+
try:
|
|
139
|
+
import json
|
|
140
|
+
|
|
141
|
+
with state_path.open() as f:
|
|
142
|
+
state = json.load(f)
|
|
143
|
+
|
|
144
|
+
# Extract agent IDs from deployment state
|
|
145
|
+
# Agent IDs are leaf names (e.g., "python-engineer", "qa")
|
|
146
|
+
agents = state.get("last_check_results", {}).get("agents", {})
|
|
147
|
+
deployed.update(agents.keys())
|
|
148
|
+
|
|
149
|
+
except (json.JSONDecodeError, KeyError) as e:
|
|
150
|
+
# Log error but continue - don't break if state file is malformed
|
|
151
|
+
import logging
|
|
152
|
+
|
|
153
|
+
logger = logging.getLogger(__name__)
|
|
154
|
+
logger.debug(f"Failed to read deployment state from {state_path}: {e}")
|
|
155
|
+
continue
|
|
156
|
+
except Exception as e:
|
|
157
|
+
# Catch unexpected errors - fail gracefully
|
|
158
|
+
import logging
|
|
159
|
+
|
|
160
|
+
logger = logging.getLogger(__name__)
|
|
161
|
+
logger.debug(f"Unexpected error reading deployment state: {e}")
|
|
162
|
+
continue
|
|
163
|
+
|
|
164
|
+
# EXISTING: Check physical .md files (fallback for backward compatibility)
|
|
165
|
+
# Check new architecture
|
|
166
|
+
new_agents_dir = project_dir / ".claude-mpm" / "agents"
|
|
167
|
+
if new_agents_dir.exists():
|
|
168
|
+
for file in new_agents_dir.glob("*.md"):
|
|
169
|
+
if file.stem not in {"BASE-AGENT", ".DS_Store"}:
|
|
170
|
+
deployed.add(file.stem)
|
|
171
|
+
|
|
172
|
+
# Check legacy architecture
|
|
173
|
+
legacy_agents_dir = project_dir / ".claude" / "agents"
|
|
174
|
+
if legacy_agents_dir.exists():
|
|
175
|
+
for file in legacy_agents_dir.glob("*.md"):
|
|
176
|
+
if file.stem not in {"BASE-AGENT", ".DS_Store"}:
|
|
177
|
+
deployed.add(file.stem)
|
|
178
|
+
|
|
179
|
+
# Check .claude/templates/ directory (where agents are actually deployed)
|
|
180
|
+
templates_dir = project_dir / ".claude" / "templates"
|
|
181
|
+
if templates_dir.exists():
|
|
182
|
+
for file in templates_dir.glob("*.md"):
|
|
183
|
+
if file.stem not in {
|
|
184
|
+
"BASE-AGENT",
|
|
185
|
+
".DS_Store",
|
|
186
|
+
"README",
|
|
187
|
+
"circuit-breakers",
|
|
188
|
+
}:
|
|
189
|
+
# Skip template/example files
|
|
190
|
+
if not any(x in file.stem for x in ["example", "template", "pm-"]):
|
|
191
|
+
deployed.add(file.stem)
|
|
192
|
+
|
|
193
|
+
# Check user-level directory only if using default project directory
|
|
194
|
+
# This prevents test isolation issues when explicit project_dir is provided
|
|
195
|
+
if not explicit_project_dir:
|
|
196
|
+
user_agents_dir = Path.home() / ".claude" / "agents"
|
|
197
|
+
if user_agents_dir.exists():
|
|
198
|
+
for file in user_agents_dir.glob("*.md"):
|
|
199
|
+
if file.stem not in {"BASE-AGENT", ".DS_Store"}:
|
|
200
|
+
deployed.add(file.stem)
|
|
201
|
+
|
|
202
|
+
return deployed
|
|
203
|
+
|
|
204
|
+
|
|
205
|
+
def filter_deployed_agents(
|
|
206
|
+
agents: List[Dict], project_dir: Optional[Path] = None
|
|
207
|
+
) -> List[Dict]:
|
|
208
|
+
"""Remove already-deployed agents from list.
|
|
209
|
+
|
|
210
|
+
Filters agent list to show only agents that are not currently deployed.
|
|
211
|
+
This prevents users from attempting to re-deploy existing agents and
|
|
212
|
+
reduces confusion in deployment menus.
|
|
213
|
+
|
|
214
|
+
Args:
|
|
215
|
+
agents: List of agent dictionaries, each containing at least 'agent_id' key
|
|
216
|
+
project_dir: Project directory to check, defaults to current working directory
|
|
217
|
+
|
|
218
|
+
Returns:
|
|
219
|
+
Filtered list containing only non-deployed agents
|
|
220
|
+
|
|
221
|
+
Examples:
|
|
222
|
+
>>> agents = [
|
|
223
|
+
... {"agent_id": "ENGINEER", "name": "Engineer"},
|
|
224
|
+
... {"agent_id": "PM", "name": "PM"},
|
|
225
|
+
... {"agent_id": "QA", "name": "QA"}
|
|
226
|
+
... ]
|
|
227
|
+
>>> # Assuming ENGINEER is deployed
|
|
228
|
+
>>> filtered = filter_deployed_agents(agents)
|
|
229
|
+
>>> "ENGINEER" not in [a["agent_id"] for a in filtered]
|
|
230
|
+
True
|
|
231
|
+
|
|
232
|
+
Design Rationale:
|
|
233
|
+
- Checks filesystem for actual deployed files (source of truth)
|
|
234
|
+
- Supports both new and legacy agent directory structures
|
|
235
|
+
- Preserves agent order for consistent UX
|
|
236
|
+
"""
|
|
237
|
+
deployed_ids = get_deployed_agent_ids(project_dir)
|
|
238
|
+
return [a for a in agents if a.get("agent_id") not in deployed_ids]
|
|
239
|
+
|
|
240
|
+
|
|
241
|
+
def apply_all_filters(
|
|
242
|
+
agents: List[Dict],
|
|
243
|
+
project_dir: Optional[Path] = None,
|
|
244
|
+
filter_base: bool = True,
|
|
245
|
+
filter_deployed: bool = False,
|
|
246
|
+
) -> List[Dict]:
|
|
247
|
+
"""Apply multiple filters to agent list in correct order.
|
|
248
|
+
|
|
249
|
+
Convenience function to apply common filtering combinations. Filters are
|
|
250
|
+
applied in this order:
|
|
251
|
+
1. BASE_AGENT filtering (if enabled)
|
|
252
|
+
2. Deployed agent filtering (if enabled)
|
|
253
|
+
|
|
254
|
+
Args:
|
|
255
|
+
agents: List of agent dictionaries to filter
|
|
256
|
+
project_dir: Project directory for deployment checks
|
|
257
|
+
filter_base: Remove BASE_AGENT from list (default: True)
|
|
258
|
+
filter_deployed: Remove deployed agents from list (default: False)
|
|
259
|
+
|
|
260
|
+
Returns:
|
|
261
|
+
Filtered agent list
|
|
262
|
+
|
|
263
|
+
Examples:
|
|
264
|
+
>>> agents = get_all_agents()
|
|
265
|
+
>>> # For display/info purposes - remove only BASE_AGENT
|
|
266
|
+
>>> filtered = apply_all_filters(
|
|
267
|
+
... agents, filter_base=True, filter_deployed=False
|
|
268
|
+
... )
|
|
269
|
+
>>> # For deployment menus - remove BASE_AGENT and deployed agents
|
|
270
|
+
>>> deployable = apply_all_filters(
|
|
271
|
+
... agents, filter_base=True, filter_deployed=True
|
|
272
|
+
... )
|
|
273
|
+
|
|
274
|
+
Usage Guidelines:
|
|
275
|
+
- Use filter_base=True (default) for all user-facing displays
|
|
276
|
+
- Use filter_deployed=True when showing deployment options
|
|
277
|
+
- Use filter_deployed=False when showing all available agents
|
|
278
|
+
(info/list commands)
|
|
279
|
+
"""
|
|
280
|
+
result = agents
|
|
281
|
+
|
|
282
|
+
if filter_base:
|
|
283
|
+
result = filter_base_agents(result)
|
|
284
|
+
|
|
285
|
+
if filter_deployed:
|
|
286
|
+
result = filter_deployed_agents(result, project_dir)
|
|
287
|
+
|
|
288
|
+
return result
|