claude-mpm 4.14.6__py3-none-any.whl → 4.21.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of claude-mpm might be problematic. Click here for more details.

Files changed (353) hide show
  1. claude_mpm/VERSION +1 -1
  2. claude_mpm/agents/BASE_ENGINEER.md +286 -0
  3. claude_mpm/agents/BASE_PM.md +272 -23
  4. claude_mpm/agents/OUTPUT_STYLE.md +48 -3
  5. claude_mpm/agents/PM_INSTRUCTIONS.md +49 -0
  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 +216 -37
  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 +20 -4
  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 +19 -4
  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 +23 -8
  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 -740
  41. claude_mpm/cli/commands/__init__.py +2 -0
  42. claude_mpm/cli/commands/agent_manager.py +25 -12
  43. claude_mpm/cli/commands/agent_state_manager.py +186 -0
  44. claude_mpm/cli/commands/agents.py +204 -148
  45. claude_mpm/cli/commands/aggregate.py +7 -3
  46. claude_mpm/cli/commands/analyze.py +9 -4
  47. claude_mpm/cli/commands/analyze_code.py +7 -2
  48. claude_mpm/cli/commands/auto_configure.py +7 -9
  49. claude_mpm/cli/commands/config.py +47 -13
  50. claude_mpm/cli/commands/configure.py +294 -1788
  51. claude_mpm/cli/commands/configure_agent_display.py +261 -0
  52. claude_mpm/cli/commands/configure_behavior_manager.py +204 -0
  53. claude_mpm/cli/commands/configure_hook_manager.py +225 -0
  54. claude_mpm/cli/commands/configure_models.py +18 -0
  55. claude_mpm/cli/commands/configure_navigation.py +167 -0
  56. claude_mpm/cli/commands/configure_paths.py +104 -0
  57. claude_mpm/cli/commands/configure_persistence.py +254 -0
  58. claude_mpm/cli/commands/configure_startup_manager.py +646 -0
  59. claude_mpm/cli/commands/configure_template_editor.py +497 -0
  60. claude_mpm/cli/commands/configure_validators.py +73 -0
  61. claude_mpm/cli/commands/local_deploy.py +3 -2
  62. claude_mpm/cli/commands/memory.py +54 -20
  63. claude_mpm/cli/commands/mpm_init/__init__.py +73 -0
  64. claude_mpm/cli/commands/mpm_init/core.py +525 -0
  65. claude_mpm/cli/commands/mpm_init/display.py +341 -0
  66. claude_mpm/cli/commands/mpm_init/git_activity.py +427 -0
  67. claude_mpm/cli/commands/mpm_init/modes.py +397 -0
  68. claude_mpm/cli/commands/mpm_init/prompts.py +442 -0
  69. claude_mpm/cli/commands/mpm_init_cli.py +396 -0
  70. claude_mpm/cli/commands/mpm_init_handler.py +75 -4
  71. claude_mpm/cli/commands/skills.py +488 -0
  72. claude_mpm/cli/executor.py +204 -0
  73. claude_mpm/cli/helpers.py +105 -0
  74. claude_mpm/cli/interactive/__init__.py +3 -0
  75. claude_mpm/cli/interactive/skills_wizard.py +491 -0
  76. claude_mpm/cli/parsers/base_parser.py +7 -0
  77. claude_mpm/cli/parsers/mpm_init_parser.py +42 -0
  78. claude_mpm/cli/parsers/skills_parser.py +137 -0
  79. claude_mpm/cli/shared/output_formatters.py +28 -19
  80. claude_mpm/cli/startup.py +538 -0
  81. claude_mpm/commands/mpm-auto-configure.md +52 -0
  82. claude_mpm/commands/mpm-help.md +3 -0
  83. claude_mpm/commands/mpm-init.md +112 -6
  84. claude_mpm/commands/mpm-version.md +113 -0
  85. claude_mpm/commands/mpm.md +1 -0
  86. claude_mpm/config/agent_config.py +2 -2
  87. claude_mpm/constants.py +12 -0
  88. claude_mpm/core/base_service.py +13 -12
  89. claude_mpm/core/config.py +42 -0
  90. claude_mpm/core/enums.py +452 -0
  91. claude_mpm/core/factories.py +1 -1
  92. claude_mpm/core/instruction_reinforcement_hook.py +2 -1
  93. claude_mpm/core/interactive_session.py +6 -3
  94. claude_mpm/core/interfaces.py +56 -1
  95. claude_mpm/core/logging_config.py +6 -2
  96. claude_mpm/core/oneshot_session.py +8 -4
  97. claude_mpm/core/optimized_agent_loader.py +3 -3
  98. claude_mpm/core/output_style_manager.py +12 -192
  99. claude_mpm/core/service_registry.py +5 -1
  100. claude_mpm/core/types.py +2 -9
  101. claude_mpm/core/typing_utils.py +7 -6
  102. claude_mpm/dashboard/static/js/dashboard.js +0 -14
  103. claude_mpm/dashboard/templates/index.html +3 -41
  104. claude_mpm/hooks/__init__.py +8 -0
  105. claude_mpm/hooks/claude_hooks/response_tracking.py +35 -1
  106. claude_mpm/hooks/instruction_reinforcement.py +7 -2
  107. claude_mpm/hooks/session_resume_hook.py +121 -0
  108. claude_mpm/models/resume_log.py +340 -0
  109. claude_mpm/services/agents/auto_config_manager.py +10 -11
  110. claude_mpm/services/agents/deployment/agent_configuration_manager.py +1 -1
  111. claude_mpm/services/agents/deployment/agent_record_service.py +1 -1
  112. claude_mpm/services/agents/deployment/agent_validator.py +17 -1
  113. claude_mpm/services/agents/deployment/async_agent_deployment.py +1 -1
  114. claude_mpm/services/agents/deployment/interface_adapter.py +3 -2
  115. claude_mpm/services/agents/deployment/local_template_deployment.py +1 -1
  116. claude_mpm/services/agents/deployment/pipeline/steps/agent_processing_step.py +7 -6
  117. claude_mpm/services/agents/deployment/pipeline/steps/base_step.py +7 -16
  118. claude_mpm/services/agents/deployment/pipeline/steps/configuration_step.py +4 -3
  119. claude_mpm/services/agents/deployment/pipeline/steps/target_directory_step.py +5 -3
  120. claude_mpm/services/agents/deployment/pipeline/steps/validation_step.py +6 -5
  121. claude_mpm/services/agents/deployment/refactored_agent_deployment_service.py +9 -6
  122. claude_mpm/services/agents/deployment/validation/__init__.py +3 -1
  123. claude_mpm/services/agents/deployment/validation/validation_result.py +1 -9
  124. claude_mpm/services/agents/local_template_manager.py +1 -1
  125. claude_mpm/services/agents/memory/agent_memory_manager.py +5 -2
  126. claude_mpm/services/agents/recommender.py +47 -0
  127. claude_mpm/services/agents/registry/modification_tracker.py +5 -2
  128. claude_mpm/services/cli/resume_service.py +617 -0
  129. claude_mpm/services/cli/session_manager.py +87 -0
  130. claude_mpm/services/cli/session_pause_manager.py +504 -0
  131. claude_mpm/services/cli/session_resume_helper.py +372 -0
  132. claude_mpm/services/command_handler_service.py +11 -5
  133. claude_mpm/services/core/interfaces/process.py +6 -6
  134. claude_mpm/services/core/interfaces.py +56 -1
  135. claude_mpm/services/core/models/__init__.py +0 -2
  136. claude_mpm/services/core/models/agent_config.py +15 -28
  137. claude_mpm/services/core/models/health.py +1 -28
  138. claude_mpm/services/core/models/process.py +22 -41
  139. claude_mpm/services/core/path_resolver.py +1 -1
  140. claude_mpm/services/diagnostics/__init__.py +2 -2
  141. claude_mpm/services/diagnostics/checks/agent_check.py +25 -24
  142. claude_mpm/services/diagnostics/checks/claude_code_check.py +24 -23
  143. claude_mpm/services/diagnostics/checks/common_issues_check.py +25 -24
  144. claude_mpm/services/diagnostics/checks/configuration_check.py +24 -23
  145. claude_mpm/services/diagnostics/checks/filesystem_check.py +18 -17
  146. claude_mpm/services/diagnostics/checks/installation_check.py +30 -29
  147. claude_mpm/services/diagnostics/checks/instructions_check.py +20 -19
  148. claude_mpm/services/diagnostics/checks/mcp_check.py +50 -36
  149. claude_mpm/services/diagnostics/checks/mcp_services_check.py +36 -31
  150. claude_mpm/services/diagnostics/checks/monitor_check.py +23 -22
  151. claude_mpm/services/diagnostics/checks/startup_log_check.py +9 -8
  152. claude_mpm/services/diagnostics/diagnostic_runner.py +6 -5
  153. claude_mpm/services/diagnostics/doctor_reporter.py +28 -25
  154. claude_mpm/services/diagnostics/models.py +37 -21
  155. claude_mpm/services/infrastructure/monitoring/__init__.py +1 -1
  156. claude_mpm/services/infrastructure/monitoring/aggregator.py +12 -12
  157. claude_mpm/services/infrastructure/monitoring/base.py +5 -13
  158. claude_mpm/services/infrastructure/monitoring/network.py +7 -6
  159. claude_mpm/services/infrastructure/monitoring/process.py +13 -12
  160. claude_mpm/services/infrastructure/monitoring/resources.py +7 -6
  161. claude_mpm/services/infrastructure/monitoring/service.py +16 -15
  162. claude_mpm/services/infrastructure/resume_log_generator.py +439 -0
  163. claude_mpm/services/local_ops/__init__.py +5 -3
  164. claude_mpm/services/local_ops/crash_detector.py +1 -1
  165. claude_mpm/services/local_ops/health_checks/http_check.py +2 -1
  166. claude_mpm/services/local_ops/health_checks/process_check.py +2 -1
  167. claude_mpm/services/local_ops/health_checks/resource_check.py +2 -1
  168. claude_mpm/services/local_ops/health_manager.py +1 -1
  169. claude_mpm/services/local_ops/process_manager.py +12 -12
  170. claude_mpm/services/local_ops/restart_manager.py +1 -1
  171. claude_mpm/services/local_ops/state_manager.py +6 -5
  172. claude_mpm/services/local_ops/unified_manager.py +2 -2
  173. claude_mpm/services/mcp_config_manager.py +7 -126
  174. claude_mpm/services/mcp_gateway/auto_configure.py +31 -25
  175. claude_mpm/services/mcp_gateway/core/__init__.py +1 -2
  176. claude_mpm/services/mcp_gateway/core/base.py +18 -31
  177. claude_mpm/services/mcp_gateway/core/process_pool.py +19 -10
  178. claude_mpm/services/mcp_gateway/tools/external_mcp_services.py +97 -45
  179. claude_mpm/services/mcp_gateway/tools/health_check_tool.py +30 -28
  180. claude_mpm/services/memory_hook_service.py +4 -1
  181. claude_mpm/services/monitor/daemon_manager.py +3 -2
  182. claude_mpm/services/monitor/handlers/dashboard.py +2 -1
  183. claude_mpm/services/monitor/handlers/hooks.py +2 -1
  184. claude_mpm/services/monitor/management/lifecycle.py +3 -2
  185. claude_mpm/services/monitor/server.py +2 -1
  186. claude_mpm/services/session_management_service.py +3 -2
  187. claude_mpm/services/session_manager.py +205 -1
  188. claude_mpm/services/shared/async_service_base.py +16 -27
  189. claude_mpm/services/shared/lifecycle_service_base.py +1 -14
  190. claude_mpm/services/socketio/handlers/__init__.py +5 -2
  191. claude_mpm/services/socketio/handlers/hook.py +13 -2
  192. claude_mpm/services/socketio/handlers/registry.py +4 -2
  193. claude_mpm/services/socketio/server/main.py +10 -8
  194. claude_mpm/services/subprocess_launcher_service.py +14 -5
  195. claude_mpm/services/unified/analyzer_strategies/code_analyzer.py +8 -7
  196. claude_mpm/services/unified/analyzer_strategies/dependency_analyzer.py +6 -5
  197. claude_mpm/services/unified/analyzer_strategies/performance_analyzer.py +8 -7
  198. claude_mpm/services/unified/analyzer_strategies/security_analyzer.py +7 -6
  199. claude_mpm/services/unified/analyzer_strategies/structure_analyzer.py +5 -4
  200. claude_mpm/services/unified/config_strategies/validation_strategy.py +13 -9
  201. claude_mpm/services/unified/deployment_strategies/cloud_strategies.py +10 -3
  202. claude_mpm/services/unified/deployment_strategies/local.py +6 -5
  203. claude_mpm/services/unified/deployment_strategies/utils.py +6 -5
  204. claude_mpm/services/unified/deployment_strategies/vercel.py +7 -6
  205. claude_mpm/services/unified/interfaces.py +3 -1
  206. claude_mpm/services/unified/unified_analyzer.py +14 -10
  207. claude_mpm/services/unified/unified_config.py +2 -1
  208. claude_mpm/services/unified/unified_deployment.py +9 -4
  209. claude_mpm/services/version_service.py +104 -1
  210. claude_mpm/skills/__init__.py +42 -0
  211. claude_mpm/skills/agent_skills_injector.py +324 -0
  212. claude_mpm/skills/bundled/LICENSE_ATTRIBUTIONS.md +79 -0
  213. claude_mpm/skills/bundled/__init__.py +6 -0
  214. claude_mpm/skills/bundled/api-documentation.md +393 -0
  215. claude_mpm/skills/bundled/async-testing.md +571 -0
  216. claude_mpm/skills/bundled/code-review.md +143 -0
  217. claude_mpm/skills/bundled/collaboration/brainstorming/SKILL.md +79 -0
  218. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/SKILL.md +178 -0
  219. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/agent-prompts.md +577 -0
  220. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/coordination-patterns.md +467 -0
  221. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/examples.md +537 -0
  222. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/troubleshooting.md +730 -0
  223. claude_mpm/skills/bundled/collaboration/requesting-code-review/SKILL.md +112 -0
  224. claude_mpm/skills/bundled/collaboration/requesting-code-review/references/code-reviewer-template.md +146 -0
  225. claude_mpm/skills/bundled/collaboration/requesting-code-review/references/review-examples.md +412 -0
  226. claude_mpm/skills/bundled/collaboration/writing-plans/SKILL.md +81 -0
  227. claude_mpm/skills/bundled/collaboration/writing-plans/references/best-practices.md +362 -0
  228. claude_mpm/skills/bundled/collaboration/writing-plans/references/plan-structure-templates.md +312 -0
  229. claude_mpm/skills/bundled/database-migration.md +199 -0
  230. claude_mpm/skills/bundled/debugging/root-cause-tracing/SKILL.md +152 -0
  231. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/advanced-techniques.md +668 -0
  232. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/examples.md +587 -0
  233. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/integration.md +438 -0
  234. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/tracing-techniques.md +391 -0
  235. claude_mpm/skills/bundled/debugging/systematic-debugging/CREATION-LOG.md +119 -0
  236. claude_mpm/skills/bundled/debugging/systematic-debugging/SKILL.md +148 -0
  237. claude_mpm/skills/bundled/debugging/systematic-debugging/references/anti-patterns.md +483 -0
  238. claude_mpm/skills/bundled/debugging/systematic-debugging/references/examples.md +452 -0
  239. claude_mpm/skills/bundled/debugging/systematic-debugging/references/troubleshooting.md +449 -0
  240. claude_mpm/skills/bundled/debugging/systematic-debugging/references/workflow.md +411 -0
  241. claude_mpm/skills/bundled/debugging/systematic-debugging/test-academic.md +14 -0
  242. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-1.md +58 -0
  243. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-2.md +68 -0
  244. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-3.md +69 -0
  245. claude_mpm/skills/bundled/debugging/verification-before-completion/SKILL.md +131 -0
  246. claude_mpm/skills/bundled/debugging/verification-before-completion/references/gate-function.md +325 -0
  247. claude_mpm/skills/bundled/debugging/verification-before-completion/references/integration-and-workflows.md +490 -0
  248. claude_mpm/skills/bundled/debugging/verification-before-completion/references/red-flags-and-failures.md +425 -0
  249. claude_mpm/skills/bundled/debugging/verification-before-completion/references/verification-patterns.md +499 -0
  250. claude_mpm/skills/bundled/docker-containerization.md +194 -0
  251. claude_mpm/skills/bundled/express-local-dev.md +1429 -0
  252. claude_mpm/skills/bundled/fastapi-local-dev.md +1199 -0
  253. claude_mpm/skills/bundled/git-workflow.md +414 -0
  254. claude_mpm/skills/bundled/imagemagick.md +204 -0
  255. claude_mpm/skills/bundled/json-data-handling.md +223 -0
  256. claude_mpm/skills/bundled/main/artifacts-builder/SKILL.md +86 -0
  257. claude_mpm/skills/bundled/main/internal-comms/SKILL.md +43 -0
  258. claude_mpm/skills/bundled/main/internal-comms/examples/3p-updates.md +47 -0
  259. claude_mpm/skills/bundled/main/internal-comms/examples/company-newsletter.md +65 -0
  260. claude_mpm/skills/bundled/main/internal-comms/examples/faq-answers.md +30 -0
  261. claude_mpm/skills/bundled/main/internal-comms/examples/general-comms.md +16 -0
  262. claude_mpm/skills/bundled/main/mcp-builder/SKILL.md +160 -0
  263. claude_mpm/skills/bundled/main/mcp-builder/reference/design_principles.md +412 -0
  264. claude_mpm/skills/bundled/main/mcp-builder/reference/evaluation.md +602 -0
  265. claude_mpm/skills/bundled/main/mcp-builder/reference/mcp_best_practices.md +915 -0
  266. claude_mpm/skills/bundled/main/mcp-builder/reference/node_mcp_server.md +916 -0
  267. claude_mpm/skills/bundled/main/mcp-builder/reference/python_mcp_server.md +752 -0
  268. claude_mpm/skills/bundled/main/mcp-builder/reference/workflow.md +1237 -0
  269. claude_mpm/skills/bundled/main/mcp-builder/scripts/connections.py +157 -0
  270. claude_mpm/skills/bundled/main/mcp-builder/scripts/evaluation.py +425 -0
  271. claude_mpm/skills/bundled/main/skill-creator/SKILL.md +189 -0
  272. claude_mpm/skills/bundled/main/skill-creator/references/best-practices.md +500 -0
  273. claude_mpm/skills/bundled/main/skill-creator/references/creation-workflow.md +464 -0
  274. claude_mpm/skills/bundled/main/skill-creator/references/examples.md +619 -0
  275. claude_mpm/skills/bundled/main/skill-creator/references/progressive-disclosure.md +437 -0
  276. claude_mpm/skills/bundled/main/skill-creator/references/skill-structure.md +231 -0
  277. claude_mpm/skills/bundled/main/skill-creator/scripts/init_skill.py +303 -0
  278. claude_mpm/skills/bundled/main/skill-creator/scripts/package_skill.py +113 -0
  279. claude_mpm/skills/bundled/main/skill-creator/scripts/quick_validate.py +72 -0
  280. claude_mpm/skills/bundled/nextjs-local-dev.md +807 -0
  281. claude_mpm/skills/bundled/pdf.md +141 -0
  282. claude_mpm/skills/bundled/performance-profiling.md +567 -0
  283. claude_mpm/skills/bundled/php/espocrm-development/SKILL.md +170 -0
  284. claude_mpm/skills/bundled/php/espocrm-development/references/architecture.md +602 -0
  285. claude_mpm/skills/bundled/php/espocrm-development/references/common-tasks.md +821 -0
  286. claude_mpm/skills/bundled/php/espocrm-development/references/development-workflow.md +742 -0
  287. claude_mpm/skills/bundled/php/espocrm-development/references/frontend-customization.md +726 -0
  288. claude_mpm/skills/bundled/php/espocrm-development/references/hooks-and-services.md +764 -0
  289. claude_mpm/skills/bundled/php/espocrm-development/references/testing-debugging.md +831 -0
  290. claude_mpm/skills/bundled/refactoring-patterns.md +180 -0
  291. claude_mpm/skills/bundled/rust/desktop-applications/SKILL.md +226 -0
  292. claude_mpm/skills/bundled/rust/desktop-applications/references/architecture-patterns.md +901 -0
  293. claude_mpm/skills/bundled/rust/desktop-applications/references/native-gui-frameworks.md +901 -0
  294. claude_mpm/skills/bundled/rust/desktop-applications/references/platform-integration.md +775 -0
  295. claude_mpm/skills/bundled/rust/desktop-applications/references/state-management.md +937 -0
  296. claude_mpm/skills/bundled/rust/desktop-applications/references/tauri-framework.md +770 -0
  297. claude_mpm/skills/bundled/rust/desktop-applications/references/testing-deployment.md +961 -0
  298. claude_mpm/skills/bundled/security-scanning.md +327 -0
  299. claude_mpm/skills/bundled/systematic-debugging.md +473 -0
  300. claude_mpm/skills/bundled/test-driven-development.md +378 -0
  301. claude_mpm/skills/bundled/testing/condition-based-waiting/SKILL.md +119 -0
  302. claude_mpm/skills/bundled/testing/condition-based-waiting/references/patterns-and-implementation.md +253 -0
  303. claude_mpm/skills/bundled/testing/test-driven-development/SKILL.md +145 -0
  304. claude_mpm/skills/bundled/testing/test-driven-development/references/anti-patterns.md +543 -0
  305. claude_mpm/skills/bundled/testing/test-driven-development/references/examples.md +741 -0
  306. claude_mpm/skills/bundled/testing/test-driven-development/references/integration.md +470 -0
  307. claude_mpm/skills/bundled/testing/test-driven-development/references/philosophy.md +458 -0
  308. claude_mpm/skills/bundled/testing/test-driven-development/references/workflow.md +639 -0
  309. claude_mpm/skills/bundled/testing/testing-anti-patterns/SKILL.md +140 -0
  310. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/completeness-anti-patterns.md +572 -0
  311. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/core-anti-patterns.md +411 -0
  312. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/detection-guide.md +569 -0
  313. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/tdd-connection.md +695 -0
  314. claude_mpm/skills/bundled/testing/webapp-testing/SKILL.md +184 -0
  315. claude_mpm/skills/bundled/testing/webapp-testing/decision-tree.md +459 -0
  316. claude_mpm/skills/bundled/testing/webapp-testing/examples/console_logging.py +35 -0
  317. claude_mpm/skills/bundled/testing/webapp-testing/examples/element_discovery.py +44 -0
  318. claude_mpm/skills/bundled/testing/webapp-testing/examples/static_html_automation.py +34 -0
  319. claude_mpm/skills/bundled/testing/webapp-testing/playwright-patterns.md +479 -0
  320. claude_mpm/skills/bundled/testing/webapp-testing/reconnaissance-pattern.md +687 -0
  321. claude_mpm/skills/bundled/testing/webapp-testing/scripts/with_server.py +129 -0
  322. claude_mpm/skills/bundled/testing/webapp-testing/server-management.md +758 -0
  323. claude_mpm/skills/bundled/testing/webapp-testing/troubleshooting.md +868 -0
  324. claude_mpm/skills/bundled/vite-local-dev.md +1061 -0
  325. claude_mpm/skills/bundled/web-performance-optimization.md +2305 -0
  326. claude_mpm/skills/bundled/xlsx.md +157 -0
  327. claude_mpm/skills/registry.py +286 -0
  328. claude_mpm/skills/skill_manager.py +310 -0
  329. claude_mpm/skills/skills_registry.py +348 -0
  330. claude_mpm/skills/skills_service.py +739 -0
  331. claude_mpm/tools/code_tree_analyzer.py +177 -141
  332. claude_mpm/tools/code_tree_events.py +4 -2
  333. claude_mpm/utils/agent_dependency_loader.py +2 -2
  334. {claude_mpm-4.14.6.dist-info → claude_mpm-4.21.0.dist-info}/METADATA +211 -33
  335. {claude_mpm-4.14.6.dist-info → claude_mpm-4.21.0.dist-info}/RECORD +339 -199
  336. claude_mpm/agents/INSTRUCTIONS_OLD_DEPRECATED.md +0 -602
  337. claude_mpm/cli/commands/mpm_init.py +0 -1994
  338. claude_mpm/dashboard/static/css/code-tree.css +0 -1639
  339. claude_mpm/dashboard/static/js/components/code-tree/tree-breadcrumb.js +0 -353
  340. claude_mpm/dashboard/static/js/components/code-tree/tree-constants.js +0 -235
  341. claude_mpm/dashboard/static/js/components/code-tree/tree-search.js +0 -409
  342. claude_mpm/dashboard/static/js/components/code-tree/tree-utils.js +0 -435
  343. claude_mpm/dashboard/static/js/components/code-tree.js +0 -5869
  344. claude_mpm/dashboard/static/js/components/code-viewer.js +0 -1386
  345. claude_mpm/hooks/claude_hooks/hook_handler_eventbus.py +0 -425
  346. claude_mpm/hooks/claude_hooks/hook_handler_original.py +0 -1041
  347. claude_mpm/hooks/claude_hooks/hook_handler_refactored.py +0 -347
  348. claude_mpm/services/agents/deployment/agent_lifecycle_manager_refactored.py +0 -575
  349. claude_mpm/services/project/analyzer_refactored.py +0 -450
  350. {claude_mpm-4.14.6.dist-info → claude_mpm-4.21.0.dist-info}/WHEEL +0 -0
  351. {claude_mpm-4.14.6.dist-info → claude_mpm-4.21.0.dist-info}/entry_points.txt +0 -0
  352. {claude_mpm-4.14.6.dist-info → claude_mpm-4.21.0.dist-info}/licenses/LICENSE +0 -0
  353. {claude_mpm-4.14.6.dist-info → claude_mpm-4.21.0.dist-info}/top_level.txt +0 -0
@@ -2,12 +2,22 @@
2
2
  External MCP Services Integration
3
3
  ==================================
4
4
 
5
- Manages installation and basic setup of external MCP services like mcp-vector-search
5
+ Manages detection and setup of external MCP services like mcp-vector-search
6
6
  and mcp-browser. These services run as separate MCP servers in Claude Code,
7
7
  not as part of the Claude MPM MCP Gateway.
8
8
 
9
- Note: As of the latest architecture, external services are registered as separate
10
- MCP servers in Claude Code configuration, not as tools within the gateway.
9
+ IMPORTANT: External services are NOT auto-installed. Users must manually install
10
+ them using pipx or pip. This gives users explicit control over which optional
11
+ services they want to enable.
12
+
13
+ Installation:
14
+ pipx install mcp-vector-search
15
+ pipx install mcp-browser
16
+ pipx install kuzu-memory
17
+ pipx install mcp-ticketer
18
+
19
+ Note: External services are registered as separate MCP servers in Claude Code
20
+ configuration, not as tools within the gateway.
11
21
  """
12
22
 
13
23
  import json
@@ -20,7 +30,12 @@ from claude_mpm.services.mcp_gateway.tools.base_adapter import BaseToolAdapter
20
30
 
21
31
 
22
32
  class ExternalMCPService(BaseToolAdapter):
23
- """Base class for external MCP service integration."""
33
+ """Base class for external MCP service integration.
34
+
35
+ External services are detected if already installed but are NOT
36
+ automatically installed. Users must install them manually using
37
+ pipx or pip to enable these optional features.
38
+ """
24
39
 
25
40
  def __init__(self, service_name: str, package_name: str):
26
41
  """
