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
claude_mpm/cli/startup.py
CHANGED
|
@@ -10,6 +10,47 @@ Part of cli/__init__.py refactoring to reduce file size and improve modularity.
|
|
|
10
10
|
|
|
11
11
|
import os
|
|
12
12
|
import sys
|
|
13
|
+
import warnings
|
|
14
|
+
from pathlib import Path
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def check_legacy_cache() -> None:
|
|
18
|
+
"""Check for legacy cache/agents/ directory and warn user.
|
|
19
|
+
|
|
20
|
+
WHY: cache/agents/ is deprecated in favor of cache/remote-agents/.
|
|
21
|
+
Research confirmed that cache/remote-agents/ is the canonical location
|
|
22
|
+
with 26 active code references, while cache/agents/ has only 7 legacy references.
|
|
23
|
+
|
|
24
|
+
DESIGN DECISIONS:
|
|
25
|
+
- Non-blocking warning: Doesn't stop execution, just informs user
|
|
26
|
+
- Migration guidance: Provides clear path to migrate
|
|
27
|
+
- One-time check: Only warns if legacy cache contains files
|
|
28
|
+
"""
|
|
29
|
+
home = Path.home()
|
|
30
|
+
legacy_cache = home / ".claude-mpm" / "cache" / "agents"
|
|
31
|
+
canonical_cache = home / ".claude-mpm" / "cache" / "remote-agents"
|
|
32
|
+
migration_marker = home / ".claude-mpm" / "cache" / ".migrated_to_remote_agents"
|
|
33
|
+
|
|
34
|
+
# Skip if already migrated or no legacy cache
|
|
35
|
+
if migration_marker.exists() or not legacy_cache.exists():
|
|
36
|
+
return
|
|
37
|
+
|
|
38
|
+
# Check if legacy cache has actual agent files
|
|
39
|
+
legacy_files = list(legacy_cache.glob("*.md")) + list(legacy_cache.glob("*.json"))
|
|
40
|
+
if not legacy_files:
|
|
41
|
+
return
|
|
42
|
+
|
|
43
|
+
# Only warn if canonical cache doesn't exist (indicating unmigrated system)
|
|
44
|
+
if not canonical_cache.exists():
|
|
45
|
+
warnings.warn(
|
|
46
|
+
f"\n⚠️ DEPRECATION: Legacy cache directory detected\n"
|
|
47
|
+
f" Location: {legacy_cache}\n"
|
|
48
|
+
f" Files found: {len(legacy_files)}\n\n"
|
|
49
|
+
f"The 'cache/agents/' directory is deprecated. Please migrate to 'cache/remote-agents/'.\n"
|
|
50
|
+
f"Run: python scripts/migrate_cache_to_remote_agents.py\n",
|
|
51
|
+
DeprecationWarning,
|
|
52
|
+
stacklevel=2,
|
|
53
|
+
)
|
|
13
54
|
|
|
14
55
|
|
|
15
56
|
def setup_early_environment(argv):
|
|
@@ -97,7 +138,7 @@ def deploy_bundled_skills():
|
|
|
97
138
|
WHY: Automatically deploy skills from the bundled/ directory to .claude/skills/
|
|
98
139
|
to ensure skills are available for agents without manual intervention.
|
|
99
140
|
|
|
100
|
-
DESIGN DECISION: Deployment happens
|
|
141
|
+
DESIGN DECISION: Deployment happens with minimal feedback (checkmark on success).
|
|
101
142
|
Failures are logged but don't block startup to ensure claude-mpm remains
|
|
102
143
|
functional even if skills deployment fails. Respects auto_deploy config setting.
|
|
103
144
|
"""
|
|
@@ -128,9 +169,13 @@ def deploy_bundled_skills():
|
|
|
128
169
|
logger = get_logger("cli")
|
|
129
170
|
|
|
130
171
|
if deployment_result.get("deployed"):
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
)
|
|
172
|
+
# Show simple feedback for deployed skills
|
|
173
|
+
deployed_count = len(deployment_result["deployed"])
|
|
174
|
+
print(f"✓ Bundled skills ready ({deployed_count} deployed)", flush=True)
|
|
175
|
+
logger.info(f"Skills: Deployed {deployed_count} skill(s)")
|
|
176
|
+
elif not deployment_result.get("errors"):
|
|
177
|
+
# No deployment needed, skills already present
|
|
178
|
+
print("✓ Bundled skills ready", flush=True)
|
|
134
179
|
|
|
135
180
|
if deployment_result.get("errors"):
|
|
136
181
|
logger.warning(
|
|
@@ -153,7 +198,8 @@ def discover_and_link_runtime_skills():
|
|
|
153
198
|
WHY: Automatically discover and link skills added to .claude/skills/
|
|
154
199
|
without requiring manual configuration.
|
|
155
200
|
|
|
156
|
-
DESIGN DECISION:
|
|
201
|
+
DESIGN DECISION: Provides simple feedback on completion.
|
|
202
|
+
Failures are logged but don't block startup to ensure
|
|
157
203
|
claude-mpm remains functional even if skills discovery fails.
|
|
158
204
|
"""
|
|
159
205
|
try:
|
|
@@ -162,6 +208,8 @@ def discover_and_link_runtime_skills():
|
|
|
162
208
|
)
|
|
163
209
|
|
|
164
210
|
discover_skills()
|
|
211
|
+
# Show simple success feedback
|
|
212
|
+
print("✓ Runtime skills linked", flush=True)
|
|
165
213
|
except Exception as e:
|
|
166
214
|
# Import logger here to avoid circular imports
|
|
167
215
|
from ..core.logger import get_logger
|
|
@@ -200,6 +248,7 @@ def deploy_output_style_on_startup():
|
|
|
200
248
|
settings_file = Path.home() / ".claude" / "settings.json"
|
|
201
249
|
output_style_file = Path.home() / ".claude" / "output-styles" / "claude-mpm.md"
|
|
202
250
|
|
|
251
|
+
already_configured = False
|
|
203
252
|
if settings_file.exists() and output_style_file.exists():
|
|
204
253
|
try:
|
|
205
254
|
import json
|
|
@@ -213,10 +262,15 @@ def deploy_output_style_on_startup():
|
|
|
213
262
|
settings = json.loads(settings_file.read_text())
|
|
214
263
|
if settings.get("activeOutputStyle") == "claude-mpm":
|
|
215
264
|
# Already deployed and active with content
|
|
216
|
-
|
|
265
|
+
already_configured = True
|
|
217
266
|
except Exception:
|
|
218
267
|
pass # Continue with deployment if we can't read settings
|
|
219
268
|
|
|
269
|
+
if already_configured:
|
|
270
|
+
# Show feedback that output style is ready
|
|
271
|
+
print("✓ Output style configured", flush=True)
|
|
272
|
+
return
|
|
273
|
+
|
|
220
274
|
# Read OUTPUT_STYLE.md content
|
|
221
275
|
output_style_path = Path(__file__).parent.parent / "agents" / "OUTPUT_STYLE.md"
|
|
222
276
|
|
|
@@ -228,6 +282,7 @@ def deploy_output_style_on_startup():
|
|
|
228
282
|
|
|
229
283
|
# Deploy the output style (deploys file and activates it)
|
|
230
284
|
output_style_manager.deploy_output_style(output_style_content)
|
|
285
|
+
print("✓ Output style configured", flush=True)
|
|
231
286
|
|
|
232
287
|
except Exception as e:
|
|
233
288
|
# Non-critical - log but don't fail startup
|
|
@@ -238,18 +293,384 @@ def deploy_output_style_on_startup():
|
|
|
238
293
|
# Continue execution - output style deployment shouldn't block startup
|
|
239
294
|
|
|
240
295
|
|
|
296
|
+
def sync_remote_agents_on_startup():
|
|
297
|
+
"""
|
|
298
|
+
Synchronize agent templates from remote sources on startup.
|
|
299
|
+
|
|
300
|
+
WHY: Ensures agents are up-to-date from remote Git sources (GitHub)
|
|
301
|
+
without manual intervention. Uses ETag-based caching for efficient
|
|
302
|
+
updates (95%+ bandwidth reduction).
|
|
303
|
+
|
|
304
|
+
DESIGN DECISION: Non-blocking synchronization that doesn't prevent
|
|
305
|
+
startup if network is unavailable. Failures are logged but don't
|
|
306
|
+
block startup to ensure claude-mpm remains functional.
|
|
307
|
+
|
|
308
|
+
Workflow:
|
|
309
|
+
1. Sync all enabled Git sources (download/cache files) - Phase 1 progress bar
|
|
310
|
+
2. Deploy agents to ~/.claude/agents/ - Phase 2 progress bar
|
|
311
|
+
3. Log deployment results
|
|
312
|
+
"""
|
|
313
|
+
# Check for legacy cache and warn user if found
|
|
314
|
+
check_legacy_cache()
|
|
315
|
+
|
|
316
|
+
try:
|
|
317
|
+
from ..services.agents.deployment.agent_deployment import AgentDeploymentService
|
|
318
|
+
from ..services.agents.startup_sync import sync_agents_on_startup
|
|
319
|
+
from ..utils.progress import ProgressBar
|
|
320
|
+
|
|
321
|
+
# Phase 1: Sync files from Git sources
|
|
322
|
+
result = sync_agents_on_startup()
|
|
323
|
+
|
|
324
|
+
# Only proceed with deployment if sync was enabled and ran
|
|
325
|
+
if result.get("enabled") and result.get("sources_synced", 0) > 0:
|
|
326
|
+
from ..core.logger import get_logger
|
|
327
|
+
|
|
328
|
+
logger = get_logger("cli")
|
|
329
|
+
|
|
330
|
+
downloaded = result.get("total_downloaded", 0)
|
|
331
|
+
cached = result.get("cache_hits", 0)
|
|
332
|
+
duration = result.get("duration_ms", 0)
|
|
333
|
+
|
|
334
|
+
if downloaded > 0 or cached > 0:
|
|
335
|
+
logger.debug(
|
|
336
|
+
f"Agent sync: {downloaded} updated, {cached} cached ({duration}ms)"
|
|
337
|
+
)
|
|
338
|
+
|
|
339
|
+
# Log errors if any
|
|
340
|
+
errors = result.get("errors", [])
|
|
341
|
+
if errors:
|
|
342
|
+
logger.warning(f"Agent sync completed with {len(errors)} errors")
|
|
343
|
+
|
|
344
|
+
# Phase 2: Deploy agents from cache to ~/.claude/agents/
|
|
345
|
+
# This mirrors the skills deployment pattern (lines 371-407)
|
|
346
|
+
try:
|
|
347
|
+
# Initialize deployment service
|
|
348
|
+
deployment_service = AgentDeploymentService()
|
|
349
|
+
|
|
350
|
+
# Count agents in cache to show accurate progress
|
|
351
|
+
from pathlib import Path
|
|
352
|
+
|
|
353
|
+
cache_dir = Path.home() / ".claude-mpm" / "cache" / "remote-agents"
|
|
354
|
+
agent_count = 0
|
|
355
|
+
|
|
356
|
+
if cache_dir.exists():
|
|
357
|
+
# Count MD files in cache (agent markdown files from Git)
|
|
358
|
+
# BUGFIX: Only count files in agent directories, not docs/templates/READMEs
|
|
359
|
+
# Valid agent paths must contain "/agents/" or be in root-level category dirs
|
|
360
|
+
# Exclude PM templates, BASE-AGENT, and documentation files
|
|
361
|
+
pm_templates = {
|
|
362
|
+
"base-agent.md",
|
|
363
|
+
"circuit_breakers.md",
|
|
364
|
+
"pm_examples.md",
|
|
365
|
+
"pm_red_flags.md",
|
|
366
|
+
"research_gate_examples.md",
|
|
367
|
+
"response_format.md",
|
|
368
|
+
"ticket_completeness_examples.md",
|
|
369
|
+
"validation_templates.md",
|
|
370
|
+
"git_file_tracking.md",
|
|
371
|
+
}
|
|
372
|
+
# Documentation files to exclude (by filename)
|
|
373
|
+
doc_files = {
|
|
374
|
+
"readme.md",
|
|
375
|
+
"changelog.md",
|
|
376
|
+
"contributing.md",
|
|
377
|
+
"implementation-summary.md",
|
|
378
|
+
"reorganization-plan.md",
|
|
379
|
+
"auto-deploy-index.md",
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
# Find all markdown files
|
|
383
|
+
all_md_files = list(cache_dir.rglob("*.md"))
|
|
384
|
+
|
|
385
|
+
# Filter to only agent files:
|
|
386
|
+
# 1. Must have "/agents/" in path (from git repos)
|
|
387
|
+
# 2. Must not be in PM templates or doc files
|
|
388
|
+
# 3. Exclude BASE-AGENT.md which is not a deployable agent
|
|
389
|
+
agent_files = [
|
|
390
|
+
f
|
|
391
|
+
for f in all_md_files
|
|
392
|
+
if (
|
|
393
|
+
# Must be in an agent directory (from git repos like bobmatnyc/claude-mpm-agents/agents/)
|
|
394
|
+
"/agents/" in str(f)
|
|
395
|
+
# Exclude PM templates, doc files, and BASE-AGENT
|
|
396
|
+
and f.name.lower() not in pm_templates
|
|
397
|
+
and f.name.lower() not in doc_files
|
|
398
|
+
and f.name.lower() != "base-agent.md"
|
|
399
|
+
)
|
|
400
|
+
]
|
|
401
|
+
agent_count = len(agent_files)
|
|
402
|
+
|
|
403
|
+
if agent_count > 0:
|
|
404
|
+
# Create progress bar for deployment phase
|
|
405
|
+
deploy_progress = ProgressBar(
|
|
406
|
+
total=agent_count,
|
|
407
|
+
prefix="Deploying agents",
|
|
408
|
+
show_percentage=True,
|
|
409
|
+
show_counter=True,
|
|
410
|
+
)
|
|
411
|
+
|
|
412
|
+
# Deploy agents with progress callback
|
|
413
|
+
deploy_target = Path.home() / ".claude" / "agents"
|
|
414
|
+
deployment_result = deployment_service.deploy_agents(
|
|
415
|
+
target_dir=deploy_target,
|
|
416
|
+
force_rebuild=False, # Only deploy if versions differ
|
|
417
|
+
deployment_mode="update", # Version-aware updates
|
|
418
|
+
)
|
|
419
|
+
|
|
420
|
+
# Update progress bar (single increment since deploy_agents is batch)
|
|
421
|
+
deploy_progress.update(agent_count)
|
|
422
|
+
|
|
423
|
+
# Finish deployment progress bar
|
|
424
|
+
deployed = len(deployment_result.get("deployed", []))
|
|
425
|
+
updated = len(deployment_result.get("updated", []))
|
|
426
|
+
skipped = len(deployment_result.get("skipped", []))
|
|
427
|
+
total_available = deployed + updated + skipped
|
|
428
|
+
|
|
429
|
+
# Show total available agents (deployed + updated + already existing)
|
|
430
|
+
if deployed > 0 or updated > 0:
|
|
431
|
+
deploy_progress.finish(
|
|
432
|
+
f"Complete: {deployed} deployed, {updated} updated, {skipped} already present ({total_available} total)"
|
|
433
|
+
)
|
|
434
|
+
else:
|
|
435
|
+
deploy_progress.finish(
|
|
436
|
+
f"Complete: {total_available} agents ready (all up-to-date)"
|
|
437
|
+
)
|
|
438
|
+
|
|
439
|
+
# Display deployment errors to user (not just logs)
|
|
440
|
+
deploy_errors = deployment_result.get("errors", [])
|
|
441
|
+
if deploy_errors:
|
|
442
|
+
# Log for debugging
|
|
443
|
+
logger.warning(
|
|
444
|
+
f"Agent deployment completed with {len(deploy_errors)} errors: {deploy_errors}"
|
|
445
|
+
)
|
|
446
|
+
|
|
447
|
+
# Display errors to user with clear formatting
|
|
448
|
+
print("\n⚠️ Agent Deployment Errors:")
|
|
449
|
+
|
|
450
|
+
# Show first 10 errors to avoid overwhelming output
|
|
451
|
+
max_errors_to_show = 10
|
|
452
|
+
errors_to_display = deploy_errors[:max_errors_to_show]
|
|
453
|
+
|
|
454
|
+
for error in errors_to_display:
|
|
455
|
+
# Format error message for readability
|
|
456
|
+
# Errors typically come as strings like "agent.md: Error message"
|
|
457
|
+
print(f" - {error}")
|
|
458
|
+
|
|
459
|
+
# If more errors exist, show count
|
|
460
|
+
if len(deploy_errors) > max_errors_to_show:
|
|
461
|
+
remaining = len(deploy_errors) - max_errors_to_show
|
|
462
|
+
print(f" ... and {remaining} more error(s)")
|
|
463
|
+
|
|
464
|
+
# Show summary message
|
|
465
|
+
print(
|
|
466
|
+
f"\n❌ Failed to deploy {len(deploy_errors)} agent(s). Please check the error messages above."
|
|
467
|
+
)
|
|
468
|
+
print(" Run with --verbose for detailed error information.\n")
|
|
469
|
+
|
|
470
|
+
except Exception as e:
|
|
471
|
+
# Deployment failure shouldn't block startup
|
|
472
|
+
from ..core.logger import get_logger
|
|
473
|
+
|
|
474
|
+
logger = get_logger("cli")
|
|
475
|
+
logger.warning(f"Failed to deploy agents from cache: {e}")
|
|
476
|
+
|
|
477
|
+
except Exception as e:
|
|
478
|
+
# Non-critical - log but don't fail startup
|
|
479
|
+
from ..core.logger import get_logger
|
|
480
|
+
|
|
481
|
+
logger = get_logger("cli")
|
|
482
|
+
logger.debug(f"Failed to sync remote agents: {e}")
|
|
483
|
+
# Continue execution - agent sync failure shouldn't block startup
|
|
484
|
+
|
|
485
|
+
|
|
486
|
+
def sync_remote_skills_on_startup():
|
|
487
|
+
"""
|
|
488
|
+
Synchronize skill templates from remote sources on startup.
|
|
489
|
+
|
|
490
|
+
WHY: Ensures skills are up-to-date from remote Git sources (GitHub)
|
|
491
|
+
without manual intervention. Provides consistency with agent syncing.
|
|
492
|
+
|
|
493
|
+
DESIGN DECISION: Non-blocking synchronization that doesn't prevent
|
|
494
|
+
startup if network is unavailable. Failures are logged but don't
|
|
495
|
+
block startup to ensure claude-mpm remains functional.
|
|
496
|
+
|
|
497
|
+
Workflow:
|
|
498
|
+
1. Sync all enabled Git sources (download/cache files) - Phase 1 progress bar
|
|
499
|
+
2. Deploy skills to ~/.claude/skills/ with flat structure - Phase 2 progress bar
|
|
500
|
+
3. Log deployment results
|
|
501
|
+
"""
|
|
502
|
+
try:
|
|
503
|
+
from pathlib import Path
|
|
504
|
+
|
|
505
|
+
from ..config.skill_sources import SkillSourceConfiguration
|
|
506
|
+
from ..services.skills.git_skill_source_manager import GitSkillSourceManager
|
|
507
|
+
from ..utils.progress import ProgressBar
|
|
508
|
+
|
|
509
|
+
config = SkillSourceConfiguration()
|
|
510
|
+
manager = GitSkillSourceManager(config)
|
|
511
|
+
|
|
512
|
+
# Get enabled sources
|
|
513
|
+
enabled_sources = config.get_enabled_sources()
|
|
514
|
+
if not enabled_sources:
|
|
515
|
+
return # No sources enabled, nothing to sync
|
|
516
|
+
|
|
517
|
+
# Phase 1: Sync files from Git sources
|
|
518
|
+
# We need to discover file count first to show accurate progress
|
|
519
|
+
# This requires pre-scanning repositories via GitHub API
|
|
520
|
+
from ..core.logger import get_logger
|
|
521
|
+
|
|
522
|
+
logger = get_logger("cli")
|
|
523
|
+
|
|
524
|
+
# Discover total file count across all sources
|
|
525
|
+
total_file_count = 0
|
|
526
|
+
for source in enabled_sources:
|
|
527
|
+
try:
|
|
528
|
+
# Parse GitHub URL
|
|
529
|
+
url_parts = (
|
|
530
|
+
source.url.rstrip("/").replace(".git", "").split("github.com/")
|
|
531
|
+
)
|
|
532
|
+
if len(url_parts) == 2:
|
|
533
|
+
repo_path = url_parts[1].strip("/")
|
|
534
|
+
owner_repo = "/".join(repo_path.split("/")[:2])
|
|
535
|
+
|
|
536
|
+
# Use Tree API to discover all files
|
|
537
|
+
all_files = manager._discover_repository_files_via_tree_api(
|
|
538
|
+
owner_repo, source.branch
|
|
539
|
+
)
|
|
540
|
+
|
|
541
|
+
# Count relevant files (markdown, JSON)
|
|
542
|
+
relevant_files = [
|
|
543
|
+
f
|
|
544
|
+
for f in all_files
|
|
545
|
+
if f.endswith(".md") or f.endswith(".json") or f == ".gitignore"
|
|
546
|
+
]
|
|
547
|
+
total_file_count += len(relevant_files)
|
|
548
|
+
|
|
549
|
+
except Exception as e:
|
|
550
|
+
logger.debug(f"Failed to discover files for {source.id}: {e}")
|
|
551
|
+
# Use estimate if discovery fails
|
|
552
|
+
total_file_count += 150
|
|
553
|
+
|
|
554
|
+
# Create progress bar for sync phase with actual file count
|
|
555
|
+
sync_progress = ProgressBar(
|
|
556
|
+
total=total_file_count if total_file_count > 0 else 1,
|
|
557
|
+
prefix="Syncing skills",
|
|
558
|
+
show_percentage=True,
|
|
559
|
+
show_counter=True,
|
|
560
|
+
)
|
|
561
|
+
|
|
562
|
+
# Sync all sources with progress callback
|
|
563
|
+
results = manager.sync_all_sources(
|
|
564
|
+
force=False, progress_callback=sync_progress.update
|
|
565
|
+
)
|
|
566
|
+
|
|
567
|
+
# Finish sync progress bar with clear breakdown
|
|
568
|
+
downloaded = results["total_files_updated"]
|
|
569
|
+
cached = results["total_files_cached"]
|
|
570
|
+
total_files = downloaded + cached
|
|
571
|
+
|
|
572
|
+
if cached > 0:
|
|
573
|
+
sync_progress.finish(
|
|
574
|
+
f"Complete: {downloaded} downloaded, {cached} cached ({total_files} total)"
|
|
575
|
+
)
|
|
576
|
+
else:
|
|
577
|
+
# All new downloads (first sync)
|
|
578
|
+
sync_progress.finish(f"Complete: {downloaded} files downloaded")
|
|
579
|
+
|
|
580
|
+
# Phase 2: Deploy skills to ~/.claude/skills/
|
|
581
|
+
# This flattens nested Git structure (e.g., collaboration/parallel-agents/SKILL.md)
|
|
582
|
+
# into flat deployment (e.g., collaboration-dispatching-parallel-agents/SKILL.md)
|
|
583
|
+
if results["synced_count"] > 0:
|
|
584
|
+
# Get all skills to determine deployment count
|
|
585
|
+
all_skills = manager.get_all_skills()
|
|
586
|
+
skill_count = len(all_skills)
|
|
587
|
+
|
|
588
|
+
if skill_count > 0:
|
|
589
|
+
# Create progress bar for deployment phase
|
|
590
|
+
deploy_progress = ProgressBar(
|
|
591
|
+
total=skill_count,
|
|
592
|
+
prefix="Deploying skill directories",
|
|
593
|
+
show_percentage=True,
|
|
594
|
+
show_counter=True,
|
|
595
|
+
)
|
|
596
|
+
|
|
597
|
+
# Deploy skills with progress callback
|
|
598
|
+
# Deploy to project directory (like agents), not user directory
|
|
599
|
+
deployment_result = manager.deploy_skills(
|
|
600
|
+
target_dir=Path.cwd() / ".claude" / "skills",
|
|
601
|
+
force=False,
|
|
602
|
+
progress_callback=deploy_progress.update,
|
|
603
|
+
)
|
|
604
|
+
|
|
605
|
+
# Finish deployment progress bar
|
|
606
|
+
deployed = deployment_result.get("deployed_count", 0)
|
|
607
|
+
skipped = deployment_result.get("skipped_count", 0)
|
|
608
|
+
total_available = deployed + skipped
|
|
609
|
+
|
|
610
|
+
# Show total available skills (deployed + already existing)
|
|
611
|
+
# This is more user-friendly than just showing newly deployed count
|
|
612
|
+
if deployed > 0:
|
|
613
|
+
deploy_progress.finish(
|
|
614
|
+
f"Complete: {deployed} deployed, {skipped} already present ({total_available} total)"
|
|
615
|
+
)
|
|
616
|
+
else:
|
|
617
|
+
deploy_progress.finish(
|
|
618
|
+
f"Complete: {total_available} skills ready (all up-to-date)"
|
|
619
|
+
)
|
|
620
|
+
|
|
621
|
+
# Log deployment errors if any
|
|
622
|
+
from ..core.logger import get_logger
|
|
623
|
+
|
|
624
|
+
logger = get_logger("cli")
|
|
625
|
+
|
|
626
|
+
errors = deployment_result.get("errors", [])
|
|
627
|
+
if errors:
|
|
628
|
+
logger.warning(
|
|
629
|
+
f"Skill deployment completed with {len(errors)} errors: {errors}"
|
|
630
|
+
)
|
|
631
|
+
|
|
632
|
+
# Log sync errors if any
|
|
633
|
+
if results["failed_count"] > 0:
|
|
634
|
+
logger.warning(
|
|
635
|
+
f"Skill sync completed with {results['failed_count']} failures"
|
|
636
|
+
)
|
|
637
|
+
|
|
638
|
+
except Exception as e:
|
|
639
|
+
# Non-critical - log but don't fail startup
|
|
640
|
+
from ..core.logger import get_logger
|
|
641
|
+
|
|
642
|
+
logger = get_logger("cli")
|
|
643
|
+
logger.debug(f"Failed to sync remote skills: {e}")
|
|
644
|
+
# Continue execution - skill sync failure shouldn't block startup
|
|
645
|
+
|
|
646
|
+
|
|
241
647
|
def run_background_services():
|
|
242
648
|
"""
|
|
243
649
|
Initialize all background services on startup.
|
|
244
650
|
|
|
245
651
|
WHY: Centralizes all startup service initialization for cleaner main().
|
|
652
|
+
|
|
653
|
+
NOTE: System instructions (PM_INSTRUCTIONS.md, WORKFLOW.md, MEMORY.md) and
|
|
654
|
+
templates do NOT deploy automatically on startup. They only deploy when user
|
|
655
|
+
explicitly requests them via agent-manager commands. This prevents unwanted
|
|
656
|
+
file creation in project .claude/ directories.
|
|
657
|
+
See: SystemInstructionsDeployer and agent_deployment.py line 504-509
|
|
246
658
|
"""
|
|
247
659
|
initialize_project_registry()
|
|
248
660
|
check_mcp_auto_configuration()
|
|
249
661
|
verify_mcp_gateway_startup()
|
|
250
662
|
check_for_updates_async()
|
|
251
|
-
|
|
252
|
-
|
|
663
|
+
sync_remote_agents_on_startup() # Sync agents from remote sources
|
|
664
|
+
|
|
665
|
+
# Skills deployment order (precedence: remote > bundled)
|
|
666
|
+
# 1. Deploy bundled skills first (base layer from package)
|
|
667
|
+
# 2. Sync and deploy remote skills (Git sources, can override bundled)
|
|
668
|
+
# 3. Discover and link runtime skills (user-added skills)
|
|
669
|
+
# This ensures remote skills take precedence over bundled skills when names conflict
|
|
670
|
+
deploy_bundled_skills() # Base layer: package-bundled skills
|
|
671
|
+
sync_remote_skills_on_startup() # Override layer: Git-based skills (takes precedence)
|
|
672
|
+
discover_and_link_runtime_skills() # Discovery: user-added skills
|
|
673
|
+
|
|
253
674
|
deploy_output_style_on_startup()
|
|
254
675
|
|
|
255
676
|
|
|
@@ -326,12 +747,26 @@ def check_mcp_auto_configuration():
|
|
|
326
747
|
user consent.
|
|
327
748
|
|
|
328
749
|
DESIGN DECISION: This is blocking but quick - it only runs once and has
|
|
329
|
-
a 10-second timeout.
|
|
330
|
-
|
|
750
|
+
a 10-second timeout. Shows progress feedback during checks to avoid
|
|
751
|
+
appearing frozen.
|
|
752
|
+
|
|
753
|
+
OPTIMIZATION: Skip ALL MCP checks for doctor and configure commands to avoid
|
|
754
|
+
duplicate checks (doctor performs its own comprehensive check, configure
|
|
755
|
+
allows users to select services).
|
|
331
756
|
"""
|
|
757
|
+
# Skip MCP service checks for the doctor and configure commands
|
|
758
|
+
# The doctor command performs its own comprehensive MCP service check
|
|
759
|
+
# The configure command allows users to configure which services to enable
|
|
760
|
+
# Running both would cause duplicate checks and log messages (9 seconds apart)
|
|
761
|
+
if len(sys.argv) > 1 and sys.argv[1] in ("doctor", "configure"):
|
|
762
|
+
return
|
|
763
|
+
|
|
332
764
|
try:
|
|
333
765
|
from ..services.mcp_gateway.auto_configure import check_and_configure_mcp
|
|
334
766
|
|
|
767
|
+
# Show progress feedback - this operation can take 10+ seconds
|
|
768
|
+
print("Checking MCP configuration...", end="", flush=True)
|
|
769
|
+
|
|
335
770
|
# This function handles all the logic:
|
|
336
771
|
# - Checks if already configured
|
|
337
772
|
# - Checks if pipx installation
|
|
@@ -340,45 +775,18 @@ def check_mcp_auto_configuration():
|
|
|
340
775
|
# - Configures if user agrees
|
|
341
776
|
check_and_configure_mcp()
|
|
342
777
|
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
from ..core.logger import get_logger
|
|
346
|
-
|
|
347
|
-
logger = get_logger("cli")
|
|
348
|
-
logger.debug(f"MCP auto-configuration check failed: {e}")
|
|
349
|
-
|
|
350
|
-
# Skip MCP service fixes for the doctor and configure commands
|
|
351
|
-
# The doctor command performs its own comprehensive MCP service check
|
|
352
|
-
# The configure command allows users to configure which services to enable
|
|
353
|
-
# Running both would cause duplicate checks and log messages (9 seconds apart)
|
|
354
|
-
if len(sys.argv) > 1 and sys.argv[1] in ("doctor", "configure"):
|
|
355
|
-
return
|
|
356
|
-
|
|
357
|
-
# Also ensure MCP services are properly configured in ~/.claude.json
|
|
358
|
-
# This fixes incorrect paths and adds missing services
|
|
359
|
-
try:
|
|
360
|
-
from ..core.logger import get_logger
|
|
361
|
-
from ..services.mcp_config_manager import MCPConfigManager
|
|
362
|
-
|
|
363
|
-
logger = get_logger("cli")
|
|
364
|
-
mcp_manager = MCPConfigManager()
|
|
365
|
-
|
|
366
|
-
# Fix any corrupted installations first
|
|
367
|
-
_fix_success, fix_message = mcp_manager.fix_mcp_service_issues()
|
|
368
|
-
if fix_message and "Fixed:" in fix_message:
|
|
369
|
-
logger.info(f"MCP service fixes applied: {fix_message}")
|
|
370
|
-
|
|
371
|
-
# Ensure all services are configured correctly
|
|
372
|
-
_config_success, config_message = mcp_manager.ensure_mcp_services_configured()
|
|
373
|
-
if config_message and "Added MCP services" in config_message:
|
|
374
|
-
logger.info(f"MCP services configured: {config_message}")
|
|
778
|
+
# Clear the "Checking..." message by overwriting with spaces
|
|
779
|
+
print("\r" + " " * 30 + "\r", end="", flush=True)
|
|
375
780
|
|
|
376
781
|
except Exception as e:
|
|
782
|
+
# Clear progress message on error
|
|
783
|
+
print("\r" + " " * 30 + "\r", end="", flush=True)
|
|
784
|
+
|
|
377
785
|
# Non-critical - log but don't fail
|
|
378
786
|
from ..core.logger import get_logger
|
|
379
787
|
|
|
380
788
|
logger = get_logger("cli")
|
|
381
|
-
logger.debug(f"MCP
|
|
789
|
+
logger.debug(f"MCP auto-configuration check failed: {e}")
|
|
382
790
|
|
|
383
791
|
|
|
384
792
|
def verify_mcp_gateway_startup():
|
|
@@ -407,7 +815,6 @@ def verify_mcp_gateway_startup():
|
|
|
407
815
|
|
|
408
816
|
try:
|
|
409
817
|
import asyncio
|
|
410
|
-
import time
|
|
411
818
|
|
|
412
819
|
from ..core.logger import get_logger
|
|
413
820
|
from ..services.mcp_gateway.core.startup_verification import (
|
|
@@ -422,68 +829,14 @@ def verify_mcp_gateway_startup():
|
|
|
422
829
|
|
|
423
830
|
# DISABLED: Pre-warming MCP servers can interfere with Claude Code's MCP management
|
|
424
831
|
# This was causing issues with MCP server initialization and stderr handling
|
|
425
|
-
#
|
|
426
|
-
#
|
|
427
|
-
# try:
|
|
428
|
-
# start_time = time.time()
|
|
429
|
-
# loop = asyncio.new_event_loop()
|
|
430
|
-
# asyncio.set_event_loop(loop)
|
|
431
|
-
#
|
|
432
|
-
# # Pre-warm MCP servers (especially vector search)
|
|
433
|
-
# logger.info("Pre-warming MCP servers to eliminate startup delay...")
|
|
434
|
-
# loop.run_until_complete(pre_warm_mcp_servers())
|
|
435
|
-
#
|
|
436
|
-
# pre_warm_time = time.time() - start_time
|
|
437
|
-
# if pre_warm_time > 1.0:
|
|
438
|
-
# logger.info(f"MCP servers pre-warmed in {pre_warm_time:.2f}s")
|
|
439
|
-
|
|
440
|
-
# Dummy function to maintain structure
|
|
441
|
-
def run_pre_warming():
|
|
442
|
-
loop = None
|
|
443
|
-
try:
|
|
444
|
-
time.time()
|
|
445
|
-
loop = asyncio.new_event_loop()
|
|
446
|
-
asyncio.set_event_loop(loop)
|
|
447
|
-
|
|
448
|
-
# Also run gateway verification if needed
|
|
449
|
-
if not gateway_configured:
|
|
450
|
-
loop.run_until_complete(verify_mcp_gateway_on_startup())
|
|
451
|
-
|
|
452
|
-
except Exception as e:
|
|
453
|
-
# Non-blocking - log but don't fail
|
|
454
|
-
logger.debug(f"MCP pre-warming error (non-critical): {e}")
|
|
455
|
-
finally:
|
|
456
|
-
# Properly clean up event loop to prevent kqueue warnings
|
|
457
|
-
if loop is not None:
|
|
458
|
-
try:
|
|
459
|
-
# Cancel all running tasks
|
|
460
|
-
pending = asyncio.all_tasks(loop)
|
|
461
|
-
for task in pending:
|
|
462
|
-
task.cancel()
|
|
463
|
-
# Wait for tasks to complete cancellation
|
|
464
|
-
if pending:
|
|
465
|
-
loop.run_until_complete(
|
|
466
|
-
asyncio.gather(*pending, return_exceptions=True)
|
|
467
|
-
)
|
|
468
|
-
except Exception:
|
|
469
|
-
pass # Ignore cleanup errors
|
|
470
|
-
finally:
|
|
471
|
-
loop.close()
|
|
472
|
-
# Clear the event loop reference to help with cleanup
|
|
473
|
-
asyncio.set_event_loop(None)
|
|
474
|
-
|
|
475
|
-
# Run pre-warming in background thread
|
|
476
|
-
import threading
|
|
477
|
-
|
|
478
|
-
pre_warm_thread = threading.Thread(target=run_pre_warming, daemon=True)
|
|
479
|
-
pre_warm_thread.start()
|
|
480
|
-
|
|
481
|
-
return
|
|
832
|
+
# Pre-warming functionality has been removed. Gateway verification only runs
|
|
833
|
+
# if MCP gateway is not already configured.
|
|
482
834
|
|
|
483
|
-
# Run
|
|
835
|
+
# Run gateway verification in background if not configured
|
|
484
836
|
if not gateway_configured:
|
|
485
|
-
|
|
837
|
+
|
|
486
838
|
def run_verification():
|
|
839
|
+
"""Background thread to verify MCP gateway configuration."""
|
|
487
840
|
loop = None
|
|
488
841
|
try:
|
|
489
842
|
loop = asyncio.new_event_loop()
|