claude-mpm 4.21.0__py3-none-any.whl → 5.0.2__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- claude_mpm/VERSION +1 -1
- claude_mpm/agents/BASE_PM.md +12 -0
- claude_mpm/agents/OUTPUT_STYLE.md +3 -48
- claude_mpm/agents/PM_INSTRUCTIONS.md +632 -334
- claude_mpm/agents/WORKFLOW.md +75 -2
- claude_mpm/agents/__init__.py +6 -0
- claude_mpm/agents/agent_loader.py +1 -4
- claude_mpm/agents/base_agent.json +6 -3
- claude_mpm/agents/frontmatter_validator.py +1 -1
- claude_mpm/agents/templates/{circuit_breakers.md → circuit-breakers.md} +370 -3
- claude_mpm/agents/templates/context-management-examples.md +544 -0
- claude_mpm/agents/templates/{pm_red_flags.md → pm-red-flags.md} +89 -19
- 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 +38 -2
- claude_mpm/cli/commands/agent_source.py +774 -0
- claude_mpm/cli/commands/agent_state_manager.py +125 -20
- claude_mpm/cli/commands/agents.py +684 -13
- claude_mpm/cli/commands/agents_cleanup.py +210 -0
- claude_mpm/cli/commands/agents_discover.py +338 -0
- claude_mpm/cli/commands/aggregate.py +1 -1
- claude_mpm/cli/commands/analyze.py +3 -3
- claude_mpm/cli/commands/auto_configure.py +2 -6
- claude_mpm/cli/commands/cleanup.py +1 -1
- claude_mpm/cli/commands/config.py +7 -4
- claude_mpm/cli/commands/configure.py +478 -44
- claude_mpm/cli/commands/configure_agent_display.py +4 -4
- claude_mpm/cli/commands/configure_navigation.py +63 -46
- claude_mpm/cli/commands/debug.py +12 -12
- claude_mpm/cli/commands/doctor.py +10 -2
- claude_mpm/cli/commands/hook_errors.py +277 -0
- claude_mpm/cli/commands/local_deploy.py +1 -4
- claude_mpm/cli/commands/mcp_install_commands.py +1 -1
- claude_mpm/cli/commands/mpm_init/core.py +50 -2
- claude_mpm/cli/commands/mpm_init/git_activity.py +10 -10
- claude_mpm/cli/commands/mpm_init/prompts.py +6 -6
- claude_mpm/cli/commands/run.py +124 -128
- claude_mpm/cli/commands/skill_source.py +694 -0
- claude_mpm/cli/commands/skills.py +435 -1
- claude_mpm/cli/executor.py +78 -3
- claude_mpm/cli/interactive/agent_wizard.py +919 -41
- claude_mpm/cli/parsers/agent_source_parser.py +171 -0
- claude_mpm/cli/parsers/agents_parser.py +173 -4
- claude_mpm/cli/parsers/base_parser.py +49 -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 +138 -0
- claude_mpm/cli/parsers/source_parser.py +138 -0
- claude_mpm/cli/startup.py +499 -84
- claude_mpm/cli/startup_display.py +480 -0
- claude_mpm/cli/utils.py +1 -1
- claude_mpm/cli_module/commands.py +1 -1
- 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 +27 -2
- claude_mpm/commands/mpm-monitor.md +9 -0
- claude_mpm/commands/mpm-session-resume.md +381 -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 +11 -0
- claude_mpm/config/agent_presets.py +258 -0
- claude_mpm/config/agent_sources.py +325 -0
- claude_mpm/config/skill_sources.py +590 -0
- claude_mpm/constants.py +12 -0
- claude_mpm/core/api_validator.py +1 -1
- claude_mpm/core/claude_runner.py +17 -10
- claude_mpm/core/config.py +24 -0
- claude_mpm/core/constants.py +1 -1
- claude_mpm/core/framework/__init__.py +3 -16
- claude_mpm/core/framework/loaders/instruction_loader.py +25 -5
- claude_mpm/core/framework/processors/metadata_processor.py +1 -1
- claude_mpm/core/hook_error_memory.py +381 -0
- claude_mpm/core/hook_manager.py +41 -2
- claude_mpm/core/interactive_session.py +112 -5
- claude_mpm/core/logger.py +3 -1
- claude_mpm/core/oneshot_session.py +94 -4
- claude_mpm/dashboard/static/css/activity.css +69 -69
- claude_mpm/dashboard/static/css/connection-status.css +10 -10
- claude_mpm/dashboard/static/css/dashboard.css +15 -15
- claude_mpm/dashboard/static/js/components/activity-tree.js +178 -178
- claude_mpm/dashboard/static/js/components/agent-hierarchy.js +101 -101
- claude_mpm/dashboard/static/js/components/agent-inference.js +31 -31
- claude_mpm/dashboard/static/js/components/build-tracker.js +59 -59
- claude_mpm/dashboard/static/js/components/code-simple.js +107 -107
- claude_mpm/dashboard/static/js/components/connection-debug.js +101 -101
- claude_mpm/dashboard/static/js/components/diff-viewer.js +113 -113
- claude_mpm/dashboard/static/js/components/event-viewer.js +12 -12
- claude_mpm/dashboard/static/js/components/file-change-tracker.js +57 -57
- claude_mpm/dashboard/static/js/components/file-change-viewer.js +74 -74
- claude_mpm/dashboard/static/js/components/file-tool-tracker.js +6 -6
- claude_mpm/dashboard/static/js/components/file-viewer.js +42 -42
- claude_mpm/dashboard/static/js/components/module-viewer.js +27 -27
- claude_mpm/dashboard/static/js/components/session-manager.js +14 -14
- claude_mpm/dashboard/static/js/components/socket-manager.js +1 -1
- claude_mpm/dashboard/static/js/components/ui-state-manager.js +14 -14
- claude_mpm/dashboard/static/js/components/unified-data-viewer.js +110 -110
- claude_mpm/dashboard/static/js/components/working-directory.js +8 -8
- claude_mpm/dashboard/static/js/connection-manager.js +76 -76
- claude_mpm/dashboard/static/js/dashboard.js +76 -58
- claude_mpm/dashboard/static/js/extension-error-handler.js +22 -22
- claude_mpm/dashboard/static/js/socket-client.js +138 -121
- claude_mpm/dashboard/templates/code_simple.html +23 -23
- claude_mpm/dashboard/templates/index.html +18 -18
- claude_mpm/experimental/cli_enhancements.py +1 -5
- claude_mpm/hooks/claude_hooks/event_handlers.py +3 -1
- claude_mpm/hooks/claude_hooks/hook_handler.py +24 -7
- claude_mpm/hooks/claude_hooks/installer.py +45 -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/hooks/templates/pre_tool_use_simple.py +78 -0
- claude_mpm/hooks/templates/pre_tool_use_template.py +323 -0
- claude_mpm/models/git_repository.py +198 -0
- claude_mpm/scripts/claude-hook-handler.sh +3 -3
- claude_mpm/scripts/start_activity_logging.py +3 -1
- 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/deployment/agent_deployment.py +126 -2
- claude_mpm/services/agents/deployment/agent_discovery_service.py +105 -73
- claude_mpm/services/agents/deployment/agent_format_converter.py +1 -1
- claude_mpm/services/agents/deployment/agent_lifecycle_manager.py +1 -5
- claude_mpm/services/agents/deployment/agent_metrics_collector.py +3 -3
- 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/facade/deployment_facade.py +3 -3
- claude_mpm/services/agents/deployment/multi_source_deployment_service.py +115 -15
- claude_mpm/services/agents/deployment/pipeline/pipeline_executor.py +2 -2
- 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 +9 -12
- claude_mpm/services/agents/local_template_manager.py +50 -10
- 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 +1055 -0
- claude_mpm/services/agents/startup_sync.py +239 -0
- claude_mpm/services/agents/toolchain_detector.py +474 -0
- claude_mpm/services/cli/session_pause_manager.py +1 -1
- claude_mpm/services/cli/unified_dashboard_manager.py +1 -1
- claude_mpm/services/command_deployment_service.py +92 -1
- claude_mpm/services/core/base.py +26 -11
- 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_check.py +0 -2
- claude_mpm/services/diagnostics/checks/agent_sources_check.py +577 -0
- claude_mpm/services/diagnostics/checks/instructions_check.py +1 -2
- claude_mpm/services/diagnostics/checks/mcp_check.py +0 -1
- claude_mpm/services/diagnostics/checks/monitor_check.py +0 -1
- 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 +40 -10
- claude_mpm/services/event_bus/direct_relay.py +3 -3
- claude_mpm/services/event_bus/event_bus.py +36 -3
- claude_mpm/services/event_bus/relay.py +23 -7
- claude_mpm/services/events/consumers/logging.py +1 -2
- 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/infrastructure/monitoring/resources.py +1 -1
- 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/local_ops/process_manager.py +1 -1
- claude_mpm/services/local_ops/resource_monitor.py +2 -2
- claude_mpm/services/mcp_gateway/config/configuration.py +1 -1
- claude_mpm/services/mcp_gateway/server/mcp_gateway.py +1 -6
- claude_mpm/services/mcp_gateway/server/stdio_server.py +0 -2
- claude_mpm/services/mcp_gateway/tools/document_summarizer.py +1 -1
- claude_mpm/services/mcp_gateway/tools/kuzu_memory_service.py +6 -2
- claude_mpm/services/memory/failure_tracker.py +19 -4
- claude_mpm/services/memory/optimizer.py +1 -1
- claude_mpm/services/model/model_router.py +8 -9
- claude_mpm/services/monitor/daemon.py +1 -1
- claude_mpm/services/monitor/server.py +2 -2
- claude_mpm/services/native_agent_converter.py +356 -0
- claude_mpm/services/port_manager.py +1 -1
- claude_mpm/services/pr/__init__.py +14 -0
- claude_mpm/services/pr/pr_template_service.py +329 -0
- claude_mpm/services/project/documentation_manager.py +2 -1
- claude_mpm/services/project/toolchain_analyzer.py +3 -1
- claude_mpm/services/runner_configuration_service.py +1 -0
- claude_mpm/services/self_upgrade_service.py +165 -7
- 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/skills_config.py +547 -0
- claude_mpm/services/skills_deployer.py +955 -0
- claude_mpm/services/socketio/handlers/connection.py +1 -1
- claude_mpm/services/socketio/handlers/git.py +2 -2
- claude_mpm/services/socketio/server/core.py +1 -4
- claude_mpm/services/socketio/server/main.py +1 -3
- claude_mpm/services/system_instructions_service.py +1 -3
- claude_mpm/services/unified/analyzer_strategies/performance_analyzer.py +0 -3
- claude_mpm/services/unified/analyzer_strategies/security_analyzer.py +0 -1
- claude_mpm/services/unified/deployment_strategies/cloud_strategies.py +1 -1
- claude_mpm/services/unified/deployment_strategies/vercel.py +1 -5
- claude_mpm/services/unified/unified_deployment.py +1 -5
- claude_mpm/services/version_control/conflict_resolution.py +6 -4
- claude_mpm/services/visualization/__init__.py +1 -5
- claude_mpm/services/visualization/mermaid_generator.py +2 -3
- claude_mpm/skills/bundled/infrastructure/env-manager/scripts/validate_env.py +576 -0
- claude_mpm/skills/bundled/performance-profiling.md +6 -0
- claude_mpm/skills/bundled/testing/webapp-testing/scripts/with_server.py +2 -2
- claude_mpm/skills/skills_registry.py +0 -1
- claude_mpm/templates/questions/__init__.py +38 -0
- claude_mpm/templates/questions/base.py +193 -0
- claude_mpm/templates/questions/pr_strategy.py +311 -0
- claude_mpm/templates/questions/project_init.py +385 -0
- claude_mpm/templates/questions/ticket_mgmt.py +394 -0
- claude_mpm/tools/__main__.py +8 -8
- claude_mpm/tools/code_tree_analyzer/__init__.py +45 -0
- claude_mpm/tools/code_tree_analyzer/analysis.py +299 -0
- claude_mpm/tools/code_tree_analyzer/cache.py +131 -0
- claude_mpm/tools/code_tree_analyzer/core.py +380 -0
- claude_mpm/tools/code_tree_analyzer/discovery.py +403 -0
- claude_mpm/tools/code_tree_analyzer/events.py +168 -0
- claude_mpm/tools/code_tree_analyzer/gitignore.py +308 -0
- claude_mpm/tools/code_tree_analyzer/models.py +39 -0
- claude_mpm/tools/code_tree_analyzer/multilang_analyzer.py +224 -0
- claude_mpm/tools/code_tree_analyzer/python_analyzer.py +284 -0
- claude_mpm/utils/agent_dependency_loader.py +80 -13
- claude_mpm/utils/dependency_cache.py +3 -1
- claude_mpm/utils/gitignore.py +241 -0
- claude_mpm/utils/log_cleanup.py +3 -3
- claude_mpm/utils/progress.py +383 -0
- claude_mpm/utils/robust_installer.py +3 -5
- claude_mpm/utils/structured_questions.py +619 -0
- {claude_mpm-4.21.0.dist-info → claude_mpm-5.0.2.dist-info}/METADATA +429 -59
- {claude_mpm-4.21.0.dist-info → claude_mpm-5.0.2.dist-info}/RECORD +264 -427
- claude_mpm/agents/templates/.claude-mpm/memories/README.md +0 -17
- claude_mpm/agents/templates/.claude-mpm/memories/engineer_memories.md +0 -3
- 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 -180
- 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 -211
- 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/local_ops_agent.json +0 -1840
- claude_mpm/agents/templates/logs/prompts/agent_engineer_20250826_014258_728.md +0 -39
- claude_mpm/agents/templates/logs/prompts/agent_engineer_20250901_010124_142.md +0 -400
- 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 -140
- 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 -242
- claude_mpm/agents/templates/react_engineer.json +0 -238
- claude_mpm/agents/templates/refactoring_engineer.json +0 -276
- claude_mpm/agents/templates/research.json +0 -188
- 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/ticketing.json +0 -177
- 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 -157
- claude_mpm/agents/templates/web_qa.json +0 -399
- claude_mpm/agents/templates/web_ui.json +0 -189
- claude_mpm/commands/mpm-tickets.md +0 -102
- claude_mpm/dashboard/.claude-mpm/socketio-instances.json +0 -1
- claude_mpm/dashboard/react/components/DataInspector/DataInspector.module.css +0 -188
- claude_mpm/dashboard/react/components/EventViewer/EventViewer.module.css +0 -156
- claude_mpm/dashboard/react/components/shared/ConnectionStatus.module.css +0 -38
- claude_mpm/dashboard/react/components/shared/FilterBar.module.css +0 -92
- claude_mpm/dashboard/static/archive/activity_dashboard_fixed.html +0 -248
- claude_mpm/dashboard/static/archive/activity_dashboard_test.html +0 -61
- claude_mpm/dashboard/static/archive/test_activity_connection.html +0 -179
- claude_mpm/dashboard/static/archive/test_claude_tree_tab.html +0 -68
- claude_mpm/dashboard/static/archive/test_dashboard.html +0 -409
- claude_mpm/dashboard/static/archive/test_dashboard_fixed.html +0 -519
- claude_mpm/dashboard/static/archive/test_dashboard_verification.html +0 -181
- claude_mpm/dashboard/static/archive/test_file_data.html +0 -315
- claude_mpm/dashboard/static/archive/test_file_tree_empty_state.html +0 -243
- claude_mpm/dashboard/static/archive/test_file_tree_fix.html +0 -234
- claude_mpm/dashboard/static/archive/test_file_tree_rename.html +0 -117
- claude_mpm/dashboard/static/archive/test_file_tree_tab.html +0 -115
- claude_mpm/dashboard/static/archive/test_file_viewer.html +0 -224
- claude_mpm/dashboard/static/archive/test_final_activity.html +0 -220
- claude_mpm/dashboard/static/archive/test_tab_fix.html +0 -139
- 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/agent-hierarchy.js +0 -777
- claude_mpm/dashboard/static/built/components/agent-inference.js +0 -2
- 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-viewer.js +0 -2
- 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-viewer.js +0 -2
- claude_mpm/dashboard/static/built/components/export-manager.js +0 -2
- 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-viewer.js +0 -2
- claude_mpm/dashboard/static/built/components/hud-library-loader.js +0 -2
- claude_mpm/dashboard/static/built/components/hud-manager.js +0 -2
- claude_mpm/dashboard/static/built/components/hud-visualizer.js +0 -2
- claude_mpm/dashboard/static/built/components/module-viewer.js +0 -2
- 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/socket-manager.js +0 -2
- claude_mpm/dashboard/static/built/components/ui-state-manager.js +0 -2
- claude_mpm/dashboard/static/built/components/unified-data-viewer.js +0 -2
- claude_mpm/dashboard/static/built/components/working-directory.js +0 -2
- claude_mpm/dashboard/static/built/connection-manager.js +0 -536
- claude_mpm/dashboard/static/built/dashboard.js +0 -2
- 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/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/tab-isolation-fix.js +0 -185
- claude_mpm/dashboard/static/dist/assets/events.DjpNxWNo.css +0 -1
- claude_mpm/dashboard/static/dist/components/activity-tree.js +0 -2
- claude_mpm/dashboard/static/dist/components/agent-inference.js +0 -2
- claude_mpm/dashboard/static/dist/components/code-tree.js +0 -2
- claude_mpm/dashboard/static/dist/components/code-viewer.js +0 -2
- claude_mpm/dashboard/static/dist/components/event-processor.js +0 -2
- claude_mpm/dashboard/static/dist/components/event-viewer.js +0 -2
- claude_mpm/dashboard/static/dist/components/export-manager.js +0 -2
- claude_mpm/dashboard/static/dist/components/file-tool-tracker.js +0 -2
- claude_mpm/dashboard/static/dist/components/file-viewer.js +0 -2
- claude_mpm/dashboard/static/dist/components/hud-library-loader.js +0 -2
- claude_mpm/dashboard/static/dist/components/hud-manager.js +0 -2
- claude_mpm/dashboard/static/dist/components/hud-visualizer.js +0 -2
- claude_mpm/dashboard/static/dist/components/module-viewer.js +0 -2
- claude_mpm/dashboard/static/dist/components/session-manager.js +0 -2
- claude_mpm/dashboard/static/dist/components/socket-manager.js +0 -2
- claude_mpm/dashboard/static/dist/components/ui-state-manager.js +0 -2
- claude_mpm/dashboard/static/dist/components/unified-data-viewer.js +0 -2
- claude_mpm/dashboard/static/dist/components/working-directory.js +0 -2
- claude_mpm/dashboard/static/dist/dashboard.js +0 -2
- claude_mpm/dashboard/static/dist/react/events.js +0 -30
- claude_mpm/dashboard/static/dist/socket-client.js +0 -2
- claude_mpm/dashboard/static/events.html +0 -607
- claude_mpm/dashboard/static/index.html +0 -635
- 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/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/static/test-archive/test_debug.html +0 -25
- 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/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/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/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/main/artifacts-builder/SKILL.md +0 -86
- 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/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/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/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/testing/condition-based-waiting/SKILL.md +0 -119
- 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/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/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/tools/code_tree_analyzer.py +0 -1825
- /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/{response_format.md → response-format.md} +0 -0
- /claude_mpm/agents/templates/{validation_templates.md → validation-templates.md} +0 -0
- {claude_mpm-4.21.0.dist-info → claude_mpm-5.0.2.dist-info}/WHEEL +0 -0
- {claude_mpm-4.21.0.dist-info → claude_mpm-5.0.2.dist-info}/entry_points.txt +0 -0
- {claude_mpm-4.21.0.dist-info → claude_mpm-5.0.2.dist-info}/licenses/LICENSE +0 -0
- {claude_mpm-4.21.0.dist-info → claude_mpm-5.0.2.dist-info}/top_level.txt +0 -0
|
@@ -29,10 +29,7 @@ USAGE:
|
|
|
29
29
|
from abc import ABC, abstractmethod
|
|
30
30
|
from typing import List
|
|
31
31
|
|
|
32
|
-
from claude_mpm.services.core.models.health import
|
|
33
|
-
DeploymentHealth,
|
|
34
|
-
HealthCheckResult,
|
|
35
|
-
)
|
|
32
|
+
from claude_mpm.services.core.models.health import DeploymentHealth, HealthCheckResult
|
|
36
33
|
|
|
37
34
|
|
|
38
35
|
class IHealthCheck(ABC):
|
|
@@ -27,17 +27,8 @@ from .process import (
|
|
|
27
27
|
StartConfig,
|
|
28
28
|
is_port_protected,
|
|
29
29
|
)
|
|
30
|
-
from .restart import
|
|
31
|
-
|
|
32
|
-
RestartAttempt,
|
|
33
|
-
RestartConfig,
|
|
34
|
-
RestartHistory,
|
|
35
|
-
)
|
|
36
|
-
from .stability import (
|
|
37
|
-
LogPatternMatch,
|
|
38
|
-
MemoryTrend,
|
|
39
|
-
ResourceUsage,
|
|
40
|
-
)
|
|
30
|
+
from .restart import CircuitBreakerState, RestartAttempt, RestartConfig, RestartHistory
|
|
31
|
+
from .stability import LogPatternMatch, MemoryTrend, ResourceUsage
|
|
41
32
|
from .toolchain import (
|
|
42
33
|
ConfidenceLevel,
|
|
43
34
|
DeploymentTarget,
|
|
@@ -6,6 +6,7 @@ diagnostic components.
|
|
|
6
6
|
"""
|
|
7
7
|
|
|
8
8
|
from .agent_check import AgentCheck
|
|
9
|
+
from .agent_sources_check import AgentSourcesCheck
|
|
9
10
|
from .base_check import BaseDiagnosticCheck
|
|
10
11
|
from .claude_code_check import ClaudeCodeCheck
|
|
11
12
|
from .common_issues_check import CommonIssuesCheck
|
|
@@ -16,10 +17,12 @@ from .instructions_check import InstructionsCheck
|
|
|
16
17
|
from .mcp_check import MCPCheck
|
|
17
18
|
from .mcp_services_check import MCPServicesCheck
|
|
18
19
|
from .monitor_check import MonitorCheck
|
|
20
|
+
from .skill_sources_check import SkillSourcesCheck
|
|
19
21
|
from .startup_log_check import StartupLogCheck
|
|
20
22
|
|
|
21
23
|
__all__ = [
|
|
22
24
|
"AgentCheck",
|
|
25
|
+
"AgentSourcesCheck",
|
|
23
26
|
"BaseDiagnosticCheck",
|
|
24
27
|
"ClaudeCodeCheck",
|
|
25
28
|
"CommonIssuesCheck",
|
|
@@ -30,5 +33,6 @@ __all__ = [
|
|
|
30
33
|
"MCPCheck",
|
|
31
34
|
"MCPServicesCheck",
|
|
32
35
|
"MonitorCheck",
|
|
36
|
+
"SkillSourcesCheck",
|
|
33
37
|
"StartupLogCheck",
|
|
34
38
|
]
|
|
@@ -188,7 +188,6 @@ class AgentCheck(BaseDiagnosticCheck):
|
|
|
188
188
|
def _check_agent_versions(self) -> DiagnosticResult:
|
|
189
189
|
"""Check if deployed agents are up-to-date."""
|
|
190
190
|
try:
|
|
191
|
-
|
|
192
191
|
from ....services.agents.deployment.agent_version_manager import (
|
|
193
192
|
AgentVersionManager,
|
|
194
193
|
)
|
|
@@ -258,7 +257,6 @@ class AgentCheck(BaseDiagnosticCheck):
|
|
|
258
257
|
def _validate_agents(self) -> DiagnosticResult:
|
|
259
258
|
"""Validate agent configurations."""
|
|
260
259
|
try:
|
|
261
|
-
|
|
262
260
|
from ....services.agents.deployment.agent_validator import AgentValidator
|
|
263
261
|
|
|
264
262
|
AgentValidator()
|
|
@@ -0,0 +1,577 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Check agent sources configuration and health.
|
|
3
|
+
|
|
4
|
+
WHY: Verify that the single-tier Git-based agent system is properly configured,
|
|
5
|
+
sources are accessible, and agents are discoverable from configured repositories.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
import logging
|
|
9
|
+
from pathlib import Path
|
|
10
|
+
from typing import Dict, List, Optional
|
|
11
|
+
|
|
12
|
+
from ....core.enums import OperationResult, ValidationSeverity
|
|
13
|
+
from ..models import DiagnosticResult
|
|
14
|
+
from .base_check import BaseDiagnosticCheck
|
|
15
|
+
|
|
16
|
+
logger = logging.getLogger(__name__)
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class AgentSourcesCheck(BaseDiagnosticCheck):
|
|
20
|
+
"""Check agent sources configuration and health.
|
|
21
|
+
|
|
22
|
+
Verifies:
|
|
23
|
+
- Configuration file exists and is valid YAML
|
|
24
|
+
- At least one source is configured
|
|
25
|
+
- Enabled sources are accessible (HTTP 200)
|
|
26
|
+
- Cache directory is healthy and writable
|
|
27
|
+
- Priority conflicts are identified
|
|
28
|
+
- Agents can be discovered from sources
|
|
29
|
+
|
|
30
|
+
WHY: The single-tier system relies on Git sources being properly configured
|
|
31
|
+
and accessible. This check ensures the agent deployment pipeline is healthy.
|
|
32
|
+
"""
|
|
33
|
+
|
|
34
|
+
@property
|
|
35
|
+
def name(self) -> str:
|
|
36
|
+
return "agent_sources_check"
|
|
37
|
+
|
|
38
|
+
@property
|
|
39
|
+
def category(self) -> str:
|
|
40
|
+
return "Agent Sources"
|
|
41
|
+
|
|
42
|
+
def should_run(self) -> bool:
|
|
43
|
+
"""Check should run if single-tier system is in use.
|
|
44
|
+
|
|
45
|
+
Returns:
|
|
46
|
+
True if agent sources configuration exists or could exist
|
|
47
|
+
"""
|
|
48
|
+
# Always run - we want to check if configuration should be created
|
|
49
|
+
return True
|
|
50
|
+
|
|
51
|
+
def run(self) -> DiagnosticResult:
|
|
52
|
+
"""Run agent sources diagnostics."""
|
|
53
|
+
try:
|
|
54
|
+
sub_results = []
|
|
55
|
+
details = {}
|
|
56
|
+
|
|
57
|
+
# Check 1: Configuration file exists
|
|
58
|
+
config_result = self._check_config_file()
|
|
59
|
+
sub_results.append(config_result)
|
|
60
|
+
details["config_exists"] = config_result.status == OperationResult.SUCCESS
|
|
61
|
+
|
|
62
|
+
# If no config file, return early with guidance
|
|
63
|
+
if config_result.status == ValidationSeverity.ERROR:
|
|
64
|
+
return DiagnosticResult(
|
|
65
|
+
category=self.category,
|
|
66
|
+
status=ValidationSeverity.ERROR,
|
|
67
|
+
message="Agent sources not configured",
|
|
68
|
+
details=details,
|
|
69
|
+
fix_command="claude-mpm agent-source add https://github.com/bobmatnyc/claude-mpm-agents",
|
|
70
|
+
fix_description="Add default system repository",
|
|
71
|
+
sub_results=sub_results if self.verbose else [],
|
|
72
|
+
)
|
|
73
|
+
|
|
74
|
+
# Check 2: Configuration is valid YAML
|
|
75
|
+
config_valid_result = self._check_config_valid()
|
|
76
|
+
sub_results.append(config_valid_result)
|
|
77
|
+
if config_valid_result.status == ValidationSeverity.ERROR:
|
|
78
|
+
return DiagnosticResult(
|
|
79
|
+
category=self.category,
|
|
80
|
+
status=ValidationSeverity.ERROR,
|
|
81
|
+
message="Invalid configuration file",
|
|
82
|
+
details=details,
|
|
83
|
+
fix_command="claude-mpm config validate",
|
|
84
|
+
fix_description="Validate and fix configuration",
|
|
85
|
+
sub_results=sub_results if self.verbose else [],
|
|
86
|
+
)
|
|
87
|
+
|
|
88
|
+
# Load configuration for remaining checks
|
|
89
|
+
from ....config.agent_sources import AgentSourceConfiguration
|
|
90
|
+
|
|
91
|
+
config = AgentSourceConfiguration.load()
|
|
92
|
+
|
|
93
|
+
# Check 3: At least one source configured
|
|
94
|
+
sources_result = self._check_sources_configured(config)
|
|
95
|
+
sub_results.append(sources_result)
|
|
96
|
+
details["total_sources"] = len(config.repositories) + (
|
|
97
|
+
0 if config.disable_system_repo else 1
|
|
98
|
+
)
|
|
99
|
+
details["enabled_sources"] = len(config.get_enabled_repositories())
|
|
100
|
+
|
|
101
|
+
# Check 4: System repository accessible (if enabled)
|
|
102
|
+
system_repo_result = self._check_system_repo_accessible(config)
|
|
103
|
+
if system_repo_result:
|
|
104
|
+
sub_results.append(system_repo_result)
|
|
105
|
+
|
|
106
|
+
# Check 5: Enabled sources reachable
|
|
107
|
+
reachability_result = self._check_sources_reachable(config)
|
|
108
|
+
sub_results.append(reachability_result)
|
|
109
|
+
details["reachable_sources"] = reachability_result.details.get(
|
|
110
|
+
"reachable_count", 0
|
|
111
|
+
)
|
|
112
|
+
details["unreachable_sources"] = reachability_result.details.get(
|
|
113
|
+
"unreachable_count", 0
|
|
114
|
+
)
|
|
115
|
+
|
|
116
|
+
# Check 6: Cache directory healthy
|
|
117
|
+
cache_result = self._check_cache_directory()
|
|
118
|
+
sub_results.append(cache_result)
|
|
119
|
+
details["cache_healthy"] = cache_result.status == OperationResult.SUCCESS
|
|
120
|
+
|
|
121
|
+
# Check 7: Priority conflicts
|
|
122
|
+
priority_result = self._check_priority_conflicts(config)
|
|
123
|
+
if priority_result:
|
|
124
|
+
sub_results.append(priority_result)
|
|
125
|
+
details["priority_conflicts"] = priority_result.details.get(
|
|
126
|
+
"conflict_count", 0
|
|
127
|
+
)
|
|
128
|
+
|
|
129
|
+
# Check 8: Agents discovered
|
|
130
|
+
discovery_result = self._check_agents_discovered(config)
|
|
131
|
+
sub_results.append(discovery_result)
|
|
132
|
+
details["agents_discovered"] = discovery_result.details.get(
|
|
133
|
+
"total_agents", 0
|
|
134
|
+
)
|
|
135
|
+
|
|
136
|
+
# Determine overall status
|
|
137
|
+
error_results = [
|
|
138
|
+
r for r in sub_results if r.status == ValidationSeverity.ERROR
|
|
139
|
+
]
|
|
140
|
+
warning_results = [
|
|
141
|
+
r for r in sub_results if r.status == ValidationSeverity.WARNING
|
|
142
|
+
]
|
|
143
|
+
|
|
144
|
+
if error_results:
|
|
145
|
+
status = ValidationSeverity.ERROR
|
|
146
|
+
message = f"Agent sources have {len(error_results)} critical issue(s)"
|
|
147
|
+
fix_command = None
|
|
148
|
+
fix_description = None
|
|
149
|
+
elif warning_results:
|
|
150
|
+
status = ValidationSeverity.WARNING
|
|
151
|
+
message = f"Agent sources have {len(warning_results)} minor issue(s)"
|
|
152
|
+
fix_command = "claude-mpm agent-source update"
|
|
153
|
+
fix_description = "Update all sources to refresh cache"
|
|
154
|
+
else:
|
|
155
|
+
status = OperationResult.SUCCESS
|
|
156
|
+
enabled_count = details["enabled_sources"]
|
|
157
|
+
agents_count = details["agents_discovered"]
|
|
158
|
+
message = f"All checks passed ({enabled_count} source(s), {agents_count} agent(s))"
|
|
159
|
+
fix_command = None
|
|
160
|
+
fix_description = None
|
|
161
|
+
|
|
162
|
+
return DiagnosticResult(
|
|
163
|
+
category=self.category,
|
|
164
|
+
status=status,
|
|
165
|
+
message=message,
|
|
166
|
+
details=details,
|
|
167
|
+
fix_command=fix_command,
|
|
168
|
+
fix_description=fix_description,
|
|
169
|
+
sub_results=sub_results if self.verbose else [],
|
|
170
|
+
)
|
|
171
|
+
|
|
172
|
+
except Exception as e:
|
|
173
|
+
logger.exception("Agent sources check failed")
|
|
174
|
+
return DiagnosticResult(
|
|
175
|
+
category=self.category,
|
|
176
|
+
status=ValidationSeverity.ERROR,
|
|
177
|
+
message=f"Agent sources check failed: {e!s}",
|
|
178
|
+
details={"error": str(e)},
|
|
179
|
+
)
|
|
180
|
+
|
|
181
|
+
def _check_config_file(self) -> DiagnosticResult:
|
|
182
|
+
"""Check if configuration file exists."""
|
|
183
|
+
config_path = Path.home() / ".claude-mpm" / "config" / "agent_sources.yaml"
|
|
184
|
+
|
|
185
|
+
if not config_path.exists():
|
|
186
|
+
return DiagnosticResult(
|
|
187
|
+
category="Configuration File",
|
|
188
|
+
status=ValidationSeverity.ERROR,
|
|
189
|
+
message=f"Configuration file not found: {config_path}",
|
|
190
|
+
details={"path": str(config_path)},
|
|
191
|
+
fix_command="claude-mpm agent-source add https://github.com/bobmatnyc/claude-mpm-agents",
|
|
192
|
+
fix_description="Create configuration and add default repository",
|
|
193
|
+
)
|
|
194
|
+
|
|
195
|
+
return DiagnosticResult(
|
|
196
|
+
category="Configuration File",
|
|
197
|
+
status=OperationResult.SUCCESS,
|
|
198
|
+
message=f"Found at {config_path}",
|
|
199
|
+
details={"path": str(config_path)},
|
|
200
|
+
)
|
|
201
|
+
|
|
202
|
+
def _check_config_valid(self) -> DiagnosticResult:
|
|
203
|
+
"""Check if configuration is valid YAML."""
|
|
204
|
+
config_path = Path.home() / ".claude-mpm" / "config" / "agent_sources.yaml"
|
|
205
|
+
|
|
206
|
+
try:
|
|
207
|
+
import yaml
|
|
208
|
+
|
|
209
|
+
with open(config_path) as f:
|
|
210
|
+
data = yaml.safe_load(f)
|
|
211
|
+
|
|
212
|
+
if not data:
|
|
213
|
+
return DiagnosticResult(
|
|
214
|
+
category="Configuration Validity",
|
|
215
|
+
status=ValidationSeverity.WARNING,
|
|
216
|
+
message="Configuration file is empty",
|
|
217
|
+
details={"path": str(config_path)},
|
|
218
|
+
)
|
|
219
|
+
|
|
220
|
+
# Basic structure validation
|
|
221
|
+
if not isinstance(data, dict):
|
|
222
|
+
return DiagnosticResult(
|
|
223
|
+
category="Configuration Validity",
|
|
224
|
+
status=ValidationSeverity.ERROR,
|
|
225
|
+
message="Configuration must be YAML dictionary",
|
|
226
|
+
details={"path": str(config_path), "type": str(type(data))},
|
|
227
|
+
)
|
|
228
|
+
|
|
229
|
+
return DiagnosticResult(
|
|
230
|
+
category="Configuration Validity",
|
|
231
|
+
status=OperationResult.SUCCESS,
|
|
232
|
+
message="Configuration is valid YAML",
|
|
233
|
+
details={"path": str(config_path)},
|
|
234
|
+
)
|
|
235
|
+
|
|
236
|
+
except yaml.YAMLError as e:
|
|
237
|
+
return DiagnosticResult(
|
|
238
|
+
category="Configuration Validity",
|
|
239
|
+
status=ValidationSeverity.ERROR,
|
|
240
|
+
message=f"Invalid YAML: {e!s}",
|
|
241
|
+
details={"path": str(config_path), "error": str(e)},
|
|
242
|
+
fix_command=f"cat {config_path}",
|
|
243
|
+
fix_description="Check YAML syntax errors",
|
|
244
|
+
)
|
|
245
|
+
except Exception as e:
|
|
246
|
+
return DiagnosticResult(
|
|
247
|
+
category="Configuration Validity",
|
|
248
|
+
status=ValidationSeverity.ERROR,
|
|
249
|
+
message=f"Failed to read configuration: {e!s}",
|
|
250
|
+
details={"path": str(config_path), "error": str(e)},
|
|
251
|
+
)
|
|
252
|
+
|
|
253
|
+
def _check_sources_configured(self, config) -> DiagnosticResult:
|
|
254
|
+
"""Check if at least one source is configured.
|
|
255
|
+
|
|
256
|
+
Args:
|
|
257
|
+
config: AgentSourceConfiguration instance
|
|
258
|
+
"""
|
|
259
|
+
total_sources = len(config.repositories)
|
|
260
|
+
if not config.disable_system_repo:
|
|
261
|
+
total_sources += 1 # Count system repo
|
|
262
|
+
|
|
263
|
+
if total_sources == 0:
|
|
264
|
+
return DiagnosticResult(
|
|
265
|
+
category="Sources Configured",
|
|
266
|
+
status=ValidationSeverity.WARNING,
|
|
267
|
+
message="No agent sources configured",
|
|
268
|
+
details={"total": 0, "enabled": 0},
|
|
269
|
+
fix_command="claude-mpm agent-source add https://github.com/bobmatnyc/claude-mpm-agents",
|
|
270
|
+
fix_description="Add default agent repository",
|
|
271
|
+
)
|
|
272
|
+
|
|
273
|
+
enabled_sources = len(config.get_enabled_repositories())
|
|
274
|
+
|
|
275
|
+
if enabled_sources == 0:
|
|
276
|
+
return DiagnosticResult(
|
|
277
|
+
category="Sources Configured",
|
|
278
|
+
status=ValidationSeverity.WARNING,
|
|
279
|
+
message=f"{total_sources} source(s) configured but all disabled",
|
|
280
|
+
details={"total": total_sources, "enabled": 0},
|
|
281
|
+
fix_command="claude-mpm source enable <source-id>",
|
|
282
|
+
fix_description="Enable at least one source",
|
|
283
|
+
)
|
|
284
|
+
|
|
285
|
+
return DiagnosticResult(
|
|
286
|
+
category="Sources Configured",
|
|
287
|
+
status=OperationResult.SUCCESS,
|
|
288
|
+
message=f"{enabled_sources} enabled source(s) ({total_sources} total)",
|
|
289
|
+
details={"total": total_sources, "enabled": enabled_sources},
|
|
290
|
+
)
|
|
291
|
+
|
|
292
|
+
def _check_system_repo_accessible(self, config) -> Optional[DiagnosticResult]:
|
|
293
|
+
"""Check if system repository is accessible.
|
|
294
|
+
|
|
295
|
+
Args:
|
|
296
|
+
config: AgentSourceConfiguration instance
|
|
297
|
+
"""
|
|
298
|
+
system_repo = config.get_system_repo()
|
|
299
|
+
|
|
300
|
+
if not system_repo:
|
|
301
|
+
# System repo disabled, skip check
|
|
302
|
+
return None
|
|
303
|
+
|
|
304
|
+
return self._check_repo_accessible(
|
|
305
|
+
system_repo.url, "System Repository", is_system=True
|
|
306
|
+
)
|
|
307
|
+
|
|
308
|
+
def _check_sources_reachable(self, config) -> DiagnosticResult:
|
|
309
|
+
"""Check if enabled sources are reachable.
|
|
310
|
+
|
|
311
|
+
Args:
|
|
312
|
+
config: AgentSourceConfiguration instance
|
|
313
|
+
"""
|
|
314
|
+
repos = config.get_enabled_repositories()
|
|
315
|
+
|
|
316
|
+
if not repos:
|
|
317
|
+
return DiagnosticResult(
|
|
318
|
+
category="Source Reachability",
|
|
319
|
+
status=OperationResult.SKIPPED,
|
|
320
|
+
message="No enabled sources to check",
|
|
321
|
+
details={"reachable_count": 0, "unreachable_count": 0},
|
|
322
|
+
)
|
|
323
|
+
|
|
324
|
+
reachable = []
|
|
325
|
+
unreachable = []
|
|
326
|
+
details: Dict[str, str] = {}
|
|
327
|
+
|
|
328
|
+
for repo in repos:
|
|
329
|
+
result = self._check_repo_accessible(repo.url, repo.identifier)
|
|
330
|
+
if result.status == OperationResult.SUCCESS:
|
|
331
|
+
reachable.append(repo.identifier)
|
|
332
|
+
details[repo.identifier] = "reachable"
|
|
333
|
+
else:
|
|
334
|
+
unreachable.append(repo.identifier)
|
|
335
|
+
details[repo.identifier] = result.message
|
|
336
|
+
|
|
337
|
+
if len(unreachable) == len(repos):
|
|
338
|
+
# All sources unreachable
|
|
339
|
+
return DiagnosticResult(
|
|
340
|
+
category="Source Reachability",
|
|
341
|
+
status=ValidationSeverity.ERROR,
|
|
342
|
+
message=f"All {len(repos)} source(s) unreachable",
|
|
343
|
+
details={
|
|
344
|
+
"reachable_count": 0,
|
|
345
|
+
"unreachable_count": len(unreachable),
|
|
346
|
+
"sources": details,
|
|
347
|
+
},
|
|
348
|
+
fix_command="claude-mpm agent-source list",
|
|
349
|
+
fix_description="Check source URLs and network connectivity",
|
|
350
|
+
)
|
|
351
|
+
if unreachable:
|
|
352
|
+
# Some sources unreachable
|
|
353
|
+
return DiagnosticResult(
|
|
354
|
+
category="Source Reachability",
|
|
355
|
+
status=ValidationSeverity.WARNING,
|
|
356
|
+
message=f"{len(unreachable)}/{len(repos)} source(s) unreachable",
|
|
357
|
+
details={
|
|
358
|
+
"reachable_count": len(reachable),
|
|
359
|
+
"unreachable_count": len(unreachable),
|
|
360
|
+
"sources": details,
|
|
361
|
+
"unreachable_sources": unreachable,
|
|
362
|
+
},
|
|
363
|
+
)
|
|
364
|
+
# All sources reachable
|
|
365
|
+
return DiagnosticResult(
|
|
366
|
+
category="Source Reachability",
|
|
367
|
+
status=OperationResult.SUCCESS,
|
|
368
|
+
message=f"All {len(repos)} source(s) reachable",
|
|
369
|
+
details={
|
|
370
|
+
"reachable_count": len(reachable),
|
|
371
|
+
"unreachable_count": 0,
|
|
372
|
+
"sources": details,
|
|
373
|
+
},
|
|
374
|
+
)
|
|
375
|
+
|
|
376
|
+
def _check_repo_accessible(
|
|
377
|
+
self, url: str, identifier: str, is_system: bool = False
|
|
378
|
+
) -> DiagnosticResult:
|
|
379
|
+
"""Check if a repository is accessible via HTTP."""
|
|
380
|
+
try:
|
|
381
|
+
import urllib.request
|
|
382
|
+
from urllib.error import HTTPError, URLError
|
|
383
|
+
|
|
384
|
+
# Convert git URL to HTTPS if needed
|
|
385
|
+
if url.startswith("git@github.com:"):
|
|
386
|
+
url = url.replace("git@github.com:", "https://github.com/")
|
|
387
|
+
if url.endswith(".git"):
|
|
388
|
+
url = url[:-4]
|
|
389
|
+
|
|
390
|
+
# Try to fetch repository (use HEAD request to be lightweight)
|
|
391
|
+
req = urllib.request.Request(url, method="HEAD")
|
|
392
|
+
req.add_header("User-Agent", "claude-mpm-doctor/1.0")
|
|
393
|
+
|
|
394
|
+
with urllib.request.urlopen(req, timeout=5) as response:
|
|
395
|
+
status = response.status
|
|
396
|
+
|
|
397
|
+
if status == 200:
|
|
398
|
+
return DiagnosticResult(
|
|
399
|
+
category=identifier,
|
|
400
|
+
status=OperationResult.SUCCESS,
|
|
401
|
+
message="Accessible",
|
|
402
|
+
details={"url": url, "status": status},
|
|
403
|
+
)
|
|
404
|
+
return DiagnosticResult(
|
|
405
|
+
category=identifier,
|
|
406
|
+
status=ValidationSeverity.WARNING,
|
|
407
|
+
message=f"HTTP {status}",
|
|
408
|
+
details={"url": url, "status": status},
|
|
409
|
+
)
|
|
410
|
+
|
|
411
|
+
except HTTPError as e:
|
|
412
|
+
return DiagnosticResult(
|
|
413
|
+
category=identifier,
|
|
414
|
+
status=ValidationSeverity.WARNING,
|
|
415
|
+
message=f"HTTP {e.code}",
|
|
416
|
+
details={"url": url, "status": e.code, "error": str(e)},
|
|
417
|
+
)
|
|
418
|
+
except URLError as e:
|
|
419
|
+
return DiagnosticResult(
|
|
420
|
+
category=identifier,
|
|
421
|
+
status=ValidationSeverity.WARNING,
|
|
422
|
+
message=f"Network error: {e.reason}",
|
|
423
|
+
details={"url": url, "error": str(e.reason)},
|
|
424
|
+
)
|
|
425
|
+
except Exception as e:
|
|
426
|
+
return DiagnosticResult(
|
|
427
|
+
category=identifier,
|
|
428
|
+
status=ValidationSeverity.WARNING,
|
|
429
|
+
message=f"Check failed: {e!s}",
|
|
430
|
+
details={"url": url, "error": str(e)},
|
|
431
|
+
)
|
|
432
|
+
|
|
433
|
+
def _check_cache_directory(self) -> DiagnosticResult:
|
|
434
|
+
"""Check cache directory health."""
|
|
435
|
+
cache_dir = Path.home() / ".claude-mpm" / "cache" / "remote-agents"
|
|
436
|
+
|
|
437
|
+
if not cache_dir.exists():
|
|
438
|
+
return DiagnosticResult(
|
|
439
|
+
category="Cache Directory",
|
|
440
|
+
status=ValidationSeverity.WARNING,
|
|
441
|
+
message=f"Cache directory does not exist: {cache_dir}",
|
|
442
|
+
details={"path": str(cache_dir), "exists": False},
|
|
443
|
+
fix_command="claude-mpm agent-source update",
|
|
444
|
+
fix_description="Create cache directory and update sources",
|
|
445
|
+
)
|
|
446
|
+
|
|
447
|
+
# Check if writable
|
|
448
|
+
if not cache_dir.is_dir():
|
|
449
|
+
return DiagnosticResult(
|
|
450
|
+
category="Cache Directory",
|
|
451
|
+
status=ValidationSeverity.ERROR,
|
|
452
|
+
message=f"Cache path exists but is not a directory: {cache_dir}",
|
|
453
|
+
details={"path": str(cache_dir), "is_dir": False},
|
|
454
|
+
)
|
|
455
|
+
|
|
456
|
+
# Test write access
|
|
457
|
+
try:
|
|
458
|
+
test_file = cache_dir / ".write_test"
|
|
459
|
+
test_file.touch()
|
|
460
|
+
test_file.unlink()
|
|
461
|
+
|
|
462
|
+
return DiagnosticResult(
|
|
463
|
+
category="Cache Directory",
|
|
464
|
+
status=OperationResult.SUCCESS,
|
|
465
|
+
message=f"Cache directory healthy: {cache_dir}",
|
|
466
|
+
details={"path": str(cache_dir), "writable": True},
|
|
467
|
+
)
|
|
468
|
+
|
|
469
|
+
except Exception as e:
|
|
470
|
+
return DiagnosticResult(
|
|
471
|
+
category="Cache Directory",
|
|
472
|
+
status=ValidationSeverity.ERROR,
|
|
473
|
+
message=f"Cache directory not writable: {e!s}",
|
|
474
|
+
details={"path": str(cache_dir), "writable": False, "error": str(e)},
|
|
475
|
+
fix_command=f"chmod -R u+w {cache_dir}",
|
|
476
|
+
fix_description="Fix cache directory permissions",
|
|
477
|
+
)
|
|
478
|
+
|
|
479
|
+
def _check_priority_conflicts(self, config) -> Optional[DiagnosticResult]:
|
|
480
|
+
"""Check for priority conflicts.
|
|
481
|
+
|
|
482
|
+
Args:
|
|
483
|
+
config: AgentSourceConfiguration instance
|
|
484
|
+
"""
|
|
485
|
+
repos = config.get_enabled_repositories()
|
|
486
|
+
|
|
487
|
+
if len(repos) < 2:
|
|
488
|
+
# No conflicts possible with 0-1 repos
|
|
489
|
+
return None
|
|
490
|
+
|
|
491
|
+
# Group repos by priority
|
|
492
|
+
priority_groups: Dict[int, List[str]] = {}
|
|
493
|
+
for repo in repos:
|
|
494
|
+
priority = repo.priority
|
|
495
|
+
if priority not in priority_groups:
|
|
496
|
+
priority_groups[priority] = []
|
|
497
|
+
priority_groups[priority].append(repo.identifier)
|
|
498
|
+
|
|
499
|
+
# Find conflicts (multiple repos with same priority)
|
|
500
|
+
conflicts = {p: ids for p, ids in priority_groups.items() if len(ids) > 1}
|
|
501
|
+
|
|
502
|
+
if not conflicts:
|
|
503
|
+
return DiagnosticResult(
|
|
504
|
+
category="Priority Conflicts",
|
|
505
|
+
status=OperationResult.SUCCESS,
|
|
506
|
+
message="No priority conflicts detected",
|
|
507
|
+
details={"conflict_count": 0},
|
|
508
|
+
)
|
|
509
|
+
|
|
510
|
+
conflict_details = []
|
|
511
|
+
for priority, identifiers in conflicts.items():
|
|
512
|
+
conflict_details.append(f"Priority {priority}: {', '.join(identifiers)}")
|
|
513
|
+
|
|
514
|
+
return DiagnosticResult(
|
|
515
|
+
category="Priority Conflicts",
|
|
516
|
+
status=ValidationSeverity.INFO,
|
|
517
|
+
message=f"{len(conflicts)} priority conflict(s) detected",
|
|
518
|
+
details={
|
|
519
|
+
"conflict_count": len(conflicts),
|
|
520
|
+
"conflicts": conflict_details,
|
|
521
|
+
},
|
|
522
|
+
fix_description="Consider assigning unique priorities to avoid ambiguous resolution",
|
|
523
|
+
)
|
|
524
|
+
|
|
525
|
+
def _check_agents_discovered(self, config) -> DiagnosticResult:
|
|
526
|
+
"""Check if agents can be discovered from sources.
|
|
527
|
+
|
|
528
|
+
Args:
|
|
529
|
+
config: AgentSourceConfiguration instance
|
|
530
|
+
"""
|
|
531
|
+
try:
|
|
532
|
+
from ....services.agents.single_tier_deployment_service import (
|
|
533
|
+
SingleTierDeploymentService,
|
|
534
|
+
)
|
|
535
|
+
|
|
536
|
+
deployment_dir = Path.home() / ".claude" / "agents"
|
|
537
|
+
service = SingleTierDeploymentService(
|
|
538
|
+
config=config, deployment_dir=deployment_dir
|
|
539
|
+
)
|
|
540
|
+
|
|
541
|
+
available_agents = service.list_available_agents()
|
|
542
|
+
|
|
543
|
+
if not available_agents:
|
|
544
|
+
return DiagnosticResult(
|
|
545
|
+
category="Agent Discovery",
|
|
546
|
+
status=ValidationSeverity.WARNING,
|
|
547
|
+
message="No agents discovered from configured sources",
|
|
548
|
+
details={"total_agents": 0, "agents_by_source": {}},
|
|
549
|
+
fix_command="claude-mpm agent-source update",
|
|
550
|
+
fix_description="Update sources to discover agents",
|
|
551
|
+
)
|
|
552
|
+
|
|
553
|
+
# Group agents by source
|
|
554
|
+
agents_by_source: Dict[str, int] = {}
|
|
555
|
+
for agent in available_agents:
|
|
556
|
+
source = agent.get("source", "unknown")
|
|
557
|
+
agents_by_source[source] = agents_by_source.get(source, 0) + 1
|
|
558
|
+
|
|
559
|
+
return DiagnosticResult(
|
|
560
|
+
category="Agent Discovery",
|
|
561
|
+
status=OperationResult.SUCCESS,
|
|
562
|
+
message=f"Discovered {len(available_agents)} agent(s)",
|
|
563
|
+
details={
|
|
564
|
+
"total_agents": len(available_agents),
|
|
565
|
+
"agents_by_source": agents_by_source,
|
|
566
|
+
"agent_names": [a.get("name", "unknown") for a in available_agents],
|
|
567
|
+
},
|
|
568
|
+
)
|
|
569
|
+
|
|
570
|
+
except Exception as e:
|
|
571
|
+
logger.exception("Failed to discover agents")
|
|
572
|
+
return DiagnosticResult(
|
|
573
|
+
category="Agent Discovery",
|
|
574
|
+
status=ValidationSeverity.WARNING,
|
|
575
|
+
message=f"Agent discovery failed: {e!s}",
|
|
576
|
+
details={"error": str(e)},
|
|
577
|
+
)
|
|
@@ -220,8 +220,7 @@ class InstructionsCheck(BaseDiagnosticCheck):
|
|
|
220
220
|
files_str = ", ".join(str(path) for path, _ in occurrences)
|
|
221
221
|
snippet = occurrences[0][1]
|
|
222
222
|
duplicates.append(
|
|
223
|
-
f"Duplicate content found in: {files_str}\n"
|
|
224
|
-
f" Snippet: {snippet}..."
|
|
223
|
+
f"Duplicate content found in: {files_str}\n Snippet: {snippet}..."
|
|
225
224
|
)
|
|
226
225
|
|
|
227
226
|
if duplicates:
|