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,223 +8,207 @@ Defines the contracts for event producers and consumers in the event bus system.
8
8
  from abc import ABC, abstractmethod
9
9
  from dataclasses import dataclass
10
10
  from enum import Enum
11
- from typing import Any, Callable, Dict, List, Optional, Pattern, Set
11
+ from typing import Any, Callable, Dict, List, Optional, Pattern
12
12
 
13
13
  from .core import Event
14
14
 
15
15
 
16
16
  class ConsumerPriority(Enum):
17
17
  """Priority levels for event consumers."""
18
- CRITICAL = 1 # Process first (e.g., error handlers)
19
- HIGH = 2 # Important consumers (e.g., Socket.IO)
20
- NORMAL = 3 # Default priority
21
- LOW = 4 # Background processing
22
- DEFERRED = 5 # Process last (e.g., metrics, logging)
18
+
19
+ CRITICAL = 1 # Process first (e.g., error handlers)
20
+ HIGH = 2 # Important consumers (e.g., Socket.IO)
21
+ NORMAL = 3 # Default priority
22
+ LOW = 4 # Background processing
23
+ DEFERRED = 5 # Process last (e.g., metrics, logging)
23
24
 
24
25
 
25
26
  @dataclass
26
27
  class ConsumerConfig:
27
28
  """Configuration for an event consumer."""
28
- name: str # Consumer identifier
29
- topics: Optional[List[str]] = None # Topics to subscribe to (None = all)
30
- topic_pattern: Optional[Pattern] = None # Regex pattern for topics
29
+
30
+ name: str # Consumer identifier
31
+ topics: Optional[List[str]] = None # Topics to subscribe to (None = all)
32
+ topic_pattern: Optional[Pattern] = None # Regex pattern for topics
31
33
  priority: ConsumerPriority = ConsumerPriority.NORMAL
32
- batch_size: int = 1 # Process events in batches
33
- batch_timeout: float = 0.0 # Max time to wait for batch
34
- max_retries: int = 3 # Retry failed events
35
- retry_backoff: float = 1.0 # Backoff multiplier
36
- error_handler: Optional[Callable] = None # Custom error handler
37
- filter_func: Optional[Callable] = None # Event filter function
38
- transform_func: Optional[Callable] = None # Event transformation
34
+ batch_size: int = 1 # Process events in batches
35
+ batch_timeout: float = 0.0 # Max time to wait for batch
36
+ max_retries: int = 3 # Retry failed events
37
+ retry_backoff: float = 1.0 # Backoff multiplier
38
+ error_handler: Optional[Callable] = None # Custom error handler
39
+ filter_func: Optional[Callable] = None # Event filter function
40
+ transform_func: Optional[Callable] = None # Event transformation
39
41
 
40
42
 
41
43
  class IEventProducer(ABC):
42
44
  """
43
45
  Interface for event producers.
44
-
46
+
45
47
  Producers create and publish events to the event bus without
46
48
  knowing about consumers or handling errors.
47
49
  """
48
-
50
+
49
51
  @abstractmethod
50
52
  async def publish(self, event: Event) -> bool:
51
53
  """
52
54
  Publish an event to the bus.
53
-
55
+
54
56
  Args:
55
57
  event: The event to publish
56
-
58
+
57
59
  Returns:
58
60
  True if event was accepted, False otherwise
59
61
  """
60
- pass
61
-
62
+
62
63
  @abstractmethod
63
64
  async def publish_batch(self, events: List[Event]) -> int:
64
65
  """
65
66
  Publish multiple events efficiently.
66
-
67
+
67
68
  Args:
68
69
  events: List of events to publish
69
-
70
+
70
71
  Returns:
71
72
  Number of events successfully published
72
73
  """
73
- pass
74
-
74
+
75
75
  @property
76
76
  @abstractmethod
77
77
  def source_name(self) -> str:
78
78
  """Get the name of this event source."""
79
- pass
80
79
 
81
80
 
82
81
  class IEventConsumer(ABC):
