claude-mpm 3.9.9__py3-none-any.whl → 4.0.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 (411) hide show
  1. claude_mpm/VERSION +1 -1
  2. claude_mpm/__init__.py +2 -2
  3. claude_mpm/__main__.py +3 -2
  4. claude_mpm/agents/__init__.py +85 -79
  5. claude_mpm/agents/agent_loader.py +464 -1003
  6. claude_mpm/agents/agent_loader_integration.py +45 -45
  7. claude_mpm/agents/agents_metadata.py +29 -30
  8. claude_mpm/agents/async_agent_loader.py +156 -138
  9. claude_mpm/agents/base_agent.json +1 -1
  10. claude_mpm/agents/base_agent_loader.py +179 -151
  11. claude_mpm/agents/frontmatter_validator.py +229 -130
  12. claude_mpm/agents/schema/agent_schema.json +1 -1
  13. claude_mpm/agents/system_agent_config.py +213 -147
  14. claude_mpm/agents/templates/__init__.py +13 -13
  15. claude_mpm/agents/templates/code_analyzer.json +2 -2
  16. claude_mpm/agents/templates/data_engineer.json +1 -1
  17. claude_mpm/agents/templates/documentation.json +23 -11
  18. claude_mpm/agents/templates/engineer.json +22 -6
  19. claude_mpm/agents/templates/memory_manager.json +155 -0
  20. claude_mpm/agents/templates/ops.json +2 -2
  21. claude_mpm/agents/templates/project_organizer.json +1 -1
  22. claude_mpm/agents/templates/qa.json +1 -1
  23. claude_mpm/agents/templates/refactoring_engineer.json +222 -0
  24. claude_mpm/agents/templates/research.json +20 -14
  25. claude_mpm/agents/templates/security.json +1 -1
  26. claude_mpm/agents/templates/ticketing.json +1 -1
  27. claude_mpm/agents/templates/version_control.json +1 -1
  28. claude_mpm/agents/templates/web_qa.json +3 -1
  29. claude_mpm/agents/templates/web_ui.json +2 -2
  30. claude_mpm/cli/__init__.py +90 -49
  31. claude_mpm/cli/__main__.py +3 -2
  32. claude_mpm/cli/commands/__init__.py +21 -18
  33. claude_mpm/cli/commands/agents.py +279 -247
  34. claude_mpm/cli/commands/aggregate.py +138 -157
  35. claude_mpm/cli/commands/cleanup.py +147 -147
  36. claude_mpm/cli/commands/config.py +93 -76
  37. claude_mpm/cli/commands/info.py +17 -16
  38. claude_mpm/cli/commands/mcp.py +143 -762
  39. claude_mpm/cli/commands/mcp_command_router.py +139 -0
  40. claude_mpm/cli/commands/mcp_config_commands.py +20 -0
  41. claude_mpm/cli/commands/mcp_install_commands.py +20 -0
  42. claude_mpm/cli/commands/mcp_server_commands.py +175 -0
  43. claude_mpm/cli/commands/mcp_tool_commands.py +34 -0
  44. claude_mpm/cli/commands/memory.py +239 -203
  45. claude_mpm/cli/commands/monitor.py +203 -81
  46. claude_mpm/cli/commands/run.py +380 -429
  47. claude_mpm/cli/commands/run_config_checker.py +160 -0
  48. claude_mpm/cli/commands/socketio_monitor.py +235 -0
  49. claude_mpm/cli/commands/tickets.py +305 -197
  50. claude_mpm/cli/parser.py +24 -1150
  51. claude_mpm/cli/parsers/__init__.py +29 -0
  52. claude_mpm/cli/parsers/agents_parser.py +136 -0
  53. claude_mpm/cli/parsers/base_parser.py +331 -0
  54. claude_mpm/cli/parsers/config_parser.py +85 -0
  55. claude_mpm/cli/parsers/mcp_parser.py +152 -0
  56. claude_mpm/cli/parsers/memory_parser.py +138 -0
  57. claude_mpm/cli/parsers/monitor_parser.py +104 -0
  58. claude_mpm/cli/parsers/run_parser.py +147 -0
  59. claude_mpm/cli/parsers/tickets_parser.py +203 -0
  60. claude_mpm/cli/ticket_cli.py +7 -3
  61. claude_mpm/cli/utils.py +55 -37
  62. claude_mpm/cli_module/__init__.py +6 -6
  63. claude_mpm/cli_module/args.py +188 -140
  64. claude_mpm/cli_module/commands.py +79 -70
  65. claude_mpm/cli_module/migration_example.py +38 -60
  66. claude_mpm/config/__init__.py +32 -25
  67. claude_mpm/config/agent_config.py +151 -119
  68. claude_mpm/config/experimental_features.py +217 -0
  69. claude_mpm/config/paths.py +94 -208
  70. claude_mpm/config/socketio_config.py +84 -73
  71. claude_mpm/constants.py +36 -18
  72. claude_mpm/core/__init__.py +9 -6
  73. claude_mpm/core/agent_name_normalizer.py +68 -71
  74. claude_mpm/core/agent_registry.py +372 -521
  75. claude_mpm/core/agent_session_manager.py +74 -63
  76. claude_mpm/core/base_service.py +116 -87
  77. claude_mpm/core/cache.py +119 -153
  78. claude_mpm/core/claude_runner.py +425 -1120
  79. claude_mpm/core/config.py +263 -168
  80. claude_mpm/core/config_aliases.py +69 -61
  81. claude_mpm/core/config_constants.py +292 -0
  82. claude_mpm/core/constants.py +57 -99
  83. claude_mpm/core/container.py +211 -178
  84. claude_mpm/core/exceptions.py +233 -89
  85. claude_mpm/core/factories.py +92 -54
  86. claude_mpm/core/framework_loader.py +378 -220
  87. claude_mpm/core/hook_manager.py +198 -83
  88. claude_mpm/core/hook_performance_config.py +136 -0
  89. claude_mpm/core/injectable_service.py +61 -55
  90. claude_mpm/core/interactive_session.py +165 -155
  91. claude_mpm/core/interfaces.py +221 -195
  92. claude_mpm/core/lazy.py +96 -96
  93. claude_mpm/core/logger.py +133 -107
  94. claude_mpm/core/logging_config.py +185 -157
  95. claude_mpm/core/minimal_framework_loader.py +20 -15
  96. claude_mpm/core/mixins.py +30 -29
  97. claude_mpm/core/oneshot_session.py +215 -181
  98. claude_mpm/core/optimized_agent_loader.py +134 -138
  99. claude_mpm/core/optimized_startup.py +159 -157
  100. claude_mpm/core/pm_hook_interceptor.py +85 -72
  101. claude_mpm/core/service_registry.py +103 -101
  102. claude_mpm/core/session_manager.py +97 -87
  103. claude_mpm/core/socketio_pool.py +212 -158
  104. claude_mpm/core/tool_access_control.py +58 -51
  105. claude_mpm/core/types.py +46 -24
  106. claude_mpm/core/typing_utils.py +166 -82
  107. claude_mpm/core/unified_agent_registry.py +721 -0
  108. claude_mpm/core/unified_config.py +550 -0
  109. claude_mpm/core/unified_paths.py +549 -0
  110. claude_mpm/dashboard/index.html +1 -1
  111. claude_mpm/dashboard/open_dashboard.py +51 -17
  112. claude_mpm/dashboard/static/css/dashboard.css +27 -8
  113. claude_mpm/dashboard/static/dist/components/agent-inference.js +2 -0
  114. claude_mpm/dashboard/static/dist/components/event-processor.js +2 -0
  115. claude_mpm/dashboard/static/dist/components/event-viewer.js +2 -0
  116. claude_mpm/dashboard/static/dist/components/export-manager.js +2 -0
  117. claude_mpm/dashboard/static/dist/components/file-tool-tracker.js +2 -0
  118. claude_mpm/dashboard/static/dist/components/hud-library-loader.js +2 -0
  119. claude_mpm/dashboard/static/dist/components/hud-manager.js +2 -0
  120. claude_mpm/dashboard/static/dist/components/hud-visualizer.js +2 -0
  121. claude_mpm/dashboard/static/dist/components/module-viewer.js +2 -0
  122. claude_mpm/dashboard/static/dist/components/session-manager.js +2 -0
  123. claude_mpm/dashboard/static/dist/components/socket-manager.js +2 -0
  124. claude_mpm/dashboard/static/dist/components/ui-state-manager.js +2 -0
  125. claude_mpm/dashboard/static/dist/components/working-directory.js +2 -0
  126. claude_mpm/dashboard/static/dist/dashboard.js +2 -0
  127. claude_mpm/dashboard/static/dist/socket-client.js +2 -0
  128. claude_mpm/dashboard/static/js/components/agent-inference.js +80 -76
  129. claude_mpm/dashboard/static/js/components/event-processor.js +71 -67
  130. claude_mpm/dashboard/static/js/components/event-viewer.js +74 -70
  131. claude_mpm/dashboard/static/js/components/export-manager.js +31 -28
  132. claude_mpm/dashboard/static/js/components/file-tool-tracker.js +106 -92
  133. claude_mpm/dashboard/static/js/components/hud-library-loader.js +11 -11
  134. claude_mpm/dashboard/static/js/components/hud-manager.js +73 -73
  135. claude_mpm/dashboard/static/js/components/hud-visualizer.js +163 -163
  136. claude_mpm/dashboard/static/js/components/module-viewer.js +305 -233
  137. claude_mpm/dashboard/static/js/components/session-manager.js +32 -29
  138. claude_mpm/dashboard/static/js/components/socket-manager.js +27 -20
  139. claude_mpm/dashboard/static/js/components/ui-state-manager.js +21 -18
  140. claude_mpm/dashboard/static/js/components/working-directory.js +74 -71
  141. claude_mpm/dashboard/static/js/dashboard.js +178 -453
  142. claude_mpm/dashboard/static/js/extension-error-handler.js +164 -0
  143. claude_mpm/dashboard/static/js/socket-client.js +120 -54
  144. claude_mpm/dashboard/templates/index.html +40 -50
  145. claude_mpm/experimental/cli_enhancements.py +60 -58
  146. claude_mpm/generators/__init__.py +1 -1
  147. claude_mpm/generators/agent_profile_generator.py +75 -65
  148. claude_mpm/hooks/__init__.py +1 -1
  149. claude_mpm/hooks/base_hook.py +33 -28
  150. claude_mpm/hooks/claude_hooks/__init__.py +1 -1
  151. claude_mpm/hooks/claude_hooks/connection_pool.py +120 -0
  152. claude_mpm/hooks/claude_hooks/event_handlers.py +743 -0
  153. claude_mpm/hooks/claude_hooks/hook_handler.py +415 -1331
  154. claude_mpm/hooks/claude_hooks/hook_wrapper.sh +4 -4
  155. claude_mpm/hooks/claude_hooks/memory_integration.py +221 -0
  156. claude_mpm/hooks/claude_hooks/response_tracking.py +348 -0
  157. claude_mpm/hooks/claude_hooks/tool_analysis.py +230 -0
  158. claude_mpm/hooks/memory_integration_hook.py +140 -100
  159. claude_mpm/hooks/tool_call_interceptor.py +89 -76
  160. claude_mpm/hooks/validation_hooks.py +57 -49
  161. claude_mpm/init.py +145 -121
  162. claude_mpm/models/__init__.py +9 -9
  163. claude_mpm/models/agent_definition.py +33 -23
  164. claude_mpm/models/agent_session.py +228 -200
  165. claude_mpm/scripts/__init__.py +1 -1
  166. claude_mpm/scripts/socketio_daemon.py +192 -75
  167. claude_mpm/scripts/socketio_server_manager.py +328 -0
  168. claude_mpm/scripts/start_activity_logging.py +25 -22
  169. claude_mpm/services/__init__.py +68 -43
  170. claude_mpm/services/agent_capabilities_service.py +271 -0
  171. claude_mpm/services/agents/__init__.py +23 -32
  172. claude_mpm/services/agents/deployment/__init__.py +3 -3
  173. claude_mpm/services/agents/deployment/agent_config_provider.py +310 -0
  174. claude_mpm/services/agents/deployment/agent_configuration_manager.py +359 -0
  175. claude_mpm/services/agents/deployment/agent_definition_factory.py +84 -0
  176. claude_mpm/services/agents/deployment/agent_deployment.py +415 -2113
  177. claude_mpm/services/agents/deployment/agent_discovery_service.py +387 -0
  178. claude_mpm/services/agents/deployment/agent_environment_manager.py +293 -0
  179. claude_mpm/services/agents/deployment/agent_filesystem_manager.py +387 -0
  180. claude_mpm/services/agents/deployment/agent_format_converter.py +453 -0
  181. claude_mpm/services/agents/deployment/agent_frontmatter_validator.py +161 -0
  182. claude_mpm/services/agents/deployment/agent_lifecycle_manager.py +345 -495
  183. claude_mpm/services/agents/deployment/agent_metrics_collector.py +279 -0
  184. claude_mpm/services/agents/deployment/agent_restore_handler.py +88 -0
  185. claude_mpm/services/agents/deployment/agent_template_builder.py +406 -0
  186. claude_mpm/services/agents/deployment/agent_validator.py +352 -0
  187. claude_mpm/services/agents/deployment/agent_version_manager.py +313 -0
  188. claude_mpm/services/agents/deployment/agent_versioning.py +6 -9
  189. claude_mpm/services/agents/deployment/agents_directory_resolver.py +79 -0
  190. claude_mpm/services/agents/deployment/async_agent_deployment.py +298 -234
  191. claude_mpm/services/agents/deployment/config/__init__.py +13 -0
  192. claude_mpm/services/agents/deployment/config/deployment_config.py +182 -0
  193. claude_mpm/services/agents/deployment/config/deployment_config_manager.py +200 -0
  194. claude_mpm/services/agents/deployment/deployment_config_loader.py +54 -0
  195. claude_mpm/services/agents/deployment/deployment_type_detector.py +124 -0
  196. claude_mpm/services/agents/deployment/facade/__init__.py +18 -0
  197. claude_mpm/services/agents/deployment/facade/async_deployment_executor.py +159 -0
  198. claude_mpm/services/agents/deployment/facade/deployment_executor.py +73 -0
  199. claude_mpm/services/agents/deployment/facade/deployment_facade.py +270 -0
  200. claude_mpm/services/agents/deployment/facade/sync_deployment_executor.py +178 -0
  201. claude_mpm/services/agents/deployment/interface_adapter.py +227 -0
  202. claude_mpm/services/agents/deployment/lifecycle_health_checker.py +85 -0
  203. claude_mpm/services/agents/deployment/lifecycle_performance_tracker.py +100 -0
  204. claude_mpm/services/agents/deployment/pipeline/__init__.py +32 -0
  205. claude_mpm/services/agents/deployment/pipeline/pipeline_builder.py +158 -0
  206. claude_mpm/services/agents/deployment/pipeline/pipeline_context.py +159 -0
  207. claude_mpm/services/agents/deployment/pipeline/pipeline_executor.py +169 -0
  208. claude_mpm/services/agents/deployment/pipeline/steps/__init__.py +19 -0
  209. claude_mpm/services/agents/deployment/pipeline/steps/agent_processing_step.py +195 -0
  210. claude_mpm/services/agents/deployment/pipeline/steps/base_step.py +119 -0
  211. claude_mpm/services/agents/deployment/pipeline/steps/configuration_step.py +79 -0
  212. claude_mpm/services/agents/deployment/pipeline/steps/target_directory_step.py +90 -0
  213. claude_mpm/services/agents/deployment/pipeline/steps/validation_step.py +100 -0
  214. claude_mpm/services/agents/deployment/processors/__init__.py +15 -0
  215. claude_mpm/services/agents/deployment/processors/agent_deployment_context.py +98 -0
  216. claude_mpm/services/agents/deployment/processors/agent_deployment_result.py +235 -0
  217. claude_mpm/services/agents/deployment/processors/agent_processor.py +258 -0
  218. claude_mpm/services/agents/deployment/refactored_agent_deployment_service.py +318 -0
  219. claude_mpm/services/agents/deployment/results/__init__.py +13 -0
  220. claude_mpm/services/agents/deployment/results/deployment_metrics.py +200 -0
  221. claude_mpm/services/agents/deployment/results/deployment_result_builder.py +249 -0
  222. claude_mpm/services/agents/deployment/strategies/__init__.py +25 -0
  223. claude_mpm/services/agents/deployment/strategies/base_strategy.py +119 -0
  224. claude_mpm/services/agents/deployment/strategies/project_strategy.py +150 -0
  225. claude_mpm/services/agents/deployment/strategies/strategy_selector.py +117 -0
  226. claude_mpm/services/agents/deployment/strategies/system_strategy.py +116 -0
  227. claude_mpm/services/agents/deployment/strategies/user_strategy.py +137 -0
  228. claude_mpm/services/agents/deployment/system_instructions_deployer.py +108 -0
  229. claude_mpm/services/agents/deployment/validation/__init__.py +19 -0
  230. claude_mpm/services/agents/deployment/validation/agent_validator.py +323 -0
  231. claude_mpm/services/agents/deployment/validation/deployment_validator.py +238 -0
  232. claude_mpm/services/agents/deployment/validation/template_validator.py +299 -0
  233. claude_mpm/services/agents/deployment/validation/validation_result.py +226 -0
  234. claude_mpm/services/agents/loading/__init__.py +2 -2
  235. claude_mpm/services/agents/loading/agent_profile_loader.py +259 -229
  236. claude_mpm/services/agents/loading/base_agent_manager.py +90 -81
  237. claude_mpm/services/agents/loading/framework_agent_loader.py +154 -129
  238. claude_mpm/services/agents/management/__init__.py +2 -2
  239. claude_mpm/services/agents/management/agent_capabilities_generator.py +72 -58
  240. claude_mpm/services/agents/management/agent_management_service.py +209 -156
  241. claude_mpm/services/agents/memory/__init__.py +9 -6
  242. claude_mpm/services/agents/memory/agent_memory_manager.py +218 -1152
  243. claude_mpm/services/agents/memory/agent_persistence_service.py +20 -16
  244. claude_mpm/services/agents/memory/analyzer.py +430 -0
  245. claude_mpm/services/agents/memory/content_manager.py +376 -0
  246. claude_mpm/services/agents/memory/template_generator.py +468 -0
  247. claude_mpm/services/agents/registry/__init__.py +7 -10
  248. claude_mpm/services/agents/registry/deployed_agent_discovery.py +122 -97
  249. claude_mpm/services/agents/registry/modification_tracker.py +351 -285
  250. claude_mpm/services/async_session_logger.py +187 -153
  251. claude_mpm/services/claude_session_logger.py +87 -72
  252. claude_mpm/services/command_handler_service.py +217 -0
  253. claude_mpm/services/communication/__init__.py +3 -2
  254. claude_mpm/services/core/__init__.py +50 -97
  255. claude_mpm/services/core/base.py +60 -53
  256. claude_mpm/services/core/interfaces/__init__.py +188 -0
  257. claude_mpm/services/core/interfaces/agent.py +351 -0
  258. claude_mpm/services/core/interfaces/communication.py +343 -0
  259. claude_mpm/services/core/interfaces/infrastructure.py +413 -0
  260. claude_mpm/services/core/interfaces/service.py +434 -0
  261. claude_mpm/services/core/interfaces.py +19 -944
  262. claude_mpm/services/event_aggregator.py +208 -170
  263. claude_mpm/services/exceptions.py +387 -308
  264. claude_mpm/services/framework_claude_md_generator/__init__.py +75 -79
  265. claude_mpm/services/framework_claude_md_generator/content_assembler.py +69 -60
  266. claude_mpm/services/framework_claude_md_generator/content_validator.py +65 -61
  267. claude_mpm/services/framework_claude_md_generator/deployment_manager.py +68 -49
  268. claude_mpm/services/framework_claude_md_generator/section_generators/__init__.py +34 -34
  269. claude_mpm/services/framework_claude_md_generator/section_generators/agents.py +25 -22
  270. claude_mpm/services/framework_claude_md_generator/section_generators/claude_pm_init.py +10 -10
  271. claude_mpm/services/framework_claude_md_generator/section_generators/core_responsibilities.py +4 -3
  272. claude_mpm/services/framework_claude_md_generator/section_generators/delegation_constraints.py +4 -3
  273. claude_mpm/services/framework_claude_md_generator/section_generators/environment_config.py +4 -3
  274. claude_mpm/services/framework_claude_md_generator/section_generators/footer.py +6 -5
  275. claude_mpm/services/framework_claude_md_generator/section_generators/header.py +8 -7
  276. claude_mpm/services/framework_claude_md_generator/section_generators/orchestration_principles.py +4 -3
  277. claude_mpm/services/framework_claude_md_generator/section_generators/role_designation.py +6 -5
  278. claude_mpm/services/framework_claude_md_generator/section_generators/subprocess_validation.py +9 -8
  279. claude_mpm/services/framework_claude_md_generator/section_generators/todo_task_tools.py +4 -3
  280. claude_mpm/services/framework_claude_md_generator/section_generators/troubleshooting.py +5 -4
  281. claude_mpm/services/framework_claude_md_generator/section_manager.py +28 -27
  282. claude_mpm/services/framework_claude_md_generator/version_manager.py +30 -28
  283. claude_mpm/services/hook_service.py +106 -114
  284. claude_mpm/services/infrastructure/__init__.py +7 -5
  285. claude_mpm/services/infrastructure/context_preservation.py +571 -0
  286. claude_mpm/services/infrastructure/daemon_manager.py +279 -0
  287. claude_mpm/services/infrastructure/logging.py +83 -76
  288. claude_mpm/services/infrastructure/monitoring.py +547 -404
  289. claude_mpm/services/mcp_gateway/__init__.py +40 -23
  290. claude_mpm/services/mcp_gateway/config/__init__.py +2 -2
  291. claude_mpm/services/mcp_gateway/config/config_loader.py +61 -56
  292. claude_mpm/services/mcp_gateway/config/config_schema.py +50 -41
  293. claude_mpm/services/mcp_gateway/config/configuration.py +82 -75
  294. claude_mpm/services/mcp_gateway/core/__init__.py +14 -21
  295. claude_mpm/services/mcp_gateway/core/base.py +80 -67
  296. claude_mpm/services/mcp_gateway/core/exceptions.py +60 -46
  297. claude_mpm/services/mcp_gateway/core/interfaces.py +97 -93
  298. claude_mpm/services/mcp_gateway/main.py +307 -127
  299. claude_mpm/services/mcp_gateway/registry/__init__.py +1 -1
  300. claude_mpm/services/mcp_gateway/registry/service_registry.py +100 -101
  301. claude_mpm/services/mcp_gateway/registry/tool_registry.py +135 -126
  302. claude_mpm/services/mcp_gateway/server/__init__.py +4 -4
  303. claude_mpm/services/mcp_gateway/server/{mcp_server.py → mcp_gateway.py} +149 -153
  304. claude_mpm/services/mcp_gateway/server/stdio_handler.py +105 -107
  305. claude_mpm/services/mcp_gateway/server/stdio_server.py +691 -0
  306. claude_mpm/services/mcp_gateway/tools/__init__.py +4 -2
  307. claude_mpm/services/mcp_gateway/tools/base_adapter.py +110 -121
  308. claude_mpm/services/mcp_gateway/tools/document_summarizer.py +283 -215
  309. claude_mpm/services/mcp_gateway/tools/hello_world.py +122 -120
  310. claude_mpm/services/mcp_gateway/tools/ticket_tools.py +652 -0
  311. claude_mpm/services/mcp_gateway/tools/unified_ticket_tool.py +606 -0
  312. claude_mpm/services/memory/__init__.py +2 -2
  313. claude_mpm/services/memory/builder.py +451 -362
  314. claude_mpm/services/memory/cache/__init__.py +2 -2
  315. claude_mpm/services/memory/cache/shared_prompt_cache.py +232 -194
  316. claude_mpm/services/memory/cache/simple_cache.py +107 -93
  317. claude_mpm/services/memory/indexed_memory.py +195 -193
  318. claude_mpm/services/memory/optimizer.py +267 -234
  319. claude_mpm/services/memory/router.py +571 -263
  320. claude_mpm/services/memory_hook_service.py +237 -0
  321. claude_mpm/services/port_manager.py +223 -0
  322. claude_mpm/services/project/__init__.py +3 -3
  323. claude_mpm/services/project/analyzer.py +451 -305
  324. claude_mpm/services/project/registry.py +262 -240
  325. claude_mpm/services/recovery_manager.py +287 -231
  326. claude_mpm/services/response_tracker.py +87 -67
  327. claude_mpm/services/runner_configuration_service.py +587 -0
  328. claude_mpm/services/session_management_service.py +304 -0
  329. claude_mpm/services/socketio/__init__.py +4 -4
  330. claude_mpm/services/socketio/client_proxy.py +174 -0
  331. claude_mpm/services/socketio/handlers/__init__.py +3 -3
  332. claude_mpm/services/socketio/handlers/base.py +44 -30
  333. claude_mpm/services/socketio/handlers/connection.py +145 -65
  334. claude_mpm/services/socketio/handlers/file.py +123 -108
  335. claude_mpm/services/socketio/handlers/git.py +607 -373
  336. claude_mpm/services/socketio/handlers/hook.py +170 -0
  337. claude_mpm/services/socketio/handlers/memory.py +4 -4
  338. claude_mpm/services/socketio/handlers/project.py +4 -4
  339. claude_mpm/services/socketio/handlers/registry.py +53 -38
  340. claude_mpm/services/socketio/server/__init__.py +18 -0
  341. claude_mpm/services/socketio/server/broadcaster.py +252 -0
  342. claude_mpm/services/socketio/server/core.py +399 -0
  343. claude_mpm/services/socketio/server/main.py +323 -0
  344. claude_mpm/services/socketio_client_manager.py +160 -133
  345. claude_mpm/services/socketio_server.py +36 -1885
  346. claude_mpm/services/subprocess_launcher_service.py +316 -0
  347. claude_mpm/services/system_instructions_service.py +258 -0
  348. claude_mpm/services/ticket_manager.py +20 -534
  349. claude_mpm/services/utility_service.py +285 -0
  350. claude_mpm/services/version_control/__init__.py +18 -21
  351. claude_mpm/services/version_control/branch_strategy.py +20 -10
  352. claude_mpm/services/version_control/conflict_resolution.py +37 -13
  353. claude_mpm/services/version_control/git_operations.py +52 -21
  354. claude_mpm/services/version_control/semantic_versioning.py +92 -53
  355. claude_mpm/services/version_control/version_parser.py +145 -125
  356. claude_mpm/services/version_service.py +270 -0
  357. claude_mpm/storage/__init__.py +9 -0
  358. claude_mpm/storage/state_storage.py +552 -0
  359. claude_mpm/ticket_wrapper.py +2 -2
  360. claude_mpm/utils/__init__.py +2 -2
  361. claude_mpm/utils/agent_dependency_loader.py +453 -243
  362. claude_mpm/utils/config_manager.py +157 -118
  363. claude_mpm/utils/console.py +1 -1
  364. claude_mpm/utils/dependency_cache.py +102 -107
  365. claude_mpm/utils/dependency_manager.py +52 -47
  366. claude_mpm/utils/dependency_strategies.py +131 -96
  367. claude_mpm/utils/environment_context.py +110 -102
  368. claude_mpm/utils/error_handler.py +75 -55
  369. claude_mpm/utils/file_utils.py +80 -67
  370. claude_mpm/utils/framework_detection.py +12 -11
  371. claude_mpm/utils/import_migration_example.py +12 -60
  372. claude_mpm/utils/imports.py +48 -45
  373. claude_mpm/utils/path_operations.py +100 -93
  374. claude_mpm/utils/robust_installer.py +172 -164
  375. claude_mpm/utils/session_logging.py +30 -23
  376. claude_mpm/utils/subprocess_utils.py +99 -61
  377. claude_mpm/validation/__init__.py +1 -1
  378. claude_mpm/validation/agent_validator.py +151 -111
  379. claude_mpm/validation/frontmatter_validator.py +92 -71
  380. {claude_mpm-3.9.9.dist-info → claude_mpm-4.0.3.dist-info}/METADATA +51 -2
  381. claude_mpm-4.0.3.dist-info/RECORD +402 -0
  382. {claude_mpm-3.9.9.dist-info → claude_mpm-4.0.3.dist-info}/entry_points.txt +1 -0
  383. {claude_mpm-3.9.9.dist-info → claude_mpm-4.0.3.dist-info}/licenses/LICENSE +1 -1
  384. claude_mpm/config/memory_guardian_config.py +0 -325
  385. claude_mpm/core/config_paths.py +0 -150
  386. claude_mpm/dashboard/static/js/dashboard-original.js +0 -4134
  387. claude_mpm/deployment_paths.py +0 -261
  388. claude_mpm/hooks/claude_hooks/hook_handler_fixed.py +0 -454
  389. claude_mpm/models/state_models.py +0 -433
  390. claude_mpm/services/agent/__init__.py +0 -24
  391. claude_mpm/services/agent/deployment.py +0 -2548
  392. claude_mpm/services/agent/management.py +0 -598
  393. claude_mpm/services/agent/registry.py +0 -813
  394. claude_mpm/services/agents/registry/agent_registry.py +0 -813
  395. claude_mpm/services/communication/socketio.py +0 -1935
  396. claude_mpm/services/communication/websocket.py +0 -479
  397. claude_mpm/services/framework_claude_md_generator.py +0 -624
  398. claude_mpm/services/health_monitor.py +0 -893
  399. claude_mpm/services/infrastructure/memory_guardian.py +0 -770
  400. claude_mpm/services/mcp_gateway/server/mcp_server_simple.py +0 -444
  401. claude_mpm/services/optimized_hook_service.py +0 -542
  402. claude_mpm/services/project_analyzer.py +0 -864
  403. claude_mpm/services/project_registry.py +0 -608
  404. claude_mpm/services/standalone_socketio_server.py +0 -1300
  405. claude_mpm/services/ticket_manager_di.py +0 -318
  406. claude_mpm/services/ticketing_service_original.py +0 -510
  407. claude_mpm/utils/paths.py +0 -395
  408. claude_mpm/utils/platform_memory.py +0 -524
  409. claude_mpm-3.9.9.dist-info/RECORD +0 -293
  410. {claude_mpm-3.9.9.dist-info → claude_mpm-4.0.3.dist-info}/WHEEL +0 -0
  411. {claude_mpm-3.9.9.dist-info → claude_mpm-4.0.3.dist-info}/top_level.txt +0 -0
@@ -1,542 +0,0 @@
1
- """
2
- Optimized Hook Service with Caching and Async Processing
3
-
4
- High-performance hook service that minimizes overhead through:
5
- - Hook configuration caching at startup
6
- - Lazy loading of hook implementations
7
- - Singleton pattern for efficient memory usage
8
- - Async hook processing for non-blocking execution
9
- """
10
-
11
- import asyncio
12
- import time
13
- import importlib
14
- import inspect
15
- from typing import List, Optional, Dict, Any, Type, Callable, Set
16
- from dataclasses import dataclass, field
17
- from pathlib import Path
18
- from threading import Lock
19
- from concurrent.futures import ThreadPoolExecutor, Future
20
- import logging
21
-
22
- from claude_mpm.core.config import Config
23
- from claude_mpm.core.logger import get_logger
24
- from claude_mpm.hooks.base_hook import (
25
- BaseHook,
26
- PreDelegationHook,
27
- PostDelegationHook,
28
- HookContext,
29
- HookResult,
30
- HookType
31
- )
32
-
33
-
34
- @dataclass
35
- class HookConfig:
36
- """Cached hook configuration."""
37
- name: str
38
- module_path: str
39
- class_name: str
40
- priority: int = 50
41
- enabled: bool = True
42
- params: Dict[str, Any] = field(default_factory=dict)
43
- loaded_instance: Optional[BaseHook] = None
44
-
45
-
46
- @dataclass
47
- class HookExecutionMetrics:
48
- """Metrics for hook execution performance."""
49
- execution_count: int = 0
50
- total_time_ms: float = 0.0
51
- avg_time_ms: float = 0.0
52
- max_time_ms: float = 0.0
53
- min_time_ms: float = float('inf')
54
- error_count: int = 0
55
- last_execution: Optional[float] = None
56
-
57
-
58
- class OptimizedHookService:
59
- """
60
- Optimized hook service with caching and async execution.
61
-
62
- Features:
63
- - Caches hook configurations at startup
64
- - Lazy loads hook implementations on first use
65
- - Singleton pattern for memory efficiency
66
- - Async/parallel hook execution support
67
- - Detailed performance metrics
68
- """
69
-
70
- _instance: Optional['OptimizedHookService'] = None
71
- _lock = Lock()
72
-
73
- def __new__(cls, *args, **kwargs):
74
- """Singleton pattern implementation."""
75
- with cls._lock:
76
- if cls._instance is None:
77
- cls._instance = super().__new__(cls)
78
- return cls._instance
79
-
80
- def __init__(self, config: Optional[Config] = None):
81
- """
82
- Initialize the optimized hook service.
83
-
84
- Args:
85
- config: Optional configuration object
86
- """
87
- # Skip re-initialization for singleton
88
- if hasattr(self, '_initialized'):
89
- return
90
-
91
- self.config = config or Config()
92
- self.logger = get_logger("optimized_hook_service")
93
-
94
- # Hook storage with lazy loading
95
- self._hook_configs: Dict[str, HookConfig] = {}
96
- self._pre_hooks_cache: List[HookConfig] = []
97
- self._post_hooks_cache: List[HookConfig] = []
98
-
99
- # Performance metrics
100
- self._metrics: Dict[str, HookExecutionMetrics] = {}
101
-
102
- # Async execution support
103
- self._executor = ThreadPoolExecutor(
104
- max_workers=self.config.get("hooks.max_workers", 4),
105
- thread_name_prefix="HookWorker"
106
- )
107
-
108
- # Load and cache hook configurations
109
- self._load_hook_configs()
110
-
111
- # Mark as initialized
112
- self._initialized = True
113
-
114
- self.logger.info(
115
- f"Initialized optimized hook service with "
116
- f"{len(self._pre_hooks_cache)} pre-hooks and "
117
- f"{len(self._post_hooks_cache)} post-hooks"
118
- )
119
-
120
- def _load_hook_configs(self):
121
- """Load and cache all hook configurations at startup."""
122
- # Load from configuration file
123
- hooks_config = self.config.get("hooks.registered", {})
124
-
125
- for hook_name, hook_data in hooks_config.items():
126
- if not hook_data.get("enabled", True):
127
- self.logger.debug(f"Skipping disabled hook: {hook_name}")
128
- continue
129
-
130
- config = HookConfig(
131
- name=hook_name,
132
- module_path=hook_data.get("module"),
133
- class_name=hook_data.get("class"),
134
- priority=hook_data.get("priority", 50),
135
- enabled=True,
136
- params=hook_data.get("params", {})
137
- )
138
-
139
- self._hook_configs[hook_name] = config
140
-
141
- # Categorize by type (inferred from name or config)
142
- hook_type = hook_data.get("type", "")
143
- if "pre" in hook_type.lower() or "before" in hook_name.lower():
144
- self._pre_hooks_cache.append(config)
145
- elif "post" in hook_type.lower() or "after" in hook_name.lower():
146
- self._post_hooks_cache.append(config)
147
-
148
- # Sort by priority (lower number = higher priority)
149
- self._pre_hooks_cache.sort(key=lambda h: h.priority)
150
- self._post_hooks_cache.sort(key=lambda h: h.priority)
151
-
152
- # Also scan for hooks in the hooks directory
153
- self._scan_hook_directory()
154
-
155
- def _scan_hook_directory(self):
156
- """Scan hooks directory for available hooks."""
157
- hooks_dir = Path(__file__).parent.parent / "hooks"
158
-
159
- if not hooks_dir.exists():
160
- return
161
-
162
- # Look for Python files in hooks directory
163
- for hook_file in hooks_dir.glob("**/*.py"):
164
- if hook_file.name.startswith("_"):
165
- continue
166
-
167
- # Convert file path to module path
168
- relative_path = hook_file.relative_to(hooks_dir.parent.parent)
169
- module_path = str(relative_path.with_suffix("")).replace("/", ".")
170
-
171
- # Skip if already configured
172
- if any(h.module_path == module_path for h in self._hook_configs.values()):
173
- continue
174
-
175
- # Try to load and inspect the module
176
- try:
177
- module = importlib.import_module(module_path)
178
-
179
- # Find hook classes in the module
180
- for name, obj in inspect.getmembers(module, inspect.isclass):
181
- if issubclass(obj, BaseHook) and obj != BaseHook:
182
- # Auto-register discovered hook
183
- hook_name = f"auto_{hook_file.stem}_{name}"
184
-
185
- config = HookConfig(
186
- name=hook_name,
187
- module_path=module_path,
188
- class_name=name,
189
- priority=getattr(obj, 'priority', 50),
190
- enabled=False # Disabled by default for auto-discovered
191
- )
192
-
193
- self._hook_configs[hook_name] = config
194
- self.logger.debug(f"Discovered hook: {hook_name} (disabled)")
195
-
196
- except Exception as e:
197
- self.logger.debug(f"Failed to scan {hook_file}: {e}")
198
-
199
- def _lazy_load_hook(self, config: HookConfig) -> Optional[BaseHook]:
200
- """
201
- Lazy load a hook instance when needed.
202
-
203
- Args:
204
- config: Hook configuration
205
-
206
- Returns:
207
- Loaded hook instance or None if failed
208
- """
209
- if config.loaded_instance:
210
- return config.loaded_instance
211
-
212
- try:
213
- # Import the module
214
- module = importlib.import_module(config.module_path)
215
-
216
- # Get the hook class
217
- hook_class = getattr(module, config.class_name)
218
-
219
- # Instantiate with parameters
220
- hook_instance = hook_class(**config.params)
221
-
222
- # Cache the instance
223
- config.loaded_instance = hook_instance
224
-
225
- # Initialize metrics
226
- self._metrics[config.name] = HookExecutionMetrics()
227
-
228
- self.logger.info(f"Lazy loaded hook: {config.name}")
229
- return hook_instance
230
-
231
- except Exception as e:
232
- self.logger.error(f"Failed to load hook {config.name}: {e}")
233
- return None
234
-
235
- def register_hook(self, hook: BaseHook) -> bool:
236
- """
237
- Register a hook instance directly.
238
-
239
- Args:
240
- hook: The hook to register
241
-
242
- Returns:
243
- True if successfully registered
244
- """
245
- try:
246
- # Create config for the hook
247
- config = HookConfig(
248
- name=hook.name,
249
- module_path=hook.__module__,
250
- class_name=hook.__class__.__name__,
251
- priority=hook.priority,
252
- enabled=hook.enabled,
253
- loaded_instance=hook
254
- )
255
-
256
- self._hook_configs[hook.name] = config
257
-
258
- # Add to appropriate cache
259
- if isinstance(hook, PreDelegationHook):
260
- self._pre_hooks_cache.append(config)
261
- self._pre_hooks_cache.sort(key=lambda h: h.priority)
262
- elif isinstance(hook, PostDelegationHook):
263
- self._post_hooks_cache.append(config)
264
- self._post_hooks_cache.sort(key=lambda h: h.priority)
265
-
266
- # Initialize metrics
267
- self._metrics[hook.name] = HookExecutionMetrics()
268
-
269
- self.logger.info(f"Registered hook: {hook.name}")
270
- return True
271
-
272
- except Exception as e:
273
- self.logger.error(f"Failed to register hook: {e}")
274
- return False
275
-
276
- async def execute_pre_delegation_hooks_async(
277
- self,
278
- context: HookContext
279
- ) -> HookResult:
280
- """
281
- Execute pre-delegation hooks asynchronously.
282
-
283
- Args:
284
- context: The hook context
285
-
286
- Returns:
287
- HookResult with processed data
288
- """
289
- if not self._are_hooks_enabled("pre_delegation"):
290
- return HookResult(success=True, data=context.data, modified=False)
291
-
292
- working_data = context.data.copy()
293
- has_modifications = False
294
-
295
- # Execute hooks in parallel where possible
296
- tasks = []
297
-
298
- for config in self._pre_hooks_cache:
299
- if not config.enabled:
300
- continue
301
-
302
- hook = self._lazy_load_hook(config)
303
- if not hook:
304
- continue
305
-
306
- # Check if hook can run in parallel (no data dependencies)
307
- if getattr(hook, 'parallel_safe', False):
308
- task = self._execute_hook_async(hook, context, config.name)
309
- tasks.append(task)
310
- else:
311
- # Execute sequentially for non-parallel-safe hooks
312
- result = await self._execute_hook_async(hook, context, config.name)
313
- if result.modified and result.data:
314
- working_data.update(result.data)
315
- has_modifications = True
316
-
317
- # Wait for parallel tasks
318
- if tasks:
319
- results = await asyncio.gather(*tasks, return_exceptions=True)
320
- for result in results:
321
- if isinstance(result, HookResult):
322
- if result.modified and result.data:
323
- working_data.update(result.data)
324
- has_modifications = True
325
- elif isinstance(result, Exception):
326
- self.logger.error(f"Hook execution error: {result}")
327
-
328
- return HookResult(
329
- success=True,
330
- data=working_data,
331
- modified=has_modifications
332
- )
333
-
334
- async def _execute_hook_async(
335
- self,
336
- hook: BaseHook,
337
- context: HookContext,
338
- hook_name: str
339
- ) -> HookResult:
340
- """Execute a single hook asynchronously with metrics."""
341
- try:
342
- # Validate hook
343
- if not hook.validate(context):
344
- return HookResult(success=False, data={}, modified=False)
345
-
346
- # Time execution
347
- start_time = time.perf_counter()
348
-
349
- # Execute hook (wrap synchronous hooks)
350
- if asyncio.iscoroutinefunction(hook.execute):
351
- result = await hook.execute(context)
352
- else:
353
- # Run synchronous hook in executor
354
- loop = asyncio.get_event_loop()
355
- result = await loop.run_in_executor(
356
- self._executor,
357
- hook.execute,
358
- context
359
- )
360
-
361
- # Update metrics
362
- execution_time = (time.perf_counter() - start_time) * 1000
363
- self._update_metrics(hook_name, execution_time, success=True)
364
-
365
- return result
366
-
367
- except Exception as e:
368
- self.logger.error(f"Hook {hook_name} failed: {e}")
369
- self._update_metrics(hook_name, 0, success=False)
370
- return HookResult(success=False, error=str(e))
371
-
372
- def execute_pre_delegation_hooks(self, context: HookContext) -> HookResult:
373
- """
374
- Execute pre-delegation hooks synchronously (backward compatible).
375
-
376
- Args:
377
- context: The hook context
378
-
379
- Returns:
380
- HookResult with processed data
381
- """
382
- # Run async version in new event loop
383
- try:
384
- loop = asyncio.new_event_loop()
385
- result = loop.run_until_complete(
386
- self.execute_pre_delegation_hooks_async(context)
387
- )
388
- loop.close()
389
- return result
390
- except Exception as e:
391
- self.logger.error(f"Failed to execute hooks: {e}")
392
- return HookResult(success=False, error=str(e))
393
-
394
- def execute_post_delegation_hooks(self, context: HookContext) -> HookResult:
395
- """
396
- Execute post-delegation hooks synchronously (backward compatible).
397
-
398
- Args:
399
- context: The hook context
400
-
401
- Returns:
402
- HookResult with processed data
403
- """
404
- if not self._are_hooks_enabled("post_delegation"):
405
- return HookResult(success=True, data=context.data, modified=False)
406
-
407
- working_data = context.data.copy()
408
- has_modifications = False
409
-
410
- for config in self._post_hooks_cache:
411
- if not config.enabled:
412
- continue
413
-
414
- hook = self._lazy_load_hook(config)
415
- if not hook:
416
- continue
417
-
418
- try:
419
- if not hook.validate(context):
420
- continue
421
-
422
- # Time execution
423
- start_time = time.perf_counter()
424
-
425
- # Execute hook
426
- hook_context = HookContext(
427
- hook_type=context.hook_type,
428
- data=working_data,
429
- metadata=context.metadata,
430
- timestamp=context.timestamp,
431
- session_id=context.session_id,
432
- user_id=context.user_id
433
- )
434
-
435
- result = hook.execute(hook_context)
436
-
437
- # Update metrics
438
- execution_time = (time.perf_counter() - start_time) * 1000
439
- self._update_metrics(config.name, execution_time, success=result.success)
440
-
441
- if result.success and result.modified and result.data:
442
- working_data.update(result.data)
443
- has_modifications = True
444
-
445
- except Exception as e:
446
- self.logger.error(f"Hook {config.name} failed: {e}")
447
- self._update_metrics(config.name, 0, success=False)
448
-
449
- return HookResult(
450
- success=True,
451
- data=working_data,
452
- modified=has_modifications
453
- )
454
-
455
- def _update_metrics(self, hook_name: str, execution_time_ms: float, success: bool):
456
- """Update execution metrics for a hook."""
457
- if hook_name not in self._metrics:
458
- self._metrics[hook_name] = HookExecutionMetrics()
459
-
460
- metrics = self._metrics[hook_name]
461
- metrics.execution_count += 1
462
- metrics.total_time_ms += execution_time_ms
463
- metrics.avg_time_ms = metrics.total_time_ms / metrics.execution_count
464
- metrics.max_time_ms = max(metrics.max_time_ms, execution_time_ms)
465
- metrics.min_time_ms = min(metrics.min_time_ms, execution_time_ms)
466
- metrics.last_execution = time.time()
467
-
468
- if not success:
469
- metrics.error_count += 1
470
-
471
- def _are_hooks_enabled(self, hook_type: str) -> bool:
472
- """Check if hooks are enabled."""
473
- if not self.config.get("hooks.enabled", True):
474
- return False
475
-
476
- if not self.config.get(f"hooks.{hook_type}.enabled", True):
477
- return False
478
-
479
- return True
480
-
481
- def get_metrics(self) -> Dict[str, Dict[str, Any]]:
482
- """Get performance metrics for all hooks."""
483
- return {
484
- name: {
485
- "execution_count": m.execution_count,
486
- "avg_time_ms": round(m.avg_time_ms, 2),
487
- "max_time_ms": round(m.max_time_ms, 2),
488
- "min_time_ms": round(m.min_time_ms, 2) if m.min_time_ms != float('inf') else 0,
489
- "error_count": m.error_count,
490
- "error_rate": round(m.error_count / m.execution_count * 100, 2) if m.execution_count > 0 else 0
491
- }
492
- for name, m in self._metrics.items()
493
- }
494
-
495
- def list_hooks(self) -> Dict[str, List[str]]:
496
- """List all registered hooks."""
497
- return {
498
- "pre_delegation": [h.name for h in self._pre_hooks_cache],
499
- "post_delegation": [h.name for h in self._post_hooks_cache],
500
- "available": list(self._hook_configs.keys())
501
- }
502
-
503
- def enable_hook(self, hook_name: str) -> bool:
504
- """Enable a hook by name."""
505
- if hook_name in self._hook_configs:
506
- self._hook_configs[hook_name].enabled = True
507
- return True
508
- return False
509
-
510
- def disable_hook(self, hook_name: str) -> bool:
511
- """Disable a hook by name."""
512
- if hook_name in self._hook_configs:
513
- self._hook_configs[hook_name].enabled = False
514
- return True
515
- return False
516
-
517
- def shutdown(self):
518
- """Shutdown the hook service and cleanup resources."""
519
- self.logger.info("Shutting down hook service")
520
- self._executor.shutdown(wait=True)
521
-
522
-
523
- # Global singleton instance
524
- _hook_service: Optional[OptimizedHookService] = None
525
-
526
-
527
- def get_optimized_hook_service(config: Optional[Config] = None) -> OptimizedHookService:
528
- """
529
- Get the singleton optimized hook service instance.
530
-
531
- Args:
532
- config: Optional configuration
533
-
534
- Returns:
535
- The shared OptimizedHookService instance
536
- """
537
- global _hook_service
538
-
539
- if _hook_service is None:
540
- _hook_service = OptimizedHookService(config)
541
-
542
- return _hook_service