claude-mpm 3.9.11__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 (419) hide show
  1. claude_mpm/VERSION +1 -1
  2. claude_mpm/__init__.py +2 -2
  3. claude_mpm/__main__.py +3 -2
  4. claude_mpm/agents/__init__.py +85 -79
  5. claude_mpm/agents/agent_loader.py +464 -1003
  6. claude_mpm/agents/agent_loader_integration.py +45 -45
  7. claude_mpm/agents/agents_metadata.py +29 -30
  8. claude_mpm/agents/async_agent_loader.py +156 -138
  9. claude_mpm/agents/base_agent.json +1 -1
  10. claude_mpm/agents/base_agent_loader.py +179 -151
  11. claude_mpm/agents/frontmatter_validator.py +229 -130
  12. claude_mpm/agents/schema/agent_schema.json +1 -1
  13. claude_mpm/agents/system_agent_config.py +213 -147
  14. claude_mpm/agents/templates/__init__.py +13 -13
  15. claude_mpm/agents/templates/code_analyzer.json +2 -2
  16. claude_mpm/agents/templates/data_engineer.json +1 -1
  17. claude_mpm/agents/templates/documentation.json +23 -11
  18. claude_mpm/agents/templates/engineer.json +22 -6
  19. claude_mpm/agents/templates/memory_manager.json +1 -1
  20. claude_mpm/agents/templates/ops.json +2 -2
  21. claude_mpm/agents/templates/project_organizer.json +1 -1
  22. claude_mpm/agents/templates/qa.json +1 -1
  23. claude_mpm/agents/templates/refactoring_engineer.json +222 -0
  24. claude_mpm/agents/templates/research.json +20 -14
  25. claude_mpm/agents/templates/security.json +1 -1
  26. claude_mpm/agents/templates/ticketing.json +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 +79 -51
  31. claude_mpm/cli/__main__.py +3 -2
  32. claude_mpm/cli/commands/__init__.py +20 -20
  33. claude_mpm/cli/commands/agents.py +279 -247
  34. claude_mpm/cli/commands/aggregate.py +138 -157
  35. claude_mpm/cli/commands/cleanup.py +147 -147
  36. claude_mpm/cli/commands/config.py +93 -76
  37. claude_mpm/cli/commands/info.py +17 -16
  38. claude_mpm/cli/commands/mcp.py +140 -905
  39. claude_mpm/cli/commands/mcp_command_router.py +139 -0
  40. claude_mpm/cli/commands/mcp_config_commands.py +20 -0
  41. claude_mpm/cli/commands/mcp_install_commands.py +20 -0
  42. claude_mpm/cli/commands/mcp_server_commands.py +175 -0
  43. claude_mpm/cli/commands/mcp_tool_commands.py +34 -0
  44. claude_mpm/cli/commands/memory.py +239 -203
  45. claude_mpm/cli/commands/monitor.py +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 -1156
  51. claude_mpm/cli/parsers/__init__.py +29 -0
  52. claude_mpm/cli/parsers/agents_parser.py +136 -0
  53. claude_mpm/cli/parsers/base_parser.py +331 -0
  54. claude_mpm/cli/parsers/config_parser.py +85 -0
  55. claude_mpm/cli/parsers/mcp_parser.py +152 -0
  56. claude_mpm/cli/parsers/memory_parser.py +138 -0
  57. claude_mpm/cli/parsers/monitor_parser.py +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 +71 -73
  69. claude_mpm/config/paths.py +94 -208
  70. claude_mpm/config/socketio_config.py +84 -73
  71. claude_mpm/constants.py +35 -18
  72. claude_mpm/core/__init__.py +9 -6
  73. claude_mpm/core/agent_name_normalizer.py +68 -71
  74. claude_mpm/core/agent_registry.py +372 -521
  75. claude_mpm/core/agent_session_manager.py +74 -63
  76. claude_mpm/core/base_service.py +116 -87
  77. claude_mpm/core/cache.py +119 -153
  78. claude_mpm/core/claude_runner.py +425 -1120
  79. claude_mpm/core/config.py +263 -168
  80. claude_mpm/core/config_aliases.py +69 -61
  81. claude_mpm/core/config_constants.py +292 -0
  82. claude_mpm/core/constants.py +57 -99
  83. claude_mpm/core/container.py +211 -178
  84. claude_mpm/core/exceptions.py +233 -89
  85. claude_mpm/core/factories.py +92 -54
  86. claude_mpm/core/framework_loader.py +378 -220
  87. claude_mpm/core/hook_manager.py +198 -83
  88. claude_mpm/core/hook_performance_config.py +136 -0
  89. claude_mpm/core/injectable_service.py +61 -55
  90. claude_mpm/core/interactive_session.py +165 -155
  91. claude_mpm/core/interfaces.py +221 -195
  92. claude_mpm/core/lazy.py +96 -96
  93. claude_mpm/core/logger.py +133 -107
  94. claude_mpm/core/logging_config.py +185 -157
  95. claude_mpm/core/minimal_framework_loader.py +20 -15
  96. claude_mpm/core/mixins.py +30 -29
  97. claude_mpm/core/oneshot_session.py +215 -181
  98. claude_mpm/core/optimized_agent_loader.py +134 -138
  99. claude_mpm/core/optimized_startup.py +159 -157
  100. claude_mpm/core/pm_hook_interceptor.py +85 -72
  101. claude_mpm/core/service_registry.py +103 -101
  102. claude_mpm/core/session_manager.py +97 -87
  103. claude_mpm/core/socketio_pool.py +212 -158
  104. claude_mpm/core/tool_access_control.py +58 -51
  105. claude_mpm/core/types.py +46 -24
  106. claude_mpm/core/typing_utils.py +166 -82
  107. claude_mpm/core/unified_agent_registry.py +721 -0
  108. claude_mpm/core/unified_config.py +550 -0
  109. claude_mpm/core/unified_paths.py +549 -0
  110. claude_mpm/dashboard/index.html +1 -1
  111. claude_mpm/dashboard/open_dashboard.py +51 -17
  112. claude_mpm/dashboard/static/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 +233 -199
  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 +30 -13
  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 +13 -20
  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 +87 -84
  298. claude_mpm/services/mcp_gateway/main.py +287 -137
  299. claude_mpm/services/mcp_gateway/registry/__init__.py +1 -1
  300. claude_mpm/services/mcp_gateway/registry/service_registry.py +97 -94
  301. claude_mpm/services/mcp_gateway/registry/tool_registry.py +135 -126
  302. claude_mpm/services/mcp_gateway/server/__init__.py +2 -2
  303. claude_mpm/services/mcp_gateway/server/mcp_gateway.py +105 -110
  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 +109 -119
  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 +19 -533
  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 +2 -2
  358. claude_mpm/storage/state_storage.py +177 -181
  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.11.dist-info → claude_mpm-4.0.3.dist-info}/METADATA +27 -1
  381. claude_mpm-4.0.3.dist-info/RECORD +402 -0
  382. {claude_mpm-3.9.11.dist-info → claude_mpm-4.0.3.dist-info}/entry_points.txt +1 -0
  383. {claude_mpm-3.9.11.dist-info → claude_mpm-4.0.3.dist-info}/licenses/LICENSE +1 -1
  384. claude_mpm/cli/commands/run_guarded.py +0 -511
  385. claude_mpm/config/memory_guardian_config.py +0 -325
  386. claude_mpm/config/memory_guardian_yaml.py +0 -335
  387. claude_mpm/core/config_paths.py +0 -150
  388. claude_mpm/core/memory_aware_runner.py +0 -353
  389. claude_mpm/dashboard/static/js/dashboard-original.js +0 -4134
  390. claude_mpm/deployment_paths.py +0 -261
  391. claude_mpm/hooks/claude_hooks/hook_handler_fixed.py +0 -454
  392. claude_mpm/models/state_models.py +0 -433
  393. claude_mpm/services/agent/__init__.py +0 -24
  394. claude_mpm/services/agent/deployment.py +0 -2548
  395. claude_mpm/services/agent/management.py +0 -598
  396. claude_mpm/services/agent/registry.py +0 -813
  397. claude_mpm/services/agents/registry/agent_registry.py +0 -813
  398. claude_mpm/services/communication/socketio.py +0 -1935
  399. claude_mpm/services/communication/websocket.py +0 -479
  400. claude_mpm/services/framework_claude_md_generator.py +0 -624
  401. claude_mpm/services/health_monitor.py +0 -893
  402. claude_mpm/services/infrastructure/graceful_degradation.py +0 -616
  403. claude_mpm/services/infrastructure/health_monitor.py +0 -775
  404. claude_mpm/services/infrastructure/memory_dashboard.py +0 -479
  405. claude_mpm/services/infrastructure/memory_guardian.py +0 -944
  406. claude_mpm/services/infrastructure/restart_protection.py +0 -642
  407. claude_mpm/services/infrastructure/state_manager.py +0 -774
  408. claude_mpm/services/mcp_gateway/manager.py +0 -334
  409. claude_mpm/services/optimized_hook_service.py +0 -542
  410. claude_mpm/services/project_analyzer.py +0 -864
  411. claude_mpm/services/project_registry.py +0 -608
  412. claude_mpm/services/standalone_socketio_server.py +0 -1300
  413. claude_mpm/services/ticket_manager_di.py +0 -318
  414. claude_mpm/services/ticketing_service_original.py +0 -510
  415. claude_mpm/utils/paths.py +0 -395
  416. claude_mpm/utils/platform_memory.py +0 -524
  417. claude_mpm-3.9.11.dist-info/RECORD +0 -306
  418. {claude_mpm-3.9.11.dist-info → claude_mpm-4.0.3.dist-info}/WHEEL +0 -0
  419. {claude_mpm-3.9.11.dist-info → claude_mpm-4.0.3.dist-info}/top_level.txt +0 -0
