claude-mpm 3.9.9__py3-none-any.whl → 4.0.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/VERSION +1 -1
- claude_mpm/__init__.py +2 -2
- claude_mpm/__main__.py +3 -2
- claude_mpm/agents/__init__.py +85 -79
- claude_mpm/agents/agent_loader.py +464 -1003
- claude_mpm/agents/agent_loader_integration.py +45 -45
- claude_mpm/agents/agents_metadata.py +29 -30
- claude_mpm/agents/async_agent_loader.py +156 -138
- claude_mpm/agents/base_agent.json +1 -1
- claude_mpm/agents/base_agent_loader.py +179 -151
- claude_mpm/agents/frontmatter_validator.py +229 -130
- claude_mpm/agents/schema/agent_schema.json +1 -1
- claude_mpm/agents/system_agent_config.py +213 -147
- claude_mpm/agents/templates/__init__.py +13 -13
- claude_mpm/agents/templates/code_analyzer.json +2 -2
- claude_mpm/agents/templates/data_engineer.json +1 -1
- claude_mpm/agents/templates/documentation.json +23 -11
- claude_mpm/agents/templates/engineer.json +22 -6
- claude_mpm/agents/templates/memory_manager.json +155 -0
- claude_mpm/agents/templates/ops.json +2 -2
- claude_mpm/agents/templates/project_organizer.json +1 -1
- claude_mpm/agents/templates/qa.json +1 -1
- claude_mpm/agents/templates/refactoring_engineer.json +222 -0
- claude_mpm/agents/templates/research.json +20 -14
- claude_mpm/agents/templates/security.json +1 -1
- claude_mpm/agents/templates/ticketing.json +1 -1
- claude_mpm/agents/templates/version_control.json +1 -1
- claude_mpm/agents/templates/web_qa.json +3 -1
- claude_mpm/agents/templates/web_ui.json +2 -2
- claude_mpm/cli/__init__.py +90 -49
- claude_mpm/cli/__main__.py +3 -2
- claude_mpm/cli/commands/__init__.py +21 -18
- claude_mpm/cli/commands/agents.py +279 -247
- claude_mpm/cli/commands/aggregate.py +138 -157
- claude_mpm/cli/commands/cleanup.py +147 -147
- claude_mpm/cli/commands/config.py +93 -76
- claude_mpm/cli/commands/info.py +17 -16
- claude_mpm/cli/commands/mcp.py +143 -762
- claude_mpm/cli/commands/mcp_command_router.py +139 -0
- claude_mpm/cli/commands/mcp_config_commands.py +20 -0
- claude_mpm/cli/commands/mcp_install_commands.py +20 -0
- claude_mpm/cli/commands/mcp_server_commands.py +175 -0
- claude_mpm/cli/commands/mcp_tool_commands.py +34 -0
- claude_mpm/cli/commands/memory.py +239 -203
- claude_mpm/cli/commands/monitor.py +203 -81
- claude_mpm/cli/commands/run.py +380 -429
- claude_mpm/cli/commands/run_config_checker.py +160 -0
- claude_mpm/cli/commands/socketio_monitor.py +235 -0
- claude_mpm/cli/commands/tickets.py +305 -197
- claude_mpm/cli/parser.py +24 -1150
- claude_mpm/cli/parsers/__init__.py +29 -0
- claude_mpm/cli/parsers/agents_parser.py +136 -0
- claude_mpm/cli/parsers/base_parser.py +331 -0
- claude_mpm/cli/parsers/config_parser.py +85 -0
- claude_mpm/cli/parsers/mcp_parser.py +152 -0
- claude_mpm/cli/parsers/memory_parser.py +138 -0
- claude_mpm/cli/parsers/monitor_parser.py +104 -0
- claude_mpm/cli/parsers/run_parser.py +147 -0
- claude_mpm/cli/parsers/tickets_parser.py +203 -0
- claude_mpm/cli/ticket_cli.py +7 -3
- claude_mpm/cli/utils.py +55 -37
- claude_mpm/cli_module/__init__.py +6 -6
- claude_mpm/cli_module/args.py +188 -140
- claude_mpm/cli_module/commands.py +79 -70
- claude_mpm/cli_module/migration_example.py +38 -60
- claude_mpm/config/__init__.py +32 -25
- claude_mpm/config/agent_config.py +151 -119
- claude_mpm/config/experimental_features.py +217 -0
- claude_mpm/config/paths.py +94 -208
- claude_mpm/config/socketio_config.py +84 -73
- claude_mpm/constants.py +36 -18
- claude_mpm/core/__init__.py +9 -6
- claude_mpm/core/agent_name_normalizer.py +68 -71
- claude_mpm/core/agent_registry.py +372 -521
- claude_mpm/core/agent_session_manager.py +74 -63
- claude_mpm/core/base_service.py +116 -87
- claude_mpm/core/cache.py +119 -153
- claude_mpm/core/claude_runner.py +425 -1120
- claude_mpm/core/config.py +263 -168
- claude_mpm/core/config_aliases.py +69 -61
- claude_mpm/core/config_constants.py +292 -0
- claude_mpm/core/constants.py +57 -99
- claude_mpm/core/container.py +211 -178
- claude_mpm/core/exceptions.py +233 -89
- claude_mpm/core/factories.py +92 -54
- claude_mpm/core/framework_loader.py +378 -220
- claude_mpm/core/hook_manager.py +198 -83
- claude_mpm/core/hook_performance_config.py +136 -0
- claude_mpm/core/injectable_service.py +61 -55
- claude_mpm/core/interactive_session.py +165 -155
- claude_mpm/core/interfaces.py +221 -195
- claude_mpm/core/lazy.py +96 -96
- claude_mpm/core/logger.py +133 -107
- claude_mpm/core/logging_config.py +185 -157
- claude_mpm/core/minimal_framework_loader.py +20 -15
- claude_mpm/core/mixins.py +30 -29
- claude_mpm/core/oneshot_session.py +215 -181
- claude_mpm/core/optimized_agent_loader.py +134 -138
- claude_mpm/core/optimized_startup.py +159 -157
- claude_mpm/core/pm_hook_interceptor.py +85 -72
- claude_mpm/core/service_registry.py +103 -101
- claude_mpm/core/session_manager.py +97 -87
- claude_mpm/core/socketio_pool.py +212 -158
- claude_mpm/core/tool_access_control.py +58 -51
- claude_mpm/core/types.py +46 -24
- claude_mpm/core/typing_utils.py +166 -82
- claude_mpm/core/unified_agent_registry.py +721 -0
- claude_mpm/core/unified_config.py +550 -0
- claude_mpm/core/unified_paths.py +549 -0
- claude_mpm/dashboard/index.html +1 -1
- claude_mpm/dashboard/open_dashboard.py +51 -17
- claude_mpm/dashboard/static/css/dashboard.css +27 -8
- claude_mpm/dashboard/static/dist/components/agent-inference.js +2 -0
- claude_mpm/dashboard/static/dist/components/event-processor.js +2 -0
- claude_mpm/dashboard/static/dist/components/event-viewer.js +2 -0
- claude_mpm/dashboard/static/dist/components/export-manager.js +2 -0
- claude_mpm/dashboard/static/dist/components/file-tool-tracker.js +2 -0
- claude_mpm/dashboard/static/dist/components/hud-library-loader.js +2 -0
- claude_mpm/dashboard/static/dist/components/hud-manager.js +2 -0
- claude_mpm/dashboard/static/dist/components/hud-visualizer.js +2 -0
- claude_mpm/dashboard/static/dist/components/module-viewer.js +2 -0
- claude_mpm/dashboard/static/dist/components/session-manager.js +2 -0
- claude_mpm/dashboard/static/dist/components/socket-manager.js +2 -0
- claude_mpm/dashboard/static/dist/components/ui-state-manager.js +2 -0
- claude_mpm/dashboard/static/dist/components/working-directory.js +2 -0
- claude_mpm/dashboard/static/dist/dashboard.js +2 -0
- claude_mpm/dashboard/static/dist/socket-client.js +2 -0
- claude_mpm/dashboard/static/js/components/agent-inference.js +80 -76
- claude_mpm/dashboard/static/js/components/event-processor.js +71 -67
- claude_mpm/dashboard/static/js/components/event-viewer.js +74 -70
- claude_mpm/dashboard/static/js/components/export-manager.js +31 -28
- claude_mpm/dashboard/static/js/components/file-tool-tracker.js +106 -92
- claude_mpm/dashboard/static/js/components/hud-library-loader.js +11 -11
- claude_mpm/dashboard/static/js/components/hud-manager.js +73 -73
- claude_mpm/dashboard/static/js/components/hud-visualizer.js +163 -163
- claude_mpm/dashboard/static/js/components/module-viewer.js +305 -233
- claude_mpm/dashboard/static/js/components/session-manager.js +32 -29
- claude_mpm/dashboard/static/js/components/socket-manager.js +27 -20
- claude_mpm/dashboard/static/js/components/ui-state-manager.js +21 -18
- claude_mpm/dashboard/static/js/components/working-directory.js +74 -71
- claude_mpm/dashboard/static/js/dashboard.js +178 -453
- claude_mpm/dashboard/static/js/extension-error-handler.js +164 -0
- claude_mpm/dashboard/static/js/socket-client.js +120 -54
- claude_mpm/dashboard/templates/index.html +40 -50
- claude_mpm/experimental/cli_enhancements.py +60 -58
- claude_mpm/generators/__init__.py +1 -1
- claude_mpm/generators/agent_profile_generator.py +75 -65
- claude_mpm/hooks/__init__.py +1 -1
- claude_mpm/hooks/base_hook.py +33 -28
- claude_mpm/hooks/claude_hooks/__init__.py +1 -1
- claude_mpm/hooks/claude_hooks/connection_pool.py +120 -0
- claude_mpm/hooks/claude_hooks/event_handlers.py +743 -0
- claude_mpm/hooks/claude_hooks/hook_handler.py +415 -1331
- claude_mpm/hooks/claude_hooks/hook_wrapper.sh +4 -4
- claude_mpm/hooks/claude_hooks/memory_integration.py +221 -0
- claude_mpm/hooks/claude_hooks/response_tracking.py +348 -0
- claude_mpm/hooks/claude_hooks/tool_analysis.py +230 -0
- claude_mpm/hooks/memory_integration_hook.py +140 -100
- claude_mpm/hooks/tool_call_interceptor.py +89 -76
- claude_mpm/hooks/validation_hooks.py +57 -49
- claude_mpm/init.py +145 -121
- claude_mpm/models/__init__.py +9 -9
- claude_mpm/models/agent_definition.py +33 -23
- claude_mpm/models/agent_session.py +228 -200
- claude_mpm/scripts/__init__.py +1 -1
- claude_mpm/scripts/socketio_daemon.py +192 -75
- claude_mpm/scripts/socketio_server_manager.py +328 -0
- claude_mpm/scripts/start_activity_logging.py +25 -22
- claude_mpm/services/__init__.py +68 -43
- claude_mpm/services/agent_capabilities_service.py +271 -0
- claude_mpm/services/agents/__init__.py +23 -32
- claude_mpm/services/agents/deployment/__init__.py +3 -3
- claude_mpm/services/agents/deployment/agent_config_provider.py +310 -0
- claude_mpm/services/agents/deployment/agent_configuration_manager.py +359 -0
- claude_mpm/services/agents/deployment/agent_definition_factory.py +84 -0
- claude_mpm/services/agents/deployment/agent_deployment.py +415 -2113
- claude_mpm/services/agents/deployment/agent_discovery_service.py +387 -0
- claude_mpm/services/agents/deployment/agent_environment_manager.py +293 -0
- claude_mpm/services/agents/deployment/agent_filesystem_manager.py +387 -0
- claude_mpm/services/agents/deployment/agent_format_converter.py +453 -0
- claude_mpm/services/agents/deployment/agent_frontmatter_validator.py +161 -0
- claude_mpm/services/agents/deployment/agent_lifecycle_manager.py +345 -495
- claude_mpm/services/agents/deployment/agent_metrics_collector.py +279 -0
- claude_mpm/services/agents/deployment/agent_restore_handler.py +88 -0
- claude_mpm/services/agents/deployment/agent_template_builder.py +406 -0
- claude_mpm/services/agents/deployment/agent_validator.py +352 -0
- claude_mpm/services/agents/deployment/agent_version_manager.py +313 -0
- claude_mpm/services/agents/deployment/agent_versioning.py +6 -9
- claude_mpm/services/agents/deployment/agents_directory_resolver.py +79 -0
- claude_mpm/services/agents/deployment/async_agent_deployment.py +298 -234
- claude_mpm/services/agents/deployment/config/__init__.py +13 -0
- claude_mpm/services/agents/deployment/config/deployment_config.py +182 -0
- claude_mpm/services/agents/deployment/config/deployment_config_manager.py +200 -0
- claude_mpm/services/agents/deployment/deployment_config_loader.py +54 -0
- claude_mpm/services/agents/deployment/deployment_type_detector.py +124 -0
- claude_mpm/services/agents/deployment/facade/__init__.py +18 -0
- claude_mpm/services/agents/deployment/facade/async_deployment_executor.py +159 -0
- claude_mpm/services/agents/deployment/facade/deployment_executor.py +73 -0
- claude_mpm/services/agents/deployment/facade/deployment_facade.py +270 -0
- claude_mpm/services/agents/deployment/facade/sync_deployment_executor.py +178 -0
- claude_mpm/services/agents/deployment/interface_adapter.py +227 -0
- claude_mpm/services/agents/deployment/lifecycle_health_checker.py +85 -0
- claude_mpm/services/agents/deployment/lifecycle_performance_tracker.py +100 -0
- claude_mpm/services/agents/deployment/pipeline/__init__.py +32 -0
- claude_mpm/services/agents/deployment/pipeline/pipeline_builder.py +158 -0
- claude_mpm/services/agents/deployment/pipeline/pipeline_context.py +159 -0
- claude_mpm/services/agents/deployment/pipeline/pipeline_executor.py +169 -0
- claude_mpm/services/agents/deployment/pipeline/steps/__init__.py +19 -0
- claude_mpm/services/agents/deployment/pipeline/steps/agent_processing_step.py +195 -0
- claude_mpm/services/agents/deployment/pipeline/steps/base_step.py +119 -0
- claude_mpm/services/agents/deployment/pipeline/steps/configuration_step.py +79 -0
- claude_mpm/services/agents/deployment/pipeline/steps/target_directory_step.py +90 -0
- claude_mpm/services/agents/deployment/pipeline/steps/validation_step.py +100 -0
- claude_mpm/services/agents/deployment/processors/__init__.py +15 -0
- claude_mpm/services/agents/deployment/processors/agent_deployment_context.py +98 -0
- claude_mpm/services/agents/deployment/processors/agent_deployment_result.py +235 -0
- claude_mpm/services/agents/deployment/processors/agent_processor.py +258 -0
- claude_mpm/services/agents/deployment/refactored_agent_deployment_service.py +318 -0
- claude_mpm/services/agents/deployment/results/__init__.py +13 -0
- claude_mpm/services/agents/deployment/results/deployment_metrics.py +200 -0
- claude_mpm/services/agents/deployment/results/deployment_result_builder.py +249 -0
- claude_mpm/services/agents/deployment/strategies/__init__.py +25 -0
- claude_mpm/services/agents/deployment/strategies/base_strategy.py +119 -0
- claude_mpm/services/agents/deployment/strategies/project_strategy.py +150 -0
- claude_mpm/services/agents/deployment/strategies/strategy_selector.py +117 -0
- claude_mpm/services/agents/deployment/strategies/system_strategy.py +116 -0
- claude_mpm/services/agents/deployment/strategies/user_strategy.py +137 -0
- claude_mpm/services/agents/deployment/system_instructions_deployer.py +108 -0
- claude_mpm/services/agents/deployment/validation/__init__.py +19 -0
- claude_mpm/services/agents/deployment/validation/agent_validator.py +323 -0
- claude_mpm/services/agents/deployment/validation/deployment_validator.py +238 -0
- claude_mpm/services/agents/deployment/validation/template_validator.py +299 -0
- claude_mpm/services/agents/deployment/validation/validation_result.py +226 -0
- claude_mpm/services/agents/loading/__init__.py +2 -2
- claude_mpm/services/agents/loading/agent_profile_loader.py +259 -229
- claude_mpm/services/agents/loading/base_agent_manager.py +90 -81
- claude_mpm/services/agents/loading/framework_agent_loader.py +154 -129
- claude_mpm/services/agents/management/__init__.py +2 -2
- claude_mpm/services/agents/management/agent_capabilities_generator.py +72 -58
- claude_mpm/services/agents/management/agent_management_service.py +209 -156
- claude_mpm/services/agents/memory/__init__.py +9 -6
- claude_mpm/services/agents/memory/agent_memory_manager.py +218 -1152
- claude_mpm/services/agents/memory/agent_persistence_service.py +20 -16
- claude_mpm/services/agents/memory/analyzer.py +430 -0
- claude_mpm/services/agents/memory/content_manager.py +376 -0
- claude_mpm/services/agents/memory/template_generator.py +468 -0
- claude_mpm/services/agents/registry/__init__.py +7 -10
- claude_mpm/services/agents/registry/deployed_agent_discovery.py +122 -97
- claude_mpm/services/agents/registry/modification_tracker.py +351 -285
- claude_mpm/services/async_session_logger.py +187 -153
- claude_mpm/services/claude_session_logger.py +87 -72
- claude_mpm/services/command_handler_service.py +217 -0
- claude_mpm/services/communication/__init__.py +3 -2
- claude_mpm/services/core/__init__.py +50 -97
- claude_mpm/services/core/base.py +60 -53
- claude_mpm/services/core/interfaces/__init__.py +188 -0
- claude_mpm/services/core/interfaces/agent.py +351 -0
- claude_mpm/services/core/interfaces/communication.py +343 -0
- claude_mpm/services/core/interfaces/infrastructure.py +413 -0
- claude_mpm/services/core/interfaces/service.py +434 -0
- claude_mpm/services/core/interfaces.py +19 -944
- claude_mpm/services/event_aggregator.py +208 -170
- claude_mpm/services/exceptions.py +387 -308
- claude_mpm/services/framework_claude_md_generator/__init__.py +75 -79
- claude_mpm/services/framework_claude_md_generator/content_assembler.py +69 -60
- claude_mpm/services/framework_claude_md_generator/content_validator.py +65 -61
- claude_mpm/services/framework_claude_md_generator/deployment_manager.py +68 -49
- claude_mpm/services/framework_claude_md_generator/section_generators/__init__.py +34 -34
- claude_mpm/services/framework_claude_md_generator/section_generators/agents.py +25 -22
- claude_mpm/services/framework_claude_md_generator/section_generators/claude_pm_init.py +10 -10
- claude_mpm/services/framework_claude_md_generator/section_generators/core_responsibilities.py +4 -3
- claude_mpm/services/framework_claude_md_generator/section_generators/delegation_constraints.py +4 -3
- claude_mpm/services/framework_claude_md_generator/section_generators/environment_config.py +4 -3
- claude_mpm/services/framework_claude_md_generator/section_generators/footer.py +6 -5
- claude_mpm/services/framework_claude_md_generator/section_generators/header.py +8 -7
- claude_mpm/services/framework_claude_md_generator/section_generators/orchestration_principles.py +4 -3
- claude_mpm/services/framework_claude_md_generator/section_generators/role_designation.py +6 -5
- claude_mpm/services/framework_claude_md_generator/section_generators/subprocess_validation.py +9 -8
- claude_mpm/services/framework_claude_md_generator/section_generators/todo_task_tools.py +4 -3
- claude_mpm/services/framework_claude_md_generator/section_generators/troubleshooting.py +5 -4
- claude_mpm/services/framework_claude_md_generator/section_manager.py +28 -27
- claude_mpm/services/framework_claude_md_generator/version_manager.py +30 -28
- claude_mpm/services/hook_service.py +106 -114
- claude_mpm/services/infrastructure/__init__.py +7 -5
- claude_mpm/services/infrastructure/context_preservation.py +571 -0
- claude_mpm/services/infrastructure/daemon_manager.py +279 -0
- claude_mpm/services/infrastructure/logging.py +83 -76
- claude_mpm/services/infrastructure/monitoring.py +547 -404
- claude_mpm/services/mcp_gateway/__init__.py +40 -23
- claude_mpm/services/mcp_gateway/config/__init__.py +2 -2
- claude_mpm/services/mcp_gateway/config/config_loader.py +61 -56
- claude_mpm/services/mcp_gateway/config/config_schema.py +50 -41
- claude_mpm/services/mcp_gateway/config/configuration.py +82 -75
- claude_mpm/services/mcp_gateway/core/__init__.py +14 -21
- claude_mpm/services/mcp_gateway/core/base.py +80 -67
- claude_mpm/services/mcp_gateway/core/exceptions.py +60 -46
- claude_mpm/services/mcp_gateway/core/interfaces.py +97 -93
- claude_mpm/services/mcp_gateway/main.py +307 -127
- claude_mpm/services/mcp_gateway/registry/__init__.py +1 -1
- claude_mpm/services/mcp_gateway/registry/service_registry.py +100 -101
- claude_mpm/services/mcp_gateway/registry/tool_registry.py +135 -126
- claude_mpm/services/mcp_gateway/server/__init__.py +4 -4
- claude_mpm/services/mcp_gateway/server/{mcp_server.py → mcp_gateway.py} +149 -153
- claude_mpm/services/mcp_gateway/server/stdio_handler.py +105 -107
- claude_mpm/services/mcp_gateway/server/stdio_server.py +691 -0
- claude_mpm/services/mcp_gateway/tools/__init__.py +4 -2
- claude_mpm/services/mcp_gateway/tools/base_adapter.py +110 -121
- claude_mpm/services/mcp_gateway/tools/document_summarizer.py +283 -215
- claude_mpm/services/mcp_gateway/tools/hello_world.py +122 -120
- claude_mpm/services/mcp_gateway/tools/ticket_tools.py +652 -0
- claude_mpm/services/mcp_gateway/tools/unified_ticket_tool.py +606 -0
- claude_mpm/services/memory/__init__.py +2 -2
- claude_mpm/services/memory/builder.py +451 -362
- claude_mpm/services/memory/cache/__init__.py +2 -2
- claude_mpm/services/memory/cache/shared_prompt_cache.py +232 -194
- claude_mpm/services/memory/cache/simple_cache.py +107 -93
- claude_mpm/services/memory/indexed_memory.py +195 -193
- claude_mpm/services/memory/optimizer.py +267 -234
- claude_mpm/services/memory/router.py +571 -263
- claude_mpm/services/memory_hook_service.py +237 -0
- claude_mpm/services/port_manager.py +223 -0
- claude_mpm/services/project/__init__.py +3 -3
- claude_mpm/services/project/analyzer.py +451 -305
- claude_mpm/services/project/registry.py +262 -240
- claude_mpm/services/recovery_manager.py +287 -231
- claude_mpm/services/response_tracker.py +87 -67
- claude_mpm/services/runner_configuration_service.py +587 -0
- claude_mpm/services/session_management_service.py +304 -0
- claude_mpm/services/socketio/__init__.py +4 -4
- claude_mpm/services/socketio/client_proxy.py +174 -0
- claude_mpm/services/socketio/handlers/__init__.py +3 -3
- claude_mpm/services/socketio/handlers/base.py +44 -30
- claude_mpm/services/socketio/handlers/connection.py +145 -65
- claude_mpm/services/socketio/handlers/file.py +123 -108
- claude_mpm/services/socketio/handlers/git.py +607 -373
- claude_mpm/services/socketio/handlers/hook.py +170 -0
- claude_mpm/services/socketio/handlers/memory.py +4 -4
- claude_mpm/services/socketio/handlers/project.py +4 -4
- claude_mpm/services/socketio/handlers/registry.py +53 -38
- claude_mpm/services/socketio/server/__init__.py +18 -0
- claude_mpm/services/socketio/server/broadcaster.py +252 -0
- claude_mpm/services/socketio/server/core.py +399 -0
- claude_mpm/services/socketio/server/main.py +323 -0
- claude_mpm/services/socketio_client_manager.py +160 -133
- claude_mpm/services/socketio_server.py +36 -1885
- claude_mpm/services/subprocess_launcher_service.py +316 -0
- claude_mpm/services/system_instructions_service.py +258 -0
- claude_mpm/services/ticket_manager.py +20 -534
- claude_mpm/services/utility_service.py +285 -0
- claude_mpm/services/version_control/__init__.py +18 -21
- claude_mpm/services/version_control/branch_strategy.py +20 -10
- claude_mpm/services/version_control/conflict_resolution.py +37 -13
- claude_mpm/services/version_control/git_operations.py +52 -21
- claude_mpm/services/version_control/semantic_versioning.py +92 -53
- claude_mpm/services/version_control/version_parser.py +145 -125
- claude_mpm/services/version_service.py +270 -0
- claude_mpm/storage/__init__.py +9 -0
- claude_mpm/storage/state_storage.py +552 -0
- claude_mpm/ticket_wrapper.py +2 -2
- claude_mpm/utils/__init__.py +2 -2
- claude_mpm/utils/agent_dependency_loader.py +453 -243
- claude_mpm/utils/config_manager.py +157 -118
- claude_mpm/utils/console.py +1 -1
- claude_mpm/utils/dependency_cache.py +102 -107
- claude_mpm/utils/dependency_manager.py +52 -47
- claude_mpm/utils/dependency_strategies.py +131 -96
- claude_mpm/utils/environment_context.py +110 -102
- claude_mpm/utils/error_handler.py +75 -55
- claude_mpm/utils/file_utils.py +80 -67
- claude_mpm/utils/framework_detection.py +12 -11
- claude_mpm/utils/import_migration_example.py +12 -60
- claude_mpm/utils/imports.py +48 -45
- claude_mpm/utils/path_operations.py +100 -93
- claude_mpm/utils/robust_installer.py +172 -164
- claude_mpm/utils/session_logging.py +30 -23
- claude_mpm/utils/subprocess_utils.py +99 -61
- claude_mpm/validation/__init__.py +1 -1
- claude_mpm/validation/agent_validator.py +151 -111
- claude_mpm/validation/frontmatter_validator.py +92 -71
- {claude_mpm-3.9.9.dist-info → claude_mpm-4.0.3.dist-info}/METADATA +51 -2
- claude_mpm-4.0.3.dist-info/RECORD +402 -0
- {claude_mpm-3.9.9.dist-info → claude_mpm-4.0.3.dist-info}/entry_points.txt +1 -0
- {claude_mpm-3.9.9.dist-info → claude_mpm-4.0.3.dist-info}/licenses/LICENSE +1 -1
- claude_mpm/config/memory_guardian_config.py +0 -325
- claude_mpm/core/config_paths.py +0 -150
- claude_mpm/dashboard/static/js/dashboard-original.js +0 -4134
- claude_mpm/deployment_paths.py +0 -261
- claude_mpm/hooks/claude_hooks/hook_handler_fixed.py +0 -454
- claude_mpm/models/state_models.py +0 -433
- claude_mpm/services/agent/__init__.py +0 -24
- claude_mpm/services/agent/deployment.py +0 -2548
- claude_mpm/services/agent/management.py +0 -598
- claude_mpm/services/agent/registry.py +0 -813
- claude_mpm/services/agents/registry/agent_registry.py +0 -813
- claude_mpm/services/communication/socketio.py +0 -1935
- claude_mpm/services/communication/websocket.py +0 -479
- claude_mpm/services/framework_claude_md_generator.py +0 -624
- claude_mpm/services/health_monitor.py +0 -893
- claude_mpm/services/infrastructure/memory_guardian.py +0 -770
- claude_mpm/services/mcp_gateway/server/mcp_server_simple.py +0 -444
- claude_mpm/services/optimized_hook_service.py +0 -542
- claude_mpm/services/project_analyzer.py +0 -864
- claude_mpm/services/project_registry.py +0 -608
- claude_mpm/services/standalone_socketio_server.py +0 -1300
- claude_mpm/services/ticket_manager_di.py +0 -318
- claude_mpm/services/ticketing_service_original.py +0 -510
- claude_mpm/utils/paths.py +0 -395
- claude_mpm/utils/platform_memory.py +0 -524
- claude_mpm-3.9.9.dist-info/RECORD +0 -293
- {claude_mpm-3.9.9.dist-info → claude_mpm-4.0.3.dist-info}/WHEEL +0 -0
- {claude_mpm-3.9.9.dist-info → claude_mpm-4.0.3.dist-info}/top_level.txt +0 -0
| @@ -1,3 +1,5 @@ | |
| 1 | 
            +
            from pathlib import Path
         | 
