claude-mpm 4.7.4__py3-none-any.whl → 4.18.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_AGENT_TEMPLATE.md +118 -0
- claude_mpm/agents/BASE_ENGINEER.md +286 -0
- claude_mpm/agents/BASE_PM.md +106 -1
- claude_mpm/agents/OUTPUT_STYLE.md +329 -11
- claude_mpm/agents/PM_INSTRUCTIONS.md +397 -459
- claude_mpm/agents/agent_loader.py +17 -5
- claude_mpm/agents/frontmatter_validator.py +284 -253
- claude_mpm/agents/templates/README.md +465 -0
- claude_mpm/agents/templates/agent-manager.json +4 -1
- claude_mpm/agents/templates/agentic-coder-optimizer.json +13 -3
- claude_mpm/agents/templates/api_qa.json +11 -2
- claude_mpm/agents/templates/circuit_breakers.md +638 -0
- claude_mpm/agents/templates/clerk-ops.json +12 -2
- claude_mpm/agents/templates/code_analyzer.json +8 -2
- claude_mpm/agents/templates/content-agent.json +358 -0
- claude_mpm/agents/templates/dart_engineer.json +15 -2
- claude_mpm/agents/templates/data_engineer.json +15 -2
- claude_mpm/agents/templates/documentation.json +10 -2
- claude_mpm/agents/templates/engineer.json +21 -1
- claude_mpm/agents/templates/gcp_ops_agent.json +12 -2
- claude_mpm/agents/templates/git_file_tracking.md +584 -0
- claude_mpm/agents/templates/golang_engineer.json +270 -0
- claude_mpm/agents/templates/imagemagick.json +4 -1
- claude_mpm/agents/templates/java_engineer.json +346 -0
- claude_mpm/agents/templates/local_ops_agent.json +1227 -6
- claude_mpm/agents/templates/memory_manager.json +4 -1
- claude_mpm/agents/templates/nextjs_engineer.json +141 -133
- claude_mpm/agents/templates/ops.json +12 -2
- claude_mpm/agents/templates/php-engineer.json +270 -174
- claude_mpm/agents/templates/pm_examples.md +474 -0
- claude_mpm/agents/templates/pm_red_flags.md +240 -0
- claude_mpm/agents/templates/product_owner.json +338 -0
- claude_mpm/agents/templates/project_organizer.json +14 -4
- claude_mpm/agents/templates/prompt-engineer.json +13 -2
- claude_mpm/agents/templates/python_engineer.json +174 -81
- claude_mpm/agents/templates/qa.json +11 -2
- claude_mpm/agents/templates/react_engineer.json +16 -3
- claude_mpm/agents/templates/refactoring_engineer.json +12 -2
- claude_mpm/agents/templates/research.json +34 -21
- claude_mpm/agents/templates/response_format.md +583 -0
- claude_mpm/agents/templates/ruby-engineer.json +129 -192
- claude_mpm/agents/templates/rust_engineer.json +270 -0
- claude_mpm/agents/templates/security.json +10 -2
- claude_mpm/agents/templates/svelte-engineer.json +225 -0
- claude_mpm/agents/templates/ticketing.json +10 -2
- claude_mpm/agents/templates/typescript_engineer.json +116 -125
- claude_mpm/agents/templates/validation_templates.md +312 -0
- claude_mpm/agents/templates/vercel_ops_agent.json +12 -2
- claude_mpm/agents/templates/version_control.json +12 -2
- claude_mpm/agents/templates/web_qa.json +11 -2
- claude_mpm/agents/templates/web_ui.json +15 -2
- claude_mpm/cli/__init__.py +34 -614
- claude_mpm/cli/commands/agent_manager.py +25 -12
- claude_mpm/cli/commands/agent_state_manager.py +186 -0
- claude_mpm/cli/commands/agents.py +235 -148
- claude_mpm/cli/commands/agents_detect.py +380 -0
- claude_mpm/cli/commands/agents_recommend.py +309 -0
- claude_mpm/cli/commands/aggregate.py +7 -3
- claude_mpm/cli/commands/analyze.py +9 -4
- claude_mpm/cli/commands/analyze_code.py +7 -2
- claude_mpm/cli/commands/auto_configure.py +570 -0
- claude_mpm/cli/commands/config.py +47 -13
- claude_mpm/cli/commands/configure.py +419 -1571
- claude_mpm/cli/commands/configure_agent_display.py +261 -0
- claude_mpm/cli/commands/configure_behavior_manager.py +204 -0
- claude_mpm/cli/commands/configure_hook_manager.py +225 -0
- claude_mpm/cli/commands/configure_models.py +18 -0
- claude_mpm/cli/commands/configure_navigation.py +167 -0
- claude_mpm/cli/commands/configure_paths.py +104 -0
- claude_mpm/cli/commands/configure_persistence.py +254 -0
- claude_mpm/cli/commands/configure_startup_manager.py +646 -0
- claude_mpm/cli/commands/configure_template_editor.py +497 -0
- claude_mpm/cli/commands/configure_validators.py +73 -0
- claude_mpm/cli/commands/local_deploy.py +537 -0
- claude_mpm/cli/commands/memory.py +54 -20
- claude_mpm/cli/commands/mpm_init.py +585 -196
- claude_mpm/cli/commands/mpm_init_handler.py +37 -3
- claude_mpm/cli/commands/search.py +170 -4
- claude_mpm/cli/commands/upgrade.py +152 -0
- claude_mpm/cli/executor.py +202 -0
- claude_mpm/cli/helpers.py +105 -0
- claude_mpm/cli/interactive/__init__.py +3 -0
- claude_mpm/cli/interactive/skills_wizard.py +491 -0
- claude_mpm/cli/parsers/__init__.py +7 -1
- claude_mpm/cli/parsers/agents_parser.py +9 -0
- claude_mpm/cli/parsers/auto_configure_parser.py +245 -0
- claude_mpm/cli/parsers/base_parser.py +110 -3
- claude_mpm/cli/parsers/local_deploy_parser.py +227 -0
- claude_mpm/cli/parsers/mpm_init_parser.py +65 -5
- claude_mpm/cli/shared/output_formatters.py +28 -19
- claude_mpm/cli/startup.py +481 -0
- claude_mpm/cli/utils.py +52 -1
- claude_mpm/commands/mpm-agents-detect.md +168 -0
- claude_mpm/commands/mpm-agents-recommend.md +214 -0
- claude_mpm/commands/mpm-agents.md +75 -1
- claude_mpm/commands/mpm-auto-configure.md +217 -0
- claude_mpm/commands/mpm-help.md +163 -0
- claude_mpm/commands/mpm-init.md +148 -3
- claude_mpm/commands/mpm-version.md +113 -0
- claude_mpm/commands/mpm.md +1 -0
- claude_mpm/config/agent_config.py +2 -2
- claude_mpm/config/model_config.py +428 -0
- claude_mpm/constants.py +1 -0
- claude_mpm/core/base_service.py +13 -12
- claude_mpm/core/enums.py +452 -0
- claude_mpm/core/factories.py +1 -1
- claude_mpm/core/instruction_reinforcement_hook.py +2 -1
- claude_mpm/core/interactive_session.py +9 -3
- claude_mpm/core/log_manager.py +2 -0
- claude_mpm/core/logging_config.py +6 -2
- claude_mpm/core/oneshot_session.py +8 -4
- claude_mpm/core/optimized_agent_loader.py +3 -3
- claude_mpm/core/output_style_manager.py +12 -192
- claude_mpm/core/service_registry.py +5 -1
- claude_mpm/core/types.py +2 -9
- claude_mpm/core/typing_utils.py +7 -6
- claude_mpm/dashboard/static/js/dashboard.js +0 -14
- claude_mpm/dashboard/templates/index.html +3 -41
- claude_mpm/hooks/__init__.py +20 -0
- claude_mpm/hooks/claude_hooks/event_handlers.py +4 -2
- claude_mpm/hooks/claude_hooks/response_tracking.py +35 -1
- claude_mpm/hooks/claude_hooks/services/connection_manager_http.py +23 -2
- claude_mpm/hooks/failure_learning/__init__.py +60 -0
- claude_mpm/hooks/failure_learning/failure_detection_hook.py +235 -0
- claude_mpm/hooks/failure_learning/fix_detection_hook.py +217 -0
- claude_mpm/hooks/failure_learning/learning_extraction_hook.py +286 -0
- claude_mpm/hooks/instruction_reinforcement.py +7 -2
- claude_mpm/hooks/kuzu_enrichment_hook.py +263 -0
- claude_mpm/hooks/kuzu_memory_hook.py +37 -12
- claude_mpm/hooks/kuzu_response_hook.py +183 -0
- claude_mpm/models/resume_log.py +340 -0
- claude_mpm/services/agents/__init__.py +18 -5
- claude_mpm/services/agents/auto_config_manager.py +796 -0
- claude_mpm/services/agents/deployment/agent_configuration_manager.py +1 -1
- claude_mpm/services/agents/deployment/agent_record_service.py +1 -1
- claude_mpm/services/agents/deployment/agent_validator.py +17 -1
- claude_mpm/services/agents/deployment/async_agent_deployment.py +1 -1
- claude_mpm/services/agents/deployment/interface_adapter.py +3 -2
- claude_mpm/services/agents/deployment/local_template_deployment.py +1 -1
- claude_mpm/services/agents/deployment/pipeline/steps/agent_processing_step.py +7 -6
- claude_mpm/services/agents/deployment/pipeline/steps/base_step.py +7 -16
- claude_mpm/services/agents/deployment/pipeline/steps/configuration_step.py +4 -3
- claude_mpm/services/agents/deployment/pipeline/steps/target_directory_step.py +5 -3
- claude_mpm/services/agents/deployment/pipeline/steps/validation_step.py +6 -5
- claude_mpm/services/agents/deployment/refactored_agent_deployment_service.py +9 -6
- claude_mpm/services/agents/deployment/validation/__init__.py +3 -1
- claude_mpm/services/agents/deployment/validation/validation_result.py +1 -9
- claude_mpm/services/agents/local_template_manager.py +1 -1
- claude_mpm/services/agents/memory/agent_memory_manager.py +5 -2
- claude_mpm/services/agents/observers.py +547 -0
- claude_mpm/services/agents/recommender.py +568 -0
- claude_mpm/services/agents/registry/modification_tracker.py +5 -2
- claude_mpm/services/command_handler_service.py +11 -5
- claude_mpm/services/core/__init__.py +33 -1
- claude_mpm/services/core/interfaces/__init__.py +90 -3
- claude_mpm/services/core/interfaces/agent.py +184 -0
- claude_mpm/services/core/interfaces/health.py +172 -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/memory_manager.py +11 -24
- claude_mpm/services/core/models/__init__.py +79 -0
- claude_mpm/services/core/models/agent_config.py +381 -0
- claude_mpm/services/core/models/health.py +162 -0
- claude_mpm/services/core/models/process.py +235 -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 +23 -7
- claude_mpm/services/diagnostics/__init__.py +2 -2
- claude_mpm/services/diagnostics/checks/agent_check.py +25 -24
- claude_mpm/services/diagnostics/checks/claude_code_check.py +24 -23
- claude_mpm/services/diagnostics/checks/common_issues_check.py +25 -24
- claude_mpm/services/diagnostics/checks/configuration_check.py +24 -23
- claude_mpm/services/diagnostics/checks/filesystem_check.py +18 -17
- claude_mpm/services/diagnostics/checks/installation_check.py +30 -29
- claude_mpm/services/diagnostics/checks/instructions_check.py +20 -19
- claude_mpm/services/diagnostics/checks/mcp_check.py +50 -36
- claude_mpm/services/diagnostics/checks/mcp_services_check.py +38 -33
- claude_mpm/services/diagnostics/checks/monitor_check.py +23 -22
- claude_mpm/services/diagnostics/checks/startup_log_check.py +9 -8
- claude_mpm/services/diagnostics/diagnostic_runner.py +6 -5
- claude_mpm/services/diagnostics/doctor_reporter.py +28 -25
- claude_mpm/services/diagnostics/models.py +19 -24
- claude_mpm/services/infrastructure/monitoring/__init__.py +1 -1
- claude_mpm/services/infrastructure/monitoring/aggregator.py +12 -12
- claude_mpm/services/infrastructure/monitoring/base.py +5 -13
- claude_mpm/services/infrastructure/monitoring/network.py +7 -6
- claude_mpm/services/infrastructure/monitoring/process.py +13 -12
- claude_mpm/services/infrastructure/monitoring/resources.py +7 -6
- claude_mpm/services/infrastructure/monitoring/service.py +16 -15
- claude_mpm/services/infrastructure/resume_log_generator.py +439 -0
- claude_mpm/services/local_ops/__init__.py +163 -0
- claude_mpm/services/local_ops/crash_detector.py +257 -0
- claude_mpm/services/local_ops/health_checks/__init__.py +28 -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 +430 -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 +9 -4
- claude_mpm/services/mcp_gateway/core/__init__.py +1 -2
- claude_mpm/services/mcp_gateway/core/base.py +18 -31
- claude_mpm/services/mcp_gateway/main.py +30 -0
- claude_mpm/services/mcp_gateway/tools/external_mcp_services.py +206 -32
- claude_mpm/services/mcp_gateway/tools/health_check_tool.py +30 -28
- claude_mpm/services/mcp_gateway/tools/kuzu_memory_service.py +25 -5
- claude_mpm/services/mcp_service_verifier.py +1 -1
- claude_mpm/services/memory/failure_tracker.py +563 -0
- 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 +453 -0
- claude_mpm/services/model/ollama_provider.py +415 -0
- claude_mpm/services/monitor/daemon_manager.py +3 -2
- claude_mpm/services/monitor/handlers/dashboard.py +2 -1
- claude_mpm/services/monitor/handlers/hooks.py +2 -1
- claude_mpm/services/monitor/management/lifecycle.py +3 -2
- claude_mpm/services/monitor/server.py +2 -1
- claude_mpm/services/project/__init__.py +23 -0
- claude_mpm/services/project/detection_strategies.py +719 -0
- claude_mpm/services/project/toolchain_analyzer.py +581 -0
- claude_mpm/services/self_upgrade_service.py +342 -0
- claude_mpm/services/session_management_service.py +3 -2
- claude_mpm/services/session_manager.py +205 -1
- claude_mpm/services/shared/async_service_base.py +16 -27
- claude_mpm/services/shared/lifecycle_service_base.py +1 -14
- claude_mpm/services/socketio/handlers/__init__.py +5 -2
- claude_mpm/services/socketio/handlers/hook.py +13 -2
- claude_mpm/services/socketio/handlers/registry.py +4 -2
- claude_mpm/services/socketio/server/main.py +10 -8
- claude_mpm/services/subprocess_launcher_service.py +14 -5
- claude_mpm/services/unified/analyzer_strategies/code_analyzer.py +8 -7
- claude_mpm/services/unified/analyzer_strategies/dependency_analyzer.py +6 -5
- claude_mpm/services/unified/analyzer_strategies/performance_analyzer.py +8 -7
- claude_mpm/services/unified/analyzer_strategies/security_analyzer.py +7 -6
- claude_mpm/services/unified/analyzer_strategies/structure_analyzer.py +5 -4
- claude_mpm/services/unified/config_strategies/validation_strategy.py +13 -9
- claude_mpm/services/unified/deployment_strategies/cloud_strategies.py +10 -3
- claude_mpm/services/unified/deployment_strategies/local.py +6 -5
- claude_mpm/services/unified/deployment_strategies/utils.py +6 -5
- claude_mpm/services/unified/deployment_strategies/vercel.py +7 -6
- claude_mpm/services/unified/interfaces.py +3 -1
- claude_mpm/services/unified/unified_analyzer.py +14 -10
- claude_mpm/services/unified/unified_config.py +2 -1
- claude_mpm/services/unified/unified_deployment.py +9 -4
- claude_mpm/services/version_service.py +104 -1
- claude_mpm/skills/__init__.py +21 -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/json-data-handling.md +223 -0
- claude_mpm/skills/bundled/nextjs-local-dev.md +807 -0
- claude_mpm/skills/bundled/pdf.md +141 -0
- claude_mpm/skills/bundled/performance-profiling.md +567 -0
- claude_mpm/skills/bundled/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/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/storage/state_storage.py +15 -15
- claude_mpm/tools/code_tree_analyzer.py +177 -141
- claude_mpm/tools/code_tree_events.py +4 -2
- claude_mpm/utils/agent_dependency_loader.py +40 -20
- claude_mpm/utils/display_helper.py +260 -0
- claude_mpm/utils/git_analyzer.py +407 -0
- claude_mpm/utils/robust_installer.py +73 -19
- {claude_mpm-4.7.4.dist-info → claude_mpm-4.18.2.dist-info}/METADATA +129 -12
- {claude_mpm-4.7.4.dist-info → claude_mpm-4.18.2.dist-info}/RECORD +295 -193
- claude_mpm/dashboard/static/css/code-tree.css +0 -1639
- claude_mpm/dashboard/static/index-hub-backup.html +0 -713
- claude_mpm/dashboard/static/js/components/code-tree/tree-breadcrumb.js +0 -353
- claude_mpm/dashboard/static/js/components/code-tree/tree-constants.js +0 -235
- claude_mpm/dashboard/static/js/components/code-tree/tree-search.js +0 -409
- claude_mpm/dashboard/static/js/components/code-tree/tree-utils.js +0 -435
- claude_mpm/dashboard/static/js/components/code-tree.js +0 -5869
- claude_mpm/dashboard/static/js/components/code-viewer.js +0 -1386
- claude_mpm/hooks/claude_hooks/hook_handler_eventbus.py +0 -425
- claude_mpm/hooks/claude_hooks/hook_handler_original.py +0 -1041
- claude_mpm/hooks/claude_hooks/hook_handler_refactored.py +0 -347
- claude_mpm/services/agents/deployment/agent_lifecycle_manager_refactored.py +0 -575
- claude_mpm/services/project/analyzer_refactored.py +0 -450
- {claude_mpm-4.7.4.dist-info → claude_mpm-4.18.2.dist-info}/WHEEL +0 -0
- {claude_mpm-4.7.4.dist-info → claude_mpm-4.18.2.dist-info}/entry_points.txt +0 -0
- {claude_mpm-4.7.4.dist-info → claude_mpm-4.18.2.dist-info}/licenses/LICENSE +0 -0
- {claude_mpm-4.7.4.dist-info → claude_mpm-4.18.2.dist-info}/top_level.txt +0 -0
|
@@ -13,6 +13,7 @@ from enum import Enum
|
|
|
13
13
|
from pathlib import Path
|
|
14
14
|
from typing import Any, Callable, Dict, List, Optional, Pattern, Union
|
|
15
15
|
|
|
16
|
+
from claude_mpm.core.enums import ValidationSeverity
|
|
16
17
|
from claude_mpm.core.logging_utils import get_logger
|
|
17
18
|
|
|
18
19
|
from .unified_config_service import IConfigStrategy
|
|
@@ -45,7 +46,7 @@ class ValidationRule:
|
|
|
45
46
|
type: ValidationType
|
|
46
47
|
params: Dict[str, Any] = field(default_factory=dict)
|
|
47
48
|
message: Optional[str] = None
|
|
48
|
-
severity: str =
|
|
49
|
+
severity: str = ValidationSeverity.ERROR
|
|
49
50
|
condition: Optional[Callable] = None
|
|
50
51
|
|
|
51
52
|
|
|
@@ -73,15 +74,18 @@ class BaseValidator(ABC):
|
|
|
73
74
|
"""Perform validation"""
|
|
74
75
|
|
|
75
76
|
def _create_result(
|
|
76
|
-
self,
|
|
77
|
+
self,
|
|
78
|
+
valid: bool,
|
|
79
|
+
message: Optional[str] = None,
|
|
80
|
+
severity: str = ValidationSeverity.ERROR,
|
|
77
81
|
) -> ValidationResult:
|
|
78
82
|
"""Create validation result"""
|
|
79
83
|
result = ValidationResult(valid=valid)
|
|
80
84
|
|
|
81
85
|
if not valid and message:
|
|
82
|
-
if severity ==
|
|
86
|
+
if severity == ValidationSeverity.ERROR:
|
|
83
87
|
result.errors.append(message)
|
|
84
|
-
elif severity ==
|
|
88
|
+
elif severity == ValidationSeverity.WARNING:
|
|
85
89
|
result.warnings.append(message)
|
|
86
90
|
else:
|
|
87
91
|
result.info.append(message)
|
|
@@ -556,9 +560,9 @@ class DependencyValidator(BaseValidator):
|
|
|
556
560
|
if errors:
|
|
557
561
|
result = ValidationResult(valid=False)
|
|
558
562
|
for error in errors:
|
|
559
|
-
if rule.severity ==
|
|
563
|
+
if rule.severity == ValidationSeverity.ERROR:
|
|
560
564
|
result.errors.append(error)
|
|
561
|
-
elif rule.severity ==
|
|
565
|
+
elif rule.severity == ValidationSeverity.WARNING:
|
|
562
566
|
result.warnings.append(error)
|
|
563
567
|
else:
|
|
564
568
|
result.info.append(error)
|
|
@@ -721,7 +725,7 @@ class ConditionalValidator(BaseValidator):
|
|
|
721
725
|
type=ValidationType[rule_def.get("type", "CUSTOM").upper()],
|
|
722
726
|
params=rule_def.get("params", {}),
|
|
723
727
|
message=rule_def.get("message"),
|
|
724
|
-
severity=rule_def.get("severity",
|
|
728
|
+
severity=rule_def.get("severity", ValidationSeverity.ERROR),
|
|
725
729
|
)
|
|
726
730
|
|
|
727
731
|
# Find appropriate validator
|
|
@@ -843,9 +847,9 @@ class CrossFieldValidator(BaseValidator):
|
|
|
843
847
|
for constraint in constraints:
|
|
844
848
|
if not self._evaluate_constraint(config, constraint):
|
|
845
849
|
message = constraint.get("message", "Cross-field constraint failed")
|
|
846
|
-
if rule.severity ==
|
|
850
|
+
if rule.severity == ValidationSeverity.ERROR:
|
|
847
851
|
result.errors.append(message)
|
|
848
|
-
elif rule.severity ==
|
|
852
|
+
elif rule.severity == ValidationSeverity.WARNING:
|
|
849
853
|
result.warnings.append(message)
|
|
850
854
|
else:
|
|
851
855
|
result.info.append(message)
|
|
@@ -12,6 +12,7 @@ from datetime import datetime, timezone
|
|
|
12
12
|
from pathlib import Path
|
|
13
13
|
from typing import Any, Dict, List
|
|
14
14
|
|
|
15
|
+
from claude_mpm.core.enums import OperationResult, ServiceState
|
|
15
16
|
from claude_mpm.core.logging_utils import get_logger
|
|
16
17
|
from claude_mpm.services.unified.strategies import StrategyMetadata, StrategyPriority
|
|
17
18
|
|
|
@@ -411,11 +412,13 @@ class DockerDeploymentStrategy(DeploymentStrategy):
|
|
|
411
412
|
def get_health_status(self, deployment_info: Dict[str, Any]) -> Dict[str, Any]:
|
|
412
413
|
"""Get Docker container health."""
|
|
413
414
|
container_id = deployment_info.get("container_id")
|
|
414
|
-
health = {"status":
|
|
415
|
+
health = {"status": OperationResult.UNKNOWN, "container_id": container_id}
|
|
415
416
|
|
|
416
417
|
if container_id:
|
|
417
418
|
health["running"] = check_docker_container(container_id)
|
|
418
|
-
health["status"] =
|
|
419
|
+
health["status"] = (
|
|
420
|
+
ServiceState.RUNNING if health["running"] else ServiceState.ERROR
|
|
421
|
+
)
|
|
419
422
|
|
|
420
423
|
return health
|
|
421
424
|
|
|
@@ -560,7 +563,11 @@ class GitDeploymentStrategy(DeploymentStrategy):
|
|
|
560
563
|
def get_health_status(self, deployment_info: Dict[str, Any]) -> Dict[str, Any]:
|
|
561
564
|
"""Get Git deployment health."""
|
|
562
565
|
return {
|
|
563
|
-
"status":
|
|
566
|
+
"status": (
|
|
567
|
+
ServiceState.RUNNING
|
|
568
|
+
if deployment_info.get("commit_hash")
|
|
569
|
+
else ServiceState.ERROR
|
|
570
|
+
),
|
|
564
571
|
"commit": deployment_info.get("commit_hash", "unknown"),
|
|
565
572
|
"branch": deployment_info.get("branch", "unknown"),
|
|
566
573
|
}
|
|
@@ -19,6 +19,7 @@ from typing import Any, Dict, List, Optional
|
|
|
19
19
|
|
|
20
20
|
import yaml
|
|
21
21
|
|
|
22
|
+
from claude_mpm.core.enums import HealthStatus, OperationResult
|
|
22
23
|
from claude_mpm.core.logging_utils import get_logger
|
|
23
24
|
from claude_mpm.services.unified.strategies import StrategyMetadata, StrategyPriority
|
|
24
25
|
|
|
@@ -272,14 +273,14 @@ class LocalDeploymentStrategy(DeploymentStrategy):
|
|
|
272
273
|
deployed_path = Path(deployment_info.get("deployed_path", ""))
|
|
273
274
|
|
|
274
275
|
health = {
|
|
275
|
-
"status":
|
|
276
|
+
"status": OperationResult.UNKNOWN,
|
|
276
277
|
"deployed_path": str(deployed_path),
|
|
277
278
|
"exists": deployed_path.exists() if deployed_path else False,
|
|
278
279
|
"checks": {},
|
|
279
280
|
}
|
|
280
281
|
|
|
281
282
|
if deployed_path and deployed_path.exists():
|
|
282
|
-
health["status"] =
|
|
283
|
+
health["status"] = OperationResult.SUCCESS
|
|
283
284
|
|
|
284
285
|
# Check file integrity
|
|
285
286
|
for file_path in deployment_info.get("deployed_files", []):
|
|
@@ -288,10 +289,10 @@ class LocalDeploymentStrategy(DeploymentStrategy):
|
|
|
288
289
|
|
|
289
290
|
# Check if any file is missing
|
|
290
291
|
if any(not check for check in health["checks"].values()):
|
|
291
|
-
health["status"] =
|
|
292
|
+
health["status"] = HealthStatus.DEGRADED
|
|
292
293
|
|
|
293
294
|
else:
|
|
294
|
-
health["status"] =
|
|
295
|
+
health["status"] = HealthStatus.UNHEALTHY
|
|
295
296
|
|
|
296
297
|
return health
|
|
297
298
|
|
|
@@ -394,7 +395,7 @@ class LocalDeploymentStrategy(DeploymentStrategy):
|
|
|
394
395
|
shutil.copy2(artifact, dest)
|
|
395
396
|
deployed.append(dest)
|
|
396
397
|
|
|
397
|
-
self._logger.
|
|
398
|
+
self._logger.debug(f"Deployed agent: {dest}")
|
|
398
399
|
|
|
399
400
|
return deployed
|
|
400
401
|
|
|
@@ -23,6 +23,7 @@ from datetime import datetime, timezone
|
|
|
23
23
|
from pathlib import Path
|
|
24
24
|
from typing import Any, Dict, List, Optional, Tuple, Union
|
|
25
25
|
|
|
26
|
+
from claude_mpm.core.enums import HealthStatus, OperationResult
|
|
26
27
|
from claude_mpm.core.logging_utils import get_logger
|
|
27
28
|
|
|
28
29
|
logger = get_logger(__name__)
|
|
@@ -256,7 +257,7 @@ def verify_deployment_health(
|
|
|
256
257
|
Health status dictionary
|
|
257
258
|
"""
|
|
258
259
|
health = {
|
|
259
|
-
"status":
|
|
260
|
+
"status": OperationResult.UNKNOWN,
|
|
260
261
|
"timestamp": datetime.now(timezone.utc).isoformat(),
|
|
261
262
|
"checks": {},
|
|
262
263
|
"errors": [],
|
|
@@ -292,14 +293,14 @@ def verify_deployment_health(
|
|
|
292
293
|
|
|
293
294
|
# Determine overall status
|
|
294
295
|
if all(health["checks"].values()):
|
|
295
|
-
health["status"] =
|
|
296
|
+
health["status"] = HealthStatus.HEALTHY
|
|
296
297
|
elif any(health["checks"].values()):
|
|
297
|
-
health["status"] =
|
|
298
|
+
health["status"] = HealthStatus.DEGRADED
|
|
298
299
|
else:
|
|
299
|
-
health["status"] =
|
|
300
|
+
health["status"] = HealthStatus.UNHEALTHY
|
|
300
301
|
|
|
301
302
|
except Exception as e:
|
|
302
|
-
health["status"] =
|
|
303
|
+
health["status"] = HealthStatus.UNKNOWN
|
|
303
304
|
health["errors"].append(str(e))
|
|
304
305
|
|
|
305
306
|
return health
|
|
@@ -13,6 +13,7 @@ from datetime import datetime, timezone
|
|
|
13
13
|
from pathlib import Path
|
|
14
14
|
from typing import Any, Dict, List, Optional
|
|
15
15
|
|
|
16
|
+
from claude_mpm.core.enums import HealthStatus, OperationResult
|
|
16
17
|
from claude_mpm.core.logging_utils import get_logger
|
|
17
18
|
from claude_mpm.services.unified.strategies import StrategyMetadata, StrategyPriority
|
|
18
19
|
|
|
@@ -307,13 +308,13 @@ class VercelDeploymentStrategy(DeploymentStrategy):
|
|
|
307
308
|
deployment_url = deployment_info.get("deployment_url")
|
|
308
309
|
|
|
309
310
|
health = {
|
|
310
|
-
"status":
|
|
311
|
+
"status": OperationResult.UNKNOWN,
|
|
311
312
|
"deployment_url": deployment_url,
|
|
312
313
|
"checks": {},
|
|
313
314
|
}
|
|
314
315
|
|
|
315
316
|
if not deployment_url:
|
|
316
|
-
health["status"] =
|
|
317
|
+
health["status"] = HealthStatus.UNHEALTHY
|
|
317
318
|
health["error"] = "No deployment URL"
|
|
318
319
|
return health
|
|
319
320
|
|
|
@@ -341,14 +342,14 @@ class VercelDeploymentStrategy(DeploymentStrategy):
|
|
|
341
342
|
|
|
342
343
|
# Determine overall status
|
|
343
344
|
if all(health["checks"].values()):
|
|
344
|
-
health["status"] =
|
|
345
|
+
health["status"] = HealthStatus.HEALTHY
|
|
345
346
|
elif any(health["checks"].values()):
|
|
346
|
-
health["status"] =
|
|
347
|
+
health["status"] = HealthStatus.DEGRADED
|
|
347
348
|
else:
|
|
348
|
-
health["status"] =
|
|
349
|
+
health["status"] = HealthStatus.UNHEALTHY
|
|
349
350
|
|
|
350
351
|
except Exception as e:
|
|
351
|
-
health["status"] =
|
|
352
|
+
health["status"] = HealthStatus.UNHEALTHY
|
|
352
353
|
health["error"] = str(e)
|
|
353
354
|
|
|
354
355
|
return health
|
|
@@ -25,6 +25,8 @@ from enum import Enum
|
|
|
25
25
|
from pathlib import Path
|
|
26
26
|
from typing import Any, Dict, List, Optional, Set, TypeVar, Union
|
|
27
27
|
|
|
28
|
+
from claude_mpm.core.enums import ValidationSeverity
|
|
29
|
+
|
|
28
30
|
# Type variables for generic interfaces
|
|
29
31
|
T = TypeVar("T")
|
|
30
32
|
ConfigType = TypeVar("ConfigType", bound=Dict[str, Any])
|
|
@@ -88,7 +90,7 @@ class AnalysisResult:
|
|
|
88
90
|
findings: List[Dict[str, Any]] = field(default_factory=list)
|
|
89
91
|
metrics: Dict[str, Any] = field(default_factory=dict)
|
|
90
92
|
summary: str = ""
|
|
91
|
-
severity: str =
|
|
93
|
+
severity: str = ValidationSeverity.INFO
|
|
92
94
|
recommendations: List[str] = field(default_factory=list)
|
|
93
95
|
|
|
94
96
|
|
|
@@ -25,6 +25,7 @@ Features:
|
|
|
25
25
|
from pathlib import Path
|
|
26
26
|
from typing import Any, Dict, List, Optional, Union
|
|
27
27
|
|
|
28
|
+
from claude_mpm.core.enums import OperationResult, ServiceState, ValidationSeverity
|
|
28
29
|
from claude_mpm.core.logging_utils import get_logger
|
|
29
30
|
|
|
30
31
|
from .interfaces import (
|
|
@@ -134,7 +135,7 @@ class UnifiedAnalyzer(IAnalyzerService, IUnifiedService):
|
|
|
134
135
|
|
|
135
136
|
return {
|
|
136
137
|
"service": "UnifiedAnalyzer",
|
|
137
|
-
"status":
|
|
138
|
+
"status": ServiceState.RUNNING if self._initialized else ServiceState.ERROR,
|
|
138
139
|
"initialized": self._initialized,
|
|
139
140
|
"registered_strategies": len(strategies),
|
|
140
141
|
"cache_size": len(self._analysis_cache),
|
|
@@ -223,7 +224,7 @@ class UnifiedAnalyzer(IAnalyzerService, IUnifiedService):
|
|
|
223
224
|
return AnalysisResult(
|
|
224
225
|
success=False,
|
|
225
226
|
summary=f"No strategy available for analysis type: {analysis_type}",
|
|
226
|
-
severity=
|
|
227
|
+
severity=ValidationSeverity.ERROR,
|
|
227
228
|
)
|
|
228
229
|
|
|
229
230
|
# Execute analysis using strategy
|
|
@@ -236,7 +237,7 @@ class UnifiedAnalyzer(IAnalyzerService, IUnifiedService):
|
|
|
236
237
|
return AnalysisResult(
|
|
237
238
|
success=False,
|
|
238
239
|
summary=f"Validation failed: {'; '.join(validation_errors)}",
|
|
239
|
-
severity=
|
|
240
|
+
severity=ValidationSeverity.ERROR,
|
|
240
241
|
)
|
|
241
242
|
|
|
242
243
|
# Perform analysis
|
|
@@ -251,7 +252,7 @@ class UnifiedAnalyzer(IAnalyzerService, IUnifiedService):
|
|
|
251
252
|
findings=result_data.get("findings", []),
|
|
252
253
|
metrics=metrics,
|
|
253
254
|
summary=result_data.get("summary", "Analysis completed"),
|
|
254
|
-
severity=result_data.get("severity",
|
|
255
|
+
severity=result_data.get("severity", ValidationSeverity.INFO),
|
|
255
256
|
recommendations=result_data.get("recommendations", []),
|
|
256
257
|
)
|
|
257
258
|
|
|
@@ -343,8 +344,8 @@ class UnifiedAnalyzer(IAnalyzerService, IUnifiedService):
|
|
|
343
344
|
|
|
344
345
|
if not result1.success or not result2.success:
|
|
345
346
|
return {
|
|
346
|
-
|
|
347
|
-
|
|
347
|
+
OperationResult.SUCCESS.value: False,
|
|
348
|
+
OperationResult.ERROR.value: "Failed to analyze one or both targets",
|
|
348
349
|
}
|
|
349
350
|
|
|
350
351
|
# Compare metrics
|
|
@@ -354,7 +355,7 @@ class UnifiedAnalyzer(IAnalyzerService, IUnifiedService):
|
|
|
354
355
|
finding_diff = self._compare_findings(result1.findings, result2.findings)
|
|
355
356
|
|
|
356
357
|
return {
|
|
357
|
-
|
|
358
|
+
OperationResult.SUCCESS.value: True,
|
|
358
359
|
"target1": str(target1),
|
|
359
360
|
"target2": str(target2),
|
|
360
361
|
"metric_differences": metric_diff,
|
|
@@ -378,7 +379,10 @@ class UnifiedAnalyzer(IAnalyzerService, IUnifiedService):
|
|
|
378
379
|
|
|
379
380
|
except Exception as e:
|
|
380
381
|
self._logger.error(f"Comparison error: {e!s}")
|
|
381
|
-
return {
|
|
382
|
+
return {
|
|
383
|
+
OperationResult.SUCCESS.value: False,
|
|
384
|
+
OperationResult.ERROR.value: str(e),
|
|
385
|
+
}
|
|
382
386
|
|
|
383
387
|
def get_recommendations(
|
|
384
388
|
self, analysis_result: AnalysisResult
|
|
@@ -405,7 +409,7 @@ class UnifiedAnalyzer(IAnalyzerService, IUnifiedService):
|
|
|
405
409
|
)
|
|
406
410
|
|
|
407
411
|
# Add severity-based recommendations
|
|
408
|
-
if analysis_result.severity ==
|
|
412
|
+
if analysis_result.severity == ValidationSeverity.CRITICAL:
|
|
409
413
|
recommendations.insert(
|
|
410
414
|
0,
|
|
411
415
|
{
|
|
@@ -414,7 +418,7 @@ class UnifiedAnalyzer(IAnalyzerService, IUnifiedService):
|
|
|
414
418
|
"priority": "high",
|
|
415
419
|
},
|
|
416
420
|
)
|
|
417
|
-
elif analysis_result.severity ==
|
|
421
|
+
elif analysis_result.severity == ValidationSeverity.ERROR:
|
|
418
422
|
recommendations.insert(
|
|
419
423
|
0,
|
|
420
424
|
{
|
|
@@ -26,6 +26,7 @@ import json
|
|
|
26
26
|
from pathlib import Path
|
|
27
27
|
from typing import Any, Dict, List, Optional, Union
|
|
28
28
|
|
|
29
|
+
from claude_mpm.core.enums import ServiceState
|
|
29
30
|
from claude_mpm.core.logging_utils import get_logger
|
|
30
31
|
|
|
31
32
|
from .interfaces import (
|
|
@@ -153,7 +154,7 @@ class UnifiedConfigManager(IConfigurationService, IUnifiedService):
|
|
|
153
154
|
|
|
154
155
|
return {
|
|
155
156
|
"service": "UnifiedConfigManager",
|
|
156
|
-
"status":
|
|
157
|
+
"status": ServiceState.RUNNING if self._initialized else ServiceState.ERROR,
|
|
157
158
|
"initialized": self._initialized,
|
|
158
159
|
"registered_strategies": len(strategies),
|
|
159
160
|
"loaded_configs": len(self._configs),
|
|
@@ -24,6 +24,7 @@ Features:
|
|
|
24
24
|
from pathlib import Path
|
|
25
25
|
from typing import Any, Dict, List, Optional, Union
|
|
26
26
|
|
|
27
|
+
from claude_mpm.core.enums import OperationResult, ServiceState
|
|
27
28
|
from claude_mpm.core.logging_utils import get_logger
|
|
28
29
|
|
|
29
30
|
from .interfaces import (
|
|
@@ -140,7 +141,7 @@ class UnifiedDeploymentService(IDeploymentService, IUnifiedService):
|
|
|
140
141
|
|
|
141
142
|
return {
|
|
142
143
|
"service": "UnifiedDeploymentService",
|
|
143
|
-
"status":
|
|
144
|
+
"status": ServiceState.RUNNING if self._initialized else ServiceState.ERROR,
|
|
144
145
|
"initialized": self._initialized,
|
|
145
146
|
"registered_strategies": len(strategies),
|
|
146
147
|
"active_deployments": len(self._deployments),
|
|
@@ -304,7 +305,7 @@ class UnifiedDeploymentService(IDeploymentService, IUnifiedService):
|
|
|
304
305
|
}
|
|
305
306
|
|
|
306
307
|
# Update metrics
|
|
307
|
-
if result.get(
|
|
308
|
+
if result.get(OperationResult.SUCCESS.value, False):
|
|
308
309
|
self._metrics["successful_deployments"] += 1
|
|
309
310
|
deployed_path = Path(target) / Path(source).name
|
|
310
311
|
|
|
@@ -318,7 +319,7 @@ class UnifiedDeploymentService(IDeploymentService, IUnifiedService):
|
|
|
318
319
|
self._metrics["failed_deployments"] += 1
|
|
319
320
|
return DeploymentResult(
|
|
320
321
|
success=False,
|
|
321
|
-
message=result.get(
|
|
322
|
+
message=result.get(OperationResult.ERROR.value, "Deployment failed"),
|
|
322
323
|
metadata=result,
|
|
323
324
|
)
|
|
324
325
|
|
|
@@ -426,7 +427,11 @@ class UnifiedDeploymentService(IDeploymentService, IUnifiedService):
|
|
|
426
427
|
|
|
427
428
|
return {
|
|
428
429
|
"id": deployment_id,
|
|
429
|
-
"status":
|
|
430
|
+
"status": (
|
|
431
|
+
OperationResult.CANCELLED
|
|
432
|
+
if deployment.get("rolled_back")
|
|
433
|
+
else OperationResult.SUCCESS
|
|
434
|
+
),
|
|
430
435
|
"type": deployment["type"],
|
|
431
436
|
"strategy": deployment["strategy"],
|
|
432
437
|
"source": deployment["source"],
|
|
@@ -9,7 +9,7 @@ Extracted from ClaudeRunner to follow Single Responsibility Principle.
|
|
|
9
9
|
"""
|
|
10
10
|
|
|
11
11
|
from pathlib import Path
|
|
12
|
-
from typing import Any, Dict, Optional
|
|
12
|
+
from typing import Any, Dict, List, Optional
|
|
13
13
|
|
|
14
14
|
from claude_mpm.config.paths import paths
|
|
15
15
|
from claude_mpm.core.base_service import BaseService
|
|
@@ -274,3 +274,106 @@ class VersionService(BaseService, VersionServiceInterface):
|
|
|
274
274
|
"message": "Update checking not implemented",
|
|
275
275
|
"checked_at": None,
|
|
276
276
|
}
|
|
277
|
+
|
|
278
|
+
def get_agents_versions(self) -> Dict[str, List[Dict[str, str]]]:
|
|
279
|
+
"""Get all agents grouped by tier with versions.
|
|
280
|
+
|
|
281
|
+
Returns:
|
|
282
|
+
Dict with keys: system, user, project
|
|
283
|
+
Each value is list of agent dicts with: name, version, id
|
|
284
|
+
"""
|
|
285
|
+
from claude_mpm.core.unified_agent_registry import get_agent_registry
|
|
286
|
+
|
|
287
|
+
agents_by_tier = {"system": [], "user": [], "project": []}
|
|
288
|
+
|
|
289
|
+
try:
|
|
290
|
+
registry = get_agent_registry()
|
|
291
|
+
all_agents = registry.list_agents()
|
|
292
|
+
|
|
293
|
+
for agent in all_agents:
|
|
294
|
+
agent_info = {
|
|
295
|
+
"name": agent.name,
|
|
296
|
+
"version": agent.version,
|
|
297
|
+
"id": agent.name, # Use name as ID since agent_id doesn't exist
|
|
298
|
+
}
|
|
299
|
+
tier = (
|
|
300
|
+
agent.tier.value
|
|
301
|
+
if hasattr(agent.tier, "value")
|
|
302
|
+
else str(agent.tier)
|
|
303
|
+
)
|
|
304
|
+
if tier in agents_by_tier:
|
|
305
|
+
agents_by_tier[tier].append(agent_info)
|
|
306
|
+
else:
|
|
307
|
+
agents_by_tier["system"].append(agent_info)
|
|
308
|
+
|
|
309
|
+
# Sort each tier alphabetically by name
|
|
310
|
+
for tier, agents in agents_by_tier.items():
|
|
311
|
+
agents.sort(key=lambda x: x["name"])
|
|
312
|
+
|
|
313
|
+
except Exception as e:
|
|
314
|
+
self.logger.error(f"Failed to get agent versions: {e}")
|
|
315
|
+
|
|
316
|
+
return agents_by_tier
|
|
317
|
+
|
|
318
|
+
def get_skills_versions(self) -> Dict[str, List[Dict[str, str]]]:
|
|
319
|
+
"""Get all skills grouped by source with versions.
|
|
320
|
+
|
|
321
|
+
Returns:
|
|
322
|
+
Dict with keys: bundled, user, project
|
|
323
|
+
Each value is list of skill dicts with: name, version, description
|
|
324
|
+
"""
|
|
325
|
+
from claude_mpm.skills.registry import get_registry
|
|
326
|
+
|
|
327
|
+
skills_by_source = {"bundled": [], "user": [], "project": []}
|
|
328
|
+
|
|
329
|
+
try:
|
|
330
|
+
registry = get_registry()
|
|
331
|
+
|
|
332
|
+
for skill in registry.list_skills():
|
|
333
|
+
skill_info = {
|
|
334
|
+
"name": skill.name,
|
|
335
|
+
"version": skill.version,
|
|
336
|
+
"description": (
|
|
337
|
+
skill.description[:60] + "..."
|
|
338
|
+
if len(skill.description) > 60
|
|
339
|
+
else skill.description
|
|
340
|
+
),
|
|
341
|
+
}
|
|
342
|
+
source = skill.source if skill.source in skills_by_source else "bundled"
|
|
343
|
+
skills_by_source[source].append(skill_info)
|
|
344
|
+
|
|
345
|
+
# Sort each source alphabetically by name
|
|
346
|
+
for source, skills in skills_by_source.items():
|
|
347
|
+
skills.sort(key=lambda x: x["name"])
|
|
348
|
+
|
|
349
|
+
except Exception as e:
|
|
350
|
+
self.logger.error(f"Failed to get skill versions: {e}")
|
|
351
|
+
|
|
352
|
+
return skills_by_source
|
|
353
|
+
|
|
354
|
+
def get_version_summary(self) -> Dict:
|
|
355
|
+
"""Get complete version summary.
|
|
356
|
+
|
|
357
|
+
Returns:
|
|
358
|
+
Dict with project_version, build, agents, skills, and counts
|
|
359
|
+
"""
|
|
360
|
+
agents = self.get_agents_versions()
|
|
361
|
+
skills = self.get_skills_versions()
|
|
362
|
+
build = self.get_build_number()
|
|
363
|
+
|
|
364
|
+
return {
|
|
365
|
+
"project_version": self.get_base_version(),
|
|
366
|
+
"build": build,
|
|
367
|
+
"agents": agents,
|
|
368
|
+
"skills": skills,
|
|
369
|
+
"counts": {
|
|
370
|
+
"agents_total": sum(len(v) for v in agents.values()),
|
|
371
|
+
"agents_system": len(agents.get("system", [])),
|
|
372
|
+
"agents_user": len(agents.get("user", [])),
|
|
373
|
+
"agents_project": len(agents.get("project", [])),
|
|
374
|
+
"skills_total": sum(len(v) for v in skills.values()),
|
|
375
|
+
"skills_bundled": len(skills.get("bundled", [])),
|
|
376
|
+
"skills_user": len(skills.get("user", [])),
|
|
377
|
+
"skills_project": len(skills.get("project", [])),
|
|
378
|
+
},
|
|
379
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Claude MPM Skills Package
|
|
3
|
+
|
|
4
|
+
Skills system for sharing common capabilities across agents.
|
|
5
|
+
This reduces redundancy by extracting shared patterns into reusable skills.
|
|
6
|
+
|
|
7
|
+
Skills can be:
|
|
8
|
+
- Bundled with MPM (in skills/bundled/)
|
|
9
|
+
- User-installed (in ~/.claude/skills/)
|
|
10
|
+
- Project-specific (in .claude/skills/)
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
from .registry import Skill, SkillsRegistry, get_registry
|
|
14
|
+
from .skill_manager import SkillManager
|
|
15
|
+
|
|
16
|
+
__all__ = [
|
|
17
|
+
"Skill",
|
|
18
|
+
"SkillManager",
|
|
19
|
+
"SkillsRegistry",
|
|
20
|
+
"get_registry",
|
|
21
|
+
]
|