claude-mpm 4.1.0__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 (358) 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 +133 -58
  21. claude_mpm/agents/templates/web_ui.json +3 -3
  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 +271 -268
  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 +192 -141
  39. claude_mpm/cli/commands/monitor.py +117 -88
  40. claude_mpm/cli/commands/run.py +120 -84
  41. claude_mpm/cli/commands/run_config_checker.py +4 -5
  42. claude_mpm/cli/commands/socketio_monitor.py +17 -19
  43. claude_mpm/cli/commands/tickets.py +92 -92
  44. claude_mpm/cli/parser.py +1 -5
  45. claude_mpm/cli/parsers/__init__.py +1 -1
  46. claude_mpm/cli/parsers/agent_manager_parser.py +50 -98
  47. claude_mpm/cli/parsers/agents_parser.py +2 -3
  48. claude_mpm/cli/parsers/base_parser.py +7 -5
  49. claude_mpm/cli/parsers/mcp_parser.py +4 -2
  50. claude_mpm/cli/parsers/monitor_parser.py +26 -18
  51. claude_mpm/cli/shared/__init__.py +10 -10
  52. claude_mpm/cli/shared/argument_patterns.py +57 -71
  53. claude_mpm/cli/shared/base_command.py +61 -53
  54. claude_mpm/cli/shared/error_handling.py +62 -58
  55. claude_mpm/cli/shared/output_formatters.py +78 -77
  56. claude_mpm/cli/startup_logging.py +204 -172
  57. claude_mpm/cli/utils.py +10 -11
  58. claude_mpm/cli_module/__init__.py +1 -1
  59. claude_mpm/cli_module/args.py +1 -1
  60. claude_mpm/cli_module/migration_example.py +5 -5
  61. claude_mpm/config/__init__.py +9 -9
  62. claude_mpm/config/agent_config.py +15 -14
  63. claude_mpm/config/experimental_features.py +4 -4
  64. claude_mpm/config/paths.py +0 -1
  65. claude_mpm/config/socketio_config.py +5 -6
  66. claude_mpm/constants.py +1 -2
  67. claude_mpm/core/__init__.py +8 -8
  68. claude_mpm/core/agent_name_normalizer.py +1 -1
  69. claude_mpm/core/agent_registry.py +20 -23
  70. claude_mpm/core/agent_session_manager.py +3 -3
  71. claude_mpm/core/base_service.py +7 -15
  72. claude_mpm/core/cache.py +4 -6
  73. claude_mpm/core/claude_runner.py +85 -113
  74. claude_mpm/core/config.py +43 -28
  75. claude_mpm/core/config_aliases.py +0 -9
  76. claude_mpm/core/config_constants.py +52 -30
  77. claude_mpm/core/constants.py +0 -1
  78. claude_mpm/core/container.py +18 -27
  79. claude_mpm/core/exceptions.py +2 -2
  80. claude_mpm/core/factories.py +10 -12
  81. claude_mpm/core/framework_loader.py +581 -280
  82. claude_mpm/core/hook_manager.py +26 -22
  83. claude_mpm/core/hook_performance_config.py +58 -47
  84. claude_mpm/core/injectable_service.py +1 -1
  85. claude_mpm/core/interactive_session.py +61 -152
  86. claude_mpm/core/interfaces.py +1 -100
  87. claude_mpm/core/lazy.py +5 -5
  88. claude_mpm/core/log_manager.py +587 -0
  89. claude_mpm/core/logger.py +125 -8
  90. claude_mpm/core/logging_config.py +15 -15
  91. claude_mpm/core/minimal_framework_loader.py +5 -8
  92. claude_mpm/core/oneshot_session.py +15 -33
  93. claude_mpm/core/optimized_agent_loader.py +4 -6
  94. claude_mpm/core/optimized_startup.py +2 -1
  95. claude_mpm/core/output_style_manager.py +147 -106
  96. claude_mpm/core/pm_hook_interceptor.py +0 -1
  97. claude_mpm/core/service_registry.py +11 -8
  98. claude_mpm/core/session_manager.py +1 -2
  99. claude_mpm/core/shared/__init__.py +1 -1
  100. claude_mpm/core/shared/config_loader.py +101 -97
  101. claude_mpm/core/shared/path_resolver.py +72 -68
  102. claude_mpm/core/shared/singleton_manager.py +56 -50
  103. claude_mpm/core/socketio_pool.py +26 -6
  104. claude_mpm/core/tool_access_control.py +4 -5
  105. claude_mpm/core/typing_utils.py +50 -59
  106. claude_mpm/core/unified_agent_registry.py +14 -19
  107. claude_mpm/core/unified_config.py +4 -6
  108. claude_mpm/core/unified_paths.py +197 -109
  109. claude_mpm/dashboard/open_dashboard.py +2 -4
  110. claude_mpm/experimental/cli_enhancements.py +51 -36
  111. claude_mpm/generators/agent_profile_generator.py +2 -4
  112. claude_mpm/hooks/base_hook.py +1 -2
  113. claude_mpm/hooks/claude_hooks/connection_pool.py +72 -26
  114. claude_mpm/hooks/claude_hooks/event_handlers.py +93 -38
  115. claude_mpm/hooks/claude_hooks/hook_handler.py +130 -76
  116. claude_mpm/hooks/claude_hooks/hook_handler_eventbus.py +104 -77
  117. claude_mpm/hooks/claude_hooks/memory_integration.py +2 -4
  118. claude_mpm/hooks/claude_hooks/response_tracking.py +15 -11
  119. claude_mpm/hooks/claude_hooks/tool_analysis.py +12 -18
  120. claude_mpm/hooks/memory_integration_hook.py +5 -5
  121. claude_mpm/hooks/tool_call_interceptor.py +1 -1
  122. claude_mpm/hooks/validation_hooks.py +4 -4
  123. claude_mpm/init.py +4 -9
  124. claude_mpm/models/__init__.py +2 -2
  125. claude_mpm/models/agent_session.py +11 -14
  126. claude_mpm/scripts/mcp_server.py +20 -11
  127. claude_mpm/scripts/mcp_wrapper.py +5 -5
  128. claude_mpm/scripts/mpm_doctor.py +321 -0
  129. claude_mpm/scripts/socketio_daemon.py +28 -25
  130. claude_mpm/scripts/socketio_daemon_hardened.py +298 -258
  131. claude_mpm/scripts/socketio_server_manager.py +116 -95
  132. claude_mpm/services/__init__.py +49 -49
  133. claude_mpm/services/agent_capabilities_service.py +12 -18
  134. claude_mpm/services/agents/__init__.py +22 -22
  135. claude_mpm/services/agents/agent_builder.py +140 -119
  136. claude_mpm/services/agents/deployment/__init__.py +3 -3
  137. claude_mpm/services/agents/deployment/agent_config_provider.py +9 -9
  138. claude_mpm/services/agents/deployment/agent_configuration_manager.py +19 -20
  139. claude_mpm/services/agents/deployment/agent_definition_factory.py +1 -5
  140. claude_mpm/services/agents/deployment/agent_deployment.py +136 -106
  141. claude_mpm/services/agents/deployment/agent_discovery_service.py +4 -8
  142. claude_mpm/services/agents/deployment/agent_environment_manager.py +2 -7
  143. claude_mpm/services/agents/deployment/agent_filesystem_manager.py +6 -10
  144. claude_mpm/services/agents/deployment/agent_format_converter.py +11 -15
  145. claude_mpm/services/agents/deployment/agent_frontmatter_validator.py +2 -3
  146. claude_mpm/services/agents/deployment/agent_lifecycle_manager.py +5 -5
  147. claude_mpm/services/agents/deployment/agent_metrics_collector.py +13 -19
  148. claude_mpm/services/agents/deployment/agent_restore_handler.py +0 -1
  149. claude_mpm/services/agents/deployment/agent_template_builder.py +26 -35
  150. claude_mpm/services/agents/deployment/agent_validator.py +0 -1
  151. claude_mpm/services/agents/deployment/agent_version_manager.py +7 -9
  152. claude_mpm/services/agents/deployment/agent_versioning.py +3 -3
  153. claude_mpm/services/agents/deployment/agents_directory_resolver.py +6 -7
  154. claude_mpm/services/agents/deployment/async_agent_deployment.py +51 -38
  155. claude_mpm/services/agents/deployment/config/__init__.py +1 -1
  156. claude_mpm/services/agents/deployment/config/deployment_config.py +7 -8
  157. claude_mpm/services/agents/deployment/deployment_type_detector.py +1 -1
  158. claude_mpm/services/agents/deployment/deployment_wrapper.py +18 -18
  159. claude_mpm/services/agents/deployment/facade/__init__.py +1 -1
  160. claude_mpm/services/agents/deployment/facade/deployment_executor.py +0 -3
  161. claude_mpm/services/agents/deployment/facade/deployment_facade.py +3 -4
  162. claude_mpm/services/agents/deployment/interface_adapter.py +5 -7
  163. claude_mpm/services/agents/deployment/multi_source_deployment_service.py +345 -276
  164. claude_mpm/services/agents/deployment/pipeline/__init__.py +2 -2
  165. claude_mpm/services/agents/deployment/pipeline/pipeline_builder.py +1 -1
  166. claude_mpm/services/agents/deployment/pipeline/pipeline_context.py +6 -4
  167. claude_mpm/services/agents/deployment/pipeline/pipeline_executor.py +3 -3
  168. claude_mpm/services/agents/deployment/pipeline/steps/__init__.py +2 -2
  169. claude_mpm/services/agents/deployment/pipeline/steps/agent_processing_step.py +14 -13
  170. claude_mpm/services/agents/deployment/pipeline/steps/base_step.py +0 -1
  171. claude_mpm/services/agents/deployment/pipeline/steps/configuration_step.py +1 -1
  172. claude_mpm/services/agents/deployment/pipeline/steps/target_directory_step.py +8 -9
  173. claude_mpm/services/agents/deployment/pipeline/steps/validation_step.py +1 -1
  174. claude_mpm/services/agents/deployment/processors/__init__.py +1 -1
  175. claude_mpm/services/agents/deployment/processors/agent_processor.py +20 -16
  176. claude_mpm/services/agents/deployment/refactored_agent_deployment_service.py +5 -12
  177. claude_mpm/services/agents/deployment/results/__init__.py +1 -1
  178. claude_mpm/services/agents/deployment/results/deployment_result_builder.py +1 -1
  179. claude_mpm/services/agents/deployment/strategies/__init__.py +2 -2
  180. claude_mpm/services/agents/deployment/strategies/base_strategy.py +1 -7
  181. claude_mpm/services/agents/deployment/strategies/project_strategy.py +1 -4
  182. claude_mpm/services/agents/deployment/strategies/system_strategy.py +2 -3
  183. claude_mpm/services/agents/deployment/strategies/user_strategy.py +3 -7
  184. claude_mpm/services/agents/deployment/validation/__init__.py +1 -1
  185. claude_mpm/services/agents/deployment/validation/agent_validator.py +1 -1
  186. claude_mpm/services/agents/deployment/validation/template_validator.py +2 -2
  187. claude_mpm/services/agents/deployment/validation/validation_result.py +2 -6
  188. claude_mpm/services/agents/loading/__init__.py +1 -1
  189. claude_mpm/services/agents/loading/agent_profile_loader.py +6 -12
  190. claude_mpm/services/agents/loading/base_agent_manager.py +5 -5
  191. claude_mpm/services/agents/loading/framework_agent_loader.py +2 -4
  192. claude_mpm/services/agents/management/__init__.py +1 -1
  193. claude_mpm/services/agents/management/agent_capabilities_generator.py +1 -3
  194. claude_mpm/services/agents/management/agent_management_service.py +5 -9
  195. claude_mpm/services/agents/memory/__init__.py +4 -4
  196. claude_mpm/services/agents/memory/agent_memory_manager.py +280 -160
  197. claude_mpm/services/agents/memory/agent_persistence_service.py +0 -2
  198. claude_mpm/services/agents/memory/content_manager.py +44 -38
  199. claude_mpm/services/agents/memory/template_generator.py +4 -6
  200. claude_mpm/services/agents/registry/__init__.py +10 -6
  201. claude_mpm/services/agents/registry/deployed_agent_discovery.py +30 -27
  202. claude_mpm/services/agents/registry/modification_tracker.py +3 -6
  203. claude_mpm/services/async_session_logger.py +1 -2
  204. claude_mpm/services/claude_session_logger.py +1 -2
  205. claude_mpm/services/command_deployment_service.py +173 -0
  206. claude_mpm/services/command_handler_service.py +20 -22
  207. claude_mpm/services/core/__init__.py +25 -25
  208. claude_mpm/services/core/base.py +0 -5
  209. claude_mpm/services/core/interfaces/__init__.py +32 -32
  210. claude_mpm/services/core/interfaces/agent.py +0 -21
  211. claude_mpm/services/core/interfaces/communication.py +0 -27
  212. claude_mpm/services/core/interfaces/infrastructure.py +0 -56
  213. claude_mpm/services/core/interfaces/service.py +0 -29
  214. claude_mpm/services/diagnostics/__init__.py +1 -1
  215. claude_mpm/services/diagnostics/checks/__init__.py +6 -6
  216. claude_mpm/services/diagnostics/checks/agent_check.py +89 -80
  217. claude_mpm/services/diagnostics/checks/base_check.py +12 -16
  218. claude_mpm/services/diagnostics/checks/claude_desktop_check.py +84 -81
  219. claude_mpm/services/diagnostics/checks/common_issues_check.py +99 -91
  220. claude_mpm/services/diagnostics/checks/configuration_check.py +82 -77
  221. claude_mpm/services/diagnostics/checks/filesystem_check.py +67 -68
  222. claude_mpm/services/diagnostics/checks/installation_check.py +254 -94
  223. claude_mpm/services/diagnostics/checks/mcp_check.py +90 -88
  224. claude_mpm/services/diagnostics/checks/monitor_check.py +75 -76
  225. claude_mpm/services/diagnostics/checks/startup_log_check.py +67 -73
  226. claude_mpm/services/diagnostics/diagnostic_runner.py +67 -59
  227. claude_mpm/services/diagnostics/doctor_reporter.py +107 -70
  228. claude_mpm/services/diagnostics/models.py +21 -19
  229. claude_mpm/services/event_aggregator.py +10 -17
  230. claude_mpm/services/event_bus/__init__.py +1 -1
  231. claude_mpm/services/event_bus/config.py +54 -35
  232. claude_mpm/services/event_bus/event_bus.py +76 -71
  233. claude_mpm/services/event_bus/relay.py +74 -64
  234. claude_mpm/services/events/__init__.py +11 -11
  235. claude_mpm/services/events/consumers/__init__.py +3 -3
  236. claude_mpm/services/events/consumers/dead_letter.py +71 -63
  237. claude_mpm/services/events/consumers/logging.py +39 -37
  238. claude_mpm/services/events/consumers/metrics.py +56 -57
  239. claude_mpm/services/events/consumers/socketio.py +82 -81
  240. claude_mpm/services/events/core.py +110 -99
  241. claude_mpm/services/events/interfaces.py +56 -72
  242. claude_mpm/services/events/producers/__init__.py +1 -1
  243. claude_mpm/services/events/producers/hook.py +38 -38
  244. claude_mpm/services/events/producers/system.py +46 -44
  245. claude_mpm/services/exceptions.py +81 -80
  246. claude_mpm/services/framework_claude_md_generator/__init__.py +2 -4
  247. claude_mpm/services/framework_claude_md_generator/content_assembler.py +3 -5
  248. claude_mpm/services/framework_claude_md_generator/content_validator.py +1 -1
  249. claude_mpm/services/framework_claude_md_generator/deployment_manager.py +4 -4
  250. claude_mpm/services/framework_claude_md_generator/section_generators/__init__.py +0 -1
  251. claude_mpm/services/framework_claude_md_generator/section_generators/agents.py +0 -2
  252. claude_mpm/services/framework_claude_md_generator/version_manager.py +4 -5
  253. claude_mpm/services/hook_service.py +6 -9
  254. claude_mpm/services/infrastructure/__init__.py +1 -1
  255. claude_mpm/services/infrastructure/context_preservation.py +8 -12
  256. claude_mpm/services/infrastructure/monitoring.py +21 -23
  257. claude_mpm/services/mcp_gateway/__init__.py +37 -37
  258. claude_mpm/services/mcp_gateway/auto_configure.py +95 -103
  259. claude_mpm/services/mcp_gateway/config/__init__.py +1 -1
  260. claude_mpm/services/mcp_gateway/config/config_loader.py +23 -25
  261. claude_mpm/services/mcp_gateway/config/config_schema.py +5 -5
  262. claude_mpm/services/mcp_gateway/config/configuration.py +9 -6
  263. claude_mpm/services/mcp_gateway/core/__init__.py +10 -10
  264. claude_mpm/services/mcp_gateway/core/base.py +0 -3
  265. claude_mpm/services/mcp_gateway/core/interfaces.py +1 -38
  266. claude_mpm/services/mcp_gateway/core/process_pool.py +99 -93
  267. claude_mpm/services/mcp_gateway/core/singleton_manager.py +65 -62
  268. claude_mpm/services/mcp_gateway/core/startup_verification.py +75 -74
  269. claude_mpm/services/mcp_gateway/main.py +2 -1
  270. claude_mpm/services/mcp_gateway/registry/service_registry.py +5 -8
  271. claude_mpm/services/mcp_gateway/registry/tool_registry.py +1 -1
  272. claude_mpm/services/mcp_gateway/server/__init__.py +1 -1
  273. claude_mpm/services/mcp_gateway/server/mcp_gateway.py +12 -19
  274. claude_mpm/services/mcp_gateway/server/stdio_handler.py +4 -3
  275. claude_mpm/services/mcp_gateway/server/stdio_server.py +79 -71
  276. claude_mpm/services/mcp_gateway/tools/__init__.py +2 -2
  277. claude_mpm/services/mcp_gateway/tools/base_adapter.py +5 -6
  278. claude_mpm/services/mcp_gateway/tools/document_summarizer.py +13 -22
  279. claude_mpm/services/mcp_gateway/tools/health_check_tool.py +79 -78
  280. claude_mpm/services/mcp_gateway/tools/hello_world.py +12 -14
  281. claude_mpm/services/mcp_gateway/tools/ticket_tools.py +42 -49
  282. claude_mpm/services/mcp_gateway/tools/unified_ticket_tool.py +51 -55
  283. claude_mpm/services/memory/__init__.py +3 -3
  284. claude_mpm/services/memory/builder.py +3 -6
  285. claude_mpm/services/memory/cache/__init__.py +1 -1
  286. claude_mpm/services/memory/cache/shared_prompt_cache.py +3 -5
  287. claude_mpm/services/memory/cache/simple_cache.py +1 -1
  288. claude_mpm/services/memory/indexed_memory.py +5 -7
  289. claude_mpm/services/memory/optimizer.py +7 -10
  290. claude_mpm/services/memory/router.py +8 -9
  291. claude_mpm/services/memory_hook_service.py +48 -34
  292. claude_mpm/services/monitor_build_service.py +77 -73
  293. claude_mpm/services/port_manager.py +130 -108
  294. claude_mpm/services/project/analyzer.py +12 -10
  295. claude_mpm/services/project/registry.py +11 -11
  296. claude_mpm/services/recovery_manager.py +10 -19
  297. claude_mpm/services/response_tracker.py +0 -1
  298. claude_mpm/services/runner_configuration_service.py +19 -20
  299. claude_mpm/services/session_management_service.py +7 -11
  300. claude_mpm/services/shared/__init__.py +1 -1
  301. claude_mpm/services/shared/async_service_base.py +58 -50
  302. claude_mpm/services/shared/config_service_base.py +73 -67
  303. claude_mpm/services/shared/lifecycle_service_base.py +82 -78
  304. claude_mpm/services/shared/manager_base.py +94 -82
  305. claude_mpm/services/shared/service_factory.py +96 -98
  306. claude_mpm/services/socketio/__init__.py +3 -3
  307. claude_mpm/services/socketio/client_proxy.py +5 -5
  308. claude_mpm/services/socketio/event_normalizer.py +199 -181
  309. claude_mpm/services/socketio/handlers/__init__.py +3 -3
  310. claude_mpm/services/socketio/handlers/base.py +5 -4
  311. claude_mpm/services/socketio/handlers/connection.py +163 -136
  312. claude_mpm/services/socketio/handlers/file.py +13 -14
  313. claude_mpm/services/socketio/handlers/git.py +12 -7
  314. claude_mpm/services/socketio/handlers/hook.py +49 -44
  315. claude_mpm/services/socketio/handlers/memory.py +0 -1
  316. claude_mpm/services/socketio/handlers/project.py +0 -1
  317. claude_mpm/services/socketio/handlers/registry.py +37 -19
  318. claude_mpm/services/socketio/migration_utils.py +98 -84
  319. claude_mpm/services/socketio/server/__init__.py +1 -1
  320. claude_mpm/services/socketio/server/broadcaster.py +81 -87
  321. claude_mpm/services/socketio/server/core.py +65 -54
  322. claude_mpm/services/socketio/server/eventbus_integration.py +95 -56
  323. claude_mpm/services/socketio/server/main.py +64 -38
  324. claude_mpm/services/socketio_client_manager.py +10 -12
  325. claude_mpm/services/subprocess_launcher_service.py +4 -7
  326. claude_mpm/services/system_instructions_service.py +13 -14
  327. claude_mpm/services/ticket_manager.py +2 -2
  328. claude_mpm/services/utility_service.py +5 -13
  329. claude_mpm/services/version_control/__init__.py +16 -16
  330. claude_mpm/services/version_control/branch_strategy.py +5 -8
  331. claude_mpm/services/version_control/conflict_resolution.py +9 -23
  332. claude_mpm/services/version_control/git_operations.py +5 -7
  333. claude_mpm/services/version_control/semantic_versioning.py +16 -17
  334. claude_mpm/services/version_control/version_parser.py +13 -18
  335. claude_mpm/services/version_service.py +10 -11
  336. claude_mpm/storage/__init__.py +1 -1
  337. claude_mpm/storage/state_storage.py +22 -28
  338. claude_mpm/utils/__init__.py +6 -6
  339. claude_mpm/utils/agent_dependency_loader.py +47 -33
  340. claude_mpm/utils/config_manager.py +11 -14
  341. claude_mpm/utils/dependency_cache.py +1 -1
  342. claude_mpm/utils/dependency_manager.py +13 -17
  343. claude_mpm/utils/dependency_strategies.py +8 -10
  344. claude_mpm/utils/environment_context.py +3 -9
  345. claude_mpm/utils/error_handler.py +3 -13
  346. claude_mpm/utils/file_utils.py +1 -1
  347. claude_mpm/utils/path_operations.py +8 -12
  348. claude_mpm/utils/robust_installer.py +110 -33
  349. claude_mpm/utils/subprocess_utils.py +5 -6
  350. claude_mpm/validation/agent_validator.py +3 -6
  351. claude_mpm/validation/frontmatter_validator.py +1 -1
  352. {claude_mpm-4.1.0.dist-info → claude_mpm-4.1.2.dist-info}/METADATA +1 -1
  353. claude_mpm-4.1.2.dist-info/RECORD +498 -0
  354. claude_mpm-4.1.0.dist-info/RECORD +0 -494
  355. {claude_mpm-4.1.0.dist-info → claude_mpm-4.1.2.dist-info}/WHEEL +0 -0
  356. {claude_mpm-4.1.0.dist-info → claude_mpm-4.1.2.dist-info}/entry_points.txt +0 -0
  357. {claude_mpm-4.1.0.dist-info → claude_mpm-4.1.2.dist-info}/licenses/LICENSE +0 -0
  358. {claude_mpm-4.1.0.dist-info → claude_mpm-4.1.2.dist-info}/top_level.txt +0 -0