@@ -1,3 +1,5 @@
1
+ from pathlib import Path
2
+
1
3
  #!/usr/bin/env python3
2
4
  """Optimized agent loader with caching and parallel loading.
3
5
 
@@ -17,29 +19,29 @@ WHY optimized agent loading:
17
19
  import asyncio
18
20
  import hashlib
19
21
  import json
20
- import os
21
22
  import threading
22
23
  import time
23
24
  from concurrent.futures import ThreadPoolExecutor, as_completed
24
25
  from dataclasses import dataclass, field
25
26
  from datetime import datetime
26
- from pathlib import Path
27
27
  from typing import Any, Dict, List, Optional, Set, Tuple
28
28
 
29
29
  try:
30
30
  import aiofiles
31
+
31
32
  AIOFILES_AVAILABLE = True
32
33
  except ImportError:
33
34
  AIOFILES_AVAILABLE = False
34
35
 
36
+ from ..core.logger import get_logger
35
37
  from .cache import FileSystemCache, get_file_cache
36
38
  from .lazy import LazyService
37
- from ..core.logger import get_logger
38
39
 
39
40
 
40
41
  @dataclass
41
42
  class AgentLoadMetrics:
42
43
  """Metrics for agent loading performance."""
44
+
43
45
  total_agents: int = 0
44
46
  loaded_agents: int = 0
45
47
  cached_agents: int = 0
@@ -53,34 +55,31 @@ class AgentLoadMetrics:
53
55
 
54
56
  class OptimizedAgentLoader:
55
57
  """High-performance agent loader with caching and parallelization.
56
-
58
+
57
59
  WHY this design:
58
60
  - ThreadPoolExecutor for parallel file I/O
59
61
  - LRU cache for compiled agent templates
60
62
  - Batch processing to reduce overhead
61
63
  - Lazy compilation for rarely-used agents
62
-
64
+
63
65
  Example:
64
66
  loader = OptimizedAgentLoader(max_workers=4)
65
-
67
+
66
68
  # Load agents in parallel
67
69
  agents = loader.load_agents_parallel([
68
70
  '/path/to/agent1.json',
69
71
  '/path/to/agent2.json'
70
72
  ])
71
-
73
+
72
74
  # Async loading
73
75
  agents = await loader.load_agents_async(paths)
74
76
  """
75
-
77
+
76
78
  def __init__(
77
- self,
78
- max_workers: int = 4,
79
- cache_ttl: int = 3600,
80
- enable_lazy: bool = True
79
+ self, max_workers: int = 4, cache_ttl: int = 3600, enable_lazy: bool = True
81
80
  ):
82
81
  """Initialize optimized agent loader.
83
-
82
+
84
83
  Args:
85
84
  max_workers: Number of parallel workers for loading
86
85
  cache_ttl: Cache time-to-live in seconds
@@ -89,26 +88,26 @@ class OptimizedAgentLoader:
89
88
  self.max_workers = max_workers
90
89
  self.cache_ttl = cache_ttl
91
90
  self.enable_lazy = enable_lazy
92
-
91
+
93
92
  # Get or create cache
