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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (389) hide show
  1. claude_mpm/BUILD_NUMBER +1 -1
  2. claude_mpm/VERSION +1 -1
  3. claude_mpm/__main__.py +1 -1
  4. claude_mpm/agents/BASE_PM.md +74 -46
  5. claude_mpm/agents/INSTRUCTIONS.md +11 -153
  6. claude_mpm/agents/WORKFLOW.md +61 -321
  7. claude_mpm/agents/__init__.py +11 -11
  8. claude_mpm/agents/agent_loader.py +23 -20
  9. claude_mpm/agents/agent_loader_integration.py +1 -1
  10. claude_mpm/agents/agents_metadata.py +27 -0
  11. claude_mpm/agents/async_agent_loader.py +5 -8
  12. claude_mpm/agents/base_agent_loader.py +36 -25
  13. claude_mpm/agents/frontmatter_validator.py +6 -6
  14. claude_mpm/agents/schema/agent_schema.json +1 -1
  15. claude_mpm/agents/system_agent_config.py +9 -9
  16. claude_mpm/agents/templates/api_qa.json +47 -2
  17. claude_mpm/agents/templates/engineer.json +33 -11
  18. claude_mpm/agents/templates/imagemagick.json +256 -0
  19. claude_mpm/agents/templates/qa.json +41 -2
  20. claude_mpm/agents/templates/ticketing.json +5 -5
  21. claude_mpm/agents/templates/web_qa.json +50 -2
  22. claude_mpm/cli/__init__.py +51 -46
  23. claude_mpm/cli/__main__.py +1 -1
  24. claude_mpm/cli/commands/__init__.py +10 -12
  25. claude_mpm/cli/commands/agent_manager.py +186 -181
  26. claude_mpm/cli/commands/agents.py +648 -1098
  27. claude_mpm/cli/commands/aggregate.py +30 -29
  28. claude_mpm/cli/commands/cleanup.py +50 -44
  29. claude_mpm/cli/commands/cleanup_orphaned_agents.py +25 -25
  30. claude_mpm/cli/commands/config.py +162 -127
  31. claude_mpm/cli/commands/doctor.py +52 -62
  32. claude_mpm/cli/commands/info.py +37 -25
  33. claude_mpm/cli/commands/mcp.py +3 -7
  34. claude_mpm/cli/commands/mcp_command_router.py +14 -18
  35. claude_mpm/cli/commands/mcp_install_commands.py +28 -23
  36. claude_mpm/cli/commands/mcp_pipx_config.py +58 -49
  37. claude_mpm/cli/commands/mcp_server_commands.py +23 -17
  38. claude_mpm/cli/commands/memory.py +339 -967
  39. claude_mpm/cli/commands/monitor.py +117 -88
  40. claude_mpm/cli/commands/run.py +233 -542
  41. claude_mpm/cli/commands/socketio_monitor.py +17 -19
  42. claude_mpm/cli/commands/tickets.py +92 -92
  43. claude_mpm/cli/parser.py +1 -5
  44. claude_mpm/cli/parsers/__init__.py +1 -1
  45. claude_mpm/cli/parsers/agent_manager_parser.py +50 -98
  46. claude_mpm/cli/parsers/agents_parser.py +2 -3
  47. claude_mpm/cli/parsers/base_parser.py +7 -5
  48. claude_mpm/cli/parsers/mcp_parser.py +4 -2
  49. claude_mpm/cli/parsers/monitor_parser.py +26 -18
  50. claude_mpm/cli/shared/__init__.py +10 -10
  51. claude_mpm/cli/shared/argument_patterns.py +57 -71
  52. claude_mpm/cli/shared/base_command.py +61 -53
  53. claude_mpm/cli/shared/error_handling.py +62 -58
  54. claude_mpm/cli/shared/output_formatters.py +78 -77
  55. claude_mpm/cli/startup_logging.py +280 -172
  56. claude_mpm/cli/utils.py +10 -11
  57. claude_mpm/cli_module/__init__.py +1 -1
  58. claude_mpm/cli_module/args.py +1 -1
  59. claude_mpm/cli_module/migration_example.py +5 -5
  60. claude_mpm/config/__init__.py +9 -9
  61. claude_mpm/config/agent_config.py +15 -14
  62. claude_mpm/config/experimental_features.py +4 -4
  63. claude_mpm/config/paths.py +0 -1
  64. claude_mpm/config/socketio_config.py +5 -6
  65. claude_mpm/constants.py +1 -2
  66. claude_mpm/core/__init__.py +8 -8
  67. claude_mpm/core/agent_name_normalizer.py +1 -1
  68. claude_mpm/core/agent_registry.py +22 -29
  69. claude_mpm/core/agent_session_manager.py +3 -3
  70. claude_mpm/core/base_service.py +7 -15
  71. claude_mpm/core/cache.py +4 -6
  72. claude_mpm/core/claude_runner.py +85 -113
  73. claude_mpm/core/config.py +43 -28
  74. claude_mpm/core/config_aliases.py +0 -9
  75. claude_mpm/core/config_constants.py +52 -30
  76. claude_mpm/core/constants.py +0 -1
  77. claude_mpm/core/container.py +18 -27
  78. claude_mpm/core/exceptions.py +2 -2
  79. claude_mpm/core/factories.py +10 -12
  80. claude_mpm/core/framework_loader.py +500 -680
  81. claude_mpm/core/hook_manager.py +26 -22
  82. claude_mpm/core/hook_performance_config.py +58 -47
  83. claude_mpm/core/injectable_service.py +1 -1
  84. claude_mpm/core/interactive_session.py +61 -152
  85. claude_mpm/core/interfaces.py +1 -100
  86. claude_mpm/core/lazy.py +5 -5
  87. claude_mpm/core/log_manager.py +587 -0
  88. claude_mpm/core/logger.py +125 -8
  89. claude_mpm/core/logging_config.py +15 -17
  90. claude_mpm/core/minimal_framework_loader.py +5 -8
  91. claude_mpm/core/oneshot_session.py +15 -33
  92. claude_mpm/core/optimized_agent_loader.py +4 -6
  93. claude_mpm/core/optimized_startup.py +2 -1
  94. claude_mpm/core/output_style_manager.py +147 -106
  95. claude_mpm/core/pm_hook_interceptor.py +0 -1
  96. claude_mpm/core/service_registry.py +11 -8
  97. claude_mpm/core/session_manager.py +1 -2
  98. claude_mpm/core/shared/__init__.py +1 -1
  99. claude_mpm/core/shared/config_loader.py +101 -97
  100. claude_mpm/core/shared/path_resolver.py +72 -68
  101. claude_mpm/core/shared/singleton_manager.py +56 -50
  102. claude_mpm/core/socketio_pool.py +26 -6
  103. claude_mpm/core/tool_access_control.py +4 -5
  104. claude_mpm/core/typing_utils.py +50 -59
  105. claude_mpm/core/unified_agent_registry.py +14 -19
  106. claude_mpm/core/unified_config.py +4 -6
  107. claude_mpm/core/unified_paths.py +197 -109
  108. claude_mpm/dashboard/open_dashboard.py +2 -4
  109. claude_mpm/experimental/cli_enhancements.py +51 -36
  110. claude_mpm/generators/agent_profile_generator.py +2 -4
  111. claude_mpm/hooks/base_hook.py +1 -2
  112. claude_mpm/hooks/claude_hooks/connection_pool.py +72 -26
  113. claude_mpm/hooks/claude_hooks/event_handlers.py +99 -154
  114. claude_mpm/hooks/claude_hooks/hook_handler.py +110 -720
  115. claude_mpm/hooks/claude_hooks/hook_handler_eventbus.py +104 -77
  116. claude_mpm/hooks/claude_hooks/hook_handler_original.py +1040 -0
  117. claude_mpm/hooks/claude_hooks/hook_handler_refactored.py +347 -0
  118. claude_mpm/hooks/claude_hooks/memory_integration.py +2 -4
  119. claude_mpm/hooks/claude_hooks/response_tracking.py +15 -11
  120. claude_mpm/hooks/claude_hooks/services/__init__.py +13 -0
  121. claude_mpm/hooks/claude_hooks/services/connection_manager.py +190 -0
  122. claude_mpm/hooks/claude_hooks/services/duplicate_detector.py +106 -0
  123. claude_mpm/hooks/claude_hooks/services/state_manager.py +282 -0
  124. claude_mpm/hooks/claude_hooks/services/subagent_processor.py +374 -0
  125. claude_mpm/hooks/claude_hooks/tool_analysis.py +12 -18
  126. claude_mpm/hooks/memory_integration_hook.py +5 -5
  127. claude_mpm/hooks/tool_call_interceptor.py +1 -1
  128. claude_mpm/hooks/validation_hooks.py +4 -4
  129. claude_mpm/init.py +4 -9
  130. claude_mpm/models/__init__.py +2 -2
  131. claude_mpm/models/agent_session.py +11 -14
  132. claude_mpm/scripts/mcp_server.py +20 -11
  133. claude_mpm/scripts/mcp_wrapper.py +5 -5
  134. claude_mpm/scripts/mpm_doctor.py +321 -0
  135. claude_mpm/scripts/socketio_daemon.py +28 -25
  136. claude_mpm/scripts/socketio_daemon_hardened.py +298 -258
  137. claude_mpm/scripts/socketio_server_manager.py +116 -95
  138. claude_mpm/services/__init__.py +49 -49
  139. claude_mpm/services/agent_capabilities_service.py +12 -18
  140. claude_mpm/services/agents/__init__.py +22 -22
  141. claude_mpm/services/agents/agent_builder.py +140 -119
  142. claude_mpm/services/agents/deployment/__init__.py +3 -3
  143. claude_mpm/services/agents/deployment/agent_config_provider.py +9 -9
  144. claude_mpm/services/agents/deployment/agent_configuration_manager.py +19 -20
  145. claude_mpm/services/agents/deployment/agent_definition_factory.py +1 -5
  146. claude_mpm/services/agents/deployment/agent_deployment.py +129 -511
  147. claude_mpm/services/agents/deployment/agent_discovery_service.py +4 -8
  148. claude_mpm/services/agents/deployment/agent_environment_manager.py +2 -7
  149. claude_mpm/services/agents/deployment/agent_filesystem_manager.py +6 -10
  150. claude_mpm/services/agents/deployment/agent_format_converter.py +11 -15
  151. claude_mpm/services/agents/deployment/agent_frontmatter_validator.py +2 -3
  152. claude_mpm/services/agents/deployment/agent_lifecycle_manager.py +5 -5
  153. claude_mpm/services/agents/deployment/agent_metrics_collector.py +13 -19
  154. claude_mpm/services/agents/deployment/agent_restore_handler.py +0 -1
  155. claude_mpm/services/agents/deployment/agent_template_builder.py +26 -35
  156. claude_mpm/services/agents/deployment/agent_validator.py +0 -1
  157. claude_mpm/services/agents/deployment/agent_version_manager.py +7 -9
  158. claude_mpm/services/agents/deployment/agent_versioning.py +3 -3
  159. claude_mpm/services/agents/deployment/agents_directory_resolver.py +6 -7
  160. claude_mpm/services/agents/deployment/async_agent_deployment.py +51 -38
  161. claude_mpm/services/agents/deployment/base_agent_locator.py +132 -0
  162. claude_mpm/services/agents/deployment/config/__init__.py +1 -1
  163. claude_mpm/services/agents/deployment/config/deployment_config.py +7 -8
  164. claude_mpm/services/agents/deployment/deployment_results_manager.py +185 -0
  165. claude_mpm/services/agents/deployment/deployment_type_detector.py +1 -1
  166. claude_mpm/services/agents/deployment/deployment_wrapper.py +18 -18
  167. claude_mpm/services/agents/deployment/facade/__init__.py +1 -1
  168. claude_mpm/services/agents/deployment/facade/deployment_executor.py +0 -3
  169. claude_mpm/services/agents/deployment/facade/deployment_facade.py +3 -4
  170. claude_mpm/services/agents/deployment/interface_adapter.py +5 -7
  171. claude_mpm/services/agents/deployment/multi_source_deployment_service.py +345 -276
  172. claude_mpm/services/agents/deployment/pipeline/__init__.py +2 -2
  173. claude_mpm/services/agents/deployment/pipeline/pipeline_builder.py +1 -1
  174. claude_mpm/services/agents/deployment/pipeline/pipeline_context.py +6 -4
  175. claude_mpm/services/agents/deployment/pipeline/pipeline_executor.py +3 -3
  176. claude_mpm/services/agents/deployment/pipeline/steps/__init__.py +2 -2
  177. claude_mpm/services/agents/deployment/pipeline/steps/agent_processing_step.py +14 -13
  178. claude_mpm/services/agents/deployment/pipeline/steps/base_step.py +0 -1
  179. claude_mpm/services/agents/deployment/pipeline/steps/configuration_step.py +1 -1
  180. claude_mpm/services/agents/deployment/pipeline/steps/target_directory_step.py +8 -9
  181. claude_mpm/services/agents/deployment/pipeline/steps/validation_step.py +1 -1
  182. claude_mpm/services/agents/deployment/processors/__init__.py +1 -1
  183. claude_mpm/services/agents/deployment/processors/agent_processor.py +20 -16
  184. claude_mpm/services/agents/deployment/refactored_agent_deployment_service.py +5 -12
  185. claude_mpm/services/agents/deployment/results/__init__.py +1 -1
  186. claude_mpm/services/agents/deployment/results/deployment_result_builder.py +1 -1
  187. claude_mpm/services/agents/deployment/single_agent_deployer.py +315 -0
  188. claude_mpm/services/agents/deployment/strategies/__init__.py +2 -2
  189. claude_mpm/services/agents/deployment/strategies/base_strategy.py +1 -7
  190. claude_mpm/services/agents/deployment/strategies/project_strategy.py +1 -4
  191. claude_mpm/services/agents/deployment/strategies/system_strategy.py +2 -3
  192. claude_mpm/services/agents/deployment/strategies/user_strategy.py +3 -7
  193. claude_mpm/services/agents/deployment/validation/__init__.py +1 -1
  194. claude_mpm/services/agents/deployment/validation/agent_validator.py +1 -1
  195. claude_mpm/services/agents/deployment/validation/template_validator.py +2 -2
  196. claude_mpm/services/agents/deployment/validation/validation_result.py +2 -6
  197. claude_mpm/services/agents/loading/__init__.py +1 -1
  198. claude_mpm/services/agents/loading/agent_profile_loader.py +6 -12
  199. claude_mpm/services/agents/loading/base_agent_manager.py +5 -5
  200. claude_mpm/services/agents/loading/framework_agent_loader.py +2 -4
  201. claude_mpm/services/agents/management/__init__.py +1 -1
  202. claude_mpm/services/agents/management/agent_capabilities_generator.py +1 -3
  203. claude_mpm/services/agents/management/agent_management_service.py +5 -9
  204. claude_mpm/services/agents/memory/__init__.py +4 -4
  205. claude_mpm/services/agents/memory/agent_memory_manager.py +157 -503
  206. claude_mpm/services/agents/memory/agent_persistence_service.py +0 -2
  207. claude_mpm/services/agents/memory/content_manager.py +44 -38
  208. claude_mpm/services/agents/memory/memory_categorization_service.py +165 -0
  209. claude_mpm/services/agents/memory/memory_file_service.py +103 -0
  210. claude_mpm/services/agents/memory/memory_format_service.py +201 -0
  211. claude_mpm/services/agents/memory/memory_limits_service.py +99 -0
  212. claude_mpm/services/agents/memory/template_generator.py +4 -6
  213. claude_mpm/services/agents/registry/__init__.py +11 -7
  214. claude_mpm/services/agents/registry/deployed_agent_discovery.py +30 -27
  215. claude_mpm/services/agents/registry/modification_tracker.py +3 -6
  216. claude_mpm/services/async_session_logger.py +1 -2
  217. claude_mpm/services/claude_session_logger.py +1 -2
  218. claude_mpm/services/cli/__init__.py +18 -0
  219. claude_mpm/services/cli/agent_cleanup_service.py +407 -0
  220. claude_mpm/services/cli/agent_dependency_service.py +395 -0
  221. claude_mpm/services/cli/agent_listing_service.py +463 -0
  222. claude_mpm/services/cli/agent_output_formatter.py +605 -0
  223. claude_mpm/services/cli/agent_validation_service.py +589 -0
  224. claude_mpm/services/cli/dashboard_launcher.py +424 -0
  225. claude_mpm/services/cli/memory_crud_service.py +617 -0
  226. claude_mpm/services/cli/memory_output_formatter.py +604 -0
  227. claude_mpm/services/cli/session_manager.py +513 -0
  228. claude_mpm/services/cli/socketio_manager.py +498 -0
  229. claude_mpm/services/cli/startup_checker.py +370 -0
  230. claude_mpm/services/command_deployment_service.py +173 -0
  231. claude_mpm/services/command_handler_service.py +20 -22
  232. claude_mpm/services/core/__init__.py +25 -25
  233. claude_mpm/services/core/base.py +0 -5
  234. claude_mpm/services/core/cache_manager.py +311 -0
  235. claude_mpm/services/core/interfaces/__init__.py +32 -32
  236. claude_mpm/services/core/interfaces/agent.py +0 -21
  237. claude_mpm/services/core/interfaces/communication.py +0 -27
  238. claude_mpm/services/core/interfaces/infrastructure.py +0 -56
  239. claude_mpm/services/core/interfaces/service.py +0 -29
  240. claude_mpm/services/core/memory_manager.py +637 -0
  241. claude_mpm/services/core/path_resolver.py +498 -0
  242. claude_mpm/services/core/service_container.py +520 -0
  243. claude_mpm/services/core/service_interfaces.py +436 -0
  244. claude_mpm/services/diagnostics/__init__.py +1 -1
  245. claude_mpm/services/diagnostics/checks/__init__.py +6 -6
  246. claude_mpm/services/diagnostics/checks/agent_check.py +152 -97
  247. claude_mpm/services/diagnostics/checks/base_check.py +12 -16
  248. claude_mpm/services/diagnostics/checks/claude_desktop_check.py +84 -81
  249. claude_mpm/services/diagnostics/checks/common_issues_check.py +99 -91
  250. claude_mpm/services/diagnostics/checks/configuration_check.py +82 -77
  251. claude_mpm/services/diagnostics/checks/filesystem_check.py +67 -68
  252. claude_mpm/services/diagnostics/checks/installation_check.py +254 -94
  253. claude_mpm/services/diagnostics/checks/mcp_check.py +90 -88
  254. claude_mpm/services/diagnostics/checks/monitor_check.py +75 -76
  255. claude_mpm/services/diagnostics/checks/startup_log_check.py +67 -73
  256. claude_mpm/services/diagnostics/diagnostic_runner.py +67 -59
  257. claude_mpm/services/diagnostics/doctor_reporter.py +107 -70
  258. claude_mpm/services/diagnostics/models.py +21 -19
  259. claude_mpm/services/event_aggregator.py +10 -17
  260. claude_mpm/services/event_bus/__init__.py +1 -1
  261. claude_mpm/services/event_bus/config.py +54 -35
  262. claude_mpm/services/event_bus/event_bus.py +76 -71
  263. claude_mpm/services/event_bus/relay.py +74 -64
  264. claude_mpm/services/events/__init__.py +11 -11
  265. claude_mpm/services/events/consumers/__init__.py +3 -3
  266. claude_mpm/services/events/consumers/dead_letter.py +71 -63
  267. claude_mpm/services/events/consumers/logging.py +39 -37
  268. claude_mpm/services/events/consumers/metrics.py +56 -57
  269. claude_mpm/services/events/consumers/socketio.py +82 -81
  270. claude_mpm/services/events/core.py +110 -99
  271. claude_mpm/services/events/interfaces.py +56 -72
  272. claude_mpm/services/events/producers/__init__.py +1 -1
  273. claude_mpm/services/events/producers/hook.py +38 -38
  274. claude_mpm/services/events/producers/system.py +46 -44
  275. claude_mpm/services/exceptions.py +81 -80
  276. claude_mpm/services/framework_claude_md_generator/__init__.py +2 -4
  277. claude_mpm/services/framework_claude_md_generator/content_assembler.py +3 -5
  278. claude_mpm/services/framework_claude_md_generator/content_validator.py +1 -1
  279. claude_mpm/services/framework_claude_md_generator/deployment_manager.py +4 -4
  280. claude_mpm/services/framework_claude_md_generator/section_generators/__init__.py +0 -1
  281. claude_mpm/services/framework_claude_md_generator/section_generators/agents.py +0 -2
  282. claude_mpm/services/framework_claude_md_generator/version_manager.py +4 -5
  283. claude_mpm/services/hook_service.py +6 -9
  284. claude_mpm/services/infrastructure/__init__.py +1 -1
  285. claude_mpm/services/infrastructure/context_preservation.py +8 -12
  286. claude_mpm/services/infrastructure/monitoring.py +21 -23
  287. claude_mpm/services/mcp_gateway/__init__.py +37 -37
  288. claude_mpm/services/mcp_gateway/auto_configure.py +95 -103
  289. claude_mpm/services/mcp_gateway/config/__init__.py +1 -1
  290. claude_mpm/services/mcp_gateway/config/config_loader.py +23 -25
  291. claude_mpm/services/mcp_gateway/config/config_schema.py +5 -5
  292. claude_mpm/services/mcp_gateway/config/configuration.py +9 -6
  293. claude_mpm/services/mcp_gateway/core/__init__.py +10 -10
  294. claude_mpm/services/mcp_gateway/core/base.py +0 -3
  295. claude_mpm/services/mcp_gateway/core/interfaces.py +1 -38
  296. claude_mpm/services/mcp_gateway/core/process_pool.py +99 -93
  297. claude_mpm/services/mcp_gateway/core/singleton_manager.py +65 -62
  298. claude_mpm/services/mcp_gateway/core/startup_verification.py +75 -74
  299. claude_mpm/services/mcp_gateway/main.py +2 -1
  300. claude_mpm/services/mcp_gateway/registry/service_registry.py +5 -8
  301. claude_mpm/services/mcp_gateway/registry/tool_registry.py +1 -1
  302. claude_mpm/services/mcp_gateway/server/__init__.py +1 -1
  303. claude_mpm/services/mcp_gateway/server/mcp_gateway.py +12 -19
  304. claude_mpm/services/mcp_gateway/server/stdio_handler.py +4 -3
  305. claude_mpm/services/mcp_gateway/server/stdio_server.py +79 -71
  306. claude_mpm/services/mcp_gateway/tools/__init__.py +2 -2
  307. claude_mpm/services/mcp_gateway/tools/base_adapter.py +5 -6
  308. claude_mpm/services/mcp_gateway/tools/document_summarizer.py +13 -22
  309. claude_mpm/services/mcp_gateway/tools/health_check_tool.py +79 -78
  310. claude_mpm/services/mcp_gateway/tools/hello_world.py +12 -14
  311. claude_mpm/services/mcp_gateway/tools/ticket_tools.py +42 -49
  312. claude_mpm/services/mcp_gateway/tools/unified_ticket_tool.py +51 -55
  313. claude_mpm/services/memory/__init__.py +3 -3
  314. claude_mpm/services/memory/builder.py +3 -6
  315. claude_mpm/services/memory/cache/__init__.py +1 -1
  316. claude_mpm/services/memory/cache/shared_prompt_cache.py +3 -5
  317. claude_mpm/services/memory/cache/simple_cache.py +1 -1
  318. claude_mpm/services/memory/indexed_memory.py +5 -7
  319. claude_mpm/services/memory/optimizer.py +7 -10
  320. claude_mpm/services/memory/router.py +8 -9
  321. claude_mpm/services/memory_hook_service.py +48 -34
  322. claude_mpm/services/monitor_build_service.py +77 -73
  323. claude_mpm/services/port_manager.py +130 -108
  324. claude_mpm/services/project/analyzer.py +12 -10
  325. claude_mpm/services/project/registry.py +11 -11
  326. claude_mpm/services/recovery_manager.py +10 -19
  327. claude_mpm/services/response_tracker.py +0 -1
  328. claude_mpm/services/runner_configuration_service.py +19 -20
  329. claude_mpm/services/session_management_service.py +7 -11
  330. claude_mpm/services/shared/__init__.py +1 -1
  331. claude_mpm/services/shared/async_service_base.py +58 -50
  332. claude_mpm/services/shared/config_service_base.py +73 -67
  333. claude_mpm/services/shared/lifecycle_service_base.py +82 -78
  334. claude_mpm/services/shared/manager_base.py +94 -82
  335. claude_mpm/services/shared/service_factory.py +96 -98
  336. claude_mpm/services/socketio/__init__.py +3 -3
  337. claude_mpm/services/socketio/client_proxy.py +5 -5
  338. claude_mpm/services/socketio/event_normalizer.py +199 -181
  339. claude_mpm/services/socketio/handlers/__init__.py +3 -3
  340. claude_mpm/services/socketio/handlers/base.py +5 -4
  341. claude_mpm/services/socketio/handlers/connection.py +163 -136
  342. claude_mpm/services/socketio/handlers/file.py +13 -14
  343. claude_mpm/services/socketio/handlers/git.py +12 -7
  344. claude_mpm/services/socketio/handlers/hook.py +49 -44
  345. claude_mpm/services/socketio/handlers/memory.py +0 -1
  346. claude_mpm/services/socketio/handlers/project.py +0 -1
  347. claude_mpm/services/socketio/handlers/registry.py +37 -19
  348. claude_mpm/services/socketio/migration_utils.py +98 -84
  349. claude_mpm/services/socketio/server/__init__.py +1 -1
  350. claude_mpm/services/socketio/server/broadcaster.py +81 -87
  351. claude_mpm/services/socketio/server/core.py +65 -54
  352. claude_mpm/services/socketio/server/eventbus_integration.py +95 -56
  353. claude_mpm/services/socketio/server/main.py +64 -38
  354. claude_mpm/services/socketio_client_manager.py +10 -12
  355. claude_mpm/services/subprocess_launcher_service.py +4 -7
  356. claude_mpm/services/system_instructions_service.py +13 -14
  357. claude_mpm/services/ticket_manager.py +2 -2
  358. claude_mpm/services/utility_service.py +5 -13
  359. claude_mpm/services/version_control/__init__.py +16 -16
  360. claude_mpm/services/version_control/branch_strategy.py +5 -8
  361. claude_mpm/services/version_control/conflict_resolution.py +9 -23
  362. claude_mpm/services/version_control/git_operations.py +5 -7
  363. claude_mpm/services/version_control/semantic_versioning.py +16 -17
  364. claude_mpm/services/version_control/version_parser.py +13 -18
  365. claude_mpm/services/version_service.py +10 -11
  366. claude_mpm/storage/__init__.py +1 -1
  367. claude_mpm/storage/state_storage.py +22 -28
  368. claude_mpm/utils/__init__.py +6 -6
  369. claude_mpm/utils/agent_dependency_loader.py +47 -33
  370. claude_mpm/utils/config_manager.py +11 -14
  371. claude_mpm/utils/dependency_cache.py +1 -1
  372. claude_mpm/utils/dependency_manager.py +13 -17
  373. claude_mpm/utils/dependency_strategies.py +8 -10
  374. claude_mpm/utils/environment_context.py +3 -9
  375. claude_mpm/utils/error_handler.py +3 -13
  376. claude_mpm/utils/file_utils.py +1 -1
  377. claude_mpm/utils/path_operations.py +8 -12
  378. claude_mpm/utils/robust_installer.py +110 -33
  379. claude_mpm/utils/subprocess_utils.py +5 -6
  380. claude_mpm/validation/agent_validator.py +3 -6
  381. claude_mpm/validation/frontmatter_validator.py +1 -1
  382. {claude_mpm-4.1.1.dist-info → claude_mpm-4.1.3.dist-info}/METADATA +1 -1
  383. claude_mpm-4.1.3.dist-info/RECORD +528 -0
  384. claude_mpm/cli/commands/run_config_checker.py +0 -160
  385. claude_mpm-4.1.1.dist-info/RECORD +0 -494
  386. {claude_mpm-4.1.1.dist-info → claude_mpm-4.1.3.dist-info}/WHEEL +0 -0
  387. {claude_mpm-4.1.1.dist-info → claude_mpm-4.1.3.dist-info}/entry_points.txt +0 -0
  388. {claude_mpm-4.1.1.dist-info → claude_mpm-4.1.3.dist-info}/licenses/LICENSE +0 -0
  389. {claude_mpm-4.1.1.dist-info → claude_mpm-4.1.3.dist-info}/top_level.txt +0 -0
