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,200 @@
1
+ """Deployment metrics data class."""
2
+
3
+ import time
4
+ from dataclasses import dataclass, field
5
+ from typing import Any, Dict, List, Optional
6
+
7
+
8
+ @dataclass
9
+ class DeploymentMetrics:
10
+ """Metrics collected during agent deployment.
11
+
12
+ This class encapsulates all metrics and timing information
13
+ collected during the deployment process.
14
+ """
15
+
16
+ # Timing metrics
17
+ start_time: float = field(default_factory=time.time)
18
+ end_time: Optional[float] = None
19
+ total_duration: Optional[float] = None
20
+
21
+ # Step timing metrics
22
+ step_timings: Dict[str, float] = field(default_factory=dict)
23
+
24
+ # Agent metrics
25
+ total_agents: int = 0
26
+ deployed_agents: int = 0
27
+ updated_agents: int = 0
28
+ migrated_agents: int = 0
29
+ skipped_agents: int = 0
30
+ repaired_agents: int = 0
31
+ failed_agents: int = 0
32
+
33
+ # Agent lists for detailed tracking
34
+ deployed_agent_names: List[str] = field(default_factory=list)
35
+ updated_agent_names: List[str] = field(default_factory=list)
36
+ migrated_agent_names: List[str] = field(default_factory=list)
37
+ skipped_agent_names: List[str] = field(default_factory=list)
38
+ repaired_agent_names: List[str] = field(default_factory=list)
39
+ failed_agent_names: List[str] = field(default_factory=list)
40
+
41
+ # Error and warning tracking
42
+ errors: List[str] = field(default_factory=list)
43
+ warnings: List[str] = field(default_factory=list)
44
+
45
+ # Performance metrics
46
+ average_agent_deployment_time: Optional[float] = None
47
+ fastest_agent_deployment: Optional[float] = None
48
+ slowest_agent_deployment: Optional[float] = None
49
+
50
+ # Strategy and configuration info
51
+ strategy_used: Optional[str] = None
52
+ deployment_mode: Optional[str] = None
53
+ target_directory: Optional[str] = None
54
+
55
+ # Additional metadata
56
+ metadata: Dict[str, Any] = field(default_factory=dict)
57
+
58
+ def finalize(self, end_time: Optional[float] = None) -> None:
59
+ """Finalize metrics calculation.
60
+
61
+ Args:
62
+ end_time: Optional end time, defaults to current time
63
+ """
64
+ if end_time is None:
65
+ end_time = time.time()
66
+
67
+ self.end_time = end_time
68
+ self.total_duration = end_time - self.start_time
69
+
70
+ # Calculate performance metrics
71
+ if self.step_timings:
72
+ agent_times = [
73
+ t for name, t in self.step_timings.items() if "agent" in name.lower()
74
+ ]
75
+ if agent_times:
76
+ self.average_agent_deployment_time = sum(agent_times) / len(agent_times)
77
+ self.fastest_agent_deployment = min(agent_times)
78
+ self.slowest_agent_deployment = max(agent_times)
79
+
80
+ def add_deployed_agent(
81
+ self, agent_name: str, deployment_time: Optional[float] = None
82
+ ) -> None:
83
+ """Add a deployed agent to metrics.
84
+
85
+ Args:
86
+ agent_name: Name of the deployed agent
87
+ deployment_time: Time taken to deploy the agent
88
+ """
89
+ self.deployed_agents += 1
90
+ self.deployed_agent_names.append(agent_name)
91
+
92
+ if deployment_time is not None:
93
+ self.step_timings[f"agent_{agent_name}"] = deployment_time
94
+
95
+ def add_updated_agent(
96
+ self, agent_name: str, deployment_time: Optional[float] = None
97
+ ) -> None:
98
+ """Add an updated agent to metrics.
99
+
100
+ Args:
101
+ agent_name: Name of the updated agent
102
+ deployment_time: Time taken to update the agent
103
+ """
104
+ self.updated_agents += 1
105
+ self.updated_agent_names.append(agent_name)
106
+
107
+ if deployment_time is not None:
108
+ self.step_timings[f"agent_{agent_name}"] = deployment_time
109
+
110
+ def add_migrated_agent(self, agent_name: str) -> None:
111
+ """Add a migrated agent to metrics.
112
+
113
+ Args:
114
+ agent_name: Name of the migrated agent
115
+ """
116
+ self.migrated_agents += 1
117
+ self.migrated_agent_names.append(agent_name)
118
+
119
+ def add_skipped_agent(self, agent_name: str, reason: Optional[str] = None) -> None:
120
+ """Add a skipped agent to metrics.
121
+
122
+ Args:
123
+ agent_name: Name of the skipped agent
124
+ reason: Optional reason for skipping
125
+ """
126
+ self.skipped_agents += 1
127
+ self.skipped_agent_names.append(agent_name)
128
+
129
+ if reason:
130
+ self.metadata[f"skip_reason_{agent_name}"] = reason
131
+
132
+ def add_repaired_agent(self, agent_name: str) -> None:
133
+ """Add a repaired agent to metrics.
134
+
135
+ Args:
136
+ agent_name: Name of the repaired agent
137
+ """
138
+ self.repaired_agents += 1
139
+ self.repaired_agent_names.append(agent_name)
140
+
141
+ def add_failed_agent(self, agent_name: str, error: str) -> None:
142
+ """Add a failed agent to metrics.
143
+
144
+ Args:
145
+ agent_name: Name of the failed agent
146
+ error: Error message
147
+ """
148
+ self.failed_agents += 1
149
+ self.failed_agent_names.append(agent_name)
150
+ self.errors.append(f"Agent {agent_name}: {error}")
151
+
152
+ def add_error(self, error: str) -> None:
153
+ """Add a general error to metrics.
154
+
155
+ Args:
156
+ error: Error message
157
+ """
158
+ self.errors.append(error)
159
+
160
+ def add_warning(self, warning: str) -> None:
161
+ """Add a warning to metrics.
162
+
163
+ Args:
164
+ warning: Warning message
165
+ """
166
+ self.warnings.append(warning)
167
+
168
+ def get_success_rate(self) -> float:
169
+ """Calculate deployment success rate.
170
+
171
+ Returns:
172
+ Success rate as a percentage (0-100)
173
+ """
174
+ if self.total_agents == 0:
175
+ return 100.0
176
+
177
+ successful = self.deployed_agents + self.updated_agents + self.skipped_agents
178
+ return (successful / self.total_agents) * 100.0
179
+
180
+ def get_summary(self) -> Dict[str, Any]:
181
+ """Get a summary of deployment metrics.
182
+
183
+ Returns:
184
+ Dictionary with metric summary
185
+ """
186
+ return {
187
+ "total_duration": self.total_duration,
188
+ "total_agents": self.total_agents,
189
+ "deployed": self.deployed_agents,
190
+ "updated": self.updated_agents,
191
+ "migrated": self.migrated_agents,
192
+ "skipped": self.skipped_agents,
193
+ "repaired": self.repaired_agents,
194
+ "failed": self.failed_agents,
195
+ "success_rate": self.get_success_rate(),
196
+ "error_count": len(self.errors),
197
+ "warning_count": len(self.warnings),
198
+ "strategy_used": self.strategy_used,
199
+ "deployment_mode": self.deployment_mode,
200
+ }
@@ -0,0 +1,249 @@
1
+ """Deployment result builder for creating structured deployment results."""
2
+
3
+ from pathlib import Path
4
+ from typing import Any, Dict, List, Optional
5
+
6
+ from claude_mpm.core.logger import get_logger
7
+
8
+ from .deployment_metrics import DeploymentMetrics
9
+
10
+
11
+ class DeploymentResultBuilder:
12
+ """Builder for creating structured deployment results.
13
+
14
+ This class provides a clean interface for building deployment
15
+ results with proper structure and metrics collection.
16
+ """
17
+
18
+ def __init__(self):
19
+ """Initialize the deployment result builder."""
20
+ self.logger = get_logger(__name__)
21
+ self.metrics = DeploymentMetrics()
22
+ self._results: Dict[str, Any] = {}
23
+ self._initialized = False
24
+
25
+ def initialize(
26
+ self,
27
+ target_dir: Optional[Path] = None,
28
+ strategy_name: Optional[str] = None,
29
+ deployment_mode: Optional[str] = None,
30
+ ) -> "DeploymentResultBuilder":
31
+ """Initialize the result builder with basic information.
32
+
33
+ Args:
34
+ target_dir: Target directory for deployment
35
+ strategy_name: Name of deployment strategy used
36
+ deployment_mode: Deployment mode used
37
+
38
+ Returns:
39
+ Self for method chaining
40
+ """
41
+ self._results = {
42
+ "target_dir": str(target_dir) if target_dir else "",
43
+ "deployed": [],
44
+ "updated": [],
45
+ "migrated": [],
46
+ "skipped": [],
47
+ "errors": [],
48
+ "warnings": [],
49
+ "repaired": [],
50
+ "total": 0,
51
+ "deployment_time": 0.0,
52
+ "strategy_used": strategy_name or "Unknown",
53
+ "deployment_mode": deployment_mode or "update",
54
+ }
55
+
56
+ # Update metrics
57
+ self.metrics.strategy_used = strategy_name
58
+ self.metrics.deployment_mode = deployment_mode
59
+ self.metrics.target_directory = str(target_dir) if target_dir else None
60
+
61
+ self._initialized = True
62
+ self.logger.debug("Result builder initialized")
63
+ return self
64
+
65
+ def set_total_agents(self, total: int) -> "DeploymentResultBuilder":
66
+ """Set the total number of agents being processed.
67
+
68
+ Args:
69
+ total: Total number of agents
70
+
71
+ Returns:
72
+ Self for method chaining
73
+ """
74
+ self._results["total"] = total
75
+ self.metrics.total_agents = total
76
+ return self
77
+
78
+ def add_deployed_agent(
79
+ self, agent_name: str, deployment_time: Optional[float] = None
80
+ ) -> "DeploymentResultBuilder":
81
+ """Add a deployed agent to results.
82
+
83
+ Args:
84
+ agent_name: Name of the deployed agent
85
+ deployment_time: Time taken to deploy the agent
86
+
87
+ Returns:
88
+ Self for method chaining
89
+ """
90
+ self._results["deployed"].append(agent_name)
91
+ self.metrics.add_deployed_agent(agent_name, deployment_time)
92
+ return self
93
+
94
+ def add_updated_agent(
95
+ self, agent_name: str, deployment_time: Optional[float] = None
96
+ ) -> "DeploymentResultBuilder":
97
+ """Add an updated agent to results.
98
+
99
+ Args:
100
+ agent_name: Name of the updated agent
101
+ deployment_time: Time taken to update the agent
102
+
103
+ Returns:
104
+ Self for method chaining
105
+ """
106
+ self._results["updated"].append(agent_name)
107
+ self.metrics.add_updated_agent(agent_name, deployment_time)
108
+ return self
109
+
110
+ def add_migrated_agent(self, agent_name: str) -> "DeploymentResultBuilder":
111
+ """Add a migrated agent to results.
112
+
113
+ Args:
114
+ agent_name: Name of the migrated agent
115
+
116
+ Returns:
117
+ Self for method chaining
118
+ """
119
+ self._results["migrated"].append(agent_name)
120
+ self.metrics.add_migrated_agent(agent_name)
121
+ return self
122
+
123
+ def add_skipped_agent(
124
+ self, agent_name: str, reason: Optional[str] = None
125
+ ) -> "DeploymentResultBuilder":
126
+ """Add a skipped agent to results.
127
+
128
+ Args:
129
+ agent_name: Name of the skipped agent
130
+ reason: Optional reason for skipping
131
+
132
+ Returns:
133
+ Self for method chaining
134
+ """
135
+ self._results["skipped"].append(agent_name)
136
+ self.metrics.add_skipped_agent(agent_name, reason)
137
+ return self
138
+
139
+ def add_repaired_agent(self, agent_name: str) -> "DeploymentResultBuilder":
140
+ """Add a repaired agent to results.
141
+
142
+ Args:
143
+ agent_name: Name of the repaired agent
144
+
145
+ Returns:
146
+ Self for method chaining
147
+ """
148
+ self._results["repaired"].append(agent_name)
149
+ self.metrics.add_repaired_agent(agent_name)
150
+ return self
151
+
152
+ def add_error(self, error: str) -> "DeploymentResultBuilder":
153
+ """Add an error to results.
154
+
155
+ Args:
156
+ error: Error message
157
+
158
+ Returns:
159
+ Self for method chaining
160
+ """
161
+ self._results["errors"].append(error)
162
+ self.metrics.add_error(error)
163
+ return self
164
+
165
+ def add_warning(self, warning: str) -> "DeploymentResultBuilder":
166
+ """Add a warning to results.
167
+
168
+ Args:
169
+ warning: Warning message
170
+
171
+ Returns:
172
+ Self for method chaining
173
+ """
174
+ self._results["warnings"].append(warning)
175
+ self.metrics.add_warning(warning)
176
+ return self
177
+
178
+ def add_step_timing(
179
+ self, step_name: str, duration: float
180
+ ) -> "DeploymentResultBuilder":
181
+ """Add timing information for a step.
182
+
183
+ Args:
184
+ step_name: Name of the step
185
+ duration: Duration in seconds
186
+
187
+ Returns:
188
+ Self for method chaining
189
+ """
190
+ self.metrics.step_timings[step_name] = duration
191
+ return self
192
+
193
+ def add_metadata(self, key: str, value: Any) -> "DeploymentResultBuilder":
194
+ """Add metadata to results.
195
+
196
+ Args:
197
+ key: Metadata key
198
+ value: Metadata value
199
+
200
+ Returns:
201
+ Self for method chaining
202
+ """
203
+ self.metrics.metadata[key] = value
204
+ return self
205
+
206
+ def build(self) -> Dict[str, Any]:
207
+ """Build the final results dictionary.
208
+
209
+ Returns:
210
+ Complete deployment results dictionary
211
+ """
212
+ if not self._initialized:
213
+ self.logger.warning("Result builder not initialized, using defaults")
214
+ self.initialize()
215
+
216
+ # Finalize metrics
217
+ self.metrics.finalize()
218
+
219
+ # Update results with final timing
220
+ self._results["deployment_time"] = self.metrics.total_duration or 0.0
221
+
222
+ # Add step timings if available
223
+ if self.metrics.step_timings:
224
+ self._results["step_timings"] = self.metrics.step_timings.copy()
225
+
226
+ # Add metrics summary
227
+ self._results["metrics"] = self.metrics.get_summary()
228
+
229
+ # Add detailed metrics if requested
230
+ self._results["detailed_metrics"] = {
231
+ "deployed_agents": self.metrics.deployed_agent_names,
232
+ "updated_agents": self.metrics.updated_agent_names,
233
+ "migrated_agents": self.metrics.migrated_agent_names,
234
+ "skipped_agents": self.metrics.skipped_agent_names,
235
+ "repaired_agents": self.metrics.repaired_agent_names,
236
+ "failed_agents": self.metrics.failed_agent_names,
237
+ "success_rate": self.metrics.get_success_rate(),
238
+ }
239
+
240
+ self.logger.debug(f"Built deployment results with {len(self._results)} fields")
241
+ return self._results.copy()
242
+
243
+ def get_metrics(self) -> DeploymentMetrics:
244
+ """Get the metrics object.
245
+
246
+ Returns:
247
+ DeploymentMetrics object
248
+ """
249
+ return self.metrics
@@ -0,0 +1,25 @@
1
+ """Deployment strategy pattern for agent deployment.
2
+
3
+ This module provides different deployment strategies for various scenarios:
4
+ - SystemAgentDeploymentStrategy: For system-wide agent deployment
5
+ - ProjectAgentDeploymentStrategy: For project-specific agent deployment
6
+ - UserAgentDeploymentStrategy: For user-specific agent deployment
7
+
8
+ The strategy pattern allows for clean separation of deployment logic
9
+ and makes it easy to add new deployment types in the future.
10
+ """
11
+
12
+ from .base_strategy import BaseDeploymentStrategy, DeploymentContext
13
+ from .project_strategy import ProjectAgentDeploymentStrategy
14
+ from .strategy_selector import DeploymentStrategySelector
15
+ from .system_strategy import SystemAgentDeploymentStrategy
16
+ from .user_strategy import UserAgentDeploymentStrategy
17
+
18
+ __all__ = [
19
+ "BaseDeploymentStrategy",
20
+ "DeploymentContext",
21
+ "SystemAgentDeploymentStrategy",
22
+ "ProjectAgentDeploymentStrategy",
23
+ "UserAgentDeploymentStrategy",
24
+ "DeploymentStrategySelector",
25
+ ]
@@ -0,0 +1,119 @@
1
+ """Base deployment strategy interface and context."""
2
+
3
+ from abc import ABC, abstractmethod
4
+ from dataclasses import dataclass
5
+ from pathlib import Path
6
+ from typing import Any, Dict, List, Optional
7
+
8
+ from claude_mpm.core.config import Config
9
+
10
+
11
+ @dataclass
12
+ class DeploymentContext:
13
+ """Context object containing all deployment parameters."""
14
+
15
+ target_dir: Optional[Path] = None
16
+ force_rebuild: bool = False
17
+ deployment_mode: str = "update"
18
+ config: Optional[Config] = None
19
+ use_async: bool = False
20
+ working_directory: Optional[Path] = None
21
+ templates_dir: Optional[Path] = None
22
+ base_agent_path: Optional[Path] = None
23
+
24
+
25
+ class BaseDeploymentStrategy(ABC):
26
+ """Base class for all deployment strategies.
27
+
28
+ This abstract base class defines the interface that all deployment
29
+ strategies must implement. Each strategy handles a specific type
30
+ of deployment (system, project, user) with its own logic.
31
+ """
32
+
33
+ def __init__(self, name: str):
34
+ """Initialize the deployment strategy.
35
+
36
+ Args:
37
+ name: Human-readable name for this strategy
38
+ """
39
+ self.name = name
40
+
41
+ @abstractmethod
42
+ def can_handle(self, context: DeploymentContext) -> bool:
43
+ """Check if this strategy can handle the given deployment context.
44
+
45
+ Args:
46
+ context: Deployment context with parameters
47
+
48
+ Returns:
49
+ True if this strategy should handle the deployment
50
+ """
51
+ pass
52
+
53
+ @abstractmethod
54
+ def determine_target_directory(self, context: DeploymentContext) -> Path:
55
+ """Determine the target directory for deployment.
56
+
57
+ Args:
58
+ context: Deployment context with parameters
59
+
60
+ Returns:
61
+ Path where agents should be deployed
62
+ """
63
+ pass
64
+
65
+ @abstractmethod
66
+ def get_templates_directory(self, context: DeploymentContext) -> Path:
67
+ """Get the templates directory for this deployment type.
68
+
69
+ Args:
70
+ context: Deployment context with parameters
71
+
72
+ Returns:
73
+ Path to the templates directory
74
+ """
75
+ pass
76
+
77
+ @abstractmethod
78
+ def get_excluded_agents(self, context: DeploymentContext) -> List[str]:
79
+ """Get list of agents to exclude for this deployment type.
80
+
81
+ Args:
82
+ context: Deployment context with parameters
83
+
84
+ Returns:
85
+ List of agent names to exclude from deployment
86
+ """
87
+ pass
88
+
89
+ @abstractmethod
90
+ def should_deploy_system_instructions(self, context: DeploymentContext) -> bool:
91
+ """Check if system instructions should be deployed.
92
+
93
+ Args:
94
+ context: Deployment context with parameters
95
+
96
+ Returns:
97
+ True if system instructions should be deployed
98
+ """
99
+ pass
100
+
101
+ @abstractmethod
102
+ def get_deployment_priority(self) -> int:
103
+ """Get the priority of this deployment strategy.
104
+
105
+ Lower numbers have higher priority. Used when multiple
106
+ strategies can handle the same context.
107
+
108
+ Returns:
109
+ Priority number (lower = higher priority)
110
+ """
111
+ pass
112
+
113
+ def __str__(self) -> str:
114
+ """String representation of the strategy."""
115
+ return f"{self.__class__.__name__}({self.name})"
116
+
117
+ def __repr__(self) -> str:
118
+ """Detailed string representation of the strategy."""
119
+ return f"{self.__class__.__name__}(name='{self.name}', priority={self.get_deployment_priority()})"