@@ -65,27 +80,37 @@ class ExternalMCPService(BaseToolAdapter):
65
80
  )
66
81
 
67
82
  async def initialize(
68
- self, auto_install: bool = True, interactive: bool = True
83
+ self, auto_install: bool = False, interactive: bool = False
69
84
  ) -> bool:
70
85
  """Initialize the external service.
71
86
 
87
+ NOTE: Auto-installation is disabled by default (v4.9.0+). Users must
88
+ manually install external services using pipx or pip.
89
+
72
90
  Args:
73
- auto_install: Whether to automatically install if not found
74
- interactive: Whether to prompt user for installation preferences
91
+ auto_install: Whether to automatically install if not found (default: False)
92
+ Deprecated - will be removed in future versions
93
+ interactive: Whether to prompt user for installation preferences (default: False)
94
+ Only used if auto_install=True
75
95
  """
76
96
  try:
77
97
  # Check if package is installed
78
98
  self._is_installed = await self._check_installation()
79
99
 
80
100
  if not self._is_installed and auto_install:
81
- self.logger.info(
82
- f"{self.package_name} not installed - attempting installation"
101
+ # This path is deprecated but kept for backward compatibility
102
+ self.logger.warning(
103
+ f"Auto-installation is deprecated. Please install {self.package_name} manually: "
104
+ f"pipx install {self.package_name}"
83
105
  )
84
106
  await self._install_package(interactive=interactive)
85
107
  self._is_installed = await self._check_installation()
86
108
 
87
109
  if not self._is_installed:
88
- self.logger.warning(f"{self.package_name} is not available")
110
+ self.logger.debug(
111
+ f"{self.package_name} is not available. "
112
+ f"Install manually with: pipx install {self.package_name}"
113
+ )
89
114
  return False
90
115
 
91
116
  self.logger.info(f"{self.package_name} is available")
@@ -136,12 +161,17 @@ class ExternalMCPService(BaseToolAdapter):
136
161
 
137
162
  if interactive:
138
163
  # Show user-friendly installation prompt
139
- print(f"\n⚠️ {self.package_name} not found")
140
- print("This package enables enhanced functionality (optional).")
141
- print("\nInstallation options:")
142
- print("1. Install via pip (recommended for this project)")
143
- print("2. Install via pipx (isolated, system-wide)")
144
- print("3. Skip (continue without this package)")
164
+ print(f"\n⚠️ {self.package_name} not found", file=sys.stderr)
165
+ print(
166
+ "This package enables enhanced functionality (optional).",
167
+ file=sys.stderr,
168
+ )
169
+ print("\nInstallation options:", file=sys.stderr)
170
+ print(
171
+ "1. Install via pip (recommended for this project)", file=sys.stderr
172
+ )
173
+ print("2. Install via pipx (isolated, system-wide)", file=sys.stderr)
174
+ print("3. Skip (continue without this package)", file=sys.stderr)
145
175
 
146
176
  try:
147
177
  choice = input("\nChoose option (1/2/3) [1]: ").strip() or "1"
@@ -155,7 +185,7 @@ class ExternalMCPService(BaseToolAdapter):
155
185
  )
