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
@@ -18,7 +18,7 @@ from ..interfaces import IEventBus, IEventProducer
18
18
  class SystemEventProducer(IEventProducer):
19
19
  """
20
20
  Publishes system events to the event bus.
21
-
21
+
22
22
  Used for:
23
23
  - Service lifecycle events
24
24
  - Configuration changes
@@ -26,11 +26,11 @@ class SystemEventProducer(IEventProducer):
26
26
  - Performance metrics
27
27
  - System errors
28
28
  """
29
-
29
+
30
30
  def __init__(self, event_bus: IEventBus, source_name: str = "system"):
31
31
  """
32
32
  Initialize system event producer.
33
-
33
+
34
34
  Args:
35
35
  event_bus: The event bus to publish to
36
36
  source_name: Name of the system component
@@ -38,47 +38,47 @@ class SystemEventProducer(IEventProducer):
38
38
  self.logger = get_logger("SystemEventProducer")
39
39
  self.event_bus = event_bus
40
40
  self._source_name = source_name
41
-
41
+
42
42
  # Metrics
43
43
  self._metrics = {
44
44
  "events_published": 0,
45
45
  "events_failed": 0,
46
46
  }
47
-
47
+
48
48
  async def publish(self, event: Event) -> bool:
49
49
  """Publish a system event to the bus."""
50
50
  try:
51
51
  success = await self.event_bus.publish(event)
52
-
52
+
53
53
  if success:
54
54
  self._metrics["events_published"] += 1
55
55
  else:
56
56
  self._metrics["events_failed"] += 1
57
-
57
+
58
58
  return success
59
-
59
+
60
60
  except Exception as e:
61
61
  self.logger.error(f"Error publishing system event: {e}")
62
62
  self._metrics["events_failed"] += 1
63
63
  return False
64
-
64
+
65
65
  async def publish_batch(self, events: List[Event]) -> int:
66
66
  """Publish multiple system events."""
67
67
  successful = 0
68
-
68
+
69
69
  for event in events:
70
70
  if await self.publish(event):
71
71
  successful += 1
72
-
72
+
73
73
  return successful
74
-
74
+
75
75
  @property
76
76
  def source_name(self) -> str:
77
77
  """Get the name of this event source."""
78
78
  return self._source_name
79
-
79
+
80
80
  # Convenience methods for common system events
81
-
81
+
82
82
  async def publish_startup(
83
83
  self,
84
84
  service_name: str,
@@ -87,12 +87,12 @@ class SystemEventProducer(IEventProducer):
87
87
  ) -> bool:
88
88
  """
89
89
  Publish a service startup event.
90
-
90
+
91
91
  Args:
92
92
  service_name: Name of the service
93
93
  version: Service version
94
94
  config: Optional configuration data
95
-
95
+
96
96
  Returns:
97
97
  True if published successfully
98
98
  """
@@ -109,9 +109,9 @@ class SystemEventProducer(IEventProducer):
109
109
  },
110
110
  priority=EventPriority.HIGH,
111
111
  )
112
-
112
+
113
113
  return await self.publish(event)
114
-
114
+
115
115
  async def publish_shutdown(
116
116
  self,
117
117
  service_name: str,
@@ -120,12 +120,12 @@ class SystemEventProducer(IEventProducer):
120
120
  ) -> bool:
121
121
  """
122
122
  Publish a service shutdown event.
123
-
123
+
124
124
  Args:
125
125
  service_name: Name of the service
126
126
  reason: Shutdown reason
127
127
  details: Optional additional details
128
-
128
+
129
129
  Returns:
130
130
  True if published successfully
131
131
  """
@@ -142,9 +142,9 @@ class SystemEventProducer(IEventProducer):
142
142
  },
143
143
  priority=EventPriority.HIGH,
144
144
  )
145
-
145
+
146
146
  return await self.publish(event)
147
-
147
+
148
148
  async def publish_health_status(
149
149
  self,
150
150
  service_name: str,
@@ -154,13 +154,13 @@ class SystemEventProducer(IEventProducer):
154
154
  ) -> bool:
155
155
  """
156
156
  Publish a health status event.
157
-
157
+
158
158
  Args:
