claude-mpm 4.1.0__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 (358) 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 +133 -58
  21. claude_mpm/agents/templates/web_ui.json +3 -3
  22. claude_mpm/cli/__init__.py +51 -46
  23. claude_mpm/cli/__main__.py +1 -1
  24. claude_mpm/cli/commands/__init__.py +10 -12
  25. claude_mpm/cli/commands/agent_manager.py +186 -181
  26. claude_mpm/cli/commands/agents.py +271 -268
  27. claude_mpm/cli/commands/aggregate.py +30 -29
  28. claude_mpm/cli/commands/cleanup.py +50 -44
  29. claude_mpm/cli/commands/cleanup_orphaned_agents.py +25 -25
  30. claude_mpm/cli/commands/config.py +162 -127
  31. claude_mpm/cli/commands/doctor.py +52 -62
  32. claude_mpm/cli/commands/info.py +37 -25
  33. claude_mpm/cli/commands/mcp.py +3 -7
  34. claude_mpm/cli/commands/mcp_command_router.py +14 -18
  35. claude_mpm/cli/commands/mcp_install_commands.py +28 -23
  36. claude_mpm/cli/commands/mcp_pipx_config.py +58 -49
  37. claude_mpm/cli/commands/mcp_server_commands.py +23 -17
  38. claude_mpm/cli/commands/memory.py +192 -141
  39. claude_mpm/cli/commands/monitor.py +117 -88
  40. claude_mpm/cli/commands/run.py +120 -84
  41. claude_mpm/cli/commands/run_config_checker.py +4 -5
  42. claude_mpm/cli/commands/socketio_monitor.py +17 -19
  43. claude_mpm/cli/commands/tickets.py +92 -92
  44. claude_mpm/cli/parser.py +1 -5
  45. claude_mpm/cli/parsers/__init__.py +1 -1
  46. claude_mpm/cli/parsers/agent_manager_parser.py +50 -98
  47. claude_mpm/cli/parsers/agents_parser.py +2 -3
  48. claude_mpm/cli/parsers/base_parser.py +7 -5
  49. claude_mpm/cli/parsers/mcp_parser.py +4 -2
  50. claude_mpm/cli/parsers/monitor_parser.py +26 -18
  51. claude_mpm/cli/shared/__init__.py +10 -10
  52. claude_mpm/cli/shared/argument_patterns.py +57 -71
  53. claude_mpm/cli/shared/base_command.py +61 -53
  54. claude_mpm/cli/shared/error_handling.py +62 -58
  55. claude_mpm/cli/shared/output_formatters.py +78 -77
  56. claude_mpm/cli/startup_logging.py +204 -172
  57. claude_mpm/cli/utils.py +10 -11
  58. claude_mpm/cli_module/__init__.py +1 -1
  59. claude_mpm/cli_module/args.py +1 -1
  60. claude_mpm/cli_module/migration_example.py +5 -5
  61. claude_mpm/config/__init__.py +9 -9
  62. claude_mpm/config/agent_config.py +15 -14
  63. claude_mpm/config/experimental_features.py +4 -4
  64. claude_mpm/config/paths.py +0 -1
  65. claude_mpm/config/socketio_config.py +5 -6
  66. claude_mpm/constants.py +1 -2
  67. claude_mpm/core/__init__.py +8 -8
  68. claude_mpm/core/agent_name_normalizer.py +1 -1
  69. claude_mpm/core/agent_registry.py +20 -23
  70. claude_mpm/core/agent_session_manager.py +3 -3
  71. claude_mpm/core/base_service.py +7 -15
  72. claude_mpm/core/cache.py +4 -6
  73. claude_mpm/core/claude_runner.py +85 -113
  74. claude_mpm/core/config.py +43 -28
  75. claude_mpm/core/config_aliases.py +0 -9
  76. claude_mpm/core/config_constants.py +52 -30
  77. claude_mpm/core/constants.py +0 -1
  78. claude_mpm/core/container.py +18 -27
  79. claude_mpm/core/exceptions.py +2 -2
  80. claude_mpm/core/factories.py +10 -12
  81. claude_mpm/core/framework_loader.py +581 -280
  82. claude_mpm/core/hook_manager.py +26 -22
  83. claude_mpm/core/hook_performance_config.py +58 -47
  84. claude_mpm/core/injectable_service.py +1 -1
  85. claude_mpm/core/interactive_session.py +61 -152
  86. claude_mpm/core/interfaces.py +1 -100
  87. claude_mpm/core/lazy.py +5 -5
  88. claude_mpm/core/log_manager.py +587 -0
  89. claude_mpm/core/logger.py +125 -8
  90. claude_mpm/core/logging_config.py +15 -15
  91. claude_mpm/core/minimal_framework_loader.py +5 -8
  92. claude_mpm/core/oneshot_session.py +15 -33
  93. claude_mpm/core/optimized_agent_loader.py +4 -6
  94. claude_mpm/core/optimized_startup.py +2 -1
  95. claude_mpm/core/output_style_manager.py +147 -106
  96. claude_mpm/core/pm_hook_interceptor.py +0 -1
  97. claude_mpm/core/service_registry.py +11 -8
  98. claude_mpm/core/session_manager.py +1 -2
  99. claude_mpm/core/shared/__init__.py +1 -1
  100. claude_mpm/core/shared/config_loader.py +101 -97
  101. claude_mpm/core/shared/path_resolver.py +72 -68
  102. claude_mpm/core/shared/singleton_manager.py +56 -50
  103. claude_mpm/core/socketio_pool.py +26 -6
  104. claude_mpm/core/tool_access_control.py +4 -5
  105. claude_mpm/core/typing_utils.py +50 -59
  106. claude_mpm/core/unified_agent_registry.py +14 -19
  107. claude_mpm/core/unified_config.py +4 -6
  108. claude_mpm/core/unified_paths.py +197 -109
  109. claude_mpm/dashboard/open_dashboard.py +2 -4
  110. claude_mpm/experimental/cli_enhancements.py +51 -36
  111. claude_mpm/generators/agent_profile_generator.py +2 -4
  112. claude_mpm/hooks/base_hook.py +1 -2
  113. claude_mpm/hooks/claude_hooks/connection_pool.py +72 -26
  114. claude_mpm/hooks/claude_hooks/event_handlers.py +93 -38
  115. claude_mpm/hooks/claude_hooks/hook_handler.py +130 -76
  116. claude_mpm/hooks/claude_hooks/hook_handler_eventbus.py +104 -77
  117. claude_mpm/hooks/claude_hooks/memory_integration.py +2 -4
  118. claude_mpm/hooks/claude_hooks/response_tracking.py +15 -11
  119. claude_mpm/hooks/claude_hooks/tool_analysis.py +12 -18
  120. claude_mpm/hooks/memory_integration_hook.py +5 -5
  121. claude_mpm/hooks/tool_call_interceptor.py +1 -1
  122. claude_mpm/hooks/validation_hooks.py +4 -4
  123. claude_mpm/init.py +4 -9
  124. claude_mpm/models/__init__.py +2 -2
  125. claude_mpm/models/agent_session.py +11 -14
  126. claude_mpm/scripts/mcp_server.py +20 -11
  127. claude_mpm/scripts/mcp_wrapper.py +5 -5
  128. claude_mpm/scripts/mpm_doctor.py +321 -0
  129. claude_mpm/scripts/socketio_daemon.py +28 -25
  130. claude_mpm/scripts/socketio_daemon_hardened.py +298 -258
  131. claude_mpm/scripts/socketio_server_manager.py +116 -95
  132. claude_mpm/services/__init__.py +49 -49
  133. claude_mpm/services/agent_capabilities_service.py +12 -18
  134. claude_mpm/services/agents/__init__.py +22 -22
  135. claude_mpm/services/agents/agent_builder.py +140 -119
  136. claude_mpm/services/agents/deployment/__init__.py +3 -3
  137. claude_mpm/services/agents/deployment/agent_config_provider.py +9 -9
  138. claude_mpm/services/agents/deployment/agent_configuration_manager.py +19 -20
  139. claude_mpm/services/agents/deployment/agent_definition_factory.py +1 -5
  140. claude_mpm/services/agents/deployment/agent_deployment.py +136 -106
  141. claude_mpm/services/agents/deployment/agent_discovery_service.py +4 -8
  142. claude_mpm/services/agents/deployment/agent_environment_manager.py +2 -7
  143. claude_mpm/services/agents/deployment/agent_filesystem_manager.py +6 -10
  144. claude_mpm/services/agents/deployment/agent_format_converter.py +11 -15
  145. claude_mpm/services/agents/deployment/agent_frontmatter_validator.py +2 -3
  146. claude_mpm/services/agents/deployment/agent_lifecycle_manager.py +5 -5
  147. claude_mpm/services/agents/deployment/agent_metrics_collector.py +13 -19
  148. claude_mpm/services/agents/deployment/agent_restore_handler.py +0 -1
  149. claude_mpm/services/agents/deployment/agent_template_builder.py +26 -35
  150. claude_mpm/services/agents/deployment/agent_validator.py +0 -1
  151. claude_mpm/services/agents/deployment/agent_version_manager.py +7 -9
  152. claude_mpm/services/agents/deployment/agent_versioning.py +3 -3
  153. claude_mpm/services/agents/deployment/agents_directory_resolver.py +6 -7
  154. claude_mpm/services/agents/deployment/async_agent_deployment.py +51 -38
  155. claude_mpm/services/agents/deployment/config/__init__.py +1 -1
  156. claude_mpm/services/agents/deployment/config/deployment_config.py +7 -8
  157. claude_mpm/services/agents/deployment/deployment_type_detector.py +1 -1
  158. claude_mpm/services/agents/deployment/deployment_wrapper.py +18 -18
  159. claude_mpm/services/agents/deployment/facade/__init__.py +1 -1
  160. claude_mpm/services/agents/deployment/facade/deployment_executor.py +0 -3
  161. claude_mpm/services/agents/deployment/facade/deployment_facade.py +3 -4
  162. claude_mpm/services/agents/deployment/interface_adapter.py +5 -7
  163. claude_mpm/services/agents/deployment/multi_source_deployment_service.py +345 -276
  164. claude_mpm/services/agents/deployment/pipeline/__init__.py +2 -2
  165. claude_mpm/services/agents/deployment/pipeline/pipeline_builder.py +1 -1
  166. claude_mpm/services/agents/deployment/pipeline/pipeline_context.py +6 -4
  167. claude_mpm/services/agents/deployment/pipeline/pipeline_executor.py +3 -3
  168. claude_mpm/services/agents/deployment/pipeline/steps/__init__.py +2 -2
  169. claude_mpm/services/agents/deployment/pipeline/steps/agent_processing_step.py +14 -13
  170. claude_mpm/services/agents/deployment/pipeline/steps/base_step.py +0 -1
  171. claude_mpm/services/agents/deployment/pipeline/steps/configuration_step.py +1 -1
  172. claude_mpm/services/agents/deployment/pipeline/steps/target_directory_step.py +8 -9
  173. claude_mpm/services/agents/deployment/pipeline/steps/validation_step.py +1 -1
  174. claude_mpm/services/agents/deployment/processors/__init__.py +1 -1
  175. claude_mpm/services/agents/deployment/processors/agent_processor.py +20 -16
  176. claude_mpm/services/agents/deployment/refactored_agent_deployment_service.py +5 -12
  177. claude_mpm/services/agents/deployment/results/__init__.py +1 -1
  178. claude_mpm/services/agents/deployment/results/deployment_result_builder.py +1 -1
  179. claude_mpm/services/agents/deployment/strategies/__init__.py +2 -2
  180. claude_mpm/services/agents/deployment/strategies/base_strategy.py +1 -7
  181. claude_mpm/services/agents/deployment/strategies/project_strategy.py +1 -4
  182. claude_mpm/services/agents/deployment/strategies/system_strategy.py +2 -3
  183. claude_mpm/services/agents/deployment/strategies/user_strategy.py +3 -7
  184. claude_mpm/services/agents/deployment/validation/__init__.py +1 -1
  185. claude_mpm/services/agents/deployment/validation/agent_validator.py +1 -1
  186. claude_mpm/services/agents/deployment/validation/template_validator.py +2 -2
  187. claude_mpm/services/agents/deployment/validation/validation_result.py +2 -6
  188. claude_mpm/services/agents/loading/__init__.py +1 -1
  189. claude_mpm/services/agents/loading/agent_profile_loader.py +6 -12
  190. claude_mpm/services/agents/loading/base_agent_manager.py +5 -5
  191. claude_mpm/services/agents/loading/framework_agent_loader.py +2 -4
  192. claude_mpm/services/agents/management/__init__.py +1 -1
  193. claude_mpm/services/agents/management/agent_capabilities_generator.py +1 -3
  194. claude_mpm/services/agents/management/agent_management_service.py +5 -9
  195. claude_mpm/services/agents/memory/__init__.py +4 -4
  196. claude_mpm/services/agents/memory/agent_memory_manager.py +280 -160
  197. claude_mpm/services/agents/memory/agent_persistence_service.py +0 -2
  198. claude_mpm/services/agents/memory/content_manager.py +44 -38
  199. claude_mpm/services/agents/memory/template_generator.py +4 -6
  200. claude_mpm/services/agents/registry/__init__.py +10 -6
  201. claude_mpm/services/agents/registry/deployed_agent_discovery.py +30 -27
  202. claude_mpm/services/agents/registry/modification_tracker.py +3 -6
  203. claude_mpm/services/async_session_logger.py +1 -2
  204. claude_mpm/services/claude_session_logger.py +1 -2
  205. claude_mpm/services/command_deployment_service.py +173 -0
  206. claude_mpm/services/command_handler_service.py +20 -22
  207. claude_mpm/services/core/__init__.py +25 -25
  208. claude_mpm/services/core/base.py +0 -5
  209. claude_mpm/services/core/interfaces/__init__.py +32 -32
  210. claude_mpm/services/core/interfaces/agent.py +0 -21
  211. claude_mpm/services/core/interfaces/communication.py +0 -27
  212. claude_mpm/services/core/interfaces/infrastructure.py +0 -56
  213. claude_mpm/services/core/interfaces/service.py +0 -29
  214. claude_mpm/services/diagnostics/__init__.py +1 -1
  215. claude_mpm/services/diagnostics/checks/__init__.py +6 -6
  216. claude_mpm/services/diagnostics/checks/agent_check.py +89 -80
  217. claude_mpm/services/diagnostics/checks/base_check.py +12 -16
  218. claude_mpm/services/diagnostics/checks/claude_desktop_check.py +84 -81
  219. claude_mpm/services/diagnostics/checks/common_issues_check.py +99 -91
  220. claude_mpm/services/diagnostics/checks/configuration_check.py +82 -77
  221. claude_mpm/services/diagnostics/checks/filesystem_check.py +67 -68
  222. claude_mpm/services/diagnostics/checks/installation_check.py +254 -94
  223. claude_mpm/services/diagnostics/checks/mcp_check.py +90 -88
  224. claude_mpm/services/diagnostics/checks/monitor_check.py +75 -76
  225. claude_mpm/services/diagnostics/checks/startup_log_check.py +67 -73
  226. claude_mpm/services/diagnostics/diagnostic_runner.py +67 -59
  227. claude_mpm/services/diagnostics/doctor_reporter.py +107 -70
  228. claude_mpm/services/diagnostics/models.py +21 -19
  229. claude_mpm/services/event_aggregator.py +10 -17
  230. claude_mpm/services/event_bus/__init__.py +1 -1
  231. claude_mpm/services/event_bus/config.py +54 -35
  232. claude_mpm/services/event_bus/event_bus.py +76 -71
  233. claude_mpm/services/event_bus/relay.py +74 -64
  234. claude_mpm/services/events/__init__.py +11 -11
  235. claude_mpm/services/events/consumers/__init__.py +3 -3
  236. claude_mpm/services/events/consumers/dead_letter.py +71 -63
  237. claude_mpm/services/events/consumers/logging.py +39 -37
  238. claude_mpm/services/events/consumers/metrics.py +56 -57
  239. claude_mpm/services/events/consumers/socketio.py +82 -81
  240. claude_mpm/services/events/core.py +110 -99
  241. claude_mpm/services/events/interfaces.py +56 -72
  242. claude_mpm/services/events/producers/__init__.py +1 -1
  243. claude_mpm/services/events/producers/hook.py +38 -38
  244. claude_mpm/services/events/producers/system.py +46 -44
  245. claude_mpm/services/exceptions.py +81 -80
  246. claude_mpm/services/framework_claude_md_generator/__init__.py +2 -4
  247. claude_mpm/services/framework_claude_md_generator/content_assembler.py +3 -5
  248. claude_mpm/services/framework_claude_md_generator/content_validator.py +1 -1
  249. claude_mpm/services/framework_claude_md_generator/deployment_manager.py +4 -4
  250. claude_mpm/services/framework_claude_md_generator/section_generators/__init__.py +0 -1
  251. claude_mpm/services/framework_claude_md_generator/section_generators/agents.py +0 -2
  252. claude_mpm/services/framework_claude_md_generator/version_manager.py +4 -5
  253. claude_mpm/services/hook_service.py +6 -9
  254. claude_mpm/services/infrastructure/__init__.py +1 -1
  255. claude_mpm/services/infrastructure/context_preservation.py +8 -12
  256. claude_mpm/services/infrastructure/monitoring.py +21 -23
  257. claude_mpm/services/mcp_gateway/__init__.py +37 -37
  258. claude_mpm/services/mcp_gateway/auto_configure.py +95 -103
  259. claude_mpm/services/mcp_gateway/config/__init__.py +1 -1
  260. claude_mpm/services/mcp_gateway/config/config_loader.py +23 -25
  261. claude_mpm/services/mcp_gateway/config/config_schema.py +5 -5
  262. claude_mpm/services/mcp_gateway/config/configuration.py +9 -6
  263. claude_mpm/services/mcp_gateway/core/__init__.py +10 -10
  264. claude_mpm/services/mcp_gateway/core/base.py +0 -3
  265. claude_mpm/services/mcp_gateway/core/interfaces.py +1 -38
  266. claude_mpm/services/mcp_gateway/core/process_pool.py +99 -93
  267. claude_mpm/services/mcp_gateway/core/singleton_manager.py +65 -62
  268. claude_mpm/services/mcp_gateway/core/startup_verification.py +75 -74
  269. claude_mpm/services/mcp_gateway/main.py +2 -1
  270. claude_mpm/services/mcp_gateway/registry/service_registry.py +5 -8
  271. claude_mpm/services/mcp_gateway/registry/tool_registry.py +1 -1
  272. claude_mpm/services/mcp_gateway/server/__init__.py +1 -1
  273. claude_mpm/services/mcp_gateway/server/mcp_gateway.py +12 -19
  274. claude_mpm/services/mcp_gateway/server/stdio_handler.py +4 -3
  275. claude_mpm/services/mcp_gateway/server/stdio_server.py +79 -71
  276. claude_mpm/services/mcp_gateway/tools/__init__.py +2 -2
  277. claude_mpm/services/mcp_gateway/tools/base_adapter.py +5 -6
  278. claude_mpm/services/mcp_gateway/tools/document_summarizer.py +13 -22
  279. claude_mpm/services/mcp_gateway/tools/health_check_tool.py +79 -78
  280. claude_mpm/services/mcp_gateway/tools/hello_world.py +12 -14
  281. claude_mpm/services/mcp_gateway/tools/ticket_tools.py +42 -49
  282. claude_mpm/services/mcp_gateway/tools/unified_ticket_tool.py +51 -55
  283. claude_mpm/services/memory/__init__.py +3 -3
  284. claude_mpm/services/memory/builder.py +3 -6
  285. claude_mpm/services/memory/cache/__init__.py +1 -1
  286. claude_mpm/services/memory/cache/shared_prompt_cache.py +3 -5
  287. claude_mpm/services/memory/cache/simple_cache.py +1 -1
  288. claude_mpm/services/memory/indexed_memory.py +5 -7
  289. claude_mpm/services/memory/optimizer.py +7 -10
  290. claude_mpm/services/memory/router.py +8 -9
  291. claude_mpm/services/memory_hook_service.py +48 -34
  292. claude_mpm/services/monitor_build_service.py +77 -73
  293. claude_mpm/services/port_manager.py +130 -108
  294. claude_mpm/services/project/analyzer.py +12 -10
  295. claude_mpm/services/project/registry.py +11 -11
  296. claude_mpm/services/recovery_manager.py +10 -19
  297. claude_mpm/services/response_tracker.py +0 -1
  298. claude_mpm/services/runner_configuration_service.py +19 -20
  299. claude_mpm/services/session_management_service.py +7 -11
  300. claude_mpm/services/shared/__init__.py +1 -1
  301. claude_mpm/services/shared/async_service_base.py +58 -50
  302. claude_mpm/services/shared/config_service_base.py +73 -67
  303. claude_mpm/services/shared/lifecycle_service_base.py +82 -78
  304. claude_mpm/services/shared/manager_base.py +94 -82
  305. claude_mpm/services/shared/service_factory.py +96 -98
  306. claude_mpm/services/socketio/__init__.py +3 -3
  307. claude_mpm/services/socketio/client_proxy.py +5 -5
  308. claude_mpm/services/socketio/event_normalizer.py +199 -181
  309. claude_mpm/services/socketio/handlers/__init__.py +3 -3
  310. claude_mpm/services/socketio/handlers/base.py +5 -4
  311. claude_mpm/services/socketio/handlers/connection.py +163 -136
  312. claude_mpm/services/socketio/handlers/file.py +13 -14
  313. claude_mpm/services/socketio/handlers/git.py +12 -7
  314. claude_mpm/services/socketio/handlers/hook.py +49 -44
  315. claude_mpm/services/socketio/handlers/memory.py +0 -1
  316. claude_mpm/services/socketio/handlers/project.py +0 -1
  317. claude_mpm/services/socketio/handlers/registry.py +37 -19
  318. claude_mpm/services/socketio/migration_utils.py +98 -84
  319. claude_mpm/services/socketio/server/__init__.py +1 -1
  320. claude_mpm/services/socketio/server/broadcaster.py +81 -87
  321. claude_mpm/services/socketio/server/core.py +65 -54
  322. claude_mpm/services/socketio/server/eventbus_integration.py +95 -56
  323. claude_mpm/services/socketio/server/main.py +64 -38
  324. claude_mpm/services/socketio_client_manager.py +10 -12
  325. claude_mpm/services/subprocess_launcher_service.py +4 -7
  326. claude_mpm/services/system_instructions_service.py +13 -14
  327. claude_mpm/services/ticket_manager.py +2 -2
  328. claude_mpm/services/utility_service.py +5 -13
  329. claude_mpm/services/version_control/__init__.py +16 -16
  330. claude_mpm/services/version_control/branch_strategy.py +5 -8
  331. claude_mpm/services/version_control/conflict_resolution.py +9 -23
  332. claude_mpm/services/version_control/git_operations.py +5 -7
  333. claude_mpm/services/version_control/semantic_versioning.py +16 -17
  334. claude_mpm/services/version_control/version_parser.py +13 -18
  335. claude_mpm/services/version_service.py +10 -11
  336. claude_mpm/storage/__init__.py +1 -1
  337. claude_mpm/storage/state_storage.py +22 -28
  338. claude_mpm/utils/__init__.py +6 -6
  339. claude_mpm/utils/agent_dependency_loader.py +47 -33
  340. claude_mpm/utils/config_manager.py +11 -14
  341. claude_mpm/utils/dependency_cache.py +1 -1
  342. claude_mpm/utils/dependency_manager.py +13 -17
  343. claude_mpm/utils/dependency_strategies.py +8 -10
  344. claude_mpm/utils/environment_context.py +3 -9
  345. claude_mpm/utils/error_handler.py +3 -13
  346. claude_mpm/utils/file_utils.py +1 -1
  347. claude_mpm/utils/path_operations.py +8 -12
  348. claude_mpm/utils/robust_installer.py +110 -33
  349. claude_mpm/utils/subprocess_utils.py +5 -6
  350. claude_mpm/validation/agent_validator.py +3 -6
  351. claude_mpm/validation/frontmatter_validator.py +1 -1
  352. {claude_mpm-4.1.0.dist-info → claude_mpm-4.1.2.dist-info}/METADATA +1 -1
  353. claude_mpm-4.1.2.dist-info/RECORD +498 -0
  354. claude_mpm-4.1.0.dist-info/RECORD +0 -494
  355. {claude_mpm-4.1.0.dist-info → claude_mpm-4.1.2.dist-info}/WHEEL +0 -0
  356. {claude_mpm-4.1.0.dist-info → claude_mpm-4.1.2.dist-info}/entry_points.txt +0 -0
  357. {claude_mpm-4.1.0.dist-info → claude_mpm-4.1.2.dist-info}/licenses/LICENSE +0 -0
  358. {claude_mpm-4.1.0.dist-info → claude_mpm-4.1.2.dist-info}/top_level.txt +0 -0