@@ -24,30 +24,35 @@ if tools_admin_dir.exists() and str(tools_admin_dir) not in sys.path:
24
24
 
25
25
  try:
26
26
  # Import ServerManager from the actual implementation
27
- from socketio_server_manager import ServerManager as BaseServerManager
28
27
  import subprocess
29
-
28
+
29
+ from socketio_server_manager import ServerManager as BaseServerManager
30
+
30
31
  # Patch the ServerManager to use project-local PID file and daemon
31
32
  class ServerManager(BaseServerManager):
32
33
  """Patched ServerManager that uses project-local PID file and daemon.
33
-
34
+
34
35
  WHY: The daemon stores its PID file in the project's .claude-mpm
35
36
  directory, not in the home directory. This patch ensures the
36
37
  ServerManager looks in the correct location and uses the daemon
37
38
  for starting servers when the standalone module is not available.
38
39
  """
39
-
40
+
40
41
  def __init__(self):
41
42
  super().__init__()
42
43
  # Override the daemon PID file path to use project root
43
44
  from claude_mpm.core.unified_paths import get_project_root
44
- self.daemon_pidfile_path = get_project_root() / ".claude-mpm" / "socketio-server.pid"
45
+
46
+ self.daemon_pidfile_path = (
47
+ get_project_root() / ".claude-mpm" / "socketio-server.pid"
48
+ )
45
49
  self.daemon_script = script_dir / "socketio_daemon.py"
