claude-mpm 4.1.26__py3-none-any.whl → 5.0.9__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/BUILD_NUMBER +1 -1
- claude_mpm/VERSION +1 -1
- claude_mpm/__init__.py +20 -5
- claude_mpm/agents/BASE_AGENT_TEMPLATE.md +118 -0
- claude_mpm/agents/BASE_DOCUMENTATION.md +53 -0
- claude_mpm/agents/BASE_ENGINEER.md +658 -0
- claude_mpm/agents/BASE_OPS.md +219 -0
- claude_mpm/agents/BASE_PM.md +432 -158
- claude_mpm/agents/BASE_PROMPT_ENGINEER.md +787 -0
- claude_mpm/agents/BASE_QA.md +167 -0
- claude_mpm/agents/BASE_RESEARCH.md +53 -0
- claude_mpm/agents/OUTPUT_STYLE.md +254 -29
- claude_mpm/agents/PM_INSTRUCTIONS.md +969 -0
- claude_mpm/agents/PM_INSTRUCTIONS_TEACH.md +1322 -0
- claude_mpm/agents/WORKFLOW.md +355 -191
- claude_mpm/agents/__init__.py +6 -0
- claude_mpm/agents/agent_loader.py +41 -14
- claude_mpm/agents/agent_loader_integration.py +3 -2
- claude_mpm/agents/async_agent_loader.py +3 -3
- claude_mpm/agents/base_agent.json +6 -3
- claude_mpm/agents/base_agent_loader.py +21 -44
- claude_mpm/agents/frontmatter_validator.py +292 -252
- claude_mpm/agents/system_agent_config.py +3 -2
- claude_mpm/agents/templates/README.md +465 -0
- claude_mpm/agents/templates/circuit-breakers.md +1005 -0
- claude_mpm/agents/templates/context-management-examples.md +544 -0
- claude_mpm/agents/templates/git-file-tracking.md +584 -0
- claude_mpm/agents/templates/pm-examples.md +474 -0
- claude_mpm/agents/templates/pm-red-flags.md +310 -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/response-format.md +583 -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/agents/templates/validation-templates.md +312 -0
- claude_mpm/cli/__init__.py +72 -376
- claude_mpm/cli/commands/__init__.py +4 -0
- claude_mpm/cli/commands/agent_manager.py +675 -20
- claude_mpm/cli/commands/agent_source.py +774 -0
- claude_mpm/cli/commands/agent_state_manager.py +344 -0
- claude_mpm/cli/commands/agents.py +1673 -178
- claude_mpm/cli/commands/agents_cleanup.py +210 -0
- claude_mpm/cli/commands/agents_detect.py +380 -0
- claude_mpm/cli/commands/agents_discover.py +338 -0
- claude_mpm/cli/commands/agents_recommend.py +309 -0
- claude_mpm/cli/commands/aggregate.py +11 -7
- claude_mpm/cli/commands/analyze.py +18 -13
- claude_mpm/cli/commands/analyze_code.py +8 -4
- claude_mpm/cli/commands/auto_configure.py +566 -0
- claude_mpm/cli/commands/cleanup.py +12 -12
- claude_mpm/cli/commands/config.py +54 -17
- claude_mpm/cli/commands/configure.py +1184 -1055
- claude_mpm/cli/commands/configure_agent_display.py +261 -0
- claude_mpm/cli/commands/configure_behavior_manager.py +204 -0
- claude_mpm/cli/commands/configure_hook_manager.py +225 -0
- claude_mpm/cli/commands/configure_models.py +18 -0
- claude_mpm/cli/commands/configure_navigation.py +184 -0
- claude_mpm/cli/commands/configure_paths.py +104 -0
- claude_mpm/cli/commands/configure_persistence.py +254 -0
- claude_mpm/cli/commands/configure_startup_manager.py +646 -0
- claude_mpm/cli/commands/configure_template_editor.py +497 -0
- claude_mpm/cli/commands/configure_validators.py +73 -0
- claude_mpm/cli/commands/dashboard.py +50 -52
- claude_mpm/cli/commands/debug.py +19 -19
- claude_mpm/cli/commands/doctor.py +51 -7
- claude_mpm/cli/commands/hook_errors.py +277 -0
- claude_mpm/cli/commands/info.py +3 -4
- claude_mpm/cli/commands/local_deploy.py +534 -0
- claude_mpm/cli/commands/mcp.py +17 -10
- claude_mpm/cli/commands/mcp_command_router.py +11 -0
- claude_mpm/cli/commands/mcp_config.py +154 -0
- claude_mpm/cli/commands/mcp_external_commands.py +249 -0
- claude_mpm/cli/commands/mcp_install_commands.py +101 -32
- claude_mpm/cli/commands/mcp_pipx_config.py +2 -2
- claude_mpm/cli/commands/mcp_setup_external.py +868 -0
- claude_mpm/cli/commands/memory.py +55 -21
- claude_mpm/cli/commands/monitor.py +160 -70
- claude_mpm/cli/commands/mpm_init/__init__.py +73 -0
- claude_mpm/cli/commands/mpm_init/core.py +573 -0
- claude_mpm/cli/commands/mpm_init/display.py +341 -0
- claude_mpm/cli/commands/mpm_init/git_activity.py +427 -0
- claude_mpm/cli/commands/mpm_init/modes.py +397 -0
- claude_mpm/cli/commands/mpm_init/prompts.py +442 -0
- claude_mpm/cli/commands/mpm_init_cli.py +396 -0
- claude_mpm/cli/commands/mpm_init_handler.py +114 -4
- claude_mpm/cli/commands/postmortem.py +401 -0
- claude_mpm/cli/commands/run.py +252 -167
- claude_mpm/cli/commands/search.py +458 -0
- claude_mpm/cli/commands/skill_source.py +694 -0
- claude_mpm/cli/commands/skills.py +1225 -0
- claude_mpm/cli/commands/uninstall.py +176 -0
- claude_mpm/cli/commands/upgrade.py +152 -0
- claude_mpm/cli/commands/verify.py +119 -0
- claude_mpm/cli/executor.py +279 -0
- claude_mpm/cli/helpers.py +105 -0
- claude_mpm/cli/interactive/__init__.py +21 -0
- claude_mpm/cli/interactive/agent_wizard.py +1872 -0
- claude_mpm/cli/interactive/skills_wizard.py +491 -0
- claude_mpm/cli/parser.py +79 -2
- claude_mpm/cli/parsers/__init__.py +7 -1
- claude_mpm/cli/parsers/agent_manager_parser.py +161 -1
- claude_mpm/cli/parsers/agent_source_parser.py +171 -0
- claude_mpm/cli/parsers/agents_parser.py +369 -1
- claude_mpm/cli/parsers/auto_configure_parser.py +245 -0
- claude_mpm/cli/parsers/base_parser.py +196 -3
- claude_mpm/cli/parsers/config_parser.py +96 -43
- claude_mpm/cli/parsers/configure_parser.py +11 -15
- claude_mpm/cli/parsers/local_deploy_parser.py +227 -0
- claude_mpm/cli/parsers/mcp_parser.py +15 -0
- claude_mpm/cli/parsers/monitor_parser.py +12 -2
- claude_mpm/cli/parsers/mpm_init_parser.py +179 -9
- claude_mpm/cli/parsers/run_parser.py +5 -0
- claude_mpm/cli/parsers/search_parser.py +245 -0
- claude_mpm/cli/parsers/skill_source_parser.py +169 -0
- claude_mpm/cli/parsers/skills_parser.py +282 -0
- claude_mpm/cli/parsers/source_parser.py +138 -0
- claude_mpm/cli/shared/argument_patterns.py +20 -13
- claude_mpm/cli/shared/base_command.py +2 -2
- claude_mpm/cli/shared/output_formatters.py +28 -19
- claude_mpm/cli/startup.py +994 -0
- claude_mpm/cli/startup_display.py +480 -0
- claude_mpm/cli/startup_logging.py +179 -13
- claude_mpm/cli/utils.py +54 -3
- claude_mpm/cli_module/commands.py +1 -1
- claude_mpm/commands/mpm-agents-auto-configure.md +278 -0
- claude_mpm/commands/mpm-agents-detect.md +177 -0
- claude_mpm/commands/mpm-agents-list.md +131 -0
- claude_mpm/commands/mpm-agents-recommend.md +223 -0
- claude_mpm/commands/mpm-config-view.md +150 -0
- claude_mpm/commands/mpm-doctor.md +9 -0
- claude_mpm/commands/mpm-help.md +297 -5
- claude_mpm/commands/mpm-init.md +401 -17
- claude_mpm/commands/mpm-monitor.md +418 -0
- claude_mpm/commands/mpm-postmortem.md +123 -0
- claude_mpm/commands/mpm-session-resume.md +381 -0
- claude_mpm/commands/mpm-status.md +79 -8
- claude_mpm/commands/mpm-ticket-organize.md +304 -0
- claude_mpm/commands/mpm-ticket-view.md +552 -0
- claude_mpm/commands/mpm-version.md +122 -0
- claude_mpm/commands/mpm.md +12 -0
- claude_mpm/config/agent_config.py +4 -4
- claude_mpm/config/agent_presets.py +488 -0
- claude_mpm/config/agent_sources.py +325 -0
- claude_mpm/config/experimental_features.py +7 -7
- claude_mpm/config/model_config.py +428 -0
- claude_mpm/config/paths.py +3 -2
- claude_mpm/config/skill_presets.py +392 -0
- claude_mpm/config/skill_sources.py +590 -0
- claude_mpm/config/socketio_config.py +3 -3
- claude_mpm/constants.py +28 -1
- claude_mpm/core/__init__.py +53 -17
- claude_mpm/core/agent_name_normalizer.py +3 -2
- claude_mpm/core/agent_registry.py +2 -2
- claude_mpm/core/agent_session_manager.py +10 -10
- claude_mpm/core/api_validator.py +330 -0
- claude_mpm/core/base_service.py +33 -23
- claude_mpm/core/cache.py +9 -9
- claude_mpm/core/claude_runner.py +24 -42
- claude_mpm/core/config.py +101 -8
- claude_mpm/core/config_aliases.py +7 -6
- claude_mpm/core/constants.py +66 -1
- claude_mpm/core/container.py +11 -5
- claude_mpm/core/enums.py +452 -0
- claude_mpm/core/error_handler.py +623 -0
- claude_mpm/core/factories.py +1 -1
- claude_mpm/core/file_utils.py +764 -0
- claude_mpm/core/framework/__init__.py +25 -0
- claude_mpm/core/framework/formatters/__init__.py +11 -0
- claude_mpm/core/framework/formatters/capability_generator.py +367 -0
- claude_mpm/core/framework/formatters/content_formatter.py +288 -0
- claude_mpm/core/framework/formatters/context_generator.py +185 -0
- claude_mpm/core/framework/loaders/__init__.py +13 -0
- claude_mpm/core/framework/loaders/agent_loader.py +210 -0
- claude_mpm/core/framework/loaders/file_loader.py +176 -0
- claude_mpm/core/framework/loaders/instruction_loader.py +181 -0
- claude_mpm/core/framework/loaders/packaged_loader.py +232 -0
- claude_mpm/core/framework/processors/__init__.py +11 -0
- claude_mpm/core/framework/processors/memory_processor.py +230 -0
- claude_mpm/core/framework/processors/metadata_processor.py +146 -0
- claude_mpm/core/framework/processors/template_processor.py +244 -0
- claude_mpm/core/framework_loader.py +321 -1631
- claude_mpm/core/hook_error_memory.py +381 -0
- claude_mpm/core/hook_manager.py +49 -8
- claude_mpm/core/injectable_service.py +11 -8
- claude_mpm/core/instruction_reinforcement_hook.py +4 -3
- claude_mpm/core/interactive_session.py +146 -18
- claude_mpm/core/interfaces.py +56 -1
- claude_mpm/core/lazy.py +3 -3
- claude_mpm/core/log_manager.py +92 -23
- claude_mpm/core/logger.py +22 -15
- claude_mpm/core/logging_config.py +6 -2
- claude_mpm/core/logging_utils.py +520 -0
- claude_mpm/core/oneshot_session.py +122 -15
- claude_mpm/core/optimized_agent_loader.py +9 -9
- claude_mpm/core/optimized_startup.py +1 -1
- claude_mpm/core/output_style_manager.py +12 -192
- claude_mpm/core/pm_hook_interceptor.py +18 -12
- 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/service_registry.py +7 -3
- claude_mpm/core/session_manager.py +14 -12
- claude_mpm/core/shared/config_loader.py +1 -1
- claude_mpm/core/shared/singleton_manager.py +11 -4
- claude_mpm/core/socketio_pool.py +15 -15
- claude_mpm/core/system_context.py +38 -0
- claude_mpm/core/tool_access_control.py +3 -2
- claude_mpm/core/types.py +4 -11
- claude_mpm/core/typing_utils.py +7 -6
- claude_mpm/core/unified_agent_registry.py +115 -11
- claude_mpm/core/unified_config.py +6 -6
- claude_mpm/core/unified_paths.py +23 -20
- claude_mpm/dashboard/analysis_runner.py +4 -4
- claude_mpm/dashboard/api/simple_directory.py +261 -0
- 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 +600 -18
- claude_mpm/dashboard/static/js/components/activity-tree.js +181 -195
- claude_mpm/dashboard/static/js/components/agent-hierarchy.js +105 -102
- claude_mpm/dashboard/static/js/components/agent-inference.js +34 -31
- claude_mpm/dashboard/static/js/components/build-tracker.js +67 -59
- claude_mpm/dashboard/static/js/components/code-simple.js +857 -0
- claude_mpm/dashboard/static/js/components/connection-debug.js +101 -101
- claude_mpm/dashboard/static/js/components/diff-viewer.js +891 -0
- claude_mpm/dashboard/static/js/components/event-processor.js +3 -0
- claude_mpm/dashboard/static/js/components/event-viewer.js +50 -13
- claude_mpm/dashboard/static/js/components/export-manager.js +3 -0
- claude_mpm/dashboard/static/js/components/file-change-tracker.js +443 -0
- claude_mpm/dashboard/static/js/components/file-change-viewer.js +690 -0
- claude_mpm/dashboard/static/js/components/file-tool-tracker.js +36 -16
- claude_mpm/dashboard/static/js/components/file-viewer.js +580 -0
- claude_mpm/dashboard/static/js/components/module-viewer.js +49 -23
- claude_mpm/dashboard/static/js/components/session-manager.js +19 -19
- claude_mpm/dashboard/static/js/components/socket-manager.js +5 -1
- claude_mpm/dashboard/static/js/components/ui-state-manager.js +356 -41
- claude_mpm/dashboard/static/js/components/unified-data-viewer.js +520 -88
- claude_mpm/dashboard/static/js/components/working-directory.js +46 -11
- claude_mpm/dashboard/static/js/connection-manager.js +76 -76
- claude_mpm/dashboard/static/js/dashboard.js +309 -178
- claude_mpm/dashboard/static/js/extension-error-handler.js +22 -22
- claude_mpm/dashboard/static/js/socket-client.js +183 -139
- claude_mpm/dashboard/static/js/tab-isolation-fix.js +185 -0
- claude_mpm/dashboard/static/socket.io.min.js +7 -0
- claude_mpm/dashboard/static/socket.io.v4.8.1.backup.js +7 -0
- claude_mpm/dashboard/templates/code_simple.html +153 -0
- claude_mpm/dashboard/templates/index.html +125 -122
- claude_mpm/experimental/cli_enhancements.py +5 -7
- claude_mpm/generators/agent_profile_generator.py +5 -3
- claude_mpm/hooks/__init__.py +37 -1
- claude_mpm/hooks/base_hook.py +5 -4
- 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/connection_pool.py +4 -4
- claude_mpm/hooks/claude_hooks/event_handlers.py +24 -19
- claude_mpm/hooks/claude_hooks/hook_handler.py +29 -22
- claude_mpm/hooks/claude_hooks/installer.py +67 -22
- claude_mpm/hooks/claude_hooks/memory_integration.py +3 -3
- claude_mpm/hooks/claude_hooks/response_tracking.py +57 -17
- 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/claude_hooks/services/connection_manager.py +62 -64
- claude_mpm/hooks/claude_hooks/services/connection_manager_http.py +140 -76
- claude_mpm/hooks/claude_hooks/services/state_manager.py +11 -9
- claude_mpm/hooks/claude_hooks/services/subagent_processor.py +3 -3
- claude_mpm/hooks/failure_learning/__init__.py +54 -0
- claude_mpm/hooks/failure_learning/failure_detection_hook.py +230 -0
- claude_mpm/hooks/failure_learning/fix_detection_hook.py +212 -0
- claude_mpm/hooks/failure_learning/learning_extraction_hook.py +281 -0
- claude_mpm/hooks/instruction_reinforcement.py +301 -0
- claude_mpm/hooks/kuzu_enrichment_hook.py +263 -0
- claude_mpm/hooks/kuzu_memory_hook.py +386 -0
- claude_mpm/hooks/kuzu_response_hook.py +179 -0
- claude_mpm/hooks/memory_integration_hook.py +1 -1
- claude_mpm/hooks/session_resume_hook.py +121 -0
- claude_mpm/hooks/templates/pre_tool_use_simple.py +78 -0
- claude_mpm/hooks/templates/pre_tool_use_template.py +323 -0
- claude_mpm/hooks/tool_call_interceptor.py +8 -5
- claude_mpm/hooks/validation_hooks.py +3 -3
- claude_mpm/init.py +23 -4
- claude_mpm/models/agent_session.py +8 -6
- claude_mpm/models/git_repository.py +198 -0
- claude_mpm/models/resume_log.py +340 -0
- claude_mpm/scripts/claude-hook-handler.sh +35 -9
- claude_mpm/scripts/launch_monitor.py +85 -0
- claude_mpm/scripts/mcp_server.py +3 -5
- claude_mpm/scripts/mpm_doctor.py +3 -2
- claude_mpm/scripts/socketio_daemon.py +159 -512
- claude_mpm/scripts/start_activity_logging.py +3 -1
- claude_mpm/services/__init__.py +144 -160
- claude_mpm/services/agents/__init__.py +18 -5
- claude_mpm/services/agents/agent_builder.py +56 -18
- 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_config_manager.py +796 -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_configuration_manager.py +1 -1
- claude_mpm/services/agents/deployment/agent_deployment.py +164 -17
- claude_mpm/services/agents/deployment/agent_discovery_service.py +191 -41
- claude_mpm/services/agents/deployment/agent_filesystem_manager.py +5 -5
- claude_mpm/services/agents/deployment/agent_format_converter.py +56 -12
- claude_mpm/services/agents/deployment/agent_lifecycle_manager.py +5 -7
- claude_mpm/services/agents/deployment/agent_metrics_collector.py +3 -3
- claude_mpm/services/agents/deployment/agent_operation_service.py +2 -2
- claude_mpm/services/agents/deployment/agent_record_service.py +4 -4
- claude_mpm/services/agents/deployment/agent_restore_handler.py +1 -4
- claude_mpm/services/agents/deployment/agent_state_service.py +2 -2
- claude_mpm/services/agents/deployment/agent_template_builder.py +939 -50
- claude_mpm/services/agents/deployment/agent_validator.py +31 -7
- claude_mpm/services/agents/deployment/agent_version_manager.py +8 -5
- claude_mpm/services/agents/deployment/agent_versioning.py +1 -1
- claude_mpm/services/agents/deployment/agents_directory_resolver.py +101 -15
- claude_mpm/services/agents/deployment/async_agent_deployment.py +3 -2
- claude_mpm/services/agents/deployment/deployment_config_loader.py +131 -7
- claude_mpm/services/agents/deployment/deployment_type_detector.py +10 -14
- claude_mpm/services/agents/deployment/deployment_wrapper.py +58 -0
- claude_mpm/services/agents/deployment/facade/deployment_facade.py +3 -3
- claude_mpm/services/agents/deployment/interface_adapter.py +3 -2
- claude_mpm/services/agents/deployment/local_template_deployment.py +360 -0
- claude_mpm/services/agents/deployment/multi_source_deployment_service.py +249 -53
- claude_mpm/services/agents/deployment/pipeline/pipeline_executor.py +2 -2
- claude_mpm/services/agents/deployment/pipeline/steps/agent_processing_step.py +8 -7
- claude_mpm/services/agents/deployment/pipeline/steps/base_step.py +7 -16
- claude_mpm/services/agents/deployment/pipeline/steps/configuration_step.py +4 -3
- claude_mpm/services/agents/deployment/pipeline/steps/target_directory_step.py +7 -5
- claude_mpm/services/agents/deployment/pipeline/steps/validation_step.py +6 -5
- claude_mpm/services/agents/deployment/refactored_agent_deployment_service.py +10 -10
- 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 -43
- claude_mpm/services/agents/deployment/validation/__init__.py +3 -1
- claude_mpm/services/agents/deployment/validation/deployment_validator.py +2 -2
- claude_mpm/services/agents/deployment/validation/template_validator.py +64 -44
- claude_mpm/services/agents/deployment/validation/validation_result.py +1 -9
- claude_mpm/services/agents/git_source_manager.py +629 -0
- claude_mpm/services/agents/loading/agent_profile_loader.py +10 -9
- claude_mpm/services/agents/loading/base_agent_manager.py +16 -6
- claude_mpm/services/agents/loading/framework_agent_loader.py +11 -14
- claude_mpm/services/agents/local_template_manager.py +784 -0
- claude_mpm/services/agents/management/agent_capabilities_generator.py +3 -2
- claude_mpm/services/agents/management/agent_management_service.py +5 -5
- claude_mpm/services/agents/memory/agent_memory_manager.py +32 -29
- claude_mpm/services/agents/memory/content_manager.py +17 -9
- claude_mpm/services/agents/memory/memory_categorization_service.py +4 -2
- claude_mpm/services/agents/memory/memory_file_service.py +32 -6
- claude_mpm/services/agents/memory/memory_format_service.py +6 -4
- claude_mpm/services/agents/memory/memory_limits_service.py +4 -2
- claude_mpm/services/agents/memory/template_generator.py +3 -3
- claude_mpm/services/agents/observers.py +547 -0
- claude_mpm/services/agents/recommender.py +615 -0
- claude_mpm/services/agents/registry/deployed_agent_discovery.py +3 -3
- claude_mpm/services/agents/registry/modification_tracker.py +30 -19
- 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/async_session_logger.py +141 -98
- claude_mpm/services/claude_session_logger.py +82 -74
- claude_mpm/services/cli/agent_cleanup_service.py +5 -0
- claude_mpm/services/cli/agent_listing_service.py +5 -5
- claude_mpm/services/cli/agent_validation_service.py +3 -1
- claude_mpm/services/cli/memory_crud_service.py +12 -7
- claude_mpm/services/cli/memory_output_formatter.py +2 -2
- claude_mpm/services/cli/resume_service.py +617 -0
- claude_mpm/services/cli/session_manager.py +104 -13
- claude_mpm/services/cli/session_pause_manager.py +504 -0
- claude_mpm/services/cli/session_resume_helper.py +372 -0
- claude_mpm/services/cli/startup_checker.py +13 -10
- claude_mpm/services/cli/unified_dashboard_manager.py +439 -0
- claude_mpm/services/command_deployment_service.py +209 -13
- claude_mpm/services/command_handler_service.py +11 -5
- claude_mpm/services/core/__init__.py +33 -1
- claude_mpm/services/core/base.py +31 -11
- claude_mpm/services/core/interfaces/__init__.py +88 -3
- claude_mpm/services/core/interfaces/agent.py +184 -0
- claude_mpm/services/core/interfaces/health.py +169 -0
- claude_mpm/services/core/interfaces/model.py +281 -0
- claude_mpm/services/core/interfaces/process.py +372 -0
- claude_mpm/services/core/interfaces/project.py +121 -0
- claude_mpm/services/core/interfaces/restart.py +307 -0
- claude_mpm/services/core/interfaces/stability.py +260 -0
- claude_mpm/services/core/interfaces.py +56 -1
- claude_mpm/services/core/memory_manager.py +92 -47
- claude_mpm/services/core/models/__init__.py +70 -0
- claude_mpm/services/core/models/agent_config.py +384 -0
- claude_mpm/services/core/models/health.py +162 -0
- claude_mpm/services/core/models/process.py +239 -0
- claude_mpm/services/core/models/restart.py +302 -0
- claude_mpm/services/core/models/stability.py +264 -0
- claude_mpm/services/core/models/toolchain.py +306 -0
- claude_mpm/services/core/path_resolver.py +36 -14
- claude_mpm/services/diagnostics/__init__.py +2 -2
- claude_mpm/services/diagnostics/checks/__init__.py +8 -2
- claude_mpm/services/diagnostics/checks/agent_check.py +30 -34
- claude_mpm/services/diagnostics/checks/agent_sources_check.py +577 -0
- claude_mpm/services/diagnostics/checks/claude_code_check.py +270 -0
- claude_mpm/services/diagnostics/checks/common_issues_check.py +28 -27
- claude_mpm/services/diagnostics/checks/configuration_check.py +26 -25
- claude_mpm/services/diagnostics/checks/filesystem_check.py +18 -17
- claude_mpm/services/diagnostics/checks/installation_check.py +165 -60
- claude_mpm/services/diagnostics/checks/instructions_check.py +21 -21
- claude_mpm/services/diagnostics/checks/mcp_check.py +57 -44
- claude_mpm/services/diagnostics/checks/mcp_services_check.py +1058 -0
- claude_mpm/services/diagnostics/checks/monitor_check.py +24 -24
- claude_mpm/services/diagnostics/checks/skill_sources_check.py +587 -0
- claude_mpm/services/diagnostics/checks/startup_log_check.py +14 -11
- claude_mpm/services/diagnostics/diagnostic_runner.py +31 -13
- claude_mpm/services/diagnostics/doctor_reporter.py +305 -47
- claude_mpm/services/diagnostics/models.py +37 -21
- claude_mpm/services/event_aggregator.py +5 -3
- claude_mpm/services/event_bus/direct_relay.py +11 -7
- claude_mpm/services/event_bus/event_bus.py +51 -9
- claude_mpm/services/event_bus/relay.py +33 -14
- claude_mpm/services/events/consumers/dead_letter.py +7 -5
- claude_mpm/services/events/consumers/logging.py +1 -2
- claude_mpm/services/events/core.py +5 -6
- claude_mpm/services/events/producers/hook.py +6 -6
- claude_mpm/services/events/producers/system.py +8 -8
- claude_mpm/services/exceptions.py +5 -5
- claude_mpm/services/framework_claude_md_generator/__init__.py +1 -1
- claude_mpm/services/framework_claude_md_generator/content_assembler.py +5 -5
- claude_mpm/services/framework_claude_md_generator/content_validator.py +2 -2
- claude_mpm/services/framework_claude_md_generator/deployment_manager.py +3 -3
- claude_mpm/services/framework_claude_md_generator/section_generators/__init__.py +2 -2
- claude_mpm/services/framework_claude_md_generator/version_manager.py +1 -1
- 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/hook_installer_service.py +506 -0
- claude_mpm/services/hook_service.py +5 -6
- claude_mpm/services/infrastructure/context_preservation.py +13 -11
- claude_mpm/services/infrastructure/daemon_manager.py +9 -9
- claude_mpm/services/infrastructure/logging.py +2 -2
- claude_mpm/services/infrastructure/monitoring/__init__.py +2 -6
- claude_mpm/services/infrastructure/monitoring/aggregator.py +13 -18
- claude_mpm/services/infrastructure/monitoring/base.py +5 -13
- claude_mpm/services/infrastructure/monitoring/network.py +7 -6
- claude_mpm/services/infrastructure/monitoring/process.py +13 -12
- claude_mpm/services/infrastructure/monitoring/resources.py +8 -7
- claude_mpm/services/infrastructure/monitoring/service.py +16 -15
- claude_mpm/services/infrastructure/resume_log_generator.py +439 -0
- 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 +155 -0
- claude_mpm/services/local_ops/crash_detector.py +257 -0
- claude_mpm/services/local_ops/health_checks/__init__.py +26 -0
- claude_mpm/services/local_ops/health_checks/http_check.py +224 -0
- claude_mpm/services/local_ops/health_checks/process_check.py +236 -0
- claude_mpm/services/local_ops/health_checks/resource_check.py +255 -0
- claude_mpm/services/local_ops/health_manager.py +427 -0
- claude_mpm/services/local_ops/log_monitor.py +396 -0
- claude_mpm/services/local_ops/memory_leak_detector.py +294 -0
- claude_mpm/services/local_ops/process_manager.py +595 -0
- claude_mpm/services/local_ops/resource_monitor.py +331 -0
- claude_mpm/services/local_ops/restart_manager.py +401 -0
- claude_mpm/services/local_ops/restart_policy.py +387 -0
- claude_mpm/services/local_ops/state_manager.py +372 -0
- claude_mpm/services/local_ops/unified_manager.py +600 -0
- claude_mpm/services/mcp_config_manager.py +1542 -0
- claude_mpm/services/mcp_gateway/__init__.py +97 -93
- claude_mpm/services/mcp_gateway/auto_configure.py +43 -38
- claude_mpm/services/mcp_gateway/config/config_loader.py +3 -3
- claude_mpm/services/mcp_gateway/config/configuration.py +24 -5
- claude_mpm/services/mcp_gateway/core/__init__.py +1 -2
- claude_mpm/services/mcp_gateway/core/base.py +20 -33
- claude_mpm/services/mcp_gateway/core/process_pool.py +591 -31
- claude_mpm/services/mcp_gateway/core/singleton_manager.py +2 -2
- claude_mpm/services/mcp_gateway/core/startup_verification.py +3 -3
- claude_mpm/services/mcp_gateway/main.py +90 -15
- claude_mpm/services/mcp_gateway/registry/service_registry.py +4 -2
- claude_mpm/services/mcp_gateway/registry/tool_registry.py +12 -9
- claude_mpm/services/mcp_gateway/server/mcp_gateway.py +5 -10
- claude_mpm/services/mcp_gateway/server/stdio_server.py +9 -17
- claude_mpm/services/mcp_gateway/tools/__init__.py +14 -2
- claude_mpm/services/mcp_gateway/tools/base_adapter.py +15 -15
- claude_mpm/services/mcp_gateway/tools/document_summarizer.py +10 -9
- claude_mpm/services/mcp_gateway/tools/external_mcp_services.py +654 -0
- claude_mpm/services/mcp_gateway/tools/health_check_tool.py +36 -34
- claude_mpm/services/mcp_gateway/tools/hello_world.py +8 -8
- claude_mpm/services/mcp_gateway/tools/kuzu_memory_service.py +555 -0
- claude_mpm/services/mcp_gateway/utils/__init__.py +14 -0
- claude_mpm/services/mcp_gateway/utils/package_version_checker.py +160 -0
- claude_mpm/services/mcp_gateway/utils/update_preferences.py +170 -0
- claude_mpm/services/mcp_service_verifier.py +732 -0
- claude_mpm/services/memory/builder.py +9 -8
- claude_mpm/services/memory/cache/shared_prompt_cache.py +2 -1
- claude_mpm/services/memory/cache/simple_cache.py +2 -2
- claude_mpm/services/memory/failure_tracker.py +578 -0
- claude_mpm/services/memory/indexed_memory.py +8 -8
- claude_mpm/services/memory/optimizer.py +8 -9
- claude_mpm/services/memory/router.py +3 -3
- claude_mpm/services/memory_hook_service.py +165 -4
- claude_mpm/services/model/__init__.py +147 -0
- claude_mpm/services/model/base_provider.py +365 -0
- claude_mpm/services/model/claude_provider.py +412 -0
- claude_mpm/services/model/model_router.py +452 -0
- claude_mpm/services/model/ollama_provider.py +415 -0
- claude_mpm/services/monitor/__init__.py +20 -0
- claude_mpm/services/monitor/daemon.py +691 -0
- claude_mpm/services/monitor/daemon_manager.py +1040 -0
- claude_mpm/services/monitor/event_emitter.py +350 -0
- claude_mpm/services/monitor/handlers/__init__.py +21 -0
- claude_mpm/services/monitor/handlers/code_analysis.py +332 -0
- claude_mpm/services/monitor/handlers/dashboard.py +299 -0
- claude_mpm/services/monitor/handlers/file.py +264 -0
- claude_mpm/services/monitor/handlers/hooks.py +512 -0
- claude_mpm/services/monitor/management/__init__.py +18 -0
- claude_mpm/services/monitor/management/health.py +124 -0
- claude_mpm/services/monitor/management/lifecycle.py +724 -0
- claude_mpm/services/monitor/server.py +817 -0
- claude_mpm/services/monitor_build_service.py +2 -2
- claude_mpm/services/native_agent_converter.py +356 -0
- claude_mpm/services/orphan_detection.py +786 -0
- claude_mpm/services/port_manager.py +3 -3
- claude_mpm/services/pr/__init__.py +14 -0
- claude_mpm/services/pr/pr_template_service.py +329 -0
- claude_mpm/services/project/__init__.py +23 -0
- claude_mpm/services/project/analyzer.py +3 -3
- claude_mpm/services/project/architecture_analyzer.py +5 -5
- claude_mpm/services/project/archive_manager.py +1045 -0
- claude_mpm/services/project/dependency_analyzer.py +4 -4
- claude_mpm/services/project/detection_strategies.py +719 -0
- claude_mpm/services/project/documentation_manager.py +554 -0
- claude_mpm/services/project/enhanced_analyzer.py +572 -0
- claude_mpm/services/project/metrics_collector.py +4 -4
- claude_mpm/services/project/project_organizer.py +1005 -0
- claude_mpm/services/project/registry.py +13 -7
- claude_mpm/services/project/toolchain_analyzer.py +583 -0
- claude_mpm/services/project_port_allocator.py +596 -0
- claude_mpm/services/response_tracker.py +21 -10
- claude_mpm/services/runner_configuration_service.py +17 -3
- claude_mpm/services/self_upgrade_service.py +500 -0
- claude_mpm/services/session_management_service.py +23 -9
- claude_mpm/services/session_manager.py +380 -0
- claude_mpm/services/shared/__init__.py +2 -1
- claude_mpm/services/shared/async_service_base.py +16 -27
- claude_mpm/services/shared/config_service_base.py +17 -14
- claude_mpm/services/shared/lifecycle_service_base.py +1 -14
- claude_mpm/services/shared/service_factory.py +8 -5
- 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/client_proxy.py +60 -5
- claude_mpm/services/socketio/dashboard_server.py +361 -0
- claude_mpm/services/socketio/event_normalizer.py +10 -6
- claude_mpm/services/socketio/handlers/__init__.py +5 -2
- claude_mpm/services/socketio/handlers/base.py +2 -2
- claude_mpm/services/socketio/handlers/code_analysis.py +90 -27
- claude_mpm/services/socketio/handlers/connection.py +22 -41
- claude_mpm/services/socketio/handlers/connection_handler.py +13 -10
- claude_mpm/services/socketio/handlers/file.py +46 -10
- claude_mpm/services/socketio/handlers/git.py +9 -9
- claude_mpm/services/socketio/handlers/hook.py +29 -17
- claude_mpm/services/socketio/handlers/registry.py +4 -2
- claude_mpm/services/socketio/monitor_client.py +364 -0
- claude_mpm/services/socketio/server/broadcaster.py +9 -7
- claude_mpm/services/socketio/server/connection_manager.py +2 -2
- claude_mpm/services/socketio/server/core.py +142 -8
- claude_mpm/services/socketio/server/eventbus_integration.py +20 -14
- claude_mpm/services/socketio/server/main.py +24 -24
- claude_mpm/services/socketio_client_manager.py +4 -4
- claude_mpm/services/subprocess_launcher_service.py +19 -15
- claude_mpm/services/system_instructions_service.py +3 -5
- claude_mpm/services/ticket_services/formatter_service.py +1 -1
- claude_mpm/services/ticket_services/validation_service.py +5 -5
- claude_mpm/services/unified/__init__.py +65 -0
- claude_mpm/services/unified/analyzer_strategies/__init__.py +44 -0
- claude_mpm/services/unified/analyzer_strategies/code_analyzer.py +518 -0
- claude_mpm/services/unified/analyzer_strategies/dependency_analyzer.py +680 -0
- claude_mpm/services/unified/analyzer_strategies/performance_analyzer.py +900 -0
- claude_mpm/services/unified/analyzer_strategies/security_analyzer.py +745 -0
- claude_mpm/services/unified/analyzer_strategies/structure_analyzer.py +733 -0
- claude_mpm/services/unified/config_strategies/__init__.py +175 -0
- claude_mpm/services/unified/config_strategies/config_schema.py +731 -0
- claude_mpm/services/unified/config_strategies/context_strategy.py +747 -0
- claude_mpm/services/unified/config_strategies/error_handling_strategy.py +1005 -0
- claude_mpm/services/unified/config_strategies/file_loader_strategy.py +881 -0
- claude_mpm/services/unified/config_strategies/unified_config_service.py +823 -0
- claude_mpm/services/unified/config_strategies/validation_strategy.py +1148 -0
- claude_mpm/services/unified/deployment_strategies/__init__.py +97 -0
- claude_mpm/services/unified/deployment_strategies/base.py +553 -0
- claude_mpm/services/unified/deployment_strategies/cloud_strategies.py +573 -0
- claude_mpm/services/unified/deployment_strategies/local.py +607 -0
- claude_mpm/services/unified/deployment_strategies/utils.py +667 -0
- claude_mpm/services/unified/deployment_strategies/vercel.py +471 -0
- claude_mpm/services/unified/interfaces.py +475 -0
- claude_mpm/services/unified/migration.py +509 -0
- claude_mpm/services/unified/strategies.py +534 -0
- claude_mpm/services/unified/unified_analyzer.py +542 -0
- claude_mpm/services/unified/unified_config.py +691 -0
- claude_mpm/services/unified/unified_deployment.py +466 -0
- claude_mpm/services/utility_service.py +6 -3
- claude_mpm/services/version_control/branch_strategy.py +2 -2
- claude_mpm/services/version_control/conflict_resolution.py +14 -8
- claude_mpm/services/version_control/git_operations.py +26 -24
- claude_mpm/services/version_control/semantic_versioning.py +14 -14
- claude_mpm/services/version_control/version_parser.py +14 -11
- claude_mpm/services/version_service.py +104 -1
- claude_mpm/services/visualization/__init__.py +1 -5
- claude_mpm/services/visualization/mermaid_generator.py +2 -3
- claude_mpm/skills/__init__.py +42 -0
- claude_mpm/skills/agent_skills_injector.py +324 -0
- claude_mpm/skills/bundled/LICENSE_ATTRIBUTIONS.md +79 -0
- claude_mpm/skills/bundled/__init__.py +6 -0
- claude_mpm/skills/bundled/api-documentation.md +393 -0
- claude_mpm/skills/bundled/async-testing.md +571 -0
- claude_mpm/skills/bundled/code-review.md +143 -0
- claude_mpm/skills/bundled/database-migration.md +199 -0
- claude_mpm/skills/bundled/docker-containerization.md +194 -0
- claude_mpm/skills/bundled/express-local-dev.md +1429 -0
- claude_mpm/skills/bundled/fastapi-local-dev.md +1199 -0
- claude_mpm/skills/bundled/git-workflow.md +414 -0
- claude_mpm/skills/bundled/imagemagick.md +204 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/scripts/validate_env.py +576 -0
- claude_mpm/skills/bundled/json-data-handling.md +223 -0
- claude_mpm/skills/bundled/main/mcp-builder/scripts/connections.py +157 -0
- claude_mpm/skills/bundled/main/mcp-builder/scripts/evaluation.py +425 -0
- claude_mpm/skills/bundled/main/skill-creator/scripts/init_skill.py +303 -0
- claude_mpm/skills/bundled/main/skill-creator/scripts/package_skill.py +113 -0
- claude_mpm/skills/bundled/main/skill-creator/scripts/quick_validate.py +72 -0
- claude_mpm/skills/bundled/nextjs-local-dev.md +807 -0
- claude_mpm/skills/bundled/pdf.md +141 -0
- claude_mpm/skills/bundled/performance-profiling.md +573 -0
- claude_mpm/skills/bundled/refactoring-patterns.md +180 -0
- claude_mpm/skills/bundled/security-scanning.md +327 -0
- claude_mpm/skills/bundled/systematic-debugging.md +473 -0
- claude_mpm/skills/bundled/test-driven-development.md +378 -0
- claude_mpm/skills/bundled/testing/webapp-testing/examples/console_logging.py +35 -0
- claude_mpm/skills/bundled/testing/webapp-testing/examples/element_discovery.py +44 -0
- claude_mpm/skills/bundled/testing/webapp-testing/examples/static_html_automation.py +34 -0
- claude_mpm/skills/bundled/testing/webapp-testing/scripts/with_server.py +129 -0
- claude_mpm/skills/bundled/vite-local-dev.md +1061 -0
- claude_mpm/skills/bundled/web-performance-optimization.md +2305 -0
- claude_mpm/skills/bundled/xlsx.md +157 -0
- claude_mpm/skills/registry.py +286 -0
- claude_mpm/skills/skill_manager.py +310 -0
- claude_mpm/skills/skills_registry.py +347 -0
- claude_mpm/skills/skills_service.py +739 -0
- claude_mpm/storage/state_storage.py +31 -31
- 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 +9 -9
- 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/tools/code_tree_builder.py +6 -6
- claude_mpm/tools/code_tree_events.py +14 -10
- claude_mpm/tools/socketio_debug.py +11 -11
- claude_mpm/utils/agent_dependency_loader.py +184 -36
- claude_mpm/utils/agent_filters.py +288 -0
- claude_mpm/utils/common.py +544 -0
- claude_mpm/utils/config_manager.py +12 -6
- claude_mpm/utils/database_connector.py +298 -0
- claude_mpm/utils/dependency_cache.py +5 -3
- claude_mpm/utils/dependency_strategies.py +15 -10
- claude_mpm/utils/display_helper.py +260 -0
- claude_mpm/utils/environment_context.py +4 -3
- claude_mpm/utils/error_handler.py +5 -3
- claude_mpm/utils/file_utils.py +13 -14
- claude_mpm/utils/git_analyzer.py +407 -0
- claude_mpm/utils/gitignore.py +241 -0
- claude_mpm/utils/log_cleanup.py +627 -0
- claude_mpm/utils/migration.py +372 -0
- claude_mpm/utils/path_operations.py +7 -4
- claude_mpm/utils/progress.py +387 -0
- claude_mpm/utils/robust_installer.py +131 -24
- claude_mpm/utils/session_logging.py +2 -2
- claude_mpm/utils/structured_questions.py +619 -0
- claude_mpm/utils/subprocess_utils.py +9 -8
- claude_mpm/validation/agent_validator.py +6 -6
- claude_mpm/validation/frontmatter_validator.py +6 -6
- claude_mpm-5.0.9.dist-info/METADATA +1028 -0
- claude_mpm-5.0.9.dist-info/RECORD +864 -0
- {claude_mpm-4.1.26.dist-info → claude_mpm-5.0.9.dist-info}/entry_points.txt +1 -0
- claude_mpm/agents/INSTRUCTIONS.md +0 -261
- 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 -270
- claude_mpm/agents/templates/agent-manager.md +0 -619
- claude_mpm/agents/templates/agentic_coder_optimizer.json +0 -222
- claude_mpm/agents/templates/api_qa.json +0 -171
- claude_mpm/agents/templates/code_analyzer.json +0 -95
- claude_mpm/agents/templates/data_engineer.json +0 -152
- claude_mpm/agents/templates/documentation.json +0 -175
- claude_mpm/agents/templates/engineer.json +0 -176
- claude_mpm/agents/templates/imagemagick.json +0 -261
- claude_mpm/agents/templates/logs/prompts/agent_engineer_20250826_014258_728.md +0 -39
- claude_mpm/agents/templates/memory_manager.json +0 -155
- claude_mpm/agents/templates/ops.json +0 -175
- claude_mpm/agents/templates/project_organizer.json +0 -130
- claude_mpm/agents/templates/qa.json +0 -223
- claude_mpm/agents/templates/refactoring_engineer.json +0 -266
- claude_mpm/agents/templates/research.json +0 -163
- claude_mpm/agents/templates/security.json +0 -153
- claude_mpm/agents/templates/ticketing.json +0 -169
- claude_mpm/agents/templates/vercel_ops_agent.json +0 -281
- claude_mpm/agents/templates/version_control.json +0 -147
- claude_mpm/agents/templates/web_qa.json +0 -254
- claude_mpm/agents/templates/web_ui.json +0 -176
- claude_mpm/cli/commands/configure_tui.py +0 -1927
- claude_mpm/cli/commands/mpm_init.py +0 -594
- claude_mpm/cli/commands/socketio_monitor.py +0 -233
- claude_mpm/commands/mpm-agents.md +0 -12
- claude_mpm/commands/mpm-config.md +0 -18
- claude_mpm/commands/mpm-tickets.md +0 -102
- claude_mpm/dashboard/.claude-mpm/socketio-instances.json +0 -1
- claude_mpm/dashboard/static/built/components/activity-tree.js +0 -2
- claude_mpm/dashboard/static/built/components/agent-inference.js +0 -2
- 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/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-tool-tracker.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/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/dashboard.js +0 -2
- claude_mpm/dashboard/static/built/socket-client.js +0 -2
- claude_mpm/dashboard/static/css/code-tree.css +0 -1408
- 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/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/socket-client.js +0 -2
- claude_mpm/dashboard/static/js/components/code-tree.js +0 -3220
- claude_mpm/dashboard/static/js/components/code-viewer.js +0 -480
- claude_mpm/hooks/claude_hooks/hook_handler_eventbus.py +0 -425
- claude_mpm/hooks/claude_hooks/hook_handler_original.py +0 -1040
- claude_mpm/hooks/claude_hooks/hook_handler_refactored.py +0 -347
- claude_mpm/scripts/socketio_daemon_hardened.py +0 -937
- claude_mpm/scripts/socketio_daemon_wrapper.py +0 -78
- claude_mpm/scripts/socketio_server_manager.py +0 -349
- claude_mpm/services/agents/deployment/agent_lifecycle_manager_refactored.py +0 -575
- claude_mpm/services/cli/dashboard_launcher.py +0 -423
- claude_mpm/services/cli/socketio_manager.py +0 -537
- claude_mpm/services/diagnostics/checks/claude_desktop_check.py +0 -286
- claude_mpm/services/mcp_gateway/tools/ticket_tools.py +0 -645
- claude_mpm/services/mcp_gateway/tools/unified_ticket_tool.py +0 -602
- claude_mpm/services/project/analyzer_refactored.py +0 -450
- claude_mpm/tools/code_tree_analyzer.py +0 -1693
- claude_mpm-4.1.26.dist-info/METADATA +0 -332
- claude_mpm-4.1.26.dist-info/RECORD +0 -606
- {claude_mpm-4.1.26.dist-info → claude_mpm-5.0.9.dist-info}/WHEEL +0 -0
- {claude_mpm-4.1.26.dist-info → claude_mpm-5.0.9.dist-info}/licenses/LICENSE +0 -0
- {claude_mpm-4.1.26.dist-info → claude_mpm-5.0.9.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,590 @@
|
|
|
1
|
+
"""Configuration for skill sources (Git repositories).
|
|
2
|
+
|
|
3
|
+
This module manages skill sources configuration, which defines Git repositories
|
|
4
|
+
containing skill files (Markdown with YAML frontmatter). It supports:
|
|
5
|
+
- System repository (bobmatnyc/claude-mpm-skills) with priority 0
|
|
6
|
+
- Official Anthropic repository (anthropics/skills) with priority 1
|
|
7
|
+
- Multiple custom repositories with priority-based resolution
|
|
8
|
+
- YAML persistence for configuration
|
|
9
|
+
- Source management (add, remove, enable, disable)
|
|
10
|
+
|
|
11
|
+
Design Decision: Skill-specific data model separate from agent sources
|
|
12
|
+
|
|
13
|
+
Rationale: While skills and agents both come from Git repositories, they have
|
|
14
|
+
different structures (YAML frontmatter vs. Markdown sections) and different
|
|
15
|
+
resolution requirements. Separating the configuration models allows for
|
|
16
|
+
skill-specific validation and future extensibility.
|
|
17
|
+
|
|
18
|
+
Trade-offs:
|
|
19
|
+
- Maintainability: Clear separation of concerns
|
|
20
|
+
- Code Duplication: Some overlap with agent_sources.py (acceptable for clarity)
|
|
21
|
+
- Flexibility: Easy to extend skills with unique features
|
|
22
|
+
|
|
23
|
+
Example:
|
|
24
|
+
>>> config = SkillSourceConfiguration.load()
|
|
25
|
+
>>> config.add_source(SkillSource(
|
|
26
|
+
... id="custom",
|
|
27
|
+
... type="git",
|
|
28
|
+
... url="https://github.com/owner/skills",
|
|
29
|
+
... priority=200
|
|
30
|
+
... ))
|
|
31
|
+
>>> config.save()
|
|
32
|
+
"""
|
|
33
|
+
|
|
34
|
+
from dataclasses import dataclass
|
|
35
|
+
from pathlib import Path
|
|
36
|
+
from typing import List, Optional
|
|
37
|
+
from urllib.parse import urlparse
|
|
38
|
+
|
|
39
|
+
import yaml
|
|
40
|
+
|
|
41
|
+
from claude_mpm.core.logging_config import get_logger
|
|
42
|
+
|
|
43
|
+
logger = get_logger(__name__)
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
@dataclass
|
|
47
|
+
class SkillSource:
|
|
48
|
+
"""Represents a single skill source (Git repository).
|
|
49
|
+
|
|
50
|
+
Attributes:
|
|
51
|
+
id: Unique identifier for this source (e.g., "system", "custom")
|
|
52
|
+
type: Source type (currently only "git" supported)
|
|
53
|
+
url: Full Git repository URL
|
|
54
|
+
branch: Git branch to use (default: "main")
|
|
55
|
+
priority: Priority for skill resolution (lower = higher precedence)
|
|
56
|
+
enabled: Whether this source should be synced
|
|
57
|
+
|
|
58
|
+
Priority System:
|
|
59
|
+
- 0: Reserved for system repository (highest precedence)
|
|
60
|
+
- 1-99: High priority custom sources
|
|
61
|
+
- 100-999: Normal priority custom sources
|
|
62
|
+
- 1000+: Low priority custom sources
|
|
63
|
+
|
|
64
|
+
Example:
|
|
65
|
+
>>> source = SkillSource(
|
|
66
|
+
... id="system",
|
|
67
|
+
... type="git",
|
|
68
|
+
... url="https://github.com/bobmatnyc/claude-mpm-skills",
|
|
69
|
+
... priority=0
|
|
70
|
+
... )
|
|
71
|
+
>>> source.validate()
|
|
72
|
+
[]
|
|
73
|
+
"""
|
|
74
|
+
|
|
75
|
+
id: str
|
|
76
|
+
type: str
|
|
77
|
+
url: str
|
|
78
|
+
branch: str = "main"
|
|
79
|
+
priority: int = 100
|
|
80
|
+
enabled: bool = True
|
|
81
|
+
|
|
82
|
+
def __post_init__(self):
|
|
83
|
+
"""Validate skill source configuration after initialization.
|
|
84
|
+
|
|
85
|
+
Raises:
|
|
86
|
+
ValueError: If validation fails
|
|
87
|
+
"""
|
|
88
|
+
errors = self.validate()
|
|
89
|
+
if errors:
|
|
90
|
+
raise ValueError(f"Invalid skill source configuration: {', '.join(errors)}")
|
|
91
|
+
|
|
92
|
+
def validate(self) -> List[str]:
|
|
93
|
+
"""Validate skill source configuration.
|
|
94
|
+
|
|
95
|
+
Returns:
|
|
96
|
+
List of validation error messages (empty if valid)
|
|
97
|
+
|
|
98
|
+
Validation checks:
|
|
99
|
+
- ID is not empty and follows naming rules
|
|
100
|
+
- Type is supported (currently only "git")
|
|
101
|
+
- URL is valid and points to a Git repository
|
|
102
|
+
- Branch name is valid
|
|
103
|
+
- Priority is in valid range (0-1000)
|
|
104
|
+
"""
|
|
105
|
+
errors = []
|
|
106
|
+
|
|
107
|
+
# Validate ID
|
|
108
|
+
if not self.id or not self.id.strip():
|
|
109
|
+
errors.append("Source ID cannot be empty")
|
|
110
|
+
elif not self.id.replace("-", "").replace("_", "").isalnum():
|
|
111
|
+
errors.append(
|
|
112
|
+
f"Source ID must be alphanumeric (with hyphens/underscores), got: {self.id}"
|
|
113
|
+
)
|
|
114
|
+
|
|
115
|
+
# Validate type
|
|
116
|
+
if self.type != "git":
|
|
117
|
+
errors.append(f"Only 'git' type is currently supported, got: {self.type}")
|
|
118
|
+
|
|
119
|
+
# Validate URL
|
|
120
|
+
if not self.url or not self.url.strip():
|
|
121
|
+
errors.append("URL cannot be empty")
|
|
122
|
+
else:
|
|
123
|
+
try:
|
|
124
|
+
parsed = urlparse(self.url)
|
|
125
|
+
if parsed.scheme not in ("http", "https"):
|
|
126
|
+
errors.append(
|
|
127
|
+
f"URL must use http:// or https:// protocol, got: {parsed.scheme}"
|
|
128
|
+
)
|
|
129
|
+
if not parsed.netloc.endswith("github.com"):
|
|
130
|
+
errors.append(
|
|
131
|
+
f"URL must be a GitHub repository, got: {parsed.netloc}"
|
|
132
|
+
)
|
|
133
|
+
path_parts = [p for p in parsed.path.strip("/").split("/") if p]
|
|
134
|
+
if len(path_parts) < 2:
|
|
135
|
+
errors.append(
|
|
136
|
+
f"URL must include owner/repo path, got: {parsed.path}"
|
|
137
|
+
)
|
|
138
|
+
except Exception as e:
|
|
139
|
+
errors.append(f"Invalid URL format: {e}")
|
|
140
|
+
|
|
141
|
+
# Validate branch
|
|
142
|
+
if not self.branch or not self.branch.strip():
|
|
143
|
+
errors.append("Branch name cannot be empty")
|
|
144
|
+
|
|
145
|
+
# Validate priority
|
|
146
|
+
if self.priority < 0:
|
|
147
|
+
errors.append("Priority must be non-negative (0 or greater)")
|
|
148
|
+
if self.priority > 1000:
|
|
149
|
+
errors.append(
|
|
150
|
+
f"Priority {self.priority} is unusually high (recommended: 0-1000)"
|
|
151
|
+
)
|
|
152
|
+
|
|
153
|
+
return errors
|
|
154
|
+
|
|
155
|
+
def __repr__(self) -> str:
|
|
156
|
+
"""Return string representation of skill source."""
|
|
157
|
+
return (
|
|
158
|
+
f"SkillSource(id='{self.id}', url='{self.url}', "
|
|
159
|
+
f"priority={self.priority}, enabled={self.enabled})"
|
|
160
|
+
)
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
class SkillSourceConfiguration:
|
|
164
|
+
"""Manages skill sources configuration file.
|
|
165
|
+
|
|
166
|
+
Configuration Location:
|
|
167
|
+
~/.claude-mpm/config/skill_sources.yaml
|
|
168
|
+
|
|
169
|
+
Default Configuration:
|
|
170
|
+
sources:
|
|
171
|
+
- id: system
|
|
172
|
+
type: git
|
|
173
|
+
url: https://github.com/bobmatnyc/claude-mpm-skills
|
|
174
|
+
branch: main
|
|
175
|
+
priority: 0
|
|
176
|
+
enabled: true
|
|
177
|
+
- id: anthropic-official
|
|
178
|
+
type: git
|
|
179
|
+
url: https://github.com/anthropics/skills
|
|
180
|
+
branch: main
|
|
181
|
+
priority: 1
|
|
182
|
+
enabled: true
|
|
183
|
+
|
|
184
|
+
Design Pattern: Configuration as Code
|
|
185
|
+
|
|
186
|
+
This class follows the "configuration as code" pattern, treating YAML files
|
|
187
|
+
as the single source of truth. All modifications are persisted immediately
|
|
188
|
+
to ensure consistency.
|
|
189
|
+
|
|
190
|
+
Example:
|
|
191
|
+
>>> config = SkillSourceConfiguration()
|
|
192
|
+
>>> sources = config.load()
|
|
193
|
+
>>> print(f"Loaded {len(sources)} skill sources")
|
|
194
|
+
"""
|
|
195
|
+
|
|
196
|
+
def __init__(self, config_path: Optional[Path] = None):
|
|
197
|
+
"""Initialize configuration manager.
|
|
198
|
+
|
|
199
|
+
Args:
|
|
200
|
+
config_path: Path to config file (defaults to ~/.claude-mpm/config/skill_sources.yaml)
|
|
201
|
+
"""
|
|
202
|
+
if config_path is None:
|
|
203
|
+
config_path = Path.home() / ".claude-mpm" / "config" / "skill_sources.yaml"
|
|
204
|
+
self.config_path = config_path
|
|
205
|
+
self.logger = get_logger(__name__)
|
|
206
|
+
|
|
207
|
+
@classmethod
|
|
208
|
+
def from_file(cls, config_path: Path) -> "SkillSourceConfiguration":
|
|
209
|
+
"""Load configuration from file.
|
|
210
|
+
|
|
211
|
+
Args:
|
|
212
|
+
config_path: Path to configuration file
|
|
213
|
+
|
|
214
|
+
Returns:
|
|
215
|
+
SkillSourceConfiguration instance
|
|
216
|
+
"""
|
|
217
|
+
return cls(config_path=config_path)
|
|
218
|
+
|
|
219
|
+
def load(self) -> List[SkillSource]:
|
|
220
|
+
"""Load skill sources from configuration file.
|
|
221
|
+
|
|
222
|
+
Returns:
|
|
223
|
+
List of SkillSource instances
|
|
224
|
+
|
|
225
|
+
Behavior:
|
|
226
|
+
- If file doesn't exist, returns default system source
|
|
227
|
+
- If file is empty or invalid, returns default system source
|
|
228
|
+
- Validates all sources during loading
|
|
229
|
+
- Logs warnings for invalid sources (skips them)
|
|
230
|
+
|
|
231
|
+
Example:
|
|
232
|
+
>>> config = SkillSourceConfiguration()
|
|
233
|
+
>>> sources = config.load()
|
|
234
|
+
>>> for source in sources:
|
|
235
|
+
... print(f"{source.id}: {source.url}")
|
|
236
|
+
"""
|
|
237
|
+
# If file doesn't exist, return default sources
|
|
238
|
+
if not self.config_path.exists():
|
|
239
|
+
self.logger.info(
|
|
240
|
+
f"Configuration file not found at {self.config_path}, using defaults"
|
|
241
|
+
)
|
|
242
|
+
return self._get_default_sources()
|
|
243
|
+
|
|
244
|
+
try:
|
|
245
|
+
with open(self.config_path, encoding="utf-8") as f:
|
|
246
|
+
data = yaml.safe_load(f)
|
|
247
|
+
|
|
248
|
+
if not data or "sources" not in data:
|
|
249
|
+
self.logger.warning(
|
|
250
|
+
f"Empty or invalid configuration at {self.config_path}, using defaults"
|
|
251
|
+
)
|
|
252
|
+
return self._get_default_sources()
|
|
253
|
+
|
|
254
|
+
# Parse sources
|
|
255
|
+
sources = []
|
|
256
|
+
for source_data in data["sources"]:
|
|
257
|
+
try:
|
|
258
|
+
source = SkillSource(
|
|
259
|
+
id=source_data["id"],
|
|
260
|
+
type=source_data["type"],
|
|
261
|
+
url=source_data["url"],
|
|
262
|
+
branch=source_data.get("branch", "main"),
|
|
263
|
+
priority=source_data.get("priority", 100),
|
|
264
|
+
enabled=source_data.get("enabled", True),
|
|
265
|
+
)
|
|
266
|
+
sources.append(source)
|
|
267
|
+
except (KeyError, ValueError) as e:
|
|
268
|
+
self.logger.warning(f"Skipping invalid source: {e}")
|
|
269
|
+
continue
|
|
270
|
+
|
|
271
|
+
if not sources:
|
|
272
|
+
self.logger.warning("No valid sources found, using defaults")
|
|
273
|
+
return self._get_default_sources()
|
|
274
|
+
|
|
275
|
+
return sources
|
|
276
|
+
|
|
277
|
+
except Exception as e:
|
|
278
|
+
self.logger.error(
|
|
279
|
+
f"Failed to load configuration from {self.config_path}: {e}"
|
|
280
|
+
)
|
|
281
|
+
self.logger.info("Using default configuration")
|
|
282
|
+
return self._get_default_sources()
|
|
283
|
+
|
|
284
|
+
def save(self, sources: List[SkillSource]) -> None:
|
|
285
|
+
"""Save skill sources to configuration file.
|
|
286
|
+
|
|
287
|
+
Args:
|
|
288
|
+
sources: List of SkillSource instances to save
|
|
289
|
+
|
|
290
|
+
Behavior:
|
|
291
|
+
- Creates parent directory if needed
|
|
292
|
+
- Writes YAML atomically
|
|
293
|
+
- Validates sources before saving
|
|
294
|
+
- Logs save operation
|
|
295
|
+
|
|
296
|
+
Raises:
|
|
297
|
+
ValueError: If sources list is empty
|
|
298
|
+
Exception: If file write fails
|
|
299
|
+
|
|
300
|
+
Example:
|
|
301
|
+
>>> config = SkillSourceConfiguration()
|
|
302
|
+
>>> sources = [SkillSource(id="custom", type="git", url="...")]
|
|
303
|
+
>>> config.save(sources)
|
|
304
|
+
"""
|
|
305
|
+
if not sources:
|
|
306
|
+
raise ValueError("Cannot save empty sources list")
|
|
307
|
+
|
|
308
|
+
# Validate all sources before saving
|
|
309
|
+
for source in sources:
|
|
310
|
+
errors = source.validate()
|
|
311
|
+
if errors:
|
|
312
|
+
raise ValueError(
|
|
313
|
+
f"Cannot save invalid source '{source.id}': {', '.join(errors)}"
|
|
314
|
+
)
|
|
315
|
+
|
|
316
|
+
# Ensure parent directory exists
|
|
317
|
+
self.config_path.parent.mkdir(parents=True, exist_ok=True)
|
|
318
|
+
|
|
319
|
+
# Build YAML data structure
|
|
320
|
+
data = {
|
|
321
|
+
"sources": [
|
|
322
|
+
{
|
|
323
|
+
"id": source.id,
|
|
324
|
+
"type": source.type,
|
|
325
|
+
"url": source.url,
|
|
326
|
+
"branch": source.branch,
|
|
327
|
+
"priority": source.priority,
|
|
328
|
+
"enabled": source.enabled,
|
|
329
|
+
}
|
|
330
|
+
for source in sources
|
|
331
|
+
]
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
try:
|
|
335
|
+
# Write atomically: write to temp file, then rename
|
|
336
|
+
temp_path = self.config_path.with_suffix(".yaml.tmp")
|
|
337
|
+
with open(temp_path, "w", encoding="utf-8") as f:
|
|
338
|
+
yaml.safe_dump(data, f, default_flow_style=False, sort_keys=False)
|
|
339
|
+
|
|
340
|
+
# Atomic rename
|
|
341
|
+
temp_path.replace(self.config_path)
|
|
342
|
+
|
|
343
|
+
self.logger.info(
|
|
344
|
+
f"Configuration saved to {self.config_path} ({len(sources)} sources)"
|
|
345
|
+
)
|
|
346
|
+
|
|
347
|
+
except Exception as e:
|
|
348
|
+
self.logger.error(
|
|
349
|
+
f"Failed to save configuration to {self.config_path}: {e}"
|
|
350
|
+
)
|
|
351
|
+
# Clean up temp file if it exists
|
|
352
|
+
if temp_path.exists():
|
|
353
|
+
temp_path.unlink()
|
|
354
|
+
raise
|
|
355
|
+
|
|
356
|
+
def add_source(self, source: SkillSource) -> None:
|
|
357
|
+
"""Add a new skill source.
|
|
358
|
+
|
|
359
|
+
Args:
|
|
360
|
+
source: SkillSource to add
|
|
361
|
+
|
|
362
|
+
Raises:
|
|
363
|
+
ValueError: If source ID already exists or priority conflicts
|
|
364
|
+
|
|
365
|
+
Example:
|
|
366
|
+
>>> config = SkillSourceConfiguration()
|
|
367
|
+
>>> source = SkillSource(id="custom", type="git", url="...")
|
|
368
|
+
>>> config.add_source(source)
|
|
369
|
+
"""
|
|
370
|
+
sources = self.load()
|
|
371
|
+
|
|
372
|
+
# Check for duplicate IDs
|
|
373
|
+
if any(s.id == source.id for s in sources):
|
|
374
|
+
raise ValueError(f"Source with ID '{source.id}' already exists")
|
|
375
|
+
|
|
376
|
+
# Check for priority conflicts (warn, don't fail)
|
|
377
|
+
conflicts = [s for s in sources if s.priority == source.priority and s.enabled]
|
|
378
|
+
if conflicts:
|
|
379
|
+
self.logger.warning(
|
|
380
|
+
f"Priority {source.priority} conflicts with existing sources: "
|
|
381
|
+
f"{', '.join(s.id for s in conflicts)}"
|
|
382
|
+
)
|
|
383
|
+
|
|
384
|
+
sources.append(source)
|
|
385
|
+
self.save(sources)
|
|
386
|
+
self.logger.info(f"Added skill source: {source.id}")
|
|
387
|
+
|
|
388
|
+
def remove_source(self, source_id: str) -> bool:
|
|
389
|
+
"""Remove a skill source by ID.
|
|
390
|
+
|
|
391
|
+
Args:
|
|
392
|
+
source_id: ID of source to remove
|
|
393
|
+
|
|
394
|
+
Returns:
|
|
395
|
+
True if source was removed, False if not found
|
|
396
|
+
|
|
397
|
+
Example:
|
|
398
|
+
>>> config = SkillSourceConfiguration()
|
|
399
|
+
>>> removed = config.remove_source("custom")
|
|
400
|
+
>>> print(removed)
|
|
401
|
+
True
|
|
402
|
+
"""
|
|
403
|
+
sources = self.load()
|
|
404
|
+
initial_count = len(sources)
|
|
405
|
+
|
|
406
|
+
sources = [s for s in sources if s.id != source_id]
|
|
407
|
+
|
|
408
|
+
if len(sources) == initial_count:
|
|
409
|
+
self.logger.warning(f"Source not found: {source_id}")
|
|
410
|
+
return False
|
|
411
|
+
|
|
412
|
+
self.save(sources)
|
|
413
|
+
self.logger.info(f"Removed skill source: {source_id}")
|
|
414
|
+
return True
|
|
415
|
+
|
|
416
|
+
def get_source(self, source_id: str) -> Optional[SkillSource]:
|
|
417
|
+
"""Get a specific skill source by ID.
|
|
418
|
+
|
|
419
|
+
Args:
|
|
420
|
+
source_id: ID of source to retrieve
|
|
421
|
+
|
|
422
|
+
Returns:
|
|
423
|
+
SkillSource if found, None otherwise
|
|
424
|
+
|
|
425
|
+
Example:
|
|
426
|
+
>>> config = SkillSourceConfiguration()
|
|
427
|
+
>>> source = config.get_source("system")
|
|
428
|
+
>>> if source:
|
|
429
|
+
... print(source.url)
|
|
430
|
+
"""
|
|
431
|
+
sources = self.load()
|
|
432
|
+
for source in sources:
|
|
433
|
+
if source.id == source_id:
|
|
434
|
+
return source
|
|
435
|
+
return None
|
|
436
|
+
|
|
437
|
+
def update_source(self, source_id: str, **updates) -> None:
|
|
438
|
+
"""Update an existing skill source.
|
|
439
|
+
|
|
440
|
+
Args:
|
|
441
|
+
source_id: ID of source to update
|
|
442
|
+
**updates: Fields to update (url, branch, priority, enabled)
|
|
443
|
+
|
|
444
|
+
Raises:
|
|
445
|
+
ValueError: If source not found or updates are invalid
|
|
446
|
+
|
|
447
|
+
Example:
|
|
448
|
+
>>> config = SkillSourceConfiguration()
|
|
449
|
+
>>> config.update_source("custom", enabled=False, priority=200)
|
|
450
|
+
"""
|
|
451
|
+
sources = self.load()
|
|
452
|
+
|
|
453
|
+
# Find source to update
|
|
454
|
+
source_index = None
|
|
455
|
+
for i, source in enumerate(sources):
|
|
456
|
+
if source.id == source_id:
|
|
457
|
+
source_index = i
|
|
458
|
+
break
|
|
459
|
+
|
|
460
|
+
if source_index is None:
|
|
461
|
+
raise ValueError(f"Source not found: {source_id}")
|
|
462
|
+
|
|
463
|
+
# Apply updates
|
|
464
|
+
source = sources[source_index]
|
|
465
|
+
for key, value in updates.items():
|
|
466
|
+
if hasattr(source, key):
|
|
467
|
+
setattr(source, key, value)
|
|
468
|
+
else:
|
|
469
|
+
raise ValueError(f"Invalid update field: {key}")
|
|
470
|
+
|
|
471
|
+
# Validate updated source
|
|
472
|
+
errors = source.validate()
|
|
473
|
+
if errors:
|
|
474
|
+
raise ValueError(
|
|
475
|
+
f"Invalid updates for source '{source_id}': {', '.join(errors)}"
|
|
476
|
+
)
|
|
477
|
+
|
|
478
|
+
self.save(sources)
|
|
479
|
+
self.logger.info(f"Updated skill source: {source_id}")
|
|
480
|
+
|
|
481
|
+
def get_enabled_sources(self) -> List[SkillSource]:
|
|
482
|
+
"""Get all enabled skill sources sorted by priority.
|
|
483
|
+
|
|
484
|
+
Returns:
|
|
485
|
+
List of enabled SkillSource instances, sorted by priority (ascending)
|
|
486
|
+
|
|
487
|
+
Priority Order:
|
|
488
|
+
Lower priority number = higher precedence
|
|
489
|
+
Priority 0 (system) comes first
|
|
490
|
+
|
|
491
|
+
Example:
|
|
492
|
+
>>> config = SkillSourceConfiguration()
|
|
493
|
+
>>> sources = config.get_enabled_sources()
|
|
494
|
+
>>> for source in sources:
|
|
495
|
+
... print(f"{source.id} (priority: {source.priority})")
|
|
496
|
+
"""
|
|
497
|
+
sources = self.load()
|
|
498
|
+
enabled = [s for s in sources if s.enabled]
|
|
499
|
+
return sorted(enabled, key=lambda s: s.priority)
|
|
500
|
+
|
|
501
|
+
def validate_priority_conflicts(self) -> List[str]:
|
|
502
|
+
"""Check for priority conflicts between sources.
|
|
503
|
+
|
|
504
|
+
Returns:
|
|
505
|
+
List of warning messages about priority conflicts
|
|
506
|
+
|
|
507
|
+
Behavior:
|
|
508
|
+
- Conflicts occur when multiple enabled sources have same priority
|
|
509
|
+
- Returns warning messages, not errors (conflicts are allowed)
|
|
510
|
+
|
|
511
|
+
Example:
|
|
512
|
+
>>> config = SkillSourceConfiguration()
|
|
513
|
+
>>> warnings = config.validate_priority_conflicts()
|
|
514
|
+
>>> for warning in warnings:
|
|
515
|
+
... print(warning)
|
|
516
|
+
"""
|
|
517
|
+
sources = self.load()
|
|
518
|
+
enabled = [s for s in sources if s.enabled]
|
|
519
|
+
|
|
520
|
+
warnings = []
|
|
521
|
+
priorities = {}
|
|
522
|
+
|
|
523
|
+
for source in enabled:
|
|
524
|
+
if source.priority in priorities:
|
|
525
|
+
priorities[source.priority].append(source.id)
|
|
526
|
+
else:
|
|
527
|
+
priorities[source.priority] = [source.id]
|
|
528
|
+
|
|
529
|
+
for priority, source_ids in priorities.items():
|
|
530
|
+
if len(source_ids) > 1:
|
|
531
|
+
warnings.append(
|
|
532
|
+
f"Priority {priority} used by multiple sources: {', '.join(source_ids)}"
|
|
533
|
+
)
|
|
534
|
+
|
|
535
|
+
return warnings
|
|
536
|
+
|
|
537
|
+
def _get_default_sources(self) -> List[SkillSource]:
|
|
538
|
+
"""Get default skill sources (system + official Anthropic).
|
|
539
|
+
|
|
540
|
+
Returns:
|
|
541
|
+
List of default SkillSource instances
|
|
542
|
+
|
|
543
|
+
Design Decision: Multiple default sources
|
|
544
|
+
|
|
545
|
+
Rationale: Provide users with both curated system skills and official
|
|
546
|
+
Anthropic skills out-of-the-box. System repo maintains highest priority
|
|
547
|
+
for custom/override capabilities.
|
|
548
|
+
|
|
549
|
+
Default Sources:
|
|
550
|
+
1. System repo (priority 0): bobmatnyc/claude-mpm-skills
|
|
551
|
+
2. Anthropic repo (priority 1): anthropics/skills
|
|
552
|
+
"""
|
|
553
|
+
return [
|
|
554
|
+
SkillSource(
|
|
555
|
+
id="system",
|
|
556
|
+
type="git",
|
|
557
|
+
url="https://github.com/bobmatnyc/claude-mpm-skills",
|
|
558
|
+
branch="main",
|
|
559
|
+
priority=0,
|
|
560
|
+
enabled=True,
|
|
561
|
+
),
|
|
562
|
+
SkillSource(
|
|
563
|
+
id="anthropic-official",
|
|
564
|
+
type="git",
|
|
565
|
+
url="https://github.com/anthropics/skills",
|
|
566
|
+
branch="main",
|
|
567
|
+
priority=1,
|
|
568
|
+
enabled=True,
|
|
569
|
+
),
|
|
570
|
+
]
|
|
571
|
+
|
|
572
|
+
def _get_default_system_source(self) -> SkillSource:
|
|
573
|
+
"""Get default system skill source (legacy method).
|
|
574
|
+
|
|
575
|
+
Returns:
|
|
576
|
+
SkillSource for system repository
|
|
577
|
+
|
|
578
|
+
Note: Deprecated in favor of _get_default_sources() which includes
|
|
579
|
+
both system and Anthropic sources. Kept for backward compatibility.
|
|
580
|
+
"""
|
|
581
|
+
return self._get_default_sources()[0]
|
|
582
|
+
|
|
583
|
+
def __repr__(self) -> str:
|
|
584
|
+
"""Return string representation of configuration."""
|
|
585
|
+
sources = self.load()
|
|
586
|
+
enabled_count = len([s for s in sources if s.enabled])
|
|
587
|
+
return (
|
|
588
|
+
f"SkillSourceConfiguration(path='{self.config_path}', "
|
|
589
|
+
f"sources={len(sources)}, enabled={enabled_count})"
|
|
590
|
+
)
|
|
@@ -186,7 +186,7 @@ class ConfigManager:
|
|
|
186
186
|
def detect_environment(self) -> str:
|
|
187
187
|
"""Detect the current deployment environment."""
|
|
188
188
|
# Check for Docker
|
|
189
|
-
if
|
|
189
|
+
if Path("/.dockerenv").exists() or os.getenv("DOCKER_CONTAINER"):
|
|
190
190
|
return "docker"
|
|
191
191
|
|
|
192
192
|
# Check for production indicators
|
|
@@ -249,7 +249,7 @@ class ConfigManager:
|
|
|
249
249
|
for config_path in self.config_search_paths:
|
|
250
250
|
if config_path.exists():
|
|
251
251
|
try:
|
|
252
|
-
with open(
|
|
252
|
+
with config_path.open() as f:
|
|
253
253
|
return json.load(f)
|
|
254
254
|
except Exception as e:
|
|
255
255
|
print(f"Warning: Failed to load config from {config_path}: {e}")
|
|
@@ -267,7 +267,7 @@ class ConfigManager:
|
|
|
267
267
|
path = config_dir / self.config_file_name
|
|
268
268
|
|
|
269
269
|
try:
|
|
270
|
-
with open(
|
|
270
|
+
with path.open("w") as f:
|
|
271
271
|
json.dump(config.to_dict(), f, indent=2)
|
|
272
272
|
return True
|
|
273
273
|
except Exception as e:
|
claude_mpm/constants.py
CHANGED
|
@@ -44,6 +44,8 @@ class CLICommands(str, Enum):
|
|
|
44
44
|
MCP = "mcp"
|
|
45
45
|
DOCTOR = "doctor"
|
|
46
46
|
DASHBOARD = "dashboard"
|
|
47
|
+
UPGRADE = "upgrade"
|
|
48
|
+
SKILLS = "skills"
|
|
47
49
|
|
|
48
50
|
def with_prefix(self, prefix: CLIPrefix = CLIPrefix.MPM) -> str:
|
|
49
51
|
"""Get command with prefix."""
|
|
@@ -140,6 +142,7 @@ class MCPCommands(str, Enum):
|
|
|
140
142
|
TEST = "test"
|
|
141
143
|
CONFIG = "config"
|
|
142
144
|
SERVER = "server"
|
|
145
|
+
EXTERNAL = "external"
|
|
143
146
|
|
|
144
147
|
|
|
145
148
|
class TicketCommands(str, Enum):
|
|
@@ -156,6 +159,30 @@ class TicketCommands(str, Enum):
|
|
|
156
159
|
WORKFLOW = "workflow"
|
|
157
160
|
|
|
158
161
|
|
|
162
|
+
class SkillsCommands(str, Enum):
|
|
163
|
+
"""Skills subcommand constants."""
|
|
164
|
+
|
|
165
|
+
LIST = "list"
|
|
166
|
+
DEPLOY = "deploy"
|
|
167
|
+
VALIDATE = "validate"
|
|
168
|
+
UPDATE = "update"
|
|
169
|
+
INFO = "info"
|
|
170
|
+
CONFIG = "config"
|
|
171
|
+
CONFIGURE = "configure" # Interactive skills selection (like agents configure)
|
|
172
|
+
# GitHub deployment commands
|
|
173
|
+
DEPLOY_FROM_GITHUB = "deploy-github"
|
|
174
|
+
LIST_AVAILABLE = "list-available"
|
|
175
|
+
CHECK_DEPLOYED = "check-deployed"
|
|
176
|
+
REMOVE = "remove"
|
|
177
|
+
# Collection management commands
|
|
178
|
+
COLLECTION_LIST = "collection-list"
|
|
179
|
+
COLLECTION_ADD = "collection-add"
|
|
180
|
+
COLLECTION_REMOVE = "collection-remove"
|
|
181
|
+
COLLECTION_ENABLE = "collection-enable"
|
|
182
|
+
COLLECTION_DISABLE = "collection-disable"
|
|
183
|
+
COLLECTION_SET_DEFAULT = "collection-set-default"
|
|
184
|
+
|
|
185
|
+
|
|
159
186
|
class CLIFlags(str, Enum):
|
|
160
187
|
"""CLI flag constants (without prefix)."""
|
|
161
188
|
|
|
@@ -229,7 +256,7 @@ class Paths(str, Enum):
|
|
|
229
256
|
|
|
230
257
|
CLAUDE_AGENTS_DIR = ".claude/agents"
|
|
231
258
|
CLAUDE_CONFIG_DIR = ".claude"
|
|
232
|
-
MPM_LOG_DIR = "logs/mpm"
|
|
259
|
+
MPM_LOG_DIR = ".claude-mpm/logs/mpm"
|
|
233
260
|
MPM_SESSION_DIR = ".claude-mpm/session"
|
|
234
261
|
MPM_PROMPTS_DIR = ".claude-mpm/prompts"
|
|
235
262
|
|