claude-mpm 4.1.1__py3-none-any.whl → 4.1.2__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 (357) hide show
  1. claude_mpm/BUILD_NUMBER +1 -1
  2. claude_mpm/VERSION +1 -1
  3. claude_mpm/__main__.py +1 -1
  4. claude_mpm/agents/BASE_PM.md +74 -46
  5. claude_mpm/agents/INSTRUCTIONS.md +11 -153
  6. claude_mpm/agents/WORKFLOW.md +61 -321
  7. claude_mpm/agents/__init__.py +11 -11
  8. claude_mpm/agents/agent_loader.py +23 -20
  9. claude_mpm/agents/agent_loader_integration.py +1 -1
  10. claude_mpm/agents/agents_metadata.py +27 -0
  11. claude_mpm/agents/async_agent_loader.py +5 -8
  12. claude_mpm/agents/base_agent_loader.py +36 -25
  13. claude_mpm/agents/frontmatter_validator.py +6 -6
  14. claude_mpm/agents/schema/agent_schema.json +1 -1
  15. claude_mpm/agents/system_agent_config.py +9 -9
  16. claude_mpm/agents/templates/api_qa.json +47 -2
  17. claude_mpm/agents/templates/imagemagick.json +256 -0
  18. claude_mpm/agents/templates/qa.json +41 -2
  19. claude_mpm/agents/templates/ticketing.json +5 -5
  20. claude_mpm/agents/templates/web_qa.json +50 -2
  21. claude_mpm/cli/__init__.py +51 -46
  22. claude_mpm/cli/__main__.py +1 -1
  23. claude_mpm/cli/commands/__init__.py +10 -12
  24. claude_mpm/cli/commands/agent_manager.py +186 -181
  25. claude_mpm/cli/commands/agents.py +271 -268
  26. claude_mpm/cli/commands/aggregate.py +30 -29
  27. claude_mpm/cli/commands/cleanup.py +50 -44
  28. claude_mpm/cli/commands/cleanup_orphaned_agents.py +25 -25
  29. claude_mpm/cli/commands/config.py +162 -127
  30. claude_mpm/cli/commands/doctor.py +52 -62
  31. claude_mpm/cli/commands/info.py +37 -25
  32. claude_mpm/cli/commands/mcp.py +3 -7
  33. claude_mpm/cli/commands/mcp_command_router.py +14 -18
  34. claude_mpm/cli/commands/mcp_install_commands.py +28 -23
  35. claude_mpm/cli/commands/mcp_pipx_config.py +58 -49
  36. claude_mpm/cli/commands/mcp_server_commands.py +23 -17
  37. claude_mpm/cli/commands/memory.py +192 -141
  38. claude_mpm/cli/commands/monitor.py +117 -88
  39. claude_mpm/cli/commands/run.py +120 -84
  40. claude_mpm/cli/commands/run_config_checker.py +4 -5
  41. claude_mpm/cli/commands/socketio_monitor.py +17 -19
  42. claude_mpm/cli/commands/tickets.py +92 -92
  43. claude_mpm/cli/parser.py +1 -5
  44. claude_mpm/cli/parsers/__init__.py +1 -1
  45. claude_mpm/cli/parsers/agent_manager_parser.py +50 -98
  46. claude_mpm/cli/parsers/agents_parser.py +2 -3
  47. claude_mpm/cli/parsers/base_parser.py +7 -5
  48. claude_mpm/cli/parsers/mcp_parser.py +4 -2
  49. claude_mpm/cli/parsers/monitor_parser.py +26 -18
  50. claude_mpm/cli/shared/__init__.py +10 -10
  51. claude_mpm/cli/shared/argument_patterns.py +57 -71
  52. claude_mpm/cli/shared/base_command.py +61 -53
  53. claude_mpm/cli/shared/error_handling.py +62 -58
  54. claude_mpm/cli/shared/output_formatters.py +78 -77
  55. claude_mpm/cli/startup_logging.py +204 -172
  56. claude_mpm/cli/utils.py +10 -11
  57. claude_mpm/cli_module/__init__.py +1 -1
  58. claude_mpm/cli_module/args.py +1 -1
  59. claude_mpm/cli_module/migration_example.py +5 -5
  60. claude_mpm/config/__init__.py +9 -9
  61. claude_mpm/config/agent_config.py +15 -14
  62. claude_mpm/config/experimental_features.py +4 -4
  63. claude_mpm/config/paths.py +0 -1
  64. claude_mpm/config/socketio_config.py +5 -6
  65. claude_mpm/constants.py +1 -2
  66. claude_mpm/core/__init__.py +8 -8
  67. claude_mpm/core/agent_name_normalizer.py +1 -1
  68. claude_mpm/core/agent_registry.py +20 -23
  69. claude_mpm/core/agent_session_manager.py +3 -3
  70. claude_mpm/core/base_service.py +7 -15
  71. claude_mpm/core/cache.py +4 -6
  72. claude_mpm/core/claude_runner.py +85 -113
  73. claude_mpm/core/config.py +43 -28
  74. claude_mpm/core/config_aliases.py +0 -9
  75. claude_mpm/core/config_constants.py +52 -30
  76. claude_mpm/core/constants.py +0 -1
  77. claude_mpm/core/container.py +18 -27
  78. claude_mpm/core/exceptions.py +2 -2
  79. claude_mpm/core/factories.py +10 -12
  80. claude_mpm/core/framework_loader.py +581 -280
  81. claude_mpm/core/hook_manager.py +26 -22
  82. claude_mpm/core/hook_performance_config.py +58 -47
  83. claude_mpm/core/injectable_service.py +1 -1
  84. claude_mpm/core/interactive_session.py +61 -152
  85. claude_mpm/core/interfaces.py +1 -100
  86. claude_mpm/core/lazy.py +5 -5
  87. claude_mpm/core/log_manager.py +587 -0
  88. claude_mpm/core/logger.py +125 -8
  89. claude_mpm/core/logging_config.py +15 -15
  90. claude_mpm/core/minimal_framework_loader.py +5 -8
  91. claude_mpm/core/oneshot_session.py +15 -33
  92. claude_mpm/core/optimized_agent_loader.py +4 -6
  93. claude_mpm/core/optimized_startup.py +2 -1
  94. claude_mpm/core/output_style_manager.py +147 -106
  95. claude_mpm/core/pm_hook_interceptor.py +0 -1
  96. claude_mpm/core/service_registry.py +11 -8
  97. claude_mpm/core/session_manager.py +1 -2
  98. claude_mpm/core/shared/__init__.py +1 -1
  99. claude_mpm/core/shared/config_loader.py +101 -97
  100. claude_mpm/core/shared/path_resolver.py +72 -68
  101. claude_mpm/core/shared/singleton_manager.py +56 -50
  102. claude_mpm/core/socketio_pool.py +26 -6
  103. claude_mpm/core/tool_access_control.py +4 -5
  104. claude_mpm/core/typing_utils.py +50 -59
  105. claude_mpm/core/unified_agent_registry.py +14 -19
  106. claude_mpm/core/unified_config.py +4 -6
  107. claude_mpm/core/unified_paths.py +197 -109
  108. claude_mpm/dashboard/open_dashboard.py +2 -4
  109. claude_mpm/experimental/cli_enhancements.py +51 -36
  110. claude_mpm/generators/agent_profile_generator.py +2 -4
  111. claude_mpm/hooks/base_hook.py +1 -2
  112. claude_mpm/hooks/claude_hooks/connection_pool.py +72 -26
  113. claude_mpm/hooks/claude_hooks/event_handlers.py +93 -38
  114. claude_mpm/hooks/claude_hooks/hook_handler.py +130 -76
  115. claude_mpm/hooks/claude_hooks/hook_handler_eventbus.py +104 -77
  116. claude_mpm/hooks/claude_hooks/memory_integration.py +2 -4
  117. claude_mpm/hooks/claude_hooks/response_tracking.py +15 -11
  118. claude_mpm/hooks/claude_hooks/tool_analysis.py +12 -18
  119. claude_mpm/hooks/memory_integration_hook.py +5 -5
  120. claude_mpm/hooks/tool_call_interceptor.py +1 -1
  121. claude_mpm/hooks/validation_hooks.py +4 -4
  122. claude_mpm/init.py +4 -9
  123. claude_mpm/models/__init__.py +2 -2
  124. claude_mpm/models/agent_session.py +11 -14
  125. claude_mpm/scripts/mcp_server.py +20 -11
  126. claude_mpm/scripts/mcp_wrapper.py +5 -5
  127. claude_mpm/scripts/mpm_doctor.py +321 -0
  128. claude_mpm/scripts/socketio_daemon.py +28 -25
  129. claude_mpm/scripts/socketio_daemon_hardened.py +298 -258
  130. claude_mpm/scripts/socketio_server_manager.py +116 -95
  131. claude_mpm/services/__init__.py +49 -49
  132. claude_mpm/services/agent_capabilities_service.py +12 -18
  133. claude_mpm/services/agents/__init__.py +22 -22
  134. claude_mpm/services/agents/agent_builder.py +140 -119
  135. claude_mpm/services/agents/deployment/__init__.py +3 -3
  136. claude_mpm/services/agents/deployment/agent_config_provider.py +9 -9
  137. claude_mpm/services/agents/deployment/agent_configuration_manager.py +19 -20
  138. claude_mpm/services/agents/deployment/agent_definition_factory.py +1 -5
  139. claude_mpm/services/agents/deployment/agent_deployment.py +136 -106
  140. claude_mpm/services/agents/deployment/agent_discovery_service.py +4 -8
  141. claude_mpm/services/agents/deployment/agent_environment_manager.py +2 -7
  142. claude_mpm/services/agents/deployment/agent_filesystem_manager.py +6 -10
  143. claude_mpm/services/agents/deployment/agent_format_converter.py +11 -15
  144. claude_mpm/services/agents/deployment/agent_frontmatter_validator.py +2 -3
  145. claude_mpm/services/agents/deployment/agent_lifecycle_manager.py +5 -5
  146. claude_mpm/services/agents/deployment/agent_metrics_collector.py +13 -19
  147. claude_mpm/services/agents/deployment/agent_restore_handler.py +0 -1
  148. claude_mpm/services/agents/deployment/agent_template_builder.py +26 -35
  149. claude_mpm/services/agents/deployment/agent_validator.py +0 -1
  150. claude_mpm/services/agents/deployment/agent_version_manager.py +7 -9
  151. claude_mpm/services/agents/deployment/agent_versioning.py +3 -3
  152. claude_mpm/services/agents/deployment/agents_directory_resolver.py +6 -7
  153. claude_mpm/services/agents/deployment/async_agent_deployment.py +51 -38
  154. claude_mpm/services/agents/deployment/config/__init__.py +1 -1
  155. claude_mpm/services/agents/deployment/config/deployment_config.py +7 -8
  156. claude_mpm/services/agents/deployment/deployment_type_detector.py +1 -1
  157. claude_mpm/services/agents/deployment/deployment_wrapper.py +18 -18
  158. claude_mpm/services/agents/deployment/facade/__init__.py +1 -1
  159. claude_mpm/services/agents/deployment/facade/deployment_executor.py +0 -3
  160. claude_mpm/services/agents/deployment/facade/deployment_facade.py +3 -4
  161. claude_mpm/services/agents/deployment/interface_adapter.py +5 -7
  162. claude_mpm/services/agents/deployment/multi_source_deployment_service.py +345 -276
  163. claude_mpm/services/agents/deployment/pipeline/__init__.py +2 -2
  164. claude_mpm/services/agents/deployment/pipeline/pipeline_builder.py +1 -1
  165. claude_mpm/services/agents/deployment/pipeline/pipeline_context.py +6 -4
  166. claude_mpm/services/agents/deployment/pipeline/pipeline_executor.py +3 -3
  167. claude_mpm/services/agents/deployment/pipeline/steps/__init__.py +2 -2
  168. claude_mpm/services/agents/deployment/pipeline/steps/agent_processing_step.py +14 -13
  169. claude_mpm/services/agents/deployment/pipeline/steps/base_step.py +0 -1
  170. claude_mpm/services/agents/deployment/pipeline/steps/configuration_step.py +1 -1
  171. claude_mpm/services/agents/deployment/pipeline/steps/target_directory_step.py +8 -9
  172. claude_mpm/services/agents/deployment/pipeline/steps/validation_step.py +1 -1
  173. claude_mpm/services/agents/deployment/processors/__init__.py +1 -1
  174. claude_mpm/services/agents/deployment/processors/agent_processor.py +20 -16
  175. claude_mpm/services/agents/deployment/refactored_agent_deployment_service.py +5 -12
  176. claude_mpm/services/agents/deployment/results/__init__.py +1 -1
  177. claude_mpm/services/agents/deployment/results/deployment_result_builder.py +1 -1
  178. claude_mpm/services/agents/deployment/strategies/__init__.py +2 -2
  179. claude_mpm/services/agents/deployment/strategies/base_strategy.py +1 -7
  180. claude_mpm/services/agents/deployment/strategies/project_strategy.py +1 -4
  181. claude_mpm/services/agents/deployment/strategies/system_strategy.py +2 -3
  182. claude_mpm/services/agents/deployment/strategies/user_strategy.py +3 -7
  183. claude_mpm/services/agents/deployment/validation/__init__.py +1 -1
  184. claude_mpm/services/agents/deployment/validation/agent_validator.py +1 -1
  185. claude_mpm/services/agents/deployment/validation/template_validator.py +2 -2
  186. claude_mpm/services/agents/deployment/validation/validation_result.py +2 -6
  187. claude_mpm/services/agents/loading/__init__.py +1 -1
  188. claude_mpm/services/agents/loading/agent_profile_loader.py +6 -12
  189. claude_mpm/services/agents/loading/base_agent_manager.py +5 -5
  190. claude_mpm/services/agents/loading/framework_agent_loader.py +2 -4
  191. claude_mpm/services/agents/management/__init__.py +1 -1
  192. claude_mpm/services/agents/management/agent_capabilities_generator.py +1 -3
  193. claude_mpm/services/agents/management/agent_management_service.py +5 -9
  194. claude_mpm/services/agents/memory/__init__.py +4 -4
  195. claude_mpm/services/agents/memory/agent_memory_manager.py +280 -160
  196. claude_mpm/services/agents/memory/agent_persistence_service.py +0 -2
  197. claude_mpm/services/agents/memory/content_manager.py +44 -38
  198. claude_mpm/services/agents/memory/template_generator.py +4 -6
  199. claude_mpm/services/agents/registry/__init__.py +10 -6
  200. claude_mpm/services/agents/registry/deployed_agent_discovery.py +30 -27
  201. claude_mpm/services/agents/registry/modification_tracker.py +3 -6
  202. claude_mpm/services/async_session_logger.py +1 -2
  203. claude_mpm/services/claude_session_logger.py +1 -2
  204. claude_mpm/services/command_deployment_service.py +173 -0
  205. claude_mpm/services/command_handler_service.py +20 -22
  206. claude_mpm/services/core/__init__.py +25 -25
  207. claude_mpm/services/core/base.py +0 -5
  208. claude_mpm/services/core/interfaces/__init__.py +32 -32
  209. claude_mpm/services/core/interfaces/agent.py +0 -21
  210. claude_mpm/services/core/interfaces/communication.py +0 -27
  211. claude_mpm/services/core/interfaces/infrastructure.py +0 -56
  212. claude_mpm/services/core/interfaces/service.py +0 -29
  213. claude_mpm/services/diagnostics/__init__.py +1 -1
  214. claude_mpm/services/diagnostics/checks/__init__.py +6 -6
  215. claude_mpm/services/diagnostics/checks/agent_check.py +89 -80
  216. claude_mpm/services/diagnostics/checks/base_check.py +12 -16
  217. claude_mpm/services/diagnostics/checks/claude_desktop_check.py +84 -81
  218. claude_mpm/services/diagnostics/checks/common_issues_check.py +99 -91
  219. claude_mpm/services/diagnostics/checks/configuration_check.py +82 -77
  220. claude_mpm/services/diagnostics/checks/filesystem_check.py +67 -68
  221. claude_mpm/services/diagnostics/checks/installation_check.py +254 -94
  222. claude_mpm/services/diagnostics/checks/mcp_check.py +90 -88
  223. claude_mpm/services/diagnostics/checks/monitor_check.py +75 -76
  224. claude_mpm/services/diagnostics/checks/startup_log_check.py +67 -73
  225. claude_mpm/services/diagnostics/diagnostic_runner.py +67 -59
  226. claude_mpm/services/diagnostics/doctor_reporter.py +107 -70
  227. claude_mpm/services/diagnostics/models.py +21 -19
  228. claude_mpm/services/event_aggregator.py +10 -17
  229. claude_mpm/services/event_bus/__init__.py +1 -1
  230. claude_mpm/services/event_bus/config.py +54 -35
  231. claude_mpm/services/event_bus/event_bus.py +76 -71
  232. claude_mpm/services/event_bus/relay.py +74 -64
  233. claude_mpm/services/events/__init__.py +11 -11
  234. claude_mpm/services/events/consumers/__init__.py +3 -3
  235. claude_mpm/services/events/consumers/dead_letter.py +71 -63
  236. claude_mpm/services/events/consumers/logging.py +39 -37
  237. claude_mpm/services/events/consumers/metrics.py +56 -57
  238. claude_mpm/services/events/consumers/socketio.py +82 -81
  239. claude_mpm/services/events/core.py +110 -99
  240. claude_mpm/services/events/interfaces.py +56 -72
  241. claude_mpm/services/events/producers/__init__.py +1 -1
  242. claude_mpm/services/events/producers/hook.py +38 -38
  243. claude_mpm/services/events/producers/system.py +46 -44
  244. claude_mpm/services/exceptions.py +81 -80
  245. claude_mpm/services/framework_claude_md_generator/__init__.py +2 -4
  246. claude_mpm/services/framework_claude_md_generator/content_assembler.py +3 -5
  247. claude_mpm/services/framework_claude_md_generator/content_validator.py +1 -1
  248. claude_mpm/services/framework_claude_md_generator/deployment_manager.py +4 -4
  249. claude_mpm/services/framework_claude_md_generator/section_generators/__init__.py +0 -1
  250. claude_mpm/services/framework_claude_md_generator/section_generators/agents.py +0 -2
  251. claude_mpm/services/framework_claude_md_generator/version_manager.py +4 -5
  252. claude_mpm/services/hook_service.py +6 -9
  253. claude_mpm/services/infrastructure/__init__.py +1 -1
  254. claude_mpm/services/infrastructure/context_preservation.py +8 -12
  255. claude_mpm/services/infrastructure/monitoring.py +21 -23
  256. claude_mpm/services/mcp_gateway/__init__.py +37 -37
  257. claude_mpm/services/mcp_gateway/auto_configure.py +95 -103
  258. claude_mpm/services/mcp_gateway/config/__init__.py +1 -1
  259. claude_mpm/services/mcp_gateway/config/config_loader.py +23 -25
  260. claude_mpm/services/mcp_gateway/config/config_schema.py +5 -5
  261. claude_mpm/services/mcp_gateway/config/configuration.py +9 -6
  262. claude_mpm/services/mcp_gateway/core/__init__.py +10 -10
  263. claude_mpm/services/mcp_gateway/core/base.py +0 -3
  264. claude_mpm/services/mcp_gateway/core/interfaces.py +1 -38
  265. claude_mpm/services/mcp_gateway/core/process_pool.py +99 -93
  266. claude_mpm/services/mcp_gateway/core/singleton_manager.py +65 -62
  267. claude_mpm/services/mcp_gateway/core/startup_verification.py +75 -74
  268. claude_mpm/services/mcp_gateway/main.py +2 -1
  269. claude_mpm/services/mcp_gateway/registry/service_registry.py +5 -8
  270. claude_mpm/services/mcp_gateway/registry/tool_registry.py +1 -1
  271. claude_mpm/services/mcp_gateway/server/__init__.py +1 -1
  272. claude_mpm/services/mcp_gateway/server/mcp_gateway.py +12 -19
  273. claude_mpm/services/mcp_gateway/server/stdio_handler.py +4 -3
  274. claude_mpm/services/mcp_gateway/server/stdio_server.py +79 -71
  275. claude_mpm/services/mcp_gateway/tools/__init__.py +2 -2
  276. claude_mpm/services/mcp_gateway/tools/base_adapter.py +5 -6
  277. claude_mpm/services/mcp_gateway/tools/document_summarizer.py +13 -22
  278. claude_mpm/services/mcp_gateway/tools/health_check_tool.py +79 -78
  279. claude_mpm/services/mcp_gateway/tools/hello_world.py +12 -14
  280. claude_mpm/services/mcp_gateway/tools/ticket_tools.py +42 -49
  281. claude_mpm/services/mcp_gateway/tools/unified_ticket_tool.py +51 -55
  282. claude_mpm/services/memory/__init__.py +3 -3
  283. claude_mpm/services/memory/builder.py +3 -6
  284. claude_mpm/services/memory/cache/__init__.py +1 -1
  285. claude_mpm/services/memory/cache/shared_prompt_cache.py +3 -5
  286. claude_mpm/services/memory/cache/simple_cache.py +1 -1
  287. claude_mpm/services/memory/indexed_memory.py +5 -7
  288. claude_mpm/services/memory/optimizer.py +7 -10
  289. claude_mpm/services/memory/router.py +8 -9
  290. claude_mpm/services/memory_hook_service.py +48 -34
  291. claude_mpm/services/monitor_build_service.py +77 -73
  292. claude_mpm/services/port_manager.py +130 -108
  293. claude_mpm/services/project/analyzer.py +12 -10
  294. claude_mpm/services/project/registry.py +11 -11
  295. claude_mpm/services/recovery_manager.py +10 -19
  296. claude_mpm/services/response_tracker.py +0 -1
  297. claude_mpm/services/runner_configuration_service.py +19 -20
  298. claude_mpm/services/session_management_service.py +7 -11
  299. claude_mpm/services/shared/__init__.py +1 -1
  300. claude_mpm/services/shared/async_service_base.py +58 -50
  301. claude_mpm/services/shared/config_service_base.py +73 -67
  302. claude_mpm/services/shared/lifecycle_service_base.py +82 -78
  303. claude_mpm/services/shared/manager_base.py +94 -82
  304. claude_mpm/services/shared/service_factory.py +96 -98
  305. claude_mpm/services/socketio/__init__.py +3 -3
  306. claude_mpm/services/socketio/client_proxy.py +5 -5
  307. claude_mpm/services/socketio/event_normalizer.py +199 -181
  308. claude_mpm/services/socketio/handlers/__init__.py +3 -3
  309. claude_mpm/services/socketio/handlers/base.py +5 -4
  310. claude_mpm/services/socketio/handlers/connection.py +163 -136
  311. claude_mpm/services/socketio/handlers/file.py +13 -14
  312. claude_mpm/services/socketio/handlers/git.py +12 -7
  313. claude_mpm/services/socketio/handlers/hook.py +49 -44
  314. claude_mpm/services/socketio/handlers/memory.py +0 -1
  315. claude_mpm/services/socketio/handlers/project.py +0 -1
  316. claude_mpm/services/socketio/handlers/registry.py +37 -19
  317. claude_mpm/services/socketio/migration_utils.py +98 -84
  318. claude_mpm/services/socketio/server/__init__.py +1 -1
  319. claude_mpm/services/socketio/server/broadcaster.py +81 -87
  320. claude_mpm/services/socketio/server/core.py +65 -54
  321. claude_mpm/services/socketio/server/eventbus_integration.py +95 -56
  322. claude_mpm/services/socketio/server/main.py +64 -38
  323. claude_mpm/services/socketio_client_manager.py +10 -12
  324. claude_mpm/services/subprocess_launcher_service.py +4 -7
  325. claude_mpm/services/system_instructions_service.py +13 -14
  326. claude_mpm/services/ticket_manager.py +2 -2
  327. claude_mpm/services/utility_service.py +5 -13
  328. claude_mpm/services/version_control/__init__.py +16 -16
  329. claude_mpm/services/version_control/branch_strategy.py +5 -8
  330. claude_mpm/services/version_control/conflict_resolution.py +9 -23
  331. claude_mpm/services/version_control/git_operations.py +5 -7
  332. claude_mpm/services/version_control/semantic_versioning.py +16 -17
  333. claude_mpm/services/version_control/version_parser.py +13 -18
  334. claude_mpm/services/version_service.py +10 -11
  335. claude_mpm/storage/__init__.py +1 -1
  336. claude_mpm/storage/state_storage.py +22 -28
  337. claude_mpm/utils/__init__.py +6 -6
  338. claude_mpm/utils/agent_dependency_loader.py +47 -33
  339. claude_mpm/utils/config_manager.py +11 -14
  340. claude_mpm/utils/dependency_cache.py +1 -1
  341. claude_mpm/utils/dependency_manager.py +13 -17
  342. claude_mpm/utils/dependency_strategies.py +8 -10
  343. claude_mpm/utils/environment_context.py +3 -9
  344. claude_mpm/utils/error_handler.py +3 -13
  345. claude_mpm/utils/file_utils.py +1 -1
  346. claude_mpm/utils/path_operations.py +8 -12
  347. claude_mpm/utils/robust_installer.py +110 -33
  348. claude_mpm/utils/subprocess_utils.py +5 -6
  349. claude_mpm/validation/agent_validator.py +3 -6
  350. claude_mpm/validation/frontmatter_validator.py +1 -1
  351. {claude_mpm-4.1.1.dist-info → claude_mpm-4.1.2.dist-info}/METADATA +1 -1
  352. claude_mpm-4.1.2.dist-info/RECORD +498 -0
  353. claude_mpm-4.1.1.dist-info/RECORD +0 -494
  354. {claude_mpm-4.1.1.dist-info → claude_mpm-4.1.2.dist-info}/WHEEL +0 -0
  355. {claude_mpm-4.1.1.dist-info → claude_mpm-4.1.2.dist-info}/entry_points.txt +0 -0
  356. {claude_mpm-4.1.1.dist-info → claude_mpm-4.1.2.dist-info}/licenses/LICENSE +0 -0
  357. {claude_mpm-4.1.1.dist-info → claude_mpm-4.1.2.dist-info}/top_level.txt +0 -0
