claude-mpm 4.1.1__py3-none-any.whl → 4.1.3__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 (389) 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/engineer.json +33 -11
  18. claude_mpm/agents/templates/imagemagick.json +256 -0
  19. claude_mpm/agents/templates/qa.json +41 -2
  20. claude_mpm/agents/templates/ticketing.json +5 -5
  21. claude_mpm/agents/templates/web_qa.json +50 -2
  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 +648 -1098
  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 +339 -967
  39. claude_mpm/cli/commands/monitor.py +117 -88
  40. claude_mpm/cli/commands/run.py +233 -542
  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 +280 -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 +22 -29
  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 +500 -680
  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 -17
  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 +99 -154
  114. claude_mpm/hooks/claude_hooks/hook_handler.py +110 -720
  115. claude_mpm/hooks/claude_hooks/hook_handler_eventbus.py +104 -77
  116. claude_mpm/hooks/claude_hooks/hook_handler_original.py +1040 -0
  117. claude_mpm/hooks/claude_hooks/hook_handler_refactored.py +347 -0
  118. claude_mpm/hooks/claude_hooks/memory_integration.py +2 -4
  119. claude_mpm/hooks/claude_hooks/response_tracking.py +15 -11
  120. claude_mpm/hooks/claude_hooks/services/__init__.py +13 -0
  121. claude_mpm/hooks/claude_hooks/services/connection_manager.py +190 -0
  122. claude_mpm/hooks/claude_hooks/services/duplicate_detector.py +106 -0
  123. claude_mpm/hooks/claude_hooks/services/state_manager.py +282 -0
  124. claude_mpm/hooks/claude_hooks/services/subagent_processor.py +374 -0
  125. claude_mpm/hooks/claude_hooks/tool_analysis.py +12 -18
  126. claude_mpm/hooks/memory_integration_hook.py +5 -5
  127. claude_mpm/hooks/tool_call_interceptor.py +1 -1
  128. claude_mpm/hooks/validation_hooks.py +4 -4
  129. claude_mpm/init.py +4 -9
  130. claude_mpm/models/__init__.py +2 -2
  131. claude_mpm/models/agent_session.py +11 -14
  132. claude_mpm/scripts/mcp_server.py +20 -11
  133. claude_mpm/scripts/mcp_wrapper.py +5 -5
  134. claude_mpm/scripts/mpm_doctor.py +321 -0
  135. claude_mpm/scripts/socketio_daemon.py +28 -25
  136. claude_mpm/scripts/socketio_daemon_hardened.py +298 -258
  137. claude_mpm/scripts/socketio_server_manager.py +116 -95
  138. claude_mpm/services/__init__.py +49 -49
  139. claude_mpm/services/agent_capabilities_service.py +12 -18
  140. claude_mpm/services/agents/__init__.py +22 -22
  141. claude_mpm/services/agents/agent_builder.py +140 -119
  142. claude_mpm/services/agents/deployment/__init__.py +3 -3
  143. claude_mpm/services/agents/deployment/agent_config_provider.py +9 -9
  144. claude_mpm/services/agents/deployment/agent_configuration_manager.py +19 -20
  145. claude_mpm/services/agents/deployment/agent_definition_factory.py +1 -5
  146. claude_mpm/services/agents/deployment/agent_deployment.py +129 -511
  147. claude_mpm/services/agents/deployment/agent_discovery_service.py +4 -8
  148. claude_mpm/services/agents/deployment/agent_environment_manager.py +2 -7
  149. claude_mpm/services/agents/deployment/agent_filesystem_manager.py +6 -10
  150. claude_mpm/services/agents/deployment/agent_format_converter.py +11 -15
  151. claude_mpm/services/agents/deployment/agent_frontmatter_validator.py +2 -3
  152. claude_mpm/services/agents/deployment/agent_lifecycle_manager.py +5 -5
  153. claude_mpm/services/agents/deployment/agent_metrics_collector.py +13 -19
  154. claude_mpm/services/agents/deployment/agent_restore_handler.py +0 -1
  155. claude_mpm/services/agents/deployment/agent_template_builder.py +26 -35
  156. claude_mpm/services/agents/deployment/agent_validator.py +0 -1
  157. claude_mpm/services/agents/deployment/agent_version_manager.py +7 -9
  158. claude_mpm/services/agents/deployment/agent_versioning.py +3 -3
  159. claude_mpm/services/agents/deployment/agents_directory_resolver.py +6 -7
  160. claude_mpm/services/agents/deployment/async_agent_deployment.py +51 -38
  161. claude_mpm/services/agents/deployment/base_agent_locator.py +132 -0
  162. claude_mpm/services/agents/deployment/config/__init__.py +1 -1
  163. claude_mpm/services/agents/deployment/config/deployment_config.py +7 -8
  164. claude_mpm/services/agents/deployment/deployment_results_manager.py +185 -0
  165. claude_mpm/services/agents/deployment/deployment_type_detector.py +1 -1
  166. claude_mpm/services/agents/deployment/deployment_wrapper.py +18 -18
  167. claude_mpm/services/agents/deployment/facade/__init__.py +1 -1
  168. claude_mpm/services/agents/deployment/facade/deployment_executor.py +0 -3
  169. claude_mpm/services/agents/deployment/facade/deployment_facade.py +3 -4
  170. claude_mpm/services/agents/deployment/interface_adapter.py +5 -7
  171. claude_mpm/services/agents/deployment/multi_source_deployment_service.py +345 -276
  172. claude_mpm/services/agents/deployment/pipeline/__init__.py +2 -2
  173. claude_mpm/services/agents/deployment/pipeline/pipeline_builder.py +1 -1
  174. claude_mpm/services/agents/deployment/pipeline/pipeline_context.py +6 -4
  175. claude_mpm/services/agents/deployment/pipeline/pipeline_executor.py +3 -3
  176. claude_mpm/services/agents/deployment/pipeline/steps/__init__.py +2 -2
  177. claude_mpm/services/agents/deployment/pipeline/steps/agent_processing_step.py +14 -13
  178. claude_mpm/services/agents/deployment/pipeline/steps/base_step.py +0 -1
  179. claude_mpm/services/agents/deployment/pipeline/steps/configuration_step.py +1 -1
  180. claude_mpm/services/agents/deployment/pipeline/steps/target_directory_step.py +8 -9
  181. claude_mpm/services/agents/deployment/pipeline/steps/validation_step.py +1 -1
  182. claude_mpm/services/agents/deployment/processors/__init__.py +1 -1
  183. claude_mpm/services/agents/deployment/processors/agent_processor.py +20 -16
  184. claude_mpm/services/agents/deployment/refactored_agent_deployment_service.py +5 -12
  185. claude_mpm/services/agents/deployment/results/__init__.py +1 -1
  186. claude_mpm/services/agents/deployment/results/deployment_result_builder.py +1 -1
  187. claude_mpm/services/agents/deployment/single_agent_deployer.py +315 -0
  188. claude_mpm/services/agents/deployment/strategies/__init__.py +2 -2
  189. claude_mpm/services/agents/deployment/strategies/base_strategy.py +1 -7
  190. claude_mpm/services/agents/deployment/strategies/project_strategy.py +1 -4
  191. claude_mpm/services/agents/deployment/strategies/system_strategy.py +2 -3
  192. claude_mpm/services/agents/deployment/strategies/user_strategy.py +3 -7
  193. claude_mpm/services/agents/deployment/validation/__init__.py +1 -1
  194. claude_mpm/services/agents/deployment/validation/agent_validator.py +1 -1
  195. claude_mpm/services/agents/deployment/validation/template_validator.py +2 -2
  196. claude_mpm/services/agents/deployment/validation/validation_result.py +2 -6
  197. claude_mpm/services/agents/loading/__init__.py +1 -1
  198. claude_mpm/services/agents/loading/agent_profile_loader.py +6 -12
  199. claude_mpm/services/agents/loading/base_agent_manager.py +5 -5
  200. claude_mpm/services/agents/loading/framework_agent_loader.py +2 -4
  201. claude_mpm/services/agents/management/__init__.py +1 -1
  202. claude_mpm/services/agents/management/agent_capabilities_generator.py +1 -3
  203. claude_mpm/services/agents/management/agent_management_service.py +5 -9
  204. claude_mpm/services/agents/memory/__init__.py +4 -4
  205. claude_mpm/services/agents/memory/agent_memory_manager.py +157 -503
  206. claude_mpm/services/agents/memory/agent_persistence_service.py +0 -2
  207. claude_mpm/services/agents/memory/content_manager.py +44 -38
  208. claude_mpm/services/agents/memory/memory_categorization_service.py +165 -0
  209. claude_mpm/services/agents/memory/memory_file_service.py +103 -0
  210. claude_mpm/services/agents/memory/memory_format_service.py +201 -0
  211. claude_mpm/services/agents/memory/memory_limits_service.py +99 -0
  212. claude_mpm/services/agents/memory/template_generator.py +4 -6
  213. claude_mpm/services/agents/registry/__init__.py +11 -7
  214. claude_mpm/services/agents/registry/deployed_agent_discovery.py +30 -27
  215. claude_mpm/services/agents/registry/modification_tracker.py +3 -6
  216. claude_mpm/services/async_session_logger.py +1 -2
  217. claude_mpm/services/claude_session_logger.py +1 -2
  218. claude_mpm/services/cli/__init__.py +18 -0
  219. claude_mpm/services/cli/agent_cleanup_service.py +407 -0
  220. claude_mpm/services/cli/agent_dependency_service.py +395 -0
  221. claude_mpm/services/cli/agent_listing_service.py +463 -0
  222. claude_mpm/services/cli/agent_output_formatter.py +605 -0
  223. claude_mpm/services/cli/agent_validation_service.py +589 -0
  224. claude_mpm/services/cli/dashboard_launcher.py +424 -0
  225. claude_mpm/services/cli/memory_crud_service.py +617 -0
  226. claude_mpm/services/cli/memory_output_formatter.py +604 -0
  227. claude_mpm/services/cli/session_manager.py +513 -0
  228. claude_mpm/services/cli/socketio_manager.py +498 -0
  229. claude_mpm/services/cli/startup_checker.py +370 -0
  230. claude_mpm/services/command_deployment_service.py +173 -0
  231. claude_mpm/services/command_handler_service.py +20 -22
  232. claude_mpm/services/core/__init__.py +25 -25
  233. claude_mpm/services/core/base.py +0 -5
  234. claude_mpm/services/core/cache_manager.py +311 -0
  235. claude_mpm/services/core/interfaces/__init__.py +32 -32
  236. claude_mpm/services/core/interfaces/agent.py +0 -21
  237. claude_mpm/services/core/interfaces/communication.py +0 -27
  238. claude_mpm/services/core/interfaces/infrastructure.py +0 -56
  239. claude_mpm/services/core/interfaces/service.py +0 -29
  240. claude_mpm/services/core/memory_manager.py +637 -0
  241. claude_mpm/services/core/path_resolver.py +498 -0
  242. claude_mpm/services/core/service_container.py +520 -0
  243. claude_mpm/services/core/service_interfaces.py +436 -0
  244. claude_mpm/services/diagnostics/__init__.py +1 -1
  245. claude_mpm/services/diagnostics/checks/__init__.py +6 -6
  246. claude_mpm/services/diagnostics/checks/agent_check.py +152 -97
  247. claude_mpm/services/diagnostics/checks/base_check.py +12 -16
  248. claude_mpm/services/diagnostics/checks/claude_desktop_check.py +84 -81
  249. claude_mpm/services/diagnostics/checks/common_issues_check.py +99 -91
  250. claude_mpm/services/diagnostics/checks/configuration_check.py +82 -77
  251. claude_mpm/services/diagnostics/checks/filesystem_check.py +67 -68
  252. claude_mpm/services/diagnostics/checks/installation_check.py +254 -94
  253. claude_mpm/services/diagnostics/checks/mcp_check.py +90 -88
  254. claude_mpm/services/diagnostics/checks/monitor_check.py +75 -76
  255. claude_mpm/services/diagnostics/checks/startup_log_check.py +67 -73
  256. claude_mpm/services/diagnostics/diagnostic_runner.py +67 -59
  257. claude_mpm/services/diagnostics/doctor_reporter.py +107 -70
  258. claude_mpm/services/diagnostics/models.py +21 -19
  259. claude_mpm/services/event_aggregator.py +10 -17
  260. claude_mpm/services/event_bus/__init__.py +1 -1
  261. claude_mpm/services/event_bus/config.py +54 -35
  262. claude_mpm/services/event_bus/event_bus.py +76 -71
  263. claude_mpm/services/event_bus/relay.py +74 -64
  264. claude_mpm/services/events/__init__.py +11 -11
  265. claude_mpm/services/events/consumers/__init__.py +3 -3
  266. claude_mpm/services/events/consumers/dead_letter.py +71 -63
  267. claude_mpm/services/events/consumers/logging.py +39 -37
  268. claude_mpm/services/events/consumers/metrics.py +56 -57
  269. claude_mpm/services/events/consumers/socketio.py +82 -81
  270. claude_mpm/services/events/core.py +110 -99
  271. claude_mpm/services/events/interfaces.py +56 -72
  272. claude_mpm/services/events/producers/__init__.py +1 -1
  273. claude_mpm/services/events/producers/hook.py +38 -38
  274. claude_mpm/services/events/producers/system.py +46 -44
  275. claude_mpm/services/exceptions.py +81 -80
  276. claude_mpm/services/framework_claude_md_generator/__init__.py +2 -4
  277. claude_mpm/services/framework_claude_md_generator/content_assembler.py +3 -5
  278. claude_mpm/services/framework_claude_md_generator/content_validator.py +1 -1
  279. claude_mpm/services/framework_claude_md_generator/deployment_manager.py +4 -4
  280. claude_mpm/services/framework_claude_md_generator/section_generators/__init__.py +0 -1
  281. claude_mpm/services/framework_claude_md_generator/section_generators/agents.py +0 -2
  282. claude_mpm/services/framework_claude_md_generator/version_manager.py +4 -5
  283. claude_mpm/services/hook_service.py +6 -9
  284. claude_mpm/services/infrastructure/__init__.py +1 -1
  285. claude_mpm/services/infrastructure/context_preservation.py +8 -12
  286. claude_mpm/services/infrastructure/monitoring.py +21 -23
  287. claude_mpm/services/mcp_gateway/__init__.py +37 -37
  288. claude_mpm/services/mcp_gateway/auto_configure.py +95 -103
  289. claude_mpm/services/mcp_gateway/config/__init__.py +1 -1
  290. claude_mpm/services/mcp_gateway/config/config_loader.py +23 -25
  291. claude_mpm/services/mcp_gateway/config/config_schema.py +5 -5
  292. claude_mpm/services/mcp_gateway/config/configuration.py +9 -6
  293. claude_mpm/services/mcp_gateway/core/__init__.py +10 -10
  294. claude_mpm/services/mcp_gateway/core/base.py +0 -3
  295. claude_mpm/services/mcp_gateway/core/interfaces.py +1 -38
  296. claude_mpm/services/mcp_gateway/core/process_pool.py +99 -93
  297. claude_mpm/services/mcp_gateway/core/singleton_manager.py +65 -62
  298. claude_mpm/services/mcp_gateway/core/startup_verification.py +75 -74
  299. claude_mpm/services/mcp_gateway/main.py +2 -1
  300. claude_mpm/services/mcp_gateway/registry/service_registry.py +5 -8
  301. claude_mpm/services/mcp_gateway/registry/tool_registry.py +1 -1
  302. claude_mpm/services/mcp_gateway/server/__init__.py +1 -1
  303. claude_mpm/services/mcp_gateway/server/mcp_gateway.py +12 -19
  304. claude_mpm/services/mcp_gateway/server/stdio_handler.py +4 -3
  305. claude_mpm/services/mcp_gateway/server/stdio_server.py +79 -71
  306. claude_mpm/services/mcp_gateway/tools/__init__.py +2 -2
  307. claude_mpm/services/mcp_gateway/tools/base_adapter.py +5 -6
  308. claude_mpm/services/mcp_gateway/tools/document_summarizer.py +13 -22
  309. claude_mpm/services/mcp_gateway/tools/health_check_tool.py +79 -78
  310. claude_mpm/services/mcp_gateway/tools/hello_world.py +12 -14
  311. claude_mpm/services/mcp_gateway/tools/ticket_tools.py +42 -49
  312. claude_mpm/services/mcp_gateway/tools/unified_ticket_tool.py +51 -55
  313. claude_mpm/services/memory/__init__.py +3 -3
  314. claude_mpm/services/memory/builder.py +3 -6
  315. claude_mpm/services/memory/cache/__init__.py +1 -1
  316. claude_mpm/services/memory/cache/shared_prompt_cache.py +3 -5
  317. claude_mpm/services/memory/cache/simple_cache.py +1 -1
  318. claude_mpm/services/memory/indexed_memory.py +5 -7
  319. claude_mpm/services/memory/optimizer.py +7 -10
  320. claude_mpm/services/memory/router.py +8 -9
  321. claude_mpm/services/memory_hook_service.py +48 -34
  322. claude_mpm/services/monitor_build_service.py +77 -73
  323. claude_mpm/services/port_manager.py +130 -108
  324. claude_mpm/services/project/analyzer.py +12 -10
  325. claude_mpm/services/project/registry.py +11 -11
  326. claude_mpm/services/recovery_manager.py +10 -19
  327. claude_mpm/services/response_tracker.py +0 -1
  328. claude_mpm/services/runner_configuration_service.py +19 -20
  329. claude_mpm/services/session_management_service.py +7 -11
  330. claude_mpm/services/shared/__init__.py +1 -1
  331. claude_mpm/services/shared/async_service_base.py +58 -50
  332. claude_mpm/services/shared/config_service_base.py +73 -67
  333. claude_mpm/services/shared/lifecycle_service_base.py +82 -78
  334. claude_mpm/services/shared/manager_base.py +94 -82
  335. claude_mpm/services/shared/service_factory.py +96 -98
  336. claude_mpm/services/socketio/__init__.py +3 -3
  337. claude_mpm/services/socketio/client_proxy.py +5 -5
  338. claude_mpm/services/socketio/event_normalizer.py +199 -181
  339. claude_mpm/services/socketio/handlers/__init__.py +3 -3
  340. claude_mpm/services/socketio/handlers/base.py +5 -4
  341. claude_mpm/services/socketio/handlers/connection.py +163 -136
  342. claude_mpm/services/socketio/handlers/file.py +13 -14
  343. claude_mpm/services/socketio/handlers/git.py +12 -7
  344. claude_mpm/services/socketio/handlers/hook.py +49 -44
  345. claude_mpm/services/socketio/handlers/memory.py +0 -1
  346. claude_mpm/services/socketio/handlers/project.py +0 -1
  347. claude_mpm/services/socketio/handlers/registry.py +37 -19
  348. claude_mpm/services/socketio/migration_utils.py +98 -84
  349. claude_mpm/services/socketio/server/__init__.py +1 -1
  350. claude_mpm/services/socketio/server/broadcaster.py +81 -87
  351. claude_mpm/services/socketio/server/core.py +65 -54
  352. claude_mpm/services/socketio/server/eventbus_integration.py +95 -56
  353. claude_mpm/services/socketio/server/main.py +64 -38
  354. claude_mpm/services/socketio_client_manager.py +10 -12
  355. claude_mpm/services/subprocess_launcher_service.py +4 -7
  356. claude_mpm/services/system_instructions_service.py +13 -14
  357. claude_mpm/services/ticket_manager.py +2 -2
  358. claude_mpm/services/utility_service.py +5 -13
  359. claude_mpm/services/version_control/__init__.py +16 -16
  360. claude_mpm/services/version_control/branch_strategy.py +5 -8
  361. claude_mpm/services/version_control/conflict_resolution.py +9 -23
  362. claude_mpm/services/version_control/git_operations.py +5 -7
  363. claude_mpm/services/version_control/semantic_versioning.py +16 -17
  364. claude_mpm/services/version_control/version_parser.py +13 -18
  365. claude_mpm/services/version_service.py +10 -11
  366. claude_mpm/storage/__init__.py +1 -1
  367. claude_mpm/storage/state_storage.py +22 -28
  368. claude_mpm/utils/__init__.py +6 -6
  369. claude_mpm/utils/agent_dependency_loader.py +47 -33
  370. claude_mpm/utils/config_manager.py +11 -14
  371. claude_mpm/utils/dependency_cache.py +1 -1
  372. claude_mpm/utils/dependency_manager.py +13 -17
  373. claude_mpm/utils/dependency_strategies.py +8 -10
  374. claude_mpm/utils/environment_context.py +3 -9
  375. claude_mpm/utils/error_handler.py +3 -13
  376. claude_mpm/utils/file_utils.py +1 -1
  377. claude_mpm/utils/path_operations.py +8 -12
  378. claude_mpm/utils/robust_installer.py +110 -33
  379. claude_mpm/utils/subprocess_utils.py +5 -6
  380. claude_mpm/validation/agent_validator.py +3 -6
  381. claude_mpm/validation/frontmatter_validator.py +1 -1
  382. {claude_mpm-4.1.1.dist-info → claude_mpm-4.1.3.dist-info}/METADATA +1 -1
  383. claude_mpm-4.1.3.dist-info/RECORD +528 -0
  384. claude_mpm/cli/commands/run_config_checker.py +0 -160
  385. claude_mpm-4.1.1.dist-info/RECORD +0 -494
  386. {claude_mpm-4.1.1.dist-info → claude_mpm-4.1.3.dist-info}/WHEEL +0 -0
  387. {claude_mpm-4.1.1.dist-info → claude_mpm-4.1.3.dist-info}/entry_points.txt +0 -0
  388. {claude_mpm-4.1.1.dist-info → claude_mpm-4.1.3.dist-info}/licenses/LICENSE +0 -0
  389. {claude_mpm-4.1.1.dist-info → claude_mpm-4.1.3.dist-info}/top_level.txt +0 -0
@@ -12,98 +12,95 @@ from typing import Any, Dict, List, Optional
12
12
 
13
13
  class CommonArguments:
14
14
  """Registry of common argument patterns used across CLI commands."""
15
-
15
+
16
16
  # Logging arguments
17
17
  VERBOSE = {
18
18
  "flags": ["-v", "--verbose"],
19
19
  "action": "store_true",
20
- "help": "Enable verbose output"
20
+ "help": "Enable verbose output",
21
21
  }
22
-
22
+
23
23
  QUIET = {
24
24
  "flags": ["-q", "--quiet"],
25
- "action": "store_true",
26
- "help": "Suppress non-error output"
25
+ "action": "store_true",
26
+ "help": "Suppress non-error output",
27
27
  }
28
-
28
+
29
29
  DEBUG = {
30
30
  "flags": ["--debug"],
31
31
  "action": "store_true",
32
- "help": "Enable debug logging"
32
+ "help": "Enable debug logging",
33
33
  }
34
-
34
+
35
35
  # Configuration arguments
36
36
  CONFIG_FILE = {
37
37
  "flags": ["-c", "--config"],
38
38
  "type": Path,
39
- "help": "Path to configuration file"
39
+ "help": "Path to configuration file",
40
40
  }
41
-
41
+
42
42
  CONFIG_DIR = {
43
43
  "flags": ["--config-dir"],
44
44
  "type": Path,
45
- "help": "Configuration directory path"
45
+ "help": "Configuration directory path",
46
46
  }
