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
@@ -0,0 +1,201 @@
1
+ #!/usr/bin/env python3
2
+ """Memory Format Service - Handles memory content formatting and parsing."""
3
+
4
+ import logging
5
+ import re
6
+ from datetime import datetime
7
+ from typing import Dict, List
8
+
9
+
10
+ class MemoryFormatService:
11
+ """Service for memory content formatting and parsing."""
12
+
13
+ def __init__(self):
14
+ """Initialize the memory format service."""
15
+ self.logger = logging.getLogger(__name__)
16
+
17
+ def build_simple_memory_content(self, agent_id: str, items: List[str]) -> str:
18
+ """Build memory content as a simple list with header and timestamp.
19
+
20
+ Args:
21
+ agent_id: Agent identifier for the header
22
+ items: List of memory items
23
+
24
+ Returns:
25
+ Formatted memory content string
26
+ """
27
+ # Build header
28
+ header = f"# {agent_id.title()} Agent Memory\n\n"
29
+ header += f"Last Updated: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\n\n"
30
+ header += "## Learnings\n\n"
31
+
32
+ # Build item list
33
+ item_lines = []
34
+ for item in items:
35
+ # Clean and format each item
36
+ item = item.strip()
37
+ if item and not item.startswith("- "):
38
+ item = f"- {item}"
39
+ if item:
40
+ item_lines.append(item)
41
+
42
+ # Combine
43
+ content = header + "\n".join(item_lines)
44
+ if item_lines:
45
+ content += "\n"
46
+
47
+ return content
48
+
49
+ def parse_memory_list(self, memory_content: str) -> List[str]:
50
+ """Parse memory content into a simple list.
51
+
52
+ Args:
53
+ memory_content: Raw memory content
54
+
55
+ Returns:
56
+ List of memory items (without "- " prefix)
57
+ """
58
+ items = []
59
+ lines = memory_content.split("\n")
60
+
61
+ for line in lines:
62
+ line = line.strip()
63
+ # Skip headers, empty lines, and metadata
64
+ if (
65
+ not line
66
+ or line.startswith("#")
67
+ or line.startswith("Last Updated:")
68
+ or line.startswith("**")
69
+ or line == "---"
70
+ ):
71
+ continue
72
+
73
+ # Extract list items
74
+ if line.startswith("- "):
75
+ item = line[2:].strip()
76
+ if item:
77
+ items.append(item)
78
+ elif line and not any(
79
+ line.startswith(p) for p in ["#", "**", "Last Updated:", "---"]
80
+ ):
81
+ # Include non-list items that aren't headers
82
+ items.append(line)
83
+
84
+ return items
85
+
86
+ def parse_memory_sections(self, memory_content: str) -> Dict[str, List[str]]:
87
+ """Parse memory content into sections and items.
88
+
89
+ Args:
90
+ memory_content: Raw memory file content
91
+
92
+ Returns:
93
+ Dict mapping section names to lists of items
94
+ """
95
+ sections = {}
96
+ current_section = None
97
+ current_items = []
98
+
99
+ for line in memory_content.split("\n"):
100
+ # Check for section header (## Section Name)
101
+ if line.startswith("## "):
102
+ # Save previous section if exists
103
+ if current_section and current_items:
104
+ sections[current_section] = current_items
105
+ # Start new section
106
+ current_section = line[3:].strip()
107
+ current_items = []
108
+ # Check for list item
109
+ elif line.startswith("- ") and current_section:
110
+ item = line[2:].strip()
111
+ if item:
112
+ current_items.append(item)
113
+
114
+ # Save last section
115
+ if current_section and current_items:
116
+ sections[current_section] = current_items
117
+
118
+ return sections
119
+
120
+ def clean_template_placeholders(
121
+ self,
122
+ content: str,
123
+ preserve_structure: bool = False,
124
+ agent_id: str = "agent",
125
+ ) -> str:
126
+ """Clean template placeholders from memory content.
127
+
128
+ WHY: Default templates contain placeholder text that should be removed
129
+ when adding real memories. This method cleans those placeholders while
130
+ preserving any actual content.
131
+
132
+ Args:
133
+ content: Memory content to clean
134
+ preserve_structure: If True, preserve empty sections
135
+ agent_id: Agent ID for context
136
+
137
+ Returns:
138
+ Cleaned content string
139
+ """
140
+ if not content:
141
+ return content
142
+
143
+ # Patterns to remove
144
+ placeholder_patterns = [
145
+ r"\[Agent will add.*?\]",
146
+ r"\[No .* yet\]",
147
+ r"<!-- .* -->",
148
+ r"No items yet.*",
149
+ r"Memory items will be added.*",
150
+ r"\*\*Note:.*?\*\*",
151
+ ]
152
+
153
+ cleaned = content
154
+ for pattern in placeholder_patterns:
155
+ cleaned = re.sub(pattern, "", cleaned, flags=re.IGNORECASE | re.MULTILINE)
156
+
157
+ if not preserve_structure:
158
+ # Remove empty sections
159
+ lines = []
160
+ skip_empty = False
161
+ for line in cleaned.split("\n"):
162
+ if line.startswith("## "):
163
+ skip_empty = True
164
+ lines.append(line)
165
+ elif line.strip() and skip_empty:
166
+ skip_empty = False
167
+ lines.append(line)
168
+ elif not skip_empty:
169
+ lines.append(line)
170
+
171
+ cleaned = "\n".join(lines)
172
+
173
+ # Clean up multiple blank lines
174
+ cleaned = re.sub(r"\n{3,}", "\n\n", cleaned)
175
+
176
+ return cleaned.strip()
177
+
178
+ def clean_template_placeholders_list(self, items: List[str]) -> List[str]:
179
+ """Clean template placeholders from a list of items.
180
+
181
+ Args:
182
+ items: List of items to clean
183
+
184
+ Returns:
185
+ Cleaned list of items
186
+ """
187
+ cleaned = []
188
+ for item in items:
189
+ # Skip placeholder items
190
+ if any(
191
+ pattern in item.lower()
192
+ for pattern in [
193
+ "[agent will add",
194
+ "[no ",
195
+ "no items yet",
196
+ "memory items will be added",
197
+ ]
198
+ ):
199
+ continue
200
+ cleaned.append(item)
201
+ return cleaned
@@ -0,0 +1,99 @@
1
+ #!/usr/bin/env python3
2
+ """Memory Limits Service - Manages memory size limits and configuration."""
3
+
4
+ import logging
5
+ from typing import Any, Dict, Optional
6
+
7
+ from claude_mpm.core.config import Config
8
+
9
+
10
+ class MemoryLimitsService:
11
+ """Service for managing memory limits and configuration."""
12
+
13
+ # Default limits
14
+ DEFAULT_MEMORY_LIMITS = {
15
+ "max_file_size_kb": 80, # 80KB (20k tokens)
16
+ "max_items": 100, # Maximum total memory items
17
+ "max_line_length": 120,
18
+ }
19
+
20
+ def __init__(self, config: Optional[Config] = None):
21
+ """Initialize the memory limits service.
22
+
23
+ Args:
24
+ config: Optional Config object for reading configuration
25
+ """
26
+ self.config = config or Config()
27
+ self.logger = logging.getLogger(__name__)
28
+ self.memory_limits = self._init_memory_limits()
29
+
30
+ def _init_memory_limits(self) -> Dict[str, Any]:
31
+ """Initialize memory limits from configuration.
32
+
33
+ Returns:
34
+ Dictionary of memory limits
35
+ """
36
+ try:
37
+ limits = self.DEFAULT_MEMORY_LIMITS.copy()
38
+
39
+ # Try to load from config
40
+ if hasattr(self.config, "agent_memory_limits"):
41
+ config_limits = self.config.agent_memory_limits
42
+ if isinstance(config_limits, dict):
43
+ limits.update(config_limits)
44
+
45
+ self.logger.debug(f"Initialized memory limits: {limits}")
46
+ return limits
47
+
48
+ except Exception as e:
49
+ self.logger.warning(f"Failed to load memory limits from config: {e}")
50
+ return self.DEFAULT_MEMORY_LIMITS.copy()
51
+
52
+ def get_agent_limits(self, agent_id: str) -> Dict[str, Any]:
53
+ """Get memory limits for a specific agent.
54
+
55
+ Args:
56
+ agent_id: Agent identifier
57
+
58
+ Returns:
59
+ Dictionary of memory limits for the agent
60
+ """
61
+ # Start with default limits
62
+ limits = self.memory_limits.copy()
63
+
64
+ # Check for agent-specific overrides
65
+ try:
66
+ if hasattr(self.config, "agents") and agent_id in self.config.agents:
67
+ agent_config = self.config.agents[agent_id]
68
+ if "memory_limits" in agent_config:
69
+ limits.update(agent_config["memory_limits"])
70
+ except Exception as e:
71
+ self.logger.debug(f"No agent-specific limits for {agent_id}: {e}")
72
+
73
+ return limits
74
+
75
+ def get_agent_auto_learning(self, agent_id: str) -> bool:
76
+ """Get auto-learning setting for a specific agent.
77
+
78
+ Args:
79
+ agent_id: Agent identifier
80
+
81
+ Returns:
82
+ True if auto-learning is enabled, False otherwise
83
+ """
84
+ try:
85
+ # Check agent-specific config
86
+ if hasattr(self.config, "agents") and agent_id in self.config.agents:
87
+ agent_config = self.config.agents[agent_id]
88
+ if "auto_learning" in agent_config:
89
+ return agent_config["auto_learning"]
90
+
91
+ # Check global config
92
+ if hasattr(self.config, "agent_auto_learning"):
93
+ return self.config.agent_auto_learning
94
+
95
+ except Exception as e:
96
+ self.logger.debug(f"Error checking auto-learning for {agent_id}: {e}")
97
+
98
+ # Default to True (auto-learning enabled)
99
+ return True
@@ -15,7 +15,7 @@ This module provides:
15
15
  import logging
