claude-mpm 4.14.6__py3-none-any.whl → 4.21.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of claude-mpm might be problematic. Click here for more details.
- claude_mpm/VERSION +1 -1
- claude_mpm/agents/BASE_ENGINEER.md +286 -0
- claude_mpm/agents/BASE_PM.md +272 -23
- claude_mpm/agents/OUTPUT_STYLE.md +48 -3
- claude_mpm/agents/PM_INSTRUCTIONS.md +49 -0
- claude_mpm/agents/agent_loader.py +17 -5
- claude_mpm/agents/frontmatter_validator.py +284 -253
- claude_mpm/agents/templates/agentic-coder-optimizer.json +9 -2
- claude_mpm/agents/templates/api_qa.json +7 -1
- claude_mpm/agents/templates/clerk-ops.json +8 -1
- claude_mpm/agents/templates/code_analyzer.json +4 -1
- claude_mpm/agents/templates/dart_engineer.json +11 -1
- claude_mpm/agents/templates/data_engineer.json +11 -1
- claude_mpm/agents/templates/documentation.json +6 -1
- claude_mpm/agents/templates/engineer.json +18 -1
- claude_mpm/agents/templates/gcp_ops_agent.json +8 -1
- claude_mpm/agents/templates/golang_engineer.json +11 -1
- claude_mpm/agents/templates/java_engineer.json +12 -2
- claude_mpm/agents/templates/local_ops_agent.json +216 -37
- claude_mpm/agents/templates/nextjs_engineer.json +11 -1
- claude_mpm/agents/templates/ops.json +8 -1
- claude_mpm/agents/templates/php-engineer.json +20 -4
- claude_mpm/agents/templates/project_organizer.json +10 -3
- claude_mpm/agents/templates/prompt-engineer.json +5 -1
- claude_mpm/agents/templates/python_engineer.json +19 -4
- claude_mpm/agents/templates/qa.json +7 -1
- claude_mpm/agents/templates/react_engineer.json +11 -1
- claude_mpm/agents/templates/refactoring_engineer.json +8 -1
- claude_mpm/agents/templates/research.json +4 -1
- claude_mpm/agents/templates/ruby-engineer.json +11 -1
- claude_mpm/agents/templates/rust_engineer.json +23 -8
- claude_mpm/agents/templates/security.json +6 -1
- claude_mpm/agents/templates/svelte-engineer.json +225 -0
- claude_mpm/agents/templates/ticketing.json +6 -1
- claude_mpm/agents/templates/typescript_engineer.json +11 -1
- claude_mpm/agents/templates/vercel_ops_agent.json +8 -1
- claude_mpm/agents/templates/version_control.json +8 -1
- claude_mpm/agents/templates/web_qa.json +7 -1
- claude_mpm/agents/templates/web_ui.json +11 -1
- claude_mpm/cli/__init__.py +34 -740
- claude_mpm/cli/commands/__init__.py +2 -0
- claude_mpm/cli/commands/agent_manager.py +25 -12
- claude_mpm/cli/commands/agent_state_manager.py +186 -0
- claude_mpm/cli/commands/agents.py +204 -148
- claude_mpm/cli/commands/aggregate.py +7 -3
- claude_mpm/cli/commands/analyze.py +9 -4
- claude_mpm/cli/commands/analyze_code.py +7 -2
- claude_mpm/cli/commands/auto_configure.py +7 -9
- claude_mpm/cli/commands/config.py +47 -13
- claude_mpm/cli/commands/configure.py +294 -1788
- claude_mpm/cli/commands/configure_agent_display.py +261 -0
- claude_mpm/cli/commands/configure_behavior_manager.py +204 -0
- claude_mpm/cli/commands/configure_hook_manager.py +225 -0
- claude_mpm/cli/commands/configure_models.py +18 -0
- claude_mpm/cli/commands/configure_navigation.py +167 -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/local_deploy.py +3 -2
- claude_mpm/cli/commands/memory.py +54 -20
- claude_mpm/cli/commands/mpm_init/__init__.py +73 -0
- claude_mpm/cli/commands/mpm_init/core.py +525 -0
- claude_mpm/cli/commands/mpm_init/display.py +341 -0
- claude_mpm/cli/commands/mpm_init/git_activity.py +427 -0
- claude_mpm/cli/commands/mpm_init/modes.py +397 -0
- claude_mpm/cli/commands/mpm_init/prompts.py +442 -0
- claude_mpm/cli/commands/mpm_init_cli.py +396 -0
- claude_mpm/cli/commands/mpm_init_handler.py +75 -4
- claude_mpm/cli/commands/skills.py +488 -0
- claude_mpm/cli/executor.py +204 -0
- claude_mpm/cli/helpers.py +105 -0
- claude_mpm/cli/interactive/__init__.py +3 -0
- claude_mpm/cli/interactive/skills_wizard.py +491 -0
- claude_mpm/cli/parsers/base_parser.py +7 -0
- claude_mpm/cli/parsers/mpm_init_parser.py +42 -0
- claude_mpm/cli/parsers/skills_parser.py +137 -0
- claude_mpm/cli/shared/output_formatters.py +28 -19
- claude_mpm/cli/startup.py +538 -0
- claude_mpm/commands/mpm-auto-configure.md +52 -0
- claude_mpm/commands/mpm-help.md +3 -0
- claude_mpm/commands/mpm-init.md +112 -6
- claude_mpm/commands/mpm-version.md +113 -0
- claude_mpm/commands/mpm.md +1 -0
- claude_mpm/config/agent_config.py +2 -2
- claude_mpm/constants.py +12 -0
- claude_mpm/core/base_service.py +13 -12
- claude_mpm/core/config.py +42 -0
- claude_mpm/core/enums.py +452 -0
- claude_mpm/core/factories.py +1 -1
- claude_mpm/core/instruction_reinforcement_hook.py +2 -1
- claude_mpm/core/interactive_session.py +6 -3
- claude_mpm/core/interfaces.py +56 -1
- claude_mpm/core/logging_config.py +6 -2
- claude_mpm/core/oneshot_session.py +8 -4
- claude_mpm/core/optimized_agent_loader.py +3 -3
- claude_mpm/core/output_style_manager.py +12 -192
- claude_mpm/core/service_registry.py +5 -1
- claude_mpm/core/types.py +2 -9
- claude_mpm/core/typing_utils.py +7 -6
- claude_mpm/dashboard/static/js/dashboard.js +0 -14
- claude_mpm/dashboard/templates/index.html +3 -41
- claude_mpm/hooks/__init__.py +8 -0
- claude_mpm/hooks/claude_hooks/response_tracking.py +35 -1
- claude_mpm/hooks/instruction_reinforcement.py +7 -2
- claude_mpm/hooks/session_resume_hook.py +121 -0
- claude_mpm/models/resume_log.py +340 -0
- claude_mpm/services/agents/auto_config_manager.py +10 -11
- claude_mpm/services/agents/deployment/agent_configuration_manager.py +1 -1
- claude_mpm/services/agents/deployment/agent_record_service.py +1 -1
- claude_mpm/services/agents/deployment/agent_validator.py +17 -1
- claude_mpm/services/agents/deployment/async_agent_deployment.py +1 -1
- claude_mpm/services/agents/deployment/interface_adapter.py +3 -2
- claude_mpm/services/agents/deployment/local_template_deployment.py +1 -1
- claude_mpm/services/agents/deployment/pipeline/steps/agent_processing_step.py +7 -6
- claude_mpm/services/agents/deployment/pipeline/steps/base_step.py +7 -16
- claude_mpm/services/agents/deployment/pipeline/steps/configuration_step.py +4 -3
- claude_mpm/services/agents/deployment/pipeline/steps/target_directory_step.py +5 -3
- claude_mpm/services/agents/deployment/pipeline/steps/validation_step.py +6 -5
- claude_mpm/services/agents/deployment/refactored_agent_deployment_service.py +9 -6
- claude_mpm/services/agents/deployment/validation/__init__.py +3 -1
- claude_mpm/services/agents/deployment/validation/validation_result.py +1 -9
- claude_mpm/services/agents/local_template_manager.py +1 -1
- claude_mpm/services/agents/memory/agent_memory_manager.py +5 -2
- claude_mpm/services/agents/recommender.py +47 -0
- claude_mpm/services/agents/registry/modification_tracker.py +5 -2
- claude_mpm/services/cli/resume_service.py +617 -0
- claude_mpm/services/cli/session_manager.py +87 -0
- claude_mpm/services/cli/session_pause_manager.py +504 -0
- claude_mpm/services/cli/session_resume_helper.py +372 -0
- claude_mpm/services/command_handler_service.py +11 -5
- claude_mpm/services/core/interfaces/process.py +6 -6
- claude_mpm/services/core/interfaces.py +56 -1
- claude_mpm/services/core/models/__init__.py +0 -2
- claude_mpm/services/core/models/agent_config.py +15 -28
- claude_mpm/services/core/models/health.py +1 -28
- claude_mpm/services/core/models/process.py +22 -41
- claude_mpm/services/core/path_resolver.py +1 -1
- claude_mpm/services/diagnostics/__init__.py +2 -2
- claude_mpm/services/diagnostics/checks/agent_check.py +25 -24
- claude_mpm/services/diagnostics/checks/claude_code_check.py +24 -23
- claude_mpm/services/diagnostics/checks/common_issues_check.py +25 -24
- claude_mpm/services/diagnostics/checks/configuration_check.py +24 -23
- claude_mpm/services/diagnostics/checks/filesystem_check.py +18 -17
- claude_mpm/services/diagnostics/checks/installation_check.py +30 -29
- claude_mpm/services/diagnostics/checks/instructions_check.py +20 -19
- claude_mpm/services/diagnostics/checks/mcp_check.py +50 -36
- claude_mpm/services/diagnostics/checks/mcp_services_check.py +36 -31
- claude_mpm/services/diagnostics/checks/monitor_check.py +23 -22
- claude_mpm/services/diagnostics/checks/startup_log_check.py +9 -8
- claude_mpm/services/diagnostics/diagnostic_runner.py +6 -5
- claude_mpm/services/diagnostics/doctor_reporter.py +28 -25
- claude_mpm/services/diagnostics/models.py +37 -21
- claude_mpm/services/infrastructure/monitoring/__init__.py +1 -1
- claude_mpm/services/infrastructure/monitoring/aggregator.py +12 -12
- claude_mpm/services/infrastructure/monitoring/base.py +5 -13
- claude_mpm/services/infrastructure/monitoring/network.py +7 -6
- claude_mpm/services/infrastructure/monitoring/process.py +13 -12
- claude_mpm/services/infrastructure/monitoring/resources.py +7 -6
- claude_mpm/services/infrastructure/monitoring/service.py +16 -15
- claude_mpm/services/infrastructure/resume_log_generator.py +439 -0
- claude_mpm/services/local_ops/__init__.py +5 -3
- claude_mpm/services/local_ops/crash_detector.py +1 -1
- claude_mpm/services/local_ops/health_checks/http_check.py +2 -1
- claude_mpm/services/local_ops/health_checks/process_check.py +2 -1
- claude_mpm/services/local_ops/health_checks/resource_check.py +2 -1
- claude_mpm/services/local_ops/health_manager.py +1 -1
- claude_mpm/services/local_ops/process_manager.py +12 -12
- claude_mpm/services/local_ops/restart_manager.py +1 -1
- claude_mpm/services/local_ops/state_manager.py +6 -5
- claude_mpm/services/local_ops/unified_manager.py +2 -2
- claude_mpm/services/mcp_config_manager.py +7 -126
- claude_mpm/services/mcp_gateway/auto_configure.py +31 -25
- claude_mpm/services/mcp_gateway/core/__init__.py +1 -2
- claude_mpm/services/mcp_gateway/core/base.py +18 -31
- claude_mpm/services/mcp_gateway/core/process_pool.py +19 -10
- claude_mpm/services/mcp_gateway/tools/external_mcp_services.py +97 -45
- claude_mpm/services/mcp_gateway/tools/health_check_tool.py +30 -28
- claude_mpm/services/memory_hook_service.py +4 -1
- claude_mpm/services/monitor/daemon_manager.py +3 -2
- claude_mpm/services/monitor/handlers/dashboard.py +2 -1
- claude_mpm/services/monitor/handlers/hooks.py +2 -1
- claude_mpm/services/monitor/management/lifecycle.py +3 -2
- claude_mpm/services/monitor/server.py +2 -1
- claude_mpm/services/session_management_service.py +3 -2
- claude_mpm/services/session_manager.py +205 -1
- claude_mpm/services/shared/async_service_base.py +16 -27
- claude_mpm/services/shared/lifecycle_service_base.py +1 -14
- claude_mpm/services/socketio/handlers/__init__.py +5 -2
- claude_mpm/services/socketio/handlers/hook.py +13 -2
- claude_mpm/services/socketio/handlers/registry.py +4 -2
- claude_mpm/services/socketio/server/main.py +10 -8
- claude_mpm/services/subprocess_launcher_service.py +14 -5
- claude_mpm/services/unified/analyzer_strategies/code_analyzer.py +8 -7
- claude_mpm/services/unified/analyzer_strategies/dependency_analyzer.py +6 -5
- claude_mpm/services/unified/analyzer_strategies/performance_analyzer.py +8 -7
- claude_mpm/services/unified/analyzer_strategies/security_analyzer.py +7 -6
- claude_mpm/services/unified/analyzer_strategies/structure_analyzer.py +5 -4
- claude_mpm/services/unified/config_strategies/validation_strategy.py +13 -9
- claude_mpm/services/unified/deployment_strategies/cloud_strategies.py +10 -3
- claude_mpm/services/unified/deployment_strategies/local.py +6 -5
- claude_mpm/services/unified/deployment_strategies/utils.py +6 -5
- claude_mpm/services/unified/deployment_strategies/vercel.py +7 -6
- claude_mpm/services/unified/interfaces.py +3 -1
- claude_mpm/services/unified/unified_analyzer.py +14 -10
- claude_mpm/services/unified/unified_config.py +2 -1
- claude_mpm/services/unified/unified_deployment.py +9 -4
- claude_mpm/services/version_service.py +104 -1
- claude_mpm/skills/__init__.py +42 -0
- claude_mpm/skills/agent_skills_injector.py +324 -0
- claude_mpm/skills/bundled/LICENSE_ATTRIBUTIONS.md +79 -0
- claude_mpm/skills/bundled/__init__.py +6 -0
- claude_mpm/skills/bundled/api-documentation.md +393 -0
- claude_mpm/skills/bundled/async-testing.md +571 -0
- claude_mpm/skills/bundled/code-review.md +143 -0
- claude_mpm/skills/bundled/collaboration/brainstorming/SKILL.md +79 -0
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/SKILL.md +178 -0
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/agent-prompts.md +577 -0
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/coordination-patterns.md +467 -0
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/examples.md +537 -0
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/troubleshooting.md +730 -0
- claude_mpm/skills/bundled/collaboration/requesting-code-review/SKILL.md +112 -0
- claude_mpm/skills/bundled/collaboration/requesting-code-review/references/code-reviewer-template.md +146 -0
- claude_mpm/skills/bundled/collaboration/requesting-code-review/references/review-examples.md +412 -0
- claude_mpm/skills/bundled/collaboration/writing-plans/SKILL.md +81 -0
- claude_mpm/skills/bundled/collaboration/writing-plans/references/best-practices.md +362 -0
- claude_mpm/skills/bundled/collaboration/writing-plans/references/plan-structure-templates.md +312 -0
- claude_mpm/skills/bundled/database-migration.md +199 -0
- claude_mpm/skills/bundled/debugging/root-cause-tracing/SKILL.md +152 -0
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/advanced-techniques.md +668 -0
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/examples.md +587 -0
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/integration.md +438 -0
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/tracing-techniques.md +391 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/CREATION-LOG.md +119 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/SKILL.md +148 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/anti-patterns.md +483 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/examples.md +452 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/troubleshooting.md +449 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/workflow.md +411 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-academic.md +14 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-1.md +58 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-2.md +68 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-3.md +69 -0
- claude_mpm/skills/bundled/debugging/verification-before-completion/SKILL.md +131 -0
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/gate-function.md +325 -0
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/integration-and-workflows.md +490 -0
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/red-flags-and-failures.md +425 -0
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/verification-patterns.md +499 -0
- claude_mpm/skills/bundled/docker-containerization.md +194 -0
- claude_mpm/skills/bundled/express-local-dev.md +1429 -0
- claude_mpm/skills/bundled/fastapi-local-dev.md +1199 -0
- claude_mpm/skills/bundled/git-workflow.md +414 -0
- claude_mpm/skills/bundled/imagemagick.md +204 -0
- claude_mpm/skills/bundled/json-data-handling.md +223 -0
- claude_mpm/skills/bundled/main/artifacts-builder/SKILL.md +86 -0
- claude_mpm/skills/bundled/main/internal-comms/SKILL.md +43 -0
- claude_mpm/skills/bundled/main/internal-comms/examples/3p-updates.md +47 -0
- claude_mpm/skills/bundled/main/internal-comms/examples/company-newsletter.md +65 -0
- claude_mpm/skills/bundled/main/internal-comms/examples/faq-answers.md +30 -0
- claude_mpm/skills/bundled/main/internal-comms/examples/general-comms.md +16 -0
- claude_mpm/skills/bundled/main/mcp-builder/SKILL.md +160 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/design_principles.md +412 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/evaluation.md +602 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/mcp_best_practices.md +915 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/node_mcp_server.md +916 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/python_mcp_server.md +752 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/workflow.md +1237 -0
- claude_mpm/skills/bundled/main/mcp-builder/scripts/connections.py +157 -0
- claude_mpm/skills/bundled/main/mcp-builder/scripts/evaluation.py +425 -0
- claude_mpm/skills/bundled/main/skill-creator/SKILL.md +189 -0
- claude_mpm/skills/bundled/main/skill-creator/references/best-practices.md +500 -0
- claude_mpm/skills/bundled/main/skill-creator/references/creation-workflow.md +464 -0
- claude_mpm/skills/bundled/main/skill-creator/references/examples.md +619 -0
- claude_mpm/skills/bundled/main/skill-creator/references/progressive-disclosure.md +437 -0
- claude_mpm/skills/bundled/main/skill-creator/references/skill-structure.md +231 -0
- claude_mpm/skills/bundled/main/skill-creator/scripts/init_skill.py +303 -0
- claude_mpm/skills/bundled/main/skill-creator/scripts/package_skill.py +113 -0
- claude_mpm/skills/bundled/main/skill-creator/scripts/quick_validate.py +72 -0
- claude_mpm/skills/bundled/nextjs-local-dev.md +807 -0
- claude_mpm/skills/bundled/pdf.md +141 -0
- claude_mpm/skills/bundled/performance-profiling.md +567 -0
- claude_mpm/skills/bundled/php/espocrm-development/SKILL.md +170 -0
- claude_mpm/skills/bundled/php/espocrm-development/references/architecture.md +602 -0
- claude_mpm/skills/bundled/php/espocrm-development/references/common-tasks.md +821 -0
- claude_mpm/skills/bundled/php/espocrm-development/references/development-workflow.md +742 -0
- claude_mpm/skills/bundled/php/espocrm-development/references/frontend-customization.md +726 -0
- claude_mpm/skills/bundled/php/espocrm-development/references/hooks-and-services.md +764 -0
- claude_mpm/skills/bundled/php/espocrm-development/references/testing-debugging.md +831 -0
- claude_mpm/skills/bundled/refactoring-patterns.md +180 -0
- claude_mpm/skills/bundled/rust/desktop-applications/SKILL.md +226 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/architecture-patterns.md +901 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/native-gui-frameworks.md +901 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/platform-integration.md +775 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/state-management.md +937 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/tauri-framework.md +770 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/testing-deployment.md +961 -0
- claude_mpm/skills/bundled/security-scanning.md +327 -0
- claude_mpm/skills/bundled/systematic-debugging.md +473 -0
- claude_mpm/skills/bundled/test-driven-development.md +378 -0
- claude_mpm/skills/bundled/testing/condition-based-waiting/SKILL.md +119 -0
- claude_mpm/skills/bundled/testing/condition-based-waiting/references/patterns-and-implementation.md +253 -0
- claude_mpm/skills/bundled/testing/test-driven-development/SKILL.md +145 -0
- claude_mpm/skills/bundled/testing/test-driven-development/references/anti-patterns.md +543 -0
- claude_mpm/skills/bundled/testing/test-driven-development/references/examples.md +741 -0
- claude_mpm/skills/bundled/testing/test-driven-development/references/integration.md +470 -0
- claude_mpm/skills/bundled/testing/test-driven-development/references/philosophy.md +458 -0
- claude_mpm/skills/bundled/testing/test-driven-development/references/workflow.md +639 -0
- claude_mpm/skills/bundled/testing/testing-anti-patterns/SKILL.md +140 -0
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/completeness-anti-patterns.md +572 -0
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/core-anti-patterns.md +411 -0
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/detection-guide.md +569 -0
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/tdd-connection.md +695 -0
- claude_mpm/skills/bundled/testing/webapp-testing/SKILL.md +184 -0
- claude_mpm/skills/bundled/testing/webapp-testing/decision-tree.md +459 -0
- claude_mpm/skills/bundled/testing/webapp-testing/examples/console_logging.py +35 -0
- claude_mpm/skills/bundled/testing/webapp-testing/examples/element_discovery.py +44 -0
- claude_mpm/skills/bundled/testing/webapp-testing/examples/static_html_automation.py +34 -0
- claude_mpm/skills/bundled/testing/webapp-testing/playwright-patterns.md +479 -0
- claude_mpm/skills/bundled/testing/webapp-testing/reconnaissance-pattern.md +687 -0
- claude_mpm/skills/bundled/testing/webapp-testing/scripts/with_server.py +129 -0
- claude_mpm/skills/bundled/testing/webapp-testing/server-management.md +758 -0
- claude_mpm/skills/bundled/testing/webapp-testing/troubleshooting.md +868 -0
- claude_mpm/skills/bundled/vite-local-dev.md +1061 -0
- claude_mpm/skills/bundled/web-performance-optimization.md +2305 -0
- claude_mpm/skills/bundled/xlsx.md +157 -0
- claude_mpm/skills/registry.py +286 -0
- claude_mpm/skills/skill_manager.py +310 -0
- claude_mpm/skills/skills_registry.py +348 -0
- claude_mpm/skills/skills_service.py +739 -0
- claude_mpm/tools/code_tree_analyzer.py +177 -141
- claude_mpm/tools/code_tree_events.py +4 -2
- claude_mpm/utils/agent_dependency_loader.py +2 -2
- {claude_mpm-4.14.6.dist-info → claude_mpm-4.21.0.dist-info}/METADATA +211 -33
- {claude_mpm-4.14.6.dist-info → claude_mpm-4.21.0.dist-info}/RECORD +339 -199
- claude_mpm/agents/INSTRUCTIONS_OLD_DEPRECATED.md +0 -602
- claude_mpm/cli/commands/mpm_init.py +0 -1994
- claude_mpm/dashboard/static/css/code-tree.css +0 -1639
- claude_mpm/dashboard/static/js/components/code-tree/tree-breadcrumb.js +0 -353
- claude_mpm/dashboard/static/js/components/code-tree/tree-constants.js +0 -235
- claude_mpm/dashboard/static/js/components/code-tree/tree-search.js +0 -409
- claude_mpm/dashboard/static/js/components/code-tree/tree-utils.js +0 -435
- claude_mpm/dashboard/static/js/components/code-tree.js +0 -5869
- claude_mpm/dashboard/static/js/components/code-viewer.js +0 -1386
- claude_mpm/hooks/claude_hooks/hook_handler_eventbus.py +0 -425
- claude_mpm/hooks/claude_hooks/hook_handler_original.py +0 -1041
- claude_mpm/hooks/claude_hooks/hook_handler_refactored.py +0 -347
- claude_mpm/services/agents/deployment/agent_lifecycle_manager_refactored.py +0 -575
- claude_mpm/services/project/analyzer_refactored.py +0 -450
- {claude_mpm-4.14.6.dist-info → claude_mpm-4.21.0.dist-info}/WHEEL +0 -0
- {claude_mpm-4.14.6.dist-info → claude_mpm-4.21.0.dist-info}/entry_points.txt +0 -0
- {claude_mpm-4.14.6.dist-info → claude_mpm-4.21.0.dist-info}/licenses/LICENSE +0 -0
- {claude_mpm-4.14.6.dist-info → claude_mpm-4.21.0.dist-info}/top_level.txt +0 -0
|
@@ -2,12 +2,22 @@
|
|
|
2
2
|
External MCP Services Integration
|
|
3
3
|
==================================
|
|
4
4
|
|
|
5
|
-
Manages
|
|
5
|
+
Manages detection and setup of external MCP services like mcp-vector-search
|
|
6
6
|
and mcp-browser. These services run as separate MCP servers in Claude Code,
|
|
7
7
|
not as part of the Claude MPM MCP Gateway.
|
|
8
8
|
|
|
9
|
-
|
|
10
|
-
|
|
9
|
+
IMPORTANT: External services are NOT auto-installed. Users must manually install
|
|
10
|
+
them using pipx or pip. This gives users explicit control over which optional
|
|
11
|
+
services they want to enable.
|
|
12
|
+
|
|
13
|
+
Installation:
|
|
14
|
+
pipx install mcp-vector-search
|
|
15
|
+
pipx install mcp-browser
|
|
16
|
+
pipx install kuzu-memory
|
|
17
|
+
pipx install mcp-ticketer
|
|
18
|
+
|
|
19
|
+
Note: External services are registered as separate MCP servers in Claude Code
|
|
20
|
+
configuration, not as tools within the gateway.
|
|
11
21
|
"""
|
|
12
22
|
|
|
13
23
|
import json
|
|
@@ -20,7 +30,12 @@ from claude_mpm.services.mcp_gateway.tools.base_adapter import BaseToolAdapter
|
|
|
20
30
|
|
|
21
31
|
|
|
22
32
|
class ExternalMCPService(BaseToolAdapter):
|
|
23
|
-
"""Base class for external MCP service integration.
|
|
33
|
+
"""Base class for external MCP service integration.
|
|
34
|
+
|
|
35
|
+
External services are detected if already installed but are NOT
|
|
36
|
+
automatically installed. Users must install them manually using
|
|
37
|
+
pipx or pip to enable these optional features.
|
|
38
|
+
"""
|
|
24
39
|
|
|
25
40
|
def __init__(self, service_name: str, package_name: str):
|
|
26
41
|
"""
|
|
@@ -65,27 +80,37 @@ class ExternalMCPService(BaseToolAdapter):
|
|
|
65
80
|
)
|
|
66
81
|
|
|
67
82
|
async def initialize(
|
|
68
|
-
self, auto_install: bool =
|
|
83
|
+
self, auto_install: bool = False, interactive: bool = False
|
|
69
84
|
) -> bool:
|
|
70
85
|
"""Initialize the external service.
|
|
71
86
|
|
|
87
|
+
NOTE: Auto-installation is disabled by default (v4.9.0+). Users must
|
|
88
|
+
manually install external services using pipx or pip.
|
|
89
|
+
|
|
72
90
|
Args:
|
|
73
|
-
auto_install: Whether to automatically install if not found
|
|
74
|
-
|
|
91
|
+
auto_install: Whether to automatically install if not found (default: False)
|
|
92
|
+
Deprecated - will be removed in future versions
|
|
93
|
+
interactive: Whether to prompt user for installation preferences (default: False)
|
|
94
|
+
Only used if auto_install=True
|
|
75
95
|
"""
|
|
76
96
|
try:
|
|
77
97
|
# Check if package is installed
|
|
78
98
|
self._is_installed = await self._check_installation()
|
|
79
99
|
|
|
80
100
|
if not self._is_installed and auto_install:
|
|
81
|
-
|
|
82
|
-
|
|
101
|
+
# This path is deprecated but kept for backward compatibility
|
|
102
|
+
self.logger.warning(
|
|
103
|
+
f"Auto-installation is deprecated. Please install {self.package_name} manually: "
|
|
104
|
+
f"pipx install {self.package_name}"
|
|
83
105
|
)
|
|
84
106
|
await self._install_package(interactive=interactive)
|
|
85
107
|
self._is_installed = await self._check_installation()
|
|
86
108
|
|
|
87
109
|
if not self._is_installed:
|
|
88
|
-
self.logger.
|
|
110
|
+
self.logger.debug(
|
|
111
|
+
f"{self.package_name} is not available. "
|
|
112
|
+
f"Install manually with: pipx install {self.package_name}"
|
|
113
|
+
)
|
|
89
114
|
return False
|
|
90
115
|
|
|
91
116
|
self.logger.info(f"{self.package_name} is available")
|
|
@@ -136,12 +161,17 @@ class ExternalMCPService(BaseToolAdapter):
|
|
|
136
161
|
|
|
137
162
|
if interactive:
|
|
138
163
|
# Show user-friendly installation prompt
|
|
139
|
-
print(f"\n⚠️ {self.package_name} not found")
|
|
140
|
-
print(
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
print("
|
|
164
|
+
print(f"\n⚠️ {self.package_name} not found", file=sys.stderr)
|
|
165
|
+
print(
|
|
166
|
+
"This package enables enhanced functionality (optional).",
|
|
167
|
+
file=sys.stderr,
|
|
168
|
+
)
|
|
169
|
+
print("\nInstallation options:", file=sys.stderr)
|
|
170
|
+
print(
|
|
171
|
+
"1. Install via pip (recommended for this project)", file=sys.stderr
|
|
172
|
+
)
|
|
173
|
+
print("2. Install via pipx (isolated, system-wide)", file=sys.stderr)
|
|
174
|
+
print("3. Skip (continue without this package)", file=sys.stderr)
|
|
145
175
|
|
|
146
176
|
try:
|
|
147
177
|
choice = input("\nChoose option (1/2/3) [1]: ").strip() or "1"
|
|
@@ -155,7 +185,7 @@ class ExternalMCPService(BaseToolAdapter):
|
|
|
155
185
|
)
|
|
156
186
|
return False
|
|
157
187
|
except (EOFError, KeyboardInterrupt):
|
|
158
|
-
print("\nInstallation cancelled")
|
|
188
|
+
print("\nInstallation cancelled", file=sys.stderr)
|
|
159
189
|
return False
|
|
160
190
|
else:
|
|
161
191
|
# Non-interactive: default to pip
|
|
@@ -176,7 +206,7 @@ class ExternalMCPService(BaseToolAdapter):
|
|
|
176
206
|
async def _install_via_pip(self) -> bool:
|
|
177
207
|
"""Install package via pip."""
|
|
178
208
|
try:
|
|
179
|
-
print(f"\n📦 Installing {self.package_name} via pip...")
|
|
209
|
+
print(f"\n📦 Installing {self.package_name} via pip...", file=sys.stderr)
|
|
180
210
|
result = subprocess.run(
|
|
181
211
|
[sys.executable, "-m", "pip", "install", self.package_name],
|
|
182
212
|
capture_output=True,
|
|
@@ -186,21 +216,21 @@ class ExternalMCPService(BaseToolAdapter):
|
|
|
186
216
|
)
|
|
187
217
|
|
|
188
218
|
if result.returncode == 0:
|
|
189
|
-
print(f"✓ Successfully installed {self.package_name}")
|
|
219
|
+
print(f"✓ Successfully installed {self.package_name}", file=sys.stderr)
|
|
190
220
|
self.logger.info(f"Successfully installed {self.package_name} via pip")
|
|
191
221
|
return True
|
|
192
222
|
|
|
193
223
|
error_msg = result.stderr.strip() if result.stderr else "Unknown error"
|
|
194
|
-
print(f"✗ Installation failed: {error_msg}")
|
|
224
|
+
print(f"✗ Installation failed: {error_msg}", file=sys.stderr)
|
|
195
225
|
self.logger.error(f"Failed to install {self.package_name}: {error_msg}")
|
|
196
226
|
return False
|
|
197
227
|
|
|
198
228
|
except subprocess.TimeoutExpired:
|
|
199
|
-
print("✗ Installation timed out")
|
|
229
|
+
print("✗ Installation timed out", file=sys.stderr)
|
|
200
230
|
self.logger.error(f"Installation of {self.package_name} timed out")
|
|
201
231
|
return False
|
|
202
232
|
except Exception as e:
|
|
203
|
-
print(f"✗ Installation error: {e}")
|
|
233
|
+
print(f"✗ Installation error: {e}", file=sys.stderr)
|
|
204
234
|
self.logger.error(f"Error installing {self.package_name}: {e}")
|
|
205
235
|
return False
|
|
206
236
|
|
|
@@ -217,12 +247,12 @@ class ExternalMCPService(BaseToolAdapter):
|
|
|
217
247
|
)
|
|
218
248
|
|
|
219
249
|
if pipx_check.returncode != 0:
|
|
220
|
-
print("✗ pipx is not installed")
|
|
221
|
-
print("Install pipx first: python -m pip install pipx")
|
|
250
|
+
print("✗ pipx is not installed", file=sys.stderr)
|
|
251
|
+
print("Install pipx first: python -m pip install pipx", file=sys.stderr)
|
|
222
252
|
self.logger.error("pipx not available for installation")
|
|
223
253
|
return False
|
|
224
254
|
|
|
225
|
-
print(f"\n📦 Installing {self.package_name} via pipx...")
|
|
255
|
+
print(f"\n📦 Installing {self.package_name} via pipx...", file=sys.stderr)
|
|
226
256
|
result = subprocess.run(
|
|
227
257
|
["pipx", "install", self.package_name],
|
|
228
258
|
capture_output=True,
|
|
@@ -232,26 +262,26 @@ class ExternalMCPService(BaseToolAdapter):
|
|
|
232
262
|
)
|
|
233
263
|
|
|
234
264
|
if result.returncode == 0:
|
|
235
|
-
print(f"✓ Successfully installed {self.package_name}")
|
|
265
|
+
print(f"✓ Successfully installed {self.package_name}", file=sys.stderr)
|
|
236
266
|
self.logger.info(f"Successfully installed {self.package_name} via pipx")
|
|
237
267
|
return True
|
|
238
268
|
|
|
239
269
|
error_msg = result.stderr.strip() if result.stderr else "Unknown error"
|
|
240
|
-
print(f"✗ Installation failed: {error_msg}")
|
|
270
|
+
print(f"✗ Installation failed: {error_msg}", file=sys.stderr)
|
|
241
271
|
self.logger.error(f"Failed to install {self.package_name}: {error_msg}")
|
|
242
272
|
return False
|
|
243
273
|
|
|
244
274
|
except FileNotFoundError:
|
|
245
|
-
print("✗ pipx command not found")
|
|
246
|
-
print("Install pipx first: python -m pip install pipx")
|
|
275
|
+
print("✗ pipx command not found", file=sys.stderr)
|
|
276
|
+
print("Install pipx first: python -m pip install pipx", file=sys.stderr)
|
|
247
277
|
self.logger.error("pipx command not found")
|
|
248
278
|
return False
|
|
249
279
|
except subprocess.TimeoutExpired:
|
|
250
|
-
print("✗ Installation timed out")
|
|
280
|
+
print("✗ Installation timed out", file=sys.stderr)
|
|
251
281
|
self.logger.error(f"Installation of {self.package_name} timed out")
|
|
252
282
|
return False
|
|
253
283
|
except Exception as e:
|
|
254
|
-
print(f"✗ Installation error: {e}")
|
|
284
|
+
print(f"✗ Installation error: {e}", file=sys.stderr)
|
|
255
285
|
self.logger.error(f"Error installing {self.package_name}: {e}")
|
|
256
286
|
return False
|
|
257
287
|
|
|
@@ -522,13 +552,20 @@ class MCPBrowserService(ExternalMCPService):
|
|
|
522
552
|
class ExternalMCPServiceManager:
|
|
523
553
|
"""Manager for external MCP services.
|
|
524
554
|
|
|
525
|
-
This manager is responsible for
|
|
526
|
-
for external MCP services. The actual registration of these services
|
|
527
|
-
|
|
555
|
+
This manager is responsible for detecting (but NOT installing) Python packages
|
|
556
|
+
for external MCP services. The actual registration of these services happens
|
|
557
|
+
in Claude Code configuration as separate MCP servers.
|
|
558
|
+
|
|
559
|
+
IMPORTANT: As of v4.9.0, this manager NO LONGER auto-installs missing services.
|
|
560
|
+
Users must manually install external services using pipx or pip:
|
|
561
|
+
- pipx install mcp-vector-search
|
|
562
|
+
- pipx install mcp-browser
|
|
563
|
+
- pipx install kuzu-memory
|
|
564
|
+
- pipx install mcp-ticketer
|
|
528
565
|
|
|
529
|
-
Note: This class is maintained for backward compatibility and
|
|
530
|
-
|
|
531
|
-
|
|
566
|
+
Note: This class is maintained for backward compatibility and service detection.
|
|
567
|
+
The actual tool registration is handled by separate MCP server instances in
|
|
568
|
+
Claude Code.
|
|
532
569
|
"""
|
|
533
570
|
|
|
534
571
|
def __init__(self):
|
|
@@ -539,20 +576,34 @@ class ExternalMCPServiceManager:
|
|
|
539
576
|
async def initialize_services(self) -> List[ExternalMCPService]:
|
|
540
577
|
"""Initialize all external MCP services.
|
|
541
578
|
|
|
542
|
-
This method checks if external service packages are installed
|
|
543
|
-
and
|
|
544
|
-
|
|
579
|
+
This method checks if external service packages are already installed
|
|
580
|
+
and registers them if available. It does NOT auto-install missing services.
|
|
581
|
+
|
|
582
|
+
External MCP services (mcp-vector-search, mcp-browser, kuzu-memory, mcp-ticketer)
|
|
583
|
+
must be manually installed by users. This gives users explicit control over
|
|
584
|
+
which services they want to use.
|
|
585
|
+
|
|
586
|
+
Installation instructions:
|
|
587
|
+
- mcp-vector-search: pipx install mcp-vector-search
|
|
588
|
+
- mcp-browser: pipx install mcp-browser
|
|
589
|
+
- kuzu-memory: pipx install kuzu-memory
|
|
590
|
+
- mcp-ticketer: pipx install mcp-ticketer
|
|
591
|
+
|
|
592
|
+
Services run as separate MCP servers in Claude Code, not as tools within
|
|
593
|
+
the gateway.
|
|
545
594
|
"""
|
|
546
595
|
# Create service instances
|
|
547
|
-
# Note: kuzu-memory
|
|
548
|
-
#
|
|
596
|
+
# Note: kuzu-memory and mcp-ticketer are configured via MCPConfigManager
|
|
597
|
+
# and run as separate MCP servers. They don't need to be included here
|
|
598
|
+
# since they're already set up through the MCP config.
|
|
549
599
|
services = [MCPVectorSearchService(), MCPBrowserService()]
|
|
550
600
|
|
|
551
|
-
# Initialize each service
|
|
601
|
+
# Initialize each service (check if installed, but DO NOT auto-install)
|
|
552
602
|
initialized_services = []
|
|
553
603
|
for service in services:
|
|
554
604
|
try:
|
|
555
|
-
|
|
605
|
+
# Pass auto_install=False to prevent automatic installation
|
|
606
|
+
if await service.initialize(auto_install=False, interactive=False):
|
|
556
607
|
initialized_services.append(service)
|
|
557
608
|
if self.logger:
|
|
558
609
|
self.logger.info(
|
|
@@ -560,7 +611,8 @@ class ExternalMCPServiceManager:
|
|
|
560
611
|
)
|
|
561
612
|
elif self.logger:
|
|
562
613
|
self.logger.debug(
|
|
563
|
-
f"Service not available (optional): {service.service_name}"
|
|
614
|
+
f"Service not available (optional): {service.service_name}. "
|
|
615
|
+
f"Install manually with: pipx install {service.package_name}"
|
|
564
616
|
)
|
|
565
617
|
except Exception as e:
|
|
566
618
|
if self.logger:
|
|
@@ -26,6 +26,7 @@ from typing import Any, Dict
|
|
|
26
26
|
import psutil
|
|
27
27
|
|
|
28
28
|
from claude_mpm.config.paths import paths
|
|
29
|
+
from claude_mpm.core.enums import HealthStatus, OperationResult, ServiceState
|
|
29
30
|
from claude_mpm.core.logger import get_logger
|
|
30
31
|
from claude_mpm.services.mcp_gateway.core.interfaces import (
|
|
31
32
|
MCPToolDefinition,
|
|
@@ -168,20 +169,20 @@ class HealthCheckTool(BaseToolAdapter):
|
|
|
168
169
|
if i < len(check_results):
|
|
169
170
|
if isinstance(check_results[i], Exception):
|
|
170
171
|
results["checks"][check_name] = {
|
|
171
|
-
"status":
|
|
172
|
+
"status": OperationResult.ERROR,
|
|
172
173
|
"error": str(check_results[i]),
|
|
173
174
|
}
|
|
174
175
|
else:
|
|
175
176
|
results["checks"][check_name] = check_results[i]
|
|
176
177
|
else:
|
|
177
178
|
results["checks"][check_name] = {
|
|
178
|
-
"status":
|
|
179
|
+
"status": OperationResult.TIMEOUT,
|
|
179
180
|
"error": "Check timed out",
|
|
180
181
|
}
|
|
181
182
|
|
|
182
183
|
except asyncio.TimeoutError:
|
|
183
184
|
results["checks"]["timeout"] = {
|
|
184
|
-
"status":
|
|
185
|
+
"status": OperationResult.ERROR,
|
|
185
186
|
"error": f"Health checks timed out after {timeout} seconds",
|
|
186
187
|
}
|
|
187
188
|
|
|
@@ -194,7 +195,7 @@ class HealthCheckTool(BaseToolAdapter):
|
|
|
194
195
|
async def _check_system_health(self, detailed: bool) -> Dict[str, Any]:
|
|
195
196
|
"""Check system health (CPU, memory, disk, etc.)."""
|
|
196
197
|
check_result = {
|
|
197
|
-
"status":
|
|
198
|
+
"status": ServiceState.RUNNING,
|
|
198
199
|
"checks": {},
|
|
199
200
|
"warnings": [],
|
|
200
201
|
"errors": [],
|
|
@@ -219,7 +220,7 @@ class HealthCheckTool(BaseToolAdapter):
|
|
|
219
220
|
|
|
220
221
|
if memory_usage > 90:
|
|
221
222
|
check_result["errors"].append("High memory usage detected")
|
|
222
|
-
check_result["status"] =
|
|
223
|
+
check_result["status"] = HealthStatus.UNHEALTHY
|
|
223
224
|
elif memory_usage > 80:
|
|
224
225
|
check_result["warnings"].append("Elevated memory usage")
|
|
225
226
|
|
|
@@ -232,7 +233,7 @@ class HealthCheckTool(BaseToolAdapter):
|
|
|
232
233
|
|
|
233
234
|
if cpu_usage > 95:
|
|
234
235
|
check_result["errors"].append("High CPU usage detected")
|
|
235
|
-
check_result["status"] =
|
|
236
|
+
check_result["status"] = HealthStatus.UNHEALTHY
|
|
236
237
|
elif cpu_usage > 80:
|
|
237
238
|
check_result["warnings"].append("Elevated CPU usage")
|
|
238
239
|
|
|
@@ -248,7 +249,7 @@ class HealthCheckTool(BaseToolAdapter):
|
|
|
248
249
|
|
|
249
250
|
if disk_usage_percent > 95:
|
|
250
251
|
check_result["errors"].append("Disk space critically low")
|
|
251
|
-
check_result["status"] =
|
|
252
|
+
check_result["status"] = HealthStatus.UNHEALTHY
|
|
252
253
|
elif disk_usage_percent > 85:
|
|
253
254
|
check_result["warnings"].append("Disk space running low")
|
|
254
255
|
|
|
@@ -262,7 +263,7 @@ class HealthCheckTool(BaseToolAdapter):
|
|
|
262
263
|
}
|
|
263
264
|
|
|
264
265
|
except Exception as e:
|
|
265
|
-
check_result["status"] =
|
|
266
|
+
check_result["status"] = HealthStatus.UNHEALTHY
|
|
266
267
|
check_result["errors"].append(f"System health check failed: {e}")
|
|
267
268
|
|
|
268
269
|
return check_result
|
|
@@ -270,7 +271,7 @@ class HealthCheckTool(BaseToolAdapter):
|
|
|
270
271
|
async def _check_gateway_health(self, detailed: bool) -> Dict[str, Any]:
|
|
271
272
|
"""Check MCP Gateway health."""
|
|
272
273
|
check_result = {
|
|
273
|
-
"status":
|
|
274
|
+
"status": ServiceState.RUNNING,
|
|
274
275
|
"checks": {},
|
|
275
276
|
"warnings": [],
|
|
276
277
|
"errors": [],
|
|
@@ -302,10 +303,10 @@ class HealthCheckTool(BaseToolAdapter):
|
|
|
302
303
|
|
|
303
304
|
if not mcp_dir.exists():
|
|
304
305
|
check_result["errors"].append("MCP directory does not exist")
|
|
305
|
-
check_result["status"] =
|
|
306
|
+
check_result["status"] = HealthStatus.UNHEALTHY
|
|
306
307
|
|
|
307
308
|
except Exception as e:
|
|
308
|
-
check_result["status"] =
|
|
309
|
+
check_result["status"] = HealthStatus.UNHEALTHY
|
|
309
310
|
check_result["errors"].append(f"Gateway health check failed: {e}")
|
|
310
311
|
|
|
311
312
|
return check_result
|
|
@@ -313,7 +314,7 @@ class HealthCheckTool(BaseToolAdapter):
|
|
|
313
314
|
async def _check_tools_health(self, detailed: bool) -> Dict[str, Any]:
|
|
314
315
|
"""Check MCP tools health."""
|
|
315
316
|
check_result = {
|
|
316
|
-
"status":
|
|
317
|
+
"status": ServiceState.RUNNING,
|
|
317
318
|
"checks": {},
|
|
318
319
|
"warnings": [],
|
|
319
320
|
"errors": [],
|
|
@@ -353,11 +354,11 @@ class HealthCheckTool(BaseToolAdapter):
|
|
|
353
354
|
)
|
|
354
355
|
|
|
355
356
|
if len(available_essential) == 0:
|
|
356
|
-
check_result["status"] =
|
|
357
|
+
check_result["status"] = HealthStatus.UNHEALTHY
|
|
357
358
|
check_result["errors"].append("No essential tools available")
|
|
358
359
|
|
|
359
360
|
except Exception as e:
|
|
360
|
-
check_result["status"] =
|
|
361
|
+
check_result["status"] = HealthStatus.UNHEALTHY
|
|
361
362
|
check_result["errors"].append(f"Tools health check failed: {e}")
|
|
362
363
|
|
|
363
364
|
return check_result
|
|
@@ -365,7 +366,7 @@ class HealthCheckTool(BaseToolAdapter):
|
|
|
365
366
|
async def _check_config_health(self, detailed: bool) -> Dict[str, Any]:
|
|
366
367
|
"""Check configuration health."""
|
|
367
368
|
check_result = {
|
|
368
|
-
"status":
|
|
369
|
+
"status": ServiceState.RUNNING,
|
|
369
370
|
"checks": {},
|
|
370
371
|
"warnings": [],
|
|
371
372
|
"errors": [],
|
|
@@ -401,7 +402,7 @@ class HealthCheckTool(BaseToolAdapter):
|
|
|
401
402
|
}
|
|
402
403
|
|
|
403
404
|
except Exception as e:
|
|
404
|
-
check_result["status"] =
|
|
405
|
+
check_result["status"] = HealthStatus.UNHEALTHY
|
|
405
406
|
check_result["errors"].append(f"Config health check failed: {e}")
|
|
406
407
|
|
|
407
408
|
return check_result
|
|
@@ -413,13 +414,13 @@ class HealthCheckTool(BaseToolAdapter):
|
|
|
413
414
|
|
|
414
415
|
statuses = [check.get("status", "unknown") for check in checks.values()]
|
|
415
416
|
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
if "unhealthy" in statuses:
|
|
417
|
+
# Check for unhealthy (handle both string and enum)
|
|
418
|
+
if HealthStatus.UNHEALTHY in statuses or "unhealthy" in statuses:
|
|
419
419
|
return "unhealthy"
|
|
420
420
|
if "warning" in statuses:
|
|
421
421
|
return "warning"
|
|
422
|
-
|
|
422
|
+
# Check for healthy (handle both string and enum)
|
|
423
|
+
if all(status in (HealthStatus.HEALTHY, "healthy") for status in statuses):
|
|
423
424
|
return "healthy"
|
|
424
425
|
return "unknown"
|
|
425
426
|
|
|
@@ -436,19 +437,20 @@ class HealthCheckTool(BaseToolAdapter):
|
|
|
436
437
|
for check_name, check_result in checks.items():
|
|
437
438
|
status = check_result.get("status", "unknown")
|
|
438
439
|
|
|
439
|
-
|
|
440
|
+
# Check for healthy (handle both string and enum)
|
|
441
|
+
if status in (HealthStatus.HEALTHY, "healthy"):
|
|
440
442
|
summary["healthy"] += 1
|
|
441
|
-
elif status in ["warning", "unhealthy"]:
|
|
443
|
+
elif status in ["warning", HealthStatus.UNHEALTHY, "unhealthy"]:
|
|
442
444
|
summary["warnings"] += 1
|
|
443
445
|
# Collect warning messages
|
|
444
446
|
warnings = check_result.get("warnings", [])
|
|
445
447
|
for warning in warnings:
|
|
446
448
|
summary["issues"].append(f"{check_name}: {warning}")
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
449
|
+
# Collect error messages if status is unhealthy
|
|
450
|
+
if status in (HealthStatus.UNHEALTHY, "unhealthy"):
|
|
451
|
+
summary["errors"] += 1
|
|
452
|
+
errors = check_result.get("errors", [])
|
|
453
|
+
for error in errors:
|
|
454
|
+
summary["issues"].append(f"{check_name}: {error}")
|
|
453
455
|
|
|
454
456
|
return summary
|
|
@@ -11,6 +11,7 @@ Extracted from ClaudeRunner to follow Single Responsibility Principle.
|
|
|
11
11
|
from typing import Any, Dict
|
|
12
12
|
|
|
13
13
|
from claude_mpm.core.base_service import BaseService
|
|
14
|
+
from claude_mpm.core.enums import ServiceState
|
|
14
15
|
from claude_mpm.services.core.interfaces import MemoryHookInterface
|
|
15
16
|
|
|
16
17
|
|
|
@@ -463,5 +464,7 @@ class MemoryHookService(BaseService, MemoryHookInterface):
|
|
|
463
464
|
"hook_service_available": self.hook_service is not None,
|
|
464
465
|
"memory_enabled": self.is_memory_enabled(),
|
|
465
466
|
"total_hooks": len(self.registered_hooks),
|
|
466
|
-
"status":
|
|
467
|
+
"status": (
|
|
468
|
+
ServiceState.RUNNING if self.registered_hooks else ServiceState.IDLE
|
|
469
|
+
),
|
|
467
470
|
}
|
|
@@ -31,6 +31,7 @@ import time
|
|
|
31
31
|
from pathlib import Path
|
|
32
32
|
from typing import Optional, Tuple
|
|
33
33
|
|
|
34
|
+
from ...core.enums import OperationResult
|
|
34
35
|
from ...core.logging_config import get_logger
|
|
35
36
|
|
|
36
37
|
|
|
@@ -906,7 +907,7 @@ class DaemonManager:
|
|
|
906
907
|
with self.startup_status_file.open() as f:
|
|
907
908
|
status = f.read().strip()
|
|
908
909
|
|
|
909
|
-
if status ==
|
|
910
|
+
if status == OperationResult.SUCCESS:
|
|
910
911
|
# Cleanup status file
|
|
911
912
|
Path(self.startup_status_file).unlink(missing_ok=True)
|
|
912
913
|
return True
|
|
@@ -936,7 +937,7 @@ class DaemonManager:
|
|
|
936
937
|
# Don't check if file exists - we need to write to it regardless
|
|
937
938
|
# The parent created it and is waiting for us to update it
|
|
938
939
|
with self.startup_status_file.open("w") as f:
|
|
939
|
-
f.write(
|
|
940
|
+
f.write(OperationResult.SUCCESS)
|
|
940
941
|
f.flush() # Ensure it's written immediately
|
|
941
942
|
os.fsync(f.fileno()) # Force write to disk
|
|
942
943
|
except Exception:
|
|
@@ -18,6 +18,7 @@ from typing import Dict, Set
|
|
|
18
18
|
|
|
19
19
|
import socketio
|
|
20
20
|
|
|
21
|
+
from ....core.enums import ServiceState
|
|
21
22
|
from ....core.logging_config import get_logger
|
|
22
23
|
|
|
23
24
|
|
|
@@ -128,7 +129,7 @@ class DashboardHandler:
|
|
|
128
129
|
try:
|
|
129
130
|
status = {
|
|
130
131
|
"service": "unified-monitor",
|
|
131
|
-
"status":
|
|
132
|
+
"status": ServiceState.RUNNING,
|
|
132
133
|
"clients_connected": len(self.connected_clients),
|
|
133
134
|
"uptime": asyncio.get_event_loop().time(),
|
|
134
135
|
"features": {
|
|
@@ -19,6 +19,7 @@ from typing import Dict, List
|
|
|
19
19
|
|
|
20
20
|
import socketio
|
|
21
21
|
|
|
22
|
+
from ....core.enums import ServiceState
|
|
22
23
|
from ....core.logging_config import get_logger
|
|
23
24
|
|
|
24
25
|
|
|
@@ -170,7 +171,7 @@ class HookHandler:
|
|
|
170
171
|
session_info = {
|
|
171
172
|
"session_id": session_id,
|
|
172
173
|
"start_time": asyncio.get_event_loop().time(),
|
|
173
|
-
"status":
|
|
174
|
+
"status": ServiceState.RUNNING,
|
|
174
175
|
"event_count": 0,
|
|
175
176
|
"last_activity": asyncio.get_event_loop().time(),
|
|
176
177
|
"metadata": data.get("metadata", {}),
|
|
@@ -23,6 +23,7 @@ import time
|
|
|
23
23
|
from pathlib import Path
|
|
24
24
|
from typing import Optional, Tuple
|
|
25
25
|
|
|
26
|
+
from ....core.enums import OperationResult
|
|
26
27
|
from ....core.logging_config import get_logger
|
|
27
28
|
|
|
28
29
|
|
|
@@ -388,7 +389,7 @@ class DaemonLifecycle:
|
|
|
388
389
|
with self.startup_status_file.open() as f:
|
|
389
390
|
status = f.read().strip()
|
|
390
391
|
|
|
391
|
-
if status ==
|
|
392
|
+
if status == OperationResult.SUCCESS:
|
|
392
393
|
# Child started successfully
|
|
393
394
|
self._cleanup_status_file()
|
|
394
395
|
return True
|
|
@@ -438,7 +439,7 @@ class DaemonLifecycle:
|
|
|
438
439
|
if self.startup_status_file:
|
|
439
440
|
try:
|
|
440
441
|
with self.startup_status_file.open("w") as f:
|
|
441
|
-
f.write(
|
|
442
|
+
f.write(OperationResult.SUCCESS)
|
|
442
443
|
except Exception as e:
|
|
443
444
|
self.logger.error(f"Failed to report startup success: {e}")
|
|
444
445
|
|
|
@@ -26,6 +26,7 @@ from typing import Dict, Optional
|
|
|
26
26
|
import socketio
|
|
27
27
|
from aiohttp import web
|
|
28
28
|
|
|
29
|
+
from ...core.enums import ServiceState
|
|
29
30
|
from ...core.logging_config import get_logger
|
|
30
31
|
from ...dashboard.api.simple_directory import list_directory
|
|
31
32
|
from .event_emitter import get_event_emitter
|
|
@@ -333,7 +334,7 @@ class UnifiedMonitorServer:
|
|
|
333
334
|
|
|
334
335
|
return web.json_response(
|
|
335
336
|
{
|
|
336
|
-
"status":
|
|
337
|
+
"status": ServiceState.RUNNING,
|
|
337
338
|
"service": "claude-mpm-monitor", # Important: must match what is_our_service() checks
|
|
338
339
|
"version": version,
|
|
339
340
|
"port": self.port,
|
|
@@ -17,6 +17,7 @@ from datetime import timezone
|
|
|
17
17
|
from typing import Any, Dict, List, Optional
|
|
18
18
|
|
|
19
19
|
from claude_mpm.core.base_service import BaseService
|
|
20
|
+
from claude_mpm.core.enums import OperationResult, ServiceState
|
|
20
21
|
from claude_mpm.services.core.interfaces import SessionManagementInterface
|
|
21
22
|
|
|
22
23
|
|
|
@@ -223,7 +224,7 @@ class SessionManagementService(BaseService, SessionManagementInterface):
|
|
|
223
224
|
"id": session_id,
|
|
224
225
|
"config": session_config,
|
|
225
226
|
"start_time": time.time(),
|
|
226
|
-
"status":
|
|
227
|
+
"status": ServiceState.RUNNING,
|
|
227
228
|
"type": session_config.get("type", "interactive"),
|
|
228
229
|
}
|
|
229
230
|
|
|
@@ -267,7 +268,7 @@ class SessionManagementService(BaseService, SessionManagementInterface):
|
|
|
267
268
|
return self.active_sessions[session_id].copy()
|
|
268
269
|
return {
|
|
269
270
|
"id": session_id,
|
|
270
|
-
"status":
|
|
271
|
+
"status": OperationResult.ERROR,
|
|
271
272
|
"error": "Session not found",
|
|
272
273
|
}
|
|
273
274
|
|