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
|
@@ -12,98 +12,95 @@ from typing import Any, Dict, List, Optional
|
|
|
12
12
|
|
|
13
13
|
class CommonArguments:
|
|
14
14
|
"""Registry of common argument patterns used across CLI commands."""
|
|
15
|
-
|
|
15
|
+
|
|
16
16
|
# Logging arguments
|
|
17
17
|
VERBOSE = {
|
|
18
18
|
"flags": ["-v", "--verbose"],
|
|
19
19
|
"action": "store_true",
|
|
20
|
-
"help": "Enable verbose output"
|
|
20
|
+
"help": "Enable verbose output",
|
|
21
21
|
}
|
|
22
|
-
|
|
22
|
+
|
|
23
23
|
QUIET = {
|
|
24
24
|
"flags": ["-q", "--quiet"],
|
|
25
|
-
"action": "store_true",
|
|
26
|
-
"help": "Suppress non-error output"
|
|
25
|
+
"action": "store_true",
|
|
26
|
+
"help": "Suppress non-error output",
|
|
27
27
|
}
|
|
28
|
-
|
|
28
|
+
|
|
29
29
|
DEBUG = {
|
|
30
30
|
"flags": ["--debug"],
|
|
31
31
|
"action": "store_true",
|
|
32
|
-
"help": "Enable debug logging"
|
|
32
|
+
"help": "Enable debug logging",
|
|
33
33
|
}
|
|
34
|
-
|
|
34
|
+
|
|
35
35
|
# Configuration arguments
|
|
36
36
|
CONFIG_FILE = {
|
|
37
37
|
"flags": ["-c", "--config"],
|
|
38
38
|
"type": Path,
|
|
39
|
-
"help": "Path to configuration file"
|
|
39
|
+
"help": "Path to configuration file",
|
|
40
40
|
}
|
|
41
|
-
|
|
41
|
+
|
|
42
42
|
CONFIG_DIR = {
|
|
43
43
|
"flags": ["--config-dir"],
|
|
44
44
|
"type": Path,
|
|
45
|
-
"help": "Configuration directory path"
|
|
45
|
+
"help": "Configuration directory path",
|
|
46
46
|
}
|
|
47
|
-
|
|
47
|
+
|
|
48
48
|
# Output arguments
|
|
49
49
|
OUTPUT_FORMAT = {
|
|
50
50
|
"flags": ["-f", "--format"],
|
|
51
51
|
"choices": ["json", "yaml", "table", "text"],
|
|
52
52
|
"default": "text",
|
|
53
|
-
"help": "Output format"
|
|
53
|
+
"help": "Output format",
|
|
54
54
|
}
|
|
55
|
-
|
|
55
|
+
|
|
56
56
|
OUTPUT_FILE = {
|
|
57
57
|
"flags": ["-o", "--output"],
|
|
58
58
|
"type": Path,
|
|
59
|
-
"help": "Output file path"
|
|
59
|
+
"help": "Output file path",
|
|
60
60
|
}
|
|
61
|
-
|
|
61
|
+
|
|
62
62
|
# Common flags
|
|
63
63
|
FORCE = {
|
|
64
64
|
"flags": ["--force"],
|
|
65
65
|
"action": "store_true",
|
|
66
|
-
"help": "Force operation without confirmation"
|
|
66
|
+
"help": "Force operation without confirmation",
|
|
67
67
|
}
|
|
68
|
-
|
|
68
|
+
|
|
69
69
|
DRY_RUN = {
|
|
70
70
|
"flags": ["--dry-run"],
|
|
71
71
|
"action": "store_true",
|
|
72
|
-
"help": "Show what would be done without executing"
|
|
72
|
+
"help": "Show what would be done without executing",
|
|
73
73
|
}
|
|
74
|
-
|
|
74
|
+
|
|
75
75
|
# Agent-related arguments
|
|
76
|
-
AGENT_NAME = {
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
AGENT_DIR = {
|
|
82
|
-
"flags": ["--agent-dir"],
|
|
83
|
-
"type": Path,
|
|
84
|
-
"help": "Agent directory path"
|
|
85
|
-
}
|
|
86
|
-
|
|
76
|
+
AGENT_NAME = {"flags": ["--agent"], "help": "Agent name or pattern"}
|
|
77
|
+
|
|
78
|
+
AGENT_DIR = {"flags": ["--agent-dir"], "type": Path, "help": "Agent directory path"}
|
|
79
|
+
|
|
87
80
|
# Memory-related arguments
|
|
88
81
|
MEMORY_DIR = {
|
|
89
82
|
"flags": ["--memory-dir"],
|
|
90
83
|
"type": Path,
|
|
91
|
-
"help": "Memory directory path"
|
|
84
|
+
"help": "Memory directory path",
|
|
92
85
|
}
|
|
93
86
|
|
|
94
87
|
|
|
95
|
-
def add_argument_from_pattern(
|
|
88
|
+
def add_argument_from_pattern(
|
|
89
|
+
parser: argparse.ArgumentParser, pattern: Dict[str, Any]
|
|
90
|
+
) -> None:
|
|
96
91
|
"""Add an argument to parser from a pattern definition."""
|
|
97
92
|
flags = pattern.pop("flags")
|
|
98
93
|
parser.add_argument(*flags, **pattern)
|
|
99
94
|
|
|
100
95
|
|
|
101
|
-
def add_common_arguments(
|
|
102
|
-
|
|
103
|
-
|
|
96
|
+
def add_common_arguments(
|
|
97
|
+
parser: argparse.ArgumentParser,
|
|
98
|
+
include: Optional[List[str]] = None,
|
|
99
|
+
exclude: Optional[List[str]] = None,
|
|
100
|
+
) -> None:
|
|
104
101
|
"""
|
|
105
102
|
Add common arguments to a parser.
|
|
106
|
-
|
|
103
|
+
|
|
107
104
|
Args:
|
|
108
105
|
parser: ArgumentParser to add arguments to
|
|
109
106
|
include: List of argument names to include (if None, includes all)
|
|
@@ -111,13 +108,13 @@ def add_common_arguments(parser: argparse.ArgumentParser,
|
|
|
111
108
|
"""
|
|
112
109
|
# Default common arguments
|
|
113
110
|
common_args = ["verbose", "quiet", "debug", "config_file", "output_format"]
|
|
114
|
-
|
|
111
|
+
|
|
115
112
|
if include is not None:
|
|
116
113
|
common_args = [arg for arg in common_args if arg in include]
|
|
117
|
-
|
|
114
|
+
|
|
118
115
|
if exclude is not None:
|
|
119
116
|
common_args = [arg for arg in common_args if arg not in exclude]
|
|
120
|
-
|
|
117
|
+
|
|
121
118
|
# Map argument names to patterns
|
|
122
119
|
arg_patterns = {
|
|
123
120
|
"verbose": CommonArguments.VERBOSE.copy(),
|
|
@@ -128,7 +125,7 @@ def add_common_arguments(parser: argparse.ArgumentParser,
|
|
|
128
125
|
"force": CommonArguments.FORCE.copy(),
|
|
129
126
|
"dry_run": CommonArguments.DRY_RUN.copy(),
|
|
130
127
|
}
|
|
131
|
-
|
|
128
|
+
|
|
132
129
|
for arg_name in common_args:
|
|
133
130
|
if arg_name in arg_patterns:
|
|
134
131
|
add_argument_from_pattern(parser, arg_patterns[arg_name])
|
|
@@ -137,13 +134,13 @@ def add_common_arguments(parser: argparse.ArgumentParser,
|
|
|
137
134
|
def add_logging_arguments(parser: argparse.ArgumentParser) -> None:
|
|
138
135
|
"""Add logging-related arguments."""
|
|
139
136
|
group = parser.add_argument_group("logging options")
|
|
140
|
-
|
|
137
|
+
|
|
141
138
|
patterns = [
|
|
142
139
|
CommonArguments.VERBOSE.copy(),
|
|
143
|
-
CommonArguments.QUIET.copy(),
|
|
144
|
-
CommonArguments.DEBUG.copy()
|
|
140
|
+
CommonArguments.QUIET.copy(),
|
|
141
|
+
CommonArguments.DEBUG.copy(),
|
|
145
142
|
]
|
|
146
|
-
|
|
143
|
+
|
|
147
144
|
for pattern in patterns:
|
|
148
145
|
add_argument_from_pattern(group, pattern)
|
|
149
146
|
|
|
@@ -151,12 +148,9 @@ def add_logging_arguments(parser: argparse.ArgumentParser) -> None:
|
|
|
151
148
|
def add_config_arguments(parser: argparse.ArgumentParser) -> None:
|
|
152
149
|
"""Add configuration-related arguments."""
|
|
153
150
|
group = parser.add_argument_group("configuration options")
|
|
154
|
-
|
|
155
|
-
patterns = [
|
|
156
|
-
|
|
157
|
-
CommonArguments.CONFIG_DIR.copy()
|
|
158
|
-
]
|
|
159
|
-
|
|
151
|
+
|
|
152
|
+
patterns = [CommonArguments.CONFIG_FILE.copy(), CommonArguments.CONFIG_DIR.copy()]
|
|
153
|
+
|
|
160
154
|
for pattern in patterns:
|
|
161
155
|
add_argument_from_pattern(group, pattern)
|
|
162
156
|
|
|
@@ -164,12 +158,12 @@ def add_config_arguments(parser: argparse.ArgumentParser) -> None:
|
|
|
164
158
|
def add_output_arguments(parser: argparse.ArgumentParser) -> None:
|
|
165
159
|
"""Add output-related arguments."""
|
|
166
160
|
group = parser.add_argument_group("output options")
|
|
167
|
-
|
|
161
|
+
|
|
168
162
|
patterns = [
|
|
169
163
|
CommonArguments.OUTPUT_FORMAT.copy(),
|
|
170
|
-
CommonArguments.OUTPUT_FILE.copy()
|
|
164
|
+
CommonArguments.OUTPUT_FILE.copy(),
|
|
171
165
|
]
|
|
172
|
-
|
|
166
|
+
|
|
173
167
|
for pattern in patterns:
|
|
174
168
|
add_argument_from_pattern(group, pattern)
|
|
175
169
|
|
|
@@ -177,12 +171,9 @@ def add_output_arguments(parser: argparse.ArgumentParser) -> None:
|
|
|
177
171
|
def add_agent_arguments(parser: argparse.ArgumentParser) -> None:
|
|
178
172
|
"""Add agent-related arguments."""
|
|
179
173
|
group = parser.add_argument_group("agent options")
|
|
180
|
-
|
|
181
|
-
patterns = [
|
|
182
|
-
|
|
183
|
-
CommonArguments.AGENT_DIR.copy()
|
|
184
|
-
]
|
|
185
|
-
|
|
174
|
+
|
|
175
|
+
patterns = [CommonArguments.AGENT_NAME.copy(), CommonArguments.AGENT_DIR.copy()]
|
|
176
|
+
|
|
186
177
|
for pattern in patterns:
|
|
187
178
|
add_argument_from_pattern(group, pattern)
|
|
188
179
|
|
|
@@ -190,11 +181,9 @@ def add_agent_arguments(parser: argparse.ArgumentParser) -> None:
|
|
|
190
181
|
def add_memory_arguments(parser: argparse.ArgumentParser) -> None:
|
|
191
182
|
"""Add memory-related arguments."""
|
|
192
183
|
group = parser.add_argument_group("memory options")
|
|
193
|
-
|
|
194
|
-
patterns = [
|
|
195
|
-
|
|
196
|
-
]
|
|
197
|
-
|
|
184
|
+
|
|
185
|
+
patterns = [CommonArguments.MEMORY_DIR.copy()]
|
|
186
|
+
|
|
198
187
|
for pattern in patterns:
|
|
199
188
|
add_argument_from_pattern(group, pattern)
|
|
200
189
|
|
|
@@ -202,11 +191,8 @@ def add_memory_arguments(parser: argparse.ArgumentParser) -> None:
|
|
|
202
191
|
def add_operation_arguments(parser: argparse.ArgumentParser) -> None:
|
|
203
192
|
"""Add operation control arguments."""
|
|
204
193
|
group = parser.add_argument_group("operation options")
|
|
205
|
-
|
|
206
|
-
patterns = [
|
|
207
|
-
|
|
208
|
-
CommonArguments.DRY_RUN.copy()
|
|
209
|
-
]
|
|
210
|
-
|
|
194
|
+
|
|
195
|
+
patterns = [CommonArguments.FORCE.copy(), CommonArguments.DRY_RUN.copy()]
|
|
196
|
+
|
|
211
197
|
for pattern in patterns:
|
|
212
198
|
add_argument_from_pattern(group, pattern)
|
|
@@ -16,19 +16,23 @@ from ...core.shared.config_loader import ConfigLoader
|
|
|
16
16
|
@dataclass
|
|
17
17
|
class CommandResult:
|
|
18
18
|
"""Standard result structure for CLI commands."""
|
|
19
|
-
|
|
19
|
+
|
|
20
20
|
success: bool
|
|
21
21
|
exit_code: int = 0
|
|
22
22
|
message: Optional[str] = None
|
|
23
23
|
data: Optional[Dict[str, Any]] = None
|
|
24
|
-
|
|
24
|
+
|
|
25
25
|
@classmethod
|
|
26
|
-
def success_result(
|
|
26
|
+
def success_result(
|
|
27
|
+
cls, message: Optional[str] = None, data: Optional[Dict[str, Any]] = None
|
|
28
|
+
) -> "CommandResult":
|
|
27
29
|
"""Create a success result."""
|
|
28
30
|
return cls(success=True, exit_code=0, message=message, data=data)
|
|
29
|
-
|
|
31
|
+
|
|
30
32
|
@classmethod
|
|
31
|
-
def error_result(
|
|
33
|
+
def error_result(
|
|
34
|
+
cls, message: str, exit_code: int = 1, data: Optional[Dict[str, Any]] = None
|
|
35
|
+
) -> "CommandResult":
|
|
32
36
|
"""Create an error result."""
|
|
33
37
|
return cls(success=False, exit_code=exit_code, message=message, data=data)
|
|
34
38
|
|
|
@@ -36,18 +40,18 @@ class CommandResult:
|
|
|
36
40
|
class BaseCommand(ABC):
|
|
37
41
|
"""
|
|
38
42
|
Base class for CLI commands to reduce duplication.
|
|
39
|
-
|
|
43
|
+
|
|
40
44
|
Provides common functionality:
|
|
41
45
|
- Logger initialization
|
|
42
46
|
- Configuration loading
|
|
43
47
|
- Working directory handling
|
|
44
48
|
- Standard error handling patterns
|
|
45
49
|
"""
|
|
46
|
-
|
|
50
|
+
|
|
47
51
|
def __init__(self, command_name: str):
|
|
48
52
|
"""
|
|
49
53
|
Initialize base command.
|
|
50
|
-
|
|
54
|
+
|
|
51
55
|
Args:
|
|
52
56
|
command_name: Name of the command for logging
|
|
53
57
|
"""
|
|
@@ -55,7 +59,7 @@ class BaseCommand(ABC):
|
|
|
55
59
|
self.logger = get_logger(f"cli.{command_name}")
|
|
56
60
|
self._config: Optional[Config] = None
|
|
57
61
|
self._working_dir: Optional[Path] = None
|
|
58
|
-
|
|
62
|
+
|
|
59
63
|
@property
|
|
60
64
|
def config(self) -> Config:
|
|
61
65
|
"""Get configuration instance (lazy loaded)."""
|
|
@@ -63,7 +67,7 @@ class BaseCommand(ABC):
|
|
|
63
67
|
config_loader = ConfigLoader()
|
|
64
68
|
self._config = config_loader.load_main_config()
|
|
65
69
|
return self._config
|
|
66
|
-
|
|
70
|
+
|
|
67
71
|
@property
|
|
68
72
|
def working_dir(self) -> Path:
|
|
69
73
|
"""Get working directory (respects CLAUDE_MPM_USER_PWD)."""
|
|
@@ -72,54 +76,57 @@ class BaseCommand(ABC):
|
|
|
72
76
|
user_pwd = os.environ.get("CLAUDE_MPM_USER_PWD", os.getcwd())
|
|
73
77
|
self._working_dir = Path(user_pwd)
|
|
74
78
|
return self._working_dir
|
|
75
|
-
|
|
79
|
+
|
|
76
80
|
def setup_logging(self, args) -> None:
|
|
77
81
|
"""Setup logging based on command arguments."""
|
|
78
82
|
import logging
|
|
79
|
-
|
|
83
|
+
|
|
80
84
|
# Set log level based on arguments
|
|
81
|
-
if hasattr(args,
|
|
85
|
+
if hasattr(args, "debug") and args.debug:
|
|
82
86
|
logging.getLogger().setLevel(logging.DEBUG)
|
|
83
|
-
elif hasattr(args,
|
|
87
|
+
elif hasattr(args, "verbose") and args.verbose:
|
|
84
88
|
logging.getLogger().setLevel(logging.INFO)
|
|
85
|
-
elif hasattr(args,
|
|
89
|
+
elif hasattr(args, "quiet") and args.quiet:
|
|
86
90
|
logging.getLogger().setLevel(logging.WARNING)
|
|
87
|
-
|
|
91
|
+
|
|
88
92
|
def load_config(self, args) -> None:
|
|
89
93
|
"""Load configuration from arguments."""
|
|
90
94
|
config_loader = ConfigLoader()
|
|
91
|
-
if hasattr(args,
|
|
95
|
+
if hasattr(args, "config") and args.config:
|
|
92
96
|
# Use specific config file with ConfigLoader
|
|
93
97
|
from ...core.shared.config_loader import ConfigPattern
|
|
98
|
+
|
|
94
99
|
pattern = ConfigPattern(
|
|
95
100
|
filenames=[Path(args.config).name],
|
|
96
101
|
search_paths=[str(Path(args.config).parent)],
|
|
97
|
-
env_prefix="CLAUDE_MPM_"
|
|
102
|
+
env_prefix="CLAUDE_MPM_",
|
|
103
|
+
)
|
|
104
|
+
self._config = config_loader.load_config(
|
|
105
|
+
pattern, cache_key=f"cli_{args.config}"
|
|
98
106
|
)
|
|
99
|
-
self._config = config_loader.load_config(pattern, cache_key=f"cli_{args.config}")
|
|
100
107
|
else:
|
|
101
108
|
self._config = config_loader.load_main_config()
|
|
102
|
-
|
|
109
|
+
|
|
103
110
|
def validate_args(self, args) -> Optional[str]:
|
|
104
111
|
"""
|
|
105
112
|
Validate command arguments.
|
|
106
|
-
|
|
113
|
+
|
|
107
114
|
Args:
|
|
108
115
|
args: Parsed command arguments
|
|
109
|
-
|
|
116
|
+
|
|
110
117
|
Returns:
|
|
111
118
|
Error message if validation fails, None if valid
|
|
112
119
|
"""
|
|
113
120
|
# Base validation - subclasses can override
|
|
114
121
|
return None
|
|
115
|
-
|
|
122
|
+
|
|
116
123
|
def execute(self, args) -> CommandResult:
|
|
117
124
|
"""
|
|
118
125
|
Execute the command with standard error handling.
|
|
119
|
-
|
|
126
|
+
|
|
120
127
|
Args:
|
|
121
128
|
args: Parsed command arguments
|
|
122
|
-
|
|
129
|
+
|
|
123
130
|
Returns:
|
|
124
131
|
CommandResult with execution status
|
|
125
132
|
"""
|
|
@@ -127,55 +134,56 @@ class BaseCommand(ABC):
|
|
|
127
134
|
# Setup
|
|
128
135
|
self.setup_logging(args)
|
|
129
136
|
self.load_config(args)
|
|
130
|
-
|
|
137
|
+
|
|
131
138
|
# Validate arguments
|
|
132
139
|
validation_error = self.validate_args(args)
|
|
133
140
|
if validation_error:
|
|
134
141
|
return CommandResult.error_result(validation_error)
|
|
135
|
-
|
|
142
|
+
|
|
136
143
|
# Execute command-specific logic
|
|
137
144
|
return self.run(args)
|
|
138
|
-
|
|
145
|
+
|
|
139
146
|
except KeyboardInterrupt:
|
|
140
147
|
self.logger.info("Command interrupted by user")
|
|
141
|
-
return CommandResult.error_result(
|
|
142
|
-
|
|
148
|
+
return CommandResult.error_result(
|
|
149
|
+
"Operation cancelled by user", exit_code=130
|
|
150
|
+
)
|
|
151
|
+
|
|
143
152
|
except Exception as e:
|
|
144
153
|
self.logger.error(f"Command failed: {e}", exc_info=True)
|
|
145
154
|
return CommandResult.error_result(f"Command failed: {e}")
|
|
146
|
-
|
|
155
|
+
|
|
147
156
|
@abstractmethod
|
|
148
157
|
def run(self, args) -> CommandResult:
|
|
149
158
|
"""
|
|
150
159
|
Run the command-specific logic.
|
|
151
|
-
|
|
160
|
+
|
|
152
161
|
Args:
|
|
153
162
|
args: Parsed command arguments
|
|
154
|
-
|
|
163
|
+
|
|
155
164
|
Returns:
|
|
156
165
|
CommandResult with execution status
|
|
157
166
|
"""
|
|
158
|
-
|
|
159
|
-
|
|
167
|
+
|
|
160
168
|
def print_result(self, result: CommandResult, args) -> None:
|
|
161
169
|
"""
|
|
162
170
|
Print command result based on output format.
|
|
163
|
-
|
|
171
|
+
|
|
164
172
|
Args:
|
|
165
173
|
result: Command result to print
|
|
166
174
|
args: Command arguments (for format options)
|
|
167
175
|
"""
|
|
168
176
|
from .output_formatters import format_output
|
|
169
|
-
|
|
177
|
+
|
|
170
178
|
# Determine output format
|
|
171
|
-
output_format = getattr(args,
|
|
172
|
-
|
|
179
|
+
output_format = getattr(args, "format", "text")
|
|
180
|
+
|
|
173
181
|
# Format and print result
|
|
174
182
|
formatted_output = format_output(result, output_format)
|
|
175
|
-
|
|
176
|
-
if hasattr(args,
|
|
183
|
+
|
|
184
|
+
if hasattr(args, "output") and args.output:
|
|
177
185
|
# Write to file
|
|
178
|
-
with open(args.output,
|
|
186
|
+
with open(args.output, "w") as f:
|
|
179
187
|
f.write(formatted_output)
|
|
180
188
|
self.logger.info(f"Output written to {args.output}")
|
|
181
189
|
else:
|
|
@@ -185,11 +193,11 @@ class BaseCommand(ABC):
|
|
|
185
193
|
|
|
186
194
|
class ServiceCommand(BaseCommand):
|
|
187
195
|
"""Base class for commands that work with services."""
|
|
188
|
-
|
|
196
|
+
|
|
189
197
|
def __init__(self, command_name: str, service_class: type):
|
|
190
198
|
"""
|
|
191
199
|
Initialize service command.
|
|
192
|
-
|
|
200
|
+
|
|
193
201
|
Args:
|
|
194
202
|
command_name: Name of the command
|
|
195
203
|
service_class: Service class to instantiate
|
|
@@ -197,7 +205,7 @@ class ServiceCommand(BaseCommand):
|
|
|
197
205
|
super().__init__(command_name)
|
|
198
206
|
self.service_class = service_class
|
|
199
207
|
self._service = None
|
|
200
|
-
|
|
208
|
+
|
|
201
209
|
@property
|
|
202
210
|
def service(self):
|
|
203
211
|
"""Get service instance (lazy loaded)."""
|
|
@@ -208,27 +216,27 @@ class ServiceCommand(BaseCommand):
|
|
|
208
216
|
|
|
209
217
|
class AgentCommand(BaseCommand):
|
|
210
218
|
"""Base class for agent-related commands."""
|
|
211
|
-
|
|
219
|
+
|
|
212
220
|
def get_agent_dir(self, args) -> Path:
|
|
213
221
|
"""Get agent directory from arguments or default."""
|
|
214
|
-
if hasattr(args,
|
|
222
|
+
if hasattr(args, "agent_dir") and args.agent_dir:
|
|
215
223
|
return args.agent_dir
|
|
216
|
-
|
|
224
|
+
|
|
217
225
|
# Default to working directory
|
|
218
226
|
return self.working_dir
|
|
219
|
-
|
|
227
|
+
|
|
220
228
|
def get_agent_pattern(self, args) -> Optional[str]:
|
|
221
229
|
"""Get agent name pattern from arguments."""
|
|
222
|
-
return getattr(args,
|
|
230
|
+
return getattr(args, "agent", None)
|
|
223
231
|
|
|
224
232
|
|
|
225
233
|
class MemoryCommand(BaseCommand):
|
|
226
234
|
"""Base class for memory-related commands."""
|
|
227
|
-
|
|
235
|
+
|
|
228
236
|
def get_memory_dir(self, args) -> Path:
|
|
229
237
|
"""Get memory directory from arguments or default."""
|
|
230
|
-
if hasattr(args,
|
|
238
|
+
if hasattr(args, "memory_dir") and args.memory_dir:
|
|
231
239
|
return args.memory_dir
|
|
232
|
-
|
|
240
|
+
|
|
233
241
|
# Default to .claude-mpm/memories in working directory
|
|
234
242
|
return self.working_dir / ".claude-mpm" / "memories"
|