claude-mpm 4.1.1__py3-none-any.whl → 4.1.2__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (357) hide show
  1. claude_mpm/BUILD_NUMBER +1 -1
  2. claude_mpm/VERSION +1 -1
  3. claude_mpm/__main__.py +1 -1
  4. claude_mpm/agents/BASE_PM.md +74 -46
  5. claude_mpm/agents/INSTRUCTIONS.md +11 -153
  6. claude_mpm/agents/WORKFLOW.md +61 -321
  7. claude_mpm/agents/__init__.py +11 -11
  8. claude_mpm/agents/agent_loader.py +23 -20
  9. claude_mpm/agents/agent_loader_integration.py +1 -1
  10. claude_mpm/agents/agents_metadata.py +27 -0
  11. claude_mpm/agents/async_agent_loader.py +5 -8
  12. claude_mpm/agents/base_agent_loader.py +36 -25
  13. claude_mpm/agents/frontmatter_validator.py +6 -6
  14. claude_mpm/agents/schema/agent_schema.json +1 -1
  15. claude_mpm/agents/system_agent_config.py +9 -9
  16. claude_mpm/agents/templates/api_qa.json +47 -2
  17. claude_mpm/agents/templates/imagemagick.json +256 -0
  18. claude_mpm/agents/templates/qa.json +41 -2
  19. claude_mpm/agents/templates/ticketing.json +5 -5
  20. claude_mpm/agents/templates/web_qa.json +50 -2
  21. claude_mpm/cli/__init__.py +51 -46
  22. claude_mpm/cli/__main__.py +1 -1
  23. claude_mpm/cli/commands/__init__.py +10 -12
  24. claude_mpm/cli/commands/agent_manager.py +186 -181
  25. claude_mpm/cli/commands/agents.py +271 -268
  26. claude_mpm/cli/commands/aggregate.py +30 -29
  27. claude_mpm/cli/commands/cleanup.py +50 -44
  28. claude_mpm/cli/commands/cleanup_orphaned_agents.py +25 -25
  29. claude_mpm/cli/commands/config.py +162 -127
  30. claude_mpm/cli/commands/doctor.py +52 -62
  31. claude_mpm/cli/commands/info.py +37 -25
  32. claude_mpm/cli/commands/mcp.py +3 -7
  33. claude_mpm/cli/commands/mcp_command_router.py +14 -18
  34. claude_mpm/cli/commands/mcp_install_commands.py +28 -23
  35. claude_mpm/cli/commands/mcp_pipx_config.py +58 -49
  36. claude_mpm/cli/commands/mcp_server_commands.py +23 -17
  37. claude_mpm/cli/commands/memory.py +192 -141
  38. claude_mpm/cli/commands/monitor.py +117 -88
  39. claude_mpm/cli/commands/run.py +120 -84
  40. claude_mpm/cli/commands/run_config_checker.py +4 -5
  41. claude_mpm/cli/commands/socketio_monitor.py +17 -19
  42. claude_mpm/cli/commands/tickets.py +92 -92
  43. claude_mpm/cli/parser.py +1 -5
  44. claude_mpm/cli/parsers/__init__.py +1 -1
  45. claude_mpm/cli/parsers/agent_manager_parser.py +50 -98
  46. claude_mpm/cli/parsers/agents_parser.py +2 -3
  47. claude_mpm/cli/parsers/base_parser.py +7 -5
  48. claude_mpm/cli/parsers/mcp_parser.py +4 -2
  49. claude_mpm/cli/parsers/monitor_parser.py +26 -18
  50. claude_mpm/cli/shared/__init__.py +10 -10
  51. claude_mpm/cli/shared/argument_patterns.py +57 -71
  52. claude_mpm/cli/shared/base_command.py +61 -53
  53. claude_mpm/cli/shared/error_handling.py +62 -58
  54. claude_mpm/cli/shared/output_formatters.py +78 -77
  55. claude_mpm/cli/startup_logging.py +204 -172
  56. claude_mpm/cli/utils.py +10 -11
  57. claude_mpm/cli_module/__init__.py +1 -1
  58. claude_mpm/cli_module/args.py +1 -1
  59. claude_mpm/cli_module/migration_example.py +5 -5
  60. claude_mpm/config/__init__.py +9 -9
  61. claude_mpm/config/agent_config.py +15 -14
  62. claude_mpm/config/experimental_features.py +4 -4
  63. claude_mpm/config/paths.py +0 -1
  64. claude_mpm/config/socketio_config.py +5 -6
  65. claude_mpm/constants.py +1 -2
  66. claude_mpm/core/__init__.py +8 -8
  67. claude_mpm/core/agent_name_normalizer.py +1 -1
  68. claude_mpm/core/agent_registry.py +20 -23
  69. claude_mpm/core/agent_session_manager.py +3 -3
  70. claude_mpm/core/base_service.py +7 -15
  71. claude_mpm/core/cache.py +4 -6
  72. claude_mpm/core/claude_runner.py +85 -113
  73. claude_mpm/core/config.py +43 -28
  74. claude_mpm/core/config_aliases.py +0 -9
  75. claude_mpm/core/config_constants.py +52 -30
  76. claude_mpm/core/constants.py +0 -1
  77. claude_mpm/core/container.py +18 -27
  78. claude_mpm/core/exceptions.py +2 -2
  79. claude_mpm/core/factories.py +10 -12
  80. claude_mpm/core/framework_loader.py +581 -280
  81. claude_mpm/core/hook_manager.py +26 -22
  82. claude_mpm/core/hook_performance_config.py +58 -47
  83. claude_mpm/core/injectable_service.py +1 -1
  84. claude_mpm/core/interactive_session.py +61 -152
  85. claude_mpm/core/interfaces.py +1 -100
  86. claude_mpm/core/lazy.py +5 -5
  87. claude_mpm/core/log_manager.py +587 -0
  88. claude_mpm/core/logger.py +125 -8
  89. claude_mpm/core/logging_config.py +15 -15
  90. claude_mpm/core/minimal_framework_loader.py +5 -8
  91. claude_mpm/core/oneshot_session.py +15 -33
  92. claude_mpm/core/optimized_agent_loader.py +4 -6
  93. claude_mpm/core/optimized_startup.py +2 -1
  94. claude_mpm/core/output_style_manager.py +147 -106
  95. claude_mpm/core/pm_hook_interceptor.py +0 -1
  96. claude_mpm/core/service_registry.py +11 -8
  97. claude_mpm/core/session_manager.py +1 -2
  98. claude_mpm/core/shared/__init__.py +1 -1
  99. claude_mpm/core/shared/config_loader.py +101 -97
  100. claude_mpm/core/shared/path_resolver.py +72 -68
  101. claude_mpm/core/shared/singleton_manager.py +56 -50
  102. claude_mpm/core/socketio_pool.py +26 -6
  103. claude_mpm/core/tool_access_control.py +4 -5
  104. claude_mpm/core/typing_utils.py +50 -59
  105. claude_mpm/core/unified_agent_registry.py +14 -19
  106. claude_mpm/core/unified_config.py +4 -6
  107. claude_mpm/core/unified_paths.py +197 -109
  108. claude_mpm/dashboard/open_dashboard.py +2 -4
  109. claude_mpm/experimental/cli_enhancements.py +51 -36
  110. claude_mpm/generators/agent_profile_generator.py +2 -4
  111. claude_mpm/hooks/base_hook.py +1 -2
  112. claude_mpm/hooks/claude_hooks/connection_pool.py +72 -26
  113. claude_mpm/hooks/claude_hooks/event_handlers.py +93 -38
  114. claude_mpm/hooks/claude_hooks/hook_handler.py +130 -76
  115. claude_mpm/hooks/claude_hooks/hook_handler_eventbus.py +104 -77
  116. claude_mpm/hooks/claude_hooks/memory_integration.py +2 -4
  117. claude_mpm/hooks/claude_hooks/response_tracking.py +15 -11
  118. claude_mpm/hooks/claude_hooks/tool_analysis.py +12 -18
  119. claude_mpm/hooks/memory_integration_hook.py +5 -5
  120. claude_mpm/hooks/tool_call_interceptor.py +1 -1
  121. claude_mpm/hooks/validation_hooks.py +4 -4
  122. claude_mpm/init.py +4 -9
  123. claude_mpm/models/__init__.py +2 -2
  124. claude_mpm/models/agent_session.py +11 -14
  125. claude_mpm/scripts/mcp_server.py +20 -11
  126. claude_mpm/scripts/mcp_wrapper.py +5 -5
  127. claude_mpm/scripts/mpm_doctor.py +321 -0
  128. claude_mpm/scripts/socketio_daemon.py +28 -25
  129. claude_mpm/scripts/socketio_daemon_hardened.py +298 -258
  130. claude_mpm/scripts/socketio_server_manager.py +116 -95
  131. claude_mpm/services/__init__.py +49 -49
  132. claude_mpm/services/agent_capabilities_service.py +12 -18
  133. claude_mpm/services/agents/__init__.py +22 -22
  134. claude_mpm/services/agents/agent_builder.py +140 -119
  135. claude_mpm/services/agents/deployment/__init__.py +3 -3
  136. claude_mpm/services/agents/deployment/agent_config_provider.py +9 -9
  137. claude_mpm/services/agents/deployment/agent_configuration_manager.py +19 -20
  138. claude_mpm/services/agents/deployment/agent_definition_factory.py +1 -5
  139. claude_mpm/services/agents/deployment/agent_deployment.py +136 -106
  140. claude_mpm/services/agents/deployment/agent_discovery_service.py +4 -8
  141. claude_mpm/services/agents/deployment/agent_environment_manager.py +2 -7
  142. claude_mpm/services/agents/deployment/agent_filesystem_manager.py +6 -10
  143. claude_mpm/services/agents/deployment/agent_format_converter.py +11 -15
  144. claude_mpm/services/agents/deployment/agent_frontmatter_validator.py +2 -3
  145. claude_mpm/services/agents/deployment/agent_lifecycle_manager.py +5 -5
  146. claude_mpm/services/agents/deployment/agent_metrics_collector.py +13 -19
  147. claude_mpm/services/agents/deployment/agent_restore_handler.py +0 -1
  148. claude_mpm/services/agents/deployment/agent_template_builder.py +26 -35
  149. claude_mpm/services/agents/deployment/agent_validator.py +0 -1
  150. claude_mpm/services/agents/deployment/agent_version_manager.py +7 -9
  151. claude_mpm/services/agents/deployment/agent_versioning.py +3 -3
  152. claude_mpm/services/agents/deployment/agents_directory_resolver.py +6 -7
  153. claude_mpm/services/agents/deployment/async_agent_deployment.py +51 -38
  154. claude_mpm/services/agents/deployment/config/__init__.py +1 -1
  155. claude_mpm/services/agents/deployment/config/deployment_config.py +7 -8
  156. claude_mpm/services/agents/deployment/deployment_type_detector.py +1 -1
  157. claude_mpm/services/agents/deployment/deployment_wrapper.py +18 -18
  158. claude_mpm/services/agents/deployment/facade/__init__.py +1 -1
  159. claude_mpm/services/agents/deployment/facade/deployment_executor.py +0 -3
  160. claude_mpm/services/agents/deployment/facade/deployment_facade.py +3 -4
  161. claude_mpm/services/agents/deployment/interface_adapter.py +5 -7
  162. claude_mpm/services/agents/deployment/multi_source_deployment_service.py +345 -276
  163. claude_mpm/services/agents/deployment/pipeline/__init__.py +2 -2
  164. claude_mpm/services/agents/deployment/pipeline/pipeline_builder.py +1 -1
  165. claude_mpm/services/agents/deployment/pipeline/pipeline_context.py +6 -4
  166. claude_mpm/services/agents/deployment/pipeline/pipeline_executor.py +3 -3
  167. claude_mpm/services/agents/deployment/pipeline/steps/__init__.py +2 -2
  168. claude_mpm/services/agents/deployment/pipeline/steps/agent_processing_step.py +14 -13
  169. claude_mpm/services/agents/deployment/pipeline/steps/base_step.py +0 -1
  170. claude_mpm/services/agents/deployment/pipeline/steps/configuration_step.py +1 -1
  171. claude_mpm/services/agents/deployment/pipeline/steps/target_directory_step.py +8 -9
  172. claude_mpm/services/agents/deployment/pipeline/steps/validation_step.py +1 -1
  173. claude_mpm/services/agents/deployment/processors/__init__.py +1 -1
  174. claude_mpm/services/agents/deployment/processors/agent_processor.py +20 -16
  175. claude_mpm/services/agents/deployment/refactored_agent_deployment_service.py +5 -12
  176. claude_mpm/services/agents/deployment/results/__init__.py +1 -1
  177. claude_mpm/services/agents/deployment/results/deployment_result_builder.py +1 -1
  178. claude_mpm/services/agents/deployment/strategies/__init__.py +2 -2
  179. claude_mpm/services/agents/deployment/strategies/base_strategy.py +1 -7
  180. claude_mpm/services/agents/deployment/strategies/project_strategy.py +1 -4
  181. claude_mpm/services/agents/deployment/strategies/system_strategy.py +2 -3
  182. claude_mpm/services/agents/deployment/strategies/user_strategy.py +3 -7
  183. claude_mpm/services/agents/deployment/validation/__init__.py +1 -1
  184. claude_mpm/services/agents/deployment/validation/agent_validator.py +1 -1
  185. claude_mpm/services/agents/deployment/validation/template_validator.py +2 -2
  186. claude_mpm/services/agents/deployment/validation/validation_result.py +2 -6
  187. claude_mpm/services/agents/loading/__init__.py +1 -1
  188. claude_mpm/services/agents/loading/agent_profile_loader.py +6 -12
  189. claude_mpm/services/agents/loading/base_agent_manager.py +5 -5
  190. claude_mpm/services/agents/loading/framework_agent_loader.py +2 -4
  191. claude_mpm/services/agents/management/__init__.py +1 -1
  192. claude_mpm/services/agents/management/agent_capabilities_generator.py +1 -3
  193. claude_mpm/services/agents/management/agent_management_service.py +5 -9
  194. claude_mpm/services/agents/memory/__init__.py +4 -4
  195. claude_mpm/services/agents/memory/agent_memory_manager.py +280 -160
  196. claude_mpm/services/agents/memory/agent_persistence_service.py +0 -2
  197. claude_mpm/services/agents/memory/content_manager.py +44 -38
  198. claude_mpm/services/agents/memory/template_generator.py +4 -6
  199. claude_mpm/services/agents/registry/__init__.py +10 -6
  200. claude_mpm/services/agents/registry/deployed_agent_discovery.py +30 -27
  201. claude_mpm/services/agents/registry/modification_tracker.py +3 -6
  202. claude_mpm/services/async_session_logger.py +1 -2
  203. claude_mpm/services/claude_session_logger.py +1 -2
  204. claude_mpm/services/command_deployment_service.py +173 -0
  205. claude_mpm/services/command_handler_service.py +20 -22
  206. claude_mpm/services/core/__init__.py +25 -25
  207. claude_mpm/services/core/base.py +0 -5
  208. claude_mpm/services/core/interfaces/__init__.py +32 -32
  209. claude_mpm/services/core/interfaces/agent.py +0 -21
  210. claude_mpm/services/core/interfaces/communication.py +0 -27
  211. claude_mpm/services/core/interfaces/infrastructure.py +0 -56
  212. claude_mpm/services/core/interfaces/service.py +0 -29
  213. claude_mpm/services/diagnostics/__init__.py +1 -1
  214. claude_mpm/services/diagnostics/checks/__init__.py +6 -6
  215. claude_mpm/services/diagnostics/checks/agent_check.py +89 -80
  216. claude_mpm/services/diagnostics/checks/base_check.py +12 -16
  217. claude_mpm/services/diagnostics/checks/claude_desktop_check.py +84 -81
  218. claude_mpm/services/diagnostics/checks/common_issues_check.py +99 -91
  219. claude_mpm/services/diagnostics/checks/configuration_check.py +82 -77
  220. claude_mpm/services/diagnostics/checks/filesystem_check.py +67 -68
  221. claude_mpm/services/diagnostics/checks/installation_check.py +254 -94
  222. claude_mpm/services/diagnostics/checks/mcp_check.py +90 -88
  223. claude_mpm/services/diagnostics/checks/monitor_check.py +75 -76
  224. claude_mpm/services/diagnostics/checks/startup_log_check.py +67 -73
  225. claude_mpm/services/diagnostics/diagnostic_runner.py +67 -59
  226. claude_mpm/services/diagnostics/doctor_reporter.py +107 -70
  227. claude_mpm/services/diagnostics/models.py +21 -19
  228. claude_mpm/services/event_aggregator.py +10 -17
  229. claude_mpm/services/event_bus/__init__.py +1 -1
  230. claude_mpm/services/event_bus/config.py +54 -35
  231. claude_mpm/services/event_bus/event_bus.py +76 -71
  232. claude_mpm/services/event_bus/relay.py +74 -64
  233. claude_mpm/services/events/__init__.py +11 -11
  234. claude_mpm/services/events/consumers/__init__.py +3 -3
  235. claude_mpm/services/events/consumers/dead_letter.py +71 -63
  236. claude_mpm/services/events/consumers/logging.py +39 -37
  237. claude_mpm/services/events/consumers/metrics.py +56 -57
  238. claude_mpm/services/events/consumers/socketio.py +82 -81
  239. claude_mpm/services/events/core.py +110 -99
  240. claude_mpm/services/events/interfaces.py +56 -72
  241. claude_mpm/services/events/producers/__init__.py +1 -1
  242. claude_mpm/services/events/producers/hook.py +38 -38
  243. claude_mpm/services/events/producers/system.py +46 -44
  244. claude_mpm/services/exceptions.py +81 -80
  245. claude_mpm/services/framework_claude_md_generator/__init__.py +2 -4
  246. claude_mpm/services/framework_claude_md_generator/content_assembler.py +3 -5
  247. claude_mpm/services/framework_claude_md_generator/content_validator.py +1 -1
  248. claude_mpm/services/framework_claude_md_generator/deployment_manager.py +4 -4
  249. claude_mpm/services/framework_claude_md_generator/section_generators/__init__.py +0 -1
  250. claude_mpm/services/framework_claude_md_generator/section_generators/agents.py +0 -2
  251. claude_mpm/services/framework_claude_md_generator/version_manager.py +4 -5
  252. claude_mpm/services/hook_service.py +6 -9
  253. claude_mpm/services/infrastructure/__init__.py +1 -1
  254. claude_mpm/services/infrastructure/context_preservation.py +8 -12
  255. claude_mpm/services/infrastructure/monitoring.py +21 -23
  256. claude_mpm/services/mcp_gateway/__init__.py +37 -37
  257. claude_mpm/services/mcp_gateway/auto_configure.py +95 -103
  258. claude_mpm/services/mcp_gateway/config/__init__.py +1 -1
  259. claude_mpm/services/mcp_gateway/config/config_loader.py +23 -25
  260. claude_mpm/services/mcp_gateway/config/config_schema.py +5 -5
  261. claude_mpm/services/mcp_gateway/config/configuration.py +9 -6
  262. claude_mpm/services/mcp_gateway/core/__init__.py +10 -10
  263. claude_mpm/services/mcp_gateway/core/base.py +0 -3
  264. claude_mpm/services/mcp_gateway/core/interfaces.py +1 -38
  265. claude_mpm/services/mcp_gateway/core/process_pool.py +99 -93
  266. claude_mpm/services/mcp_gateway/core/singleton_manager.py +65 -62
  267. claude_mpm/services/mcp_gateway/core/startup_verification.py +75 -74
  268. claude_mpm/services/mcp_gateway/main.py +2 -1
  269. claude_mpm/services/mcp_gateway/registry/service_registry.py +5 -8
  270. claude_mpm/services/mcp_gateway/registry/tool_registry.py +1 -1
  271. claude_mpm/services/mcp_gateway/server/__init__.py +1 -1
  272. claude_mpm/services/mcp_gateway/server/mcp_gateway.py +12 -19
  273. claude_mpm/services/mcp_gateway/server/stdio_handler.py +4 -3
  274. claude_mpm/services/mcp_gateway/server/stdio_server.py +79 -71
  275. claude_mpm/services/mcp_gateway/tools/__init__.py +2 -2
  276. claude_mpm/services/mcp_gateway/tools/base_adapter.py +5 -6
  277. claude_mpm/services/mcp_gateway/tools/document_summarizer.py +13 -22
  278. claude_mpm/services/mcp_gateway/tools/health_check_tool.py +79 -78
  279. claude_mpm/services/mcp_gateway/tools/hello_world.py +12 -14
  280. claude_mpm/services/mcp_gateway/tools/ticket_tools.py +42 -49
  281. claude_mpm/services/mcp_gateway/tools/unified_ticket_tool.py +51 -55
  282. claude_mpm/services/memory/__init__.py +3 -3
  283. claude_mpm/services/memory/builder.py +3 -6
  284. claude_mpm/services/memory/cache/__init__.py +1 -1
  285. claude_mpm/services/memory/cache/shared_prompt_cache.py +3 -5
  286. claude_mpm/services/memory/cache/simple_cache.py +1 -1
  287. claude_mpm/services/memory/indexed_memory.py +5 -7
  288. claude_mpm/services/memory/optimizer.py +7 -10
  289. claude_mpm/services/memory/router.py +8 -9
  290. claude_mpm/services/memory_hook_service.py +48 -34
  291. claude_mpm/services/monitor_build_service.py +77 -73
  292. claude_mpm/services/port_manager.py +130 -108
  293. claude_mpm/services/project/analyzer.py +12 -10
  294. claude_mpm/services/project/registry.py +11 -11
  295. claude_mpm/services/recovery_manager.py +10 -19
  296. claude_mpm/services/response_tracker.py +0 -1
  297. claude_mpm/services/runner_configuration_service.py +19 -20
  298. claude_mpm/services/session_management_service.py +7 -11
  299. claude_mpm/services/shared/__init__.py +1 -1
  300. claude_mpm/services/shared/async_service_base.py +58 -50
  301. claude_mpm/services/shared/config_service_base.py +73 -67
  302. claude_mpm/services/shared/lifecycle_service_base.py +82 -78
  303. claude_mpm/services/shared/manager_base.py +94 -82
  304. claude_mpm/services/shared/service_factory.py +96 -98
  305. claude_mpm/services/socketio/__init__.py +3 -3
  306. claude_mpm/services/socketio/client_proxy.py +5 -5
  307. claude_mpm/services/socketio/event_normalizer.py +199 -181
  308. claude_mpm/services/socketio/handlers/__init__.py +3 -3
  309. claude_mpm/services/socketio/handlers/base.py +5 -4
  310. claude_mpm/services/socketio/handlers/connection.py +163 -136
  311. claude_mpm/services/socketio/handlers/file.py +13 -14
  312. claude_mpm/services/socketio/handlers/git.py +12 -7
  313. claude_mpm/services/socketio/handlers/hook.py +49 -44
  314. claude_mpm/services/socketio/handlers/memory.py +0 -1
  315. claude_mpm/services/socketio/handlers/project.py +0 -1
  316. claude_mpm/services/socketio/handlers/registry.py +37 -19
  317. claude_mpm/services/socketio/migration_utils.py +98 -84
  318. claude_mpm/services/socketio/server/__init__.py +1 -1
  319. claude_mpm/services/socketio/server/broadcaster.py +81 -87
  320. claude_mpm/services/socketio/server/core.py +65 -54
  321. claude_mpm/services/socketio/server/eventbus_integration.py +95 -56
  322. claude_mpm/services/socketio/server/main.py +64 -38
  323. claude_mpm/services/socketio_client_manager.py +10 -12
  324. claude_mpm/services/subprocess_launcher_service.py +4 -7
  325. claude_mpm/services/system_instructions_service.py +13 -14
  326. claude_mpm/services/ticket_manager.py +2 -2
  327. claude_mpm/services/utility_service.py +5 -13
  328. claude_mpm/services/version_control/__init__.py +16 -16
  329. claude_mpm/services/version_control/branch_strategy.py +5 -8
  330. claude_mpm/services/version_control/conflict_resolution.py +9 -23
  331. claude_mpm/services/version_control/git_operations.py +5 -7
  332. claude_mpm/services/version_control/semantic_versioning.py +16 -17
  333. claude_mpm/services/version_control/version_parser.py +13 -18
  334. claude_mpm/services/version_service.py +10 -11
  335. claude_mpm/storage/__init__.py +1 -1
  336. claude_mpm/storage/state_storage.py +22 -28
  337. claude_mpm/utils/__init__.py +6 -6
  338. claude_mpm/utils/agent_dependency_loader.py +47 -33
  339. claude_mpm/utils/config_manager.py +11 -14
  340. claude_mpm/utils/dependency_cache.py +1 -1
  341. claude_mpm/utils/dependency_manager.py +13 -17
  342. claude_mpm/utils/dependency_strategies.py +8 -10
  343. claude_mpm/utils/environment_context.py +3 -9
  344. claude_mpm/utils/error_handler.py +3 -13
  345. claude_mpm/utils/file_utils.py +1 -1
  346. claude_mpm/utils/path_operations.py +8 -12
  347. claude_mpm/utils/robust_installer.py +110 -33
  348. claude_mpm/utils/subprocess_utils.py +5 -6
  349. claude_mpm/validation/agent_validator.py +3 -6
  350. claude_mpm/validation/frontmatter_validator.py +1 -1
  351. {claude_mpm-4.1.1.dist-info → claude_mpm-4.1.2.dist-info}/METADATA +1 -1
  352. claude_mpm-4.1.2.dist-info/RECORD +498 -0
  353. claude_mpm-4.1.1.dist-info/RECORD +0 -494
  354. {claude_mpm-4.1.1.dist-info → claude_mpm-4.1.2.dist-info}/WHEEL +0 -0
  355. {claude_mpm-4.1.1.dist-info → claude_mpm-4.1.2.dist-info}/entry_points.txt +0 -0
  356. {claude_mpm-4.1.1.dist-info → claude_mpm-4.1.2.dist-info}/licenses/LICENSE +0 -0
  357. {claude_mpm-4.1.1.dist-info → claude_mpm-4.1.2.dist-info}/top_level.txt +0 -0
@@ -95,7 +95,7 @@ class DeploymentManager:
95
95
 
96
96
  # Check if file exists and compare versions
97
97
  if target_file.exists() and not force:
98
- with open(target_file, "r") as f:
98
+ with open(target_file) as f:
99
99
  existing_content = f.read()
100
100
  existing_fw_ver = self.version_manager.parse_current_version(
101
101
  existing_content
@@ -119,7 +119,7 @@ class DeploymentManager:
119
119
 
120
120
  return True, f"Successfully deployed version {version_str}"
121
121
  except Exception as e:
122
- return False, f"Deployment failed: {str(e)}"
122
+ return False, f"Deployment failed: {e!s}"
123
123
 
124
124
  def check_deployment_needed(self, parent_path: Path) -> Tuple[bool, str]:
125
125
  """
@@ -137,7 +137,7 @@ class DeploymentManager:
137
137
  return True, f"{self.target_filename} does not exist"
138
138
 
139
139
  try:
140
- with open(target_file, "r") as f:
140
+ with open(target_file) as f:
141
141
  existing_content = f.read()
142
142
  existing_fw_ver = self.version_manager.parse_current_version(
143
143
  existing_content
@@ -151,7 +151,7 @@ class DeploymentManager:
151
151
 
152
152
  return False, "Already up to date"
153
153
  except Exception as e:
154
- return True, f"Error checking existing file: {str(e)}"
154
+ return True, f"Error checking existing file: {e!s}"
155
155
 
156
156
  def backup_existing(self, parent_path: Path) -> Optional[Path]:
157
157
  """
@@ -32,7 +32,6 @@ class BaseSectionGenerator(ABC):
32
32
  Returns:
33
33
  str: Generated section content
34
34
  """
35
- pass
36
35
 
37
36
  def get_timestamp(self) -> str:
38
37
  """Get current UTC timestamp."""
@@ -1,5 +1,3 @@
1
- from pathlib import Path
2
-
3
1
  """
4
2
  Agents section generator for framework CLAUDE.md.
5
3
 
@@ -7,7 +7,7 @@ Handles version parsing, incrementing, and comparison operations.
7
7
  """
8
8
 
9
9
  import re
10
- from typing import Optional, Tuple
10
+ from typing import Optional
11
11
 
12
12
 
13
13
  class VersionManager:
@@ -38,7 +38,7 @@ class VersionManager:
38
38
  version_path = package_path.parent / "framework" / "VERSION"
39
39
 
40
40
  if version_path.exists():
41
- with open(version_path, "r") as f:
41
+ with open(version_path) as f:
42
42
  version_content = f.read().strip()
43
43
  # Framework VERSION file contains just the framework version number
44
44
  try:
@@ -117,7 +117,6 @@ class VersionManager:
117
117
 
118
118
  if v1 < v2:
119
119
  return -1
120
- elif v1 > v2:
120
+ if v1 > v2:
121
121
  return 1
122
- else:
123
- return 0
122
+ return 0
@@ -12,17 +12,15 @@ rather than a single list with type checking because:
12
12
  """
13
13
 
14
14
  import time
15
- from datetime import datetime
16
15
  from typing import Any, Dict, List, Optional
17
16
 
18
17
  from claude_mpm.core.config import Config
19
18
  from claude_mpm.core.interfaces import HookServiceInterface
20
- from claude_mpm.core.logging_config import get_logger, log_operation
19
+ from claude_mpm.core.logging_config import get_logger
21
20
  from claude_mpm.hooks.base_hook import (
22
21
  BaseHook,
23
22
  HookContext,
24
23
  HookResult,
25
- HookType,
26
24
  PostDelegationHook,
27
25
  PreDelegationHook,
28
26
  )
@@ -83,7 +81,7 @@ class HookService(HookServiceInterface):
83
81
  )
84
82
  return True
85
83
 
86
- elif isinstance(hook, PostDelegationHook):
84
+ if isinstance(hook, PostDelegationHook):
87
85
  self.post_delegation_hooks.append(hook)
88
86
  # Sort by priority
89
87
  self.post_delegation_hooks.sort(key=lambda h: h.priority)
@@ -92,11 +90,10 @@ class HookService(HookServiceInterface):
92
90
  )
93
91
  return True
94
92
 
95
- else:
96
- self.logger.warning(
97
- f"Attempted to register unsupported hook type: {type(hook).__name__}"
98
- )
99
- return False
93
+ self.logger.warning(
94
+ f"Attempted to register unsupported hook type: {type(hook).__name__}"
95
+ )
96
+ return False
100
97
 
101
98
  except Exception as e:
102
99
  self.logger.error(f"Failed to register hook {hook.name}: {e}")
@@ -19,8 +19,8 @@ from .memory_guardian import MemoryGuardian
19
19
  from .monitoring import AdvancedHealthMonitor
20
20
 
21
21
  __all__ = [
22
- "LoggingService",
23
22
  "AdvancedHealthMonitor", # For SocketIO server monitoring
24
23
  "HealthMonitor", # For Memory Guardian system monitoring
24
+ "LoggingService",
25
25
  "MemoryGuardian",
26
26
  ]
@@ -14,14 +14,12 @@ Design Principles:
14
14
 
15
15
  import gzip
16
16
  import json
17
- import os
18
17
  import shutil
19
- import tempfile
20
- from datetime import datetime, timedelta
21
- from typing import Any, Dict, Iterator, List, Optional, Tuple
18
+ from dataclasses import dataclass, field
19
+ from datetime import datetime
20
+ from typing import Any, Dict, List, Optional
22
21
 
23
22
  import ijson # For streaming JSON parsing
24
- from dataclasses import dataclass, field
25
23
 
26
24
  from claude_mpm.services.core.base import BaseService
27
25
 
@@ -136,8 +134,7 @@ class ContextPreservationService(BaseService):
136
134
  if file_size_mb > self.large_file_threshold_mb:
137
135
  self.log_info("Using streaming parser for large file")
138
136
  return await self._parse_large_claude_json(extract_full)
139
- else:
140
- return await self._parse_standard_claude_json(extract_full)
137
+ return await self._parse_standard_claude_json(extract_full)
141
138
 
142
139
  except Exception as e:
143
140
  self.log_error(f"Failed to parse Claude JSON: {e}")
@@ -158,7 +155,6 @@ class ContextPreservationService(BaseService):
158
155
  parser = ijson.parse(f)