@@ -8,21 +8,23 @@ WHY separate relay component:
8
8
  - Supports batching and retry logic in one place
9
9
  """
10
10
 
11
- import asyncio
12
11
  import logging
13
12
  import os
14
13
  import time
15
- from typing import Any, Dict, Optional
16
14
  from datetime import datetime
15
+ from typing import Any, Dict, Optional
17
16
 
18
17
  # Socket.IO imports
19
18
  try:
20
19
  import socketio
20
+
21
21
  SOCKETIO_AVAILABLE = True
22
22
  except ImportError:
23
23
  SOCKETIO_AVAILABLE = False
24
24
  socketio = None
25
25
 
26
+ import contextlib
27
+
26
28
  from .event_bus import EventBus
27
29
 
28
30
  # Configure logger
@@ -31,7 +33,7 @@ logger = logging.getLogger(__name__)
31
33
 
32
34
  class SocketIORelay:
33
35
  """Relay events from EventBus to Socket.IO clients.
34
-
36
+
35
37
  WHY relay pattern:
36
38
  - Decouples event production from Socket.IO emission
37
39
  - Handles connection failures without affecting producers
@@ -39,10 +41,10 @@ class SocketIORelay:
39
41
  - Enables event batching and optimization
40
42
  - Simplifies debugging with centralized logging
