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
|
@@ -31,6 +31,7 @@ import time
|
|
|
31
31
|
from pathlib import Path
|
|
32
32
|
from typing import Any, Dict, List, Optional, Tuple
|
|
33
33
|
|
|
34
|
+
from claude_mpm.config.agent_sources import AgentSourceConfiguration
|
|
34
35
|
from claude_mpm.config.paths import paths
|
|
35
36
|
from claude_mpm.constants import Paths
|
|
36
37
|
from claude_mpm.core.config import Config
|
|
@@ -38,6 +39,8 @@ from claude_mpm.core.exceptions import AgentDeploymentError
|
|
|
38
39
|
from claude_mpm.core.interfaces import AgentDeploymentInterface
|
|
39
40
|
from claude_mpm.services.shared import ConfigServiceBase
|
|
40
41
|
|
|
42
|
+
# Import git source management for remote agent sync
|
|
43
|
+
from ..git_source_manager import GitSourceManager
|
|
41
44
|
from .agent_configuration_manager import AgentConfigurationManager
|
|
42
45
|
from .agent_discovery_service import AgentDiscoveryService
|
|
43
46
|
from .agent_environment_manager import AgentEnvironmentManager
|
|
@@ -184,9 +187,110 @@ class AgentDeploymentService(ConfigServiceBase, AgentDeploymentInterface):
|
|
|
184
187
|
# Initialize format converter service
|
|
185
188
|
self.format_converter = AgentFormatConverter()
|
|
186
189
|
|
|
190
|
+
# Initialize git source manager for remote agent sync
|
|
191
|
+
self.git_source_manager = GitSourceManager()
|
|
192
|
+
self.agent_source_config = AgentSourceConfiguration.load()
|
|
193
|
+
|
|
187
194
|
self.logger.info(f"Templates directory: {self.templates_dir}")
|
|
188
195
|
self.logger.info(f"Base agent path: {self.base_agent_path}")
|
|
189
196
|
|
|
197
|
+
def _sync_remote_agent_sources(self, timeout_seconds: int = 30) -> Dict[str, Any]:
|
|
198
|
+
"""Sync git-based agent sources before deployment.
|
|
199
|
+
|
|
200
|
+
This method follows the skills system pattern: sync configured git repositories
|
|
201
|
+
to cache before discovery. Network failures are logged but don't block deployment.
|
|
202
|
+
|
|
203
|
+
Args:
|
|
204
|
+
timeout_seconds: Timeout for git operations (default: 30 seconds)
|
|
205
|
+
|
|
206
|
+
Returns:
|
|
207
|
+
Dictionary with sync results:
|
|
208
|
+
{
|
|
209
|
+
"synced_count": int,
|
|
210
|
+
"failed_count": int,
|
|
211
|
+
"repositories": Dict[str, Dict], # repo_id -> sync result
|
|
212
|
+
"duration_ms": float
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
Error Handling:
|
|
216
|
+
- Network failures: Logged as warnings, sync continues
|
|
217
|
+
- Invalid repos: Logged as errors, sync continues
|
|
218
|
+
- Timeout: Individual repo timeouts don't stop overall sync
|
|
219
|
+
- Missing cache dir: Created automatically
|
|
220
|
+
"""
|
|
221
|
+
import time
|
|
222
|
+
|
|
223
|
+
start_time = time.time()
|
|
224
|
+
|
|
225
|
+
results = {
|
|
226
|
+
"synced_count": 0,
|
|
227
|
+
"failed_count": 0,
|
|
228
|
+
"repositories": {},
|
|
229
|
+
"duration_ms": 0,
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
# Load agent sources configuration
|
|
233
|
+
try:
|
|
234
|
+
config = AgentSourceConfiguration.load()
|
|
235
|
+
enabled_repos = [r for r in config.repositories if r.enabled]
|
|
236
|
+
|
|
237
|
+
if not enabled_repos:
|
|
238
|
+
self.logger.debug("No enabled agent sources configured")
|
|
239
|
+
return results
|
|
240
|
+
|
|
241
|
+
self.logger.info(f"Syncing {len(enabled_repos)} agent git sources...")
|
|
242
|
+
|
|
243
|
+
# Sync each enabled repository
|
|
244
|
+
for repo in enabled_repos:
|
|
245
|
+
repo_id = repo.identifier
|
|
246
|
+
try:
|
|
247
|
+
# Sync with timeout (individual repo sync)
|
|
248
|
+
# NOTE: show_progress=False to avoid duplicate progress bars
|
|
249
|
+
# (startup sync already showed progress to user)
|
|
250
|
+
sync_result = self.git_source_manager.sync_repository(
|
|
251
|
+
repo,
|
|
252
|
+
force=False, # Use ETag-based caching
|
|
253
|
+
show_progress=False, # Suppress progress (startup already synced)
|
|
254
|
+
)
|
|
255
|
+
|
|
256
|
+
results["repositories"][repo_id] = sync_result
|
|
257
|
+
|
|
258
|
+
if sync_result.get("synced"):
|
|
259
|
+
results["synced_count"] += 1
|
|
260
|
+
agents_discovered = sync_result.get("agents_discovered", [])
|
|
261
|
+
self.logger.info(
|
|
262
|
+
f"Synced {repo_id}: {sync_result.get('files_updated', 0)} files, "
|
|
263
|
+
f"{len(agents_discovered)} agents"
|
|
264
|
+
)
|
|
265
|
+
else:
|
|
266
|
+
results["failed_count"] += 1
|
|
267
|
+
error = sync_result.get("error", "Unknown error")
|
|
268
|
+
self.logger.warning(f"Failed to sync {repo_id}: {error}")
|
|
269
|
+
|
|
270
|
+
except Exception as e:
|
|
271
|
+
# Don't let individual repo failures stop deployment
|
|
272
|
+
results["failed_count"] += 1
|
|
273
|
+
results["repositories"][repo_id] = {
|
|
274
|
+
"synced": False,
|
|
275
|
+
"error": str(e),
|
|
276
|
+
}
|
|
277
|
+
self.logger.warning(f"Exception syncing {repo_id}: {e}")
|
|
278
|
+
|
|
279
|
+
except Exception as e:
|
|
280
|
+
# Configuration loading failure - log but don't crash
|
|
281
|
+
self.logger.warning(f"Failed to load agent sources config: {e}")
|
|
282
|
+
results["failed_count"] = -1 # Indicates config failure
|
|
283
|
+
|
|
284
|
+
results["duration_ms"] = (time.time() - start_time) * 1000
|
|
285
|
+
|
|
286
|
+
if results["synced_count"] > 0:
|
|
287
|
+
self.logger.info(
|
|
288
|
+
f"Agent source sync complete: {results['synced_count']} succeeded, "
|
|
289
|
+
f"{results['failed_count']} failed ({results['duration_ms']:.0f}ms)"
|
|
290
|
+
)
|
|
291
|
+
|
|
292
|
+
return results
|
|
293
|
+
|
|
190
294
|
def deploy_agents(
|
|
191
295
|
self,
|
|
192
296
|
target_dir: Optional[Path] = None,
|
|
@@ -267,6 +371,10 @@ class AgentDeploymentService(ConfigServiceBase, AgentDeploymentInterface):
|
|
|
267
371
|
# METRICS: Record deployment start time for performance tracking
|
|
268
372
|
deployment_start_time = time.time()
|
|
269
373
|
|
|
374
|
+
# PHASE 2 (1M-442): Sync git-based agent sources before deployment
|
|
375
|
+
# This ensures remote agents from configured sources are cached and discoverable
|
|
376
|
+
sync_results = self._sync_remote_agent_sources()
|
|
377
|
+
|
|
270
378
|
# Try async deployment for better performance if requested
|
|
271
379
|
if use_async:
|
|
272
380
|
async_results = self._try_async_deployment(
|
|
@@ -292,6 +400,13 @@ class AgentDeploymentService(ConfigServiceBase, AgentDeploymentInterface):
|
|
|
292
400
|
agents_dir, deployment_start_time
|
|
293
401
|
)
|
|
294
402
|
|
|
403
|
+
# Add git source sync results to deployment results
|
|
404
|
+
if (
|
|
405
|
+
sync_results.get("synced_count", 0) > 0
|
|
406
|
+
or sync_results.get("failed_count", 0) > 0
|
|
407
|
+
):
|
|
408
|
+
results["remote_sources"] = sync_results
|
|
409
|
+
|
|
295
410
|
try:
|
|
296
411
|
# Create agents directory if needed
|
|
297
412
|
agents_dir.mkdir(parents=True, exist_ok=True)
|
|
@@ -369,12 +484,18 @@ class AgentDeploymentService(ConfigServiceBase, AgentDeploymentInterface):
|
|
|
369
484
|
else "single"
|
|
370
485
|
)
|
|
371
486
|
|
|
487
|
+
# When using multi-source deployment, we've already determined which
|
|
488
|
+
# agents need updates. Don't re-check versions in single_agent_deployer.
|
|
489
|
+
# This prevents the issue where multi-source says "deploying 9 agents"
|
|
490
|
+
# but then all get skipped due to redundant version checks.
|
|
491
|
+
skip_version_check = use_multi_source and not force_rebuild
|
|
492
|
+
|
|
372
493
|
self.single_agent_deployer.deploy_single_agent(
|
|
373
494
|
template_file=template_file_path,
|
|
374
495
|
agents_dir=agents_dir,
|
|
375
496
|
base_agent_data=base_agent_data,
|
|
376
497
|
base_agent_version=base_agent_version,
|
|
377
|
-
force_rebuild=force_rebuild,
|
|
498
|
+
force_rebuild=force_rebuild or skip_version_check,
|
|
378
499
|
deployment_mode=deployment_mode,
|
|
379
500
|
results=results,
|
|
380
501
|
source_info=source_info,
|
|
@@ -683,7 +804,10 @@ class AgentDeploymentService(ConfigServiceBase, AgentDeploymentInterface):
|
|
|
683
804
|
|
|
684
805
|
def _get_filtered_templates(self, excluded_agents: list, config: Config) -> list:
|
|
685
806
|
"""Get and filter template files based on exclusion rules."""
|
|
686
|
-
|
|
807
|
+
filter_non_mpm = config.get("agent_deployment.filter_non_mpm_agents", True)
|
|
808
|
+
return self.discovery_service.get_filtered_templates(
|
|
809
|
+
excluded_agents, config, filter_non_mpm
|
|
810
|
+
)
|
|
687
811
|
|
|
688
812
|
def _validate_and_repair_existing_agents(self, agents_dir: Path) -> Dict[str, Any]:
|
|
689
813
|
"""Validate and repair broken frontmatter in existing agent files."""
|
|
@@ -745,19 +869,28 @@ class AgentDeploymentService(ConfigServiceBase, AgentDeploymentInterface):
|
|
|
745
869
|
project_agents_dir = potential_project_dir
|
|
746
870
|
self.logger.info(f"Found project agents at: {project_agents_dir}")
|
|
747
871
|
|
|
748
|
-
# Check for user agents
|
|
872
|
+
# Check for user agents (DEPRECATED)
|
|
749
873
|
user_home = Path.home()
|
|
750
874
|
potential_user_dir = user_home / ".claude-mpm" / "agents"
|
|
751
875
|
if potential_user_dir.exists():
|
|
752
876
|
user_agents_dir = potential_user_dir
|
|
753
877
|
self.logger.info(f"Found user agents at: {user_agents_dir}")
|
|
754
878
|
|
|
755
|
-
#
|
|
879
|
+
# Check for remote agents (cached from GitHub)
|
|
880
|
+
remote_agents_dir = None
|
|
881
|
+
cache_dir = user_home / ".claude-mpm" / "cache"
|
|
882
|
+
potential_remote_dir = cache_dir / "remote-agents"
|
|
883
|
+
if potential_remote_dir.exists():
|
|
884
|
+
remote_agents_dir = potential_remote_dir
|
|
885
|
+
self.logger.info(f"Found remote agents cache at: {remote_agents_dir}")
|
|
886
|
+
|
|
887
|
+
# Get agents with version comparison and cleanup (4-tier discovery)
|
|
756
888
|
agents_to_deploy, agent_sources, cleanup_results = (
|
|
757
889
|
self.multi_source_service.get_agents_for_deployment(
|
|
758
890
|
system_templates_dir=system_templates_dir,
|
|
759
891
|
project_agents_dir=project_agents_dir,
|
|
760
892
|
user_agents_dir=user_agents_dir,
|
|
893
|
+
remote_agents_dir=remote_agents_dir, # NEW: 4th tier
|
|
761
894
|
working_directory=self.working_directory,
|
|
762
895
|
excluded_agents=excluded_agents,
|
|
763
896
|
config=config,
|
|
@@ -773,16 +906,6 @@ class AgentDeploymentService(ConfigServiceBase, AgentDeploymentInterface):
|
|
|
773
906
|
agent_sources=agent_sources,
|
|
774
907
|
)
|
|
775
908
|
|
|
776
|
-
# Log version upgrades and source changes
|
|
777
|
-
if comparison_results.get("version_upgrades"):
|
|
778
|
-
self.logger.info(
|
|
779
|
-
f"Version upgrades available for {len(comparison_results['version_upgrades'])} agents"
|
|
780
|
-
)
|
|
781
|
-
if comparison_results.get("source_changes"):
|
|
782
|
-
self.logger.info(
|
|
783
|
-
f"Source changes for {len(comparison_results['source_changes'])} agents"
|
|
784
|
-
)
|
|
785
|
-
|
|
786
909
|
# Filter agents based on comparison results (unless force_rebuild is set)
|
|
787
910
|
if not force_rebuild:
|
|
788
911
|
# Only deploy agents that need updates or are new
|
|
@@ -801,11 +924,35 @@ class AgentDeploymentService(ConfigServiceBase, AgentDeploymentInterface):
|
|
|
801
924
|
for name, path in agents_to_deploy.items()
|
|
802
925
|
if name in agents_needing_update
|
|
803
926
|
}
|
|
927
|
+
|
|
928
|
+
# Only log upgrade messages if we're actually going to deploy them
|
|
929
|
+
if filtered_agents and comparison_results.get("version_upgrades"):
|
|
930
|
+
# Filter upgrades to only those actually being deployed
|
|
931
|
+
deployed_upgrades = [
|
|
932
|
+
upgrade
|
|
933
|
+
for upgrade in comparison_results["version_upgrades"]
|
|
934
|
+
if upgrade["name"] in filtered_agents
|
|
935
|
+
]
|
|
936
|
+
|
|
937
|
+
if deployed_upgrades:
|
|
938
|
+
self.logger.info(
|
|
939
|
+
f"Deploying {len(deployed_upgrades)} agent upgrade(s):"
|
|
940
|
+
)
|
|
941
|
+
for upgrade in deployed_upgrades:
|
|
942
|
+
self.logger.info(
|
|
943
|
+
f" Upgrading: {upgrade['name']} "
|
|
944
|
+
f"{upgrade['deployed_version']} -> {upgrade['new_version']} "
|
|
945
|
+
f"(from {upgrade['source']})"
|
|
946
|
+
)
|
|
947
|
+
|
|
804
948
|
agents_to_deploy = filtered_agents
|
|
805
949
|
|
|
806
|
-
|
|
807
|
-
|
|
808
|
-
|
|
950
|
+
# Don't log this redundant message - we already logged the upgrades above
|
|
951
|
+
# The "Deploying X agent upgrade(s)" message is sufficient
|
|
952
|
+
if not agents_to_deploy:
|
|
953
|
+
self.logger.debug(
|
|
954
|
+
f"All {len(comparison_results.get('up_to_date', []))} agents are up to date"
|
|
955
|
+
)
|
|
809
956
|
|
|
810
957
|
# Convert to list of Path objects
|
|
811
958
|
template_files = list(agents_to_deploy.values())
|
|
@@ -7,10 +7,11 @@ Extracted from AgentDeploymentService as part of the refactoring to improve
|
|
|
7
7
|
maintainability and testability.
|
|
8
8
|
"""
|
|
9
9
|
|
|
10
|
-
import json
|
|
11
10
|
from pathlib import Path
|
|
12
11
|
from typing import Any, Dict, List, Optional
|
|
13
12
|
|
|
13
|
+
import yaml
|
|
14
|
+
|
|
14
15
|
from claude_mpm.core.config import Config
|
|
15
16
|
from claude_mpm.core.logging_config import get_logger
|
|
16
17
|
|
|
@@ -59,8 +60,8 @@ class AgentDiscoveryService:
|
|
|
59
60
|
)
|
|
60
61
|
return agents
|
|
61
62
|
|
|
62
|
-
# Find all
|
|
63
|
-
template_files = list(self.templates_dir.glob("*.
|
|
63
|
+
# Find all markdown template files with YAML frontmatter
|
|
64
|
+
template_files = list(self.templates_dir.glob("*.md"))
|
|
64
65
|
|
|
65
66
|
for template_file in template_files:
|
|
66
67
|
try:
|
|
@@ -85,7 +86,10 @@ class AgentDiscoveryService:
|
|
|
85
86
|
return agents
|
|
86
87
|
|
|
87
88
|
def get_filtered_templates(
|
|
88
|
-
self,
|
|
89
|
+
self,
|
|
90
|
+
excluded_agents: List[str],
|
|
91
|
+
config: Optional[Config] = None,
|
|
92
|
+
filter_non_mpm: bool = False,
|
|
89
93
|
) -> List[Path]:
|
|
90
94
|
"""
|
|
91
95
|
Get filtered list of template files based on configuration.
|
|
@@ -93,6 +97,7 @@ class AgentDiscoveryService:
|
|
|
93
97
|
Args:
|
|
94
98
|
excluded_agents: List of agent names to exclude
|
|
95
99
|
config: Configuration object for additional filtering
|
|
100
|
+
filter_non_mpm: Whether to filter out non-MPM agents
|
|
96
101
|
|
|
97
102
|
Returns:
|
|
98
103
|
List of template file paths to deploy
|
|
@@ -101,8 +106,8 @@ class AgentDiscoveryService:
|
|
|
101
106
|
self.logger.error(f"Templates directory not found: {self.templates_dir}")
|
|
102
107
|
return []
|
|
103
108
|
|
|
104
|
-
# Get all template files
|
|
105
|
-
template_files = list(self.templates_dir.glob("*.
|
|
109
|
+
# Get all markdown template files
|
|
110
|
+
template_files = list(self.templates_dir.glob("*.md"))
|
|
106
111
|
|
|
107
112
|
if not template_files:
|
|
108
113
|
self.logger.warning(f"No agent templates found in {self.templates_dir}")
|
|
@@ -111,6 +116,7 @@ class AgentDiscoveryService:
|
|
|
111
116
|
# Apply exclusion filtering
|
|
112
117
|
filtered_files = []
|
|
113
118
|
excluded_count = 0
|
|
119
|
+
non_mpm_count = 0
|
|
114
120
|
|
|
115
121
|
for template_file in template_files:
|
|
116
122
|
agent_name = template_file.stem
|
|
@@ -121,14 +127,24 @@ class AgentDiscoveryService:
|
|
|
121
127
|
self.logger.debug(f"Excluding agent: {agent_name}")
|
|
122
128
|
continue
|
|
123
129
|
|
|
130
|
+
# Check if we should filter non-MPM agents
|
|
131
|
+
if filter_non_mpm and not self._is_mpm_agent(template_file):
|
|
132
|
+
non_mpm_count += 1
|
|
133
|
+
self.logger.debug(f"Filtering non-MPM agent: {agent_name}")
|
|
134
|
+
continue
|
|
135
|
+
|
|
124
136
|
# Validate template file
|
|
125
137
|
if self._validate_template_file(template_file):
|
|
126
138
|
filtered_files.append(template_file)
|
|
127
139
|
else:
|
|
128
140
|
self.logger.warning(f"Invalid template file: {template_file.name}")
|
|
129
141
|
|
|
142
|
+
# Log filtering results
|
|
143
|
+
if filter_non_mpm and non_mpm_count > 0:
|
|
144
|
+
self.logger.info(f"Filtered out {non_mpm_count} non-MPM agents")
|
|
145
|
+
|
|
130
146
|
self.logger.info(
|
|
131
|
-
f"Found {len(template_files)} templates, excluded {excluded_count}, deploying {len(filtered_files)}"
|
|
147
|
+
f"Found {len(template_files)} templates, excluded {excluded_count}, filtered {non_mpm_count} non-MPM, deploying {len(filtered_files)}"
|
|
132
148
|
)
|
|
133
149
|
return filtered_files
|
|
134
150
|
|
|
@@ -142,7 +158,7 @@ class AgentDiscoveryService:
|
|
|
142
158
|
Returns:
|
|
143
159
|
Path to template file if found, None otherwise
|
|
144
160
|
"""
|
|
145
|
-
template_file = self.templates_dir / f"{agent_name}.
|
|
161
|
+
template_file = self.templates_dir / f"{agent_name}.md"
|
|
146
162
|
|
|
147
163
|
if template_file.exists():
|
|
148
164
|
if self._validate_template_file(template_file):
|
|
@@ -184,40 +200,45 @@ class AgentDiscoveryService:
|
|
|
184
200
|
|
|
185
201
|
def _extract_agent_metadata(self, template_file: Path) -> Optional[Dict[str, Any]]:
|
|
186
202
|
"""
|
|
187
|
-
Extract metadata from an agent template file.
|
|
203
|
+
Extract metadata from an agent template file with YAML frontmatter.
|
|
188
204
|
|
|
189
205
|
Args:
|
|
190
|
-
template_file: Path to the template file
|
|
206
|
+
template_file: Path to the markdown template file
|
|
191
207
|
|
|
192
208
|
Returns:
|
|
193
209
|
Dictionary with agent metadata or None if extraction fails
|
|
194
210
|
"""
|
|
195
211
|
try:
|
|
196
|
-
# Read
|
|
212
|
+
# Read template file content
|
|
197
213
|
template_content = template_file.read_text()
|
|
198
|
-
template_data = json.loads(template_content)
|
|
199
214
|
|
|
200
|
-
# Extract
|
|
201
|
-
|
|
202
|
-
|
|
215
|
+
# Extract YAML frontmatter
|
|
216
|
+
frontmatter = self._extract_yaml_frontmatter(template_content)
|
|
217
|
+
if not frontmatter:
|
|
218
|
+
self.logger.warning(
|
|
219
|
+
f"No valid YAML frontmatter in {template_file.name}"
|
|
220
|
+
)
|
|
221
|
+
return None
|
|
203
222
|
|
|
223
|
+
# Extract metadata directly from frontmatter (flat structure)
|
|
224
|
+
# Markdown templates use flat YAML structure, not nested "metadata" section
|
|
204
225
|
agent_info = {
|
|
205
|
-
"name":
|
|
206
|
-
"description":
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
226
|
+
"name": frontmatter.get("name", template_file.stem),
|
|
227
|
+
"description": frontmatter.get(
|
|
228
|
+
"description", "No description available"
|
|
229
|
+
),
|
|
230
|
+
"type": frontmatter.get(
|
|
231
|
+
"agent_type", frontmatter.get("category", "agent")
|
|
210
232
|
),
|
|
211
|
-
"
|
|
212
|
-
"
|
|
213
|
-
|
|
214
|
-
), # Use tags as specializations
|
|
233
|
+
"version": frontmatter.get("version", "1.0.0"),
|
|
234
|
+
"tools": frontmatter.get("tools", []),
|
|
235
|
+
"specializations": frontmatter.get("tags", []),
|
|
215
236
|
"file": template_file.name,
|
|
216
237
|
"path": str(template_file),
|
|
217
238
|
"file_path": str(template_file), # Keep for backward compatibility
|
|
218
239
|
"size": template_file.stat().st_size,
|
|
219
|
-
"model":
|
|
220
|
-
"author":
|
|
240
|
+
"model": frontmatter.get("model", "sonnet"),
|
|
241
|
+
"author": frontmatter.get("author", "unknown"),
|
|
221
242
|
}
|
|
222
243
|
|
|
223
244
|
# Validate required fields
|
|
@@ -227,8 +248,8 @@ class AgentDiscoveryService:
|
|
|
227
248
|
|
|
228
249
|
return agent_info
|
|
229
250
|
|
|
230
|
-
except
|
|
231
|
-
self.logger.error(f"Invalid
|
|
251
|
+
except yaml.YAMLError as e:
|
|
252
|
+
self.logger.error(f"Invalid YAML frontmatter in {template_file.name}: {e}")
|
|
232
253
|
return None
|
|
233
254
|
except Exception as e:
|
|
234
255
|
self.logger.error(
|
|
@@ -236,6 +257,82 @@ class AgentDiscoveryService:
|
|
|
236
257
|
)
|
|
237
258
|
return None
|
|
238
259
|
|
|
260
|
+
def _extract_yaml_frontmatter(self, content: str) -> Optional[Dict[str, Any]]:
|
|
261
|
+
"""
|
|
262
|
+
Extract and parse YAML frontmatter from markdown.
|
|
263
|
+
|
|
264
|
+
Frontmatter must be at the start of the file, delimited by '---'.
|
|
265
|
+
Example:
|
|
266
|
+
---
|
|
267
|
+
name: agent_name
|
|
268
|
+
description: Agent description
|
|
269
|
+
version: 1.0.0
|
|
270
|
+
---
|
|
271
|
+
# Agent content...
|
|
272
|
+
|
|
273
|
+
Args:
|
|
274
|
+
content: File content to parse
|
|
275
|
+
|
|
276
|
+
Returns:
|
|
277
|
+
Parsed YAML frontmatter as dict, or None if not found/invalid
|
|
278
|
+
"""
|
|
279
|
+
if not content.strip().startswith("---"):
|
|
280
|
+
return None
|
|
281
|
+
|
|
282
|
+
# Split on --- delimiters
|
|
283
|
+
parts = content.split("---", 2)
|
|
284
|
+
if len(parts) < 3:
|
|
285
|
+
return None
|
|
286
|
+
|
|
287
|
+
try:
|
|
288
|
+
return yaml.safe_load(parts[1])
|
|
289
|
+
except yaml.YAMLError as e:
|
|
290
|
+
self.logger.warning(f"Failed to parse YAML frontmatter: {e}")
|
|
291
|
+
return None
|
|
292
|
+
|
|
293
|
+
def _is_mpm_agent(self, template_file: Path) -> bool:
|
|
294
|
+
"""Check if agent is authored by Claude MPM team.
|
|
295
|
+
|
|
296
|
+
MPM agents must have:
|
|
297
|
+
- An author field containing 'claude mpm', 'claude-mpm', or 'anthropic'
|
|
298
|
+
- A valid version field
|
|
299
|
+
|
|
300
|
+
Args:
|
|
301
|
+
template_file: Path to the agent template markdown file
|
|
302
|
+
|
|
303
|
+
Returns:
|
|
304
|
+
True if this is an MPM agent, False otherwise
|
|
305
|
+
"""
|
|
306
|
+
try:
|
|
307
|
+
# Extract YAML frontmatter
|
|
308
|
+
content = template_file.read_text()
|
|
309
|
+
frontmatter = self._extract_yaml_frontmatter(content)
|
|
310
|
+
if not frontmatter:
|
|
311
|
+
return False
|
|
312
|
+
|
|
313
|
+
# Check for author field
|
|
314
|
+
author = frontmatter.get("author", "").lower()
|
|
315
|
+
has_valid_author = any(
|
|
316
|
+
pattern in author
|
|
317
|
+
for pattern in ["claude mpm", "claude-mpm", "anthropic"]
|
|
318
|
+
)
|
|
319
|
+
|
|
320
|
+
# Check for version field
|
|
321
|
+
has_version = bool(frontmatter.get("version"))
|
|
322
|
+
|
|
323
|
+
if not has_valid_author or not has_version:
|
|
324
|
+
self.logger.debug(
|
|
325
|
+
f"Filtered non-MPM agent {template_file.name}: "
|
|
326
|
+
f"author='{frontmatter.get('author', 'missing')}', "
|
|
327
|
+
f"version={'present' if has_version else 'missing'}"
|
|
328
|
+
)
|
|
329
|
+
|
|
330
|
+
return has_valid_author and has_version
|
|
331
|
+
|
|
332
|
+
except Exception as e:
|
|
333
|
+
self.logger.debug(f"Error checking if {template_file} is MPM agent: {e}")
|
|
334
|
+
return False # Treat invalid templates as non-MPM
|
|
335
|
+
|
|
239
336
|
def _is_agent_excluded(
|
|
240
337
|
self,
|
|
241
338
|
agent_name: str,
|
|
@@ -292,10 +389,10 @@ class AgentDiscoveryService:
|
|
|
292
389
|
|
|
293
390
|
def _validate_template_file(self, template_file: Path) -> bool:
|
|
294
391
|
"""
|
|
295
|
-
Validate that a template file is properly formatted.
|
|
392
|
+
Validate that a template file is properly formatted with YAML frontmatter.
|
|
296
393
|
|
|
297
394
|
Args:
|
|
298
|
-
template_file: Path to template file to validate
|
|
395
|
+
template_file: Path to markdown template file to validate
|
|
299
396
|
|
|
300
397
|
Returns:
|
|
301
398
|
True if template is valid, False otherwise
|
|
@@ -305,23 +402,27 @@ class AgentDiscoveryService:
|
|
|
305
402
|
if not template_file.exists():
|
|
306
403
|
return False
|
|
307
404
|
|
|
308
|
-
#
|
|
405
|
+
# Read and parse YAML frontmatter
|
|
309
406
|
content = template_file.read_text()
|
|
310
|
-
|
|
407
|
+
frontmatter = self._extract_yaml_frontmatter(content)
|
|
408
|
+
if not frontmatter:
|
|
409
|
+
self.logger.warning(
|
|
410
|
+
f"Template {template_file.name} has no valid YAML frontmatter"
|
|
411
|
+
)
|
|
412
|
+
return False
|
|
311
413
|
|
|
312
|
-
# Check required fields
|
|
313
|
-
metadata = template_data.get("metadata", {})
|
|
414
|
+
# Check required fields (flat structure in markdown templates)
|
|
314
415
|
required_fields = ["name", "description"]
|
|
315
416
|
for field in required_fields:
|
|
316
|
-
if field not in
|
|
417
|
+
if field not in frontmatter:
|
|
317
418
|
self.logger.warning(
|
|
318
|
-
f"Template {template_file.name} missing required field
|
|
419
|
+
f"Template {template_file.name} missing required field: {field}"
|
|
319
420
|
)
|
|
320
421
|
return False
|
|
321
422
|
|
|
322
423
|
# Validate agent ID format (Claude Code requirements)
|
|
323
424
|
# Use agent_id for validation, not the display name
|
|
324
|
-
agent_id =
|
|
425
|
+
agent_id = frontmatter.get("agent_id", "")
|
|
325
426
|
if not self._is_valid_agent_name(agent_id):
|
|
326
427
|
self.logger.warning(
|
|
327
428
|
f"Invalid agent ID format in {template_file.name}: {agent_id}"
|
|
@@ -330,8 +431,10 @@ class AgentDiscoveryService:
|
|
|
330
431
|
|
|
331
432
|
return True
|
|
332
433
|
|
|
333
|
-
except
|
|
334
|
-
self.logger.error(
|
|
434
|
+
except yaml.YAMLError:
|
|
435
|
+
self.logger.error(
|
|
436
|
+
f"Invalid YAML frontmatter in template: {template_file.name}"
|
|
437
|
+
)
|
|
335
438
|
return False
|
|
336
439
|
except Exception as e:
|
|
337
440
|
self.logger.error(
|
|
@@ -357,6 +460,53 @@ class AgentDiscoveryService:
|
|
|
357
460
|
|
|
358
461
|
return bool(re.match(pattern, agent_name))
|
|
359
462
|
|
|
463
|
+
def _is_mpm_agent_with_config(
|
|
464
|
+
self, template_file: Path, config: Optional[Config] = None
|
|
465
|
+
) -> bool:
|
|
466
|
+
"""Check if agent is authored by Claude MPM team with configurable patterns.
|
|
467
|
+
|
|
468
|
+
MPM agents must have:
|
|
469
|
+
- An author field containing configurable MPM patterns (default: 'claude mpm', 'claude-mpm', 'anthropic')
|
|
470
|
+
- A valid version field
|
|
471
|
+
|
|
472
|
+
Args:
|
|
473
|
+
template_file: Path to the agent template markdown file
|
|
474
|
+
config: Configuration object for MPM patterns
|
|
475
|
+
|
|
476
|
+
Returns:
|
|
477
|
+
True if this is an MPM agent, False otherwise
|
|
478
|
+
"""
|
|
479
|
+
try:
|
|
480
|
+
# Extract YAML frontmatter
|
|
481
|
+
content = template_file.read_text()
|
|
482
|
+
frontmatter = self._extract_yaml_frontmatter(content)
|
|
483
|
+
if not frontmatter:
|
|
484
|
+
return False
|
|
485
|
+
|
|
486
|
+
# Get MPM author patterns from config
|
|
487
|
+
if config:
|
|
488
|
+
mpm_patterns = config.get(
|
|
489
|
+
"agent_deployment.mpm_author_patterns",
|
|
490
|
+
["claude mpm", "claude-mpm", "anthropic"],
|
|
491
|
+
)
|
|
492
|
+
else:
|
|
493
|
+
mpm_patterns = ["claude mpm", "claude-mpm", "anthropic"]
|
|
494
|
+
|
|
495
|
+
# Check for author field
|
|
496
|
+
author = frontmatter.get("author", "").lower()
|
|
497
|
+
has_valid_author = any(
|
|
498
|
+
pattern.lower() in author for pattern in mpm_patterns
|
|
499
|
+
)
|
|
500
|
+
|
|
501
|
+
# Check for version field
|
|
502
|
+
has_version = bool(frontmatter.get("version"))
|
|
503
|
+
|
|
504
|
+
return has_valid_author and has_version
|
|
505
|
+
|
|
506
|
+
except Exception as e:
|
|
507
|
+
self.logger.debug(f"Error checking if {template_file} is MPM agent: {e}")
|
|
508
|
+
return False # Treat invalid templates as non-MPM
|
|
509
|
+
|
|
360
510
|
def get_discovery_stats(self) -> Dict[str, Any]:
|
|
361
511
|
"""
|
|
362
512
|
Get statistics about agent discovery.
|
|
@@ -376,8 +526,8 @@ class AgentDiscoveryService:
|
|
|
376
526
|
if not self.templates_dir.exists():
|
|
377
527
|
return stats
|
|
378
528
|
|
|
379
|
-
# Count template files
|
|
380
|
-
template_files = list(self.templates_dir.glob("*.
|
|
529
|
+
# Count markdown template files
|
|
530
|
+
template_files = list(self.templates_dir.glob("*.md"))
|
|
381
531
|
stats["total_templates"] = len(template_files)
|
|
382
532
|
|
|
383
533
|
# Validate each template
|
|
@@ -183,9 +183,9 @@ class AgentFileSystemManager:
|
|
|
183
183
|
try:
|
|
184
184
|
# Generate backup directory name if not provided
|
|
185
185
|
if not backup_dir:
|
|
186
|
-
import datetime
|
|
186
|
+
from datetime import datetime, timezone
|
|
187
187
|
|
|
188
|
-
timestamp = datetime.
|
|
188
|
+
timestamp = datetime.now(timezone.utc).strftime("%Y%m%d_%H%M%S")
|
|
189
189
|
backup_dir = agents_dir.parent / f"agents_backup_{timestamp}"
|
|
190
190
|
|
|
191
191
|
# Create backup
|
|
@@ -324,7 +324,7 @@ class AgentFileSystemManager:
|
|
|
324
324
|
|
|
325
325
|
def _convert_yaml_to_markdown(self, yaml_content: str, agent_name: str) -> str:
|
|
326
326
|
"""Convert YAML agent content to Markdown format with frontmatter."""
|
|
327
|
-
from datetime import datetime
|
|
327
|
+
from datetime import datetime, timezone
|
|
328
328
|
|
|
329
329
|
# Extract YAML fields (simplified parsing)
|
|
330
330
|
name = self._extract_yaml_field(yaml_content, "name") or agent_name
|
|
@@ -356,8 +356,8 @@ name: {name}
|
|
|
356
356
|
description: "{description}"
|
|
357
357
|
version: "{version}"
|
|
358
358
|
author: "claude-mpm@anthropic.com"
|
|
359
|
-
created: "{datetime.now().isoformat()}Z"
|
|
360
|
-
updated: "{datetime.now().isoformat()}Z"
|
|
359
|
+
created: "{datetime.now(timezone.utc).isoformat()}Z"
|
|
360
|
+
updated: "{datetime.now(timezone.utc).isoformat()}Z"
|
|
361
361
|
tags: ["{agent_name}", "mpm-framework"]
|
|
362
362
|
tools: {tools_list}
|
|
363
363
|
model: "sonnet"
|