claude-mpm 4.1.1__py3-none-any.whl → 4.1.2__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (357) hide show
  1. claude_mpm/BUILD_NUMBER +1 -1
  2. claude_mpm/VERSION +1 -1
  3. claude_mpm/__main__.py +1 -1
  4. claude_mpm/agents/BASE_PM.md +74 -46
  5. claude_mpm/agents/INSTRUCTIONS.md +11 -153
  6. claude_mpm/agents/WORKFLOW.md +61 -321
  7. claude_mpm/agents/__init__.py +11 -11
  8. claude_mpm/agents/agent_loader.py +23 -20
  9. claude_mpm/agents/agent_loader_integration.py +1 -1
  10. claude_mpm/agents/agents_metadata.py +27 -0
  11. claude_mpm/agents/async_agent_loader.py +5 -8
  12. claude_mpm/agents/base_agent_loader.py +36 -25
  13. claude_mpm/agents/frontmatter_validator.py +6 -6
  14. claude_mpm/agents/schema/agent_schema.json +1 -1
  15. claude_mpm/agents/system_agent_config.py +9 -9
  16. claude_mpm/agents/templates/api_qa.json +47 -2
  17. claude_mpm/agents/templates/imagemagick.json +256 -0
  18. claude_mpm/agents/templates/qa.json +41 -2
  19. claude_mpm/agents/templates/ticketing.json +5 -5
  20. claude_mpm/agents/templates/web_qa.json +50 -2
  21. claude_mpm/cli/__init__.py +51 -46
  22. claude_mpm/cli/__main__.py +1 -1
  23. claude_mpm/cli/commands/__init__.py +10 -12
  24. claude_mpm/cli/commands/agent_manager.py +186 -181
  25. claude_mpm/cli/commands/agents.py +271 -268
  26. claude_mpm/cli/commands/aggregate.py +30 -29
  27. claude_mpm/cli/commands/cleanup.py +50 -44
  28. claude_mpm/cli/commands/cleanup_orphaned_agents.py +25 -25
  29. claude_mpm/cli/commands/config.py +162 -127
  30. claude_mpm/cli/commands/doctor.py +52 -62
  31. claude_mpm/cli/commands/info.py +37 -25
  32. claude_mpm/cli/commands/mcp.py +3 -7
  33. claude_mpm/cli/commands/mcp_command_router.py +14 -18
  34. claude_mpm/cli/commands/mcp_install_commands.py +28 -23
  35. claude_mpm/cli/commands/mcp_pipx_config.py +58 -49
  36. claude_mpm/cli/commands/mcp_server_commands.py +23 -17
  37. claude_mpm/cli/commands/memory.py +192 -141
  38. claude_mpm/cli/commands/monitor.py +117 -88
  39. claude_mpm/cli/commands/run.py +120 -84
  40. claude_mpm/cli/commands/run_config_checker.py +4 -5
  41. claude_mpm/cli/commands/socketio_monitor.py +17 -19
  42. claude_mpm/cli/commands/tickets.py +92 -92
  43. claude_mpm/cli/parser.py +1 -5
  44. claude_mpm/cli/parsers/__init__.py +1 -1
  45. claude_mpm/cli/parsers/agent_manager_parser.py +50 -98
  46. claude_mpm/cli/parsers/agents_parser.py +2 -3
  47. claude_mpm/cli/parsers/base_parser.py +7 -5
  48. claude_mpm/cli/parsers/mcp_parser.py +4 -2
  49. claude_mpm/cli/parsers/monitor_parser.py +26 -18
  50. claude_mpm/cli/shared/__init__.py +10 -10
  51. claude_mpm/cli/shared/argument_patterns.py +57 -71
  52. claude_mpm/cli/shared/base_command.py +61 -53
  53. claude_mpm/cli/shared/error_handling.py +62 -58
  54. claude_mpm/cli/shared/output_formatters.py +78 -77
  55. claude_mpm/cli/startup_logging.py +204 -172
  56. claude_mpm/cli/utils.py +10 -11
  57. claude_mpm/cli_module/__init__.py +1 -1
  58. claude_mpm/cli_module/args.py +1 -1
  59. claude_mpm/cli_module/migration_example.py +5 -5
  60. claude_mpm/config/__init__.py +9 -9
  61. claude_mpm/config/agent_config.py +15 -14
  62. claude_mpm/config/experimental_features.py +4 -4
  63. claude_mpm/config/paths.py +0 -1
  64. claude_mpm/config/socketio_config.py +5 -6
  65. claude_mpm/constants.py +1 -2
  66. claude_mpm/core/__init__.py +8 -8
  67. claude_mpm/core/agent_name_normalizer.py +1 -1
  68. claude_mpm/core/agent_registry.py +20 -23
  69. claude_mpm/core/agent_session_manager.py +3 -3
  70. claude_mpm/core/base_service.py +7 -15
  71. claude_mpm/core/cache.py +4 -6
  72. claude_mpm/core/claude_runner.py +85 -113
  73. claude_mpm/core/config.py +43 -28
  74. claude_mpm/core/config_aliases.py +0 -9
  75. claude_mpm/core/config_constants.py +52 -30
  76. claude_mpm/core/constants.py +0 -1
  77. claude_mpm/core/container.py +18 -27
  78. claude_mpm/core/exceptions.py +2 -2
  79. claude_mpm/core/factories.py +10 -12
  80. claude_mpm/core/framework_loader.py +581 -280
  81. claude_mpm/core/hook_manager.py +26 -22
  82. claude_mpm/core/hook_performance_config.py +58 -47
  83. claude_mpm/core/injectable_service.py +1 -1
  84. claude_mpm/core/interactive_session.py +61 -152
  85. claude_mpm/core/interfaces.py +1 -100
  86. claude_mpm/core/lazy.py +5 -5
  87. claude_mpm/core/log_manager.py +587 -0
  88. claude_mpm/core/logger.py +125 -8
  89. claude_mpm/core/logging_config.py +15 -15
  90. claude_mpm/core/minimal_framework_loader.py +5 -8
  91. claude_mpm/core/oneshot_session.py +15 -33
  92. claude_mpm/core/optimized_agent_loader.py +4 -6
  93. claude_mpm/core/optimized_startup.py +2 -1
  94. claude_mpm/core/output_style_manager.py +147 -106
  95. claude_mpm/core/pm_hook_interceptor.py +0 -1
  96. claude_mpm/core/service_registry.py +11 -8
  97. claude_mpm/core/session_manager.py +1 -2
  98. claude_mpm/core/shared/__init__.py +1 -1
  99. claude_mpm/core/shared/config_loader.py +101 -97
  100. claude_mpm/core/shared/path_resolver.py +72 -68
  101. claude_mpm/core/shared/singleton_manager.py +56 -50
  102. claude_mpm/core/socketio_pool.py +26 -6
  103. claude_mpm/core/tool_access_control.py +4 -5
  104. claude_mpm/core/typing_utils.py +50 -59
  105. claude_mpm/core/unified_agent_registry.py +14 -19
  106. claude_mpm/core/unified_config.py +4 -6
  107. claude_mpm/core/unified_paths.py +197 -109
  108. claude_mpm/dashboard/open_dashboard.py +2 -4
  109. claude_mpm/experimental/cli_enhancements.py +51 -36
  110. claude_mpm/generators/agent_profile_generator.py +2 -4
  111. claude_mpm/hooks/base_hook.py +1 -2
  112. claude_mpm/hooks/claude_hooks/connection_pool.py +72 -26
  113. claude_mpm/hooks/claude_hooks/event_handlers.py +93 -38
  114. claude_mpm/hooks/claude_hooks/hook_handler.py +130 -76
  115. claude_mpm/hooks/claude_hooks/hook_handler_eventbus.py +104 -77
  116. claude_mpm/hooks/claude_hooks/memory_integration.py +2 -4
  117. claude_mpm/hooks/claude_hooks/response_tracking.py +15 -11
  118. claude_mpm/hooks/claude_hooks/tool_analysis.py +12 -18
  119. claude_mpm/hooks/memory_integration_hook.py +5 -5
  120. claude_mpm/hooks/tool_call_interceptor.py +1 -1
  121. claude_mpm/hooks/validation_hooks.py +4 -4
  122. claude_mpm/init.py +4 -9
  123. claude_mpm/models/__init__.py +2 -2
  124. claude_mpm/models/agent_session.py +11 -14
  125. claude_mpm/scripts/mcp_server.py +20 -11
  126. claude_mpm/scripts/mcp_wrapper.py +5 -5
  127. claude_mpm/scripts/mpm_doctor.py +321 -0
  128. claude_mpm/scripts/socketio_daemon.py +28 -25
  129. claude_mpm/scripts/socketio_daemon_hardened.py +298 -258
  130. claude_mpm/scripts/socketio_server_manager.py +116 -95
  131. claude_mpm/services/__init__.py +49 -49
  132. claude_mpm/services/agent_capabilities_service.py +12 -18
  133. claude_mpm/services/agents/__init__.py +22 -22
  134. claude_mpm/services/agents/agent_builder.py +140 -119
  135. claude_mpm/services/agents/deployment/__init__.py +3 -3
  136. claude_mpm/services/agents/deployment/agent_config_provider.py +9 -9
  137. claude_mpm/services/agents/deployment/agent_configuration_manager.py +19 -20
  138. claude_mpm/services/agents/deployment/agent_definition_factory.py +1 -5
  139. claude_mpm/services/agents/deployment/agent_deployment.py +136 -106
  140. claude_mpm/services/agents/deployment/agent_discovery_service.py +4 -8
  141. claude_mpm/services/agents/deployment/agent_environment_manager.py +2 -7
  142. claude_mpm/services/agents/deployment/agent_filesystem_manager.py +6 -10
  143. claude_mpm/services/agents/deployment/agent_format_converter.py +11 -15
  144. claude_mpm/services/agents/deployment/agent_frontmatter_validator.py +2 -3
  145. claude_mpm/services/agents/deployment/agent_lifecycle_manager.py +5 -5
  146. claude_mpm/services/agents/deployment/agent_metrics_collector.py +13 -19
  147. claude_mpm/services/agents/deployment/agent_restore_handler.py +0 -1
  148. claude_mpm/services/agents/deployment/agent_template_builder.py +26 -35
  149. claude_mpm/services/agents/deployment/agent_validator.py +0 -1
  150. claude_mpm/services/agents/deployment/agent_version_manager.py +7 -9
  151. claude_mpm/services/agents/deployment/agent_versioning.py +3 -3
  152. claude_mpm/services/agents/deployment/agents_directory_resolver.py +6 -7
  153. claude_mpm/services/agents/deployment/async_agent_deployment.py +51 -38
  154. claude_mpm/services/agents/deployment/config/__init__.py +1 -1
  155. claude_mpm/services/agents/deployment/config/deployment_config.py +7 -8
  156. claude_mpm/services/agents/deployment/deployment_type_detector.py +1 -1
  157. claude_mpm/services/agents/deployment/deployment_wrapper.py +18 -18
  158. claude_mpm/services/agents/deployment/facade/__init__.py +1 -1
  159. claude_mpm/services/agents/deployment/facade/deployment_executor.py +0 -3
  160. claude_mpm/services/agents/deployment/facade/deployment_facade.py +3 -4
  161. claude_mpm/services/agents/deployment/interface_adapter.py +5 -7
  162. claude_mpm/services/agents/deployment/multi_source_deployment_service.py +345 -276
  163. claude_mpm/services/agents/deployment/pipeline/__init__.py +2 -2
  164. claude_mpm/services/agents/deployment/pipeline/pipeline_builder.py +1 -1
  165. claude_mpm/services/agents/deployment/pipeline/pipeline_context.py +6 -4
  166. claude_mpm/services/agents/deployment/pipeline/pipeline_executor.py +3 -3
  167. claude_mpm/services/agents/deployment/pipeline/steps/__init__.py +2 -2
  168. claude_mpm/services/agents/deployment/pipeline/steps/agent_processing_step.py +14 -13
  169. claude_mpm/services/agents/deployment/pipeline/steps/base_step.py +0 -1
  170. claude_mpm/services/agents/deployment/pipeline/steps/configuration_step.py +1 -1
  171. claude_mpm/services/agents/deployment/pipeline/steps/target_directory_step.py +8 -9
  172. claude_mpm/services/agents/deployment/pipeline/steps/validation_step.py +1 -1
  173. claude_mpm/services/agents/deployment/processors/__init__.py +1 -1
  174. claude_mpm/services/agents/deployment/processors/agent_processor.py +20 -16
  175. claude_mpm/services/agents/deployment/refactored_agent_deployment_service.py +5 -12
  176. claude_mpm/services/agents/deployment/results/__init__.py +1 -1
  177. claude_mpm/services/agents/deployment/results/deployment_result_builder.py +1 -1
  178. claude_mpm/services/agents/deployment/strategies/__init__.py +2 -2
  179. claude_mpm/services/agents/deployment/strategies/base_strategy.py +1 -7
  180. claude_mpm/services/agents/deployment/strategies/project_strategy.py +1 -4
  181. claude_mpm/services/agents/deployment/strategies/system_strategy.py +2 -3
  182. claude_mpm/services/agents/deployment/strategies/user_strategy.py +3 -7
  183. claude_mpm/services/agents/deployment/validation/__init__.py +1 -1
  184. claude_mpm/services/agents/deployment/validation/agent_validator.py +1 -1
  185. claude_mpm/services/agents/deployment/validation/template_validator.py +2 -2
  186. claude_mpm/services/agents/deployment/validation/validation_result.py +2 -6
  187. claude_mpm/services/agents/loading/__init__.py +1 -1
  188. claude_mpm/services/agents/loading/agent_profile_loader.py +6 -12
  189. claude_mpm/services/agents/loading/base_agent_manager.py +5 -5
  190. claude_mpm/services/agents/loading/framework_agent_loader.py +2 -4
  191. claude_mpm/services/agents/management/__init__.py +1 -1
  192. claude_mpm/services/agents/management/agent_capabilities_generator.py +1 -3
  193. claude_mpm/services/agents/management/agent_management_service.py +5 -9
  194. claude_mpm/services/agents/memory/__init__.py +4 -4
  195. claude_mpm/services/agents/memory/agent_memory_manager.py +280 -160
  196. claude_mpm/services/agents/memory/agent_persistence_service.py +0 -2
  197. claude_mpm/services/agents/memory/content_manager.py +44 -38
  198. claude_mpm/services/agents/memory/template_generator.py +4 -6
  199. claude_mpm/services/agents/registry/__init__.py +10 -6
  200. claude_mpm/services/agents/registry/deployed_agent_discovery.py +30 -27
  201. claude_mpm/services/agents/registry/modification_tracker.py +3 -6
  202. claude_mpm/services/async_session_logger.py +1 -2
  203. claude_mpm/services/claude_session_logger.py +1 -2
  204. claude_mpm/services/command_deployment_service.py +173 -0
  205. claude_mpm/services/command_handler_service.py +20 -22
  206. claude_mpm/services/core/__init__.py +25 -25
  207. claude_mpm/services/core/base.py +0 -5
  208. claude_mpm/services/core/interfaces/__init__.py +32 -32
  209. claude_mpm/services/core/interfaces/agent.py +0 -21
  210. claude_mpm/services/core/interfaces/communication.py +0 -27
  211. claude_mpm/services/core/interfaces/infrastructure.py +0 -56
  212. claude_mpm/services/core/interfaces/service.py +0 -29
  213. claude_mpm/services/diagnostics/__init__.py +1 -1
  214. claude_mpm/services/diagnostics/checks/__init__.py +6 -6
  215. claude_mpm/services/diagnostics/checks/agent_check.py +89 -80
  216. claude_mpm/services/diagnostics/checks/base_check.py +12 -16
  217. claude_mpm/services/diagnostics/checks/claude_desktop_check.py +84 -81
  218. claude_mpm/services/diagnostics/checks/common_issues_check.py +99 -91
  219. claude_mpm/services/diagnostics/checks/configuration_check.py +82 -77
  220. claude_mpm/services/diagnostics/checks/filesystem_check.py +67 -68
  221. claude_mpm/services/diagnostics/checks/installation_check.py +254 -94
  222. claude_mpm/services/diagnostics/checks/mcp_check.py +90 -88
  223. claude_mpm/services/diagnostics/checks/monitor_check.py +75 -76
  224. claude_mpm/services/diagnostics/checks/startup_log_check.py +67 -73
  225. claude_mpm/services/diagnostics/diagnostic_runner.py +67 -59
  226. claude_mpm/services/diagnostics/doctor_reporter.py +107 -70
  227. claude_mpm/services/diagnostics/models.py +21 -19
  228. claude_mpm/services/event_aggregator.py +10 -17
  229. claude_mpm/services/event_bus/__init__.py +1 -1
  230. claude_mpm/services/event_bus/config.py +54 -35
  231. claude_mpm/services/event_bus/event_bus.py +76 -71
  232. claude_mpm/services/event_bus/relay.py +74 -64
  233. claude_mpm/services/events/__init__.py +11 -11
  234. claude_mpm/services/events/consumers/__init__.py +3 -3
  235. claude_mpm/services/events/consumers/dead_letter.py +71 -63
  236. claude_mpm/services/events/consumers/logging.py +39 -37
  237. claude_mpm/services/events/consumers/metrics.py +56 -57
  238. claude_mpm/services/events/consumers/socketio.py +82 -81
  239. claude_mpm/services/events/core.py +110 -99
  240. claude_mpm/services/events/interfaces.py +56 -72
  241. claude_mpm/services/events/producers/__init__.py +1 -1
  242. claude_mpm/services/events/producers/hook.py +38 -38
  243. claude_mpm/services/events/producers/system.py +46 -44
  244. claude_mpm/services/exceptions.py +81 -80
  245. claude_mpm/services/framework_claude_md_generator/__init__.py +2 -4
  246. claude_mpm/services/framework_claude_md_generator/content_assembler.py +3 -5
  247. claude_mpm/services/framework_claude_md_generator/content_validator.py +1 -1
  248. claude_mpm/services/framework_claude_md_generator/deployment_manager.py +4 -4
  249. claude_mpm/services/framework_claude_md_generator/section_generators/__init__.py +0 -1
  250. claude_mpm/services/framework_claude_md_generator/section_generators/agents.py +0 -2
  251. claude_mpm/services/framework_claude_md_generator/version_manager.py +4 -5
  252. claude_mpm/services/hook_service.py +6 -9
  253. claude_mpm/services/infrastructure/__init__.py +1 -1
  254. claude_mpm/services/infrastructure/context_preservation.py +8 -12
  255. claude_mpm/services/infrastructure/monitoring.py +21 -23
  256. claude_mpm/services/mcp_gateway/__init__.py +37 -37
  257. claude_mpm/services/mcp_gateway/auto_configure.py +95 -103
  258. claude_mpm/services/mcp_gateway/config/__init__.py +1 -1
  259. claude_mpm/services/mcp_gateway/config/config_loader.py +23 -25
  260. claude_mpm/services/mcp_gateway/config/config_schema.py +5 -5
  261. claude_mpm/services/mcp_gateway/config/configuration.py +9 -6
  262. claude_mpm/services/mcp_gateway/core/__init__.py +10 -10
  263. claude_mpm/services/mcp_gateway/core/base.py +0 -3
  264. claude_mpm/services/mcp_gateway/core/interfaces.py +1 -38
  265. claude_mpm/services/mcp_gateway/core/process_pool.py +99 -93
  266. claude_mpm/services/mcp_gateway/core/singleton_manager.py +65 -62
  267. claude_mpm/services/mcp_gateway/core/startup_verification.py +75 -74
  268. claude_mpm/services/mcp_gateway/main.py +2 -1
  269. claude_mpm/services/mcp_gateway/registry/service_registry.py +5 -8
  270. claude_mpm/services/mcp_gateway/registry/tool_registry.py +1 -1
  271. claude_mpm/services/mcp_gateway/server/__init__.py +1 -1
  272. claude_mpm/services/mcp_gateway/server/mcp_gateway.py +12 -19
  273. claude_mpm/services/mcp_gateway/server/stdio_handler.py +4 -3
  274. claude_mpm/services/mcp_gateway/server/stdio_server.py +79 -71
  275. claude_mpm/services/mcp_gateway/tools/__init__.py +2 -2
  276. claude_mpm/services/mcp_gateway/tools/base_adapter.py +5 -6
  277. claude_mpm/services/mcp_gateway/tools/document_summarizer.py +13 -22
  278. claude_mpm/services/mcp_gateway/tools/health_check_tool.py +79 -78
  279. claude_mpm/services/mcp_gateway/tools/hello_world.py +12 -14
  280. claude_mpm/services/mcp_gateway/tools/ticket_tools.py +42 -49
  281. claude_mpm/services/mcp_gateway/tools/unified_ticket_tool.py +51 -55
  282. claude_mpm/services/memory/__init__.py +3 -3
  283. claude_mpm/services/memory/builder.py +3 -6
  284. claude_mpm/services/memory/cache/__init__.py +1 -1
  285. claude_mpm/services/memory/cache/shared_prompt_cache.py +3 -5
  286. claude_mpm/services/memory/cache/simple_cache.py +1 -1
  287. claude_mpm/services/memory/indexed_memory.py +5 -7
  288. claude_mpm/services/memory/optimizer.py +7 -10
  289. claude_mpm/services/memory/router.py +8 -9
  290. claude_mpm/services/memory_hook_service.py +48 -34
  291. claude_mpm/services/monitor_build_service.py +77 -73
  292. claude_mpm/services/port_manager.py +130 -108
  293. claude_mpm/services/project/analyzer.py +12 -10
  294. claude_mpm/services/project/registry.py +11 -11
  295. claude_mpm/services/recovery_manager.py +10 -19
  296. claude_mpm/services/response_tracker.py +0 -1
  297. claude_mpm/services/runner_configuration_service.py +19 -20
  298. claude_mpm/services/session_management_service.py +7 -11
  299. claude_mpm/services/shared/__init__.py +1 -1
  300. claude_mpm/services/shared/async_service_base.py +58 -50
  301. claude_mpm/services/shared/config_service_base.py +73 -67
  302. claude_mpm/services/shared/lifecycle_service_base.py +82 -78
  303. claude_mpm/services/shared/manager_base.py +94 -82
  304. claude_mpm/services/shared/service_factory.py +96 -98
  305. claude_mpm/services/socketio/__init__.py +3 -3
  306. claude_mpm/services/socketio/client_proxy.py +5 -5
  307. claude_mpm/services/socketio/event_normalizer.py +199 -181
  308. claude_mpm/services/socketio/handlers/__init__.py +3 -3
  309. claude_mpm/services/socketio/handlers/base.py +5 -4
  310. claude_mpm/services/socketio/handlers/connection.py +163 -136
  311. claude_mpm/services/socketio/handlers/file.py +13 -14
  312. claude_mpm/services/socketio/handlers/git.py +12 -7
  313. claude_mpm/services/socketio/handlers/hook.py +49 -44
  314. claude_mpm/services/socketio/handlers/memory.py +0 -1
  315. claude_mpm/services/socketio/handlers/project.py +0 -1
  316. claude_mpm/services/socketio/handlers/registry.py +37 -19
  317. claude_mpm/services/socketio/migration_utils.py +98 -84
  318. claude_mpm/services/socketio/server/__init__.py +1 -1
  319. claude_mpm/services/socketio/server/broadcaster.py +81 -87
  320. claude_mpm/services/socketio/server/core.py +65 -54
  321. claude_mpm/services/socketio/server/eventbus_integration.py +95 -56
  322. claude_mpm/services/socketio/server/main.py +64 -38
  323. claude_mpm/services/socketio_client_manager.py +10 -12
  324. claude_mpm/services/subprocess_launcher_service.py +4 -7
  325. claude_mpm/services/system_instructions_service.py +13 -14
  326. claude_mpm/services/ticket_manager.py +2 -2
  327. claude_mpm/services/utility_service.py +5 -13
  328. claude_mpm/services/version_control/__init__.py +16 -16
  329. claude_mpm/services/version_control/branch_strategy.py +5 -8
  330. claude_mpm/services/version_control/conflict_resolution.py +9 -23
  331. claude_mpm/services/version_control/git_operations.py +5 -7
  332. claude_mpm/services/version_control/semantic_versioning.py +16 -17
  333. claude_mpm/services/version_control/version_parser.py +13 -18
  334. claude_mpm/services/version_service.py +10 -11
  335. claude_mpm/storage/__init__.py +1 -1
  336. claude_mpm/storage/state_storage.py +22 -28
  337. claude_mpm/utils/__init__.py +6 -6
  338. claude_mpm/utils/agent_dependency_loader.py +47 -33
  339. claude_mpm/utils/config_manager.py +11 -14
  340. claude_mpm/utils/dependency_cache.py +1 -1
  341. claude_mpm/utils/dependency_manager.py +13 -17
  342. claude_mpm/utils/dependency_strategies.py +8 -10
  343. claude_mpm/utils/environment_context.py +3 -9
  344. claude_mpm/utils/error_handler.py +3 -13
  345. claude_mpm/utils/file_utils.py +1 -1
  346. claude_mpm/utils/path_operations.py +8 -12
  347. claude_mpm/utils/robust_installer.py +110 -33
  348. claude_mpm/utils/subprocess_utils.py +5 -6
  349. claude_mpm/validation/agent_validator.py +3 -6
  350. claude_mpm/validation/frontmatter_validator.py +1 -1
  351. {claude_mpm-4.1.1.dist-info → claude_mpm-4.1.2.dist-info}/METADATA +1 -1
  352. claude_mpm-4.1.2.dist-info/RECORD +498 -0
  353. claude_mpm-4.1.1.dist-info/RECORD +0 -494
  354. {claude_mpm-4.1.1.dist-info → claude_mpm-4.1.2.dist-info}/WHEEL +0 -0
  355. {claude_mpm-4.1.1.dist-info → claude_mpm-4.1.2.dist-info}/entry_points.txt +0 -0
  356. {claude_mpm-4.1.1.dist-info → claude_mpm-4.1.2.dist-info}/licenses/LICENSE +0 -0
  357. {claude_mpm-4.1.1.dist-info → claude_mpm-4.1.2.dist-info}/top_level.txt +0 -0
