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.
- 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
|
@@ -30,9 +30,10 @@ from typing import Dict, List, Optional
|
|
|
30
30
|
import psutil
|
|
31
31
|
from filelock import FileLock
|
|
32
32
|
|
|
33
|
+
from claude_mpm.core.enums import ServiceState
|
|
33
34
|
from claude_mpm.services.core.base import SyncBaseService
|
|
34
35
|
from claude_mpm.services.core.interfaces.process import IDeploymentStateManager
|
|
35
|
-
from claude_mpm.services.core.models.process import DeploymentState
|
|
36
|
+
from claude_mpm.services.core.models.process import DeploymentState
|
|
36
37
|
|
|
37
38
|
|
|
38
39
|
class StateCorruptionError(Exception):
|
|
@@ -206,12 +207,12 @@ class DeploymentStateManager(SyncBaseService, IDeploymentStateManager):
|
|
|
206
207
|
states = self.load_state()
|
|
207
208
|
return list(states.values())
|
|
208
209
|
|
|
209
|
-
def get_deployments_by_status(self, status:
|
|
210
|
+
def get_deployments_by_status(self, status: ServiceState) -> List[DeploymentState]:
|
|
210
211
|
"""
|
|
211
212
|
Get all deployments with a specific status.
|
|
212
213
|
|
|
213
214
|
Args:
|
|
214
|
-
status:
|
|
215
|
+
status: ServiceState to filter by
|
|
215
216
|
|
|
216
217
|
Returns:
|
|
217
218
|
List of matching DeploymentState objects
|
|
@@ -295,14 +296,14 @@ class DeploymentStateManager(SyncBaseService, IDeploymentStateManager):
|
|
|
295
296
|
return False
|
|
296
297
|
|
|
297
298
|
def update_deployment_status(
|
|
298
|
-
self, deployment_id: str, status:
|
|
299
|
+
self, deployment_id: str, status: ServiceState
|
|
299
300
|
) -> bool:
|
|
300
301
|
"""
|
|
301
302
|
Update the status of a deployment.
|
|
302
303
|
|
|
303
304
|
Args:
|
|
304
305
|
deployment_id: Unique deployment identifier
|
|
305
|
-
status: New
|
|
306
|
+
status: New ServiceState
|
|
306
307
|
|
|
307
308
|
Returns:
|
|
308
309
|
True if updated, False if deployment not found
|
|
@@ -45,12 +45,12 @@ from typing import Any, Dict, List, Optional
|
|
|
45
45
|
|
|
46
46
|
import yaml
|
|
47
47
|
|
|
48
|
+
from claude_mpm.core.enums import ServiceState
|
|
48
49
|
from claude_mpm.services.core.base import SyncBaseService
|
|
49
50
|
from claude_mpm.services.core.models.health import DeploymentHealth
|
|
50
51
|
from claude_mpm.services.core.models.process import (
|
|
51
52
|
DeploymentState,
|
|
52
53
|
ProcessInfo,
|
|
53
|
-
ProcessStatus,
|
|
54
54
|
StartConfig,
|
|
55
55
|
)
|
|
56
56
|
from claude_mpm.services.core.models.restart import RestartConfig, RestartHistory
|
|
@@ -384,7 +384,7 @@ class UnifiedLocalOpsManager(SyncBaseService):
|
|
|
384
384
|
|
|
385
385
|
def list_deployments(
|
|
386
386
|
self,
|
|
387
|
-
status_filter: Optional[
|
|
387
|
+
status_filter: Optional[ServiceState] = None,
|
|
388
388
|
) -> List[DeploymentState]:
|
|
389
389
|
"""
|
|
390
390
|
List all deployments.
|
|
@@ -1130,134 +1130,15 @@ class MCPConfigManager:
|
|
|
1130
1130
|
"""
|
|
1131
1131
|
Detect and fix corrupted MCP service installations.
|
|
1132
1132
|
|
|
1133
|
-
|
|
1134
|
-
|
|
1135
|
-
|
|
1136
|
-
3. Fixes missing dependencies (like mcp-ticketer's gql)
|
|
1137
|
-
4. Validates fixes worked
|
|
1133
|
+
NOTE: Proactive health checking has been disabled.
|
|
1134
|
+
Each MCP service should stand on its own and handle its own issues.
|
|
1135
|
+
This function now only returns success without checking services.
|
|
1138
1136
|
|
|
1139
1137
|
Returns:
|
|
1140
1138
|
Tuple of (success, message)
|
|
1141
1139
|
"""
|
|
1142
|
-
|
|
1143
|
-
|
|
1144
|
-
failed_services = []
|
|
1145
|
-
|
|
1146
|
-
# Check each service for issues
|
|
1147
|
-
for service_name in self.PIPX_SERVICES:
|
|
1148
|
-
self.logger.info(f"🔍 Checking {service_name} for issues...")
|
|
1149
|
-
issue_type = self._detect_service_issue(service_name)
|
|
1150
|
-
if issue_type:
|
|
1151
|
-
services_to_fix.append((service_name, issue_type))
|
|
1152
|
-
self.logger.info(f" ⚠️ Found issue with {service_name}: {issue_type}")
|
|
1153
|
-
else:
|
|
1154
|
-
self.logger.debug(f" ✅ {service_name} is functioning correctly")
|
|
1155
|
-
|
|
1156
|
-
if not services_to_fix:
|
|
1157
|
-
return True, "All MCP services are functioning correctly"
|
|
1158
|
-
|
|
1159
|
-
# Fix each problematic service
|
|
1160
|
-
for service_name, issue_type in services_to_fix:
|
|
1161
|
-
self.logger.info(f"🔧 Fixing {service_name}: {issue_type}")
|
|
1162
|
-
|
|
1163
|
-
if issue_type == "not_installed":
|
|
1164
|
-
# Install the service
|
|
1165
|
-
success, method = self._install_service_with_fallback(service_name)
|
|
1166
|
-
if success:
|
|
1167
|
-
fixed_services.append(f"{service_name} (installed via {method})")
|
|
1168
|
-
else:
|
|
1169
|
-
failed_services.append(f"{service_name} (installation failed)")
|
|
1170
|
-
|
|
1171
|
-
elif issue_type == "import_error":
|
|
1172
|
-
# Reinstall to fix corrupted installation
|
|
1173
|
-
self.logger.info(
|
|
1174
|
-
f" Reinstalling {service_name} to fix import errors..."
|
|
1175
|
-
)
|
|
1176
|
-
success = self._reinstall_service(service_name)
|
|
1177
|
-
if success:
|
|
1178
|
-
# NOTE: Removed automatic dependency injection workaround
|
|
1179
|
-
# Package maintainers should fix dependency declarations
|
|
1180
|
-
fixed_services.append(f"{service_name} (reinstalled)")
|
|
1181
|
-
else:
|
|
1182
|
-
failed_services.append(f"{service_name} (reinstall failed)")
|
|
1183
|
-
|
|
1184
|
-
elif issue_type == "missing_dependency":
|
|
1185
|
-
# Fix missing dependencies - try injection first, then reinstall if needed
|
|
1186
|
-
self.logger.info(
|
|
1187
|
-
f" {service_name} has missing dependencies - attempting fix..."
|
|
1188
|
-
)
|
|
1189
|
-
|
|
1190
|
-
# First try to inject dependencies without reinstalling
|
|
1191
|
-
injection_success = self._inject_missing_dependencies(service_name)
|
|
1192
|
-
|
|
1193
|
-
if injection_success:
|
|
1194
|
-
# Verify the fix worked
|
|
1195
|
-
issue_after_injection = self._detect_service_issue(service_name)
|
|
1196
|
-
if issue_after_injection is None:
|
|
1197
|
-
fixed_services.append(f"{service_name} (dependencies injected)")
|
|
1198
|
-
self.logger.info(
|
|
1199
|
-
f" ✅ Fixed {service_name} with dependency injection"
|
|
1200
|
-
)
|
|
1201
|
-
continue # Move to next service
|
|
1202
|
-
|
|
1203
|
-
# If injection alone didn't work, try full reinstall
|
|
1204
|
-
self.logger.info(
|
|
1205
|
-
" Dependency injection insufficient, trying full reinstall..."
|
|
1206
|
-
)
|
|
1207
|
-
success = self._auto_reinstall_mcp_service(service_name)
|
|
1208
|
-
if success:
|
|
1209
|
-
fixed_services.append(
|
|
1210
|
-
f"{service_name} (auto-reinstalled with dependencies)"
|
|
1211
|
-
)
|
|
1212
|
-
else:
|
|
1213
|
-
# Provide specific manual fix for known services
|
|
1214
|
-
if service_name == "mcp-ticketer":
|
|
1215
|
-
self.logger.warning(
|
|
1216
|
-
f" Auto-fix failed for {service_name}. Manual fix: "
|
|
1217
|
-
f"pipx uninstall {service_name} && pipx install {service_name} && pipx inject {service_name} gql"
|
|
1218
|
-
)
|
|
1219
|
-
else:
|
|
1220
|
-
self.logger.warning(
|
|
1221
|
-
f" Auto-reinstall failed for {service_name}. Manual fix: "
|
|
1222
|
-
f"pipx uninstall {service_name} && pipx install {service_name}"
|
|
1223
|
-
)
|
|
1224
|
-
failed_services.append(f"{service_name} (auto-reinstall failed)")
|
|
1225
|
-
|
|
1226
|
-
elif issue_type == "path_issue":
|
|
1227
|
-
# Path issues are handled by config updates
|
|
1228
|
-
self.logger.info(
|
|
1229
|
-
f" Path issue for {service_name} will be fixed by config update"
|
|
1230
|
-
)
|
|
1231
|
-
fixed_services.append(f"{service_name} (config updated)")
|
|
1232
|
-
|
|
1233
|
-
# Build result message
|
|
1234
|
-
messages = []
|
|
1235
|
-
if fixed_services:
|
|
1236
|
-
messages.append(f"✅ Fixed: {', '.join(fixed_services)}")
|
|
1237
|
-
if failed_services:
|
|
1238
|
-
messages.append(f"❌ Failed: {', '.join(failed_services)}")
|
|
1239
|
-
|
|
1240
|
-
# Return success if at least some services were fixed
|
|
1241
|
-
success = len(fixed_services) > 0 or len(failed_services) == 0
|
|
1242
|
-
message = " | ".join(messages) if messages else "No services needed fixing"
|
|
1243
|
-
|
|
1244
|
-
# Provide manual fix instructions if auto-fix failed
|
|
1245
|
-
if failed_services:
|
|
1246
|
-
message += "\n\n💡 Manual fix instructions:"
|
|
1247
|
-
for failed in failed_services:
|
|
1248
|
-
service = failed.split(" ")[0]
|
|
1249
|
-
if service in self.SERVICE_MISSING_DEPENDENCIES:
|
|
1250
|
-
deps = " ".join(
|
|
1251
|
-
[
|
|
1252
|
-
f"&& pipx inject {service} {dep}"
|
|
1253
|
-
for dep in self.SERVICE_MISSING_DEPENDENCIES[service]
|
|
1254
|
-
]
|
|
1255
|
-
)
|
|
1256
|
-
message += f"\n • {service}: pipx uninstall {service} && pipx install {service} {deps}"
|
|
1257
|
-
else:
|
|
1258
|
-
message += f"\n • {service}: pipx uninstall {service} && pipx install {service}"
|
|
1259
|
-
|
|
1260
|
-
return success, message
|
|
1140
|
+
# Services should stand on their own - no proactive health checking
|
|
1141
|
+
return True, "MCP services managing their own health"
|
|
1261
1142
|
|
|
1262
1143
|
def _detect_service_issue(self, service_name: str) -> Optional[str]:
|
|
1263
1144
|
"""
|
|
@@ -1492,7 +1373,7 @@ class MCPConfigManager:
|
|
|
1492
1373
|
)
|
|
1493
1374
|
|
|
1494
1375
|
if result.returncode == 0:
|
|
1495
|
-
self.logger.
|
|
1376
|
+
self.logger.debug(f" ✅ Successfully injected {dep}")
|
|
1496
1377
|
# Check if already injected (pipx will complain if package already exists)
|
|
1497
1378
|
elif (
|
|
1498
1379
|
"already satisfied" in result.stderr.lower()
|
|
@@ -1577,7 +1458,7 @@ class MCPConfigManager:
|
|
|
1577
1458
|
)
|
|
1578
1459
|
|
|
1579
1460
|
# Verify the reinstall worked
|
|
1580
|
-
self.logger.
|
|
1461
|
+
self.logger.debug(f" → Verifying {service_name} installation...")
|
|
1581
1462
|
issue = self._detect_service_issue(service_name)
|
|
1582
1463
|
|
|
1583
1464
|
if issue is None:
|
|
@@ -163,17 +163,21 @@ class MCPAutoConfigurator:
|
|
|
163
163
|
Returns:
|
|
164
164
|
True if user agrees, False if declines, None if timeout
|
|
165
165
|
"""
|
|
166
|
-
print("\n" + "=" * 60)
|
|
167
|
-
print("🔧 MCP Gateway Configuration")
|
|
168
|
-
print("=" * 60)
|
|
169
|
-
print(
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
print(
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
print("
|
|
176
|
-
print(
|
|
166
|
+
print("\n" + "=" * 60, file=sys.stderr)
|
|
167
|
+
print("🔧 MCP Gateway Configuration", file=sys.stderr)
|
|
168
|
+
print("=" * 60, file=sys.stderr)
|
|
169
|
+
print(
|
|
170
|
+
"\nClaude MPM can automatically configure MCP Gateway for", file=sys.stderr
|
|
171
|
+
)
|
|
172
|
+
print(
|
|
173
|
+
"Claude Code integration. This enables advanced features:", file=sys.stderr
|
|
174
|
+
)
|
|
175
|
+
print(" • File analysis and summarization", file=sys.stderr)
|
|
176
|
+
print(" • System diagnostics", file=sys.stderr)
|
|
177
|
+
print(" • Ticket management", file=sys.stderr)
|
|
178
|
+
print(" • And more...", file=sys.stderr)
|
|
179
|
+
print("\nWould you like to configure it now? (y/n)", file=sys.stderr)
|
|
180
|
+
print(f"(Auto-declining in {timeout} seconds)", file=sys.stderr)
|
|
177
181
|
|
|
178
182
|
# Use threading for cross-platform timeout support
|
|
179
183
|
# Python 3.7+ has queue built-in - no need to check, we require 3.10+
|
|
@@ -203,7 +207,7 @@ class MCPAutoConfigurator:
|
|
|
203
207
|
|
|
204
208
|
if input_thread.is_alive():
|
|
205
209
|
# Timed out
|
|
206
|
-
print("\n(Timed out - declining)")
|
|
210
|
+
print("\n(Timed out - declining)", file=sys.stderr)
|
|
207
211
|
return None
|
|
208
212
|
# Got input
|
|
209
213
|
return user_input in ["y", "yes"]
|
|
@@ -220,7 +224,7 @@ class MCPAutoConfigurator:
|
|
|
220
224
|
if self.claude_config_path.exists():
|
|
221
225
|
backup_path = self._create_backup()
|
|
222
226
|
if backup_path:
|
|
223
|
-
print(f"✅ Backup created: {backup_path}")
|
|
227
|
+
print(f"✅ Backup created: {backup_path}", file=sys.stderr)
|
|
224
228
|
|
|
225
229
|
# Load or create configuration
|
|
226
230
|
config = self._load_or_create_config()
|
|
@@ -232,7 +236,7 @@ class MCPAutoConfigurator:
|
|
|
232
236
|
# Find claude-mpm executable
|
|
233
237
|
executable = self._find_claude_mpm_executable()
|
|
234
238
|
if not executable:
|
|
235
|
-
print("❌ Could not find claude-mpm executable")
|
|
239
|
+
print("❌ Could not find claude-mpm executable", file=sys.stderr)
|
|
236
240
|
return False
|
|
237
241
|
|
|
238
242
|
# Configure MCP server
|
|
@@ -246,20 +250,22 @@ class MCPAutoConfigurator:
|
|
|
246
250
|
with self.claude_config_path.open("w") as f:
|
|
247
251
|
json.dump(config, f, indent=2)
|
|
248
252
|
|
|
249
|
-
print(
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
print("
|
|
253
|
-
print("
|
|
254
|
-
print("
|
|
253
|
+
print(
|
|
254
|
+
f"✅ Configuration saved to: {self.claude_config_path}", file=sys.stderr
|
|
255
|
+
)
|
|
256
|
+
print("\n🎉 MCP Gateway configured successfully!", file=sys.stderr)
|
|
257
|
+
print("\nNext steps:", file=sys.stderr)
|
|
258
|
+
print("1. Restart Claude Code (if running)", file=sys.stderr)
|
|
259
|
+
print("2. Look for the MCP icon in the interface", file=sys.stderr)
|
|
260
|
+
print("3. Try @claude-mpm-gateway in a conversation", file=sys.stderr)
|
|
255
261
|
|
|
256
262
|
return True
|
|
257
263
|
|
|
258
264
|
except Exception as e:
|
|
259
265
|
self.logger.error(f"Auto-configuration failed: {e}")
|
|
260
|
-
print(f"❌ Configuration failed: {e}")
|
|
261
|
-
print("\nYou can configure manually with:")
|
|
262
|
-
print(" claude-mpm mcp install")
|
|
266
|
+
print(f"❌ Configuration failed: {e}", file=sys.stderr)
|
|
267
|
+
print("\nYou can configure manually with:", file=sys.stderr)
|
|
268
|
+
print(" claude-mpm mcp install", file=sys.stderr)
|
|
263
269
|
return False
|
|
264
270
|
|
|
265
271
|
def _create_backup(self) -> Optional[Path]:
|
|
@@ -344,8 +350,8 @@ class MCPAutoConfigurator:
|
|
|
344
350
|
if user_choice:
|
|
345
351
|
return self.auto_configure()
|
|
346
352
|
if user_choice is False: # User explicitly said no
|
|
347
|
-
print("\n📝 You can configure MCP later with:")
|
|
348
|
-
print(" claude-mpm mcp install")
|
|
353
|
+
print("\n📝 You can configure MCP later with:", file=sys.stderr)
|
|
354
|
+
print(" claude-mpm mcp install", file=sys.stderr)
|
|
349
355
|
# If timeout (None), don't show additional message
|
|
350
356
|
return False
|
|
351
357
|
|
|
@@ -5,7 +5,7 @@ MCP Gateway Core Module
|
|
|
5
5
|
Core interfaces and base classes for the MCP Gateway service.
|
|
6
6
|
"""
|
|
7
7
|
|
|
8
|
-
from .base import BaseMCPService
|
|
8
|
+
from .base import BaseMCPService
|
|
9
9
|
from .exceptions import (
|
|
10
10
|
MCPCommunicationError,
|
|
11
11
|
MCPConfigurationError,
|
|
@@ -38,7 +38,6 @@ __all__ = [
|
|
|
38
38
|
# Exceptions
|
|
39
39
|
"MCPException",
|
|
40
40
|
"MCPServerError",
|
|
41
|
-
"MCPServiceState",
|
|
42
41
|
"MCPToolNotFoundError",
|
|
43
42
|
"MCPValidationError",
|
|
44
43
|
]
|
|
@@ -8,25 +8,12 @@ Part of ISS-0034: Infrastructure Setup - MCP Gateway Project Foundation
|
|
|
8
8
|
"""
|
|
9
9
|
|
|
10
10
|
import asyncio
|
|
11
|
-
from enum import Enum
|
|
12
11
|
from typing import Any, Dict, Optional
|
|
13
12
|
|
|
13
|
+
from claude_mpm.core.enums import ServiceState
|
|
14
14
|
from claude_mpm.services.core.base import BaseService
|
|
15
15
|
|
|
16
16
|
|
|
17
|
-
class MCPServiceState(Enum):
|
|
18
|
-
"""MCP service lifecycle states."""
|
|
19
|
-
|
|
20
|
-
UNINITIALIZED = "uninitialized"
|
|
21
|
-
INITIALIZING = "initializing"
|
|
22
|
-
INITIALIZED = "initialized"
|
|
23
|
-
STARTING = "starting"
|
|
24
|
-
RUNNING = "running"
|
|
25
|
-
STOPPING = "stopping"
|
|
26
|
-
STOPPED = "stopped"
|
|
27
|
-
ERROR = "error"
|
|
28
|
-
|
|
29
|
-
|
|
30
17
|
class BaseMCPService(BaseService):
|
|
31
18
|
"""
|
|
32
19
|
Base class for all MCP Gateway services.
|
|
@@ -53,7 +40,7 @@ class BaseMCPService(BaseService):
|
|
|
53
40
|
config: Service-specific configuration
|
|
54
41
|
"""
|
|
55
42
|
super().__init__(service_name or "MCPService", config)
|
|
56
|
-
self._state =
|
|
43
|
+
self._state = ServiceState.UNINITIALIZED
|
|
57
44
|
self._health_status = {
|
|
58
45
|
"healthy": False,
|
|
59
46
|
"state": self._state.value,
|
|
@@ -76,13 +63,13 @@ class BaseMCPService(BaseService):
|
|
|
76
63
|
"""
|
|
77
64
|
async with self._state_lock:
|
|
78
65
|
if self._state not in [
|
|
79
|
-
|
|
80
|
-
|
|
66
|
+
ServiceState.UNINITIALIZED,
|
|
67
|
+
ServiceState.STOPPED,
|
|
81
68
|
]:
|
|
82
69
|
self.log_warning(f"Cannot initialize from state {self._state.value}")
|
|
83
70
|
return False
|
|
84
71
|
|
|
85
|
-
self._state =
|
|
72
|
+
self._state = ServiceState.INITIALIZING
|
|
86
73
|
self.log_info("Initializing MCP service")
|
|
87
74
|
|
|
88
75
|
try:
|
|
@@ -91,13 +78,13 @@ class BaseMCPService(BaseService):
|
|
|
91
78
|
|
|
92
79
|
async with self._state_lock:
|
|
93
80
|
if success:
|
|
94
|
-
self._state =
|
|
81
|
+
self._state = ServiceState.INITIALIZED
|
|
95
82
|
self._initialized = True
|
|
96
83
|
self._health_status["healthy"] = True
|
|
97
84
|
self._health_status["state"] = self._state.value
|
|
98
85
|
self.log_info("MCP service initialized successfully")
|
|
99
86
|
else:
|
|
100
|
-
self._state =
|
|
87
|
+
self._state = ServiceState.ERROR
|
|
101
88
|
self._health_status["healthy"] = False
|
|
102
89
|
self._health_status["state"] = self._state.value
|
|
103
90
|
self.log_error("MCP service initialization failed")
|
|
@@ -106,7 +93,7 @@ class BaseMCPService(BaseService):
|
|
|
106
93
|
|
|
107
94
|
except Exception as e:
|
|
108
95
|
async with self._state_lock:
|
|
109
|
-
self._state =
|
|
96
|
+
self._state = ServiceState.ERROR
|
|
110
97
|
self._health_status["healthy"] = False
|
|
111
98
|
self._health_status["state"] = self._state.value
|
|
112
99
|
self._health_status["details"]["error"] = str(e)
|
|
@@ -134,11 +121,11 @@ class BaseMCPService(BaseService):
|
|
|
134
121
|
True if startup successful
|
|
135
122
|
"""
|
|
136
123
|
async with self._state_lock:
|
|
137
|
-
if self._state !=
|
|
124
|
+
if self._state != ServiceState.INITIALIZED:
|
|
138
125
|
self.log_warning(f"Cannot start from state {self._state.value}")
|
|
139
126
|
return False
|
|
140
127
|
|
|
141
|
-
self._state =
|
|
128
|
+
self._state = ServiceState.STARTING
|
|
142
129
|
self.log_info("Starting MCP service")
|
|
143
130
|
|
|
144
131
|
try:
|
|
@@ -146,12 +133,12 @@ class BaseMCPService(BaseService):
|
|
|
146
133
|
|
|
147
134
|
async with self._state_lock:
|
|
148
135
|
if success:
|
|
149
|
-
self._state =
|
|
136
|
+
self._state = ServiceState.RUNNING
|
|
150
137
|
self._health_status["healthy"] = True
|
|
151
138
|
self._health_status["state"] = self._state.value
|
|
152
139
|
self.log_info("MCP service started successfully")
|
|
153
140
|
else:
|
|
154
|
-
self._state =
|
|
141
|
+
self._state = ServiceState.ERROR
|
|
155
142
|
self._health_status["healthy"] = False
|
|
156
143
|
self._health_status["state"] = self._state.value
|
|
157
144
|
self.log_error("MCP service startup failed")
|
|
@@ -160,7 +147,7 @@ class BaseMCPService(BaseService):
|
|
|
160
147
|
|
|
161
148
|
except Exception as e:
|
|
162
149
|
async with self._state_lock:
|
|
163
|
-
self._state =
|
|
150
|
+
self._state = ServiceState.ERROR
|
|
164
151
|
self._health_status["healthy"] = False
|
|
165
152
|
self._health_status["state"] = self._state.value
|
|
166
153
|
self._health_status["details"]["error"] = str(e)
|
|
@@ -188,18 +175,18 @@ class BaseMCPService(BaseService):
|
|
|
188
175
|
Subclasses should override _do_shutdown() for custom shutdown logic.
|
|
189
176
|
"""
|
|
190
177
|
async with self._state_lock:
|
|
191
|
-
if self._state in [
|
|
178
|
+
if self._state in [ServiceState.STOPPED, ServiceState.STOPPING]:
|
|
192
179
|
self.log_warning(f"Already in state {self._state.value}")
|
|
193
180
|
return
|
|
194
181
|
|
|
195
|
-
self._state =
|
|
182
|
+
self._state = ServiceState.STOPPING
|
|
196
183
|
self.log_info("Shutting down MCP service")
|
|
197
184
|
|
|
198
185
|
try:
|
|
199
186
|
await self._do_shutdown()
|
|
200
187
|
|
|
201
188
|
async with self._state_lock:
|
|
202
|
-
self._state =
|
|
189
|
+
self._state = ServiceState.STOPPED
|
|
203
190
|
self._shutdown = True
|
|
204
191
|
self._health_status["healthy"] = False
|
|
205
192
|
self._health_status["state"] = self._state.value
|
|
@@ -207,7 +194,7 @@ class BaseMCPService(BaseService):
|
|
|
207
194
|
|
|
208
195
|
except Exception as e:
|
|
209
196
|
async with self._state_lock:
|
|
210
|
-
self._state =
|
|
197
|
+
self._state = ServiceState.ERROR
|
|
211
198
|
self._health_status["healthy"] = False
|
|
212
199
|
self._health_status["state"] = self._state.value
|
|
213
200
|
self._health_status["details"]["error"] = str(e)
|
|
@@ -232,7 +219,7 @@ class BaseMCPService(BaseService):
|
|
|
232
219
|
self.log_info("Restarting MCP service")
|
|
233
220
|
|
|
234
221
|
# Shutdown if running
|
|
235
|
-
if self._state ==
|
|
222
|
+
if self._state == ServiceState.RUNNING:
|
|
236
223
|
await self.shutdown()
|
|
237
224
|
|
|
238
225
|
# Re-initialize
|
|
@@ -864,7 +864,7 @@ def _prompt_kuzu_update(current: str, latest: str) -> None:
|
|
|
864
864
|
# Check if running in a non-interactive context
|
|
865
865
|
try:
|
|
866
866
|
if confirm_operation(message):
|
|
867
|
-
print("🚀 Updating kuzu-memory...")
|
|
867
|
+
print("🚀 Updating kuzu-memory...", file=sys.stderr)
|
|
868
868
|
try:
|
|
869
869
|
result = subprocess.run(
|
|
870
870
|
["pipx", "upgrade", "kuzu-memory"],
|
|
@@ -874,28 +874,37 @@ def _prompt_kuzu_update(current: str, latest: str) -> None:
|
|
|
874
874
|
check=False,
|
|
875
875
|
)
|
|
876
876
|
if result.returncode == 0:
|
|
877
|
-
print("✅ Successfully updated kuzu-memory!")
|
|
877
|
+
print("✅ Successfully updated kuzu-memory!", file=sys.stderr)
|
|
878
878
|
logger.info(f"Updated kuzu-memory from {current} to {latest}")
|
|
879
879
|
else:
|
|
880
|
-
print(f"⚠️ Update failed: {result.stderr}")
|
|
880
|
+
print(f"⚠️ Update failed: {result.stderr}", file=sys.stderr)
|
|
881
881
|
logger.warning(f"kuzu-memory update failed: {result.stderr}")
|
|
882
882
|
except subprocess.TimeoutExpired:
|
|
883
|
-
print("⚠️ Update timed out. Please try again later.")
|
|
883
|
+
print("⚠️ Update timed out. Please try again later.", file=sys.stderr)
|
|
884
884
|
logger.warning("kuzu-memory update timed out")
|
|
885
885
|
except Exception as e:
|
|
886
|
-
print(f"⚠️ Update failed: {e}")
|
|
886
|
+
print(f"⚠️ Update failed: {e}", file=sys.stderr)
|
|
887
887
|
logger.warning(f"kuzu-memory update error: {e}")
|
|
888
888
|
else:
|
|
889
889
|
# User declined update
|
|
890
|
-
print("\n To skip this version permanently, run:")
|
|
891
|
-
print(
|
|
892
|
-
|
|
893
|
-
|
|
890
|
+
print("\n To skip this version permanently, run:", file=sys.stderr)
|
|
891
|
+
print(
|
|
892
|
+
f" claude-mpm config set-skip-version kuzu-memory {latest}",
|
|
893
|
+
file=sys.stderr,
|
|
894
|
+
)
|
|
895
|
+
print(" To disable update checks for kuzu-memory:", file=sys.stderr)
|
|
896
|
+
print(
|
|
897
|
+
" claude-mpm config disable-update-checks kuzu-memory",
|
|
898
|
+
file=sys.stderr,
|
|
899
|
+
)
|
|
894
900
|
|
|
895
901
|
# Ask if user wants to skip this version
|
|
896
902
|
if confirm_operation("\n Skip this version in future checks?"):
|
|
897
903
|
UpdatePreferences.set_skip_version("kuzu-memory", latest)
|
|
898
|
-
print(
|
|
904
|
+
print(
|
|
905
|
+
f" Version {latest} will be skipped in future checks.",
|
|
906
|
+
file=sys.stderr,
|
|
907
|
+
)
|
|
899
908
|
except (KeyboardInterrupt, EOFError):
|
|
900
909
|
# User interrupted or input not available
|
|
901
910
|
pass
|