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,137 +8,141 @@ from ...core.config import Config
8
8
  from ...core.logger import get_logger
9
9
  from ...core.shared import ConfigLoader, PathResolver, SingletonManager
10
10
 
11
- T = TypeVar('T')
11
+ T = TypeVar("T")
12
12
 
13
13
 
14
14
  class ServiceFactory:
15
15
  """
16
16
  Factory for creating services with common patterns.
17
-
17
+
18
18
  Reduces duplication by providing standard service creation patterns:
19
19
  - Configuration injection
20
20
  - Dependency resolution
21
21
  - Singleton management
22
22
  - Standard initialization
23
23
  """
24
-
24
+
25
25
  def __init__(self):
26
26
  """Initialize service factory."""
27
27
  self.logger = get_logger("service_factory")
28
28
  self._config_loader = ConfigLoader()
29
29
  self._path_resolver = PathResolver()
30
30
  self._registered_services: Dict[str, Type] = {}
31
-
31
+
32
32
  def register_service(self, service_name: str, service_class: Type[T]) -> None:
33
33
  """
34
34
  Register a service class.
35
-
35
+
36
36
  Args:
37
37
  service_name: Name to register service under
38
38
  service_class: Service class to register
39
39
  """
40
40
  self._registered_services[service_name] = service_class
41
- self.logger.debug(f"Registered service: {service_name} -> {service_class.__name__}")
42
-
43
- def create_service(self,
44
- service_class: Type[T],
45
- service_name: str = None,
46
- config: Optional[Dict[str, Any]] = None,
47
- singleton: bool = False,
48
- **kwargs) -> T:
41
+ self.logger.debug(
42
+ f"Registered service: {service_name} -> {service_class.__name__}"
43
+ )
44
+
45
+ def create_service(
46
+ self,
47
+ service_class: Type[T],
48
+ service_name: Optional[str] = None,
49
+ config: Optional[Dict[str, Any]] = None,
50
+ singleton: bool = False,
51
+ **kwargs,
52
+ ) -> T:
49
53
  """
50
54
  Create a service instance with standard patterns.
51
-
55
+
52
56
  Args:
53
57
  service_class: Service class to instantiate
54
58
  service_name: Optional service name (defaults to class name)
55
59
  config: Optional configuration override
56
60
  singleton: Whether to use singleton pattern
57
61
  **kwargs: Additional constructor arguments
58
-
62
+
59
63
  Returns:
60
64
  Service instance
61
65
  """
62
66
  if service_name is None:
63
67
  service_name = service_class.__name__
64
-
68
+
65
69
  self.logger.debug(f"Creating service: {service_name}")
66
-
70
+
67
71
  # Load configuration if not provided
68
72
  if config is None:
69
73
  config = self._load_service_config(service_name)
70
-
74
+
71
75
  # Prepare constructor arguments
72
- constructor_args = {
73
- "service_name": service_name,
74
- "config": config,
75
- **kwargs
76
- }
77
-
76
+ constructor_args = {"service_name": service_name, "config": config, **kwargs}
77
+
78
78
  # Filter arguments based on constructor signature
79
79
  filtered_args = self._filter_constructor_args(service_class, constructor_args)
80
-
80
+
81
81
  # Create instance
82
82
  if singleton:
83
83
  instance = SingletonManager.get_instance(service_class, **filtered_args)
84
84
  else:
85
85
  instance = service_class(**filtered_args)
86
-
86
+
87
87
  self.logger.info(f"Created service: {service_name} ({service_class.__name__})")
88
88
  return instance
89
-
90
- def create_registered_service(self,
91
- service_name: str,
92
- config: Optional[Dict[str, Any]] = None,
93
- singleton: bool = False,
94
- **kwargs) -> Any:
89
+
90
+ def create_registered_service(
91
+ self,
92
+ service_name: str,
93
+ config: Optional[Dict[str, Any]] = None,
94
+ singleton: bool = False,
95
+ **kwargs,
96
+ ) -> Any:
95
97
  """
96
98
  Create a service by registered name.
97
-
99
+
98
100
  Args:
99
101
  service_name: Name of registered service
100
102
  config: Optional configuration override
101
103
  singleton: Whether to use singleton pattern
102
104
  **kwargs: Additional constructor arguments
103
-
105
+
104
106
  Returns:
105
107
  Service instance
106
-
108
+
107
109
  Raises:
108
110
  ValueError: If service not registered
109
111
  """
110
112
  if service_name not in self._registered_services:
111
113
  raise ValueError(f"Service not registered: {service_name}")
112
-
114
+
113
115
  service_class = self._registered_services[service_name]
114
116
  return self.create_service(
115
117
  service_class=service_class,
116
118
  service_name=service_name,
117
119
  config=config,
118
120
  singleton=singleton,
119
- **kwargs
121
+ **kwargs,
120
122
  )
