claude-mpm 4.1.26__py3-none-any.whl → 5.0.9__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.
Potentially problematic release.
This version of claude-mpm might be problematic. Click here for more details.
- claude_mpm/BUILD_NUMBER +1 -1
- claude_mpm/VERSION +1 -1
- claude_mpm/__init__.py +20 -5
- claude_mpm/agents/BASE_AGENT_TEMPLATE.md +118 -0
- claude_mpm/agents/BASE_DOCUMENTATION.md +53 -0
- claude_mpm/agents/BASE_ENGINEER.md +658 -0
- claude_mpm/agents/BASE_OPS.md +219 -0
- claude_mpm/agents/BASE_PM.md +432 -158
- claude_mpm/agents/BASE_PROMPT_ENGINEER.md +787 -0
- claude_mpm/agents/BASE_QA.md +167 -0
- claude_mpm/agents/BASE_RESEARCH.md +53 -0
- claude_mpm/agents/OUTPUT_STYLE.md +254 -29
- claude_mpm/agents/PM_INSTRUCTIONS.md +969 -0
- claude_mpm/agents/PM_INSTRUCTIONS_TEACH.md +1322 -0
- claude_mpm/agents/WORKFLOW.md +355 -191
- claude_mpm/agents/__init__.py +6 -0
- claude_mpm/agents/agent_loader.py +41 -14
- claude_mpm/agents/agent_loader_integration.py +3 -2
- claude_mpm/agents/async_agent_loader.py +3 -3
- claude_mpm/agents/base_agent.json +6 -3
- claude_mpm/agents/base_agent_loader.py +21 -44
- claude_mpm/agents/frontmatter_validator.py +292 -252
- claude_mpm/agents/system_agent_config.py +3 -2
- claude_mpm/agents/templates/README.md +465 -0
- claude_mpm/agents/templates/circuit-breakers.md +1005 -0
- claude_mpm/agents/templates/context-management-examples.md +544 -0
- claude_mpm/agents/templates/git-file-tracking.md +584 -0
- claude_mpm/agents/templates/pm-examples.md +474 -0
- claude_mpm/agents/templates/pm-red-flags.md +310 -0
- claude_mpm/agents/templates/pr-workflow-examples.md +427 -0
- claude_mpm/agents/templates/research-gate-examples.md +669 -0
- claude_mpm/agents/templates/response-format.md +583 -0
- claude_mpm/agents/templates/structured-questions-examples.md +615 -0
- claude_mpm/agents/templates/ticket-completeness-examples.md +139 -0
- claude_mpm/agents/templates/ticketing-examples.md +277 -0
- claude_mpm/agents/templates/validation-templates.md +312 -0
- claude_mpm/cli/__init__.py +72 -376
- claude_mpm/cli/commands/__init__.py +4 -0
- claude_mpm/cli/commands/agent_manager.py +675 -20
- claude_mpm/cli/commands/agent_source.py +774 -0
- claude_mpm/cli/commands/agent_state_manager.py +344 -0
- claude_mpm/cli/commands/agents.py +1673 -178
- claude_mpm/cli/commands/agents_cleanup.py +210 -0
- claude_mpm/cli/commands/agents_detect.py +380 -0
- claude_mpm/cli/commands/agents_discover.py +338 -0
- claude_mpm/cli/commands/agents_recommend.py +309 -0
- claude_mpm/cli/commands/aggregate.py +11 -7
- claude_mpm/cli/commands/analyze.py +18 -13
- claude_mpm/cli/commands/analyze_code.py +8 -4
- claude_mpm/cli/commands/auto_configure.py +566 -0
- claude_mpm/cli/commands/cleanup.py +12 -12
- claude_mpm/cli/commands/config.py +54 -17
- claude_mpm/cli/commands/configure.py +1184 -1055
- claude_mpm/cli/commands/configure_agent_display.py +261 -0
- claude_mpm/cli/commands/configure_behavior_manager.py +204 -0
- claude_mpm/cli/commands/configure_hook_manager.py +225 -0
- claude_mpm/cli/commands/configure_models.py +18 -0
- claude_mpm/cli/commands/configure_navigation.py +184 -0
- claude_mpm/cli/commands/configure_paths.py +104 -0
- claude_mpm/cli/commands/configure_persistence.py +254 -0
- claude_mpm/cli/commands/configure_startup_manager.py +646 -0
- claude_mpm/cli/commands/configure_template_editor.py +497 -0
- claude_mpm/cli/commands/configure_validators.py +73 -0
- claude_mpm/cli/commands/dashboard.py +50 -52
- claude_mpm/cli/commands/debug.py +19 -19
- claude_mpm/cli/commands/doctor.py +51 -7
- claude_mpm/cli/commands/hook_errors.py +277 -0
- claude_mpm/cli/commands/info.py +3 -4
- claude_mpm/cli/commands/local_deploy.py +534 -0
- claude_mpm/cli/commands/mcp.py +17 -10
- claude_mpm/cli/commands/mcp_command_router.py +11 -0
- claude_mpm/cli/commands/mcp_config.py +154 -0
- claude_mpm/cli/commands/mcp_external_commands.py +249 -0
- claude_mpm/cli/commands/mcp_install_commands.py +101 -32
- claude_mpm/cli/commands/mcp_pipx_config.py +2 -2
- claude_mpm/cli/commands/mcp_setup_external.py +868 -0
- claude_mpm/cli/commands/memory.py +55 -21
- claude_mpm/cli/commands/monitor.py +160 -70
- claude_mpm/cli/commands/mpm_init/__init__.py +73 -0
- claude_mpm/cli/commands/mpm_init/core.py +573 -0
- claude_mpm/cli/commands/mpm_init/display.py +341 -0
- claude_mpm/cli/commands/mpm_init/git_activity.py +427 -0
- claude_mpm/cli/commands/mpm_init/modes.py +397 -0
- claude_mpm/cli/commands/mpm_init/prompts.py +442 -0
- claude_mpm/cli/commands/mpm_init_cli.py +396 -0
- claude_mpm/cli/commands/mpm_init_handler.py +114 -4
- claude_mpm/cli/commands/postmortem.py +401 -0
- claude_mpm/cli/commands/run.py +252 -167
- claude_mpm/cli/commands/search.py +458 -0
- claude_mpm/cli/commands/skill_source.py +694 -0
- claude_mpm/cli/commands/skills.py +1225 -0
- claude_mpm/cli/commands/uninstall.py +176 -0
- claude_mpm/cli/commands/upgrade.py +152 -0
- claude_mpm/cli/commands/verify.py +119 -0
- claude_mpm/cli/executor.py +279 -0
- claude_mpm/cli/helpers.py +105 -0
- claude_mpm/cli/interactive/__init__.py +21 -0
- claude_mpm/cli/interactive/agent_wizard.py +1872 -0
- claude_mpm/cli/interactive/skills_wizard.py +491 -0
- claude_mpm/cli/parser.py +79 -2
- claude_mpm/cli/parsers/__init__.py +7 -1
- claude_mpm/cli/parsers/agent_manager_parser.py +161 -1
- claude_mpm/cli/parsers/agent_source_parser.py +171 -0
- claude_mpm/cli/parsers/agents_parser.py +369 -1
- claude_mpm/cli/parsers/auto_configure_parser.py +245 -0
- claude_mpm/cli/parsers/base_parser.py +196 -3
- claude_mpm/cli/parsers/config_parser.py +96 -43
- claude_mpm/cli/parsers/configure_parser.py +11 -15
- claude_mpm/cli/parsers/local_deploy_parser.py +227 -0
- claude_mpm/cli/parsers/mcp_parser.py +15 -0
- claude_mpm/cli/parsers/monitor_parser.py +12 -2
- claude_mpm/cli/parsers/mpm_init_parser.py +179 -9
- claude_mpm/cli/parsers/run_parser.py +5 -0
- claude_mpm/cli/parsers/search_parser.py +245 -0
- claude_mpm/cli/parsers/skill_source_parser.py +169 -0
- claude_mpm/cli/parsers/skills_parser.py +282 -0
- claude_mpm/cli/parsers/source_parser.py +138 -0
- claude_mpm/cli/shared/argument_patterns.py +20 -13
- claude_mpm/cli/shared/base_command.py +2 -2
- claude_mpm/cli/shared/output_formatters.py +28 -19
- claude_mpm/cli/startup.py +994 -0
- claude_mpm/cli/startup_display.py +480 -0
- claude_mpm/cli/startup_logging.py +179 -13
- claude_mpm/cli/utils.py +54 -3
- claude_mpm/cli_module/commands.py +1 -1
- claude_mpm/commands/mpm-agents-auto-configure.md +278 -0
- claude_mpm/commands/mpm-agents-detect.md +177 -0
- claude_mpm/commands/mpm-agents-list.md +131 -0
- claude_mpm/commands/mpm-agents-recommend.md +223 -0
- claude_mpm/commands/mpm-config-view.md +150 -0
- claude_mpm/commands/mpm-doctor.md +9 -0
- claude_mpm/commands/mpm-help.md +297 -5
- claude_mpm/commands/mpm-init.md +401 -17
- claude_mpm/commands/mpm-monitor.md +418 -0
- claude_mpm/commands/mpm-postmortem.md +123 -0
- claude_mpm/commands/mpm-session-resume.md +381 -0
- claude_mpm/commands/mpm-status.md +79 -8
- claude_mpm/commands/mpm-ticket-organize.md +304 -0
- claude_mpm/commands/mpm-ticket-view.md +552 -0
- claude_mpm/commands/mpm-version.md +122 -0
- claude_mpm/commands/mpm.md +12 -0
- claude_mpm/config/agent_config.py +4 -4
- claude_mpm/config/agent_presets.py +488 -0
- claude_mpm/config/agent_sources.py +325 -0
- claude_mpm/config/experimental_features.py +7 -7
- claude_mpm/config/model_config.py +428 -0
- claude_mpm/config/paths.py +3 -2
- claude_mpm/config/skill_presets.py +392 -0
- claude_mpm/config/skill_sources.py +590 -0
- claude_mpm/config/socketio_config.py +3 -3
- claude_mpm/constants.py +28 -1
- claude_mpm/core/__init__.py +53 -17
- claude_mpm/core/agent_name_normalizer.py +3 -2
- claude_mpm/core/agent_registry.py +2 -2
- claude_mpm/core/agent_session_manager.py +10 -10
- claude_mpm/core/api_validator.py +330 -0
- claude_mpm/core/base_service.py +33 -23
- claude_mpm/core/cache.py +9 -9
- claude_mpm/core/claude_runner.py +24 -42
- claude_mpm/core/config.py +101 -8
- claude_mpm/core/config_aliases.py +7 -6
- claude_mpm/core/constants.py +66 -1
- claude_mpm/core/container.py +11 -5
- claude_mpm/core/enums.py +452 -0
- claude_mpm/core/error_handler.py +623 -0
- claude_mpm/core/factories.py +1 -1
- claude_mpm/core/file_utils.py +764 -0
- claude_mpm/core/framework/__init__.py +25 -0
- claude_mpm/core/framework/formatters/__init__.py +11 -0
- claude_mpm/core/framework/formatters/capability_generator.py +367 -0
- claude_mpm/core/framework/formatters/content_formatter.py +288 -0
- claude_mpm/core/framework/formatters/context_generator.py +185 -0
- claude_mpm/core/framework/loaders/__init__.py +13 -0
- claude_mpm/core/framework/loaders/agent_loader.py +210 -0
- claude_mpm/core/framework/loaders/file_loader.py +176 -0
- claude_mpm/core/framework/loaders/instruction_loader.py +181 -0
- claude_mpm/core/framework/loaders/packaged_loader.py +232 -0
- claude_mpm/core/framework/processors/__init__.py +11 -0
- claude_mpm/core/framework/processors/memory_processor.py +230 -0
- claude_mpm/core/framework/processors/metadata_processor.py +146 -0
- claude_mpm/core/framework/processors/template_processor.py +244 -0
- claude_mpm/core/framework_loader.py +321 -1631
- claude_mpm/core/hook_error_memory.py +381 -0
- claude_mpm/core/hook_manager.py +49 -8
- claude_mpm/core/injectable_service.py +11 -8
- claude_mpm/core/instruction_reinforcement_hook.py +4 -3
- claude_mpm/core/interactive_session.py +146 -18
- claude_mpm/core/interfaces.py +56 -1
- claude_mpm/core/lazy.py +3 -3
- claude_mpm/core/log_manager.py +92 -23
- claude_mpm/core/logger.py +22 -15
- claude_mpm/core/logging_config.py +6 -2
- claude_mpm/core/logging_utils.py +520 -0
- claude_mpm/core/oneshot_session.py +122 -15
- claude_mpm/core/optimized_agent_loader.py +9 -9
- claude_mpm/core/optimized_startup.py +1 -1
- claude_mpm/core/output_style_manager.py +12 -192
- claude_mpm/core/pm_hook_interceptor.py +18 -12
- claude_mpm/core/protocols/__init__.py +23 -0
- claude_mpm/core/protocols/runner_protocol.py +103 -0
- claude_mpm/core/protocols/session_protocol.py +131 -0
- claude_mpm/core/service_registry.py +7 -3
- claude_mpm/core/session_manager.py +14 -12
- claude_mpm/core/shared/config_loader.py +1 -1
- claude_mpm/core/shared/singleton_manager.py +11 -4
- claude_mpm/core/socketio_pool.py +15 -15
- claude_mpm/core/system_context.py +38 -0
- claude_mpm/core/tool_access_control.py +3 -2
- claude_mpm/core/types.py +4 -11
- claude_mpm/core/typing_utils.py +7 -6
- claude_mpm/core/unified_agent_registry.py +115 -11
- claude_mpm/core/unified_config.py +6 -6
- claude_mpm/core/unified_paths.py +23 -20
- claude_mpm/dashboard/analysis_runner.py +4 -4
- claude_mpm/dashboard/api/simple_directory.py +261 -0
- claude_mpm/dashboard/static/css/activity.css +69 -69
- claude_mpm/dashboard/static/css/connection-status.css +10 -10
- claude_mpm/dashboard/static/css/dashboard.css +600 -18
- claude_mpm/dashboard/static/js/components/activity-tree.js +181 -195
- claude_mpm/dashboard/static/js/components/agent-hierarchy.js +105 -102
- claude_mpm/dashboard/static/js/components/agent-inference.js +34 -31
- claude_mpm/dashboard/static/js/components/build-tracker.js +67 -59
- claude_mpm/dashboard/static/js/components/code-simple.js +857 -0
- claude_mpm/dashboard/static/js/components/connection-debug.js +101 -101
- claude_mpm/dashboard/static/js/components/diff-viewer.js +891 -0
- claude_mpm/dashboard/static/js/components/event-processor.js +3 -0
- claude_mpm/dashboard/static/js/components/event-viewer.js +50 -13
- claude_mpm/dashboard/static/js/components/export-manager.js +3 -0
- claude_mpm/dashboard/static/js/components/file-change-tracker.js +443 -0
- claude_mpm/dashboard/static/js/components/file-change-viewer.js +690 -0
- claude_mpm/dashboard/static/js/components/file-tool-tracker.js +36 -16
- claude_mpm/dashboard/static/js/components/file-viewer.js +580 -0
- claude_mpm/dashboard/static/js/components/module-viewer.js +49 -23
- claude_mpm/dashboard/static/js/components/session-manager.js +19 -19
- claude_mpm/dashboard/static/js/components/socket-manager.js +5 -1
- claude_mpm/dashboard/static/js/components/ui-state-manager.js +356 -41
- claude_mpm/dashboard/static/js/components/unified-data-viewer.js +520 -88
- claude_mpm/dashboard/static/js/components/working-directory.js +46 -11
- claude_mpm/dashboard/static/js/connection-manager.js +76 -76
- claude_mpm/dashboard/static/js/dashboard.js +309 -178
- claude_mpm/dashboard/static/js/extension-error-handler.js +22 -22
- claude_mpm/dashboard/static/js/socket-client.js +183 -139
- claude_mpm/dashboard/static/js/tab-isolation-fix.js +185 -0
- claude_mpm/dashboard/static/socket.io.min.js +7 -0
- claude_mpm/dashboard/static/socket.io.v4.8.1.backup.js +7 -0
- claude_mpm/dashboard/templates/code_simple.html +153 -0
- claude_mpm/dashboard/templates/index.html +125 -122
- claude_mpm/experimental/cli_enhancements.py +5 -7
- claude_mpm/generators/agent_profile_generator.py +5 -3
- claude_mpm/hooks/__init__.py +37 -1
- claude_mpm/hooks/base_hook.py +5 -4
- claude_mpm/hooks/claude_hooks/__pycache__/__init__.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/event_handlers.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/hook_handler.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/memory_integration.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/response_tracking.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/tool_analysis.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/connection_pool.py +4 -4
- claude_mpm/hooks/claude_hooks/event_handlers.py +24 -19
- claude_mpm/hooks/claude_hooks/hook_handler.py +29 -22
- claude_mpm/hooks/claude_hooks/installer.py +67 -22
- claude_mpm/hooks/claude_hooks/memory_integration.py +3 -3
- claude_mpm/hooks/claude_hooks/response_tracking.py +57 -17
- claude_mpm/hooks/claude_hooks/services/__pycache__/__init__.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager_http.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/duplicate_detector.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/state_manager.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/subagent_processor.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/connection_manager.py +62 -64
- claude_mpm/hooks/claude_hooks/services/connection_manager_http.py +140 -76
- claude_mpm/hooks/claude_hooks/services/state_manager.py +11 -9
- claude_mpm/hooks/claude_hooks/services/subagent_processor.py +3 -3
- claude_mpm/hooks/failure_learning/__init__.py +54 -0
- claude_mpm/hooks/failure_learning/failure_detection_hook.py +230 -0
- claude_mpm/hooks/failure_learning/fix_detection_hook.py +212 -0
- claude_mpm/hooks/failure_learning/learning_extraction_hook.py +281 -0
- claude_mpm/hooks/instruction_reinforcement.py +301 -0
- claude_mpm/hooks/kuzu_enrichment_hook.py +263 -0
- claude_mpm/hooks/kuzu_memory_hook.py +386 -0
- claude_mpm/hooks/kuzu_response_hook.py +179 -0
- claude_mpm/hooks/memory_integration_hook.py +1 -1
- claude_mpm/hooks/session_resume_hook.py +121 -0
- claude_mpm/hooks/templates/pre_tool_use_simple.py +78 -0
- claude_mpm/hooks/templates/pre_tool_use_template.py +323 -0
- claude_mpm/hooks/tool_call_interceptor.py +8 -5
- claude_mpm/hooks/validation_hooks.py +3 -3
- claude_mpm/init.py +23 -4
- claude_mpm/models/agent_session.py +8 -6
- claude_mpm/models/git_repository.py +198 -0
- claude_mpm/models/resume_log.py +340 -0
- claude_mpm/scripts/claude-hook-handler.sh +35 -9
- claude_mpm/scripts/launch_monitor.py +85 -0
- claude_mpm/scripts/mcp_server.py +3 -5
- claude_mpm/scripts/mpm_doctor.py +3 -2
- claude_mpm/scripts/socketio_daemon.py +159 -512
- claude_mpm/scripts/start_activity_logging.py +3 -1
- claude_mpm/services/__init__.py +144 -160
- claude_mpm/services/agents/__init__.py +18 -5
- claude_mpm/services/agents/agent_builder.py +56 -18
- claude_mpm/services/agents/agent_preset_service.py +238 -0
- claude_mpm/services/agents/agent_selection_service.py +484 -0
- claude_mpm/services/agents/auto_config_manager.py +796 -0
- claude_mpm/services/agents/auto_deploy_index_parser.py +569 -0
- claude_mpm/services/agents/cache_git_manager.py +621 -0
- claude_mpm/services/agents/deployment/agent_configuration_manager.py +1 -1
- claude_mpm/services/agents/deployment/agent_deployment.py +164 -17
- claude_mpm/services/agents/deployment/agent_discovery_service.py +191 -41
- claude_mpm/services/agents/deployment/agent_filesystem_manager.py +5 -5
- claude_mpm/services/agents/deployment/agent_format_converter.py +56 -12
- claude_mpm/services/agents/deployment/agent_lifecycle_manager.py +5 -7
- claude_mpm/services/agents/deployment/agent_metrics_collector.py +3 -3
- claude_mpm/services/agents/deployment/agent_operation_service.py +2 -2
- claude_mpm/services/agents/deployment/agent_record_service.py +4 -4
- claude_mpm/services/agents/deployment/agent_restore_handler.py +1 -4
- claude_mpm/services/agents/deployment/agent_state_service.py +2 -2
- claude_mpm/services/agents/deployment/agent_template_builder.py +939 -50
- claude_mpm/services/agents/deployment/agent_validator.py +31 -7
- claude_mpm/services/agents/deployment/agent_version_manager.py +8 -5
- claude_mpm/services/agents/deployment/agent_versioning.py +1 -1
- claude_mpm/services/agents/deployment/agents_directory_resolver.py +101 -15
- claude_mpm/services/agents/deployment/async_agent_deployment.py +3 -2
- claude_mpm/services/agents/deployment/deployment_config_loader.py +131 -7
- claude_mpm/services/agents/deployment/deployment_type_detector.py +10 -14
- claude_mpm/services/agents/deployment/deployment_wrapper.py +58 -0
- claude_mpm/services/agents/deployment/facade/deployment_facade.py +3 -3
- claude_mpm/services/agents/deployment/interface_adapter.py +3 -2
- claude_mpm/services/agents/deployment/local_template_deployment.py +360 -0
- claude_mpm/services/agents/deployment/multi_source_deployment_service.py +249 -53
- claude_mpm/services/agents/deployment/pipeline/pipeline_executor.py +2 -2
- claude_mpm/services/agents/deployment/pipeline/steps/agent_processing_step.py +8 -7
- claude_mpm/services/agents/deployment/pipeline/steps/base_step.py +7 -16
- claude_mpm/services/agents/deployment/pipeline/steps/configuration_step.py +4 -3
- claude_mpm/services/agents/deployment/pipeline/steps/target_directory_step.py +7 -5
- claude_mpm/services/agents/deployment/pipeline/steps/validation_step.py +6 -5
- claude_mpm/services/agents/deployment/refactored_agent_deployment_service.py +10 -10
- claude_mpm/services/agents/deployment/remote_agent_discovery_service.py +363 -0
- claude_mpm/services/agents/deployment/single_agent_deployer.py +2 -2
- claude_mpm/services/agents/deployment/system_instructions_deployer.py +168 -43
- claude_mpm/services/agents/deployment/validation/__init__.py +3 -1
- claude_mpm/services/agents/deployment/validation/deployment_validator.py +2 -2
- claude_mpm/services/agents/deployment/validation/template_validator.py +64 -44
- claude_mpm/services/agents/deployment/validation/validation_result.py +1 -9
- claude_mpm/services/agents/git_source_manager.py +629 -0
- claude_mpm/services/agents/loading/agent_profile_loader.py +10 -9
- claude_mpm/services/agents/loading/base_agent_manager.py +16 -6
- claude_mpm/services/agents/loading/framework_agent_loader.py +11 -14
- claude_mpm/services/agents/local_template_manager.py +784 -0
- claude_mpm/services/agents/management/agent_capabilities_generator.py +3 -2
- claude_mpm/services/agents/management/agent_management_service.py +5 -5
- claude_mpm/services/agents/memory/agent_memory_manager.py +32 -29
- claude_mpm/services/agents/memory/content_manager.py +17 -9
- claude_mpm/services/agents/memory/memory_categorization_service.py +4 -2
- claude_mpm/services/agents/memory/memory_file_service.py +32 -6
- claude_mpm/services/agents/memory/memory_format_service.py +6 -4
- claude_mpm/services/agents/memory/memory_limits_service.py +4 -2
- claude_mpm/services/agents/memory/template_generator.py +3 -3
- claude_mpm/services/agents/observers.py +547 -0
- claude_mpm/services/agents/recommender.py +615 -0
- claude_mpm/services/agents/registry/deployed_agent_discovery.py +3 -3
- claude_mpm/services/agents/registry/modification_tracker.py +30 -19
- claude_mpm/services/agents/single_tier_deployment_service.py +696 -0
- claude_mpm/services/agents/sources/__init__.py +13 -0
- claude_mpm/services/agents/sources/agent_sync_state.py +516 -0
- claude_mpm/services/agents/sources/git_source_sync_service.py +1087 -0
- claude_mpm/services/agents/startup_sync.py +239 -0
- claude_mpm/services/agents/toolchain_detector.py +474 -0
- claude_mpm/services/analysis/__init__.py +25 -0
- claude_mpm/services/analysis/postmortem_reporter.py +474 -0
- claude_mpm/services/analysis/postmortem_service.py +765 -0
- claude_mpm/services/async_session_logger.py +141 -98
- claude_mpm/services/claude_session_logger.py +82 -74
- claude_mpm/services/cli/agent_cleanup_service.py +5 -0
- claude_mpm/services/cli/agent_listing_service.py +5 -5
- claude_mpm/services/cli/agent_validation_service.py +3 -1
- claude_mpm/services/cli/memory_crud_service.py +12 -7
- claude_mpm/services/cli/memory_output_formatter.py +2 -2
- claude_mpm/services/cli/resume_service.py +617 -0
- claude_mpm/services/cli/session_manager.py +104 -13
- claude_mpm/services/cli/session_pause_manager.py +504 -0
- claude_mpm/services/cli/session_resume_helper.py +372 -0
- claude_mpm/services/cli/startup_checker.py +13 -10
- claude_mpm/services/cli/unified_dashboard_manager.py +439 -0
- claude_mpm/services/command_deployment_service.py +209 -13
- claude_mpm/services/command_handler_service.py +11 -5
- claude_mpm/services/core/__init__.py +33 -1
- claude_mpm/services/core/base.py +31 -11
- claude_mpm/services/core/interfaces/__init__.py +88 -3
- claude_mpm/services/core/interfaces/agent.py +184 -0
- claude_mpm/services/core/interfaces/health.py +169 -0
- claude_mpm/services/core/interfaces/model.py +281 -0
- claude_mpm/services/core/interfaces/process.py +372 -0
- claude_mpm/services/core/interfaces/project.py +121 -0
- claude_mpm/services/core/interfaces/restart.py +307 -0
- claude_mpm/services/core/interfaces/stability.py +260 -0
- claude_mpm/services/core/interfaces.py +56 -1
- claude_mpm/services/core/memory_manager.py +92 -47
- claude_mpm/services/core/models/__init__.py +70 -0
- claude_mpm/services/core/models/agent_config.py +384 -0
- claude_mpm/services/core/models/health.py +162 -0
- claude_mpm/services/core/models/process.py +239 -0
- claude_mpm/services/core/models/restart.py +302 -0
- claude_mpm/services/core/models/stability.py +264 -0
- claude_mpm/services/core/models/toolchain.py +306 -0
- claude_mpm/services/core/path_resolver.py +36 -14
- claude_mpm/services/diagnostics/__init__.py +2 -2
- claude_mpm/services/diagnostics/checks/__init__.py +8 -2
- claude_mpm/services/diagnostics/checks/agent_check.py +30 -34
- claude_mpm/services/diagnostics/checks/agent_sources_check.py +577 -0
- claude_mpm/services/diagnostics/checks/claude_code_check.py +270 -0
- claude_mpm/services/diagnostics/checks/common_issues_check.py +28 -27
- claude_mpm/services/diagnostics/checks/configuration_check.py +26 -25
- claude_mpm/services/diagnostics/checks/filesystem_check.py +18 -17
- claude_mpm/services/diagnostics/checks/installation_check.py +165 -60
- claude_mpm/services/diagnostics/checks/instructions_check.py +21 -21
- claude_mpm/services/diagnostics/checks/mcp_check.py +57 -44
- claude_mpm/services/diagnostics/checks/mcp_services_check.py +1058 -0
- claude_mpm/services/diagnostics/checks/monitor_check.py +24 -24
- claude_mpm/services/diagnostics/checks/skill_sources_check.py +587 -0
- claude_mpm/services/diagnostics/checks/startup_log_check.py +14 -11
- claude_mpm/services/diagnostics/diagnostic_runner.py +31 -13
- claude_mpm/services/diagnostics/doctor_reporter.py +305 -47
- claude_mpm/services/diagnostics/models.py +37 -21
- claude_mpm/services/event_aggregator.py +5 -3
- claude_mpm/services/event_bus/direct_relay.py +11 -7
- claude_mpm/services/event_bus/event_bus.py +51 -9
- claude_mpm/services/event_bus/relay.py +33 -14
- claude_mpm/services/events/consumers/dead_letter.py +7 -5
- claude_mpm/services/events/consumers/logging.py +1 -2
- claude_mpm/services/events/core.py +5 -6
- claude_mpm/services/events/producers/hook.py +6 -6
- claude_mpm/services/events/producers/system.py +8 -8
- claude_mpm/services/exceptions.py +5 -5
- claude_mpm/services/framework_claude_md_generator/__init__.py +1 -1
- claude_mpm/services/framework_claude_md_generator/content_assembler.py +5 -5
- claude_mpm/services/framework_claude_md_generator/content_validator.py +2 -2
- claude_mpm/services/framework_claude_md_generator/deployment_manager.py +3 -3
- claude_mpm/services/framework_claude_md_generator/section_generators/__init__.py +2 -2
- claude_mpm/services/framework_claude_md_generator/version_manager.py +1 -1
- claude_mpm/services/git/__init__.py +21 -0
- claude_mpm/services/git/git_operations_service.py +494 -0
- claude_mpm/services/github/__init__.py +21 -0
- claude_mpm/services/github/github_cli_service.py +397 -0
- claude_mpm/services/hook_installer_service.py +506 -0
- claude_mpm/services/hook_service.py +5 -6
- claude_mpm/services/infrastructure/context_preservation.py +13 -11
- claude_mpm/services/infrastructure/daemon_manager.py +9 -9
- claude_mpm/services/infrastructure/logging.py +2 -2
- claude_mpm/services/infrastructure/monitoring/__init__.py +2 -6
- claude_mpm/services/infrastructure/monitoring/aggregator.py +13 -18
- claude_mpm/services/infrastructure/monitoring/base.py +5 -13
- claude_mpm/services/infrastructure/monitoring/network.py +7 -6
- claude_mpm/services/infrastructure/monitoring/process.py +13 -12
- claude_mpm/services/infrastructure/monitoring/resources.py +8 -7
- claude_mpm/services/infrastructure/monitoring/service.py +16 -15
- claude_mpm/services/infrastructure/resume_log_generator.py +439 -0
- claude_mpm/services/instructions/__init__.py +9 -0
- claude_mpm/services/instructions/instruction_cache_service.py +374 -0
- claude_mpm/services/local_ops/__init__.py +155 -0
- claude_mpm/services/local_ops/crash_detector.py +257 -0
- claude_mpm/services/local_ops/health_checks/__init__.py +26 -0
- claude_mpm/services/local_ops/health_checks/http_check.py +224 -0
- claude_mpm/services/local_ops/health_checks/process_check.py +236 -0
- claude_mpm/services/local_ops/health_checks/resource_check.py +255 -0
- claude_mpm/services/local_ops/health_manager.py +427 -0
- claude_mpm/services/local_ops/log_monitor.py +396 -0
- claude_mpm/services/local_ops/memory_leak_detector.py +294 -0
- claude_mpm/services/local_ops/process_manager.py +595 -0
- claude_mpm/services/local_ops/resource_monitor.py +331 -0
- claude_mpm/services/local_ops/restart_manager.py +401 -0
- claude_mpm/services/local_ops/restart_policy.py +387 -0
- claude_mpm/services/local_ops/state_manager.py +372 -0
- claude_mpm/services/local_ops/unified_manager.py +600 -0
- claude_mpm/services/mcp_config_manager.py +1542 -0
- claude_mpm/services/mcp_gateway/__init__.py +97 -93
- claude_mpm/services/mcp_gateway/auto_configure.py +43 -38
- claude_mpm/services/mcp_gateway/config/config_loader.py +3 -3
- claude_mpm/services/mcp_gateway/config/configuration.py +24 -5
- claude_mpm/services/mcp_gateway/core/__init__.py +1 -2
- claude_mpm/services/mcp_gateway/core/base.py +20 -33
- claude_mpm/services/mcp_gateway/core/process_pool.py +591 -31
- claude_mpm/services/mcp_gateway/core/singleton_manager.py +2 -2
- claude_mpm/services/mcp_gateway/core/startup_verification.py +3 -3
- claude_mpm/services/mcp_gateway/main.py +90 -15
- claude_mpm/services/mcp_gateway/registry/service_registry.py +4 -2
- claude_mpm/services/mcp_gateway/registry/tool_registry.py +12 -9
- claude_mpm/services/mcp_gateway/server/mcp_gateway.py +5 -10
- claude_mpm/services/mcp_gateway/server/stdio_server.py +9 -17
- claude_mpm/services/mcp_gateway/tools/__init__.py +14 -2
- claude_mpm/services/mcp_gateway/tools/base_adapter.py +15 -15
- claude_mpm/services/mcp_gateway/tools/document_summarizer.py +10 -9
- claude_mpm/services/mcp_gateway/tools/external_mcp_services.py +654 -0
- claude_mpm/services/mcp_gateway/tools/health_check_tool.py +36 -34
- claude_mpm/services/mcp_gateway/tools/hello_world.py +8 -8
- claude_mpm/services/mcp_gateway/tools/kuzu_memory_service.py +555 -0
- claude_mpm/services/mcp_gateway/utils/__init__.py +14 -0
- claude_mpm/services/mcp_gateway/utils/package_version_checker.py +160 -0
- claude_mpm/services/mcp_gateway/utils/update_preferences.py +170 -0
- claude_mpm/services/mcp_service_verifier.py +732 -0
- claude_mpm/services/memory/builder.py +9 -8
- claude_mpm/services/memory/cache/shared_prompt_cache.py +2 -1
- claude_mpm/services/memory/cache/simple_cache.py +2 -2
- claude_mpm/services/memory/failure_tracker.py +578 -0
- claude_mpm/services/memory/indexed_memory.py +8 -8
- claude_mpm/services/memory/optimizer.py +8 -9
- claude_mpm/services/memory/router.py +3 -3
- claude_mpm/services/memory_hook_service.py +165 -4
- claude_mpm/services/model/__init__.py +147 -0
- claude_mpm/services/model/base_provider.py +365 -0
- claude_mpm/services/model/claude_provider.py +412 -0
- claude_mpm/services/model/model_router.py +452 -0
- claude_mpm/services/model/ollama_provider.py +415 -0
- claude_mpm/services/monitor/__init__.py +20 -0
- claude_mpm/services/monitor/daemon.py +691 -0
- claude_mpm/services/monitor/daemon_manager.py +1040 -0
- claude_mpm/services/monitor/event_emitter.py +350 -0
- claude_mpm/services/monitor/handlers/__init__.py +21 -0
- claude_mpm/services/monitor/handlers/code_analysis.py +332 -0
- claude_mpm/services/monitor/handlers/dashboard.py +299 -0
- claude_mpm/services/monitor/handlers/file.py +264 -0
- claude_mpm/services/monitor/handlers/hooks.py +512 -0
- claude_mpm/services/monitor/management/__init__.py +18 -0
- claude_mpm/services/monitor/management/health.py +124 -0
- claude_mpm/services/monitor/management/lifecycle.py +724 -0
- claude_mpm/services/monitor/server.py +817 -0
- claude_mpm/services/monitor_build_service.py +2 -2
- claude_mpm/services/native_agent_converter.py +356 -0
- claude_mpm/services/orphan_detection.py +786 -0
- claude_mpm/services/port_manager.py +3 -3
- claude_mpm/services/pr/__init__.py +14 -0
- claude_mpm/services/pr/pr_template_service.py +329 -0
- claude_mpm/services/project/__init__.py +23 -0
- claude_mpm/services/project/analyzer.py +3 -3
- claude_mpm/services/project/architecture_analyzer.py +5 -5
- claude_mpm/services/project/archive_manager.py +1045 -0
- claude_mpm/services/project/dependency_analyzer.py +4 -4
- claude_mpm/services/project/detection_strategies.py +719 -0
- claude_mpm/services/project/documentation_manager.py +554 -0
- claude_mpm/services/project/enhanced_analyzer.py +572 -0
- claude_mpm/services/project/metrics_collector.py +4 -4
- claude_mpm/services/project/project_organizer.py +1005 -0
- claude_mpm/services/project/registry.py +13 -7
- claude_mpm/services/project/toolchain_analyzer.py +583 -0
- claude_mpm/services/project_port_allocator.py +596 -0
- claude_mpm/services/response_tracker.py +21 -10
- claude_mpm/services/runner_configuration_service.py +17 -3
- claude_mpm/services/self_upgrade_service.py +500 -0
- claude_mpm/services/session_management_service.py +23 -9
- claude_mpm/services/session_manager.py +380 -0
- claude_mpm/services/shared/__init__.py +2 -1
- claude_mpm/services/shared/async_service_base.py +16 -27
- claude_mpm/services/shared/config_service_base.py +17 -14
- claude_mpm/services/shared/lifecycle_service_base.py +1 -14
- claude_mpm/services/shared/service_factory.py +8 -5
- claude_mpm/services/skills/__init__.py +18 -0
- claude_mpm/services/skills/git_skill_source_manager.py +1169 -0
- claude_mpm/services/skills/skill_discovery_service.py +568 -0
- claude_mpm/services/skills_config.py +547 -0
- claude_mpm/services/skills_deployer.py +955 -0
- claude_mpm/services/socketio/client_proxy.py +60 -5
- claude_mpm/services/socketio/dashboard_server.py +361 -0
- claude_mpm/services/socketio/event_normalizer.py +10 -6
- claude_mpm/services/socketio/handlers/__init__.py +5 -2
- claude_mpm/services/socketio/handlers/base.py +2 -2
- claude_mpm/services/socketio/handlers/code_analysis.py +90 -27
- claude_mpm/services/socketio/handlers/connection.py +22 -41
- claude_mpm/services/socketio/handlers/connection_handler.py +13 -10
- claude_mpm/services/socketio/handlers/file.py +46 -10
- claude_mpm/services/socketio/handlers/git.py +9 -9
- claude_mpm/services/socketio/handlers/hook.py +29 -17
- claude_mpm/services/socketio/handlers/registry.py +4 -2
- claude_mpm/services/socketio/monitor_client.py +364 -0
- claude_mpm/services/socketio/server/broadcaster.py +9 -7
- claude_mpm/services/socketio/server/connection_manager.py +2 -2
- claude_mpm/services/socketio/server/core.py +142 -8
- claude_mpm/services/socketio/server/eventbus_integration.py +20 -14
- claude_mpm/services/socketio/server/main.py +24 -24
- claude_mpm/services/socketio_client_manager.py +4 -4
- claude_mpm/services/subprocess_launcher_service.py +19 -15
- claude_mpm/services/system_instructions_service.py +3 -5
- claude_mpm/services/ticket_services/formatter_service.py +1 -1
- claude_mpm/services/ticket_services/validation_service.py +5 -5
- claude_mpm/services/unified/__init__.py +65 -0
- claude_mpm/services/unified/analyzer_strategies/__init__.py +44 -0
- claude_mpm/services/unified/analyzer_strategies/code_analyzer.py +518 -0
- claude_mpm/services/unified/analyzer_strategies/dependency_analyzer.py +680 -0
- claude_mpm/services/unified/analyzer_strategies/performance_analyzer.py +900 -0
- claude_mpm/services/unified/analyzer_strategies/security_analyzer.py +745 -0
- claude_mpm/services/unified/analyzer_strategies/structure_analyzer.py +733 -0
- claude_mpm/services/unified/config_strategies/__init__.py +175 -0
- claude_mpm/services/unified/config_strategies/config_schema.py +731 -0
- claude_mpm/services/unified/config_strategies/context_strategy.py +747 -0
- claude_mpm/services/unified/config_strategies/error_handling_strategy.py +1005 -0
- claude_mpm/services/unified/config_strategies/file_loader_strategy.py +881 -0
- claude_mpm/services/unified/config_strategies/unified_config_service.py +823 -0
- claude_mpm/services/unified/config_strategies/validation_strategy.py +1148 -0
- claude_mpm/services/unified/deployment_strategies/__init__.py +97 -0
- claude_mpm/services/unified/deployment_strategies/base.py +553 -0
- claude_mpm/services/unified/deployment_strategies/cloud_strategies.py +573 -0
- claude_mpm/services/unified/deployment_strategies/local.py +607 -0
- claude_mpm/services/unified/deployment_strategies/utils.py +667 -0
- claude_mpm/services/unified/deployment_strategies/vercel.py +471 -0
- claude_mpm/services/unified/interfaces.py +475 -0
- claude_mpm/services/unified/migration.py +509 -0
- claude_mpm/services/unified/strategies.py +534 -0
- claude_mpm/services/unified/unified_analyzer.py +542 -0
- claude_mpm/services/unified/unified_config.py +691 -0
- claude_mpm/services/unified/unified_deployment.py +466 -0
- claude_mpm/services/utility_service.py +6 -3
- claude_mpm/services/version_control/branch_strategy.py +2 -2
- claude_mpm/services/version_control/conflict_resolution.py +14 -8
- claude_mpm/services/version_control/git_operations.py +26 -24
- claude_mpm/services/version_control/semantic_versioning.py +14 -14
- claude_mpm/services/version_control/version_parser.py +14 -11
- claude_mpm/services/version_service.py +104 -1
- claude_mpm/services/visualization/__init__.py +1 -5
- claude_mpm/services/visualization/mermaid_generator.py +2 -3
- claude_mpm/skills/__init__.py +42 -0
- claude_mpm/skills/agent_skills_injector.py +324 -0
- claude_mpm/skills/bundled/LICENSE_ATTRIBUTIONS.md +79 -0
- claude_mpm/skills/bundled/__init__.py +6 -0
- claude_mpm/skills/bundled/api-documentation.md +393 -0
- claude_mpm/skills/bundled/async-testing.md +571 -0
- claude_mpm/skills/bundled/code-review.md +143 -0
- claude_mpm/skills/bundled/database-migration.md +199 -0
- claude_mpm/skills/bundled/docker-containerization.md +194 -0
- claude_mpm/skills/bundled/express-local-dev.md +1429 -0
- claude_mpm/skills/bundled/fastapi-local-dev.md +1199 -0
- claude_mpm/skills/bundled/git-workflow.md +414 -0
- claude_mpm/skills/bundled/imagemagick.md +204 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/scripts/validate_env.py +576 -0
- claude_mpm/skills/bundled/json-data-handling.md +223 -0
- claude_mpm/skills/bundled/main/mcp-builder/scripts/connections.py +157 -0
- claude_mpm/skills/bundled/main/mcp-builder/scripts/evaluation.py +425 -0
- claude_mpm/skills/bundled/main/skill-creator/scripts/init_skill.py +303 -0
- claude_mpm/skills/bundled/main/skill-creator/scripts/package_skill.py +113 -0
- claude_mpm/skills/bundled/main/skill-creator/scripts/quick_validate.py +72 -0
- claude_mpm/skills/bundled/nextjs-local-dev.md +807 -0
- claude_mpm/skills/bundled/pdf.md +141 -0
- claude_mpm/skills/bundled/performance-profiling.md +573 -0
- claude_mpm/skills/bundled/refactoring-patterns.md +180 -0
- claude_mpm/skills/bundled/security-scanning.md +327 -0
- claude_mpm/skills/bundled/systematic-debugging.md +473 -0
- claude_mpm/skills/bundled/test-driven-development.md +378 -0
- claude_mpm/skills/bundled/testing/webapp-testing/examples/console_logging.py +35 -0
- claude_mpm/skills/bundled/testing/webapp-testing/examples/element_discovery.py +44 -0
- claude_mpm/skills/bundled/testing/webapp-testing/examples/static_html_automation.py +34 -0
- claude_mpm/skills/bundled/testing/webapp-testing/scripts/with_server.py +129 -0
- claude_mpm/skills/bundled/vite-local-dev.md +1061 -0
- claude_mpm/skills/bundled/web-performance-optimization.md +2305 -0
- claude_mpm/skills/bundled/xlsx.md +157 -0
- claude_mpm/skills/registry.py +286 -0
- claude_mpm/skills/skill_manager.py +310 -0
- claude_mpm/skills/skills_registry.py +347 -0
- claude_mpm/skills/skills_service.py +739 -0
- claude_mpm/storage/state_storage.py +31 -31
- claude_mpm/templates/questions/__init__.py +38 -0
- claude_mpm/templates/questions/base.py +193 -0
- claude_mpm/templates/questions/pr_strategy.py +311 -0
- claude_mpm/templates/questions/project_init.py +385 -0
- claude_mpm/templates/questions/ticket_mgmt.py +394 -0
- claude_mpm/tools/__main__.py +9 -9
- claude_mpm/tools/code_tree_analyzer/__init__.py +45 -0
- claude_mpm/tools/code_tree_analyzer/analysis.py +299 -0
- claude_mpm/tools/code_tree_analyzer/cache.py +131 -0
- claude_mpm/tools/code_tree_analyzer/core.py +380 -0
- claude_mpm/tools/code_tree_analyzer/discovery.py +403 -0
- claude_mpm/tools/code_tree_analyzer/events.py +168 -0
- claude_mpm/tools/code_tree_analyzer/gitignore.py +308 -0
- claude_mpm/tools/code_tree_analyzer/models.py +39 -0
- claude_mpm/tools/code_tree_analyzer/multilang_analyzer.py +224 -0
- claude_mpm/tools/code_tree_analyzer/python_analyzer.py +284 -0
- claude_mpm/tools/code_tree_builder.py +6 -6
- claude_mpm/tools/code_tree_events.py +14 -10
- claude_mpm/tools/socketio_debug.py +11 -11
- claude_mpm/utils/agent_dependency_loader.py +184 -36
- claude_mpm/utils/agent_filters.py +288 -0
- claude_mpm/utils/common.py +544 -0
- claude_mpm/utils/config_manager.py +12 -6
- claude_mpm/utils/database_connector.py +298 -0
- claude_mpm/utils/dependency_cache.py +5 -3
- claude_mpm/utils/dependency_strategies.py +15 -10
- claude_mpm/utils/display_helper.py +260 -0
- claude_mpm/utils/environment_context.py +4 -3
- claude_mpm/utils/error_handler.py +5 -3
- claude_mpm/utils/file_utils.py +13 -14
- claude_mpm/utils/git_analyzer.py +407 -0
- claude_mpm/utils/gitignore.py +241 -0
- claude_mpm/utils/log_cleanup.py +627 -0
- claude_mpm/utils/migration.py +372 -0
- claude_mpm/utils/path_operations.py +7 -4
- claude_mpm/utils/progress.py +387 -0
- claude_mpm/utils/robust_installer.py +131 -24
- claude_mpm/utils/session_logging.py +2 -2
- claude_mpm/utils/structured_questions.py +619 -0
- claude_mpm/utils/subprocess_utils.py +9 -8
- claude_mpm/validation/agent_validator.py +6 -6
- claude_mpm/validation/frontmatter_validator.py +6 -6
- claude_mpm-5.0.9.dist-info/METADATA +1028 -0
- claude_mpm-5.0.9.dist-info/RECORD +864 -0
- {claude_mpm-4.1.26.dist-info → claude_mpm-5.0.9.dist-info}/entry_points.txt +1 -0
- claude_mpm/agents/INSTRUCTIONS.md +0 -261
- claude_mpm/agents/templates/.claude-mpm/memories/README.md +0 -17
- claude_mpm/agents/templates/.claude-mpm/memories/engineer_memories.md +0 -3
- claude_mpm/agents/templates/agent-manager.json +0 -270
- claude_mpm/agents/templates/agent-manager.md +0 -619
- claude_mpm/agents/templates/agentic_coder_optimizer.json +0 -222
- claude_mpm/agents/templates/api_qa.json +0 -171
- claude_mpm/agents/templates/code_analyzer.json +0 -95
- claude_mpm/agents/templates/data_engineer.json +0 -152
- claude_mpm/agents/templates/documentation.json +0 -175
- claude_mpm/agents/templates/engineer.json +0 -176
- claude_mpm/agents/templates/imagemagick.json +0 -261
- claude_mpm/agents/templates/logs/prompts/agent_engineer_20250826_014258_728.md +0 -39
- claude_mpm/agents/templates/memory_manager.json +0 -155
- claude_mpm/agents/templates/ops.json +0 -175
- claude_mpm/agents/templates/project_organizer.json +0 -130
- claude_mpm/agents/templates/qa.json +0 -223
- claude_mpm/agents/templates/refactoring_engineer.json +0 -266
- claude_mpm/agents/templates/research.json +0 -163
- claude_mpm/agents/templates/security.json +0 -153
- claude_mpm/agents/templates/ticketing.json +0 -169
- claude_mpm/agents/templates/vercel_ops_agent.json +0 -281
- claude_mpm/agents/templates/version_control.json +0 -147
- claude_mpm/agents/templates/web_qa.json +0 -254
- claude_mpm/agents/templates/web_ui.json +0 -176
- claude_mpm/cli/commands/configure_tui.py +0 -1927
- claude_mpm/cli/commands/mpm_init.py +0 -594
- claude_mpm/cli/commands/socketio_monitor.py +0 -233
- claude_mpm/commands/mpm-agents.md +0 -12
- claude_mpm/commands/mpm-config.md +0 -18
- claude_mpm/commands/mpm-tickets.md +0 -102
- claude_mpm/dashboard/.claude-mpm/socketio-instances.json +0 -1
- claude_mpm/dashboard/static/built/components/activity-tree.js +0 -2
- claude_mpm/dashboard/static/built/components/agent-inference.js +0 -2
- claude_mpm/dashboard/static/built/components/code-tree.js +0 -2
- claude_mpm/dashboard/static/built/components/code-viewer.js +0 -2
- claude_mpm/dashboard/static/built/components/event-processor.js +0 -2
- claude_mpm/dashboard/static/built/components/event-viewer.js +0 -2
- claude_mpm/dashboard/static/built/components/export-manager.js +0 -2
- claude_mpm/dashboard/static/built/components/file-tool-tracker.js +0 -2
- claude_mpm/dashboard/static/built/components/hud-library-loader.js +0 -2
- claude_mpm/dashboard/static/built/components/hud-manager.js +0 -2
- claude_mpm/dashboard/static/built/components/hud-visualizer.js +0 -2
- claude_mpm/dashboard/static/built/components/module-viewer.js +0 -2
- claude_mpm/dashboard/static/built/components/session-manager.js +0 -2
- claude_mpm/dashboard/static/built/components/socket-manager.js +0 -2
- claude_mpm/dashboard/static/built/components/ui-state-manager.js +0 -2
- claude_mpm/dashboard/static/built/components/unified-data-viewer.js +0 -2
- claude_mpm/dashboard/static/built/components/working-directory.js +0 -2
- claude_mpm/dashboard/static/built/dashboard.js +0 -2
- claude_mpm/dashboard/static/built/socket-client.js +0 -2
- claude_mpm/dashboard/static/css/code-tree.css +0 -1408
- claude_mpm/dashboard/static/dist/components/activity-tree.js +0 -2
- claude_mpm/dashboard/static/dist/components/agent-inference.js +0 -2
- claude_mpm/dashboard/static/dist/components/code-tree.js +0 -2
- claude_mpm/dashboard/static/dist/components/code-viewer.js +0 -2
- claude_mpm/dashboard/static/dist/components/event-processor.js +0 -2
- claude_mpm/dashboard/static/dist/components/event-viewer.js +0 -2
- claude_mpm/dashboard/static/dist/components/export-manager.js +0 -2
- claude_mpm/dashboard/static/dist/components/file-tool-tracker.js +0 -2
- claude_mpm/dashboard/static/dist/components/hud-library-loader.js +0 -2
- claude_mpm/dashboard/static/dist/components/hud-manager.js +0 -2
- claude_mpm/dashboard/static/dist/components/hud-visualizer.js +0 -2
- claude_mpm/dashboard/static/dist/components/module-viewer.js +0 -2
- claude_mpm/dashboard/static/dist/components/session-manager.js +0 -2
- claude_mpm/dashboard/static/dist/components/socket-manager.js +0 -2
- claude_mpm/dashboard/static/dist/components/ui-state-manager.js +0 -2
- claude_mpm/dashboard/static/dist/components/unified-data-viewer.js +0 -2
- claude_mpm/dashboard/static/dist/components/working-directory.js +0 -2
- claude_mpm/dashboard/static/dist/dashboard.js +0 -2
- claude_mpm/dashboard/static/dist/socket-client.js +0 -2
- claude_mpm/dashboard/static/js/components/code-tree.js +0 -3220
- claude_mpm/dashboard/static/js/components/code-viewer.js +0 -480
- claude_mpm/hooks/claude_hooks/hook_handler_eventbus.py +0 -425
- claude_mpm/hooks/claude_hooks/hook_handler_original.py +0 -1040
- claude_mpm/hooks/claude_hooks/hook_handler_refactored.py +0 -347
- claude_mpm/scripts/socketio_daemon_hardened.py +0 -937
- claude_mpm/scripts/socketio_daemon_wrapper.py +0 -78
- claude_mpm/scripts/socketio_server_manager.py +0 -349
- claude_mpm/services/agents/deployment/agent_lifecycle_manager_refactored.py +0 -575
- claude_mpm/services/cli/dashboard_launcher.py +0 -423
- claude_mpm/services/cli/socketio_manager.py +0 -537
- claude_mpm/services/diagnostics/checks/claude_desktop_check.py +0 -286
- claude_mpm/services/mcp_gateway/tools/ticket_tools.py +0 -645
- claude_mpm/services/mcp_gateway/tools/unified_ticket_tool.py +0 -602
- claude_mpm/services/project/analyzer_refactored.py +0 -450
- claude_mpm/tools/code_tree_analyzer.py +0 -1693
- claude_mpm-4.1.26.dist-info/METADATA +0 -332
- claude_mpm-4.1.26.dist-info/RECORD +0 -606
- {claude_mpm-4.1.26.dist-info → claude_mpm-5.0.9.dist-info}/WHEEL +0 -0
- {claude_mpm-4.1.26.dist-info → claude_mpm-5.0.9.dist-info}/licenses/LICENSE +0 -0
- {claude_mpm-4.1.26.dist-info → claude_mpm-5.0.9.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,381 @@
|
|
|
1
|
+
"""Hook Error Memory System.
|
|
2
|
+
|
|
3
|
+
This module provides error detection and memory for hook execution to prevent
|
|
4
|
+
repeated errors and provide helpful diagnostics.
|
|
5
|
+
|
|
6
|
+
WHY this is needed:
|
|
7
|
+
- Hook processor can encounter transient or persistent errors
|
|
8
|
+
- Repeated failing commands waste resources and clutter logs
|
|
9
|
+
- Users need actionable suggestions to fix configuration issues
|
|
10
|
+
- System should learn from errors and prevent repetition
|
|
11
|
+
|
|
12
|
+
DESIGN DECISION: Store errors in JSON file rather than database because:
|
|
13
|
+
- Simple, human-readable format
|
|
14
|
+
- Easy to inspect and manually clear
|
|
15
|
+
- No additional dependencies
|
|
16
|
+
- Fast read/write for small datasets
|
|
17
|
+
- Users can easily delete to retry failed commands
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
import json
|
|
21
|
+
import re
|
|
22
|
+
from datetime import datetime, timezone
|
|
23
|
+
from pathlib import Path
|
|
24
|
+
from typing import Any, Dict, Optional
|
|
25
|
+
|
|
26
|
+
from ..core.logger import get_logger
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
class HookErrorMemory:
|
|
30
|
+
"""Tracks and prevents repeated hook execution errors.
|
|
31
|
+
|
|
32
|
+
WHY this design:
|
|
33
|
+
- Detects common error patterns automatically
|
|
34
|
+
- Stores error history to prevent repetition
|
|
35
|
+
- Provides actionable fix suggestions
|
|
36
|
+
- Allows manual retry by clearing memory
|
|
37
|
+
- Minimal performance overhead (<1ms per check)
|
|
38
|
+
"""
|
|
39
|
+
|
|
40
|
+
# Error pattern definitions with detection regexes
|
|
41
|
+
ERROR_PATTERNS = [
|
|
42
|
+
(r"no such file or directory[:\s]+(.+?)(?:\n|$)", "file_not_found"),
|
|
43
|
+
(r"command not found[:\s]+(.+?)(?:\n|$)", "command_not_found"),
|
|
44
|
+
(r"permission denied[:\s]+(.+?)(?:\n|$)", "permission_denied"),
|
|
45
|
+
(r"syntax error", "syntax_error"),
|
|
46
|
+
(r"Error:\s*\(eval\):(\d+):\s*(.+?)(?:\n|$)", "eval_error"),
|
|
47
|
+
(r"Error:\s*(.+?)(?:\n|$)", "general_error"),
|
|
48
|
+
]
|
|
49
|
+
|
|
50
|
+
def __init__(self, memory_file: Optional[Path] = None):
|
|
51
|
+
"""Initialize hook error memory.
|
|
52
|
+
|
|
53
|
+
Args:
|
|
54
|
+
memory_file: Path to memory file (default: .claude-mpm/hook_errors.json)
|
|
55
|
+
"""
|
|
56
|
+
self.logger = get_logger("hook_error_memory")
|
|
57
|
+
|
|
58
|
+
# Use default location if not specified
|
|
59
|
+
if memory_file is None:
|
|
60
|
+
memory_file = Path.cwd() / ".claude-mpm" / "hook_errors.json"
|
|
61
|
+
|
|
62
|
+
self.memory_file = memory_file
|
|
63
|
+
self.errors: Dict[str, Any] = self._load_errors()
|
|
64
|
+
|
|
65
|
+
def _load_errors(self) -> Dict[str, Any]:
|
|
66
|
+
"""Load previously encountered errors from disk.
|
|
67
|
+
|
|
68
|
+
Returns:
|
|
69
|
+
Dictionary of error records
|
|
70
|
+
"""
|
|
71
|
+
if not self.memory_file.exists():
|
|
72
|
+
return {}
|
|
73
|
+
|
|
74
|
+
try:
|
|
75
|
+
content = self.memory_file.read_text()
|
|
76
|
+
if not content.strip():
|
|
77
|
+
return {}
|
|
78
|
+
return json.loads(content)
|
|
79
|
+
except json.JSONDecodeError as e:
|
|
80
|
+
self.logger.warning(f"Failed to parse error memory file: {e}")
|
|
81
|
+
return {}
|
|
82
|
+
except Exception as e:
|
|
83
|
+
self.logger.error(f"Error loading error memory: {e}")
|
|
84
|
+
return {}
|
|
85
|
+
|
|
86
|
+
def _save_errors(self):
|
|
87
|
+
"""Persist errors to disk."""
|
|
88
|
+
try:
|
|
89
|
+
# Ensure directory exists
|
|
90
|
+
self.memory_file.parent.mkdir(parents=True, exist_ok=True)
|
|
91
|
+
|
|
92
|
+
# Write with pretty formatting for human readability
|
|
93
|
+
self.memory_file.write_text(json.dumps(self.errors, indent=2))
|
|
94
|
+
except Exception as e:
|
|
95
|
+
self.logger.error(f"Failed to save error memory: {e}")
|
|
96
|
+
|
|
97
|
+
def detect_error(
|
|
98
|
+
self, output: str, stderr: str, returncode: int
|
|
99
|
+
) -> Optional[Dict[str, str]]:
|
|
100
|
+
"""Detect if output contains an error.
|
|
101
|
+
|
|
102
|
+
WHY check both stdout and stderr:
|
|
103
|
+
- Some commands write errors to stdout
|
|
104
|
+
- Some write to stderr
|
|
105
|
+
- Return code alone isn't enough (some hooks return non-zero on purpose)
|
|
106
|
+
|
|
107
|
+
Args:
|
|
108
|
+
output: Standard output from command
|
|
109
|
+
stderr: Standard error from command
|
|
110
|
+
returncode: Exit code from command
|
|
111
|
+
|
|
112
|
+
Returns:
|
|
113
|
+
Dict with error info if detected, None otherwise
|
|
114
|
+
"""
|
|
115
|
+
# Combine output sources for comprehensive error detection
|
|
116
|
+
combined_output = f"{output}\n{stderr}"
|
|
117
|
+
|
|
118
|
+
# Try each pattern in order of specificity
|
|
119
|
+
for pattern, error_type in self.ERROR_PATTERNS:
|
|
120
|
+
match = re.search(pattern, combined_output, re.IGNORECASE | re.MULTILINE)
|
|
121
|
+
if match:
|
|
122
|
+
# Extract details from the match
|
|
123
|
+
details = match.group(1) if match.groups() else match.group(0)
|
|
124
|
+
|
|
125
|
+
return {
|
|
126
|
+
"type": error_type,
|
|
127
|
+
"pattern": pattern,
|
|
128
|
+
"match": match.group(0).strip(),
|
|
129
|
+
"details": details.strip() if details else "",
|
|
130
|
+
"returncode": returncode,
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
# If no pattern matched but returncode is non-zero, record as generic error
|
|
134
|
+
if returncode != 0 and combined_output.strip():
|
|
135
|
+
return {
|
|
136
|
+
"type": "unknown_error",
|
|
137
|
+
"pattern": "non-zero exit code",
|
|
138
|
+
"match": f"Exit code: {returncode}",
|
|
139
|
+
"details": combined_output[:200].strip(), # First 200 chars
|
|
140
|
+
"returncode": returncode,
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
return None
|
|
144
|
+
|
|
145
|
+
def record_error(self, error_info: Dict[str, str], hook_type: str):
|
|
146
|
+
"""Record an error to prevent future repetition.
|
|
147
|
+
|
|
148
|
+
WHY use composite key:
|
|
149
|
+
- Same error type can occur with different details
|
|
150
|
+
- Want to track specific error instances
|
|
151
|
+
- Hook type context helps with diagnosis
|
|
152
|
+
|
|
153
|
+
Args:
|
|
154
|
+
error_info: Error information from detect_error()
|
|
155
|
+
hook_type: Type of hook that failed (e.g., "PreToolUse")
|
|
156
|
+
"""
|
|
157
|
+
# Create unique key for this error
|
|
158
|
+
key = f"{error_info['type']}:{hook_type}:{error_info['details']}"
|
|
159
|
+
|
|
160
|
+
now = datetime.now(timezone.utc).isoformat()
|
|
161
|
+
|
|
162
|
+
if key in self.errors:
|
|
163
|
+
# Update existing error
|
|
164
|
+
self.errors[key]["count"] += 1
|
|
165
|
+
self.errors[key]["last_seen"] = now
|
|
166
|
+
else:
|
|
167
|
+
# Record new error
|
|
168
|
+
self.errors[key] = {
|
|
169
|
+
"type": error_info["type"],
|
|
170
|
+
"hook_type": hook_type,
|
|
171
|
+
"details": error_info["details"],
|
|
172
|
+
"match": error_info["match"],
|
|
173
|
+
"returncode": error_info.get("returncode", 1),
|
|
174
|
+
"count": 1,
|
|
175
|
+
"first_seen": now,
|
|
176
|
+
"last_seen": now,
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
self._save_errors()
|
|
180
|
+
self.logger.debug(
|
|
181
|
+
f"Recorded error: {error_info['type']} (count: {self.errors[key]['count']})"
|
|
182
|
+
)
|
|
183
|
+
|
|
184
|
+
def is_known_failing_hook(self, hook_type: str) -> Optional[Dict[str, Any]]:
|
|
185
|
+
"""Check if a hook type is known to fail repeatedly.
|
|
186
|
+
|
|
187
|
+
WHY check for 2+ failures:
|
|
188
|
+
- Single failure could be transient
|
|
189
|
+
- 2+ failures indicate persistent issue
|
|
190
|
+
- Balance between retry attempts and error prevention
|
|
191
|
+
|
|
192
|
+
Args:
|
|
193
|
+
hook_type: Type of hook to check
|
|
194
|
+
|
|
195
|
+
Returns:
|
|
196
|
+
Error data if hook is known to fail, None otherwise
|
|
197
|
+
"""
|
|
198
|
+
# Find any errors for this hook type with 2+ occurrences
|
|
199
|
+
for key, error_data in self.errors.items():
|
|
200
|
+
if error_data["hook_type"] == hook_type and error_data["count"] >= 2:
|
|
201
|
+
return error_data
|
|
202
|
+
|
|
203
|
+
return None
|
|
204
|
+
|
|
205
|
+
def should_skip_hook(self, hook_type: str, threshold: int = 2) -> bool:
|
|
206
|
+
"""Determine if a hook should be skipped due to repeated failures.
|
|
207
|
+
|
|
208
|
+
Args:
|
|
209
|
+
hook_type: Type of hook to check
|
|
210
|
+
threshold: Minimum failure count to skip (default: 2)
|
|
211
|
+
|
|
212
|
+
Returns:
|
|
213
|
+
True if hook should be skipped
|
|
214
|
+
"""
|
|
215
|
+
error_data = self.is_known_failing_hook(hook_type)
|
|
216
|
+
return error_data is not None and error_data["count"] >= threshold
|
|
217
|
+
|
|
218
|
+
def suggest_fix(self, error_info: Dict[str, str]) -> str:
|
|
219
|
+
"""Suggest a fix for the detected error.
|
|
220
|
+
|
|
221
|
+
WHY provide suggestions:
|
|
222
|
+
- Users need actionable guidance
|
|
223
|
+
- Common errors have known solutions
|
|
224
|
+
- Reduces support burden
|
|
225
|
+
- Improves user experience
|
|
226
|
+
|
|
227
|
+
Args:
|
|
228
|
+
error_info: Error information from detect_error()
|
|
229
|
+
|
|
230
|
+
Returns:
|
|
231
|
+
Human-readable fix suggestion
|
|
232
|
+
"""
|
|
233
|
+
error_type = error_info["type"]
|
|
234
|
+
details = error_info.get("details", "")
|
|
235
|
+
|
|
236
|
+
suggestions = {
|
|
237
|
+
"file_not_found": f"""File not found: {details}
|
|
238
|
+
|
|
239
|
+
Possible fixes:
|
|
240
|
+
1. Check if the file exists: ls -la {details}
|
|
241
|
+
2. Verify the path is correct in your hook configuration
|
|
242
|
+
3. If it's a script, ensure it's executable: chmod +x {details}
|
|
243
|
+
4. Clear error memory to retry: rm {self.memory_file}
|
|
244
|
+
""",
|
|
245
|
+
"command_not_found": f"""Command not found: {details}
|
|
246
|
+
|
|
247
|
+
Possible fixes:
|
|
248
|
+
1. Install the missing command
|
|
249
|
+
2. Check if it's in your PATH: which {details}
|
|
250
|
+
3. Update hook configuration to use absolute path
|
|
251
|
+
4. Remove the hook if no longer needed
|
|
252
|
+
""",
|
|
253
|
+
"permission_denied": f"""Permission denied: {details}
|
|
254
|
+
|
|
255
|
+
Possible fixes:
|
|
256
|
+
1. Check file permissions: ls -la {details}
|
|
257
|
+
2. Make file executable: chmod +x {details}
|
|
258
|
+
3. Run with appropriate privileges
|
|
259
|
+
4. Check file ownership
|
|
260
|
+
""",
|
|
261
|
+
"syntax_error": """Syntax error in hook configuration or script
|
|
262
|
+
|
|
263
|
+
Possible fixes:
|
|
264
|
+
1. Review hook configuration in .claude-mpm/config
|
|
265
|
+
2. Check script syntax if using shell hooks
|
|
266
|
+
3. Validate JSON configuration format
|
|
267
|
+
4. Check for typos in hook definitions
|
|
268
|
+
""",
|
|
269
|
+
"eval_error": f"""Error in hook execution: {details}
|
|
270
|
+
|
|
271
|
+
Possible fixes:
|
|
272
|
+
1. Review hook handler logs for details
|
|
273
|
+
2. Check hook configuration syntax
|
|
274
|
+
3. Verify all required dependencies are available
|
|
275
|
+
4. Test hook handler manually: python {details}
|
|
276
|
+
""",
|
|
277
|
+
"general_error": f"""Error during hook execution: {error_info.get("match", "Unknown error")}
|
|
278
|
+
|
|
279
|
+
Possible fixes:
|
|
280
|
+
1. Check logs for detailed error information
|
|
281
|
+
2. Verify hook configuration is correct
|
|
282
|
+
3. Ensure all dependencies are installed
|
|
283
|
+
4. Clear error memory to retry: rm {self.memory_file}
|
|
284
|
+
""",
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
return suggestions.get(
|
|
288
|
+
error_type, f"Unknown error type: {error_type}\n\nDetails: {details}"
|
|
289
|
+
)
|
|
290
|
+
|
|
291
|
+
def clear_errors(self, hook_type: Optional[str] = None):
|
|
292
|
+
"""Clear error memory to allow retry of failed hooks.
|
|
293
|
+
|
|
294
|
+
Args:
|
|
295
|
+
hook_type: If specified, only clear errors for this hook type
|
|
296
|
+
"""
|
|
297
|
+
if hook_type is None:
|
|
298
|
+
# Clear all errors
|
|
299
|
+
count = len(self.errors)
|
|
300
|
+
self.errors.clear()
|
|
301
|
+
self._save_errors()
|
|
302
|
+
self.logger.info(f"Cleared all {count} error records")
|
|
303
|
+
else:
|
|
304
|
+
# Clear errors for specific hook type
|
|
305
|
+
keys_to_remove = [
|
|
306
|
+
key
|
|
307
|
+
for key, data in self.errors.items()
|
|
308
|
+
if data["hook_type"] == hook_type
|
|
309
|
+
]
|
|
310
|
+
for key in keys_to_remove:
|
|
311
|
+
del self.errors[key]
|
|
312
|
+
self._save_errors()
|
|
313
|
+
self.logger.info(
|
|
314
|
+
f"Cleared {len(keys_to_remove)} error records for {hook_type}"
|
|
315
|
+
)
|
|
316
|
+
|
|
317
|
+
def get_error_summary(self) -> Dict[str, Any]:
|
|
318
|
+
"""Get summary of all recorded errors.
|
|
319
|
+
|
|
320
|
+
Returns:
|
|
321
|
+
Dictionary with error statistics and details
|
|
322
|
+
"""
|
|
323
|
+
if not self.errors:
|
|
324
|
+
return {
|
|
325
|
+
"total_errors": 0,
|
|
326
|
+
"unique_errors": 0,
|
|
327
|
+
"errors_by_type": {},
|
|
328
|
+
"errors_by_hook": {},
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
errors_by_type = {}
|
|
332
|
+
errors_by_hook = {}
|
|
333
|
+
|
|
334
|
+
total_count = 0
|
|
335
|
+
|
|
336
|
+
for error_data in self.errors.values():
|
|
337
|
+
error_type = error_data["type"]
|
|
338
|
+
hook_type = error_data["hook_type"]
|
|
339
|
+
count = error_data["count"]
|
|
340
|
+
|
|
341
|
+
total_count += count
|
|
342
|
+
|
|
343
|
+
errors_by_type[error_type] = errors_by_type.get(error_type, 0) + count
|
|
344
|
+
errors_by_hook[hook_type] = errors_by_hook.get(hook_type, 0) + count
|
|
345
|
+
|
|
346
|
+
return {
|
|
347
|
+
"total_errors": total_count,
|
|
348
|
+
"unique_errors": len(self.errors),
|
|
349
|
+
"errors_by_type": errors_by_type,
|
|
350
|
+
"errors_by_hook": errors_by_hook,
|
|
351
|
+
"memory_file": str(self.memory_file),
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
|
|
355
|
+
# Global instance
|
|
356
|
+
_hook_error_memory: Optional[HookErrorMemory] = None
|
|
357
|
+
|
|
358
|
+
|
|
359
|
+
def get_hook_error_memory(memory_file: Optional[Path] = None) -> HookErrorMemory:
|
|
360
|
+
"""Get the global hook error memory instance.
|
|
361
|
+
|
|
362
|
+
Args:
|
|
363
|
+
memory_file: Optional custom memory file path
|
|
364
|
+
|
|
365
|
+
Returns:
|
|
366
|
+
HookErrorMemory instance
|
|
367
|
+
"""
|
|
368
|
+
global _hook_error_memory
|
|
369
|
+
if _hook_error_memory is None:
|
|
370
|
+
_hook_error_memory = HookErrorMemory(memory_file)
|
|
371
|
+
return _hook_error_memory
|
|
372
|
+
|
|
373
|
+
|
|
374
|
+
def clear_hook_errors(hook_type: Optional[str] = None):
|
|
375
|
+
"""Convenience function to clear hook error memory.
|
|
376
|
+
|
|
377
|
+
Args:
|
|
378
|
+
hook_type: If specified, only clear errors for this hook type
|
|
379
|
+
"""
|
|
380
|
+
memory = get_hook_error_memory()
|
|
381
|
+
memory.clear_errors(hook_type)
|
claude_mpm/core/hook_manager.py
CHANGED
|
@@ -19,10 +19,11 @@ import queue
|
|
|
19
19
|
import subprocess
|
|
20
20
|
import threading
|
|
21
21
|
import uuid
|
|
22
|
-
from datetime import datetime
|
|
22
|
+
from datetime import datetime, timezone
|
|
23
23
|
from typing import Any, Dict, Optional
|
|
24
24
|
|
|
25
25
|
from ..core.logger import get_logger
|
|
26
|
+
from .hook_error_memory import get_hook_error_memory
|
|
26
27
|
from .hook_performance_config import get_hook_performance_config
|
|
27
28
|
from .unified_paths import get_package_root
|
|
28
29
|
|
|
@@ -42,6 +43,9 @@ class HookManager:
|
|
|
42
43
|
self.session_id = self._get_or_create_session_id()
|
|
43
44
|
self.hook_handler_path = self._find_hook_handler()
|
|
44
45
|
|
|
46
|
+
# Initialize error memory for tracking and preventing repeated errors
|
|
47
|
+
self.error_memory = get_hook_error_memory()
|
|
48
|
+
|
|
45
49
|
# Initialize background hook processing for async execution
|
|
46
50
|
self.performance_config = get_hook_performance_config()
|
|
47
51
|
queue_config = self.performance_config.get_queue_config()
|
|
@@ -97,16 +101,38 @@ class HookManager:
|
|
|
97
101
|
self.logger.debug("Started background hook processor thread")
|
|
98
102
|
|
|
99
103
|
def _execute_hook_sync(self, hook_data: Dict[str, Any]):
|
|
100
|
-
"""Execute a single hook synchronously in the background thread.
|
|
104
|
+
"""Execute a single hook synchronously in the background thread with error detection.
|
|
105
|
+
|
|
106
|
+
WHY error detection:
|
|
107
|
+
- Prevents repeated execution of failing hooks
|
|
108
|
+
- Provides actionable error messages to users
|
|
109
|
+
- Learns from failures to improve system reliability
|
|
110
|
+
- Reduces log noise from repeated errors
|
|
111
|
+
"""
|
|
101
112
|
try:
|
|
102
113
|
hook_type = hook_data["hook_type"]
|
|
103
114
|
event_data = hook_data["event_data"]
|
|
104
115
|
|
|
116
|
+
# Check if this hook is known to fail repeatedly
|
|
117
|
+
if self.error_memory.should_skip_hook(hook_type):
|
|
118
|
+
known_error = self.error_memory.is_known_failing_hook(hook_type)
|
|
119
|
+
if known_error:
|
|
120
|
+
# Log warning but don't spam - only on first skip
|
|
121
|
+
if known_error["count"] == 2: # First time we're skipping
|
|
122
|
+
self.logger.warning(
|
|
123
|
+
f"⚠️ Skipping {hook_type} hook - failed {known_error['count']} times previously\n"
|
|
124
|
+
f"Error: {known_error['match']}\n"
|
|
125
|
+
f"To retry: rm {self.error_memory.memory_file}"
|
|
126
|
+
)
|
|
127
|
+
return
|
|
128
|
+
|
|
105
129
|
# Create the hook event
|
|
106
130
|
hook_event = {
|
|
107
131
|
"hook_event_name": hook_type,
|
|
108
132
|
"session_id": self.session_id,
|
|
109
|
-
"timestamp": hook_data.get(
|
|
133
|
+
"timestamp": hook_data.get(
|
|
134
|
+
"timestamp", datetime.now(timezone.utc).isoformat()
|
|
135
|
+
),
|
|
110
136
|
**event_data,
|
|
111
137
|
}
|
|
112
138
|
|
|
@@ -125,7 +151,22 @@ class HookManager:
|
|
|
125
151
|
check=False,
|
|
126
152
|
)
|
|
127
153
|
|
|
128
|
-
|
|
154
|
+
# Detect errors in the output
|
|
155
|
+
error_info = self.error_memory.detect_error(
|
|
156
|
+
result.stdout or "", result.stderr or "", result.returncode
|
|
157
|
+
)
|
|
158
|
+
|
|
159
|
+
if error_info:
|
|
160
|
+
# Record the error
|
|
161
|
+
self.error_memory.record_error(error_info, hook_type)
|
|
162
|
+
|
|
163
|
+
# Get fix suggestion
|
|
164
|
+
suggestion = self.error_memory.suggest_fix(error_info)
|
|
165
|
+
|
|
166
|
+
# Log error with suggestion
|
|
167
|
+
self.logger.warning(f"Hook {hook_type} error detected:\n{suggestion}")
|
|
168
|
+
elif result.returncode != 0:
|
|
169
|
+
# Non-zero return without detected pattern
|
|
129
170
|
self.logger.debug(f"Hook {hook_type} returned code {result.returncode}")
|
|
130
171
|
if result.stderr:
|
|
131
172
|
self.logger.debug(f"Hook stderr: {result.stderr}")
|
|
@@ -182,7 +223,7 @@ class HookManager:
|
|
|
182
223
|
{
|
|
183
224
|
"tool_name": tool_name,
|
|
184
225
|
"tool_args": tool_args or {},
|
|
185
|
-
"timestamp": datetime.
|
|
226
|
+
"timestamp": datetime.now(timezone.utc).isoformat(),
|
|
186
227
|
},
|
|
187
228
|
)
|
|
188
229
|
|
|
@@ -205,7 +246,7 @@ class HookManager:
|
|
|
205
246
|
"tool_name": tool_name,
|
|
206
247
|
"exit_code": exit_code,
|
|
207
248
|
"result": str(result) if result is not None else None,
|
|
208
|
-
"timestamp": datetime.
|
|
249
|
+
"timestamp": datetime.now(timezone.utc).isoformat(),
|
|
209
250
|
},
|
|
210
251
|
)
|
|
211
252
|
|
|
@@ -220,7 +261,7 @@ class HookManager:
|
|
|
220
261
|
"""
|
|
221
262
|
return self._trigger_hook_event(
|
|
222
263
|
"UserPromptSubmit",
|
|
223
|
-
{"prompt": prompt, "timestamp": datetime.
|
|
264
|
+
{"prompt": prompt, "timestamp": datetime.now(timezone.utc).isoformat()},
|
|
224
265
|
)
|
|
225
266
|
|
|
226
267
|
def _trigger_hook_event(self, hook_type: str, event_data: Dict[str, Any]) -> bool:
|
|
@@ -250,7 +291,7 @@ class HookManager:
|
|
|
250
291
|
hook_data = {
|
|
251
292
|
"hook_type": hook_type,
|
|
252
293
|
"event_data": event_data,
|
|
253
|
-
"timestamp": datetime.
|
|
294
|
+
"timestamp": datetime.now(timezone.utc).isoformat(),
|
|
254
295
|
}
|
|
255
296
|
|
|
256
297
|
# Try to queue without blocking
|
|
@@ -182,14 +182,17 @@ class InjectableService(BaseService, ABC):
|
|
|
182
182
|
continue
|
|
183
183
|
|
|
184
184
|
attr = getattr(self, attr_name, None)
|
|
185
|
-
if
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
185
|
+
if (
|
|
186
|
+
attr
|
|
187
|
+
and hasattr(attr, "start")
|
|
188
|
+
and hasattr(attr, "running")
|
|
189
|
+
and not attr.running
|
|
190
|
+
):
|
|
191
|
+
try:
|
|
192
|
+
await attr.start()
|
|
193
|
+
logger.debug(f"Started dependency {attr_name}")
|
|
194
|
+
except Exception as e:
|
|
195
|
+
logger.warning(f"Failed to start dependency {attr_name}: {e}")
|
|
193
196
|
|
|
194
197
|
def __repr__(self) -> str:
|
|
195
198
|
"""Enhanced string representation showing dependencies."""
|
|
@@ -18,9 +18,10 @@ The hook works by:
|
|
|
18
18
|
"""
|
|
19
19
|
|
|
20
20
|
import threading
|
|
21
|
-
from datetime import datetime
|
|
21
|
+
from datetime import datetime, timezone
|
|
22
22
|
from typing import Any, Dict, List, Optional
|
|
23
23
|
|
|
24
|
+
from ..core.enums import OperationResult
|
|
24
25
|
from ..core.logger import get_logger
|
|
25
26
|
|
|
26
27
|
|
|
@@ -158,7 +159,7 @@ class InstructionReinforcementHook:
|
|
|
158
159
|
# Create reminder todo
|
|
159
160
|
reminder_todo = {
|
|
160
161
|
"content": message,
|
|
161
|
-
"status":
|
|
162
|
+
"status": OperationResult.PENDING,
|
|
162
163
|
"activeForm": "Processing instruction reminder",
|
|
163
164
|
}
|
|
164
165
|
|
|
@@ -197,7 +198,7 @@ class InstructionReinforcementHook:
|
|
|
197
198
|
"enabled": self.enabled,
|
|
198
199
|
"test_mode": self.test_mode,
|
|
199
200
|
"injection_interval": self.injection_interval,
|
|
200
|
-
"timestamp": datetime.
|
|
201
|
+
"timestamp": datetime.now(timezone.utc).isoformat(),
|
|
201
202
|
}
|
|
202
203
|
|
|
203
204
|
def reset_counters(self):
|