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.
Potentially problematic release.
This version of claude-mpm might be problematic. Click here for more details.
- 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
|
@@ -0,0 +1,338 @@
|
|
|
1
|
+
"""Agent discovery command for browsing available agents from configured sources.
|
|
2
|
+
|
|
3
|
+
WHY: This module implements the 'agents discover' command, allowing users to
|
|
4
|
+
browse and filter agents from configured Git sources. Provides rich filtering
|
|
5
|
+
by category, language, framework, platform, and specialization.
|
|
6
|
+
|
|
7
|
+
DESIGN DECISION: Rich console output using rich library
|
|
8
|
+
|
|
9
|
+
Rationale: Users need beautiful, informative output when discovering agents.
|
|
10
|
+
The rich library (already a dependency) provides excellent table formatting,
|
|
11
|
+
color support, and tree views.
|
|
12
|
+
|
|
13
|
+
Trade-offs:
|
|
14
|
+
- User Experience: Beautiful output improves discoverability
|
|
15
|
+
- Complexity: Rich table formatting adds some code overhead
|
|
16
|
+
- Performance: Rendering is fast enough for CLI use (<50ms)
|
|
17
|
+
|
|
18
|
+
Example Usage:
|
|
19
|
+
>>> claude-mpm agents discover --category engineer/backend
|
|
20
|
+
>>> claude-mpm agents discover --language python --verbose
|
|
21
|
+
>>> claude-mpm agents discover --framework react --format json
|
|
22
|
+
"""
|
|
23
|
+
|
|
24
|
+
import json
|
|
25
|
+
import logging
|
|
26
|
+
from typing import Any, Dict, List
|
|
27
|
+
|
|
28
|
+
from rich.console import Console
|
|
29
|
+
|
|
30
|
+
from ...config.agent_sources import AgentSourceConfiguration
|
|
31
|
+
from ...services.agents.git_source_manager import GitSourceManager
|
|
32
|
+
|
|
33
|
+
logger = logging.getLogger(__name__)
|
|
34
|
+
console = Console()
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def _group_agents_by_category(
|
|
38
|
+
agents: List[Dict[str, Any]],
|
|
39
|
+
) -> Dict[str, List[Dict[str, Any]]]:
|
|
40
|
+
"""Group agents by their category for organized display.
|
|
41
|
+
|
|
42
|
+
Args:
|
|
43
|
+
agents: List of agent dictionaries
|
|
44
|
+
|
|
45
|
+
Returns:
|
|
46
|
+
Dictionary mapping category names to lists of agents
|
|
47
|
+
|
|
48
|
+
Example:
|
|
49
|
+
>>> agents = [
|
|
50
|
+
... {"agent_id": "engineer/backend/python-engineer", "category": "engineer/backend"},
|
|
51
|
+
... {"agent_id": "qa/qa", "category": "qa"}
|
|
52
|
+
... ]
|
|
53
|
+
>>> grouped = _group_agents_by_category(agents)
|
|
54
|
+
>>> grouped.keys()
|
|
55
|
+
dict_keys(['engineer/backend', 'qa'])
|
|
56
|
+
"""
|
|
57
|
+
grouped: Dict[str, List[Dict[str, Any]]] = {}
|
|
58
|
+
|
|
59
|
+
for agent in agents:
|
|
60
|
+
# Extract category from agent_id if not present
|
|
61
|
+
category = agent.get("category", "unknown")
|
|
62
|
+
|
|
63
|
+
if category == "unknown" and "agent_id" in agent:
|
|
64
|
+
agent_id = agent["agent_id"]
|
|
65
|
+
if "/" in agent_id:
|
|
66
|
+
category = agent_id.rsplit("/", 1)[0]
|
|
67
|
+
|
|
68
|
+
if category not in grouped:
|
|
69
|
+
grouped[category] = []
|
|
70
|
+
|
|
71
|
+
grouped[category].append(agent)
|
|
72
|
+
|
|
73
|
+
return grouped
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
def _format_category_name(category: str) -> str:
|
|
77
|
+
"""Format category name for display.
|
|
78
|
+
|
|
79
|
+
Args:
|
|
80
|
+
category: Raw category string (e.g., "engineer/backend")
|
|
81
|
+
|
|
82
|
+
Returns:
|
|
83
|
+
Formatted category name (e.g., "Engineering/Backend")
|
|
84
|
+
|
|
85
|
+
Example:
|
|
86
|
+
>>> _format_category_name("engineer/backend")
|
|
87
|
+
'Engineering/Backend'
|
|
88
|
+
>>> _format_category_name("qa")
|
|
89
|
+
'QA'
|
|
90
|
+
"""
|
|
91
|
+
# Special cases
|
|
92
|
+
if category == "qa":
|
|
93
|
+
return "QA"
|
|
94
|
+
if category == "ops":
|
|
95
|
+
return "Ops"
|
|
96
|
+
|
|
97
|
+
# Capitalize each part
|
|
98
|
+
parts = category.split("/")
|
|
99
|
+
formatted_parts = []
|
|
100
|
+
|
|
101
|
+
for part in parts:
|
|
102
|
+
if part == "qa":
|
|
103
|
+
formatted_parts.append("QA")
|
|
104
|
+
elif part == "ops":
|
|
105
|
+
formatted_parts.append("Ops")
|
|
106
|
+
else:
|
|
107
|
+
formatted_parts.append(part.capitalize())
|
|
108
|
+
|
|
109
|
+
return "/".join(formatted_parts)
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
def _output_table_format(agents: List[Dict[str, Any]], verbose: bool = False) -> None:
|
|
113
|
+
"""Output agents in rich table format (default).
|
|
114
|
+
|
|
115
|
+
Design Decision: Group by category for better organization
|
|
116
|
+
|
|
117
|
+
Rationale: Agents grouped by category (engineer/backend, qa, ops) are
|
|
118
|
+
easier to scan than a flat list. Categories provide context about
|
|
119
|
+
agent purpose.
|
|
120
|
+
|
|
121
|
+
Args:
|
|
122
|
+
agents: List of agent dictionaries
|
|
123
|
+
verbose: Show descriptions and metadata
|
|
124
|
+
"""
|
|
125
|
+
if not agents:
|
|
126
|
+
console.print("[yellow]No agents found matching filters.[/yellow]")
|
|
127
|
+
return
|
|
128
|
+
|
|
129
|
+
console.print(
|
|
130
|
+
f"\n[bold]š Agents from configured sources ({len(agents)} matching filters):[/bold]\n"
|
|
131
|
+
)
|
|
132
|
+
|
|
133
|
+
# Group by category
|
|
134
|
+
grouped = _group_agents_by_category(agents)
|
|
135
|
+
|
|
136
|
+
# Sort categories for consistent display
|
|
137
|
+
sorted_categories = sorted(grouped.keys())
|
|
138
|
+
|
|
139
|
+
for category in sorted_categories:
|
|
140
|
+
category_agents = grouped[category]
|
|
141
|
+
|
|
142
|
+
# Print category header
|
|
143
|
+
formatted_category = _format_category_name(category)
|
|
144
|
+
console.print(f"[bold cyan]{formatted_category}[/bold cyan]")
|
|
145
|
+
|
|
146
|
+
# Print agents in this category
|
|
147
|
+
for agent in sorted(category_agents, key=lambda a: a.get("agent_id", "")):
|
|
148
|
+
agent_id = agent.get("agent_id", "unknown")
|
|
149
|
+
source = agent.get("source", agent.get("repository", "unknown"))
|
|
150
|
+
priority = agent.get("priority", "unknown")
|
|
151
|
+
|
|
152
|
+
# Agent ID line
|
|
153
|
+
console.print(f" ⢠[bold]{agent_id}[/bold]")
|
|
154
|
+
|
|
155
|
+
if verbose:
|
|
156
|
+
# Description
|
|
157
|
+
description = agent.get("metadata", {}).get("description", "")
|
|
158
|
+
if not description:
|
|
159
|
+
description = agent.get("description", "No description available")
|
|
160
|
+
|
|
161
|
+
console.print(f" {description}")
|
|
162
|
+
|
|
163
|
+
# Version
|
|
164
|
+
version = agent.get(
|
|
165
|
+
"version", agent.get("metadata", {}).get("version", "unknown")
|
|
166
|
+
)
|
|
167
|
+
console.print(f" Version: {version}")
|
|
168
|
+
|
|
169
|
+
# Source attribution
|
|
170
|
+
console.print(f" Source: [dim]{source}[/dim] (priority: {priority})")
|
|
171
|
+
|
|
172
|
+
console.print() # Blank line between agents
|
|
173
|
+
|
|
174
|
+
console.print() # Blank line between categories
|
|
175
|
+
|
|
176
|
+
|
|
177
|
+
def _output_json_format(
|
|
178
|
+
agents: List[Dict[str, Any]], filters_applied: Dict[str, str]
|
|
179
|
+
) -> None:
|
|
180
|
+
"""Output agents in JSON format for scripting.
|
|
181
|
+
|
|
182
|
+
Args:
|
|
183
|
+
agents: List of agent dictionaries
|
|
184
|
+
filters_applied: Dictionary of filters that were applied
|
|
185
|
+
"""
|
|
186
|
+
output = {
|
|
187
|
+
"total": len(agents),
|
|
188
|
+
"filters_applied": filters_applied,
|
|
189
|
+
"agents": [
|
|
190
|
+
{
|
|
191
|
+
"agent_id": agent.get("agent_id", "unknown"),
|
|
192
|
+
"source": agent.get("source", agent.get("repository", "unknown")),
|
|
193
|
+
"priority": agent.get("priority", "unknown"),
|
|
194
|
+
"category": agent.get("category", "unknown"),
|
|
195
|
+
"version": agent.get(
|
|
196
|
+
"version", agent.get("metadata", {}).get("version", "unknown")
|
|
197
|
+
),
|
|
198
|
+
"description": agent.get("metadata", {}).get(
|
|
199
|
+
"description", agent.get("description", "")
|
|
200
|
+
),
|
|
201
|
+
}
|
|
202
|
+
for agent in agents
|
|
203
|
+
],
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
console.print(json.dumps(output, indent=2))
|
|
207
|
+
|
|
208
|
+
|
|
209
|
+
def _output_simple_format(agents: List[Dict[str, Any]]) -> None:
|
|
210
|
+
"""Output agents in simple format (agent IDs only).
|
|
211
|
+
|
|
212
|
+
Args:
|
|
213
|
+
agents: List of agent dictionaries
|
|
214
|
+
"""
|
|
215
|
+
for agent in sorted(agents, key=lambda a: a.get("agent_id", "")):
|
|
216
|
+
agent_id = agent.get("agent_id", "unknown")
|
|
217
|
+
console.print(agent_id)
|
|
218
|
+
|
|
219
|
+
|
|
220
|
+
def discover_command(args) -> int:
|
|
221
|
+
"""Execute the 'agents discover' command.
|
|
222
|
+
|
|
223
|
+
This command discovers and lists available agents from all configured
|
|
224
|
+
Git sources, with optional filtering by category, language, framework,
|
|
225
|
+
platform, and source.
|
|
226
|
+
|
|
227
|
+
Design Decision: Load sources from configuration
|
|
228
|
+
|
|
229
|
+
Rationale: Use AgentSourceConfiguration to load all configured sources,
|
|
230
|
+
respecting enabled/disabled state and priority. This ensures consistent
|
|
231
|
+
behavior with other agent commands.
|
|
232
|
+
|
|
233
|
+
Error Handling:
|
|
234
|
+
- Graceful degradation if no sources configured
|
|
235
|
+
- Warning if cache not populated (suggest agent-source update)
|
|
236
|
+
- Empty result sets clearly communicated
|
|
237
|
+
|
|
238
|
+
Args:
|
|
239
|
+
args: Parsed command arguments with attributes:
|
|
240
|
+
- source: Optional source ID filter
|
|
241
|
+
- category: Optional category filter
|
|
242
|
+
- language: Optional language filter
|
|
243
|
+
- framework: Optional framework filter
|
|
244
|
+
- platform: Optional platform filter
|
|
245
|
+
- specialization: Optional specialization filter
|
|
246
|
+
- format: Output format (table, json, simple)
|
|
247
|
+
- verbose: Show descriptions and metadata
|
|
248
|
+
|
|
249
|
+
Returns:
|
|
250
|
+
Exit code (0 for success, 1 for error)
|
|
251
|
+
|
|
252
|
+
Example:
|
|
253
|
+
>>> args = argparse.Namespace(
|
|
254
|
+
... source=None,
|
|
255
|
+
... category="engineer/backend",
|
|
256
|
+
... language=None,
|
|
257
|
+
... framework=None,
|
|
258
|
+
... platform=None,
|
|
259
|
+
... specialization=None,
|
|
260
|
+
... format="table",
|
|
261
|
+
... verbose=False
|
|
262
|
+
... )
|
|
263
|
+
>>> discover_command(args)
|
|
264
|
+
0
|
|
265
|
+
"""
|
|
266
|
+
try:
|
|
267
|
+
# Load agent sources configuration
|
|
268
|
+
sources_config = AgentSourceConfiguration()
|
|
269
|
+
|
|
270
|
+
# Initialize Git source manager
|
|
271
|
+
manager = GitSourceManager()
|
|
272
|
+
|
|
273
|
+
# Build filters dictionary
|
|
274
|
+
filters = {}
|
|
275
|
+
|
|
276
|
+
if args.category:
|
|
277
|
+
filters["category"] = args.category
|
|
278
|
+
|
|
279
|
+
if args.language:
|
|
280
|
+
filters["language"] = args.language
|
|
281
|
+
|
|
282
|
+
if args.framework:
|
|
283
|
+
filters["framework"] = args.framework
|
|
284
|
+
|
|
285
|
+
if args.platform:
|
|
286
|
+
filters["platform"] = args.platform
|
|
287
|
+
|
|
288
|
+
if args.specialization:
|
|
289
|
+
filters["specialization"] = args.specialization
|
|
290
|
+
|
|
291
|
+
# Get agents with filters
|
|
292
|
+
agents = manager.list_cached_agents_with_filters(
|
|
293
|
+
repo_identifier=args.source, filters=filters if filters else None
|
|
294
|
+
)
|
|
295
|
+
|
|
296
|
+
# Check if any sources are configured
|
|
297
|
+
if not agents and not sources_config.list_sources():
|
|
298
|
+
console.print("[yellow]ā ļø No agent sources configured.[/yellow]")
|
|
299
|
+
console.print("\nAdd a source with:")
|
|
300
|
+
console.print(" claude-mpm agent-source add <git-url>")
|
|
301
|
+
return 1
|
|
302
|
+
|
|
303
|
+
# Check if cache might be empty
|
|
304
|
+
if not agents and not filters:
|
|
305
|
+
console.print("[yellow]ā ļø No agents found in cache.[/yellow]")
|
|
306
|
+
console.print("\nTry syncing sources first:")
|
|
307
|
+
console.print(" claude-mpm agent-source update")
|
|
308
|
+
return 1
|
|
309
|
+
|
|
310
|
+
# Output based on format
|
|
311
|
+
if args.format == "json":
|
|
312
|
+
filters_applied = {
|
|
313
|
+
k: v
|
|
314
|
+
for k, v in [
|
|
315
|
+
("source", args.source),
|
|
316
|
+
("category", args.category),
|
|
317
|
+
("language", args.language),
|
|
318
|
+
("framework", args.framework),
|
|
319
|
+
("platform", args.platform),
|
|
320
|
+
("specialization", args.specialization),
|
|
321
|
+
]
|
|
322
|
+
if v is not None
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
_output_json_format(agents, filters_applied)
|
|
326
|
+
|
|
327
|
+
elif args.format == "simple":
|
|
328
|
+
_output_simple_format(agents)
|
|
329
|
+
|
|
330
|
+
else: # table (default)
|
|
331
|
+
_output_table_format(agents, verbose=args.verbose)
|
|
332
|
+
|
|
333
|
+
return 0
|
|
334
|
+
|
|
335
|
+
except Exception as e:
|
|
336
|
+
logger.error(f"Error discovering agents: {e}", exc_info=True)
|
|
337
|
+
console.print(f"[bold red]Error:[/bold red] {e}")
|
|
338
|
+
return 1
|
|
@@ -0,0 +1,309 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Agents Recommend CLI Command for Claude MPM Framework
|
|
3
|
+
======================================================
|
|
4
|
+
|
|
5
|
+
WHY: This module provides a CLI interface for getting agent recommendations
|
|
6
|
+
based on project toolchain without deploying anything. Useful for reviewing
|
|
7
|
+
recommendations before committing to deployment.
|
|
8
|
+
|
|
9
|
+
DESIGN DECISION: Focused on recommendation display with detailed reasoning,
|
|
10
|
+
showing users why each agent was recommended. Supports JSON output for
|
|
11
|
+
integration with other tools.
|
|
12
|
+
|
|
13
|
+
Part of TSK-0054: Auto-Configuration Feature - Phase 5
|
|
14
|
+
"""
|
|
15
|
+
|
|
16
|
+
import json
|
|
17
|
+
from pathlib import Path
|
|
18
|
+
from typing import Optional
|
|
19
|
+
|
|
20
|
+
try:
|
|
21
|
+
from rich.console import Console
|
|
22
|
+
from rich.panel import Panel
|
|
23
|
+
from rich.table import Table
|
|
24
|
+
|
|
25
|
+
RICH_AVAILABLE = True
|
|
26
|
+
except ImportError:
|
|
27
|
+
RICH_AVAILABLE = False
|
|
28
|
+
|
|
29
|
+
from ...services.agents.recommender import AgentRecommenderService
|
|
30
|
+
from ...services.agents.registry import AgentRegistry
|
|
31
|
+
from ...services.project.toolchain_analyzer import ToolchainAnalyzerService
|
|
32
|
+
from ..shared import BaseCommand, CommandResult
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
class AgentsRecommendCommand(BaseCommand):
|
|
36
|
+
"""
|
|
37
|
+
Handle agents recommend CLI command.
|
|
38
|
+
|
|
39
|
+
This command analyzes the project toolchain and recommends appropriate
|
|
40
|
+
agents without deploying them. Shows detailed reasoning for each
|
|
41
|
+
recommendation.
|
|
42
|
+
"""
|
|
43
|
+
|
|
44
|
+
def __init__(self):
|
|
45
|
+
"""Initialize the agents recommend command."""
|
|
46
|
+
super().__init__("agents-recommend")
|
|
47
|
+
self.console = Console() if RICH_AVAILABLE else None
|
|
48
|
+
self._toolchain_analyzer = None
|
|
49
|
+
self._agent_recommender = None
|
|
50
|
+
|
|
51
|
+
@property
|
|
52
|
+
def toolchain_analyzer(self) -> ToolchainAnalyzerService:
|
|
53
|
+
"""Get toolchain analyzer (lazy loaded)."""
|
|
54
|
+
if self._toolchain_analyzer is None:
|
|
55
|
+
self._toolchain_analyzer = ToolchainAnalyzerService()
|
|
56
|
+
return self._toolchain_analyzer
|
|
57
|
+
|
|
58
|
+
@property
|
|
59
|
+
def agent_recommender(self) -> AgentRecommenderService:
|
|
60
|
+
"""Get agent recommender (lazy loaded)."""
|
|
61
|
+
if self._agent_recommender is None:
|
|
62
|
+
agent_registry = AgentRegistry()
|
|
63
|
+
self._agent_recommender = AgentRecommenderService(
|
|
64
|
+
agent_registry=agent_registry
|
|
65
|
+
)
|
|
66
|
+
return self._agent_recommender
|
|
67
|
+
|
|
68
|
+
def validate_args(self, args) -> Optional[str]:
|
|
69
|
+
"""Validate command arguments."""
|
|
70
|
+
# Validate project path
|
|
71
|
+
project_path = (
|
|
72
|
+
Path(args.project_path)
|
|
73
|
+
if hasattr(args, "project_path") and args.project_path
|
|
74
|
+
else Path.cwd()
|
|
75
|
+
)
|
|
76
|
+
if not project_path.exists():
|
|
77
|
+
return f"Project path does not exist: {project_path}"
|
|
78
|
+
|
|
79
|
+
# Validate min_confidence range
|
|
80
|
+
if hasattr(args, "min_confidence") and args.min_confidence:
|
|
81
|
+
if not 0.0 <= args.min_confidence <= 1.0:
|
|
82
|
+
return "min_confidence must be between 0.0 and 1.0"
|
|
83
|
+
|
|
84
|
+
return None
|
|
85
|
+
|
|
86
|
+
def run(self, args) -> CommandResult:
|
|
87
|
+
"""
|
|
88
|
+
Execute agents recommend command.
|
|
89
|
+
|
|
90
|
+
Returns:
|
|
91
|
+
CommandResult with success status and exit code
|
|
92
|
+
"""
|
|
93
|
+
try:
|
|
94
|
+
# Setup logging
|
|
95
|
+
self.setup_logging(args)
|
|
96
|
+
|
|
97
|
+
# Validate arguments
|
|
98
|
+
error = self.validate_args(args)
|
|
99
|
+
if error:
|
|
100
|
+
return CommandResult.error_result(error)
|
|
101
|
+
|
|
102
|
+
# Get configuration options
|
|
103
|
+
project_path = (
|
|
104
|
+
Path(args.project_path)
|
|
105
|
+
if hasattr(args, "project_path") and args.project_path
|
|
106
|
+
else Path.cwd()
|
|
107
|
+
)
|
|
108
|
+
min_confidence = (
|
|
109
|
+
args.min_confidence
|
|
110
|
+
if hasattr(args, "min_confidence") and args.min_confidence
|
|
111
|
+
else 0.8
|
|
112
|
+
)
|
|
113
|
+
json_output = args.json if hasattr(args, "json") and args.json else False
|
|
114
|
+
show_reasoning = (
|
|
115
|
+
args.show_reasoning
|
|
116
|
+
if hasattr(args, "show_reasoning") and args.show_reasoning
|
|
117
|
+
else True
|
|
118
|
+
)
|
|
119
|
+
|
|
120
|
+
# Analyze toolchain
|
|
121
|
+
if self.console and not json_output:
|
|
122
|
+
with self.console.status("[bold green]Analyzing project toolchain..."):
|
|
123
|
+
analysis = self.toolchain_analyzer.analyze_project(
|
|
124
|
+
str(project_path)
|
|
125
|
+
)
|
|
126
|
+
else:
|
|
127
|
+
analysis = self.toolchain_analyzer.analyze_project(str(project_path))
|
|
128
|
+
|
|
129
|
+
# Get recommendations
|
|
130
|
+
if self.console and not json_output:
|
|
131
|
+
with self.console.status(
|
|
132
|
+
"[bold green]Generating agent recommendations..."
|
|
133
|
+
):
|
|
134
|
+
recommendations = self.agent_recommender.recommend_agents(
|
|
135
|
+
analysis, min_confidence
|
|
136
|
+
)
|
|
137
|
+
else:
|
|
138
|
+
recommendations = self.agent_recommender.recommend_agents(
|
|
139
|
+
analysis, min_confidence
|
|
140
|
+
)
|
|
141
|
+
|
|
142
|
+
# Output results
|
|
143
|
+
if json_output:
|
|
144
|
+
return self._output_json(recommendations, analysis)
|
|
145
|
+
return self._display_results(recommendations, analysis, show_reasoning)
|
|
146
|
+
|
|
147
|
+
except KeyboardInterrupt:
|
|
148
|
+
if self.console:
|
|
149
|
+
self.console.print("\n\nā Operation cancelled by user")
|
|
150
|
+
else:
|
|
151
|
+
print("\n\nOperation cancelled by user")
|
|
152
|
+
return CommandResult.error_result("Operation cancelled", exit_code=130)
|
|
153
|
+
|
|
154
|
+
except Exception as e:
|
|
155
|
+
self.logger.exception("Agent recommendation failed")
|
|
156
|
+
error_msg = f"Agent recommendation failed: {e!s}"
|
|
157
|
+
if self.console:
|
|
158
|
+
self.console.print(f"\nā {error_msg}")
|
|
159
|
+
else:
|
|
160
|
+
print(f"\n{error_msg}")
|
|
161
|
+
return CommandResult.error_result(error_msg)
|
|
162
|
+
|
|
163
|
+
def _display_results(
|
|
164
|
+
self, recommendations, analysis, show_reasoning: bool
|
|
165
|
+
) -> CommandResult:
|
|
166
|
+
"""Display agent recommendations with Rich formatting."""
|
|
167
|
+
if not self.console:
|
|
168
|
+
return self._display_results_plain(
|
|
169
|
+
recommendations, analysis, show_reasoning
|
|
170
|
+
)
|
|
171
|
+
|
|
172
|
+
# Display header
|
|
173
|
+
self.console.print("\nš¤ Agent Recommendations", style="bold blue")
|
|
174
|
+
self.console.print(f"Project: {analysis.project_path}\n")
|
|
175
|
+
|
|
176
|
+
# Display quick summary
|
|
177
|
+
if recommendations:
|
|
178
|
+
summary_text = (
|
|
179
|
+
f"Found {len(recommendations)} recommended agent(s) "
|
|
180
|
+
f"for your project based on detected toolchain."
|
|
181
|
+
)
|
|
182
|
+
panel = Panel(summary_text, border_style="green")
|
|
183
|
+
self.console.print(panel)
|
|
184
|
+
else:
|
|
185
|
+
panel = Panel(
|
|
186
|
+
"No agents recommended for this project.\n"
|
|
187
|
+
"Try lowering the confidence threshold with --min-confidence",
|
|
188
|
+
border_style="yellow",
|
|
189
|
+
)
|
|
190
|
+
self.console.print(panel)
|
|
191
|
+
return CommandResult.success_result()
|
|
192
|
+
|
|
193
|
+
# Display recommendations table
|
|
194
|
+
self.console.print("\nš Recommended Agents:", style="bold green")
|
|
195
|
+
table = Table(show_header=True, header_style="bold")
|
|
196
|
+
table.add_column("Agent ID", style="cyan")
|
|
197
|
+
table.add_column("Confidence", style="green")
|
|
198
|
+
table.add_column("Priority", style="yellow")
|
|
199
|
+
if show_reasoning:
|
|
200
|
+
table.add_column("Reasoning", style="dim", no_wrap=False)
|
|
201
|
+
|
|
202
|
+
for rec in recommendations:
|
|
203
|
+
confidence_pct = int(rec.confidence * 100)
|
|
204
|
+
bar = "ā" * (confidence_pct // 10) + "ā" * (10 - confidence_pct // 10)
|
|
205
|
+
confidence_str = f"{bar} {confidence_pct}%"
|
|
206
|
+
|
|
207
|
+
if show_reasoning:
|
|
208
|
+
table.add_row(
|
|
209
|
+
rec.agent_id,
|
|
210
|
+
confidence_str,
|
|
211
|
+
str(rec.priority),
|
|
212
|
+
rec.reasoning,
|
|
213
|
+
)
|
|
214
|
+
else:
|
|
215
|
+
table.add_row(rec.agent_id, confidence_str, str(rec.priority))
|
|
216
|
+
|
|
217
|
+
self.console.print(table)
|
|
218
|
+
|
|
219
|
+
# Display match details if reasoning enabled
|
|
220
|
+
if show_reasoning:
|
|
221
|
+
self.console.print("\nš Match Details:", style="bold blue")
|
|
222
|
+
for rec in recommendations:
|
|
223
|
+
self.console.print(f"\n[bold cyan]{rec.agent_id}[/bold cyan]")
|
|
224
|
+
self.console.print(f" Confidence: {int(rec.confidence * 100)}%")
|
|
225
|
+
self.console.print(f" Priority: {rec.priority}")
|
|
226
|
+
self.console.print(f" Reasoning: {rec.reasoning}")
|
|
227
|
+
|
|
228
|
+
if rec.matched_capabilities:
|
|
229
|
+
self.console.print(" Matched capabilities:", style="green")
|
|
230
|
+
for cap in rec.matched_capabilities[:5]:
|
|
231
|
+
self.console.print(f" ⢠{cap}", style="dim")
|
|
232
|
+
if len(rec.matched_capabilities) > 5:
|
|
233
|
+
remaining = len(rec.matched_capabilities) - 5
|
|
234
|
+
self.console.print(f" ... and {remaining} more", style="dim")
|
|
235
|
+
|
|
236
|
+
# Display next steps
|
|
237
|
+
self.console.print("\nš” Next Steps:", style="bold yellow")
|
|
238
|
+
self.console.print(" 1. Review the recommendations and their reasoning")
|
|
239
|
+
self.console.print(
|
|
240
|
+
" 2. Deploy agents with: [bold]claude-mpm auto-configure[/bold]"
|
|
241
|
+
)
|
|
242
|
+
self.console.print(
|
|
243
|
+
" 3. Or preview deployment with: [bold]claude-mpm auto-configure --preview[/bold]"
|
|
244
|
+
)
|
|
245
|
+
|
|
246
|
+
return CommandResult.success_result()
|
|
247
|
+
|
|
248
|
+
def _display_results_plain(
|
|
249
|
+
self, recommendations, analysis, show_reasoning: bool
|
|
250
|
+
) -> CommandResult:
|
|
251
|
+
"""Display results in plain text (fallback)."""
|
|
252
|
+
print("\nš¤ Agent Recommendations")
|
|
253
|
+
print(f"Project: {analysis.project_path}\n")
|
|
254
|
+
|
|
255
|
+
if not recommendations:
|
|
256
|
+
print("No agents recommended for this project.")
|
|
257
|
+
print("Try lowering the confidence threshold with --min-confidence")
|
|
258
|
+
return CommandResult.success_result()
|
|
259
|
+
|
|
260
|
+
print(f"Found {len(recommendations)} recommended agent(s) for your project:\n")
|
|
261
|
+
|
|
262
|
+
for rec in recommendations:
|
|
263
|
+
confidence_pct = int(rec.confidence * 100)
|
|
264
|
+
print(f"⢠{rec.agent_id} ({confidence_pct}% confidence)")
|
|
265
|
+
|
|
266
|
+
if show_reasoning:
|
|
267
|
+
print(f" Priority: {rec.priority}")
|
|
268
|
+
print(f" Reasoning: {rec.reasoning}")
|
|
269
|
+
|
|
270
|
+
if rec.matched_capabilities:
|
|
271
|
+
print(" Matched capabilities:")
|
|
272
|
+
for cap in rec.matched_capabilities[:5]:
|
|
273
|
+
print(f" - {cap}")
|
|
274
|
+
if len(rec.matched_capabilities) > 5:
|
|
275
|
+
remaining = len(rec.matched_capabilities) - 5
|
|
276
|
+
print(f" ... and {remaining} more")
|
|
277
|
+
print()
|
|
278
|
+
|
|
279
|
+
print("\nNext Steps:")
|
|
280
|
+
print(" 1. Review the recommendations and their reasoning")
|
|
281
|
+
print(" 2. Deploy agents with: claude-mpm auto-configure")
|
|
282
|
+
print(" 3. Or preview deployment with: claude-mpm auto-configure --preview")
|
|
283
|
+
|
|
284
|
+
return CommandResult.success_result()
|
|
285
|
+
|
|
286
|
+
def _output_json(self, recommendations, analysis) -> CommandResult:
|
|
287
|
+
"""Output recommendations as JSON."""
|
|
288
|
+
output = {
|
|
289
|
+
"project_path": analysis.project_path,
|
|
290
|
+
"recommendations": [
|
|
291
|
+
{
|
|
292
|
+
"agent_id": rec.agent_id,
|
|
293
|
+
"confidence": rec.confidence,
|
|
294
|
+
"priority": rec.priority,
|
|
295
|
+
"reasoning": rec.reasoning,
|
|
296
|
+
"matched_capabilities": rec.matched_capabilities,
|
|
297
|
+
"requirements": rec.requirements,
|
|
298
|
+
}
|
|
299
|
+
for rec in recommendations
|
|
300
|
+
],
|
|
301
|
+
"toolchain_summary": {
|
|
302
|
+
"languages": len(analysis.languages),
|
|
303
|
+
"frameworks": len(analysis.frameworks),
|
|
304
|
+
"deployment_targets": len(analysis.deployment_targets),
|
|
305
|
+
},
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
print(json.dumps(output, indent=2))
|
|
309
|
+
return CommandResult.success_result(data=output)
|