@@ -8,7 +8,6 @@ maintainability and testability.
8
8
  """
9
9
 
10
10
  import json
11
- import logging
12
11
  from pathlib import Path
13
12
  from typing import Any, Dict, List, Optional
14
13
 
@@ -140,9 +139,8 @@ class AgentDiscoveryService:
140
139
  if template_file.exists():
141
140
  if self._validate_template_file(template_file):
142
141
  return template_file
143
- else:
144
- self.logger.error(f"Invalid template file: {template_file}")
145
- return None
142
+ self.logger.error(f"Invalid template file: {template_file}")
143
+ return None
146
144
 
147
145
  self.logger.error(f"Template not found for agent: {agent_name}")
148
146
  return None
@@ -198,10 +196,8 @@ class AgentDiscoveryService:
198
196
  "name": metadata.get("name", template_file.stem),
199
197
  "description": metadata.get("description", "No description available"),
200
198
  "version": template_data.get(
201
- "agent_version",
202
- template_data.get("version",
203
- metadata.get("version", "1.0.0")
204
- )
199
+ "agent_version",
200
+ template_data.get("version", metadata.get("version", "1.0.0")),
205
201
  ),
206
202
  "tools": capabilities.get("tools", []),
207
203
  "specializations": metadata.get(
@@ -7,7 +7,6 @@ Extracted from AgentDeploymentService as part of the refactoring to improve
7
7
  maintainability and testability.
8
8
  """
