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,227 @@
1
+ """Interface adapter for AgentDeploymentService compliance."""
2
+
3
+ from pathlib import Path
4
+ from typing import Any, Dict, List, Optional, Tuple
5
+
6
+ from claude_mpm.core.interfaces import AgentDeploymentInterface
7
+ from claude_mpm.core.logger import get_logger
8
+
9
+
10
+ class AgentDeploymentInterfaceAdapter(AgentDeploymentInterface):
11
+ """Adapter to make AgentDeploymentService compliant with AgentDeploymentInterface.
12
+
13
+ This adapter bridges the gap between the current implementation's method
14
+ signatures and the required interface signatures, providing a clean
15
+ interface compliance layer.
16
+ """
17
+
18
+ def __init__(self, deployment_service):
19
+ """Initialize the interface adapter.
20
+
21
+ Args:
22
+ deployment_service: The actual deployment service implementation
23
+ """
24
+ self.deployment_service = deployment_service
25
+ self.logger = get_logger(__name__)
26
+
27
+ def deploy_agents(
28
+ self, force: bool = False, include_all: bool = False
29
+ ) -> Dict[str, Any]:
30
+ """Deploy agents to target environment.
31
+
32
+ This method adapts the interface signature to the actual implementation.
33
+
34
+ Args:
35
+ force: Force deployment even if agents already exist
36
+ include_all: Include all agents, ignoring exclusion lists
37
+
38
+ Returns:
39
+ Dictionary with deployment results and status
40
+ """
41
+ try:
42
+ # Map interface parameters to implementation parameters
43
+ force_rebuild = force
44
+
45
+ # Determine deployment mode based on include_all
46
+ deployment_mode = "project" if include_all else "update"
47
+
48
+ # Call the actual implementation
49
+ results = self.deployment_service.deploy_agents(
50
+ target_dir=None, # Use default target directory
51
+ force_rebuild=force_rebuild,
52
+ deployment_mode=deployment_mode,
53
+ config=None, # Use default configuration
54
+ use_async=False, # Default to sync for interface compliance
55
+ )
56
+
57
+ # Ensure the result has the expected structure
58
+ if not isinstance(results, dict):
59
+ return {
60
+ "success": False,
61
+ "error": "Invalid result format from deployment service",
62
+ "deployed": [],
63
+ "updated": [],
64
+ "migrated": [],
65
+ "skipped": [],
66
+ "errors": ["Invalid result format"],
67
+ }
68
+
69
+ # Add interface compliance metadata
70
+ results["interface_version"] = "1.0.0"
71
+ results["adapter_used"] = True
72
+
73
+ return results
74
+
75
+ except Exception as e:
76
+ self.logger.error(
77
+ f"Interface adapter deployment failed: {e}", exc_info=True
78
+ )
79
+ return {
80
+ "success": False,
81
+ "error": str(e),
82
+ "deployed": [],
83
+ "updated": [],
84
+ "migrated": [],
85
+ "skipped": [],
86
+ "errors": [str(e)],
87
+ "interface_version": "1.0.0",
88
+ "adapter_used": True,
89
+ }
90
+
91
+ def validate_agent(self, agent_path: Path) -> Tuple[bool, List[str]]:
92
+ """Validate agent configuration and structure.
93
+
94
+ Args:
95
+ agent_path: Path to agent configuration file
96
+
97
+ Returns:
98
+ Tuple of (is_valid, list_of_errors)
99
+ """
100
+ try:
101
+ # Delegate to the actual implementation
102
+ return self.deployment_service.validate_agent(agent_path)
103
+ except Exception as e:
104
+ self.logger.error(f"Agent validation failed: {e}", exc_info=True)
105
+ return False, [f"Validation error: {str(e)}"]
106
+
107
+ def clean_deployment(self, preserve_user_agents: bool = True) -> bool:
108
+ """Clean up deployed agents.
109
+
110
+ Args:
111
+ preserve_user_agents: Whether to keep user-created agents
112
+
113
+ Returns:
114
+ True if cleanup successful
115
+ """
116
+ try:
117
+ # Check if the deployment service has a clean_deployment method
118
+ if hasattr(self.deployment_service, "clean_deployment"):
119
+ # Call the existing method (it has a different signature)
120
+ result = self.deployment_service.clean_deployment()
121
+
122
+ # The existing method returns a dict, we need to return a bool
123
+ if isinstance(result, dict):
124
+ return result.get("success", False)
125
+ else:
126
+ return bool(result)
127
+ else:
128
+ # Implement basic cleanup logic if method doesn't exist
129
+ return self._basic_cleanup(preserve_user_agents)
130
+
131
+ except Exception as e:
132
+ self.logger.error(f"Deployment cleanup failed: {e}", exc_info=True)
133
+ return False
134
+
135
+ def _basic_cleanup(self, preserve_user_agents: bool) -> bool:
136
+ """Basic cleanup implementation.
137
+
138
+ Args:
139
+ preserve_user_agents: Whether to keep user-created agents
140
+
141
+ Returns:
142
+ True if cleanup successful
143
+ """
144
+ try:
145
+ # Get the working directory from the deployment service
146
+ working_dir = getattr(
147
+ self.deployment_service, "working_directory", Path.cwd()
148
+ )
149
+ agents_dir = working_dir / ".claude" / "agents"
150
+
151
+ if not agents_dir.exists():
152
+ self.logger.info("No agents directory to clean")
153
+ return True
154
+
155
+ cleaned_count = 0
156
+
157
+ # Clean up agent files
158
+ for agent_file in agents_dir.glob("*.md"):
159
+ try:
160
+ if preserve_user_agents:
161
+ # Check if this is a system agent (authored by claude-mpm)
162
+ content = agent_file.read_text(encoding="utf-8")
163
+ if (
164
+ "author: claude-mpm" not in content
165
+ and "author: 'claude-mpm'" not in content
166
+ ):
167
+ self.logger.debug(
168
+ f"Preserving user agent: {agent_file.name}"
169
+ )
170
+ continue
171
+
172
+ # Remove the agent file
173
+ agent_file.unlink()
174
+ cleaned_count += 1
175
+ self.logger.debug(f"Cleaned agent: {agent_file.name}")
176
+
177
+ except Exception as e:
178
+ self.logger.warning(f"Failed to clean agent {agent_file.name}: {e}")
179
+
180
+ self.logger.info(f"Cleaned {cleaned_count} agent files")
181
+ return True
182
+
183
+ except Exception as e:
184
+ self.logger.error(f"Basic cleanup failed: {e}", exc_info=True)
185
+ return False
186
+
187
+ def get_deployment_status(self) -> Dict[str, Any]:
188
+ """Get current deployment status and metrics.
189
+
190
+ Returns:
191
+ Dictionary with deployment status information
192
+ """
193
+ try:
194
+ # Delegate to the actual implementation
195
+ status = self.deployment_service.get_deployment_status()
196
+
197
+ # Ensure the result is a dictionary
198
+ if not isinstance(status, dict):
199
+ return {
200
+ "status": "unknown",
201
+ "error": "Invalid status format from deployment service",
202
+ "interface_version": "1.0.0",
203
+ "adapter_used": True,
204
+ }
205
+
206
+ # Add interface compliance metadata
207
+ status["interface_version"] = "1.0.0"
208
+ status["adapter_used"] = True
209
+
210
+ return status
211
+
212
+ except Exception as e:
213
+ self.logger.error(f"Failed to get deployment status: {e}", exc_info=True)
214
+ return {
215
+ "status": "error",
216
+ "error": str(e),
217
+ "interface_version": "1.0.0",
218
+ "adapter_used": True,
219
+ }
220
+
221
+ def get_wrapped_service(self):
222
+ """Get the wrapped deployment service.
223
+
224
+ Returns:
225
+ The actual deployment service implementation
226
+ """
227
+ return self.deployment_service
@@ -0,0 +1,85 @@
1
+ """Health checker for agent lifecycle manager.
2
+
3
+ This module provides health checking functionality for the AgentLifecycleManager.
4
+ Extracted to reduce complexity and improve maintainability.
5
+ """
6
+
7
+ from typing import TYPE_CHECKING, Dict
8
+
9
+ if TYPE_CHECKING:
10
+ from .agent_lifecycle_manager import AgentLifecycleManager
11
+
12
+
13
+ class LifecycleHealthChecker:
14
+ """Handles health checking for the lifecycle manager."""
15
+
16
+ def __init__(self, lifecycle_manager: "AgentLifecycleManager"):
17
+ """Initialize the health checker."""
18
+ self.lifecycle_manager = lifecycle_manager
19
+ self.logger = lifecycle_manager.logger
20
+
21
+ async def perform_health_check(self) -> Dict[str, bool]:
22
+ """Perform comprehensive health checks."""
23
+ checks = {}
24
+
25
+ try:
26
+ # Check core service availability
27
+ checks["cache_service"] = self.lifecycle_manager.shared_cache is not None
28
+ checks["registry_service"] = (
29
+ self.lifecycle_manager.agent_registry is not None
30
+ )
31
+ checks["tracker_service"] = (
32
+ self.lifecycle_manager.modification_tracker is not None
33
+ )
34
+ checks["persistence_service"] = (
35
+ self.lifecycle_manager.persistence_service is not None
36
+ )
37
+
38
+ # Check operation capabilities
39
+ checks["can_create_agents"] = await self._test_create_capability()
40
+ checks["can_modify_agents"] = await self._test_modify_capability()
41
+ checks["can_delete_agents"] = await self._test_delete_capability()
42
+
43
+ # Check data integrity
44
+ checks["agent_records_valid"] = (
45
+ len(self.lifecycle_manager.agent_records) >= 0
46
+ )
47
+ checks["operation_history_valid"] = (
48
+ len(self.lifecycle_manager.operation_history) >= 0
49
+ )
50
+
51
+ except Exception as e:
52
+ self.logger.error(f"Lifecycle manager health check failed: {e}")
53
+ checks["health_check_error"] = False
54
+
55
+ return checks
56
+
57
+ async def _test_create_capability(self) -> bool:
58
+ """Test agent creation capability."""
59
+ try:
60
+ # This would test if we can create agents in the configured tiers
61
+ return (
62
+ self.lifecycle_manager.modification_tracker is not None
63
+ and self.lifecycle_manager.persistence_service is not None
64
+ )
65
+ except Exception:
66
+ return False
67
+
68
+ async def _test_modify_capability(self) -> bool:
69
+ """Test agent modification capability."""
70
+ try:
71
+ # This would test if we can modify existing agents
72
+ return (
73
+ self.lifecycle_manager.modification_tracker is not None
74
+ and self.lifecycle_manager.persistence_service is not None
75
+ )
76
+ except Exception:
77
+ return False
78
+
79
+ async def _test_delete_capability(self) -> bool:
80
+ """Test agent deletion capability."""
81
+ try:
82
+ # This would test if we can delete agents
83
+ return self.lifecycle_manager.modification_tracker is not None
84
+ except Exception:
85
+ return False
@@ -0,0 +1,100 @@
1
+ """Performance tracking for agent lifecycle manager.
2
+
3
+ This module provides performance metrics tracking functionality for the AgentLifecycleManager.
4
+ Extracted to reduce complexity and improve maintainability.
5
+ """
6
+
7
+ from typing import TYPE_CHECKING, Any, Dict
8
+
9
+ if TYPE_CHECKING:
10
+ from .agent_lifecycle_manager import LifecycleOperationResult
11
+
12
+
13
+ class LifecyclePerformanceTracker:
14
+ """Handles performance metrics tracking for the lifecycle manager."""
15
+
16
+ def __init__(self, performance_metrics: Dict[str, Any]):
17
+ """Initialize the performance tracker."""
18
+ self.performance_metrics = performance_metrics
19
+
20
+ def update_metrics(self, result: "LifecycleOperationResult") -> None:
21
+ """Update performance metrics with operation result.
22
+
23
+ METRICS COLLECTION:
24
+ This method demonstrates a simple ETL pipeline for operational metrics:
25
+
26
+ 1. EXTRACT: Pull raw data from operation results
27
+ - Success/failure status
28
+ - Operation duration
29
+ - Cache invalidation events
30
+ - Operation type and agent tier
31
+
32
+ 2. TRANSFORM: Calculate derived metrics
33
+ - Success rates and failure percentages
34
+ - Rolling averages for performance
35
+ - Operation distribution by type
36
+ - Performance by agent tier
37
+
38
+ 3. LOAD: Store in metrics structure
39
+ - In-memory storage for real-time access
40
+ - Could be extended to push to:
41
+ * Time-series databases (Prometheus, InfluxDB)
42
+ * AI observability platforms (Datadog, New Relic)
43
+ * Custom analytics pipelines
44
+
45
+ OPTIMIZATION OPPORTUNITIES:
46
+ - Add percentile calculations (p50, p95, p99)
47
+ - Track operation queuing times
48
+ - Monitor resource usage per operation
49
+ - Implement sliding window metrics
50
+ """
51
+ self.performance_metrics["total_operations"] += 1
52
+
53
+ if result.success:
54
+ self.performance_metrics["successful_operations"] += 1
55
+ else:
56
+ self.performance_metrics["failed_operations"] += 1
57
+
58
+ # Update average duration using incremental calculation
59
+ # This avoids storing all durations in memory
60
+ total_ops = self.performance_metrics["total_operations"]
61
+ current_avg = self.performance_metrics["average_duration_ms"]
62
+ new_avg = ((current_avg * (total_ops - 1)) + result.duration_ms) / total_ops
63
+ self.performance_metrics["average_duration_ms"] = new_avg
64
+
65
+ # METRICS: Track operation type distribution
66
+ # This helps identify which operations are most common
67
+ op_type = result.operation.value
68
+ if "operation_distribution" not in self.performance_metrics:
69
+ self.performance_metrics["operation_distribution"] = {}
70
+ self.performance_metrics["operation_distribution"][op_type] = (
71
+ self.performance_metrics["operation_distribution"].get(op_type, 0) + 1
72
+ )
73
+
74
+ # METRICS: Track performance by agent tier
75
+ # Useful for identifying tier-specific performance issues
76
+ if hasattr(result, "tier") and result.tier:
77
+ if "tier_performance" not in self.performance_metrics:
78
+ self.performance_metrics["tier_performance"] = {}
79
+ tier_name = (
80
+ result.tier.value if hasattr(result.tier, "value") else str(result.tier)
81
+ )
82
+ if tier_name not in self.performance_metrics["tier_performance"]:
83
+ self.performance_metrics["tier_performance"][tier_name] = {
84
+ "count": 0,
85
+ "total_duration_ms": 0,
86
+ "average_duration_ms": 0,
87
+ }
88
+ tier_metrics = self.performance_metrics["tier_performance"][tier_name]
89
+ tier_metrics["count"] += 1
90
+ tier_metrics["total_duration_ms"] += result.duration_ms
91
+ tier_metrics["average_duration_ms"] = (
92
+ tier_metrics["total_duration_ms"] / tier_metrics["count"]
93
+ )
94
+
95
+ # Update cache hit rate if cache was involved
96
+ if result.cache_invalidated:
97
+ # Track cache invalidation frequency
98
+ if "cache_invalidations" not in self.performance_metrics:
99
+ self.performance_metrics["cache_invalidations"] = 0
100
+ self.performance_metrics["cache_invalidations"] += 1
@@ -0,0 +1,32 @@
1
+ """Deployment pipeline for agent deployment.
2
+
3
+ This module provides a pipeline-based approach to agent deployment,
4
+ breaking down the complex deployment process into discrete, testable steps.
5
+
6
+ The pipeline pattern allows for:
7
+ - Modular deployment steps that can be tested independently
8
+ - Configurable deployment flows for different scenarios
9
+ - Easy addition of new deployment steps
10
+ - Better error handling and recovery
11
+ - Comprehensive logging and metrics collection
12
+ """
13
+
14
+ from .pipeline_builder import DeploymentPipelineBuilder
15
+ from .pipeline_context import PipelineContext
16
+ from .pipeline_executor import DeploymentPipelineExecutor
17
+ from .steps import (
18
+ BaseDeploymentStep,
19
+ ConfigurationLoadStep,
20
+ StepResult,
21
+ TargetDirectorySetupStep,
22
+ )
23
+
24
+ __all__ = [
25
+ "DeploymentPipelineBuilder",
26
+ "DeploymentPipelineExecutor",
27
+ "PipelineContext",
28
+ "BaseDeploymentStep",
29
+ "StepResult",
30
+ "ConfigurationLoadStep",
31
+ "TargetDirectorySetupStep",
32
+ ]
@@ -0,0 +1,158 @@
1
+ """Pipeline builder for creating deployment pipelines."""
2
+
3
+ from typing import Any, Dict, List, Type
4
+
5
+ from claude_mpm.core.logger import get_logger
6
+
7
+ from .steps.base_step import BaseDeploymentStep
8
+ from .steps.configuration_step import ConfigurationLoadStep
9
+ from .steps.target_directory_step import TargetDirectorySetupStep
10
+
11
+
12
+ class DeploymentPipelineBuilder:
13
+ """Builder for creating deployment pipelines.
14
+
15
+ This builder allows for flexible construction of deployment pipelines
16
+ with different steps based on deployment requirements.
17
+ """
18
+
19
+ def __init__(self):
20
+ """Initialize the pipeline builder."""
21
+ self.logger = get_logger(__name__)
22
+ self._steps: List[BaseDeploymentStep] = []
23
+ self._step_registry: Dict[str, Type[BaseDeploymentStep]] = {}
24
+
25
+ # Register default steps
26
+ self._register_default_steps()
27
+
28
+ def _register_default_steps(self) -> None:
29
+ """Register default deployment steps."""
30
+ self._step_registry.update(
31
+ {
32
+ "configuration": ConfigurationLoadStep,
33
+ "target_directory": TargetDirectorySetupStep,
34
+ # Additional steps will be registered as they're created
35
+ }
36
+ )
37
+
38
+ def add_step(self, step: BaseDeploymentStep) -> "DeploymentPipelineBuilder":
39
+ """Add a step to the pipeline.
40
+
41
+ Args:
42
+ step: The deployment step to add
43
+
44
+ Returns:
45
+ Self for method chaining
46
+ """
47
+ self._steps.append(step)
48
+ self.logger.debug(f"Added step: {step.name}")
49
+ return self
50
+
51
+ def add_step_by_name(self, step_name: str, **kwargs) -> "DeploymentPipelineBuilder":
52
+ """Add a step by its registered name.
53
+
54
+ Args:
55
+ step_name: Name of the registered step
56
+ **kwargs: Arguments to pass to the step constructor
57
+
58
+ Returns:
59
+ Self for method chaining
60
+
61
+ Raises:
62
+ ValueError: If step name is not registered
63
+ """
64
+ if step_name not in self._step_registry:
65
+ raise ValueError(f"Unknown step name: {step_name}")
66
+
67
+ step_class = self._step_registry[step_name]
68
+ step = step_class(**kwargs)
69
+ return self.add_step(step)
70
+
71
+ def create_standard_pipeline(self) -> List[BaseDeploymentStep]:
72
+ """Create a standard deployment pipeline with all common steps.
73
+
74
+ Returns:
75
+ List of deployment steps in execution order
76
+ """
77
+ return [
78
+ ConfigurationLoadStep(),
79
+ TargetDirectorySetupStep(),
80
+ # Additional steps will be added as they're implemented
81
+ ]
82
+
83
+ def create_minimal_pipeline(self) -> List[BaseDeploymentStep]:
84
+ """Create a minimal deployment pipeline with only essential steps.
85
+
86
+ Returns:
87
+ List of essential deployment steps
88
+ """
89
+ return [
90
+ ConfigurationLoadStep(),
91
+ TargetDirectorySetupStep(),
92
+ ]
93
+
94
+ def create_custom_pipeline(self, step_names: List[str]) -> List[BaseDeploymentStep]:
95
+ """Create a custom pipeline from step names.
96
+
97
+ Args:
98
+ step_names: List of step names to include in the pipeline
99
+
100
+ Returns:
101
+ List of deployment steps
102
+
103
+ Raises:
104
+ ValueError: If any step name is not registered
105
+ """
106
+ steps = []
107
+ for step_name in step_names:
108
+ if step_name not in self._step_registry:
109
+ raise ValueError(f"Unknown step name: {step_name}")
110
+
111
+ step_class = self._step_registry[step_name]
112
+ steps.append(step_class())
113
+
114
+ return steps
115
+
116
+ def build(self) -> List[BaseDeploymentStep]:
117
+ """Build the pipeline from added steps.
118
+
119
+ Returns:
120
+ List of deployment steps in the order they were added
121
+ """
122
+ if not self._steps:
123
+ self.logger.warning(
124
+ "No steps added to pipeline, creating standard pipeline"
125
+ )
126
+ return self.create_standard_pipeline()
127
+
128
+ # Sort steps based on dependencies (simplified for now)
129
+ # In a full implementation, this would do topological sorting
130
+ return self._steps.copy()
131
+
132
+ def register_step(self, name: str, step_class: Type[BaseDeploymentStep]) -> None:
133
+ """Register a new step type.
134
+
135
+ Args:
136
+ name: Name to register the step under
137
+ step_class: The step class to register
138
+ """
139
+ self._step_registry[name] = step_class
140
+ self.logger.debug(f"Registered step: {name} -> {step_class.__name__}")
141
+
142
+ def get_registered_steps(self) -> Dict[str, Type[BaseDeploymentStep]]:
143
+ """Get all registered step types.
144
+
145
+ Returns:
146
+ Dictionary of step names to step classes
147
+ """
148
+ return self._step_registry.copy()
149
+
150
+ def clear(self) -> "DeploymentPipelineBuilder":
151
+ """Clear all added steps.
152
+
153
+ Returns:
154
+ Self for method chaining
155
+ """
156
+ self._steps.clear()
157
+ self.logger.debug("Cleared all steps from pipeline builder")
158
+ return self