claude-mpm 3.9.11__py3-none-any.whl → 4.0.4__py3-none-any.whl

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