83
82
  """
84
83
  Interface for event consumers.
85
-
84
+
86
85
  Consumers subscribe to events and process them asynchronously.
87
86
  Each consumer is responsible for its own error handling.
88
87
  """
89
-
88
+
90
89
  @abstractmethod
91
90
  async def initialize(self) -> bool:
92
91
  """
93
92
  Initialize the consumer.
94
-
93
+
95
94
  Returns:
96
95
  True if initialization successful
97
96
  """
98
- pass
99
-
97
+
100
98
  @abstractmethod
101
99
  async def consume(self, event: Event) -> bool:
102
100
  """
103
101
  Process a single event.
104
-
102
+
105
103
  Args:
106
104
  event: The event to process
107
-
105
+
108
106
  Returns:
109
107
  True if event processed successfully
110
108
  """
111
- pass
112
-
109
+
113
110
  @abstractmethod
114
111
  async def consume_batch(self, events: List[Event]) -> int:
115
112
  """
116
113
  Process multiple events in a batch.
117
-
114
+
118
115
  Args:
119
116
  events: List of events to process
120
-
117
+
121
118
  Returns:
122
119
  Number of events successfully processed
123
120
  """
124
- pass
125
-
121
+
126
122
  @abstractmethod
127
123
  async def shutdown(self) -> None:
128
124
  """Shutdown the consumer gracefully."""
129
- pass
130
-
125
+
131
126
  @property
132
127
  @abstractmethod
133
128
  def config(self) -> ConsumerConfig:
134
129
  """Get consumer configuration."""
135
- pass
136
-
130
+
137
131
  @property
138
132
  @abstractmethod
139
133
  def is_healthy(self) -> bool:
140
134
  """Check if consumer is healthy."""
141
- pass
142
-
135
+
143
136
  @abstractmethod
144
137
  def get_metrics(self) -> Dict[str, Any]:
145
138
  """
146
139
  Get consumer metrics.
147
-
140
+
148
141
  Returns:
149
142
  Dictionary of metrics (events processed, errors, etc.)
150
143
  """
151
- pass
152
144
 
153
145
 
154
146
  class IEventBus(ABC):
155
147
  """
156
148
  Interface for the event bus.
157
-
149
+
158
150
  The event bus manages subscriptions and routes events from
159
151
  producers to consumers.
160
152
  """
161
-
153
+
162
154
  @abstractmethod
163
155
  async def start(self) -> None:
164
156
  """Start the event bus."""
165
- pass
166
-
157
+
167
158
  @abstractmethod
168
159
  async def stop(self) -> None:
169
160
  """Stop the event bus gracefully."""
170
- pass
171
-
161
+
172
162
  @abstractmethod
173
163
  async def publish(self, event: Event) -> bool:
174
164
  """
175
165
  Publish an event to the bus.
176
-
166
+
177
167
  Args:
178
168
  event: The event to publish
179
-
169
+
180
170
  Returns:
181
171
  True if event was queued successfully
182
172
  """
183
- pass
184
-
173
+
185
174
  @abstractmethod
186
175
  async def subscribe(self, consumer: IEventConsumer) -> bool:
187
176
  """
188
177
  Subscribe a consumer to the bus.
189
-
178
+
190
179
  Args:
191
180
  consumer: The consumer to subscribe
192
-
181
+
193
182
  Returns:
194
183
  True if subscription successful
195
184
  """
196
- pass
197
-
185
+
198
186
  @abstractmethod
199
187
  async def unsubscribe(self, consumer_name: str) -> bool:
200
188
  """
201
189
  Unsubscribe a consumer from the bus.
202
-
190
+
203
191
  Args:
204
192
  consumer_name: Name of the consumer to unsubscribe
205
-
193
+
206
194
  Returns:
207
195
  True if unsubscription successful
208
196
  """
209
- pass
210
-
197
+
211
198
  @abstractmethod
212
199
  def get_consumers(self) -> List[IEventConsumer]:
213
200
  """Get list of active consumers."""
