claude-mpm 3.4.10__py3-none-any.whl → 5.4.55__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_OUTPUT_STYLE.md +290 -0
- claude_mpm/agents/CLAUDE_MPM_TEACHER_OUTPUT_STYLE.md +2002 -0
- claude_mpm/agents/MEMORY.md +72 -0
- claude_mpm/agents/PM_INSTRUCTIONS.md +1402 -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 +90 -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 +2503 -168
- claude_mpm/cli/commands/agents_cleanup.py +210 -0
- claude_mpm/cli/commands/agents_discover.py +338 -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 +2654 -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 +1246 -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 +297 -0
- claude_mpm/cli/helpers.py +105 -0
- claude_mpm/cli/interactive/__init__.py +21 -0
- claude_mpm/cli/interactive/agent_wizard.py +1947 -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 +644 -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 +1743 -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 +132 -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 +483 -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 +570 -0
- claude_mpm/core/unified_paths.py +941 -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/__pycache__/__init__.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/correlation_manager.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/event_handlers.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/hook_handler.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/installer.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/memory_integration.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/response_tracking.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/tool_analysis.cpython-311.pyc +0 -0
- 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/__pycache__/__init__.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager_http.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/duplicate_detector.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/state_manager.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/subagent_processor.cpython-311.pyc +0 -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 +1369 -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_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/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 +1202 -0
- claude_mpm/services/agents/startup_sync.py +259 -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 +707 -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 +1324 -0
- claude_mpm/services/skills/selective_skill_deployer.py +744 -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/database-migration.md +199 -0
- claude_mpm/skills/bundled/docker-containerization.md +194 -0
- claude_mpm/skills/bundled/express-local-dev.md +1429 -0
- claude_mpm/skills/bundled/fastapi-local-dev.md +1199 -0
- claude_mpm/skills/bundled/git-workflow.md +414 -0
- claude_mpm/skills/bundled/imagemagick.md +204 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/scripts/validate_env.py +576 -0
- claude_mpm/skills/bundled/json-data-handling.md +223 -0
- claude_mpm/skills/bundled/main/mcp-builder/scripts/connections.py +157 -0
- claude_mpm/skills/bundled/main/mcp-builder/scripts/evaluation.py +425 -0
- claude_mpm/skills/bundled/main/skill-creator/scripts/init_skill.py +303 -0
- claude_mpm/skills/bundled/main/skill-creator/scripts/package_skill.py +113 -0
- claude_mpm/skills/bundled/main/skill-creator/scripts/quick_validate.py +72 -0
- claude_mpm/skills/bundled/nextjs-local-dev.md +807 -0
- claude_mpm/skills/bundled/pdf.md +141 -0
- claude_mpm/skills/bundled/performance-profiling.md +573 -0
- claude_mpm/skills/bundled/refactoring-patterns.md +180 -0
- claude_mpm/skills/bundled/security-scanning.md +439 -0
- claude_mpm/skills/bundled/systematic-debugging.md +473 -0
- claude_mpm/skills/bundled/test-driven-development.md +378 -0
- claude_mpm/skills/bundled/testing/webapp-testing/examples/console_logging.py +35 -0
- claude_mpm/skills/bundled/testing/webapp-testing/examples/element_discovery.py +44 -0
- claude_mpm/skills/bundled/testing/webapp-testing/examples/static_html_automation.py +34 -0
- claude_mpm/skills/bundled/testing/webapp-testing/scripts/with_server.py +129 -0
- claude_mpm/skills/bundled/vite-local-dev.md +1061 -0
- claude_mpm/skills/bundled/web-performance-optimization.md +2305 -0
- claude_mpm/skills/bundled/xlsx.md +157 -0
- claude_mpm/skills/registry.py +286 -0
- claude_mpm/skills/skill_manager.py +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 +1090 -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 +823 -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.55.dist-info/METADATA +999 -0
- claude_mpm-5.4.55.dist-info/RECORD +868 -0
- {claude_mpm-3.4.10.dist-info → claude_mpm-5.4.55.dist-info}/entry_points.txt +1 -3
- claude_mpm-5.4.55.dist-info/licenses/LICENSE +94 -0
- claude_mpm-5.4.55.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.55.dist-info}/WHEEL +0 -0
- {claude_mpm-3.4.10.dist-info → claude_mpm-5.4.55.dist-info}/top_level.txt +0 -0
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
from pathlib import Path
|
|
2
|
+
|
|
1
3
|
"""Enhanced error classes for daemon conflict and process management in claude-mpm Socket.IO server.
|
|
2
4
|
|
|
3
5
|
These error classes provide detailed context and actionable guidance for users to resolve
|
|
@@ -11,25 +13,27 @@ Design Principles:
|
|
|
11
13
|
5. Structured error data for programmatic handling
|
|
12
14
|
"""
|
|
13
15
|
|
|
14
|
-
import os
|
|
15
|
-
import sys
|
|
16
|
-
import time
|
|
17
16
|
import platform
|
|
18
|
-
|
|
19
|
-
from
|
|
20
|
-
from
|
|
17
|
+
import time
|
|
18
|
+
from datetime import datetime, timezone
|
|
19
|
+
from typing import Any, Dict, List, Optional
|
|
21
20
|
|
|
22
21
|
|
|
23
22
|
class SocketIOServerError(Exception):
|
|
24
23
|
"""Base exception for Socket.IO server errors.
|
|
25
|
-
|
|
24
|
+
|
|
26
25
|
Provides common functionality for all server-related errors including
|
|
27
26
|
structured error data and detailed context information.
|
|
28
27
|
"""
|
|
29
|
-
|
|
30
|
-
def __init__(
|
|
28
|
+
|
|
29
|
+
def __init__(
|
|
30
|
+
self,
|
|
31
|
+
message: str,
|
|
32
|
+
error_code: Optional[str] = None,
|
|
33
|
+
context: Optional[Dict[str, Any]] = None,
|
|
34
|
+
):
|
|
31
35
|
"""Initialize base server error.
|
|
32
|
-
|
|
36
|
+
|
|
33
37
|
Args:
|
|
34
38
|
message: Human-readable error message
|
|
35
39
|
error_code: Machine-readable error code for programmatic handling
|
|
@@ -39,8 +43,8 @@ class SocketIOServerError(Exception):
|
|
|
39
43
|
self.message = message
|
|
40
44
|
self.error_code = error_code or self.__class__.__name__.lower()
|
|
41
45
|
self.context = context or {}
|
|
42
|
-
self.timestamp = datetime.
|
|
43
|
-
|
|
46
|
+
self.timestamp = datetime.now(timezone.utc).isoformat() + "Z"
|
|
47
|
+
|
|
44
48
|
def to_dict(self) -> Dict[str, Any]:
|
|
45
49
|
"""Convert error to dictionary format for structured logging/handling."""
|
|
46
50
|
return {
|
|
@@ -48,25 +52,27 @@ class SocketIOServerError(Exception):
|
|
|
48
52
|
"error_code": self.error_code,
|
|
49
53
|
"message": self.message,
|
|
50
54
|
"context": self.context,
|
|
51
|
-
"timestamp": self.timestamp
|
|
55
|
+
"timestamp": self.timestamp,
|
|
52
56
|
}
|
|
53
57
|
|
|
54
58
|
|
|
55
59
|
class DaemonConflictError(SocketIOServerError):
|
|
56
60
|
"""Error raised when attempting to start server while another instance is already running.
|
|
57
|
-
|
|
61
|
+
|
|
58
62
|
This error provides detailed information about the conflicting process and
|
|
59
63
|
actionable steps to resolve the conflict.
|
|
60
64
|
"""
|
|
61
|
-
|
|
62
|
-
def __init__(
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
65
|
+
|
|
66
|
+
def __init__(
|
|
67
|
+
self,
|
|
68
|
+
port: int,
|
|
69
|
+
existing_pid: int,
|
|
70
|
+
existing_server_id: Optional[str] = None,
|
|
71
|
+
process_info: Optional[Dict[str, Any]] = None,
|
|
72
|
+
pidfile_path: Optional[Path] = None,
|
|
73
|
+
):
|
|
68
74
|
"""Initialize daemon conflict error with detailed context.
|
|
69
|
-
|
|
75
|
+
|
|
70
76
|
Args:
|
|
71
77
|
port: Port number where conflict occurred
|
|
72
78
|
existing_pid: PID of the existing server process
|
|
@@ -79,70 +85,78 @@ class DaemonConflictError(SocketIOServerError):
|
|
|
79
85
|
self.existing_server_id = existing_server_id or "unknown"
|
|
80
86
|
self.process_info = process_info or {}
|
|
81
87
|
self.pidfile_path = pidfile_path
|
|
82
|
-
|
|
88
|
+
|
|
83
89
|
# Build detailed error message with resolution steps
|
|
84
90
|
message = self._build_error_message()
|
|
85
|
-
|
|
91
|
+
|
|
86
92
|
context = {
|
|
87
93
|
"port": port,
|
|
88
94
|
"existing_pid": existing_pid,
|
|
89
95
|
"existing_server_id": self.existing_server_id,
|
|
90
96
|
"process_info": process_info,
|
|
91
97
|
"pidfile_path": str(pidfile_path) if pidfile_path else None,
|
|
92
|
-
"resolution_steps": self._get_resolution_steps()
|
|
98
|
+
"resolution_steps": self._get_resolution_steps(),
|
|
93
99
|
}
|
|
94
|
-
|
|
100
|
+
|
|
95
101
|
super().__init__(message, "daemon_conflict", context)
|
|
96
|
-
|
|
102
|
+
|
|
97
103
|
def _build_error_message(self) -> str:
|
|
98
104
|
"""Build comprehensive error message with process details."""
|
|
99
105
|
lines = [
|
|
100
106
|
f"🚫 Socket.IO server conflict detected on port {self.port}",
|
|
101
|
-
|
|
102
|
-
|
|
107
|
+
"",
|
|
108
|
+
"CONFLICT DETAILS:",
|
|
103
109
|
f" • Existing PID: {self.existing_pid}",
|
|
104
110
|
f" • Server ID: {self.existing_server_id}",
|
|
105
111
|
]
|
|
106
|
-
|
|
112
|
+
|
|
107
113
|
# Add process information if available
|
|
108
114
|
if self.process_info:
|
|
109
|
-
status = self.process_info.get(
|
|
110
|
-
name = self.process_info.get(
|
|
111
|
-
create_time = self.process_info.get(
|
|
112
|
-
memory_info = self.process_info.get(
|
|
113
|
-
|
|
114
|
-
lines.extend(
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
115
|
+
status = self.process_info.get("status", "unknown")
|
|
116
|
+
name = self.process_info.get("name", "unknown")
|
|
117
|
+
create_time = self.process_info.get("create_time")
|
|
118
|
+
memory_info = self.process_info.get("memory_info", {})
|
|
119
|
+
|
|
120
|
+
lines.extend(
|
|
121
|
+
[
|
|
122
|
+
f" • Process Status: {status}",
|
|
123
|
+
f" • Process Name: {name}",
|
|
124
|
+
]
|
|
125
|
+
)
|
|
126
|
+
|
|
119
127
|
if create_time:
|
|
120
|
-
start_time = datetime.fromtimestamp(
|
|
128
|
+
start_time = datetime.fromtimestamp(
|
|
129
|
+
create_time, tz=timezone.utc
|
|
130
|
+
).strftime("%Y-%m-%d %H:%M:%S")
|
|
121
131
|
uptime = time.time() - create_time
|
|
122
132
|
lines.append(f" • Started: {start_time} (uptime: {uptime:.0f}s)")
|
|
123
|
-
|
|
124
|
-
if memory_info.get(
|
|
125
|
-
memory_mb = memory_info[
|
|
133
|
+
|
|
134
|
+
if memory_info.get("rss"):
|
|
135
|
+
memory_mb = memory_info["rss"] / (1024 * 1024)
|
|
126
136
|
lines.append(f" • Memory Usage: {memory_mb:.1f} MB")
|
|
127
|
-
|
|
137
|
+
|
|
128
138
|
# Add PID file information
|
|
129
139
|
if self.pidfile_path:
|
|
130
|
-
lines.extend(
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
+
lines.extend(
|
|
141
|
+
[
|
|
142
|
+
f" • PID File: {self.pidfile_path}",
|
|
143
|
+
f" • File Exists: {self.pidfile_path.exists() if isinstance(self.pidfile_path, Path) else 'unknown'}",
|
|
144
|
+
]
|
|
145
|
+
)
|
|
146
|
+
|
|
147
|
+
lines.extend(
|
|
148
|
+
[
|
|
149
|
+
"",
|
|
150
|
+
"RESOLUTION STEPS:",
|
|
151
|
+
]
|
|
152
|
+
)
|
|
153
|
+
|
|
140
154
|
# Add resolution steps
|
|
141
155
|
for i, step in enumerate(self._get_resolution_steps(), 1):
|
|
142
156
|
lines.append(f" {i}. {step}")
|
|
143
|
-
|
|
157
|
+
|
|
144
158
|
return "\n".join(lines)
|
|
145
|
-
|
|
159
|
+
|
|
146
160
|
def _get_resolution_steps(self) -> List[str]:
|
|
147
161
|
"""Get ordered list of resolution steps."""
|
|
148
162
|
steps = [
|
|
@@ -150,137 +164,150 @@ class DaemonConflictError(SocketIOServerError):
|
|
|
150
164
|
f"Stop the existing server gracefully: kill -TERM {self.existing_pid}",
|
|
151
165
|
f"If graceful shutdown fails: kill -KILL {self.existing_pid}",
|
|
152
166
|
]
|
|
153
|
-
|
|
167
|
+
|
|
154
168
|
if self.pidfile_path:
|
|
155
169
|
steps.append(f"Remove stale PID file if needed: rm {self.pidfile_path}")
|
|
156
|
-
|
|
157
|
-
steps.extend(
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
170
|
+
|
|
171
|
+
steps.extend(
|
|
172
|
+
[
|
|
173
|
+
"Wait a few seconds for port cleanup",
|
|
174
|
+
f"Try starting the server again on port {self.port}",
|
|
175
|
+
"Alternative: Use a different port with --port <new_port>",
|
|
176
|
+
]
|
|
177
|
+
)
|
|
178
|
+
|
|
163
179
|
return steps
|
|
164
180
|
|
|
165
181
|
|
|
166
182
|
class PortConflictError(SocketIOServerError):
|
|
167
183
|
"""Error raised when network port is already in use by another process.
|
|
168
|
-
|
|
184
|
+
|
|
169
185
|
This error helps identify what process is using the port and provides
|
|
170
186
|
steps to resolve the conflict.
|
|
171
187
|
"""
|
|
172
|
-
|
|
173
|
-
def __init__(
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
188
|
+
|
|
189
|
+
def __init__(
|
|
190
|
+
self,
|
|
191
|
+
port: int,
|
|
192
|
+
host: str = "localhost",
|
|
193
|
+
conflicting_process: Optional[Dict[str, Any]] = None,
|
|
194
|
+
):
|
|
177
195
|
"""Initialize port conflict error.
|
|
178
|
-
|
|
196
|
+
|
|
179
197
|
Args:
|
|
180
198
|
port: Port number that's in use
|
|
181
|
-
host: Host address where the conflict occurred
|
|
199
|
+
host: Host address where the conflict occurred
|
|
182
200
|
conflicting_process: Information about the process using the port
|
|
183
201
|
"""
|
|
184
202
|
self.port = port
|
|
185
203
|
self.host = host
|
|
186
204
|
self.conflicting_process = conflicting_process or {}
|
|
187
|
-
|
|
205
|
+
|
|
188
206
|
message = self._build_error_message()
|
|
189
|
-
|
|
207
|
+
|
|
190
208
|
context = {
|
|
191
209
|
"port": port,
|
|
192
210
|
"host": host,
|
|
193
211
|
"conflicting_process": conflicting_process,
|
|
194
|
-
"resolution_steps": self._get_resolution_steps()
|
|
212
|
+
"resolution_steps": self._get_resolution_steps(),
|
|
195
213
|
}
|
|
196
|
-
|
|
214
|
+
|
|
197
215
|
super().__init__(message, "port_conflict", context)
|
|
198
|
-
|
|
216
|
+
|
|
199
217
|
def _build_error_message(self) -> str:
|
|
200
218
|
"""Build error message with port conflict details."""
|
|
201
219
|
lines = [
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
220
|
+
"🔌 Network port conflict detected",
|
|
221
|
+
"",
|
|
222
|
+
"PORT CONFLICT DETAILS:",
|
|
205
223
|
f" • Port: {self.port}",
|
|
206
224
|
f" • Host: {self.host}",
|
|
207
225
|
f" • Address: {self.host}:{self.port}",
|
|
208
226
|
]
|
|
209
|
-
|
|
227
|
+
|
|
210
228
|
# Add information about conflicting process if available
|
|
211
229
|
if self.conflicting_process:
|
|
212
|
-
pid = self.conflicting_process.get(
|
|
213
|
-
name = self.conflicting_process.get(
|
|
214
|
-
cmdline = self.conflicting_process.get(
|
|
215
|
-
|
|
216
|
-
lines.extend(
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
230
|
+
pid = self.conflicting_process.get("pid")
|
|
231
|
+
name = self.conflicting_process.get("name", "unknown")
|
|
232
|
+
cmdline = self.conflicting_process.get("cmdline", [])
|
|
233
|
+
|
|
234
|
+
lines.extend(
|
|
235
|
+
[
|
|
236
|
+
"",
|
|
237
|
+
"CONFLICTING PROCESS:",
|
|
238
|
+
f" • PID: {pid or 'unknown'}",
|
|
239
|
+
f" • Name: {name}",
|
|
240
|
+
]
|
|
241
|
+
)
|
|
242
|
+
|
|
223
243
|
if cmdline:
|
|
224
244
|
lines.append(f" • Command: {' '.join(cmdline)}")
|
|
225
|
-
|
|
226
|
-
lines.extend(
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
245
|
+
|
|
246
|
+
lines.extend(
|
|
247
|
+
[
|
|
248
|
+
"",
|
|
249
|
+
"RESOLUTION STEPS:",
|
|
250
|
+
]
|
|
251
|
+
)
|
|
252
|
+
|
|
231
253
|
for i, step in enumerate(self._get_resolution_steps(), 1):
|
|
232
254
|
lines.append(f" {i}. {step}")
|
|
233
|
-
|
|
255
|
+
|
|
234
256
|
return "\n".join(lines)
|
|
235
|
-
|
|
257
|
+
|
|
236
258
|
def _get_resolution_steps(self) -> List[str]:
|
|
237
259
|
"""Get resolution steps for port conflicts."""
|
|
238
|
-
steps = [
|
|
239
|
-
|
|
240
|
-
]
|
|
241
|
-
|
|
260
|
+
steps = [f"Check what process is using port {self.port}:"]
|
|
261
|
+
|
|
242
262
|
# Add platform-specific commands
|
|
243
263
|
if platform.system() == "Darwin": # macOS
|
|
244
|
-
steps.extend(
|
|
245
|
-
f" • lsof -i :{self.port}",
|
|
246
|
-
|
|
247
|
-
])
|
|
264
|
+
steps.extend(
|
|
265
|
+
[f" • lsof -i :{self.port}", f" • netstat -an | grep {self.port}"]
|
|
266
|
+
)
|
|
248
267
|
elif platform.system() == "Linux":
|
|
249
|
-
steps.extend(
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
268
|
+
steps.extend(
|
|
269
|
+
[
|
|
270
|
+
f" • lsof -i :{self.port}",
|
|
271
|
+
f" • netstat -tulpn | grep {self.port}",
|
|
272
|
+
f" • ss -tulpn | grep {self.port}",
|
|
273
|
+
]
|
|
274
|
+
)
|
|
254
275
|
elif platform.system() == "Windows":
|
|
255
|
-
steps.extend(
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
276
|
+
steps.extend(
|
|
277
|
+
[
|
|
278
|
+
f" • netstat -ano | findstr {self.port}",
|
|
279
|
+
' • tasklist /fi "PID eq <PID_FROM_NETSTAT>"',
|
|
280
|
+
]
|
|
281
|
+
)
|
|
282
|
+
|
|
283
|
+
steps.extend(
|
|
284
|
+
[
|
|
285
|
+
"Stop the conflicting process if it's safe to do so",
|
|
286
|
+
"Wait for port cleanup (may take 30-60 seconds)",
|
|
287
|
+
"Try again with the same port",
|
|
288
|
+
f"Alternative: Use a different port: --port {self.port + 1}",
|
|
289
|
+
]
|
|
290
|
+
)
|
|
291
|
+
|
|
267
292
|
return steps
|
|
268
293
|
|
|
269
294
|
|
|
270
295
|
class StaleProcessError(SocketIOServerError):
|
|
271
296
|
"""Error raised when dealing with stale processes or PID files.
|
|
272
|
-
|
|
297
|
+
|
|
273
298
|
This error occurs when a PID file exists but the associated process
|
|
274
299
|
is no longer running, is a zombie, or has been replaced.
|
|
275
300
|
"""
|
|
276
|
-
|
|
277
|
-
def __init__(
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
301
|
+
|
|
302
|
+
def __init__(
|
|
303
|
+
self,
|
|
304
|
+
pid: int,
|
|
305
|
+
pidfile_path: Optional[Path] = None,
|
|
306
|
+
process_status: str = "not_found",
|
|
307
|
+
validation_errors: Optional[List[str]] = None,
|
|
308
|
+
):
|
|
282
309
|
"""Initialize stale process error.
|
|
283
|
-
|
|
310
|
+
|
|
284
311
|
Args:
|
|
285
312
|
pid: Process ID that's stale
|
|
286
313
|
pidfile_path: Path to the stale PID file
|
|
@@ -291,19 +318,19 @@ class StaleProcessError(SocketIOServerError):
|
|
|
291
318
|
self.pidfile_path = pidfile_path
|
|
292
319
|
self.process_status = process_status
|
|
293
320
|
self.validation_errors = validation_errors or []
|
|
294
|
-
|
|
321
|
+
|
|
295
322
|
message = self._build_error_message()
|
|
296
|
-
|
|
323
|
+
|
|
297
324
|
context = {
|
|
298
325
|
"pid": pid,
|
|
299
326
|
"pidfile_path": str(pidfile_path) if pidfile_path else None,
|
|
300
327
|
"process_status": process_status,
|
|
301
328
|
"validation_errors": validation_errors,
|
|
302
|
-
"resolution_steps": self._get_resolution_steps()
|
|
329
|
+
"resolution_steps": self._get_resolution_steps(),
|
|
303
330
|
}
|
|
304
|
-
|
|
331
|
+
|
|
305
332
|
super().__init__(message, "stale_process", context)
|
|
306
|
-
|
|
333
|
+
|
|
307
334
|
def _build_error_message(self) -> str:
|
|
308
335
|
"""Build error message for stale process."""
|
|
309
336
|
status_descriptions = {
|
|
@@ -311,91 +338,105 @@ class StaleProcessError(SocketIOServerError):
|
|
|
311
338
|
"zombie": "Process is a zombie (terminated but not reaped)",
|
|
312
339
|
"invalid": "Process exists but is not the expected server",
|
|
313
340
|
"access_denied": "Cannot access process information",
|
|
314
|
-
"stale_pidfile": "PID file is stale or corrupted"
|
|
341
|
+
"stale_pidfile": "PID file is stale or corrupted",
|
|
315
342
|
}
|
|
316
|
-
|
|
317
|
-
status_desc = status_descriptions.get(
|
|
318
|
-
|
|
343
|
+
|
|
344
|
+
status_desc = status_descriptions.get(
|
|
345
|
+
self.process_status, f"Process status: {self.process_status}"
|
|
346
|
+
)
|
|
347
|
+
|
|
319
348
|
lines = [
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
349
|
+
"🧟 Stale process detected",
|
|
350
|
+
"",
|
|
351
|
+
"PROCESS DETAILS:",
|
|
323
352
|
f" • PID: {self.pid}",
|
|
324
353
|
f" • Status: {status_desc}",
|
|
325
354
|
]
|
|
326
|
-
|
|
355
|
+
|
|
327
356
|
if self.pidfile_path:
|
|
328
|
-
lines.extend(
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
357
|
+
lines.extend(
|
|
358
|
+
[
|
|
359
|
+
f" • PID File: {self.pidfile_path}",
|
|
360
|
+
f" • File Exists: {self.pidfile_path.exists() if isinstance(self.pidfile_path, Path) else 'unknown'}",
|
|
361
|
+
]
|
|
362
|
+
)
|
|
363
|
+
|
|
333
364
|
if self.validation_errors:
|
|
334
|
-
lines.extend(
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
365
|
+
lines.extend(
|
|
366
|
+
[
|
|
367
|
+
"",
|
|
368
|
+
"VALIDATION ERRORS:",
|
|
369
|
+
]
|
|
370
|
+
)
|
|
338
371
|
for error in self.validation_errors:
|
|
339
372
|
lines.append(f" • {error}")
|
|
340
|
-
|
|
341
|
-
lines.extend(
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
373
|
+
|
|
374
|
+
lines.extend(
|
|
375
|
+
[
|
|
376
|
+
"",
|
|
377
|
+
"RESOLUTION STEPS:",
|
|
378
|
+
]
|
|
379
|
+
)
|
|
380
|
+
|
|
346
381
|
for i, step in enumerate(self._get_resolution_steps(), 1):
|
|
347
382
|
lines.append(f" {i}. {step}")
|
|
348
|
-
|
|
383
|
+
|
|
349
384
|
return "\n".join(lines)
|
|
350
|
-
|
|
385
|
+
|
|
351
386
|
def _get_resolution_steps(self) -> List[str]:
|
|
352
387
|
"""Get resolution steps for stale processes."""
|
|
353
388
|
steps = []
|
|
354
|
-
|
|
389
|
+
|
|
355
390
|
if self.process_status == "zombie":
|
|
356
|
-
steps.extend(
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
391
|
+
steps.extend(
|
|
392
|
+
[
|
|
393
|
+
"Wait for parent process to reap zombie (usually automatic)",
|
|
394
|
+
f"If zombie persists, check parent process: ps -o ppid= -p {self.pid}",
|
|
395
|
+
"Restart parent process if necessary",
|
|
396
|
+
]
|
|
397
|
+
)
|
|
361
398
|
elif self.process_status == "not_found":
|
|
362
|
-
steps.extend([
|
|
363
|
-
f"Process {self.pid} no longer exists - safe to clean up"
|
|
364
|
-
])
|
|
399
|
+
steps.extend([f"Process {self.pid} no longer exists - safe to clean up"])
|
|
365
400
|
elif self.process_status == "invalid":
|
|
366
|
-
steps.extend(
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
401
|
+
steps.extend(
|
|
402
|
+
[
|
|
403
|
+
f"Verify process {self.pid} is not a legitimate server:",
|
|
404
|
+
f" • ps -p {self.pid} -o pid,ppid,cmd",
|
|
405
|
+
"If it's not your server, it's safe to clean up the PID file",
|
|
406
|
+
]
|
|
407
|
+
)
|
|
408
|
+
|
|
372
409
|
# Common cleanup steps
|
|
373
410
|
if self.pidfile_path:
|
|
374
411
|
steps.append(f"Remove stale PID file: rm {self.pidfile_path}")
|
|
375
|
-
|
|
376
|
-
steps.extend(
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
412
|
+
|
|
413
|
+
steps.extend(
|
|
414
|
+
[
|
|
415
|
+
"Try starting the server again",
|
|
416
|
+
"If issues persist, check for permission problems or disk space",
|
|
417
|
+
]
|
|
418
|
+
)
|
|
419
|
+
|
|
381
420
|
return steps
|
|
382
421
|
|
|
383
422
|
|
|
384
423
|
class RecoveryFailedError(SocketIOServerError):
|
|
385
424
|
"""Error raised when automatic recovery mechanisms fail.
|
|
386
|
-
|
|
425
|
+
|
|
387
426
|
This error occurs when the health monitoring and recovery system
|
|
388
427
|
cannot automatically resolve server issues.
|
|
389
428
|
"""
|
|
390
|
-
|
|
391
|
-
def __init__(
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
429
|
+
|
|
430
|
+
def __init__(
|
|
431
|
+
self,
|
|
432
|
+
recovery_action: str,
|
|
433
|
+
failure_reason: str,
|
|
434
|
+
attempt_count: int = 1,
|
|
435
|
+
health_status: Optional[Dict[str, Any]] = None,
|
|
436
|
+
last_successful_recovery: Optional[str] = None,
|
|
437
|
+
):
|
|
397
438
|
"""Initialize recovery failure error.
|
|
398
|
-
|
|
439
|
+
|
|
399
440
|
Args:
|
|
400
441
|
recovery_action: The recovery action that failed (e.g., 'restart', 'cleanup')
|
|
401
442
|
failure_reason: Why the recovery failed
|
|
@@ -408,56 +449,68 @@ class RecoveryFailedError(SocketIOServerError):
|
|
|
408
449
|
self.attempt_count = attempt_count
|
|
409
450
|
self.health_status = health_status or {}
|
|
410
451
|
self.last_successful_recovery = last_successful_recovery
|
|
411
|
-
|
|
452
|
+
|
|
412
453
|
message = self._build_error_message()
|
|
413
|
-
|
|
454
|
+
|
|
414
455
|
context = {
|
|
415
456
|
"recovery_action": recovery_action,
|
|
416
457
|
"failure_reason": failure_reason,
|
|
417
458
|
"attempt_count": attempt_count,
|
|
418
459
|
"health_status": health_status,
|
|
419
460
|
"last_successful_recovery": last_successful_recovery,
|
|
420
|
-
"resolution_steps": self._get_resolution_steps()
|
|
461
|
+
"resolution_steps": self._get_resolution_steps(),
|
|
421
462
|
}
|
|
422
|
-
|
|
463
|
+
|
|
423
464
|
super().__init__(message, "recovery_failed", context)
|
|
424
|
-
|
|
465
|
+
|
|
425
466
|
def _build_error_message(self) -> str:
|
|
426
467
|
"""Build error message for recovery failure."""
|
|
427
468
|
lines = [
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
469
|
+
"🚨 Automatic recovery failed",
|
|
470
|
+
"",
|
|
471
|
+
"RECOVERY DETAILS:",
|
|
431
472
|
f" • Failed Action: {self.recovery_action}",
|
|
432
473
|
f" • Failure Reason: {self.failure_reason}",
|
|
433
474
|
f" • Attempt Count: {self.attempt_count}",
|
|
434
475
|
]
|
|
435
|
-
|
|
476
|
+
|
|
436
477
|
if self.last_successful_recovery:
|
|
437
|
-
lines.append(
|
|
438
|
-
|
|
478
|
+
lines.append(
|
|
479
|
+
f" • Last Successful Recovery: {self.last_successful_recovery}"
|
|
480
|
+
)
|
|
481
|
+
|
|
439
482
|
# Add health status information
|
|
440
483
|
if self.health_status:
|
|
441
|
-
lines.extend(
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
484
|
+
lines.extend(
|
|
485
|
+
[
|
|
486
|
+
"",
|
|
487
|
+
"CURRENT HEALTH STATUS:",
|
|
488
|
+
]
|
|
489
|
+
)
|
|
490
|
+
|
|
446
491
|
# Common health metrics
|
|
447
492
|
for key, value in self.health_status.items():
|
|
448
|
-
if key in [
|
|
493
|
+
if key in [
|
|
494
|
+
"status",
|
|
495
|
+
"uptime",
|
|
496
|
+
"clients_connected",
|
|
497
|
+
"events_processed",
|
|
498
|
+
"errors",
|
|
499
|
+
]:
|
|
449
500
|
lines.append(f" • {key.replace('_', ' ').title()}: {value}")
|
|
450
|
-
|
|
451
|
-
lines.extend(
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
501
|
+
|
|
502
|
+
lines.extend(
|
|
503
|
+
[
|
|
504
|
+
"",
|
|
505
|
+
"MANUAL RESOLUTION REQUIRED:",
|
|
506
|
+
]
|
|
507
|
+
)
|
|
508
|
+
|
|
456
509
|
for i, step in enumerate(self._get_resolution_steps(), 1):
|
|
457
510
|
lines.append(f" {i}. {step}")
|
|
458
|
-
|
|
511
|
+
|
|
459
512
|
return "\n".join(lines)
|
|
460
|
-
|
|
513
|
+
|
|
461
514
|
def _get_resolution_steps(self) -> List[str]:
|
|
462
515
|
"""Get manual resolution steps for recovery failures."""
|
|
463
516
|
steps = [
|
|
@@ -465,51 +518,61 @@ class RecoveryFailedError(SocketIOServerError):
|
|
|
465
518
|
"Verify system resources (CPU, memory, disk space)",
|
|
466
519
|
"Check network connectivity and port availability",
|
|
467
520
|
]
|
|
468
|
-
|
|
521
|
+
|
|
469
522
|
if self.recovery_action == "restart":
|
|
470
|
-
steps.extend(
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
523
|
+
steps.extend(
|
|
524
|
+
[
|
|
525
|
+
"Manually stop the server process",
|
|
526
|
+
"Wait for complete shutdown (check process list)",
|
|
527
|
+
"Remove any stale PID files",
|
|
528
|
+
"Restart the server manually",
|
|
529
|
+
]
|
|
530
|
+
)
|
|
476
531
|
elif self.recovery_action == "cleanup":
|
|
477
|
-
steps.extend(
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
532
|
+
steps.extend(
|
|
533
|
+
[
|
|
534
|
+
"Manually identify and clean up stale resources",
|
|
535
|
+
"Check for zombie processes",
|
|
536
|
+
"Clear temporary files and logs if needed",
|
|
537
|
+
]
|
|
538
|
+
)
|
|
482
539
|
elif self.recovery_action == "port_reset":
|
|
483
|
-
steps.extend(
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
540
|
+
steps.extend(
|
|
541
|
+
[
|
|
542
|
+
"Check what's using the required port",
|
|
543
|
+
"Stop conflicting processes",
|
|
544
|
+
"Wait for port cleanup",
|
|
545
|
+
"Consider using a different port temporarily",
|
|
546
|
+
]
|
|
547
|
+
)
|
|
548
|
+
|
|
549
|
+
steps.extend(
|
|
550
|
+
[
|
|
551
|
+
"Review health monitoring configuration",
|
|
552
|
+
"Consider adjusting recovery thresholds if appropriate",
|
|
553
|
+
"Monitor server stability after manual intervention",
|
|
554
|
+
]
|
|
555
|
+
)
|
|
556
|
+
|
|
496
557
|
return steps
|
|
497
558
|
|
|
498
559
|
|
|
499
560
|
class HealthCheckError(SocketIOServerError):
|
|
500
561
|
"""Error raised when health monitoring detects critical issues.
|
|
501
|
-
|
|
562
|
+
|
|
502
563
|
This error provides detailed health status information and guidance
|
|
503
564
|
for addressing system health problems.
|
|
504
565
|
"""
|
|
505
|
-
|
|
506
|
-
def __init__(
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
566
|
+
|
|
567
|
+
def __init__(
|
|
568
|
+
self,
|
|
569
|
+
check_name: str,
|
|
570
|
+
check_status: str,
|
|
571
|
+
check_details: Optional[Dict[str, Any]] = None,
|
|
572
|
+
threshold_exceeded: Optional[Dict[str, Any]] = None,
|
|
573
|
+
):
|
|
511
574
|
"""Initialize health check error.
|
|
512
|
-
|
|
575
|
+
|
|
513
576
|
Args:
|
|
514
577
|
check_name: Name of the failed health check
|
|
515
578
|
check_status: Status of the health check (critical, warning, failed)
|
|
@@ -520,158 +583,175 @@ class HealthCheckError(SocketIOServerError):
|
|
|
520
583
|
self.check_status = check_status
|
|
521
584
|
self.check_details = check_details or {}
|
|
522
585
|
self.threshold_exceeded = threshold_exceeded or {}
|
|
523
|
-
|
|
586
|
+
|
|
524
587
|
message = self._build_error_message()
|
|
525
|
-
|
|
588
|
+
|
|
526
589
|
context = {
|
|
527
590
|
"check_name": check_name,
|
|
528
591
|
"check_status": check_status,
|
|
529
592
|
"check_details": check_details,
|
|
530
593
|
"threshold_exceeded": threshold_exceeded,
|
|
531
|
-
"resolution_steps": self._get_resolution_steps()
|
|
594
|
+
"resolution_steps": self._get_resolution_steps(),
|
|
532
595
|
}
|
|
533
|
-
|
|
596
|
+
|
|
534
597
|
super().__init__(message, "health_check_failed", context)
|
|
535
|
-
|
|
598
|
+
|
|
536
599
|
def _build_error_message(self) -> str:
|
|
537
600
|
"""Build error message for health check failure."""
|
|
538
|
-
status_emoji = {
|
|
539
|
-
|
|
540
|
-
"warning": "⚠️",
|
|
541
|
-
"failed": "❌"
|
|
542
|
-
}
|
|
543
|
-
|
|
601
|
+
status_emoji = {"critical": "🚨", "warning": "⚠️", "failed": "❌"}
|
|
602
|
+
|
|
544
603
|
emoji = status_emoji.get(self.check_status, "🔍")
|
|
545
|
-
|
|
604
|
+
|
|
546
605
|
lines = [
|
|
547
606
|
f"{emoji} Health check failed: {self.check_name}",
|
|
548
|
-
|
|
549
|
-
|
|
607
|
+
"",
|
|
608
|
+
"CHECK DETAILS:",
|
|
550
609
|
f" • Check: {self.check_name}",
|
|
551
610
|
f" • Status: {self.check_status.upper()}",
|
|
552
611
|
]
|
|
553
|
-
|
|
612
|
+
|
|
554
613
|
# Add check details
|
|
555
614
|
if self.check_details:
|
|
556
615
|
for key, value in self.check_details.items():
|
|
557
|
-
if key not in [
|
|
616
|
+
if key not in ["raw_data", "internal_state"]: # Skip internal data
|
|
558
617
|
lines.append(f" • {key.replace('_', ' ').title()}: {value}")
|
|
559
|
-
|
|
618
|
+
|
|
560
619
|
# Add threshold information
|
|
561
620
|
if self.threshold_exceeded:
|
|
562
|
-
lines.extend(
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
621
|
+
lines.extend(
|
|
622
|
+
[
|
|
623
|
+
"",
|
|
624
|
+
"THRESHOLDS EXCEEDED:",
|
|
625
|
+
]
|
|
626
|
+
)
|
|
566
627
|
for metric, info in self.threshold_exceeded.items():
|
|
567
|
-
current = info.get(
|
|
568
|
-
threshold = info.get(
|
|
569
|
-
lines.append(
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
628
|
+
current = info.get("current", "unknown")
|
|
629
|
+
threshold = info.get("threshold", "unknown")
|
|
630
|
+
lines.append(
|
|
631
|
+
f" • {metric.title()}: {current} (threshold: {threshold})"
|
|
632
|
+
)
|
|
633
|
+
|
|
634
|
+
lines.extend(
|
|
635
|
+
[
|
|
636
|
+
"",
|
|
637
|
+
"RECOMMENDED ACTIONS:",
|
|
638
|
+
]
|
|
639
|
+
)
|
|
640
|
+
|
|
576
641
|
for i, step in enumerate(self._get_resolution_steps(), 1):
|
|
577
642
|
lines.append(f" {i}. {step}")
|
|
578
|
-
|
|
643
|
+
|
|
579
644
|
return "\n".join(lines)
|
|
580
|
-
|
|
645
|
+
|
|
581
646
|
def _get_resolution_steps(self) -> List[str]:
|
|
582
647
|
"""Get resolution steps based on health check type."""
|
|
583
648
|
steps = []
|
|
584
|
-
|
|
649
|
+
|
|
585
650
|
if "cpu" in self.check_name.lower():
|
|
586
|
-
steps.extend(
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
651
|
+
steps.extend(
|
|
652
|
+
[
|
|
653
|
+
"Check for runaway processes consuming CPU",
|
|
654
|
+
"Consider adding rate limiting or request throttling",
|
|
655
|
+
"Monitor CPU usage patterns over time",
|
|
656
|
+
]
|
|
657
|
+
)
|
|
591
658
|
elif "memory" in self.check_name.lower():
|
|
592
|
-
steps.extend(
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
659
|
+
steps.extend(
|
|
660
|
+
[
|
|
661
|
+
"Check for memory leaks in the application",
|
|
662
|
+
"Monitor memory usage trends",
|
|
663
|
+
"Consider restarting if memory usage is excessive",
|
|
664
|
+
"Review event history size limits",
|
|
665
|
+
]
|
|
666
|
+
)
|
|
667
|
+
elif (
|
|
668
|
+
"network" in self.check_name.lower()
|
|
669
|
+
or "connectivity" in self.check_name.lower()
|
|
670
|
+
):
|
|
671
|
+
steps.extend(
|
|
672
|
+
[
|
|
673
|
+
"Check network connectivity to required services",
|
|
674
|
+
"Verify firewall settings and port accessibility",
|
|
675
|
+
"Test network latency and bandwidth",
|
|
676
|
+
]
|
|
677
|
+
)
|
|
604
678
|
elif "disk" in self.check_name.lower() or "file" in self.check_name.lower():
|
|
605
|
-
steps.extend(
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
679
|
+
steps.extend(
|
|
680
|
+
[
|
|
681
|
+
"Check available disk space",
|
|
682
|
+
"Clean up old log files and temporary data",
|
|
683
|
+
"Verify file permissions and access",
|
|
684
|
+
]
|
|
685
|
+
)
|
|
686
|
+
|
|
611
687
|
# General steps for all health check failures
|
|
612
|
-
steps.extend(
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
688
|
+
steps.extend(
|
|
689
|
+
[
|
|
690
|
+
"Review recent system changes or deployments",
|
|
691
|
+
"Check system logs for related errors",
|
|
692
|
+
"Consider adjusting health check thresholds if appropriate",
|
|
693
|
+
"Monitor the issue to identify patterns or trends",
|
|
694
|
+
]
|
|
695
|
+
)
|
|
696
|
+
|
|
619
697
|
return steps
|
|
620
698
|
|
|
621
699
|
|
|
622
700
|
def format_troubleshooting_guide(error: SocketIOServerError) -> str:
|
|
623
701
|
"""Format a comprehensive troubleshooting guide for any Socket.IO server error.
|
|
624
|
-
|
|
702
|
+
|
|
625
703
|
Args:
|
|
626
704
|
error: The error instance to create troubleshooting guide for
|
|
627
|
-
|
|
705
|
+
|
|
628
706
|
Returns:
|
|
629
707
|
Formatted troubleshooting guide as a string
|
|
630
708
|
"""
|
|
631
709
|
lines = [
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
710
|
+
"═══════════════════════════════════════════════════════════════",
|
|
711
|
+
"🔧 CLAUDE MPM SOCKET.IO SERVER TROUBLESHOOTING GUIDE",
|
|
712
|
+
"═══════════════════════════════════════════════════════════════",
|
|
713
|
+
"",
|
|
636
714
|
f"ERROR TYPE: {error.__class__.__name__}",
|
|
637
715
|
f"ERROR CODE: {error.error_code}",
|
|
638
716
|
f"TIMESTAMP: {error.timestamp}",
|
|
639
|
-
|
|
717
|
+
"",
|
|
640
718
|
str(error),
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
719
|
+
"",
|
|
720
|
+
"ADDITIONAL TROUBLESHOOTING:",
|
|
721
|
+
"",
|
|
722
|
+
"🔍 DIAGNOSTIC COMMANDS:",
|
|
723
|
+
" • Check running processes: ps aux | grep socketio",
|
|
646
724
|
f" • Check port usage: lsof -i :{error.context.get('port', 'PORT')}",
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
725
|
+
" • Check system resources: top or htop",
|
|
726
|
+
" • Check disk space: df -h",
|
|
727
|
+
" • Check logs: tail -f /path/to/claude-mpm.log",
|
|
728
|
+
"",
|
|
729
|
+
"🛠️ COMMON SOLUTIONS:",
|
|
730
|
+
" 1. Restart the Socket.IO server completely",
|
|
731
|
+
" 2. Clear any stale PID files",
|
|
732
|
+
" 3. Check for zombie processes and clean them up",
|
|
733
|
+
" 4. Verify network port availability",
|
|
734
|
+
" 5. Check system resource availability (CPU, memory, disk)",
|
|
735
|
+
" 6. Review server configuration and permissions",
|
|
736
|
+
"",
|
|
737
|
+
"📞 GETTING HELP:",
|
|
738
|
+
" • Check the claude-mpm documentation",
|
|
739
|
+
" • Review server logs for additional context",
|
|
740
|
+
" • Report persistent issues with this error information",
|
|
741
|
+
"",
|
|
742
|
+
"🔗 ERROR CONTEXT DATA:",
|
|
665
743
|
]
|
|
666
|
-
|
|
744
|
+
|
|
667
745
|
# Add structured context data
|
|
668
746
|
for key, value in error.context.items():
|
|
669
747
|
if key != "resolution_steps": # Skip resolution steps as they're already shown
|
|
670
748
|
lines.append(f" • {key}: {value}")
|
|
671
|
-
|
|
672
|
-
lines.extend(
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
749
|
+
|
|
750
|
+
lines.extend(
|
|
751
|
+
[
|
|
752
|
+
"",
|
|
753
|
+
"═══════════════════════════════════════════════════════════════",
|
|
754
|
+
]
|
|
755
|
+
)
|
|
756
|
+
|
|
757
|
+
return "\n".join(lines)
|