94
93
  self.cache = get_file_cache(max_size_mb=50, default_ttl=cache_ttl)
95
-
94
+
96
95
  # Thread pool for parallel operations
97
96
  self.executor = ThreadPoolExecutor(max_workers=max_workers)
98
-
97
+
99
98
  # Metrics tracking
100
99
  self.metrics = AgentLoadMetrics()
101
-
100
+
102
101
  # Logger
103
102
  self.logger = get_logger("optimized_agent_loader")
104
-
103
+
105
104
  # Template compilation cache
106
105
  self._compiled_templates: Dict[str, Dict[str, Any]] = {}
107
106
  self._template_lock = threading.Lock()
108
-
107
+
109
108
  def _get_cache_key(self, file_path: Path) -> str:
110
109
  """Generate cache key for an agent file.
111
-
110
+
112
111
  Includes file path and modification time for cache invalidation.
113
112
  """
114
113
  try:
@@ -116,18 +115,18 @@ class OptimizedAgentLoader:
116
115
  return f"agent:{file_path}:{mtime}"
117
116
  except:
118
117
  return f"agent:{file_path}"
119
-
118
+
120
119
  def _load_agent_file(self, file_path: Path) -> Optional[Dict[str, Any]]:
121
120
  """Load and parse a single agent file.
122
-
121
+
123
122
  Args:
124
123
  file_path: Path to agent file (.json or .md)
125
-
124
+
126
125
  Returns:
127
126
  Parsed agent data or None if failed
128
127
  """
129
128
  start_time = time.time()
130
-
129
+
131
130
  try:
132
131
  # Check cache first
133
132
  cache_key = self._get_cache_key(file_path)
@@ -135,35 +134,35 @@ class OptimizedAgentLoader:
135
134
  if cached is not None:
136
135
  self.metrics.cache_hits += 1
137
136
  return cached
138
-
137
+
139
138
  self.metrics.cache_misses += 1
140
-
139
+
141
140
  # Read file
142
141
  io_start = time.time()
143
- content = file_path.read_text(encoding='utf-8')
142
+ content = file_path.read_text(encoding="utf-8")
144
143
  self.metrics.io_time += time.time() - io_start
145
-
144
+
146
145
  # Parse based on file type
147
146
  parse_start = time.time()
148
- if file_path.suffix == '.json':
147
+ if file_path.suffix == ".json":
149
148
  agent_data = json.loads(content)
150
- elif file_path.suffix == '.md':
149
+ elif file_path.suffix == ".md":
151
150
  # Extract frontmatter from markdown
152
151
  agent_data = self._parse_markdown_agent(content)
153
152
  else:
154
- agent_data = {'content': content}
155
-
153
+ agent_data = {"content": content}
154
+
156
155
  self.metrics.parse_time += time.time() - parse_start
157
-
156
+
158
157
  # Add metadata
159
- agent_data['_file_path'] = str(file_path)
160
- agent_data['_loaded_at'] = datetime.now().isoformat()
161
-
158
+ agent_data["_file_path"] = str(file_path)
159
+ agent_data["_loaded_at"] = datetime.now().isoformat()
160
+
162
161
  # Cache the result
163
162
  self.cache.put(cache_key, agent_data, ttl=self.cache_ttl)
164
-
163
+
165
164
  return agent_data
166
-
165
+
167
166
  except Exception as e:
168
167
  self.logger.error(f"Failed to load agent {file_path}: {e}")
169
168
  self.metrics.failed_agents += 1
@@ -171,60 +170,59 @@ class OptimizedAgentLoader:
171
170
  finally:
172
171
  elapsed = time.time() - start_time
173
172
  self.logger.debug(f"Loaded {file_path.name} in {elapsed:.3f}s")
174
-
173
+
175
174
  def _parse_markdown_agent(self, content: str) -> Dict[str, Any]:
176
175
  """Parse agent data from markdown content.
177
-
176
+
178
177
  Extracts YAML frontmatter and content from markdown files.
179
178
  """
180
- lines = content.split('\n')
181
-
179
+ lines = content.split("\n")
180
+
182
181
  # Look for frontmatter
183
- if lines[0] == '---':
182
+ if lines[0] == "---":
184
183
  try:
185
184
  import yaml
