claude-mpm 4.1.1__py3-none-any.whl → 4.1.2__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/__main__.py +1 -1
- claude_mpm/agents/BASE_PM.md +74 -46
- claude_mpm/agents/INSTRUCTIONS.md +11 -153
- claude_mpm/agents/WORKFLOW.md +61 -321
- claude_mpm/agents/__init__.py +11 -11
- claude_mpm/agents/agent_loader.py +23 -20
- claude_mpm/agents/agent_loader_integration.py +1 -1
- claude_mpm/agents/agents_metadata.py +27 -0
- claude_mpm/agents/async_agent_loader.py +5 -8
- claude_mpm/agents/base_agent_loader.py +36 -25
- claude_mpm/agents/frontmatter_validator.py +6 -6
- claude_mpm/agents/schema/agent_schema.json +1 -1
- claude_mpm/agents/system_agent_config.py +9 -9
- claude_mpm/agents/templates/api_qa.json +47 -2
- claude_mpm/agents/templates/imagemagick.json +256 -0
- claude_mpm/agents/templates/qa.json +41 -2
- claude_mpm/agents/templates/ticketing.json +5 -5
- claude_mpm/agents/templates/web_qa.json +50 -2
- claude_mpm/cli/__init__.py +51 -46
- claude_mpm/cli/__main__.py +1 -1
- claude_mpm/cli/commands/__init__.py +10 -12
- claude_mpm/cli/commands/agent_manager.py +186 -181
- claude_mpm/cli/commands/agents.py +271 -268
- claude_mpm/cli/commands/aggregate.py +30 -29
- claude_mpm/cli/commands/cleanup.py +50 -44
- claude_mpm/cli/commands/cleanup_orphaned_agents.py +25 -25
- claude_mpm/cli/commands/config.py +162 -127
- claude_mpm/cli/commands/doctor.py +52 -62
- claude_mpm/cli/commands/info.py +37 -25
- claude_mpm/cli/commands/mcp.py +3 -7
- claude_mpm/cli/commands/mcp_command_router.py +14 -18
- claude_mpm/cli/commands/mcp_install_commands.py +28 -23
- claude_mpm/cli/commands/mcp_pipx_config.py +58 -49
- claude_mpm/cli/commands/mcp_server_commands.py +23 -17
- claude_mpm/cli/commands/memory.py +192 -141
- claude_mpm/cli/commands/monitor.py +117 -88
- claude_mpm/cli/commands/run.py +120 -84
- claude_mpm/cli/commands/run_config_checker.py +4 -5
- claude_mpm/cli/commands/socketio_monitor.py +17 -19
- claude_mpm/cli/commands/tickets.py +92 -92
- claude_mpm/cli/parser.py +1 -5
- claude_mpm/cli/parsers/__init__.py +1 -1
- claude_mpm/cli/parsers/agent_manager_parser.py +50 -98
- claude_mpm/cli/parsers/agents_parser.py +2 -3
- claude_mpm/cli/parsers/base_parser.py +7 -5
- claude_mpm/cli/parsers/mcp_parser.py +4 -2
- claude_mpm/cli/parsers/monitor_parser.py +26 -18
- claude_mpm/cli/shared/__init__.py +10 -10
- claude_mpm/cli/shared/argument_patterns.py +57 -71
- claude_mpm/cli/shared/base_command.py +61 -53
- claude_mpm/cli/shared/error_handling.py +62 -58
- claude_mpm/cli/shared/output_formatters.py +78 -77
- claude_mpm/cli/startup_logging.py +204 -172
- claude_mpm/cli/utils.py +10 -11
- claude_mpm/cli_module/__init__.py +1 -1
- claude_mpm/cli_module/args.py +1 -1
- claude_mpm/cli_module/migration_example.py +5 -5
- claude_mpm/config/__init__.py +9 -9
- claude_mpm/config/agent_config.py +15 -14
- claude_mpm/config/experimental_features.py +4 -4
- claude_mpm/config/paths.py +0 -1
- claude_mpm/config/socketio_config.py +5 -6
- claude_mpm/constants.py +1 -2
- claude_mpm/core/__init__.py +8 -8
- claude_mpm/core/agent_name_normalizer.py +1 -1
- claude_mpm/core/agent_registry.py +20 -23
- claude_mpm/core/agent_session_manager.py +3 -3
- claude_mpm/core/base_service.py +7 -15
- claude_mpm/core/cache.py +4 -6
- claude_mpm/core/claude_runner.py +85 -113
- claude_mpm/core/config.py +43 -28
- claude_mpm/core/config_aliases.py +0 -9
- claude_mpm/core/config_constants.py +52 -30
- claude_mpm/core/constants.py +0 -1
- claude_mpm/core/container.py +18 -27
- claude_mpm/core/exceptions.py +2 -2
- claude_mpm/core/factories.py +10 -12
- claude_mpm/core/framework_loader.py +581 -280
- claude_mpm/core/hook_manager.py +26 -22
- claude_mpm/core/hook_performance_config.py +58 -47
- claude_mpm/core/injectable_service.py +1 -1
- claude_mpm/core/interactive_session.py +61 -152
- claude_mpm/core/interfaces.py +1 -100
- claude_mpm/core/lazy.py +5 -5
- claude_mpm/core/log_manager.py +587 -0
- claude_mpm/core/logger.py +125 -8
- claude_mpm/core/logging_config.py +15 -15
- claude_mpm/core/minimal_framework_loader.py +5 -8
- claude_mpm/core/oneshot_session.py +15 -33
- claude_mpm/core/optimized_agent_loader.py +4 -6
- claude_mpm/core/optimized_startup.py +2 -1
- claude_mpm/core/output_style_manager.py +147 -106
- claude_mpm/core/pm_hook_interceptor.py +0 -1
- claude_mpm/core/service_registry.py +11 -8
- claude_mpm/core/session_manager.py +1 -2
- claude_mpm/core/shared/__init__.py +1 -1
- claude_mpm/core/shared/config_loader.py +101 -97
- claude_mpm/core/shared/path_resolver.py +72 -68
- claude_mpm/core/shared/singleton_manager.py +56 -50
- claude_mpm/core/socketio_pool.py +26 -6
- claude_mpm/core/tool_access_control.py +4 -5
- claude_mpm/core/typing_utils.py +50 -59
- claude_mpm/core/unified_agent_registry.py +14 -19
- claude_mpm/core/unified_config.py +4 -6
- claude_mpm/core/unified_paths.py +197 -109
- claude_mpm/dashboard/open_dashboard.py +2 -4
- claude_mpm/experimental/cli_enhancements.py +51 -36
- claude_mpm/generators/agent_profile_generator.py +2 -4
- claude_mpm/hooks/base_hook.py +1 -2
- claude_mpm/hooks/claude_hooks/connection_pool.py +72 -26
- claude_mpm/hooks/claude_hooks/event_handlers.py +93 -38
- claude_mpm/hooks/claude_hooks/hook_handler.py +130 -76
- claude_mpm/hooks/claude_hooks/hook_handler_eventbus.py +104 -77
- claude_mpm/hooks/claude_hooks/memory_integration.py +2 -4
- claude_mpm/hooks/claude_hooks/response_tracking.py +15 -11
- claude_mpm/hooks/claude_hooks/tool_analysis.py +12 -18
- claude_mpm/hooks/memory_integration_hook.py +5 -5
- claude_mpm/hooks/tool_call_interceptor.py +1 -1
- claude_mpm/hooks/validation_hooks.py +4 -4
- claude_mpm/init.py +4 -9
- claude_mpm/models/__init__.py +2 -2
- claude_mpm/models/agent_session.py +11 -14
- claude_mpm/scripts/mcp_server.py +20 -11
- claude_mpm/scripts/mcp_wrapper.py +5 -5
- claude_mpm/scripts/mpm_doctor.py +321 -0
- claude_mpm/scripts/socketio_daemon.py +28 -25
- claude_mpm/scripts/socketio_daemon_hardened.py +298 -258
- claude_mpm/scripts/socketio_server_manager.py +116 -95
- claude_mpm/services/__init__.py +49 -49
- claude_mpm/services/agent_capabilities_service.py +12 -18
- claude_mpm/services/agents/__init__.py +22 -22
- claude_mpm/services/agents/agent_builder.py +140 -119
- claude_mpm/services/agents/deployment/__init__.py +3 -3
- claude_mpm/services/agents/deployment/agent_config_provider.py +9 -9
- claude_mpm/services/agents/deployment/agent_configuration_manager.py +19 -20
- claude_mpm/services/agents/deployment/agent_definition_factory.py +1 -5
- claude_mpm/services/agents/deployment/agent_deployment.py +136 -106
- claude_mpm/services/agents/deployment/agent_discovery_service.py +4 -8
- claude_mpm/services/agents/deployment/agent_environment_manager.py +2 -7
- claude_mpm/services/agents/deployment/agent_filesystem_manager.py +6 -10
- claude_mpm/services/agents/deployment/agent_format_converter.py +11 -15
- claude_mpm/services/agents/deployment/agent_frontmatter_validator.py +2 -3
- claude_mpm/services/agents/deployment/agent_lifecycle_manager.py +5 -5
- claude_mpm/services/agents/deployment/agent_metrics_collector.py +13 -19
- claude_mpm/services/agents/deployment/agent_restore_handler.py +0 -1
- claude_mpm/services/agents/deployment/agent_template_builder.py +26 -35
- claude_mpm/services/agents/deployment/agent_validator.py +0 -1
- claude_mpm/services/agents/deployment/agent_version_manager.py +7 -9
- claude_mpm/services/agents/deployment/agent_versioning.py +3 -3
- claude_mpm/services/agents/deployment/agents_directory_resolver.py +6 -7
- claude_mpm/services/agents/deployment/async_agent_deployment.py +51 -38
- claude_mpm/services/agents/deployment/config/__init__.py +1 -1
- claude_mpm/services/agents/deployment/config/deployment_config.py +7 -8
- claude_mpm/services/agents/deployment/deployment_type_detector.py +1 -1
- claude_mpm/services/agents/deployment/deployment_wrapper.py +18 -18
- claude_mpm/services/agents/deployment/facade/__init__.py +1 -1
- claude_mpm/services/agents/deployment/facade/deployment_executor.py +0 -3
- claude_mpm/services/agents/deployment/facade/deployment_facade.py +3 -4
- claude_mpm/services/agents/deployment/interface_adapter.py +5 -7
- claude_mpm/services/agents/deployment/multi_source_deployment_service.py +345 -276
- claude_mpm/services/agents/deployment/pipeline/__init__.py +2 -2
- claude_mpm/services/agents/deployment/pipeline/pipeline_builder.py +1 -1
- claude_mpm/services/agents/deployment/pipeline/pipeline_context.py +6 -4
- claude_mpm/services/agents/deployment/pipeline/pipeline_executor.py +3 -3
- claude_mpm/services/agents/deployment/pipeline/steps/__init__.py +2 -2
- claude_mpm/services/agents/deployment/pipeline/steps/agent_processing_step.py +14 -13
- claude_mpm/services/agents/deployment/pipeline/steps/base_step.py +0 -1
- claude_mpm/services/agents/deployment/pipeline/steps/configuration_step.py +1 -1
- claude_mpm/services/agents/deployment/pipeline/steps/target_directory_step.py +8 -9
- claude_mpm/services/agents/deployment/pipeline/steps/validation_step.py +1 -1
- claude_mpm/services/agents/deployment/processors/__init__.py +1 -1
- claude_mpm/services/agents/deployment/processors/agent_processor.py +20 -16
- claude_mpm/services/agents/deployment/refactored_agent_deployment_service.py +5 -12
- claude_mpm/services/agents/deployment/results/__init__.py +1 -1
- claude_mpm/services/agents/deployment/results/deployment_result_builder.py +1 -1
- claude_mpm/services/agents/deployment/strategies/__init__.py +2 -2
- claude_mpm/services/agents/deployment/strategies/base_strategy.py +1 -7
- claude_mpm/services/agents/deployment/strategies/project_strategy.py +1 -4
- claude_mpm/services/agents/deployment/strategies/system_strategy.py +2 -3
- claude_mpm/services/agents/deployment/strategies/user_strategy.py +3 -7
- claude_mpm/services/agents/deployment/validation/__init__.py +1 -1
- claude_mpm/services/agents/deployment/validation/agent_validator.py +1 -1
- claude_mpm/services/agents/deployment/validation/template_validator.py +2 -2
- claude_mpm/services/agents/deployment/validation/validation_result.py +2 -6
- claude_mpm/services/agents/loading/__init__.py +1 -1
- claude_mpm/services/agents/loading/agent_profile_loader.py +6 -12
- claude_mpm/services/agents/loading/base_agent_manager.py +5 -5
- claude_mpm/services/agents/loading/framework_agent_loader.py +2 -4
- claude_mpm/services/agents/management/__init__.py +1 -1
- claude_mpm/services/agents/management/agent_capabilities_generator.py +1 -3
- claude_mpm/services/agents/management/agent_management_service.py +5 -9
- claude_mpm/services/agents/memory/__init__.py +4 -4
- claude_mpm/services/agents/memory/agent_memory_manager.py +280 -160
- claude_mpm/services/agents/memory/agent_persistence_service.py +0 -2
- claude_mpm/services/agents/memory/content_manager.py +44 -38
- claude_mpm/services/agents/memory/template_generator.py +4 -6
- claude_mpm/services/agents/registry/__init__.py +10 -6
- claude_mpm/services/agents/registry/deployed_agent_discovery.py +30 -27
- claude_mpm/services/agents/registry/modification_tracker.py +3 -6
- claude_mpm/services/async_session_logger.py +1 -2
- claude_mpm/services/claude_session_logger.py +1 -2
- claude_mpm/services/command_deployment_service.py +173 -0
- claude_mpm/services/command_handler_service.py +20 -22
- claude_mpm/services/core/__init__.py +25 -25
- claude_mpm/services/core/base.py +0 -5
- claude_mpm/services/core/interfaces/__init__.py +32 -32
- claude_mpm/services/core/interfaces/agent.py +0 -21
- claude_mpm/services/core/interfaces/communication.py +0 -27
- claude_mpm/services/core/interfaces/infrastructure.py +0 -56
- claude_mpm/services/core/interfaces/service.py +0 -29
- claude_mpm/services/diagnostics/__init__.py +1 -1
- claude_mpm/services/diagnostics/checks/__init__.py +6 -6
- claude_mpm/services/diagnostics/checks/agent_check.py +89 -80
- claude_mpm/services/diagnostics/checks/base_check.py +12 -16
- claude_mpm/services/diagnostics/checks/claude_desktop_check.py +84 -81
- claude_mpm/services/diagnostics/checks/common_issues_check.py +99 -91
- claude_mpm/services/diagnostics/checks/configuration_check.py +82 -77
- claude_mpm/services/diagnostics/checks/filesystem_check.py +67 -68
- claude_mpm/services/diagnostics/checks/installation_check.py +254 -94
- claude_mpm/services/diagnostics/checks/mcp_check.py +90 -88
- claude_mpm/services/diagnostics/checks/monitor_check.py +75 -76
- claude_mpm/services/diagnostics/checks/startup_log_check.py +67 -73
- claude_mpm/services/diagnostics/diagnostic_runner.py +67 -59
- claude_mpm/services/diagnostics/doctor_reporter.py +107 -70
- claude_mpm/services/diagnostics/models.py +21 -19
- claude_mpm/services/event_aggregator.py +10 -17
- claude_mpm/services/event_bus/__init__.py +1 -1
- claude_mpm/services/event_bus/config.py +54 -35
- claude_mpm/services/event_bus/event_bus.py +76 -71
- claude_mpm/services/event_bus/relay.py +74 -64
- claude_mpm/services/events/__init__.py +11 -11
- claude_mpm/services/events/consumers/__init__.py +3 -3
- claude_mpm/services/events/consumers/dead_letter.py +71 -63
- claude_mpm/services/events/consumers/logging.py +39 -37
- claude_mpm/services/events/consumers/metrics.py +56 -57
- claude_mpm/services/events/consumers/socketio.py +82 -81
- claude_mpm/services/events/core.py +110 -99
- claude_mpm/services/events/interfaces.py +56 -72
- claude_mpm/services/events/producers/__init__.py +1 -1
- claude_mpm/services/events/producers/hook.py +38 -38
- claude_mpm/services/events/producers/system.py +46 -44
- claude_mpm/services/exceptions.py +81 -80
- claude_mpm/services/framework_claude_md_generator/__init__.py +2 -4
- claude_mpm/services/framework_claude_md_generator/content_assembler.py +3 -5
- claude_mpm/services/framework_claude_md_generator/content_validator.py +1 -1
- claude_mpm/services/framework_claude_md_generator/deployment_manager.py +4 -4
- claude_mpm/services/framework_claude_md_generator/section_generators/__init__.py +0 -1
- claude_mpm/services/framework_claude_md_generator/section_generators/agents.py +0 -2
- claude_mpm/services/framework_claude_md_generator/version_manager.py +4 -5
- claude_mpm/services/hook_service.py +6 -9
- claude_mpm/services/infrastructure/__init__.py +1 -1
- claude_mpm/services/infrastructure/context_preservation.py +8 -12
- claude_mpm/services/infrastructure/monitoring.py +21 -23
- claude_mpm/services/mcp_gateway/__init__.py +37 -37
- claude_mpm/services/mcp_gateway/auto_configure.py +95 -103
- claude_mpm/services/mcp_gateway/config/__init__.py +1 -1
- claude_mpm/services/mcp_gateway/config/config_loader.py +23 -25
- claude_mpm/services/mcp_gateway/config/config_schema.py +5 -5
- claude_mpm/services/mcp_gateway/config/configuration.py +9 -6
- claude_mpm/services/mcp_gateway/core/__init__.py +10 -10
- claude_mpm/services/mcp_gateway/core/base.py +0 -3
- claude_mpm/services/mcp_gateway/core/interfaces.py +1 -38
- claude_mpm/services/mcp_gateway/core/process_pool.py +99 -93
- claude_mpm/services/mcp_gateway/core/singleton_manager.py +65 -62
- claude_mpm/services/mcp_gateway/core/startup_verification.py +75 -74
- claude_mpm/services/mcp_gateway/main.py +2 -1
- claude_mpm/services/mcp_gateway/registry/service_registry.py +5 -8
- claude_mpm/services/mcp_gateway/registry/tool_registry.py +1 -1
- claude_mpm/services/mcp_gateway/server/__init__.py +1 -1
- claude_mpm/services/mcp_gateway/server/mcp_gateway.py +12 -19
- claude_mpm/services/mcp_gateway/server/stdio_handler.py +4 -3
- claude_mpm/services/mcp_gateway/server/stdio_server.py +79 -71
- claude_mpm/services/mcp_gateway/tools/__init__.py +2 -2
- claude_mpm/services/mcp_gateway/tools/base_adapter.py +5 -6
- claude_mpm/services/mcp_gateway/tools/document_summarizer.py +13 -22
- claude_mpm/services/mcp_gateway/tools/health_check_tool.py +79 -78
- claude_mpm/services/mcp_gateway/tools/hello_world.py +12 -14
- claude_mpm/services/mcp_gateway/tools/ticket_tools.py +42 -49
- claude_mpm/services/mcp_gateway/tools/unified_ticket_tool.py +51 -55
- claude_mpm/services/memory/__init__.py +3 -3
- claude_mpm/services/memory/builder.py +3 -6
- claude_mpm/services/memory/cache/__init__.py +1 -1
- claude_mpm/services/memory/cache/shared_prompt_cache.py +3 -5
- claude_mpm/services/memory/cache/simple_cache.py +1 -1
- claude_mpm/services/memory/indexed_memory.py +5 -7
- claude_mpm/services/memory/optimizer.py +7 -10
- claude_mpm/services/memory/router.py +8 -9
- claude_mpm/services/memory_hook_service.py +48 -34
- claude_mpm/services/monitor_build_service.py +77 -73
- claude_mpm/services/port_manager.py +130 -108
- claude_mpm/services/project/analyzer.py +12 -10
- claude_mpm/services/project/registry.py +11 -11
- claude_mpm/services/recovery_manager.py +10 -19
- claude_mpm/services/response_tracker.py +0 -1
- claude_mpm/services/runner_configuration_service.py +19 -20
- claude_mpm/services/session_management_service.py +7 -11
- claude_mpm/services/shared/__init__.py +1 -1
- claude_mpm/services/shared/async_service_base.py +58 -50
- claude_mpm/services/shared/config_service_base.py +73 -67
- claude_mpm/services/shared/lifecycle_service_base.py +82 -78
- claude_mpm/services/shared/manager_base.py +94 -82
- claude_mpm/services/shared/service_factory.py +96 -98
- claude_mpm/services/socketio/__init__.py +3 -3
- claude_mpm/services/socketio/client_proxy.py +5 -5
- claude_mpm/services/socketio/event_normalizer.py +199 -181
- claude_mpm/services/socketio/handlers/__init__.py +3 -3
- claude_mpm/services/socketio/handlers/base.py +5 -4
- claude_mpm/services/socketio/handlers/connection.py +163 -136
- claude_mpm/services/socketio/handlers/file.py +13 -14
- claude_mpm/services/socketio/handlers/git.py +12 -7
- claude_mpm/services/socketio/handlers/hook.py +49 -44
- claude_mpm/services/socketio/handlers/memory.py +0 -1
- claude_mpm/services/socketio/handlers/project.py +0 -1
- claude_mpm/services/socketio/handlers/registry.py +37 -19
- claude_mpm/services/socketio/migration_utils.py +98 -84
- claude_mpm/services/socketio/server/__init__.py +1 -1
- claude_mpm/services/socketio/server/broadcaster.py +81 -87
- claude_mpm/services/socketio/server/core.py +65 -54
- claude_mpm/services/socketio/server/eventbus_integration.py +95 -56
- claude_mpm/services/socketio/server/main.py +64 -38
- claude_mpm/services/socketio_client_manager.py +10 -12
- claude_mpm/services/subprocess_launcher_service.py +4 -7
- claude_mpm/services/system_instructions_service.py +13 -14
- claude_mpm/services/ticket_manager.py +2 -2
- claude_mpm/services/utility_service.py +5 -13
- claude_mpm/services/version_control/__init__.py +16 -16
- claude_mpm/services/version_control/branch_strategy.py +5 -8
- claude_mpm/services/version_control/conflict_resolution.py +9 -23
- claude_mpm/services/version_control/git_operations.py +5 -7
- claude_mpm/services/version_control/semantic_versioning.py +16 -17
- claude_mpm/services/version_control/version_parser.py +13 -18
- claude_mpm/services/version_service.py +10 -11
- claude_mpm/storage/__init__.py +1 -1
- claude_mpm/storage/state_storage.py +22 -28
- claude_mpm/utils/__init__.py +6 -6
- claude_mpm/utils/agent_dependency_loader.py +47 -33
- claude_mpm/utils/config_manager.py +11 -14
- claude_mpm/utils/dependency_cache.py +1 -1
- claude_mpm/utils/dependency_manager.py +13 -17
- claude_mpm/utils/dependency_strategies.py +8 -10
- claude_mpm/utils/environment_context.py +3 -9
- claude_mpm/utils/error_handler.py +3 -13
- claude_mpm/utils/file_utils.py +1 -1
- claude_mpm/utils/path_operations.py +8 -12
- claude_mpm/utils/robust_installer.py +110 -33
- claude_mpm/utils/subprocess_utils.py +5 -6
- claude_mpm/validation/agent_validator.py +3 -6
- claude_mpm/validation/frontmatter_validator.py +1 -1
- {claude_mpm-4.1.1.dist-info → claude_mpm-4.1.2.dist-info}/METADATA +1 -1
- claude_mpm-4.1.2.dist-info/RECORD +498 -0
- claude_mpm-4.1.1.dist-info/RECORD +0 -494
- {claude_mpm-4.1.1.dist-info → claude_mpm-4.1.2.dist-info}/WHEEL +0 -0
- {claude_mpm-4.1.1.dist-info → claude_mpm-4.1.2.dist-info}/entry_points.txt +0 -0
- {claude_mpm-4.1.1.dist-info → claude_mpm-4.1.2.dist-info}/licenses/LICENSE +0 -0
- {claude_mpm-4.1.1.dist-info → claude_mpm-4.1.2.dist-info}/top_level.txt +0 -0
|
@@ -8,7 +8,6 @@ maintainability and testability.
|
|
|
8
8
|
"""
|
|
9
9
|
|
|
10
10
|
import json
|
|
11
|
-
import logging
|
|
12
11
|
from pathlib import Path
|
|
13
12
|
from typing import Any, Dict, List, Optional
|
|
14
13
|
|
|
@@ -140,9 +139,8 @@ class AgentDiscoveryService:
|
|
|
140
139
|
if template_file.exists():
|
|
141
140
|
if self._validate_template_file(template_file):
|
|
142
141
|
return template_file
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
return None
|
|
142
|
+
self.logger.error(f"Invalid template file: {template_file}")
|
|
143
|
+
return None
|
|
146
144
|
|
|
147
145
|
self.logger.error(f"Template not found for agent: {agent_name}")
|
|
148
146
|
return None
|
|
@@ -198,10 +196,8 @@ class AgentDiscoveryService:
|
|
|
198
196
|
"name": metadata.get("name", template_file.stem),
|
|
199
197
|
"description": metadata.get("description", "No description available"),
|
|
200
198
|
"version": template_data.get(
|
|
201
|
-
"agent_version",
|
|
202
|
-
template_data.get("version",
|
|
203
|
-
metadata.get("version", "1.0.0")
|
|
204
|
-
)
|
|
199
|
+
"agent_version",
|
|
200
|
+
template_data.get("version", metadata.get("version", "1.0.0")),
|
|
205
201
|
),
|
|
206
202
|
"tools": capabilities.get("tools", []),
|
|
207
203
|
"specializations": metadata.get(
|
|
@@ -7,7 +7,6 @@ Extracted from AgentDeploymentService as part of the refactoring to improve
|
|
|
7
7
|
maintainability and testability.
|
|
8
8
|
"""
|
|
9
9
|
|
|
10
|
-
import logging
|
|
11
10
|
import os
|
|
12
11
|
from pathlib import Path
|
|
13
12
|
from typing import Any, Dict, Optional
|
|
@@ -236,7 +235,7 @@ cache/
|
|
|
236
235
|
"""
|
|
237
236
|
current_env = self.get_current_environment()
|
|
238
237
|
|
|
239
|
-
|
|
238
|
+
return {
|
|
240
239
|
"claude_environment_variables": current_env,
|
|
241
240
|
"python_path": os.environ.get("PYTHONPATH", "Not set"),
|
|
242
241
|
"current_working_directory": str(Path.cwd()),
|
|
@@ -244,8 +243,6 @@ cache/
|
|
|
244
243
|
"claude_config_locations": self._find_claude_config_locations(),
|
|
245
244
|
}
|
|
246
245
|
|
|
247
|
-
return info
|
|
248
|
-
|
|
249
246
|
def cleanup_environment(self) -> Dict[str, Any]:
|
|
250
247
|
"""
|
|
251
248
|
Clean up Claude environment variables.
|
|
@@ -257,9 +254,7 @@ cache/
|
|
|
257
254
|
|
|
258
255
|
try:
|
|
259
256
|
# Remove Claude-specific environment variables
|
|
260
|
-
claude_vars = [
|
|
261
|
-
key for key in os.environ.keys() if key.startswith("CLAUDE_")
|
|
262
|
-
]
|
|
257
|
+
claude_vars = [key for key in os.environ if key.startswith("CLAUDE_")]
|
|
263
258
|
|
|
264
259
|
for var in claude_vars:
|
|
265
260
|
if var in os.environ:
|
|
@@ -7,10 +7,9 @@ Extracted from AgentDeploymentService as part of the refactoring to improve
|
|
|
7
7
|
maintainability and testability.
|
|
8
8
|
"""
|
|
9
9
|
|
|
10
|
-
import logging
|
|
11
10
|
import shutil
|
|
12
11
|
from pathlib import Path
|
|
13
|
-
from typing import Any, Dict,
|
|
12
|
+
from typing import Any, Dict, Optional
|
|
14
13
|
|
|
15
14
|
from claude_mpm.core.logging_config import get_logger
|
|
16
15
|
|
|
@@ -120,11 +119,10 @@ class AgentFileSystemManager:
|
|
|
120
119
|
# MD file is newer or same age, skip conversion
|
|
121
120
|
results["skipped"].append(yaml_file.name)
|
|
122
121
|
continue
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
)
|
|
122
|
+
# MD file is older, proceed with conversion
|
|
123
|
+
self.logger.info(
|
|
124
|
+
f"MD file {md_file.name} is older than YAML, converting..."
|
|
125
|
+
)
|
|
128
126
|
|
|
129
127
|
# Read YAML content
|
|
130
128
|
yaml_content = yaml_file.read_text()
|
|
@@ -353,7 +351,7 @@ class AgentFileSystemManager:
|
|
|
353
351
|
tools_list = '["Read", "Write", "Edit"]'
|
|
354
352
|
|
|
355
353
|
# Build Markdown with YAML frontmatter
|
|
356
|
-
|
|
354
|
+
return f"""---
|
|
357
355
|
name: {name}
|
|
358
356
|
description: "{description}"
|
|
359
357
|
version: "{version}"
|
|
@@ -374,8 +372,6 @@ model: "sonnet"
|
|
|
374
372
|
This agent provides specialized functionality for your tasks.
|
|
375
373
|
"""
|
|
376
374
|
|
|
377
|
-
return md_content
|
|
378
|
-
|
|
379
375
|
def _extract_yaml_field(self, yaml_content: str, field_name: str) -> Optional[str]:
|
|
380
376
|
"""Extract a field value from YAML content."""
|
|
381
377
|
import re
|
|
@@ -7,11 +7,10 @@ Extracted from AgentDeploymentService as part of the refactoring to improve
|
|
|
7
7
|
maintainability and testability.
|
|
8
8
|
"""
|
|
9
9
|
|
|
10
|
-
import logging
|
|
11
10
|
import re
|
|
12
11
|
from datetime import datetime
|
|
13
12
|
from pathlib import Path
|
|
14
|
-
from typing import Any, Dict,
|
|
13
|
+
from typing import Any, Dict, Optional
|
|
15
14
|
|
|
16
15
|
from claude_mpm.core.logging_config import get_logger
|
|
17
16
|
|
|
@@ -67,11 +66,10 @@ class AgentFormatConverter:
|
|
|
67
66
|
# MD file is newer or same age, skip conversion
|
|
68
67
|
results["skipped"].append(yaml_file.name)
|
|
69
68
|
continue
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
)
|
|
69
|
+
# MD file is older, proceed with conversion
|
|
70
|
+
self.logger.info(
|
|
71
|
+
f"MD file {md_file.name} is older than YAML, converting..."
|
|
72
|
+
)
|
|
75
73
|
|
|
76
74
|
# Read YAML content
|
|
77
75
|
yaml_content = yaml_file.read_text()
|
|
@@ -248,7 +246,7 @@ model: "{model}"
|
|
|
248
246
|
|
|
249
247
|
# Add instructions field if there's markdown content
|
|
250
248
|
if markdown_content:
|
|
251
|
-
frontmatter +=
|
|
249
|
+
frontmatter += "\ninstructions: |\n"
|
|
252
250
|
# Indent markdown content
|
|
253
251
|
for line in markdown_content.split("\n"):
|
|
254
252
|
frontmatter += f" {line}\n"
|
|
@@ -269,13 +267,12 @@ model: "{model}"
|
|
|
269
267
|
|
|
270
268
|
if content.startswith("---") and "---" in content[3:]:
|
|
271
269
|
return "markdown_yaml"
|
|
272
|
-
|
|
270
|
+
if content.startswith("{") and content.endswith("}"):
|
|
273
271
|
return "json"
|
|
274
|
-
|
|
272
|
+
if ":" in content and not content.startswith("#"):
|
|
275
273
|
# Likely YAML if it has key-value pairs and doesn't start with markdown header
|
|
276
274
|
return "yaml"
|
|
277
|
-
|
|
278
|
-
return "unknown"
|
|
275
|
+
return "unknown"
|
|
279
276
|
|
|
280
277
|
def normalize_agent_content(
|
|
281
278
|
self, content: str, agent_name: str, target_format: str = "markdown_yaml"
|
|
@@ -307,10 +304,9 @@ model: "{model}"
|
|
|
307
304
|
# Convert to target format
|
|
308
305
|
if target_format == "yaml":
|
|
309
306
|
return self.convert_md_to_yaml(intermediate)
|
|
310
|
-
|
|
307
|
+
if target_format == "json":
|
|
311
308
|
return self._convert_md_to_json(intermediate)
|
|
312
|
-
|
|
313
|
-
return intermediate
|
|
309
|
+
return intermediate
|
|
314
310
|
|
|
315
311
|
def get_conversion_stats(self, target_dir: Path) -> Dict[str, Any]:
|
|
316
312
|
"""
|
|
@@ -4,6 +4,7 @@ This module provides validation and repair functionality for agent frontmatter.
|
|
|
4
4
|
Extracted from AgentDeploymentService to reduce complexity and improve maintainability.
|
|
5
5
|
"""
|
|
6
6
|
|
|
7
|
+
import contextlib
|
|
7
8
|
import logging
|
|
8
9
|
from pathlib import Path
|
|
9
10
|
from typing import Any, Dict
|
|
@@ -139,10 +140,8 @@ class AgentFrontmatterValidator:
|
|
|
139
140
|
)
|
|
140
141
|
results["replaced"].append(agent_name)
|
|
141
142
|
# Delete the file so it will be recreated
|
|
142
|
-
|
|
143
|
+
with contextlib.suppress(Exception):
|
|
143
144
|
agent_file.unlink()
|
|
144
|
-
except Exception:
|
|
145
|
-
pass
|
|
146
145
|
|
|
147
146
|
except Exception as e:
|
|
148
147
|
error_msg = f"Failed to validate agent {agent_file.name}: {e}"
|
|
@@ -29,13 +29,13 @@ Created for ISS-0118: Agent Registry and Hierarchical Discovery System
|
|
|
29
29
|
import asyncio
|
|
30
30
|
import time
|
|
31
31
|
from dataclasses import dataclass, field
|
|
32
|
-
from datetime import datetime
|
|
32
|
+
from datetime import datetime
|
|
33
33
|
from enum import Enum
|
|
34
|
-
from typing import Any, Dict, List, Optional
|
|
34
|
+
from typing import Any, Dict, List, Optional
|
|
35
35
|
|
|
36
36
|
from claude_mpm.core.base_service import BaseService
|
|
37
37
|
from claude_mpm.core.unified_paths import get_path_manager
|
|
38
|
-
from claude_mpm.models.agent_definition import AgentDefinition
|
|
38
|
+
from claude_mpm.models.agent_definition import AgentDefinition
|
|
39
39
|
from claude_mpm.services.agents.management import AgentManager
|
|
40
40
|
from claude_mpm.services.agents.memory import (
|
|
41
41
|
AgentPersistenceService,
|
|
@@ -43,7 +43,7 @@ from claude_mpm.services.agents.memory import (
|
|
|
43
43
|
PersistenceRecord,
|
|
44
44
|
PersistenceStrategy,
|
|
45
45
|
)
|
|
46
|
-
from claude_mpm.services.agents.registry import
|
|
46
|
+
from claude_mpm.services.agents.registry import AgentRegistry
|
|
47
47
|
from claude_mpm.services.agents.registry.modification_tracker import (
|
|
48
48
|
AgentModification,
|
|
49
49
|
AgentModificationTracker,
|
|
@@ -841,7 +841,7 @@ class AgentLifecycleManager(BaseService):
|
|
|
841
841
|
patterns = [
|
|
842
842
|
f"agent_profile:{agent_name}:*",
|
|
843
843
|
f"task_prompt:{agent_name}:*",
|
|
844
|
-
|
|
844
|
+
"agent_registry_discovery",
|
|
845
845
|
f"agent_profile_enhanced:{agent_name}:*",
|
|
846
846
|
]
|
|
847
847
|
|
|
@@ -7,10 +7,8 @@ Extracted from AgentDeploymentService as part of the refactoring to improve
|
|
|
7
7
|
maintainability and testability.
|
|
8
8
|
"""
|
|
9
9
|
|
|
10
|
-
import logging
|
|
11
10
|
import time
|
|
12
|
-
from
|
|
13
|
-
from typing import Any, Dict, List
|
|
11
|
+
from typing import Any, Dict
|
|
14
12
|
|
|
15
13
|
from claude_mpm.core.logging_config import get_logger
|
|
16
14
|
|
|
@@ -194,7 +192,7 @@ class AgentMetricsCollector:
|
|
|
194
192
|
# Calculate additional performance metrics
|
|
195
193
|
deployment_times = self._deployment_metrics["deployment_times"]
|
|
196
194
|
|
|
197
|
-
|
|
195
|
+
return {
|
|
198
196
|
"total_deployments": metrics["total_deployments"],
|
|
199
197
|
"success_rate": metrics["success_rate_percent"],
|
|
200
198
|
"average_time_ms": metrics["average_deployment_time_ms"],
|
|
@@ -205,8 +203,6 @@ class AgentMetricsCollector:
|
|
|
205
203
|
"error_rate_percent": self._calculate_error_rate(),
|
|
206
204
|
}
|
|
207
205
|
|
|
208
|
-
return performance_summary
|
|
209
|
-
|
|
210
206
|
def _categorize_error(self, error: str) -> str:
|
|
211
207
|
"""
|
|
212
208
|
Categorize an error message into a type for tracking.
|
|
@@ -221,16 +217,15 @@ class AgentMetricsCollector:
|
|
|
221
217
|
|
|
222
218
|
if "json" in error_lower or "parse" in error_lower:
|
|
223
219
|
return "parsing_error"
|
|
224
|
-
|
|
220
|
+
if "file" in error_lower or "path" in error_lower:
|
|
225
221
|
return "file_error"
|
|
226
|
-
|
|
222
|
+
if "version" in error_lower:
|
|
227
223
|
return "version_error"
|
|
228
|
-
|
|
224
|
+
if "template" in error_lower:
|
|
229
225
|
return "template_error"
|
|
230
|
-
|
|
226
|
+
if "validation" in error_lower:
|
|
231
227
|
return "validation_error"
|
|
232
|
-
|
|
233
|
-
return "other_error"
|
|
228
|
+
return "other_error"
|
|
234
229
|
|
|
235
230
|
def _extract_agent_type(self, agent_name: str) -> str:
|
|
236
231
|
"""
|
|
@@ -247,18 +242,17 @@ class AgentMetricsCollector:
|
|
|
247
242
|
# Common agent type patterns
|
|
248
243
|
if "security" in name_lower:
|
|
249
244
|
return "security"
|
|
250
|
-
|
|
245
|
+
if "qa" in name_lower or "test" in name_lower:
|
|
251
246
|
return "qa"
|
|
252
|
-
|
|
247
|
+
if "doc" in name_lower:
|
|
253
248
|
return "documentation"
|
|
254
|
-
|
|
249
|
+
if "data" in name_lower:
|
|
255
250
|
return "data"
|
|
256
|
-
|
|
251
|
+
if "ops" in name_lower:
|
|
257
252
|
return "operations"
|
|
258
|
-
|
|
253
|
+
if "research" in name_lower:
|
|
259
254
|
return "research"
|
|
260
|
-
|
|
261
|
-
return "general"
|
|
255
|
+
return "general"
|
|
262
256
|
|
|
263
257
|
def _get_most_common_agent_type(self) -> str:
|
|
264
258
|
"""Get the most commonly deployed agent type."""
|
|
@@ -8,7 +8,6 @@ maintainability and testability.
|
|
|
8
8
|
"""
|
|
9
9
|
|
|
10
10
|
import json
|
|
11
|
-
import logging
|
|
12
11
|
from pathlib import Path
|
|
13
12
|
from typing import Any, Dict, List
|
|
14
13
|
|
|
@@ -31,7 +30,11 @@ class AgentTemplateBuilder:
|
|
|
31
30
|
self.logger = get_logger(__name__)
|
|
32
31
|
|
|
33
32
|
def build_agent_markdown(
|
|
34
|
-
self,
|
|
33
|
+
self,
|
|
34
|
+
agent_name: str,
|
|
35
|
+
template_path: Path,
|
|
36
|
+
base_agent_data: dict,
|
|
37
|
+
source_info: str = "unknown",
|
|
35
38
|
) -> str:
|
|
36
39
|
"""
|
|
37
40
|
Build a complete agent markdown file with YAML frontmatter.
|
|
@@ -62,8 +65,10 @@ class AgentTemplateBuilder:
|
|
|
62
65
|
# Extract tools from template with fallback
|
|
63
66
|
# Handle both dict and list formats for capabilities (backward compatibility)
|
|
64
67
|
capabilities = template_data.get("capabilities", {})
|
|
65
|
-
capabilities_tools =
|
|
66
|
-
|
|
68
|
+
capabilities_tools = (
|
|
69
|
+
capabilities.get("tools") if isinstance(capabilities, dict) else None
|
|
70
|
+
)
|
|
71
|
+
|
|
67
72
|
tools = (
|
|
68
73
|
template_data.get("tools")
|
|
69
74
|
or capabilities_tools
|
|
@@ -72,8 +77,10 @@ class AgentTemplateBuilder:
|
|
|
72
77
|
)
|
|
73
78
|
|
|
74
79
|
# Extract model from template with fallback
|
|
75
|
-
capabilities_model =
|
|
76
|
-
|
|
80
|
+
capabilities_model = (
|
|
81
|
+
capabilities.get("model") if isinstance(capabilities, dict) else None
|
|
82
|
+
)
|
|
83
|
+
|
|
77
84
|
model = (
|
|
78
85
|
template_data.get("model")
|
|
79
86
|
or capabilities_model
|
|
@@ -82,10 +89,7 @@ class AgentTemplateBuilder:
|
|
|
82
89
|
)
|
|
83
90
|
|
|
84
91
|
# Convert tools list to comma-separated string (no spaces!)
|
|
85
|
-
if isinstance(tools, list)
|
|
86
|
-
tools_str = ",".join(tools)
|
|
87
|
-
else:
|
|
88
|
-
tools_str = str(tools)
|
|
92
|
+
tools_str = ",".join(tools) if isinstance(tools, list) else str(tools)
|
|
89
93
|
|
|
90
94
|
# Validate tools format - CRITICAL: No spaces allowed!
|
|
91
95
|
if ", " in tools_str:
|
|
@@ -110,7 +114,7 @@ class AgentTemplateBuilder:
|
|
|
110
114
|
model = model_map[model]
|
|
111
115
|
|
|
112
116
|
# Get response format from template or use base agent default
|
|
113
|
-
|
|
117
|
+
template_data.get("response", {}).get("format", "structured")
|
|
114
118
|
|
|
115
119
|
# Create Claude Code compatible name (lowercase, hyphens only)
|
|
116
120
|
claude_code_name = agent_name.lower().replace("_", "-")
|
|
@@ -137,7 +141,11 @@ class AgentTemplateBuilder:
|
|
|
137
141
|
|
|
138
142
|
# Extract custom metadata fields
|
|
139
143
|
metadata = template_data.get("metadata", {})
|
|
140
|
-
agent_version =
|
|
144
|
+
agent_version = (
|
|
145
|
+
template_data.get("agent_version")
|
|
146
|
+
or template_data.get("version")
|
|
147
|
+
or metadata.get("version", "1.0.0")
|
|
148
|
+
)
|
|
141
149
|
agent_type = template_data.get("agent_type", "general")
|
|
142
150
|
# Use the capabilities_model we already extracted earlier
|
|
143
151
|
model_type = capabilities_model or "sonnet"
|
|
@@ -145,14 +153,14 @@ class AgentTemplateBuilder:
|
|
|
145
153
|
# Map our model types to Claude Code format
|
|
146
154
|
if model_type in ["opus", "sonnet", "haiku"]:
|
|
147
155
|
# Use inherit for now - Claude Code seems to prefer this
|
|
148
|
-
|
|
156
|
+
pass
|
|
149
157
|
else:
|
|
150
|
-
|
|
158
|
+
pass
|
|
151
159
|
|
|
152
160
|
# Determine color - prefer template's color, fallback to type-based defaults
|
|
153
161
|
template_metadata = template_data.get("metadata", {})
|
|
154
162
|
template_color = template_metadata.get("color")
|
|
155
|
-
|
|
163
|
+
|
|
156
164
|
if template_color:
|
|
157
165
|
# Use the color specified in the template
|
|
158
166
|
color = template_color
|
|
@@ -170,21 +178,6 @@ class AgentTemplateBuilder:
|
|
|
170
178
|
|
|
171
179
|
# Check if we should include tools field (only if significantly restricting)
|
|
172
180
|
# Claude Code approach: omit tools field unless specifically restricting
|
|
173
|
-
all_available_tools = {
|
|
174
|
-
"Read",
|
|
175
|
-
"Write",
|
|
176
|
-
"Edit",
|
|
177
|
-
"MultiEdit",
|
|
178
|
-
"Bash",
|
|
179
|
-
"Grep",
|
|
180
|
-
"Glob",
|
|
181
|
-
"LS",
|
|
182
|
-
"WebSearch",
|
|
183
|
-
"WebFetch",
|
|
184
|
-
"TodoWrite",
|
|
185
|
-
"Task",
|
|
186
|
-
"Memory",
|
|
187
|
-
}
|
|
188
181
|
|
|
189
182
|
# Convert tools to set for comparison
|
|
190
183
|
agent_tools = set(tools) if isinstance(tools, list) else set(tools.split(","))
|
|
@@ -230,7 +223,7 @@ class AgentTemplateBuilder:
|
|
|
230
223
|
or base_agent_data.get("instructions")
|
|
231
224
|
or "# Agent Instructions\n\nThis agent provides specialized assistance."
|
|
232
225
|
)
|
|
233
|
-
|
|
226
|
+
|
|
234
227
|
# Add memory update instructions if not already present
|
|
235
228
|
if "memory-update" not in content and "Remember" not in content:
|
|
236
229
|
memory_instructions = """
|
|
@@ -296,7 +289,7 @@ Only include memories that are:
|
|
|
296
289
|
raise
|
|
297
290
|
|
|
298
291
|
# Merge narrative and configuration fields
|
|
299
|
-
|
|
292
|
+
self.merge_narrative_fields(base_agent_data, template_data)
|
|
300
293
|
merged_config = self.merge_configuration_fields(base_agent_data, template_data)
|
|
301
294
|
|
|
302
295
|
# Extract essential fields for Claude Code
|
|
@@ -313,15 +306,13 @@ Only include memories that are:
|
|
|
313
306
|
tools_yaml = self.format_yaml_list(tools, 2)
|
|
314
307
|
|
|
315
308
|
# Build YAML content with only essential fields
|
|
316
|
-
|
|
309
|
+
return f"""name: {name}
|
|
317
310
|
description: {description}
|
|
318
311
|
model: {model}
|
|
319
312
|
tools:
|
|
320
313
|
{tools_yaml}
|
|
321
314
|
"""
|
|
322
315
|
|
|
323
|
-
return yaml_content
|
|
324
|
-
|
|
325
316
|
def merge_narrative_fields(self, base_data: dict, template_data: dict) -> dict:
|
|
326
317
|
"""
|
|
327
318
|
Merge narrative fields from base and template, combining arrays.
|
|
@@ -7,10 +7,9 @@ Extracted from AgentDeploymentService as part of the refactoring to improve
|
|
|
7
7
|
maintainability and testability.
|
|
8
8
|
"""
|
|
9
9
|
|
|
10
|
-
import logging
|
|
11
10
|
import re
|
|
12
11
|
from pathlib import Path
|
|
13
|
-
from typing import Any,
|
|
12
|
+
from typing import Any, Tuple
|
|
14
13
|
|
|
15
14
|
from claude_mpm.core.logging_config import get_logger
|
|
16
15
|
|
|
@@ -83,9 +82,8 @@ class AgentVersionManager:
|
|
|
83
82
|
if isinstance(version_tuple, tuple) and len(version_tuple) == 3:
|
|
84
83
|
major, minor, patch = version_tuple
|
|
85
84
|
return f"{major}.{minor}.{patch}"
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
return str(version_tuple)
|
|
85
|
+
# Fallback for legacy format
|
|
86
|
+
return str(version_tuple)
|
|
89
87
|
|
|
90
88
|
def is_old_version_format(self, version_str: str) -> bool:
|
|
91
89
|
"""
|
|
@@ -132,7 +130,7 @@ class AgentVersionManager:
|
|
|
132
130
|
for a, b in zip(v1, v2):
|
|
133
131
|
if a < b:
|
|
134
132
|
return -1
|
|
135
|
-
|
|
133
|
+
if a > b:
|
|
136
134
|
return 1
|
|
137
135
|
return 0
|
|
138
136
|
|
|
@@ -256,9 +254,9 @@ class AgentVersionManager:
|
|
|
256
254
|
# Extract agent version from template
|
|
257
255
|
metadata = template_data.get("metadata", {})
|
|
258
256
|
current_agent_version = self.parse_version(
|
|
259
|
-
template_data.get("agent_version")
|
|
260
|
-
template_data.get("version")
|
|
261
|
-
metadata.get("version", 0)
|
|
257
|
+
template_data.get("agent_version")
|
|
258
|
+
or template_data.get("version")
|
|
259
|
+
or metadata.get("version", 0)
|
|
262
260
|
)
|
|
263
261
|
|
|
264
262
|
# If old format detected, always trigger update for migration
|
|
@@ -16,10 +16,10 @@ class AgentVersionManager:
|
|
|
16
16
|
|
|
17
17
|
if change_type == "major":
|
|
18
18
|
return f"{major + 1}.0.0"
|
|
19
|
-
|
|
19
|
+
if change_type == "minor":
|
|
20
20
|
return f"{major}.{minor + 1}.0"
|
|
21
|
-
|
|
22
|
-
|
|
21
|
+
# patch
|
|
22
|
+
return f"{major}.{minor}.{patch + 1}"
|
|
23
23
|
|
|
24
24
|
def validate_version(self, version: str) -> bool:
|
|
25
25
|
"""Validate version format."""
|
|
@@ -27,10 +27,10 @@ class AgentsDirectoryResolver:
|
|
|
27
27
|
def determine_agents_directory(self, target_dir: Optional[Path]) -> Path:
|
|
28
28
|
"""
|
|
29
29
|
Determine the correct agents directory based on input.
|
|
30
|
-
|
|
30
|
+
|
|
31
31
|
MODIFIED: Always deploy to project .claude/agents directory
|
|
32
32
|
regardless of agent source (system, user, or project).
|
|
33
|
-
|
|
33
|
+
|
|
34
34
|
This ensures all agents are deployed at the project level while
|
|
35
35
|
maintaining discovery from both user (~/.claude-mpm) and project
|
|
36
36
|
(.claude-mpm) directories.
|
|
@@ -53,12 +53,11 @@ class AgentsDirectoryResolver:
|
|
|
53
53
|
if target_dir.name == "agents":
|
|
54
54
|
# Already an agents directory, use as-is
|
|
55
55
|
return target_dir
|
|
56
|
-
|
|
56
|
+
if target_dir.name == ".claude-mpm":
|
|
57
57
|
# .claude-mpm directory, add agents subdirectory
|
|
58
58
|
return target_dir / "agents"
|
|
59
|
-
|
|
59
|
+
if target_dir.name == ".claude":
|
|
60
60
|
# .claude directory, add agents subdirectory
|
|
61
61
|
return target_dir / "agents"
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
return target_dir / ".claude" / "agents"
|
|
62
|
+
# Assume it's a project directory, add .claude/agents
|
|
63
|
+
return target_dir / ".claude" / "agents"
|