@@ -8,7 +8,6 @@ and integrated with claude-mpm.
8
8
  import json
9
9
  import subprocess
10
10
  from pathlib import Path
11
- from typing import Dict, Any, Optional
12
11
 
13
12
  from ..models import DiagnosticResult, DiagnosticStatus
14
13
  from .base_check import BaseDiagnosticCheck
@@ -16,42 +15,42 @@ from .base_check import BaseDiagnosticCheck
16
15
 
17
16
  class ClaudeDesktopCheck(BaseDiagnosticCheck):
18
17
  """Check Claude Desktop installation and integration."""
19
-
18
+
20
19
  @property
21
20
  def name(self) -> str:
22
21
  return "claude_desktop_check"
23
-
22
+
24
23
  @property
25
24
  def category(self) -> str:
26
25
  return "Claude Desktop"
27
-
26
+
28
27
  def run(self) -> DiagnosticResult:
29
28
  """Run Claude Desktop diagnostics."""
30
29
  try:
31
30
  sub_results = []
32
31
  details = {}
33
-
32
+
34
33
  # Check if Claude Desktop is installed
35
34
  install_result = self._check_installation()
36
35
  sub_results.append(install_result)
37
36
  details["installed"] = install_result.status == DiagnosticStatus.OK
38
-
37
+
39
38
  if install_result.status == DiagnosticStatus.OK:
