claude-mpm 3.9.11__py3-none-any.whl → 4.0.4__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 (434) 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 +1 -1
  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 +2 -2
  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 +79 -51
  31. claude_mpm/cli/__main__.py +3 -2
  32. claude_mpm/cli/commands/__init__.py +20 -20
  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 +140 -905
  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 +330 -86
  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 +363 -220
  50. claude_mpm/cli/parser.py +24 -1156
  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 +124 -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 +71 -73
  69. claude_mpm/config/paths.py +94 -208
  70. claude_mpm/config/socketio_config.py +84 -73
  71. claude_mpm/constants.py +35 -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/built/components/agent-inference.js +2 -0
  113. claude_mpm/dashboard/static/built/components/event-processor.js +2 -0
  114. claude_mpm/dashboard/static/built/components/event-viewer.js +2 -0
  115. claude_mpm/dashboard/static/built/components/export-manager.js +2 -0
  116. claude_mpm/dashboard/static/built/components/file-tool-tracker.js +2 -0
  117. claude_mpm/dashboard/static/built/components/hud-library-loader.js +2 -0
  118. claude_mpm/dashboard/static/built/components/hud-manager.js +2 -0
  119. claude_mpm/dashboard/static/built/components/hud-visualizer.js +2 -0
  120. claude_mpm/dashboard/static/built/components/module-viewer.js +2 -0
  121. claude_mpm/dashboard/static/built/components/session-manager.js +2 -0
  122. claude_mpm/dashboard/static/built/components/socket-manager.js +2 -0
  123. claude_mpm/dashboard/static/built/components/ui-state-manager.js +2 -0
  124. claude_mpm/dashboard/static/built/components/working-directory.js +2 -0
  125. claude_mpm/dashboard/static/built/dashboard.js +2 -0
  126. claude_mpm/dashboard/static/built/socket-client.js +2 -0
  127. claude_mpm/dashboard/static/css/dashboard.css +27 -8
  128. claude_mpm/dashboard/static/dist/components/agent-inference.js +2 -0
  129. claude_mpm/dashboard/static/dist/components/event-processor.js +2 -0
  130. claude_mpm/dashboard/static/dist/components/event-viewer.js +2 -0
  131. claude_mpm/dashboard/static/dist/components/export-manager.js +2 -0
  132. claude_mpm/dashboard/static/dist/components/file-tool-tracker.js +2 -0
  133. claude_mpm/dashboard/static/dist/components/hud-library-loader.js +2 -0
  134. claude_mpm/dashboard/static/dist/components/hud-manager.js +2 -0
  135. claude_mpm/dashboard/static/dist/components/hud-visualizer.js +2 -0
  136. claude_mpm/dashboard/static/dist/components/module-viewer.js +2 -0
  137. claude_mpm/dashboard/static/dist/components/session-manager.js +2 -0
  138. claude_mpm/dashboard/static/dist/components/socket-manager.js +2 -0
  139. claude_mpm/dashboard/static/dist/components/ui-state-manager.js +2 -0
  140. claude_mpm/dashboard/static/dist/components/working-directory.js +2 -0
  141. claude_mpm/dashboard/static/dist/dashboard.js +2 -0
  142. claude_mpm/dashboard/static/dist/socket-client.js +2 -0
  143. claude_mpm/dashboard/static/js/components/agent-inference.js +80 -76
  144. claude_mpm/dashboard/static/js/components/event-processor.js +71 -67
  145. claude_mpm/dashboard/static/js/components/event-viewer.js +93 -72
  146. claude_mpm/dashboard/static/js/components/export-manager.js +31 -28
  147. claude_mpm/dashboard/static/js/components/file-tool-tracker.js +110 -96
  148. claude_mpm/dashboard/static/js/components/hud-library-loader.js +11 -11
  149. claude_mpm/dashboard/static/js/components/hud-manager.js +73 -73
  150. claude_mpm/dashboard/static/js/components/hud-visualizer.js +163 -163
  151. claude_mpm/dashboard/static/js/components/module-viewer.js +305 -233
  152. claude_mpm/dashboard/static/js/components/session-manager.js +32 -29
  153. claude_mpm/dashboard/static/js/components/socket-manager.js +27 -20
  154. claude_mpm/dashboard/static/js/components/ui-state-manager.js +21 -18
  155. claude_mpm/dashboard/static/js/components/working-directory.js +74 -71
  156. claude_mpm/dashboard/static/js/dashboard.js +178 -453
  157. claude_mpm/dashboard/static/js/extension-error-handler.js +164 -0
  158. claude_mpm/dashboard/static/js/socket-client.js +133 -53
  159. claude_mpm/dashboard/templates/index.html +40 -50
  160. claude_mpm/experimental/cli_enhancements.py +60 -58
  161. claude_mpm/generators/__init__.py +1 -1
  162. claude_mpm/generators/agent_profile_generator.py +75 -65
  163. claude_mpm/hooks/__init__.py +1 -1
  164. claude_mpm/hooks/base_hook.py +33 -28
  165. claude_mpm/hooks/claude_hooks/__init__.py +1 -1
  166. claude_mpm/hooks/claude_hooks/connection_pool.py +120 -0
  167. claude_mpm/hooks/claude_hooks/event_handlers.py +743 -0
  168. claude_mpm/hooks/claude_hooks/hook_handler.py +415 -1331
  169. claude_mpm/hooks/claude_hooks/hook_wrapper.sh +4 -4
  170. claude_mpm/hooks/claude_hooks/memory_integration.py +221 -0
  171. claude_mpm/hooks/claude_hooks/response_tracking.py +348 -0
  172. claude_mpm/hooks/claude_hooks/tool_analysis.py +230 -0
  173. claude_mpm/hooks/memory_integration_hook.py +140 -100
  174. claude_mpm/hooks/tool_call_interceptor.py +89 -76
  175. claude_mpm/hooks/validation_hooks.py +57 -49
  176. claude_mpm/init.py +145 -121
  177. claude_mpm/models/__init__.py +9 -9
  178. claude_mpm/models/agent_definition.py +33 -23
  179. claude_mpm/models/agent_session.py +228 -200
  180. claude_mpm/scripts/__init__.py +1 -1
  181. claude_mpm/scripts/socketio_daemon.py +192 -75
  182. claude_mpm/scripts/socketio_server_manager.py +328 -0
  183. claude_mpm/scripts/start_activity_logging.py +25 -22
  184. claude_mpm/services/__init__.py +68 -43
  185. claude_mpm/services/agent_capabilities_service.py +271 -0
  186. claude_mpm/services/agents/__init__.py +23 -32
  187. claude_mpm/services/agents/deployment/__init__.py +3 -3
  188. claude_mpm/services/agents/deployment/agent_config_provider.py +310 -0
  189. claude_mpm/services/agents/deployment/agent_configuration_manager.py +359 -0
  190. claude_mpm/services/agents/deployment/agent_definition_factory.py +84 -0
  191. claude_mpm/services/agents/deployment/agent_deployment.py +415 -2113
  192. claude_mpm/services/agents/deployment/agent_discovery_service.py +387 -0
  193. claude_mpm/services/agents/deployment/agent_environment_manager.py +293 -0
  194. claude_mpm/services/agents/deployment/agent_filesystem_manager.py +387 -0
  195. claude_mpm/services/agents/deployment/agent_format_converter.py +453 -0
  196. claude_mpm/services/agents/deployment/agent_frontmatter_validator.py +161 -0
  197. claude_mpm/services/agents/deployment/agent_lifecycle_manager.py +345 -495
  198. claude_mpm/services/agents/deployment/agent_metrics_collector.py +279 -0
  199. claude_mpm/services/agents/deployment/agent_restore_handler.py +88 -0
  200. claude_mpm/services/agents/deployment/agent_template_builder.py +406 -0
  201. claude_mpm/services/agents/deployment/agent_validator.py +352 -0
  202. claude_mpm/services/agents/deployment/agent_version_manager.py +313 -0
  203. claude_mpm/services/agents/deployment/agent_versioning.py +6 -9
  204. claude_mpm/services/agents/deployment/agents_directory_resolver.py +79 -0
  205. claude_mpm/services/agents/deployment/async_agent_deployment.py +298 -234
  206. claude_mpm/services/agents/deployment/config/__init__.py +13 -0
  207. claude_mpm/services/agents/deployment/config/deployment_config.py +182 -0
  208. claude_mpm/services/agents/deployment/config/deployment_config_manager.py +200 -0
  209. claude_mpm/services/agents/deployment/deployment_config_loader.py +54 -0
  210. claude_mpm/services/agents/deployment/deployment_type_detector.py +124 -0
  211. claude_mpm/services/agents/deployment/facade/__init__.py +18 -0
  212. claude_mpm/services/agents/deployment/facade/async_deployment_executor.py +159 -0
  213. claude_mpm/services/agents/deployment/facade/deployment_executor.py +73 -0
  214. claude_mpm/services/agents/deployment/facade/deployment_facade.py +270 -0
  215. claude_mpm/services/agents/deployment/facade/sync_deployment_executor.py +178 -0
  216. claude_mpm/services/agents/deployment/interface_adapter.py +227 -0
  217. claude_mpm/services/agents/deployment/lifecycle_health_checker.py +85 -0
  218. claude_mpm/services/agents/deployment/lifecycle_performance_tracker.py +100 -0
  219. claude_mpm/services/agents/deployment/pipeline/__init__.py +32 -0
  220. claude_mpm/services/agents/deployment/pipeline/pipeline_builder.py +158 -0
  221. claude_mpm/services/agents/deployment/pipeline/pipeline_context.py +159 -0
  222. claude_mpm/services/agents/deployment/pipeline/pipeline_executor.py +169 -0
  223. claude_mpm/services/agents/deployment/pipeline/steps/__init__.py +19 -0
  224. claude_mpm/services/agents/deployment/pipeline/steps/agent_processing_step.py +195 -0
  225. claude_mpm/services/agents/deployment/pipeline/steps/base_step.py +119 -0
  226. claude_mpm/services/agents/deployment/pipeline/steps/configuration_step.py +79 -0
  227. claude_mpm/services/agents/deployment/pipeline/steps/target_directory_step.py +90 -0
  228. claude_mpm/services/agents/deployment/pipeline/steps/validation_step.py +100 -0
  229. claude_mpm/services/agents/deployment/processors/__init__.py +15 -0
  230. claude_mpm/services/agents/deployment/processors/agent_deployment_context.py +98 -0
  231. claude_mpm/services/agents/deployment/processors/agent_deployment_result.py +235 -0
  232. claude_mpm/services/agents/deployment/processors/agent_processor.py +258 -0
  233. claude_mpm/services/agents/deployment/refactored_agent_deployment_service.py +318 -0
  234. claude_mpm/services/agents/deployment/results/__init__.py +13 -0
  235. claude_mpm/services/agents/deployment/results/deployment_metrics.py +200 -0
  236. claude_mpm/services/agents/deployment/results/deployment_result_builder.py +249 -0
  237. claude_mpm/services/agents/deployment/strategies/__init__.py +25 -0
  238. claude_mpm/services/agents/deployment/strategies/base_strategy.py +119 -0
  239. claude_mpm/services/agents/deployment/strategies/project_strategy.py +150 -0
  240. claude_mpm/services/agents/deployment/strategies/strategy_selector.py +117 -0
  241. claude_mpm/services/agents/deployment/strategies/system_strategy.py +116 -0
  242. claude_mpm/services/agents/deployment/strategies/user_strategy.py +137 -0
  243. claude_mpm/services/agents/deployment/system_instructions_deployer.py +108 -0
  244. claude_mpm/services/agents/deployment/validation/__init__.py +19 -0
  245. claude_mpm/services/agents/deployment/validation/agent_validator.py +323 -0
  246. claude_mpm/services/agents/deployment/validation/deployment_validator.py +238 -0
  247. claude_mpm/services/agents/deployment/validation/template_validator.py +299 -0
  248. claude_mpm/services/agents/deployment/validation/validation_result.py +226 -0
  249. claude_mpm/services/agents/loading/__init__.py +2 -2
  250. claude_mpm/services/agents/loading/agent_profile_loader.py +259 -229
  251. claude_mpm/services/agents/loading/base_agent_manager.py +90 -81
  252. claude_mpm/services/agents/loading/framework_agent_loader.py +154 -129
  253. claude_mpm/services/agents/management/__init__.py +2 -2
  254. claude_mpm/services/agents/management/agent_capabilities_generator.py +72 -58
  255. claude_mpm/services/agents/management/agent_management_service.py +209 -156
  256. claude_mpm/services/agents/memory/__init__.py +9 -6
  257. claude_mpm/services/agents/memory/agent_memory_manager.py +218 -1152
  258. claude_mpm/services/agents/memory/agent_persistence_service.py +20 -16
  259. claude_mpm/services/agents/memory/analyzer.py +430 -0
  260. claude_mpm/services/agents/memory/content_manager.py +376 -0
  261. claude_mpm/services/agents/memory/template_generator.py +468 -0
  262. claude_mpm/services/agents/registry/__init__.py +7 -10
  263. claude_mpm/services/agents/registry/deployed_agent_discovery.py +122 -97
  264. claude_mpm/services/agents/registry/modification_tracker.py +351 -285
  265. claude_mpm/services/async_session_logger.py +187 -153
  266. claude_mpm/services/claude_session_logger.py +87 -72
  267. claude_mpm/services/command_handler_service.py +217 -0
  268. claude_mpm/services/communication/__init__.py +3 -2
  269. claude_mpm/services/core/__init__.py +50 -97
  270. claude_mpm/services/core/base.py +60 -53
  271. claude_mpm/services/core/interfaces/__init__.py +188 -0
  272. claude_mpm/services/core/interfaces/agent.py +351 -0
  273. claude_mpm/services/core/interfaces/communication.py +343 -0
  274. claude_mpm/services/core/interfaces/infrastructure.py +413 -0
  275. claude_mpm/services/core/interfaces/service.py +434 -0
  276. claude_mpm/services/core/interfaces.py +19 -944
  277. claude_mpm/services/event_aggregator.py +208 -170
  278. claude_mpm/services/exceptions.py +387 -308
  279. claude_mpm/services/framework_claude_md_generator/__init__.py +75 -79
  280. claude_mpm/services/framework_claude_md_generator/content_assembler.py +69 -60
  281. claude_mpm/services/framework_claude_md_generator/content_validator.py +65 -61
  282. claude_mpm/services/framework_claude_md_generator/deployment_manager.py +68 -49
  283. claude_mpm/services/framework_claude_md_generator/section_generators/__init__.py +34 -34
  284. claude_mpm/services/framework_claude_md_generator/section_generators/agents.py +25 -22
  285. claude_mpm/services/framework_claude_md_generator/section_generators/claude_pm_init.py +10 -10
  286. claude_mpm/services/framework_claude_md_generator/section_generators/core_responsibilities.py +4 -3
  287. claude_mpm/services/framework_claude_md_generator/section_generators/delegation_constraints.py +4 -3
  288. claude_mpm/services/framework_claude_md_generator/section_generators/environment_config.py +4 -3
  289. claude_mpm/services/framework_claude_md_generator/section_generators/footer.py +6 -5
  290. claude_mpm/services/framework_claude_md_generator/section_generators/header.py +8 -7
  291. claude_mpm/services/framework_claude_md_generator/section_generators/orchestration_principles.py +4 -3
  292. claude_mpm/services/framework_claude_md_generator/section_generators/role_designation.py +6 -5
  293. claude_mpm/services/framework_claude_md_generator/section_generators/subprocess_validation.py +9 -8
  294. claude_mpm/services/framework_claude_md_generator/section_generators/todo_task_tools.py +4 -3
  295. claude_mpm/services/framework_claude_md_generator/section_generators/troubleshooting.py +5 -4
  296. claude_mpm/services/framework_claude_md_generator/section_manager.py +28 -27
  297. claude_mpm/services/framework_claude_md_generator/version_manager.py +30 -28
  298. claude_mpm/services/hook_service.py +106 -114
  299. claude_mpm/services/infrastructure/__init__.py +7 -5
  300. claude_mpm/services/infrastructure/context_preservation.py +233 -199
  301. claude_mpm/services/infrastructure/daemon_manager.py +279 -0
  302. claude_mpm/services/infrastructure/logging.py +83 -76
  303. claude_mpm/services/infrastructure/monitoring.py +547 -404
  304. claude_mpm/services/mcp_gateway/__init__.py +30 -13
  305. claude_mpm/services/mcp_gateway/config/__init__.py +2 -2
  306. claude_mpm/services/mcp_gateway/config/config_loader.py +61 -56
  307. claude_mpm/services/mcp_gateway/config/config_schema.py +50 -41
  308. claude_mpm/services/mcp_gateway/config/configuration.py +82 -75
  309. claude_mpm/services/mcp_gateway/core/__init__.py +13 -20
  310. claude_mpm/services/mcp_gateway/core/base.py +80 -67
  311. claude_mpm/services/mcp_gateway/core/exceptions.py +60 -46
  312. claude_mpm/services/mcp_gateway/core/interfaces.py +87 -84
  313. claude_mpm/services/mcp_gateway/main.py +287 -137
  314. claude_mpm/services/mcp_gateway/registry/__init__.py +1 -1
  315. claude_mpm/services/mcp_gateway/registry/service_registry.py +97 -94
  316. claude_mpm/services/mcp_gateway/registry/tool_registry.py +135 -126
  317. claude_mpm/services/mcp_gateway/server/__init__.py +2 -2
  318. claude_mpm/services/mcp_gateway/server/mcp_gateway.py +105 -110
  319. claude_mpm/services/mcp_gateway/server/stdio_handler.py +105 -107
  320. claude_mpm/services/mcp_gateway/server/stdio_server.py +691 -0
  321. claude_mpm/services/mcp_gateway/tools/__init__.py +4 -2
  322. claude_mpm/services/mcp_gateway/tools/base_adapter.py +109 -119
  323. claude_mpm/services/mcp_gateway/tools/document_summarizer.py +283 -215
  324. claude_mpm/services/mcp_gateway/tools/hello_world.py +122 -120
  325. claude_mpm/services/mcp_gateway/tools/ticket_tools.py +652 -0
  326. claude_mpm/services/mcp_gateway/tools/unified_ticket_tool.py +606 -0
  327. claude_mpm/services/memory/__init__.py +2 -2
  328. claude_mpm/services/memory/builder.py +451 -362
  329. claude_mpm/services/memory/cache/__init__.py +2 -2
  330. claude_mpm/services/memory/cache/shared_prompt_cache.py +232 -194
  331. claude_mpm/services/memory/cache/simple_cache.py +107 -93
  332. claude_mpm/services/memory/indexed_memory.py +195 -193
  333. claude_mpm/services/memory/optimizer.py +267 -234
  334. claude_mpm/services/memory/router.py +571 -263
  335. claude_mpm/services/memory_hook_service.py +237 -0
  336. claude_mpm/services/port_manager.py +575 -0
  337. claude_mpm/services/project/__init__.py +3 -3
  338. claude_mpm/services/project/analyzer.py +451 -305
  339. claude_mpm/services/project/registry.py +262 -240
  340. claude_mpm/services/recovery_manager.py +287 -231
  341. claude_mpm/services/response_tracker.py +87 -67
  342. claude_mpm/services/runner_configuration_service.py +587 -0
  343. claude_mpm/services/session_management_service.py +304 -0
  344. claude_mpm/services/socketio/__init__.py +4 -4
  345. claude_mpm/services/socketio/client_proxy.py +174 -0
  346. claude_mpm/services/socketio/handlers/__init__.py +3 -3
  347. claude_mpm/services/socketio/handlers/base.py +44 -30
  348. claude_mpm/services/socketio/handlers/connection.py +166 -64
  349. claude_mpm/services/socketio/handlers/file.py +123 -108
  350. claude_mpm/services/socketio/handlers/git.py +607 -373
  351. claude_mpm/services/socketio/handlers/hook.py +185 -0
  352. claude_mpm/services/socketio/handlers/memory.py +4 -4
  353. claude_mpm/services/socketio/handlers/project.py +4 -4
  354. claude_mpm/services/socketio/handlers/registry.py +53 -38
  355. claude_mpm/services/socketio/server/__init__.py +18 -0
  356. claude_mpm/services/socketio/server/broadcaster.py +252 -0
  357. claude_mpm/services/socketio/server/core.py +399 -0
  358. claude_mpm/services/socketio/server/main.py +323 -0
  359. claude_mpm/services/socketio_client_manager.py +160 -133
  360. claude_mpm/services/socketio_server.py +36 -1885
  361. claude_mpm/services/subprocess_launcher_service.py +316 -0
  362. claude_mpm/services/system_instructions_service.py +258 -0
  363. claude_mpm/services/ticket_manager.py +19 -533
  364. claude_mpm/services/utility_service.py +285 -0
  365. claude_mpm/services/version_control/__init__.py +18 -21
  366. claude_mpm/services/version_control/branch_strategy.py +20 -10
  367. claude_mpm/services/version_control/conflict_resolution.py +37 -13
  368. claude_mpm/services/version_control/git_operations.py +52 -21
  369. claude_mpm/services/version_control/semantic_versioning.py +92 -53
  370. claude_mpm/services/version_control/version_parser.py +145 -125
  371. claude_mpm/services/version_service.py +270 -0
  372. claude_mpm/storage/__init__.py +2 -2
  373. claude_mpm/storage/state_storage.py +177 -181
  374. claude_mpm/ticket_wrapper.py +2 -2
  375. claude_mpm/utils/__init__.py +2 -2
  376. claude_mpm/utils/agent_dependency_loader.py +453 -243
  377. claude_mpm/utils/config_manager.py +157 -118
  378. claude_mpm/utils/console.py +1 -1
  379. claude_mpm/utils/dependency_cache.py +102 -107
  380. claude_mpm/utils/dependency_manager.py +52 -47
  381. claude_mpm/utils/dependency_strategies.py +131 -96
  382. claude_mpm/utils/environment_context.py +110 -102
  383. claude_mpm/utils/error_handler.py +75 -55
  384. claude_mpm/utils/file_utils.py +80 -67
  385. claude_mpm/utils/framework_detection.py +12 -11
  386. claude_mpm/utils/import_migration_example.py +12 -60
  387. claude_mpm/utils/imports.py +48 -45
  388. claude_mpm/utils/path_operations.py +100 -93
  389. claude_mpm/utils/robust_installer.py +172 -164
  390. claude_mpm/utils/session_logging.py +30 -23
  391. claude_mpm/utils/subprocess_utils.py +99 -61
  392. claude_mpm/validation/__init__.py +1 -1
  393. claude_mpm/validation/agent_validator.py +151 -111
  394. claude_mpm/validation/frontmatter_validator.py +92 -71
  395. {claude_mpm-3.9.11.dist-info → claude_mpm-4.0.4.dist-info}/METADATA +90 -22
  396. claude_mpm-4.0.4.dist-info/RECORD +417 -0
  397. {claude_mpm-3.9.11.dist-info → claude_mpm-4.0.4.dist-info}/entry_points.txt +1 -0
  398. {claude_mpm-3.9.11.dist-info → claude_mpm-4.0.4.dist-info}/licenses/LICENSE +1 -1
  399. claude_mpm/cli/commands/run_guarded.py +0 -511
  400. claude_mpm/config/memory_guardian_config.py +0 -325
  401. claude_mpm/config/memory_guardian_yaml.py +0 -335
  402. claude_mpm/core/config_paths.py +0 -150
  403. claude_mpm/core/memory_aware_runner.py +0 -353
  404. claude_mpm/dashboard/static/js/dashboard-original.js +0 -4134
  405. claude_mpm/deployment_paths.py +0 -261
  406. claude_mpm/hooks/claude_hooks/hook_handler_fixed.py +0 -454
  407. claude_mpm/models/state_models.py +0 -433
  408. claude_mpm/services/agent/__init__.py +0 -24
  409. claude_mpm/services/agent/deployment.py +0 -2548
  410. claude_mpm/services/agent/management.py +0 -598
  411. claude_mpm/services/agent/registry.py +0 -813
  412. claude_mpm/services/agents/registry/agent_registry.py +0 -813
  413. claude_mpm/services/communication/socketio.py +0 -1935
  414. claude_mpm/services/communication/websocket.py +0 -479
  415. claude_mpm/services/framework_claude_md_generator.py +0 -624
  416. claude_mpm/services/health_monitor.py +0 -893
  417. claude_mpm/services/infrastructure/graceful_degradation.py +0 -616
  418. claude_mpm/services/infrastructure/health_monitor.py +0 -775
  419. claude_mpm/services/infrastructure/memory_dashboard.py +0 -479
  420. claude_mpm/services/infrastructure/memory_guardian.py +0 -944
  421. claude_mpm/services/infrastructure/restart_protection.py +0 -642
  422. claude_mpm/services/infrastructure/state_manager.py +0 -774
  423. claude_mpm/services/mcp_gateway/manager.py +0 -334
  424. claude_mpm/services/optimized_hook_service.py +0 -542
  425. claude_mpm/services/project_analyzer.py +0 -864
  426. claude_mpm/services/project_registry.py +0 -608
  427. claude_mpm/services/standalone_socketio_server.py +0 -1300
  428. claude_mpm/services/ticket_manager_di.py +0 -318
  429. claude_mpm/services/ticketing_service_original.py +0 -510
  430. claude_mpm/utils/paths.py +0 -395
  431. claude_mpm/utils/platform_memory.py +0 -524
  432. claude_mpm-3.9.11.dist-info/RECORD +0 -306
  433. {claude_mpm-3.9.11.dist-info → claude_mpm-4.0.4.dist-info}/WHEEL +0 -0
  434. {claude_mpm-3.9.11.dist-info → claude_mpm-4.0.4.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