16
16
  from datetime import datetime
17
17
  from pathlib import Path
18
- from typing import Any, Dict, List
18
+ from typing import Any, Dict
19
19
 
20
20
  from claude_mpm.core.config import Config
21
21
 
@@ -35,9 +35,7 @@ class MemoryTemplateGenerator:
35
35
  "Current Technical Context",
36
36
  ]
37
37
 
38
- def __init__(
39
- self, config: Config, working_directory: Path
40
- ):
38
+ def __init__(self, config: Config, working_directory: Path):
41
39
  """Initialize the template generator.
42
40
 
43
41
  Args:
@@ -59,8 +57,8 @@ class MemoryTemplateGenerator:
59
57
  str: The basic memory template content
60
58
  """
61
59
  # Convert agent_id to proper name, handling cases like "test_agent" -> "Test"
62
- agent_name = agent_id.replace("_agent", "").replace("_", " ").title()
63
- timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
60
+ agent_id.replace("_agent", "").replace("_", " ").title()
61
+ datetime.now().strftime("%Y-%m-%d %H:%M:%S")
64
62
 
65
63
  # Create a simple template that agents will populate through learning
66
64
  return self._create_basic_memory_template(agent_id, limits)
@@ -1,7 +1,11 @@
1
1
  """Agent registry services for discovery and tracking."""
2
2
 
3
- from claude_mpm.core.unified_agent_registry import AgentMetadata, AgentTier, AgentType
4
- from claude_mpm.core.unified_agent_registry import UnifiedAgentRegistry as AgentRegistry
3
+ from claude_mpm.core.unified_agent_registry import (
4
+ AgentMetadata,
5
+ AgentTier,
6
+ AgentType,
7
+ UnifiedAgentRegistry as AgentRegistry,
8
+ )
5
9
 
6
10
  from .deployed_agent_discovery import DeployedAgentDiscovery
7
11
  from .modification_tracker import (
@@ -13,14 +17,14 @@ from .modification_tracker import (
13
17
  )
14
18
 
15
19
  __all__ = [
16
- "AgentRegistry",
17
20
  "AgentMetadata",
21
+ "AgentModification",
22
+ "AgentModificationTracker",
23
+ "AgentRegistry",
18
24
  "AgentTier",
19
25
  "AgentType",
20
26
  "DeployedAgentDiscovery",
21
- "AgentModificationTracker",
22
- "ModificationType",
23
- "ModificationTier",
24
- "AgentModification",
25
27
  "ModificationHistory",
28
+ "ModificationTier",
29
+ "ModificationType",
26
30
  ]
@@ -19,7 +19,11 @@ logger = logging.getLogger(__name__)
19
19
  class DeployedAgentDiscovery(ConfigServiceBase):
20
20
  """Discovers and analyzes deployed agents in the project."""
21
21
 
22
- def __init__(self, project_root: Path = None, config: Optional[Dict[str, Any]] = None):
22
+ def __init__(
23
+ self,
24
+ project_root: Optional[Path] = None,
25
+ config: Optional[Dict[str, Any]] = None,
26
+ ):
23
27
  """Initialize the discovery service.
24
28
 
25
29
  Args:
@@ -32,7 +36,7 @@ class DeployedAgentDiscovery(ConfigServiceBase):
32
36
  self.project_root = self.get_config_value(
33
37
  "project_root",
34
38
  default=project_root or get_path_manager().project_root,
35
- config_type=Path
39
+ config_type=Path,
36
40
  )
37
41
  self.agent_registry = AgentRegistryAdapter()
38
42
  self.logger.debug(
@@ -111,7 +115,7 @@ class DeployedAgentDiscovery(ConfigServiceBase):
111
115
  "tools": agent.get("tools", []),
112
116
  }
113
117
  # Handle object format with metadata (new standardized schema)
114
- elif hasattr(agent, "metadata"):
118
+ if hasattr(agent, "metadata"):
115
119
  return {
116
120
  "id": agent.agent_id,
117
121
  "name": agent.metadata.name,
@@ -125,28 +129,27 @@ class DeployedAgentDiscovery(ConfigServiceBase):
125
129
  else []
126
130
  ),
127
131
  }
128
- else:
129
- # Legacy object format fallback
130
- agent_type = getattr(agent, "type", None)
131
- agent_name = getattr(agent, "name", None)
132
-
133
- # Generate name from type if name not present
134
- if not agent_name and agent_type:
135
- agent_name = agent_type.replace("_", " ").title()
136
- elif not agent_name:
137
- agent_name = "Unknown Agent"
138
-
139
- return {
140
- "id": getattr(agent, "agent_id", agent_type or "unknown"),
141
- "name": agent_name,
142
- "description": getattr(
143
- agent, "description", "No description available"
144
- ),
145
- "specializations": getattr(agent, "specializations", []),
146
- "capabilities": {},
147
- "source_tier": self._determine_source_tier(agent),
148
- "tools": getattr(agent, "tools", []),
149
- }
132
+ # Legacy object format fallback
133
+ agent_type = getattr(agent, "type", None)
134
+ agent_name = getattr(agent, "name", None)
135
+
136
+ # Generate name from type if name not present
137
+ if not agent_name and agent_type:
138
+ agent_name = agent_type.replace("_", " ").title()
139
+ elif not agent_name:
140
+ agent_name = "Unknown Agent"
141
+
142
+ return {
143
+ "id": getattr(agent, "agent_id", agent_type or "unknown"),
144
+ "name": agent_name,
145
+ "description": getattr(
146
+ agent, "description", "No description available"
147
+ ),
148
+ "specializations": getattr(agent, "specializations", []),
149
+ "capabilities": {},
150
+ "source_tier": self._determine_source_tier(agent),
151
+ "tools": getattr(agent, "tools", []),
152
+ }
150
153
  except Exception as e:
151
154
  logger.error(f"Error extracting agent info: {e}")
152
155
  return None
@@ -163,7 +166,7 @@ class DeployedAgentDiscovery(ConfigServiceBase):
163
166
  try:
164
167
  path = Path(agent_path)
165
168
  if path.exists() and path.suffix == ".json":
166
- with open(path, "r") as f:
169
+ with open(path) as f:
167
170
  return json.load(f)
168
171
  except Exception as e:
169
172
  logger.warning(f"Failed to load full agent data from {agent_path}: {e}")
@@ -223,7 +226,7 @@ class DeployedAgentDiscovery(ConfigServiceBase):
223
226
  source_path = str(agent.source_path)
224
227
  if ".claude/agents" in source_path:
225
228
  return "project"
226
- elif str(Path.home()) in source_path:
229
+ if str(Path.home()) in source_path:
227
230
  return "user"
228
231
 
229
232
  # Default to system tier
@@ -26,7 +26,6 @@ import asyncio
26
26
  import hashlib
27
27
  import json
28
28
  import logging
29
- import os
30
29
  import shutil
31
30
  import time
32
31
  import uuid
@@ -42,8 +41,6 @@ from claude_mpm.core.base_service import BaseService
42
41
  from claude_mpm.core.unified_agent_registry import UnifiedAgentRegistry as AgentRegistry
43
42
  from claude_mpm.core.unified_paths import get_path_manager
44
43
  from claude_mpm.services.memory.cache.shared_prompt_cache import SharedPromptCache
45
- from claude_mpm.utils.config_manager import ConfigurationManager
46
- from claude_mpm.utils.path_operations import path_ops
47
44
 
48
45
  # ============================================================================
49
46
  # Data Models
@@ -664,7 +661,7 @@ class AgentModificationTracker(BaseService):
664
661
  # Load active modifications
665
662
  active_path = self.persistence_root / "active_modifications.json"
666
663
  if active_path.exists():
667
- with open(active_path, "r") as f:
664
+ with open(active_path) as f:
668
665
  data = json.load(f)
669
666
  self.active_modifications = {
670
667
  k: AgentModification.from_dict(v) for k, v in data.items()
@@ -672,7 +669,7 @@ class AgentModificationTracker(BaseService):
672
669
 
673
670
  # Load modification history
674
671
  for history_file in self.history_root.glob("*.json"):
675
- with open(history_file, "r") as f:
672
+ with open(history_file) as f:
676
673
  data = json.load(f)
677
674
  agent_name = data["agent_name"]
678
675
  history = ModificationHistory(agent_name=agent_name)
@@ -770,7 +767,7 @@ class AgentModificationTracker(BaseService):
770
767
  if backup_dir.is_dir():
771
768
  metadata_path = backup_dir / "metadata.json"
772
769
  if metadata_path.exists():
773
- with open(metadata_path, "r") as f:
770
+ with open(metadata_path) as f:
774
771
  metadata = json.load(f)
775
772
  if metadata.get("backup_time", 0) < cutoff_time:
776
773
  shutil.rmtree(backup_dir)
@@ -15,7 +15,6 @@ Key Features:
15
15
  - Configuration via .claude-mpm/configuration.yaml
16
16
  """
17
17
 
18
- import asyncio
19
18
  import json
20
19
  import logging
21
20
  import logging.handlers
@@ -27,7 +26,7 @@ from datetime import datetime
27
26
  from enum import Enum
28
27
  from queue import Full, Queue
29
28
  from threading import Lock, Thread
30
- from typing import Any, Callable, Dict, Optional
29
+ from typing import Any, Dict, Optional
31
30
 
32
31
  from claude_mpm.core.constants import PerformanceConfig, SystemLimits, TimeoutConfig
33
32
 
@@ -159,8 +159,7 @@ class ClaudeSessionLogger:
159
159
  timestamp = datetime.now().strftime("%Y%m%d_%H%M%S_%f")
160
160
 
161
161
  # Create filename: session_id-agent-timestamp.json
162
- filename = f"{self.session_id}-{agent_name}-{timestamp}.json"
163
- return filename
162
+ return f"{self.session_id}-{agent_name}-{timestamp}.json"
164
163
 
165
164
  def log_response(
166
165
  self,
@@ -0,0 +1,18 @@
1
+ """CLI services package.
2
+
3
+ Services specifically for CLI command support and utilities.
4
+ """
5
+
6
+ from .agent_dependency_service import AgentDependencyService, IAgentDependencyService
7
+ from .agent_validation_service import AgentValidationService, IAgentValidationService
8
+ from .startup_checker import IStartupChecker, StartupCheckerService, StartupWarning
9
+
10
+ __all__ = [
11
+ "AgentDependencyService",
12
+ "AgentValidationService",
13
+ "IAgentDependencyService",
14
+ "IAgentValidationService",
15
+ "IStartupChecker",
16
+ "StartupCheckerService",
17
+ "StartupWarning",
18
+ ]