46
-
47
- def start_server(self, port: int = None, host: str = "localhost",
48
- server_id: str = None) -> bool:
50
+
51
+ def start_server(
52
+ self, port: int = None, host: str = "localhost", server_id: str = None
53
+ ) -> bool:
49
54
  """Start Socket.IO server, preferring daemon over standalone.
50
-
55
+
51
56
  WHY: When the standalone_socketio_server module is not available,
52
57
  we fallback to using the daemon script which is always present.
53
58
  """
@@ -58,30 +63,36 @@ try:
58
63
  pid = int(f.read().strip())
59
64
  # Check if process is running
60
65
  import psutil
66
+
61
67
  process = psutil.Process(pid)
62
68
  if process.is_running():
63
- print(f"Socket.IO daemon server is already running (PID: {pid})")
69
+ print(
70
+ f"Socket.IO daemon server is already running (PID: {pid})"
71
+ )
64
72
  return True
65
73
  except:
66
74
  pass
67
-
75
+
68
76
  # Try to use the daemon script for starting
69
77
  if self.daemon_script.exists():
70
- print(f"Starting server on {host}:{port or self.base_port} using daemon...")
78
+ print(
79
+ f"Starting server on {host}:{port or self.base_port} using daemon..."
80
+ )
71
81
  try:
72
82
  result = subprocess.run(
73
83
  [sys.executable, str(self.daemon_script), "start"],
74
84
  capture_output=True,
75
- text=True
85
+ text=True,
86
+ check=False,
76
87
  )
77
-
88
+
78
89
  if result.returncode == 0:
79
90
  # Check if output contains success message
80
91
  if "started successfully" in result.stdout.lower():
81
92
  print(result.stdout)
82
93
  return True
83
94
  # Even if no explicit success message, check if process is running
84
- elif self.daemon_pidfile_path.exists():
95
+ if self.daemon_pidfile_path.exists():
85
96
  print("Socket.IO daemon server started")
86
97
  return True
87
98
  else:
@@ -91,44 +102,43 @@ try:
91
102
  print("Trying standalone method...")
92
103
  except Exception as e:
93
104
  print(f"Error running daemon: {e}")
94
- pass
95
-
105
+
96
106
  # Fall back to parent implementation
97
107
  return super().start_server(port=port, host=host, server_id=server_id)
98
-
108
+
99
109
  def stop_server(self, port: int = None) -> bool:
100
110
  """Stop Socket.IO server, handling daemon-style servers.
101
-
111
+
102
112
  WHY: The daemon server needs special handling for stopping.
103
113
  """
104
114
  # Check if daemon is running
