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.
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
@@ -30,9 +30,10 @@ from typing import Dict, List, Optional
30
30
  import psutil
31
31
  from filelock import FileLock
32
32
 
33
+ from claude_mpm.core.enums import ServiceState
33
34
  from claude_mpm.services.core.base import SyncBaseService
34
35
  from claude_mpm.services.core.interfaces.process import IDeploymentStateManager
35
- from claude_mpm.services.core.models.process import DeploymentState, ProcessStatus
36
+ from claude_mpm.services.core.models.process import DeploymentState
36
37
 
37
38
 
38
39
  class StateCorruptionError(Exception):
@@ -206,12 +207,12 @@ class DeploymentStateManager(SyncBaseService, IDeploymentStateManager):
206
207
  states = self.load_state()
207
208
  return list(states.values())
208
209
 
209
- def get_deployments_by_status(self, status: ProcessStatus) -> List[DeploymentState]:
210
+ def get_deployments_by_status(self, status: ServiceState) -> List[DeploymentState]:
210
211
  """
211
212
  Get all deployments with a specific status.
212
213
 
213
214
  Args:
214
- status: ProcessStatus to filter by
215
+ status: ServiceState to filter by
215
216
 
216
217
  Returns:
217
218
  List of matching DeploymentState objects
@@ -295,14 +296,14 @@ class DeploymentStateManager(SyncBaseService, IDeploymentStateManager):
295
296
  return False
296
297
 
297
298
  def update_deployment_status(
298
- self, deployment_id: str, status: ProcessStatus
299
+ self, deployment_id: str, status: ServiceState
299
300
  ) -> bool:
300
301
  """
301
302
  Update the status of a deployment.
302
303
 
303
304
  Args:
304
305
  deployment_id: Unique deployment identifier
305
- status: New ProcessStatus
306
+ status: New ServiceState
306
307
 
307
308
  Returns:
308
309
  True if updated, False if deployment not found
@@ -45,12 +45,12 @@ from typing import Any, Dict, List, Optional
45
45
 
46
46
  import yaml
47
47
 
48
+ from claude_mpm.core.enums import ServiceState
48
49
  from claude_mpm.services.core.base import SyncBaseService
49
50
  from claude_mpm.services.core.models.health import DeploymentHealth
50
51
  from claude_mpm.services.core.models.process import (
51
52
  DeploymentState,
52
53
  ProcessInfo,
53
- ProcessStatus,
54
54
  StartConfig,
55
55
  )
56
56
  from claude_mpm.services.core.models.restart import RestartConfig, RestartHistory
@@ -384,7 +384,7 @@ class UnifiedLocalOpsManager(SyncBaseService):
384
384
 
385
385
  def list_deployments(
386
386
  self,
387
- status_filter: Optional[ProcessStatus] = None,
387
+ status_filter: Optional[ServiceState] = None,
388
388
  ) -> List[DeploymentState]:
389
389
  """
390
390
  List all deployments.
@@ -1130,134 +1130,15 @@ class MCPConfigManager:
1130
1130
  """
1131
1131
  Detect and fix corrupted MCP service installations.
1132
1132
 
