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,13 @@
1
+ """Configuration management for agent deployment.
2
+
3
+ This module provides configuration management specifically for agent deployment,
4
+ including loading, validation, and processing of deployment-specific settings.
5
+ """
6
+
7
+ from .deployment_config import DeploymentConfig
8
+ from .deployment_config_manager import DeploymentConfigManager
9
+
10
+ __all__ = [
11
+ "DeploymentConfigManager",
12
+ "DeploymentConfig",
13
+ ]
@@ -0,0 +1,182 @@
1
+ """Deployment configuration data class."""
2
+
3
+ from dataclasses import dataclass, field
4
+ from pathlib import Path
5
+ from typing import Any, Dict, List, Optional
6
+
7
+
8
+ @dataclass
9
+ class DeploymentConfig:
10
+ """Configuration for agent deployment operations.
11
+
12
+ This class encapsulates all configuration settings related to
13
+ agent deployment, providing a clean interface for accessing
14
+ deployment-specific settings.
15
+ """
16
+
17
+ # Agent exclusion settings
18
+ excluded_agents: List[str] = field(default_factory=list)
19
+ case_sensitive_exclusion: bool = True
20
+ user_excluded_agents: List[str] = field(default_factory=list)
21
+
22
+ # Deployment behavior settings
23
+ force_rebuild: bool = False
24
+ deployment_mode: str = "update" # "update" or "project"
25
+ use_async: bool = False
26
+
27
+ # Directory settings
28
+ target_dir: Optional[Path] = None
29
+ templates_dir: Optional[Path] = None
30
+ base_agent_path: Optional[Path] = None
31
+ working_directory: Optional[Path] = None
32
+
33
+ # System instructions settings
34
+ deploy_system_instructions: bool = True
35
+ deploy_user_instructions: bool = True
36
+
37
+ # Validation and repair settings
38
+ repair_existing_agents: bool = True
39
+ validate_agents: bool = True
40
+
41
+ # Metrics and logging settings
42
+ collect_metrics: bool = True
43
+ log_level: str = "INFO"
44
+
45
+ # Performance settings
46
+ max_concurrent_operations: int = 10
47
+ timeout_seconds: int = 300
48
+
49
+ # Environment settings
50
+ environment: str = "production" # "development", "testing", "production"
51
+
52
+ # Additional settings
53
+ extra_settings: Dict[str, Any] = field(default_factory=dict)
54
+
55
+ def is_development_mode(self) -> bool:
56
+ """Check if running in development mode.
57
+
58
+ Returns:
59
+ True if in development mode
60
+ """
61
+ return self.environment == "development"
62
+
63
+ def is_testing_mode(self) -> bool:
64
+ """Check if running in testing mode.
65
+
66
+ Returns:
67
+ True if in testing mode
68
+ """
69
+ return self.environment == "testing"
70
+
71
+ def is_production_mode(self) -> bool:
72
+ """Check if running in production mode.
73
+
74
+ Returns:
75
+ True if in production mode
76
+ """
77
+ return self.environment == "production"
78
+
79
+ def should_exclude_agent(self, agent_name: str) -> bool:
80
+ """Check if an agent should be excluded from deployment.
81
+
82
+ Args:
83
+ agent_name: Name of the agent to check
84
+
85
+ Returns:
86
+ True if the agent should be excluded
87
+ """
88
+ if self.case_sensitive_exclusion:
89
+ return agent_name in self.excluded_agents
90
+ else:
91
+ return agent_name.lower() in [name.lower() for name in self.excluded_agents]
92
+
93
+ def get_effective_excluded_agents(self) -> List[str]:
94
+ """Get the effective list of excluded agents.
95
+
96
+ Combines regular excluded agents with user-specific exclusions.
97
+
98
+ Returns:
99
+ List of all excluded agent names
100
+ """
101
+ all_excluded = self.excluded_agents.copy()
102
+ all_excluded.extend(self.user_excluded_agents)
103
+ return list(set(all_excluded)) # Remove duplicates
104
+
105
+ def merge_with_dict(self, config_dict: Dict[str, Any]) -> "DeploymentConfig":
106
+ """Merge this config with a dictionary of settings.
107
+
108
+ Args:
109
+ config_dict: Dictionary of configuration settings
110
+
111
+ Returns:
112
+ New DeploymentConfig with merged settings
113
+ """
114
+ # Create a copy of current config
115
+ new_config = DeploymentConfig(
116
+ excluded_agents=self.excluded_agents.copy(),
117
+ case_sensitive_exclusion=self.case_sensitive_exclusion,
118
+ user_excluded_agents=self.user_excluded_agents.copy(),
119
+ force_rebuild=self.force_rebuild,
120
+ deployment_mode=self.deployment_mode,
121
+ use_async=self.use_async,
122
+ target_dir=self.target_dir,
123
+ templates_dir=self.templates_dir,
124
+ base_agent_path=self.base_agent_path,
125
+ working_directory=self.working_directory,
126
+ deploy_system_instructions=self.deploy_system_instructions,
127
+ deploy_user_instructions=self.deploy_user_instructions,
128
+ repair_existing_agents=self.repair_existing_agents,
129
+ validate_agents=self.validate_agents,
130
+ collect_metrics=self.collect_metrics,
131
+ log_level=self.log_level,
132
+ max_concurrent_operations=self.max_concurrent_operations,
133
+ timeout_seconds=self.timeout_seconds,
134
+ environment=self.environment,
135
+ extra_settings=self.extra_settings.copy(),
136
+ )
137
+
138
+ # Update with values from dictionary
139
+ for key, value in config_dict.items():
140
+ if hasattr(new_config, key):
141
+ setattr(new_config, key, value)
142
+ else:
143
+ new_config.extra_settings[key] = value
144
+
145
+ return new_config
146
+
147
+ def to_dict(self) -> Dict[str, Any]:
148
+ """Convert configuration to dictionary.
149
+
150
+ Returns:
151
+ Dictionary representation of the configuration
152
+ """
153
+ result = {
154
+ "excluded_agents": self.excluded_agents,
155
+ "case_sensitive_exclusion": self.case_sensitive_exclusion,
156
+ "user_excluded_agents": self.user_excluded_agents,
157
+ "force_rebuild": self.force_rebuild,
158
+ "deployment_mode": self.deployment_mode,
159
+ "use_async": self.use_async,
160
+ "target_dir": str(self.target_dir) if self.target_dir else None,
161
+ "templates_dir": str(self.templates_dir) if self.templates_dir else None,
162
+ "base_agent_path": str(self.base_agent_path)
163
+ if self.base_agent_path
164
+ else None,
165
+ "working_directory": str(self.working_directory)
166
+ if self.working_directory
167
+ else None,
168
+ "deploy_system_instructions": self.deploy_system_instructions,
169
+ "deploy_user_instructions": self.deploy_user_instructions,
170
+ "repair_existing_agents": self.repair_existing_agents,
171
+ "validate_agents": self.validate_agents,
172
+ "collect_metrics": self.collect_metrics,
173
+ "log_level": self.log_level,
174
+ "max_concurrent_operations": self.max_concurrent_operations,
175
+ "timeout_seconds": self.timeout_seconds,
176
+ "environment": self.environment,
177
+ }
178
+
179
+ # Add extra settings
180
+ result.update(self.extra_settings)
181
+
182
+ return result
@@ -0,0 +1,200 @@
1
+ """Deployment configuration manager."""
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_config import DeploymentConfig
10
+
11
+
12
+ class DeploymentConfigManager:
13
+ """Manager for deployment configuration.
14
+
15
+ This class handles loading, processing, and validation of
16
+ deployment-specific configuration settings.
17
+ """
18
+
19
+ def __init__(self):
20
+ """Initialize the deployment configuration manager."""
21
+ self.logger = get_logger(__name__)
22
+
23
+ def load_deployment_config(
24
+ self, config: Optional[Config] = None, **overrides
25
+ ) -> DeploymentConfig:
26
+ """Load deployment configuration from various sources.
27
+
28
+ Args:
29
+ config: Optional Config object to load from
30
+ **overrides: Configuration overrides
31
+
32
+ Returns:
33
+ DeploymentConfig object with loaded settings
34
+ """
35
+ # Start with default configuration
36
+ deployment_config = DeploymentConfig()
37
+
38
+ # Load from Config object if provided
39
+ if config:
40
+ config_dict = self._extract_deployment_config(config)
41
+ deployment_config = deployment_config.merge_with_dict(config_dict)
42
+
43
+ # Apply overrides
44
+ if overrides:
45
+ deployment_config = deployment_config.merge_with_dict(overrides)
46
+
47
+ # Validate configuration
48
+ self._validate_config(deployment_config)
49
+
50
+ self.logger.debug(
51
+ f"Loaded deployment configuration: {deployment_config.environment} mode"
52
+ )
53
+ return deployment_config
54
+
55
+ def _extract_deployment_config(self, config: Config) -> Dict[str, Any]:
56
+ """Extract deployment-specific configuration from Config object.
57
+
58
+ Args:
59
+ config: Config object to extract from
60
+
61
+ Returns:
62
+ Dictionary of deployment configuration settings
63
+ """
64
+ config_dict = {}
65
+
66
+ # Extract agent deployment settings
67
+ config_dict["excluded_agents"] = config.get(
68
+ "agent_deployment.excluded_agents", []
69
+ )
70
+ config_dict["case_sensitive_exclusion"] = config.get(
71
+ "agent_deployment.case_sensitive_exclusion", True
72
+ )
73
+ config_dict["user_excluded_agents"] = config.get(
74
+ "agent_deployment.user_excluded_agents", []
75
+ )
76
+
77
+ # Extract system instruction settings
78
+ config_dict["deploy_system_instructions"] = config.get(
79
+ "agent_deployment.deploy_system_instructions", True
80
+ )
81
+ config_dict["deploy_user_instructions"] = config.get(
82
+ "agent_deployment.deploy_user_instructions", True
83
+ )
84
+
85
+ # Extract validation settings
86
+ config_dict["repair_existing_agents"] = config.get(
87
+ "agent_deployment.repair_existing_agents", True
88
+ )
89
+ config_dict["validate_agents"] = config.get(
90
+ "agent_deployment.validate_agents", True
91
+ )
92
+
93
+ # Extract performance settings
94
+ config_dict["use_async"] = config.get("agent_deployment.use_async", False)
95
+ config_dict["max_concurrent_operations"] = config.get(
96
+ "agent_deployment.max_concurrent_operations", 10
97
+ )
98
+ config_dict["timeout_seconds"] = config.get(
99
+ "agent_deployment.timeout_seconds", 300
100
+ )
101
+
102
+ # Extract environment settings
103
+ config_dict["environment"] = config.get("environment", "production")
104
+ config_dict["log_level"] = config.get("logging.level", "INFO")
105
+
106
+ # Extract metrics settings
107
+ config_dict["collect_metrics"] = config.get(
108
+ "agent_deployment.collect_metrics", True
109
+ )
110
+
111
+ return config_dict
112
+
113
+ def _validate_config(self, config: DeploymentConfig) -> None:
114
+ """Validate deployment configuration.
115
+
116
+ Args:
117
+ config: Configuration to validate
118
+
119
+ Raises:
120
+ ValueError: If configuration is invalid
121
+ """
122
+ # Validate deployment mode
123
+ valid_modes = ["update", "project"]
124
+ if config.deployment_mode not in valid_modes:
125
+ raise ValueError(
126
+ f"Invalid deployment mode: {config.deployment_mode}. Must be one of: {valid_modes}"
127
+ )
128
+
129
+ # Validate environment
130
+ valid_environments = ["development", "testing", "production"]
131
+ if config.environment not in valid_environments:
132
+ raise ValueError(
133
+ f"Invalid environment: {config.environment}. Must be one of: {valid_environments}"
134
+ )
135
+
136
+ # Validate paths if provided
137
+ if config.target_dir and not isinstance(config.target_dir, Path):
138
+ try:
139
+ config.target_dir = Path(config.target_dir)
140
+ except Exception as e:
141
+ raise ValueError(f"Invalid target_dir path: {config.target_dir}") from e
142
+
143
+ if config.templates_dir and not isinstance(config.templates_dir, Path):
144
+ try:
145
+ config.templates_dir = Path(config.templates_dir)
146
+ except Exception as e:
147
+ raise ValueError(
148
+ f"Invalid templates_dir path: {config.templates_dir}"
149
+ ) from e
150
+
151
+ if config.base_agent_path and not isinstance(config.base_agent_path, Path):
152
+ try:
153
+ config.base_agent_path = Path(config.base_agent_path)
154
+ except Exception as e:
155
+ raise ValueError(
156
+ f"Invalid base_agent_path: {config.base_agent_path}"
157
+ ) from e
158
+
159
+ if config.working_directory and not isinstance(config.working_directory, Path):
160
+ try:
161
+ config.working_directory = Path(config.working_directory)
162
+ except Exception as e:
163
+ raise ValueError(
164
+ f"Invalid working_directory path: {config.working_directory}"
165
+ ) from e
166
+
167
+ # Validate numeric settings
168
+ if config.max_concurrent_operations <= 0:
169
+ raise ValueError("max_concurrent_operations must be positive")
170
+
171
+ if config.timeout_seconds <= 0:
172
+ raise ValueError("timeout_seconds must be positive")
173
+
174
+ self.logger.debug("Configuration validation passed")
175
+
176
+ def create_config_from_context(self, context) -> DeploymentConfig:
177
+ """Create deployment config from pipeline context.
178
+
179
+ Args:
180
+ context: Pipeline context or deployment context
181
+
182
+ Returns:
183
+ DeploymentConfig object
184
+ """
185
+ config_dict = {
186
+ "target_dir": getattr(context, "target_dir", None),
187
+ "force_rebuild": getattr(context, "force_rebuild", False),
188
+ "deployment_mode": getattr(context, "deployment_mode", "update"),
189
+ "use_async": getattr(context, "use_async", False),
190
+ "working_directory": getattr(context, "working_directory", None),
191
+ "templates_dir": getattr(context, "templates_dir", None),
192
+ "base_agent_path": getattr(context, "base_agent_path", None),
193
+ }
194
+
195
+ # Remove None values
196
+ config_dict = {k: v for k, v in config_dict.items() if v is not None}
197
+
198
+ return self.load_deployment_config(
199
+ config=getattr(context, "config", None), **config_dict
200
+ )
@@ -0,0 +1,54 @@
1
+ """Deployment configuration loading for agent deployment service.
2
+
3
+ This module handles loading and processing of deployment configuration.
4
+ Extracted from AgentDeploymentService to reduce complexity and improve maintainability.
5
+ """
6
+
7
+ import logging
8
+ from typing import Optional, Tuple
9
+
10
+ from claude_mpm.core.config import Config
11
+
12
+
13
+ class DeploymentConfigLoader:
14
+ """Handles loading and processing of deployment configuration."""
15
+
16
+ def __init__(self, logger: logging.Logger):
17
+ """Initialize the config loader with a logger."""
18
+ self.logger = logger
19
+
20
+ def load_deployment_config(self, config: Optional[Config]) -> Tuple[Config, list]:
21
+ """
22
+ Load and process deployment configuration.
23
+
24
+ Centralized configuration loading reduces duplication
25
+ and ensures consistent handling of exclusion settings.
26
+
27
+ Args:
28
+ config: Optional configuration object
29
+
30
+ Returns:
31
+ Tuple of (config, excluded_agents)
32
+ """
33
+ # Load configuration if not provided
34
+ if config is None:
35
+ config = Config()
36
+
37
+ # Get agent exclusion configuration
38
+ excluded_agents = config.get("agent_deployment.excluded_agents", [])
39
+ case_sensitive = config.get("agent_deployment.case_sensitive", False)
40
+ exclude_dependencies = config.get(
41
+ "agent_deployment.exclude_dependencies", False
42
+ )
43
+
44
+ # Normalize excluded agents list for comparison
45
+ if not case_sensitive:
46
+ excluded_agents = [agent.lower() for agent in excluded_agents]
47
+
48
+ # Log exclusion configuration if agents are being excluded
49
+ if excluded_agents:
50
+ self.logger.info(f"Excluding agents from deployment: {excluded_agents}")
51
+ self.logger.debug(f"Case sensitive matching: {case_sensitive}")
52
+ self.logger.debug(f"Exclude dependencies: {exclude_dependencies}")
53
+
54
+ return config, excluded_agents
@@ -0,0 +1,124 @@
1
+ """Deployment type detection for agent deployment service.
2
+
3
+ This module provides utilities to detect the type of agent deployment
4
+ (system, project-specific, or user custom) based on template directory paths.
5
+ Extracted from AgentDeploymentService to reduce complexity.
6
+ """
7
+
8
+ from pathlib import Path
9
+ from typing import Optional
10
+
11
+ from claude_mpm.config.paths import paths
12
+
13
+
14
+ class DeploymentTypeDetector:
15
+ """Detects the type of agent deployment based on template directory."""
16
+
17
+ @staticmethod
18
+ def is_system_agent_deployment(templates_dir: Optional[Path]) -> bool:
19
+ """
20
+ Check if this is a deployment of system agents.
21
+
22
+ System agents are those provided by the claude-mpm package itself,
23
+ located in the package's agents/templates directory.
24
+
25
+ Args:
26
+ templates_dir: Directory containing agent templates
27
+
28
+ Returns:
29
+ True if deploying system agents, False otherwise
30
+ """
31
+ # Check if templates_dir points to the system templates
32
+ if templates_dir and templates_dir.exists():
33
+ # System agents are in the package's agents/templates directory
34
+ try:
35
+ # Check if templates_dir is within the claude_mpm package structure
36
+ templates_str = str(templates_dir.resolve())
37
+ return (
38
+ "site-packages/claude_mpm" in templates_str
39
+ or "src/claude_mpm/agents/templates" in templates_str
40
+ or (paths.agents_dir / "templates").resolve()
41
+ == templates_dir.resolve()
42
+ )
43
+ except Exception:
44
+ pass
45
+ return False
46
+
47
+ @staticmethod
48
+ def is_project_specific_deployment(
49
+ templates_dir: Optional[Path], working_directory: Path
50
+ ) -> bool:
51
+ """
52
+ Check if deploying project-specific agents.
53
+
54
+ Project-specific agents are those found in the project's
55
+ .claude-mpm/agents/ directory.
56
+
57
+ Args:
58
+ templates_dir: Directory containing agent templates
59
+ working_directory: Current working directory
60
+
61
+ Returns:
62
+ True if deploying project-specific agents, False otherwise
63
+ """
64
+ # Check if we're in a project directory with .claude-mpm/agents
65
+ project_agents_dir = working_directory / ".claude-mpm" / "agents"
66
+ if project_agents_dir.exists():
67
+ # Check if templates_dir points to project agents
68
+ if templates_dir and templates_dir.exists():
69
+ try:
70
+ return project_agents_dir.resolve() == templates_dir.resolve()
71
+ except Exception:
72
+ pass
73
+ return False
74
+
75
+ @staticmethod
76
+ def is_user_custom_deployment(templates_dir: Optional[Path]) -> bool:
77
+ """
78
+ Check if deploying user custom agents.
79
+
80
+ User custom agents are those in ~/.claude-mpm/agents/
81
+
82
+ Args:
83
+ templates_dir: Directory containing agent templates
84
+
85
+ Returns:
86
+ True if deploying user custom agents, False otherwise
87
+ """
88
+ user_agents_dir = Path.home() / ".claude-mpm" / "agents"
89
+ if user_agents_dir.exists():
90
+ # Check if templates_dir points to user agents
91
+ if templates_dir and templates_dir.exists():
92
+ try:
93
+ return user_agents_dir.resolve() == templates_dir.resolve()
94
+ except Exception:
95
+ pass
96
+ return False
97
+
98
+ @staticmethod
99
+ def determine_source_tier(templates_dir: Optional[Path]) -> str:
100
+ """
101
+ Determine the source tier for logging.
102
+
103
+ Understanding which tier (SYSTEM/USER/PROJECT) agents
104
+ are being deployed from helps with debugging and auditing.
105
+
106
+ Args:
107
+ templates_dir: Directory containing agent templates
108
+
109
+ Returns:
110
+ Source tier string: "SYSTEM", "USER", or "PROJECT"
111
+ """
112
+ if templates_dir:
113
+ templates_str = str(templates_dir)
114
+ if (
115
+ ".claude-mpm/agents" in templates_str
116
+ and "/templates" not in templates_str
117
+ ):
118
+ return "PROJECT"
119
+ elif (
120
+ "/.claude-mpm/agents" in templates_str
121
+ and "/templates" not in templates_str
122
+ ):
123
+ return "USER"
124
+ return "SYSTEM"
@@ -0,0 +1,18 @@
1
+ """Deployment facade for handling async/sync deployment modes.
2
+
3
+ This module provides a clean facade pattern for handling different
4
+ deployment execution modes (async vs sync) without cluttering the
5
+ main deployment logic with conditional complexity.
6
+ """
7
+
8
+ from .async_deployment_executor import AsyncDeploymentExecutor
9
+ from .deployment_executor import DeploymentExecutor
10
+ from .deployment_facade import DeploymentFacade
11
+ from .sync_deployment_executor import SyncDeploymentExecutor
12
+
13
+ __all__ = [
14
+ "DeploymentExecutor",
15
+ "DeploymentFacade",
16
+ "AsyncDeploymentExecutor",
17
+ "SyncDeploymentExecutor",
18
+ ]