105
115
  if self.daemon_pidfile_path.exists():
106
- print(f"🔄 Stopping daemon server", end="")
116
+ print("🔄 Stopping daemon server", end="")
107
117
  try:
108
118
  with open(self.daemon_pidfile_path) as f:
109
119
  pid = int(f.read().strip())
110
120
  print(f" (PID: {pid})...")
111
-
121
+
112
122
  result = subprocess.run(
113
123
  [sys.executable, str(self.daemon_script), "stop"],
114
124
  capture_output=True,
115
- text=True
125
+ text=True,
126
+ check=False,
116
127
  )
117
-
128
+
118
129
  if result.returncode == 0:
119
130
  print("✅ Daemon server stopped successfully")
120
131
  return True
121
- else:
122
- print(f"❌ Failed to stop daemon: {result.stderr}")
132
+ print(f"❌ Failed to stop daemon: {result.stderr}")
123
133
  except Exception as e:
124
134
  print(f"❌ Error stopping daemon: {e}")
125
-
135
+
126
136
  # Fall back to parent implementation for non-daemon servers
127
137
  return super().stop_server(port=port)
128
-
138
+
129
139
  def restart_server(self, port: int = None) -> bool:
130
140
  """Restart Socket.IO server, handling daemon-style servers.
131
-
141
+
132
142
  WHY: The daemon server needs special handling for restarting.
133
143
  """