40
39
  # Check version compatibility
41
40
  version_result = self._check_version()
42
41
  sub_results.append(version_result)
43
42
  details["version"] = version_result.details.get("version")
44
-
43
+
45
44
  # Check output style deployment
46
45
  style_result = self._check_output_style()
47
46
  sub_results.append(style_result)
48
47
  details["output_style"] = style_result.details.get("deployed")
49
-
48
+
50
49
  # Check MCP integration
51
50
  mcp_result = self._check_mcp_integration()
52
51
  sub_results.append(mcp_result)
53
52
  details["mcp_configured"] = mcp_result.status == DiagnosticStatus.OK
54
-
53
+
55
54
  # Determine overall status
56
55
  if any(r.status == DiagnosticStatus.ERROR for r in sub_results):
57
56
  status = DiagnosticStatus.ERROR
@@ -62,23 +61,23 @@ class ClaudeDesktopCheck(BaseDiagnosticCheck):
62
61
  else:
63
62
  status = DiagnosticStatus.OK
64
63
  message = "Claude Desktop properly configured"
65
-
64
+
66
65
  return DiagnosticResult(
67
66
  category=self.category,
68
67
  status=status,
69
68
  message=message,
70
69
  details=details,
71
- sub_results=sub_results if self.verbose else []
70
+ sub_results=sub_results if self.verbose else [],
72
71
  )