47
-
47
+
48
48
  # Output arguments
49
49
  OUTPUT_FORMAT = {
50
50
  "flags": ["-f", "--format"],
51
51
  "choices": ["json", "yaml", "table", "text"],
52
52
  "default": "text",
53
- "help": "Output format"
53
+ "help": "Output format",
54
54
  }
55
-
55
+
56
56
  OUTPUT_FILE = {
57
57
  "flags": ["-o", "--output"],
58
58
  "type": Path,
59
- "help": "Output file path"
59
+ "help": "Output file path",
60
60
  }
61
-
61
+
62
62
  # Common flags
63
63
  FORCE = {
64
64
  "flags": ["--force"],
65
65
  "action": "store_true",
66
- "help": "Force operation without confirmation"
66
+ "help": "Force operation without confirmation",
67
67
  }
68
-
68
+
69
69
  DRY_RUN = {
70
70
  "flags": ["--dry-run"],
71
71
  "action": "store_true",
72
- "help": "Show what would be done without executing"
72
+ "help": "Show what would be done without executing",
73
73
  }
74
-
74
+
75
75
  # Agent-related arguments
76
- AGENT_NAME = {
77
- "flags": ["--agent"],
78
- "help": "Agent name or pattern"
79
- }
80
-
81
- AGENT_DIR = {
82
- "flags": ["--agent-dir"],
83
- "type": Path,
84
- "help": "Agent directory path"
85
- }
86
-
76
+ AGENT_NAME = {"flags": ["--agent"], "help": "Agent name or pattern"}
77
+
78
+ AGENT_DIR = {"flags": ["--agent-dir"], "type": Path, "help": "Agent directory path"}
79
+
87
80
  # Memory-related arguments
