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
@@ -29,7 +29,7 @@ class MonitorCommand(BaseCommand):
29
29
  def validate_args(self, args) -> Optional[str]:
30
30
  """Validate command arguments."""
31
31
  # Monitor command allows no subcommand (defaults to status)
32
- if hasattr(args, 'monitor_command') and args.monitor_command:
32
+ if hasattr(args, "monitor_command") and args.monitor_command:
33
33
  valid_commands = [cmd.value for cmd in MonitorCommands]
34
34
  if args.monitor_command not in valid_commands:
35
35
  return f"Unknown monitor command: {args.monitor_command}. Valid commands: {', '.join(valid_commands)}"
@@ -41,16 +41,18 @@ class MonitorCommand(BaseCommand):
41
41
  try:
42
42
  # Import ServerManager
43
43
  from ...scripts.socketio_server_manager import ServerManager
44
+
44
45
  server_manager = ServerManager()
45
46
 
46
47
  # Handle default case (no subcommand)
47
- if not hasattr(args, 'monitor_command') or not args.monitor_command:
48
+ if not hasattr(args, "monitor_command") or not args.monitor_command:
48
49
  # Default to status
49
50
  success = self._status_server(args, server_manager)
50
51
  if success:
51
- return CommandResult.success_result("Monitor status retrieved successfully")
52
- else:
53
- return CommandResult.error_result("Failed to retrieve monitor status")
52
+ return CommandResult.success_result(
53
+ "Monitor status retrieved successfully"
54
+ )
55
+ return CommandResult.error_result("Failed to retrieve monitor status")
54
56
 
55
57
  # Route to specific subcommand handlers
56
58
  command_map = {
@@ -64,11 +66,15 @@ class MonitorCommand(BaseCommand):
64
66
  if args.monitor_command in command_map:
65
67
  success = command_map[args.monitor_command](args, server_manager)
66
68
  if success:
67
- return CommandResult.success_result(f"Monitor {args.monitor_command} completed successfully")
68
- else:
69
- return CommandResult.error_result(f"Monitor {args.monitor_command} failed")
70
- else:
71
- return CommandResult.error_result(f"Unknown monitor command: {args.monitor_command}")
69
+ return CommandResult.success_result(
70
+ f"Monitor {args.monitor_command} completed successfully"
71
+ )
72
+ return CommandResult.error_result(
73
+ f"Monitor {args.monitor_command} failed"
74
+ )
75
+ return CommandResult.error_result(
76
+ f"Unknown monitor command: {args.monitor_command}"
77
+ )
72
78
 
73
79
  except Exception as e:
74
80
  self.logger.error(f"Error executing monitor command: {e}", exc_info=True)
@@ -105,7 +111,7 @@ def manage_monitor(args):
105
111
  result = command.execute(args)
106
112
 
107
113
  # Print result if structured output format is requested
108
- if hasattr(args, 'format') and args.format in ['json', 'yaml']:
114
+ if hasattr(args, "format") and args.format in ["json", "yaml"]:
109
115
  command.print_result(result, args)
110
116
 
111
117
  return result.exit_code
@@ -143,27 +149,26 @@ def manage_monitor_legacy(args):
143
149
  success = _start_server(args, server_manager)
144
150
  return 0 if success else 1
145
151
 
146
- elif args.monitor_command == MonitorCommands.STOP.value:
152
+ if args.monitor_command == MonitorCommands.STOP.value:
147
153
  success = _stop_server(args, server_manager)
148
154
  return 0 if success else 1
149
155
 
150
- elif args.monitor_command == MonitorCommands.RESTART.value:
156
+ if args.monitor_command == MonitorCommands.RESTART.value:
151
157
  success = _restart_server(args, server_manager)
152
158
  return 0 if success else 1
153
159
 
154
- elif args.monitor_command == MonitorCommands.STATUS.value:
160
+ if args.monitor_command == MonitorCommands.STATUS.value:
155
161
  success = _status_server(args, server_manager)
156
162
  return 0 if success else 1
157
163
 
158
- elif args.monitor_command == MonitorCommands.PORT.value:
164
+ if args.monitor_command == MonitorCommands.PORT.value:
159
165
  success = _port_server(args, server_manager)
160
166
  return 0 if success else 1
161
167
 
162
- else:
163
- logger.error(f"Unknown monitor command: {args.monitor_command}")
164
- print(f"Unknown monitor command: {args.monitor_command}")
165
- print("Available commands: start, stop, restart, status, port")
166
- return 1
168
+ logger.error(f"Unknown monitor command: {args.monitor_command}")
169
+ print(f"Unknown monitor command: {args.monitor_command}")
170
+ print("Available commands: start, stop, restart, status, port")
171
+ return 1
167
172
 
168
173
  except ImportError as e:
169
174
  logger.error(f"Server manager not available: {e}")
@@ -206,47 +211,50 @@ def _port_server(args, server_manager):
206
211
  try:
207
212
  # Import PortManager to check port status
208
213
  from ...services.port_manager import PortManager
214
+
209
215
  port_manager = PortManager()
210
-
216
+
211
217
  # Get detailed port status
212
218
  port_status = port_manager.get_port_status(port)
213
-
219
+
214
220
  # Check if port is in use
215
221
  if not port_status["available"]:
216
222
  process_info = port_status.get("process")
217
223
  if process_info:
218
224
  print(f"⚠️ Port {port} is in use:")
219
225
  print(f" Process: {process_info['name']} (PID: {process_info['pid']})")
220
-
221
- if process_info['is_ours']:
222
- if process_info['is_debug']:
223
- print(f" Type: Debug/Test script (can be reclaimed)")
226
+
227
+ if process_info["is_ours"]:
228
+ if process_info["is_debug"]:
229
+ print(" Type: Debug/Test script (can be reclaimed)")
224
230
  if reclaim:
225
- print(f" Action: Attempting to reclaim port...")
231
+ print(" Action: Attempting to reclaim port...")
226
232
  if port_manager.kill_process_on_port(port, force=force):
227
233
  print(f" ✅ Successfully reclaimed port {port}")
228
234
  else:
229
235
  print(f" ❌ Failed to reclaim port {port}")
230
236
  return False
231
- elif process_info['is_daemon']:
232
- print(f" Type: Daemon process")
237
+ elif process_info["is_daemon"]:
238
+ print(" Type: Daemon process")
233
239
  if force:
234
- print(f" Action: Force killing daemon (--force flag used)...")
240
+ print(
241
+ " Action: Force killing daemon (--force flag used)..."
242
+ )
235
243
  if port_manager.kill_process_on_port(port, force=True):
236
244
  print(f" ✅ Successfully killed daemon on port {port}")
237
245
  else:
238
246
  print(f" ❌ Failed to kill daemon on port {port}")
239
247
  return False
240
248
  else:
241
- print(f" ❌ Cannot start: Daemon already running")
249
+ print(" ❌ Cannot start: Daemon already running")
242
250
  print(f" Recommendation: {port_status['recommendation']}")
243
251
  return False
244
252
  else:
245
- print(f" Type: External process")
253
+ print(" Type: External process")
246
254
  print(f" ❌ Cannot start: {port_status['recommendation']}")
247
255
  return False
248
256
  print()
249
-
257
+
250
258
  # Check if there are any running servers
251
259
  running_servers = server_manager.list_running_servers()
252
260
 
@@ -280,7 +288,7 @@ def _port_server(args, server_manager):
280
288
  print(f"Monitor server {action} successfully on port {port}")
281
289
  print()
282
290
  print("Server management commands:")
283
- print(f" Status: ps aux | grep socketio")
291
+ print(" Status: ps aux | grep socketio")
284
292
  print(f" Stop: claude-mpm monitor stop --port {port}")
285
293
  print(f" Restart: claude-mpm monitor restart --port {port}")
286
294
  print()
@@ -325,19 +333,22 @@ def _start_server(args, server_manager):
325
333
  force = getattr(args, "force", False)
326
334
  reclaim = getattr(args, "reclaim", True)
327
335
 
328
- print(f"Starting Socket.IO monitoring server...")
329
-
336
+ print("Starting Socket.IO monitoring server...")
337
+
330
338
  try:
331
339
  # Import PortManager for smart port selection
332
340
  from ...services.port_manager import PortManager
341
+
333
342
  port_manager = PortManager()
334
-
343
+
335
344
  # If no port specified, find an available one with smart reclaim
336
345
  if port is None:
337
346
  port = port_manager.find_available_port(reclaim=reclaim)
338
347
  if port is None:
339
348
  print("❌ No available ports found")
340
- print("Try specifying a port with --port or use --force to reclaim daemon ports")
349
+ print(
350
+ "Try specifying a port with --port or use --force to reclaim daemon ports"
351
+ )
341
352
  return False
342
353
  print(f"Selected port: {port}")
343
354
  else:
@@ -346,9 +357,11 @@ def _start_server(args, server_manager):
346
357
  if not port_status["available"]:
347
358
  process_info = port_status.get("process")
348
359
  if process_info:
349
- print(f"⚠️ Port {port} is in use by {process_info['name']} (PID: {process_info['pid']})")
350
-
351
- if process_info['is_ours'] and (process_info['is_debug'] or force):
360
+ print(
361
+ f"⚠️ Port {port} is in use by {process_info['name']} (PID: {process_info['pid']})"
362
+ )
363
+
364
+ if process_info["is_ours"] and (process_info["is_debug"] or force):
352
365
  if reclaim:
353
366
  print(f"Attempting to reclaim port {port}...")
354
367
  if not port_manager.kill_process_on_port(port, force=force):
@@ -356,15 +369,19 @@ def _start_server(args, server_manager):
356
369
  return False
357
370
  print(f"✅ Successfully reclaimed port {port}")
358
371
  else:
359
- print(f"❌ Port {port} unavailable and --no-reclaim specified")
372
+ print(
373
+ f"❌ Port {port} unavailable and --no-reclaim specified"
374
+ )
360
375
  return False
361
376
  else:
362
- print(f"❌ Cannot reclaim port: {port_status['recommendation']}")
377
+ print(
378
+ f"❌ Cannot reclaim port: {port_status['recommendation']}"
379
+ )
363
380
  return False
364
-
381
+
365
382
  print(f"Target: {host}:{port}")
366
383
  print()
367
-
384
+
368
385
  success = server_manager.start_server(
369
386
  port=port, host=host, server_id="monitor-server"
370
387
  )
@@ -372,9 +389,9 @@ def _start_server(args, server_manager):
372
389
  if success:
373
390
  print()
374
391
  print("Monitor server management commands:")
375
- print(f" Status: claude-mpm monitor status")
376
- print(f" Stop: claude-mpm monitor stop")
377
- print(f" Restart: claude-mpm monitor restart")
392
+ print(" Status: claude-mpm monitor status")
393
+ print(" Stop: claude-mpm monitor stop")
394
+ print(" Restart: claude-mpm monitor restart")
378
395
  print()
379
396
  print(f"WebSocket URL: ws://{host}:{port}")
380
397
 
@@ -428,20 +445,19 @@ def _stop_server(args, server_manager):
428
445
  success = False
429
446
 
430
447
  return success
431
- else:
432
- # Stop specific server on given port
433
- success = server_manager.stop_server(port=port)
448
+ # Stop specific server on given port
449
+ success = server_manager.stop_server(port=port)
434
450
 
435
- if success:
436
- print(f"Monitor server stopped on port {port}")
437
- else:
438
- print(f"Failed to stop server on port {port}")
439
- print()
440
- print("Troubleshooting:")
441
- print(f" • Check if server is running: claude-mpm monitor status")
442
- print(f" • Try force kill: kill $(lsof -ti :{port})")
451
+ if success:
452
+ print(f"Monitor server stopped on port {port}")
453
+ else:
454
+ print(f"Failed to stop server on port {port}")
455
+ print()
456
+ print("Troubleshooting:")
457
+ print(" • Check if server is running: claude-mpm monitor status")
458
+ print(f" • Try force kill: kill $(lsof -ti :{port})")
443
459
 
444
- return success
460
+ return success
445
461
 
446
462
  except Exception as e:
447
463
  print(f"Error stopping server: {e}")
@@ -465,10 +481,10 @@ def _status_server(args, server_manager):
465
481
  """
466
482
  verbose = getattr(args, "verbose", False)
467
483
  show_ports = getattr(args, "show_ports", False)
468
-
484
+
469
485
  print("Checking Socket.IO monitoring server status...")
470
486
  print()
471
-
487
+
472
488
  try:
473
489
  # Check for daemon server using socketio_daemon.py
474
490
  daemon_script = server_manager.daemon_script
@@ -477,18 +493,19 @@ def _status_server(args, server_manager):
477
493
  result = subprocess.run(
478
494
  [sys.executable, str(daemon_script), "status"],
479
495
  capture_output=True,
480
- text=True
496
+ text=True,
497
+ check=False,
481
498
  )
482
-
499
+
483
500
  if result.returncode == 0 and result.stdout:
484
501
  # Daemon provided status information
485
502
  print(result.stdout)
486
-
503
+
487
504
  if verbose:
488
505
  # Show additional information
489
506
  print("\nAdditional Details:")
490
507
  print("─" * 40)
491
-
508
+
492
509
  # List all running servers from ServerManager
493
510
  running_servers = server_manager.list_running_servers()
494
511
  if running_servers:
@@ -502,12 +519,12 @@ def _status_server(args, server_manager):
502
519
  print(f" PID: {server_pid}")
503
520
  else:
504
521
  print("No additional servers found via ServerManager")
505
-
522
+
506
523
  return True
507
-
524
+
508
525
  # Fall back to ServerManager's list_running_servers
509
526
  running_servers = server_manager.list_running_servers()
510
-
527
+
511
528
  if not running_servers:
512
529
  print("❌ No Socket.IO monitoring servers are currently running")
513
530
  print()
@@ -515,50 +532,54 @@ def _status_server(args, server_manager):
515
532
  print(" claude-mpm monitor start")
516
533
  print(" claude-mpm monitor start --port 8765")
517
534
  return True
518
-
535
+
519
536
  # Import PortManager for enhanced status
520
537
  from ...services.port_manager import PortManager
538
+
521
539
  port_manager = PortManager()
522
-
540
+
523
541
  # Display server information
524
542
  print(f"✅ Found {len(running_servers)} running server(s):")
525
543
  print()
526
-
544
+
527
545
  for server in running_servers:
528
546
  server_port = server.get("port", "unknown")
529
547
  server_id = server.get("server_id", "unknown")
530
548
  server_pid = server.get("pid", "unknown")
531
549
  server_host = server.get("host", "localhost")
532
-
550
+
533
551
  print(f"Server: {server_id}")
534
552
  print(f" • PID: {server_pid}")
535
553
  print(f" • Port: {server_port}")
536
554
  print(f" • Host: {server_host}")
537
555
  print(f" • WebSocket URL: ws://{server_host}:{server_port}")
538
-
556
+
539
557
  # Show port status if verbose
540
558
  if verbose and server_port != "unknown":
541
559
  port_status = port_manager.get_port_status(int(server_port))
542
560
  if port_status.get("process"):
543
561
  process = port_status["process"]
544
- print(f" • Process Type: {'Debug' if process['is_debug'] else 'Daemon' if process['is_daemon'] else 'Regular'}")
545
-
562
+ print(
563
+ f" • Process Type: {'Debug' if process['is_debug'] else 'Daemon' if process['is_daemon'] else 'Regular'}"
564
+ )
565
+
546
566
  if verbose:
547
567
  # Check if port is actually listening
548
568
  try:
549
569
  import socket
570
+
550
571
  sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
551
572
  result = sock.connect_ex((server_host, server_port))
552
573
  sock.close()
553
574
  if result == 0:
554
- print(f" • Status: ✅ Listening")
575
+ print(" • Status: ✅ Listening")
555
576
  else:
556
- print(f" • Status: ⚠️ Not responding on port")
577
+ print(" • Status: ⚠️ Not responding on port")
557
578
  except Exception as e:
558
579
  print(f" • Status: ❌ Error checking: {e}")
559
-
580
+
560
581
  print()
561
-
582
+
562
583
  # Show port range status if requested
563
584
  if show_ports or verbose:
564
585
  print("\nPort Range Status (8765-8785):")
@@ -572,17 +593,25 @@ def _status_server(args, server_manager):
572
593
  if process:
573
594
  if process["is_ours"]:
574
595
  if process["is_debug"]:
575
- print(f" Port {check_port}: 🔧 Debug script (PID: {process['pid']})")
596
+ print(
597
+ f" Port {check_port}: 🔧 Debug script (PID: {process['pid']})"
598
+ )
576
599
  elif process["is_daemon"]:
577
- print(f" Port {check_port}: 🚀 Daemon (PID: {process['pid']})")
600
+ print(
601
+ f" Port {check_port}: 🚀 Daemon (PID: {process['pid']})"
602
+ )
578
603
  else:
579
- print(f" Port {check_port}: 📦 Our process (PID: {process['pid']})")
604
+ print(
605
+ f" Port {check_port}: 📦 Our process (PID: {process['pid']})"
606
+ )
580
607
  else:
581
- print(f" Port {check_port}: ⛔ External ({process['name']})")
608
+ print(
609
+ f" Port {check_port}: ⛔ External ({process['name']})"
610
+ )
582
611
  else:
583
612
  print(f" Port {check_port}: ❓ In use (unknown process)")
584
613
  print()
585
-
614
+
586
615
  print("Server management commands:")
587
616
  print(" Stop all: claude-mpm monitor stop")
588
617
  print(" Restart: claude-mpm monitor restart")
@@ -590,9 +619,9 @@ def _status_server(args, server_manager):
590
619
  if len(running_servers) == 1:
591
620
  port = running_servers[0].get("port", 8765)
592
621
  print(f" Stop this: claude-mpm monitor stop --port {port}")
593
-
622
+
594
623
  return True
595
-
624
+
596
625
  except Exception as e:
597
626
  print(f"Error checking server status: {e}")
598
627
  print()
@@ -643,7 +672,7 @@ def _restart_server(args, server_manager):
643
672
  print(f"Monitor server restarted successfully on port {port}")
644
673
  print()
645
674
  print("Server management commands:")
646
- print(f" Status: claude-mpm monitor status")
675
+ print(" Status: claude-mpm monitor status")
647
676
  print(f" Stop: claude-mpm monitor stop --port {port}")
648
677
  print(f" Start: claude-mpm monitor start --port {port}")
649
678
  else: