claude-mpm 4.1.1__py3-none-any.whl → 4.1.3__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/engineer.json +33 -11
- 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 +648 -1098
- 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 +339 -967
- claude_mpm/cli/commands/monitor.py +117 -88
- claude_mpm/cli/commands/run.py +233 -542
- 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 +280 -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 +22 -29
- 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 +500 -680
- 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 -17
- 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 +99 -154
- claude_mpm/hooks/claude_hooks/hook_handler.py +110 -720
- claude_mpm/hooks/claude_hooks/hook_handler_eventbus.py +104 -77
- claude_mpm/hooks/claude_hooks/hook_handler_original.py +1040 -0
- claude_mpm/hooks/claude_hooks/hook_handler_refactored.py +347 -0
- 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/services/__init__.py +13 -0
- claude_mpm/hooks/claude_hooks/services/connection_manager.py +190 -0
- claude_mpm/hooks/claude_hooks/services/duplicate_detector.py +106 -0
- claude_mpm/hooks/claude_hooks/services/state_manager.py +282 -0
- claude_mpm/hooks/claude_hooks/services/subagent_processor.py +374 -0
- 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 +129 -511
- 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/base_agent_locator.py +132 -0
- 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_results_manager.py +185 -0
- 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/single_agent_deployer.py +315 -0
- 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 +157 -503
- 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/memory_categorization_service.py +165 -0
- claude_mpm/services/agents/memory/memory_file_service.py +103 -0
- claude_mpm/services/agents/memory/memory_format_service.py +201 -0
- claude_mpm/services/agents/memory/memory_limits_service.py +99 -0
- claude_mpm/services/agents/memory/template_generator.py +4 -6
- claude_mpm/services/agents/registry/__init__.py +11 -7
- 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/cli/__init__.py +18 -0
- claude_mpm/services/cli/agent_cleanup_service.py +407 -0
- claude_mpm/services/cli/agent_dependency_service.py +395 -0
- claude_mpm/services/cli/agent_listing_service.py +463 -0
- claude_mpm/services/cli/agent_output_formatter.py +605 -0
- claude_mpm/services/cli/agent_validation_service.py +589 -0
- claude_mpm/services/cli/dashboard_launcher.py +424 -0
- claude_mpm/services/cli/memory_crud_service.py +617 -0
- claude_mpm/services/cli/memory_output_formatter.py +604 -0
- claude_mpm/services/cli/session_manager.py +513 -0
- claude_mpm/services/cli/socketio_manager.py +498 -0
- claude_mpm/services/cli/startup_checker.py +370 -0
- 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/cache_manager.py +311 -0
- 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/core/memory_manager.py +637 -0
- claude_mpm/services/core/path_resolver.py +498 -0
- claude_mpm/services/core/service_container.py +520 -0
- claude_mpm/services/core/service_interfaces.py +436 -0
- 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 +152 -97
- 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.3.dist-info}/METADATA +1 -1
- claude_mpm-4.1.3.dist-info/RECORD +528 -0
- claude_mpm/cli/commands/run_config_checker.py +0 -160
- claude_mpm-4.1.1.dist-info/RECORD +0 -494
- {claude_mpm-4.1.1.dist-info → claude_mpm-4.1.3.dist-info}/WHEEL +0 -0
- {claude_mpm-4.1.1.dist-info → claude_mpm-4.1.3.dist-info}/entry_points.txt +0 -0
- {claude_mpm-4.1.1.dist-info → claude_mpm-4.1.3.dist-info}/licenses/LICENSE +0 -0
- {claude_mpm-4.1.1.dist-info → claude_mpm-4.1.3.dist-info}/top_level.txt +0 -0
|
@@ -11,11 +11,8 @@ This service handles:
|
|
|
11
11
|
Extracted from ClaudeRunner to follow Single Responsibility Principle.
|
|
12
12
|
"""
|
|
13
13
|
|
|
14
|
-
import logging
|
|
15
|
-
from typing import Dict, Optional
|
|
16
14
|
|
|
17
15
|
from claude_mpm.core.base_service import BaseService
|
|
18
|
-
from claude_mpm.core.logging_config import get_logger
|
|
19
16
|
from claude_mpm.services.core.interfaces import AgentCapabilitiesInterface
|
|
20
17
|
|
|
21
18
|
|
|
@@ -28,11 +25,9 @@ class AgentCapabilitiesService(BaseService, AgentCapabilitiesInterface):
|
|
|
28
25
|
|
|
29
26
|
async def _initialize(self) -> None:
|
|
30
27
|
"""Initialize the service. No special initialization needed."""
|
|
31
|
-
pass
|
|
32
28
|
|
|
33
29
|
async def _cleanup(self) -> None:
|
|
34
30
|
"""Cleanup service resources. No cleanup needed."""
|
|
35
|
-
pass
|
|
36
31
|
|
|
37
32
|
def generate_agent_capabilities(self, agent_type: str = "general") -> str:
|
|
38
33
|
"""Generate formatted agent capabilities for Claude.
|
|
@@ -108,7 +103,7 @@ class AgentCapabilitiesService(BaseService, AgentCapabilitiesInterface):
|
|
|
108
103
|
|
|
109
104
|
# Group agents by category
|
|
110
105
|
agents_by_category = {}
|
|
111
|
-
for
|
|
106
|
+
for _agent_id, agent_info in discovered_agents.items():
|
|
112
107
|
category = agent_info["category"]
|
|
113
108
|
if category not in agents_by_category:
|
|
114
109
|
agents_by_category[category] = []
|
|
@@ -155,9 +150,9 @@ class AgentCapabilitiesService(BaseService, AgentCapabilitiesInterface):
|
|
|
155
150
|
|
|
156
151
|
self.logger.info(
|
|
157
152
|
f"Generated capabilities for {len(discovered_agents)} agents "
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
153
|
+
f"(project: {tier_counts.get('project', 0)}, "
|
|
154
|
+
f"user: {tier_counts.get('user', 0)}, "
|
|
155
|
+
f"system: {tier_counts.get('system', 0)})"
|
|
161
156
|
)
|
|
162
157
|
return section
|
|
163
158
|
|
|
@@ -227,30 +222,29 @@ class AgentCapabilitiesService(BaseService, AgentCapabilitiesInterface):
|
|
|
227
222
|
|
|
228
223
|
if "engineer" in agent_id_lower or "engineering" in content_lower:
|
|
229
224
|
return "Development"
|
|
230
|
-
|
|
225
|
+
if "research" in agent_id_lower or "research" in content_lower:
|
|
231
226
|
return "Research"
|
|
232
|
-
|
|
227
|
+
if (
|
|
233
228
|
"qa" in agent_id_lower
|
|
234
229
|
or "test" in agent_id_lower
|
|
235
230
|
or "quality" in content_lower
|
|
236
231
|
):
|
|
237
232
|
return "Quality Assurance"
|
|
238
|
-
|
|
233
|
+
if "doc" in agent_id_lower or "documentation" in content_lower:
|
|
239
234
|
return "Documentation"
|
|
240
|
-
|
|
235
|
+
if "security" in agent_id_lower or "security" in content_lower:
|
|
241
236
|
return "Security"
|
|
242
|
-
|
|
237
|
+
if "data" in agent_id_lower or "database" in content_lower:
|
|
243
238
|
return "Data"
|
|
244
|
-
|
|
239
|
+
if (
|
|
245
240
|
"ops" in agent_id_lower
|
|
246
241
|
or "deploy" in agent_id_lower
|
|
247
242
|
or "operations" in content_lower
|
|
248
243
|
):
|
|
249
244
|
return "Operations"
|
|
250
|
-
|
|
245
|
+
if "git" in agent_id_lower or "version" in content_lower:
|
|
251
246
|
return "Version Control"
|
|
252
|
-
|
|
253
|
-
return "General"
|
|
247
|
+
return "General"
|
|
254
248
|
|
|
255
249
|
def _get_fallback_capabilities(self) -> str:
|
|
256
250
|
"""Return fallback agent capabilities when deployed agents can't be read."""
|
|
@@ -40,37 +40,37 @@ from .registry.modification_tracker import (
|
|
|
40
40
|
)
|
|
41
41
|
|
|
42
42
|
__all__ = [
|
|
43
|
+
"AgentCapabilitiesGenerator",
|
|
44
|
+
# Deployment
|
|
45
|
+
"AgentDeploymentService",
|
|
46
|
+
"AgentLifecycleManager",
|
|
47
|
+
"AgentLifecycleRecord",
|
|
48
|
+
# Management
|
|
49
|
+
"AgentManager",
|
|
50
|
+
# Memory
|
|
51
|
+
"AgentMemoryManager",
|
|
52
|
+
"AgentMetadata",
|
|
53
|
+
"AgentModification",
|
|
54
|
+
"AgentModificationTracker",
|
|
55
|
+
"AgentPersistenceService",
|
|
56
|
+
"AgentProfileLoader",
|
|
43
57
|
# Registry
|
|
44
58
|
"AgentRegistry",
|
|
45
|
-
"AgentMetadata",
|
|
46
59
|
"AgentTier",
|
|
47
60
|
"AgentType",
|
|
61
|
+
"AgentVersionManager",
|
|
62
|
+
"BaseAgentManager",
|
|
48
63
|
"DeployedAgentDiscovery",
|
|
49
|
-
"AgentModificationTracker",
|
|
50
|
-
"ModificationType",
|
|
51
|
-
"ModificationTier",
|
|
52
|
-
"AgentModification",
|
|
53
|
-
"ModificationHistory",
|
|
54
64
|
# Loading
|
|
55
65
|
"FrameworkAgentLoader",
|
|
56
|
-
"AgentProfileLoader",
|
|
57
|
-
"BaseAgentManager",
|
|
58
|
-
# Deployment
|
|
59
|
-
"AgentDeploymentService",
|
|
60
|
-
"AgentLifecycleManager",
|
|
61
|
-
"LifecycleState",
|
|
62
66
|
"LifecycleOperation",
|
|
63
|
-
"AgentLifecycleRecord",
|
|
64
67
|
"LifecycleOperationResult",
|
|
65
|
-
"
|
|
66
|
-
|
|
67
|
-
"
|
|
68
|
-
"
|
|
69
|
-
"AgentPersistenceService",
|
|
70
|
-
"PersistenceStrategy",
|
|
68
|
+
"LifecycleState",
|
|
69
|
+
"ModificationHistory",
|
|
70
|
+
"ModificationTier",
|
|
71
|
+
"ModificationType",
|
|
71
72
|
"PersistenceOperation",
|
|
72
73
|
"PersistenceRecord",
|
|
73
|
-
|
|
74
|
-
"
|
|
75
|
-
"AgentCapabilitiesGenerator",
|
|
74
|
+
"PersistenceStrategy",
|
|
75
|
+
"get_memory_manager",
|
|
76
76
|
]
|
|
@@ -9,7 +9,6 @@ This service provides comprehensive agent lifecycle management including:
|
|
|
9
9
|
"""
|
|
10
10
|
|
|
11
11
|
import json
|
|
12
|
-
import logging
|
|
13
12
|
import re
|
|
14
13
|
from datetime import datetime
|
|
15
14
|
from pathlib import Path
|
|
@@ -21,29 +20,38 @@ from claude_mpm.core.logging_config import get_logger
|
|
|
21
20
|
|
|
22
21
|
class AgentBuilderService:
|
|
23
22
|
"""Service for building and managing agent configurations."""
|
|
24
|
-
|
|
23
|
+
|
|
25
24
|
# Valid agent models
|
|
26
25
|
VALID_MODELS = ["sonnet", "opus", "haiku"]
|
|
27
|
-
|
|
26
|
+
|
|
28
27
|
# Valid tool choices
|
|
29
28
|
VALID_TOOL_CHOICES = ["auto", "required", "any", "none"]
|
|
30
|
-
|
|
29
|
+
|
|
31
30
|
# Agent categories
|
|
32
31
|
AGENT_CATEGORIES = [
|
|
33
|
-
"engineering",
|
|
34
|
-
"
|
|
32
|
+
"engineering",
|
|
33
|
+
"qa",
|
|
34
|
+
"documentation",
|
|
35
|
+
"ops",
|
|
36
|
+
"research",
|
|
37
|
+
"security",
|
|
38
|
+
"system",
|
|
39
|
+
"utility",
|
|
35
40
|
]
|
|
36
|
-
|
|
41
|
+
|
|
37
42
|
def __init__(self, templates_dir: Optional[Path] = None):
|
|
38
43
|
"""Initialize the Agent Builder Service.
|
|
39
|
-
|
|
44
|
+
|
|
40
45
|
Args:
|
|
41
46
|
templates_dir: Path to agent templates directory
|
|
42
47
|
"""
|
|
43
48
|
self.logger = get_logger(__name__)
|
|
44
|
-
self.templates_dir =
|
|
49
|
+
self.templates_dir = (
|
|
50
|
+
templates_dir
|
|
51
|
+
or Path(__file__).parent.parent.parent / "agents" / "templates"
|
|
52
|
+
)
|
|
45
53
|
self._template_cache = {}
|
|
46
|
-
|
|
54
|
+
|
|
47
55
|
def create_agent(
|
|
48
56
|
self,
|
|
49
57
|
agent_id: str,
|
|
@@ -53,10 +61,10 @@ class AgentBuilderService:
|
|
|
53
61
|
tool_choice: str = "auto",
|
|
54
62
|
instructions: Optional[str] = None,
|
|
55
63
|
metadata: Optional[Dict[str, Any]] = None,
|
|
56
|
-
base_template: Optional[str] = None
|
|
64
|
+
base_template: Optional[str] = None,
|
|
57
65
|
) -> Dict[str, Any]:
|
|
58
66
|
"""Create a new agent configuration.
|
|
59
|
-
|
|
67
|
+
|
|
60
68
|
Args:
|
|
61
69
|
agent_id: Unique identifier for the agent
|
|
62
70
|
name: Display name for the agent
|
|
@@ -66,10 +74,10 @@ class AgentBuilderService:
|
|
|
66
74
|
instructions: Markdown instructions content
|
|
67
75
|
metadata: Additional agent metadata
|
|
68
76
|
base_template: Optional base template to extend
|
|
69
|
-
|
|
77
|
+
|
|
70
78
|
Returns:
|
|
71
79
|
Complete agent configuration dictionary
|
|
72
|
-
|
|
80
|
+
|
|
73
81
|
Raises:
|
|
74
82
|
AgentDeploymentError: If validation fails
|
|
75
83
|
"""
|
|
@@ -77,79 +85,83 @@ class AgentBuilderService:
|
|
|
77
85
|
self._validate_agent_id(agent_id)
|
|
78
86
|
self._validate_model(model)
|
|
79
87
|
self._validate_tool_choice(tool_choice)
|
|
80
|
-
|
|
88
|
+
|
|
81
89
|
# Start with base template if provided
|
|
82
90
|
if base_template:
|
|
83
91
|
config = self._load_template(base_template)
|
|
84
92
|
config["id"] = agent_id # Override ID
|
|
85
93
|
else:
|
|
86
94
|
config = {}
|
|
87
|
-
|
|
95
|
+
|
|
88
96
|
# Build agent configuration
|
|
89
|
-
config.update(
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
+
config.update(
|
|
98
|
+
{
|
|
99
|
+
"id": agent_id,
|
|
100
|
+
"name": name,
|
|
101
|
+
"prompt": f"{agent_id}.md",
|
|
102
|
+
"model": model,
|
|
103
|
+
"tool_choice": tool_choice,
|
|
104
|
+
}
|
|
105
|
+
)
|
|
106
|
+
|
|
97
107
|
# Build metadata
|
|
98
108
|
agent_metadata = {
|
|
99
109
|
"description": description,
|
|
100
110
|
"version": "1.0.0",
|
|
101
111
|
"created": datetime.now().isoformat(),
|
|
102
112
|
"author": "Agent Manager",
|
|
103
|
-
"category": "custom"
|
|
113
|
+
"category": "custom",
|
|
104
114
|
}
|
|
105
|
-
|
|
115
|
+
|
|
106
116
|
if metadata:
|
|
107
117
|
agent_metadata.update(metadata)
|
|
108
|
-
|
|
118
|
+
|
|
109
119
|
config["metadata"] = agent_metadata
|
|
110
|
-
|
|
120
|
+
|
|
111
121
|
# Generate instructions if not provided
|
|
112
122
|
if instructions is None:
|
|
113
|
-
instructions = self._generate_default_instructions(
|
|
114
|
-
|
|
123
|
+
instructions = self._generate_default_instructions(
|
|
124
|
+
agent_id, name, description
|
|
125
|
+
)
|
|
126
|
+
|
|
115
127
|
return config, instructions
|
|
116
|
-
|
|
128
|
+
|
|
117
129
|
def create_variant(
|
|
118
130
|
self,
|
|
119
131
|
base_agent_id: str,
|
|
120
132
|
variant_id: str,
|
|
121
133
|
variant_name: str,
|
|
122
134
|
modifications: Dict[str, Any],
|
|
123
|
-
instructions_append: Optional[str] = None
|
|
135
|
+
instructions_append: Optional[str] = None,
|
|
124
136
|
) -> Tuple[Dict[str, Any], str]:
|
|
125
137
|
"""Create an agent variant based on an existing agent.
|
|
126
|
-
|
|
138
|
+
|
|
127
139
|
Args:
|
|
128
140
|
base_agent_id: ID of the base agent to extend
|
|
129
141
|
variant_id: Unique ID for the variant
|
|
130
142
|
variant_name: Display name for the variant
|
|
131
143
|
modifications: Configuration changes for the variant
|
|
132
144
|
instructions_append: Additional instructions to append
|
|
133
|
-
|
|
145
|
+
|
|
134
146
|
Returns:
|
|
135
147
|
Tuple of (variant configuration, variant instructions)
|
|
136
|
-
|
|
148
|
+
|
|
137
149
|
Raises:
|
|
138
150
|
AgentDeploymentError: If base agent not found or validation fails
|
|
139
151
|
"""
|
|
140
152
|
# Load base agent
|
|
141
153
|
base_config = self._load_template(base_agent_id)
|
|
142
154
|
base_instructions = self._load_instructions(base_agent_id)
|
|
143
|
-
|
|
155
|
+
|
|
144
156
|
# Validate variant ID
|
|
145
157
|
self._validate_agent_id(variant_id)
|
|
146
|
-
|
|
158
|
+
|
|
147
159
|
# Create variant configuration
|
|
148
160
|
variant_config = base_config.copy()
|
|
149
161
|
variant_config["id"] = variant_id
|
|
150
162
|
variant_config["name"] = variant_name
|
|
151
163
|
variant_config["prompt"] = f"{variant_id}.md"
|
|
152
|
-
|
|
164
|
+
|
|
153
165
|
# Apply modifications
|
|
154
166
|
for key, value in modifications.items():
|
|
155
167
|
if key in ["model", "tool_choice"]:
|
|
@@ -158,165 +170,170 @@ class AgentBuilderService:
|
|
|
158
170
|
elif key == "tool_choice":
|
|
159
171
|
self._validate_tool_choice(value)
|
|
160
172
|
variant_config[key] = value
|
|
161
|
-
|
|
173
|
+
|
|
162
174
|
# Update metadata
|
|
163
175
|
if "metadata" not in variant_config:
|
|
164
176
|
variant_config["metadata"] = {}
|
|
165
|
-
|
|
166
|
-
variant_config["metadata"].update(
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
177
|
+
|
|
178
|
+
variant_config["metadata"].update(
|
|
179
|
+
{
|
|
180
|
+
"base_agent": base_agent_id,
|
|
181
|
+
"variant": True,
|
|
182
|
+
"variant_created": datetime.now().isoformat(),
|
|
183
|
+
}
|
|
184
|
+
)
|
|
185
|
+
|
|
172
186
|
# Build variant instructions
|
|
173
187
|
variant_instructions = f"# {variant_name} (Variant of {base_config.get('name', base_agent_id)})\n\n"
|
|
174
188
|
variant_instructions += base_instructions
|
|
175
|
-
|
|
189
|
+
|
|
176
190
|
if instructions_append:
|
|
177
|
-
variant_instructions +=
|
|
178
|
-
|
|
191
|
+
variant_instructions += (
|
|
192
|
+
f"\n\n## Variant-Specific Instructions\n\n{instructions_append}"
|
|
193
|
+
)
|
|
194
|
+
|
|
179
195
|
return variant_config, variant_instructions
|
|
180
|
-
|
|
196
|
+
|
|
181
197
|
def validate_configuration(self, config: Dict[str, Any]) -> List[str]:
|
|
182
198
|
"""Validate an agent configuration.
|
|
183
|
-
|
|
199
|
+
|
|
184
200
|
Args:
|
|
185
201
|
config: Agent configuration to validate
|
|
186
|
-
|
|
202
|
+
|
|
187
203
|
Returns:
|
|
188
204
|
List of validation errors (empty if valid)
|
|
189
205
|
"""
|
|
190
206
|
errors = []
|
|
191
|
-
|
|
207
|
+
|
|
192
208
|
# Required fields
|
|
193
209
|
required_fields = ["id", "name", "prompt", "model"]
|
|
194
210
|
for field in required_fields:
|
|
195
211
|
if field not in config:
|
|
196
212
|
errors.append(f"Missing required field: {field}")
|
|
197
|
-
|
|
213
|
+
|
|
198
214
|
# Validate ID
|
|
199
215
|
if "id" in config:
|
|
200
216
|
try:
|
|
201
217
|
self._validate_agent_id(config["id"])
|
|
202
218
|
except AgentDeploymentError as e:
|
|
203
219
|
errors.append(str(e))
|
|
204
|
-
|
|
220
|
+
|
|
205
221
|
# Validate model
|
|
206
222
|
if "model" in config:
|
|
207
223
|
try:
|
|
208
224
|
self._validate_model(config["model"])
|
|
209
225
|
except AgentDeploymentError as e:
|
|
210
226
|
errors.append(str(e))
|
|
211
|
-
|
|
227
|
+
|
|
212
228
|
# Validate tool_choice
|
|
213
229
|
if "tool_choice" in config:
|
|
214
230
|
try:
|
|
215
231
|
self._validate_tool_choice(config["tool_choice"])
|
|
216
232
|
except AgentDeploymentError as e:
|
|
217
233
|
errors.append(str(e))
|
|
218
|
-
|
|
234
|
+
|
|
219
235
|
# Validate metadata
|
|
220
|
-
if "metadata" in config:
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
236
|
+
if "metadata" in config and not isinstance(config["metadata"], dict):
|
|
237
|
+
errors.append("Metadata must be a dictionary")
|
|
238
|
+
|
|
224
239
|
return errors
|
|
225
|
-
|
|
240
|
+
|
|
226
241
|
def generate_pm_instructions(
|
|
227
242
|
self,
|
|
228
243
|
delegation_patterns: Optional[List[str]] = None,
|
|
229
244
|
workflow_overrides: Optional[Dict[str, str]] = None,
|
|
230
|
-
custom_rules: Optional[List[str]] = None
|
|
245
|
+
custom_rules: Optional[List[str]] = None,
|
|
231
246
|
) -> str:
|
|
232
247
|
"""Generate customized PM instructions.
|
|
233
|
-
|
|
248
|
+
|
|
234
249
|
Args:
|
|
235
250
|
delegation_patterns: Custom delegation patterns
|
|
236
251
|
workflow_overrides: Workflow sequence modifications
|
|
237
252
|
custom_rules: Additional PM rules
|
|
238
|
-
|
|
253
|
+
|
|
239
254
|
Returns:
|
|
240
255
|
Customized PM instructions markdown
|
|
241
256
|
"""
|
|
242
257
|
instructions = "# Custom PM Instructions\n\n"
|
|
243
|
-
|
|
258
|
+
|
|
244
259
|
if delegation_patterns:
|
|
245
260
|
instructions += "## Custom Delegation Patterns\n\n"
|
|
246
261
|
for pattern in delegation_patterns:
|
|
247
262
|
instructions += f"- {pattern}\n"
|
|
248
263
|
instructions += "\n"
|
|
249
|
-
|
|
264
|
+
|
|
250
265
|
if workflow_overrides:
|
|
251
266
|
instructions += "## Workflow Overrides\n\n"
|
|
252
267
|
for workflow, override in workflow_overrides.items():
|
|
253
268
|
instructions += f"### {workflow}\n{override}\n\n"
|
|
254
|
-
|
|
269
|
+
|
|
255
270
|
if custom_rules:
|
|
256
271
|
instructions += "## Additional Rules\n\n"
|
|
257
272
|
for rule in custom_rules:
|
|
258
273
|
instructions += f"- {rule}\n"
|
|
259
|
-
|
|
274
|
+
|
|
260
275
|
return instructions
|
|
261
|
-
|
|
276
|
+
|
|
262
277
|
def list_available_templates(self) -> List[Dict[str, Any]]:
|
|
263
278
|
"""List all available agent templates.
|
|
264
|
-
|
|
279
|
+
|
|
265
280
|
Returns:
|
|
266
281
|
List of template metadata dictionaries
|
|
267
282
|
"""
|
|
268
283
|
templates = []
|
|
269
|
-
|
|
284
|
+
|
|
270
285
|
if not self.templates_dir.exists():
|
|
271
286
|
return templates
|
|
272
|
-
|
|
287
|
+
|
|
273
288
|
for template_file in self.templates_dir.glob("*.json"):
|
|
274
289
|
try:
|
|
275
|
-
with open(template_file
|
|
290
|
+
with open(template_file) as f:
|
|
276
291
|
config = json.load(f)
|
|
277
|
-
|
|
292
|
+
|
|
278
293
|
# Use filename stem as ID if not specified in config
|
|
279
294
|
template_id = config.get("id") or template_file.stem
|
|
280
|
-
|
|
281
|
-
templates.append(
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
295
|
+
|
|
296
|
+
templates.append(
|
|
297
|
+
{
|
|
298
|
+
"id": template_id,
|
|
299
|
+
"name": config.get("name", template_id),
|
|
300
|
+
"description": config.get("metadata", {}).get("description"),
|
|
301
|
+
"category": config.get("metadata", {}).get("category"),
|
|
302
|
+
"version": config.get("metadata", {}).get("version"),
|
|
303
|
+
"file": str(template_file),
|
|
304
|
+
}
|
|
305
|
+
)
|
|
289
306
|
except Exception as e:
|
|
290
307
|
self.logger.warning(f"Failed to load template {template_file}: {e}")
|
|
291
|
-
|
|
308
|
+
|
|
292
309
|
return templates
|
|
293
|
-
|
|
310
|
+
|
|
294
311
|
def _validate_agent_id(self, agent_id: str) -> None:
|
|
295
312
|
"""Validate agent ID format.
|
|
296
|
-
|
|
313
|
+
|
|
297
314
|
Args:
|
|
298
315
|
agent_id: Agent ID to validate
|
|
299
|
-
|
|
316
|
+
|
|
300
317
|
Raises:
|
|
301
318
|
AgentDeploymentError: If ID is invalid
|
|
302
319
|
"""
|
|
303
320
|
if not agent_id:
|
|
304
321
|
raise AgentDeploymentError("Agent ID cannot be empty")
|
|
305
|
-
|
|
322
|
+
|
|
306
323
|
if len(agent_id) > 50:
|
|
307
324
|
raise AgentDeploymentError("Agent ID must be 50 characters or less")
|
|
308
|
-
|
|
309
|
-
if not re.match(r
|
|
325
|
+
|
|
326
|
+
if not re.match(r"^[a-z0-9-]+$", agent_id):
|
|
310
327
|
raise AgentDeploymentError(
|
|
311
328
|
"Agent ID must contain only lowercase letters, numbers, and hyphens"
|
|
312
329
|
)
|
|
313
|
-
|
|
330
|
+
|
|
314
331
|
def _validate_model(self, model: str) -> None:
|
|
315
332
|
"""Validate model selection.
|
|
316
|
-
|
|
333
|
+
|
|
317
334
|
Args:
|
|
318
335
|
model: Model to validate
|
|
319
|
-
|
|
336
|
+
|
|
320
337
|
Raises:
|
|
321
338
|
AgentDeploymentError: If model is invalid
|
|
322
339
|
"""
|
|
@@ -324,13 +341,13 @@ class AgentBuilderService:
|
|
|
324
341
|
raise AgentDeploymentError(
|
|
325
342
|
f"Invalid model '{model}'. Must be one of: {', '.join(self.VALID_MODELS)}"
|
|
326
343
|
)
|
|
327
|
-
|
|
344
|
+
|
|
328
345
|
def _validate_tool_choice(self, tool_choice: str) -> None:
|
|
329
346
|
"""Validate tool choice setting.
|
|
330
|
-
|
|
347
|
+
|
|
331
348
|
Args:
|
|
332
349
|
tool_choice: Tool choice to validate
|
|
333
|
-
|
|
350
|
+
|
|
334
351
|
Raises:
|
|
335
352
|
AgentDeploymentError: If tool choice is invalid
|
|
336
353
|
"""
|
|
@@ -338,44 +355,44 @@ class AgentBuilderService:
|
|
|
338
355
|
raise AgentDeploymentError(
|
|
339
356
|
f"Invalid tool_choice '{tool_choice}'. Must be one of: {', '.join(self.VALID_TOOL_CHOICES)}"
|
|
340
357
|
)
|
|
341
|
-
|
|
358
|
+
|
|
342
359
|
def _load_template(self, template_id: str) -> Dict[str, Any]:
|
|
343
360
|
"""Load an agent template.
|
|
344
|
-
|
|
361
|
+
|
|
345
362
|
Args:
|
|
346
363
|
template_id: Template ID to load
|
|
347
|
-
|
|
364
|
+
|
|
348
365
|
Returns:
|
|
349
366
|
Template configuration dictionary
|
|
350
|
-
|
|
367
|
+
|
|
351
368
|
Raises:
|
|
352
369
|
AgentDeploymentError: If template not found
|
|
353
370
|
"""
|
|
354
371
|
if template_id in self._template_cache:
|
|
355
372
|
return self._template_cache[template_id].copy()
|
|
356
|
-
|
|
373
|
+
|
|
357
374
|
template_file = self.templates_dir / f"{template_id}.json"
|
|
358
|
-
|
|
375
|
+
|
|
359
376
|
if not template_file.exists():
|
|
360
377
|
raise AgentDeploymentError(f"Template '{template_id}' not found")
|
|
361
|
-
|
|
378
|
+
|
|
362
379
|
try:
|
|
363
|
-
with open(template_file
|
|
380
|
+
with open(template_file) as f:
|
|
364
381
|
config = json.load(f)
|
|
365
382
|
self._template_cache[template_id] = config
|
|
366
383
|
return config.copy()
|
|
367
384
|
except Exception as e:
|
|
368
385
|
raise AgentDeploymentError(f"Failed to load template '{template_id}': {e}")
|
|
369
|
-
|
|
386
|
+
|
|
370
387
|
def _load_instructions(self, agent_id: str) -> str:
|
|
371
388
|
"""Load agent instructions.
|
|
372
|
-
|
|
389
|
+
|
|
373
390
|
Args:
|
|
374
391
|
agent_id: Agent ID to load instructions for
|
|
375
|
-
|
|
392
|
+
|
|
376
393
|
Returns:
|
|
377
394
|
Instructions markdown content
|
|
378
|
-
|
|
395
|
+
|
|
379
396
|
Raises:
|
|
380
397
|
AgentDeploymentError: If instructions not found
|
|
381
398
|
"""
|
|
@@ -383,28 +400,32 @@ class AgentBuilderService:
|
|
|
383
400
|
possible_files = [
|
|
384
401
|
self.templates_dir / f"{agent_id}.md",
|
|
385
402
|
self.templates_dir / f"{agent_id}_instructions.md",
|
|
386
|
-
self.templates_dir / f"{agent_id}-instructions.md"
|
|
403
|
+
self.templates_dir / f"{agent_id}-instructions.md",
|
|
387
404
|
]
|
|
388
|
-
|
|
405
|
+
|
|
389
406
|
for instructions_file in possible_files:
|
|
390
407
|
if instructions_file.exists():
|
|
391
408
|
try:
|
|
392
|
-
with open(instructions_file
|
|
409
|
+
with open(instructions_file) as f:
|
|
393
410
|
return f.read()
|
|
394
411
|
except Exception as e:
|
|
395
|
-
self.logger.warning(
|
|
396
|
-
|
|
412
|
+
self.logger.warning(
|
|
413
|
+
f"Failed to read instructions from {instructions_file}: {e}"
|
|
414
|
+
)
|
|
415
|
+
|
|
397
416
|
# If no instructions found, return empty
|
|
398
417
|
return ""
|
|
399
|
-
|
|
400
|
-
def _generate_default_instructions(
|
|
418
|
+
|
|
419
|
+
def _generate_default_instructions(
|
|
420
|
+
self, agent_id: str, name: str, description: str
|
|
421
|
+
) -> str:
|
|
401
422
|
"""Generate default agent instructions.
|
|
402
|
-
|
|
423
|
+
|
|
403
424
|
Args:
|
|
404
425
|
agent_id: Agent identifier
|
|
405
426
|
name: Agent display name
|
|
406
427
|
description: Agent description
|
|
407
|
-
|
|
428
|
+
|
|
408
429
|
Returns:
|
|
409
430
|
Default instructions markdown
|
|
410
431
|
"""
|
|
@@ -452,4 +473,4 @@ Provide structured responses with:
|
|
|
452
473
|
|
|
453
474
|
*Agent ID: {agent_id}*
|
|
454
475
|
*Generated by Agent Manager*
|
|
455
|
-
"""
|
|
476
|
+
"""
|