186
- end_index = lines[1:].index('---') + 1
187
- frontmatter = '\n'.join(lines[1:end_index])
188
- body = '\n'.join(lines[end_index + 1:])
189
-
185
+
186
+ end_index = lines[1:].index("---") + 1
187
+ frontmatter = "\n".join(lines[1:end_index])
188
+ body = "\n".join(lines[end_index + 1 :])
189
+
190
190
  data = yaml.safe_load(frontmatter) or {}
191
- data['instructions'] = body
191
+ data["instructions"] = body
192
192
  return data
193
193
  except:
194
194
  pass
195
-
195
+
196
196
  # No frontmatter, treat as pure instructions
197
- return {'instructions': content}
198
-
197
+ return {"instructions": content}
198
+
199
199
  def load_agents_parallel(
200
- self,
201
- file_paths: List[Path],
202
- batch_size: int = 10
200
+ self, file_paths: List[Path], batch_size: int = 10
203
201
  ) -> Dict[str, Dict[str, Any]]:
204
202
  """Load multiple agents in parallel.
205
-
203
+
206
204
  Args:
207
205
  file_paths: List of agent file paths
208
206
  batch_size: Number of agents to load concurrently
209
-
207
+
210
208
  Returns:
211
209
  Dictionary mapping agent IDs to agent data
212
210
  """
213
211
  start_time = time.time()
214
212
  self.metrics.total_agents = len(file_paths)
215
-
213
+
216
214
  agents = {}
217
-
215
+
218
216
  # Process in batches to avoid overwhelming the system
219
217
  for i in range(0, len(file_paths), batch_size):
220
- batch = file_paths[i:i + batch_size]
221
-
218
+ batch = file_paths[i : i + batch_size]
219
+
222
220
  # Submit batch to thread pool
223
221
  futures = {
224
222
  self.executor.submit(self._load_agent_file, path): path
225
223
  for path in batch
226
224
  }
227
-
225
+
228
226
  # Collect results
229
227
  for future in as_completed(futures):
230
228
  path = futures[future]
@@ -237,26 +235,25 @@ class OptimizedAgentLoader:
237
235
  except Exception as e:
238
236
  self.logger.error(f"Failed to load {path}: {e}")
239
237
  self.metrics.failed_agents += 1
240
-
238
+
241
239
  self.metrics.total_time = time.time() - start_time
242
-
240
+
243
241
  self.logger.info(
244
242
  f"Loaded {self.metrics.loaded_agents}/{self.metrics.total_agents} agents "
245
243
  f"in {self.metrics.total_time:.2f}s "
246
244
  f"(cache hits: {self.metrics.cache_hits}, misses: {self.metrics.cache_misses})"
247
245
  )
248
-
246
+
249
247
  return agents
250
-
248
+
251
249
  async def load_agents_async(
252
- self,
253
- file_paths: List[Path]
250
+ self, file_paths: List[Path]
254
251
  ) -> Dict[str, Dict[str, Any]]:
255
252
  """Load agents asynchronously for async applications.
256
-
253
+
257
254
  Args:
258
255
  file_paths: List of agent file paths
259
-
256
+
260
257
  Returns:
261
258
  Dictionary mapping agent IDs to agent data
262
259
  """
@@ -264,22 +261,20 @@ class OptimizedAgentLoader:
264
261
  # Fallback to sync loading in executor
265
262
  loop = asyncio.get_event_loop()
266
263
  return await loop.run_in_executor(
267
- None,
268
- self.load_agents_parallel,
269
- file_paths
264
+ None, self.load_agents_parallel, file_paths
270
265
  )
271
-
266
+
272
267
  start_time = time.time()
273
268
  self.metrics.total_agents = len(file_paths)
274
-
269
+
275
270
  # Create async tasks for all agents
276
271
  tasks = []
277
272
  for path in file_paths:
278
273
  tasks.append(self._load_agent_async(path))
279
-
274
+
280
275
  # Load all agents concurrently
281
276
  results = await asyncio.gather(*tasks, return_exceptions=True)
282
-
277
+
283
278
  # Collect successful loads
284
279
  agents = {}
285
280
  for path, result in zip(file_paths, results):
@@ -290,16 +285,16 @@ class OptimizedAgentLoader:
290
285
  agent_id = path.stem
291
286
  agents[agent_id] = result
292
287
  self.metrics.loaded_agents += 1
293
-
288
+
294
289
  self.metrics.total_time = time.time() - start_time