134
144
  # Check if daemon is running
@@ -136,172 +146,180 @@ try:
136
146
  try:
137
147
  with open(self.daemon_pidfile_path) as f:
138
148
  pid = int(f.read().strip())
139
-
149
+
140
150
  print(f"🔄 Stopping daemon server (PID: {pid})...")
141
-
151
+
142
152
  # Stop the daemon
143
153
  result = subprocess.run(
144
154
  [sys.executable, str(self.daemon_script), "stop"],
145
155
  capture_output=True,
146
- text=True
156
+ text=True,
157
+ check=False,
147
158
  )
148
-
159
+
149
160
  if result.returncode == 0:
150
161
  print("✅ Daemon server stopped successfully")
151
162
  # Wait a moment for clean shutdown
152
163
  import time
164
+
153
165
  time.sleep(1)
154
-
166
+
155
167
  # Start it again
156
168
  return self.start_server(port=port)
157
- else:
158
- print(f"❌ Failed to stop daemon: {result.stderr}")
159
- return False
160
-
169
+ print(f"❌ Failed to stop daemon: {result.stderr}")
170
+ return False
171
+
161
172
  except Exception as e:
162
173
  print(f"❌ Error restarting daemon: {e}")
163
174
  return False
164
175
  else:
165
- print("❌ No daemon server found (no PID file at {})".format(self.daemon_pidfile_path))
166
-
176
+ print(
177
+ f"❌ No daemon server found (no PID file at {self.daemon_pidfile_path})"
178
+ )
179
+
167
180
  # Fall back to parent implementation for non-daemon servers
168
181
  return super().restart_server(port=port)
169
-
182
+
170
183
  # Re-export for use by CLI
171
184
  __all__ = ["ServerManager"]
172
-
173
- except ImportError as e:
185
+
186
+ except ImportError:
174
187
  # Fallback: If tools/admin version not available, provide basic implementation
175
188
  # that delegates to socketio_daemon.py
176
-
189
+
177
190
  import subprocess
178
- import json
179
- import time
180
- from typing import Dict, List, Optional, Any
181
-
191
+ from typing import Any, Dict, List, Optional
192
+
182
193
  class ServerManager:
183
194
  """Fallback ServerManager that uses socketio_daemon.py.
184
-
195
+
185
196
  WHY: This fallback ensures the monitor CLI command works even if
186
197
  the full ServerManager from tools/admin is not available. It provides
187
198
  basic functionality by delegating to the socketio_daemon.py script.
188
199
  """
189
-
200
+
190
201
  def __init__(self):
191
202
  self.daemon_script = script_dir / "socketio_daemon.py"
192
203
  self.base_port = 8765
193
-
194
- def start_server(self, port: int = None, host: str = "localhost",
195
- server_id: str = None) -> bool:
204
+
205
+ def start_server(
206
+ self,
207
+ port: Optional[int] = None,
208
+ host: str = "localhost",
209
+ server_id: Optional[str] = None,
210
+ ) -> bool:
196
211
  """Start the Socket.IO server using daemon script.
197
-
212
+
198
213
  WHY: The daemon script handles port selection and process management,
199
214
  so we delegate to it for starting servers.
200
215
  """
201
216
  if port and port != self.base_port:
202
217
  print(f"Note: Daemon only supports default port {self.base_port}")
203
218
  print(f"Starting on port {self.base_port} instead...")
204
-
219
+
205
220
  try:
206
221
  result = subprocess.run(
207
222
  [sys.executable, str(self.daemon_script), "start"],
208
223
  capture_output=True,
209
- text=True
224
+ text=True,
225
+ check=False,
210
226
  )
211
-
227
+
212
228
  if result.returncode == 0:
213
229
  print("Socket.IO server started successfully")
214
230
  return True
215
- else:
216
- print(f"Failed to start server: {result.stderr}")
217
- return False
218
-
231
+ print(f"Failed to start server: {result.stderr}")
232
+ return False
233
+
219
234
  except Exception as e:
220
235
  print(f"Error starting server: {e}")
221
236
  return False
222
-
223
- def stop_server(self, port: int = None) -> bool:
237
+
238
+ def stop_server(self, port: Optional[int] = None) -> bool:
224
239
  """Stop the Socket.IO server using daemon script."""
225
240
  if port and port != self.base_port:
226
241
  print(f"Note: Daemon only supports default port {self.base_port}")
227
-
242
+
228
243
  try:
229
244
  result = subprocess.run(
230
245
  [sys.executable, str(self.daemon_script), "stop"],
231
246
  capture_output=True,
232
- text=True
247
+ text=True,
248
+ check=False,
233
249
  )
234
-
250
+
235
251
  if result.returncode == 0:
236
252
  print("Socket.IO server stopped successfully")
237
253
  return True