1133
- This method:
1134
- 1. Tests each MCP service for import/execution errors
1135
- 2. Automatically reinstalls corrupted services
1136
- 3. Fixes missing dependencies (like mcp-ticketer's gql)
1137
- 4. Validates fixes worked
1133
+ NOTE: Proactive health checking has been disabled.
1134
+ Each MCP service should stand on its own and handle its own issues.
1135
+ This function now only returns success without checking services.
1138
1136
 
1139
1137
  Returns:
1140
1138
  Tuple of (success, message)
1141
1139
  """
1142
- services_to_fix = []
1143
- fixed_services = []
1144
- failed_services = []
1145
-
1146
- # Check each service for issues
1147
- for service_name in self.PIPX_SERVICES:
1148
- self.logger.info(f"🔍 Checking {service_name} for issues...")
1149
- issue_type = self._detect_service_issue(service_name)
1150
- if issue_type:
1151
- services_to_fix.append((service_name, issue_type))
1152
- self.logger.info(f" ⚠️ Found issue with {service_name}: {issue_type}")
1153
- else:
1154
- self.logger.debug(f" ✅ {service_name} is functioning correctly")
1155
-
1156
- if not services_to_fix:
1157
- return True, "All MCP services are functioning correctly"
1158
-
1159
- # Fix each problematic service
1160
- for service_name, issue_type in services_to_fix:
1161
- self.logger.info(f"🔧 Fixing {service_name}: {issue_type}")
1162
-
1163
- if issue_type == "not_installed":
1164
- # Install the service
1165
- success, method = self._install_service_with_fallback(service_name)
1166
- if success:
1167
- fixed_services.append(f"{service_name} (installed via {method})")
1168
- else:
1169
- failed_services.append(f"{service_name} (installation failed)")
1170
-
1171
- elif issue_type == "import_error":
1172
- # Reinstall to fix corrupted installation
1173
- self.logger.info(
1174
- f" Reinstalling {service_name} to fix import errors..."
1175
- )
1176
- success = self._reinstall_service(service_name)
1177
- if success:
1178
- # NOTE: Removed automatic dependency injection workaround
1179
- # Package maintainers should fix dependency declarations
1180
- fixed_services.append(f"{service_name} (reinstalled)")
1181
- else:
1182
- failed_services.append(f"{service_name} (reinstall failed)")
1183
-
1184
- elif issue_type == "missing_dependency":
1185
- # Fix missing dependencies - try injection first, then reinstall if needed
1186
- self.logger.info(
1187
- f" {service_name} has missing dependencies - attempting fix..."
1188
- )
1189
-
1190
- # First try to inject dependencies without reinstalling
1191
- injection_success = self._inject_missing_dependencies(service_name)
1192
-
1193
- if injection_success:
1194
- # Verify the fix worked
1195
- issue_after_injection = self._detect_service_issue(service_name)
1196
- if issue_after_injection is None:
1197
- fixed_services.append(f"{service_name} (dependencies injected)")
1198
- self.logger.info(
1199
- f" ✅ Fixed {service_name} with dependency injection"
1200
- )
1201
- continue # Move to next service
1202
-
1203
- # If injection alone didn't work, try full reinstall
1204
- self.logger.info(
1205
- " Dependency injection insufficient, trying full reinstall..."
1206
- )
1207
- success = self._auto_reinstall_mcp_service(service_name)
1208
- if success:
1209
- fixed_services.append(
1210
- f"{service_name} (auto-reinstalled with dependencies)"
1211
- )
1212
- else:
1213
- # Provide specific manual fix for known services
1214
- if service_name == "mcp-ticketer":
1215
- self.logger.warning(
1216
- f" Auto-fix failed for {service_name}. Manual fix: "
1217
- f"pipx uninstall {service_name} && pipx install {service_name} && pipx inject {service_name} gql"
1218
- )
1219
- else:
1220
- self.logger.warning(
1221
- f" Auto-reinstall failed for {service_name}. Manual fix: "
1222
- f"pipx uninstall {service_name} && pipx install {service_name}"
1223
- )
1224
- failed_services.append(f"{service_name} (auto-reinstall failed)")
1225
-
1226
- elif issue_type == "path_issue":
1227
- # Path issues are handled by config updates
1228
- self.logger.info(
1229
- f" Path issue for {service_name} will be fixed by config update"
1230
- )
1231
- fixed_services.append(f"{service_name} (config updated)")
1232
-
1233
- # Build result message
1234
- messages = []
1235
- if fixed_services:
1236
- messages.append(f"✅ Fixed: {', '.join(fixed_services)}")
1237
- if failed_services:
1238
- messages.append(f"❌ Failed: {', '.join(failed_services)}")
1239
-
1240
- # Return success if at least some services were fixed
1241
- success = len(fixed_services) > 0 or len(failed_services) == 0
1242
- message = " | ".join(messages) if messages else "No services needed fixing"
1243
-
1244
- # Provide manual fix instructions if auto-fix failed
1245
- if failed_services:
1246
- message += "\n\n💡 Manual fix instructions:"
1247
- for failed in failed_services:
1248
- service = failed.split(" ")[0]
1249
- if service in self.SERVICE_MISSING_DEPENDENCIES:
1250
- deps = " ".join(
1251
- [
1252
- f"&& pipx inject {service} {dep}"
1253
- for dep in self.SERVICE_MISSING_DEPENDENCIES[service]
1254
- ]
1255
- )
1256
- message += f"\n • {service}: pipx uninstall {service} && pipx install {service} {deps}"
1257
- else:
1258
- message += f"\n • {service}: pipx uninstall {service} && pipx install {service}"
1259
-
1260
- return success, message
1140
+ # Services should stand on their own - no proactive health checking
1141
+ return True, "MCP services managing their own health"
1261
1142
 
1262
1143
  def _detect_service_issue(self, service_name: str) -> Optional[str]:
1263
1144
  """
@@ -1492,7 +1373,7 @@ class MCPConfigManager:
1492
1373
  )