| 2 | 
            +
             | 
| 1 3 | 
             
            """
         | 
| 2 4 | 
             
            Claude Code Frontmatter Validator
         | 
| 3 5 |  | 
| @@ -6,216 +8,235 @@ Critical for ensuring agents work correctly with Claude Desktop. | |
| 6 8 | 
             
            """
         | 
| 7 9 |  | 
| 8 10 | 
             
            import re
         | 
| 9 | 
            -
            from pathlib import Path
         | 
| 10 11 | 
             
            from typing import Dict, List, Optional, Tuple
         | 
| 12 | 
            +
             | 
| 11 13 | 
             
            import yaml
         | 
| 12 14 |  | 
| 13 15 |  | 
| 14 16 | 
             
            class FrontmatterValidator:
         | 
| 15 17 | 
             
                """Validates agent frontmatter against Claude Code specification."""
         | 
| 16 | 
            -
             | 
| 18 | 
            +
             | 
| 17 19 | 
             
                # Claude Code name pattern: lowercase letters, numbers, hyphens only
         | 
| 18 20 | 
             
                # NO UNDERSCORES, NO UPPERCASE, NO SPECIAL CHARACTERS
         | 
| 19 | 
            -
                NAME_PATTERN = re.compile(r | 
| 20 | 
            -
             | 
| 21 | 
            +
                NAME_PATTERN = re.compile(r"^[a-z0-9]+(-[a-z0-9]+)*$")
         | 
| 22 | 
            +
             | 
| 21 23 | 
             
                # Valid tool names (from Claude Code spec)
         | 
| 22 24 | 
             
                VALID_TOOLS = {
         | 
| 23 | 
            -
                     | 
| 24 | 
            -
                     | 
| 25 | 
            -
                     | 
| 25 | 
            +
                    "Read",
         | 
| 26 | 
            +
                    "Write",
         | 
| 27 | 
            +
                    "Edit",
         | 
| 28 | 
            +
                    "MultiEdit",
         | 
| 29 | 
            +
                    "Bash",
         | 
| 30 | 
            +
                    "Grep",
         | 
| 31 | 
            +
                    "Glob",
         | 
| 32 | 
            +
                    "LS",
         | 
| 33 | 
            +
                    "WebSearch",
         | 
| 34 | 
            +
                    "WebFetch",
         | 
| 35 | 
            +
                    "TodoWrite",
         | 
| 36 | 
            +
                    "BashOutput",
         | 
| 37 | 
            +
                    "KillBash",
         | 
| 38 | 
            +
                    "NotebookEdit",
         | 
| 39 | 
            +
                    "Task",
         | 
| 40 | 
            +
                    "ExitPlanMode",
         | 
| 26 41 | 
             
                }
         | 
| 27 | 
            -
             | 
| 42 | 
            +
             | 
| 28 43 | 
             
                # Valid model tiers
         | 
| 29 | 
            -
                VALID_MODELS = { | 
| 30 | 
            -
             | 
| 44 | 
            +
                VALID_MODELS = {"opus", "sonnet", "haiku"}
         | 
| 45 | 
            +
             | 
| 31 46 | 
             
                # Required fields in frontmatter
         | 
| 32 | 
            -
                REQUIRED_FIELDS = { | 
| 33 | 
            -
             | 
| 47 | 
            +
                REQUIRED_FIELDS = {"name", "description", "tools"}
         | 
| 48 | 
            +
             | 
| 34 49 | 
             
                @classmethod
         | 
| 35 50 | 
             
                def validate_name(cls, name: str) -> Tuple[bool, Optional[str]]:
         | 
| 36 51 | 
             
                    """
         | 
| 37 52 | 
             
                    Validate agent name field against Claude Code spec.
         | 
| 38 | 
            -
             | 
| 53 | 
            +
             | 
| 39 54 | 
             
                    Args:
         | 
| 40 55 | 
             
                        name: Agent name to validate
         | 
| 41 | 
            -
             | 
| 56 | 
            +
             | 
| 42 57 | 
             
                    Returns:
         | 
| 43 58 | 
             
                        (is_valid, error_message)
         | 
| 44 59 | 
             
                    """
         | 
| 45 60 | 
             
                    if not name:
         | 
| 46 61 | 
             
                        return False, "Name field is required"
         | 
| 47 | 
            -
             | 
| 62 | 
            +
             | 
| 48 63 | 
             
                    if not cls.NAME_PATTERN.match(name):
         | 
| 49 64 | 
             
                        return False, (
         | 
| 50 65 | 
             
                            f"Invalid name '{name}'. Must match pattern ^[a-z0-9]+(-[a-z0-9]+)*$ "
         | 
| 51 66 | 
             
                            "(lowercase letters, numbers, and hyphens only - NO underscores!)"
         | 
| 52 67 | 
             
                        )
         | 
| 53 | 
            -
             | 
| 68 | 
            +
             | 
| 54 69 | 
             
                    if len(name) > 50:
         | 
| 55 70 | 
             
                        return False, f"Name '{name}' too long (max 50 characters)"
         | 
| 56 | 
            -
             | 
| 71 | 
            +
             | 
| 57 72 | 
             
                    return True, None
         | 
| 58 | 
            -
             | 
| 73 | 
            +
             | 
| 59 74 | 
             
                @classmethod
         | 
| 60 75 | 
             
                def validate_tools(cls, tools: str) -> Tuple[bool, Optional[str]]:
         | 
| 61 76 | 
             
                    """
         | 
| 62 77 | 
             
                    Validate tools field format and content.
         | 
| 63 | 
            -
             | 
| 78 | 
            +
             | 
| 64 79 | 
             
                    CRITICAL: Tools must be comma-separated WITHOUT spaces!
         | 
| 65 | 
            -
             | 
| 80 | 
            +
             | 
| 66 81 | 
             
                    Args:
         | 
| 67 82 | 
             
                        tools: Tools string to validate
         | 
| 68 | 
            -
             | 
| 83 | 
            +
             | 
| 69 84 | 
             
                    Returns:
         | 
| 70 85 | 
             
                        (is_valid, error_message)
         | 
| 71 86 | 
             
                    """
         | 
| 72 87 | 
             
                    if not tools:
         | 
| 73 88 | 
             
                        return False, "Tools field is required"
         | 
| 74 | 
            -
             | 
| 89 | 
            +
             | 
| 75 90 | 
             
                    # Check for spaces after commas (CRITICAL ERROR)
         | 
| 76 | 
            -
                    if  | 
| 91 | 
            +
                    if ", " in tools:
         | 
| 77 92 | 
             
                        return False, (
         | 
| 78 93 | 
             
                            f"CRITICAL: Tools contain spaces after commas! '{tools}' "
         | 
| 79 94 | 
             
                            "Must be comma-separated WITHOUT spaces (e.g., 'Read,Write,Edit')"
         | 
| 80 95 | 
             
                        )
         | 
| 81 | 
            -
             | 
| 96 | 
            +
             | 
| 82 97 | 
             
                    # Validate individual tools
         | 
| 83 | 
            -
                    tool_list = tools.split( | 
| 98 | 
            +
                    tool_list = tools.split(",")
         | 
| 84 99 | 
             
                    invalid_tools = [t for t in tool_list if t not in cls.VALID_TOOLS]
         | 
| 85 | 
            -
             | 
| 100 | 
            +
             | 
| 86 101 | 
             
                    if invalid_tools:
         | 
| 87 | 
            -
                        return  | 
| 88 | 
            -
             | 
| 102 | 
            +
                        return (
         | 
| 103 | 
            +
                            False,
         | 
| 104 | 
            +
                            f"Invalid tools: {', '.join(invalid_tools)}. Valid tools: {', '.join(sorted(cls.VALID_TOOLS))}",
         | 
| 105 | 
            +
                        )
         | 
| 106 | 
            +
             | 
| 89 107 | 
             
                    return True, None
         | 
| 90 | 
            -
             | 
| 108 | 
            +
             | 
| 91 109 | 
             
                @classmethod
         | 
| 92 110 | 
             
                def validate_model(cls, model: str) -> Tuple[bool, Optional[str]]:
         | 
| 93 111 | 
             
                    """
         | 
| 94 112 | 
             
                    Validate model field.
         | 
| 95 | 
            -
             | 
| 113 | 
            +
             | 
| 96 114 | 
             
                    Args:
         | 
| 97 115 | 
             
                        model: Model tier to validate
         | 
| 98 | 
            -
             | 
| 116 | 
            +
             | 
| 99 117 | 
             
                    Returns:
         | 
| 100 118 | 
             
                        (is_valid, error_message)
         | 
| 101 119 | 
             
                    """
         | 
| 102 120 | 
             
                    if model and model not in cls.VALID_MODELS:
         | 
| 103 | 
            -
                        return  | 
| 104 | 
            -
             | 
| 121 | 
            +
                        return (
         | 
| 122 | 
            +
                            False,
         | 
| 123 | 
            +
                            f"Invalid model '{model}'. Must be one of: {', '.join(cls.VALID_MODELS)}",
         | 
| 124 | 
            +
                        )
         | 
| 125 | 
            +
             | 
| 105 126 | 
             
                    return True, None
         | 
| 106 | 
            -
             | 
| 127 | 
            +
             | 
| 107 128 | 
             
                @classmethod
         | 
| 108 129 | 
             
                def validate_frontmatter(cls, frontmatter: Dict) -> List[str]:
         | 
| 109 130 | 
             
                    """
         | 
| 110 131 | 
             
                    Validate complete frontmatter structure.
         | 
| 111 | 
            -
             | 
| 132 | 
            +
             | 
| 112 133 | 
             
                    Args:
         | 
| 113 134 | 
             
                        frontmatter: Parsed frontmatter dictionary
         | 
| 114 | 
            -
             | 
| 135 | 
            +
             | 
| 115 136 | 
             
                    Returns:
         | 
| 116 137 | 
             
                        List of validation errors (empty if valid)
         | 
| 117 138 | 
             
                    """
         | 
| 118 139 | 
             
                    errors = []
         | 
| 119 | 
            -
             | 
| 140 | 
            +
             | 
| 120 141 | 
             
                    # Check required fields
         | 
| 121 142 | 
             
                    missing = cls.REQUIRED_FIELDS - set(frontmatter.keys())
         | 
| 122 143 | 
             
                    if missing:
         | 
| 123 144 | 
             
                        errors.append(f"Missing required fields: {', '.join(missing)}")
         | 
| 124 | 
            -
             | 
| 145 | 
            +
             | 
| 125 146 | 
             
                    # Validate name
         | 
| 126 | 
            -
                    if  | 
| 127 | 
            -
                        valid, error = cls.validate_name(frontmatter[ | 
| 147 | 
            +
                    if "name" in frontmatter:
         | 
| 148 | 
            +
                        valid, error = cls.validate_name(frontmatter["name"])
         | 
| 128 149 | 
             
                        if not valid:
         | 
| 129 150 | 
             
                            errors.append(error)
         | 
| 130 | 
            -
             | 
| 151 | 
            +
             | 
| 131 152 | 
             
                    # Validate tools
         | 
| 132 | 
            -
                    if  | 
| 133 | 
            -
                        valid, error = cls.validate_tools(frontmatter[ | 
| 153 | 
            +
                    if "tools" in frontmatter:
         | 
| 154 | 
            +
                        valid, error = cls.validate_tools(frontmatter["tools"])
         | 
| 134 155 | 
             
                        if not valid:
         | 
| 135 156 | 
             
                            errors.append(error)
         | 
| 136 | 
            -
             | 
| 157 | 
            +
             | 
| 137 158 | 
             
                    # Validate model
         | 
| 138 | 
            -
                    if  | 
| 139 | 
            -
                        valid, error = cls.validate_model(frontmatter[ | 
| 159 | 
            +
                    if "model" in frontmatter:
         | 
| 160 | 
            +
                        valid, error = cls.validate_model(frontmatter["model"])
         | 
| 140 161 | 
             
                        if not valid:
         | 
| 141 162 | 
             
                            errors.append(error)
         | 
| 142 | 
            -
             | 
| 163 | 
            +
             | 
| 143 164 | 
             
                    # Validate description
         | 
| 144 | 
            -
                    if  | 
| 145 | 
            -
                        desc = frontmatter[ | 
| 165 | 
            +
                    if "description" in frontmatter:
         | 
| 166 | 
            +
                        desc = frontmatter["description"]
         | 
| 146 167 | 
             
                        if len(desc) < 10:
         | 
| 147 168 | 
             
                            errors.append(f"Description too short ({len(desc)} chars, min 10)")
         | 
| 148 169 | 
             
                        if len(desc) > 200:
         | 
| 149 170 | 
             
                            errors.append(f"Description too long ({len(desc)} chars, max 200)")
         | 
| 150 | 
            -
             | 
| 171 | 
            +
             | 
| 151 172 | 
             
                    return errors
         | 
| 152 | 
            -
             | 
| 173 | 
            +
             | 
| 153 174 | 
             
                @classmethod
         | 
| 154 175 | 
             
                def validate_agent_file(cls, file_path: Path) -> List[str]:
         | 
| 155 176 | 
             
                    """
         | 
| 156 177 | 
             
                    Validate an agent markdown file.
         | 
| 157 | 
            -
             | 
| 178 | 
            +
             | 
| 158 179 | 
             
                    Args:
         | 
| 159 180 | 
             
                        file_path: Path to agent .md file
         | 
| 160 | 
            -
             | 
| 181 | 
            +
             | 
| 161 182 | 
             
                    Returns:
         | 
| 162 183 | 
             
                        List of validation errors (empty if valid)
         | 
| 163 184 | 
             
                    """
         | 
| 164 185 | 
             
                    errors = []
         | 
| 165 | 
            -
             | 
| 186 | 
            +
             | 
| 166 187 | 
             
                    try:
         | 
| 167 | 
            -
                        with open(file_path,  | 
| 188 | 
            +
                        with open(file_path, "r") as f:
         | 
| 168 189 | 
             
                            content = f.read()
         | 
| 169 | 
            -
             | 
| 190 | 
            +
             | 
| 170 191 | 
             
                        # Check for frontmatter markers
         | 
| 171 | 
            -
                        if not content.startswith( | 
| 192 | 
            +
                        if not content.startswith("---\n"):
         | 
| 172 193 | 
             
                            errors.append("File must start with '---' frontmatter marker")
         | 
| 173 194 | 
             
                            return errors
         | 
| 174 | 
            -
             | 
| 195 | 
            +
             | 
| 175 196 | 
             
                        # Extract frontmatter
         | 
| 176 | 
            -
                        end_marker = content.find( | 
| 197 | 
            +
                        end_marker = content.find("\n---\n", 4)
         | 
| 177 198 | 
             
                        if end_marker == -1:
         | 
| 178 199 | 
             
                            errors.append("Missing closing '---' frontmatter marker")
         | 
| 179 200 | 
             
                            return errors
         | 
| 180 | 
            -
             | 
| 201 | 
            +
             | 
| 181 202 | 
             
                        frontmatter_text = content[4:end_marker]
         | 
| 182 | 
            -
             | 
| 203 | 
            +
             | 
| 183 204 | 
             
                        # Parse YAML
         | 
| 184 205 | 
             
                        try:
         | 
| 185 206 | 
             
                            frontmatter = yaml.safe_load(frontmatter_text)
         | 
| 186 207 | 
             
                        except yaml.YAMLError as e:
         | 
| 187 208 | 
             
                            errors.append(f"Invalid YAML in frontmatter: {e}")
         | 
| 188 209 | 
             
                            return errors
         | 
| 189 | 
            -
             | 
| 210 | 
            +
             | 
| 190 211 | 
             
                        # Validate frontmatter content
         | 
| 191 212 | 
             
                        validation_errors = cls.validate_frontmatter(frontmatter)
         | 
| 192 213 | 
             
                        errors.extend(validation_errors)
         | 
| 193 | 
            -
             | 
| 214 | 
            +
             | 
| 194 215 | 
             
                    except Exception as e:
         | 
| 195 216 | 
             
                        errors.append(f"Error reading file: {e}")
         | 
| 196 | 
            -
             | 
| 217 | 
            +
             | 
| 197 218 | 
             
                    return errors
         | 
| 198 219 |  | 
| 199 220 |  | 
| 200 221 | 
             
            def main():
         | 
| 201 222 | 
             
                """Command-line validation tool."""
         | 
| 202 223 | 
             
                import sys
         | 
| 203 | 
            -
             | 
| 224 | 
            +
             | 
| 204 225 | 
             
                if len(sys.argv) < 2:
         | 
| 205 226 | 
             
                    print("Usage: python frontmatter_validator.py <agent.md> [agent2.md ...]")
         | 
| 206 227 | 
             
                    sys.exit(1)
         | 
| 207 | 
            -
             | 
| 228 | 
            +
             | 
| 208 229 | 
             
                all_valid = True
         | 
| 209 | 
            -
             | 
| 230 | 
            +
             | 
| 210 231 | 
             
                for file_path in sys.argv[1:]:
         | 
| 211 232 | 
             
                    path = Path(file_path)
         | 
| 212 233 | 
             
                    if not path.exists():
         | 
| 213 234 | 
             
                        print(f"❌ {file_path}: File not found")
         | 
| 214 235 | 
             
                        all_valid = False
         | 
| 215 236 | 
             
                        continue
         | 
| 216 | 
            -
             | 
| 237 | 
            +
             | 
| 217 238 | 
             
                    errors = FrontmatterValidator.validate_agent_file(path)
         | 
| 218 | 
            -
             | 
| 239 | 
            +
             | 
| 219 240 | 
             
                    if errors:
         | 
| 220 241 | 
             
                        print(f"❌ {file_path}:")
         | 
| 221 242 | 
             
                        for error in errors:
         | 
| @@ -223,9 +244,9 @@ def main(): | |
| 223 244 | 
             
                        all_valid = False
         | 
| 224 245 | 
             
                    else:
         | 
| 225 246 | 
             
                        print(f"✅ {file_path}: Valid")
         | 
| 226 | 
            -
             | 
| 247 | 
            +
             | 
| 227 248 | 
             
                sys.exit(0 if all_valid else 1)
         | 
| 228 249 |  | 
| 229 250 |  | 
| 230 251 | 
             
            if __name__ == "__main__":
         | 
| 231 | 
            -
                main()
         | 
| 252 | 
            +
                main()
         | 
| @@ -1,6 +1,6 @@ | |
| 1 1 | 
             
            Metadata-Version: 2.4
         | 
| 2 2 | 
             
            Name: claude-mpm
         | 
| 3 | 
            -
            Version:  | 
| 3 | 
            +
            Version: 4.0.3
         | 
| 4 4 | 
             
            Summary: Claude Multi-agent Project Manager - Clean orchestration with ticket management
         | 
| 5 5 | 
             
            Home-page: https://github.com/bobmatnyc/claude-mpm
         | 
| 6 6 | 
             
            Author: Claude MPM Team
         | 
| @@ -38,6 +38,7 @@ Requires-Dist: python-frontmatter>=1.0.0 | |
| 38 38 | 
             
            Requires-Dist: mistune>=3.0.0
         | 
| 39 39 | 
             
            Requires-Dist: aiofiles>=23.0.0
         | 
| 40 40 | 
             
            Requires-Dist: mcp>=0.1.0
         | 
| 41 | 
            +
            Requires-Dist: ijson>=3.2.0
         | 
| 41 42 | 
             
            Provides-Extra: dev
         | 
| 42 43 | 
             
            Requires-Dist: pytest>=7.0; extra == "dev"
         | 
| 43 44 | 
             
            Requires-Dist: pytest-asyncio; extra == "dev"
         | 
| @@ -45,6 +46,7 @@ Requires-Dist: pytest-cov; extra == "dev" | |
| 45 46 | 
             
            Requires-Dist: black; extra == "dev"
         | 
| 46 47 | 
             
            Requires-Dist: flake8; extra == "dev"
         | 
| 47 48 | 
             
            Requires-Dist: mypy; extra == "dev"
         | 
| 49 | 
            +
            Requires-Dist: pre-commit; extra == "dev"
         | 
| 48 50 | 
             
            Provides-Extra: docs
         | 
| 49 51 | 
             
            Requires-Dist: sphinx>=7.2.0; extra == "docs"
         | 
| 50 52 | 
             
            Requires-Dist: sphinx-rtd-theme>=1.3.0; extra == "docs"
         | 
| @@ -110,6 +112,7 @@ A powerful orchestration framework for Claude Code that enables multi-agent work | |
| 110 112 | 
             
            - 🧠 **Agent Memory System**: Persistent learning with project-specific knowledge retention
         | 
| 111 113 | 
             
            - 🔄 **Session Management**: Resume previous sessions with `--resume` 
         | 
| 112 114 | 
             
            - 📊 **Real-Time Monitoring**: Live dashboard with `--monitor` flag
         | 
| 115 | 
            +
            - 🛡️ **Memory Guardian (Experimental)**: Automatic memory monitoring and intelligent restarts to prevent crashes
         | 
| 113 116 | 
             
            - 📁 **Multi-Project Support**: Per-session working directories
         | 
| 114 117 | 
             
            - 🔍 **Git Integration**: View diffs and track changes across projects
         | 
| 115 118 | 
             
            - 🎯 **Smart Task Orchestration**: PM agent intelligently routes work to specialists
         | 
| @@ -130,6 +133,9 @@ claude-mpm | |
| 130 133 |  | 
| 131 134 | 
             
            # Start with monitoring dashboard
         | 
| 132 135 | 
             
            claude-mpm run --monitor
         | 
| 136 | 
            +
             | 
| 137 | 
            +
            # Start with memory protection (prevents crashes from large conversations)
         | 
| 138 | 
            +
            claude-mpm run-guarded
         | 
| 133 139 | 
             
            ```
         | 
| 134 140 |  | 
| 135 141 | 
             
            See [QUICKSTART.md](QUICKSTART.md) for complete usage examples.
         | 
| @@ -149,10 +155,25 @@ The PM agent automatically delegates work to specialized agents including Resear | |
| 149 155 | 
             
            ### Agent Memory System
         | 
| 150 156 | 
             
            Agents learn project-specific patterns and remember insights across sessions. Initialize with `claude-mpm memory init`.
         | 
| 151 157 |  | 
| 158 | 
            +
            ### Memory Guardian System (Experimental)
         | 
| 159 | 
            +
            **⚠️ Beta Feature** - Prevents memory-related crashes through intelligent monitoring and automatic restarts with state preservation.
         | 
| 160 | 
            +
             | 
| 161 | 
            +
            ```bash
         | 
| 162 | 
            +
            # Start with memory protection (recommended for long sessions)
         | 
| 163 | 
            +
            claude-mpm run-guarded --accept-experimental
         | 
| 164 | 
            +
             | 
| 165 | 
            +
            # Custom memory threshold for your system
         | 
| 166 | 
            +
            claude-mpm run-guarded --memory-threshold 16000 --accept-experimental  # 16GB
         | 
| 167 | 
            +
            ```
         | 
| 168 | 
            +
             | 
| 169 | 
            +
            **Why Memory Guardian?** Large conversation histories can consume 2GB+ of memory, causing system instability. The Memory Guardian monitors memory usage and performs controlled restarts while preserving your conversation context and work progress.
         | 
| 170 | 
            +
             | 
| 171 | 
            +
            **Note:** This is an experimental feature in beta. Use `--accept-experimental` to suppress warnings.
         | 
| 172 | 
            +
             | 
| 152 173 | 
             
            ### Real-Time Monitoring
         | 
| 153 174 | 
             
            The `--monitor` flag opens a web dashboard showing live agent activity, file operations, and session management.
         | 
| 154 175 |  | 
| 155 | 
            -
            See [docs/MEMORY.md](docs/MEMORY.md) and [docs/developer/11-dashboard/README.md](docs/developer/11-dashboard/README.md) for details.
         | 
| 176 | 
            +
            See [docs/MEMORY.md](docs/MEMORY.md), [docs/USER_GUIDE_MEMORY_GUARDIAN.md](docs/USER_GUIDE_MEMORY_GUARDIAN.md), and [docs/developer/11-dashboard/README.md](docs/developer/11-dashboard/README.md) for details.
         | 
| 156 177 |  | 
| 157 178 |  | 
| 158 179 | 
             
            ## Documentation
         | 
| @@ -162,12 +183,15 @@ See [docs/MEMORY.md](docs/MEMORY.md) and [docs/developer/11-dashboard/README.md] | |
| 162 183 | 
             
            - **[Installation Guide](docs/user/installation.md)** - Complete installation options
         | 
| 163 184 | 
             
            - **[User Guide](docs/user/)** - Detailed usage documentation
         | 
| 164 185 | 
             
            - **[Memory System](docs/MEMORY.md)** - Agent memory documentation
         | 
| 186 | 
            +
            - **[Memory Guardian Guide](docs/USER_GUIDE_MEMORY_GUARDIAN.md)** - Comprehensive memory protection documentation
         | 
| 165 187 | 
             
            - **[Troubleshooting](docs/user/troubleshooting.md)** - Common issues and solutions
         | 
| 166 188 |  | 
| 167 189 | 
             
            ### Developer Documentation
         | 
| 168 190 | 
             
            - **[Architecture Overview](docs/ARCHITECTURE.md)** - Service-oriented architecture and design
         | 
| 169 191 | 
             
            - **[API Reference](docs/api/)** - Complete API documentation with Sphinx
         | 
| 170 192 | 
             
            - **[Service Layer Guide](docs/developer/SERVICES.md)** - Service interfaces and implementations
         | 
| 193 | 
            +
            - **[Memory Guardian Technical](docs/MEMORY_GUARDIAN_TECHNICAL.md)** - Technical architecture and implementation details
         | 
| 194 | 
            +
            - **[Memory Guardian Configuration](docs/MEMORY_GUARDIAN_CONFIG.md)** - Complete configuration reference
         | 
| 171 195 | 
             
            - **[Performance Guide](docs/PERFORMANCE.md)** - Optimization and caching strategies
         | 
| 172 196 | 
             
            - **[Security Guide](docs/SECURITY.md)** - Security framework and best practices
         | 
| 173 197 | 
             
            - **[Testing Guide](docs/TESTING.md)** - Testing patterns and strategies
         | 
| @@ -187,9 +211,34 @@ See [CHANGELOG.md](CHANGELOG.md) for full history and [docs/MIGRATION.md](docs/M | |
| 187 211 |  | 
| 188 212 | 
             
            ## Development
         | 
| 189 213 |  | 
| 214 | 
            +
            ### Quick Development Setup
         | 
| 215 | 
            +
            ```bash
         | 
| 216 | 
            +
            # Complete development setup with code formatting and quality tools
         | 
| 217 | 
            +
            make dev-complete
         | 
| 218 | 
            +
             | 
| 219 | 
            +
            # Or step by step:
         | 
| 220 | 
            +
            make setup-dev          # Install in development mode
         | 
| 221 | 
            +
            make setup-pre-commit    # Set up automated code formatting
         | 
| 222 | 
            +
            ```
         | 
| 223 | 
            +
             | 
| 224 | 
            +
            ### Code Quality & Formatting
         | 
| 225 | 
            +
            The project uses automated code formatting and quality checks:
         | 
| 226 | 
            +
            - **Black** for code formatting
         | 
| 227 | 
            +
            - **isort** for import sorting
         | 
| 228 | 
            +
            - **flake8** for linting
         | 
| 229 | 
            +
            - **mypy** for type checking
         | 
| 230 | 
            +
            - **Pre-commit hooks** for automatic enforcement
         | 
| 231 | 
            +
             | 
| 232 | 
            +
            See [docs/developer/CODE_FORMATTING.md](docs/developer/CODE_FORMATTING.md) for details.
         | 
| 233 | 
            +
             | 
| 190 234 | 
             
            ### Contributing
         | 
| 191 235 | 
             
            Contributions are welcome! Please see our [project structure guide](docs/STRUCTURE.md) and follow the established patterns.
         | 
| 192 236 |  | 
| 237 | 
            +
            **Development Workflow**:
         | 
| 238 | 
            +
            1. Run `make dev-complete` to set up your environment
         | 
| 239 | 
            +
            2. Code formatting happens automatically on commit
         | 
| 240 | 
            +
            3. All code must pass quality checks before merging
         | 
| 241 | 
            +
             | 
| 193 242 | 
             
            ### Project Structure
         | 
| 194 243 | 
             
            See [docs/STRUCTURE.md](docs/STRUCTURE.md) for codebase organization.
         | 
| 195 244 |  |