41
43
  """
42
-
44
+
43
45
  def __init__(self, port: Optional[int] = None):
44
46
  """Initialize the Socket.IO relay.
45
-
47
+
46
48
  Args:
47
49
  port: Socket.IO server port (defaults to env var or 8765)
48
50
  """
@@ -52,25 +54,25 @@ class SocketIORelay:
52
54
  self.connected = False
53
55
  self.enabled = True
54
56
  self.debug = os.environ.get("CLAUDE_MPM_RELAY_DEBUG", "false").lower() == "true"
55
-
57
+
56
58
  # Connection retry settings
57
59
  self.max_retries = 3
58
60
  self.retry_delay = 0.5
59
61
  self.last_connection_attempt = 0
60
62
  self.connection_cooldown = 5.0 # Seconds between connection attempts
61
-
63
+
62
64
  # Statistics
63
65
  self.stats = {
64
66
  "events_relayed": 0,
65
67
  "events_failed": 0,
66
68
  "connection_failures": 0,
67
- "last_relay_time": None
69
+ "last_relay_time": None,
68
70
  }
69
-
71
+
70
72
  if not SOCKETIO_AVAILABLE:
71
73
  logger.warning("Socket.IO not available, relay will be disabled")
72
74
  self.enabled = False
73
-
75
+
74
76
  def enable(self) -> None:
75
77
  """Enable the relay."""
76
78
  if not SOCKETIO_AVAILABLE:
@@ -78,33 +80,31 @@ class SocketIORelay:
78
80
  return
79
81
  self.enabled = True
80
82
  logger.info("SocketIO relay enabled")
81
-
83
+
82
84
  def disable(self) -> None:
83
85
  """Disable the relay."""
84
86
  self.enabled = False
85
87
  if self.client and self.connected:
86
- try:
88
+ with contextlib.suppress(Exception):
87
89
  self.client.disconnect()
88
- except:
89
- pass
90
90
  logger.info("SocketIO relay disabled")
91
-
91
+
92
92
  def _create_client(self) -> bool:
93
93
  """Create and connect Socket.IO client.