159
159
  service_name: Name of the service
160
160
  status: Health status (healthy, degraded, unhealthy)
161
161
  checks: Individual health checks
162
162
  details: Optional additional details
163
-
163
+
164
164
  Returns:
165
165
  True if published successfully
166
166
  """
@@ -176,11 +176,13 @@ class SystemEventProducer(IEventProducer):
176
176
  "checks": checks,
177
177
  "details": details or {},
178
178
  },
179
- priority=EventPriority.NORMAL if status == "healthy" else EventPriority.HIGH,
179
+ priority=(
180
+ EventPriority.NORMAL if status == "healthy" else EventPriority.HIGH
181
+ ),
180
182
  )
181
-
183
+
182
184
  return await self.publish(event)
183
-
185
+
184
186
  async def publish_config_change(
185
187
  self,
186
188
  service_name: str,
@@ -190,13 +192,13 @@ class SystemEventProducer(IEventProducer):
190
192
  ) -> bool:
191
193
  """
192
194
  Publish a configuration change event.
193
-
195
+
194
196
  Args:
195
197
  service_name: Name of the service
196
198
  config_key: Configuration key that changed
197
199
  old_value: Previous value
198
200
  new_value: New value
199
-
201
+
200
202
  Returns:
201
203
  True if published successfully
202
204
  """
@@ -214,9 +216,9 @@ class SystemEventProducer(IEventProducer):
214
216
  },
215
217
  priority=EventPriority.NORMAL,
216
218
  )
217
-
219
+
218
220
  return await self.publish(event)
219
-
221
+
220
222
  async def publish_performance_metrics(
221
223
  self,
222
224
  service_name: str,
@@ -224,11 +226,11 @@ class SystemEventProducer(IEventProducer):
224
226
  ) -> bool:
225
227
  """
226
228
  Publish performance metrics.
227
-
229
+
228
230
  Args:
229
231
  service_name: Name of the service
230
232
  metrics: Performance metrics data
231
-
233
+
232
234
  Returns:
233
235
  True if published successfully
234
236
  """
@@ -244,9 +246,9 @@ class SystemEventProducer(IEventProducer):
244
246
  },
245
247
  priority=EventPriority.LOW,
246
248
  )
247
-
249
+
248
250
  return await self.publish(event)
249
-
251
+
250
252
  async def publish_error(
251
253
  self,
252
254
  service_name: str,
@@ -257,14 +259,14 @@ class SystemEventProducer(IEventProducer):
257
259
  ) -> bool:
258
260
  """
259
261
  Publish a system error event.
260
-
262
+
261
263
  Args:
262
264
  service_name: Name of the service
263
265
  error_type: Type of error
264
266
  error_message: Error message
265
267
  stacktrace: Optional stack trace
266
268
  context: Optional error context
267
-
269
+
268
270
  Returns:
269
271
  True if published successfully
270
272
  """
@@ -283,9 +285,9 @@ class SystemEventProducer(IEventProducer):
283
285
  },
284
286
  priority=EventPriority.CRITICAL,
285
287
  )
286
-
288
+
287
289
  return await self.publish(event)
288
-
290
+
289
291
  async def publish_warning(
290
292
  self,
291
293
  service_name: str,
@@ -295,13 +297,13 @@ class SystemEventProducer(IEventProducer):
295
297
  ) -> bool:
296
298
  """
297
299
  Publish a system warning event.
298
-
300
+
299
301
  Args:
300
302
  service_name: Name of the service
301
303
  warning_type: Type of warning
302
304
  message: Warning message
303
305
  details: Optional additional details
304
-
306
+
305
307
  Returns:
306
308
  True if published successfully
307
309
  """
@@ -319,9 +321,9 @@ class SystemEventProducer(IEventProducer):
319
321
  },
320
322
  priority=EventPriority.HIGH,
321
323
  )
322
-
324
+
323
325
  return await self.publish(event)
324
-
326
+
325
327
  def get_metrics(self) -> Dict[str, Any]:
326
328
  """Get producer metrics."""
327
- return self._metrics
329
+ return self._metrics
@@ -13,9 +13,7 @@ Design Principles:
13
13
  5. Structured error data for programmatic handling
14
14
  """
