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
@@ -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
+ }