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
|
@@ -0,0 +1,839 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Startup logging utilities for MCP server and monitor setup status.
|
|
3
|
+
|
|
4
|
+
WHY: This module provides detailed startup logging for better debugging
|
|
5
|
+
visibility. It logs MCP server installation/configuration status and
|
|
6
|
+
monitor service initialization status during the startup sequence.
|
|
7
|
+
|
|
8
|
+
DESIGN DECISIONS:
|
|
9
|
+
- Use consistent INFO log format with existing startup messages
|
|
10
|
+
- Gracefully handle missing dependencies or services
|
|
11
|
+
- Provide informative but concise status messages
|
|
12
|
+
- Include helpful context for debugging
|
|
13
|
+
- Ensure logging works in all deployment contexts (dev, pipx, pip)
|
|
14
|
+
- Capture all startup logs to timestamped files for analysis
|
|
15
|
+
"""
|
|
16
|
+
|
|
17
|
+
import asyncio
|
|
18
|
+
import logging
|
|
19
|
+
import shutil
|
|
20
|
+
import subprocess
|
|
21
|
+
import sys
|
|
22
|
+
from datetime import datetime, timezone
|
|
23
|
+
from pathlib import Path
|
|
24
|
+
from typing import Any, Dict, Optional
|
|
25
|
+
|
|
26
|
+
try:
|
|
27
|
+
import psutil
|
|
28
|
+
|
|
29
|
+
PSUTIL_AVAILABLE = True
|
|
30
|
+
except ImportError:
|
|
31
|
+
PSUTIL_AVAILABLE = False
|
|
32
|
+
|
|
33
|
+
from ..core.logger import get_logger
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def log_memory_stats(logger=None, prefix="Memory Usage"):
|
|
37
|
+
"""
|
|
38
|
+
Log current memory statistics.
|
|
39
|
+
|
|
40
|
+
Args:
|
|
41
|
+
logger: Logger to use (defaults to 'cli' logger)
|
|
42
|
+
prefix: Prefix for the log message
|
|
43
|
+
|
|
44
|
+
Returns:
|
|
45
|
+
Dict with memory stats or None if psutil unavailable
|
|
46
|
+
"""
|
|
47
|
+
if not PSUTIL_AVAILABLE:
|
|
48
|
+
return None
|
|
49
|
+
|
|
50
|
+
if logger is None:
|
|
51
|
+
logger = get_logger("cli")
|
|
52
|
+
|
|
53
|
+
try:
|
|
54
|
+
process = psutil.Process()
|
|
55
|
+
memory_info = process.memory_info()
|
|
56
|
+
|
|
57
|
+
# Convert to MB for readability
|
|
58
|
+
rss_mb = memory_info.rss / (1024 * 1024)
|
|
59
|
+
vms_mb = memory_info.vms / (1024 * 1024)
|
|
60
|
+
|
|
61
|
+
# On macOS, VMS can report misleading values (400+ TB)
|
|
62
|
+
# Skip VMS reporting if it's unreasonably large
|
|
63
|
+
import platform
|
|
64
|
+
|
|
65
|
+
if platform.system() == "Darwin" and vms_mb > 100000: # > 100GB is suspicious
|
|
66
|
+
# Get percentage of system memory if available
|
|
67
|
+
try:
|
|
68
|
+
memory_percent = process.memory_percent()
|
|
69
|
+
logger.info(
|
|
70
|
+
f"{prefix}: RSS={rss_mb:.1f}MB, System={memory_percent:.1f}%"
|
|
71
|
+
)
|
|
72
|
+
return {"rss_mb": rss_mb, "vms_mb": None, "percent": memory_percent}
|
|
73
|
+
except Exception:
|
|
74
|
+
logger.info(f"{prefix}: RSS={rss_mb:.1f}MB")
|
|
75
|
+
return {"rss_mb": rss_mb, "vms_mb": None, "percent": None}
|
|
76
|
+
else:
|
|
77
|
+
# Normal VMS reporting for non-macOS or reasonable values
|
|
78
|
+
# Get percentage of system memory if available
|
|
79
|
+
try:
|
|
80
|
+
memory_percent = process.memory_percent()
|
|
81
|
+
logger.info(
|
|
82
|
+
f"{prefix}: RSS={rss_mb:.1f}MB, VMS={vms_mb:.1f}MB, "
|
|
83
|
+
f"System={memory_percent:.1f}%"
|
|
84
|
+
)
|
|
85
|
+
return {"rss_mb": rss_mb, "vms_mb": vms_mb, "percent": memory_percent}
|
|
86
|
+
except Exception:
|
|
87
|
+
logger.info(f"{prefix}: RSS={rss_mb:.1f}MB, VMS={vms_mb:.1f}MB")
|
|
88
|
+
return {"rss_mb": rss_mb, "vms_mb": vms_mb, "percent": None}
|
|
89
|
+
|
|
90
|
+
except Exception as e:
|
|
91
|
+
logger.debug(f"Failed to get memory info: {e}")
|
|
92
|
+
return None
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
class StartupStatusLogger:
|
|
96
|
+
"""Logs MCP server and monitor setup status during startup."""
|
|
97
|
+
|
|
98
|
+
def __init__(self, logger_name: str = "startup_status"):
|
|
99
|
+
"""Initialize the startup status logger."""
|
|
100
|
+
self.logger = get_logger(logger_name)
|
|
101
|
+
|
|
102
|
+
def log_mcp_server_status(self) -> None:
|
|
103
|
+
"""
|
|
104
|
+
Log MCP server installation and configuration status.
|
|
105
|
+
|
|
106
|
+
Checks:
|
|
107
|
+
- MCP server executable availability
|
|
108
|
+
- MCP server version if available
|
|
109
|
+
- MCP configuration in ~/.claude.json
|
|
110
|
+
- MCP-related errors or warnings
|
|
111
|
+
"""
|
|
112
|
+
try:
|
|
113
|
+
# Check if MCP server executable is available
|
|
114
|
+
mcp_executable = self._find_mcp_executable()
|
|
115
|
+
if mcp_executable:
|
|
116
|
+
self.logger.info(f"MCP Server: Installed at {mcp_executable}")
|
|
117
|
+
|
|
118
|
+
# Try to get version (only log if version is found)
|
|
119
|
+
version = self._get_mcp_version(mcp_executable)
|
|
120
|
+
if version:
|
|
121
|
+
self.logger.info(f"MCP Server: Version {version}")
|
|
122
|
+
else:
|
|
123
|
+
self.logger.info("MCP Server: Not found in PATH")
|
|
124
|
+
|
|
125
|
+
# Check MCP configuration in ~/.claude.json
|
|
126
|
+
config_status = self._check_mcp_configuration()
|
|
127
|
+
if config_status["found"]:
|
|
128
|
+
self.logger.info("MCP Server: Configuration found in ~/.claude.json")
|
|
129
|
+
if config_status["servers_count"] > 0:
|
|
130
|
+
self.logger.info(
|
|
131
|
+
f"MCP Server: {config_status['servers_count']} server(s) configured"
|
|
132
|
+
)
|
|
133
|
+
else:
|
|
134
|
+
self.logger.info("MCP Server: No servers configured")
|
|
135
|
+
self._log_mcp_setup_hint()
|
|
136
|
+
else:
|
|
137
|
+
self.logger.info("MCP Server: No configuration found in ~/.claude.json")
|
|
138
|
+
self._log_mcp_setup_hint()
|
|
139
|
+
|
|
140
|
+
# Check for claude-mpm MCP gateway status
|
|
141
|
+
gateway_status = self._check_mcp_gateway_status()
|
|
142
|
+
if gateway_status["configured"]:
|
|
143
|
+
self.logger.info("MCP Gateway: Claude MPM gateway configured")
|
|
144
|
+
else:
|
|
145
|
+
self.logger.info("MCP Gateway: Claude MPM gateway not configured")
|
|
146
|
+
# Check if this is a pipx installation that could benefit from auto-config
|
|
147
|
+
if (
|
|
148
|
+
self._is_pipx_installation()
|
|
149
|
+
and not self._has_auto_config_preference()
|
|
150
|
+
):
|
|
151
|
+
self.logger.info(
|
|
152
|
+
"MCP Gateway: Auto-configuration available for pipx users"
|
|
153
|
+
)
|
|
154
|
+
|
|
155
|
+
except Exception as e:
|
|
156
|
+
self.logger.warning(f"MCP Server: Status check failed - {e}")
|
|
157
|
+
|
|
158
|
+
def log_memory_status(self) -> None:
|
|
159
|
+
"""
|
|
160
|
+
Log current process memory usage.
|
|
161
|
+
|
|
162
|
+
Logs both RSS (Resident Set Size) and VMS (Virtual Memory Size)
|
|
163
|
+
to help track memory consumption and potential leaks.
|
|
164
|
+
"""
|
|
165
|
+
stats = log_memory_stats(self.logger, "Memory Usage")
|
|
166
|
+
|
|
167
|
+
# Log warning if memory usage is high
|
|
168
|
+
if stats and stats.get("rss_mb", 0) > 500: # Warn if using more than 500MB
|
|
169
|
+
self.logger.warning(f"High memory usage detected: {stats['rss_mb']:.1f}MB")
|
|
170
|
+
|
|
171
|
+
def log_monitor_setup_status(
|
|
172
|
+
self, monitor_mode: bool = False, websocket_port: int = 8765
|
|
173
|
+
) -> None:
|
|
174
|
+
"""
|
|
175
|
+
Log monitor service initialization status.
|
|
176
|
+
|
|
177
|
+
Args:
|
|
178
|
+
monitor_mode: Whether monitor mode is enabled
|
|
179
|
+
websocket_port: WebSocket port for monitoring
|
|
180
|
+
|
|
181
|
+
Checks:
|
|
182
|
+
- Monitor service initialization status
|
|
183
|
+
- Which monitors are enabled/disabled
|
|
184
|
+
- Monitor configuration details
|
|
185
|
+
- Monitor-related errors or warnings
|
|
186
|
+
"""
|
|
187
|
+
try:
|
|
188
|
+
if monitor_mode:
|
|
189
|
+
self.logger.info("Monitor: Mode enabled")
|
|
190
|
+
|
|
191
|
+
# Check SocketIO dependencies
|
|
192
|
+
socketio_status = self._check_socketio_dependencies()
|
|
193
|
+
if socketio_status["available"]:
|
|
194
|
+
self.logger.info("Monitor: Socket.IO dependencies available")
|
|
195
|
+
else:
|
|
196
|
+
self.logger.info(
|
|
197
|
+
f"Monitor: Socket.IO dependencies missing - {socketio_status['error']}"
|
|
198
|
+
)
|
|
199
|
+
|
|
200
|
+
# Check if server is running
|
|
201
|
+
server_running = self._check_socketio_server_running(websocket_port)
|
|
202
|
+
if server_running:
|
|
203
|
+
self.logger.info(
|
|
204
|
+
f"Monitor: Socket.IO server running on port {websocket_port}"
|
|
205
|
+
)
|
|
206
|
+
else:
|
|
207
|
+
self.logger.info(
|
|
208
|
+
f"Monitor: Socket.IO server will start on port {websocket_port}"
|
|
209
|
+
)
|
|
210
|
+
|
|
211
|
+
# Check response logging configuration
|
|
212
|
+
logging_config = self._check_response_logging_config()
|
|
213
|
+
if logging_config["enabled"]:
|
|
214
|
+
self.logger.info(
|
|
215
|
+
f"Monitor: Response logging enabled to {logging_config['directory']}"
|
|
216
|
+
)
|
|
217
|
+
else:
|
|
218
|
+
self.logger.info("Monitor: Response logging disabled")
|
|
219
|
+
|
|
220
|
+
else:
|
|
221
|
+
self.logger.info("Monitor: Mode disabled")
|
|
222
|
+
|
|
223
|
+
# Still check if there's an existing server running
|
|
224
|
+
server_running = self._check_socketio_server_running(websocket_port)
|
|
225
|
+
if server_running:
|
|
226
|
+
self.logger.info(
|
|
227
|
+
f"Monitor: Background Socket.IO server detected on port {websocket_port}"
|
|
228
|
+
)
|
|
229
|
+
|
|
230
|
+
except Exception as e:
|
|
231
|
+
self.logger.warning(f"Monitor: Status check failed - {e}")
|
|
232
|
+
|
|
233
|
+
def _find_mcp_executable(self) -> Optional[str]:
|
|
234
|
+
"""Find MCP server executable in PATH."""
|
|
235
|
+
# Common MCP executable names
|
|
236
|
+
executables = ["claude-mpm-mcp", "mcp", "claude-mcp"]
|
|
237
|
+
|
|
238
|
+
for exe_name in executables:
|
|
239
|
+
exe_path = shutil.which(exe_name)
|
|
240
|
+
if exe_path:
|
|
241
|
+
return exe_path
|
|
242
|
+
|
|
243
|
+
# Check if it's installed as a Python package
|
|
244
|
+
try:
|
|
245
|
+
result = subprocess.run(
|
|
246
|
+
[sys.executable, "-m", "claude_mpm.scripts.mcp_server", "--version"],
|
|
247
|
+
capture_output=True,
|
|
248
|
+
text=True,
|
|
249
|
+
timeout=5,
|
|
250
|
+
check=False,
|
|
251
|
+
)
|
|
252
|
+
if result.returncode == 0:
|
|
253
|
+
return f"{sys.executable} -m claude_mpm.scripts.mcp_server"
|
|
254
|
+
except Exception:
|
|
255
|
+
pass
|
|
256
|
+
|
|
257
|
+
return None
|
|
258
|
+
|
|
259
|
+
def _get_mcp_version(self, executable: str) -> Optional[str]:
|
|
260
|
+
"""Get MCP server version."""
|
|
261
|
+
try:
|
|
262
|
+
# Try --version flag
|
|
263
|
+
result = subprocess.run(
|
|
264
|
+
[*executable.split(), "--version"],
|
|
265
|
+
capture_output=True,
|
|
266
|
+
text=True,
|
|
267
|
+
timeout=5,
|
|
268
|
+
check=False,
|
|
269
|
+
)
|
|
270
|
+
if result.returncode == 0:
|
|
271
|
+
# Extract version from output
|
|
272
|
+
output = result.stdout.strip()
|
|
273
|
+
if output:
|
|
274
|
+
return output
|
|
275
|
+
|
|
276
|
+
# Try version command
|
|
277
|
+
result = subprocess.run(
|
|
278
|
+
[*executable.split(), "version"],
|
|
279
|
+
capture_output=True,
|
|
280
|
+
text=True,
|
|
281
|
+
timeout=5,
|
|
282
|
+
check=False,
|
|
283
|
+
)
|
|
284
|
+
if result.returncode == 0:
|
|
285
|
+
output = result.stdout.strip()
|
|
286
|
+
if output:
|
|
287
|
+
return output
|
|
288
|
+
|
|
289
|
+
except Exception:
|
|
290
|
+
pass
|
|
291
|
+
|
|
292
|
+
return None
|
|
293
|
+
|
|
294
|
+
def _check_mcp_configuration(self) -> Dict[str, Any]:
|
|
295
|
+
"""Check MCP configuration in ~/.claude.json."""
|
|
296
|
+
claude_json_path = Path.home() / ".claude.json"
|
|
297
|
+
|
|
298
|
+
result = {"found": False, "servers_count": 0, "error": None}
|
|
299
|
+
|
|
300
|
+
try:
|
|
301
|
+
if not claude_json_path.exists():
|
|
302
|
+
return result
|
|
303
|
+
|
|
304
|
+
import json
|
|
305
|
+
|
|
306
|
+
with claude_json_path.open() as f:
|
|
307
|
+
config = json.load(f)
|
|
308
|
+
|
|
309
|
+
result["found"] = True
|
|
310
|
+
|
|
311
|
+
# Check for MCP servers configuration
|
|
312
|
+
mcp_config = config.get("mcpServers", {})
|
|
313
|
+
result["servers_count"] = len(mcp_config)
|
|
314
|
+
|
|
315
|
+
except Exception as e:
|
|
316
|
+
result["error"] = str(e)
|
|
317
|
+
|
|
318
|
+
return result
|
|
319
|
+
|
|
320
|
+
def _check_mcp_gateway_status(self) -> Dict[str, Any]:
|
|
321
|
+
"""Check Claude MPM MCP gateway configuration status."""
|
|
322
|
+
result = {"configured": False, "error": None}
|
|
323
|
+
|
|
324
|
+
try:
|
|
325
|
+
# Check if MCP gateway startup verification is available
|
|
326
|
+
from ..services.mcp_gateway.core.startup_verification import (
|
|
327
|
+
is_mcp_gateway_configured,
|
|
328
|
+
)
|
|
329
|
+
|
|
330
|
+
result["configured"] = is_mcp_gateway_configured()
|
|
331
|
+
except ImportError:
|
|
332
|
+
# MCP gateway not available
|
|
333
|
+
pass
|
|
334
|
+
except Exception as e:
|
|
335
|
+
result["error"] = str(e)
|
|
336
|
+
|
|
337
|
+
return result
|
|
338
|
+
|
|
339
|
+
def _check_socketio_dependencies(self) -> Dict[str, Any]:
|
|
340
|
+
"""Check if Socket.IO dependencies are available."""
|
|
341
|
+
import importlib.util
|
|
342
|
+
|
|
343
|
+
result = {"available": False, "error": None}
|
|
344
|
+
|
|
345
|
+
try:
|
|
346
|
+
# Check for socketio dependencies without importing them
|
|
347
|
+
aiohttp_spec = importlib.util.find_spec("aiohttp")
|
|
348
|
+
engineio_spec = importlib.util.find_spec("engineio")
|
|
349
|
+
socketio_spec = importlib.util.find_spec("socketio")
|
|
350
|
+
|
|
351
|
+
if aiohttp_spec and engineio_spec and socketio_spec:
|
|
352
|
+
result["available"] = True
|
|
353
|
+
else:
|
|
354
|
+
missing = []
|
|
355
|
+
if not aiohttp_spec:
|
|
356
|
+
missing.append("aiohttp")
|
|
357
|
+
if not engineio_spec:
|
|
358
|
+
missing.append("engineio")
|
|
359
|
+
if not socketio_spec:
|
|
360
|
+
missing.append("socketio")
|
|
361
|
+
result["error"] = f"Missing dependencies: {', '.join(missing)}"
|
|
362
|
+
except ImportError as e:
|
|
363
|
+
result["error"] = f"Missing dependencies: {e}"
|
|
364
|
+
except Exception as e:
|
|
365
|
+
result["error"] = str(e)
|
|
366
|
+
|
|
367
|
+
return result
|
|
368
|
+
|
|
369
|
+
def _check_socketio_server_running(self, port: int) -> bool:
|
|
370
|
+
"""Check if Socket.IO server is running on specified port."""
|
|
371
|
+
try:
|
|
372
|
+
import socket
|
|
373
|
+
|
|
374
|
+
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
|
|
375
|
+
s.settimeout(1)
|
|
376
|
+
result = s.connect_ex(("localhost", port))
|
|
377
|
+
return result == 0
|
|
378
|
+
except Exception:
|
|
379
|
+
return False
|
|
380
|
+
|
|
381
|
+
def _check_response_logging_config(self) -> Dict[str, Any]:
|
|
382
|
+
"""Check response logging configuration."""
|
|
383
|
+
result = {"enabled": False, "directory": None, "error": None}
|
|
384
|
+
|
|
385
|
+
try:
|
|
386
|
+
from ..core.shared.config_loader import ConfigLoader
|
|
387
|
+
|
|
388
|
+
config_loader = ConfigLoader()
|
|
389
|
+
config = config_loader.load_main_config()
|
|
390
|
+
|
|
391
|
+
# Check response logging configuration
|
|
392
|
+
response_logging = config.get("response_logging", {})
|
|
393
|
+
result["enabled"] = response_logging.get("enabled", False)
|
|
394
|
+
|
|
395
|
+
if result["enabled"]:
|
|
396
|
+
log_dir = response_logging.get(
|
|
397
|
+
"session_directory", ".claude-mpm/responses"
|
|
398
|
+
)
|
|
399
|
+
if not Path(log_dir).is_absolute():
|
|
400
|
+
log_dir = Path.cwd() / log_dir
|
|
401
|
+
result["directory"] = str(log_dir)
|
|
402
|
+
|
|
403
|
+
except Exception as e:
|
|
404
|
+
result["error"] = str(e)
|
|
405
|
+
|
|
406
|
+
return result
|
|
407
|
+
|
|
408
|
+
def _is_pipx_installation(self) -> bool:
|
|
409
|
+
"""Check if this is a pipx installation."""
|
|
410
|
+
try:
|
|
411
|
+
# Check if running from pipx
|
|
412
|
+
if "pipx" in sys.executable.lower():
|
|
413
|
+
return True
|
|
414
|
+
|
|
415
|
+
# Check module path
|
|
416
|
+
import claude_mpm
|
|
417
|
+
|
|
418
|
+
module_path = Path(claude_mpm.__file__).parent
|
|
419
|
+
if "pipx" in str(module_path):
|
|
420
|
+
return True
|
|
421
|
+
except Exception:
|
|
422
|
+
pass
|
|
423
|
+
|
|
424
|
+
return False
|
|
425
|
+
|
|
426
|
+
def _has_auto_config_preference(self) -> bool:
|
|
427
|
+
"""Check if user has already been asked about auto-configuration."""
|
|
428
|
+
try:
|
|
429
|
+
from ..config.paths import paths
|
|
430
|
+
|
|
431
|
+
preference_file = (
|
|
432
|
+
paths.claude_mpm_dir_hidden / "mcp_auto_config_preference.json"
|
|
433
|
+
)
|
|
434
|
+
return preference_file.exists()
|
|
435
|
+
except Exception:
|
|
436
|
+
return False
|
|
437
|
+
|
|
438
|
+
def _log_mcp_setup_hint(self) -> None:
|
|
439
|
+
"""Log helpful hints for MCP setup."""
|
|
440
|
+
# Check if installed via pipx
|
|
441
|
+
is_pipx = self._check_pipx_installation()
|
|
442
|
+
|
|
443
|
+
if is_pipx:
|
|
444
|
+
self.logger.info("💡 TIP: It looks like you installed claude-mpm via pipx")
|
|
445
|
+
self.logger.info(" To configure MCP for Claude Code with pipx:")
|
|
446
|
+
self.logger.info(" 1. Run: python3 scripts/configure_mcp_pipx.py")
|
|
447
|
+
self.logger.info(" 2. Or see: docs/MCP_PIPX_SETUP.md for manual setup")
|
|
448
|
+
self.logger.info(" 3. Restart Claude Code after configuration")
|
|
449
|
+
else:
|
|
450
|
+
self.logger.info("💡 TIP: To enable MCP integration with Claude Code:")
|
|
451
|
+
self.logger.info(" 1. See docs/MCP_SETUP.md for setup instructions")
|
|
452
|
+
self.logger.info(" 2. Run: claude-mpm doctor --check mcp to verify")
|
|
453
|
+
self.logger.info(" 3. Restart Claude Code after configuration")
|
|
454
|
+
|
|
455
|
+
def _check_pipx_installation(self) -> bool:
|
|
456
|
+
"""Check if claude-mpm was installed via pipx."""
|
|
457
|
+
try:
|
|
458
|
+
# Check if running from a pipx venv
|
|
459
|
+
if "pipx" in sys.executable.lower():
|
|
460
|
+
return True
|
|
461
|
+
|
|
462
|
+
# Check if claude-mpm-mcp command exists and is from pipx
|
|
463
|
+
mcp_cmd = shutil.which("claude-mpm-mcp")
|
|
464
|
+
if mcp_cmd and "pipx" in mcp_cmd.lower():
|
|
465
|
+
return True
|
|
466
|
+
|
|
467
|
+
# Try to check pipx list
|
|
468
|
+
result = subprocess.run(
|
|
469
|
+
["pipx", "list"], capture_output=True, text=True, timeout=2, check=False
|
|
470
|
+
)
|
|
471
|
+
if result.returncode == 0 and "claude-mpm" in result.stdout:
|
|
472
|
+
return True
|
|
473
|
+
|
|
474
|
+
except Exception:
|
|
475
|
+
pass
|
|
476
|
+
|
|
477
|
+
return False
|
|
478
|
+
|
|
479
|
+
|
|
480
|
+
def setup_startup_logging(project_root: Optional[Path] = None) -> Path:
|
|
481
|
+
"""
|
|
482
|
+
Set up logging to both console and file for startup.
|
|
483
|
+
|
|
484
|
+
WHY: Capture all startup logs (INFO, WARNING, ERROR, DEBUG) to timestamped
|
|
485
|
+
files for later analysis by the doctor command. This helps diagnose
|
|
486
|
+
startup issues that users may not notice in the console output.
|
|
487
|
+
|
|
488
|
+
DESIGN DECISIONS:
|
|
489
|
+
- Use ISO-like timestamp format for easy sorting and reading
|
|
490
|
+
- Store in .claude-mpm/logs/startup/ directory
|
|
491
|
+
- Keep all historical startup logs for pattern analysis
|
|
492
|
+
- Add file handler to root logger to capture ALL module logs
|
|
493
|
+
|
|
494
|
+
Args:
|
|
495
|
+
project_root: Root directory for the project (defaults to cwd)
|
|
496
|
+
|
|
497
|
+
Returns:
|
|
498
|
+
Path to the created log file
|
|
499
|
+
"""
|
|
500
|
+
if project_root is None:
|
|
501
|
+
project_root = Path.cwd()
|
|
502
|
+
|
|
503
|
+
# Create log directory
|
|
504
|
+
log_dir = project_root / ".claude-mpm" / "logs" / "startup"
|
|
505
|
+
log_dir.mkdir(parents=True, exist_ok=True)
|
|
506
|
+
|
|
507
|
+
# Generate timestamp for log file
|
|
508
|
+
timestamp = datetime.now(timezone.utc).strftime("%Y-%m-%d-%H-%M-%S")
|
|
509
|
+
log_file = log_dir / f"startup-{timestamp}.log"
|
|
510
|
+
|
|
511
|
+
# Create file handler with detailed formatting
|
|
512
|
+
file_handler = logging.FileHandler(log_file, encoding="utf-8")
|
|
513
|
+
file_handler.setLevel(logging.DEBUG) # Capture all levels to file
|
|
514
|
+
|
|
515
|
+
# Format with timestamp, logger name, level, and message
|
|
516
|
+
formatter = logging.Formatter(
|
|
517
|
+
"%(asctime)s - %(name)s - %(levelname)s - %(message)s",
|
|
518
|
+
datefmt="%Y-%m-%d %H:%M:%S",
|
|
519
|
+
)
|
|
520
|
+
file_handler.setFormatter(formatter)
|
|
521
|
+
|
|
522
|
+
# Add to claude_mpm logger to capture all our logs
|
|
523
|
+
# (Don't add to root logger to avoid duplicates from propagation)
|
|
524
|
+
claude_logger = logging.getLogger("claude_mpm")
|
|
525
|
+
claude_logger.addHandler(file_handler)
|
|
526
|
+
claude_logger.setLevel(logging.DEBUG) # Ensure all levels are captured
|
|
527
|
+
|
|
528
|
+
# Log startup header
|
|
529
|
+
logger = get_logger("startup")
|
|
530
|
+
logger.info("=" * 60)
|
|
531
|
+
logger.info(f"Claude MPM Startup - {datetime.now(timezone.utc).isoformat()}")
|
|
532
|
+
logger.info(f"Log file: {log_file}")
|
|
533
|
+
logger.info("=" * 60)
|
|
534
|
+
|
|
535
|
+
# Log system information
|
|
536
|
+
logger.info(f"Python: {sys.version}")
|
|
537
|
+
logger.info(f"Platform: {sys.platform}")
|
|
538
|
+
logger.info(f"CWD: {Path.cwd()}")
|
|
539
|
+
logger.info(f"Project root: {project_root}")
|
|
540
|
+
|
|
541
|
+
# Log initial memory usage
|
|
542
|
+
if PSUTIL_AVAILABLE:
|
|
543
|
+
try:
|
|
544
|
+
import platform
|
|
545
|
+
|
|
546
|
+
process = psutil.Process()
|
|
547
|
+
memory_info = process.memory_info()
|
|
548
|
+
rss_mb = memory_info.rss / (1024 * 1024)
|
|
549
|
+
vms_mb = memory_info.vms / (1024 * 1024)
|
|
550
|
+
|
|
551
|
+
# On macOS, VMS can report misleading values (400+ TB)
|
|
552
|
+
# Skip VMS reporting if it's unreasonably large
|
|
553
|
+
if (
|
|
554
|
+
platform.system() == "Darwin" and vms_mb > 100000
|
|
555
|
+
): # > 100GB is suspicious
|
|
556
|
+
logger.info(f"Initial Memory: RSS={rss_mb:.1f}MB")
|
|
557
|
+
else:
|
|
558
|
+
logger.info(f"Initial Memory: RSS={rss_mb:.1f}MB, VMS={vms_mb:.1f}MB")
|
|
559
|
+
except Exception as e:
|
|
560
|
+
logger.debug(f"Failed to get initial memory info: {e}")
|
|
561
|
+
|
|
562
|
+
return log_file
|
|
563
|
+
|
|
564
|
+
|
|
565
|
+
def cleanup_old_startup_logs(
|
|
566
|
+
project_root: Optional[Path] = None, keep_count: Optional[int] = None
|
|
567
|
+
) -> int:
|
|
568
|
+
"""
|
|
569
|
+
Clean up old startup log files using time-based retention.
|
|
570
|
+
|
|
571
|
+
WHY: This function now delegates to LogManager for unified log management
|
|
572
|
+
with time-based retention instead of count-based.
|
|
573
|
+
|
|
574
|
+
DESIGN DECISIONS:
|
|
575
|
+
- Delegates to LogManager for consistency
|
|
576
|
+
- Converts count to hours (48 hours default)
|
|
577
|
+
- Maintains backward compatibility
|
|
578
|
+
|
|
579
|
+
Args:
|
|
580
|
+
project_root: Root directory for the project
|
|
581
|
+
keep_count: Ignored (kept for backward compatibility)
|
|
582
|
+
|
|
583
|
+
Returns:
|
|
584
|
+
Number of log files deleted
|
|
585
|
+
"""
|
|
586
|
+
try:
|
|
587
|
+
from ..core.log_manager import get_log_manager
|
|
588
|
+
|
|
589
|
+
log_manager = get_log_manager()
|
|
590
|
+
|
|
591
|
+
# Use LogManager's time-based cleanup (48 hours default)
|
|
592
|
+
return log_manager.cleanup_old_startup_logs(project_root)
|
|
593
|
+
except ImportError:
|
|
594
|
+
# Fallback to old implementation if LogManager not available
|
|
595
|
+
# Get retention count from configuration if not specified
|
|
596
|
+
if keep_count is None:
|
|
597
|
+
from claude_mpm.core.config_constants import ConfigConstants
|
|
598
|
+
|
|
599
|
+
keep_count = (
|
|
600
|
+
ConfigConstants.get_logging_setting("startup_logs_retention_count")
|
|
601
|
+
or 10
|
|
602
|
+
)
|
|
603
|
+
|
|
604
|
+
if project_root is None:
|
|
605
|
+
project_root = Path.cwd()
|
|
606
|
+
|
|
607
|
+
log_dir = project_root / ".claude-mpm" / "logs" / "startup"
|
|
608
|
+
|
|
609
|
+
if not log_dir.exists():
|
|
610
|
+
return 0
|
|
611
|
+
|
|
612
|
+
# Get all startup log files
|
|
613
|
+
log_files = sorted(
|
|
614
|
+
log_dir.glob("startup-*.log"), key=lambda p: p.stat().st_mtime, reverse=True
|
|
615
|
+
) # Newest first
|
|
616
|
+
|
|
617
|
+
if len(log_files) <= keep_count:
|
|
618
|
+
return 0 # Already within limit
|
|
619
|
+
|
|
620
|
+
# Delete older files beyond keep_count
|
|
621
|
+
deleted_count = 0
|
|
622
|
+
for log_file in log_files[
|
|
623
|
+
keep_count:
|
|
624
|
+
]: # Keep only the most recent keep_count files
|
|
625
|
+
try:
|
|
626
|
+
log_file.unlink()
|
|
627
|
+
deleted_count += 1
|
|
628
|
+
except Exception:
|
|
629
|
+
pass # Ignore deletion errors
|
|
630
|
+
|
|
631
|
+
return deleted_count
|
|
632
|
+
|
|
633
|
+
|
|
634
|
+
async def trigger_vector_search_indexing(project_root: Optional[Path] = None) -> None:
|
|
635
|
+
"""
|
|
636
|
+
Trigger mcp-vector-search indexing in the background.
|
|
637
|
+
|
|
638
|
+
This function attempts to start the mcp-vector-search indexing process
|
|
639
|
+
asynchronously so it doesn't block startup. If the service is not available,
|
|
640
|
+
it fails silently.
|
|
641
|
+
|
|
642
|
+
Args:
|
|
643
|
+
project_root: Root directory for the project (defaults to cwd)
|
|
644
|
+
"""
|
|
645
|
+
logger = get_logger("cli")
|
|
646
|
+
|
|
647
|
+
if project_root is None:
|
|
648
|
+
project_root = Path.cwd()
|
|
649
|
+
|
|
650
|
+
try:
|
|
651
|
+
# Check if mcp-vector-search is available
|
|
652
|
+
from ..services.mcp_config_manager import MCPConfigManager
|
|
653
|
+
|
|
654
|
+
manager = MCPConfigManager()
|
|
655
|
+
vector_search_path = manager.detect_service_path("mcp-vector-search")
|
|
656
|
+
|
|
657
|
+
if not vector_search_path:
|
|
658
|
+
logger.debug("mcp-vector-search not found, skipping indexing")
|
|
659
|
+
return
|
|
660
|
+
|
|
661
|
+
# Build the command based on the service configuration
|
|
662
|
+
if "python" in vector_search_path:
|
|
663
|
+
# Using Python interpreter directly
|
|
664
|
+
cmd = [
|
|
665
|
+
vector_search_path,
|
|
666
|
+
"-m",
|
|
667
|
+
"mcp_vector_search.cli",
|
|
668
|
+
"index",
|
|
669
|
+
str(project_root),
|
|
670
|
+
]
|
|
671
|
+
else:
|
|
672
|
+
# Using installed binary
|
|
673
|
+
cmd = [vector_search_path, "index", str(project_root)]
|
|
674
|
+
|
|
675
|
+
logger.info(
|
|
676
|
+
"MCP Vector Search: Starting background indexing for improved code search"
|
|
677
|
+
)
|
|
678
|
+
|
|
679
|
+
# Start the indexing process in the background
|
|
680
|
+
# We use subprocess.Popen instead of run to avoid blocking
|
|
681
|
+
process = await asyncio.create_subprocess_exec(
|
|
682
|
+
*cmd,
|
|
683
|
+
stdout=asyncio.subprocess.DEVNULL,
|
|
684
|
+
stderr=asyncio.subprocess.DEVNULL,
|
|
685
|
+
cwd=str(project_root),
|
|
686
|
+
)
|
|
687
|
+
|
|
688
|
+
# Store PID for logging
|
|
689
|
+
pid = process.pid
|
|
690
|
+
logger.debug(f"MCP Vector Search: Indexing process started (PID: {pid})")
|
|
691
|
+
|
|
692
|
+
# Don't wait for completion - let it run independently in the background
|
|
693
|
+
# We don't need to track its completion, so we can safely detach
|
|
694
|
+
|
|
695
|
+
except ImportError:
|
|
696
|
+
logger.debug(
|
|
697
|
+
"MCP config manager not available, skipping vector search indexing"
|
|
698
|
+
)
|
|
699
|
+
except Exception as e:
|
|
700
|
+
# Don't let indexing failures prevent startup
|
|
701
|
+
logger.debug(f"Failed to start vector search indexing: {e}")
|
|
702
|
+
|
|
703
|
+
|
|
704
|
+
def start_vector_search_indexing(project_root: Optional[Path] = None) -> None:
|
|
705
|
+
"""
|
|
706
|
+
Synchronous wrapper to trigger vector search indexing.
|
|
707
|
+
|
|
708
|
+
This creates a new event loop if needed to run the async indexing function.
|
|
709
|
+
Falls back to subprocess.Popen if async fails.
|
|
710
|
+
|
|
711
|
+
Args:
|
|
712
|
+
project_root: Root directory for the project (defaults to cwd)
|
|
713
|
+
"""
|
|
714
|
+
logger = get_logger("cli")
|
|
715
|
+
|
|
716
|
+
try:
|
|
717
|
+
# Try to get the current event loop
|
|
718
|
+
loop = asyncio.get_running_loop()
|
|
719
|
+
# If we're in an event loop, create a task (fire-and-forget)
|
|
720
|
+
_task = loop.create_task(trigger_vector_search_indexing(project_root))
|
|
721
|
+
# Fire-and-forget: task will complete in background
|
|
722
|
+
except RuntimeError:
|
|
723
|
+
# No event loop running - use subprocess directly to avoid event loop lifecycle issues
|
|
724
|
+
# The async approach with asyncio.run() creates and closes a loop which causes
|
|
725
|
+
# warnings when subprocesses are still running
|
|
726
|
+
logger.debug("No event loop running, using subprocess approach")
|
|
727
|
+
_start_vector_search_subprocess(project_root)
|
|
728
|
+
|
|
729
|
+
|
|
730
|
+
def _start_vector_search_subprocess(project_root: Optional[Path] = None) -> None:
|
|
731
|
+
"""
|
|
732
|
+
Fallback method to start vector search indexing using subprocess.Popen.
|
|
733
|
+
|
|
734
|
+
Args:
|
|
735
|
+
project_root: Root directory for the project (defaults to cwd)
|
|
736
|
+
"""
|
|
737
|
+
logger = get_logger("cli")
|
|
738
|
+
|
|
739
|
+
if project_root is None:
|
|
740
|
+
project_root = Path.cwd()
|
|
741
|
+
|
|
742
|
+
try:
|
|
743
|
+
from ..services.mcp_config_manager import MCPConfigManager
|
|
744
|
+
|
|
745
|
+
manager = MCPConfigManager()
|
|
746
|
+
vector_search_path = manager.detect_service_path("mcp-vector-search")
|
|
747
|
+
|
|
748
|
+
if not vector_search_path:
|
|
749
|
+
logger.debug("mcp-vector-search not found, skipping indexing")
|
|
750
|
+
return
|
|
751
|
+
|
|
752
|
+
# Build the command
|
|
753
|
+
if "python" in vector_search_path:
|
|
754
|
+
cmd = [
|
|
755
|
+
vector_search_path,
|
|
756
|
+
"-m",
|
|
757
|
+
"mcp_vector_search.cli",
|
|
758
|
+
"index",
|
|
759
|
+
str(project_root),
|
|
760
|
+
]
|
|
761
|
+
else:
|
|
762
|
+
cmd = [vector_search_path, "index", str(project_root)]
|
|
763
|
+
|
|
764
|
+
logger.info(
|
|
765
|
+
"MCP Vector Search: Starting background indexing for improved code search"
|
|
766
|
+
)
|
|
767
|
+
|
|
768
|
+
# Start the indexing process in the background
|
|
769
|
+
process = subprocess.Popen(
|
|
770
|
+
cmd,
|
|
771
|
+
stdout=subprocess.DEVNULL,
|
|
772
|
+
stderr=subprocess.DEVNULL,
|
|
773
|
+
cwd=str(project_root),
|
|
774
|
+
)
|
|
775
|
+
|
|
776
|
+
logger.debug(
|
|
777
|
+
f"MCP Vector Search: Indexing process started (PID: {process.pid})"
|
|
778
|
+
)
|
|
779
|
+
|
|
780
|
+
except Exception as e:
|
|
781
|
+
logger.debug(f"Failed to start vector search indexing: {e}")
|
|
782
|
+
|
|
783
|
+
|
|
784
|
+
def get_latest_startup_log(project_root: Optional[Path] = None) -> Optional[Path]:
|
|
785
|
+
"""
|
|
786
|
+
Get the path to the most recent startup log file.
|
|
787
|
+
|
|
788
|
+
Args:
|
|
789
|
+
project_root: Root directory for the project
|
|
790
|
+
|
|
791
|
+
Returns:
|
|
792
|
+
Path to latest log file or None if no logs exist
|
|
793
|
+
"""
|
|
794
|
+
if project_root is None:
|
|
795
|
+
project_root = Path.cwd()
|
|
796
|
+
|
|
797
|
+
log_dir = project_root / ".claude-mpm" / "logs" / "startup"
|
|
798
|
+
|
|
799
|
+
if not log_dir.exists():
|
|
800
|
+
return None
|
|
801
|
+
|
|
802
|
+
log_files = sorted(
|
|
803
|
+
log_dir.glob("startup-*.log"), key=lambda p: p.stat().st_mtime, reverse=True
|
|
804
|
+
)
|
|
805
|
+
|
|
806
|
+
return log_files[0] if log_files else None
|
|
807
|
+
|
|
808
|
+
|
|
809
|
+
def log_startup_status(monitor_mode: bool = False, websocket_port: int = 8765) -> None:
|
|
810
|
+
"""
|
|
811
|
+
Log comprehensive startup status for MCP server and monitor setup.
|
|
812
|
+
|
|
813
|
+
This function should be called during application startup to provide
|
|
814
|
+
detailed information about MCP and monitor setup status.
|
|
815
|
+
|
|
816
|
+
Args:
|
|
817
|
+
monitor_mode: Whether monitor mode is enabled
|
|
818
|
+
websocket_port: WebSocket port for monitoring
|
|
819
|
+
"""
|
|
820
|
+
try:
|
|
821
|
+
status_logger = StartupStatusLogger("cli")
|
|
822
|
+
|
|
823
|
+
# Log memory status at startup
|
|
824
|
+
status_logger.log_memory_status()
|
|
825
|
+
|
|
826
|
+
# Log MCP server status
|
|
827
|
+
status_logger.log_mcp_server_status()
|
|
828
|
+
|
|
829
|
+
# Log monitor setup status
|
|
830
|
+
status_logger.log_monitor_setup_status(monitor_mode, websocket_port)
|
|
831
|
+
|
|
832
|
+
# Trigger vector search indexing in the background after MCP is configured
|
|
833
|
+
# This will run asynchronously and not block startup
|
|
834
|
+
start_vector_search_indexing()
|
|
835
|
+
|
|
836
|
+
except Exception as e:
|
|
837
|
+
# Don't let logging failures prevent startup
|
|
838
|
+
logger = get_logger("cli")
|
|
839
|
+
logger.debug(f"Startup status logging failed: {e}")
|