73
-
72
+
74
73
  except Exception as e:
75
74
  return DiagnosticResult(
76
75
  category=self.category,
77
76
  status=DiagnosticStatus.ERROR,
78
- message=f"Claude Desktop check failed: {str(e)}",
79
- details={"error": str(e)}
77
+ message=f"Claude Desktop check failed: {e!s}",
78
+ details={"error": str(e)},
80
79
  )
81
-
80
+
82
81
  def _check_installation(self) -> DiagnosticResult:
83
82
  """Check if Claude Desktop is installed."""
84
83
  # Check common installation paths
@@ -86,102 +85,103 @@ class ClaudeDesktopCheck(BaseDiagnosticCheck):
86
85
  linux_paths = [
87
86
  Path.home() / ".local/share/applications/claude.desktop",
88
87
  Path("/usr/share/applications/claude.desktop"),
89
- Path("/opt/Claude")
88
+ Path("/opt/Claude"),
90
89
  ]
91
90
  windows_paths = [
92
91
  Path("C:/Program Files/Claude/Claude.exe"),
93
- Path.home() / "AppData/Local/Claude/Claude.exe"
92
+ Path.home() / "AppData/Local/Claude/Claude.exe",
94
93
  ]
95
-
94
+
96
95
  # Check for Claude process
