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,406 @@
1
+ """Agent Template Builder Service
2
+
3
+ This service handles the building and generation of agent templates,
4
+ including YAML and Markdown generation, template merging, and metadata extraction.
5
+
6
+ Extracted from AgentDeploymentService as part of the refactoring to improve
7
+ maintainability and testability.
8
+ """
9
+
10
+ import json
11
+ import logging
12
+ from pathlib import Path
13
+ from typing import Any, Dict, List
14
+
15
+ from claude_mpm.core.logging_config import get_logger
16
+
17
+
18
+ class AgentTemplateBuilder:
19
+ """Service for building agent templates from JSON and base agent data.
20
+
21
+ This service handles:
22
+ - Building agent markdown files with YAML frontmatter
23
+ - Building agent YAML files
24
+ - Merging narrative and configuration fields
25
+ - Extracting agent metadata
26
+ - Formatting YAML lists
27
+ """
28
+
29
+ def __init__(self):
30
+ """Initialize the template builder."""
31
+ self.logger = get_logger(__name__)
32
+
33
+ def build_agent_markdown(
34
+ self, agent_name: str, template_path: Path, base_agent_data: dict
35
+ ) -> str:
36
+ """
37
+ Build a complete agent markdown file with YAML frontmatter.
38
+
39
+ Args:
40
+ agent_name: Name of the agent
41
+ template_path: Path to the agent template JSON file
42
+ base_agent_data: Base agent configuration data
43
+
44
+ Returns:
45
+ Complete markdown content with YAML frontmatter
46
+
47
+ Raises:
48
+ FileNotFoundError: If template file doesn't exist
49
+ json.JSONDecodeError: If template JSON is invalid
50
+ """
51
+ if not template_path.exists():
52
+ raise FileNotFoundError(f"Template file not found: {template_path}")
53
+
54
+ try:
55
+ template_content = template_path.read_text()
56
+ template_data = json.loads(template_content)
57
+ except json.JSONDecodeError as e:
58
+ self.logger.error(f"Invalid JSON in template {template_path}: {e}")
59
+ raise
60
+
61
+ # Extract tools from template with fallback
62
+ tools = (
63
+ template_data.get("tools")
64
+ or template_data.get("capabilities", {}).get("tools")
65
+ or template_data.get("configuration_fields", {}).get("tools")
66
+ or ["Read", "Write", "Edit", "Grep", "Glob", "LS"] # Default fallback
67
+ )
68
+
69
+ # Extract model from template with fallback
70
+ model = (
71
+ template_data.get("model")
72
+ or template_data.get("capabilities", {}).get("model")
73
+ or template_data.get("configuration_fields", {}).get("model")
74
+ or "sonnet" # Default fallback
75
+ )
76
+
77
+ # Convert tools list to comma-separated string (no spaces!)
78
+ if isinstance(tools, list):
79
+ tools_str = ",".join(tools)
80
+ else:
81
+ tools_str = str(tools)
82
+
83
+ # Validate tools format - CRITICAL: No spaces allowed!
84
+ if ", " in tools_str:
85
+ self.logger.error(f"Tools contain spaces: '{tools_str}'")
86
+ raise ValueError(
87
+ f"Tools must be comma-separated WITHOUT spaces: {tools_str}"
88
+ )
89
+
90
+ # Map model names to Claude Code format
91
+ model_map = {
92
+ "claude-3-5-sonnet-20241022": "sonnet",
93
+ "claude-3-5-sonnet": "sonnet",
94
+ "claude-3-sonnet": "sonnet",
95
+ "claude-3-haiku": "haiku",
96
+ "claude-3-opus": "opus",
97
+ "sonnet": "sonnet",
98
+ "haiku": "haiku",
99
+ "opus": "opus",
100
+ }
101
+
102
+ if model in model_map:
103
+ model = model_map[model]
104
+
105
+ # Get response format from template or use base agent default
106
+ response_format = template_data.get("response", {}).get("format", "structured")
107
+
108
+ # Create Claude Code compatible name (lowercase, hyphens only)
109
+ claude_code_name = agent_name.lower().replace("_", "-")
110
+
111
+ # CRITICAL: NO underscores allowed - they cause silent failures!
112
+
113
+ # Validate the name before proceeding
114
+ import re
115
+
116
+ if not re.match(r"^[a-z0-9]+(-[a-z0-9]+)*$", claude_code_name):
117
+ self.logger.error(
118
+ f"Invalid agent name '{claude_code_name}' - must match ^[a-z0-9]+(-[a-z0-9]+)*$"
119
+ )
120
+ raise ValueError(
121
+ f"Agent name '{claude_code_name}' does not meet Claude Code requirements"
122
+ )
123
+
124
+ # Extract description from template with fallback
125
+ description = (
126
+ template_data.get("description")
127
+ or template_data.get("metadata", {}).get("description")
128
+ or f"{agent_name.title()} agent for specialized tasks"
129
+ )
130
+
131
+ # Extract custom metadata fields
132
+ agent_version = template_data.get("agent_version", "1.0.0")
133
+ agent_type = template_data.get("agent_type", "general")
134
+ model_type = template_data.get("capabilities", {}).get("model", "sonnet")
135
+
136
+ # Map our model types to Claude Code format
137
+ if model_type in ["opus", "sonnet", "haiku"]:
138
+ # Use inherit for now - Claude Code seems to prefer this
139
+ claude_model = "inherit"
140
+ else:
141
+ claude_model = "inherit"
142
+
143
+ # Determine color based on agent type
144
+ color_map = {
145
+ "engineer": "blue",
146
+ "qa": "green",
147
+ "security": "red",
148
+ "research": "purple",
149
+ "documentation": "orange",
150
+ "ops": "gray",
151
+ }
152
+ color = color_map.get(agent_type, "blue")
153
+
154
+ # Check if we should include tools field (only if significantly restricting)
155
+ # Claude Code approach: omit tools field unless specifically restricting
156
+ all_available_tools = {
157
+ "Read",
158
+ "Write",
159
+ "Edit",
160
+ "MultiEdit",
161
+ "Bash",
162
+ "Grep",
163
+ "Glob",
164
+ "LS",
165
+ "WebSearch",
166
+ "WebFetch",
167
+ "TodoWrite",
168
+ "Task",
169
+ "Memory",
170
+ }
171
+
172
+ # Convert tools to set for comparison
173
+ agent_tools = set(tools) if isinstance(tools, list) else set(tools.split(","))
174
+
175
+ # Only include tools field if agent is missing several important tools
176
+ # This matches Claude Code's approach of omitting tools for general-purpose agents
177
+ core_tools = {"Read", "Write", "Edit", "Bash", "Grep", "Glob"}
178
+ has_core_tools = len(agent_tools.intersection(core_tools)) >= 5
179
+
180
+ # Include tools field only if agent is clearly restricted (missing core tools or very few tools)
181
+ include_tools_field = not has_core_tools or len(agent_tools) < 6
182
+
183
+ # Build YAML frontmatter using Claude Code's working format + our custom fields
184
+ frontmatter_lines = [
185
+ "---",
186
+ f"name: {claude_code_name}",
187
+ f"description: {description}",
188
+ ]
189
+
190
+ # Only include tools if restricting to subset
191
+ if include_tools_field:
192
+ frontmatter_lines.append(f"tools: {tools_str}")
193
+
194
+ frontmatter_lines.extend(
195
+ [
196
+ f"model: {model_type}", # Use explicit model type instead of inherit
197
+ f"color: {color}",
198
+ f"version: {agent_version}",
199
+ f"type: {agent_type}",
200
+ "---",
201
+ "",
202
+ ]
203
+ )
204
+
205
+ frontmatter = "\n".join(frontmatter_lines)
206
+
207
+ # Get agent instructions from template data (primary) or base agent data (fallback)
208
+ content = (
209
+ template_data.get("instructions")
210
+ or base_agent_data.get("content")
211
+ or base_agent_data.get("instructions")
212
+ or "# Agent Instructions\n\nThis agent provides specialized assistance."
213
+ )
214
+
215
+ return frontmatter + content
216
+
217
+ def build_agent_yaml(
218
+ self, agent_name: str, template_path: Path, base_agent_data: dict
219
+ ) -> str:
220
+ """
221
+ Build a complete agent YAML file by combining base agent and template.
222
+ Only includes essential fields for Claude Code best practices.
223
+
224
+ Args:
225
+ agent_name: Name of the agent
226
+ template_path: Path to the agent template JSON file
227
+ base_agent_data: Base agent configuration data
228
+
229
+ Returns:
230
+ Complete YAML content
231
+
232
+ Raises:
233
+ FileNotFoundError: If template file doesn't exist
234
+ json.JSONDecodeError: If template JSON is invalid
235
+ """
236
+ if not template_path.exists():
237
+ raise FileNotFoundError(f"Template file not found: {template_path}")
238
+
239
+ try:
240
+ template_content = template_path.read_text()
241
+ template_data = json.loads(template_content)
242
+ except json.JSONDecodeError as e:
243
+ self.logger.error(f"Invalid JSON in template {template_path}: {e}")
244
+ raise
245
+
246
+ # Merge narrative and configuration fields
247
+ merged_narrative = self.merge_narrative_fields(base_agent_data, template_data)
248
+ merged_config = self.merge_configuration_fields(base_agent_data, template_data)
249
+
250
+ # Extract essential fields for Claude Code
251
+ name = template_data.get("name", agent_name)
252
+ description = template_data.get(
253
+ "description", f"{name} agent for specialized tasks"
254
+ )
255
+
256
+ # Get tools and model with fallbacks
257
+ tools = merged_config.get("tools", ["Read", "Write", "Edit"])
258
+ model = merged_config.get("model", "sonnet")
259
+
260
+ # Format tools as YAML list
261
+ tools_yaml = self.format_yaml_list(tools, 2)
262
+
263
+ # Build YAML content with only essential fields
264
+ yaml_content = f"""name: {name}
265
+ description: {description}
266
+ model: {model}
267
+ tools:
268
+ {tools_yaml}
269
+ """
270
+
271
+ return yaml_content
272
+
273
+ def merge_narrative_fields(self, base_data: dict, template_data: dict) -> dict:
274
+ """
275
+ Merge narrative fields from base and template, combining arrays.
276
+
277
+ Args:
278
+ base_data: Base agent data
279
+ template_data: Template agent data
280
+
281
+ Returns:
282
+ Merged narrative fields
283
+ """
284
+ merged = {}
285
+
286
+ # Fields that should be combined (arrays)
287
+ combinable_fields = [
288
+ "when_to_use",
289
+ "specialized_knowledge",
290
+ "unique_capabilities",
291
+ ]
292
+
293
+ for field in combinable_fields:
294
+ base_value = base_data.get(field, [])
295
+ template_value = template_data.get(field, [])
296
+
297
+ # Ensure both are lists
298
+ if not isinstance(base_value, list):
299
+ base_value = [base_value] if base_value else []
300
+ if not isinstance(template_value, list):
301
+ template_value = [template_value] if template_value else []
302
+
303
+ # Combine and deduplicate
304
+ combined = list(set(base_value + template_value))
305
+ merged[field] = combined
306
+
307
+ return merged
308
+
309
+ def merge_configuration_fields(self, base_data: dict, template_data: dict) -> dict:
310
+ """
311
+ Merge configuration fields, with template overriding base.
312
+
313
+ Args:
314
+ base_data: Base agent data
315
+ template_data: Template agent data
316
+
317
+ Returns:
318
+ Merged configuration fields
319
+ """
320
+ merged = {}
321
+
322
+ # Start with base configuration
323
+ if "configuration_fields" in base_data:
324
+ merged.update(base_data["configuration_fields"])
325
+
326
+ # Override with template configuration
327
+ if "configuration_fields" in template_data:
328
+ merged.update(template_data["configuration_fields"])
329
+
330
+ # Also check for direct fields in template
331
+ direct_fields = ["tools", "model", "timeout", "max_tokens"]
332
+ for field in direct_fields:
333
+ if field in template_data:
334
+ merged[field] = template_data[field]
335
+
336
+ return merged
337
+
338
+ def extract_agent_metadata(self, template_content: str) -> Dict[str, Any]:
339
+ """
340
+ Extract metadata from simplified agent template content.
341
+
342
+ Args:
343
+ template_content: Agent template markdown content
344
+
345
+ Returns:
346
+ Dictionary containing extracted metadata
347
+ """
348
+ metadata = {}
349
+ current_section = None
350
+ section_content = []
351
+
352
+ lines = template_content.split("\n")
353
+
354
+ for line in lines:
355
+ line = line.strip()
356
+
357
+ # Check for section headers
358
+ if line.startswith("## "):
359
+ # Save previous section
360
+ if current_section and section_content:
361
+ metadata[current_section] = section_content.copy()
362
+
363
+ # Start new section
364
+ current_section = line[3:].lower().replace(" ", "_")
365
+ section_content = []
366
+
367
+ elif line.startswith("- ") and current_section:
368
+ # Add list item to current section
369
+ section_content.append(line[2:])
370
+
371
+ elif line and current_section and not line.startswith("#"):
372
+ # Add non-empty, non-header line to current section
373
+ section_content.append(line)
374
+
375
+ # Save final section
376
+ if current_section and section_content:
377
+ metadata[current_section] = section_content.copy()
378
+
379
+ # Ensure all required fields have defaults
380
+ metadata.setdefault("when_to_use", [])
381
+ metadata.setdefault("specialized_knowledge", [])
382
+ metadata.setdefault("unique_capabilities", [])
383
+
384
+ return metadata
385
+
386
+ def format_yaml_list(self, items: List[str], indent: int) -> str:
387
+ """
388
+ Format a list for YAML with proper indentation.
389
+
390
+ Args:
391
+ items: List of items to format
392
+ indent: Number of spaces for indentation
393
+
394
+ Returns:
395
+ Formatted YAML list string
396
+ """
397
+ if not items:
398
+ return ""
399
+
400
+ indent_str = " " * indent
401
+ formatted_items = []
402
+
403
+ for item in items:
404
+ formatted_items.append(f"{indent_str}- {item}")
405
+
406
+ return "\n".join(formatted_items)