88
81
  MEMORY_DIR = {
89
82
  "flags": ["--memory-dir"],
90
83
  "type": Path,
91
- "help": "Memory directory path"
84
+ "help": "Memory directory path",
92
85
  }
93
86
 
94
87
 
95
- def add_argument_from_pattern(parser: argparse.ArgumentParser, pattern: Dict[str, Any]) -> None:
88
+ def add_argument_from_pattern(
89
+ parser: argparse.ArgumentParser, pattern: Dict[str, Any]
90
+ ) -> None:
96
91
  """Add an argument to parser from a pattern definition."""
97
92
  flags = pattern.pop("flags")
98
93
  parser.add_argument(*flags, **pattern)
99
94
 
100
95
 
101
- def add_common_arguments(parser: argparse.ArgumentParser,
102
- include: Optional[List[str]] = None,
103
- exclude: Optional[List[str]] = None) -> None:
96
+ def add_common_arguments(
97
+ parser: argparse.ArgumentParser,
98
+ include: Optional[List[str]] = None,
99
+ exclude: Optional[List[str]] = None,
100
+ ) -> None:
104
101
  """
105
102
  Add common arguments to a parser.
106
-
103
+
107
104
  Args:
108
105
  parser: ArgumentParser to add arguments to
109
106
  include: List of argument names to include (if None, includes all)
@@ -111,13 +108,13 @@ def add_common_arguments(parser: argparse.ArgumentParser,
111
108
  """
112
109
  # Default common arguments
113
110
  common_args = ["verbose", "quiet", "debug", "config_file", "output_format"]
114
-
111
+
115
112
  if include is not None:
116
113
  common_args = [arg for arg in common_args if arg in include]
117
-
114
+
118
115
  if exclude is not None:
119
116
  common_args = [arg for arg in common_args if arg not in exclude]
120
-
117
+
121
118
  # Map argument names to patterns
122
119
  arg_patterns = {
123
120
  "verbose": CommonArguments.VERBOSE.copy(),
@@ -128,7 +125,7 @@ def add_common_arguments(parser: argparse.ArgumentParser,
128
125
  "force": CommonArguments.FORCE.copy(),
129
126
  "dry_run": CommonArguments.DRY_RUN.copy(),
130
127
  }
131
-
128
+
132
129
  for arg_name in common_args:
133
130
  if arg_name in arg_patterns:
134
131
  add_argument_from_pattern(parser, arg_patterns[arg_name])
@@ -137,13 +134,13 @@ def add_common_arguments(parser: argparse.ArgumentParser,
137
134
  def add_logging_arguments(parser: argparse.ArgumentParser) -> None:
138
135
  """Add logging-related arguments."""
139
136
  group = parser.add_argument_group("logging options")
140
-
137
+
141
138
  patterns = [
142
139
  CommonArguments.VERBOSE.copy(),
143
- CommonArguments.QUIET.copy(),
144
- CommonArguments.DEBUG.copy()
140
+ CommonArguments.QUIET.copy(),
141
+ CommonArguments.DEBUG.copy(),
145
142
  ]
146
-
143
+
147
144
  for pattern in patterns:
148
145
  add_argument_from_pattern(group, pattern)
149
146
 
@@ -151,12 +148,9 @@ def add_logging_arguments(parser: argparse.ArgumentParser) -> None:
151
148
  def add_config_arguments(parser: argparse.ArgumentParser) -> None:
152
149
  """Add configuration-related arguments."""
153
150
  group = parser.add_argument_group("configuration options")
154
-
155
- patterns = [
156
- CommonArguments.CONFIG_FILE.copy(),
157
- CommonArguments.CONFIG_DIR.copy()
158
- ]
159
-
151
+
152
+ patterns = [CommonArguments.CONFIG_FILE.copy(), CommonArguments.CONFIG_DIR.copy()]
153
+
160
154
  for pattern in patterns:
161
155
  add_argument_from_pattern(group, pattern)
162
156
 
@@ -164,12 +158,12 @@ def add_config_arguments(parser: argparse.ArgumentParser) -> None:
164
158
  def add_output_arguments(parser: argparse.ArgumentParser) -> None:
165
159
  """Add output-related arguments."""
166
160
  group = parser.add_argument_group("output options")
167
-
161
+
168
162
  patterns = [
169
163
  CommonArguments.OUTPUT_FORMAT.copy(),
170
- CommonArguments.OUTPUT_FILE.copy()
164
+ CommonArguments.OUTPUT_FILE.copy(),
171
165
  ]
172
-
166
+
173
167
  for pattern in patterns:
174
168
  add_argument_from_pattern(group, pattern)
175
169
 
@@ -177,12 +171,9 @@ def add_output_arguments(parser: argparse.ArgumentParser) -> None:
177
171
  def add_agent_arguments(parser: argparse.ArgumentParser) -> None:
178
172
  """Add agent-related arguments."""
179
173
  group = parser.add_argument_group("agent options")
180
-
181
- patterns = [
182
- CommonArguments.AGENT_NAME.copy(),
183
- CommonArguments.AGENT_DIR.copy()
184
- ]
185
-
174
+
175
+ patterns = [CommonArguments.AGENT_NAME.copy(), CommonArguments.AGENT_DIR.copy()]
176
+
186
177
  for pattern in patterns:
187
178
  add_argument_from_pattern(group, pattern)
188
179
 
@@ -190,11 +181,9 @@ def add_agent_arguments(parser: argparse.ArgumentParser) -> None:
190
181
  def add_memory_arguments(parser: argparse.ArgumentParser) -> None:
191
182
  """Add memory-related arguments."""
192
183
  group = parser.add_argument_group("memory options")
193
-
194
- patterns = [
195
- CommonArguments.MEMORY_DIR.copy()
196
- ]
197
-
184
+
185
+ patterns = [CommonArguments.MEMORY_DIR.copy()]
186
+
198
187
  for pattern in patterns:
199
188
  add_argument_from_pattern(group, pattern)
200
189
 
@@ -202,11 +191,8 @@ def add_memory_arguments(parser: argparse.ArgumentParser) -> None:
202
191
  def add_operation_arguments(parser: argparse.ArgumentParser) -> None:
203
192
  """Add operation control arguments."""
204
193
  group = parser.add_argument_group("operation options")
205
-
206
- patterns = [
207
- CommonArguments.FORCE.copy(),
208
- CommonArguments.DRY_RUN.copy()
209
- ]
210
-
194
+
195
+ patterns = [CommonArguments.FORCE.copy(), CommonArguments.DRY_RUN.copy()]
196
+
211
197
  for pattern in patterns:
212
198
  add_argument_from_pattern(group, pattern)
@@ -16,19 +16,23 @@ from ...core.shared.config_loader import ConfigLoader
16
16
  @dataclass
17
17
  class CommandResult:
18
18
  """Standard result structure for CLI commands."""
19
-
19
+
20
20
  success: bool
21
21
  exit_code: int = 0
22
22
  message: Optional[str] = None
23
23
  data: Optional[Dict[str, Any]] = None
24
-
24
+
25
25
  @classmethod
26
- def success_result(cls, message: str = None, data: Dict[str, Any] = None) -> "CommandResult":
26
+ def success_result(
27
+ cls, message: Optional[str] = None, data: Optional[Dict[str, Any]] = None
28
+ ) -> "CommandResult":
27
29
  """Create a success result."""
28
30
  return cls(success=True, exit_code=0, message=message, data=data)
29
-
31
+
30
32
  @classmethod
31
- def error_result(cls, message: str, exit_code: int = 1, data: Dict[str, Any] = None) -> "CommandResult":
33
+ def error_result(
34
+ cls, message: str, exit_code: int = 1, data: Optional[Dict[str, Any]] = None
35
+ ) -> "CommandResult":
32
36
  """Create an error result."""
33
37
  return cls(success=False, exit_code=exit_code, message=message, data=data)
34
38
 
@@ -36,18 +40,18 @@ class CommandResult:
36
40
  class BaseCommand(ABC):
37
41
  """
38
42
  Base class for CLI commands to reduce duplication.
39
-
43
+
40
44
  Provides common functionality:
41
45
  - Logger initialization
42
46
  - Configuration loading
43
47
  - Working directory handling
44
48
  - Standard error handling patterns
45
49
  """
46
-
50
+
47
51
  def __init__(self, command_name: str):
48
52
  """
49
53
  Initialize base command.
50
-
54
+
51
55
  Args:
52
56
  command_name: Name of the command for logging
53
57
  """
@@ -55,7 +59,7 @@ class BaseCommand(ABC):
55
59
  self.logger = get_logger(f"cli.{command_name}")
56
60
  self._config: Optional[Config] = None
57
61
  self._working_dir: Optional[Path] = None
58
-
62
+
59
63
  @property
60
64
  def config(self) -> Config:
61
65
  """Get configuration instance (lazy loaded)."""
@@ -63,7 +67,7 @@ class BaseCommand(ABC):
63
67
  config_loader = ConfigLoader()
64
68
  self._config = config_loader.load_main_config()
65
69
  return self._config
66
-
70
+
67
71
  @property
68
72
  def working_dir(self) -> Path:
69
73
  """Get working directory (respects CLAUDE_MPM_USER_PWD)."""
@@ -72,54 +76,57 @@ class BaseCommand(ABC):
72
76
  user_pwd = os.environ.get("CLAUDE_MPM_USER_PWD", os.getcwd())
73
77
  self._working_dir = Path(user_pwd)
74
78
  return self._working_dir
75
-
79
+
76
80
  def setup_logging(self, args) -> None:
77
81
  """Setup logging based on command arguments."""
78
82
  import logging
79
-
83
+
80
84
  # Set log level based on arguments
81
- if hasattr(args, 'debug') and args.debug:
85
+ if hasattr(args, "debug") and args.debug:
82
86
  logging.getLogger().setLevel(logging.DEBUG)
83
- elif hasattr(args, 'verbose') and args.verbose:
87
+ elif hasattr(args, "verbose") and args.verbose:
84
88
  logging.getLogger().setLevel(logging.INFO)
85
- elif hasattr(args, 'quiet') and args.quiet:
89
+ elif hasattr(args, "quiet") and args.quiet:
86
90
  logging.getLogger().setLevel(logging.WARNING)
87
-
91
+
88
92
  def load_config(self, args) -> None:
89
93
  """Load configuration from arguments."""
90
94
  config_loader = ConfigLoader()
91
- if hasattr(args, 'config') and args.config:
95
+ if hasattr(args, "config") and args.config:
92
96
  # Use specific config file with ConfigLoader
93
97
  from ...core.shared.config_loader import ConfigPattern
98
+
94
99
  pattern = ConfigPattern(
95
100
  filenames=[Path(args.config).name],
96
101
  search_paths=[str(Path(args.config).parent)],
97
- env_prefix="CLAUDE_MPM_"
102
+ env_prefix="CLAUDE_MPM_",
103
+ )
104
+ self._config = config_loader.load_config(
105
+ pattern, cache_key=f"cli_{args.config}"
98
106
  )
99
- self._config = config_loader.load_config(pattern, cache_key=f"cli_{args.config}")
100
107
  else:
101
108
  self._config = config_loader.load_main_config()
102
-
109
+
103
110
  def validate_args(self, args) -> Optional[str]:
104
111
  """
105
112
  Validate command arguments.
106
-
113
+
107
114
  Args:
108
115
  args: Parsed command arguments
109
-
116
+
110
117
  Returns:
111
118
  Error message if validation fails, None if valid
112
119
  """
113
120
  # Base validation - subclasses can override
114
121
  return None
115
-
122
+
116
123
  def execute(self, args) -> CommandResult:
117
124
  """
118
125
  Execute the command with standard error handling.
119
-
126
+
120
127
  Args:
121
128
  args: Parsed command arguments
122
-
129
+
123
130
  Returns:
124
131
  CommandResult with execution status
125
132
  """
@@ -127,55 +134,56 @@ class BaseCommand(ABC):
127
134
  # Setup
128
135
  self.setup_logging(args)
129
136
  self.load_config(args)
130
-
137
+
131
138
  # Validate arguments
132
139
  validation_error = self.validate_args(args)
133
140
  if validation_error:
134
141
  return CommandResult.error_result(validation_error)
135
-
142
+
136
143
  # Execute command-specific logic
137
144
  return self.run(args)
138
-
145
+
139
146
  except KeyboardInterrupt:
140
147
  self.logger.info("Command interrupted by user")
141
- return CommandResult.error_result("Operation cancelled by user", exit_code=130)
142
-
148
+ return CommandResult.error_result(
149
+ "Operation cancelled by user", exit_code=130
150
+ )
151
+
143
152
  except Exception as e:
144
153
  self.logger.error(f"Command failed: {e}", exc_info=True)
145
154
  return CommandResult.error_result(f"Command failed: {e}")
146
-
155
+
147
156
  @abstractmethod
148
157
  def run(self, args) -> CommandResult:
149
158
  """
150
159
  Run the command-specific logic.
151
-
160
+
152
161
  Args:
153
162
  args: Parsed command arguments
154
-
163
+
155
164
  Returns:
156
165
  CommandResult with execution status
157
166
  """
158
- pass
159
-
167
+
160
168
  def print_result(self, result: CommandResult, args) -> None:
161
169
  """
162
170
  Print command result based on output format.
163
-
171
+
164
172
  Args:
165
173
  result: Command result to print
166
174
  args: Command arguments (for format options)
167
175
  """
168
176
  from .output_formatters import format_output
169
-
177
+
170
178
  # Determine output format
171
- output_format = getattr(args, 'format', 'text')
172
-
179
+ output_format = getattr(args, "format", "text")
180
+
173
181
  # Format and print result
174
182
  formatted_output = format_output(result, output_format)
175
-
176
- if hasattr(args, 'output') and args.output:
183
+
184
+ if hasattr(args, "output") and args.output:
177
185
  # Write to file
178
- with open(args.output, 'w') as f:
186
+ with open(args.output, "w") as f:
179
187
  f.write(formatted_output)
180
188
  self.logger.info(f"Output written to {args.output}")
181
189
  else:
@@ -185,11 +193,11 @@ class BaseCommand(ABC):
185
193
 
186
194
  class ServiceCommand(BaseCommand):
187
195
  """Base class for commands that work with services."""
188
-
196
+
189
197
  def __init__(self, command_name: str, service_class: type):
190
198
  """
191
199
  Initialize service command.
192
-
200
+
193
201
  Args:
194
202
  command_name: Name of the command
195
203
  service_class: Service class to instantiate
@@ -197,7 +205,7 @@ class ServiceCommand(BaseCommand):
197
205
  super().__init__(command_name)
198
206
  self.service_class = service_class
199
207
  self._service = None
200
-
208
+
201
209
  @property
202
210
  def service(self):
203
211
  """Get service instance (lazy loaded)."""
@@ -208,27 +216,27 @@ class ServiceCommand(BaseCommand):
208
216
 
209
217
  class AgentCommand(BaseCommand):
210
218
  """Base class for agent-related commands."""
211
-
219
+
212
220
  def get_agent_dir(self, args) -> Path:
213
221
  """Get agent directory from arguments or default."""
214
- if hasattr(args, 'agent_dir') and args.agent_dir:
222
+ if hasattr(args, "agent_dir") and args.agent_dir:
215
223
  return args.agent_dir
216
-
224
+
217
225
  # Default to working directory
218
226
  return self.working_dir
219
-
227
+
220
228
  def get_agent_pattern(self, args) -> Optional[str]:
221
229
  """Get agent name pattern from arguments."""
222
- return getattr(args, 'agent', None)
230
+ return getattr(args, "agent", None)
223
231
 
224
232
 
225
233
  class MemoryCommand(BaseCommand):
226
234
  """Base class for memory-related commands."""
227
-
235
+
228
236
  def get_memory_dir(self, args) -> Path:
229
237
  """Get memory directory from arguments or default."""
230
- if hasattr(args, 'memory_dir') and args.memory_dir:
238
+ if hasattr(args, "memory_dir") and args.memory_dir:
231
239
  return args.memory_dir
232
-
240
+
233
241
  # Default to .claude-mpm/memories in working directory
234
242
  return self.working_dir / ".claude-mpm" / "memories"