97
96
  try:
98
97
  result = subprocess.run(
99
- ["pgrep", "-f", "Claude"],
100
- capture_output=True,
101
- timeout=2
98
+ ["pgrep", "-f", "Claude"], capture_output=True, timeout=2, check=False
102
99
  )
103
100
  if result.returncode == 0:
104
101
  return DiagnosticResult(
105
102
  category="Claude Desktop Installation",
106
103
  status=DiagnosticStatus.OK,
107
104
  message="Claude Desktop is running",
108
- details={"running": True}
105
+ details={"running": True},
109
106
  )
110
107
  except (subprocess.SubprocessError, FileNotFoundError):
111
108
  pass
112
-
109
+
113
110
  # Check installation paths
114
111
  if mac_path.exists():
115
112
  return DiagnosticResult(
116
113
  category="Claude Desktop Installation",
117
114
  status=DiagnosticStatus.OK,
118
115
  message="Claude Desktop installed (macOS)",
119
- details={"path": str(mac_path), "platform": "macos"}
116
+ details={"path": str(mac_path), "platform": "macos"},
120
117
  )
121
-
118
+
122
119
  for path in linux_paths:
123
120
  if path.exists():
124
121
  return DiagnosticResult(
125
122
  category="Claude Desktop Installation",
126
123
  status=DiagnosticStatus.OK,
127
124
  message="Claude Desktop installed (Linux)",
128
- details={"path": str(path), "platform": "linux"}
125
+ details={"path": str(path), "platform": "linux"},
129
126
  )
130
-
127
+
131
128
  for path in windows_paths:
132
129
  if path.exists():
133
130
  return DiagnosticResult(
134
131
  category="Claude Desktop Installation",
135
132
  status=DiagnosticStatus.OK,
136
133
  message="Claude Desktop installed (Windows)",
137
- details={"path": str(path), "platform": "windows"}
134
+ details={"path": str(path), "platform": "windows"},
138
135
  )
139
-
136
+
140
137
  return DiagnosticResult(
141
138
  category="Claude Desktop Installation",
142
139
  status=DiagnosticStatus.WARNING,
143
140
  message="Claude Desktop not found",
144
141
  details={"installed": False},
145
- fix_description="Install Claude Desktop from https://claude.ai/download"
142
+ fix_description="Install Claude Desktop from https://claude.ai/download",
146
143
  )
147
-
144
+
148
145
  def _check_version(self) -> DiagnosticResult:
149
146
  """Check Claude Desktop version compatibility."""
150
147
  # Try to get version from config file
151
148
  config_paths = [
152
149
  Path.home() / "Library/Application Support/Claude/config.json", # macOS
153
150
  Path.home() / ".config/Claude/config.json", # Linux
154
- Path.home() / "AppData/Roaming/Claude/config.json" # Windows
151
+ Path.home() / "AppData/Roaming/Claude/config.json", # Windows
155
152
  ]
