claude-mpm 4.13.2__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_ENGINEER.md +286 -0
- claude_mpm/agents/BASE_PM.md +48 -17
- claude_mpm/agents/OUTPUT_STYLE.md +329 -11
- claude_mpm/agents/PM_INSTRUCTIONS.md +227 -8
- claude_mpm/agents/agent_loader.py +17 -5
- claude_mpm/agents/frontmatter_validator.py +284 -253
- claude_mpm/agents/templates/agentic-coder-optimizer.json +9 -2
- claude_mpm/agents/templates/api_qa.json +7 -1
- claude_mpm/agents/templates/clerk-ops.json +8 -1
- claude_mpm/agents/templates/code_analyzer.json +4 -1
- claude_mpm/agents/templates/dart_engineer.json +11 -1
- claude_mpm/agents/templates/data_engineer.json +11 -1
- claude_mpm/agents/templates/documentation.json +6 -1
- claude_mpm/agents/templates/engineer.json +18 -1
- claude_mpm/agents/templates/gcp_ops_agent.json +8 -1
- claude_mpm/agents/templates/golang_engineer.json +11 -1
- claude_mpm/agents/templates/java_engineer.json +12 -2
- claude_mpm/agents/templates/local_ops_agent.json +1217 -6
- claude_mpm/agents/templates/nextjs_engineer.json +11 -1
- claude_mpm/agents/templates/ops.json +8 -1
- claude_mpm/agents/templates/php-engineer.json +11 -1
- claude_mpm/agents/templates/project_organizer.json +10 -3
- claude_mpm/agents/templates/prompt-engineer.json +5 -1
- claude_mpm/agents/templates/python_engineer.json +11 -1
- claude_mpm/agents/templates/qa.json +7 -1
- claude_mpm/agents/templates/react_engineer.json +11 -1
- claude_mpm/agents/templates/refactoring_engineer.json +8 -1
- claude_mpm/agents/templates/research.json +4 -1
- claude_mpm/agents/templates/ruby-engineer.json +11 -1
- claude_mpm/agents/templates/rust_engineer.json +11 -1
- claude_mpm/agents/templates/security.json +6 -1
- claude_mpm/agents/templates/svelte-engineer.json +225 -0
- claude_mpm/agents/templates/ticketing.json +6 -1
- claude_mpm/agents/templates/typescript_engineer.json +11 -1
- claude_mpm/agents/templates/vercel_ops_agent.json +8 -1
- claude_mpm/agents/templates/version_control.json +8 -1
- claude_mpm/agents/templates/web_qa.json +7 -1
- claude_mpm/agents/templates/web_ui.json +11 -1
- claude_mpm/cli/__init__.py +34 -706
- 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 +204 -148
- 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 +7 -9
- claude_mpm/cli/commands/config.py +47 -13
- claude_mpm/cli/commands/configure.py +294 -1788
- 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 +39 -25
- claude_mpm/cli/commands/mpm_init_handler.py +8 -3
- 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/base_parser.py +98 -3
- claude_mpm/cli/parsers/local_deploy_parser.py +227 -0
- 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-help.md +3 -0
- 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/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/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/claude_hooks/response_tracking.py +35 -1
- claude_mpm/hooks/instruction_reinforcement.py +7 -2
- claude_mpm/models/resume_log.py +340 -0
- claude_mpm/services/agents/auto_config_manager.py +10 -11
- 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/registry/modification_tracker.py +5 -2
- claude_mpm/services/command_handler_service.py +11 -5
- claude_mpm/services/core/interfaces/__init__.py +74 -2
- 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/restart.py +307 -0
- claude_mpm/services/core/interfaces/stability.py +260 -0
- claude_mpm/services/core/models/__init__.py +33 -0
- claude_mpm/services/core/models/agent_config.py +12 -28
- 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/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 +36 -31
- 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/tools/external_mcp_services.py +71 -24
- claude_mpm/services/mcp_gateway/tools/health_check_tool.py +30 -28
- claude_mpm/services/memory_hook_service.py +4 -1
- 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/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/tools/code_tree_analyzer.py +177 -141
- claude_mpm/tools/code_tree_events.py +4 -2
- claude_mpm/utils/agent_dependency_loader.py +2 -2
- {claude_mpm-4.13.2.dist-info → claude_mpm-4.18.2.dist-info}/METADATA +117 -8
- {claude_mpm-4.13.2.dist-info → claude_mpm-4.18.2.dist-info}/RECORD +238 -174
- claude_mpm/dashboard/static/css/code-tree.css +0 -1639
- 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.13.2.dist-info → claude_mpm-4.18.2.dist-info}/WHEEL +0 -0
- {claude_mpm-4.13.2.dist-info → claude_mpm-4.18.2.dist-info}/entry_points.txt +0 -0
- {claude_mpm-4.13.2.dist-info → claude_mpm-4.18.2.dist-info}/licenses/LICENSE +0 -0
- {claude_mpm-4.13.2.dist-info → claude_mpm-4.18.2.dist-info}/top_level.txt +0 -0
|
@@ -14,6 +14,7 @@ import re
|
|
|
14
14
|
from pathlib import Path
|
|
15
15
|
from typing import Any, ClassVar, Dict, List, Optional
|
|
16
16
|
|
|
17
|
+
from claude_mpm.core.enums import OperationResult
|
|
17
18
|
from claude_mpm.core.logging_utils import get_logger
|
|
18
19
|
|
|
19
20
|
from ..strategies import (
|
|
@@ -166,7 +167,7 @@ class DependencyAnalyzerStrategy(AnalyzerStrategy):
|
|
|
166
167
|
return self._analyze_manifest(target_path, options)
|
|
167
168
|
|
|
168
169
|
return {
|
|
169
|
-
"status":
|
|
170
|
+
"status": OperationResult.ERROR,
|
|
170
171
|
"message": f"Unsupported target type: {type(target).__name__}",
|
|
171
172
|
}
|
|
172
173
|
|
|
@@ -175,7 +176,7 @@ class DependencyAnalyzerStrategy(AnalyzerStrategy):
|
|
|
175
176
|
) -> Dict[str, Any]:
|
|
176
177
|
"""Analyze dependencies in a project directory."""
|
|
177
178
|
results = {
|
|
178
|
-
"status":
|
|
179
|
+
"status": OperationResult.SUCCESS,
|
|
179
180
|
"type": "project",
|
|
180
181
|
"path": str(project_path),
|
|
181
182
|
"package_managers": [],
|
|
@@ -221,7 +222,7 @@ class DependencyAnalyzerStrategy(AnalyzerStrategy):
|
|
|
221
222
|
) -> Dict[str, Any]:
|
|
222
223
|
"""Analyze a specific package manifest file."""
|
|
223
224
|
results = {
|
|
224
|
-
"status":
|
|
225
|
+
"status": OperationResult.SUCCESS,
|
|
225
226
|
"type": "manifest",
|
|
226
227
|
"path": str(manifest_path),
|
|
227
228
|
"dependencies": {},
|
|
@@ -238,7 +239,7 @@ class DependencyAnalyzerStrategy(AnalyzerStrategy):
|
|
|
238
239
|
|
|
239
240
|
if not manager:
|
|
240
241
|
return {
|
|
241
|
-
"status":
|
|
242
|
+
"status": OperationResult.ERROR,
|
|
242
243
|
"message": f"Unknown manifest file: {manifest_path.name}",
|
|
243
244
|
}
|
|
244
245
|
|
|
@@ -598,7 +599,7 @@ class DependencyAnalyzerStrategy(AnalyzerStrategy):
|
|
|
598
599
|
"""Extract key metrics from analysis results."""
|
|
599
600
|
metrics = {}
|
|
600
601
|
|
|
601
|
-
if analysis_result.get("status") !=
|
|
602
|
+
if analysis_result.get("status") != OperationResult.SUCCESS:
|
|
602
603
|
return metrics
|
|
603
604
|
|
|
604
605
|
# Extract dependency counts
|
|
@@ -14,6 +14,7 @@ import re
|
|
|
14
14
|
from pathlib import Path
|
|
15
15
|
from typing import Any, ClassVar, Dict, List, Optional
|
|
16
16
|
|
|
17
|
+
from claude_mpm.core.enums import OperationResult
|
|
17
18
|
from claude_mpm.core.logging_utils import get_logger
|
|
18
19
|
|
|
19
20
|
from ..strategies import (
|
|
@@ -188,14 +189,14 @@ class PerformanceAnalyzerStrategy(AnalyzerStrategy):
|
|
|
188
189
|
return self._analyze_ast_performance(target, options)
|
|
189
190
|
|
|
190
191
|
return {
|
|
191
|
-
"status":
|
|
192
|
+
"status": OperationResult.ERROR,
|
|
192
193
|
"message": f"Unsupported target type: {type(target).__name__}",
|
|
193
194
|
}
|
|
194
195
|
|
|
195
196
|
def _analyze_file(self, file_path: Path, options: Dict[str, Any]) -> Dict[str, Any]:
|
|
196
197
|
"""Analyze a single file for performance issues."""
|
|
197
198
|
results = {
|
|
198
|
-
"status":
|
|
199
|
+
"status": OperationResult.SUCCESS,
|
|
199
200
|
"type": "file",
|
|
200
201
|
"path": str(file_path),
|
|
201
202
|
"issues": [],
|
|
@@ -240,7 +241,7 @@ class PerformanceAnalyzerStrategy(AnalyzerStrategy):
|
|
|
240
241
|
|
|
241
242
|
except Exception as e:
|
|
242
243
|
logger.error(f"Error analyzing file {file_path}: {e}")
|
|
243
|
-
results["status"] =
|
|
244
|
+
results["status"] = OperationResult.ERROR
|
|
244
245
|
results["error"] = str(e)
|
|
245
246
|
|
|
246
247
|
return results
|
|
@@ -250,7 +251,7 @@ class PerformanceAnalyzerStrategy(AnalyzerStrategy):
|
|
|
250
251
|
) -> Dict[str, Any]:
|
|
251
252
|
"""Analyze all files in a directory for performance issues."""
|
|
252
253
|
results = {
|
|
253
|
-
"status":
|
|
254
|
+
"status": OperationResult.SUCCESS,
|
|
254
255
|
"type": "directory",
|
|
255
256
|
"path": str(dir_path),
|
|
256
257
|
"files_analyzed": 0,
|
|
@@ -291,7 +292,7 @@ class PerformanceAnalyzerStrategy(AnalyzerStrategy):
|
|
|
291
292
|
continue
|
|
292
293
|
|
|
293
294
|
file_result = self._analyze_file(file_path, options)
|
|
294
|
-
if file_result["status"] ==
|
|
295
|
+
if file_result["status"] == OperationResult.SUCCESS:
|
|
295
296
|
results["files_analyzed"] += 1
|
|
296
297
|
total_score += file_result["performance_score"]
|
|
297
298
|
|
|
@@ -654,7 +655,7 @@ class PerformanceAnalyzerStrategy(AnalyzerStrategy):
|
|
|
654
655
|
) -> Dict[str, Any]:
|
|
655
656
|
"""Analyze performance of an AST node."""
|
|
656
657
|
results = {
|
|
657
|
-
"status":
|
|
658
|
+
"status": OperationResult.SUCCESS,
|
|
658
659
|
"type": "ast",
|
|
659
660
|
"complexity": {},
|
|
660
661
|
"issues": [],
|
|
@@ -802,7 +803,7 @@ class PerformanceAnalyzerStrategy(AnalyzerStrategy):
|
|
|
802
803
|
"""Extract key metrics from analysis results."""
|
|
803
804
|
metrics = {}
|
|
804
805
|
|
|
805
|
-
if analysis_result.get("status") !=
|
|
806
|
+
if analysis_result.get("status") != OperationResult.SUCCESS:
|
|
806
807
|
return metrics
|
|
807
808
|
|
|
808
809
|
if analysis_result.get("type") == "file":
|
|
@@ -14,6 +14,7 @@ import re
|
|
|
14
14
|
from pathlib import Path
|
|
15
15
|
from typing import Any, ClassVar, Dict, List, Optional
|
|
16
16
|
|
|
17
|
+
from claude_mpm.core.enums import OperationResult
|
|
17
18
|
from claude_mpm.core.logging_utils import get_logger
|
|
18
19
|
|
|
19
20
|
from ..strategies import (
|
|
@@ -198,14 +199,14 @@ class SecurityAnalyzerStrategy(AnalyzerStrategy):
|
|
|
198
199
|
return self._analyze_directory(target_path, options)
|
|
199
200
|
|
|
200
201
|
return {
|
|
201
|
-
"status":
|
|
202
|
+
"status": OperationResult.ERROR,
|
|
202
203
|
"message": f"Unsupported target type: {type(target).__name__}",
|
|
203
204
|
}
|
|
204
205
|
|
|
205
206
|
def _analyze_file(self, file_path: Path, options: Dict[str, Any]) -> Dict[str, Any]:
|
|
206
207
|
"""Analyze a single file for security issues."""
|
|
207
208
|
results = {
|
|
208
|
-
"status":
|
|
209
|
+
"status": OperationResult.SUCCESS,
|
|
209
210
|
"type": "file",
|
|
210
211
|
"path": str(file_path),
|
|
211
212
|
"vulnerabilities": [],
|
|
@@ -241,7 +242,7 @@ class SecurityAnalyzerStrategy(AnalyzerStrategy):
|
|
|
241
242
|
|
|
242
243
|
except Exception as e:
|
|
243
244
|
logger.error(f"Error analyzing file {file_path}: {e}")
|
|
244
|
-
results["status"] =
|
|
245
|
+
results["status"] = OperationResult.ERROR
|
|
245
246
|
results["error"] = str(e)
|
|
246
247
|
|
|
247
248
|
return results
|
|
@@ -251,7 +252,7 @@ class SecurityAnalyzerStrategy(AnalyzerStrategy):
|
|
|
251
252
|
) -> Dict[str, Any]:
|
|
252
253
|
"""Analyze all files in a directory for security issues."""
|
|
253
254
|
results = {
|
|
254
|
-
"status":
|
|
255
|
+
"status": OperationResult.SUCCESS,
|
|
255
256
|
"type": "directory",
|
|
256
257
|
"path": str(dir_path),
|
|
257
258
|
"files_analyzed": 0,
|
|
@@ -301,7 +302,7 @@ class SecurityAnalyzerStrategy(AnalyzerStrategy):
|
|
|
301
302
|
|
|
302
303
|
file_result = self._analyze_file(file_path, options)
|
|
303
304
|
if (
|
|
304
|
-
file_result["status"] ==
|
|
305
|
+
file_result["status"] == OperationResult.SUCCESS
|
|
305
306
|
and file_result["vulnerabilities"]
|
|
306
307
|
):
|
|
307
308
|
results["files"].append(file_result)
|
|
@@ -645,7 +646,7 @@ class SecurityAnalyzerStrategy(AnalyzerStrategy):
|
|
|
645
646
|
"""Extract key metrics from analysis results."""
|
|
646
647
|
metrics = {}
|
|
647
648
|
|
|
648
|
-
if analysis_result.get("status") !=
|
|
649
|
+
if analysis_result.get("status") != OperationResult.SUCCESS:
|
|
649
650
|
return metrics
|
|
650
651
|
|
|
651
652
|
if analysis_result.get("type") == "file":
|
|
@@ -13,6 +13,7 @@ import fnmatch
|
|
|
13
13
|
from pathlib import Path
|
|
14
14
|
from typing import Any, ClassVar, Dict, List, Optional, Tuple
|
|
15
15
|
|
|
16
|
+
from claude_mpm.core.enums import OperationResult
|
|
16
17
|
from claude_mpm.core.logging_utils import get_logger
|
|
17
18
|
|
|
18
19
|
from ..strategies import (
|
|
@@ -174,14 +175,14 @@ class StructureAnalyzerStrategy(AnalyzerStrategy):
|
|
|
174
175
|
|
|
175
176
|
if not target_path.is_dir():
|
|
176
177
|
return {
|
|
177
|
-
"status":
|
|
178
|
+
"status": OperationResult.ERROR,
|
|
178
179
|
"message": "Target must be a directory",
|
|
179
180
|
}
|
|
180
181
|
|
|
181
182
|
return self._analyze_structure(target_path, options)
|
|
182
183
|
|
|
183
184
|
return {
|
|
184
|
-
"status":
|
|
185
|
+
"status": OperationResult.ERROR,
|
|
185
186
|
"message": f"Unsupported target type: {type(target).__name__}",
|
|
186
187
|
}
|
|
187
188
|
|
|
@@ -190,7 +191,7 @@ class StructureAnalyzerStrategy(AnalyzerStrategy):
|
|
|
190
191
|
) -> Dict[str, Any]:
|
|
191
192
|
"""Analyze the structure of a project directory."""
|
|
192
193
|
results = {
|
|
193
|
-
"status":
|
|
194
|
+
"status": OperationResult.SUCCESS,
|
|
194
195
|
"type": "structure",
|
|
195
196
|
"path": str(root_path),
|
|
196
197
|
"tree": {},
|
|
@@ -640,7 +641,7 @@ class StructureAnalyzerStrategy(AnalyzerStrategy):
|
|
|
640
641
|
"""Extract key metrics from analysis results."""
|
|
641
642
|
metrics = {}
|
|
642
643
|
|
|
643
|
-
if analysis_result.get("status") !=
|
|
644
|
+
if analysis_result.get("status") != OperationResult.SUCCESS:
|
|
644
645
|
return metrics
|
|
645
646
|
|
|
646
647
|
# Extract structure statistics
|
|
@@ -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"],
|