1493
1374
 
1494
1375
  if result.returncode == 0:
1495
- self.logger.info(f" ✅ Successfully injected {dep}")
1376
+ self.logger.debug(f" ✅ Successfully injected {dep}")
1496
1377
  # Check if already injected (pipx will complain if package already exists)
1497
1378
  elif (
1498
1379
  "already satisfied" in result.stderr.lower()
@@ -1577,7 +1458,7 @@ class MCPConfigManager:
1577
1458
  )
1578
1459
 
1579
1460
  # Verify the reinstall worked
1580
- self.logger.info(f" → Verifying {service_name} installation...")
1461
+ self.logger.debug(f" → Verifying {service_name} installation...")
1581
1462
  issue = self._detect_service_issue(service_name)
1582
1463
 
1583
1464
  if issue is None:
@@ -163,17 +163,21 @@ class MCPAutoConfigurator:
163
163
  Returns:
164
164
  True if user agrees, False if declines, None if timeout
165
165
  """
166
- print("\n" + "=" * 60)
167
- print("🔧 MCP Gateway Configuration")
168
- print("=" * 60)
169
- print("\nClaude MPM can automatically configure MCP Gateway for")
170
- print("Claude Code integration. This enables advanced features:")
171
- print(" • File analysis and summarization")
172
- print(" • System diagnostics")
173
- print(" Ticket management")
174
- print(" • And more...")
175
- print("\nWould you like to configure it now? (y/n)")
176
- print(f"(Auto-declining in {timeout} seconds)")
166
+ print("\n" + "=" * 60, file=sys.stderr)
167
+ print("🔧 MCP Gateway Configuration", file=sys.stderr)
168
+ print("=" * 60, file=sys.stderr)
169
+ print(
170
+ "\nClaude MPM can automatically configure MCP Gateway for", file=sys.stderr
171
+ )
172
+ print(
173
+ "Claude Code integration. This enables advanced features:", file=sys.stderr
174
+ )
175
+ print(" File analysis and summarization", file=sys.stderr)
176
+ print(" System diagnostics", file=sys.stderr)
177
+ print(" • Ticket management", file=sys.stderr)
178
+ print(" • And more...", file=sys.stderr)
179
+ print("\nWould you like to configure it now? (y/n)", file=sys.stderr)
180
+ print(f"(Auto-declining in {timeout} seconds)", file=sys.stderr)
177
181
 
178
182
  # Use threading for cross-platform timeout support
179
183
  # Python 3.7+ has queue built-in - no need to check, we require 3.10+
@@ -203,7 +207,7 @@ class MCPAutoConfigurator:
203
207
 
204
208
  if input_thread.is_alive():
205
209
  # Timed out
206
- print("\n(Timed out - declining)")
210
+ print("\n(Timed out - declining)", file=sys.stderr)
207
211
  return None
208
212
  # Got input
209
213
  return user_input in ["y", "yes"]
@@ -220,7 +224,7 @@ class MCPAutoConfigurator:
220
224
  if self.claude_config_path.exists():
221
225
  backup_path = self._create_backup()
222
226
  if backup_path:
223
- print(f"✅ Backup created: {backup_path}")
227
+ print(f"✅ Backup created: {backup_path}", file=sys.stderr)
224
228
 
225
229
  # Load or create configuration
226
230
  config = self._load_or_create_config()
@@ -232,7 +236,7 @@ class MCPAutoConfigurator:
232
236
  # Find claude-mpm executable
233
237
  executable = self._find_claude_mpm_executable()
234
238
  if not executable:
235
- print("❌ Could not find claude-mpm executable")
239
+ print("❌ Could not find claude-mpm executable", file=sys.stderr)
236
240
  return False
237
241
 
238
242
  # Configure MCP server
@@ -246,20 +250,22 @@ class MCPAutoConfigurator:
246
250
  with self.claude_config_path.open("w") as f:
247
251
  json.dump(config, f, indent=2)
248
252
 
249
- print(f"✅ Configuration saved to: {self.claude_config_path}")
250
- print("\n🎉 MCP Gateway configured successfully!")
251
- print("\nNext steps:")
252
- print("1. Restart Claude Code (if running)")
253
- print("2. Look for the MCP icon in the interface")
254
- print("3. Try @claude-mpm-gateway in a conversation")
253
+ print(
254
+ f" Configuration saved to: {self.claude_config_path}", file=sys.stderr
255
+ )
256
+ print("\n🎉 MCP Gateway configured successfully!", file=sys.stderr)
257
+ print("\nNext steps:", file=sys.stderr)
258
+ print("1. Restart Claude Code (if running)", file=sys.stderr)
259
+ print("2. Look for the MCP icon in the interface", file=sys.stderr)
260
+ print("3. Try @claude-mpm-gateway in a conversation", file=sys.stderr)
255
261
 
256
262
  return True
257
263
 
258
264
  except Exception as e:
259
265
  self.logger.error(f"Auto-configuration failed: {e}")
260
- print(f"❌ Configuration failed: {e}")
261
- print("\nYou can configure manually with:")
262
- print(" claude-mpm mcp install")
266
+ print(f"❌ Configuration failed: {e}", file=sys.stderr)
267
+ print("\nYou can configure manually with:", file=sys.stderr)
268
+ print(" claude-mpm mcp install", file=sys.stderr)
263
269
  return False
264
270
 
265
271
  def _create_backup(self) -> Optional[Path]:
@@ -344,8 +350,8 @@ class MCPAutoConfigurator:
344
350
  if user_choice:
345
351
  return self.auto_configure()
346
352
  if user_choice is False: # User explicitly said no
347
- print("\n📝 You can configure MCP later with:")
348
- print(" claude-mpm mcp install")
353
+ print("\n📝 You can configure MCP later with:", file=sys.stderr)
354
+ print(" claude-mpm mcp install", file=sys.stderr)
349
355
  # If timeout (None), don't show additional message
350
356
  return False
351
357
 
@@ -5,7 +5,7 @@ MCP Gateway Core Module
5
5
  Core interfaces and base classes for the MCP Gateway service.
6
6
  """