9
9
 
10
- import logging
11
10
  import os
12
11
  from pathlib import Path
13
12
  from typing import Any, Dict, Optional
@@ -236,7 +235,7 @@ cache/
236
235
  """
237
236
  current_env = self.get_current_environment()
238
237
 
239
- info = {
238
+ return {
240
239
  "claude_environment_variables": current_env,
241
240
  "python_path": os.environ.get("PYTHONPATH", "Not set"),
242
241
  "current_working_directory": str(Path.cwd()),
@@ -244,8 +243,6 @@ cache/
244
243
  "claude_config_locations": self._find_claude_config_locations(),
245
244
  }
246
245
 
247
- return info
248
-
249
246
  def cleanup_environment(self) -> Dict[str, Any]:
250
247
  """
251
248
  Clean up Claude environment variables.
@@ -257,9 +254,7 @@ cache/
257
254
 
258
255
  try:
259
256
  # Remove Claude-specific environment variables
260
- claude_vars = [
261
- key for key in os.environ.keys() if key.startswith("CLAUDE_")
262
- ]
257
+ claude_vars = [key for key in os.environ if key.startswith("CLAUDE_")]
263
258
 
264
259
  for var in claude_vars:
265
260
  if var in os.environ:
@@ -7,10 +7,9 @@ Extracted from AgentDeploymentService as part of the refactoring to improve
7
7
  maintainability and testability.
8
8
  """
9
9
 
10
- import logging
11
10
  import shutil
12
11
  from pathlib import Path
13
- from typing import Any, Dict, List, Optional
12
+ from typing import Any, Dict, Optional
14
13
 
15
14
  from claude_mpm.core.logging_config import get_logger
16
15
 
@@ -120,11 +119,10 @@ class AgentFileSystemManager:
120
119
  # MD file is newer or same age, skip conversion
121
120
  results["skipped"].append(yaml_file.name)
122
121
  continue
123
- else:
124
- # MD file is older, proceed with conversion
125
- self.logger.info(
126
- f"MD file {md_file.name} is older than YAML, converting..."
127
- )
122
+ # MD file is older, proceed with conversion
123
+ self.logger.info(
124
+ f"MD file {md_file.name} is older than YAML, converting..."
125
+ )
128
126
 
129
127
  # Read YAML content
130
128
  yaml_content = yaml_file.read_text()
@@ -353,7 +351,7 @@ class AgentFileSystemManager:
353
351
  tools_list = '["Read", "Write", "Edit"]'
354
352
 
355
353
  # Build Markdown with YAML frontmatter
356
- md_content = f"""---
354
+ return f"""---
357
355
  name: {name}
358
356
  description: "{description}"
359
357
  version: "{version}"
@@ -374,8 +372,6 @@ model: "sonnet"
374
372
  This agent provides specialized functionality for your tasks.
375
373
  """