159
156
 
160
157
  active_conv_id = None
161
- in_conversations = False
162
158
  current_conv = {}
163
159
 
164
160
  for prefix, event, value in parser:
@@ -169,7 +165,7 @@ class ContextPreservationService(BaseService):
169
165
  # Parse conversations array
170
166
  elif prefix.startswith("conversations.item"):
171
167
  if event == "map_key":
172
- current_key = value
168
+ pass
173
169
  elif (
174
170
  active_conv_id and current_conv.get("id") == active_conv_id
175
171
  ):
@@ -204,12 +200,12 @@ class ContextPreservationService(BaseService):
204
200
  self.log_info(f"Compressing conversation history: {file_size_mb:.2f}MB")
205
201
 
206
202
  # Create backup first
207
- backup_path = await self._create_backup()
203
+ await self._create_backup()
208
204
 
209
205
  # Load and filter conversations
210
206
  cutoff_time = datetime.now().timestamp() - (keep_recent_days * 86400)
211
207
 
212
- with open(self.claude_json_path, "r") as f:
208
+ with open(self.claude_json_path) as f:
213
209
  data = json.load(f)
214
210
 
215
211
  original_count = len(data.get("conversations", []))
@@ -341,7 +337,7 @@ class ContextPreservationService(BaseService):
341
337
  ) -> ConversationState:
