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
@@ -11,144 +11,146 @@ Part of ISS-0035: MCP Server Implementation - Core Server and Tool Registry
11
11
  import asyncio
12
12
  import json
13
13
  import sys
14
- from typing import Dict, Any, Optional, Callable
15
- from asyncio import StreamReader, StreamWriter
16
14
  import traceback
15
+ from asyncio import StreamReader, StreamWriter
16
+ from typing import Any, Callable, Dict, Optional
17
17
 
18
- from claude_mpm.services.mcp_gateway.core.interfaces import IMCPCommunication
19
18
  from claude_mpm.services.mcp_gateway.core.base import BaseMCPService
19
+ from claude_mpm.services.mcp_gateway.core.interfaces import IMCPCommunication
20
20
 
21
21
 
22
22
  class StdioHandler(BaseMCPService, IMCPCommunication):
23
23
  """
24
24
  STDIO-based communication handler for MCP.
25
-
25
+
26
26
  WHY: The MCP protocol uses stdio (stdin/stdout) for communication between
27
27
  Claude Desktop and MCP servers. This handler manages the low-level
28
28
  message exchange, ensuring proper JSON-RPC formatting and error handling.
29
-
29
+
30
30
  DESIGN DECISIONS:
31
31
  - Use asyncio streams for non-blocking I/O
32
32
  - Implement message framing with Content-Length headers (LSP-style)
33
33
  - Handle both notification and request/response patterns
34
34
  - Provide robust error recovery and logging
35
35
  """
36
-
36
+
37
37
  def __init__(self):
38
38
  """Initialize the STDIO handler."""
39
39
  super().__init__("StdioHandler")
40
-
40
+
41
41
  # Async streams
42
42
  self._reader: Optional[StreamReader] = None
43
43
  self._writer: Optional[StreamWriter] = None
44
-
44
+
45
45
  # Connection state
46
46
  self._connected = False
47
-
47
+
48
48
  # Message buffer for partial reads
49
49
  self._buffer = b""
50
-
50
+
51
51
  # Metrics
52
52
  self._metrics = {
53
53
  "messages_sent": 0,
54
54
  "messages_received": 0,
55
55
  "errors": 0,
56
56
  "bytes_sent": 0,
57
- "bytes_received": 0
57
+ "bytes_received": 0,
58
58
  }
59
-
59
+
60
60
  async def _do_initialize(self) -> bool:
61
61
  """
62
62
  Initialize the STDIO handler.
63
-
63
+
64
64
  Returns:
65
65
  True if initialization successful
66
66
  """
67
67
  try:
68
68
  self.log_info("Initializing STDIO handler")
69
-
69
+
70
70
  # Create async streams for stdin/stdout
71
71
  loop = asyncio.get_event_loop()
72
-
72
+
73
73
  # For stdin
74
74
  self._reader = asyncio.StreamReader()
75
75
  stdin_protocol = asyncio.StreamReaderProtocol(self._reader)
76
76
  await loop.connect_read_pipe(lambda: stdin_protocol, sys.stdin)
77
-
77
+
78
78
  # For stdout (we'll write directly to sys.stdout)
79
79
  # Note: stdout doesn't need async handling for writes
80
-
80
+
81
81
  self._connected = True
82
82
  self.log_info("STDIO handler initialized")
83
83
  return True
84
-
84
+
85
85
  except Exception as e:
86
86
  self.log_error(f"Failed to initialize STDIO handler: {e}")
87
87
  return False
88
-
88
+
89
89
  async def _do_shutdown(self) -> None:
90
90
  """Shutdown the STDIO handler."""
91
91
  self.log_info("Shutting down STDIO handler")
92
-
92
+
93
93
  self._connected = False
94
-
94
+
95
95
  # Close streams if needed
96
96
  if self._reader:
97
97
  self._reader = None
98
-
98
+
99
99
  self.log_info("STDIO handler shutdown complete")
100
-
100
+
101
101
  async def send_message(self, message: Dict[str, Any]) -> None:
102
102
  """
103
103
  Send a message to the MCP client via stdout.
104
-
104
+
105
105
  Uses Content-Length header for message framing (LSP-style).
106
-
106
+
107
107
  Args:
108
108
  message: Message to send
109
109
  """
110
110
  try:
111
111
  if not self._connected:
112
112
  raise RuntimeError("STDIO handler not connected")
113
-
113
+
114
114
  # Convert message to JSON
115
- json_str = json.dumps(message, separators=(',', ':'))
116
- json_bytes = json_str.encode('utf-8')
117
-
115
+ json_str = json.dumps(message, separators=(",", ":"))
116
+ json_bytes = json_str.encode("utf-8")
117
+
118
118
  # Create Content-Length header
119
119
  content_length = len(json_bytes)
120
120
  header = f"Content-Length: {content_length}\r\n\r\n"
121
- header_bytes = header.encode('ascii')
122
-
121
+ header_bytes = header.encode("ascii")
122
+
123
123
  # Write header and content to stdout
124
124
  sys.stdout.buffer.write(header_bytes)
125
125
  sys.stdout.buffer.write(json_bytes)
126
126
  sys.stdout.buffer.flush()
127
-
127
+
128
128
  # Update metrics
129
129
  self._metrics["messages_sent"] += 1
130
130
  self._metrics["bytes_sent"] += len(header_bytes) + len(json_bytes)
131
-
132
- self.log_debug(f"Sent message: {message.get('method', message.get('id', 'unknown'))}")
133
-
131
+
132
+ self.log_debug(
133
+ f"Sent message: {message.get('method', message.get('id', 'unknown'))}"
134
+ )
135
+
134
136
  except Exception as e:
135
137
  self.log_error(f"Error sending message: {e}")
136
138
  self._metrics["errors"] += 1
137
139
  raise
138
-
140
+
139
141
  async def receive_message(self) -> Optional[Dict[str, Any]]:
140
142
  """
141
143
  Receive a message from the MCP client via stdin.
142
-
144
+
143
145
  Handles Content-Length based message framing.
144
-
146
+
145
147
  Returns:
146
148
  Received message or None if no message available
147
149
  """
148
150
  try:
149
151
  if not self._connected or not self._reader:
150
152
  return None
151
-
153
+
152
154
  # Read header to get content length
153
155
  headers = {}
154
156
  while True:
@@ -157,40 +159,42 @@ class StdioHandler(BaseMCPService, IMCPCommunication):
157
159
  # EOF reached
158
160
  self._connected = False
159
161
  return None
160
-
161
- line = line_bytes.decode('utf-8').rstrip('\r\n')
162
-
162
+
163
+ line = line_bytes.decode("utf-8").rstrip("\r\n")
164
+
163
165
  if not line:
164
166
  # Empty line indicates end of headers
165
167
  break
166
-
168
+
167
169
  # Parse header
168
- if ':' in line:
169
- key, value = line.split(':', 1)
170
+ if ":" in line:
171
+ key, value = line.split(":", 1)
170
172
  headers[key.strip()] = value.strip()
171
-
173
+
172
174
  # Get content length
173
- content_length = headers.get('Content-Length')
175
+ content_length = headers.get("Content-Length")
174
176
  if not content_length:
175
177
  self.log_warning("No Content-Length header found")
176
178
  return None
177
-
179
+
178
180
  content_length = int(content_length)
179
-
181
+
180
182
  # Read content
181
183
  content_bytes = await self._reader.readexactly(content_length)
182
-
184
+
183
185
  # Parse JSON
184
- message = json.loads(content_bytes.decode('utf-8'))
185
-
186
+ message = json.loads(content_bytes.decode("utf-8"))
187
+
186
188
  # Update metrics
187
189
  self._metrics["messages_received"] += 1
188
190
  self._metrics["bytes_received"] += len(line_bytes) + content_length
189
-
190
- self.log_debug(f"Received message: {message.get('method', message.get('id', 'unknown'))}")
191
-
191
+
192
+ self.log_debug(
193
+ f"Received message: {message.get('method', message.get('id', 'unknown'))}"
194
+ )
195
+
192
196
  return message
193
-
197
+
194
198
  except asyncio.IncompleteReadError:
195
199
  self.log_warning("Incomplete read - client may have disconnected")
196
200
  self._connected = False
@@ -203,26 +207,22 @@ class StdioHandler(BaseMCPService, IMCPCommunication):
203
207
  self.log_error(f"Error receiving message: {e}")
204
208
  self._metrics["errors"] += 1
205
209
  return None
206
-
210
+
207
211
  async def send_response(self, request_id: str, result: Any) -> None:
208
212
  """
209
213
  Send a response to a request.
210
-
214
+
211
215
  Args:
212
216
  request_id: ID of the request being responded to
213
217
  result: Result data
214
218
  """
215
- response = {
216
- "jsonrpc": "2.0",
217
- "id": request_id,
218
- "result": result
219
- }
219
+ response = {"jsonrpc": "2.0", "id": request_id, "result": result}
220
220
  await self.send_message(response)
221
-
221
+
222
222
  async def send_error(self, request_id: str, error: str, code: int = -1) -> None:
223
223
  """
224
224
  Send an error response.
225
-
225
+
226
226
  Args:
227
227
  request_id: ID of the request that caused the error
228
228
  error: Error message
@@ -231,43 +231,39 @@ class StdioHandler(BaseMCPService, IMCPCommunication):
231
231
  response = {
232
232
  "jsonrpc": "2.0",
233
233
  "id": request_id,
234
- "error": {
235
- "code": code,
236
- "message": error
237
- }
234
+ "error": {"code": code, "message": error},
238
235
  }
239
236
  await self.send_message(response)
240
-
241
- async def send_notification(self, method: str, params: Optional[Dict[str, Any]] = None) -> None:
237
+
238
+ async def send_notification(
239
+ self, method: str, params: Optional[Dict[str, Any]] = None
240
+ ) -> None:
242
241
  """
243
242
  Send a notification (no response expected).
244
-
243
+
245
244
  Args:
246
245
  method: Notification method
247
246
  params: Optional parameters
248
247
  """
249
- notification = {
250
- "jsonrpc": "2.0",
251
- "method": method
252
- }
248
+ notification = {"jsonrpc": "2.0", "method": method}
253
249
  if params:
254
250
  notification["params"] = params
255
-
251
+
256
252
  await self.send_message(notification)
257
-
253
+
258
254
  def is_connected(self) -> bool:
259
255
  """
260
256
  Check if communication channel is connected.
261
-
257
+
262
258
  Returns:
263
259
  True if connected
264
260
  """
265
261
  return self._connected
266
-
262
+
267
263
  def get_metrics(self) -> Dict[str, Any]:
268
264
  """
269
265
  Get communication metrics.
270
-
266
+
271
267
  Returns:
272
268
  Metrics dictionary
273
269
  """
@@ -277,19 +273,19 @@ class StdioHandler(BaseMCPService, IMCPCommunication):
277
273
  class AlternativeStdioHandler(StdioHandler):
278
274
  """
279
275
  Alternative STDIO handler using direct sys.stdin/stdout.
280
-
276
+
281
277
  This implementation doesn't use asyncio streams but instead
282
278
  reads directly from sys.stdin in a blocking manner, which
283
279
  can be simpler for some use cases.
284
-
280
+
285
281
  WHY: Some MCP implementations may work better with simpler
286
282
  blocking I/O, especially when running as a subprocess.
287
283
  """
288
-
284
+
289
285
  async def _do_initialize(self) -> bool:
290
286
  """
291
287
  Initialize the alternative STDIO handler.
292
-
288
+
293
289
  Returns:
294
290
  True if initialization successful
295
291
  """
@@ -298,41 +294,43 @@ class AlternativeStdioHandler(StdioHandler):
298
294
  self._connected = True
299
295
  self.log_info("Alternative STDIO handler initialized")
300
296
  return True
301
-
297
+
302
298
  except Exception as e:
303
299
  self.log_error(f"Failed to initialize alternative STDIO handler: {e}")
304
300
  return False
305
-
301
+
306
302
  async def receive_message(self) -> Optional[Dict[str, Any]]:
307
303
  """
308
304
  Receive a message using blocking I/O with asyncio executor.
309
-
305
+
310
306
  Returns:
311
307
  Received message or None if no message available
312
308
  """
313
309
  try:
314
310
  if not self._connected:
315
311
  return None
316
-
312
+
317
313
  # Run blocking I/O in executor
318
314
  loop = asyncio.get_event_loop()
319
315
  message = await loop.run_in_executor(None, self._blocking_receive)
320
-
316
+
321
317
  if message:
322
318
  self._metrics["messages_received"] += 1
323
- self.log_debug(f"Received message: {message.get('method', message.get('id', 'unknown'))}")
324
-
319
+ self.log_debug(
320
+ f"Received message: {message.get('method', message.get('id', 'unknown'))}"
321
+ )
322
+
325
323
  return message
326
-
324
+
327
325
  except Exception as e:
328
326
  self.log_error(f"Error receiving message: {e}")
329
327
  self._metrics["errors"] += 1
330
328
  return None
331
-
329
+
332
330
  def _blocking_receive(self) -> Optional[Dict[str, Any]]:
333
331
  """
334
332
  Blocking receive implementation.
335
-
333
+
336
334
  Returns:
337
335
  Received message or None
338
336
  """
@@ -345,29 +343,29 @@ class AlternativeStdioHandler(StdioHandler):
345
343
  # EOF
346
344
  self._connected = False
347
345
  return None
348
-
349
- line = line.rstrip('\r\n')
346
+
347
+ line = line.rstrip("\r\n")
350
348
  if not line:
351
349
  # End of headers
352
350
  break
353
-
354
- if ':' in line:
355
- key, value = line.split(':', 1)
351
+
352
+ if ":" in line:
353
+ key, value = line.split(":", 1)
356
354
  headers[key.strip()] = value.strip()
357
-
355
+
358
356
  # Get content length
359
- content_length = headers.get('Content-Length')
357
+ content_length = headers.get("Content-Length")
360
358
  if not content_length:
361
359
  return None
362
-
360
+
363
361
  content_length = int(content_length)
364
-
362
+
365
363
  # Read content
366
364
  content = sys.stdin.read(content_length)
367
-
365
+
368
366
  # Parse JSON
369
367
  return json.loads(content)
370
-
368
+
371
369
  except Exception as e:
372
370
  self.log_error(f"Error in blocking receive: {e}")
373
- return None
371
+ return None