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,299 @@
1
+ """Template validator for agent templates."""
2
+
3
+ import json
4
+ from pathlib import Path
5
+ from typing import Any, Dict, List
6
+
7
+ from claude_mpm.core.logger import get_logger
8
+
9
+ from .validation_result import ValidationResult, ValidationSeverity
10
+
11
+
12
+ class TemplateValidator:
13
+ """Validator for agent template files.
14
+
15
+ This validator checks agent template JSON files for:
16
+ - Valid JSON syntax
17
+ - Required fields according to agent schema
18
+ - Field value validation
19
+ - Schema compliance
20
+ """
21
+
22
+ def __init__(self):
23
+ """Initialize the template validator."""
24
+ self.logger = get_logger(__name__)
25
+
26
+ # Required fields according to agent schema
27
+ self.required_fields = {
28
+ "schema_version": str,
29
+ "agent_id": str,
30
+ "agent_version": str,
31
+ "agent_type": str,
32
+ "metadata": dict,
33
+ "capabilities": dict,
34
+ "instructions": dict,
35
+ }
36
+
37
+ # Required metadata fields
38
+ self.required_metadata_fields = {
39
+ "name": str,
40
+ "description": str,
41
+ "category": str,
42
+ "tags": list,
43
+ }
44
+
45
+ # Required capabilities fields
46
+ self.required_capabilities_fields = {
47
+ "model": str,
48
+ "tools": list,
49
+ }
50
+
51
+ # Required instructions fields
52
+ self.required_instructions_fields = {
53
+ "system_prompt": str,
54
+ }
55
+
56
+ def validate_template_file(self, template_file: Path) -> ValidationResult:
57
+ """Validate a template file.
58
+
59
+ Args:
60
+ template_file: Path to template file
61
+
62
+ Returns:
63
+ ValidationResult with validation outcome
64
+ """
65
+ result = ValidationResult(is_valid=True)
66
+
67
+ # Check if file exists
68
+ if not template_file.exists():
69
+ result.add_error(f"Template file does not exist: {template_file}")
70
+ return result
71
+
72
+ # Check if it's a file
73
+ if not template_file.is_file():
74
+ result.add_error(f"Template path is not a file: {template_file}")
75
+ return result
76
+
77
+ try:
78
+ # Read and parse JSON
79
+ content = template_file.read_text(encoding="utf-8")
80
+ template_data = json.loads(content)
81
+
82
+ # Validate structure
83
+ self._validate_template_structure(template_data, result)
84
+
85
+ # Validate metadata
86
+ if "metadata" in template_data:
87
+ self._validate_metadata(template_data["metadata"], result)
88
+
89
+ # Validate capabilities
90
+ if "capabilities" in template_data:
91
+ self._validate_capabilities(template_data["capabilities"], result)
92
+
93
+ # Validate instructions
94
+ if "instructions" in template_data:
95
+ self._validate_instructions(template_data["instructions"], result)
96
+
97
+ # Validate agent ID format
98
+ if "agent_id" in template_data:
99
+ self._validate_agent_id(template_data["agent_id"], result)
100
+
101
+ # Add metadata
102
+ result.metadata["template_file"] = str(template_file)
103
+ result.metadata["agent_id"] = template_data.get("agent_id", "unknown")
104
+
105
+ except json.JSONDecodeError as e:
106
+ result.add_error(
107
+ f"Invalid JSON syntax: {e}", line_number=getattr(e, "lineno", None)
108
+ )
109
+ except UnicodeDecodeError as e:
110
+ result.add_error(f"File encoding error: {e}")
111
+ except Exception as e:
112
+ result.add_error(f"Unexpected error reading template: {e}")
113
+
114
+ return result
115
+
116
+ def _validate_template_structure(
117
+ self, template_data: Dict[str, Any], result: ValidationResult
118
+ ) -> None:
119
+ """Validate the basic template structure.
120
+
121
+ Args:
122
+ template_data: Template data dictionary
123
+ result: ValidationResult to update
124
+ """
125
+ # Check required fields
126
+ for field, expected_type in self.required_fields.items():
127
+ if field not in template_data:
128
+ result.add_error(f"Missing required field: {field}")
129
+ else:
130
+ value = template_data[field]
131
+ if not isinstance(value, expected_type):
132
+ result.add_error(
133
+ f"Field '{field}' should be {expected_type.__name__}, got {type(value).__name__}",
134
+ field_name=field,
135
+ )
136
+
137
+ # Check schema version
138
+ if "schema_version" in template_data:
139
+ schema_version = template_data["schema_version"]
140
+ if not schema_version.startswith("1."):
141
+ result.add_warning(
142
+ f"Schema version '{schema_version}' may not be supported",
143
+ field_name="schema_version",
144
+ suggestion="Use schema version 1.x.x",
145
+ )
146
+
147
+ def _validate_metadata(
148
+ self, metadata: Dict[str, Any], result: ValidationResult
149
+ ) -> None:
150
+ """Validate metadata section.
151
+
152
+ Args:
153
+ metadata: Metadata dictionary
154
+ result: ValidationResult to update
155
+ """
156
+ for field, expected_type in self.required_metadata_fields.items():
157
+ if field not in metadata:
158
+ result.add_error(
159
+ f"Missing required metadata field: {field}",
160
+ field_name=f"metadata.{field}",
161
+ )
162
+ else:
163
+ value = metadata[field]
164
+ if not isinstance(value, expected_type):
165
+ result.add_error(
166
+ f"Metadata field '{field}' should be {expected_type.__name__}, got {type(value).__name__}",
167
+ field_name=f"metadata.{field}",
168
+ )
169
+
170
+ # Validate specific fields
171
+ if "name" in metadata:
172
+ name = metadata["name"]
173
+ if not name or not name.strip():
174
+ result.add_error(
175
+ "Agent name cannot be empty", field_name="metadata.name"
176
+ )
177
+
178
+ if "description" in metadata:
179
+ description = metadata["description"]
180
+ if not description or not description.strip():
181
+ result.add_error(
182
+ "Agent description cannot be empty",
183
+ field_name="metadata.description",
184
+ )
185
+ elif len(description) < 10:
186
+ result.add_warning(
187
+ "Agent description is very short",
188
+ field_name="metadata.description",
189
+ suggestion="Provide a more detailed description",
190
+ )
191
+
192
+ if "tags" in metadata:
193
+ tags = metadata["tags"]
194
+ if not isinstance(tags, list):
195
+ result.add_error("Tags should be a list", field_name="metadata.tags")
196
+ elif len(tags) == 0:
197
+ result.add_warning("No tags specified", field_name="metadata.tags")
198
+
199
+ def _validate_capabilities(
200
+ self, capabilities: Dict[str, Any], result: ValidationResult
201
+ ) -> None:
202
+ """Validate capabilities section.
203
+
204
+ Args:
205
+ capabilities: Capabilities dictionary
206
+ result: ValidationResult to update
207
+ """
208
+ for field, expected_type in self.required_capabilities_fields.items():
209
+ if field not in capabilities:
210
+ result.add_error(
211
+ f"Missing required capabilities field: {field}",
212
+ field_name=f"capabilities.{field}",
213
+ )
214
+ else:
215
+ value = capabilities[field]
216
+ if not isinstance(value, expected_type):
217
+ result.add_error(
218
+ f"Capabilities field '{field}' should be {expected_type.__name__}, got {type(value).__name__}",
219
+ field_name=f"capabilities.{field}",
220
+ )
221
+
222
+ # Validate model
223
+ if "model" in capabilities:
224
+ model = capabilities["model"]
225
+ valid_models = ["sonnet", "haiku", "opus"]
226
+ if model not in valid_models:
227
+ result.add_warning(
228
+ f"Unknown model '{model}'",
229
+ field_name="capabilities.model",
230
+ suggestion=f"Use one of: {', '.join(valid_models)}",
231
+ )
232
+
233
+ # Validate tools
234
+ if "tools" in capabilities:
235
+ tools = capabilities["tools"]
236
+ if not isinstance(tools, list):
237
+ result.add_error(
238
+ "Tools should be a list", field_name="capabilities.tools"
239
+ )
240
+ elif len(tools) == 0:
241
+ result.add_warning(
242
+ "No tools specified", field_name="capabilities.tools"
243
+ )
244
+
245
+ def _validate_instructions(
246
+ self, instructions: Dict[str, Any], result: ValidationResult
247
+ ) -> None:
248
+ """Validate instructions section.
249
+
250
+ Args:
251
+ instructions: Instructions dictionary
252
+ result: ValidationResult to update
253
+ """
254
+ for field, expected_type in self.required_instructions_fields.items():
255
+ if field not in instructions:
256
+ result.add_error(
257
+ f"Missing required instructions field: {field}",
258
+ field_name=f"instructions.{field}",
259
+ )
260
+ else:
261
+ value = instructions[field]
262
+ if not isinstance(value, expected_type):
263
+ result.add_error(
264
+ f"Instructions field '{field}' should be {expected_type.__name__}, got {type(value).__name__}",
265
+ field_name=f"instructions.{field}",
266
+ )
267
+
268
+ # Validate system prompt
269
+ if "system_prompt" in instructions:
270
+ system_prompt = instructions["system_prompt"]
271
+ if not system_prompt or not system_prompt.strip():
272
+ result.add_error(
273
+ "System prompt cannot be empty",
274
+ field_name="instructions.system_prompt",
275
+ )
276
+ elif len(system_prompt) < 20:
277
+ result.add_warning(
278
+ "System prompt is very short",
279
+ field_name="instructions.system_prompt",
280
+ suggestion="Provide more detailed instructions",
281
+ )
282
+
283
+ def _validate_agent_id(self, agent_id: str, result: ValidationResult) -> None:
284
+ """Validate agent ID format.
285
+
286
+ Args:
287
+ agent_id: Agent ID to validate
288
+ result: ValidationResult to update
289
+ """
290
+ import re
291
+
292
+ # Agent ID should be lowercase with hyphens
293
+ pattern = r"^[a-z][a-z0-9]*(-[a-z0-9]+)*$"
294
+ if not re.match(pattern, agent_id):
295
+ result.add_error(
296
+ f"Invalid agent ID format: '{agent_id}'",
297
+ field_name="agent_id",
298
+ suggestion="Use lowercase letters, numbers, and hyphens only (e.g., 'my-agent')",
299
+ )
@@ -0,0 +1,226 @@
1
+ """Validation result classes for deployment validation."""
2
+
3
+ from dataclasses import dataclass, field
4
+ from enum import Enum
5
+ from typing import Any, Dict, List, Optional
6
+
7
+
8
+ class ValidationSeverity(Enum):
9
+ """Severity levels for validation issues."""
10
+
11
+ INFO = "info"
12
+ WARNING = "warning"
13
+ ERROR = "error"
14
+ CRITICAL = "critical"
15
+
16
+
17
+ @dataclass
18
+ class ValidationIssue:
19
+ """A single validation issue."""
20
+
21
+ severity: ValidationSeverity
22
+ message: str
23
+ field_name: Optional[str] = None
24
+ line_number: Optional[int] = None
25
+ suggestion: Optional[str] = None
26
+ metadata: Dict[str, Any] = field(default_factory=dict)
27
+
28
+ def __str__(self) -> str:
29
+ """String representation of the issue."""
30
+ parts = [f"[{self.severity.value.upper()}]"]
31
+
32
+ if self.field_name:
33
+ parts.append(f"Field '{self.field_name}':")
34
+
35
+ parts.append(self.message)
36
+
37
+ if self.line_number:
38
+ parts.append(f"(line {self.line_number})")
39
+
40
+ return " ".join(parts)
41
+
42
+
43
+ @dataclass
44
+ class ValidationResult:
45
+ """Result of a validation operation."""
46
+
47
+ is_valid: bool
48
+ issues: List[ValidationIssue] = field(default_factory=list)
49
+ metadata: Dict[str, Any] = field(default_factory=dict)
50
+
51
+ @property
52
+ def errors(self) -> List[ValidationIssue]:
53
+ """Get all error-level issues."""
54
+ return [
55
+ issue
56
+ for issue in self.issues
57
+ if issue.severity in [ValidationSeverity.ERROR, ValidationSeverity.CRITICAL]
58
+ ]
59
+
60
+ @property
61
+ def warnings(self) -> List[ValidationIssue]:
62
+ """Get all warning-level issues."""
63
+ return [
64
+ issue
65
+ for issue in self.issues
66
+ if issue.severity == ValidationSeverity.WARNING
67
+ ]
68
+
69
+ @property
70
+ def infos(self) -> List[ValidationIssue]:
71
+ """Get all info-level issues."""
72
+ return [
73
+ issue for issue in self.issues if issue.severity == ValidationSeverity.INFO
74
+ ]
75
+
76
+ @property
77
+ def has_errors(self) -> bool:
78
+ """Check if there are any errors."""
79
+ return len(self.errors) > 0
80
+
81
+ @property
82
+ def has_warnings(self) -> bool:
83
+ """Check if there are any warnings."""
84
+ return len(self.warnings) > 0
85
+
86
+ @property
87
+ def error_count(self) -> int:
88
+ """Get the number of errors."""
89
+ return len(self.errors)
90
+
91
+ @property
92
+ def warning_count(self) -> int:
93
+ """Get the number of warnings."""
94
+ return len(self.warnings)
95
+
96
+ def add_error(
97
+ self,
98
+ message: str,
99
+ field_name: Optional[str] = None,
100
+ line_number: Optional[int] = None,
101
+ suggestion: Optional[str] = None,
102
+ ) -> None:
103
+ """Add an error to the validation result.
104
+
105
+ Args:
106
+ message: Error message
107
+ field_name: Optional field name
108
+ line_number: Optional line number
109
+ suggestion: Optional suggestion for fixing
110
+ """
111
+ self.issues.append(
112
+ ValidationIssue(
113
+ severity=ValidationSeverity.ERROR,
114
+ message=message,
115
+ field_name=field_name,
116
+ line_number=line_number,
117
+ suggestion=suggestion,
118
+ )
119
+ )
120
+ self.is_valid = False
121
+
122
+ def add_warning(
123
+ self,
124
+ message: str,
125
+ field_name: Optional[str] = None,
126
+ line_number: Optional[int] = None,
127
+ suggestion: Optional[str] = None,
128
+ ) -> None:
129
+ """Add a warning to the validation result.
130
+
131
+ Args:
132
+ message: Warning message
133
+ field_name: Optional field name
134
+ line_number: Optional line number
135
+ suggestion: Optional suggestion for improvement
136
+ """
137
+ self.issues.append(
138
+ ValidationIssue(
139
+ severity=ValidationSeverity.WARNING,
140
+ message=message,
141
+ field_name=field_name,
142
+ line_number=line_number,
143
+ suggestion=suggestion,
144
+ )
145
+ )
146
+
147
+ def add_info(
148
+ self,
149
+ message: str,
150
+ field_name: Optional[str] = None,
151
+ line_number: Optional[int] = None,
152
+ ) -> None:
153
+ """Add an info message to the validation result.
154
+
155
+ Args:
156
+ message: Info message
157
+ field_name: Optional field name
158
+ line_number: Optional line number
159
+ """
160
+ self.issues.append(
161
+ ValidationIssue(
162
+ severity=ValidationSeverity.INFO,
163
+ message=message,
164
+ field_name=field_name,
165
+ line_number=line_number,
166
+ )
167
+ )
168
+
169
+ def merge(self, other: "ValidationResult") -> "ValidationResult":
170
+ """Merge another validation result into this one.
171
+
172
+ Args:
173
+ other: Another validation result to merge
174
+
175
+ Returns:
176
+ New ValidationResult with merged issues
177
+ """
178
+ merged = ValidationResult(
179
+ is_valid=self.is_valid and other.is_valid,
180
+ issues=self.issues + other.issues,
181
+ metadata={**self.metadata, **other.metadata},
182
+ )
183
+ return merged
184
+
185
+ def to_dict(self) -> Dict[str, Any]:
186
+ """Convert validation result to dictionary.
187
+
188
+ Returns:
189
+ Dictionary representation of the result
190
+ """
191
+ return {
192
+ "is_valid": self.is_valid,
193
+ "error_count": self.error_count,
194
+ "warning_count": self.warning_count,
195
+ "issues": [
196
+ {
197
+ "severity": issue.severity.value,
198
+ "message": issue.message,
199
+ "field": issue.field_name,
200
+ "line_number": issue.line_number,
201
+ "suggestion": issue.suggestion,
202
+ "metadata": issue.metadata,
203
+ }
204
+ for issue in self.issues
205
+ ],
206
+ "metadata": self.metadata,
207
+ }
208
+
209
+ def __str__(self) -> str:
210
+ """String representation of the validation result."""
211
+ if self.is_valid:
212
+ status = "VALID"
213
+ else:
214
+ status = "INVALID"
215
+
216
+ summary = f"Validation {status}"
217
+
218
+ if self.error_count > 0:
219
+ summary += f" ({self.error_count} errors"
220
+ if self.warning_count > 0:
221
+ summary += f", {self.warning_count} warnings"
222
+ summary += ")"
223
+ elif self.warning_count > 0:
224
+ summary += f" ({self.warning_count} warnings)"
225
+
226
+ return summary
@@ -1,11 +1,11 @@
1
1
  """Agent loading and profile management services."""
2
2
 
3
- from .framework_agent_loader import FrameworkAgentLoader
4
3
  from .agent_profile_loader import AgentProfileLoader
5
4
  from .base_agent_manager import BaseAgentManager
5
+ from .framework_agent_loader import FrameworkAgentLoader
6
6
 
7
7
  __all__ = [
8
8
  "FrameworkAgentLoader",
9
9
  "AgentProfileLoader",
10
10
  "BaseAgentManager",
11
- ]
11
+ ]