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
@@ -0,0 +1,159 @@
1
+ """Asynchronous deployment executor."""
2
+
3
+ from pathlib import Path
4
+ from typing import Any, Dict, Optional
5
+
6
+ from claude_mpm.core.config import Config
7
+ from claude_mpm.core.logger import get_logger
8
+
9
+ from .deployment_executor import DeploymentExecutor
10
+
11
+
12
+ class AsyncDeploymentExecutor(DeploymentExecutor):
13
+ """Asynchronous deployment executor.
14
+
15
+ This executor uses async operations for improved performance
16
+ when processing multiple agents concurrently.
17
+ """
18
+
19
+ def __init__(self):
20
+ """Initialize async deployment executor."""
21
+ self.logger = get_logger(__name__)
22
+ self._async_module = None
23
+ self._is_available = None
24
+
25
+ def execute_deployment(
26
+ self,
27
+ templates_dir: Path,
28
+ base_agent_path: Path,
29
+ working_directory: Path,
30
+ target_dir: Optional[Path] = None,
31
+ force_rebuild: bool = False,
32
+ deployment_mode: str = "update",
33
+ config: Optional[Config] = None,
34
+ ) -> Dict[str, Any]:
35
+ """Execute asynchronous deployment.
36
+
37
+ Args:
38
+ templates_dir: Directory containing agent templates
39
+ base_agent_path: Path to base agent configuration
40
+ working_directory: Working directory for deployment
41
+ target_dir: Target directory for deployment
42
+ force_rebuild: Whether to force rebuild
43
+ deployment_mode: Deployment mode (update/project)
44
+ config: Optional configuration
45
+
46
+ Returns:
47
+ Deployment results dictionary
48
+ """
49
+ if not self.is_available():
50
+ raise RuntimeError("Async deployment is not available")
51
+
52
+ self.logger.info("Executing asynchronous deployment")
53
+
54
+ try:
55
+ # Import async deployment module
56
+ async_module = self._get_async_module()
57
+
58
+ # Execute async deployment
59
+ results = async_module.deploy_agents_async_wrapper(
60
+ templates_dir=templates_dir,
61
+ base_agent_path=base_agent_path,
62
+ working_directory=working_directory,
63
+ target_dir=target_dir,
64
+ force_rebuild=force_rebuild,
65
+ config=config,
66
+ )
67
+
68
+ # Add executor metadata
69
+ if "metadata" not in results:
70
+ results["metadata"] = {}
71
+
72
+ results["metadata"]["executor"] = self.get_executor_name()
73
+ results["metadata"]["execution_mode"] = "asynchronous"
74
+
75
+ # Add performance metrics
76
+ if "metrics" not in results:
77
+ results["metrics"] = {}
78
+
79
+ results["metrics"]["deployment_method"] = "async"
80
+
81
+ return results
82
+
83
+ except Exception as e:
84
+ self.logger.error(f"Asynchronous deployment failed: {e}", exc_info=True)
85
+ return {
86
+ "success": False,
87
+ "error": str(e),
88
+ "deployed": [],
89
+ "updated": [],
90
+ "migrated": [],
91
+ "skipped": [],
92
+ "errors": [str(e)],
93
+ "metadata": {
94
+ "executor": self.get_executor_name(),
95
+ "execution_mode": "asynchronous",
96
+ "error_type": type(e).__name__,
97
+ },
98
+ }
99
+
100
+ def is_available(self) -> bool:
101
+ """Check if async deployment is available.
102
+
103
+ Returns:
104
+ True if async deployment module can be imported
105
+ """
106
+ if self._is_available is None:
107
+ try:
108
+ self._get_async_module()
109
+ self._is_available = True
110
+ except ImportError:
111
+ self._is_available = False
112
+ self.logger.debug("Async deployment module not available")
113
+ except Exception as e:
114
+ self._is_available = False
115
+ self.logger.debug(f"Async deployment check failed: {e}")
116
+
117
+ return self._is_available
118
+
119
+ def _get_async_module(self):
120
+ """Get the async deployment module.
121
+
122
+ Returns:
123
+ Async deployment module
124
+
125
+ Raises:
126
+ ImportError: If async module cannot be imported
127
+ """
128
+ if self._async_module is None:
129
+ try:
130
+ from claude_mpm.services.agents.deployment import async_agent_deployment
131
+
132
+ self._async_module = async_agent_deployment
133
+ except ImportError as e:
134
+ raise ImportError("Async deployment module not available") from e
135
+
136
+ return self._async_module
137
+
138
+ def get_executor_name(self) -> str:
139
+ """Get executor name.
140
+
141
+ Returns:
142
+ Executor name
143
+ """
144
+ return "async"
145
+
146
+ def get_performance_characteristics(self) -> Dict[str, Any]:
147
+ """Get performance characteristics.
148
+
149
+ Returns:
150
+ Performance characteristics dictionary
151
+ """
152
+ return {
153
+ "name": self.get_executor_name(),
154
+ "available": self.is_available(),
155
+ "estimated_speedup": 1.6, # 50-70% faster based on existing comments
156
+ "memory_usage": "higher", # Concurrent operations use more memory
157
+ "reliability": "medium", # More complex, potential for async issues
158
+ "description": "Concurrent processing for improved performance",
159
+ }
@@ -0,0 +1,73 @@
1
+ """Base deployment executor interface."""
2
+
3
+ from abc import ABC, abstractmethod
4
+ from pathlib import Path
5
+ from typing import Any, Dict, Optional
6
+
7
+ from claude_mpm.core.config import Config
8
+
9
+
10
+ class DeploymentExecutor(ABC):
11
+ """Abstract base class for deployment executors.
12
+
13
+ This interface defines the contract for different deployment
14
+ execution strategies (async vs sync).
15
+ """
16
+
17
+ @abstractmethod
18
+ def execute_deployment(
19
+ self,
20
+ templates_dir: Path,
21
+ base_agent_path: Path,
22
+ working_directory: Path,
23
+ target_dir: Optional[Path] = None,
24
+ force_rebuild: bool = False,
25
+ deployment_mode: str = "update",
26
+ config: Optional[Config] = None,
27
+ ) -> Dict[str, Any]:
28
+ """Execute deployment with the specific strategy.
29
+
30
+ Args:
31
+ templates_dir: Directory containing agent templates
32
+ base_agent_path: Path to base agent configuration
33
+ working_directory: Working directory for deployment
34
+ target_dir: Target directory for deployment
35
+ force_rebuild: Whether to force rebuild
36
+ deployment_mode: Deployment mode (update/project)
37
+ config: Optional configuration
38
+
39
+ Returns:
40
+ Deployment results dictionary
41
+ """
42
+ pass
43
+
44
+ @abstractmethod
45
+ def is_available(self) -> bool:
46
+ """Check if this executor is available.
47
+
48
+ Returns:
49
+ True if executor can be used
50
+ """
51
+ pass
52
+
53
+ @abstractmethod
54
+ def get_executor_name(self) -> str:
55
+ """Get the name of this executor.
56
+
57
+ Returns:
58
+ Executor name for logging/metrics
59
+ """
60
+ pass
61
+
62
+ def get_performance_characteristics(self) -> Dict[str, Any]:
63
+ """Get performance characteristics of this executor.
64
+
65
+ Returns:
66
+ Dictionary with performance info
67
+ """
68
+ return {
69
+ "name": self.get_executor_name(),
70
+ "available": self.is_available(),
71
+ "estimated_speedup": 1.0, # Override in subclasses
72
+ "memory_usage": "normal", # Override in subclasses
73
+ }
@@ -0,0 +1,270 @@
1
+ """Deployment facade for handling async/sync deployment modes."""
2
+
3
+ from pathlib import Path
4
+ from typing import Any, Dict, List, Optional
5
+
6
+ from claude_mpm.core.config import Config
7
+ from claude_mpm.core.logger import get_logger
8
+
9
+ from .async_deployment_executor import AsyncDeploymentExecutor
10
+ from .deployment_executor import DeploymentExecutor
11
+ from .sync_deployment_executor import SyncDeploymentExecutor
12
+
13
+
14
+ class DeploymentFacade:
15
+ """Facade for handling different deployment execution modes.
16
+
17
+ This facade provides a clean interface for choosing between
18
+ async and sync deployment execution without cluttering the
19
+ main deployment logic with conditional complexity.
20
+ """
21
+
22
+ def __init__(self, pipeline_builder, pipeline_executor):
23
+ """Initialize deployment facade.
24
+
25
+ Args:
26
+ pipeline_builder: Pipeline builder for sync deployment
27
+ pipeline_executor: Pipeline executor for sync deployment
28
+ """
29
+ self.logger = get_logger(__name__)
30
+
31
+ # Initialize executors
32
+ self.sync_executor = SyncDeploymentExecutor(pipeline_builder, pipeline_executor)
33
+ self.async_executor = AsyncDeploymentExecutor()
34
+
35
+ # Executor registry
36
+ self.executors = {
37
+ "sync": self.sync_executor,
38
+ "async": self.async_executor,
39
+ }
40
+
41
+ def deploy_agents(
42
+ self,
43
+ templates_dir: Path,
44
+ base_agent_path: Path,
45
+ working_directory: Path,
46
+ target_dir: Optional[Path] = None,
47
+ force_rebuild: bool = False,
48
+ deployment_mode: str = "update",
49
+ config: Optional[Config] = None,
50
+ use_async: bool = False,
51
+ preferred_executor: Optional[str] = None,
52
+ ) -> Dict[str, Any]:
53
+ """Deploy agents using the appropriate executor.
54
+
55
+ Args:
56
+ templates_dir: Directory containing agent templates
57
+ base_agent_path: Path to base agent configuration
58
+ working_directory: Working directory for deployment
59
+ target_dir: Target directory for deployment
60
+ force_rebuild: Whether to force rebuild
61
+ deployment_mode: Deployment mode (update/project)
62
+ config: Optional configuration
63
+ use_async: Whether to prefer async execution
64
+ preferred_executor: Specific executor to use ('sync' or 'async')
65
+
66
+ Returns:
67
+ Deployment results dictionary
68
+ """
69
+ # Select executor
70
+ executor = self._select_executor(use_async, preferred_executor)
71
+
72
+ self.logger.info(f"Using {executor.get_executor_name()} deployment executor")
73
+
74
+ # Execute deployment
75
+ try:
76
+ results = executor.execute_deployment(
77
+ templates_dir=templates_dir,
78
+ base_agent_path=base_agent_path,
79
+ working_directory=working_directory,
80
+ target_dir=target_dir,
81
+ force_rebuild=force_rebuild,
82
+ deployment_mode=deployment_mode,
83
+ config=config,
84
+ )
85
+
86
+ # Add facade metadata
87
+ if "metadata" not in results:
88
+ results["metadata"] = {}
89
+
90
+ results["metadata"]["facade_version"] = "1.0.0"
91
+ results["metadata"]["selected_executor"] = executor.get_executor_name()
92
+ results["metadata"][
93
+ "executor_characteristics"
94
+ ] = executor.get_performance_characteristics()
95
+
96
+ return results
97
+
98
+ except Exception as e:
99
+ self.logger.error(
100
+ f"Deployment failed with {executor.get_executor_name()} executor: {e}"
101
+ )
102
+
103
+ # If async failed and we have a fallback option, try sync
104
+ if (
105
+ executor.get_executor_name() == "async"
106
+ and self.sync_executor.is_available()
107
+ ):
108
+ self.logger.info("Falling back to synchronous deployment")
109
+ return self._fallback_to_sync(
110
+ templates_dir,
111
+ base_agent_path,
112
+ working_directory,
113
+ target_dir,
114
+ force_rebuild,
115
+ deployment_mode,
116
+ config,
117
+ e,
118
+ )
119
+
120
+ # No fallback available, return error result
121
+ return {
122
+ "success": False,
123
+ "error": str(e),
124
+ "deployed": [],
125
+ "updated": [],
126
+ "migrated": [],
127
+ "skipped": [],
128
+ "errors": [str(e)],
129
+ "metadata": {
130
+ "facade_version": "1.0.0",
131
+ "selected_executor": executor.get_executor_name(),
132
+ "error_type": type(e).__name__,
133
+ "fallback_attempted": False,
134
+ },
135
+ }
136
+
137
+ def _select_executor(
138
+ self, use_async: bool, preferred_executor: Optional[str]
139
+ ) -> DeploymentExecutor:
140
+ """Select the appropriate deployment executor.
141
+
142
+ Args:
143
+ use_async: Whether to prefer async execution
144
+ preferred_executor: Specific executor preference
145
+
146
+ Returns:
147
+ Selected deployment executor
148
+ """
149
+ # If specific executor is requested, try to use it
150
+ if preferred_executor:
151
+ if preferred_executor in self.executors:
152
+ executor = self.executors[preferred_executor]
153
+ if executor.is_available():
154
+ return executor
155
+ else:
156
+ self.logger.warning(
157
+ f"Preferred executor '{preferred_executor}' is not available"
158
+ )
159
+ else:
160
+ self.logger.warning(f"Unknown executor '{preferred_executor}'")
161
+
162
+ # If async is preferred and available, use it
163
+ if use_async and self.async_executor.is_available():
164
+ return self.async_executor
165
+
166
+ # Fall back to sync executor
167
+ if self.sync_executor.is_available():
168
+ return self.sync_executor
169
+
170
+ # This should never happen, but just in case
171
+ raise RuntimeError("No deployment executors are available")
172
+
173
+ def get_available_executors(self) -> List[Dict[str, Any]]:
174
+ """Get information about available executors.
175
+
176
+ Returns:
177
+ List of executor information dictionaries
178
+ """
179
+ return [
180
+ executor.get_performance_characteristics()
181
+ for executor in self.executors.values()
182
+ if executor.is_available()
183
+ ]
184
+
185
+ def get_recommended_executor(self, agent_count: int = 1) -> str:
186
+ """Get recommended executor based on deployment characteristics.
187
+
188
+ Args:
189
+ agent_count: Number of agents to deploy
190
+
191
+ Returns:
192
+ Recommended executor name
193
+ """
194
+ # For small deployments, sync is fine
195
+ if agent_count <= 3:
196
+ return "sync"
197
+
198
+ # For larger deployments, prefer async if available
199
+ if self.async_executor.is_available():
200
+ return "async"
201
+
202
+ # Fallback to sync
203
+ return "sync"
204
+
205
+ def _fallback_to_sync(
206
+ self,
207
+ templates_dir: Path,
208
+ base_agent_path: Path,
209
+ working_directory: Path,
210
+ target_dir: Optional[Path],
211
+ force_rebuild: bool,
212
+ deployment_mode: str,
213
+ config: Optional[Config],
214
+ original_error: Exception,
215
+ ) -> Dict[str, Any]:
216
+ """Fallback to sync deployment when async fails.
217
+
218
+ Args:
219
+ templates_dir: Directory containing agent templates
220
+ base_agent_path: Path to base agent configuration
221
+ working_directory: Working directory for deployment
222
+ target_dir: Target directory for deployment
223
+ force_rebuild: Whether to force rebuild
224
+ deployment_mode: Deployment mode
225
+ config: Optional configuration
226
+ original_error: The original error that caused fallback
227
+
228
+ Returns:
229
+ Deployment results from sync executor
230
+ """
231
+ try:
232
+ results = self.sync_executor.execute_deployment(
233
+ templates_dir=templates_dir,
234
+ base_agent_path=base_agent_path,
235
+ working_directory=working_directory,
236
+ target_dir=target_dir,
237
+ force_rebuild=force_rebuild,
238
+ deployment_mode=deployment_mode,
239
+ config=config,
240
+ )
241
+
242
+ # Add fallback metadata
243
+ if "metadata" not in results:
244
+ results["metadata"] = {}
245
+
246
+ results["metadata"]["fallback_from"] = "async"
247
+ results["metadata"]["original_error"] = str(original_error)
248
+ results["metadata"]["fallback_successful"] = results.get("success", False)
249
+
250
+ return results
251
+
252
+ except Exception as fallback_error:
253
+ self.logger.error(f"Fallback to sync also failed: {fallback_error}")
254
+ return {
255
+ "success": False,
256
+ "error": f"Both async and sync deployment failed. Async: {original_error}, Sync: {fallback_error}",
257
+ "deployed": [],
258
+ "updated": [],
259
+ "migrated": [],
260
+ "skipped": [],
261
+ "errors": [str(original_error), str(fallback_error)],
262
+ "metadata": {
263
+ "facade_version": "1.0.0",
264
+ "selected_executor": "async",
265
+ "fallback_attempted": True,
266
+ "fallback_successful": False,
267
+ "original_error": str(original_error),
268
+ "fallback_error": str(fallback_error),
269
+ },
270
+ }
@@ -0,0 +1,178 @@
1
+ """Synchronous deployment executor."""
2
+
3
+ from pathlib import Path
4
+ from typing import Any, Dict, Optional
5
+
6
+ from claude_mpm.core.config import Config
7
+ from claude_mpm.core.logger import get_logger
8
+
9
+ from .deployment_executor import DeploymentExecutor
10
+
11
+
12
+ class SyncDeploymentExecutor(DeploymentExecutor):
13
+ """Synchronous deployment executor.
14
+
15
+ This executor uses the standard synchronous deployment pipeline
16
+ for reliable, sequential processing of agents.
17
+ """
18
+
19
+ def __init__(self, pipeline_builder, pipeline_executor):
20
+ """Initialize sync deployment executor.
21
+
22
+ Args:
23
+ pipeline_builder: Pipeline builder for creating deployment pipelines
24
+ pipeline_executor: Pipeline executor for running pipelines
25
+ """
26
+ self.pipeline_builder = pipeline_builder
27
+ self.pipeline_executor = pipeline_executor
28
+ self.logger = get_logger(__name__)
29
+
30
+ def execute_deployment(
31
+ self,
32
+ templates_dir: Path,
33
+ base_agent_path: Path,
34
+ working_directory: Path,
35
+ target_dir: Optional[Path] = None,
36
+ force_rebuild: bool = False,
37
+ deployment_mode: str = "update",
38
+ config: Optional[Config] = None,
39
+ ) -> Dict[str, Any]:
40
+ """Execute synchronous deployment.
41
+
42
+ Args:
43
+ templates_dir: Directory containing agent templates
44
+ base_agent_path: Path to base agent configuration
45
+ working_directory: Working directory for deployment
46
+ target_dir: Target directory for deployment
47
+ force_rebuild: Whether to force rebuild
48
+ deployment_mode: Deployment mode (update/project)
49
+ config: Optional configuration
50
+
51
+ Returns:
52
+ Deployment results dictionary
53
+ """
54
+ self.logger.info("Executing synchronous deployment")
55
+
56
+ try:
57
+ # Build deployment pipeline
58
+ pipeline = self.pipeline_builder.create_standard_pipeline()
59
+
60
+ # Create pipeline context
61
+ from claude_mpm.services.agents.deployment.pipeline import PipelineContext
62
+
63
+ context = PipelineContext(
64
+ templates_dir=templates_dir,
65
+ base_agent_path=base_agent_path,
66
+ working_directory=working_directory,
67
+ target_dir=target_dir,
68
+ force_rebuild=force_rebuild,
69
+ deployment_mode=deployment_mode,
70
+ config=config,
71
+ )
72
+
73
+ # Execute pipeline
74
+ pipeline_result = self.pipeline_executor.execute(pipeline, context)
75
+
76
+ # Convert pipeline result to deployment result format
77
+ deployment_result = self._convert_pipeline_result(pipeline_result, context)
78
+
79
+ # Add executor metadata
80
+ deployment_result["metadata"]["executor"] = self.get_executor_name()
81
+ deployment_result["metadata"]["execution_mode"] = "synchronous"
82
+
83
+ return deployment_result
84
+
85
+ except Exception as e:
86
+ self.logger.error(f"Synchronous deployment failed: {e}", exc_info=True)
87
+ return {
88
+ "success": False,
89
+ "error": str(e),
90
+ "deployed": [],
91
+ "updated": [],
92
+ "migrated": [],
93
+ "skipped": [],
94
+ "errors": [str(e)],
95
+ "metadata": {
96
+ "executor": self.get_executor_name(),
97
+ "execution_mode": "synchronous",
98
+ "error_type": type(e).__name__,
99
+ },
100
+ }
101
+
102
+ def _convert_pipeline_result(self, pipeline_result, context) -> Dict[str, Any]:
103
+ """Convert pipeline result to deployment result format.
104
+
105
+ Args:
106
+ pipeline_result: Result from pipeline execution (dict)
107
+ context: Pipeline context with results
108
+
109
+ Returns:
110
+ Deployment result dictionary
111
+ """
112
+ # Extract pipeline execution info
113
+ pipeline_exec = pipeline_result.get("pipeline_execution", {})
114
+
115
+ # Extract results from pipeline result
116
+ deployed = pipeline_result.get("deployed", [])
117
+ updated = pipeline_result.get("updated", [])
118
+ migrated = pipeline_result.get("migrated", [])
119
+ skipped = pipeline_result.get("skipped", [])
120
+ errors = pipeline_result.get("errors", [])
121
+
122
+ return {
123
+ "success": pipeline_exec.get("success", False),
124
+ "target_dir": (
125
+ str(context.actual_target_dir)
126
+ if hasattr(context, "actual_target_dir")
127
+ else None
128
+ ),
129
+ "deployed": deployed,
130
+ "updated": updated,
131
+ "migrated": migrated,
132
+ "skipped": skipped,
133
+ "errors": errors,
134
+ "warnings": getattr(context, "warnings", []),
135
+ "metrics": {
136
+ "total_steps": pipeline_exec.get("total_steps", 0),
137
+ "executed_steps": pipeline_exec.get("executed_steps", []),
138
+ "failed_steps": pipeline_exec.get("failed_steps", []),
139
+ "total_execution_time": pipeline_exec.get("total_execution_time", 0),
140
+ "step_timings": getattr(context, "step_timings", {}),
141
+ "deployment_time": pipeline_result.get("deployment_time", 0),
142
+ },
143
+ "metadata": {
144
+ "pipeline_execution": pipeline_exec,
145
+ "step_timings": getattr(context, "step_timings", {}),
146
+ },
147
+ }
148
+
149
+ def is_available(self) -> bool:
150
+ """Sync executor is always available.
151
+
152
+ Returns:
153
+ True - sync execution is always available
154
+ """
155
+ return True
156
+
157
+ def get_executor_name(self) -> str:
158
+ """Get executor name.
159
+
160
+ Returns:
161
+ Executor name
162
+ """
163
+ return "sync"
164
+
165
+ def get_performance_characteristics(self) -> Dict[str, Any]:
166
+ """Get performance characteristics.
167
+
168
+ Returns:
169
+ Performance characteristics dictionary
170
+ """
171
+ return {
172
+ "name": self.get_executor_name(),
173
+ "available": self.is_available(),
174
+ "estimated_speedup": 1.0, # Baseline
175
+ "memory_usage": "normal",
176
+ "reliability": "high",
177
+ "description": "Sequential processing with high reliability",
178
+ }