376
374
 
377
- return md_content
378
-
379
375
  def _extract_yaml_field(self, yaml_content: str, field_name: str) -> Optional[str]:
380
376
  """Extract a field value from YAML content."""
381
377
  import re
@@ -7,11 +7,10 @@ Extracted from AgentDeploymentService as part of the refactoring to improve
7
7
  maintainability and testability.
8
8
  """
9
9
 
10
- import logging
11
10
  import re
12
11
  from datetime import datetime
13
12
  from pathlib import Path
14
- from typing import Any, Dict, List, Optional
13
+ from typing import Any, Dict, Optional
15
14
 
16
15
  from claude_mpm.core.logging_config import get_logger
17
16
 
@@ -67,11 +66,10 @@ class AgentFormatConverter:
67
66
  # MD file is newer or same age, skip conversion
68
67
  results["skipped"].append(yaml_file.name)
69
68
  continue
70
- else:
71
- # MD file is older, proceed with conversion
72
- self.logger.info(
73
- f"MD file {md_file.name} is older than YAML, converting..."
74
- )
69
+ # MD file is older, proceed with conversion
70
+ self.logger.info(
71
+ f"MD file {md_file.name} is older than YAML, converting..."
72
+ )
75
73
 
76
74
  # Read YAML content
77
75
  yaml_content = yaml_file.read_text()
@@ -248,7 +246,7 @@ model: "{model}"
248
246
 
249
247
  # Add instructions field if there's markdown content
250
248
  if markdown_content:
251
- frontmatter += f"\ninstructions: |\n"
249
+ frontmatter += "\ninstructions: |\n"
252
250
  # Indent markdown content
253
251
  for line in markdown_content.split("\n"):
254
252
  frontmatter += f" {line}\n"
@@ -269,13 +267,12 @@ model: "{model}"
269
267
 
270
268
  if content.startswith("---") and "---" in content[3:]:
271
269
  return "markdown_yaml"
272
- elif content.startswith("{") and content.endswith("}"):
270
+ if content.startswith("{") and content.endswith("}"):
273
271
  return "json"
274
- elif ":" in content and not content.startswith("#"):
272
+ if ":" in content and not content.startswith("#"):
275
273
  # Likely YAML if it has key-value pairs and doesn't start with markdown header
276
274
  return "yaml"
277
- else:
278
- return "unknown"
275
+ return "unknown"
279
276
 
280
277
  def normalize_agent_content(
281
278
  self, content: str, agent_name: str, target_format: str = "markdown_yaml"
@@ -307,10 +304,9 @@ model: "{model}"
307
304
  # Convert to target format
308
305
  if target_format == "yaml":
309
306
  return self.convert_md_to_yaml(intermediate)
310
- elif target_format == "json":
307
+ if target_format == "json":
311
308
  return self._convert_md_to_json(intermediate)
312
- else:
313
- return intermediate
309
+ return intermediate
314
310
 
315
311
  def get_conversion_stats(self, target_dir: Path) -> Dict[str, Any]:
316
312
  """
@@ -4,6 +4,7 @@ This module provides validation and repair functionality for agent frontmatter.
4
4
  Extracted from AgentDeploymentService to reduce complexity and improve maintainability.
5
5
  """
6
6
 
7
+ import contextlib
7
8
  import logging
8
9
  from pathlib import Path
9
10
  from typing import Any, Dict
@@ -139,10 +140,8 @@ class AgentFrontmatterValidator:
139
140
  )
140
141
  results["replaced"].append(agent_name)
141
142
  # Delete the file so it will be recreated
142
- try:
143
+ with contextlib.suppress(Exception):
143
144
  agent_file.unlink()
144
- except Exception:
145
- pass
146
145
 
147
146
  except Exception as e:
148
147
  error_msg = f"Failed to validate agent {agent_file.name}: {e}"
@@ -29,13 +29,13 @@ Created for ISS-0118: Agent Registry and Hierarchical Discovery System
29
29
  import asyncio
30
30
  import time
31
31
  from dataclasses import dataclass, field
32
- from datetime import datetime, timedelta
32
+ from datetime import datetime
33
33
  from enum import Enum
34
- from typing import Any, Dict, List, Optional, Set, Tuple, Union
34
+ from typing import Any, Dict, List, Optional
35
35
 
36
36
  from claude_mpm.core.base_service import BaseService
37
37
  from claude_mpm.core.unified_paths import get_path_manager
38
- from claude_mpm.models.agent_definition import AgentDefinition, AgentType
38
+ from claude_mpm.models.agent_definition import AgentDefinition
39
39
  from claude_mpm.services.agents.management import AgentManager
40
40
  from claude_mpm.services.agents.memory import (
41
41
  AgentPersistenceService,
@@ -43,7 +43,7 @@ from claude_mpm.services.agents.memory import (
43
43
  PersistenceRecord,
44
44
  PersistenceStrategy,
45
45
  )
46
- from claude_mpm.services.agents.registry import AgentMetadata, AgentRegistry
46
+ from claude_mpm.services.agents.registry import AgentRegistry
47
47
  from claude_mpm.services.agents.registry.modification_tracker import (
48
48
  AgentModification,
49
49
  AgentModificationTracker,
@@ -841,7 +841,7 @@ class AgentLifecycleManager(BaseService):
841
841
  patterns = [
842
842
  f"agent_profile:{agent_name}:*",
843
843
  f"task_prompt:{agent_name}:*",
844
- f"agent_registry_discovery",
844
+ "agent_registry_discovery",
845
845
  f"agent_profile_enhanced:{agent_name}:*",
846
846
  ]
847
847
 
@@ -7,10 +7,8 @@ Extracted from AgentDeploymentService as part of the refactoring to improve
7
7
  maintainability and testability.
8
8
  """
9
9
 
10
- import logging
11
10
  import time
12
- from collections import defaultdict
13
- from typing import Any, Dict, List
11
+ from typing import Any, Dict
14
12
 
15
13
  from claude_mpm.core.logging_config import get_logger
16
14
 
@@ -194,7 +192,7 @@ class AgentMetricsCollector:
194
192
  # Calculate additional performance metrics
195
193
  deployment_times = self._deployment_metrics["deployment_times"]
196
194
 