295
-
290
+
296
291
  self.logger.info(
297
292
  f"Async loaded {self.metrics.loaded_agents}/{self.metrics.total_agents} agents "
298
293
  f"in {self.metrics.total_time:.2f}s"
299
294
  )
300
-
295
+
301
296
  return agents
302
-
297
+
303
298
  async def _load_agent_async(self, file_path: Path) -> Optional[Dict[str, Any]]:
304
299
  """Load a single agent asynchronously."""
305
300
  try:
@@ -309,52 +304,50 @@ class OptimizedAgentLoader:
309
304
  if cached is not None:
310
305
  self.metrics.cache_hits += 1
311
306
  return cached
312
-
307
+
313
308
  self.metrics.cache_misses += 1
314
-
309
+
315
310
  # Read file asynchronously
316
- async with aiofiles.open(file_path, 'r', encoding='utf-8') as f:
311
+ async with aiofiles.open(file_path, "r", encoding="utf-8") as f:
317
312
  content = await f.read()
318
-
313
+
319
314
  # Parse in executor to avoid blocking
320
315
  loop = asyncio.get_event_loop()
321
- if file_path.suffix == '.json':
316
+ if file_path.suffix == ".json":
322
317
  agent_data = await loop.run_in_executor(None, json.loads, content)
323
- elif file_path.suffix == '.md':
318
+ elif file_path.suffix == ".md":
324
319
  agent_data = await loop.run_in_executor(
325
- None,
326
- self._parse_markdown_agent,
327
- content
320
+ None, self._parse_markdown_agent, content
328
321
  )
329
322
  else:
330
- agent_data = {'content': content}
331
-
323
+ agent_data = {"content": content}
324
+
332
325
  # Add metadata
333
- agent_data['_file_path'] = str(file_path)
334
- agent_data['_loaded_at'] = datetime.now().isoformat()
335
-
326
+ agent_data["_file_path"] = str(file_path)
327
+ agent_data["_loaded_at"] = datetime.now().isoformat()
328
+
336
329
  # Cache the result
337
330
  self.cache.put(cache_key, agent_data, ttl=self.cache_ttl)
338
-
331
+
339
332
  return agent_data
340
-
333
+
341
334
  except Exception as e:
342
335
  self.logger.error(f"Failed to async load {file_path}: {e}")
343
336
  return None
344
-
337
+
345
338
  def compile_template(self, agent_id: str, template: str) -> Dict[str, Any]:
346
339
  """Compile and cache an agent template.
347
-
340
+
348
341
  WHY template compilation:
349
342
  - Pre-processes templates for faster runtime use
350
343
  - Validates template syntax once
351
344
  - Caches compiled form for reuse
352
345
  - Reduces repeated parsing overhead
353
-
346
+
354
347
  Args:
355
348
  agent_id: Unique agent identifier
356
349
  template: Raw template string
357
-
350
+
358
351
  Returns:
359
352
  Compiled template data
360
353
  """
@@ -363,80 +356,81 @@ class OptimizedAgentLoader:
363
356
  if agent_id in self._compiled_templates:
364
357
  self.metrics.cache_hits += 1
365
358
  return self._compiled_templates[agent_id]
366
-
359
+
367
360
  self.metrics.cache_misses += 1
368
-
361
+
369
362
  # Compile template
370
363
  start_time = time.time()
371
364
  try:
372
365
  # Parse any template variables
373
366
  compiled = {
374
- 'id': agent_id,
375
- 'template': template,
376
- 'variables': self._extract_variables(template),
377
- 'sections': self._extract_sections(template),
378
- 'compiled_at': datetime.now().isoformat()
367
+ "id": agent_id,
368
+ "template": template,
369
+ "variables": self._extract_variables(template),
370
+ "sections": self._extract_sections(template),
371
+ "compiled_at": datetime.now().isoformat(),
379
372
  }
380
-
373
+
381
374
  # Cache compiled template
382
375
  self._compiled_templates[agent_id] = compiled
383
-
376
+
384
377
  self.metrics.parse_time += time.time() - start_time
385
378
  return compiled
386
-
379
+
387
380
  except Exception as e:
388
381
  self.logger.error(f"Failed to compile template {agent_id}: {e}")
389
- return {'id': agent_id, 'template': template, 'error': str(e)}
390
-
382
+ return {"id": agent_id, "template": template, "error": str(e)}
383
+
391
384
  def _extract_variables(self, template: str) -> List[str]:
392
385
  """Extract variable placeholders from template."""
