claude-mpm 3.4.10__py3-none-any.whl → 5.4.85__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- claude_mpm/BUILD_NUMBER +1 -0
- claude_mpm/VERSION +1 -0
- claude_mpm/__init__.py +50 -12
- claude_mpm/__main__.py +7 -2
- claude_mpm/agents/BASE_AGENT.md +164 -0
- claude_mpm/agents/BASE_ENGINEER.md +658 -0
- claude_mpm/agents/CLAUDE_MPM_FOUNDERS_OUTPUT_STYLE.md +405 -0
- claude_mpm/agents/CLAUDE_MPM_OUTPUT_STYLE.md +112 -0
- claude_mpm/agents/CLAUDE_MPM_TEACHER_OUTPUT_STYLE.md +186 -0
- claude_mpm/agents/MEMORY.md +72 -0
- claude_mpm/agents/PM_INSTRUCTIONS.md +1429 -0
- claude_mpm/agents/WORKFLOW.md +111 -0
- claude_mpm/agents/__init__.py +92 -80
- claude_mpm/agents/agent-template.yaml +83 -0
- claude_mpm/agents/agent_loader.py +560 -745
- claude_mpm/agents/agent_loader_integration.py +53 -55
- claude_mpm/agents/agents_metadata.py +186 -27
- claude_mpm/agents/async_agent_loader.py +436 -0
- claude_mpm/agents/base_agent.json +8 -4
- claude_mpm/agents/frontmatter_validator.py +754 -0
- claude_mpm/agents/system_agent_config.py +222 -155
- claude_mpm/agents/templates/README.md +465 -0
- claude_mpm/agents/templates/__init__.py +17 -13
- claude_mpm/agents/templates/circuit-breakers.md +1391 -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 +94 -128
- claude_mpm/cli/__main__.py +33 -0
- claude_mpm/cli/chrome_devtools_installer.py +175 -0
- claude_mpm/cli/commands/__init__.py +36 -12
- claude_mpm/cli/commands/agent_manager.py +1403 -0
- claude_mpm/cli/commands/agent_source.py +774 -0
- claude_mpm/cli/commands/agent_state_manager.py +335 -0
- claude_mpm/cli/commands/agents.py +2501 -168
- claude_mpm/cli/commands/agents_cleanup.py +210 -0
- claude_mpm/cli/commands/agents_discover.py +338 -0
- claude_mpm/cli/commands/agents_reconcile.py +197 -0
- claude_mpm/cli/commands/aggregate.py +540 -0
- claude_mpm/cli/commands/analyze.py +553 -0
- claude_mpm/cli/commands/analyze_code.py +528 -0
- claude_mpm/cli/commands/auto_configure.py +1053 -0
- claude_mpm/cli/commands/cleanup.py +588 -0
- claude_mpm/cli/commands/cleanup_orphaned_agents.py +150 -0
- claude_mpm/cli/commands/config.py +586 -0
- claude_mpm/cli/commands/configure.py +3253 -0
- claude_mpm/cli/commands/configure_agent_display.py +282 -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 +286 -0
- claude_mpm/cli/commands/debug.py +1386 -0
- claude_mpm/cli/commands/doctor.py +243 -0
- claude_mpm/cli/commands/hook_errors.py +277 -0
- claude_mpm/cli/commands/info.py +195 -74
- claude_mpm/cli/commands/local_deploy.py +534 -0
- claude_mpm/cli/commands/mcp.py +205 -0
- claude_mpm/cli/commands/mcp_command_router.py +161 -0
- claude_mpm/cli/commands/mcp_config.py +154 -0
- claude_mpm/cli/commands/mcp_config_commands.py +20 -0
- claude_mpm/cli/commands/mcp_external_commands.py +249 -0
- claude_mpm/cli/commands/mcp_install_commands.py +346 -0
- claude_mpm/cli/commands/mcp_pipx_config.py +208 -0
- claude_mpm/cli/commands/mcp_server_commands.py +155 -0
- claude_mpm/cli/commands/mcp_setup_external.py +868 -0
- claude_mpm/cli/commands/mcp_tool_commands.py +34 -0
- claude_mpm/cli/commands/memory.py +585 -846
- claude_mpm/cli/commands/monitor.py +228 -310
- claude_mpm/cli/commands/mpm_init/__init__.py +73 -0
- claude_mpm/cli/commands/mpm_init/core.py +759 -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/knowledge_extractor.py +481 -0
- claude_mpm/cli/commands/mpm_init/modes.py +397 -0
- claude_mpm/cli/commands/mpm_init/prompts.py +722 -0
- claude_mpm/cli/commands/mpm_init_cli.py +396 -0
- claude_mpm/cli/commands/mpm_init_handler.py +195 -0
- claude_mpm/cli/commands/postmortem.py +401 -0
- claude_mpm/cli/commands/profile.py +276 -0
- claude_mpm/cli/commands/run.py +910 -488
- claude_mpm/cli/commands/search.py +458 -0
- claude_mpm/cli/commands/skill_source.py +694 -0
- claude_mpm/cli/commands/skills.py +1398 -0
- claude_mpm/cli/commands/summarize.py +413 -0
- claude_mpm/cli/commands/tickets.py +536 -53
- 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 +298 -0
- claude_mpm/cli/helpers.py +105 -0
- claude_mpm/cli/interactive/__init__.py +31 -0
- claude_mpm/cli/interactive/agent_wizard.py +1927 -0
- claude_mpm/cli/interactive/questionary_styles.py +65 -0
- claude_mpm/cli/interactive/skill_selector.py +481 -0
- claude_mpm/cli/interactive/skills_wizard.py +491 -0
- claude_mpm/cli/parser.py +87 -563
- claude_mpm/cli/parsers/__init__.py +35 -0
- claude_mpm/cli/parsers/agent_manager_parser.py +393 -0
- claude_mpm/cli/parsers/agent_source_parser.py +171 -0
- claude_mpm/cli/parsers/agents_parser.py +575 -0
- claude_mpm/cli/parsers/analyze_code_parser.py +170 -0
- claude_mpm/cli/parsers/analyze_parser.py +135 -0
- claude_mpm/cli/parsers/auto_configure_parser.py +120 -0
- claude_mpm/cli/parsers/base_parser.py +649 -0
- claude_mpm/cli/parsers/config_parser.py +208 -0
- claude_mpm/cli/parsers/configure_parser.py +138 -0
- claude_mpm/cli/parsers/dashboard_parser.py +113 -0
- claude_mpm/cli/parsers/debug_parser.py +319 -0
- claude_mpm/cli/parsers/local_deploy_parser.py +227 -0
- claude_mpm/cli/parsers/mcp_parser.py +195 -0
- claude_mpm/cli/parsers/memory_parser.py +138 -0
- claude_mpm/cli/parsers/monitor_parser.py +142 -0
- claude_mpm/cli/parsers/mpm_init_parser.py +311 -0
- claude_mpm/cli/parsers/profile_parser.py +147 -0
- claude_mpm/cli/parsers/run_parser.py +157 -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 +277 -0
- claude_mpm/cli/parsers/source_parser.py +138 -0
- claude_mpm/cli/parsers/tickets_parser.py +203 -0
- claude_mpm/cli/shared/__init__.py +40 -0
- claude_mpm/cli/shared/argument_patterns.py +205 -0
- claude_mpm/cli/shared/base_command.py +242 -0
- claude_mpm/cli/shared/error_handling.py +242 -0
- claude_mpm/cli/shared/output_formatters.py +241 -0
- claude_mpm/cli/startup.py +1578 -0
- claude_mpm/cli/startup_display.py +480 -0
- claude_mpm/cli/startup_logging.py +839 -0
- claude_mpm/cli/utils.py +136 -47
- 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 +42 -64
- claude_mpm/commands/__init__.py +14 -0
- claude_mpm/commands/mpm-config.md +28 -0
- claude_mpm/commands/mpm-doctor.md +20 -0
- claude_mpm/commands/mpm-help.md +20 -0
- claude_mpm/commands/mpm-init.md +120 -0
- claude_mpm/commands/mpm-monitor.md +31 -0
- claude_mpm/commands/mpm-organize.md +120 -0
- claude_mpm/commands/mpm-postmortem.md +21 -0
- claude_mpm/commands/mpm-session-resume.md +30 -0
- claude_mpm/commands/mpm-status.md +20 -0
- claude_mpm/commands/mpm-ticket-view.md +109 -0
- claude_mpm/commands/mpm-version.md +20 -0
- claude_mpm/commands/mpm.md +31 -0
- claude_mpm/config/__init__.py +42 -2
- claude_mpm/config/agent_config.py +402 -0
- claude_mpm/config/agent_presets.py +488 -0
- claude_mpm/config/agent_sources.py +352 -0
- claude_mpm/config/experimental_features.py +217 -0
- claude_mpm/config/model_config.py +428 -0
- claude_mpm/config/paths.py +258 -0
- claude_mpm/config/skill_presets.py +392 -0
- claude_mpm/config/skill_sources.py +590 -0
- claude_mpm/config/socketio_config.py +125 -83
- claude_mpm/constants.py +133 -22
- claude_mpm/core/__init__.py +62 -36
- claude_mpm/core/agent_name_normalizer.py +71 -73
- claude_mpm/core/agent_registry.py +385 -492
- claude_mpm/core/agent_session_manager.py +81 -70
- claude_mpm/core/api_validator.py +330 -0
- claude_mpm/core/base_service.py +159 -122
- claude_mpm/core/cache.py +560 -0
- claude_mpm/core/claude_runner.py +696 -916
- claude_mpm/core/config.py +613 -122
- claude_mpm/core/config_aliases.py +74 -73
- claude_mpm/core/config_constants.py +314 -0
- claude_mpm/core/constants.py +361 -0
- claude_mpm/core/container.py +646 -104
- claude_mpm/core/enums.py +452 -0
- claude_mpm/core/error_handler.py +623 -0
- claude_mpm/core/exceptions.py +536 -0
- claude_mpm/core/factories.py +105 -109
- 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 +278 -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 +213 -0
- claude_mpm/core/framework/loaders/file_loader.py +176 -0
- claude_mpm/core/framework/loaders/instruction_loader.py +222 -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 +485 -414
- claude_mpm/core/hook_error_memory.py +381 -0
- claude_mpm/core/hook_manager.py +246 -86
- claude_mpm/core/hook_performance_config.py +147 -0
- claude_mpm/core/injectable_service.py +72 -63
- claude_mpm/core/instruction_reinforcement_hook.py +267 -0
- claude_mpm/core/interactive_session.py +670 -0
- claude_mpm/core/interfaces.py +570 -164
- claude_mpm/core/lazy.py +467 -0
- claude_mpm/core/log_manager.py +707 -0
- claude_mpm/core/logger.py +295 -134
- claude_mpm/core/logging_config.py +474 -0
- claude_mpm/core/logging_utils.py +520 -0
- claude_mpm/core/minimal_framework_loader.py +24 -22
- claude_mpm/core/mixins.py +30 -29
- claude_mpm/core/oneshot_session.py +594 -0
- claude_mpm/core/optimized_agent_loader.py +479 -0
- claude_mpm/core/optimized_startup.py +554 -0
- claude_mpm/core/output_style_manager.py +491 -0
- claude_mpm/core/pm_hook_interceptor.py +197 -82
- 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 +153 -116
- claude_mpm/core/session_manager.py +179 -64
- claude_mpm/core/shared/__init__.py +17 -0
- claude_mpm/core/shared/config_loader.py +326 -0
- claude_mpm/core/shared/path_resolver.py +281 -0
- claude_mpm/core/shared/singleton_manager.py +221 -0
- claude_mpm/core/socketio_pool.py +400 -137
- claude_mpm/core/system_context.py +38 -0
- claude_mpm/core/tool_access_control.py +64 -57
- claude_mpm/core/types.py +307 -0
- claude_mpm/core/typing_utils.py +553 -0
- claude_mpm/core/unified_agent_registry.py +969 -0
- claude_mpm/core/unified_config.py +612 -0
- claude_mpm/core/unified_paths.py +958 -0
- claude_mpm/dashboard/__init__.py +12 -0
- claude_mpm/dashboard/api/simple_directory.py +261 -0
- claude_mpm/dashboard/static/svelte-build/_app/env.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/0.DWzvg0-y.css +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/2.ThTw9_ym.css +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/4TdZjIqw.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/5shd3_w0.js +24 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/B0uc0UOD.js +36 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/B7RN905-.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/B7xVLGWV.js +2 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BIF9m_hv.js +61 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BKjSRqUr.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BPYeabCQ.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BQaXIfA_.js +331 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BSNlmTZj.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Be7GpZd6.js +7 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Bh0LDWpI.js +145 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BofRWZRR.js +10 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BovzEFCE.js +30 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/C30mlcqg.js +165 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/C4B-KCzX.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/C4JcI4KD.js +122 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CBBdVcY8.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CDuw-vjf.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/C_Usid8X.js +15 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Cfqx1Qun.js +10 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CiIAseT4.js +128 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CmKTTxBW.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CnA0NrzZ.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Cs_tUR18.js +24 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Cu_Erd72.js +261 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CyWMqx4W.js +43 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CzZX-COe.js +220 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CzeYkLYB.js +65 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/D3k0OPJN.js +4 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/D9lljYKQ.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DGkLK5U1.js +267 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DI7hHRFL.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DLVjFsZ3.js +139 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DUrLdbGD.js +89 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DVp1hx9R.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DY1XQ8fi.js +2 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DZX00Y4g.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Da0KfYnO.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DaimHw_p.js +68 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Dfy6j1xT.js +323 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Dhb8PKl3.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Dle-35c7.js +64 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DmxopI1J.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DwBR2MJi.js +60 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/GYwsonyD.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Gi6I4Gst.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/NqQ1dWOy.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/RJiighC3.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Vzk33B_K.js +2 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/ZGh7QtNv.js +7 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/bT1r9zLR.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/bTOqqlTd.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/eNVUfhuA.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/iEWssX7S.js +162 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/sQeU3Y1z.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/uuIeMWc-.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/entry/app.D6-I5TpK.js +2 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/entry/start.NWzMBYRp.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/0.m1gL8KXf.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/1.CgNOuw-d.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/2.C0GcWctS.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/version.json +1 -0
- claude_mpm/dashboard/static/svelte-build/favicon.svg +7 -0
- claude_mpm/dashboard/static/svelte-build/index.html +36 -0
- claude_mpm/dashboard-svelte/node_modules/katex/src/fonts/generate_fonts.py +58 -0
- claude_mpm/dashboard-svelte/node_modules/katex/src/metrics/extract_tfms.py +114 -0
- claude_mpm/dashboard-svelte/node_modules/katex/src/metrics/extract_ttfs.py +122 -0
- claude_mpm/dashboard-svelte/node_modules/katex/src/metrics/format_json.py +28 -0
- claude_mpm/dashboard-svelte/node_modules/katex/src/metrics/parse_tfm.py +211 -0
- claude_mpm/experimental/__init__.py +10 -0
- claude_mpm/experimental/cli_enhancements.py +104 -89
- claude_mpm/generators/__init__.py +1 -1
- claude_mpm/generators/agent_profile_generator.py +76 -66
- claude_mpm/hooks/__init__.py +37 -1
- claude_mpm/hooks/base_hook.py +37 -32
- claude_mpm/hooks/claude_hooks/__init__.py +1 -1
- claude_mpm/hooks/claude_hooks/connection_pool.py +250 -0
- claude_mpm/hooks/claude_hooks/correlation_manager.py +60 -0
- claude_mpm/hooks/claude_hooks/event_handlers.py +888 -0
- claude_mpm/hooks/claude_hooks/hook_handler.py +652 -875
- claude_mpm/hooks/claude_hooks/hook_wrapper.sh +10 -7
- claude_mpm/hooks/claude_hooks/installer.py +806 -0
- claude_mpm/hooks/claude_hooks/memory_integration.py +249 -0
- claude_mpm/hooks/claude_hooks/response_tracking.py +412 -0
- claude_mpm/hooks/claude_hooks/services/__init__.py +15 -0
- claude_mpm/hooks/claude_hooks/services/connection_manager.py +229 -0
- claude_mpm/hooks/claude_hooks/services/connection_manager_http.py +254 -0
- claude_mpm/hooks/claude_hooks/services/duplicate_detector.py +106 -0
- claude_mpm/hooks/claude_hooks/services/state_manager.py +284 -0
- claude_mpm/hooks/claude_hooks/services/subagent_processor.py +374 -0
- claude_mpm/hooks/claude_hooks/tool_analysis.py +224 -0
- 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 +201 -107
- 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 +92 -76
- claude_mpm/hooks/validation_hooks.py +62 -54
- claude_mpm/init.py +518 -83
- claude_mpm/models/__init__.py +9 -9
- claude_mpm/models/agent_definition.py +40 -23
- claude_mpm/models/agent_session.py +538 -0
- claude_mpm/models/git_repository.py +198 -0
- claude_mpm/models/resume_log.py +340 -0
- claude_mpm/schemas/__init__.py +12 -0
- claude_mpm/scripts/__init__.py +15 -0
- claude_mpm/scripts/claude-hook-handler.sh +227 -0
- claude_mpm/scripts/launch_monitor.py +165 -0
- claude_mpm/scripts/mpm_doctor.py +322 -0
- claude_mpm/scripts/socketio_daemon.py +189 -200
- claude_mpm/scripts/start_activity_logging.py +91 -0
- claude_mpm/services/__init__.py +208 -39
- claude_mpm/services/agent_capabilities_service.py +266 -0
- claude_mpm/services/agents/__init__.py +89 -0
- claude_mpm/services/agents/agent_builder.py +514 -0
- claude_mpm/services/agents/agent_preset_service.py +238 -0
- claude_mpm/services/agents/agent_recommendation_service.py +278 -0
- claude_mpm/services/agents/agent_review_service.py +280 -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/__init__.py +21 -0
- claude_mpm/services/agents/deployment/agent_config_provider.py +410 -0
- claude_mpm/services/agents/deployment/agent_configuration_manager.py +358 -0
- claude_mpm/services/agents/deployment/agent_definition_factory.py +80 -0
- claude_mpm/services/agents/deployment/agent_deployment.py +1037 -0
- claude_mpm/services/agents/deployment/agent_discovery_service.py +546 -0
- claude_mpm/services/agents/deployment/agent_environment_manager.py +288 -0
- claude_mpm/services/agents/deployment/agent_filesystem_manager.py +383 -0
- claude_mpm/services/agents/deployment/agent_format_converter.py +505 -0
- claude_mpm/services/agents/deployment/agent_frontmatter_validator.py +160 -0
- claude_mpm/services/agents/deployment/agent_lifecycle_manager.py +957 -0
- claude_mpm/services/agents/deployment/agent_metrics_collector.py +273 -0
- claude_mpm/services/agents/deployment/agent_operation_service.py +573 -0
- claude_mpm/services/agents/deployment/agent_record_service.py +418 -0
- claude_mpm/services/agents/deployment/agent_restore_handler.py +84 -0
- claude_mpm/services/agents/deployment/agent_state_service.py +381 -0
- claude_mpm/services/agents/deployment/agent_template_builder.py +1377 -0
- claude_mpm/services/agents/deployment/agent_validator.py +376 -0
- claude_mpm/services/agents/deployment/agent_version_manager.py +322 -0
- claude_mpm/services/{agent_versioning.py → agents/deployment/agent_versioning.py} +10 -13
- claude_mpm/services/agents/deployment/agents_directory_resolver.py +149 -0
- claude_mpm/services/agents/deployment/async_agent_deployment.py +768 -0
- claude_mpm/services/agents/deployment/base_agent_locator.py +132 -0
- claude_mpm/services/agents/deployment/config/__init__.py +13 -0
- claude_mpm/services/agents/deployment/config/deployment_config.py +181 -0
- claude_mpm/services/agents/deployment/config/deployment_config_manager.py +200 -0
- claude_mpm/services/agents/deployment/deployment_config_loader.py +178 -0
- claude_mpm/services/agents/deployment/deployment_reconciler.py +577 -0
- claude_mpm/services/agents/deployment/deployment_results_manager.py +185 -0
- claude_mpm/services/agents/deployment/deployment_type_detector.py +120 -0
- claude_mpm/services/agents/deployment/deployment_wrapper.py +129 -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 +70 -0
- claude_mpm/services/agents/deployment/facade/deployment_facade.py +269 -0
- claude_mpm/services/agents/deployment/facade/sync_deployment_executor.py +178 -0
- claude_mpm/services/agents/deployment/interface_adapter.py +226 -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/local_template_deployment.py +362 -0
- claude_mpm/services/agents/deployment/multi_source_deployment_service.py +1478 -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 +162 -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 +240 -0
- claude_mpm/services/agents/deployment/pipeline/steps/base_step.py +110 -0
- claude_mpm/services/agents/deployment/pipeline/steps/configuration_step.py +80 -0
- claude_mpm/services/agents/deployment/pipeline/steps/target_directory_step.py +92 -0
- claude_mpm/services/agents/deployment/pipeline/steps/validation_step.py +101 -0
- claude_mpm/services/agents/deployment/processors/__init__.py +15 -0
- claude_mpm/services/agents/deployment/processors/agent_deployment_context.py +102 -0
- claude_mpm/services/agents/deployment/processors/agent_deployment_result.py +235 -0
- claude_mpm/services/agents/deployment/processors/agent_processor.py +269 -0
- claude_mpm/services/agents/deployment/refactored_agent_deployment_service.py +311 -0
- claude_mpm/services/agents/deployment/remote_agent_discovery_service.py +862 -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/single_agent_deployer.py +315 -0
- claude_mpm/services/agents/deployment/startup_reconciliation.py +138 -0
- claude_mpm/services/agents/deployment/strategies/__init__.py +25 -0
- claude_mpm/services/agents/deployment/strategies/base_strategy.py +113 -0
- claude_mpm/services/agents/deployment/strategies/project_strategy.py +148 -0
- claude_mpm/services/agents/deployment/strategies/strategy_selector.py +117 -0
- claude_mpm/services/agents/deployment/strategies/system_strategy.py +131 -0
- claude_mpm/services/agents/deployment/strategies/user_strategy.py +130 -0
- claude_mpm/services/agents/deployment/system_instructions_deployer.py +228 -0
- claude_mpm/services/agents/deployment/validation/__init__.py +21 -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 +319 -0
- claude_mpm/services/agents/deployment/validation/validation_result.py +214 -0
- claude_mpm/services/agents/git_source_manager.py +682 -0
- claude_mpm/services/agents/loading/__init__.py +11 -0
- claude_mpm/services/{agent_profile_loader.py → agents/loading/agent_profile_loader.py} +306 -228
- claude_mpm/services/{base_agent_manager.py → agents/loading/base_agent_manager.py} +106 -91
- claude_mpm/services/agents/loading/framework_agent_loader.py +433 -0
- claude_mpm/services/agents/local_template_manager.py +784 -0
- claude_mpm/services/agents/management/__init__.py +9 -0
- claude_mpm/services/{agent_capabilities_generator.py → agents/management/agent_capabilities_generator.py} +92 -69
- claude_mpm/services/{agent_management_service.py → agents/management/agent_management_service.py} +219 -168
- claude_mpm/services/agents/memory/__init__.py +22 -0
- claude_mpm/services/agents/memory/agent_memory_manager.py +784 -0
- claude_mpm/services/{agent_persistence_service.py → agents/memory/agent_persistence_service.py} +20 -18
- claude_mpm/services/agents/memory/content_manager.py +470 -0
- claude_mpm/services/agents/memory/memory_categorization_service.py +167 -0
- claude_mpm/services/agents/memory/memory_file_service.py +129 -0
- claude_mpm/services/agents/memory/memory_format_service.py +201 -0
- claude_mpm/services/agents/memory/memory_limits_service.py +101 -0
- claude_mpm/services/agents/memory/template_generator.py +83 -0
- claude_mpm/services/agents/observers.py +547 -0
- claude_mpm/services/agents/recommender.py +617 -0
- claude_mpm/services/agents/registry/__init__.py +30 -0
- claude_mpm/services/agents/registry/deployed_agent_discovery.py +273 -0
- claude_mpm/services/{agent_modification_tracker.py → agents/registry/modification_tracker.py} +370 -295
- 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 +1205 -0
- claude_mpm/services/agents/startup_sync.py +262 -0
- claude_mpm/services/agents/toolchain_detector.py +478 -0
- claude_mpm/services/analysis/__init__.py +35 -0
- claude_mpm/services/analysis/clone_detector.py +1030 -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 +665 -0
- claude_mpm/services/claude_session_logger.py +321 -0
- claude_mpm/services/cli/__init__.py +18 -0
- claude_mpm/services/cli/agent_cleanup_service.py +408 -0
- claude_mpm/services/cli/agent_dependency_service.py +395 -0
- claude_mpm/services/cli/agent_listing_service.py +463 -0
- claude_mpm/services/cli/agent_output_formatter.py +605 -0
- claude_mpm/services/cli/agent_validation_service.py +590 -0
- claude_mpm/services/cli/memory_crud_service.py +622 -0
- claude_mpm/services/cli/memory_output_formatter.py +604 -0
- claude_mpm/services/cli/resume_service.py +617 -0
- claude_mpm/services/cli/session_manager.py +604 -0
- 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 +362 -0
- claude_mpm/services/cli/unified_dashboard_manager.py +439 -0
- claude_mpm/services/command_deployment_service.py +446 -0
- claude_mpm/services/command_handler_service.py +221 -0
- claude_mpm/services/communication/__init__.py +22 -0
- claude_mpm/services/core/__init__.py +108 -0
- claude_mpm/services/core/base.py +269 -0
- claude_mpm/services/core/cache_manager.py +309 -0
- claude_mpm/services/core/interfaces/__init__.py +273 -0
- claude_mpm/services/core/interfaces/agent.py +514 -0
- claude_mpm/services/core/interfaces/communication.py +316 -0
- claude_mpm/services/core/interfaces/health.py +169 -0
- claude_mpm/services/core/interfaces/infrastructure.py +357 -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/service.py +405 -0
- claude_mpm/services/core/interfaces/stability.py +260 -0
- claude_mpm/services/core/interfaces.py +81 -0
- claude_mpm/services/core/memory_manager.py +682 -0
- 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 +517 -0
- claude_mpm/services/core/service_container.py +520 -0
- claude_mpm/services/core/service_interfaces.py +436 -0
- claude_mpm/services/diagnostics/__init__.py +18 -0
- claude_mpm/services/diagnostics/checks/__init__.py +38 -0
- claude_mpm/services/diagnostics/checks/agent_check.py +370 -0
- claude_mpm/services/diagnostics/checks/agent_sources_check.py +577 -0
- claude_mpm/services/diagnostics/checks/base_check.py +60 -0
- claude_mpm/services/diagnostics/checks/claude_code_check.py +270 -0
- claude_mpm/services/diagnostics/checks/common_issues_check.py +363 -0
- claude_mpm/services/diagnostics/checks/configuration_check.py +306 -0
- claude_mpm/services/diagnostics/checks/filesystem_check.py +233 -0
- claude_mpm/services/diagnostics/checks/installation_check.py +520 -0
- claude_mpm/services/diagnostics/checks/instructions_check.py +415 -0
- claude_mpm/services/diagnostics/checks/mcp_check.py +330 -0
- claude_mpm/services/diagnostics/checks/mcp_services_check.py +1058 -0
- claude_mpm/services/diagnostics/checks/monitor_check.py +281 -0
- claude_mpm/services/diagnostics/checks/skill_sources_check.py +587 -0
- claude_mpm/services/diagnostics/checks/startup_log_check.py +319 -0
- claude_mpm/services/diagnostics/diagnostic_runner.py +286 -0
- claude_mpm/services/diagnostics/doctor_reporter.py +578 -0
- claude_mpm/services/diagnostics/models.py +138 -0
- claude_mpm/services/event_aggregator.py +582 -0
- claude_mpm/services/event_bus/__init__.py +18 -0
- claude_mpm/services/event_bus/config.py +186 -0
- claude_mpm/services/event_bus/direct_relay.py +312 -0
- claude_mpm/services/event_bus/event_bus.py +396 -0
- claude_mpm/services/event_bus/relay.py +326 -0
- claude_mpm/services/events/__init__.py +44 -0
- claude_mpm/services/events/consumers/__init__.py +18 -0
- claude_mpm/services/events/consumers/dead_letter.py +306 -0
- claude_mpm/services/events/consumers/logging.py +184 -0
- claude_mpm/services/events/consumers/metrics.py +241 -0
- claude_mpm/services/events/consumers/socketio.py +377 -0
- claude_mpm/services/events/core.py +480 -0
- claude_mpm/services/events/interfaces.py +214 -0
- claude_mpm/services/events/producers/__init__.py +14 -0
- claude_mpm/services/events/producers/hook.py +269 -0
- claude_mpm/services/events/producers/system.py +329 -0
- claude_mpm/services/exceptions.py +433 -353
- claude_mpm/services/framework_claude_md_generator/__init__.py +81 -80
- claude_mpm/services/framework_claude_md_generator/content_assembler.py +74 -67
- claude_mpm/services/framework_claude_md_generator/content_validator.py +66 -62
- claude_mpm/services/framework_claude_md_generator/deployment_manager.py +82 -60
- claude_mpm/services/framework_claude_md_generator/section_generators/__init__.py +36 -37
- claude_mpm/services/framework_claude_md_generator/section_generators/agents.py +41 -40
- claude_mpm/services/framework_claude_md_generator/section_generators/claude_pm_init.py +15 -15
- claude_mpm/services/framework_claude_md_generator/section_generators/core_responsibilities.py +5 -4
- 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 +5 -4
- 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 +26 -30
- claude_mpm/services/framework_claude_md_generator/section_generators/troubleshooting.py +6 -5
- claude_mpm/services/framework_claude_md_generator/section_manager.py +28 -27
- claude_mpm/services/framework_claude_md_generator/version_manager.py +31 -30
- claude_mpm/services/git/__init__.py +21 -0
- claude_mpm/services/git/git_operations_service.py +579 -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 +159 -111
- claude_mpm/services/infrastructure/__init__.py +52 -0
- claude_mpm/services/infrastructure/context_preservation.py +569 -0
- claude_mpm/services/infrastructure/daemon_manager.py +279 -0
- claude_mpm/services/infrastructure/logging.py +209 -0
- claude_mpm/services/infrastructure/monitoring/__init__.py +39 -0
- claude_mpm/services/infrastructure/monitoring/aggregator.py +432 -0
- claude_mpm/services/infrastructure/monitoring/base.py +122 -0
- claude_mpm/services/infrastructure/monitoring/legacy.py +203 -0
- claude_mpm/services/infrastructure/monitoring/network.py +219 -0
- claude_mpm/services/infrastructure/monitoring/process.py +343 -0
- claude_mpm/services/infrastructure/monitoring/resources.py +244 -0
- claude_mpm/services/infrastructure/monitoring/service.py +368 -0
- claude_mpm/services/infrastructure/monitoring.py +71 -0
- 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_service_verifier.py +732 -0
- claude_mpm/services/memory/__init__.py +19 -0
- claude_mpm/services/{memory_builder.py → memory/builder.py} +465 -373
- claude_mpm/services/memory/cache/__init__.py +14 -0
- claude_mpm/services/{shared_prompt_cache.py → memory/cache/shared_prompt_cache.py} +237 -200
- claude_mpm/services/memory/cache/simple_cache.py +331 -0
- claude_mpm/services/memory/failure_tracker.py +578 -0
- claude_mpm/services/memory/indexed_memory.py +648 -0
- claude_mpm/services/{memory_optimizer.py → memory/optimizer.py} +272 -243
- claude_mpm/services/memory/router.py +951 -0
- claude_mpm/services/memory_hook_service.py +470 -0
- 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 +698 -0
- claude_mpm/services/monitor/daemon_manager.py +1076 -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 +730 -0
- claude_mpm/services/monitor/server.py +1493 -0
- claude_mpm/services/monitor_build_service.py +349 -0
- claude_mpm/services/native_agent_converter.py +356 -0
- claude_mpm/services/orphan_detection.py +786 -0
- claude_mpm/services/pm_skills_deployer.py +711 -0
- claude_mpm/services/port_manager.py +597 -0
- claude_mpm/services/pr/__init__.py +14 -0
- claude_mpm/services/pr/pr_template_service.py +329 -0
- claude_mpm/services/profile_manager.py +337 -0
- claude_mpm/services/project/__init__.py +44 -0
- claude_mpm/services/{project_analyzer.py → project/analyzer.py} +541 -291
- claude_mpm/services/project/analyzer_v2.py +566 -0
- claude_mpm/services/project/architecture_analyzer.py +461 -0
- claude_mpm/services/project/archive_manager.py +1045 -0
- claude_mpm/services/project/dependency_analyzer.py +462 -0
- 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/language_analyzer.py +265 -0
- claude_mpm/services/project/metrics_collector.py +407 -0
- claude_mpm/services/project/project_organizer.py +1009 -0
- claude_mpm/services/project/registry.py +636 -0
- claude_mpm/services/project/toolchain_analyzer.py +583 -0
- claude_mpm/services/project_port_allocator.py +596 -0
- claude_mpm/services/recovery_manager.py +293 -240
- claude_mpm/services/response_tracker.py +267 -0
- claude_mpm/services/runner_configuration_service.py +605 -0
- claude_mpm/services/self_upgrade_service.py +608 -0
- claude_mpm/services/session_management_service.py +314 -0
- claude_mpm/services/session_manager.py +380 -0
- claude_mpm/services/shared/__init__.py +21 -0
- claude_mpm/services/shared/async_service_base.py +216 -0
- claude_mpm/services/shared/config_service_base.py +301 -0
- claude_mpm/services/shared/lifecycle_service_base.py +308 -0
- claude_mpm/services/shared/manager_base.py +315 -0
- claude_mpm/services/shared/service_factory.py +309 -0
- claude_mpm/services/skills/__init__.py +21 -0
- claude_mpm/services/skills/git_skill_source_manager.py +1340 -0
- claude_mpm/services/skills/selective_skill_deployer.py +743 -0
- claude_mpm/services/skills/skill_discovery_service.py +568 -0
- claude_mpm/services/skills/skill_to_agent_mapper.py +406 -0
- claude_mpm/services/skills_config.py +547 -0
- claude_mpm/services/skills_deployer.py +1168 -0
- claude_mpm/services/socketio/__init__.py +25 -0
- claude_mpm/services/socketio/client_proxy.py +229 -0
- claude_mpm/services/socketio/dashboard_server.py +362 -0
- claude_mpm/services/socketio/event_normalizer.py +798 -0
- claude_mpm/services/socketio/handlers/__init__.py +30 -0
- claude_mpm/services/socketio/handlers/base.py +136 -0
- claude_mpm/services/socketio/handlers/code_analysis.py +682 -0
- claude_mpm/services/socketio/handlers/connection.py +643 -0
- claude_mpm/services/socketio/handlers/connection_handler.py +333 -0
- claude_mpm/services/socketio/handlers/file.py +263 -0
- claude_mpm/services/socketio/handlers/git.py +962 -0
- claude_mpm/services/socketio/handlers/hook.py +211 -0
- claude_mpm/services/socketio/handlers/memory.py +26 -0
- claude_mpm/services/socketio/handlers/project.py +24 -0
- claude_mpm/services/socketio/handlers/registry.py +214 -0
- claude_mpm/services/socketio/migration_utils.py +343 -0
- claude_mpm/services/socketio/monitor_client.py +364 -0
- claude_mpm/services/socketio/server/__init__.py +18 -0
- claude_mpm/services/socketio/server/broadcaster.py +569 -0
- claude_mpm/services/socketio/server/connection_manager.py +579 -0
- claude_mpm/services/socketio/server/core.py +1079 -0
- claude_mpm/services/socketio/server/eventbus_integration.py +245 -0
- claude_mpm/services/socketio/server/main.py +501 -0
- claude_mpm/services/socketio_client_manager.py +173 -143
- claude_mpm/services/socketio_server.py +38 -1657
- claude_mpm/services/subprocess_launcher_service.py +322 -0
- claude_mpm/services/system_instructions_service.py +270 -0
- claude_mpm/services/ticket_manager.py +25 -209
- claude_mpm/services/ticket_services/__init__.py +26 -0
- claude_mpm/services/ticket_services/crud_service.py +328 -0
- claude_mpm/services/ticket_services/formatter_service.py +290 -0
- claude_mpm/services/ticket_services/search_service.py +324 -0
- claude_mpm/services/ticket_services/validation_service.py +303 -0
- claude_mpm/services/ticket_services/workflow_service.py +244 -0
- 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 +280 -0
- claude_mpm/services/version_control/__init__.py +34 -37
- claude_mpm/services/version_control/branch_strategy.py +26 -17
- claude_mpm/services/version_control/conflict_resolution.py +52 -36
- claude_mpm/services/version_control/git_operations.py +183 -49
- claude_mpm/services/version_control/semantic_versioning.py +172 -61
- claude_mpm/services/version_control/version_parser.py +546 -0
- claude_mpm/services/version_service.py +379 -0
- claude_mpm/services/visualization/__init__.py +15 -0
- claude_mpm/services/visualization/mermaid_generator.py +937 -0
- 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/collaboration/brainstorming/SKILL.md +79 -0
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/SKILL.md +178 -0
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/agent-prompts.md +577 -0
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/coordination-patterns.md +467 -0
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/examples.md +537 -0
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/troubleshooting.md +730 -0
- claude_mpm/skills/bundled/collaboration/git-worktrees.md +317 -0
- claude_mpm/skills/bundled/collaboration/requesting-code-review/SKILL.md +112 -0
- claude_mpm/skills/bundled/collaboration/requesting-code-review/references/code-reviewer-template.md +146 -0
- claude_mpm/skills/bundled/collaboration/requesting-code-review/references/review-examples.md +412 -0
- claude_mpm/skills/bundled/collaboration/stacked-prs.md +251 -0
- claude_mpm/skills/bundled/collaboration/writing-plans/SKILL.md +81 -0
- claude_mpm/skills/bundled/collaboration/writing-plans/references/best-practices.md +362 -0
- claude_mpm/skills/bundled/collaboration/writing-plans/references/plan-structure-templates.md +312 -0
- claude_mpm/skills/bundled/database-migration.md +199 -0
- claude_mpm/skills/bundled/debugging/root-cause-tracing/SKILL.md +152 -0
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/advanced-techniques.md +668 -0
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/examples.md +587 -0
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/integration.md +438 -0
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/tracing-techniques.md +391 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/CREATION-LOG.md +119 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/SKILL.md +148 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/anti-patterns.md +483 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/examples.md +452 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/troubleshooting.md +449 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/workflow.md +411 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-academic.md +14 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-1.md +58 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-2.md +68 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-3.md +69 -0
- claude_mpm/skills/bundled/debugging/verification-before-completion/SKILL.md +131 -0
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/gate-function.md +325 -0
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/integration-and-workflows.md +490 -0
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/red-flags-and-failures.md +425 -0
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/verification-patterns.md +499 -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/INTEGRATION.md +611 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/README.md +596 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/SKILL.md +260 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/examples/nextjs-env-structure.md +315 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/references/frameworks.md +436 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/references/security.md +433 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/references/synchronization.md +452 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/references/troubleshooting.md +404 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/references/validation.md +420 -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/artifacts-builder/SKILL.md +86 -0
- claude_mpm/skills/bundled/main/internal-comms/SKILL.md +43 -0
- claude_mpm/skills/bundled/main/internal-comms/examples/3p-updates.md +47 -0
- claude_mpm/skills/bundled/main/internal-comms/examples/company-newsletter.md +65 -0
- claude_mpm/skills/bundled/main/internal-comms/examples/faq-answers.md +30 -0
- claude_mpm/skills/bundled/main/internal-comms/examples/general-comms.md +16 -0
- claude_mpm/skills/bundled/main/mcp-builder/SKILL.md +160 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/design_principles.md +412 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/evaluation.md +602 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/mcp_best_practices.md +915 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/node_mcp_server.md +916 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/python_mcp_server.md +752 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/workflow.md +1237 -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/SKILL.md +189 -0
- claude_mpm/skills/bundled/main/skill-creator/references/best-practices.md +500 -0
- claude_mpm/skills/bundled/main/skill-creator/references/creation-workflow.md +464 -0
- claude_mpm/skills/bundled/main/skill-creator/references/examples.md +619 -0
- claude_mpm/skills/bundled/main/skill-creator/references/progressive-disclosure.md +437 -0
- claude_mpm/skills/bundled/main/skill-creator/references/skill-structure.md +231 -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/php/espocrm-development/SKILL.md +170 -0
- claude_mpm/skills/bundled/php/espocrm-development/references/architecture.md +602 -0
- claude_mpm/skills/bundled/php/espocrm-development/references/common-tasks.md +821 -0
- claude_mpm/skills/bundled/php/espocrm-development/references/development-workflow.md +742 -0
- claude_mpm/skills/bundled/php/espocrm-development/references/frontend-customization.md +726 -0
- claude_mpm/skills/bundled/php/espocrm-development/references/hooks-and-services.md +764 -0
- claude_mpm/skills/bundled/php/espocrm-development/references/testing-debugging.md +831 -0
- claude_mpm/skills/bundled/pm/pm-bug-reporting/pm-bug-reporting.md +248 -0
- claude_mpm/skills/bundled/pm/pm-delegation-patterns/SKILL.md +167 -0
- claude_mpm/skills/bundled/pm/pm-git-file-tracking/SKILL.md +113 -0
- claude_mpm/skills/bundled/pm/pm-pr-workflow/SKILL.md +124 -0
- claude_mpm/skills/bundled/pm/pm-teaching-mode/SKILL.md +657 -0
- claude_mpm/skills/bundled/pm/pm-ticketing-integration/SKILL.md +154 -0
- claude_mpm/skills/bundled/pm/pm-verification-protocols/SKILL.md +198 -0
- claude_mpm/skills/bundled/react/flexlayout-react.md +742 -0
- claude_mpm/skills/bundled/refactoring-patterns.md +180 -0
- claude_mpm/skills/bundled/rust/desktop-applications/SKILL.md +226 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/architecture-patterns.md +901 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/native-gui-frameworks.md +901 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/platform-integration.md +775 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/state-management.md +937 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/tauri-framework.md +770 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/testing-deployment.md +961 -0
- claude_mpm/skills/bundled/security-scanning.md +439 -0
- claude_mpm/skills/bundled/systematic-debugging.md +473 -0
- claude_mpm/skills/bundled/tauri/tauri-async-patterns.md +495 -0
- claude_mpm/skills/bundled/tauri/tauri-build-deploy.md +599 -0
- claude_mpm/skills/bundled/tauri/tauri-command-patterns.md +535 -0
- claude_mpm/skills/bundled/tauri/tauri-error-handling.md +613 -0
- claude_mpm/skills/bundled/tauri/tauri-event-system.md +648 -0
- claude_mpm/skills/bundled/tauri/tauri-file-system.md +673 -0
- claude_mpm/skills/bundled/tauri/tauri-frontend-integration.md +767 -0
- claude_mpm/skills/bundled/tauri/tauri-performance.md +669 -0
- claude_mpm/skills/bundled/tauri/tauri-state-management.md +573 -0
- claude_mpm/skills/bundled/tauri/tauri-testing.md +384 -0
- claude_mpm/skills/bundled/tauri/tauri-window-management.md +628 -0
- claude_mpm/skills/bundled/test-driven-development.md +378 -0
- claude_mpm/skills/bundled/testing/condition-based-waiting/SKILL.md +119 -0
- claude_mpm/skills/bundled/testing/condition-based-waiting/references/patterns-and-implementation.md +253 -0
- claude_mpm/skills/bundled/testing/test-driven-development/SKILL.md +145 -0
- claude_mpm/skills/bundled/testing/test-driven-development/references/anti-patterns.md +543 -0
- claude_mpm/skills/bundled/testing/test-driven-development/references/examples.md +741 -0
- claude_mpm/skills/bundled/testing/test-driven-development/references/integration.md +470 -0
- claude_mpm/skills/bundled/testing/test-driven-development/references/philosophy.md +458 -0
- claude_mpm/skills/bundled/testing/test-driven-development/references/workflow.md +639 -0
- claude_mpm/skills/bundled/testing/test-quality-inspector/SKILL.md +458 -0
- claude_mpm/skills/bundled/testing/test-quality-inspector/examples/example-inspection-report.md +411 -0
- claude_mpm/skills/bundled/testing/test-quality-inspector/references/assertion-quality.md +317 -0
- claude_mpm/skills/bundled/testing/test-quality-inspector/references/inspection-checklist.md +270 -0
- claude_mpm/skills/bundled/testing/test-quality-inspector/references/red-flags.md +436 -0
- claude_mpm/skills/bundled/testing/testing-anti-patterns/SKILL.md +140 -0
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/completeness-anti-patterns.md +572 -0
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/core-anti-patterns.md +411 -0
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/detection-guide.md +569 -0
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/tdd-connection.md +695 -0
- claude_mpm/skills/bundled/testing/webapp-testing/SKILL.md +184 -0
- claude_mpm/skills/bundled/testing/webapp-testing/decision-tree.md +459 -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/playwright-patterns.md +479 -0
- claude_mpm/skills/bundled/testing/webapp-testing/reconnaissance-pattern.md +687 -0
- claude_mpm/skills/bundled/testing/webapp-testing/scripts/with_server.py +129 -0
- claude_mpm/skills/bundled/testing/webapp-testing/server-management.md +758 -0
- claude_mpm/skills/bundled/testing/webapp-testing/troubleshooting.md +868 -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 +405 -0
- claude_mpm/skills/skills_registry.py +347 -0
- claude_mpm/skills/skills_service.py +739 -0
- claude_mpm/storage/__init__.py +9 -0
- claude_mpm/storage/state_storage.py +546 -0
- claude_mpm/templates/.pre-commit-config.yaml +112 -0
- 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/ticket_wrapper.py +2 -2
- claude_mpm/tools/__init__.py +10 -0
- claude_mpm/tools/__main__.py +208 -0
- 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 +631 -0
- claude_mpm/tools/code_tree_events.py +420 -0
- claude_mpm/tools/socketio_debug.py +671 -0
- claude_mpm/utils/__init__.py +8 -8
- claude_mpm/utils/agent_dependency_loader.py +1189 -0
- claude_mpm/utils/agent_filters.py +261 -0
- claude_mpm/utils/common.py +544 -0
- claude_mpm/utils/config_manager.py +168 -126
- claude_mpm/utils/console.py +11 -0
- claude_mpm/utils/database_connector.py +298 -0
- claude_mpm/utils/dependency_cache.py +373 -0
- claude_mpm/utils/dependency_manager.py +60 -59
- claude_mpm/utils/dependency_strategies.py +381 -0
- claude_mpm/utils/display_helper.py +260 -0
- claude_mpm/utils/environment_context.py +313 -0
- claude_mpm/utils/error_handler.py +78 -66
- claude_mpm/utils/file_utils.py +305 -0
- claude_mpm/utils/framework_detection.py +12 -11
- claude_mpm/utils/git_analyzer.py +407 -0
- claude_mpm/utils/gitignore.py +244 -0
- claude_mpm/utils/import_migration_example.py +12 -60
- claude_mpm/utils/imports.py +48 -45
- claude_mpm/utils/log_cleanup.py +627 -0
- claude_mpm/utils/migration.py +372 -0
- claude_mpm/utils/path_operations.py +110 -104
- claude_mpm/utils/progress.py +387 -0
- claude_mpm/utils/robust_installer.py +844 -0
- claude_mpm/utils/session_logging.py +121 -0
- claude_mpm/utils/structured_questions.py +619 -0
- claude_mpm/utils/subprocess_utils.py +343 -0
- claude_mpm/validation/__init__.py +1 -1
- claude_mpm/validation/agent_validator.py +214 -108
- claude_mpm/validation/frontmatter_validator.py +252 -0
- claude_mpm-5.4.85.dist-info/METADATA +1023 -0
- claude_mpm-5.4.85.dist-info/RECORD +980 -0
- {claude_mpm-3.4.10.dist-info → claude_mpm-5.4.85.dist-info}/entry_points.txt +1 -3
- claude_mpm-5.4.85.dist-info/licenses/LICENSE +94 -0
- claude_mpm-5.4.85.dist-info/licenses/LICENSE-FAQ.md +153 -0
- claude_mpm/agents/BASE_AGENT_TEMPLATE.md +0 -88
- claude_mpm/agents/INSTRUCTIONS.md +0 -352
- claude_mpm/agents/backups/INSTRUCTIONS.md +0 -352
- claude_mpm/agents/base_agent_loader.py +0 -529
- claude_mpm/agents/schema/agent_schema.json +0 -314
- claude_mpm/agents/templates/.claude-mpm/memories/README.md +0 -36
- claude_mpm/agents/templates/backup/data_engineer_agent_20250726_234551.json +0 -46
- claude_mpm/agents/templates/backup/documentation_agent_20250726_234551.json +0 -45
- claude_mpm/agents/templates/backup/engineer_agent_20250726_234551.json +0 -49
- claude_mpm/agents/templates/backup/ops_agent_20250726_234551.json +0 -46
- claude_mpm/agents/templates/backup/qa_agent_20250726_234551.json +0 -45
- claude_mpm/agents/templates/backup/research_agent_20250726_234551.json +0 -49
- claude_mpm/agents/templates/backup/security_agent_20250726_234551.json +0 -46
- claude_mpm/agents/templates/backup/version_control_agent_20250726_234551.json +0 -46
- claude_mpm/agents/templates/data_engineer.json +0 -110
- claude_mpm/agents/templates/documentation.json +0 -109
- claude_mpm/agents/templates/engineer.json +0 -113
- claude_mpm/agents/templates/ops.json +0 -109
- claude_mpm/agents/templates/pm.json +0 -25
- claude_mpm/agents/templates/qa.json +0 -111
- claude_mpm/agents/templates/research.json +0 -65
- claude_mpm/agents/templates/security.json +0 -113
- claude_mpm/agents/templates/test_integration.json +0 -112
- claude_mpm/agents/templates/version_control.json +0 -107
- claude_mpm/cli/commands/ui.py +0 -57
- claude_mpm/core/simple_runner.py +0 -1046
- claude_mpm/dashboard/open_dashboard.py +0 -34
- claude_mpm/deployment_paths.py +0 -261
- claude_mpm/hooks/builtin/__init__.py +0 -1
- claude_mpm/hooks/builtin/logging_hook_example.py +0 -165
- claude_mpm/hooks/builtin/memory_hooks_example.py +0 -67
- claude_mpm/hooks/builtin/mpm_command_hook.py +0 -125
- claude_mpm/hooks/builtin/post_delegation_hook_example.py +0 -124
- claude_mpm/hooks/builtin/pre_delegation_hook_example.py +0 -125
- claude_mpm/hooks/builtin/submit_hook_example.py +0 -100
- claude_mpm/hooks/builtin/ticket_extraction_hook_example.py +0 -237
- claude_mpm/hooks/builtin/todo_agent_prefix_hook.py +0 -240
- claude_mpm/hooks/builtin/workflow_start_hook.py +0 -181
- claude_mpm/orchestration/__init__.py +0 -6
- claude_mpm/orchestration/archive/direct_orchestrator.py +0 -195
- claude_mpm/orchestration/archive/factory.py +0 -215
- claude_mpm/orchestration/archive/hook_enabled_orchestrator.py +0 -188
- claude_mpm/orchestration/archive/hook_integration_example.py +0 -178
- claude_mpm/orchestration/archive/interactive_subprocess_orchestrator.py +0 -826
- claude_mpm/orchestration/archive/orchestrator.py +0 -501
- claude_mpm/orchestration/archive/pexpect_orchestrator.py +0 -252
- claude_mpm/orchestration/archive/pty_orchestrator.py +0 -270
- claude_mpm/orchestration/archive/simple_orchestrator.py +0 -82
- claude_mpm/orchestration/archive/subprocess_orchestrator.py +0 -801
- claude_mpm/orchestration/archive/system_prompt_orchestrator.py +0 -278
- claude_mpm/orchestration/archive/wrapper_orchestrator.py +0 -187
- claude_mpm/schemas/workflow_validator.py +0 -411
- claude_mpm/services/agent_deployment.py +0 -1534
- claude_mpm/services/agent_lifecycle_manager.py +0 -1169
- claude_mpm/services/agent_memory_manager.py +0 -1415
- claude_mpm/services/agent_registry.py +0 -676
- claude_mpm/services/deployed_agent_discovery.py +0 -226
- claude_mpm/services/framework_agent_loader.py +0 -337
- claude_mpm/services/framework_claude_md_generator.py +0 -621
- claude_mpm/services/health_monitor.py +0 -892
- claude_mpm/services/memory_router.py +0 -538
- claude_mpm/services/parent_directory_manager/__init__.py +0 -577
- claude_mpm/services/parent_directory_manager/backup_manager.py +0 -258
- claude_mpm/services/parent_directory_manager/config_manager.py +0 -210
- claude_mpm/services/parent_directory_manager/deduplication_manager.py +0 -279
- claude_mpm/services/parent_directory_manager/framework_protector.py +0 -143
- claude_mpm/services/parent_directory_manager/operations.py +0 -186
- claude_mpm/services/parent_directory_manager/state_manager.py +0 -624
- claude_mpm/services/parent_directory_manager/template_deployer.py +0 -579
- claude_mpm/services/parent_directory_manager/validation_manager.py +0 -378
- claude_mpm/services/parent_directory_manager/version_control_helper.py +0 -339
- claude_mpm/services/parent_directory_manager/version_manager.py +0 -222
- 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 -508
- claude_mpm/ui/__init__.py +0 -1
- claude_mpm/ui/rich_terminal_ui.py +0 -295
- claude_mpm/ui/terminal_ui.py +0 -328
- claude_mpm/utils/paths.py +0 -289
- claude_mpm-3.4.10.dist-info/METADATA +0 -183
- claude_mpm-3.4.10.dist-info/RECORD +0 -201
- claude_mpm-3.4.10.dist-info/licenses/LICENSE +0 -21
- {claude_mpm-3.4.10.dist-info → claude_mpm-5.4.85.dist-info}/WHEEL +0 -0
- {claude_mpm-3.4.10.dist-info → claude_mpm-5.4.85.dist-info}/top_level.txt +0 -0
|
@@ -17,23 +17,24 @@ Design Principles:
|
|
|
17
17
|
|
|
18
18
|
import asyncio
|
|
19
19
|
import logging
|
|
20
|
-
import time
|
|
21
|
-
import signal
|
|
22
20
|
import os
|
|
23
|
-
import
|
|
21
|
+
import signal
|
|
22
|
+
import time
|
|
24
23
|
from abc import ABC, abstractmethod
|
|
25
24
|
from collections import deque
|
|
26
25
|
from dataclasses import dataclass
|
|
27
26
|
from datetime import datetime, timezone
|
|
28
27
|
from enum import Enum
|
|
29
|
-
from typing import Any, Dict, List, Optional
|
|
30
|
-
|
|
28
|
+
from typing import Any, Callable, Dict, List, Optional
|
|
29
|
+
|
|
30
|
+
from claude_mpm.core.constants import PerformanceConfig, RetryConfig
|
|
31
31
|
|
|
32
|
-
from .
|
|
32
|
+
from .infrastructure.monitoring import HealthCheckResult, HealthStatus
|
|
33
33
|
|
|
34
34
|
|
|
35
35
|
class RecoveryAction(Enum):
|
|
36
36
|
"""Types of recovery actions that can be performed."""
|
|
37
|
+
|
|
37
38
|
NONE = "none"
|
|
38
39
|
LOG_WARNING = "log_warning"
|
|
39
40
|
CLEAR_CONNECTIONS = "clear_connections"
|
|
@@ -43,14 +44,16 @@ class RecoveryAction(Enum):
|
|
|
43
44
|
|
|
44
45
|
class CircuitState(Enum):
|
|
45
46
|
"""Circuit breaker states."""
|
|
46
|
-
|
|
47
|
-
|
|
47
|
+
|
|
48
|
+
CLOSED = "closed" # Normal operation
|
|
49
|
+
OPEN = "open" # Recovery blocked due to failures
|
|
48
50
|
HALF_OPEN = "half_open" # Testing if recovery is working
|
|
49
51
|
|
|
50
52
|
|
|
51
53
|
@dataclass
|
|
52
54
|
class RecoveryEvent:
|
|
53
55
|
"""Recovery event record."""
|
|
56
|
+
|
|
54
57
|
timestamp: float
|
|
55
58
|
action: RecoveryAction
|
|
56
59
|
trigger: str
|
|
@@ -58,145 +61,153 @@ class RecoveryEvent:
|
|
|
58
61
|
success: bool
|
|
59
62
|
duration_ms: float
|
|
60
63
|
error_message: Optional[str] = None
|
|
61
|
-
|
|
64
|
+
|
|
62
65
|
def to_dict(self) -> Dict[str, Any]:
|
|
63
66
|
"""Convert recovery event to dictionary."""
|
|
64
67
|
return {
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
68
|
+
"timestamp": self.timestamp,
|
|
69
|
+
"timestamp_iso": datetime.fromtimestamp(
|
|
70
|
+
self.timestamp, timezone.utc
|
|
71
|
+
).isoformat(),
|
|
72
|
+
"action": self.action.value,
|
|
73
|
+
"trigger": self.trigger,
|
|
74
|
+
"health_status": self.health_status.value,
|
|
75
|
+
"success": self.success,
|
|
76
|
+
"duration_ms": self.duration_ms,
|
|
77
|
+
"error_message": self.error_message,
|
|
73
78
|
}
|
|
74
79
|
|
|
75
80
|
|
|
76
81
|
class RecoveryStrategy(ABC):
|
|
77
82
|
"""Abstract base class for recovery strategies."""
|
|
78
|
-
|
|
83
|
+
|
|
79
84
|
@abstractmethod
|
|
80
85
|
def should_recover(self, health_result: HealthCheckResult) -> bool:
|
|
81
86
|
"""Determine if recovery should be triggered based on health result."""
|
|
82
|
-
|
|
83
|
-
|
|
87
|
+
|
|
84
88
|
@abstractmethod
|
|
85
89
|
def get_recovery_action(self, health_result: HealthCheckResult) -> RecoveryAction:
|
|
86
90
|
"""Determine the appropriate recovery action."""
|
|
87
|
-
|
|
88
|
-
|
|
91
|
+
|
|
89
92
|
@abstractmethod
|
|
90
93
|
def get_name(self) -> str:
|
|
91
94
|
"""Get the name of this recovery strategy."""
|
|
92
|
-
pass
|
|
93
95
|
|
|
94
96
|
|
|
95
97
|
class GradedRecoveryStrategy(RecoveryStrategy):
|
|
96
98
|
"""Recovery strategy with graduated response based on health status and history.
|
|
97
|
-
|
|
99
|
+
|
|
98
100
|
Recovery actions are escalated based on:
|
|
99
101
|
- Current health status severity
|
|
100
102
|
- Number of recent failures
|
|
101
103
|
- Time since last recovery attempt
|
|
102
104
|
"""
|
|
103
|
-
|
|
105
|
+
|
|
104
106
|
def __init__(self, config: Optional[Dict[str, Any]] = None):
|
|
105
107
|
"""Initialize graded recovery strategy.
|
|
106
|
-
|
|
108
|
+
|
|
107
109
|
Args:
|
|
108
110
|
config: Configuration dictionary for recovery thresholds
|
|
109
111
|
"""
|
|
110
112
|
self.config = config or {}
|
|
111
113
|
self.logger = logging.getLogger(f"{__name__}.GradedRecoveryStrategy")
|
|
112
|
-
|
|
114
|
+
|
|
113
115
|
# Configuration with defaults
|
|
114
|
-
self.warning_threshold = self.config.get(
|
|
115
|
-
self.critical_threshold = self.config.get(
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
116
|
+
self.warning_threshold = self.config.get("warning_threshold", 2)
|
|
117
|
+
self.critical_threshold = self.config.get(
|
|
118
|
+
"critical_threshold", RetryConfig.CRITICAL_THRESHOLD
|
|
119
|
+
)
|
|
120
|
+
self.failure_window_seconds = self.config.get(
|
|
121
|
+
"failure_window_seconds", RetryConfig.FAILURE_WINDOW
|
|
122
|
+
)
|
|
123
|
+
self.min_recovery_interval = self.config.get(
|
|
124
|
+
"min_recovery_interval", RetryConfig.MIN_RECOVERY_INTERVAL
|
|
125
|
+
)
|
|
126
|
+
|
|
119
127
|
# Track recent failures
|
|
120
128
|
self.recent_failures: deque = deque(maxlen=10)
|
|
121
129
|
self.last_recovery_time = 0
|
|
122
|
-
|
|
130
|
+
|
|
123
131
|
def get_name(self) -> str:
|
|
124
132
|
return "graded_recovery"
|
|
125
|
-
|
|
133
|
+
|
|
126
134
|
def should_recover(self, health_result: HealthCheckResult) -> bool:
|
|
127
135
|
"""Determine if recovery should be triggered."""
|
|
128
136
|
current_time = time.time()
|
|
129
|
-
|
|
137
|
+
|
|
130
138
|
# Don't trigger recovery too frequently
|
|
131
139
|
if current_time - self.last_recovery_time < self.min_recovery_interval:
|
|
132
140
|
self.logger.debug("Recovery suppressed due to min interval")
|
|
133
141
|
return False
|
|
134
|
-
|
|
142
|
+
|
|
135
143
|
# Check current health status
|
|
136
144
|
if health_result.overall_status in [HealthStatus.CRITICAL]:
|
|
137
145
|
return True
|
|
138
|
-
|
|
146
|
+
|
|
139
147
|
if health_result.overall_status == HealthStatus.WARNING:
|
|
140
148
|
# Count recent warnings in time window
|
|
141
149
|
cutoff_time = current_time - self.failure_window_seconds
|
|
142
150
|
recent_warnings = [
|
|
143
|
-
event for event in self.recent_failures
|
|
144
|
-
if event >= cutoff_time
|
|
151
|
+
event for event in self.recent_failures if event >= cutoff_time
|
|
145
152
|
]
|
|
146
|
-
|
|
153
|
+
|
|
147
154
|
if len(recent_warnings) >= self.warning_threshold:
|
|
148
155
|
return True
|
|
149
|
-
|
|
156
|
+
|
|
150
157
|
return False
|
|
151
|
-
|
|
158
|
+
|
|
152
159
|
def get_recovery_action(self, health_result: HealthCheckResult) -> RecoveryAction:
|
|
153
160
|
"""Determine the appropriate recovery action based on health status."""
|
|
154
161
|
current_time = time.time()
|
|
155
|
-
|
|
162
|
+
|
|
156
163
|
# Count recent failures
|
|
157
164
|
cutoff_time = current_time - self.failure_window_seconds
|
|
158
165
|
recent_failures = [
|
|
159
|
-
event for event in self.recent_failures
|
|
160
|
-
if event >= cutoff_time
|
|
166
|
+
event for event in self.recent_failures if event >= cutoff_time
|
|
161
167
|
]
|
|
162
|
-
|
|
168
|
+
|
|
163
169
|
failure_count = len(recent_failures)
|
|
164
|
-
|
|
170
|
+
|
|
165
171
|
# Record this failure
|
|
166
|
-
if health_result.overall_status in [
|
|
172
|
+
if health_result.overall_status in [
|
|
173
|
+
HealthStatus.WARNING,
|
|
174
|
+
HealthStatus.CRITICAL,
|
|
175
|
+
]:
|
|
167
176
|
self.recent_failures.append(current_time)
|
|
168
|
-
|
|
177
|
+
|
|
169
178
|
# Determine action based on status and failure history
|
|
170
179
|
if health_result.overall_status == HealthStatus.CRITICAL:
|
|
171
180
|
if failure_count >= 3:
|
|
172
181
|
return RecoveryAction.EMERGENCY_STOP
|
|
173
|
-
|
|
182
|
+
if failure_count >= 2:
|
|
174
183
|
return RecoveryAction.RESTART_SERVICE
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
elif health_result.overall_status == HealthStatus.WARNING:
|
|
184
|
+
return RecoveryAction.CLEAR_CONNECTIONS
|
|
185
|
+
|
|
186
|
+
if health_result.overall_status == HealthStatus.WARNING:
|
|
179
187
|
if failure_count >= self.warning_threshold:
|
|
180
188
|
return RecoveryAction.CLEAR_CONNECTIONS
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
189
|
+
return RecoveryAction.LOG_WARNING
|
|
190
|
+
|
|
184
191
|
return RecoveryAction.NONE
|
|
185
192
|
|
|
186
193
|
|
|
187
194
|
class CircuitBreaker:
|
|
188
195
|
"""Circuit breaker to prevent recovery loops and cascading failures.
|
|
189
|
-
|
|
196
|
+
|
|
190
197
|
Implements the circuit breaker pattern to:
|
|
191
198
|
- Prevent excessive recovery attempts
|
|
192
199
|
- Allow time for systems to stabilize
|
|
193
200
|
- Gradually re-enable recovery after failures
|
|
194
201
|
"""
|
|
195
|
-
|
|
196
|
-
def __init__(
|
|
197
|
-
|
|
202
|
+
|
|
203
|
+
def __init__(
|
|
204
|
+
self,
|
|
205
|
+
failure_threshold: int = RetryConfig.FAILURE_THRESHOLD,
|
|
206
|
+
timeout_seconds: int = RetryConfig.CIRCUIT_TIMEOUT,
|
|
207
|
+
success_threshold: int = RetryConfig.SUCCESS_THRESHOLD,
|
|
208
|
+
):
|
|
198
209
|
"""Initialize circuit breaker.
|
|
199
|
-
|
|
210
|
+
|
|
200
211
|
Args:
|
|
201
212
|
failure_threshold: Number of failures before opening circuit
|
|
202
213
|
timeout_seconds: Time to wait in OPEN state before trying HALF_OPEN
|
|
@@ -205,80 +216,87 @@ class CircuitBreaker:
|
|
|
205
216
|
self.failure_threshold = failure_threshold
|
|
206
217
|
self.timeout_seconds = timeout_seconds
|
|
207
218
|
self.success_threshold = success_threshold
|
|
208
|
-
|
|
219
|
+
|
|
209
220
|
self.state = CircuitState.CLOSED
|
|
210
221
|
self.failure_count = 0
|
|
211
222
|
self.success_count = 0
|
|
212
223
|
self.last_failure_time = 0
|
|
213
224
|
self.state_change_time = time.time()
|
|
214
|
-
|
|
225
|
+
|
|
215
226
|
self.logger = logging.getLogger(f"{__name__}.CircuitBreaker")
|
|
216
|
-
self.logger.info(
|
|
217
|
-
|
|
218
|
-
|
|
227
|
+
self.logger.info(
|
|
228
|
+
f"Circuit breaker initialized: failure_threshold={failure_threshold}, "
|
|
229
|
+
f"timeout={timeout_seconds}s, success_threshold={success_threshold}"
|
|
230
|
+
)
|
|
231
|
+
|
|
219
232
|
def can_proceed(self) -> bool:
|
|
220
233
|
"""Check if recovery operations can proceed."""
|
|
221
234
|
current_time = time.time()
|
|
222
|
-
|
|
235
|
+
|
|
223
236
|
if self.state == CircuitState.CLOSED:
|
|
224
237
|
return True
|
|
225
|
-
|
|
226
|
-
|
|
238
|
+
|
|
239
|
+
if self.state == CircuitState.OPEN:
|
|
227
240
|
# Check if timeout has elapsed
|
|
228
241
|
if current_time - self.last_failure_time >= self.timeout_seconds:
|
|
229
242
|
self._transition_to_half_open()
|
|
230
243
|
return True
|
|
231
244
|
return False
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
return False
|
|
237
|
-
|
|
245
|
+
|
|
246
|
+
return self.state == CircuitState.HALF_OPEN
|
|
247
|
+
|
|
238
248
|
def record_success(self) -> None:
|
|
239
249
|
"""Record a successful recovery operation."""
|
|
240
250
|
if self.state == CircuitState.CLOSED:
|
|
241
251
|
# Reset failure count on success in normal state
|
|
242
252
|
self.failure_count = 0
|
|
243
|
-
|
|
253
|
+
|
|
244
254
|
elif self.state == CircuitState.HALF_OPEN:
|
|
245
255
|
self.success_count += 1
|
|
246
|
-
self.logger.debug(
|
|
247
|
-
|
|
256
|
+
self.logger.debug(
|
|
257
|
+
f"Circuit breaker success count: {self.success_count}/{self.success_threshold}"
|
|
258
|
+
)
|
|
259
|
+
|
|
248
260
|
if self.success_count >= self.success_threshold:
|
|
249
261
|
self._transition_to_closed()
|
|
250
|
-
|
|
262
|
+
|
|
251
263
|
def record_failure(self) -> None:
|
|
252
264
|
"""Record a failed recovery operation."""
|
|
253
265
|
current_time = time.time()
|
|
254
266
|
self.last_failure_time = current_time
|
|
255
|
-
|
|
267
|
+
|
|
256
268
|
if self.state == CircuitState.CLOSED:
|
|
257
269
|
self.failure_count += 1
|
|
258
|
-
self.logger.warning(
|
|
259
|
-
|
|
270
|
+
self.logger.warning(
|
|
271
|
+
f"Circuit breaker failure count: {self.failure_count}/{self.failure_threshold}"
|
|
272
|
+
)
|
|
273
|
+
|
|
260
274
|
if self.failure_count >= self.failure_threshold:
|
|
261
275
|
self._transition_to_open()
|
|
262
|
-
|
|
276
|
+
|
|
263
277
|
elif self.state == CircuitState.HALF_OPEN:
|
|
264
278
|
# Failure in half-open state goes back to open
|
|
265
279
|
self._transition_to_open()
|
|
266
|
-
|
|
280
|
+
|
|
267
281
|
def _transition_to_open(self) -> None:
|
|
268
282
|
"""Transition circuit to OPEN state."""
|
|
269
283
|
self.state = CircuitState.OPEN
|
|
270
284
|
self.state_change_time = time.time()
|
|
271
285
|
self.success_count = 0
|
|
272
|
-
self.logger.warning(
|
|
273
|
-
|
|
274
|
-
|
|
286
|
+
self.logger.warning(
|
|
287
|
+
f"Circuit breaker OPENED due to {self.failure_count} failures. "
|
|
288
|
+
f"Recovery blocked for {self.timeout_seconds} seconds."
|
|
289
|
+
)
|
|
290
|
+
|
|
275
291
|
def _transition_to_half_open(self) -> None:
|
|
276
292
|
"""Transition circuit to HALF_OPEN state."""
|
|
277
293
|
self.state = CircuitState.HALF_OPEN
|
|
278
294
|
self.state_change_time = time.time()
|
|
279
295
|
self.success_count = 0
|
|
280
|
-
self.logger.info(
|
|
281
|
-
|
|
296
|
+
self.logger.info(
|
|
297
|
+
"Circuit breaker transitioned to HALF_OPEN. Testing recovery..."
|
|
298
|
+
)
|
|
299
|
+
|
|
282
300
|
def _transition_to_closed(self) -> None:
|
|
283
301
|
"""Transition circuit to CLOSED state."""
|
|
284
302
|
self.state = CircuitState.CLOSED
|
|
@@ -286,29 +304,29 @@ class CircuitBreaker:
|
|
|
286
304
|
self.failure_count = 0
|
|
287
305
|
self.success_count = 0
|
|
288
306
|
self.logger.info("Circuit breaker CLOSED. Normal recovery operations resumed.")
|
|
289
|
-
|
|
307
|
+
|
|
290
308
|
def get_status(self) -> Dict[str, Any]:
|
|
291
309
|
"""Get current circuit breaker status."""
|
|
292
310
|
current_time = time.time()
|
|
293
311
|
return {
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
}
|
|
312
|
+
"state": self.state.value,
|
|
313
|
+
"failure_count": self.failure_count,
|
|
314
|
+
"success_count": self.success_count,
|
|
315
|
+
"last_failure_time": self.last_failure_time,
|
|
316
|
+
"state_change_time": self.state_change_time,
|
|
317
|
+
"time_in_current_state": current_time - self.state_change_time,
|
|
318
|
+
"can_proceed": self.can_proceed(),
|
|
319
|
+
"config": {
|
|
320
|
+
"failure_threshold": self.failure_threshold,
|
|
321
|
+
"timeout_seconds": self.timeout_seconds,
|
|
322
|
+
"success_threshold": self.success_threshold,
|
|
323
|
+
},
|
|
306
324
|
}
|
|
307
325
|
|
|
308
326
|
|
|
309
327
|
class RecoveryManager:
|
|
310
328
|
"""Advanced recovery manager with circuit breaker and configurable strategies.
|
|
311
|
-
|
|
329
|
+
|
|
312
330
|
Provides comprehensive recovery capabilities including:
|
|
313
331
|
- Health-based recovery triggering
|
|
314
332
|
- Circuit breaker protection
|
|
@@ -316,11 +334,10 @@ class RecoveryManager:
|
|
|
316
334
|
- Recovery event logging and history
|
|
317
335
|
- Integration with service lifecycle
|
|
318
336
|
"""
|
|
319
|
-
|
|
320
|
-
def __init__(self, config: Optional[Dict[str, Any]] = None,
|
|
321
|
-
server_instance=None):
|
|
337
|
+
|
|
338
|
+
def __init__(self, config: Optional[Dict[str, Any]] = None, server_instance=None):
|
|
322
339
|
"""Initialize recovery manager.
|
|
323
|
-
|
|
340
|
+
|
|
324
341
|
Args:
|
|
325
342
|
config: Configuration dictionary for recovery settings
|
|
326
343
|
server_instance: Reference to the Socket.IO server instance
|
|
@@ -328,110 +345,124 @@ class RecoveryManager:
|
|
|
328
345
|
self.config = config or {}
|
|
329
346
|
self.server_instance = server_instance
|
|
330
347
|
self.logger = logging.getLogger(f"{__name__}.RecoveryManager")
|
|
331
|
-
|
|
348
|
+
|
|
332
349
|
# Configuration with defaults
|
|
333
|
-
self.enabled = self.config.get(
|
|
334
|
-
self.check_interval = self.config.get(
|
|
335
|
-
self.max_recovery_attempts = self.config.get(
|
|
336
|
-
self.recovery_timeout = self.config.get(
|
|
337
|
-
|
|
350
|
+
self.enabled = self.config.get("enabled", True)
|
|
351
|
+
self.check_interval = self.config.get("check_interval", 60)
|
|
352
|
+
self.max_recovery_attempts = self.config.get("max_recovery_attempts", 5)
|
|
353
|
+
self.recovery_timeout = self.config.get("recovery_timeout", 30)
|
|
354
|
+
|
|
338
355
|
# Initialize circuit breaker
|
|
339
|
-
circuit_config = self.config.get(
|
|
356
|
+
circuit_config = self.config.get("circuit_breaker", {})
|
|
340
357
|
self.circuit_breaker = CircuitBreaker(
|
|
341
|
-
failure_threshold=circuit_config.get(
|
|
342
|
-
|
|
343
|
-
|
|
358
|
+
failure_threshold=circuit_config.get(
|
|
359
|
+
"failure_threshold", RetryConfig.FAILURE_THRESHOLD
|
|
360
|
+
),
|
|
361
|
+
timeout_seconds=circuit_config.get(
|
|
362
|
+
"timeout_seconds", RetryConfig.CIRCUIT_TIMEOUT
|
|
363
|
+
),
|
|
364
|
+
success_threshold=circuit_config.get(
|
|
365
|
+
"success_threshold", RetryConfig.SUCCESS_THRESHOLD
|
|
366
|
+
),
|
|
344
367
|
)
|
|
345
|
-
|
|
368
|
+
|
|
346
369
|
# Initialize recovery strategy
|
|
347
|
-
strategy_config = self.config.get(
|
|
370
|
+
strategy_config = self.config.get("strategy", {})
|
|
348
371
|
self.recovery_strategy = GradedRecoveryStrategy(strategy_config)
|
|
349
|
-
|
|
372
|
+
|
|
350
373
|
# Recovery event history
|
|
351
374
|
self.recovery_history: deque = deque(maxlen=100)
|
|
352
|
-
|
|
375
|
+
|
|
353
376
|
# Recovery state
|
|
354
377
|
self.recovery_in_progress = False
|
|
355
378
|
self.last_recovery_time = 0
|
|
356
379
|
self.recovery_count = 0
|
|
357
|
-
|
|
380
|
+
|
|
358
381
|
# Recovery callbacks
|
|
359
382
|
self.recovery_callbacks: List[Callable[[RecoveryEvent], None]] = []
|
|
360
|
-
|
|
383
|
+
|
|
361
384
|
# Statistics
|
|
362
385
|
self.recovery_stats = {
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
386
|
+
"total_recoveries": 0,
|
|
387
|
+
"successful_recoveries": 0,
|
|
388
|
+
"failed_recoveries": 0,
|
|
389
|
+
"actions_performed": {action.value: 0 for action in RecoveryAction},
|
|
390
|
+
"average_recovery_duration_ms": 0,
|
|
368
391
|
}
|
|
369
|
-
|
|
370
|
-
self.logger.info(
|
|
371
|
-
|
|
392
|
+
|
|
393
|
+
self.logger.info(
|
|
394
|
+
f"Recovery manager initialized with strategy: {self.recovery_strategy.get_name()}"
|
|
395
|
+
)
|
|
396
|
+
|
|
372
397
|
def add_recovery_callback(self, callback: Callable[[RecoveryEvent], None]) -> None:
|
|
373
398
|
"""Add a callback to be notified of recovery events."""
|
|
374
399
|
self.recovery_callbacks.append(callback)
|
|
375
400
|
self.logger.debug(f"Added recovery callback: {callback.__name__}")
|
|
376
|
-
|
|
377
|
-
def handle_health_result(
|
|
401
|
+
|
|
402
|
+
def handle_health_result(
|
|
403
|
+
self, health_result: HealthCheckResult
|
|
404
|
+
) -> Optional[RecoveryEvent]:
|
|
378
405
|
"""Handle health check result and trigger recovery if needed.
|
|
379
|
-
|
|
406
|
+
|
|
380
407
|
Args:
|
|
381
408
|
health_result: Health check result to evaluate
|
|
382
|
-
|
|
409
|
+
|
|
383
410
|
Returns:
|
|
384
411
|
RecoveryEvent if recovery was triggered, None otherwise
|
|
385
412
|
"""
|
|
386
413
|
if not self.enabled:
|
|
387
414
|
return None
|
|
388
|
-
|
|
415
|
+
|
|
389
416
|
if self.recovery_in_progress:
|
|
390
417
|
self.logger.debug("Recovery already in progress, skipping")
|
|
391
418
|
return None
|
|
392
|
-
|
|
419
|
+
|
|
393
420
|
# Check if recovery should be triggered
|
|
394
421
|
if not self.recovery_strategy.should_recover(health_result):
|
|
395
422
|
return None
|
|
396
|
-
|
|
423
|
+
|
|
397
424
|
# Check circuit breaker
|
|
398
425
|
if not self.circuit_breaker.can_proceed():
|
|
399
426
|
self.logger.warning("Recovery suppressed by circuit breaker")
|
|
400
427
|
return None
|
|
401
|
-
|
|
428
|
+
|
|
402
429
|
# Determine recovery action
|
|
403
430
|
action = self.recovery_strategy.get_recovery_action(health_result)
|
|
404
|
-
|
|
431
|
+
|
|
405
432
|
if action == RecoveryAction.NONE:
|
|
406
433
|
return None
|
|
407
|
-
|
|
434
|
+
|
|
408
435
|
# Trigger recovery
|
|
409
|
-
return asyncio.create_task(
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
436
|
+
return asyncio.create_task(
|
|
437
|
+
self._perform_recovery(action, health_result, "health_check")
|
|
438
|
+
)
|
|
439
|
+
|
|
440
|
+
async def _perform_recovery(
|
|
441
|
+
self, action: RecoveryAction, health_result: HealthCheckResult, trigger: str
|
|
442
|
+
) -> RecoveryEvent:
|
|
414
443
|
"""Perform recovery action and record the event.
|
|
415
|
-
|
|
444
|
+
|
|
416
445
|
Args:
|
|
417
446
|
action: Recovery action to perform
|
|
418
447
|
health_result: Health result that triggered recovery
|
|
419
448
|
trigger: Description of what triggered the recovery
|
|
420
|
-
|
|
449
|
+
|
|
421
450
|
Returns:
|
|
422
451
|
RecoveryEvent record of the recovery attempt
|
|
423
452
|
"""
|
|
424
453
|
if self.recovery_in_progress:
|
|
425
454
|
raise RuntimeError("Recovery already in progress")
|
|
426
|
-
|
|
455
|
+
|
|
427
456
|
self.recovery_in_progress = True
|
|
428
457
|
start_time = time.time()
|
|
429
458
|
success = False
|
|
430
459
|
error_message = None
|
|
431
|
-
|
|
460
|
+
|
|
432
461
|
try:
|
|
433
|
-
self.logger.info(
|
|
434
|
-
|
|
462
|
+
self.logger.info(
|
|
463
|
+
f"Starting recovery action: {action.value} (trigger: {trigger})"
|
|
464
|
+
)
|
|
465
|
+
|
|
435
466
|
if action == RecoveryAction.LOG_WARNING:
|
|
436
467
|
success = await self._log_warning(health_result)
|
|
437
468
|
elif action == RecoveryAction.CLEAR_CONNECTIONS:
|
|
@@ -443,16 +474,16 @@ class RecoveryManager:
|
|
|
443
474
|
else:
|
|
444
475
|
error_message = f"Unknown recovery action: {action}"
|
|
445
476
|
self.logger.error(error_message)
|
|
446
|
-
|
|
477
|
+
|
|
447
478
|
except Exception as e:
|
|
448
479
|
error_message = f"Recovery action failed: {e}"
|
|
449
480
|
self.logger.error(error_message)
|
|
450
481
|
success = False
|
|
451
|
-
|
|
482
|
+
|
|
452
483
|
finally:
|
|
453
484
|
self.recovery_in_progress = False
|
|
454
|
-
duration_ms = (time.time() - start_time) *
|
|
455
|
-
|
|
485
|
+
duration_ms = (time.time() - start_time) * PerformanceConfig.SECONDS_TO_MS
|
|
486
|
+
|
|
456
487
|
# Create recovery event
|
|
457
488
|
event = RecoveryEvent(
|
|
458
489
|
timestamp=start_time,
|
|
@@ -461,210 +492,232 @@ class RecoveryManager:
|
|
|
461
492
|
health_status=health_result.overall_status,
|
|
462
493
|
success=success,
|
|
463
494
|
duration_ms=duration_ms,
|
|
464
|
-
error_message=error_message
|
|
495
|
+
error_message=error_message,
|
|
465
496
|
)
|
|
466
|
-
|
|
497
|
+
|
|
467
498
|
# Update statistics
|
|
468
499
|
self._update_recovery_stats(event)
|
|
469
|
-
|
|
500
|
+
|
|
470
501
|
# Record in circuit breaker
|
|
471
502
|
if success:
|
|
472
503
|
self.circuit_breaker.record_success()
|
|
473
504
|
else:
|
|
474
505
|
self.circuit_breaker.record_failure()
|
|
475
|
-
|
|
506
|
+
|
|
476
507
|
# Store event
|
|
477
508
|
self.recovery_history.append(event)
|
|
478
509
|
self.last_recovery_time = start_time
|
|
479
510
|
self.recovery_count += 1
|
|
480
|
-
|
|
511
|
+
|
|
481
512
|
# Notify callbacks
|
|
482
513
|
for callback in self.recovery_callbacks:
|
|
483
514
|
try:
|
|
484
515
|
callback(event)
|
|
485
516
|
except Exception as e:
|
|
486
|
-
self.logger.error(
|
|
487
|
-
|
|
517
|
+
self.logger.error(
|
|
518
|
+
f"Recovery callback {callback.__name__} failed: {e}"
|
|
519
|
+
)
|
|
520
|
+
|
|
488
521
|
result_msg = "succeeded" if success else "failed"
|
|
489
|
-
self.logger.info(
|
|
490
|
-
|
|
522
|
+
self.logger.info(
|
|
523
|
+
f"Recovery action {action.value} {result_msg} in {duration_ms:.2f}ms"
|
|
524
|
+
)
|
|
525
|
+
|
|
491
526
|
return event
|
|
492
|
-
|
|
527
|
+
|
|
493
528
|
async def _log_warning(self, health_result: HealthCheckResult) -> bool:
|
|
494
529
|
"""Log a warning about health issues."""
|
|
495
530
|
try:
|
|
496
|
-
warning_metrics = [
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
531
|
+
warning_metrics = [
|
|
532
|
+
m for m in health_result.metrics if m.status == HealthStatus.WARNING
|
|
533
|
+
]
|
|
534
|
+
critical_metrics = [
|
|
535
|
+
m for m in health_result.metrics if m.status == HealthStatus.CRITICAL
|
|
536
|
+
]
|
|
537
|
+
|
|
538
|
+
self.logger.warning(
|
|
539
|
+
f"Health warning detected: {len(warning_metrics)} warning metrics, "
|
|
540
|
+
f"{len(critical_metrics)} critical metrics"
|
|
541
|
+
)
|
|
542
|
+
|
|
502
543
|
for metric in warning_metrics + critical_metrics:
|
|
503
|
-
self.logger.warning(
|
|
504
|
-
|
|
544
|
+
self.logger.warning(
|
|
545
|
+
f" {metric.name}: {metric.value} ({metric.status.value}) - {metric.message}"
|
|
546
|
+
)
|
|
547
|
+
|
|
505
548
|
return True
|
|
506
549
|
except Exception as e:
|
|
507
550
|
self.logger.error(f"Failed to log warning: {e}")
|
|
508
551
|
return False
|
|
509
|
-
|
|
552
|
+
|
|
510
553
|
async def _clear_connections(self) -> bool:
|
|
511
554
|
"""Clear all client connections to reset connection state."""
|
|
512
555
|
try:
|
|
513
|
-
if not self.server_instance or not hasattr(self.server_instance,
|
|
514
|
-
self.logger.warning(
|
|
556
|
+
if not self.server_instance or not hasattr(self.server_instance, "sio"):
|
|
557
|
+
self.logger.warning(
|
|
558
|
+
"No server instance available for connection clearing"
|
|
559
|
+
)
|
|
515
560
|
return False
|
|
516
|
-
|
|
561
|
+
|
|
517
562
|
sio = self.server_instance.sio
|
|
518
563
|
if not sio:
|
|
519
564
|
self.logger.warning("Socket.IO instance not available")
|
|
520
565
|
return False
|
|
521
|
-
|
|
566
|
+
|
|
522
567
|
# Get current clients
|
|
523
|
-
clients =
|
|
524
|
-
|
|
568
|
+
clients = (
|
|
569
|
+
list(self.server_instance.clients)
|
|
570
|
+
if hasattr(self.server_instance, "clients")
|
|
571
|
+
else []
|
|
572
|
+
)
|
|
573
|
+
|
|
525
574
|
self.logger.info(f"Clearing {len(clients)} client connections")
|
|
526
|
-
|
|
575
|
+
|
|
527
576
|
# Disconnect all clients
|
|
528
577
|
for client_id in clients:
|
|
529
578
|
try:
|
|
530
579
|
await sio.disconnect(client_id)
|
|
531
580
|
except Exception as e:
|
|
532
581
|
self.logger.warning(f"Failed to disconnect client {client_id}: {e}")
|
|
533
|
-
|
|
582
|
+
|
|
534
583
|
# Clear client tracking
|
|
535
|
-
if hasattr(self.server_instance,
|
|
584
|
+
if hasattr(self.server_instance, "clients"):
|
|
536
585
|
self.server_instance.clients.clear()
|
|
537
|
-
if hasattr(self.server_instance,
|
|
586
|
+
if hasattr(self.server_instance, "client_versions"):
|
|
538
587
|
self.server_instance.client_versions.clear()
|
|
539
|
-
|
|
588
|
+
|
|
540
589
|
self.logger.info("Client connections cleared successfully")
|
|
541
590
|
return True
|
|
542
|
-
|
|
591
|
+
|
|
543
592
|
except Exception as e:
|
|
544
593
|
self.logger.error(f"Failed to clear connections: {e}")
|
|
545
594
|
return False
|
|
546
|
-
|
|
595
|
+
|
|
547
596
|
async def _restart_service(self) -> bool:
|
|
548
597
|
"""Restart the Socket.IO service."""
|
|
549
598
|
try:
|
|
550
599
|
if not self.server_instance:
|
|
551
600
|
self.logger.error("No server instance available for restart")
|
|
552
601
|
return False
|
|
553
|
-
|
|
602
|
+
|
|
554
603
|
self.logger.info("Attempting graceful service restart")
|
|
555
|
-
|
|
604
|
+
|
|
556
605
|
# Save current configuration
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
606
|
+
getattr(self.server_instance, "host", "localhost")
|
|
607
|
+
getattr(self.server_instance, "port", 8765)
|
|
608
|
+
|
|
560
609
|
# Stop current server
|
|
561
610
|
try:
|
|
562
611
|
await self.server_instance._shutdown_async()
|
|
563
612
|
self.logger.info("Server shutdown completed")
|
|
564
613
|
except Exception as e:
|
|
565
614
|
self.logger.warning(f"Error during shutdown: {e}")
|
|
566
|
-
|
|
615
|
+
|
|
567
616
|
# Wait a moment for cleanup
|
|
568
617
|
await asyncio.sleep(1)
|
|
569
|
-
|
|
618
|
+
|
|
570
619
|
# Restart server
|
|
571
620
|
await self.server_instance.start_async()
|
|
572
621
|
self.logger.info("Server restart completed successfully")
|
|
573
|
-
|
|
622
|
+
|
|
574
623
|
return True
|
|
575
|
-
|
|
624
|
+
|
|
576
625
|
except Exception as e:
|
|
577
626
|
self.logger.error(f"Failed to restart service: {e}")
|
|
578
627
|
return False
|
|
579
|
-
|
|
628
|
+
|
|
580
629
|
async def _emergency_stop(self) -> bool:
|
|
581
630
|
"""Perform emergency stop of the service."""
|
|
582
631
|
try:
|
|
583
|
-
self.logger.critical(
|
|
584
|
-
|
|
632
|
+
self.logger.critical(
|
|
633
|
+
"Performing emergency stop due to critical health issues"
|
|
634
|
+
)
|
|
635
|
+
|
|
585
636
|
if self.server_instance:
|
|
586
637
|
try:
|
|
587
638
|
# Force immediate shutdown
|
|
588
639
|
await self.server_instance._shutdown_async()
|
|
589
640
|
except Exception as e:
|
|
590
641
|
self.logger.error(f"Error during emergency shutdown: {e}")
|
|
591
|
-
|
|
642
|
+
|
|
592
643
|
# Send termination signal to process
|
|
593
644
|
try:
|
|
594
645
|
os.kill(os.getpid(), signal.SIGTERM)
|
|
595
646
|
except Exception as e:
|
|
596
647
|
self.logger.error(f"Failed to send termination signal: {e}")
|
|
597
648
|
return False
|
|
598
|
-
|
|
649
|
+
|
|
599
650
|
return True
|
|
600
|
-
|
|
651
|
+
|
|
601
652
|
except Exception as e:
|
|
602
653
|
self.logger.error(f"Emergency stop failed: {e}")
|
|
603
654
|
return False
|
|
604
|
-
|
|
655
|
+
|
|
605
656
|
def _update_recovery_stats(self, event: RecoveryEvent) -> None:
|
|
606
657
|
"""Update recovery statistics with new event."""
|
|
607
|
-
self.recovery_stats[
|
|
608
|
-
|
|
658
|
+
self.recovery_stats["total_recoveries"] += 1
|
|
659
|
+
|
|
609
660
|
if event.success:
|
|
610
|
-
self.recovery_stats[
|
|
661
|
+
self.recovery_stats["successful_recoveries"] += 1
|
|
611
662
|
else:
|
|
612
|
-
self.recovery_stats[
|
|
613
|
-
|
|
614
|
-
self.recovery_stats[
|
|
615
|
-
|
|
663
|
+
self.recovery_stats["failed_recoveries"] += 1
|
|
664
|
+
|
|
665
|
+
self.recovery_stats["actions_performed"][event.action.value] += 1
|
|
666
|
+
|
|
616
667
|
# Update average duration
|
|
617
|
-
total_recoveries = self.recovery_stats[
|
|
618
|
-
current_avg = self.recovery_stats[
|
|
619
|
-
self.recovery_stats[
|
|
620
|
-
|
|
621
|
-
)
|
|
622
|
-
|
|
668
|
+
total_recoveries = self.recovery_stats["total_recoveries"]
|
|
669
|
+
current_avg = self.recovery_stats["average_recovery_duration_ms"]
|
|
670
|
+
self.recovery_stats["average_recovery_duration_ms"] = (
|
|
671
|
+
current_avg * (total_recoveries - 1) + event.duration_ms
|
|
672
|
+
) / total_recoveries
|
|
673
|
+
|
|
623
674
|
def get_recovery_status(self) -> Dict[str, Any]:
|
|
624
675
|
"""Get comprehensive recovery manager status."""
|
|
625
676
|
return {
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
677
|
+
"enabled": self.enabled,
|
|
678
|
+
"recovery_in_progress": self.recovery_in_progress,
|
|
679
|
+
"last_recovery_time": self.last_recovery_time,
|
|
680
|
+
"recovery_count": self.recovery_count,
|
|
681
|
+
"strategy": self.recovery_strategy.get_name(),
|
|
682
|
+
"circuit_breaker": self.circuit_breaker.get_status(),
|
|
683
|
+
"recovery_stats": dict(self.recovery_stats),
|
|
684
|
+
"recent_recoveries": [
|
|
685
|
+
event.to_dict() for event in list(self.recovery_history)[-10:]
|
|
686
|
+
],
|
|
687
|
+
"config": {
|
|
688
|
+
"check_interval": self.check_interval,
|
|
689
|
+
"max_recovery_attempts": self.max_recovery_attempts,
|
|
690
|
+
"recovery_timeout": self.recovery_timeout,
|
|
691
|
+
},
|
|
639
692
|
}
|
|
640
|
-
|
|
693
|
+
|
|
641
694
|
def get_recovery_history(self, limit: Optional[int] = None) -> List[RecoveryEvent]:
|
|
642
695
|
"""Get recovery event history.
|
|
643
|
-
|
|
696
|
+
|
|
644
697
|
Args:
|
|
645
698
|
limit: Maximum number of events to return
|
|
646
|
-
|
|
699
|
+
|
|
647
700
|
Returns:
|
|
648
701
|
List of recovery events, newest first
|
|
649
702
|
"""
|
|
650
703
|
history = list(self.recovery_history)
|
|
651
704
|
history.reverse() # Newest first
|
|
652
|
-
|
|
705
|
+
|
|
653
706
|
if limit:
|
|
654
707
|
history = history[:limit]
|
|
655
|
-
|
|
708
|
+
|
|
656
709
|
return history
|
|
657
|
-
|
|
710
|
+
|
|
658
711
|
def is_enabled(self) -> bool:
|
|
659
712
|
"""Check if recovery manager is enabled."""
|
|
660
713
|
return self.enabled
|
|
661
|
-
|
|
714
|
+
|
|
662
715
|
def enable(self) -> None:
|
|
663
716
|
"""Enable recovery manager."""
|
|
664
717
|
self.enabled = True
|
|
665
718
|
self.logger.info("Recovery manager enabled")
|
|
666
|
-
|
|
719
|
+
|
|
667
720
|
def disable(self) -> None:
|
|
668
721
|
"""Disable recovery manager."""
|
|
669
722
|
self.enabled = False
|
|
670
|
-
self.logger.info("Recovery manager disabled")
|
|
723
|
+
self.logger.info("Recovery manager disabled")
|