claude-mpm 4.25.10__py3-none-any.whl → 5.1.8__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_PM.md +12 -0
- claude_mpm/agents/PM_INSTRUCTIONS.md +1055 -2230
- claude_mpm/agents/PM_INSTRUCTIONS_TEACH.md +1322 -0
- claude_mpm/agents/WORKFLOW.md +4 -4
- claude_mpm/agents/__init__.py +6 -0
- claude_mpm/agents/agent_loader.py +1 -4
- claude_mpm/agents/base_agent_loader.py +10 -35
- claude_mpm/agents/templates/{circuit_breakers.md → circuit-breakers.md} +576 -66
- claude_mpm/agents/templates/context-management-examples.md +544 -0
- claude_mpm/agents/templates/pr-workflow-examples.md +427 -0
- claude_mpm/agents/templates/research-gate-examples.md +669 -0
- claude_mpm/agents/templates/structured-questions-examples.md +615 -0
- claude_mpm/agents/templates/ticket-completeness-examples.md +139 -0
- claude_mpm/agents/templates/ticketing-examples.md +277 -0
- claude_mpm/cli/__init__.py +28 -3
- claude_mpm/cli/commands/__init__.py +2 -0
- claude_mpm/cli/commands/agent_source.py +774 -0
- claude_mpm/cli/commands/agent_state_manager.py +188 -30
- claude_mpm/cli/commands/agents.py +959 -36
- claude_mpm/cli/commands/agents_cleanup.py +210 -0
- claude_mpm/cli/commands/agents_discover.py +338 -0
- claude_mpm/cli/commands/auto_configure.py +537 -239
- claude_mpm/cli/commands/config.py +7 -4
- claude_mpm/cli/commands/configure.py +924 -45
- claude_mpm/cli/commands/configure_navigation.py +63 -46
- claude_mpm/cli/commands/doctor.py +10 -2
- claude_mpm/cli/commands/local_deploy.py +1 -4
- claude_mpm/cli/commands/postmortem.py +401 -0
- claude_mpm/cli/commands/run.py +1 -39
- claude_mpm/cli/commands/skill_source.py +694 -0
- claude_mpm/cli/commands/skills.py +322 -19
- claude_mpm/cli/executor.py +22 -3
- claude_mpm/cli/interactive/agent_wizard.py +1028 -43
- claude_mpm/cli/parsers/agent_source_parser.py +171 -0
- claude_mpm/cli/parsers/agents_parser.py +256 -4
- claude_mpm/cli/parsers/auto_configure_parser.py +13 -0
- claude_mpm/cli/parsers/base_parser.py +25 -0
- claude_mpm/cli/parsers/config_parser.py +96 -43
- claude_mpm/cli/parsers/skill_source_parser.py +169 -0
- claude_mpm/cli/parsers/skills_parser.py +7 -0
- claude_mpm/cli/parsers/source_parser.py +138 -0
- claude_mpm/cli/startup.py +456 -103
- claude_mpm/cli/startup_display.py +4 -4
- claude_mpm/commands/{mpm-auto-configure.md → mpm-agents-auto-configure.md} +9 -0
- claude_mpm/commands/mpm-agents-detect.md +9 -0
- claude_mpm/commands/{mpm-agents.md → mpm-agents-list.md} +9 -0
- claude_mpm/commands/mpm-agents-recommend.md +9 -0
- claude_mpm/commands/{mpm-config.md → mpm-config-view.md} +9 -0
- claude_mpm/commands/mpm-doctor.md +9 -0
- claude_mpm/commands/mpm-help.md +14 -2
- claude_mpm/commands/mpm-init.md +9 -0
- claude_mpm/commands/mpm-monitor.md +9 -0
- claude_mpm/commands/mpm-postmortem.md +123 -0
- claude_mpm/commands/{mpm-resume.md → mpm-session-resume.md} +9 -0
- claude_mpm/commands/mpm-status.md +9 -0
- claude_mpm/commands/{mpm-organize.md → mpm-ticket-organize.md} +9 -0
- claude_mpm/commands/mpm-ticket-view.md +552 -0
- claude_mpm/commands/mpm-version.md +9 -0
- claude_mpm/commands/mpm.md +10 -0
- claude_mpm/config/agent_presets.py +488 -0
- claude_mpm/config/agent_sources.py +325 -0
- claude_mpm/config/skill_presets.py +392 -0
- claude_mpm/config/skill_sources.py +590 -0
- claude_mpm/constants.py +1 -0
- claude_mpm/core/claude_runner.py +5 -34
- claude_mpm/core/config.py +16 -0
- claude_mpm/core/framework/__init__.py +3 -16
- claude_mpm/core/framework/loaders/file_loader.py +54 -101
- claude_mpm/core/framework/loaders/instruction_loader.py +25 -5
- claude_mpm/core/interactive_session.py +83 -7
- claude_mpm/core/oneshot_session.py +71 -8
- claude_mpm/core/protocols/__init__.py +23 -0
- claude_mpm/core/protocols/runner_protocol.py +103 -0
- claude_mpm/core/protocols/session_protocol.py +131 -0
- claude_mpm/core/shared/singleton_manager.py +11 -4
- claude_mpm/core/system_context.py +38 -0
- claude_mpm/core/unified_config.py +22 -0
- claude_mpm/experimental/cli_enhancements.py +1 -5
- claude_mpm/hooks/claude_hooks/__pycache__/__init__.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/event_handlers.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/hook_handler.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/memory_integration.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/response_tracking.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/tool_analysis.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/memory_integration.py +12 -1
- claude_mpm/hooks/claude_hooks/services/__pycache__/__init__.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager_http.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/duplicate_detector.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/state_manager.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/subagent_processor.cpython-313.pyc +0 -0
- claude_mpm/hooks/failure_learning/__init__.py +2 -8
- claude_mpm/hooks/failure_learning/failure_detection_hook.py +1 -6
- claude_mpm/hooks/failure_learning/fix_detection_hook.py +1 -6
- claude_mpm/hooks/failure_learning/learning_extraction_hook.py +1 -6
- claude_mpm/hooks/kuzu_response_hook.py +1 -5
- claude_mpm/models/git_repository.py +198 -0
- claude_mpm/services/agents/agent_builder.py +45 -9
- claude_mpm/services/agents/agent_preset_service.py +238 -0
- claude_mpm/services/agents/agent_selection_service.py +484 -0
- claude_mpm/services/agents/auto_deploy_index_parser.py +569 -0
- claude_mpm/services/agents/cache_git_manager.py +621 -0
- claude_mpm/services/agents/deployment/agent_deployment.py +126 -2
- claude_mpm/services/agents/deployment/agent_discovery_service.py +105 -73
- claude_mpm/services/agents/deployment/agent_lifecycle_manager.py +1 -5
- claude_mpm/services/agents/deployment/agent_restore_handler.py +1 -4
- claude_mpm/services/agents/deployment/agent_template_builder.py +236 -15
- claude_mpm/services/agents/deployment/agents_directory_resolver.py +101 -15
- claude_mpm/services/agents/deployment/async_agent_deployment.py +2 -1
- claude_mpm/services/agents/deployment/multi_source_deployment_service.py +115 -15
- claude_mpm/services/agents/deployment/refactored_agent_deployment_service.py +1 -4
- claude_mpm/services/agents/deployment/remote_agent_discovery_service.py +363 -0
- claude_mpm/services/agents/deployment/single_agent_deployer.py +2 -2
- claude_mpm/services/agents/deployment/system_instructions_deployer.py +168 -46
- claude_mpm/services/agents/deployment/validation/deployment_validator.py +2 -2
- claude_mpm/services/agents/git_source_manager.py +629 -0
- claude_mpm/services/agents/loading/framework_agent_loader.py +1 -4
- claude_mpm/services/agents/local_template_manager.py +47 -9
- claude_mpm/services/agents/single_tier_deployment_service.py +696 -0
- claude_mpm/services/agents/sources/__init__.py +13 -0
- claude_mpm/services/agents/sources/agent_sync_state.py +516 -0
- claude_mpm/services/agents/sources/git_source_sync_service.py +1087 -0
- claude_mpm/services/agents/startup_sync.py +239 -0
- claude_mpm/services/agents/toolchain_detector.py +474 -0
- claude_mpm/services/analysis/__init__.py +25 -0
- claude_mpm/services/analysis/postmortem_reporter.py +474 -0
- claude_mpm/services/analysis/postmortem_service.py +765 -0
- claude_mpm/services/command_deployment_service.py +200 -6
- claude_mpm/services/core/base.py +7 -2
- claude_mpm/services/core/interfaces/__init__.py +1 -3
- claude_mpm/services/core/interfaces/health.py +1 -4
- claude_mpm/services/core/models/__init__.py +2 -11
- claude_mpm/services/diagnostics/checks/__init__.py +4 -0
- claude_mpm/services/diagnostics/checks/agent_sources_check.py +577 -0
- claude_mpm/services/diagnostics/checks/mcp_services_check.py +7 -15
- claude_mpm/services/diagnostics/checks/skill_sources_check.py +587 -0
- claude_mpm/services/diagnostics/diagnostic_runner.py +9 -0
- claude_mpm/services/diagnostics/doctor_reporter.py +34 -6
- claude_mpm/services/git/__init__.py +21 -0
- claude_mpm/services/git/git_operations_service.py +494 -0
- claude_mpm/services/github/__init__.py +21 -0
- claude_mpm/services/github/github_cli_service.py +397 -0
- claude_mpm/services/infrastructure/monitoring/__init__.py +1 -5
- claude_mpm/services/infrastructure/monitoring/aggregator.py +1 -6
- claude_mpm/services/instructions/__init__.py +9 -0
- claude_mpm/services/instructions/instruction_cache_service.py +374 -0
- claude_mpm/services/local_ops/__init__.py +3 -13
- claude_mpm/services/local_ops/health_checks/__init__.py +1 -3
- claude_mpm/services/local_ops/health_manager.py +1 -4
- claude_mpm/services/mcp_config_manager.py +75 -145
- claude_mpm/services/mcp_gateway/core/process_pool.py +22 -16
- claude_mpm/services/mcp_gateway/server/mcp_gateway.py +1 -6
- claude_mpm/services/mcp_service_verifier.py +6 -3
- claude_mpm/services/monitor/daemon.py +28 -8
- claude_mpm/services/monitor/daemon_manager.py +96 -19
- claude_mpm/services/pr/__init__.py +14 -0
- claude_mpm/services/pr/pr_template_service.py +329 -0
- claude_mpm/services/project/project_organizer.py +4 -0
- claude_mpm/services/runner_configuration_service.py +16 -3
- claude_mpm/services/session_management_service.py +16 -4
- claude_mpm/services/skills/__init__.py +18 -0
- claude_mpm/services/skills/git_skill_source_manager.py +1169 -0
- claude_mpm/services/skills/skill_discovery_service.py +568 -0
- claude_mpm/services/socketio/server/core.py +1 -4
- claude_mpm/services/socketio/server/main.py +1 -3
- claude_mpm/services/unified/deployment_strategies/vercel.py +1 -5
- claude_mpm/services/unified/unified_deployment.py +1 -5
- claude_mpm/services/visualization/__init__.py +1 -5
- claude_mpm/templates/questions/__init__.py +2 -7
- claude_mpm/templates/questions/pr_strategy.py +1 -4
- claude_mpm/templates/questions/project_init.py +1 -4
- claude_mpm/templates/questions/ticket_mgmt.py +1 -4
- claude_mpm/utils/agent_dependency_loader.py +77 -10
- claude_mpm/utils/agent_filters.py +288 -0
- claude_mpm/utils/gitignore.py +3 -0
- claude_mpm/utils/migration.py +372 -0
- claude_mpm/utils/progress.py +387 -0
- {claude_mpm-4.25.10.dist-info → claude_mpm-5.1.8.dist-info}/METADATA +356 -112
- {claude_mpm-4.25.10.dist-info → claude_mpm-5.1.8.dist-info}/RECORD +188 -439
- claude_mpm/agents/templates/agent-manager.json +0 -273
- claude_mpm/agents/templates/agentic-coder-optimizer.json +0 -248
- claude_mpm/agents/templates/api_qa.json +0 -183
- claude_mpm/agents/templates/clerk-ops.json +0 -235
- claude_mpm/agents/templates/code_analyzer.json +0 -101
- claude_mpm/agents/templates/content-agent.json +0 -358
- claude_mpm/agents/templates/dart_engineer.json +0 -307
- claude_mpm/agents/templates/data_engineer.json +0 -225
- claude_mpm/agents/templates/documentation.json +0 -238
- claude_mpm/agents/templates/engineer.json +0 -210
- claude_mpm/agents/templates/gcp_ops_agent.json +0 -253
- claude_mpm/agents/templates/golang_engineer.json +0 -270
- claude_mpm/agents/templates/imagemagick.json +0 -264
- claude_mpm/agents/templates/java_engineer.json +0 -346
- claude_mpm/agents/templates/javascript_engineer_agent.json +0 -380
- claude_mpm/agents/templates/local_ops_agent.json +0 -1840
- claude_mpm/agents/templates/memory_manager.json +0 -158
- claude_mpm/agents/templates/nextjs_engineer.json +0 -285
- claude_mpm/agents/templates/ops.json +0 -185
- claude_mpm/agents/templates/php-engineer.json +0 -287
- claude_mpm/agents/templates/product_owner.json +0 -338
- claude_mpm/agents/templates/project_organizer.json +0 -144
- claude_mpm/agents/templates/prompt-engineer.json +0 -737
- claude_mpm/agents/templates/python_engineer.json +0 -387
- claude_mpm/agents/templates/qa.json +0 -243
- claude_mpm/agents/templates/react_engineer.json +0 -239
- claude_mpm/agents/templates/refactoring_engineer.json +0 -276
- claude_mpm/agents/templates/research.json +0 -258
- claude_mpm/agents/templates/ruby-engineer.json +0 -280
- claude_mpm/agents/templates/rust_engineer.json +0 -275
- claude_mpm/agents/templates/security.json +0 -202
- claude_mpm/agents/templates/svelte-engineer.json +0 -225
- claude_mpm/agents/templates/tauri_engineer.json +0 -274
- claude_mpm/agents/templates/ticketing.json +0 -181
- claude_mpm/agents/templates/typescript_engineer.json +0 -285
- claude_mpm/agents/templates/vercel_ops_agent.json +0 -412
- claude_mpm/agents/templates/version_control.json +0 -159
- claude_mpm/agents/templates/web_qa.json +0 -400
- claude_mpm/agents/templates/web_ui.json +0 -189
- claude_mpm/cli/README.md +0 -253
- claude_mpm/cli/commands/mcp_install_commands.py.backup +0 -284
- claude_mpm/cli/commands/mpm_init/README.md +0 -365
- claude_mpm/cli_module/refactoring_guide.md +0 -253
- claude_mpm/commands/mpm-tickets.md +0 -151
- claude_mpm/config/agent_capabilities.yaml +0 -658
- claude_mpm/config/async_logging_config.yaml +0 -145
- claude_mpm/core/.claude-mpm/logs/hooks_20250730.log +0 -34
- claude_mpm/d2/.gitignore +0 -22
- claude_mpm/d2/ARCHITECTURE_COMPARISON.md +0 -273
- claude_mpm/d2/FLASK_INTEGRATION.md +0 -156
- claude_mpm/d2/IMPLEMENTATION_SUMMARY.md +0 -452
- claude_mpm/d2/QUICKSTART.md +0 -186
- claude_mpm/d2/README.md +0 -232
- claude_mpm/d2/STORE_FIX_SUMMARY.md +0 -167
- claude_mpm/d2/SVELTE5_STORES_GUIDE.md +0 -180
- claude_mpm/d2/TESTING.md +0 -288
- claude_mpm/d2/index.html +0 -118
- claude_mpm/d2/package.json +0 -19
- claude_mpm/d2/src/App.svelte +0 -110
- claude_mpm/d2/src/components/Header.svelte +0 -153
- claude_mpm/d2/src/components/MainContent.svelte +0 -74
- claude_mpm/d2/src/components/Sidebar.svelte +0 -85
- claude_mpm/d2/src/components/tabs/EventsTab.svelte +0 -326
- claude_mpm/d2/src/lib/socketio.js +0 -144
- claude_mpm/d2/src/main.js +0 -7
- claude_mpm/d2/src/stores/events.js +0 -114
- claude_mpm/d2/src/stores/socket.js +0 -108
- claude_mpm/d2/src/stores/theme.js +0 -65
- claude_mpm/d2/svelte.config.js +0 -12
- claude_mpm/d2/vite.config.js +0 -15
- claude_mpm/dashboard/.claude-mpm/memories/README.md +0 -36
- claude_mpm/dashboard/BUILD_NUMBER +0 -1
- claude_mpm/dashboard/README.md +0 -121
- claude_mpm/dashboard/VERSION +0 -1
- claude_mpm/dashboard/react/components/DataInspector/DataInspector.module.css +0 -188
- claude_mpm/dashboard/react/components/DataInspector/DataInspector.tsx +0 -273
- claude_mpm/dashboard/react/components/ErrorBoundary.tsx +0 -75
- claude_mpm/dashboard/react/components/EventViewer/EventViewer.module.css +0 -156
- claude_mpm/dashboard/react/components/EventViewer/EventViewer.tsx +0 -141
- claude_mpm/dashboard/react/components/shared/ConnectionStatus.module.css +0 -38
- claude_mpm/dashboard/react/components/shared/ConnectionStatus.tsx +0 -36
- claude_mpm/dashboard/react/components/shared/FilterBar.module.css +0 -92
- claude_mpm/dashboard/react/components/shared/FilterBar.tsx +0 -89
- claude_mpm/dashboard/react/contexts/DashboardContext.tsx +0 -215
- claude_mpm/dashboard/react/entries/events.tsx +0 -165
- claude_mpm/dashboard/react/hooks/useEvents.ts +0 -191
- claude_mpm/dashboard/react/hooks/useSocket.ts +0 -225
- claude_mpm/dashboard/static/archive/activity_dashboard_fixed.html +0 -248
- claude_mpm/dashboard/static/built/REFACTORING_SUMMARY.md +0 -170
- claude_mpm/dashboard/static/built/assets/events.DjpNxWNo.css +0 -1
- claude_mpm/dashboard/static/built/components/activity-tree.js +0 -2
- claude_mpm/dashboard/static/built/components/activity-tree.js.map +0 -1
- claude_mpm/dashboard/static/built/components/agent-hierarchy.js +0 -777
- claude_mpm/dashboard/static/built/components/agent-inference.js +0 -2
- claude_mpm/dashboard/static/built/components/agent-inference.js.map +0 -1
- claude_mpm/dashboard/static/built/components/build-tracker.js +0 -333
- claude_mpm/dashboard/static/built/components/code-simple.js +0 -857
- claude_mpm/dashboard/static/built/components/code-tree/tree-breadcrumb.js +0 -353
- claude_mpm/dashboard/static/built/components/code-tree/tree-constants.js +0 -235
- claude_mpm/dashboard/static/built/components/code-tree/tree-search.js +0 -409
- claude_mpm/dashboard/static/built/components/code-tree/tree-utils.js +0 -435
- claude_mpm/dashboard/static/built/components/code-tree.js +0 -2
- claude_mpm/dashboard/static/built/components/code-tree.js.map +0 -1
- claude_mpm/dashboard/static/built/components/code-viewer.js +0 -2
- claude_mpm/dashboard/static/built/components/code-viewer.js.map +0 -1
- claude_mpm/dashboard/static/built/components/connection-debug.js +0 -654
- claude_mpm/dashboard/static/built/components/diff-viewer.js +0 -891
- claude_mpm/dashboard/static/built/components/event-processor.js +0 -2
- claude_mpm/dashboard/static/built/components/event-processor.js.map +0 -1
- claude_mpm/dashboard/static/built/components/event-viewer.js +0 -2
- claude_mpm/dashboard/static/built/components/event-viewer.js.map +0 -1
- claude_mpm/dashboard/static/built/components/export-manager.js +0 -2
- claude_mpm/dashboard/static/built/components/export-manager.js.map +0 -1
- claude_mpm/dashboard/static/built/components/file-change-tracker.js +0 -443
- claude_mpm/dashboard/static/built/components/file-change-viewer.js +0 -690
- claude_mpm/dashboard/static/built/components/file-tool-tracker.js +0 -2
- claude_mpm/dashboard/static/built/components/file-tool-tracker.js.map +0 -1
- claude_mpm/dashboard/static/built/components/file-viewer.js +0 -2
- claude_mpm/dashboard/static/built/components/file-viewer.js.map +0 -1
- claude_mpm/dashboard/static/built/components/hud-library-loader.js +0 -2
- claude_mpm/dashboard/static/built/components/hud-library-loader.js.map +0 -1
- claude_mpm/dashboard/static/built/components/hud-manager.js +0 -2
- claude_mpm/dashboard/static/built/components/hud-manager.js.map +0 -1
- claude_mpm/dashboard/static/built/components/hud-visualizer.js +0 -2
- claude_mpm/dashboard/static/built/components/hud-visualizer.js.map +0 -1
- claude_mpm/dashboard/static/built/components/module-viewer.js +0 -2
- claude_mpm/dashboard/static/built/components/module-viewer.js.map +0 -1
- claude_mpm/dashboard/static/built/components/nav-bar.js +0 -145
- claude_mpm/dashboard/static/built/components/page-structure.js +0 -429
- claude_mpm/dashboard/static/built/components/session-manager.js +0 -2
- claude_mpm/dashboard/static/built/components/session-manager.js.map +0 -1
- claude_mpm/dashboard/static/built/components/socket-manager.js +0 -2
- claude_mpm/dashboard/static/built/components/socket-manager.js.map +0 -1
- claude_mpm/dashboard/static/built/components/ui-state-manager.js +0 -2
- claude_mpm/dashboard/static/built/components/ui-state-manager.js.map +0 -1
- claude_mpm/dashboard/static/built/components/unified-data-viewer.js +0 -2
- claude_mpm/dashboard/static/built/components/unified-data-viewer.js.map +0 -1
- claude_mpm/dashboard/static/built/components/working-directory.js +0 -2
- claude_mpm/dashboard/static/built/components/working-directory.js.map +0 -1
- claude_mpm/dashboard/static/built/connection-manager.js +0 -536
- claude_mpm/dashboard/static/built/dashboard.js +0 -2
- claude_mpm/dashboard/static/built/dashboard.js.map +0 -1
- claude_mpm/dashboard/static/built/extension-error-handler.js +0 -164
- claude_mpm/dashboard/static/built/react/events.js +0 -30
- claude_mpm/dashboard/static/built/react/events.js.map +0 -1
- claude_mpm/dashboard/static/built/shared/dom-helpers.js +0 -396
- claude_mpm/dashboard/static/built/shared/event-bus.js +0 -330
- claude_mpm/dashboard/static/built/shared/event-filter-service.js +0 -540
- claude_mpm/dashboard/static/built/shared/logger.js +0 -385
- claude_mpm/dashboard/static/built/shared/page-structure.js +0 -249
- claude_mpm/dashboard/static/built/shared/tooltip-service.js +0 -253
- claude_mpm/dashboard/static/built/socket-client.js +0 -2
- claude_mpm/dashboard/static/built/socket-client.js.map +0 -1
- claude_mpm/dashboard/static/built/tab-isolation-fix.js +0 -185
- claude_mpm/dashboard/static/events.html +0 -607
- claude_mpm/dashboard/static/index.html +0 -635
- claude_mpm/dashboard/static/js/REFACTORING_SUMMARY.md +0 -170
- claude_mpm/dashboard/static/js/shared/dom-helpers.js +0 -396
- claude_mpm/dashboard/static/js/shared/event-bus.js +0 -330
- claude_mpm/dashboard/static/js/shared/logger.js +0 -385
- claude_mpm/dashboard/static/js/shared/tooltip-service.js +0 -253
- claude_mpm/dashboard/static/js/stores/dashboard-store.js +0 -562
- claude_mpm/dashboard/static/legacy/activity.html +0 -736
- claude_mpm/dashboard/static/legacy/agents.html +0 -786
- claude_mpm/dashboard/static/legacy/files.html +0 -747
- claude_mpm/dashboard/static/legacy/tools.html +0 -831
- claude_mpm/dashboard/static/monitors.html +0 -431
- claude_mpm/dashboard/static/navigation-test-results.md +0 -118
- claude_mpm/dashboard/static/production/events.html +0 -659
- claude_mpm/dashboard/static/production/main.html +0 -698
- claude_mpm/dashboard/static/production/monitors.html +0 -483
- claude_mpm/dashboard/static/test-archive/dashboard.html +0 -635
- claude_mpm/dashboard/static/test-archive/debug-events.html +0 -147
- claude_mpm/dashboard/static/test-archive/test-navigation.html +0 -256
- claude_mpm/dashboard/static/test-archive/test-react-exports.html +0 -180
- claude_mpm/dashboard/templates/.claude-mpm/memories/README.md +0 -36
- claude_mpm/dashboard/templates/.claude-mpm/memories/engineer_agent.md +0 -39
- claude_mpm/dashboard/templates/.claude-mpm/memories/version_control_agent.md +0 -38
- claude_mpm/hooks/README.md +0 -143
- claude_mpm/hooks/templates/README.md +0 -180
- claude_mpm/hooks/templates/settings.json.example +0 -147
- claude_mpm/schemas/agent_schema.json +0 -596
- claude_mpm/schemas/frontmatter_schema.json +0 -165
- claude_mpm/services/event_bus/README.md +0 -244
- claude_mpm/services/events/README.md +0 -303
- claude_mpm/services/framework_claude_md_generator/README.md +0 -119
- claude_mpm/services/mcp_gateway/README.md +0 -185
- claude_mpm/services/socketio/handlers/connection.py.backup +0 -217
- claude_mpm/services/socketio/handlers/hook.py.backup +0 -154
- claude_mpm/services/static/.gitkeep +0 -2
- claude_mpm/services/version_control/VERSION +0 -1
- claude_mpm/skills/bundled/.gitkeep +0 -2
- claude_mpm/skills/bundled/collaboration/brainstorming/SKILL.md +0 -79
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/SKILL.md +0 -178
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/agent-prompts.md +0 -577
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/coordination-patterns.md +0 -467
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/examples.md +0 -537
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/troubleshooting.md +0 -730
- claude_mpm/skills/bundled/collaboration/git-worktrees.md +0 -317
- claude_mpm/skills/bundled/collaboration/requesting-code-review/SKILL.md +0 -112
- claude_mpm/skills/bundled/collaboration/requesting-code-review/references/code-reviewer-template.md +0 -146
- claude_mpm/skills/bundled/collaboration/requesting-code-review/references/review-examples.md +0 -412
- claude_mpm/skills/bundled/collaboration/stacked-prs.md +0 -251
- claude_mpm/skills/bundled/collaboration/writing-plans/SKILL.md +0 -81
- claude_mpm/skills/bundled/collaboration/writing-plans/references/best-practices.md +0 -362
- claude_mpm/skills/bundled/collaboration/writing-plans/references/plan-structure-templates.md +0 -312
- claude_mpm/skills/bundled/debugging/root-cause-tracing/SKILL.md +0 -152
- claude_mpm/skills/bundled/debugging/root-cause-tracing/find-polluter.sh +0 -63
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/advanced-techniques.md +0 -668
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/examples.md +0 -587
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/integration.md +0 -438
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/tracing-techniques.md +0 -391
- claude_mpm/skills/bundled/debugging/systematic-debugging/CREATION-LOG.md +0 -119
- claude_mpm/skills/bundled/debugging/systematic-debugging/SKILL.md +0 -148
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/anti-patterns.md +0 -483
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/examples.md +0 -452
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/troubleshooting.md +0 -449
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/workflow.md +0 -411
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-academic.md +0 -14
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-1.md +0 -58
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-2.md +0 -68
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-3.md +0 -69
- claude_mpm/skills/bundled/debugging/verification-before-completion/SKILL.md +0 -131
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/gate-function.md +0 -325
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/integration-and-workflows.md +0 -490
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/red-flags-and-failures.md +0 -425
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/verification-patterns.md +0 -499
- claude_mpm/skills/bundled/infrastructure/env-manager/INTEGRATION.md +0 -611
- claude_mpm/skills/bundled/infrastructure/env-manager/README.md +0 -596
- claude_mpm/skills/bundled/infrastructure/env-manager/SKILL.md +0 -260
- claude_mpm/skills/bundled/infrastructure/env-manager/examples/nextjs-env-structure.md +0 -315
- claude_mpm/skills/bundled/infrastructure/env-manager/references/frameworks.md +0 -436
- claude_mpm/skills/bundled/infrastructure/env-manager/references/security.md +0 -433
- claude_mpm/skills/bundled/infrastructure/env-manager/references/synchronization.md +0 -452
- claude_mpm/skills/bundled/infrastructure/env-manager/references/troubleshooting.md +0 -404
- claude_mpm/skills/bundled/infrastructure/env-manager/references/validation.md +0 -420
- claude_mpm/skills/bundled/main/artifacts-builder/LICENSE.txt +0 -202
- claude_mpm/skills/bundled/main/artifacts-builder/SKILL.md +0 -86
- claude_mpm/skills/bundled/main/artifacts-builder/scripts/bundle-artifact.sh +0 -54
- claude_mpm/skills/bundled/main/artifacts-builder/scripts/init-artifact.sh +0 -322
- claude_mpm/skills/bundled/main/artifacts-builder/scripts/shadcn-components.tar.gz +0 -0
- claude_mpm/skills/bundled/main/internal-comms/LICENSE.txt +0 -202
- claude_mpm/skills/bundled/main/internal-comms/SKILL.md +0 -43
- claude_mpm/skills/bundled/main/internal-comms/examples/3p-updates.md +0 -47
- claude_mpm/skills/bundled/main/internal-comms/examples/company-newsletter.md +0 -65
- claude_mpm/skills/bundled/main/internal-comms/examples/faq-answers.md +0 -30
- claude_mpm/skills/bundled/main/internal-comms/examples/general-comms.md +0 -16
- claude_mpm/skills/bundled/main/mcp-builder/LICENSE.txt +0 -202
- claude_mpm/skills/bundled/main/mcp-builder/SKILL.md +0 -160
- claude_mpm/skills/bundled/main/mcp-builder/reference/design_principles.md +0 -412
- claude_mpm/skills/bundled/main/mcp-builder/reference/evaluation.md +0 -602
- claude_mpm/skills/bundled/main/mcp-builder/reference/mcp_best_practices.md +0 -915
- claude_mpm/skills/bundled/main/mcp-builder/reference/node_mcp_server.md +0 -916
- claude_mpm/skills/bundled/main/mcp-builder/reference/python_mcp_server.md +0 -752
- claude_mpm/skills/bundled/main/mcp-builder/reference/workflow.md +0 -1237
- claude_mpm/skills/bundled/main/mcp-builder/scripts/example_evaluation.xml +0 -22
- claude_mpm/skills/bundled/main/mcp-builder/scripts/requirements.txt +0 -2
- claude_mpm/skills/bundled/main/skill-creator/LICENSE.txt +0 -202
- claude_mpm/skills/bundled/main/skill-creator/SKILL.md +0 -189
- claude_mpm/skills/bundled/main/skill-creator/references/best-practices.md +0 -500
- claude_mpm/skills/bundled/main/skill-creator/references/creation-workflow.md +0 -464
- claude_mpm/skills/bundled/main/skill-creator/references/examples.md +0 -619
- claude_mpm/skills/bundled/main/skill-creator/references/progressive-disclosure.md +0 -437
- claude_mpm/skills/bundled/main/skill-creator/references/skill-structure.md +0 -231
- claude_mpm/skills/bundled/php/espocrm-development/SKILL.md +0 -170
- claude_mpm/skills/bundled/php/espocrm-development/references/architecture.md +0 -602
- claude_mpm/skills/bundled/php/espocrm-development/references/common-tasks.md +0 -821
- claude_mpm/skills/bundled/php/espocrm-development/references/development-workflow.md +0 -742
- claude_mpm/skills/bundled/php/espocrm-development/references/frontend-customization.md +0 -726
- claude_mpm/skills/bundled/php/espocrm-development/references/hooks-and-services.md +0 -764
- claude_mpm/skills/bundled/php/espocrm-development/references/testing-debugging.md +0 -831
- claude_mpm/skills/bundled/react/flexlayout-react.md +0 -742
- claude_mpm/skills/bundled/rust/desktop-applications/SKILL.md +0 -226
- claude_mpm/skills/bundled/rust/desktop-applications/references/architecture-patterns.md +0 -901
- claude_mpm/skills/bundled/rust/desktop-applications/references/native-gui-frameworks.md +0 -901
- claude_mpm/skills/bundled/rust/desktop-applications/references/platform-integration.md +0 -775
- claude_mpm/skills/bundled/rust/desktop-applications/references/state-management.md +0 -937
- claude_mpm/skills/bundled/rust/desktop-applications/references/tauri-framework.md +0 -770
- claude_mpm/skills/bundled/rust/desktop-applications/references/testing-deployment.md +0 -961
- claude_mpm/skills/bundled/tauri/tauri-async-patterns.md +0 -495
- claude_mpm/skills/bundled/tauri/tauri-build-deploy.md +0 -599
- claude_mpm/skills/bundled/tauri/tauri-command-patterns.md +0 -535
- claude_mpm/skills/bundled/tauri/tauri-error-handling.md +0 -613
- claude_mpm/skills/bundled/tauri/tauri-event-system.md +0 -648
- claude_mpm/skills/bundled/tauri/tauri-file-system.md +0 -673
- claude_mpm/skills/bundled/tauri/tauri-frontend-integration.md +0 -767
- claude_mpm/skills/bundled/tauri/tauri-performance.md +0 -669
- claude_mpm/skills/bundled/tauri/tauri-state-management.md +0 -573
- claude_mpm/skills/bundled/tauri/tauri-testing.md +0 -384
- claude_mpm/skills/bundled/tauri/tauri-window-management.md +0 -628
- claude_mpm/skills/bundled/testing/condition-based-waiting/SKILL.md +0 -119
- claude_mpm/skills/bundled/testing/condition-based-waiting/example.ts +0 -158
- claude_mpm/skills/bundled/testing/condition-based-waiting/references/patterns-and-implementation.md +0 -253
- claude_mpm/skills/bundled/testing/test-driven-development/SKILL.md +0 -145
- claude_mpm/skills/bundled/testing/test-driven-development/references/anti-patterns.md +0 -543
- claude_mpm/skills/bundled/testing/test-driven-development/references/examples.md +0 -741
- claude_mpm/skills/bundled/testing/test-driven-development/references/integration.md +0 -470
- claude_mpm/skills/bundled/testing/test-driven-development/references/philosophy.md +0 -458
- claude_mpm/skills/bundled/testing/test-driven-development/references/workflow.md +0 -639
- claude_mpm/skills/bundled/testing/test-quality-inspector/SKILL.md +0 -458
- claude_mpm/skills/bundled/testing/test-quality-inspector/examples/example-inspection-report.md +0 -411
- claude_mpm/skills/bundled/testing/test-quality-inspector/references/assertion-quality.md +0 -317
- claude_mpm/skills/bundled/testing/test-quality-inspector/references/inspection-checklist.md +0 -270
- claude_mpm/skills/bundled/testing/test-quality-inspector/references/red-flags.md +0 -436
- claude_mpm/skills/bundled/testing/testing-anti-patterns/SKILL.md +0 -140
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/completeness-anti-patterns.md +0 -572
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/core-anti-patterns.md +0 -411
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/detection-guide.md +0 -569
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/tdd-connection.md +0 -695
- claude_mpm/skills/bundled/testing/webapp-testing/LICENSE.txt +0 -202
- claude_mpm/skills/bundled/testing/webapp-testing/SKILL.md +0 -184
- claude_mpm/skills/bundled/testing/webapp-testing/decision-tree.md +0 -459
- claude_mpm/skills/bundled/testing/webapp-testing/playwright-patterns.md +0 -479
- claude_mpm/skills/bundled/testing/webapp-testing/reconnaissance-pattern.md +0 -687
- claude_mpm/skills/bundled/testing/webapp-testing/server-management.md +0 -758
- claude_mpm/skills/bundled/testing/webapp-testing/troubleshooting.md +0 -868
- claude_mpm/templates/questions/EXAMPLES.md +0 -501
- claude_mpm/tools/README_SOCKETIO_DEBUG.md +0 -224
- claude_mpm/tools/code_tree_analyzer/README.md +0 -64
- /claude_mpm/agents/templates/{git_file_tracking.md → git-file-tracking.md} +0 -0
- /claude_mpm/agents/templates/{pm_examples.md → pm-examples.md} +0 -0
- /claude_mpm/agents/templates/{pm_red_flags.md → pm-red-flags.md} +0 -0
- /claude_mpm/agents/templates/{response_format.md → response-format.md} +0 -0
- /claude_mpm/agents/templates/{validation_templates.md → validation-templates.md} +0 -0
- {claude_mpm-4.25.10.dist-info → claude_mpm-5.1.8.dist-info}/WHEEL +0 -0
- {claude_mpm-4.25.10.dist-info → claude_mpm-5.1.8.dist-info}/entry_points.txt +0 -0
- {claude_mpm-4.25.10.dist-info → claude_mpm-5.1.8.dist-info}/licenses/LICENSE +0 -0
- {claude_mpm-4.25.10.dist-info → claude_mpm-5.1.8.dist-info}/top_level.txt +0 -0
|
@@ -12,7 +12,6 @@ MCP service installations.
|
|
|
12
12
|
import json
|
|
13
13
|
import subprocess
|
|
14
14
|
import sys
|
|
15
|
-
from datetime import datetime, timezone
|
|
16
15
|
from enum import Enum
|
|
17
16
|
from pathlib import Path
|
|
18
17
|
from typing import Dict, Optional, Tuple
|
|
@@ -698,175 +697,106 @@ class MCPConfigManager:
|
|
|
698
697
|
|
|
699
698
|
return config
|
|
700
699
|
|
|
701
|
-
def
|
|
700
|
+
def check_mcp_services_available(self) -> Tuple[bool, str]:
|
|
702
701
|
"""
|
|
703
|
-
|
|
702
|
+
Check if required MCP services are available in ~/.claude.json (READ-ONLY).
|
|
704
703
|
|
|
705
|
-
This method
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
2. Fix incorrect configurations
|
|
709
|
-
3. Update all projects, not just the current one
|
|
704
|
+
This method performs a READ-ONLY check of MCP service availability.
|
|
705
|
+
It does NOT modify ~/.claude.json. Users should install and configure
|
|
706
|
+
MCP services themselves via pip, npx, or Claude Desktop.
|
|
710
707
|
|
|
711
708
|
Returns:
|
|
712
|
-
Tuple of (
|
|
709
|
+
Tuple of (all_available: bool, message: str)
|
|
713
710
|
"""
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
added_services = []
|
|
717
|
-
|
|
718
|
-
# Load existing Claude config or create minimal structure
|
|
719
|
-
claude_config = {}
|
|
720
|
-
if self.claude_config_path.exists():
|
|
721
|
-
try:
|
|
722
|
-
with self.claude_config_path.open() as f:
|
|
723
|
-
claude_config = json.load(f)
|
|
724
|
-
except Exception as e:
|
|
725
|
-
self.logger.error(f"Error reading {self.claude_config_path}: {e}")
|
|
726
|
-
return False, f"Failed to read Claude config: {e}"
|
|
711
|
+
# Get services Claude MPM expects to use (from ~/.claude-mpm/config/)
|
|
712
|
+
expected_services = self.get_filtered_services()
|
|
727
713
|
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
claude_config["projects"] = {}
|
|
731
|
-
updated = True
|
|
714
|
+
if not expected_services:
|
|
715
|
+
return True, "No MCP services configured in Claude MPM"
|
|
732
716
|
|
|
733
|
-
#
|
|
734
|
-
|
|
717
|
+
# Load Claude config (read-only)
|
|
718
|
+
if not self.claude_config_path.exists():
|
|
719
|
+
return False, f"Claude config not found at {self.claude_config_path}"
|
|
735
720
|
|
|
736
|
-
|
|
737
|
-
|
|
721
|
+
try:
|
|
722
|
+
with self.claude_config_path.open() as f:
|
|
723
|
+
claude_config = json.load(f)
|
|
724
|
+
except Exception as e:
|
|
725
|
+
return False, f"Failed to read Claude config: {e}"
|
|
738
726
|
|
|
739
|
-
#
|
|
727
|
+
# Check current project
|
|
740
728
|
current_project_key = str(self.project_root)
|
|
741
|
-
|
|
742
|
-
projects_to_update.append(current_project_key)
|
|
743
|
-
# Initialize new project structure
|
|
744
|
-
claude_config["projects"][current_project_key] = {
|
|
745
|
-
"allowedTools": [],
|
|
746
|
-
"history": [],
|
|
747
|
-
"mcpContextUris": [],
|
|
748
|
-
"mcpServers": {},
|
|
749
|
-
"enabledMcpjsonServers": [],
|
|
750
|
-
"disabledMcpjsonServers": [],
|
|
751
|
-
"hasTrustDialogAccepted": False,
|
|
752
|
-
"projectOnboardingSeenCount": 0,
|
|
753
|
-
"hasClaudeMdExternalIncludesApproved": False,
|
|
754
|
-
"hasClaudeMdExternalIncludesWarningShown": False,
|
|
755
|
-
}
|
|
756
|
-
updated = True
|
|
757
|
-
|
|
758
|
-
# Update each project's MCP configurations
|
|
759
|
-
for project_key in projects_to_update:
|
|
760
|
-
project_config = claude_config["projects"][project_key]
|
|
761
|
-
|
|
762
|
-
# Ensure mcpServers section exists
|
|
763
|
-
if "mcpServers" not in project_config:
|
|
764
|
-
project_config["mcpServers"] = {}
|
|
765
|
-
updated = True
|
|
766
|
-
|
|
767
|
-
# Check and fix each service configuration - now filtered by startup config
|
|
768
|
-
services_to_configure = self.get_filtered_services()
|
|
769
|
-
|
|
770
|
-
for service_name, correct_config in services_to_configure.items():
|
|
771
|
-
# Check if service exists and has correct configuration
|
|
772
|
-
existing_config = project_config["mcpServers"].get(service_name)
|
|
773
|
-
|
|
774
|
-
# Determine if we need to update
|
|
775
|
-
needs_update = False
|
|
776
|
-
if not existing_config:
|
|
777
|
-
# Service is missing
|
|
778
|
-
needs_update = True
|
|
779
|
-
added_services.append(f"{service_name} in {Path(project_key).name}")
|
|
780
|
-
# Service exists, check if configuration is correct
|
|
781
|
-
# Compare command and args (the most critical parts)
|
|
782
|
-
elif existing_config.get("command") != correct_config.get(
|
|
783
|
-
"command"
|
|
784
|
-
) or existing_config.get("args") != correct_config.get("args"):
|
|
785
|
-
needs_update = True
|
|
786
|
-
fixed_services.append(f"{service_name} in {Path(project_key).name}")
|
|
787
|
-
|
|
788
|
-
# Update configuration if needed
|
|
789
|
-
if needs_update:
|
|
790
|
-
project_config["mcpServers"][service_name] = correct_config
|
|
791
|
-
updated = True
|
|
792
|
-
self.logger.debug(
|
|
793
|
-
f"Updated MCP service config for {service_name} in project {Path(project_key).name}"
|
|
794
|
-
)
|
|
729
|
+
project_config = claude_config.get("projects", {}).get(current_project_key)
|
|
795
730
|
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
|
|
799
|
-
|
|
731
|
+
if not project_config:
|
|
732
|
+
missing = list(expected_services.keys())
|
|
733
|
+
return (
|
|
734
|
+
False,
|
|
735
|
+
f"Current project not configured in Claude. Missing services: {', '.join(missing)}",
|
|
736
|
+
)
|
|
800
737
|
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
|
|
805
|
-
|
|
806
|
-
# Remove services that are not in the enabled list
|
|
807
|
-
services_to_remove = []
|
|
808
|
-
for service_name in project_config["mcpServers"]:
|
|
809
|
-
if service_name not in enabled_services:
|
|
810
|
-
services_to_remove.append(service_name)
|
|
811
|
-
|
|
812
|
-
for service_name in services_to_remove:
|
|
813
|
-
del project_config["mcpServers"][service_name]
|
|
814
|
-
updated = True
|
|
815
|
-
self.logger.debug(
|
|
816
|
-
f"Removed disabled service {service_name} from project {Path(project_key).name}"
|
|
817
|
-
)
|
|
818
|
-
|
|
819
|
-
# Write updated config if changes were made
|
|
820
|
-
if updated:
|
|
821
|
-
try:
|
|
822
|
-
# Create backup if file exists and is large (> 100KB)
|
|
823
|
-
if self.claude_config_path.exists():
|
|
824
|
-
file_size = self.claude_config_path.stat().st_size
|
|
825
|
-
if file_size > 100000: # 100KB
|
|
826
|
-
backup_path = self.claude_config_path.with_suffix(
|
|
827
|
-
f".backup.{datetime.now(timezone.utc).strftime('%Y%m%d_%H%M%S')}.json"
|
|
828
|
-
)
|
|
829
|
-
import shutil
|
|
738
|
+
# Check which services are missing
|
|
739
|
+
mcp_servers = project_config.get("mcpServers", {})
|
|
740
|
+
missing_services = [
|
|
741
|
+
name for name in expected_services if name not in mcp_servers
|
|
742
|
+
]
|
|
830
743
|
|
|
831
|
-
|
|
832
|
-
|
|
744
|
+
if missing_services:
|
|
745
|
+
msg = (
|
|
746
|
+
f"Missing MCP services: {', '.join(missing_services)}. "
|
|
747
|
+
f"Install via: pip install {' '.join(missing_services)} "
|
|
748
|
+
f"or configure in Claude Desktop"
|
|
749
|
+
)
|
|
750
|
+
return False, msg
|
|
833
751
|
|
|
834
|
-
|
|
835
|
-
|
|
836
|
-
|
|
752
|
+
return (
|
|
753
|
+
True,
|
|
754
|
+
f"All required MCP services available ({len(expected_services)} services)",
|
|
755
|
+
)
|
|
837
756
|
|
|
838
|
-
|
|
839
|
-
|
|
840
|
-
|
|
841
|
-
f"Added MCP services: {', '.join(added_services[:3])}"
|
|
842
|
-
)
|
|
843
|
-
if fixed_services:
|
|
844
|
-
messages.append(
|
|
845
|
-
f"Fixed MCP services: {', '.join(fixed_services[:3])}"
|
|
846
|
-
)
|
|
757
|
+
def ensure_mcp_services_configured(self) -> Tuple[bool, str]:
|
|
758
|
+
"""
|
|
759
|
+
DEPRECATED: Auto-configuring ~/.claude.json is no longer supported.
|
|
847
760
|
|
|
848
|
-
|
|
849
|
-
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
|
|
853
|
-
return False, f"Failed to write configuration: {e}"
|
|
761
|
+
As of v4.15.0+, MCP services are user-controlled. Users should install
|
|
762
|
+
and configure MCP services themselves via:
|
|
763
|
+
- pip install <service-name>
|
|
764
|
+
- npx @modelcontextprotocol/...
|
|
765
|
+
- Claude Desktop UI
|
|
854
766
|
|
|
855
|
-
|
|
767
|
+
This method now only performs a read-only check and logs a deprecation warning.
|
|
768
|
+
Use check_mcp_services_available() for read-only checks.
|
|
769
|
+
|
|
770
|
+
Returns:
|
|
771
|
+
Tuple of (success, message)
|
|
772
|
+
"""
|
|
773
|
+
import warnings
|
|
774
|
+
|
|
775
|
+
warnings.warn(
|
|
776
|
+
"ensure_mcp_services_configured() is deprecated and will be removed in v6.0.0. "
|
|
777
|
+
"MCP services are now user-controlled. Use check_mcp_services_available() instead.",
|
|
778
|
+
DeprecationWarning,
|
|
779
|
+
stacklevel=2,
|
|
780
|
+
)
|
|
781
|
+
|
|
782
|
+
# Delegate to read-only check
|
|
783
|
+
return self.check_mcp_services_available()
|
|
856
784
|
|
|
857
785
|
def update_mcp_config(self, force_pipx: bool = True) -> Tuple[bool, str]:
|
|
858
786
|
"""
|
|
859
|
-
|
|
787
|
+
DEPRECATED: Check MCP configuration in ~/.claude.json (READ-ONLY).
|
|
788
|
+
|
|
789
|
+
This method no longer modifies ~/.claude.json. Users should install
|
|
790
|
+
and configure MCP services themselves.
|
|
860
791
|
|
|
861
792
|
Args:
|
|
862
|
-
force_pipx:
|
|
793
|
+
force_pipx: Ignored (kept for backward compatibility)
|
|
863
794
|
|
|
864
795
|
Returns:
|
|
865
|
-
Tuple of (success, message)
|
|
796
|
+
Tuple of (success, message) from read-only check
|
|
866
797
|
"""
|
|
867
|
-
#
|
|
868
|
-
|
|
869
|
-
return self.ensure_mcp_services_configured()
|
|
798
|
+
# Delegate to read-only check
|
|
799
|
+
return self.check_mcp_services_available()
|
|
870
800
|
|
|
871
801
|
def update_project_mcp_config(self, force_pipx: bool = True) -> Tuple[bool, str]:
|
|
872
802
|
"""
|
|
@@ -440,15 +440,18 @@ async def auto_initialize_vector_search():
|
|
|
440
440
|
)
|
|
441
441
|
return
|
|
442
442
|
|
|
443
|
-
#
|
|
444
|
-
logger.info("📝
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
if config_success:
|
|
449
|
-
logger.info(f"✅ {config_msg}")
|
|
443
|
+
# Verify the newly installed service is available
|
|
444
|
+
logger.info("📝 Verifying installation...")
|
|
445
|
+
available, msg = config_manager.check_mcp_services_available()
|
|
446
|
+
if available:
|
|
447
|
+
logger.info(f"✅ {msg}")
|
|
450
448
|
else:
|
|
451
|
-
logger.warning(
|
|
449
|
+
logger.warning(
|
|
450
|
+
f"⚠️ Service installed but not configured in Claude: {msg}"
|
|
451
|
+
)
|
|
452
|
+
logger.info(
|
|
453
|
+
"💡 Configure via: Claude Desktop > Settings > Developer > Model Context Protocol"
|
|
454
|
+
)
|
|
452
455
|
else:
|
|
453
456
|
logger.warning(
|
|
454
457
|
f"Failed to install mcp-vector-search: {result.stderr}"
|
|
@@ -658,15 +661,18 @@ async def auto_initialize_kuzu_memory():
|
|
|
658
661
|
)
|
|
659
662
|
return
|
|
660
663
|
|
|
661
|
-
#
|
|
662
|
-
logger.info("📝
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
if config_success:
|
|
667
|
-
logger.info(f"✅ {config_msg}")
|
|
664
|
+
# Verify the newly installed service is available
|
|
665
|
+
logger.info("📝 Verifying installation...")
|
|
666
|
+
available, msg = config_manager.check_mcp_services_available()
|
|
667
|
+
if available:
|
|
668
|
+
logger.info(f"✅ {msg}")
|
|
668
669
|
else:
|
|
669
|
-
logger.warning(
|
|
670
|
+
logger.warning(
|
|
671
|
+
f"⚠️ Service installed but not configured in Claude: {msg}"
|
|
672
|
+
)
|
|
673
|
+
logger.info(
|
|
674
|
+
"💡 Configure via: Claude Desktop > Settings > Developer > Model Context Protocol"
|
|
675
|
+
)
|
|
670
676
|
else:
|
|
671
677
|
logger.warning(f"Failed to install kuzu-memory: {result.stderr}")
|
|
672
678
|
return
|
|
@@ -21,12 +21,7 @@ from typing import Any, Callable, Dict, List, Optional, Union
|
|
|
21
21
|
|
|
22
22
|
# Import from the official MCP package
|
|
23
23
|
from mcp.server import Server
|
|
24
|
-
from mcp.types import
|
|
25
|
-
EmbeddedResource,
|
|
26
|
-
ImageContent,
|
|
27
|
-
TextContent,
|
|
28
|
-
Tool,
|
|
29
|
-
)
|
|
24
|
+
from mcp.types import EmbeddedResource, ImageContent, TextContent, Tool
|
|
30
25
|
|
|
31
26
|
from claude_mpm.services.mcp_gateway.core.base import BaseMCPService
|
|
32
27
|
from claude_mpm.services.mcp_gateway.core.interfaces import (
|
|
@@ -620,12 +620,15 @@ class MCPServiceVerifier:
|
|
|
620
620
|
return True
|
|
621
621
|
|
|
622
622
|
if "claude-mpm configure" in diagnostic.fix_command:
|
|
623
|
-
#
|
|
623
|
+
# Check if services are available (read-only)
|
|
624
624
|
from .mcp_config_manager import MCPConfigManager
|
|
625
625
|
|
|
626
626
|
manager = MCPConfigManager()
|
|
627
|
-
|
|
628
|
-
|
|
627
|
+
available, message = manager.check_mcp_services_available()
|
|
628
|
+
if not available:
|
|
629
|
+
# Cannot auto-fix - user must install services manually
|
|
630
|
+
self.logger.warning(f"Cannot auto-fix: {message}")
|
|
631
|
+
return available
|
|
629
632
|
|
|
630
633
|
except Exception as e:
|
|
631
634
|
self.logger.error(f"Auto-fix failed for {service_name}: {e}")
|
|
@@ -88,11 +88,12 @@ class UnifiedMonitorDaemon:
|
|
|
88
88
|
self.shutdown_event = threading.Event()
|
|
89
89
|
|
|
90
90
|
def _get_default_pid_file(self) -> str:
|
|
91
|
-
"""Get default PID file path."""
|
|
91
|
+
"""Get default PID file path with port number to support multiple daemons."""
|
|
92
92
|
project_root = Path.cwd()
|
|
93
93
|
claude_mpm_dir = project_root / ".claude-mpm"
|
|
94
94
|
claude_mpm_dir.mkdir(exist_ok=True)
|
|
95
|
-
|
|
95
|
+
# Include port in filename to support multiple daemon instances
|
|
96
|
+
return str(claude_mpm_dir / f"monitor-daemon-{self.port}.pid")
|
|
96
97
|
|
|
97
98
|
def start(self, force_restart: bool = False) -> bool:
|
|
98
99
|
"""Start the unified monitor daemon.
|
|
@@ -145,16 +146,26 @@ class UnifiedMonitorDaemon:
|
|
|
145
146
|
if self.daemon_manager.is_running():
|
|
146
147
|
existing_pid = self.daemon_manager.get_pid()
|
|
147
148
|
if not force_restart:
|
|
148
|
-
|
|
149
|
+
msg = f"Daemon already running on port {self.port} with PID {existing_pid}"
|
|
150
|
+
self.logger.warning(msg)
|
|
151
|
+
# If we're in subprocess mode, this is an error - we should have cleaned up
|
|
152
|
+
if os.environ.get("CLAUDE_MPM_SUBPROCESS_DAEMON") == "1":
|
|
153
|
+
self.logger.error(
|
|
154
|
+
f"SUBPROCESS ERROR: {msg} - This should not happen in subprocess mode!"
|
|
155
|
+
)
|
|
149
156
|
return False
|
|
150
157
|
# Force restart was already handled above
|
|
151
158
|
|
|
152
159
|
# Check for our service on the port
|
|
153
160
|
is_ours, pid = self.daemon_manager.is_our_service()
|
|
154
161
|
if is_ours and pid and not force_restart:
|
|
155
|
-
self.
|
|
156
|
-
|
|
157
|
-
|
|
162
|
+
msg = f"Our service already running on port {self.port} (PID: {pid})"
|
|
163
|
+
self.logger.warning(msg)
|
|
164
|
+
# If we're in subprocess mode, this is an error - we should have cleaned up
|
|
165
|
+
if os.environ.get("CLAUDE_MPM_SUBPROCESS_DAEMON") == "1":
|
|
166
|
+
self.logger.error(
|
|
167
|
+
f"SUBPROCESS ERROR: {msg} - This should not happen in subprocess mode!"
|
|
168
|
+
)
|
|
158
169
|
return False
|
|
159
170
|
|
|
160
171
|
# Use subprocess approach for clean daemon startup (v4.2.40)
|
|
@@ -169,20 +180,29 @@ class UnifiedMonitorDaemon:
|
|
|
169
180
|
if os.environ.get("CLAUDE_MPM_SUBPROCESS_DAEMON") == "1":
|
|
170
181
|
# We're in a subprocess started by start_daemon_subprocess
|
|
171
182
|
# We need to write the PID file ourselves since parent didn't
|
|
172
|
-
self.logger.info("Running in subprocess daemon mode
|
|
183
|
+
self.logger.info(f"Running in subprocess daemon mode on port {self.port}")
|
|
184
|
+
self.logger.info(f"Subprocess PID: {os.getpid()}")
|
|
185
|
+
self.logger.info(f"PID file path: {self.daemon_manager.pid_file}")
|
|
173
186
|
self.daemon_manager.write_pid_file()
|
|
187
|
+
self.logger.info("PID file written successfully")
|
|
174
188
|
|
|
175
189
|
# Setup signal handlers for graceful shutdown
|
|
176
190
|
self._setup_signal_handlers()
|
|
191
|
+
self.logger.info("Signal handlers configured")
|
|
177
192
|
|
|
178
193
|
# Start the server (this will run until shutdown)
|
|
194
|
+
self.logger.info("Starting server in subprocess mode...")
|
|
179
195
|
try:
|
|
180
196
|
result = self._run_server()
|
|
181
197
|
if not result:
|
|
182
198
|
self.logger.error("Failed to start server in subprocess mode")
|
|
199
|
+
return result
|
|
200
|
+
self.logger.info("Server started successfully in subprocess mode")
|
|
183
201
|
return result
|
|
184
202
|
except Exception as e:
|
|
185
|
-
self.logger.error(
|
|
203
|
+
self.logger.error(
|
|
204
|
+
f"Server startup exception in subprocess: {e}", exc_info=True
|
|
205
|
+
)
|
|
186
206
|
raise
|
|
187
207
|
else:
|
|
188
208
|
# Legacy fork approach (kept for compatibility but not used by default)
|
|
@@ -80,18 +80,20 @@ class DaemonManager:
|
|
|
80
80
|
self.startup_status_file = None
|
|
81
81
|
|
|
82
82
|
def _get_default_pid_file(self) -> Path:
|
|
83
|
-
"""Get default PID file path."""
|
|
83
|
+
"""Get default PID file path with port number to support multiple daemons."""
|
|
84
84
|
project_root = Path.cwd()
|
|
85
85
|
claude_mpm_dir = project_root / ".claude-mpm"
|
|
86
86
|
claude_mpm_dir.mkdir(exist_ok=True)
|
|
87
|
-
|
|
87
|
+
# Include port in filename to support multiple daemon instances
|
|
88
|
+
return claude_mpm_dir / f"monitor-daemon-{self.port}.pid"
|
|
88
89
|
|
|
89
90
|
def _get_default_log_file(self) -> Path:
|
|
90
|
-
"""Get default log file path."""
|
|
91
|
+
"""Get default log file path with port number to support multiple daemons."""
|
|
91
92
|
project_root = Path.cwd()
|
|
92
93
|
claude_mpm_dir = project_root / ".claude-mpm"
|
|
93
94
|
claude_mpm_dir.mkdir(exist_ok=True)
|
|
94
|
-
|
|
95
|
+
# Include port in filename to support multiple daemon instances
|
|
96
|
+
return claude_mpm_dir / f"monitor-daemon-{self.port}.log"
|
|
95
97
|
|
|
96
98
|
def cleanup_port_conflicts(self, max_retries: int = 3) -> bool:
|
|
97
99
|
"""Clean up any processes using the daemon port.
|
|
@@ -471,6 +473,55 @@ class DaemonManager:
|
|
|
471
473
|
|
|
472
474
|
return None
|
|
473
475
|
|
|
476
|
+
def _verify_daemon_health(self, max_attempts: int = 3) -> bool:
|
|
477
|
+
"""Verify daemon is healthy by checking HTTP health endpoint.
|
|
478
|
+
|
|
479
|
+
Args:
|
|
480
|
+
max_attempts: Maximum number of connection attempts
|
|
481
|
+
|
|
482
|
+
Returns:
|
|
483
|
+
True if health check passes, False otherwise
|
|
484
|
+
"""
|
|
485
|
+
try:
|
|
486
|
+
import requests
|
|
487
|
+
|
|
488
|
+
for attempt in range(max_attempts):
|
|
489
|
+
try:
|
|
490
|
+
# Try to connect to health endpoint
|
|
491
|
+
response = requests.get(
|
|
492
|
+
f"http://{self.host}:{self.port}/health", timeout=2
|
|
493
|
+
)
|
|
494
|
+
|
|
495
|
+
if response.status_code == 200:
|
|
496
|
+
self.logger.debug(
|
|
497
|
+
f"Health check passed on attempt {attempt + 1}/{max_attempts}"
|
|
498
|
+
)
|
|
499
|
+
return True
|
|
500
|
+
|
|
501
|
+
self.logger.debug(
|
|
502
|
+
f"Health check returned status {response.status_code} on attempt {attempt + 1}/{max_attempts}"
|
|
503
|
+
)
|
|
504
|
+
|
|
505
|
+
except requests.exceptions.RequestException as e:
|
|
506
|
+
self.logger.debug(
|
|
507
|
+
f"Health check attempt {attempt + 1}/{max_attempts} failed: {e}"
|
|
508
|
+
)
|
|
509
|
+
|
|
510
|
+
# Wait before retry (except on last attempt)
|
|
511
|
+
if attempt < max_attempts - 1:
|
|
512
|
+
time.sleep(1)
|
|
513
|
+
|
|
514
|
+
self.logger.debug(f"Health check failed after {max_attempts} attempts")
|
|
515
|
+
return False
|
|
516
|
+
|
|
517
|
+
except ImportError:
|
|
518
|
+
# requests not available, skip health check
|
|
519
|
+
self.logger.debug("requests library not available, skipping health check")
|
|
520
|
+
return True
|
|
521
|
+
except Exception as e:
|
|
522
|
+
self.logger.debug(f"Health check error: {e}")
|
|
523
|
+
return False
|
|
524
|
+
|
|
474
525
|
def start_daemon(self, force_restart: bool = False) -> bool:
|
|
475
526
|
"""Start the daemon with automatic cleanup and retry.
|
|
476
527
|
|
|
@@ -588,36 +639,62 @@ class DaemonManager:
|
|
|
588
639
|
pid = process.pid
|
|
589
640
|
self.logger.info(f"Monitor subprocess started with PID {pid}")
|
|
590
641
|
|
|
591
|
-
# Wait for the subprocess to write its PID file
|
|
642
|
+
# Wait for the subprocess to write its PID file and bind to port
|
|
592
643
|
# The subprocess will write the PID file after it starts successfully
|
|
593
644
|
max_wait = 10 # seconds
|
|
594
645
|
start_time = time.time()
|
|
646
|
+
pid_file_found = False
|
|
647
|
+
port_bound = False
|
|
648
|
+
|
|
649
|
+
self.logger.debug(f"Waiting up to {max_wait}s for daemon to start...")
|
|
595
650
|
|
|
596
651
|
while time.time() - start_time < max_wait:
|
|
597
652
|
# Check if process is still running
|
|
598
|
-
|
|
599
|
-
|
|
653
|
+
returncode = process.poll()
|
|
654
|
+
if returncode is not None:
|
|
655
|
+
# Process exited - this is the bug we're fixing!
|
|
656
|
+
self.logger.error(
|
|
657
|
+
f"Monitor daemon subprocess exited prematurely with code {returncode}"
|
|
658
|
+
)
|
|
600
659
|
self.logger.error(
|
|
601
|
-
f"
|
|
660
|
+
f"Port {self.port} daemon failed to start. Check {self.log_file} for details."
|
|
602
661
|
)
|
|
603
662
|
return False
|
|
604
663
|
|
|
605
664
|
# Check if PID file was written
|
|
606
|
-
if self.pid_file.exists():
|
|
665
|
+
if not pid_file_found and self.pid_file.exists():
|
|
607
666
|
try:
|
|
608
667
|
with self.pid_file.open() as f:
|
|
609
668
|
written_pid = int(f.read().strip())
|
|
610
669
|
if written_pid == pid:
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
)
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
670
|
+
pid_file_found = True
|
|
671
|
+
self.logger.debug(
|
|
672
|
+
f"PID file found with correct PID {pid}"
|
|
673
|
+
)
|
|
674
|
+
except Exception as e:
|
|
675
|
+
self.logger.debug(f"Error reading PID file: {e}")
|
|
676
|
+
|
|
677
|
+
# Check if port is bound (health check)
|
|
678
|
+
if not port_bound and not self._is_port_available():
|
|
679
|
+
# Port NOT available means it's in use (good!)
|
|
680
|
+
port_bound = True
|
|
681
|
+
self.logger.debug(f"Port {self.port} is now bound")
|
|
682
|
+
|
|
683
|
+
# Success criteria: both PID file exists and port is bound
|
|
684
|
+
if pid_file_found and port_bound:
|
|
685
|
+
self.logger.info(
|
|
686
|
+
f"Monitor daemon successfully started on port {self.port} (PID: {pid})"
|
|
687
|
+
)
|
|
688
|
+
# Additional health check: verify we can connect
|
|
689
|
+
if self._verify_daemon_health(max_attempts=3):
|
|
690
|
+
self.logger.info("Daemon health check passed")
|
|
691
|
+
return True
|
|
692
|
+
self.logger.warning(
|
|
693
|
+
"Daemon started but health check failed - may still be initializing"
|
|
694
|
+
)
|
|
695
|
+
return (
|
|
696
|
+
True # Return success anyway if PID file and port are good
|
|
697
|
+
)
|
|
621
698
|
|
|
622
699
|
time.sleep(0.5)
|
|
623
700
|
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Pull Request Services Package
|
|
3
|
+
==============================
|
|
4
|
+
|
|
5
|
+
Provides PR template generation and workflow automation.
|
|
6
|
+
Used by agent-improver and skills-manager agents.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from .pr_template_service import PRTemplateService, PRType
|
|
10
|
+
|
|
11
|
+
__all__ = [
|
|
12
|
+
"PRTemplateService",
|
|
13
|
+
"PRType",
|
|
14
|
+
]
|