393
386
  import re
387
+
394
388
  # Find {{variable}} patterns
395
- return re.findall(r'\{\{(\w+)\}\}', template)
396
-
389
+ return re.findall(r"\{\{(\w+)\}\}", template)
390
+
397
391
  def _extract_sections(self, template: str) -> Dict[str, str]:
398
392
  """Extract named sections from template."""
399
393
  sections = {}
400
- current_section = 'main'
394
+ current_section = "main"
401
395
  current_content = []
402
-
403
- for line in template.split('\n'):
396
+
397
+ for line in template.split("\n"):
404
398
  # Check for section headers (## Section Name)
405
- if line.startswith('## '):
399
+ if line.startswith("## "):
406
400
  # Save previous section
407
401
  if current_content:
408
- sections[current_section] = '\n'.join(current_content)
402
+ sections[current_section] = "\n".join(current_content)
409
403
  # Start new section
410
- current_section = line[3:].strip().lower().replace(' ', '_')
404
+ current_section = line[3:].strip().lower().replace(" ", "_")
411
405
  current_content = []
412
406
  else:
413
407
  current_content.append(line)
414
-
408
+
415
409
  # Save last section
416
410
  if current_content:
417
- sections[current_section] = '\n'.join(current_content)
418
-
411
+ sections[current_section] = "\n".join(current_content)
412
+
419
413
  return sections
420
-
414
+
421
415
  def preload_agents(self, agent_dirs: List[Path]) -> None:
422
416
  """Preload all agents from specified directories.
423
-
417
+
424
418
  Useful for warming up the cache at startup.
425
-
419
+
426
420
  Args:
427
421
  agent_dirs: List of directories containing agents
428
422
  """
429
423
  self.logger.info(f"Preloading agents from {len(agent_dirs)} directories")
430
-
424
+
431
425
  all_paths = []
432
426
  for dir_path in agent_dirs:
433
427
  if dir_path.exists():
434
- all_paths.extend(dir_path.glob('*.json'))
435
- all_paths.extend(dir_path.glob('*.md'))
436
-
428
+ all_paths.extend(dir_path.glob("*.json"))
429
+ all_paths.extend(dir_path.glob("*.md"))
430
+
437
431
  if all_paths:
438
432
  self.load_agents_parallel(all_paths)
439
-
433
+
440
434
  def get_metrics(self) -> Dict[str, Any]:
441
435
  """Get loader performance metrics."""
442
436
  return {
@@ -445,12 +439,14 @@ class OptimizedAgentLoader:
445
439
  "cached_agents": len(self._compiled_templates),
446
440
  "failed_agents": self.metrics.failed_agents,
447
441
  "total_time": self.metrics.total_time,
448
- "avg_load_time": self.metrics.total_time / max(1, self.metrics.loaded_agents),
442
+ "avg_load_time": self.metrics.total_time
443
+ / max(1, self.metrics.loaded_agents),
449
444
  "parse_time": self.metrics.parse_time,
450
445
  "io_time": self.metrics.io_time,
451
- "cache_hit_rate": self.metrics.cache_hits / max(1, self.metrics.cache_hits + self.metrics.cache_misses)
446
+ "cache_hit_rate": self.metrics.cache_hits
447
+ / max(1, self.metrics.cache_hits + self.metrics.cache_misses),
452
448
  }
453
-
449
+
454
450
  def cleanup(self):
455
451
  """Clean up resources."""
456
452
  self.executor.shutdown(wait=False)
@@ -472,14 +468,14 @@ def get_optimized_loader(max_workers: int = 4) -> OptimizedAgentLoader:
472
468
  def preload_system_agents():
473
469
  """Preload all system agents at startup."""
474
470
  loader = get_optimized_loader()
475
-
471
+
476
472
  # Common agent directories
477
473
  agent_dirs = [
478
474
  Path.cwd() / ".claude" / "agents",
479
475
  Path.cwd() / ".claude-mpm" / "agents",
480
476
  Path.home() / ".claude-mpm" / "agents",
481
477
  Path(__file__).parent.parent / "agents" / "templates",
482
- Path(__file__).parent.parent / "agents"
478
+ Path(__file__).parent.parent / "agents",
483
479
  ]
484
-
485
- loader.preload_agents([d for d in agent_dirs if d.exists()])
480
+
481
+ loader.preload_agents([d for d in agent_dirs if d.exists()])