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,784 @@
|
|
|
1
|
+
"""Local Agent Template Manager for Claude MPM.
|
|
2
|
+
|
|
3
|
+
This module provides comprehensive support for managing local agent templates
|
|
4
|
+
stored in project and user directories. It handles JSON template discovery,
|
|
5
|
+
validation, deployment, and versioning with proper priority handling.
|
|
6
|
+
|
|
7
|
+
Key Features:
|
|
8
|
+
- Local JSON template discovery in .claude-mpm/agents/
|
|
9
|
+
- Project-specific agent templates with project name as author
|
|
10
|
+
- Custom versioning for local agents
|
|
11
|
+
- Template inheritance from system agents
|
|
12
|
+
- Hot-reload support during development
|
|
13
|
+
- Proper priority handling (PROJECT > USER > SYSTEM)
|
|
14
|
+
"""
|
|
15
|
+
|
|
16
|
+
import json
|
|
17
|
+
from dataclasses import dataclass
|
|
18
|
+
from datetime import datetime, timezone
|
|
19
|
+
from pathlib import Path
|
|
20
|
+
from typing import Any, Dict, List, Optional, Tuple, Union
|
|
21
|
+
|
|
22
|
+
import yaml
|
|
23
|
+
|
|
24
|
+
from claude_mpm.core.logging_config import get_logger
|
|
25
|
+
from claude_mpm.core.unified_paths import get_path_manager
|
|
26
|
+
|
|
27
|
+
logger = get_logger(__name__)
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
@dataclass
|
|
31
|
+
class LocalAgentTemplate:
|
|
32
|
+
"""Model for local agent templates with project-specific metadata."""
|
|
33
|
+
|
|
34
|
+
schema_version: str = "1.3.0"
|
|
35
|
+
agent_id: str = ""
|
|
36
|
+
agent_version: str = "1.0.0"
|
|
37
|
+
author: str = "" # Will be project name for local agents
|
|
38
|
+
agent_type: str = "" # Backwards compatibility field
|
|
39
|
+
|
|
40
|
+
metadata: Dict[str, Any] = None
|
|
41
|
+
capabilities: Dict[str, Any] = None
|
|
42
|
+
instructions: str = ""
|
|
43
|
+
configuration: Dict[str, Any] = None
|
|
44
|
+
|
|
45
|
+
# Local-specific fields
|
|
46
|
+
tier: str = "project"
|
|
47
|
+
priority: int = 1000 # Higher priority for local agents
|
|
48
|
+
is_local: bool = True
|
|
49
|
+
parent_agent: Optional[str] = None # For inheritance from system agents
|
|
50
|
+
created_at: Optional[str] = None
|
|
51
|
+
updated_at: Optional[str] = None
|
|
52
|
+
|
|
53
|
+
def __post_init__(self):
|
|
54
|
+
"""Initialize default values."""
|
|
55
|
+
if self.metadata is None:
|
|
56
|
+
self.metadata = {}
|
|
57
|
+
if self.capabilities is None:
|
|
58
|
+
self.capabilities = {"model": "sonnet", "tools": "*"}
|
|
59
|
+
if self.configuration is None:
|
|
60
|
+
self.configuration = {}
|
|
61
|
+
if self.created_at is None:
|
|
62
|
+
self.created_at = datetime.now(timezone.utc).isoformat()
|
|
63
|
+
if self.updated_at is None:
|
|
64
|
+
self.updated_at = datetime.now(timezone.utc).isoformat()
|
|
65
|
+
|
|
66
|
+
# Ensure metadata has required fields
|
|
67
|
+
if "name" not in self.metadata:
|
|
68
|
+
self.metadata["name"] = self.agent_id.replace("_", " ").title()
|
|
69
|
+
if "description" not in self.metadata:
|
|
70
|
+
self.metadata["description"] = f"Local {self.agent_id} agent"
|
|
71
|
+
if "tier" not in self.metadata:
|
|
72
|
+
self.metadata["tier"] = self.tier
|
|
73
|
+
if "tags" not in self.metadata:
|
|
74
|
+
self.metadata["tags"] = ["local", "custom"]
|
|
75
|
+
|
|
76
|
+
def to_json(self) -> Dict[str, Any]:
|
|
77
|
+
"""Convert to JSON-serializable dictionary."""
|
|
78
|
+
data = {
|
|
79
|
+
"schema_version": self.schema_version,
|
|
80
|
+
"agent_id": self.agent_id,
|
|
81
|
+
"agent_version": self.agent_version,
|
|
82
|
+
"author": self.author,
|
|
83
|
+
"agent_type": self.agent_type or self.agent_id,
|
|
84
|
+
"metadata": self.metadata,
|
|
85
|
+
"capabilities": self.capabilities,
|
|
86
|
+
"instructions": self.instructions,
|
|
87
|
+
"configuration": self.configuration,
|
|
88
|
+
"priority": self.priority,
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
# Add optional fields if present
|
|
92
|
+
if self.parent_agent:
|
|
93
|
+
data["parent_agent"] = self.parent_agent
|
|
94
|
+
if self.created_at:
|
|
95
|
+
data["created_at"] = self.created_at
|
|
96
|
+
if self.updated_at:
|
|
97
|
+
data["updated_at"] = self.updated_at
|
|
98
|
+
|
|
99
|
+
return data
|
|
100
|
+
|
|
101
|
+
@classmethod
|
|
102
|
+
def from_json(cls, data: Dict[str, Any]) -> "LocalAgentTemplate":
|
|
103
|
+
"""Create from JSON dictionary."""
|
|
104
|
+
return cls(
|
|
105
|
+
schema_version=data.get("schema_version", "1.3.0"),
|
|
106
|
+
agent_id=data.get("agent_id", ""),
|
|
107
|
+
agent_version=data.get("agent_version", "1.0.0"),
|
|
108
|
+
author=data.get("author", ""),
|
|
109
|
+
agent_type=data.get("agent_type", ""),
|
|
110
|
+
metadata=data.get("metadata", {}),
|
|
111
|
+
capabilities=data.get("capabilities", {}),
|
|
112
|
+
instructions=data.get("instructions", ""),
|
|
113
|
+
configuration=data.get("configuration", {}),
|
|
114
|
+
tier=data.get("metadata", {}).get("tier", "project"),
|
|
115
|
+
priority=data.get("priority", 1000),
|
|
116
|
+
parent_agent=data.get("parent_agent"),
|
|
117
|
+
created_at=data.get("created_at"),
|
|
118
|
+
updated_at=data.get("updated_at"),
|
|
119
|
+
)
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
class LocalAgentTemplateManager:
|
|
123
|
+
"""Manager for local agent templates in project and user directories."""
|
|
124
|
+
|
|
125
|
+
def __init__(self, working_directory: Optional[Path] = None):
|
|
126
|
+
"""Initialize the local template manager.
|
|
127
|
+
|
|
128
|
+
Args:
|
|
129
|
+
working_directory: Working directory for project-level agents
|
|
130
|
+
"""
|
|
131
|
+
self.path_manager = get_path_manager()
|
|
132
|
+
self.working_directory = working_directory or Path.cwd()
|
|
133
|
+
|
|
134
|
+
# Define local agent directories
|
|
135
|
+
self.project_agents_dir = self.working_directory / ".claude-mpm" / "agents"
|
|
136
|
+
self.user_agents_dir = Path.home() / ".claude-mpm" / "agents"
|
|
137
|
+
|
|
138
|
+
# Cache for discovered templates
|
|
139
|
+
self._template_cache: Dict[str, LocalAgentTemplate] = {}
|
|
140
|
+
self._cache_valid = False
|
|
141
|
+
|
|
142
|
+
logger.info(
|
|
143
|
+
f"LocalAgentTemplateManager initialized for project: {self.working_directory}"
|
|
144
|
+
)
|
|
145
|
+
|
|
146
|
+
def get_project_name(self) -> str:
|
|
147
|
+
"""Get the current project name for use as author field.
|
|
148
|
+
|
|
149
|
+
Returns:
|
|
150
|
+
Project directory name or 'local-project' as fallback
|
|
151
|
+
"""
|
|
152
|
+
try:
|
|
153
|
+
# Use the project directory name
|
|
154
|
+
project_name = self.working_directory.name
|
|
155
|
+
if project_name and project_name != "/":
|
|
156
|
+
return project_name
|
|
157
|
+
except Exception as e:
|
|
158
|
+
logger.warning(f"Failed to get project name: {e}")
|
|
159
|
+
|
|
160
|
+
return "local-project"
|
|
161
|
+
|
|
162
|
+
def discover_local_templates(
|
|
163
|
+
self, force_refresh: bool = False
|
|
164
|
+
) -> Dict[str, LocalAgentTemplate]:
|
|
165
|
+
"""Discover all local agent templates.
|
|
166
|
+
|
|
167
|
+
Args:
|
|
168
|
+
force_refresh: Force re-discovery even if cache is valid
|
|
169
|
+
|
|
170
|
+
Returns:
|
|
171
|
+
Dictionary mapping agent IDs to LocalAgentTemplate objects
|
|
172
|
+
"""
|
|
173
|
+
if self._cache_valid and not force_refresh:
|
|
174
|
+
return self._template_cache
|
|
175
|
+
|
|
176
|
+
self._template_cache.clear()
|
|
177
|
+
|
|
178
|
+
# Discover from project directory (highest priority)
|
|
179
|
+
if self.project_agents_dir.exists():
|
|
180
|
+
self._discover_templates_in_dir(self.project_agents_dir, "project")
|
|
181
|
+
|
|
182
|
+
# Discover from user directory
|
|
183
|
+
if self.user_agents_dir.exists():
|
|
184
|
+
self._discover_templates_in_dir(self.user_agents_dir, "user")
|
|
185
|
+
|
|
186
|
+
self._cache_valid = True
|
|
187
|
+
logger.debug(f"Discovered {len(self._template_cache)} local agent templates")
|
|
188
|
+
|
|
189
|
+
return self._template_cache
|
|
190
|
+
|
|
191
|
+
def _discover_templates_in_dir(self, directory: Path, tier: str) -> None:
|
|
192
|
+
"""Discover templates in a specific directory.
|
|
193
|
+
|
|
194
|
+
Args:
|
|
195
|
+
directory: Directory to search for templates
|
|
196
|
+
tier: Tier level ('project' or 'user')
|
|
197
|
+
"""
|
|
198
|
+
# Agent templates migrated to Markdown with YAML frontmatter (v4.26.0+)
|
|
199
|
+
for template_file in directory.glob("*.md"):
|
|
200
|
+
try:
|
|
201
|
+
# Read markdown content and extract YAML frontmatter
|
|
202
|
+
content = template_file.read_text()
|
|
203
|
+
frontmatter = self._extract_yaml_frontmatter(content)
|
|
204
|
+
if not frontmatter:
|
|
205
|
+
logger.warning(f"No YAML frontmatter in {template_file.name}")
|
|
206
|
+
continue
|
|
207
|
+
data = frontmatter
|
|
208
|
+
|
|
209
|
+
# Create LocalAgentTemplate
|
|
210
|
+
template = LocalAgentTemplate.from_json(data)
|
|
211
|
+
|
|
212
|
+
# Set tier and author based on location
|
|
213
|
+
template.tier = tier
|
|
214
|
+
if tier == "project" and not template.author:
|
|
215
|
+
template.author = self.get_project_name()
|
|
216
|
+
elif tier == "user" and not template.author:
|
|
217
|
+
template.author = Path.home().name
|
|
218
|
+
|
|
219
|
+
# Use higher priority for project agents
|
|
220
|
+
if tier == "project":
|
|
221
|
+
template.priority = 2000
|
|
222
|
+
else:
|
|
223
|
+
template.priority = 1500
|
|
224
|
+
|
|
225
|
+
# Store in cache (project templates override user templates)
|
|
226
|
+
agent_id = template.agent_id or template_file.stem
|
|
227
|
+
if agent_id not in self._template_cache or tier == "project":
|
|
228
|
+
self._template_cache[agent_id] = template
|
|
229
|
+
logger.debug(f"Discovered {tier} agent template: {agent_id}")
|
|
230
|
+
|
|
231
|
+
except Exception as e:
|
|
232
|
+
logger.error(f"Failed to load template from {template_file}: {e}")
|
|
233
|
+
|
|
234
|
+
def _extract_yaml_frontmatter(self, content: str) -> Optional[Dict[str, Any]]:
|
|
235
|
+
"""
|
|
236
|
+
Extract and parse YAML frontmatter from markdown content.
|
|
237
|
+
|
|
238
|
+
Args:
|
|
239
|
+
content: File content to parse
|
|
240
|
+
|
|
241
|
+
Returns:
|
|
242
|
+
Parsed YAML frontmatter as dict, or None if not found/invalid
|
|
243
|
+
"""
|
|
244
|
+
if not content.strip().startswith("---"):
|
|
245
|
+
return None
|
|
246
|
+
|
|
247
|
+
# Split on --- delimiters
|
|
248
|
+
parts = content.split("---", 2)
|
|
249
|
+
if len(parts) < 3:
|
|
250
|
+
return None
|
|
251
|
+
|
|
252
|
+
try:
|
|
253
|
+
return yaml.safe_load(parts[1])
|
|
254
|
+
except yaml.YAMLError as e:
|
|
255
|
+
logger.warning(f"Failed to parse YAML frontmatter: {e}")
|
|
256
|
+
return None
|
|
257
|
+
|
|
258
|
+
def create_local_template(
|
|
259
|
+
self,
|
|
260
|
+
agent_id: str,
|
|
261
|
+
name: str,
|
|
262
|
+
description: str,
|
|
263
|
+
instructions: str,
|
|
264
|
+
model: str = "sonnet",
|
|
265
|
+
tools: Union[str, List[str]] = "*",
|
|
266
|
+
parent_agent: Optional[str] = None,
|
|
267
|
+
tier: str = "project",
|
|
268
|
+
) -> LocalAgentTemplate:
|
|
269
|
+
"""Create a new local agent template.
|
|
270
|
+
|
|
271
|
+
Args:
|
|
272
|
+
agent_id: Unique identifier for the agent
|
|
273
|
+
name: Human-readable name
|
|
274
|
+
description: Agent description
|
|
275
|
+
instructions: Agent instructions
|
|
276
|
+
model: Model to use (default: sonnet)
|
|
277
|
+
tools: Tools available to agent (default: all)
|
|
278
|
+
parent_agent: Optional parent agent to inherit from
|
|
279
|
+
tier: Tier level ('project' or 'user')
|
|
280
|
+
|
|
281
|
+
Returns:
|
|
282
|
+
Created LocalAgentTemplate object
|
|
283
|
+
"""
|
|
284
|
+
# Determine author based on tier
|
|
285
|
+
author = self.get_project_name() if tier == "project" else Path.home().name
|
|
286
|
+
|
|
287
|
+
# Create template
|
|
288
|
+
return LocalAgentTemplate(
|
|
289
|
+
agent_id=agent_id,
|
|
290
|
+
agent_version="1.0.0",
|
|
291
|
+
author=author,
|
|
292
|
+
agent_type=agent_id,
|
|
293
|
+
metadata={
|
|
294
|
+
"name": name,
|
|
295
|
+
"description": description,
|
|
296
|
+
"tier": tier,
|
|
297
|
+
"tags": ["local", "custom", tier],
|
|
298
|
+
"specializations": [],
|
|
299
|
+
},
|
|
300
|
+
capabilities={
|
|
301
|
+
"model": model,
|
|
302
|
+
"tools": (
|
|
303
|
+
tools
|
|
304
|
+
if isinstance(tools, str)
|
|
305
|
+
else ",".join(tools)
|
|
306
|
+
if tools
|
|
307
|
+
else "*"
|
|
308
|
+
),
|
|
309
|
+
},
|
|
310
|
+
instructions=instructions,
|
|
311
|
+
configuration={"temperature": 0.7, "max_tokens": 4096},
|
|
312
|
+
tier=tier,
|
|
313
|
+
priority=2000 if tier == "project" else 1500,
|
|
314
|
+
parent_agent=parent_agent,
|
|
315
|
+
)
|
|
316
|
+
|
|
317
|
+
def save_local_template(
|
|
318
|
+
self, template: LocalAgentTemplate, tier: Optional[str] = None
|
|
319
|
+
) -> Path:
|
|
320
|
+
"""Save a local agent template to disk.
|
|
321
|
+
|
|
322
|
+
Args:
|
|
323
|
+
template: Template to save
|
|
324
|
+
tier: Override tier (uses template.tier if not specified)
|
|
325
|
+
|
|
326
|
+
Returns:
|
|
327
|
+
Path to saved template file
|
|
328
|
+
"""
|
|
329
|
+
# Determine target directory
|
|
330
|
+
tier = tier or template.tier
|
|
331
|
+
if tier == "project":
|
|
332
|
+
target_dir = self.project_agents_dir
|
|
333
|
+
else:
|
|
334
|
+
target_dir = self.user_agents_dir
|
|
335
|
+
|
|
336
|
+
# Create directory if needed
|
|
337
|
+
target_dir.mkdir(parents=True, exist_ok=True)
|
|
338
|
+
|
|
339
|
+
# Update timestamp
|
|
340
|
+
template.updated_at = datetime.now(timezone.utc).isoformat()
|
|
341
|
+
|
|
342
|
+
# Save to JSON file
|
|
343
|
+
template_file = target_dir / f"{template.agent_id}.json"
|
|
344
|
+
with template_file.open("w") as f:
|
|
345
|
+
json.dump(template.to_json(), f, indent=2)
|
|
346
|
+
|
|
347
|
+
# Invalidate cache
|
|
348
|
+
self._cache_valid = False
|
|
349
|
+
|
|
350
|
+
logger.info(f"Saved local agent template: {template_file}")
|
|
351
|
+
return template_file
|
|
352
|
+
|
|
353
|
+
def delete_local_template(
|
|
354
|
+
self,
|
|
355
|
+
agent_id: str,
|
|
356
|
+
tier: str = "project",
|
|
357
|
+
delete_deployment: bool = True,
|
|
358
|
+
backup_first: bool = False,
|
|
359
|
+
) -> Dict[str, Any]:
|
|
360
|
+
"""Delete a local agent template with comprehensive options.
|
|
361
|
+
|
|
362
|
+
Args:
|
|
363
|
+
agent_id: The agent ID to delete
|
|
364
|
+
tier: The tier (project/user/all) to delete from
|
|
365
|
+
delete_deployment: Also delete from .claude/agents/
|
|
366
|
+
backup_first: Create backup before deletion
|
|
367
|
+
|
|
368
|
+
Returns:
|
|
369
|
+
Dict with status, deleted files, backup location (if applicable)
|
|
370
|
+
"""
|
|
371
|
+
result = {
|
|
372
|
+
"success": False,
|
|
373
|
+
"deleted_files": [],
|
|
374
|
+
"errors": [],
|
|
375
|
+
"backup_location": None,
|
|
376
|
+
"agent_id": agent_id,
|
|
377
|
+
"tier": tier,
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
# Check if this is a system agent (protected)
|
|
381
|
+
system_agents = [
|
|
382
|
+
"orchestrator",
|
|
383
|
+
"engineer",
|
|
384
|
+
"architecture",
|
|
385
|
+
"documentation",
|
|
386
|
+
"qa",
|
|
387
|
+
"research",
|
|
388
|
+
"ops",
|
|
389
|
+
"security",
|
|
390
|
+
"data_engineer",
|
|
391
|
+
"version_control",
|
|
392
|
+
"pm",
|
|
393
|
+
"project-manager",
|
|
394
|
+
"claude-mpm",
|
|
395
|
+
]
|
|
396
|
+
if agent_id in system_agents:
|
|
397
|
+
result["errors"].append(f"Cannot delete system agent: {agent_id}")
|
|
398
|
+
return result
|
|
399
|
+
|
|
400
|
+
# Determine which directories to check based on tier
|
|
401
|
+
dirs_to_check = []
|
|
402
|
+
if tier in ["project", "all"]:
|
|
403
|
+
dirs_to_check.append(("project", self.project_agents_dir))
|
|
404
|
+
if tier in ["user", "all"]:
|
|
405
|
+
dirs_to_check.append(("user", self.user_agents_dir))
|
|
406
|
+
|
|
407
|
+
# Track files to delete
|
|
408
|
+
files_to_delete = []
|
|
409
|
+
|
|
410
|
+
# Find template files (templates migrated to .md in v4.26.0+)
|
|
411
|
+
for tier_name, agent_dir in dirs_to_check:
|
|
412
|
+
template_file = agent_dir / f"{agent_id}.md"
|
|
413
|
+
if template_file.exists():
|
|
414
|
+
files_to_delete.append((tier_name, "template", template_file))
|
|
415
|
+
|
|
416
|
+
# Check for version history
|
|
417
|
+
versions_dir = agent_dir / "versions" / agent_id
|
|
418
|
+
if versions_dir.exists():
|
|
419
|
+
for version_file in versions_dir.glob("*.md"):
|
|
420
|
+
files_to_delete.append((tier_name, "version", version_file))
|
|
421
|
+
files_to_delete.append((tier_name, "versions_dir", versions_dir))
|
|
422
|
+
|
|
423
|
+
# Check for deployment
|
|
424
|
+
if delete_deployment:
|
|
425
|
+
deployment_file = (
|
|
426
|
+
self.working_directory / ".claude" / "agents" / f"{agent_id}.md"
|
|
427
|
+
)
|
|
428
|
+
if deployment_file.exists():
|
|
429
|
+
files_to_delete.append(("deployment", "agent", deployment_file))
|
|
430
|
+
|
|
431
|
+
# If no files found, return early
|
|
432
|
+
if not files_to_delete:
|
|
433
|
+
result["errors"].append(f"Agent '{agent_id}' not found in {tier} tier(s)")
|
|
434
|
+
return result
|
|
435
|
+
|
|
436
|
+
# Create backup if requested
|
|
437
|
+
if backup_first:
|
|
438
|
+
backup_result = self._create_deletion_backup(agent_id, files_to_delete)
|
|
439
|
+
if backup_result["success"]:
|
|
440
|
+
result["backup_location"] = backup_result["location"]
|
|
441
|
+
else:
|
|
442
|
+
result["errors"].append(f"Backup failed: {backup_result['error']}")
|
|
443
|
+
return result
|
|
444
|
+
|
|
445
|
+
# Perform deletion
|
|
446
|
+
for tier_name, file_type, file_path in files_to_delete:
|
|
447
|
+
try:
|
|
448
|
+
if file_type == "versions_dir":
|
|
449
|
+
# Remove empty directory
|
|
450
|
+
if file_path.is_dir() and not any(file_path.iterdir()):
|
|
451
|
+
file_path.rmdir()
|
|
452
|
+
result["deleted_files"].append(str(file_path))
|
|
453
|
+
logger.debug(f"Removed empty directory: {file_path}")
|
|
454
|
+
else:
|
|
455
|
+
file_path.unlink()
|
|
456
|
+
result["deleted_files"].append(str(file_path))
|
|
457
|
+
logger.info(f"Deleted {tier_name} {file_type}: {file_path.name}")
|
|
458
|
+
except Exception as e:
|
|
459
|
+
error_msg = f"Failed to delete {file_path}: {e}"
|
|
460
|
+
result["errors"].append(error_msg)
|
|
461
|
+
logger.error(error_msg)
|
|
462
|
+
|
|
463
|
+
# Invalidate cache if any deletions succeeded
|
|
464
|
+
if result["deleted_files"]:
|
|
465
|
+
self._cache_valid = False
|
|
466
|
+
result["success"] = True
|
|
467
|
+
logger.info(
|
|
468
|
+
f"Successfully deleted agent '{agent_id}' - removed {len(result['deleted_files'])} file(s)"
|
|
469
|
+
)
|
|
470
|
+
|
|
471
|
+
return result
|
|
472
|
+
|
|
473
|
+
def _create_deletion_backup(
|
|
474
|
+
self, agent_id: str, files_to_delete: List[Tuple[str, str, Path]]
|
|
475
|
+
) -> Dict[str, Any]:
|
|
476
|
+
"""Create a backup of files before deletion.
|
|
477
|
+
|
|
478
|
+
Args:
|
|
479
|
+
agent_id: Agent being deleted
|
|
480
|
+
files_to_delete: List of (tier, type, path) tuples
|
|
481
|
+
|
|
482
|
+
Returns:
|
|
483
|
+
Dict with success status and backup location or error
|
|
484
|
+
"""
|
|
485
|
+
import shutil
|
|
486
|
+
from datetime import datetime
|
|
487
|
+
|
|
488
|
+
result = {"success": False, "location": None, "error": None}
|
|
489
|
+
|
|
490
|
+
try:
|
|
491
|
+
# Create backup directory
|
|
492
|
+
timestamp = datetime.now(timezone.utc).strftime("%Y%m%d_%H%M%S")
|
|
493
|
+
backup_dir = (
|
|
494
|
+
self.working_directory
|
|
495
|
+
/ ".claude-mpm"
|
|
496
|
+
/ "backups"
|
|
497
|
+
/ f"{agent_id}_{timestamp}"
|
|
498
|
+
)
|
|
499
|
+
backup_dir.mkdir(parents=True, exist_ok=True)
|
|
500
|
+
|
|
501
|
+
# Copy files to backup
|
|
502
|
+
for tier_name, file_type, file_path in files_to_delete:
|
|
503
|
+
if file_path.exists() and file_type != "versions_dir":
|
|
504
|
+
# Create subdirectory structure in backup
|
|
505
|
+
backup_subdir = backup_dir / tier_name
|
|
506
|
+
backup_subdir.mkdir(exist_ok=True)
|
|
507
|
+
|
|
508
|
+
if file_path.is_file():
|
|
509
|
+
backup_file = backup_subdir / file_path.name
|
|
510
|
+
shutil.copy2(file_path, backup_file)
|
|
511
|
+
logger.debug(f"Backed up {file_path} to {backup_file}")
|
|
512
|
+
|
|
513
|
+
result["success"] = True
|
|
514
|
+
result["location"] = str(backup_dir)
|
|
515
|
+
logger.info(f"Created backup for agent '{agent_id}' at {backup_dir}")
|
|
516
|
+
|
|
517
|
+
except Exception as e:
|
|
518
|
+
result["error"] = str(e)
|
|
519
|
+
logger.error(f"Failed to create backup for '{agent_id}': {e}")
|
|
520
|
+
|
|
521
|
+
return result
|
|
522
|
+
|
|
523
|
+
def delete_multiple_templates(
|
|
524
|
+
self,
|
|
525
|
+
agent_ids: List[str],
|
|
526
|
+
tier: str = "project",
|
|
527
|
+
delete_deployment: bool = True,
|
|
528
|
+
backup_first: bool = False,
|
|
529
|
+
) -> Dict[str, Any]:
|
|
530
|
+
"""Delete multiple local agent templates.
|
|
531
|
+
|
|
532
|
+
Args:
|
|
533
|
+
agent_ids: List of agent IDs to delete
|
|
534
|
+
tier: The tier (project/user/all) to delete from
|
|
535
|
+
delete_deployment: Also delete from .claude/agents/
|
|
536
|
+
backup_first: Create backup before deletion
|
|
537
|
+
|
|
538
|
+
Returns:
|
|
539
|
+
Dict with results for each agent
|
|
540
|
+
"""
|
|
541
|
+
results = {
|
|
542
|
+
"successful": [],
|
|
543
|
+
"failed": [],
|
|
544
|
+
"total": len(agent_ids),
|
|
545
|
+
"details": {},
|
|
546
|
+
}
|
|
547
|
+
|
|
548
|
+
for agent_id in agent_ids:
|
|
549
|
+
result = self.delete_local_template(
|
|
550
|
+
agent_id=agent_id,
|
|
551
|
+
tier=tier,
|
|
552
|
+
delete_deployment=delete_deployment,
|
|
553
|
+
backup_first=backup_first,
|
|
554
|
+
)
|
|
555
|
+
|
|
556
|
+
results["details"][agent_id] = result
|
|
557
|
+
|
|
558
|
+
if result["success"]:
|
|
559
|
+
results["successful"].append(agent_id)
|
|
560
|
+
else:
|
|
561
|
+
results["failed"].append(agent_id)
|
|
562
|
+
|
|
563
|
+
logger.info(
|
|
564
|
+
f"Bulk deletion complete: {len(results['successful'])} successful, "
|
|
565
|
+
f"{len(results['failed'])} failed"
|
|
566
|
+
)
|
|
567
|
+
|
|
568
|
+
return results
|
|
569
|
+
|
|
570
|
+
def get_local_template(self, agent_id: str) -> Optional[LocalAgentTemplate]:
|
|
571
|
+
"""Get a specific local agent template.
|
|
572
|
+
|
|
573
|
+
Args:
|
|
574
|
+
agent_id: ID of agent to retrieve
|
|
575
|
+
|
|
576
|
+
Returns:
|
|
577
|
+
LocalAgentTemplate if found, None otherwise
|
|
578
|
+
"""
|
|
579
|
+
templates = self.discover_local_templates()
|
|
580
|
+
return templates.get(agent_id)
|
|
581
|
+
|
|
582
|
+
def list_local_templates(
|
|
583
|
+
self, tier: Optional[str] = None
|
|
584
|
+
) -> List[LocalAgentTemplate]:
|
|
585
|
+
"""List all local agent templates.
|
|
586
|
+
|
|
587
|
+
Args:
|
|
588
|
+
tier: Filter by tier ('project' or 'user'), None for all
|
|
589
|
+
|
|
590
|
+
Returns:
|
|
591
|
+
List of LocalAgentTemplate objects
|
|
592
|
+
"""
|
|
593
|
+
templates = self.discover_local_templates()
|
|
594
|
+
|
|
595
|
+
if tier:
|
|
596
|
+
return [t for t in templates.values() if t.tier == tier]
|
|
597
|
+
return list(templates.values())
|
|
598
|
+
|
|
599
|
+
def inherit_from_system_agent(
|
|
600
|
+
self, system_agent_id: str, new_agent_id: str, modifications: Dict[str, Any]
|
|
601
|
+
) -> LocalAgentTemplate:
|
|
602
|
+
"""Create a local agent by inheriting from a system agent.
|
|
603
|
+
|
|
604
|
+
Args:
|
|
605
|
+
system_agent_id: ID of system agent to inherit from
|
|
606
|
+
new_agent_id: ID for the new local agent
|
|
607
|
+
modifications: Dictionary of modifications to apply
|
|
608
|
+
|
|
609
|
+
Returns:
|
|
610
|
+
Created LocalAgentTemplate object
|
|
611
|
+
"""
|
|
612
|
+
# TODO: Load system agent template and merge with modifications
|
|
613
|
+
# For now, create a basic template with parent reference
|
|
614
|
+
|
|
615
|
+
template = self.create_local_template(
|
|
616
|
+
agent_id=new_agent_id,
|
|
617
|
+
name=modifications.get("name", f"Custom {system_agent_id}"),
|
|
618
|
+
description=modifications.get(
|
|
619
|
+
"description", f"Customized version of {system_agent_id}"
|
|
620
|
+
),
|
|
621
|
+
instructions=modifications.get(
|
|
622
|
+
"instructions", f"Based on {system_agent_id} agent"
|
|
623
|
+
),
|
|
624
|
+
model=modifications.get("model", "sonnet"),
|
|
625
|
+
tools=modifications.get("tools", "*"),
|
|
626
|
+
parent_agent=system_agent_id,
|
|
627
|
+
tier="project",
|
|
628
|
+
)
|
|
629
|
+
|
|
630
|
+
# Apply any additional modifications
|
|
631
|
+
if "metadata" in modifications:
|
|
632
|
+
template.metadata.update(modifications["metadata"])
|
|
633
|
+
if "capabilities" in modifications:
|
|
634
|
+
template.capabilities.update(modifications["capabilities"])
|
|
635
|
+
if "configuration" in modifications:
|
|
636
|
+
template.configuration.update(modifications["configuration"])
|
|
637
|
+
|
|
638
|
+
return template
|
|
639
|
+
|
|
640
|
+
def version_local_template(self, agent_id: str, new_version: str) -> Optional[Path]:
|
|
641
|
+
"""Create a versioned copy of a local agent template.
|
|
642
|
+
|
|
643
|
+
Args:
|
|
644
|
+
agent_id: ID of agent to version
|
|
645
|
+
new_version: New version string
|
|
646
|
+
|
|
647
|
+
Returns:
|
|
648
|
+
Path to versioned template file if successful
|
|
649
|
+
"""
|
|
650
|
+
template = self.get_local_template(agent_id)
|
|
651
|
+
if not template:
|
|
652
|
+
logger.error(f"Local agent template not found: {agent_id}")
|
|
653
|
+
return None
|
|
654
|
+
|
|
655
|
+
# Create versions directory
|
|
656
|
+
if template.tier == "project":
|
|
657
|
+
versions_dir = self.project_agents_dir / "versions" / agent_id
|
|
658
|
+
else:
|
|
659
|
+
versions_dir = self.user_agents_dir / "versions" / agent_id
|
|
660
|
+
|
|
661
|
+
versions_dir.mkdir(parents=True, exist_ok=True)
|
|
662
|
+
|
|
663
|
+
# Save current version
|
|
664
|
+
old_version_file = versions_dir / f"{template.agent_version}.json"
|
|
665
|
+
with old_version_file.open("w") as f:
|
|
666
|
+
json.dump(template.to_json(), f, indent=2)
|
|
667
|
+
|
|
668
|
+
# Update template version
|
|
669
|
+
template.agent_version = new_version
|
|
670
|
+
template.updated_at = datetime.now(timezone.utc).isoformat()
|
|
671
|
+
|
|
672
|
+
# Save updated template
|
|
673
|
+
self.save_local_template(template)
|
|
674
|
+
|
|
675
|
+
logger.info(
|
|
676
|
+
f"Versioned local agent {agent_id}: {template.agent_version} -> {new_version}"
|
|
677
|
+
)
|
|
678
|
+
return old_version_file
|
|
679
|
+
|
|
680
|
+
def validate_local_template(
|
|
681
|
+
self, template: LocalAgentTemplate
|
|
682
|
+
) -> Tuple[bool, List[str]]:
|
|
683
|
+
"""Validate a local agent template.
|
|
684
|
+
|
|
685
|
+
Args:
|
|
686
|
+
template: Template to validate
|
|
687
|
+
|
|
688
|
+
Returns:
|
|
689
|
+
Tuple of (is_valid, list_of_errors)
|
|
690
|
+
"""
|
|
691
|
+
errors = []
|
|
692
|
+
|
|
693
|
+
# Check required fields
|
|
694
|
+
if not template.agent_id:
|
|
695
|
+
errors.append("agent_id is required")
|
|
696
|
+
if not template.instructions:
|
|
697
|
+
errors.append("instructions are required")
|
|
698
|
+
if not template.metadata.get("name"):
|
|
699
|
+
errors.append("metadata.name is required")
|
|
700
|
+
|
|
701
|
+
# Validate capabilities
|
|
702
|
+
if template.capabilities:
|
|
703
|
+
model = template.capabilities.get("model")
|
|
704
|
+
if model and model not in ["opus", "sonnet", "haiku"]:
|
|
705
|
+
errors.append(f"Invalid model: {model}")
|
|
706
|
+
|
|
707
|
+
# Check for naming conflicts
|
|
708
|
+
if template.agent_id in ["pm", "project-manager", "claude-mpm"]:
|
|
709
|
+
errors.append(f"Reserved agent ID: {template.agent_id}")
|
|
710
|
+
|
|
711
|
+
return len(errors) == 0, errors
|
|
712
|
+
|
|
713
|
+
def export_local_templates(self, output_dir: Path) -> int:
|
|
714
|
+
"""Export all local templates to a directory.
|
|
715
|
+
|
|
716
|
+
Args:
|
|
717
|
+
output_dir: Directory to export templates to
|
|
718
|
+
|
|
719
|
+
Returns:
|
|
720
|
+
Number of templates exported
|
|
721
|
+
"""
|
|
722
|
+
templates = self.discover_local_templates()
|
|
723
|
+
output_dir.mkdir(parents=True, exist_ok=True)
|
|
724
|
+
|
|
725
|
+
count = 0
|
|
726
|
+
for agent_id, template in templates.items():
|
|
727
|
+
output_file = output_dir / f"{agent_id}.json"
|
|
728
|
+
with output_file.open("w") as f:
|
|
729
|
+
json.dump(template.to_json(), f, indent=2)
|
|
730
|
+
count += 1
|
|
731
|
+
|
|
732
|
+
logger.info(f"Exported {count} local agent templates to {output_dir}")
|
|
733
|
+
return count
|
|
734
|
+
|
|
735
|
+
def import_local_templates(self, input_dir: Path, tier: str = "project") -> int:
|
|
736
|
+
"""Import agent templates from a directory.
|
|
737
|
+
|
|
738
|
+
Args:
|
|
739
|
+
input_dir: Directory containing template JSON files
|
|
740
|
+
tier: Tier to import into ('project' or 'user')
|
|
741
|
+
|
|
742
|
+
Returns:
|
|
743
|
+
Number of templates imported
|
|
744
|
+
"""
|
|
745
|
+
if not input_dir.exists():
|
|
746
|
+
logger.error(f"Input directory does not exist: {input_dir}")
|
|
747
|
+
return 0
|
|
748
|
+
|
|
749
|
+
count = 0
|
|
750
|
+
# Agent templates migrated to Markdown with YAML frontmatter (v4.26.0+)
|
|
751
|
+
for template_file in input_dir.glob("*.md"):
|
|
752
|
+
try:
|
|
753
|
+
# Read markdown content and extract YAML frontmatter
|
|
754
|
+
content = template_file.read_text()
|
|
755
|
+
frontmatter = self._extract_yaml_frontmatter(content)
|
|
756
|
+
if not frontmatter:
|
|
757
|
+
logger.warning(f"No YAML frontmatter in {template_file.name}")
|
|
758
|
+
continue
|
|
759
|
+
data = frontmatter
|
|
760
|
+
|
|
761
|
+
template = LocalAgentTemplate.from_json(data)
|
|
762
|
+
template.tier = tier
|
|
763
|
+
|
|
764
|
+
# Update author based on tier
|
|
765
|
+
if tier == "project":
|
|
766
|
+
template.author = self.get_project_name()
|
|
767
|
+
else:
|
|
768
|
+
template.author = Path.home().name
|
|
769
|
+
|
|
770
|
+
# Validate before saving
|
|
771
|
+
is_valid, errors = self.validate_local_template(template)
|
|
772
|
+
if is_valid:
|
|
773
|
+
self.save_local_template(template)
|
|
774
|
+
count += 1
|
|
775
|
+
else:
|
|
776
|
+
logger.warning(
|
|
777
|
+
f"Skipping invalid template {template_file}: {errors}"
|
|
778
|
+
)
|
|
779
|
+
|
|
780
|
+
except Exception as e:
|
|
781
|
+
logger.error(f"Failed to import template from {template_file}: {e}")
|
|
782
|
+
|
|
783
|
+
logger.info(f"Imported {count} local agent templates from {input_dir}")
|
|
784
|
+
return count
|