342
338
  """Parse Claude JSON using standard JSON parser."""
343
339
  try:
344
- with open(self.claude_json_path, "r") as f:
340
+ with open(self.claude_json_path) as f:
345
341
  data = json.load(f)
346
342
 
347
343
  return await self._extract_conversation_state(data, extract_full)
@@ -15,9 +15,9 @@ Design Principles:
15
15
  """
16
16
 
17
17
  import asyncio
18
+ import contextlib
18
19
  import logging
19
20
  import socket
20
- import threading
21
21
  import time
22
22
  from abc import ABC, abstractmethod
23
23
  from collections import deque
@@ -120,12 +120,10 @@ class HealthChecker(ABC):
120
120
  @abstractmethod
121
121
  def get_name(self) -> str:
122
122
  """Get the name of this health checker."""
123
- pass
124
123
 
125
124
  @abstractmethod
126
125
  async def check_health(self) -> List[HealthMetric]:
127
126
  """Perform health check and return metrics."""
128
- pass
129
127
 
130
128
 
131
129
  class ProcessResourceChecker(HealthChecker):
@@ -220,9 +218,11 @@ class ProcessResourceChecker(HealthChecker):
220
218
  HealthMetric(
221
219
  name="process_status",
222
220
  value=status,
223
- status=HealthStatus.HEALTHY
224
- if process_healthy
225
- else HealthStatus.CRITICAL,
221
+ status=(
222
+ HealthStatus.HEALTHY
223
+ if process_healthy
224
+ else HealthStatus.CRITICAL
225
+ ),
226
226
  message=f"Process status: {status}",
227
227
  )
228
228
  )
@@ -612,9 +612,9 @@ class ServiceHealthChecker(HealthChecker):
612
612
  HealthMetric(
613
613
  name="total_errors",
614
614
  value=errors,
615
- status=HealthStatus.HEALTHY
616
- if errors == 0
617
- else HealthStatus.WARNING,
615
+ status=(
616
+ HealthStatus.HEALTHY if errors == 0 else HealthStatus.WARNING
617
+ ),
618
618
  )
619
619
  )
620
620
  except Exception as e:
@@ -843,7 +843,7 @@ class AdvancedHealthMonitor:
843
843
  return HealthStatus.UNKNOWN
844
844
 
845
845
  # Count metrics by status
846
- status_counts = {status: 0 for status in HealthStatus}
846
+ status_counts = dict.fromkeys(HealthStatus, 0)
847
847
  for metric in metrics:
848
848
  status_counts[metric.status] += 1
849
849
 
@@ -890,10 +890,8 @@ class AdvancedHealthMonitor:
890
890
  self.monitoring = False
891
891
  if self.monitor_task:
892
892
  self.monitor_task.cancel()
893
- try:
893
+ with contextlib.suppress(asyncio.CancelledError):
894
894
  await self.monitor_task
895
- except asyncio.CancelledError:
896
- pass
897
895
  self.monitor_task = None
898
896
 
899
897
  self.logger.info("Stopped health monitoring")
@@ -966,7 +964,7 @@ class AdvancedHealthMonitor:
966
964
  }
967
965
 
968
966
  # Aggregate statistics
969
- status_counts = {status: 0 for status in HealthStatus}
967
+ status_counts = dict.fromkeys(HealthStatus, 0)
970
968
  total_metrics = 0
971
969
  total_errors = 0
972
970
  total_duration_ms = 0
@@ -1019,18 +1017,18 @@ class AdvancedHealthMonitor:
1019
1017
  "callbacks_count": len(self.health_callbacks),
1020
1018
  },
1021
1019
  "checkers": [checker.get_name() for checker in self.checkers],
1022
- "current_status": self.last_check_result.to_dict()
1023
- if self.last_check_result
1024
- else None,
1020
+ "current_status": (
1021
+ self.last_check_result.to_dict() if self.last_check_result else None
1022
+ ),
1025
1023
  "aggregated_status": self.get_aggregated_status(),
1026
1024
  "monitoring_stats": dict(self.monitoring_stats),
1027
1025
  "history_summary": {
1028
1026
  "total_checks": len(self.health_history),
1029
- "oldest_check": self.health_history[0].timestamp
1030
- if self.health_history
1031
- else None,
1032
- "newest_check": self.health_history[-1].timestamp
1033
- if self.health_history
1034
- else None,
1027
+ "oldest_check": (
1028
+ self.health_history[0].timestamp if self.health_history else None
1029
+ ),
1030
+ "newest_check": (
1031
+ self.health_history[-1].timestamp if self.health_history else None
1032
+ ),
1035
1033
  },
1036
1034
  }
@@ -34,89 +34,89 @@ def __getattr__(name):
34
34
  from .core.interfaces import IMCPGateway
35
35
 
36
36
  return IMCPGateway
37
- elif name == "IMCPToolRegistry":
37
+ if name == "IMCPToolRegistry":
38
38
  from .core.interfaces import IMCPToolRegistry
39
39
 
40
40
  return IMCPToolRegistry
41
- elif name == "IMCPConfiguration":
41
+ if name == "IMCPConfiguration":
42
42
  from .core.interfaces import IMCPConfiguration
43
43
 
44
44
  return IMCPConfiguration
45
- elif name == "IMCPToolAdapter":
45
+ if name == "IMCPToolAdapter":
46
46
  from .core.interfaces import IMCPToolAdapter
47
47
 
48
48
  return IMCPToolAdapter
49
- elif name == "BaseMCPService":
49
+ if name == "BaseMCPService":
50
50
  from .core.base import BaseMCPService
51
51
 
52
52
  return BaseMCPService
53
53
 
54
54
  # Gateway implementations
55
- elif name == "MCPGateway":
55
+ if name == "MCPGateway":
56
56
  from .server.mcp_gateway import MCPGateway
57
57
 
58
58
  return MCPGateway
59
- elif name == "StdioHandler":
59
+ if name == "StdioHandler":
60
60
  from .server.stdio_handler import StdioHandler
61
61
 
62
62
  return StdioHandler
63
- elif name == "AlternativeStdioHandler":
63
+ if name == "AlternativeStdioHandler":
64
64
  from .server.stdio_handler import AlternativeStdioHandler
65
65
 
66
66
  return AlternativeStdioHandler
67
67
 
68
68
  # Tool registry and adapters
69
- elif name == "ToolRegistry":
69
+ if name == "ToolRegistry":
70
70
  from .registry.tool_registry import ToolRegistry
71
71
 
72
72
  return ToolRegistry
73
- elif name == "BaseToolAdapter":
73
+ if name == "BaseToolAdapter":
74
74
  from .tools.base_adapter import BaseToolAdapter
75
75
 
76
76
  return BaseToolAdapter
77
- elif name == "EchoToolAdapter":
77
+ if name == "EchoToolAdapter":
78
78
  from .tools.base_adapter import EchoToolAdapter
79
79
 
80
80
  return EchoToolAdapter
81
- elif name == "CalculatorToolAdapter":
81
+ if name == "CalculatorToolAdapter":
82
82
  from .tools.base_adapter import CalculatorToolAdapter
83
83
 
84
84
  return CalculatorToolAdapter
85
- elif name == "SystemInfoToolAdapter":
85
+ if name == "SystemInfoToolAdapter":
86
86
  from .tools.base_adapter import SystemInfoToolAdapter
87
87
 
88
88
  return SystemInfoToolAdapter
89
89
 
90
90
  # Configuration management
91
- elif name == "MCPConfiguration":
91
+ if name == "MCPConfiguration":
92
92
  from .config.configuration import MCPConfiguration
93
93
 
94
94
  return MCPConfiguration
95
- elif name == "MCPConfigLoader":
95
+ if name == "MCPConfigLoader":
96
96
  from .config.config_loader import MCPConfigLoader
97
97
 
98
98
  return MCPConfigLoader
99
99
 
100
100
  # Service registry
101
- elif name == "MCPServiceRegistry":
101
+ if name == "MCPServiceRegistry":
102
102
  from .registry.service_registry import MCPServiceRegistry
103
103
 
104
104
  return MCPServiceRegistry
105
105
 
106
106
  # Exceptions
107
- elif name == "MCPException":
107
+ if name == "MCPException":
108
108
  from .core.exceptions import MCPException
109
109
 
110
110
  return MCPException
111
- elif name == "MCPConfigurationError":
111
+ if name == "MCPConfigurationError":
112
112
  from .core.exceptions import MCPConfigurationError
113
113
 
114
114
  return MCPConfigurationError
115
- elif name == "MCPToolNotFoundError":
115
+ if name == "MCPToolNotFoundError":
116
116
  from .core.exceptions import MCPToolNotFoundError
117
117
 
118
118
  return MCPToolNotFoundError
119
- elif name == "MCPServerError":
119
+ if name == "MCPServerError":
120
120
  from .core.exceptions import MCPServerError
121
121
 
122
122
  return MCPServerError
@@ -126,30 +126,30 @@ def __getattr__(name):
126
126
 
127
127
  # Public API exports
128
128
  __all__ = [
129
- # Core interfaces
130
- "IMCPGateway",
131
- "IMCPToolRegistry",
132
- "IMCPConfiguration",
133
- "IMCPToolAdapter",
134
- "BaseMCPService",
135
- # Gateway implementations
136
- "MCPGateway",
137
- "StdioHandler",
138
129
  "AlternativeStdioHandler",
139
- # Tool management
140
- "ToolRegistry",
130
+ "BaseMCPService",
141
131
  "BaseToolAdapter",
142
- "EchoToolAdapter",
143
132
  "CalculatorToolAdapter",
144
- "SystemInfoToolAdapter",
133
+ "EchoToolAdapter",
134
+ "IMCPConfiguration",
135
+ # Core interfaces
136
+ "IMCPGateway",
137
+ "IMCPToolAdapter",
138
+ "IMCPToolRegistry",
139
+ "MCPConfigLoader",
145
140
  # Configuration
146
141
  "MCPConfiguration",
147
- "MCPConfigLoader",
148
- # Service registry
149
- "MCPServiceRegistry",
142
+ "MCPConfigurationError",
150
143
  # Exceptions
151
144
  "MCPException",
152
- "MCPConfigurationError",
153
- "MCPToolNotFoundError",
145
+ # Gateway implementations
146
+ "MCPGateway",
154
147
  "MCPServerError",
148
+ # Service registry
149
+ "MCPServiceRegistry",
150
+ "MCPToolNotFoundError",
151
+ "StdioHandler",
152
+ "SystemInfoToolAdapter",
153
+ # Tool management
154
+ "ToolRegistry",
155
155
  ]