94
-
94
+
95
95
  Returns:
96
96
  bool: True if connection successful
97
97
  """
98
98
  if not SOCKETIO_AVAILABLE or not self.enabled:
99
99
  return False
100
-
100
+
101
101
  # Check connection cooldown
102
102
  current_time = time.time()
103
103
  if current_time - self.last_connection_attempt < self.connection_cooldown:
104
104
  return False
105
-
105
+
106
106
  self.last_connection_attempt = current_time
107
-
107
+
108
108
  try:
109
109
  # Create new client with better connection settings
110
110
  self.client = socketio.Client(
@@ -113,21 +113,21 @@ class SocketIORelay:
113
113
  reconnection_delay=2,
114
114
  reconnection_delay_max=10,
115
115
  logger=False,
116
- engineio_logger=False
116
+ engineio_logger=False,
117
117
  )
118
-
118
+
119
119
  # Connect to server with longer timeout
120
120
  self.client.connect(
121
121
  f"http://localhost:{self.port}",
122
122
  wait=True,
123
123
  wait_timeout=10.0, # Increase timeout for stability
124
- transports=['websocket', 'polling']
124
+ transports=["websocket", "polling"],
125
125
  )
126
-
126
+
127
127
  self.connected = True
128
128
  logger.info(f"SocketIO relay connected to port {self.port}")
129
129
  return True
130
-
130
+
131
131
  except Exception as e:
132
132
  self.stats["connection_failures"] += 1
133
133
  if self.debug:
@@ -135,16 +135,16 @@ class SocketIORelay:
135
135
  self.connected = False
136
136
  self.client = None
137
137
  return False
138
-
138
+
139
139
  def _ensure_connection(self) -> bool:
140
140
  """Ensure Socket.IO client is connected.
141
-
141
+
142
142
  Returns:
143
143
  bool: True if connected or reconnected
144
144
  """
145
145
  if not self.enabled:
146
146
  return False
147
-
147
+
148
148
  # Check existing connection
149
149
  if self.client and self.connected:
150
150
  try:
@@ -153,48 +153,55 @@ class SocketIORelay:
153
153
  return True
154
154
  except:
155
155
  pass
156
-
156
+
157
157
  # Need to create or reconnect
158
158
  return self._create_client()
159
-
159
+
160
160
  async def relay_event(self, event_type: str, data: Any) -> bool:
161
161
  """Relay an event to Socket.IO.
162
-
162
+
163
163
  Args:
164
164
  event_type: The event type
165
165
  data: The event data
166
-
166
+
167
167
  Returns:
168
168
  bool: True if successfully relayed
169
169
  """
170
170
  if not self.enabled:
171
171
  return False
172
-
172
+
173
173
  # Ensure we have a connection
174
174
  if not self._ensure_connection():
175
175
  self.stats["events_failed"] += 1
176
176
  return False
177
-
177
+
178
178
  try:
179
179
  # Emit to Socket.IO
180
- self.client.emit("claude_event", {
181
- "event": "claude_event",
182
- "type": event_type.split(".")[0] if "." in event_type else event_type,
183
- "subtype": event_type.split(".", 1)[1] if "." in event_type else "generic",
184
- "timestamp": data.get("timestamp", datetime.now().isoformat()),
185
- "data": data,
186
- "source": "event_bus"
187
- })
188
-
180
+ self.client.emit(
181
+ "claude_event",
182
+ {
183
+ "event": "claude_event",
184
+ "type": (
185
+ event_type.split(".")[0] if "." in event_type else event_type
186
+ ),
187
+ "subtype": (
188
+ event_type.split(".", 1)[1] if "." in event_type else "generic"
189
+ ),
190
+ "timestamp": data.get("timestamp", datetime.now().isoformat()),
191
+ "data": data,
192
+ "source": "event_bus",
193
+ },
194
+ )
195
+
189
196
  # Update statistics
190
197
  self.stats["events_relayed"] += 1
191
198
  self.stats["last_relay_time"] = datetime.now().isoformat()
192
-
199
+
193
200
  if self.debug:
194
201
  logger.debug(f"Relayed event to Socket.IO: {event_type}")
195
-
202
+
196
203
  return True
197
-
204
+
198
205
  except Exception as e:
199
206
  self.stats["events_failed"] += 1
200
207
  if self.debug:
@@ -202,49 +209,52 @@ class SocketIORelay:
202
209
  # Mark connection as failed for retry
203
210
  self.connected = False
204
211
  return False
205
-
212
+
206
213
  def start(self) -> None:
207
214
  """Start the relay by subscribing to EventBus events.
208
-
215
+
209
216
  This sets up listeners for all hook events and relays them
210
217
  to Socket.IO clients.
211
218
  """
212
219
  if not self.enabled:
213
220
  logger.warning("Cannot start relay: disabled or Socket.IO not available")
214
221
  return
215
-
222
+
216
223
  # Define async handler for events
217
224
  async def handle_hook_event(event_type: str, data: Any):
218
225
  """Handle events from the event bus."""
226
+ # Debug logging
227
+ print(f"[Relay] Received event: {event_type}", flush=True)
228
+
219
229
  # Only relay hook events by default
220
230
  if event_type.startswith("hook."):
231
+ print(f"[Relay] Relaying hook event: {event_type}", flush=True)
221
232
  await self.relay_event(event_type, data)
222
-
233
+
223
234
  # Subscribe to all hook events via wildcard
224
235
  # This will catch ALL hook.* events
225
236
  self.event_bus.on("hook.*", handle_hook_event)
226
-
237
+
227
238
  logger.info("SocketIO relay started and subscribed to events")
228
-
239
+ print("[Relay] Started and subscribed to hook.* events", flush=True)
240
+
229
241
  def stop(self) -> None:
230
242
  """Stop the relay and clean up resources."""
231
243
  # Disconnect Socket.IO client
232
244
  if self.client and self.connected:
233
- try:
245
+ with contextlib.suppress(Exception):
234
246
  self.client.disconnect()
235
- except:
236
- pass
237
-
247
+
238
248
  # Could remove event bus listeners here if needed
239
249
  # For now, let them be cleaned up naturally
240
-
250
+
241
251
  self.connected = False
242
252
  self.client = None
243
253
  logger.info("SocketIO relay stopped")
244
-
254
+
245
255
  def get_stats(self) -> Dict[str, Any]:
246
256
  """Get relay statistics.
247
-
257
+
248
258
  Returns:
249
259
  dict: Statistics about relay operation
250
260
  """
@@ -252,7 +262,7 @@ class SocketIORelay:
252
262
  **self.stats,
253
263
  "enabled": self.enabled,
254
264
  "connected": self.connected,
255
- "port": self.port
265
+ "port": self.port,
256
266
  }
257
267
 
258
268
 
@@ -262,10 +272,10 @@ _relay_instance: Optional[SocketIORelay] = None
262
272
 
263
273
  def get_relay(port: Optional[int] = None) -> SocketIORelay:
264
274
  """Get or create the global SocketIO relay instance.
265
-
275
+
266
276
  Args:
267
277
  port: Optional port number
268
-
278
+
269
279
  Returns:
270
280
  SocketIORelay: The relay instance
271
281
  """
@@ -277,10 +287,10 @@ def get_relay(port: Optional[int] = None) -> SocketIORelay:
277
287
 
278
288
  def start_relay(port: Optional[int] = None) -> SocketIORelay:
279
289
  """Start the global SocketIO relay.
280
-
290
+
281
291
  Args:
282
292
  port: Optional port number
283
-
293
+
284
294
  Returns:
285
295
  SocketIORelay: The started relay instance
286
296
  """
@@ -294,4 +304,4 @@ def stop_relay() -> None:
294
304
  global _relay_instance
295
305
  if _relay_instance:
296
306
  _relay_instance.stop()
297
- _relay_instance = None
307
+ _relay_instance = None
@@ -13,32 +13,32 @@ Key Components:
13
13
  - Various consumer implementations
14
14
  """
15
15
 
16
- from .core import Event, EventBus, EventMetadata, EventPriority
17
- from .interfaces import IEventConsumer, IEventProducer, ConsumerConfig
18
16
  from .consumers import (
19
- SocketIOConsumer,
17
+ DeadLetterConsumer,
20
18
  LoggingConsumer,
21
19
  MetricsConsumer,
22
- DeadLetterConsumer,
20
+ SocketIOConsumer,
23
21
  )
22
+ from .core import Event, EventBus, EventMetadata, EventPriority
23
+ from .interfaces import ConsumerConfig, IEventConsumer, IEventProducer
24
24
  from .producers import HookEventProducer, SystemEventProducer
25
25
 
26
26
  __all__ = [
27
+ "ConsumerConfig",
28
+ "DeadLetterConsumer",
27
29
  # Core
28
30
  "Event",
29
31
  "EventBus",
30
32
  "EventMetadata",
31
33
  "EventPriority",
34
+ # Producers
35
+ "HookEventProducer",
32
36
  # Interfaces
33
37
  "IEventConsumer",
34
38
  "IEventProducer",
35
- "ConsumerConfig",
36
- # Consumers
37
- "SocketIOConsumer",
38
39
  "LoggingConsumer",
39
40
  "MetricsConsumer",
40
- "DeadLetterConsumer",
41
- # Producers
42
- "HookEventProducer",
41
+ # Consumers
42
+ "SocketIOConsumer",
43
43
  "SystemEventProducer",
44
- ]
44
+ ]
@@ -11,8 +11,8 @@ from .metrics import MetricsConsumer
11
11
  from .socketio import SocketIOConsumer
12
12
 
13
13
  __all__ = [
14
- "SocketIOConsumer",
14
+ "DeadLetterConsumer",
15
15
  "LoggingConsumer",
16
16
  "MetricsConsumer",
17
- "DeadLetterConsumer",
18
- ]
17
+ "SocketIOConsumer",
18
+ ]