15
15
 
16
- import os
17
16
  import platform
18
- import sys
19
17
  import time
20
18
  from datetime import datetime
21
19
  from typing import Any, Dict, List, Optional
@@ -29,7 +27,10 @@ class SocketIOServerError(Exception):
29
27
  """
30
28
 
31
29
  def __init__(
32
- self, message: str, error_code: str = None, context: Dict[str, Any] = None
30
+ self,
31
+ message: str,
32
+ error_code: Optional[str] = None,
33
+ context: Optional[Dict[str, Any]] = None,
33
34
  ):
34
35
  """Initialize base server error.
35
36
 
@@ -66,9 +67,9 @@ class DaemonConflictError(SocketIOServerError):
66
67
  self,
67
68
  port: int,
68
69
  existing_pid: int,
69
- existing_server_id: str = None,
70
- process_info: Dict[str, Any] = None,
71
- pidfile_path: Path = None,
70
+ existing_server_id: Optional[str] = None,
71
+ process_info: Optional[Dict[str, Any]] = None,
72
+ pidfile_path: Optional[Path] = None,
72
73
  ):
73
74
  """Initialize daemon conflict error with detailed context.
74
75
 
@@ -103,8 +104,8 @@ class DaemonConflictError(SocketIOServerError):
103
104
  """Build comprehensive error message with process details."""
104
105
  lines = [
105
106
  f"🚫 Socket.IO server conflict detected on port {self.port}",
106
- f"",
107
- f"CONFLICT DETAILS:",
107
+ "",
108
+ "CONFLICT DETAILS:",
108
109
  f" • Existing PID: {self.existing_pid}",
109
110
  f" • Server ID: {self.existing_server_id}",
110
111
  ]
@@ -145,8 +146,8 @@ class DaemonConflictError(SocketIOServerError):
145
146
 
146
147
  lines.extend(
147
148
  [
148
- f"",
149
- f"RESOLUTION STEPS:",
149
+ "",
150
+ "RESOLUTION STEPS:",
150
151
  ]
151
152
  )
152
153
 
@@ -169,9 +170,9 @@ class DaemonConflictError(SocketIOServerError):
169
170
 
170
171
  steps.extend(
171
172
  [
172
- f"Wait a few seconds for port cleanup",
173
+ "Wait a few seconds for port cleanup",
173
174
  f"Try starting the server again on port {self.port}",
174
- f"Alternative: Use a different port with --port <new_port>",
175
+ "Alternative: Use a different port with --port <new_port>",
175
176
  ]
176
177
  )
177
178
 
@@ -189,7 +190,7 @@ class PortConflictError(SocketIOServerError):
189
190
  self,
190
191
  port: int,
191
192
  host: str = "localhost",
192
- conflicting_process: Dict[str, Any] = None,
193
+ conflicting_process: Optional[Dict[str, Any]] = None,
193
194
  ):
194
195
  """Initialize port conflict error.
195
196
 
@@ -216,9 +217,9 @@ class PortConflictError(SocketIOServerError):
216
217
  def _build_error_message(self) -> str:
217
218
  """Build error message with port conflict details."""
218
219
  lines = [
219
- f"🔌 Network port conflict detected",
220
- f"",
221
- f"PORT CONFLICT DETAILS:",
220
+ "🔌 Network port conflict detected",
221
+ "",
222
+ "PORT CONFLICT DETAILS:",
222
223
  f" • Port: {self.port}",
223
224
  f" • Host: {self.host}",
224
225
  f" • Address: {self.host}:{self.port}",
@@ -232,8 +233,8 @@ class PortConflictError(SocketIOServerError):
232
233
 
233
234
  lines.extend(
234
235
  [
235
- f"",
236
- f"CONFLICTING PROCESS:",
236
+ "",
237
+ "CONFLICTING PROCESS:",
237
238
  f" • PID: {pid or 'unknown'}",
238
239
  f" • Name: {name}",
239
240
  ]
@@ -244,8 +245,8 @@ class PortConflictError(SocketIOServerError):
244
245
 
245
246
  lines.extend(
246
247
  [
247
- f"",
248
- f"RESOLUTION STEPS:",
248
+ "",
249
+ "RESOLUTION STEPS:",
249
250
  ]
250
251
  )
251
252
 
@@ -275,15 +276,15 @@ class PortConflictError(SocketIOServerError):
275
276
  steps.extend(
276
277
  [
277
278
  f" • netstat -ano | findstr {self.port}",
278
- f' • tasklist /fi "PID eq <PID_FROM_NETSTAT>"',
279
+ ' • tasklist /fi "PID eq <PID_FROM_NETSTAT>"',
279
280
  ]
280
281
  )
281
282
 
282
283
  steps.extend(
283
284
  [
284
- f"Stop the conflicting process if it's safe to do so",
285
- f"Wait for port cleanup (may take 30-60 seconds)",
286
- f"Try again with the same port",
285
+ "Stop the conflicting process if it's safe to do so",
286
+ "Wait for port cleanup (may take 30-60 seconds)",
287
+ "Try again with the same port",
287
288
  f"Alternative: Use a different port: --port {self.port + 1}",
288
289
  ]
289
290
  )
@@ -301,9 +302,9 @@ class StaleProcessError(SocketIOServerError):
301
302
  def __init__(
302
303
  self,
303
304
  pid: int,
304
- pidfile_path: Path = None,
305
+ pidfile_path: Optional[Path] = None,
305
306
  process_status: str = "not_found",
306
- validation_errors: List[str] = None,
307
+ validation_errors: Optional[List[str]] = None,
307
308
  ):
308
309
  """Initialize stale process error.
309
310
 
@@ -345,9 +346,9 @@ class StaleProcessError(SocketIOServerError):
345
346
  )
346
347
 
347
348
  lines = [
348
- f"🧟 Stale process detected",
349
- f"",
350
- f"PROCESS DETAILS:",
349
+ "🧟 Stale process detected",
350
+ "",
351
+ "PROCESS DETAILS:",
351
352
  f" • PID: {self.pid}",
352
353
  f" • Status: {status_desc}",
353
354
  ]
@@ -363,8 +364,8 @@ class StaleProcessError(SocketIOServerError):
363
364
  if self.validation_errors:
364
365
  lines.extend(
365
366
  [
366
- f"",
367
- f"VALIDATION ERRORS:",
367
+ "",
368
+ "VALIDATION ERRORS:",
368
369
  ]
369
370
  )
370
371
  for error in self.validation_errors:
@@ -372,8 +373,8 @@ class StaleProcessError(SocketIOServerError):
372
373
 
373
374
  lines.extend(
374
375
  [
375
- f"",
376
- f"RESOLUTION STEPS:",
376
+ "",
377
+ "RESOLUTION STEPS:",
377
378
  ]
378
379
  )
379
380
 
@@ -431,8 +432,8 @@ class RecoveryFailedError(SocketIOServerError):
431
432
  recovery_action: str,
432
433
  failure_reason: str,
433
434
  attempt_count: int = 1,
434
- health_status: Dict[str, Any] = None,
435
- last_successful_recovery: str = None,
435
+ health_status: Optional[Dict[str, Any]] = None,
436
+ last_successful_recovery: Optional[str] = None,
436
437
  ):
437
438
  """Initialize recovery failure error.
438
439
 
@@ -465,9 +466,9 @@ class RecoveryFailedError(SocketIOServerError):
465
466
  def _build_error_message(self) -> str:
466
467
  """Build error message for recovery failure."""
467
468
  lines = [
468
- f"🚨 Automatic recovery failed",
469
- f"",
470
- f"RECOVERY DETAILS:",
469
+ "🚨 Automatic recovery failed",
470
+ "",
471
+ "RECOVERY DETAILS:",
471
472
  f" • Failed Action: {self.recovery_action}",
472
473
  f" • Failure Reason: {self.failure_reason}",
473
474
  f" • Attempt Count: {self.attempt_count}",
@@ -482,8 +483,8 @@ class RecoveryFailedError(SocketIOServerError):
482
483
  if self.health_status:
483
484
  lines.extend(
484
485
  [
485
- f"",
486
- f"CURRENT HEALTH STATUS:",
486
+ "",
487
+ "CURRENT HEALTH STATUS:",
487
488
  ]
488
489
  )
489
490
 
@@ -500,8 +501,8 @@ class RecoveryFailedError(SocketIOServerError):
500
501
 
501
502
  lines.extend(
502
503
  [
503
- f"",
504
- f"MANUAL RESOLUTION REQUIRED:",
504
+ "",
505
+ "MANUAL RESOLUTION REQUIRED:",
505
506
  ]
506
507
  )
507
508
 
@@ -567,8 +568,8 @@ class HealthCheckError(SocketIOServerError):
567
568
  self,
568
569
  check_name: str,
569
570
  check_status: str,
570
- check_details: Dict[str, Any] = None,
571
- threshold_exceeded: Dict[str, Any] = None,
571
+ check_details: Optional[Dict[str, Any]] = None,
572
+ threshold_exceeded: Optional[Dict[str, Any]] = None,
572
573
  ):
573
574
  """Initialize health check error.
574
575
 
@@ -603,8 +604,8 @@ class HealthCheckError(SocketIOServerError):
603
604
 
604
605
  lines = [
605
606
  f"{emoji} Health check failed: {self.check_name}",
606
- f"",
607
- f"CHECK DETAILS:",
607
+ "",
608
+ "CHECK DETAILS:",
608
609
  f" • Check: {self.check_name}",
609
610
  f" • Status: {self.check_status.upper()}",
610
611
  ]
@@ -619,8 +620,8 @@ class HealthCheckError(SocketIOServerError):
619
620
  if self.threshold_exceeded:
620
621
  lines.extend(
621
622
  [
622
- f"",
623
- f"THRESHOLDS EXCEEDED:",
623
+ "",
624
+ "THRESHOLDS EXCEEDED:",
624
625
  ]
625
626
  )
626
627
  for metric, info in self.threshold_exceeded.items():
@@ -632,8 +633,8 @@ class HealthCheckError(SocketIOServerError):
632
633
 
633
634
  lines.extend(
634
635
  [
635
- f"",
636
- f"RECOMMENDED ACTIONS:",
636
+ "",
637
+ "RECOMMENDED ACTIONS:",
637
638
  ]
638
639
  )
639
640
 
@@ -706,39 +707,39 @@ def format_troubleshooting_guide(error: SocketIOServerError) -> str:
706
707
  Formatted troubleshooting guide as a string
707
708
  """
708
709
  lines = [
709
- f"═══════════════════════════════════════════════════════════════",
710
- f"🔧 CLAUDE MPM SOCKET.IO SERVER TROUBLESHOOTING GUIDE",
711
- f"═══════════════════════════════════════════════════════════════",
712
- f"",
710
+ "═══════════════════════════════════════════════════════════════",
711
+ "🔧 CLAUDE MPM SOCKET.IO SERVER TROUBLESHOOTING GUIDE",
712
+ "═══════════════════════════════════════════════════════════════",
713
+ "",
713
714
  f"ERROR TYPE: {error.__class__.__name__}",
714
715
  f"ERROR CODE: {error.error_code}",
715
716
  f"TIMESTAMP: {error.timestamp}",
716
- f"",
717
+ "",
717
718
  str(error),
718
- f"",
719
- f"ADDITIONAL TROUBLESHOOTING:",
720
- f"",
721
- f"🔍 DIAGNOSTIC COMMANDS:",
722
- f" • Check running processes: ps aux | grep socketio",
719
+ "",
720
+ "ADDITIONAL TROUBLESHOOTING:",
721
+ "",
722
+ "🔍 DIAGNOSTIC COMMANDS:",
723
+ " • Check running processes: ps aux | grep socketio",
723
724
  f" • Check port usage: lsof -i :{error.context.get('port', 'PORT')}",
724
- f" • Check system resources: top or htop",
725
- f" • Check disk space: df -h",
726
- f" • Check logs: tail -f /path/to/claude-mpm.log",
727
- f"",
728
- f"🛠️ COMMON SOLUTIONS:",
729
- f" 1. Restart the Socket.IO server completely",
730
- f" 2. Clear any stale PID files",
731
- f" 3. Check for zombie processes and clean them up",
732
- f" 4. Verify network port availability",
733
- f" 5. Check system resource availability (CPU, memory, disk)",
734
- f" 6. Review server configuration and permissions",
735
- f"",
736
- f"📞 GETTING HELP:",
737
- f" • Check the claude-mpm documentation",
738
- f" • Review server logs for additional context",
739
- f" • Report persistent issues with this error information",
740
- f"",
741
- f"🔗 ERROR CONTEXT DATA:",
725
+ " • Check system resources: top or htop",
726
+ " • Check disk space: df -h",
727
+ " • Check logs: tail -f /path/to/claude-mpm.log",
728
+ "",
729
+ "🛠️ COMMON SOLUTIONS:",
730
+ " 1. Restart the Socket.IO server completely",
731
+ " 2. Clear any stale PID files",
732
+ " 3. Check for zombie processes and clean them up",
733
+ " 4. Verify network port availability",
734
+ " 5. Check system resource availability (CPU, memory, disk)",
735
+ " 6. Review server configuration and permissions",
736
+ "",
737
+ "📞 GETTING HELP:",
738
+ " • Check the claude-mpm documentation",
739
+ " • Review server logs for additional context",
740
+ " • Report persistent issues with this error information",
741
+ "",
742
+ "🔗 ERROR CONTEXT DATA:",
742
743
  ]
743
744
 
744
745
  # Add structured context data
@@ -748,8 +749,8 @@ def format_troubleshooting_guide(error: SocketIOServerError) -> str:
748
749
 
749
750
  lines.extend(
750
751
  [
751
- f"",
752
- f"═══════════════════════════════════════════════════════════════",
752
+ "",
753
+ "═══════════════════════════════════════════════════════════════",
753
754
  ]
754
755
  )
755
756
 
@@ -106,9 +106,7 @@ class FrameworkClaudeMdGenerator:
106
106
  sections["header"] = (generator_func, metadata)
107
107
 
108
108
  # Assemble content
109
- content = self.assembler.assemble_content(sections, template_variables)
110
-
111
- return content
109
+ return self.assembler.assemble_content(sections, template_variables)
112
110
 
113
111
  def validate_content(self, content: str) -> Tuple[bool, List[str]]:
114
112
  """
@@ -143,7 +141,7 @@ class FrameworkClaudeMdGenerator:
143
141
  current_content = None
144
142
 
145
143
  if target_file.exists():
146
- with open(target_file, "r") as f:
144
+ with open(target_file) as f:
147
145
  current_content = f.read()
148
146
 
149
147
  # Generate new content
@@ -8,7 +8,7 @@ import hashlib
8
8
  import logging
9
9
  from collections import OrderedDict
10
10
  from datetime import datetime
11
- from typing import Any, Dict, List, Optional
11
+ from typing import Any, Dict, Optional
12
12
 
13
13
  from claude_mpm.services.agents.management import AgentCapabilitiesGenerator
14
14
  from claude_mpm.services.agents.registry import DeployedAgentDiscovery
@@ -58,7 +58,7 @@ class ContentAssembler:
58
58
 
59
59
  # Generate all sections
60
60
  content_parts = []
61
- for section_name, (generator_func, section_data) in sections.items():
61
+ for _section_name, (generator_func, section_data) in sections.items():
62
62
  section_content = generator_func(section_data)
63
63
  content_parts.append(section_content)
64
64
 
@@ -66,9 +66,7 @@ class ContentAssembler:
66
66
  full_content = "\n".join(content_parts)
67
67
 
68
68
  # Apply template variable substitution
69
- full_content = self.apply_template_variables(full_content)
70
-
71
- return full_content
69
+ return self.apply_template_variables(full_content)
72
70
 
73
71
  def apply_template_variables(self, content: str) -> str:
74
72
  """
@@ -5,7 +5,7 @@ Validates generated content structure and completeness.
5
5
  """
6
6
 
7
7
  import re
8
- from typing import List, Set, Tuple
8
+ from typing import List, Tuple
9
9
 
10
10
 
11
11
  class ContentValidator: