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,269 +1,269 @@
1
1
  """
2
- MCP Server Implementation
3
- =========================
2
+ MCP Gateway Implementation
3
+ ==========================
4
4
 
5
- Main MCP server implementation using Anthropic's official MCP package.
5
+ MCP protocol gateway using Anthropic's official MCP package.
6
6
  Handles stdio-based communication, request routing, and tool invocation.
7
+ Acts as a bridge between Claude Code and internal tools.
7
8
 
8
- Part of ISS-0035: MCP Server Implementation - Core Server and Tool Registry
9
+ NOTE: MCP is ONLY for Claude Code - NOT for Claude Desktop.
10
+ Claude Desktop uses a different system for agent deployment.
11
+
12
+ Part of ISS-0035: MCP Gateway Implementation - Core Gateway and Tool Registry
9
13
  """
10
14
 
11
15
  import asyncio
12
16
  import json
13
- import sys
14
- from typing import Any, Dict, List, Optional, Callable, Set
15
- from datetime import datetime
16
17
  import traceback
18
+ from datetime import datetime
19
+ from typing import Any, Callable, Dict, List, Optional, Set, Union
17
20
 
18
- try:
19
- # Import from the MCP package
20
- from mcp.server import Server, NotificationOptions
21
- from mcp.types import (
22
- InitializeResult,
23
- Tool,
24
- TextContent,
25
- ImageContent,
26
- EmbeddedResource
27
- )
28
- except ImportError as e:
29
- # If specific imports fail, we'll create mock implementations
30
- print(f"Warning: MCP imports failed: {e}")
31
- Server = None
32
- NotificationOptions = None
33
- InitializeResult = None
34
- Tool = None
35
- TextContent = None
36
- ImageContent = None
37
- EmbeddedResource = None
21
+ # Import from the official MCP package
22
+ from mcp.server import NotificationOptions, Server
23
+ from mcp.types import (
24
+ EmbeddedResource,
25
+ ImageContent,
26
+ InitializeResult,
27
+ TextContent,
28
+ Tool,
29
+ )
38
30
 
31
+ from claude_mpm.services.mcp_gateway.core.base import BaseMCPService, MCPServiceState
39
32
  from claude_mpm.services.mcp_gateway.core.interfaces import (
40
- IMCPServer,
41
- IMCPToolRegistry,
42
33
  IMCPCommunication,
34
+ IMCPGateway,
35
+ IMCPToolRegistry,
43
36
  MCPToolInvocation,
44
37
  MCPToolResult,
45
38
  )
46
- from claude_mpm.services.mcp_gateway.core.base import BaseMCPService, MCPServiceState
47
39
 
48
40
 
49
- class MCPServer(BaseMCPService, IMCPServer):
41
+ class MCPGateway(BaseMCPService, IMCPGateway):
50
42
  """
51
- Main MCP Server implementation using Anthropic's official MCP package.
52
-
43
+ MCP Protocol Gateway implementation using Anthropic's official MCP package.
44
+
53
45
  WHY: We use the official MCP package to ensure protocol compliance and
54
46
  compatibility with Claude Code. The stdio-based communication model allows
55
- seamless integration with Claude Desktop's MCP client.
56
-
47
+ seamless integration with Claude Code's MCP client as a protocol bridge.
48
+
57
49
  DESIGN DECISIONS:
58
50
  - Use asyncio for all I/O operations to handle concurrent requests efficiently
59
51
  - Maintain request handlers in a dictionary for extensibility
60
- - Implement comprehensive error handling to prevent server crashes
52
+ - Implement comprehensive error handling to prevent gateway crashes
61
53
  - Use structured logging for debugging and monitoring
62
54
  """
63
-
64
- def __init__(self, server_name: str = "claude-mpm-mcp", version: str = "1.0.0"):
55
+
56
+ def __init__(self, gateway_name: str = "claude-mpm-mcp", version: str = "1.0.0"):
65
57
  """
66
- Initialize MCP Server.
67
-
58
+ Initialize MCP Gateway.
59
+
68
60
  Args:
69
- server_name: Name of the MCP server
70
- version: Server version
61
+ gateway_name: Name of the MCP gateway
62
+ version: Gateway version
71
63
  """
72
- super().__init__(f"MCPServer-{server_name}")
73
-
74
- # Server configuration
75
- self.server_name = server_name
64
+ super().__init__(f"MCPGateway-{gateway_name}")
65
+
66
+ # Gateway configuration
67
+ self.gateway_name = gateway_name
68
+ self.server_name = gateway_name # Keep for compatibility
76
69
  self.version = version
77
-
70
+
78
71
  # MCP Server instance from official package
79
- self.mcp_server = Server(server_name)
80
-
72
+ self.mcp_server = Server(gateway_name)
73
+
81
74
  # Dependencies (injected via setters)
82
75
  self._tool_registry: Optional[IMCPToolRegistry] = None
83
76
  self._communication: Optional[IMCPCommunication] = None
84
-
77
+
85
78
  # Request handlers
86
79
  self._handlers: Dict[str, Callable] = {}
87
-
80
+
88
81
  # Server capabilities
89
82
  self._capabilities = {
90
83
  "tools": {},
91
84
  "prompts": {},
92
85
  "resources": {},
93
- "experimental": {}
86
+ "experimental": {},
94
87
  }
95
-
88
+
96
89
  # Metrics
97
90
  self._metrics = {
98
91
  "requests_handled": 0,
99
92
  "errors": 0,
100
93
  "tool_invocations": 0,
101
94
  "start_time": None,
102
- "last_request_time": None
95
+ "last_request_time": None,
103
96
  }
104
-
97
+
105
98
  # Running state
106
99
  self._run_task: Optional[asyncio.Task] = None
107
100
  self._shutdown_event = asyncio.Event()
108
-
101
+
109
102
  # Setup default handlers
110
103
  self._setup_default_handlers()
111
-
104
+
112
105
  def _setup_default_handlers(self) -> None:
113
106
  """
114
107
  Setup default MCP protocol handlers.
115
-
108
+
116
109
  WHY: The MCP protocol requires specific handlers for initialization,
117
110
  tool discovery, and tool invocation. We set these up to ensure
118
111
  protocol compliance.
119
112
  """
113
+
120
114
  # Initialize handler
121
115
  @self.mcp_server.list_tools()
122
116
  async def handle_list_tools() -> List[Tool]:
123
117
  """Handle tools/list request."""
124
118
  self.log_info("Handling tools/list request")
125
-
119
+
126
120
  if not self._tool_registry:
127
121
  self.log_warning("No tool registry available")
128
122
  return []
129
-
123
+
130
124
  tools = []
131
125
  for tool_def in self._tool_registry.list_tools():
132
126
  tool = Tool(
133
127
  name=tool_def.name,
134
128
  description=tool_def.description,
135
- inputSchema=tool_def.input_schema
129
+ inputSchema=tool_def.input_schema,
136
130
  )
137
131
  tools.append(tool)
138
-
132
+
139
133
  self.log_info(f"Returning {len(tools)} tools")
140
134
  return tools
141
-
135
+
142
136
  @self.mcp_server.call_tool()
143
- async def handle_call_tool(name: str, arguments: Dict[str, Any]) -> List[TextContent | ImageContent | EmbeddedResource]:
137
+ async def handle_call_tool(
138
+ name: str, arguments: Dict[str, Any]
139
+ ) -> List[Union[TextContent, ImageContent, EmbeddedResource]]:
144
140
  """Handle tools/call request."""
145
141
  self.log_info(f"Handling tools/call request for tool: {name}")
146
-
142
+
147
143
  if not self._tool_registry:
148
144
  error_msg = "No tool registry available"
149
145
  self.log_error(error_msg)
150
146
  return [TextContent(type="text", text=f"Error: {error_msg}")]
151
-
147
+
152
148
  # Create invocation request
153
149
  invocation = MCPToolInvocation(
154
150
  tool_name=name,
155
151
  parameters=arguments,
156
- request_id=f"req_{datetime.now().timestamp()}"
152
+ request_id=f"req_{datetime.now().timestamp()}",
157
153
  )
158
-
154
+
159
155
  try:
160
156
  # Invoke tool through registry
161
157
  result = await self._tool_registry.invoke_tool(invocation)
162
-
158
+
163
159
  # Update metrics
164
160
  self._metrics["tool_invocations"] += 1
165
-
161
+
166
162
  # Log invocation
167
163
  self.log_tool_invocation(name, result.success, result.execution_time)
168
-
164
+
169
165
  if result.success:
170
166
  # Return successful result
171
167
  if isinstance(result.data, str):
172
168
  return [TextContent(type="text", text=result.data)]
173
169
  else:
174
- return [TextContent(type="text", text=json.dumps(result.data, indent=2))]
170
+ return [
171
+ TextContent(
172
+ type="text", text=json.dumps(result.data, indent=2)
173
+ )
174
+ ]
175
175
  else:
176
176
  # Return error
177
177
  return [TextContent(type="text", text=f"Error: {result.error}")]
178
-
178
+
179
179
  except Exception as e:
180
180
  error_msg = f"Failed to invoke tool {name}: {str(e)}"
181
181
  self.log_error(error_msg)
182
182
  self._metrics["errors"] += 1
183
183
  return [TextContent(type="text", text=f"Error: {error_msg}")]
184
-
184
+
185
185
  def set_tool_registry(self, registry: IMCPToolRegistry) -> None:
186
186
  """
187
187
  Set the tool registry for the server.
188
-
188
+
189
189
  Args:
190
190
  registry: Tool registry to use
191
191
  """
192
192
  self._tool_registry = registry
193
193
  self.log_info("Tool registry set")
194
-
194
+
195
195
  def set_communication(self, communication: IMCPCommunication) -> None:
196
196
  """
197
197
  Set the communication handler.
198
-
198
+
199
199
  Args:
200
200
  communication: Communication handler to use
201
201
  """
202
202
  self._communication = communication
203
203
  self.log_info("Communication handler set")
204
-
204
+
205
205
  async def _do_initialize(self) -> bool:
206
206
  """
207
207
  Perform server initialization.
208
-
208
+
209
209
  Returns:
210
210
  True if initialization successful
211
211
  """
212
212
  try:
213
213
  self.log_info("Initializing MCP server components")
214
-
214
+
215
215
  # Validate dependencies
216
216
  if not self._tool_registry:
217
217
  self.log_warning("No tool registry set - server will have no tools")
218
-
218
+
219
219
  # Initialize metrics
220
220
  self._metrics["start_time"] = datetime.now().isoformat()
221
-
221
+
222
222
  # Update capabilities based on registry
223
223
  if self._tool_registry:
224
224
  tools = self._tool_registry.list_tools()
225
225
  self._capabilities["tools"]["available"] = len(tools)
226
226
  self._capabilities["tools"]["names"] = [t.name for t in tools]
227
-
227
+
228
228
  self.log_info("MCP server initialization complete")
229
229
  return True
230
-
230
+
231
231
  except Exception as e:
232
232
  self.log_error(f"Failed to initialize MCP server: {e}")
233
233
  return False
234
-
234
+
235
235
  async def _do_start(self) -> bool:
236
236
  """
237
237
  Start the MCP server.
238
-
238
+
239
239
  Returns:
240
240
  True if startup successful
241
241
  """
242
242
  try:
243
243
  self.log_info("Starting MCP server")
244
-
244
+
245
245
  # Clear shutdown event
246
246
  self._shutdown_event.clear()
247
-
247
+
248
248
  # Start the run task
249
249
  self._run_task = asyncio.create_task(self.run())
250
-
250
+
251
251
  self.log_info("MCP server started successfully")
252
252
  return True
253
-
253
+
254
254
  except Exception as e:
255
255
  self.log_error(f"Failed to start MCP server: {e}")
256
256
  return False
257
-
257
+
258
258
  async def _do_shutdown(self) -> None:
259
259
  """
260
260
  Shutdown the MCP server gracefully.
261
261
  """
262
262
  self.log_info("Shutting down MCP server")
263
-
263
+
264
264
  # Signal shutdown
265
265
  self._shutdown_event.set()
266
-
266
+
267
267
  # Cancel run task if active
268
268
  if self._run_task and not self._run_task.done():
269
269
  self._run_task.cancel()
@@ -271,23 +271,23 @@ class MCPServer(BaseMCPService, IMCPServer):
271
271
  await self._run_task
272
272
  except asyncio.CancelledError:
273
273
  pass
274
-
274
+
275
275
  # Clean up resources
276
276
  if self._tool_registry:
277
277
  self.log_info("Cleaning up tool registry")
278
278
  # Tool registry cleanup if needed
279
-
279
+
280
280
  self.log_info("MCP server shutdown complete")
281
-
281
+
282
282
  async def handle_request(self, request: Dict[str, Any]) -> Dict[str, Any]:
283
283
  """
284
284
  Handle an MCP request.
285
-
285
+
286
286
  This method routes requests to appropriate handlers based on the method.
287
-
287
+
288
288
  Args:
289
289
  request: MCP request message
290
-
290
+
291
291
  Returns:
292
292
  Response message
293
293
  """
@@ -295,136 +295,132 @@ class MCPServer(BaseMCPService, IMCPServer):
295
295
  # Update metrics
296
296
  self._metrics["requests_handled"] += 1
297
297
  self._metrics["last_request_time"] = datetime.now().isoformat()
298
-
298
+
299
299
  # Extract request details
300
300
  method = request.get("method", "")
301
301
  params = request.get("params", {})
302
302
  request_id = request.get("id")
303
-
303
+
304
304
  self.log_debug(f"Handling request: {method}")
305
-
305
+
306
306
  # Check for custom handler
307
307
  if method in self._handlers:
308
308
  handler = self._handlers[method]
309
309
  result = await handler(params)
310
-
310
+
311
311
  # Build response
312
- response = {
313
- "jsonrpc": "2.0",
314
- "id": request_id,
315
- "result": result
316
- }
312
+ response = {"jsonrpc": "2.0", "id": request_id, "result": result}
317
313
  else:
318
314
  # Unknown method
319
315
  self.log_warning(f"Unknown method: {method}")
320
316
  response = {
321
317
  "jsonrpc": "2.0",
322
318
  "id": request_id,
323
- "error": {
324
- "code": -32601,
325
- "message": f"Method not found: {method}"
326
- }
319
+ "error": {"code": -32601, "message": f"Method not found: {method}"},
327
320
  }
328
-
321
+
329
322
  return response
330
-
323
+
331
324
  except Exception as e:
332
325
  self.log_error(f"Error handling request: {e}")
333
326
  self._metrics["errors"] += 1
334
-
327
+
335
328
  return {
336
329
  "jsonrpc": "2.0",
337
330
  "id": request.get("id"),
338
- "error": {
339
- "code": -32603,
340
- "message": f"Internal error: {str(e)}"
341
- }
331
+ "error": {"code": -32603, "message": f"Internal error: {str(e)}"},
342
332
  }
343
-
333
+
344
334
  async def run(self) -> None:
345
335
  """
346
336
  Run the MCP server main loop.
347
-
337
+
348
338
  This method uses the official MCP Server's stdio-based communication
349
339
  to handle incoming requests from Claude Code.
350
-
340
+
351
341
  WHY: We use stdio (stdin/stdout) as it's the standard communication
352
342
  method for MCP servers in Claude Desktop. This ensures compatibility
353
343
  and allows the server to be launched as a subprocess.
354
344
  """
355
345
  try:
356
346
  self.log_info("Starting MCP server main loop")
357
-
347
+
348
+ # Import the stdio server function
349
+ from mcp.server.lowlevel import NotificationOptions
350
+ from mcp.server.models import InitializationOptions
351
+ from mcp.server.stdio import stdio_server
352
+
358
353
  # Create initialization options
359
- init_options = InitializeResult(
360
- protocolVersion="2024-11-05",
361
- capabilities=self.get_capabilities(),
362
- serverInfo={
363
- "name": self.server_name,
364
- "version": self.version
365
- }
354
+ init_options = InitializationOptions(
355
+ server_name=self.server_name,
356
+ server_version=self.version,
357
+ capabilities=self.mcp_server.get_capabilities(
358
+ notification_options=NotificationOptions(),
359
+ experimental_capabilities={},
360
+ ),
366
361
  )
367
-
362
+
368
363
  # Run the MCP server with stdio transport
369
- async with self.mcp_server.run(
370
- transport="stdio",
371
- init_options=init_options
372
- ) as connection:
373
- self.log_info(f"MCP server running with connection: {connection}")
374
-
375
- # Wait for shutdown signal
376
- await self._shutdown_event.wait()
377
-
364
+ async with stdio_server() as (read_stream, write_stream):
365
+ self.log_info("MCP server stdio connection established")
366
+
367
+ # Run the server
368
+ await self.mcp_server.run(read_stream, write_stream, init_options)
369
+
378
370
  self.log_info("MCP server main loop ended")
379
-
371
+
380
372
  except Exception as e:
381
373
  self.log_error(f"Error in MCP server main loop: {e}")
382
374
  self.log_error(f"Traceback: {traceback.format_exc()}")
383
375
  self._metrics["errors"] += 1
384
376
  raise
385
-
377
+
386
378
  def register_handler(self, method: str, handler: Callable) -> None:
387
379
  """
388
380
  Register a custom request handler.
389
-
381
+
390
382
  Args:
391
383
  method: Method name to handle
392
384
  handler: Handler function
393
385
  """
394
386
  self._handlers[method] = handler
395
387
  self.log_info(f"Registered handler for method: {method}")
396
-
388
+
397
389
  def get_capabilities(self) -> Dict[str, Any]:
398
390
  """
399
391
  Get server capabilities.
400
-
392
+
401
393
  Returns:
402
394
  Dictionary of server capabilities formatted for MCP protocol
403
395
  """
404
396
  capabilities = {}
405
-
397
+
406
398
  # Add tool capabilities if registry is available
407
399
  if self._tool_registry:
408
400
  capabilities["tools"] = {}
409
-
401
+
410
402
  # Add experimental features
411
403
  capabilities["experimental"] = {}
412
-
404
+
413
405
  return capabilities
414
-
406
+
415
407
  def get_metrics(self) -> Dict[str, Any]:
416
408
  """
417
409
  Get server metrics.
418
-
410
+
419
411
  Returns:
420
412
  Server metrics dictionary
421
413
  """
422
414
  return self._metrics.copy()
423
-
415
+
424
416
  async def stop(self) -> None:
425
417
  """
426
418
  Stop the MCP service gracefully.
427
-
419
+
428
420
  This implements the IMCPLifecycle interface method.
429
421
  """
430
- await self.shutdown()
422
+ await self.shutdown()
423
+
424
+
425
+ # Backward compatibility alias
426
+ MCPServer = MCPGateway