121
-
122
- def create_agent_service(self,
123
- service_class: Type[T],
124
- agent_name: str,
125
- agent_dir: str = None,
126
- **kwargs) -> T:
123
+
124
+ def create_agent_service(
125
+ self,
126
+ service_class: Type[T],
127
+ agent_name: str,
128
+ agent_dir: Optional[str] = None,
129
+ **kwargs,
130
+ ) -> T:
127
131
  """
128
132
  Create an agent-related service.
129
-
133
+
130
134
  Args:
131
135
  service_class: Service class to instantiate
132
136
  agent_name: Name of the agent
133
137
  agent_dir: Optional agent directory
134
138
  **kwargs: Additional constructor arguments
135
-
139
+
136
140
  Returns:
137
141
  Service instance
138
142
  """
139
143
  # Load agent-specific configuration
140
144
  config = self._config_loader.load_agent_config(agent_dir)
141
-
145
+
142
146
  # Add agent-specific paths
143
147
  if agent_dir:
144
148
  agent_path = self._path_resolver.resolve_relative_path(agent_dir)
@@ -146,97 +150,94 @@ class ServiceFactory:
146
150
  agent_path = self._path_resolver.find_agent_file(agent_name)
147
151
  if agent_path:
148
152
  agent_path = agent_path.parent
149
-
153
+
150
154
  constructor_args = {
151
155
  "agent_name": agent_name,
152
156
  "agent_dir": agent_path,
153
157
  "config": config,
154
- **kwargs
158
+ **kwargs,
155
159
  }
156
-
160
+
157
161
  return self.create_service(
158
162
  service_class=service_class,
159
163
  service_name=f"agent_{agent_name}",
160
164
  config=config,
161
- **constructor_args
165
+ **constructor_args,
162
166
  )
163
-
164
- def create_memory_service(self,
165
- service_class: Type[T],
166
- agent_name: str = None,
167
- memory_dir: str = None,
168
- **kwargs) -> T:
167
+
168
+ def create_memory_service(
169
+ self,
170
+ service_class: Type[T],
171
+ agent_name: Optional[str] = None,
172
+ memory_dir: Optional[str] = None,
173
+ **kwargs,
174
+ ) -> T:
169
175
  """
170
176
  Create a memory-related service.
171
-
177
+
172
178
  Args:
173
179
  service_class: Service class to instantiate
174
180
  agent_name: Optional agent name
175
181
  memory_dir: Optional memory directory
176
182
  **kwargs: Additional constructor arguments
177
-
183
+
178
184
  Returns:
179
185
  Service instance
180
186
  """
181
187
  # Load memory-specific configuration
182
188
  config = self._config_loader.load_memory_config(memory_dir)
183
-
189
+
184
190
  # Resolve memory directory
185
191
  if memory_dir:
186
192
  memory_path = self._path_resolver.resolve_relative_path(memory_dir)
187
193
  else:
188
194
  memory_path = self._path_resolver.resolve_memories_dir(create=True)
189
-
190
- constructor_args = {
191
- "memory_dir": memory_path,
192
- "config": config,
193
- **kwargs
194
- }
195
-
195
+
196
+ constructor_args = {"memory_dir": memory_path, "config": config, **kwargs}
197
+
196
198
  if agent_name:
197
199
  constructor_args["agent_name"] = agent_name
198
-
200
+
199
201
  service_name = f"memory_{agent_name}" if agent_name else "memory"
200
-
202
+
201
203
  return self.create_service(
202
204
  service_class=service_class,
203
205
  service_name=service_name,
204
206
  config=config,
205
- **constructor_args
207
+ **constructor_args,
206
208
  )
207
-
208
- def create_config_service(self,
209
- service_class: Type[T],
210
- config_section: str = None,
211
- **kwargs) -> T:
209
+
210
+ def create_config_service(
211
+ self, service_class: Type[T], config_section: Optional[str] = None, **kwargs
212
+ ) -> T:
212
213
  """
213
214
  Create a configuration-heavy service.
214
-
215
+
215
216
  Args:
216
217
  service_class: Service class to instantiate
217
218
  config_section: Configuration section name
218
219
  **kwargs: Additional constructor arguments
219
-
220
+
220
221
  Returns:
221
222
  Service instance
222
223
  """
223
224
  # Load service-specific configuration
224
225
  service_name = config_section or service_class.__name__.lower()
225
226
  config = self._config_loader.load_service_config(service_name)
226
-
227
+
227
228
  constructor_args = {
228
229
  "config": config,
229
230
  "config_section": config_section,
230
- **kwargs
231
+ **kwargs,
231
232
  }
232
-
233
+
233
234
  return self.create_service(
234
235
  service_class=service_class,
235
236
  service_name=service_name,
236
237
  config=config,
237
- **constructor_args
238
+ **constructor_args,
238
239
  )