156
-
153
+
157
154
  for config_path in config_paths:
158
155
  if config_path.exists():
159
156
  try:
160
- with open(config_path, 'r') as f:
157
+ with open(config_path) as f:
161
158
  config = json.load(f)
162
159
  version = config.get("version", "unknown")
163
-
160
+
164
161
  # Simple version check (would need real version comparison logic)
165
162
  return DiagnosticResult(
166
163
  category="Claude Desktop Version",
167
164
  status=DiagnosticStatus.OK,
168
165
  message=f"Version: {version}",
169
- details={"version": version, "config_path": str(config_path)}
166
+ details={
167
+ "version": version,
168
+ "config_path": str(config_path),
169
+ },
170
170
  )
171
171
  except Exception:
172
172
  pass
173
-
173
+
174
174
  return DiagnosticResult(
175
175
  category="Claude Desktop Version",
176
176
  status=DiagnosticStatus.WARNING,
177
177
  message="Could not determine version",
178
- details={"version": "unknown"}
178
+ details={"version": "unknown"},
179
179
  )
180
-
180
+
181
181
  def _check_output_style(self) -> DiagnosticResult:
182
182
  """Check if output style is deployed."""
183
183
  style_path = Path.home() / ".claude/responses/OUTPUT_STYLE.md"
184
-
184
+
185
185
  if not style_path.exists():
186
186
  return DiagnosticResult(
187
187
  category="Output Style",
@@ -189,46 +189,50 @@ class ClaudeDesktopCheck(BaseDiagnosticCheck):
189
189
  message="Output style not deployed",
190
190
  details={"deployed": False, "path": str(style_path)},
191
191
  fix_command="claude-mpm deploy-style",
192
- fix_description="Deploy claude-mpm output style for better formatting"
192
+ fix_description="Deploy claude-mpm output style for better formatting",
193
193
  )
194
-
194
+
195
195
  # Check if it's up to date
196
196
  try:
197
- with open(style_path, 'r') as f:
197
+ with open(style_path) as f:
198
198
  content = f.read()
199
199
  if "Claude MPM Output Style" in content:
200
200
  return DiagnosticResult(
201
201
  category="Output Style",
202
202
  status=DiagnosticStatus.OK,
203
203
  message="Output style deployed",
204
- details={"deployed": True, "path": str(style_path)}
205
- )
206
- else:
207
- return DiagnosticResult(
208
- category="Output Style",
209
- status=DiagnosticStatus.WARNING,
210
- message="Output style outdated",
211
- details={"deployed": True, "outdated": True, "path": str(style_path)},
212
- fix_command="claude-mpm deploy-style --force",
213
- fix_description="Update output style to latest version"
204
+ details={"deployed": True, "path": str(style_path)},
214
205
  )
206
+ return DiagnosticResult(
207
+ category="Output Style",
208
+ status=DiagnosticStatus.WARNING,
209
+ message="Output style outdated",
210
+ details={
211
+ "deployed": True,
212
+ "outdated": True,
213
+ "path": str(style_path),
214
+ },
215
+ fix_command="claude-mpm deploy-style --force",
216
+ fix_description="Update output style to latest version",
217
+ )
215
218
  except Exception as e:
216
219
  return DiagnosticResult(
217
220
  category="Output Style",
218
221
  status=DiagnosticStatus.WARNING,
219
- message=f"Could not check output style: {str(e)}",
220
- details={"error": str(e)}
222
+ message=f"Could not check output style: {e!s}",
223
+ details={"error": str(e)},
221
224
  )
222
-
225
+
223
226
  def _check_mcp_integration(self) -> DiagnosticResult:
224
227
  """Check MCP server integration with Claude Desktop."""
225
228
  config_path = Path.home() / ".config/claude/claude_desktop_config.json"
226
-
229
+
227
230
  if not config_path.exists():
228
231
  # Try alternate paths
229
232
  alt_paths = [
230
- Path.home() / "Library/Application Support/Claude/claude_desktop_config.json",
231
- Path.home() / "AppData/Roaming/Claude/claude_desktop_config.json"
233
+ Path.home()
234
+ / "Library/Application Support/Claude/claude_desktop_config.json",
235
+ Path.home() / "AppData/Roaming/Claude/claude_desktop_config.json",
232
236
  ]
233
237
  for alt_path in alt_paths:
234
238
  if alt_path.exists():
@@ -241,13 +245,13 @@ class ClaudeDesktopCheck(BaseDiagnosticCheck):
241
245
  message="Claude Desktop config not found",
242
246
  details={"configured": False},
243
247
  fix_command="claude-mpm mcp install",
244
- fix_description="Install MCP server integration"
248
+ fix_description="Install MCP server integration",
245
249
  )
246
-
250
+
247
251
  try:
248
- with open(config_path, 'r') as f:
252
+ with open(config_path) as f:
249
253
  config = json.load(f)
250
-
254
+
251
255
  mcp_servers = config.get("mcpServers", {})
252
256
  if "claude-mpm-gateway" in mcp_servers:
253
257
  return DiagnosticResult(
@@ -257,27 +261,26 @@ class ClaudeDesktopCheck(BaseDiagnosticCheck):
257
261
  details={
258
262
  "configured": True,
259
263
  "server_count": len(mcp_servers),
260
- "config_path": str(config_path)
261
- }
262
- )
263
- else:
264
- return DiagnosticResult(
265
- category="MCP Integration",
266
- status=DiagnosticStatus.WARNING,
267
- message="MCP server not configured",
268
- details={
269
- "configured": False,
270
- "server_count": len(mcp_servers),
271
- "config_path": str(config_path)
264
+ "config_path": str(config_path),
272
265
  },
273
- fix_command="claude-mpm mcp install",
274
- fix_description="Configure MCP server for Claude Desktop"
275
266
  )
276
-
267
+ return DiagnosticResult(
268
+ category="MCP Integration",
269
+ status=DiagnosticStatus.WARNING,
270
+ message="MCP server not configured",
271
+ details={
272
+ "configured": False,
273
+ "server_count": len(mcp_servers),
274
+ "config_path": str(config_path),
275
+ },
276
+ fix_command="claude-mpm mcp install",
277
+ fix_description="Configure MCP server for Claude Desktop",
278
+ )
279
+
277
280
  except Exception as e:
278
281
  return DiagnosticResult(
279
282
  category="MCP Integration",
280
283
  status=DiagnosticStatus.WARNING,
281
- message=f"Could not check MCP configuration: {str(e)}",
282
- details={"error": str(e)}
283
- )
284
+ message=f"Could not check MCP configuration: {e!s}",
285
+ details={"error": str(e)},
286
+ )