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
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Memory Format Service - Handles memory content formatting and parsing."""
|
|
3
|
+
|
|
4
|
+
import logging
|
|
5
|
+
import re
|
|
6
|
+
from datetime import datetime
|
|
7
|
+
from typing import Dict, List
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class MemoryFormatService:
|
|
11
|
+
"""Service for memory content formatting and parsing."""
|
|
12
|
+
|
|
13
|
+
def __init__(self):
|
|
14
|
+
"""Initialize the memory format service."""
|
|
15
|
+
self.logger = logging.getLogger(__name__)
|
|
16
|
+
|
|
17
|
+
def build_simple_memory_content(self, agent_id: str, items: List[str]) -> str:
|
|
18
|
+
"""Build memory content as a simple list with header and timestamp.
|
|
19
|
+
|
|
20
|
+
Args:
|
|
21
|
+
agent_id: Agent identifier for the header
|
|
22
|
+
items: List of memory items
|
|
23
|
+
|
|
24
|
+
Returns:
|
|
25
|
+
Formatted memory content string
|
|
26
|
+
"""
|
|
27
|
+
# Build header
|
|
28
|
+
header = f"# {agent_id.title()} Agent Memory\n\n"
|
|
29
|
+
header += f"Last Updated: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\n\n"
|
|
30
|
+
header += "## Learnings\n\n"
|
|
31
|
+
|
|
32
|
+
# Build item list
|
|
33
|
+
item_lines = []
|
|
34
|
+
for item in items:
|
|
35
|
+
# Clean and format each item
|
|
36
|
+
item = item.strip()
|
|
37
|
+
if item and not item.startswith("- "):
|
|
38
|
+
item = f"- {item}"
|
|
39
|
+
if item:
|
|
40
|
+
item_lines.append(item)
|
|
41
|
+
|
|
42
|
+
# Combine
|
|
43
|
+
content = header + "\n".join(item_lines)
|
|
44
|
+
if item_lines:
|
|
45
|
+
content += "\n"
|
|
46
|
+
|
|
47
|
+
return content
|
|
48
|
+
|
|
49
|
+
def parse_memory_list(self, memory_content: str) -> List[str]:
|
|
50
|
+
"""Parse memory content into a simple list.
|
|
51
|
+
|
|
52
|
+
Args:
|
|
53
|
+
memory_content: Raw memory content
|
|
54
|
+
|
|
55
|
+
Returns:
|
|
56
|
+
List of memory items (without "- " prefix)
|
|
57
|
+
"""
|
|
58
|
+
items = []
|
|
59
|
+
lines = memory_content.split("\n")
|
|
60
|
+
|
|
61
|
+
for line in lines:
|
|
62
|
+
line = line.strip()
|
|
63
|
+
# Skip headers, empty lines, and metadata
|
|
64
|
+
if (
|
|
65
|
+
not line
|
|
66
|
+
or line.startswith("#")
|
|
67
|
+
or line.startswith("Last Updated:")
|
|
68
|
+
or line.startswith("**")
|
|
69
|
+
or line == "---"
|
|
70
|
+
):
|
|
71
|
+
continue
|
|
72
|
+
|
|
73
|
+
# Extract list items
|
|
74
|
+
if line.startswith("- "):
|
|
75
|
+
item = line[2:].strip()
|
|
76
|
+
if item:
|
|
77
|
+
items.append(item)
|
|
78
|
+
elif line and not any(
|
|
79
|
+
line.startswith(p) for p in ["#", "**", "Last Updated:", "---"]
|
|
80
|
+
):
|
|
81
|
+
# Include non-list items that aren't headers
|
|
82
|
+
items.append(line)
|
|
83
|
+
|
|
84
|
+
return items
|
|
85
|
+
|
|
86
|
+
def parse_memory_sections(self, memory_content: str) -> Dict[str, List[str]]:
|
|
87
|
+
"""Parse memory content into sections and items.
|
|
88
|
+
|
|
89
|
+
Args:
|
|
90
|
+
memory_content: Raw memory file content
|
|
91
|
+
|
|
92
|
+
Returns:
|
|
93
|
+
Dict mapping section names to lists of items
|
|
94
|
+
"""
|
|
95
|
+
sections = {}
|
|
96
|
+
current_section = None
|
|
97
|
+
current_items = []
|
|
98
|
+
|
|
99
|
+
for line in memory_content.split("\n"):
|
|
100
|
+
# Check for section header (## Section Name)
|
|
101
|
+
if line.startswith("## "):
|
|
102
|
+
# Save previous section if exists
|
|
103
|
+
if current_section and current_items:
|
|
104
|
+
sections[current_section] = current_items
|
|
105
|
+
# Start new section
|
|
106
|
+
current_section = line[3:].strip()
|
|
107
|
+
current_items = []
|
|
108
|
+
# Check for list item
|
|
109
|
+
elif line.startswith("- ") and current_section:
|
|
110
|
+
item = line[2:].strip()
|
|
111
|
+
if item:
|
|
112
|
+
current_items.append(item)
|
|
113
|
+
|
|
114
|
+
# Save last section
|
|
115
|
+
if current_section and current_items:
|
|
116
|
+
sections[current_section] = current_items
|
|
117
|
+
|
|
118
|
+
return sections
|
|
119
|
+
|
|
120
|
+
def clean_template_placeholders(
|
|
121
|
+
self,
|
|
122
|
+
content: str,
|
|
123
|
+
preserve_structure: bool = False,
|
|
124
|
+
agent_id: str = "agent",
|
|
125
|
+
) -> str:
|
|
126
|
+
"""Clean template placeholders from memory content.
|
|
127
|
+
|
|
128
|
+
WHY: Default templates contain placeholder text that should be removed
|
|
129
|
+
when adding real memories. This method cleans those placeholders while
|
|
130
|
+
preserving any actual content.
|
|
131
|
+
|
|
132
|
+
Args:
|
|
133
|
+
content: Memory content to clean
|
|
134
|
+
preserve_structure: If True, preserve empty sections
|
|
135
|
+
agent_id: Agent ID for context
|
|
136
|
+
|
|
137
|
+
Returns:
|
|
138
|
+
Cleaned content string
|
|
139
|
+
"""
|
|
140
|
+
if not content:
|
|
141
|
+
return content
|
|
142
|
+
|
|
143
|
+
# Patterns to remove
|
|
144
|
+
placeholder_patterns = [
|
|
145
|
+
r"\[Agent will add.*?\]",
|
|
146
|
+
r"\[No .* yet\]",
|
|
147
|
+
r"<!-- .* -->",
|
|
148
|
+
r"No items yet.*",
|
|
149
|
+
r"Memory items will be added.*",
|
|
150
|
+
r"\*\*Note:.*?\*\*",
|
|
151
|
+
]
|
|
152
|
+
|
|
153
|
+
cleaned = content
|
|
154
|
+
for pattern in placeholder_patterns:
|
|
155
|
+
cleaned = re.sub(pattern, "", cleaned, flags=re.IGNORECASE | re.MULTILINE)
|
|
156
|
+
|
|
157
|
+
if not preserve_structure:
|
|
158
|
+
# Remove empty sections
|
|
159
|
+
lines = []
|
|
160
|
+
skip_empty = False
|
|
161
|
+
for line in cleaned.split("\n"):
|
|
162
|
+
if line.startswith("## "):
|
|
163
|
+
skip_empty = True
|
|
164
|
+
lines.append(line)
|
|
165
|
+
elif line.strip() and skip_empty:
|
|
166
|
+
skip_empty = False
|
|
167
|
+
lines.append(line)
|
|
168
|
+
elif not skip_empty:
|
|
169
|
+
lines.append(line)
|
|
170
|
+
|
|
171
|
+
cleaned = "\n".join(lines)
|
|
172
|
+
|
|
173
|
+
# Clean up multiple blank lines
|
|
174
|
+
cleaned = re.sub(r"\n{3,}", "\n\n", cleaned)
|
|
175
|
+
|
|
176
|
+
return cleaned.strip()
|
|
177
|
+
|
|
178
|
+
def clean_template_placeholders_list(self, items: List[str]) -> List[str]:
|
|
179
|
+
"""Clean template placeholders from a list of items.
|
|
180
|
+
|
|
181
|
+
Args:
|
|
182
|
+
items: List of items to clean
|
|
183
|
+
|
|
184
|
+
Returns:
|
|
185
|
+
Cleaned list of items
|
|
186
|
+
"""
|
|
187
|
+
cleaned = []
|
|
188
|
+
for item in items:
|
|
189
|
+
# Skip placeholder items
|
|
190
|
+
if any(
|
|
191
|
+
pattern in item.lower()
|
|
192
|
+
for pattern in [
|
|
193
|
+
"[agent will add",
|
|
194
|
+
"[no ",
|
|
195
|
+
"no items yet",
|
|
196
|
+
"memory items will be added",
|
|
197
|
+
]
|
|
198
|
+
):
|
|
199
|
+
continue
|
|
200
|
+
cleaned.append(item)
|
|
201
|
+
return cleaned
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Memory Limits Service - Manages memory size limits and configuration."""
|
|
3
|
+
|
|
4
|
+
import logging
|
|
5
|
+
from typing import Any, Dict, Optional
|
|
6
|
+
|
|
7
|
+
from claude_mpm.core.config import Config
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class MemoryLimitsService:
|
|
11
|
+
"""Service for managing memory limits and configuration."""
|
|
12
|
+
|
|
13
|
+
# Default limits
|
|
14
|
+
DEFAULT_MEMORY_LIMITS = {
|
|
15
|
+
"max_file_size_kb": 80, # 80KB (20k tokens)
|
|
16
|
+
"max_items": 100, # Maximum total memory items
|
|
17
|
+
"max_line_length": 120,
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
def __init__(self, config: Optional[Config] = None):
|
|
21
|
+
"""Initialize the memory limits service.
|
|
22
|
+
|
|
23
|
+
Args:
|
|
24
|
+
config: Optional Config object for reading configuration
|
|
25
|
+
"""
|
|
26
|
+
self.config = config or Config()
|
|
27
|
+
self.logger = logging.getLogger(__name__)
|
|
28
|
+
self.memory_limits = self._init_memory_limits()
|
|
29
|
+
|
|
30
|
+
def _init_memory_limits(self) -> Dict[str, Any]:
|
|
31
|
+
"""Initialize memory limits from configuration.
|
|
32
|
+
|
|
33
|
+
Returns:
|
|
34
|
+
Dictionary of memory limits
|
|
35
|
+
"""
|
|
36
|
+
try:
|
|
37
|
+
limits = self.DEFAULT_MEMORY_LIMITS.copy()
|
|
38
|
+
|
|
39
|
+
# Try to load from config
|
|
40
|
+
if hasattr(self.config, "agent_memory_limits"):
|
|
41
|
+
config_limits = self.config.agent_memory_limits
|
|
42
|
+
if isinstance(config_limits, dict):
|
|
43
|
+
limits.update(config_limits)
|
|
44
|
+
|
|
45
|
+
self.logger.debug(f"Initialized memory limits: {limits}")
|
|
46
|
+
return limits
|
|
47
|
+
|
|
48
|
+
except Exception as e:
|
|
49
|
+
self.logger.warning(f"Failed to load memory limits from config: {e}")
|
|
50
|
+
return self.DEFAULT_MEMORY_LIMITS.copy()
|
|
51
|
+
|
|
52
|
+
def get_agent_limits(self, agent_id: str) -> Dict[str, Any]:
|
|
53
|
+
"""Get memory limits for a specific agent.
|
|
54
|
+
|
|
55
|
+
Args:
|
|
56
|
+
agent_id: Agent identifier
|
|
57
|
+
|
|
58
|
+
Returns:
|
|
59
|
+
Dictionary of memory limits for the agent
|
|
60
|
+
"""
|
|
61
|
+
# Start with default limits
|
|
62
|
+
limits = self.memory_limits.copy()
|
|
63
|
+
|
|
64
|
+
# Check for agent-specific overrides
|
|
65
|
+
try:
|
|
66
|
+
if hasattr(self.config, "agents") and agent_id in self.config.agents:
|
|
67
|
+
agent_config = self.config.agents[agent_id]
|
|
68
|
+
if "memory_limits" in agent_config:
|
|
69
|
+
limits.update(agent_config["memory_limits"])
|
|
70
|
+
except Exception as e:
|
|
71
|
+
self.logger.debug(f"No agent-specific limits for {agent_id}: {e}")
|
|
72
|
+
|
|
73
|
+
return limits
|
|
74
|
+
|
|
75
|
+
def get_agent_auto_learning(self, agent_id: str) -> bool:
|
|
76
|
+
"""Get auto-learning setting for a specific agent.
|
|
77
|
+
|
|
78
|
+
Args:
|
|
79
|
+
agent_id: Agent identifier
|
|
80
|
+
|
|
81
|
+
Returns:
|
|
82
|
+
True if auto-learning is enabled, False otherwise
|
|
83
|
+
"""
|
|
84
|
+
try:
|
|
85
|
+
# Check agent-specific config
|
|
86
|
+
if hasattr(self.config, "agents") and agent_id in self.config.agents:
|
|
87
|
+
agent_config = self.config.agents[agent_id]
|
|
88
|
+
if "auto_learning" in agent_config:
|
|
89
|
+
return agent_config["auto_learning"]
|
|
90
|
+
|
|
91
|
+
# Check global config
|
|
92
|
+
if hasattr(self.config, "agent_auto_learning"):
|
|
93
|
+
return self.config.agent_auto_learning
|
|
94
|
+
|
|
95
|
+
except Exception as e:
|
|
96
|
+
self.logger.debug(f"Error checking auto-learning for {agent_id}: {e}")
|
|
97
|
+
|
|
98
|
+
# Default to True (auto-learning enabled)
|
|
99
|
+
return True
|
|
@@ -15,7 +15,7 @@ This module provides:
|
|
|
15
15
|
import logging
|
|
16
16
|
from datetime import datetime
|
|
17
17
|
from pathlib import Path
|
|
18
|
-
from typing import Any, Dict
|
|
18
|
+
from typing import Any, Dict
|
|
19
19
|
|
|
20
20
|
from claude_mpm.core.config import Config
|
|
21
21
|
|
|
@@ -35,9 +35,7 @@ class MemoryTemplateGenerator:
|
|
|
35
35
|
"Current Technical Context",
|
|
36
36
|
]
|
|
37
37
|
|
|
38
|
-
def __init__(
|
|
39
|
-
self, config: Config, working_directory: Path
|
|
40
|
-
):
|
|
38
|
+
def __init__(self, config: Config, working_directory: Path):
|
|
41
39
|
"""Initialize the template generator.
|
|
42
40
|
|
|
43
41
|
Args:
|
|
@@ -59,8 +57,8 @@ class MemoryTemplateGenerator:
|
|
|
59
57
|
str: The basic memory template content
|
|
60
58
|
"""
|
|
61
59
|
# Convert agent_id to proper name, handling cases like "test_agent" -> "Test"
|
|
62
|
-
|
|
63
|
-
|
|
60
|
+
agent_id.replace("_agent", "").replace("_", " ").title()
|
|
61
|
+
datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
|
64
62
|
|
|
65
63
|
# Create a simple template that agents will populate through learning
|
|
66
64
|
return self._create_basic_memory_template(agent_id, limits)
|
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
"""Agent registry services for discovery and tracking."""
|
|
2
2
|
|
|
3
|
-
from claude_mpm.core.unified_agent_registry import
|
|
4
|
-
|
|
3
|
+
from claude_mpm.core.unified_agent_registry import (
|
|
4
|
+
AgentMetadata,
|
|
5
|
+
AgentTier,
|
|
6
|
+
AgentType,
|
|
7
|
+
UnifiedAgentRegistry as AgentRegistry,
|
|
8
|
+
)
|
|
5
9
|
|
|
6
10
|
from .deployed_agent_discovery import DeployedAgentDiscovery
|
|
7
11
|
from .modification_tracker import (
|
|
@@ -13,14 +17,14 @@ from .modification_tracker import (
|
|
|
13
17
|
)
|
|
14
18
|
|
|
15
19
|
__all__ = [
|
|
16
|
-
"AgentRegistry",
|
|
17
20
|
"AgentMetadata",
|
|
21
|
+
"AgentModification",
|
|
22
|
+
"AgentModificationTracker",
|
|
23
|
+
"AgentRegistry",
|
|
18
24
|
"AgentTier",
|
|
19
25
|
"AgentType",
|
|
20
26
|
"DeployedAgentDiscovery",
|
|
21
|
-
"AgentModificationTracker",
|
|
22
|
-
"ModificationType",
|
|
23
|
-
"ModificationTier",
|
|
24
|
-
"AgentModification",
|
|
25
27
|
"ModificationHistory",
|
|
28
|
+
"ModificationTier",
|
|
29
|
+
"ModificationType",
|
|
26
30
|
]
|
|
@@ -19,7 +19,11 @@ logger = logging.getLogger(__name__)
|
|
|
19
19
|
class DeployedAgentDiscovery(ConfigServiceBase):
|
|
20
20
|
"""Discovers and analyzes deployed agents in the project."""
|
|
21
21
|
|
|
22
|
-
def __init__(
|
|
22
|
+
def __init__(
|
|
23
|
+
self,
|
|
24
|
+
project_root: Optional[Path] = None,
|
|
25
|
+
config: Optional[Dict[str, Any]] = None,
|
|
26
|
+
):
|
|
23
27
|
"""Initialize the discovery service.
|
|
24
28
|
|
|
25
29
|
Args:
|
|
@@ -32,7 +36,7 @@ class DeployedAgentDiscovery(ConfigServiceBase):
|
|
|
32
36
|
self.project_root = self.get_config_value(
|
|
33
37
|
"project_root",
|
|
34
38
|
default=project_root or get_path_manager().project_root,
|
|
35
|
-
config_type=Path
|
|
39
|
+
config_type=Path,
|
|
36
40
|
)
|
|
37
41
|
self.agent_registry = AgentRegistryAdapter()
|
|
38
42
|
self.logger.debug(
|
|
@@ -111,7 +115,7 @@ class DeployedAgentDiscovery(ConfigServiceBase):
|
|
|
111
115
|
"tools": agent.get("tools", []),
|
|
112
116
|
}
|
|
113
117
|
# Handle object format with metadata (new standardized schema)
|
|
114
|
-
|
|
118
|
+
if hasattr(agent, "metadata"):
|
|
115
119
|
return {
|
|
116
120
|
"id": agent.agent_id,
|
|
117
121
|
"name": agent.metadata.name,
|
|
@@ -125,28 +129,27 @@ class DeployedAgentDiscovery(ConfigServiceBase):
|
|
|
125
129
|
else []
|
|
126
130
|
),
|
|
127
131
|
}
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
"description"
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
}
|
|
132
|
+
# Legacy object format fallback
|
|
133
|
+
agent_type = getattr(agent, "type", None)
|
|
134
|
+
agent_name = getattr(agent, "name", None)
|
|
135
|
+
|
|
136
|
+
# Generate name from type if name not present
|
|
137
|
+
if not agent_name and agent_type:
|
|
138
|
+
agent_name = agent_type.replace("_", " ").title()
|
|
139
|
+
elif not agent_name:
|
|
140
|
+
agent_name = "Unknown Agent"
|
|
141
|
+
|
|
142
|
+
return {
|
|
143
|
+
"id": getattr(agent, "agent_id", agent_type or "unknown"),
|
|
144
|
+
"name": agent_name,
|
|
145
|
+
"description": getattr(
|
|
146
|
+
agent, "description", "No description available"
|
|
147
|
+
),
|
|
148
|
+
"specializations": getattr(agent, "specializations", []),
|
|
149
|
+
"capabilities": {},
|
|
150
|
+
"source_tier": self._determine_source_tier(agent),
|
|
151
|
+
"tools": getattr(agent, "tools", []),
|
|
152
|
+
}
|
|
150
153
|
except Exception as e:
|
|
151
154
|
logger.error(f"Error extracting agent info: {e}")
|
|
152
155
|
return None
|
|
@@ -163,7 +166,7 @@ class DeployedAgentDiscovery(ConfigServiceBase):
|
|
|
163
166
|
try:
|
|
164
167
|
path = Path(agent_path)
|
|
165
168
|
if path.exists() and path.suffix == ".json":
|
|
166
|
-
with open(path
|
|
169
|
+
with open(path) as f:
|
|
167
170
|
return json.load(f)
|
|
168
171
|
except Exception as e:
|
|
169
172
|
logger.warning(f"Failed to load full agent data from {agent_path}: {e}")
|
|
@@ -223,7 +226,7 @@ class DeployedAgentDiscovery(ConfigServiceBase):
|
|
|
223
226
|
source_path = str(agent.source_path)
|
|
224
227
|
if ".claude/agents" in source_path:
|
|
225
228
|
return "project"
|
|
226
|
-
|
|
229
|
+
if str(Path.home()) in source_path:
|
|
227
230
|
return "user"
|
|
228
231
|
|
|
229
232
|
# Default to system tier
|
|
@@ -26,7 +26,6 @@ import asyncio
|
|
|
26
26
|
import hashlib
|
|
27
27
|
import json
|
|
28
28
|
import logging
|
|
29
|
-
import os
|
|
30
29
|
import shutil
|
|
31
30
|
import time
|
|
32
31
|
import uuid
|
|
@@ -42,8 +41,6 @@ from claude_mpm.core.base_service import BaseService
|
|
|
42
41
|
from claude_mpm.core.unified_agent_registry import UnifiedAgentRegistry as AgentRegistry
|
|
43
42
|
from claude_mpm.core.unified_paths import get_path_manager
|
|
44
43
|
from claude_mpm.services.memory.cache.shared_prompt_cache import SharedPromptCache
|
|
45
|
-
from claude_mpm.utils.config_manager import ConfigurationManager
|
|
46
|
-
from claude_mpm.utils.path_operations import path_ops
|
|
47
44
|
|
|
48
45
|
# ============================================================================
|
|
49
46
|
# Data Models
|
|
@@ -664,7 +661,7 @@ class AgentModificationTracker(BaseService):
|
|
|
664
661
|
# Load active modifications
|
|
665
662
|
active_path = self.persistence_root / "active_modifications.json"
|
|
666
663
|
if active_path.exists():
|
|
667
|
-
with open(active_path
|
|
664
|
+
with open(active_path) as f:
|
|
668
665
|
data = json.load(f)
|
|
669
666
|
self.active_modifications = {
|
|
670
667
|
k: AgentModification.from_dict(v) for k, v in data.items()
|
|
@@ -672,7 +669,7 @@ class AgentModificationTracker(BaseService):
|
|
|
672
669
|
|
|
673
670
|
# Load modification history
|
|
674
671
|
for history_file in self.history_root.glob("*.json"):
|
|
675
|
-
with open(history_file
|
|
672
|
+
with open(history_file) as f:
|
|
676
673
|
data = json.load(f)
|
|
677
674
|
agent_name = data["agent_name"]
|
|
678
675
|
history = ModificationHistory(agent_name=agent_name)
|
|
@@ -770,7 +767,7 @@ class AgentModificationTracker(BaseService):
|
|
|
770
767
|
if backup_dir.is_dir():
|
|
771
768
|
metadata_path = backup_dir / "metadata.json"
|
|
772
769
|
if metadata_path.exists():
|
|
773
|
-
with open(metadata_path
|
|
770
|
+
with open(metadata_path) as f:
|
|
774
771
|
metadata = json.load(f)
|
|
775
772
|
if metadata.get("backup_time", 0) < cutoff_time:
|
|
776
773
|
shutil.rmtree(backup_dir)
|
|
@@ -15,7 +15,6 @@ Key Features:
|
|
|
15
15
|
- Configuration via .claude-mpm/configuration.yaml
|
|
16
16
|
"""
|
|
17
17
|
|
|
18
|
-
import asyncio
|
|
19
18
|
import json
|
|
20
19
|
import logging
|
|
21
20
|
import logging.handlers
|
|
@@ -27,7 +26,7 @@ from datetime import datetime
|
|
|
27
26
|
from enum import Enum
|
|
28
27
|
from queue import Full, Queue
|
|
29
28
|
from threading import Lock, Thread
|
|
30
|
-
from typing import Any,
|
|
29
|
+
from typing import Any, Dict, Optional
|
|
31
30
|
|
|
32
31
|
from claude_mpm.core.constants import PerformanceConfig, SystemLimits, TimeoutConfig
|
|
33
32
|
|
|
@@ -159,8 +159,7 @@ class ClaudeSessionLogger:
|
|
|
159
159
|
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S_%f")
|
|
160
160
|
|
|
161
161
|
# Create filename: session_id-agent-timestamp.json
|
|
162
|
-
|
|
163
|
-
return filename
|
|
162
|
+
return f"{self.session_id}-{agent_name}-{timestamp}.json"
|
|
164
163
|
|
|
165
164
|
def log_response(
|
|
166
165
|
self,
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"""CLI services package.
|
|
2
|
+
|
|
3
|
+
Services specifically for CLI command support and utilities.
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
from .agent_dependency_service import AgentDependencyService, IAgentDependencyService
|
|
7
|
+
from .agent_validation_service import AgentValidationService, IAgentValidationService
|
|
8
|
+
from .startup_checker import IStartupChecker, StartupCheckerService, StartupWarning
|
|
9
|
+
|
|
10
|
+
__all__ = [
|
|
11
|
+
"AgentDependencyService",
|
|
12
|
+
"AgentValidationService",
|
|
13
|
+
"IAgentDependencyService",
|
|
14
|
+
"IAgentValidationService",
|
|
15
|
+
"IStartupChecker",
|
|
16
|
+
"StartupCheckerService",
|
|
17
|
+
"StartupWarning",
|
|
18
|
+
]
|