239
-
240
+
240
241
  def _load_service_config(self, service_name: str) -> Config:
241
242
  """Load configuration for a service."""
242
243
  try:
@@ -245,44 +246,41 @@ class ServiceFactory:
245
246
  self.logger.warning(f"Failed to load config for {service_name}: {e}")
246
247
  # Return default config using ConfigLoader
247
248
  return self._config_loader.load_main_config()
248
-
249
- def _filter_constructor_args(self,
250
- service_class: Type,
251
- args: Dict[str, Any]) -> Dict[str, Any]:
249
+
250
+ def _filter_constructor_args(
251
+ self, service_class: Type, args: Dict[str, Any]
252
+ ) -> Dict[str, Any]:
252
253
  """Filter constructor arguments based on class signature."""
253
254
  import inspect
254
-
255
+
255
256
  try:
256
257
  # Get constructor signature
257
258
  sig = inspect.signature(service_class.__init__)
258
- param_names = set(sig.parameters.keys()) - {'self'}
259
-
259
+ param_names = set(sig.parameters.keys()) - {"self"}
260
+
260
261
  # Filter arguments
261
262
  filtered = {k: v for k, v in args.items() if k in param_names}
262
-
263
+
263
264
  # Log filtered arguments
264
265
  if len(filtered) != len(args):
265
266
  filtered_out = set(args.keys()) - set(filtered.keys())
266
267
  self.logger.debug(f"Filtered out arguments: {filtered_out}")
267
-
268
+
268
269
  return filtered
269
-
270
+
270
271
  except Exception as e:
271
272
  self.logger.warning(f"Failed to filter constructor args: {e}")
272
273
  return args
273
-
274
+
274
275
  def get_registered_services(self) -> Dict[str, str]:
275
276
  """
276
277
  Get list of registered services.
277
-
278
+
278
279
  Returns:
279
280
  Dictionary mapping service names to class names
280
281
  """
281
- return {
282
- name: cls.__name__
283
- for name, cls in self._registered_services.items()
284
- }
285
-
282
+ return {name: cls.__name__ for name, cls in self._registered_services.items()}
283
+
286
284
  def clear_registrations(self) -> None:
287
285
  """Clear all service registrations."""
288
286
  self._registered_services.clear()
@@ -17,9 +17,9 @@ from .handlers import (
17
17
  __all__ = [
18
18
  "BaseEventHandler",
19
19
  "ConnectionEventHandler",
20
- "ProjectEventHandler",
21
- "MemoryEventHandler",
20
+ "EventHandlerRegistry",
22
21
  "FileEventHandler",
23
22
  "GitEventHandler",
24
- "EventHandlerRegistry",
23
+ "MemoryEventHandler",
24
+ "ProjectEventHandler",
25
25
  ]
@@ -14,7 +14,7 @@ import asyncio
14
14
  import threading
15
15
  import time
16
16
  from datetime import datetime
17
- from typing import Any, Dict, List, Optional, Set
17
+ from typing import Any, Dict, List, Optional
18
18
 
19
19
  try:
20
20
  import socketio
@@ -55,7 +55,7 @@ class SocketIOClientProxy:
55
55
 
56
56
  def stop_sync(self):
57
57
  """Stop the Socket.IO client connection."""
58
- self.logger.debug(f"SocketIOClientProxy: Disconnecting from server")
58
+ self.logger.debug("SocketIOClientProxy: Disconnecting from server")
59
59
  if self._sio_client:
60
60
  self._sio_client.disconnect()
61
61
 
@@ -90,7 +90,7 @@ class SocketIOClientProxy:
90
90
 
91
91
  @self._sio_client.event
92
92
  async def disconnect():
93
- self.logger.info(f"SocketIOClientProxy: Disconnected from server")
93
+ self.logger.info("SocketIOClientProxy: Disconnected from server")
94
94
 
95
95
  # Connect to the server
96
96
  await self._sio_client.connect(f"http://127.0.0.1:{self.port}")
@@ -128,7 +128,7 @@ class SocketIOClientProxy:
128
128
  and not self._client_loop.is_closed()
129
129
  ):
130
130
  try:
131
- future = asyncio.run_coroutine_threadsafe(
131
+ asyncio.run_coroutine_threadsafe(
132
132
  self._sio_client.emit("claude_event", event),
133
133
  self._client_loop,
134
134
  )
@@ -160,7 +160,7 @@ class SocketIOClientProxy:
160
160
  self.logger.debug(f"SocketIOClientProxy: Session started {session_id}")
161
161
 
162
162
  def session_ended(self):
163
- self.logger.debug(f"SocketIOClientProxy: Session ended")
163
+ self.logger.debug("SocketIOClientProxy: Session ended")
164
164
 
165
165
  def claude_status_changed(
166
166
  self, status: str, pid: Optional[int] = None, message: str = ""