197
- performance_summary = {
195
+ return {
198
196
  "total_deployments": metrics["total_deployments"],
199
197
  "success_rate": metrics["success_rate_percent"],
200
198
  "average_time_ms": metrics["average_deployment_time_ms"],
@@ -205,8 +203,6 @@ class AgentMetricsCollector:
205
203
  "error_rate_percent": self._calculate_error_rate(),
206
204
  }
207
205
 
208
- return performance_summary
209
-
210
206
  def _categorize_error(self, error: str) -> str:
211
207
  """
212
208
  Categorize an error message into a type for tracking.
@@ -221,16 +217,15 @@ class AgentMetricsCollector:
221
217
 
222
218
  if "json" in error_lower or "parse" in error_lower:
223
219
  return "parsing_error"
224
- elif "file" in error_lower or "path" in error_lower:
220
+ if "file" in error_lower or "path" in error_lower:
225
221
  return "file_error"
226
- elif "version" in error_lower:
222
+ if "version" in error_lower:
227
223
  return "version_error"
228
- elif "template" in error_lower:
224
+ if "template" in error_lower:
229
225
  return "template_error"
230
- elif "validation" in error_lower:
226
+ if "validation" in error_lower:
231
227
  return "validation_error"
232
- else:
233
- return "other_error"
228
+ return "other_error"
234
229
 
235
230
  def _extract_agent_type(self, agent_name: str) -> str:
236
231
  """
@@ -247,18 +242,17 @@ class AgentMetricsCollector:
247
242
  # Common agent type patterns
248
243
  if "security" in name_lower:
249
244
  return "security"
250
- elif "qa" in name_lower or "test" in name_lower:
245
+ if "qa" in name_lower or "test" in name_lower:
251
246
  return "qa"
252
- elif "doc" in name_lower:
247
+ if "doc" in name_lower:
253
248
  return "documentation"
254
- elif "data" in name_lower:
249
+ if "data" in name_lower:
255
250
  return "data"
256
- elif "ops" in name_lower:
251
+ if "ops" in name_lower:
257
252
  return "operations"
258
- elif "research" in name_lower:
253
+ if "research" in name_lower:
259
254
  return "research"
260
- else:
261
- return "general"
255
+ return "general"
262
256
 
263
257
  def _get_most_common_agent_type(self) -> str:
264
258
  """Get the most commonly deployed agent type."""
@@ -12,7 +12,6 @@ from claude_mpm.core.path_ops import path_ops
12
12
  if TYPE_CHECKING:
13
13
  from .agent_lifecycle_manager import (
14
14
  AgentLifecycleManager,
15
- LifecycleOperation,
16
15
  LifecycleOperationResult,
17
16
  )
18
17
 
@@ -8,7 +8,6 @@ maintainability and testability.
8
8
  """
9
9
 
10
10
  import json
11
- import logging
12
11
  from pathlib import Path
13
12
  from typing import Any, Dict, List
14
13
 
@@ -31,7 +30,11 @@ class AgentTemplateBuilder:
31
30
  self.logger = get_logger(__name__)
32
31
 
33
32
  def build_agent_markdown(
34
- self, agent_name: str, template_path: Path, base_agent_data: dict, source_info: str = "unknown"
33
+ self,
34
+ agent_name: str,
35
+ template_path: Path,
36
+ base_agent_data: dict,
37
+ source_info: str = "unknown",
35
38
  ) -> str:
36
39
  """
37
40
  Build a complete agent markdown file with YAML frontmatter.
@@ -62,8 +65,10 @@ class AgentTemplateBuilder:
62
65
  # Extract tools from template with fallback
63
66
  # Handle both dict and list formats for capabilities (backward compatibility)
64
67
  capabilities = template_data.get("capabilities", {})
65
- capabilities_tools = capabilities.get("tools") if isinstance(capabilities, dict) else None
66
-
68
+ capabilities_tools = (
69
+ capabilities.get("tools") if isinstance(capabilities, dict) else None
70
+ )
71
+
67
72
  tools = (
68
73
  template_data.get("tools")
69
74
  or capabilities_tools
@@ -72,8 +77,10 @@ class AgentTemplateBuilder:
72
77
  )
73
78
 
74
79
  # Extract model from template with fallback
75
- capabilities_model = capabilities.get("model") if isinstance(capabilities, dict) else None
76
-
80
+ capabilities_model = (
81
+ capabilities.get("model") if isinstance(capabilities, dict) else None
82
+ )
83
+
77
84
  model = (
78
85
  template_data.get("model")
79
86
  or capabilities_model
@@ -82,10 +89,7 @@ class AgentTemplateBuilder:
82
89
  )
83
90
 
84
91
  # Convert tools list to comma-separated string (no spaces!)
85
- if isinstance(tools, list):
86
- tools_str = ",".join(tools)
87
- else:
88
- tools_str = str(tools)
92
+ tools_str = ",".join(tools) if isinstance(tools, list) else str(tools)
89
93
 
90
94
  # Validate tools format - CRITICAL: No spaces allowed!
91
95
  if ", " in tools_str:
@@ -110,7 +114,7 @@ class AgentTemplateBuilder:
110
114
  model = model_map[model]
111
115
 
112
116
  # Get response format from template or use base agent default
113
- response_format = template_data.get("response", {}).get("format", "structured")
117
+ template_data.get("response", {}).get("format", "structured")
114
118
 
115
119
  # Create Claude Code compatible name (lowercase, hyphens only)
116
120
  claude_code_name = agent_name.lower().replace("_", "-")
@@ -137,7 +141,11 @@ class AgentTemplateBuilder:
137
141
 
138
142
  # Extract custom metadata fields
139
143
  metadata = template_data.get("metadata", {})
140
- agent_version = template_data.get("agent_version") or template_data.get("version") or metadata.get("version", "1.0.0")
144
+ agent_version = (
145
+ template_data.get("agent_version")
146
+ or template_data.get("version")
147
+ or metadata.get("version", "1.0.0")
148
+ )
141
149
  agent_type = template_data.get("agent_type", "general")
142
150
  # Use the capabilities_model we already extracted earlier
143
151
  model_type = capabilities_model or "sonnet"
@@ -145,14 +153,14 @@ class AgentTemplateBuilder:
145
153
  # Map our model types to Claude Code format
146
154
  if model_type in ["opus", "sonnet", "haiku"]:
147
155
  # Use inherit for now - Claude Code seems to prefer this
148
- claude_model = "inherit"
156
+ pass
149
157
  else:
150
- claude_model = "inherit"
158
+ pass
151
159
 
152
160
  # Determine color - prefer template's color, fallback to type-based defaults
153
161
  template_metadata = template_data.get("metadata", {})
154
162
  template_color = template_metadata.get("color")
155
-
163
+
156
164
  if template_color:
157
165
  # Use the color specified in the template
158
166
  color = template_color
@@ -170,21 +178,6 @@ class AgentTemplateBuilder:
170
178
 
171
179
  # Check if we should include tools field (only if significantly restricting)
172
180
  # Claude Code approach: omit tools field unless specifically restricting
173
- all_available_tools = {
174
- "Read",
175
- "Write",
176
- "Edit",
177
- "MultiEdit",
178
- "Bash",
179
- "Grep",
180
- "Glob",
181
- "LS",
182
- "WebSearch",
183
- "WebFetch",
184
- "TodoWrite",
185
- "Task",
186
- "Memory",
187
- }
188
181
 
189
182
  # Convert tools to set for comparison
190
183
  agent_tools = set(tools) if isinstance(tools, list) else set(tools.split(","))
@@ -230,7 +223,7 @@ class AgentTemplateBuilder:
230
223
  or base_agent_data.get("instructions")
231
224
  or "# Agent Instructions\n\nThis agent provides specialized assistance."
232
225
  )