7
7
 
8
- from .base import BaseMCPService, MCPServiceState
8
+ from .base import BaseMCPService
9
9
  from .exceptions import (
10
10
  MCPCommunicationError,
11
11
  MCPConfigurationError,
@@ -38,7 +38,6 @@ __all__ = [
38
38
  # Exceptions
39
39
  "MCPException",
40
40
  "MCPServerError",
41
- "MCPServiceState",
42
41
  "MCPToolNotFoundError",
43
42
  "MCPValidationError",
44
43
  ]
@@ -8,25 +8,12 @@ Part of ISS-0034: Infrastructure Setup - MCP Gateway Project Foundation
8
8
  """
9
9
 
10
10
  import asyncio
11
- from enum import Enum
12
11
  from typing import Any, Dict, Optional
13
12
 
13
+ from claude_mpm.core.enums import ServiceState
14
14
  from claude_mpm.services.core.base import BaseService
15
15
 
16
16
 
17
- class MCPServiceState(Enum):
18
- """MCP service lifecycle states."""
19
-
20
- UNINITIALIZED = "uninitialized"
21
- INITIALIZING = "initializing"
22
- INITIALIZED = "initialized"
23
- STARTING = "starting"
24
- RUNNING = "running"
25
- STOPPING = "stopping"
26
- STOPPED = "stopped"
27
- ERROR = "error"
28
-
29
-
30
17
  class BaseMCPService(BaseService):
31
18
  """
32
19
  Base class for all MCP Gateway services.
@@ -53,7 +40,7 @@ class BaseMCPService(BaseService):
53
40
  config: Service-specific configuration
54
41
  """
55
42
  super().__init__(service_name or "MCPService", config)
56
- self._state = MCPServiceState.UNINITIALIZED
43
+ self._state = ServiceState.UNINITIALIZED
57
44
  self._health_status = {
58
45
  "healthy": False,
59
46
  "state": self._state.value,
@@ -76,13 +63,13 @@ class BaseMCPService(BaseService):
76
63
  """
77
64
  async with self._state_lock:
78
65
  if self._state not in [
79
- MCPServiceState.UNINITIALIZED,
80
- MCPServiceState.STOPPED,
66
+ ServiceState.UNINITIALIZED,
67
+ ServiceState.STOPPED,
81
68
  ]:
82
69
  self.log_warning(f"Cannot initialize from state {self._state.value}")
83
70
  return False
84
71
 
85
- self._state = MCPServiceState.INITIALIZING
72
+ self._state = ServiceState.INITIALIZING
86
73
  self.log_info("Initializing MCP service")
87
74
 
88
75
  try:
@@ -91,13 +78,13 @@ class BaseMCPService(BaseService):
91
78
 
92
79
  async with self._state_lock:
93
80
  if success:
94
- self._state = MCPServiceState.INITIALIZED
81
+ self._state = ServiceState.INITIALIZED
95
82
  self._initialized = True
96
83
  self._health_status["healthy"] = True
97
84
  self._health_status["state"] = self._state.value
98
85
  self.log_info("MCP service initialized successfully")
99
86
  else:
100
- self._state = MCPServiceState.ERROR
87
+ self._state = ServiceState.ERROR
101
88
  self._health_status["healthy"] = False
102
89
  self._health_status["state"] = self._state.value
103
90
  self.log_error("MCP service initialization failed")
@@ -106,7 +93,7 @@ class BaseMCPService(BaseService):
106
93
 
107
94
  except Exception as e:
108
95
  async with self._state_lock:
109
- self._state = MCPServiceState.ERROR
96
+ self._state = ServiceState.ERROR
110
97
  self._health_status["healthy"] = False
111
98
  self._health_status["state"] = self._state.value
112
99
  self._health_status["details"]["error"] = str(e)
@@ -134,11 +121,11 @@ class BaseMCPService(BaseService):
134
121
  True if startup successful
135
122
  """
136
123
  async with self._state_lock:
137
- if self._state != MCPServiceState.INITIALIZED:
124
+ if self._state != ServiceState.INITIALIZED:
138
125
  self.log_warning(f"Cannot start from state {self._state.value}")
139
126
  return False
140
127
 
141
- self._state = MCPServiceState.STARTING
128
+ self._state = ServiceState.STARTING
142
129
  self.log_info("Starting MCP service")
143
130
 
144
131
  try:
@@ -146,12 +133,12 @@ class BaseMCPService(BaseService):
146
133
 
147
134
  async with self._state_lock:
148
135
  if success:
149
- self._state = MCPServiceState.RUNNING
136
+ self._state = ServiceState.RUNNING
150
137
  self._health_status["healthy"] = True
151
138
  self._health_status["state"] = self._state.value
152
139
  self.log_info("MCP service started successfully")
153
140
  else:
154
- self._state = MCPServiceState.ERROR
141
+ self._state = ServiceState.ERROR
155
142
  self._health_status["healthy"] = False
156
143
  self._health_status["state"] = self._state.value
157
144
  self.log_error("MCP service startup failed")
@@ -160,7 +147,7 @@ class BaseMCPService(BaseService):
160
147
 
161
148
  except Exception as e:
162
149
  async with self._state_lock:
163
- self._state = MCPServiceState.ERROR
150
+ self._state = ServiceState.ERROR
164
151
  self._health_status["healthy"] = False
165
152
  self._health_status["state"] = self._state.value
166
153
  self._health_status["details"]["error"] = str(e)
@@ -188,18 +175,18 @@ class BaseMCPService(BaseService):
188
175
  Subclasses should override _do_shutdown() for custom shutdown logic.
189
176
  """
190
177
  async with self._state_lock:
191
- if self._state in [MCPServiceState.STOPPED, MCPServiceState.STOPPING]:
178
+ if self._state in [ServiceState.STOPPED, ServiceState.STOPPING]:
192
179
  self.log_warning(f"Already in state {self._state.value}")
193
180
  return
194
181
 
195
- self._state = MCPServiceState.STOPPING
182
+ self._state = ServiceState.STOPPING
196
183
  self.log_info("Shutting down MCP service")
197
184
 
198
185
  try:
199
186
  await self._do_shutdown()
200
187
 
201
188
  async with self._state_lock:
202
- self._state = MCPServiceState.STOPPED
189
+ self._state = ServiceState.STOPPED
203
190
  self._shutdown = True
204
191
  self._health_status["healthy"] = False
205
192
  self._health_status["state"] = self._state.value
@@ -207,7 +194,7 @@ class BaseMCPService(BaseService):
207
194
 
208
195
  except Exception as e:
209
196
  async with self._state_lock:
210
- self._state = MCPServiceState.ERROR
197
+ self._state = ServiceState.ERROR
211
198
  self._health_status["healthy"] = False
212
199
  self._health_status["state"] = self._state.value
213
200
  self._health_status["details"]["error"] = str(e)
@@ -232,7 +219,7 @@ class BaseMCPService(BaseService):
232
219
  self.log_info("Restarting MCP service")
233
220
 
234
221
  # Shutdown if running
235
- if self._state == MCPServiceState.RUNNING:
222
+ if self._state == ServiceState.RUNNING:
236
223
  await self.shutdown()
237
224
 
238
225
  # Re-initialize
@@ -864,7 +864,7 @@ def _prompt_kuzu_update(current: str, latest: str) -> None:
864
864
  # Check if running in a non-interactive context
865
865
  try:
866
866
  if confirm_operation(message):
867
- print("🚀 Updating kuzu-memory...")
867
+ print("🚀 Updating kuzu-memory...", file=sys.stderr)
868
868
  try:
869
869
  result = subprocess.run(
870
870
  ["pipx", "upgrade", "kuzu-memory"],
@@ -874,28 +874,37 @@ def _prompt_kuzu_update(current: str, latest: str) -> None:
874
874
  check=False,
875
875
  )
876
876
  if result.returncode == 0:
877
- print("✅ Successfully updated kuzu-memory!")
877
+ print("✅ Successfully updated kuzu-memory!", file=sys.stderr)
878
878
  logger.info(f"Updated kuzu-memory from {current} to {latest}")
879
879
  else:
880
- print(f"⚠️ Update failed: {result.stderr}")
880
+ print(f"⚠️ Update failed: {result.stderr}", file=sys.stderr)
881
881
  logger.warning(f"kuzu-memory update failed: {result.stderr}")
882
882
  except subprocess.TimeoutExpired:
883
- print("⚠️ Update timed out. Please try again later.")
883
+ print("⚠️ Update timed out. Please try again later.", file=sys.stderr)
884
884
  logger.warning("kuzu-memory update timed out")
885
885
  except Exception as e:
886
- print(f"⚠️ Update failed: {e}")
886
+ print(f"⚠️ Update failed: {e}", file=sys.stderr)
887
887
  logger.warning(f"kuzu-memory update error: {e}")
888
888
  else:
889
889
  # User declined update
890
- print("\n To skip this version permanently, run:")
891
- print(f" claude-mpm config set-skip-version kuzu-memory {latest}")
892
- print(" To disable update checks for kuzu-memory:")
893
- print(" claude-mpm config disable-update-checks kuzu-memory")
890
+ print("\n To skip this version permanently, run:", file=sys.stderr)
891
+ print(
892
+ f" claude-mpm config set-skip-version kuzu-memory {latest}",
893
+ file=sys.stderr,
894
+ )
895
+ print(" To disable update checks for kuzu-memory:", file=sys.stderr)
896
+ print(
897
+ " claude-mpm config disable-update-checks kuzu-memory",
898
+ file=sys.stderr,
899
+ )
894
900
 
895
901
  # Ask if user wants to skip this version
896
902
  if confirm_operation("\n Skip this version in future checks?"):
897
903
  UpdatePreferences.set_skip_version("kuzu-memory", latest)
898
- print(f" Version {latest} will be skipped in future checks.")
904
+ print(
905
+ f" Version {latest} will be skipped in future checks.",
906
+ file=sys.stderr,
907
+ )
899
908
  except (KeyboardInterrupt, EOFError):
900
909
  # User interrupted or input not available
901
910
  pass