@@ -5,13 +5,12 @@ This module provides individual event handlers for different types of
5
5
  Claude Code hook events.
6
6
  """
7
7
 
8
- import json
9
8
  import os
10
9
  import re
11
10
  import subprocess
12
11
  import sys
13
12
  from datetime import datetime
14
- from typing import Any, Dict, Optional
13
+ from typing import Optional
15
14
 
16
15
  # Import tool analysis with fallback for direct execution
17
16
  try:
@@ -221,7 +220,7 @@ class EventHandlers:
221
220
  self.hook_handler._track_delegation(session_id, agent_type, request_data)
222
221
 
223
222
  if DEBUG:
224
- print(f" - Delegation tracked successfully", file=sys.stderr)
223
+ print(" - Delegation tracked successfully", file=sys.stderr)
225
224
  print(
226
225
  f" - Request data keys: {list(request_data.keys())}",
227
226
  file=sys.stderr,
@@ -257,7 +256,56 @@ class EventHandlers:
257
256
  "", "subagent_start", subagent_start_data
258
257
  )
259
258
 
260
- def _get_git_branch(self, working_dir: str = None) -> str:
259
+ # Log agent prompt if LogManager is available
260
+ try:
261
+ from claude_mpm.core.log_manager import get_log_manager
262
+
263
+ log_manager = get_log_manager()
264
+
265
+ # Prepare prompt content
266
+ prompt_content = tool_input.get("prompt", "")
267
+ if not prompt_content:
268
+ prompt_content = tool_input.get("description", "")
269
+
270
+ if prompt_content:
271
+ import asyncio
272
+
273
+ # Prepare metadata
274
+ metadata = {
275
+ "agent_type": agent_type,
276
+ "agent_id": f"{agent_type}_{session_id}",
277
+ "session_id": session_id,
278
+ "delegation_context": {
279
+ "description": tool_input.get("description", ""),
280
+ "timestamp": datetime.now().isoformat(),
281
+ },
282
+ }
283
+
284
+ # Log the agent prompt asynchronously
285
+ try:
286
+ loop = asyncio.get_running_loop()
287
+ asyncio.create_task(
288
+ log_manager.log_prompt(
289
+ f"agent_{agent_type}", prompt_content, metadata
290
+ )
291
+ )
292
+ except RuntimeError:
293
+ # No running loop, create one
294
+ loop = asyncio.new_event_loop()
295
+ asyncio.set_event_loop(loop)
296
+ loop.run_until_complete(
297
+ log_manager.log_prompt(
298
+ f"agent_{agent_type}", prompt_content, metadata
299
+ )
300
+ )
301
+
302
+ if DEBUG:
303
+ print(f" - Agent prompt logged for {agent_type}", file=sys.stderr)
304
+ except Exception as e:
305
+ if DEBUG:
306
+ print(f" - Could not log agent prompt: {e}", file=sys.stderr)
307
+
308
+ def _get_git_branch(self, working_dir: Optional[str] = None) -> str:
261
309
  """Get git branch for the given directory with caching."""
262
310
  # Use current working directory if not specified
263
311
  if not working_dir:
@@ -285,7 +333,8 @@ class EventHandlers:
285
333
  ["git", "branch", "--show-current"],
286
334
  capture_output=True,
287
335
  text=True,
288
- timeout=TimeoutConfig.QUICK_TIMEOUT, # Quick timeout to avoid hanging
336
+ timeout=TimeoutConfig.QUICK_TIMEOUT,
337
+ check=False, # Quick timeout to avoid hanging
289
338
  )
290
339
 
291
340
  # Restore original directory
@@ -297,11 +346,10 @@ class EventHandlers:
297
346
  self.hook_handler._git_branch_cache[cache_key] = branch
298
347
  self.hook_handler._git_branch_cache_time[cache_key] = current_time
299
348
  return branch
300
- else:
301
- # Not a git repository or no branch
302
- self.hook_handler._git_branch_cache[cache_key] = "Unknown"
303
- self.hook_handler._git_branch_cache_time[cache_key] = current_time
304
- return "Unknown"
349
+ # Not a git repository or no branch
350
+ self.hook_handler._git_branch_cache[cache_key] = "Unknown"
351
+ self.hook_handler._git_branch_cache_time[cache_key] = current_time
352
+ return "Unknown"
305
353
 
306
354
  except (
307
355
  subprocess.TimeoutExpired,
@@ -339,11 +387,11 @@ class EventHandlers:
339
387
  "tool_name": tool_name,
340
388
  "exit_code": exit_code,
341
389
  "success": exit_code == 0,
342
- "status": "success"
343
- if exit_code == 0
344
- else "blocked"
345
- if exit_code == 2
346
- else "error",
390
+ "status": (
391
+ "success"
392
+ if exit_code == 0
393
+ else "blocked" if exit_code == 2 else "error"
394
+ ),
347
395
  "duration_ms": duration,
348
396
  "result_summary": result_data,
349
397
  "session_id": event.get("session_id", ""),
@@ -412,9 +460,7 @@ class EventHandlers:
412
460
  }
413
461
 
414
462
  # Emit normalized event
415
- self.hook_handler._emit_socketio_event(
416
- "", "notification", notification_data
417
- )
463
+ self.hook_handler._emit_socketio_event("", "notification", notification_data)
418
464
 
419
465
  def handle_stop_fast(self, event):
420
466
  """Handle stop events when Claude processing stops.
@@ -448,9 +494,9 @@ class EventHandlers:
448
494
  return {
449
495
  "timestamp": datetime.now().isoformat(),
450
496
  "working_directory": working_dir,
451
- "git_branch": self._get_git_branch(working_dir)
452
- if working_dir
453
- else "Unknown",
497
+ "git_branch": (
498
+ self._get_git_branch(working_dir) if working_dir else "Unknown"
499
+ ),
454
500
  "event_type": "stop",
455
501
  "reason": event.get("reason", "unknown"),
456
502
  "stop_type": event.get("stop_type", "normal"),
@@ -497,124 +543,13 @@ class EventHandlers:
497
543
  self.hook_handler._emit_socketio_event("", "stop", stop_data)
498
544
 
499
545
  def handle_subagent_stop_fast(self, event):
500
- """Handle subagent stop events with improved agent type detection."""
501
- # Enhanced debug logging for session correlation
502
- session_id = event.get("session_id", "")
503
- if DEBUG:
504
- print(
505
- f" - session_id: {session_id[:16] if session_id else 'None'}...",
506
- file=sys.stderr,
507
- )
508
- print(f" - event keys: {list(event.keys())}", file=sys.stderr)
509
- print(
510
- f" - delegation_requests size: {len(self.hook_handler.delegation_requests)}",
511
- file=sys.stderr,
512
- )
513
-
514
- # First try to get agent type from our tracking
515
- agent_type = (
516
- self.hook_handler._get_delegation_agent_type(session_id)
517
- if session_id
518
- else "unknown"
519
- )
520
-
521
- # Fall back to event data if tracking didn't have it
522
- if agent_type == "unknown":
523
- agent_type = event.get("agent_type", event.get("subagent_type", "unknown"))
524
-
525
- agent_id = event.get("agent_id", event.get("subagent_id", ""))
526
- reason = event.get("reason", event.get("stop_reason", "unknown"))
527
-
528
- # Try to infer agent type from other fields if still unknown
529
- if agent_type == "unknown" and "task" in event:
530
- task_desc = str(event.get("task", "")).lower()
531
- if "research" in task_desc:
532
- agent_type = "research"
533
- elif "engineer" in task_desc or "code" in task_desc:
534
- agent_type = "engineer"
535
- elif "pm" in task_desc or "project" in task_desc:
536
- agent_type = "pm"
537
-
538
- # Always log SubagentStop events for debugging
539
- if DEBUG or agent_type != "unknown":
540
- print(
541
- f"Hook handler: Processing SubagentStop - agent: '{agent_type}', session: '{session_id}', reason: '{reason}'",
542
- file=sys.stderr,
543
- )
544
-
545
- # Get working directory and git branch
546
- working_dir = event.get("cwd", "")
547
- git_branch = self._get_git_branch(working_dir) if working_dir else "Unknown"
548
-
549
- # Try to extract structured response from output if available
550
- output = event.get("output", "")
551
- structured_response = None
552
- if output:
553
- try:
554
- json_match = re.search(
555
- r"```json\s*(\{.*?\})\s*```", str(output), re.DOTALL
556
- )
557
- if json_match:
558
- structured_response = json.loads(json_match.group(1))
559
- if DEBUG:
560
- print(
561
- f"Extracted structured response from {agent_type} agent in SubagentStop",
562
- file=sys.stderr,
563
- )
564
- except (json.JSONDecodeError, AttributeError):
565
- pass # No structured response, that's okay
566
-
567
- # Handle response tracking with fuzzy matching
568
- self._handle_subagent_response_tracking(
569
- session_id,
570
- agent_type,
571
- reason,
572
- output,
573
- structured_response,
574
- working_dir,
575
- git_branch,
576
- )
577
-
578
- # Prepare subagent stop data
579
- subagent_stop_data = {
580
- "agent_type": agent_type,
581
- "agent_id": agent_id,
582
- "reason": reason,
583
- "session_id": session_id,
584
- "working_directory": working_dir,
585
- "git_branch": git_branch,
586
- "timestamp": datetime.now().isoformat(),
587
- "is_successful_completion": reason in ["completed", "finished", "done"],
588
- "is_error_termination": reason in ["error", "timeout", "failed", "blocked"],
589
- "is_delegation_related": agent_type
590
- in ["research", "engineer", "pm", "ops", "qa", "documentation", "security"],
591
- "has_results": bool(event.get("results") or event.get("output")),
592
- "duration_context": event.get("duration_ms"),
593
- "hook_event_name": "SubagentStop", # Explicitly set for dashboard
594
- }
595
-
596
- # Add structured response data if available
597
- if structured_response:
598
- subagent_stop_data["structured_response"] = {
599
- "task_completed": structured_response.get("task_completed", False),
600
- "instructions": structured_response.get("instructions", ""),
601
- "results": structured_response.get("results", ""),
602
- "files_modified": structured_response.get("files_modified", []),
603
- "tools_used": structured_response.get("tools_used", []),
604
- "remember": structured_response.get("remember"),
605
- }
606
-
607
- # Debug log the processed data
608
- if DEBUG:
609
- print(
610
- f"SubagentStop processed data: agent_type='{agent_type}', session_id='{session_id}'",
611
- file=sys.stderr,
612
- )
613
-
614
- # Emit normalized event with high priority
615
- self.hook_handler._emit_socketio_event(
616
- "", "subagent_stop", subagent_stop_data
617
- )
546
+ """Handle subagent stop events by delegating to the specialized processor."""
547
+ # Delegate to the specialized subagent processor
548
+ if hasattr(self.hook_handler, "subagent_processor"):
549
+ self.hook_handler.subagent_processor.process_subagent_stop(event)
550
+ else:
551
+ # Fallback to handle_subagent_stop if processor not available
552
+ self.hook_handler.handle_subagent_stop(event)
618
553
 
619
554
  def _handle_subagent_response_tracking(
620
555
  self,
@@ -665,9 +600,9 @@ class EventHandlers:
665
600
  )
666
601
  # Update the key to use the current session_id for consistency
667
602
  if request_info:
668
- self.hook_handler.delegation_requests[
669
- session_id
670
- ] = request_info
603
+ self.hook_handler.delegation_requests[session_id] = (
604
+ request_info
605
+ )
671
606
  # Optionally remove the old key to avoid duplicates
672
607
  if stored_sid != session_id:
673
608
  del self.hook_handler.delegation_requests[stored_sid]
@@ -750,7 +685,7 @@ class EventHandlers:
750
685
 
751
686
  def handle_assistant_response(self, event):
752
687
  """Handle assistant response events for comprehensive response tracking.
753
-
688
+
754
689
  WHY emit assistant response events:
755
690
  - Provides visibility into Claude's responses to user prompts
756
691
  - Captures response content and metadata for analysis
@@ -761,19 +696,21 @@ class EventHandlers:
761
696
  self.hook_handler.response_tracking_manager.track_assistant_response(
762
697
  event, self.hook_handler.pending_prompts
763
698
  )
764
-
699
+
765
700
  # Get working directory and git branch
766
701
  working_dir = event.get("cwd", "")
767
702
  git_branch = self._get_git_branch(working_dir) if working_dir else "Unknown"
768
-
703
+
769
704
  # Extract response data
770
705
  response_text = event.get("response", "")
771
706
  session_id = event.get("session_id", "")
772
-
707
+
773
708
  # Prepare assistant response data for Socket.IO emission
774
709
  assistant_response_data = {
775
710
  "response_text": response_text,
776
- "response_preview": response_text[:500] if len(response_text) > 500 else response_text,
711
+ "response_preview": (
712
+ response_text[:500] if len(response_text) > 500 else response_text
713
+ ),
777
714
  "response_length": len(response_text),
778
715
  "session_id": session_id,
779
716
  "working_directory": working_dir,
@@ -782,24 +719,32 @@ class EventHandlers:
782
719
  "contains_code": "```" in response_text,
783
720
  "contains_json": "```json" in response_text,
784
721
  "hook_event_name": "AssistantResponse", # Explicitly set for dashboard
785
- "has_structured_response": bool(re.search(r"```json\s*\{.*?\}\s*```", response_text, re.DOTALL)),
722
+ "has_structured_response": bool(
723
+ re.search(r"```json\s*\{.*?\}\s*```", response_text, re.DOTALL)
724
+ ),
786
725
  }
787
-
726
+
788
727
  # Check if this is a response to a tracked prompt
789
728
  if session_id in self.hook_handler.pending_prompts:
790
729
  prompt_data = self.hook_handler.pending_prompts[session_id]
791
- assistant_response_data["original_prompt"] = prompt_data.get("prompt", "")[:200]
792
- assistant_response_data["prompt_timestamp"] = prompt_data.get("timestamp", "")
730
+ assistant_response_data["original_prompt"] = prompt_data.get("prompt", "")[
731
+ :200
732
+ ]
733
+ assistant_response_data["prompt_timestamp"] = prompt_data.get(
734
+ "timestamp", ""
735
+ )
793
736
  assistant_response_data["is_tracked_response"] = True
794
737
  else:
795
738
  assistant_response_data["is_tracked_response"] = False
796
-
739
+
797
740
  # Debug logging
798
741
  if DEBUG:
799
742
  print(
800
743
  f"Hook handler: Processing AssistantResponse - session: '{session_id}', response_length: {len(response_text)}",
801
744
  file=sys.stderr,
802
745
  )
803
-
746
+
804
747
  # Emit normalized event
805
- self.hook_handler._emit_socketio_event("", "assistant_response", assistant_response_data)
748
+ self.hook_handler._emit_socketio_event(
749
+ "", "assistant_response", assistant_response_data
750
+ )