156
186
  return False
157
187
  except (EOFError, KeyboardInterrupt):
158
- print("\nInstallation cancelled")
188
+ print("\nInstallation cancelled", file=sys.stderr)
159
189
  return False
160
190
  else:
161
191
  # Non-interactive: default to pip
@@ -176,7 +206,7 @@ class ExternalMCPService(BaseToolAdapter):
176
206
  async def _install_via_pip(self) -> bool:
177
207
  """Install package via pip."""
178
208
  try:
179
- print(f"\n📦 Installing {self.package_name} via pip...")
209
+ print(f"\n📦 Installing {self.package_name} via pip...", file=sys.stderr)
180
210
  result = subprocess.run(
181
211
  [sys.executable, "-m", "pip", "install", self.package_name],
182
212
  capture_output=True,
@@ -186,21 +216,21 @@ class ExternalMCPService(BaseToolAdapter):
186
216
  )
187
217
 
188
218
  if result.returncode == 0:
189
- print(f"✓ Successfully installed {self.package_name}")
219
+ print(f"✓ Successfully installed {self.package_name}", file=sys.stderr)
190
220
  self.logger.info(f"Successfully installed {self.package_name} via pip")
191
221
  return True
192
222
 
193
223
  error_msg = result.stderr.strip() if result.stderr else "Unknown error"
194
- print(f"✗ Installation failed: {error_msg}")
224
+ print(f"✗ Installation failed: {error_msg}", file=sys.stderr)
195
225
  self.logger.error(f"Failed to install {self.package_name}: {error_msg}")
196
226
  return False
197
227
 
198
228
  except subprocess.TimeoutExpired:
199
- print("✗ Installation timed out")
229
+ print("✗ Installation timed out", file=sys.stderr)
200
230
  self.logger.error(f"Installation of {self.package_name} timed out")
201
231
  return False
202
232
  except Exception as e:
203
- print(f"✗ Installation error: {e}")
233
+ print(f"✗ Installation error: {e}", file=sys.stderr)
204
234
  self.logger.error(f"Error installing {self.package_name}: {e}")
205
235
  return False
206
236
 
@@ -217,12 +247,12 @@ class ExternalMCPService(BaseToolAdapter):
217
247
  )
218
248
 
219
249
  if pipx_check.returncode != 0:
220
- print("✗ pipx is not installed")
221
- print("Install pipx first: python -m pip install pipx")
250
+ print("✗ pipx is not installed", file=sys.stderr)
251
+ print("Install pipx first: python -m pip install pipx", file=sys.stderr)
222
252
  self.logger.error("pipx not available for installation")
223
253
  return False
224
254
 
225
- print(f"\n📦 Installing {self.package_name} via pipx...")
255
+ print(f"\n📦 Installing {self.package_name} via pipx...", file=sys.stderr)
226
256
  result = subprocess.run(
227
257
  ["pipx", "install", self.package_name],
228
258
  capture_output=True,
@@ -232,26 +262,26 @@ class ExternalMCPService(BaseToolAdapter):
232
262
  )
233
263
 
234
264
  if result.returncode == 0:
235
- print(f"✓ Successfully installed {self.package_name}")
265
+ print(f"✓ Successfully installed {self.package_name}", file=sys.stderr)
236
266
  self.logger.info(f"Successfully installed {self.package_name} via pipx")
237
267
  return True
238
268
 
239
269
  error_msg = result.stderr.strip() if result.stderr else "Unknown error"
240
- print(f"✗ Installation failed: {error_msg}")
270
+ print(f"✗ Installation failed: {error_msg}", file=sys.stderr)
241
271
  self.logger.error(f"Failed to install {self.package_name}: {error_msg}")
242
272
  return False
243
273
 
244
274
  except FileNotFoundError:
245
- print("✗ pipx command not found")
246
- print("Install pipx first: python -m pip install pipx")
275
+ print("✗ pipx command not found", file=sys.stderr)
276
+ print("Install pipx first: python -m pip install pipx", file=sys.stderr)
247
277
  self.logger.error("pipx command not found")
248
278
  return False
249
279
  except subprocess.TimeoutExpired:
250
- print("✗ Installation timed out")
280
+ print("✗ Installation timed out", file=sys.stderr)
251
281
  self.logger.error(f"Installation of {self.package_name} timed out")
252
282
  return False
253
283
  except Exception as e:
254
- print(f"✗ Installation error: {e}")
284
+ print(f"✗ Installation error: {e}", file=sys.stderr)
255
285
  self.logger.error(f"Error installing {self.package_name}: {e}")
256
286
  return False
257
287
 
@@ -522,13 +552,20 @@ class MCPBrowserService(ExternalMCPService):
522
552
  class ExternalMCPServiceManager:
523
553
  """Manager for external MCP services.
524
554
 
525
- This manager is responsible for checking and installing Python packages
526
- for external MCP services. The actual registration of these services
527
- happens in Claude Code configuration as separate MCP servers.
555
+ This manager is responsible for detecting (but NOT installing) Python packages
556
+ for external MCP services. The actual registration of these services happens
557
+ in Claude Code configuration as separate MCP servers.
558
+
559
+ IMPORTANT: As of v4.9.0, this manager NO LONGER auto-installs missing services.
560
+ Users must manually install external services using pipx or pip:
561
+ - pipx install mcp-vector-search
562
+ - pipx install mcp-browser
563
+ - pipx install kuzu-memory
564
+ - pipx install mcp-ticketer
528
565
 
529
- Note: This class is maintained for backward compatibility and package
530
- management. The actual tool registration is handled by separate MCP
531
- server instances in Claude Code.
566
+ Note: This class is maintained for backward compatibility and service detection.
567
+ The actual tool registration is handled by separate MCP server instances in
568
+ Claude Code.
532
569
  """
533
570
 
534
571
  def __init__(self):
@@ -539,20 +576,34 @@ class ExternalMCPServiceManager:
539
576
  async def initialize_services(self) -> List[ExternalMCPService]:
540
577
  """Initialize all external MCP services.
541
578
 
542
- This method checks if external service packages are installed
543
- and attempts to install them if missing. It does NOT register
544
- them as tools in the gateway - they run as separate MCP servers.
579
+ This method checks if external service packages are already installed
580
+ and registers them if available. It does NOT auto-install missing services.
581
+
582
+ External MCP services (mcp-vector-search, mcp-browser, kuzu-memory, mcp-ticketer)
583
+ must be manually installed by users. This gives users explicit control over
584
+ which services they want to use.
585
+
586
+ Installation instructions:
587
+ - mcp-vector-search: pipx install mcp-vector-search
588
+ - mcp-browser: pipx install mcp-browser
589
+ - kuzu-memory: pipx install kuzu-memory
590
+ - mcp-ticketer: pipx install mcp-ticketer
591
+
592
+ Services run as separate MCP servers in Claude Code, not as tools within
593
+ the gateway.
545
594
  """
546
595
  # Create service instances
547
- # Note: kuzu-memory is configured via MCPConfigManager and runs as a separate MCP server
548
- # It doesn't need to be included here since it's already set up through the MCP config
596
+ # Note: kuzu-memory and mcp-ticketer are configured via MCPConfigManager
597
+ # and run as separate MCP servers. They don't need to be included here
598
+ # since they're already set up through the MCP config.
549
599
  services = [MCPVectorSearchService(), MCPBrowserService()]
550
600
 
551
- # Initialize each service
601
+ # Initialize each service (check if installed, but DO NOT auto-install)
552
602
  initialized_services = []
553
603
  for service in services:
554
604
  try:
555
- if await service.initialize():
605
+ # Pass auto_install=False to prevent automatic installation
606
+ if await service.initialize(auto_install=False, interactive=False):
556
607
  initialized_services.append(service)
557
608
  if self.logger:
558
609
  self.logger.info(
@@ -560,7 +611,8 @@ class ExternalMCPServiceManager:
560
611
  )
561
612
  elif self.logger:
562
613
  self.logger.debug(
563
- f"Service not available (optional): {service.service_name}"
614
+ f"Service not available (optional): {service.service_name}. "
615
+ f"Install manually with: pipx install {service.package_name}"
564
616
  )
565
617
  except Exception as e:
566
618
  if self.logger:
@@ -26,6 +26,7 @@ from typing import Any, Dict
26
26
  import psutil
27
27
 
28
28
  from claude_mpm.config.paths import paths
29
+ from claude_mpm.core.enums import HealthStatus, OperationResult, ServiceState
29
30
  from claude_mpm.core.logger import get_logger
30
31
  from claude_mpm.services.mcp_gateway.core.interfaces import (
31
32
  MCPToolDefinition,
@@ -168,20 +169,20 @@ class HealthCheckTool(BaseToolAdapter):
168
169
  if i < len(check_results):
169
170
  if isinstance(check_results[i], Exception):
170
171
  results["checks"][check_name] = {
171
- "status": "error",
172
+ "status": OperationResult.ERROR,
172
173
  "error": str(check_results[i]),
173
174
  }
174
175
  else:
175
176
  results["checks"][check_name] = check_results[i]
176
177
  else:
177
178
  results["checks"][check_name] = {
178
- "status": "timeout",
179
+ "status": OperationResult.TIMEOUT,
179
180
  "error": "Check timed out",
180
181
  }
181
182
 
182
183
  except asyncio.TimeoutError:
183
184
  results["checks"]["timeout"] = {
184
- "status": "error",
185
+ "status": OperationResult.ERROR,
185
186
  "error": f"Health checks timed out after {timeout} seconds",
186
187
  }
187
188
 
@@ -194,7 +195,7 @@ class HealthCheckTool(BaseToolAdapter):
194
195
  async def _check_system_health(self, detailed: bool) -> Dict[str, Any]:
195
196
  """Check system health (CPU, memory, disk, etc.)."""
196
197
  check_result = {
197
- "status": "healthy",
198
+ "status": ServiceState.RUNNING,
198
199
  "checks": {},
199
200
  "warnings": [],
200
201
  "errors": [],
@@ -219,7 +220,7 @@ class HealthCheckTool(BaseToolAdapter):
219
220
 
220
221
  if memory_usage > 90:
221
222
  check_result["errors"].append("High memory usage detected")
222
- check_result["status"] = "unhealthy"
223
+ check_result["status"] = HealthStatus.UNHEALTHY
223
224
  elif memory_usage > 80:
224
225
  check_result["warnings"].append("Elevated memory usage")
225
226
 
@@ -232,7 +233,7 @@ class HealthCheckTool(BaseToolAdapter):
232
233
 
233
234
  if cpu_usage > 95:
234
235
  check_result["errors"].append("High CPU usage detected")
235
- check_result["status"] = "unhealthy"
236
+ check_result["status"] = HealthStatus.UNHEALTHY
236
237
  elif cpu_usage > 80:
237
238
  check_result["warnings"].append("Elevated CPU usage")
238
239
 
@@ -248,7 +249,7 @@ class HealthCheckTool(BaseToolAdapter):
248
249
 
249
250
  if disk_usage_percent > 95:
250
251
  check_result["errors"].append("Disk space critically low")
251
- check_result["status"] = "unhealthy"
252
+ check_result["status"] = HealthStatus.UNHEALTHY
252
253
  elif disk_usage_percent > 85:
253
254
  check_result["warnings"].append("Disk space running low")
254
255
 
@@ -262,7 +263,7 @@ class HealthCheckTool(BaseToolAdapter):
262
263
  }
263
264
 
264
265
  except Exception as e:
265
- check_result["status"] = "error"
266
+ check_result["status"] = HealthStatus.UNHEALTHY
266
267
  check_result["errors"].append(f"System health check failed: {e}")
267
268
 
268
269
  return check_result
@@ -270,7 +271,7 @@ class HealthCheckTool(BaseToolAdapter):
270
271
  async def _check_gateway_health(self, detailed: bool) -> Dict[str, Any]:
271
272
  """Check MCP Gateway health."""
272
273
  check_result = {
273
- "status": "healthy",
274
+ "status": ServiceState.RUNNING,
274
275
  "checks": {},
275
276
  "warnings": [],
276
277
  "errors": [],
@@ -302,10 +303,10 @@ class HealthCheckTool(BaseToolAdapter):
302
303
 
303
304
  if not mcp_dir.exists():
304
305
  check_result["errors"].append("MCP directory does not exist")
305
- check_result["status"] = "unhealthy"
306
+ check_result["status"] = HealthStatus.UNHEALTHY
306
307
 
307
308
  except Exception as e:
308
- check_result["status"] = "error"
309
+ check_result["status"] = HealthStatus.UNHEALTHY
309
310
  check_result["errors"].append(f"Gateway health check failed: {e}")
310
311
 
311
312
  return check_result
@@ -313,7 +314,7 @@ class HealthCheckTool(BaseToolAdapter):
313
314
  async def _check_tools_health(self, detailed: bool) -> Dict[str, Any]:
314
315
  """Check MCP tools health."""
315
316
  check_result = {
316
- "status": "healthy",
317
+ "status": ServiceState.RUNNING,
317
318
  "checks": {},
318
319
  "warnings": [],
319
320
  "errors": [],
@@ -353,11 +354,11 @@ class HealthCheckTool(BaseToolAdapter):
353
354
  )
354
355
 
355
356
  if len(available_essential) == 0:
356
- check_result["status"] = "unhealthy"
357
+ check_result["status"] = HealthStatus.UNHEALTHY
357
358
  check_result["errors"].append("No essential tools available")
358
359
 
359
360
  except Exception as e:
360
- check_result["status"] = "error"
361
+ check_result["status"] = HealthStatus.UNHEALTHY
361
362
  check_result["errors"].append(f"Tools health check failed: {e}")
362
363
 
363
364
  return check_result
@@ -365,7 +366,7 @@ class HealthCheckTool(BaseToolAdapter):
365
366
  async def _check_config_health(self, detailed: bool) -> Dict[str, Any]:
366
367
  """Check configuration health."""
367
368
  check_result = {
368
- "status": "healthy",
369
+ "status": ServiceState.RUNNING,
369
370
  "checks": {},
370
371
  "warnings": [],
371
372
  "errors": [],
@@ -401,7 +402,7 @@ class HealthCheckTool(BaseToolAdapter):
401
402
  }
402
403
 
403
404
  except Exception as e:
404
- check_result["status"] = "error"
405
+ check_result["status"] = HealthStatus.UNHEALTHY
405
406
  check_result["errors"].append(f"Config health check failed: {e}")
406
407
 
407
408
  return check_result
@@ -413,13 +414,13 @@ class HealthCheckTool(BaseToolAdapter):
413
414
 
414
415
  statuses = [check.get("status", "unknown") for check in checks.values()]
415
416
 
416
- if "error" in statuses:
417
- return "error"
418
- if "unhealthy" in statuses:
417
+ # Check for unhealthy (handle both string and enum)
418
+ if HealthStatus.UNHEALTHY in statuses or "unhealthy" in statuses:
419
419
  return "unhealthy"
420
420
  if "warning" in statuses:
421
421
  return "warning"
422
- if all(status == "healthy" for status in statuses):
422
+ # Check for healthy (handle both string and enum)
423
+ if all(status in (HealthStatus.HEALTHY, "healthy") for status in statuses):
423
424
  return "healthy"
424
425
  return "unknown"
425
426
 
@@ -436,19 +437,20 @@ class HealthCheckTool(BaseToolAdapter):
436
437
  for check_name, check_result in checks.items():
437
438
  status = check_result.get("status", "unknown")
438
439
 
439
- if status == "healthy":
440
+ # Check for healthy (handle both string and enum)
441
+ if status in (HealthStatus.HEALTHY, "healthy"):
440
442
  summary["healthy"] += 1
441
- elif status in ["warning", "unhealthy"]:
443
+ elif status in ["warning", HealthStatus.UNHEALTHY, "unhealthy"]:
442
444
  summary["warnings"] += 1
443
445
  # Collect warning messages
444
446
  warnings = check_result.get("warnings", [])
445
447
  for warning in warnings:
446
448
  summary["issues"].append(f"{check_name}: {warning}")
447
- elif status == "error":
448
- summary["errors"] += 1
449
- # Collect error messages
450
- errors = check_result.get("errors", [])
451
- for error in errors:
452
- summary["issues"].append(f"{check_name}: {error}")
449
+ # Collect error messages if status is unhealthy
450
+ if status in (HealthStatus.UNHEALTHY, "unhealthy"):
451
+ summary["errors"] += 1
452
+ errors = check_result.get("errors", [])
453
+ for error in errors:
454
+ summary["issues"].append(f"{check_name}: {error}")
453
455
 
454
456
  return summary
@@ -11,6 +11,7 @@ Extracted from ClaudeRunner to follow Single Responsibility Principle.
11
11
  from typing import Any, Dict
12
12
 
13
13
  from claude_mpm.core.base_service import BaseService
14
+ from claude_mpm.core.enums import ServiceState
14
15
  from claude_mpm.services.core.interfaces import MemoryHookInterface
15
16
 
16
17
 
@@ -463,5 +464,7 @@ class MemoryHookService(BaseService, MemoryHookInterface):
463
464
  "hook_service_available": self.hook_service is not None,
464
465
  "memory_enabled": self.is_memory_enabled(),
465
466
  "total_hooks": len(self.registered_hooks),
466
- "status": "active" if self.registered_hooks else "inactive",
467
+ "status": (
468
+ ServiceState.RUNNING if self.registered_hooks else ServiceState.IDLE
469
+ ),
467
470
  }
@@ -31,6 +31,7 @@ import time
31
31
  from pathlib import Path
32
32
  from typing import Optional, Tuple
33
33
 
34
+ from ...core.enums import OperationResult
34
35
  from ...core.logging_config import get_logger
35
36
 
36
37
 
@@ -906,7 +907,7 @@ class DaemonManager:
906
907
  with self.startup_status_file.open() as f:
907
908
  status = f.read().strip()
908
909
 
909
- if status == "success":
910
+ if status == OperationResult.SUCCESS:
910
911
  # Cleanup status file
911
912
  Path(self.startup_status_file).unlink(missing_ok=True)
912
913
  return True
@@ -936,7 +937,7 @@ class DaemonManager:
936
937
  # Don't check if file exists - we need to write to it regardless
937
938
  # The parent created it and is waiting for us to update it
938
939
  with self.startup_status_file.open("w") as f:
939
- f.write("success")
940
+ f.write(OperationResult.SUCCESS)
940
941
  f.flush() # Ensure it's written immediately
941
942
  os.fsync(f.fileno()) # Force write to disk
942
943
  except Exception:
@@ -18,6 +18,7 @@ from typing import Dict, Set
18
18
 
19
19
  import socketio
20
20
 
21
+ from ....core.enums import ServiceState
21
22
  from ....core.logging_config import get_logger
22
23
 
23
24
 
@@ -128,7 +129,7 @@ class DashboardHandler:
128
129
  try:
129
130
  status = {
130
131
  "service": "unified-monitor",
131
- "status": "running",
132
+ "status": ServiceState.RUNNING,
132
133
  "clients_connected": len(self.connected_clients),
133
134
  "uptime": asyncio.get_event_loop().time(),
134
135
  "features": {
@@ -19,6 +19,7 @@ from typing import Dict, List
19
19
 
20
20
  import socketio
21
21
 
22
+ from ....core.enums import ServiceState
22
23
  from ....core.logging_config import get_logger
23
24
 
24
25
 
@@ -170,7 +171,7 @@ class HookHandler:
170
171
  session_info = {
171
172
  "session_id": session_id,
172
173
  "start_time": asyncio.get_event_loop().time(),
173
- "status": "active",
174
+ "status": ServiceState.RUNNING,
174
175
  "event_count": 0,
175
176
  "last_activity": asyncio.get_event_loop().time(),
176
177
  "metadata": data.get("metadata", {}),
@@ -23,6 +23,7 @@ import time
23
23
  from pathlib import Path
24
24
  from typing import Optional, Tuple
25
25
 
26
+ from ....core.enums import OperationResult
26
27
  from ....core.logging_config import get_logger
27
28
 
28
29
 
@@ -388,7 +389,7 @@ class DaemonLifecycle:
388
389
  with self.startup_status_file.open() as f:
389
390
  status = f.read().strip()
390
391
 
391
- if status == "success":
392
+ if status == OperationResult.SUCCESS:
392
393
  # Child started successfully
393
394
  self._cleanup_status_file()
394
395
  return True
@@ -438,7 +439,7 @@ class DaemonLifecycle:
438
439
  if self.startup_status_file:
439
440
  try:
440
441
  with self.startup_status_file.open("w") as f:
441
- f.write("success")
442
+ f.write(OperationResult.SUCCESS)
442
443
  except Exception as e:
443
444
  self.logger.error(f"Failed to report startup success: {e}")
444
445
 
@@ -26,6 +26,7 @@ from typing import Dict, Optional
26
26
  import socketio
27
27
  from aiohttp import web
28
28
 
29
+ from ...core.enums import ServiceState
29
30
  from ...core.logging_config import get_logger
30
31
  from ...dashboard.api.simple_directory import list_directory
31
32
  from .event_emitter import get_event_emitter
@@ -333,7 +334,7 @@ class UnifiedMonitorServer:
333
334
 
334
335
  return web.json_response(
335
336
  {
336
- "status": "healthy",
337
+ "status": ServiceState.RUNNING,
337
338
  "service": "claude-mpm-monitor", # Important: must match what is_our_service() checks
338
339
  "version": version,
339
340
  "port": self.port,
@@ -17,6 +17,7 @@ from datetime import timezone
17
17
  from typing import Any, Dict, List, Optional
18
18
 
19
19
  from claude_mpm.core.base_service import BaseService
20
+ from claude_mpm.core.enums import OperationResult, ServiceState
20
21
  from claude_mpm.services.core.interfaces import SessionManagementInterface
21
22
 
22
23
 
@@ -223,7 +224,7 @@ class SessionManagementService(BaseService, SessionManagementInterface):
223
224
  "id": session_id,
224
225
  "config": session_config,
225
226
  "start_time": time.time(),
226
- "status": "active",
227
+ "status": ServiceState.RUNNING,
227
228
  "type": session_config.get("type", "interactive"),
228
229
  }
229
230
 
@@ -267,7 +268,7 @@ class SessionManagementService(BaseService, SessionManagementInterface):
267
268
  return self.active_sessions[session_id].copy()
268
269
  return {
269
270
  "id": session_id,
270
- "status": "not_found",
271
+ "status": OperationResult.ERROR,
271
272
  "error": "Session not found",
272
273
  }
273
274