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.
Files changed (250) hide show
  1. claude_mpm/VERSION +1 -1
  2. claude_mpm/agents/BASE_ENGINEER.md +286 -0
  3. claude_mpm/agents/BASE_PM.md +48 -17
  4. claude_mpm/agents/OUTPUT_STYLE.md +329 -11
  5. claude_mpm/agents/PM_INSTRUCTIONS.md +227 -8
  6. claude_mpm/agents/agent_loader.py +17 -5
  7. claude_mpm/agents/frontmatter_validator.py +284 -253
  8. claude_mpm/agents/templates/agentic-coder-optimizer.json +9 -2
  9. claude_mpm/agents/templates/api_qa.json +7 -1
  10. claude_mpm/agents/templates/clerk-ops.json +8 -1
  11. claude_mpm/agents/templates/code_analyzer.json +4 -1
  12. claude_mpm/agents/templates/dart_engineer.json +11 -1
  13. claude_mpm/agents/templates/data_engineer.json +11 -1
  14. claude_mpm/agents/templates/documentation.json +6 -1
  15. claude_mpm/agents/templates/engineer.json +18 -1
  16. claude_mpm/agents/templates/gcp_ops_agent.json +8 -1
  17. claude_mpm/agents/templates/golang_engineer.json +11 -1
  18. claude_mpm/agents/templates/java_engineer.json +12 -2
  19. claude_mpm/agents/templates/local_ops_agent.json +1217 -6
  20. claude_mpm/agents/templates/nextjs_engineer.json +11 -1
  21. claude_mpm/agents/templates/ops.json +8 -1
  22. claude_mpm/agents/templates/php-engineer.json +11 -1
  23. claude_mpm/agents/templates/project_organizer.json +10 -3
  24. claude_mpm/agents/templates/prompt-engineer.json +5 -1
  25. claude_mpm/agents/templates/python_engineer.json +11 -1
  26. claude_mpm/agents/templates/qa.json +7 -1
  27. claude_mpm/agents/templates/react_engineer.json +11 -1
  28. claude_mpm/agents/templates/refactoring_engineer.json +8 -1
  29. claude_mpm/agents/templates/research.json +4 -1
  30. claude_mpm/agents/templates/ruby-engineer.json +11 -1
  31. claude_mpm/agents/templates/rust_engineer.json +11 -1
  32. claude_mpm/agents/templates/security.json +6 -1
  33. claude_mpm/agents/templates/svelte-engineer.json +225 -0
  34. claude_mpm/agents/templates/ticketing.json +6 -1
  35. claude_mpm/agents/templates/typescript_engineer.json +11 -1
  36. claude_mpm/agents/templates/vercel_ops_agent.json +8 -1
  37. claude_mpm/agents/templates/version_control.json +8 -1
  38. claude_mpm/agents/templates/web_qa.json +7 -1
  39. claude_mpm/agents/templates/web_ui.json +11 -1
  40. claude_mpm/cli/__init__.py +34 -706
  41. claude_mpm/cli/commands/agent_manager.py +25 -12
  42. claude_mpm/cli/commands/agent_state_manager.py +186 -0
  43. claude_mpm/cli/commands/agents.py +204 -148
  44. claude_mpm/cli/commands/aggregate.py +7 -3
  45. claude_mpm/cli/commands/analyze.py +9 -4
  46. claude_mpm/cli/commands/analyze_code.py +7 -2
  47. claude_mpm/cli/commands/auto_configure.py +7 -9
  48. claude_mpm/cli/commands/config.py +47 -13
  49. claude_mpm/cli/commands/configure.py +294 -1788
  50. claude_mpm/cli/commands/configure_agent_display.py +261 -0
  51. claude_mpm/cli/commands/configure_behavior_manager.py +204 -0
  52. claude_mpm/cli/commands/configure_hook_manager.py +225 -0
  53. claude_mpm/cli/commands/configure_models.py +18 -0
  54. claude_mpm/cli/commands/configure_navigation.py +167 -0
  55. claude_mpm/cli/commands/configure_paths.py +104 -0
  56. claude_mpm/cli/commands/configure_persistence.py +254 -0
  57. claude_mpm/cli/commands/configure_startup_manager.py +646 -0
  58. claude_mpm/cli/commands/configure_template_editor.py +497 -0
  59. claude_mpm/cli/commands/configure_validators.py +73 -0
  60. claude_mpm/cli/commands/local_deploy.py +537 -0
  61. claude_mpm/cli/commands/memory.py +54 -20
  62. claude_mpm/cli/commands/mpm_init.py +39 -25
  63. claude_mpm/cli/commands/mpm_init_handler.py +8 -3
  64. claude_mpm/cli/executor.py +202 -0
  65. claude_mpm/cli/helpers.py +105 -0
  66. claude_mpm/cli/interactive/__init__.py +3 -0
  67. claude_mpm/cli/interactive/skills_wizard.py +491 -0
  68. claude_mpm/cli/parsers/__init__.py +7 -1
  69. claude_mpm/cli/parsers/base_parser.py +98 -3
  70. claude_mpm/cli/parsers/local_deploy_parser.py +227 -0
  71. claude_mpm/cli/shared/output_formatters.py +28 -19
  72. claude_mpm/cli/startup.py +481 -0
  73. claude_mpm/cli/utils.py +52 -1
  74. claude_mpm/commands/mpm-help.md +3 -0
  75. claude_mpm/commands/mpm-version.md +113 -0
  76. claude_mpm/commands/mpm.md +1 -0
  77. claude_mpm/config/agent_config.py +2 -2
  78. claude_mpm/config/model_config.py +428 -0
  79. claude_mpm/core/base_service.py +13 -12
  80. claude_mpm/core/enums.py +452 -0
  81. claude_mpm/core/factories.py +1 -1
  82. claude_mpm/core/instruction_reinforcement_hook.py +2 -1
  83. claude_mpm/core/interactive_session.py +9 -3
  84. claude_mpm/core/logging_config.py +6 -2
  85. claude_mpm/core/oneshot_session.py +8 -4
  86. claude_mpm/core/optimized_agent_loader.py +3 -3
  87. claude_mpm/core/output_style_manager.py +12 -192
  88. claude_mpm/core/service_registry.py +5 -1
  89. claude_mpm/core/types.py +2 -9
  90. claude_mpm/core/typing_utils.py +7 -6
  91. claude_mpm/dashboard/static/js/dashboard.js +0 -14
  92. claude_mpm/dashboard/templates/index.html +3 -41
  93. claude_mpm/hooks/claude_hooks/response_tracking.py +35 -1
  94. claude_mpm/hooks/instruction_reinforcement.py +7 -2
  95. claude_mpm/models/resume_log.py +340 -0
  96. claude_mpm/services/agents/auto_config_manager.py +10 -11
  97. claude_mpm/services/agents/deployment/agent_configuration_manager.py +1 -1
  98. claude_mpm/services/agents/deployment/agent_record_service.py +1 -1
  99. claude_mpm/services/agents/deployment/agent_validator.py +17 -1
  100. claude_mpm/services/agents/deployment/async_agent_deployment.py +1 -1
  101. claude_mpm/services/agents/deployment/interface_adapter.py +3 -2
  102. claude_mpm/services/agents/deployment/local_template_deployment.py +1 -1
  103. claude_mpm/services/agents/deployment/pipeline/steps/agent_processing_step.py +7 -6
  104. claude_mpm/services/agents/deployment/pipeline/steps/base_step.py +7 -16
  105. claude_mpm/services/agents/deployment/pipeline/steps/configuration_step.py +4 -3
  106. claude_mpm/services/agents/deployment/pipeline/steps/target_directory_step.py +5 -3
  107. claude_mpm/services/agents/deployment/pipeline/steps/validation_step.py +6 -5
  108. claude_mpm/services/agents/deployment/refactored_agent_deployment_service.py +9 -6
  109. claude_mpm/services/agents/deployment/validation/__init__.py +3 -1
  110. claude_mpm/services/agents/deployment/validation/validation_result.py +1 -9
  111. claude_mpm/services/agents/local_template_manager.py +1 -1
  112. claude_mpm/services/agents/memory/agent_memory_manager.py +5 -2
  113. claude_mpm/services/agents/registry/modification_tracker.py +5 -2
  114. claude_mpm/services/command_handler_service.py +11 -5
  115. claude_mpm/services/core/interfaces/__init__.py +74 -2
  116. claude_mpm/services/core/interfaces/health.py +172 -0
  117. claude_mpm/services/core/interfaces/model.py +281 -0
  118. claude_mpm/services/core/interfaces/process.py +372 -0
  119. claude_mpm/services/core/interfaces/restart.py +307 -0
  120. claude_mpm/services/core/interfaces/stability.py +260 -0
  121. claude_mpm/services/core/models/__init__.py +33 -0
  122. claude_mpm/services/core/models/agent_config.py +12 -28
  123. claude_mpm/services/core/models/health.py +162 -0
  124. claude_mpm/services/core/models/process.py +235 -0
  125. claude_mpm/services/core/models/restart.py +302 -0
  126. claude_mpm/services/core/models/stability.py +264 -0
  127. claude_mpm/services/core/path_resolver.py +23 -7
  128. claude_mpm/services/diagnostics/__init__.py +2 -2
  129. claude_mpm/services/diagnostics/checks/agent_check.py +25 -24
  130. claude_mpm/services/diagnostics/checks/claude_code_check.py +24 -23
  131. claude_mpm/services/diagnostics/checks/common_issues_check.py +25 -24
  132. claude_mpm/services/diagnostics/checks/configuration_check.py +24 -23
  133. claude_mpm/services/diagnostics/checks/filesystem_check.py +18 -17
  134. claude_mpm/services/diagnostics/checks/installation_check.py +30 -29
  135. claude_mpm/services/diagnostics/checks/instructions_check.py +20 -19
  136. claude_mpm/services/diagnostics/checks/mcp_check.py +50 -36
  137. claude_mpm/services/diagnostics/checks/mcp_services_check.py +36 -31
  138. claude_mpm/services/diagnostics/checks/monitor_check.py +23 -22
  139. claude_mpm/services/diagnostics/checks/startup_log_check.py +9 -8
  140. claude_mpm/services/diagnostics/diagnostic_runner.py +6 -5
  141. claude_mpm/services/diagnostics/doctor_reporter.py +28 -25
  142. claude_mpm/services/diagnostics/models.py +19 -24
  143. claude_mpm/services/infrastructure/monitoring/__init__.py +1 -1
  144. claude_mpm/services/infrastructure/monitoring/aggregator.py +12 -12
  145. claude_mpm/services/infrastructure/monitoring/base.py +5 -13
  146. claude_mpm/services/infrastructure/monitoring/network.py +7 -6
  147. claude_mpm/services/infrastructure/monitoring/process.py +13 -12
  148. claude_mpm/services/infrastructure/monitoring/resources.py +7 -6
  149. claude_mpm/services/infrastructure/monitoring/service.py +16 -15
  150. claude_mpm/services/infrastructure/resume_log_generator.py +439 -0
  151. claude_mpm/services/local_ops/__init__.py +163 -0
  152. claude_mpm/services/local_ops/crash_detector.py +257 -0
  153. claude_mpm/services/local_ops/health_checks/__init__.py +28 -0
  154. claude_mpm/services/local_ops/health_checks/http_check.py +224 -0
  155. claude_mpm/services/local_ops/health_checks/process_check.py +236 -0
  156. claude_mpm/services/local_ops/health_checks/resource_check.py +255 -0
  157. claude_mpm/services/local_ops/health_manager.py +430 -0
  158. claude_mpm/services/local_ops/log_monitor.py +396 -0
  159. claude_mpm/services/local_ops/memory_leak_detector.py +294 -0
  160. claude_mpm/services/local_ops/process_manager.py +595 -0
  161. claude_mpm/services/local_ops/resource_monitor.py +331 -0
  162. claude_mpm/services/local_ops/restart_manager.py +401 -0
  163. claude_mpm/services/local_ops/restart_policy.py +387 -0
  164. claude_mpm/services/local_ops/state_manager.py +372 -0
  165. claude_mpm/services/local_ops/unified_manager.py +600 -0
  166. claude_mpm/services/mcp_config_manager.py +9 -4
  167. claude_mpm/services/mcp_gateway/core/__init__.py +1 -2
  168. claude_mpm/services/mcp_gateway/core/base.py +18 -31
  169. claude_mpm/services/mcp_gateway/tools/external_mcp_services.py +71 -24
  170. claude_mpm/services/mcp_gateway/tools/health_check_tool.py +30 -28
  171. claude_mpm/services/memory_hook_service.py +4 -1
  172. claude_mpm/services/model/__init__.py +147 -0
  173. claude_mpm/services/model/base_provider.py +365 -0
  174. claude_mpm/services/model/claude_provider.py +412 -0
  175. claude_mpm/services/model/model_router.py +453 -0
  176. claude_mpm/services/model/ollama_provider.py +415 -0
  177. claude_mpm/services/monitor/daemon_manager.py +3 -2
  178. claude_mpm/services/monitor/handlers/dashboard.py +2 -1
  179. claude_mpm/services/monitor/handlers/hooks.py +2 -1
  180. claude_mpm/services/monitor/management/lifecycle.py +3 -2
  181. claude_mpm/services/monitor/server.py +2 -1
  182. claude_mpm/services/session_management_service.py +3 -2
  183. claude_mpm/services/session_manager.py +205 -1
  184. claude_mpm/services/shared/async_service_base.py +16 -27
  185. claude_mpm/services/shared/lifecycle_service_base.py +1 -14
  186. claude_mpm/services/socketio/handlers/__init__.py +5 -2
  187. claude_mpm/services/socketio/handlers/hook.py +13 -2
  188. claude_mpm/services/socketio/handlers/registry.py +4 -2
  189. claude_mpm/services/socketio/server/main.py +10 -8
  190. claude_mpm/services/subprocess_launcher_service.py +14 -5
  191. claude_mpm/services/unified/analyzer_strategies/code_analyzer.py +8 -7
  192. claude_mpm/services/unified/analyzer_strategies/dependency_analyzer.py +6 -5
  193. claude_mpm/services/unified/analyzer_strategies/performance_analyzer.py +8 -7
  194. claude_mpm/services/unified/analyzer_strategies/security_analyzer.py +7 -6
  195. claude_mpm/services/unified/analyzer_strategies/structure_analyzer.py +5 -4
  196. claude_mpm/services/unified/config_strategies/validation_strategy.py +13 -9
  197. claude_mpm/services/unified/deployment_strategies/cloud_strategies.py +10 -3
  198. claude_mpm/services/unified/deployment_strategies/local.py +6 -5
  199. claude_mpm/services/unified/deployment_strategies/utils.py +6 -5
  200. claude_mpm/services/unified/deployment_strategies/vercel.py +7 -6
  201. claude_mpm/services/unified/interfaces.py +3 -1
  202. claude_mpm/services/unified/unified_analyzer.py +14 -10
  203. claude_mpm/services/unified/unified_config.py +2 -1
  204. claude_mpm/services/unified/unified_deployment.py +9 -4
  205. claude_mpm/services/version_service.py +104 -1
  206. claude_mpm/skills/__init__.py +21 -0
  207. claude_mpm/skills/bundled/__init__.py +6 -0
  208. claude_mpm/skills/bundled/api-documentation.md +393 -0
  209. claude_mpm/skills/bundled/async-testing.md +571 -0
  210. claude_mpm/skills/bundled/code-review.md +143 -0
  211. claude_mpm/skills/bundled/database-migration.md +199 -0
  212. claude_mpm/skills/bundled/docker-containerization.md +194 -0
  213. claude_mpm/skills/bundled/express-local-dev.md +1429 -0
  214. claude_mpm/skills/bundled/fastapi-local-dev.md +1199 -0
  215. claude_mpm/skills/bundled/git-workflow.md +414 -0
  216. claude_mpm/skills/bundled/imagemagick.md +204 -0
  217. claude_mpm/skills/bundled/json-data-handling.md +223 -0
  218. claude_mpm/skills/bundled/nextjs-local-dev.md +807 -0
  219. claude_mpm/skills/bundled/pdf.md +141 -0
  220. claude_mpm/skills/bundled/performance-profiling.md +567 -0
  221. claude_mpm/skills/bundled/refactoring-patterns.md +180 -0
  222. claude_mpm/skills/bundled/security-scanning.md +327 -0
  223. claude_mpm/skills/bundled/systematic-debugging.md +473 -0
  224. claude_mpm/skills/bundled/test-driven-development.md +378 -0
  225. claude_mpm/skills/bundled/vite-local-dev.md +1061 -0
  226. claude_mpm/skills/bundled/web-performance-optimization.md +2305 -0
  227. claude_mpm/skills/bundled/xlsx.md +157 -0
  228. claude_mpm/skills/registry.py +286 -0
  229. claude_mpm/skills/skill_manager.py +310 -0
  230. claude_mpm/tools/code_tree_analyzer.py +177 -141
  231. claude_mpm/tools/code_tree_events.py +4 -2
  232. claude_mpm/utils/agent_dependency_loader.py +2 -2
  233. {claude_mpm-4.13.2.dist-info → claude_mpm-4.18.2.dist-info}/METADATA +117 -8
  234. {claude_mpm-4.13.2.dist-info → claude_mpm-4.18.2.dist-info}/RECORD +238 -174
  235. claude_mpm/dashboard/static/css/code-tree.css +0 -1639
  236. claude_mpm/dashboard/static/js/components/code-tree/tree-breadcrumb.js +0 -353
  237. claude_mpm/dashboard/static/js/components/code-tree/tree-constants.js +0 -235
  238. claude_mpm/dashboard/static/js/components/code-tree/tree-search.js +0 -409
  239. claude_mpm/dashboard/static/js/components/code-tree/tree-utils.js +0 -435
  240. claude_mpm/dashboard/static/js/components/code-tree.js +0 -5869
  241. claude_mpm/dashboard/static/js/components/code-viewer.js +0 -1386
  242. claude_mpm/hooks/claude_hooks/hook_handler_eventbus.py +0 -425
  243. claude_mpm/hooks/claude_hooks/hook_handler_original.py +0 -1041
  244. claude_mpm/hooks/claude_hooks/hook_handler_refactored.py +0 -347
  245. claude_mpm/services/agents/deployment/agent_lifecycle_manager_refactored.py +0 -575
  246. claude_mpm/services/project/analyzer_refactored.py +0 -450
  247. {claude_mpm-4.13.2.dist-info → claude_mpm-4.18.2.dist-info}/WHEEL +0 -0
  248. {claude_mpm-4.13.2.dist-info → claude_mpm-4.18.2.dist-info}/entry_points.txt +0 -0
  249. {claude_mpm-4.13.2.dist-info → claude_mpm-4.18.2.dist-info}/licenses/LICENSE +0 -0
  250. {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": "error",
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": "success",
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": "success",
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": "error",
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") != "success":
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": "error",
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": "success",
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"] = "error"
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": "success",
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"] == "success":
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": "success",
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") != "success":
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": "error",
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": "success",
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"] = "error"
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": "success",
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"] == "success"
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") != "success":
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": "error",
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": "error",
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": "success",
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") != "success":
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 = "error" # error, warning, info
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, valid: bool, message: Optional[str] = None, severity: str = "error"
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 == "error":
86
+ if severity == ValidationSeverity.ERROR:
83
87
  result.errors.append(message)
84
- elif severity == "warning":
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 == "error":
563
+ if rule.severity == ValidationSeverity.ERROR:
560
564
  result.errors.append(error)
561
- elif rule.severity == "warning":
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", "error"),
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 == "error":
850
+ if rule.severity == ValidationSeverity.ERROR:
847
851
  result.errors.append(message)
848
- elif rule.severity == "warning":
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": "unknown", "container_id": container_id}
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"] = "healthy" if health["running"] else "unhealthy"
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": "healthy" if deployment_info.get("commit_hash") else "unhealthy",
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": "unknown",
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"] = "healthy"
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"] = "degraded"
292
+ health["status"] = HealthStatus.DEGRADED
292
293
 
293
294
  else:
294
- health["status"] = "unhealthy"
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.info(f"Deployed agent: {dest}")
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": "unknown",
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"] = "healthy"
296
+ health["status"] = HealthStatus.HEALTHY
296
297
  elif any(health["checks"].values()):
297
- health["status"] = "degraded"
298
+ health["status"] = HealthStatus.DEGRADED
298
299
  else:
299
- health["status"] = "unhealthy"
300
+ health["status"] = HealthStatus.UNHEALTHY
300
301
 
301
302
  except Exception as e:
302
- health["status"] = "error"
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": "unknown",
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"] = "unhealthy"
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"] = "healthy"
345
+ health["status"] = HealthStatus.HEALTHY
345
346
  elif any(health["checks"].values()):
346
- health["status"] = "degraded"
347
+ health["status"] = HealthStatus.DEGRADED
347
348
  else:
348
- health["status"] = "unhealthy"
349
+ health["status"] = HealthStatus.UNHEALTHY
349
350
 
350
351
  except Exception as e:
351
- health["status"] = "unhealthy"
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 = "info" # info, warning, error, critical
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": "healthy" if self._initialized else "unhealthy",
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="error",
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="error",
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", "info"),
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
- "success": False,
347
- "error": "Failed to analyze one or both targets",
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
- "success": True,
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 {"success": False, "error": str(e)}
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 == "critical":
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 == "error":
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": "healthy" if self._initialized else "unhealthy",
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": "healthy" if self._initialized else "unhealthy",
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("success", False):
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("error", "Deployment failed"),
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": "rolled_back" if deployment.get("rolled_back") else "active",
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"],