238
- else:
239
- print(f"Failed to stop server: {result.stderr}")
240
- return False
241
-
254
+ print(f"Failed to stop server: {result.stderr}")
255
+ return False
256
+
242
257
  except Exception as e:
243
258
  print(f"Error stopping server: {e}")
244
259
  return False
245
-
246
- def restart_server(self, port: int = None) -> bool:
260
+
261
+ def restart_server(self, port: Optional[int] = None) -> bool:
247
262
  """Restart the Socket.IO server using daemon script."""
248
263
  if port and port != self.base_port:
249
264
  print(f"Note: Daemon only supports default port {self.base_port}")
250
-
265
+
251
266
  try:
252
267
  result = subprocess.run(
253
268
  [sys.executable, str(self.daemon_script), "restart"],
254
269
  capture_output=True,
255
- text=True
270
+ text=True,
271
+ check=False,
256
272
  )
257
-
273
+
258
274
  if result.returncode == 0:
259
275
  print("Socket.IO server restarted successfully")
260
276
  return True
261
- else:
262
- print(f"Failed to restart server: {result.stderr}")
263
- return False
264
-
277
+ print(f"Failed to restart server: {result.stderr}")
278
+ return False
279
+
265
280
  except Exception as e:
266
281
  print(f"Error restarting server: {e}")
267
282
  return False
268
-
283
+
269
284
  def list_running_servers(self) -> List[Dict[str, Any]]:
270
285
  """List running servers using daemon script status."""
271
286
  try:
272
287
  result = subprocess.run(
273
288
  [sys.executable, str(self.daemon_script), "status"],
274
289
  capture_output=True,
275
- text=True
290
+ text=True,
291
+ check=False,
276
292
  )
277
-
293
+
278
294
  # Parse status output to determine if server is running
279
295
  if "is running" in result.stdout:
280
296
  # Extract port from output if possible
281
297
  port = self.base_port
282
- for line in result.stdout.split('\n'):
298
+ for line in result.stdout.split("\n"):
283
299
  if "port" in line.lower():
284
300
  try:
285
301
  # Try to extract port number
286
302
  import re
287
- match = re.search(r'port\s+(\d+)', line.lower())
303
+
304
+ match = re.search(r"port\s+(\d+)", line.lower())
288
305
  if match:
289
306
  port = int(match.group(1))
290
307
  except:
291
308
  pass
292
-
293
- return [{
294
- "port": port,
295
- "server_id": "daemon-socketio",
296
- "status": "running"
297
- }]
298
- else:
299
- return []
300
-
309
+
310
+ return [
311
+ {
312
+ "port": port,
313
+ "server_id": "daemon-socketio",
314
+ "status": "running",
315
+ }
316
+ ]
317
+ return []
318
+
301
319
  except Exception as e:
302
320
  print(f"Error checking server status: {e}")
303
321
  return []
304
-
322
+
305
323
  def get_server_info(self, port: int) -> Optional[Dict[str, Any]]:
306
324
  """Get information about a server on a specific port."""
307
325
  servers = self.list_running_servers()
@@ -316,13 +334,16 @@ if __name__ == "__main__":
316
334
  try:
317
335
  # Try to run the actual script from tools/admin
318
336
  import subprocess
337
+
319
338
  tools_script = tools_admin_dir / "socketio_server_manager.py"
320
339
  if tools_script.exists():
321
- subprocess.run([sys.executable, str(tools_script)] + sys.argv[1:])
340
+ subprocess.run(
341
+ [sys.executable, str(tools_script)] + sys.argv[1:], check=False
342
+ )
322
343
  else:
323
344
  print("Socket.IO server manager not found in tools/admin")
324
345
  print("Please ensure claude-mpm is properly installed")
325
346
  sys.exit(1)
326
347
  except Exception as e:
327
348
  print(f"Error running server manager: {e}")
328
- sys.exit(1)
349
+ sys.exit(1)
@@ -19,91 +19,91 @@ def __getattr__(name):
19
19
  from .ticket_manager import TicketManager
20
20
 
21
21
  return TicketManager
22
- elif name == "AgentDeploymentService":
22
+ if name == "AgentDeploymentService":
23
23
  # Use correct path
24
24
  from .agents.deployment import AgentDeploymentService
25
25
 
26
26
  return AgentDeploymentService
27
- elif name == "AgentMemoryManager":
27
+ if name == "AgentMemoryManager":
28
28
  from .agents.memory import AgentMemoryManager
29
29
 
30
30
  return AgentMemoryManager
31
- elif name == "get_memory_manager":
31
+ if name == "get_memory_manager":
32
32
  from .agents.memory import get_memory_manager
33
33
 
34
34
  return get_memory_manager
35
35
  # Add backward compatibility for other agent services
36
- elif name == "AgentRegistry":
36
+ if name == "AgentRegistry":
37
37
  # Use correct path
38
38
  from .agents.registry import AgentRegistry
39
39
 
40
40
  return AgentRegistry
41
- elif name == "AgentLifecycleManager":
41
+ if name == "AgentLifecycleManager":
42
42
  from .agents.deployment import AgentLifecycleManager
43
43
 
44
44
  return AgentLifecycleManager
45
- elif name == "AgentManager":
45
+ if name == "AgentManager":
46
46
  from .agents.management import AgentManager
47
47
 
48
48
  return AgentManager
49
- elif name == "AgentCapabilitiesGenerator":
49
+ if name == "AgentCapabilitiesGenerator":
50
50
  from .agents.management import AgentCapabilitiesGenerator
51
51
 
52
52
  return AgentCapabilitiesGenerator
53
- elif name == "AgentModificationTracker":
53
+ if name == "AgentModificationTracker":
54
54
  from .agents.registry import AgentModificationTracker
55
55
 
56
56
  return AgentModificationTracker