214
- pass
215
-
201
+
216
202
  @abstractmethod
217
203
  def get_metrics(self) -> Dict[str, Any]:
218
204
  """
219
205
  Get event bus metrics.
220
-
206
+
221
207
  Returns:
222
208
  Dictionary of metrics (queue size, throughput, etc.)
223
209
  """
224
- pass
225
-
210
+
226
211
  @property
227
212
  @abstractmethod
228
213
  def is_running(self) -> bool:
229
214
  """Check if event bus is running."""
230
- pass
@@ -11,4 +11,4 @@ from .system import SystemEventProducer
11
11
  __all__ = [
12
12
  "HookEventProducer",
13
13
  "SystemEventProducer",
14
- ]
14
+ ]
@@ -19,64 +19,64 @@ from ..interfaces import IEventBus, IEventProducer
19
19
  class HookEventProducer(IEventProducer):
20
20
  """
21
21
  Publishes hook events to the event bus.
22
-
22
+
23
23
  This producer is used by the hook handler to publish events
24
24
  without knowing about Socket.IO or other consumers.
25
25
  """
26
-
26
+
27
27
  def __init__(self, event_bus: IEventBus):
28
28
  """
29
29
  Initialize hook event producer.
30
-
30
+
31
31
  Args:
32
32
  event_bus: The event bus to publish to
33
33
  """
34
34
  self.logger = get_logger("HookEventProducer")
35
35
  self.event_bus = event_bus
36
36
  self._source_name = "hook_handler"
37
-
37
+
38
38
  # Metrics
39
39
  self._metrics = {
40
40
  "events_published": 0,
41
41
  "events_failed": 0,
42
42
  "batch_published": 0,
43
43
  }
44
-
44
+
45
45
  async def publish(self, event: Event) -> bool:
46
46
  """Publish a hook event to the bus."""
47
47
  try:
48
48
  success = await self.event_bus.publish(event)
49
-
49
+
50
50
  if success:
51
51
  self._metrics["events_published"] += 1
52
52
  else:
53
53
  self._metrics["events_failed"] += 1
54
-
54
+
55
55
  return success
56
-
56
+
57
57
  except Exception as e:
58
58
  self.logger.error(f"Error publishing hook event: {e}")
59
59
  self._metrics["events_failed"] += 1
60
60
  return False
61
-
61
+
62
62
  async def publish_batch(self, events: List[Event]) -> int:
63
63
  """Publish multiple hook events."""
64
64
  successful = 0
65
-
65
+
66
66
  for event in events:
67
67
  if await self.publish(event):
68
68
  successful += 1
69
-
69
+
70
70
  self._metrics["batch_published"] += 1
71
71
  return successful
72
-
72
+
73
73
  @property
74
74
  def source_name(self) -> str:
75
75
  """Get the name of this event source."""
76
76
  return self._source_name
77
-
77
+
78
78
  # Convenience methods for common hook events
79
-
79
+
80
80
  async def publish_response(
81
81
  self,
82
82
  response_data: Dict[str, Any],
@@ -84,11 +84,11 @@ class HookEventProducer(IEventProducer):
84
84
  ) -> bool:
85
85
  """
86
86
  Publish an assistant response event.
87
-
87
+
88
88
  Args:
89
89
  response_data: The response data
90
90
  correlation_id: Optional correlation ID
91
-
91
+
92
92
  Returns:
93
93
  True if published successfully
94
94
  """
@@ -102,9 +102,9 @@ class HookEventProducer(IEventProducer):
102
102
  correlation_id=correlation_id,
103
103
  priority=EventPriority.HIGH,
104
104
  )
105
-
105
+
106
106
  return await self.publish(event)
107
-
107
+
108
108
  async def publish_tool_use(
109
109
  self,
110
110
  tool_name: str,
@@ -114,13 +114,13 @@ class HookEventProducer(IEventProducer):
114
114
  ) -> bool:
115
115
  """
116
116
  Publish a tool usage event.
117
-
117
+
118
118
  Args:
119
119
  tool_name: Name of the tool used
120
120
  tool_params: Parameters passed to the tool
121
121
  tool_result: Optional tool result
122
122
  correlation_id: Optional correlation ID
123
-
123
+
124
124
  Returns:
125
125
  True if published successfully
126
126
  """
@@ -138,9 +138,9 @@ class HookEventProducer(IEventProducer):
138
138
  correlation_id=correlation_id,
139
139
  priority=EventPriority.NORMAL,
140
140
  )
141
-
141
+
142
142
  return await self.publish(event)
143
-
143
+
144
144
  async def publish_error(
145
145
  self,
146
146
  error_type: str,
@@ -150,13 +150,13 @@ class HookEventProducer(IEventProducer):
150
150
  ) -> bool:
151
151
  """
152
152
  Publish an error event.
153
-
153
+
154
154
  Args:
155
155
  error_type: Type of error
156
156
  error_message: Error message
157
157
  error_details: Optional additional details
158
158
  correlation_id: Optional correlation ID
159
-
159
+
160
160
  Returns:
161
161
  True if published successfully
162
162
  """
@@ -174,9 +174,9 @@ class HookEventProducer(IEventProducer):
174
174
  correlation_id=correlation_id,
175
175
  priority=EventPriority.CRITICAL,
176
176
  )
177
-
177
+
178
178
  return await self.publish(event)
179
-
179
+
180
180
  async def publish_subagent_event(
181
181
  self,
182
182
  subagent_name: str,
@@ -186,13 +186,13 @@ class HookEventProducer(IEventProducer):
186
186
  ) -> bool:
187
187
  """
188
188
  Publish a subagent-related event.
189
-
189
+
190
190
  Args:
191
191
  subagent_name: Name of the subagent
192
192
  event_type: Type of subagent event
193
193
  event_data: Event data
194
194
  correlation_id: Optional correlation ID
195
-
195
+
196
196
  Returns:
197
197
  True if published successfully
198
198
  """
@@ -209,9 +209,9 @@ class HookEventProducer(IEventProducer):
209
209
  correlation_id=correlation_id,
210
210
  priority=EventPriority.NORMAL,
211
211
  )
212
-
212
+
213
213
  return await self.publish(event)
214
-
214
+
215
215
  async def publish_raw_hook_event(
216
216
  self,
217
217
  hook_type: str,
@@ -220,14 +220,14 @@ class HookEventProducer(IEventProducer):
220
220
  ) -> bool:
221
221
  """
222
222
  Publish a raw hook event.
223
-
223
+
224
224
  This is for hook events that don't fit the standard patterns.
225
-
225
+
226
226
  Args:
227
227
  hook_type: Type of hook event
228
228
  hook_data: Raw hook data
229
229
  correlation_id: Optional correlation ID
230
-
230
+
231
231
  Returns:
232
232
  True if published successfully
233
233
  """
@@ -242,7 +242,7 @@ class HookEventProducer(IEventProducer):
242
242
  topic = "hook.subagent"
243
243
  else:
244
244
  topic = "hook.generic"
245
-
245
+
246
246
  # Determine priority
247
247
  if "error" in hook_type.lower() or "critical" in hook_type.lower():
248
248
  priority = EventPriority.CRITICAL
@@ -250,7 +250,7 @@ class HookEventProducer(IEventProducer):
250
250
  priority = EventPriority.HIGH
251
251
  else:
252
252
  priority = EventPriority.NORMAL
253
-
253
+
254
254
  event = Event(
255
255
  id=str(uuid.uuid4()),
256
256
  topic=topic,
@@ -261,9 +261,9 @@ class HookEventProducer(IEventProducer):
261
261
  correlation_id=correlation_id,
262
262
  priority=priority,
263
263
  )
264
-
264
+
265
265
  return await self.publish(event)
266
-
266
+
267
267
  def get_metrics(self) -> Dict[str, Any]:
268
268
  """Get producer metrics."""
269
- return self._metrics
269
+ return self._metrics