233
-
226
+
234
227
  # Add memory update instructions if not already present
235
228
  if "memory-update" not in content and "Remember" not in content:
236
229
  memory_instructions = """
@@ -296,7 +289,7 @@ Only include memories that are:
296
289
  raise
297
290
 
298
291
  # Merge narrative and configuration fields
299
- merged_narrative = self.merge_narrative_fields(base_agent_data, template_data)
292
+ self.merge_narrative_fields(base_agent_data, template_data)
300
293
  merged_config = self.merge_configuration_fields(base_agent_data, template_data)
301
294
 
302
295
  # Extract essential fields for Claude Code
@@ -313,15 +306,13 @@ Only include memories that are:
313
306
  tools_yaml = self.format_yaml_list(tools, 2)
314
307
 
315
308
  # Build YAML content with only essential fields
316
- yaml_content = f"""name: {name}
309
+ return f"""name: {name}
317
310
  description: {description}
318
311
  model: {model}
319
312
  tools:
320
313
  {tools_yaml}
321
314
  """
322
315
 
323
- return yaml_content
324
-
325
316
  def merge_narrative_fields(self, base_data: dict, template_data: dict) -> dict:
326
317
  """
327
318
  Merge narrative fields from base and template, combining arrays.
@@ -7,7 +7,6 @@ Extracted from AgentDeploymentService as part of the refactoring to improve
7
7
  maintainability and testability.
8
8
  """
9
9
 
10
- import logging
11
10
  import re
12
11
  from pathlib import Path
13
12
  from typing import Any, Dict, List, Optional, Tuple
@@ -7,10 +7,9 @@ Extracted from AgentDeploymentService as part of the refactoring to improve
7
7
  maintainability and testability.
8
8
  """
9
9
 
10
- import logging
11
10
  import re
12
11
  from pathlib import Path
13
- from typing import Any, Dict, Tuple
12
+ from typing import Any, Tuple
14
13
 
15
14
  from claude_mpm.core.logging_config import get_logger
16
15
 
@@ -83,9 +82,8 @@ class AgentVersionManager:
83
82
  if isinstance(version_tuple, tuple) and len(version_tuple) == 3:
84
83
  major, minor, patch = version_tuple
85
84
  return f"{major}.{minor}.{patch}"
86
- else:
87
- # Fallback for legacy format
88
- return str(version_tuple)
85
+ # Fallback for legacy format
86
+ return str(version_tuple)
89
87
 
90
88
  def is_old_version_format(self, version_str: str) -> bool:
91
89
  """
@@ -132,7 +130,7 @@ class AgentVersionManager:
132
130
  for a, b in zip(v1, v2):
133
131
  if a < b:
134
132
  return -1
135
- elif a > b:
133
+ if a > b:
136
134
  return 1
137
135
  return 0
138
136
 
@@ -256,9 +254,9 @@ class AgentVersionManager:
256
254
  # Extract agent version from template
257
255
  metadata = template_data.get("metadata", {})
258
256
  current_agent_version = self.parse_version(
259
- template_data.get("agent_version") or
260
- template_data.get("version") or
261
- metadata.get("version", 0)
257
+ template_data.get("agent_version")
258
+ or template_data.get("version")
259
+ or metadata.get("version", 0)
262
260
  )
263
261
 
264
262
  # If old format detected, always trigger update for migration
@@ -16,10 +16,10 @@ class AgentVersionManager:
16
16
 
17
17
  if change_type == "major":
18
18
  return f"{major + 1}.0.0"
19
- elif change_type == "minor":
19
+ if change_type == "minor":
20
20
  return f"{major}.{minor + 1}.0"
21
- else: # patch
22
- return f"{major}.{minor}.{patch + 1}"
21
+ # patch
22
+ return f"{major}.{minor}.{patch + 1}"
23
23
 
24
24
  def validate_version(self, version: str) -> bool:
25
25
  """Validate version format."""
@@ -27,10 +27,10 @@ class AgentsDirectoryResolver:
27
27
  def determine_agents_directory(self, target_dir: Optional[Path]) -> Path:
28
28
  """
29
29
  Determine the correct agents directory based on input.
30
-
30
+
31
31
  MODIFIED: Always deploy to project .claude/agents directory
32
32
  regardless of agent source (system, user, or project).
33
-
33
+
34
34
  This ensures all agents are deployed at the project level while
35
35
  maintaining discovery from both user (~/.claude-mpm) and project
36
36
  (.claude-mpm) directories.
@@ -53,12 +53,11 @@ class AgentsDirectoryResolver:
53
53
  if target_dir.name == "agents":
54
54
  # Already an agents directory, use as-is
55
55
  return target_dir
56
- elif target_dir.name == ".claude-mpm":
56
+ if target_dir.name == ".claude-mpm":
57
57
  # .claude-mpm directory, add agents subdirectory
58
58
  return target_dir / "agents"
59
- elif target_dir.name == ".claude":
59
+ if target_dir.name == ".claude":
60
60
  # .claude directory, add agents subdirectory
61
61
  return target_dir / "agents"
62
- else:
63
- # Assume it's a project directory, add .claude/agents
64
- return target_dir / ".claude" / "agents"
62
+ # Assume it's a project directory, add .claude/agents
63
+ return target_dir / ".claude" / "agents"