57
- elif name == "AgentPersistenceService":
57
+ if name == "AgentPersistenceService":
58
58
  from .agents.memory import AgentPersistenceService
59
59
 
60
60
  return AgentPersistenceService
61
- elif name == "AgentProfileLoader":
61
+ if name == "AgentProfileLoader":
62
62
  from .agents.loading import AgentProfileLoader
63
63
 
64
64
  return AgentProfileLoader
65
- elif name == "AgentVersionManager":
65
+ if name == "AgentVersionManager":
66
66
  from .agents.deployment import AgentVersionManager
67
67
 
68
68
  return AgentVersionManager
69
- elif name == "BaseAgentManager":
69
+ if name == "BaseAgentManager":
70
70
  from .agents.loading import BaseAgentManager
71
71
 
72
72
  return BaseAgentManager
73
- elif name == "DeployedAgentDiscovery":
73
+ if name == "DeployedAgentDiscovery":
74
74
  from .agents.registry import DeployedAgentDiscovery
75
75
 
76
76
  return DeployedAgentDiscovery
77
- elif name == "FrameworkAgentLoader":
77
+ if name == "FrameworkAgentLoader":
78
78
  from .agents.loading import FrameworkAgentLoader
79
79
 
80
80
  return FrameworkAgentLoader
81
- elif name == "HookService":
81
+ if name == "HookService":
82
82
  from .hook_service import HookService
83
83
 
84
84
  return HookService
85
- elif name == "ProjectAnalyzer":
85
+ if name == "ProjectAnalyzer":
86
86
  from .project.analyzer import ProjectAnalyzer
87
87
 
88
88
  return ProjectAnalyzer
89
- elif name == "AdvancedHealthMonitor":
89
+ if name == "AdvancedHealthMonitor":
90
90
  from .infrastructure.monitoring import AdvancedHealthMonitor
91
91
 
92
92
  return AdvancedHealthMonitor
93
- elif name == "HealthMonitor":
93
+ if name == "HealthMonitor":
94
94
  # For backward compatibility, return AdvancedHealthMonitor
95
95
  # Note: There's also a different HealthMonitor in infrastructure.health_monitor
96
96
  from .infrastructure.monitoring import AdvancedHealthMonitor
97
97
 
98
98
  return AdvancedHealthMonitor
99
- elif name == "RecoveryManager":
99
+ if name == "RecoveryManager":
100
100
  try:
101
101
  from .recovery_manager import RecoveryManager
102
102
 
103
103
  return RecoveryManager
104
104
  except ImportError:
105
105
  raise AttributeError(f"Recovery management not available: {name}")
106
- elif name == "StandaloneSocketIOServer" or name == "SocketIOServer":
106
+ elif name in {"StandaloneSocketIOServer", "SocketIOServer"}:
107
107
  from .socketio_server import SocketIOServer
108
108
 
109
109
  return SocketIOServer
@@ -187,50 +187,50 @@ def __getattr__(name):
187
187
 
188
188
 
189
189
  __all__ = [
190
- "TicketManager",
191
- "AgentDeploymentService",
192
- "AgentMemoryManager",
193
- "get_memory_manager",
194
- "HookService",
195
- "ProjectAnalyzer",
196
190
  "AdvancedHealthMonitor",
197
- "HealthMonitor", # New alias
198
- "RecoveryManager",
199
- "StandaloneSocketIOServer",
200
- "SocketIOServer", # New alias
201
- # Additional agent services for backward compatibility
202
- "AgentRegistry",
191
+ "AgentCapabilitiesGenerator",
192
+ "AgentDeploymentService",
203
193
  "AgentLifecycleManager",
204
- "AgentManager",
205
194
  "AgentManagementService", # New service
206
- "AgentCapabilitiesGenerator",
195
+ "AgentManager",
196
+ "AgentMemoryManager",
207
197
  "AgentModificationTracker",
208
198
  "AgentPersistenceService",
209
199
  "AgentProfileLoader",
200
+ # Additional agent services for backward compatibility
201
+ "AgentRegistry",
210
202
  "AgentVersionManager",
211
203
  "BaseAgentManager",
204
+ "BaseMCPService",
205
+ # Core exports
206
+ "BaseService",
212
207
  "DeployedAgentDiscovery",
213
208
  "FrameworkAgentLoader",
214
- # Project services
215
- "ProjectRegistry", # New service
209
+ "HealthMonitor", # New alias
210
+ "HookService",
216
211
  # Infrastructure services
217
212
  "LoggingService", # New service
218
- # Communication services
219
- "SocketIOClientManager", # New service
220
- # Memory services (backward compatibility)
221
- "MemoryBuilder",
222
- "MemoryRouter",
223
- "MemoryOptimizer",
224
- "SimpleCacheService",
225
- "SharedPromptCache",
213
+ "MCPConfigLoader",
226
214
  # MCP Gateway services
227
215
  "MCPConfiguration",
228
- "MCPConfigLoader",
229
216
  "MCPServer",
230
217
  "MCPToolRegistry",
231
- "BaseMCPService",
232
- # Core exports
233
- "BaseService",
234
- "SyncBaseService",
218
+ # Memory services (backward compatibility)
219
+ "MemoryBuilder",
220
+ "MemoryOptimizer",
221
+ "MemoryRouter",
222
+ "ProjectAnalyzer",
223
+ # Project services
224
+ "ProjectRegistry", # New service
225
+ "RecoveryManager",
226
+ "SharedPromptCache",
227
+ "SimpleCacheService",
235
228
  "SingletonService",
229
+ # Communication services
230
+ "SocketIOClientManager", # New service
231
+ "SocketIOServer", # New alias
232
+ "StandaloneSocketIOServer",
233
+ "SyncBaseService",
234
+ "TicketManager",
235
+ "get_memory_manager",
236
236
  ]