claude-mpm 4.1.0__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 (358) 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 +133 -58
  21. claude_mpm/agents/templates/web_ui.json +3 -3
  22. claude_mpm/cli/__init__.py +51 -46
  23. claude_mpm/cli/__main__.py +1 -1
  24. claude_mpm/cli/commands/__init__.py +10 -12
  25. claude_mpm/cli/commands/agent_manager.py +186 -181
  26. claude_mpm/cli/commands/agents.py +271 -268
  27. claude_mpm/cli/commands/aggregate.py +30 -29
  28. claude_mpm/cli/commands/cleanup.py +50 -44
  29. claude_mpm/cli/commands/cleanup_orphaned_agents.py +25 -25
  30. claude_mpm/cli/commands/config.py +162 -127
  31. claude_mpm/cli/commands/doctor.py +52 -62
  32. claude_mpm/cli/commands/info.py +37 -25
  33. claude_mpm/cli/commands/mcp.py +3 -7
  34. claude_mpm/cli/commands/mcp_command_router.py +14 -18
  35. claude_mpm/cli/commands/mcp_install_commands.py +28 -23
  36. claude_mpm/cli/commands/mcp_pipx_config.py +58 -49
  37. claude_mpm/cli/commands/mcp_server_commands.py +23 -17
  38. claude_mpm/cli/commands/memory.py +192 -141
  39. claude_mpm/cli/commands/monitor.py +117 -88
  40. claude_mpm/cli/commands/run.py +120 -84
  41. claude_mpm/cli/commands/run_config_checker.py +4 -5
  42. claude_mpm/cli/commands/socketio_monitor.py +17 -19
  43. claude_mpm/cli/commands/tickets.py +92 -92
  44. claude_mpm/cli/parser.py +1 -5
  45. claude_mpm/cli/parsers/__init__.py +1 -1
  46. claude_mpm/cli/parsers/agent_manager_parser.py +50 -98
  47. claude_mpm/cli/parsers/agents_parser.py +2 -3
  48. claude_mpm/cli/parsers/base_parser.py +7 -5
  49. claude_mpm/cli/parsers/mcp_parser.py +4 -2
  50. claude_mpm/cli/parsers/monitor_parser.py +26 -18
  51. claude_mpm/cli/shared/__init__.py +10 -10
  52. claude_mpm/cli/shared/argument_patterns.py +57 -71
  53. claude_mpm/cli/shared/base_command.py +61 -53
  54. claude_mpm/cli/shared/error_handling.py +62 -58
  55. claude_mpm/cli/shared/output_formatters.py +78 -77
  56. claude_mpm/cli/startup_logging.py +204 -172
  57. claude_mpm/cli/utils.py +10 -11
  58. claude_mpm/cli_module/__init__.py +1 -1
  59. claude_mpm/cli_module/args.py +1 -1
  60. claude_mpm/cli_module/migration_example.py +5 -5
  61. claude_mpm/config/__init__.py +9 -9
  62. claude_mpm/config/agent_config.py +15 -14
  63. claude_mpm/config/experimental_features.py +4 -4
  64. claude_mpm/config/paths.py +0 -1
  65. claude_mpm/config/socketio_config.py +5 -6
  66. claude_mpm/constants.py +1 -2
  67. claude_mpm/core/__init__.py +8 -8
  68. claude_mpm/core/agent_name_normalizer.py +1 -1
  69. claude_mpm/core/agent_registry.py +20 -23
  70. claude_mpm/core/agent_session_manager.py +3 -3
  71. claude_mpm/core/base_service.py +7 -15
  72. claude_mpm/core/cache.py +4 -6
  73. claude_mpm/core/claude_runner.py +85 -113
  74. claude_mpm/core/config.py +43 -28
  75. claude_mpm/core/config_aliases.py +0 -9
  76. claude_mpm/core/config_constants.py +52 -30
  77. claude_mpm/core/constants.py +0 -1
  78. claude_mpm/core/container.py +18 -27
  79. claude_mpm/core/exceptions.py +2 -2
  80. claude_mpm/core/factories.py +10 -12
  81. claude_mpm/core/framework_loader.py +581 -280
  82. claude_mpm/core/hook_manager.py +26 -22
  83. claude_mpm/core/hook_performance_config.py +58 -47
  84. claude_mpm/core/injectable_service.py +1 -1
  85. claude_mpm/core/interactive_session.py +61 -152
  86. claude_mpm/core/interfaces.py +1 -100
  87. claude_mpm/core/lazy.py +5 -5
  88. claude_mpm/core/log_manager.py +587 -0
  89. claude_mpm/core/logger.py +125 -8
  90. claude_mpm/core/logging_config.py +15 -15
  91. claude_mpm/core/minimal_framework_loader.py +5 -8
  92. claude_mpm/core/oneshot_session.py +15 -33
  93. claude_mpm/core/optimized_agent_loader.py +4 -6
  94. claude_mpm/core/optimized_startup.py +2 -1
  95. claude_mpm/core/output_style_manager.py +147 -106
  96. claude_mpm/core/pm_hook_interceptor.py +0 -1
  97. claude_mpm/core/service_registry.py +11 -8
  98. claude_mpm/core/session_manager.py +1 -2
  99. claude_mpm/core/shared/__init__.py +1 -1
  100. claude_mpm/core/shared/config_loader.py +101 -97
  101. claude_mpm/core/shared/path_resolver.py +72 -68
  102. claude_mpm/core/shared/singleton_manager.py +56 -50
  103. claude_mpm/core/socketio_pool.py +26 -6
  104. claude_mpm/core/tool_access_control.py +4 -5
  105. claude_mpm/core/typing_utils.py +50 -59
  106. claude_mpm/core/unified_agent_registry.py +14 -19
  107. claude_mpm/core/unified_config.py +4 -6
  108. claude_mpm/core/unified_paths.py +197 -109
  109. claude_mpm/dashboard/open_dashboard.py +2 -4
  110. claude_mpm/experimental/cli_enhancements.py +51 -36
  111. claude_mpm/generators/agent_profile_generator.py +2 -4
  112. claude_mpm/hooks/base_hook.py +1 -2
  113. claude_mpm/hooks/claude_hooks/connection_pool.py +72 -26
  114. claude_mpm/hooks/claude_hooks/event_handlers.py +93 -38
  115. claude_mpm/hooks/claude_hooks/hook_handler.py +130 -76
  116. claude_mpm/hooks/claude_hooks/hook_handler_eventbus.py +104 -77
  117. claude_mpm/hooks/claude_hooks/memory_integration.py +2 -4
  118. claude_mpm/hooks/claude_hooks/response_tracking.py +15 -11
  119. claude_mpm/hooks/claude_hooks/tool_analysis.py +12 -18
  120. claude_mpm/hooks/memory_integration_hook.py +5 -5
  121. claude_mpm/hooks/tool_call_interceptor.py +1 -1
  122. claude_mpm/hooks/validation_hooks.py +4 -4
  123. claude_mpm/init.py +4 -9
  124. claude_mpm/models/__init__.py +2 -2
  125. claude_mpm/models/agent_session.py +11 -14
  126. claude_mpm/scripts/mcp_server.py +20 -11
  127. claude_mpm/scripts/mcp_wrapper.py +5 -5
  128. claude_mpm/scripts/mpm_doctor.py +321 -0
  129. claude_mpm/scripts/socketio_daemon.py +28 -25
  130. claude_mpm/scripts/socketio_daemon_hardened.py +298 -258
  131. claude_mpm/scripts/socketio_server_manager.py +116 -95
  132. claude_mpm/services/__init__.py +49 -49
  133. claude_mpm/services/agent_capabilities_service.py +12 -18
  134. claude_mpm/services/agents/__init__.py +22 -22
  135. claude_mpm/services/agents/agent_builder.py +140 -119
  136. claude_mpm/services/agents/deployment/__init__.py +3 -3
  137. claude_mpm/services/agents/deployment/agent_config_provider.py +9 -9
  138. claude_mpm/services/agents/deployment/agent_configuration_manager.py +19 -20
  139. claude_mpm/services/agents/deployment/agent_definition_factory.py +1 -5
  140. claude_mpm/services/agents/deployment/agent_deployment.py +136 -106
  141. claude_mpm/services/agents/deployment/agent_discovery_service.py +4 -8
  142. claude_mpm/services/agents/deployment/agent_environment_manager.py +2 -7
  143. claude_mpm/services/agents/deployment/agent_filesystem_manager.py +6 -10
  144. claude_mpm/services/agents/deployment/agent_format_converter.py +11 -15
  145. claude_mpm/services/agents/deployment/agent_frontmatter_validator.py +2 -3
  146. claude_mpm/services/agents/deployment/agent_lifecycle_manager.py +5 -5
  147. claude_mpm/services/agents/deployment/agent_metrics_collector.py +13 -19
  148. claude_mpm/services/agents/deployment/agent_restore_handler.py +0 -1
  149. claude_mpm/services/agents/deployment/agent_template_builder.py +26 -35
  150. claude_mpm/services/agents/deployment/agent_validator.py +0 -1
  151. claude_mpm/services/agents/deployment/agent_version_manager.py +7 -9
  152. claude_mpm/services/agents/deployment/agent_versioning.py +3 -3
  153. claude_mpm/services/agents/deployment/agents_directory_resolver.py +6 -7
  154. claude_mpm/services/agents/deployment/async_agent_deployment.py +51 -38
  155. claude_mpm/services/agents/deployment/config/__init__.py +1 -1
  156. claude_mpm/services/agents/deployment/config/deployment_config.py +7 -8
  157. claude_mpm/services/agents/deployment/deployment_type_detector.py +1 -1
  158. claude_mpm/services/agents/deployment/deployment_wrapper.py +18 -18
  159. claude_mpm/services/agents/deployment/facade/__init__.py +1 -1
  160. claude_mpm/services/agents/deployment/facade/deployment_executor.py +0 -3
  161. claude_mpm/services/agents/deployment/facade/deployment_facade.py +3 -4
  162. claude_mpm/services/agents/deployment/interface_adapter.py +5 -7
  163. claude_mpm/services/agents/deployment/multi_source_deployment_service.py +345 -276
  164. claude_mpm/services/agents/deployment/pipeline/__init__.py +2 -2
  165. claude_mpm/services/agents/deployment/pipeline/pipeline_builder.py +1 -1
  166. claude_mpm/services/agents/deployment/pipeline/pipeline_context.py +6 -4
  167. claude_mpm/services/agents/deployment/pipeline/pipeline_executor.py +3 -3
  168. claude_mpm/services/agents/deployment/pipeline/steps/__init__.py +2 -2
  169. claude_mpm/services/agents/deployment/pipeline/steps/agent_processing_step.py +14 -13
  170. claude_mpm/services/agents/deployment/pipeline/steps/base_step.py +0 -1
  171. claude_mpm/services/agents/deployment/pipeline/steps/configuration_step.py +1 -1
  172. claude_mpm/services/agents/deployment/pipeline/steps/target_directory_step.py +8 -9
  173. claude_mpm/services/agents/deployment/pipeline/steps/validation_step.py +1 -1
  174. claude_mpm/services/agents/deployment/processors/__init__.py +1 -1
  175. claude_mpm/services/agents/deployment/processors/agent_processor.py +20 -16
  176. claude_mpm/services/agents/deployment/refactored_agent_deployment_service.py +5 -12
  177. claude_mpm/services/agents/deployment/results/__init__.py +1 -1
  178. claude_mpm/services/agents/deployment/results/deployment_result_builder.py +1 -1
  179. claude_mpm/services/agents/deployment/strategies/__init__.py +2 -2
  180. claude_mpm/services/agents/deployment/strategies/base_strategy.py +1 -7
  181. claude_mpm/services/agents/deployment/strategies/project_strategy.py +1 -4
  182. claude_mpm/services/agents/deployment/strategies/system_strategy.py +2 -3
  183. claude_mpm/services/agents/deployment/strategies/user_strategy.py +3 -7
  184. claude_mpm/services/agents/deployment/validation/__init__.py +1 -1
  185. claude_mpm/services/agents/deployment/validation/agent_validator.py +1 -1
  186. claude_mpm/services/agents/deployment/validation/template_validator.py +2 -2
  187. claude_mpm/services/agents/deployment/validation/validation_result.py +2 -6
  188. claude_mpm/services/agents/loading/__init__.py +1 -1
  189. claude_mpm/services/agents/loading/agent_profile_loader.py +6 -12
  190. claude_mpm/services/agents/loading/base_agent_manager.py +5 -5
  191. claude_mpm/services/agents/loading/framework_agent_loader.py +2 -4
  192. claude_mpm/services/agents/management/__init__.py +1 -1
  193. claude_mpm/services/agents/management/agent_capabilities_generator.py +1 -3
  194. claude_mpm/services/agents/management/agent_management_service.py +5 -9
  195. claude_mpm/services/agents/memory/__init__.py +4 -4
  196. claude_mpm/services/agents/memory/agent_memory_manager.py +280 -160
  197. claude_mpm/services/agents/memory/agent_persistence_service.py +0 -2
  198. claude_mpm/services/agents/memory/content_manager.py +44 -38
  199. claude_mpm/services/agents/memory/template_generator.py +4 -6
  200. claude_mpm/services/agents/registry/__init__.py +10 -6
  201. claude_mpm/services/agents/registry/deployed_agent_discovery.py +30 -27
  202. claude_mpm/services/agents/registry/modification_tracker.py +3 -6
  203. claude_mpm/services/async_session_logger.py +1 -2
  204. claude_mpm/services/claude_session_logger.py +1 -2
  205. claude_mpm/services/command_deployment_service.py +173 -0
  206. claude_mpm/services/command_handler_service.py +20 -22
  207. claude_mpm/services/core/__init__.py +25 -25
  208. claude_mpm/services/core/base.py +0 -5
  209. claude_mpm/services/core/interfaces/__init__.py +32 -32
  210. claude_mpm/services/core/interfaces/agent.py +0 -21
  211. claude_mpm/services/core/interfaces/communication.py +0 -27
  212. claude_mpm/services/core/interfaces/infrastructure.py +0 -56
  213. claude_mpm/services/core/interfaces/service.py +0 -29
  214. claude_mpm/services/diagnostics/__init__.py +1 -1
  215. claude_mpm/services/diagnostics/checks/__init__.py +6 -6
  216. claude_mpm/services/diagnostics/checks/agent_check.py +89 -80
  217. claude_mpm/services/diagnostics/checks/base_check.py +12 -16
  218. claude_mpm/services/diagnostics/checks/claude_desktop_check.py +84 -81
  219. claude_mpm/services/diagnostics/checks/common_issues_check.py +99 -91
  220. claude_mpm/services/diagnostics/checks/configuration_check.py +82 -77
  221. claude_mpm/services/diagnostics/checks/filesystem_check.py +67 -68
  222. claude_mpm/services/diagnostics/checks/installation_check.py +254 -94
  223. claude_mpm/services/diagnostics/checks/mcp_check.py +90 -88
  224. claude_mpm/services/diagnostics/checks/monitor_check.py +75 -76
  225. claude_mpm/services/diagnostics/checks/startup_log_check.py +67 -73
  226. claude_mpm/services/diagnostics/diagnostic_runner.py +67 -59
  227. claude_mpm/services/diagnostics/doctor_reporter.py +107 -70
  228. claude_mpm/services/diagnostics/models.py +21 -19
  229. claude_mpm/services/event_aggregator.py +10 -17
  230. claude_mpm/services/event_bus/__init__.py +1 -1
  231. claude_mpm/services/event_bus/config.py +54 -35
  232. claude_mpm/services/event_bus/event_bus.py +76 -71
  233. claude_mpm/services/event_bus/relay.py +74 -64
  234. claude_mpm/services/events/__init__.py +11 -11
  235. claude_mpm/services/events/consumers/__init__.py +3 -3
  236. claude_mpm/services/events/consumers/dead_letter.py +71 -63
  237. claude_mpm/services/events/consumers/logging.py +39 -37
  238. claude_mpm/services/events/consumers/metrics.py +56 -57
  239. claude_mpm/services/events/consumers/socketio.py +82 -81
  240. claude_mpm/services/events/core.py +110 -99
  241. claude_mpm/services/events/interfaces.py +56 -72
  242. claude_mpm/services/events/producers/__init__.py +1 -1
  243. claude_mpm/services/events/producers/hook.py +38 -38
  244. claude_mpm/services/events/producers/system.py +46 -44
  245. claude_mpm/services/exceptions.py +81 -80
  246. claude_mpm/services/framework_claude_md_generator/__init__.py +2 -4
  247. claude_mpm/services/framework_claude_md_generator/content_assembler.py +3 -5
  248. claude_mpm/services/framework_claude_md_generator/content_validator.py +1 -1
  249. claude_mpm/services/framework_claude_md_generator/deployment_manager.py +4 -4
  250. claude_mpm/services/framework_claude_md_generator/section_generators/__init__.py +0 -1
  251. claude_mpm/services/framework_claude_md_generator/section_generators/agents.py +0 -2
  252. claude_mpm/services/framework_claude_md_generator/version_manager.py +4 -5
  253. claude_mpm/services/hook_service.py +6 -9
  254. claude_mpm/services/infrastructure/__init__.py +1 -1
  255. claude_mpm/services/infrastructure/context_preservation.py +8 -12
  256. claude_mpm/services/infrastructure/monitoring.py +21 -23
  257. claude_mpm/services/mcp_gateway/__init__.py +37 -37
  258. claude_mpm/services/mcp_gateway/auto_configure.py +95 -103
  259. claude_mpm/services/mcp_gateway/config/__init__.py +1 -1
  260. claude_mpm/services/mcp_gateway/config/config_loader.py +23 -25
  261. claude_mpm/services/mcp_gateway/config/config_schema.py +5 -5
  262. claude_mpm/services/mcp_gateway/config/configuration.py +9 -6
  263. claude_mpm/services/mcp_gateway/core/__init__.py +10 -10
  264. claude_mpm/services/mcp_gateway/core/base.py +0 -3
  265. claude_mpm/services/mcp_gateway/core/interfaces.py +1 -38
  266. claude_mpm/services/mcp_gateway/core/process_pool.py +99 -93
  267. claude_mpm/services/mcp_gateway/core/singleton_manager.py +65 -62
  268. claude_mpm/services/mcp_gateway/core/startup_verification.py +75 -74
  269. claude_mpm/services/mcp_gateway/main.py +2 -1
  270. claude_mpm/services/mcp_gateway/registry/service_registry.py +5 -8
  271. claude_mpm/services/mcp_gateway/registry/tool_registry.py +1 -1
  272. claude_mpm/services/mcp_gateway/server/__init__.py +1 -1
  273. claude_mpm/services/mcp_gateway/server/mcp_gateway.py +12 -19
  274. claude_mpm/services/mcp_gateway/server/stdio_handler.py +4 -3
  275. claude_mpm/services/mcp_gateway/server/stdio_server.py +79 -71
  276. claude_mpm/services/mcp_gateway/tools/__init__.py +2 -2
  277. claude_mpm/services/mcp_gateway/tools/base_adapter.py +5 -6
  278. claude_mpm/services/mcp_gateway/tools/document_summarizer.py +13 -22
  279. claude_mpm/services/mcp_gateway/tools/health_check_tool.py +79 -78
  280. claude_mpm/services/mcp_gateway/tools/hello_world.py +12 -14
  281. claude_mpm/services/mcp_gateway/tools/ticket_tools.py +42 -49
  282. claude_mpm/services/mcp_gateway/tools/unified_ticket_tool.py +51 -55
  283. claude_mpm/services/memory/__init__.py +3 -3
  284. claude_mpm/services/memory/builder.py +3 -6
  285. claude_mpm/services/memory/cache/__init__.py +1 -1
  286. claude_mpm/services/memory/cache/shared_prompt_cache.py +3 -5
  287. claude_mpm/services/memory/cache/simple_cache.py +1 -1
  288. claude_mpm/services/memory/indexed_memory.py +5 -7
  289. claude_mpm/services/memory/optimizer.py +7 -10
  290. claude_mpm/services/memory/router.py +8 -9
  291. claude_mpm/services/memory_hook_service.py +48 -34
  292. claude_mpm/services/monitor_build_service.py +77 -73
  293. claude_mpm/services/port_manager.py +130 -108
  294. claude_mpm/services/project/analyzer.py +12 -10
  295. claude_mpm/services/project/registry.py +11 -11
  296. claude_mpm/services/recovery_manager.py +10 -19
  297. claude_mpm/services/response_tracker.py +0 -1
  298. claude_mpm/services/runner_configuration_service.py +19 -20
  299. claude_mpm/services/session_management_service.py +7 -11
  300. claude_mpm/services/shared/__init__.py +1 -1
  301. claude_mpm/services/shared/async_service_base.py +58 -50
  302. claude_mpm/services/shared/config_service_base.py +73 -67
  303. claude_mpm/services/shared/lifecycle_service_base.py +82 -78
  304. claude_mpm/services/shared/manager_base.py +94 -82
  305. claude_mpm/services/shared/service_factory.py +96 -98
  306. claude_mpm/services/socketio/__init__.py +3 -3
  307. claude_mpm/services/socketio/client_proxy.py +5 -5
  308. claude_mpm/services/socketio/event_normalizer.py +199 -181
  309. claude_mpm/services/socketio/handlers/__init__.py +3 -3
  310. claude_mpm/services/socketio/handlers/base.py +5 -4
  311. claude_mpm/services/socketio/handlers/connection.py +163 -136
  312. claude_mpm/services/socketio/handlers/file.py +13 -14
  313. claude_mpm/services/socketio/handlers/git.py +12 -7
  314. claude_mpm/services/socketio/handlers/hook.py +49 -44
  315. claude_mpm/services/socketio/handlers/memory.py +0 -1
  316. claude_mpm/services/socketio/handlers/project.py +0 -1
  317. claude_mpm/services/socketio/handlers/registry.py +37 -19
  318. claude_mpm/services/socketio/migration_utils.py +98 -84
  319. claude_mpm/services/socketio/server/__init__.py +1 -1
  320. claude_mpm/services/socketio/server/broadcaster.py +81 -87
  321. claude_mpm/services/socketio/server/core.py +65 -54
  322. claude_mpm/services/socketio/server/eventbus_integration.py +95 -56
  323. claude_mpm/services/socketio/server/main.py +64 -38
  324. claude_mpm/services/socketio_client_manager.py +10 -12
  325. claude_mpm/services/subprocess_launcher_service.py +4 -7
  326. claude_mpm/services/system_instructions_service.py +13 -14
  327. claude_mpm/services/ticket_manager.py +2 -2
  328. claude_mpm/services/utility_service.py +5 -13
  329. claude_mpm/services/version_control/__init__.py +16 -16
  330. claude_mpm/services/version_control/branch_strategy.py +5 -8
  331. claude_mpm/services/version_control/conflict_resolution.py +9 -23
  332. claude_mpm/services/version_control/git_operations.py +5 -7
  333. claude_mpm/services/version_control/semantic_versioning.py +16 -17
  334. claude_mpm/services/version_control/version_parser.py +13 -18
  335. claude_mpm/services/version_service.py +10 -11
  336. claude_mpm/storage/__init__.py +1 -1
  337. claude_mpm/storage/state_storage.py +22 -28
  338. claude_mpm/utils/__init__.py +6 -6
  339. claude_mpm/utils/agent_dependency_loader.py +47 -33
  340. claude_mpm/utils/config_manager.py +11 -14
  341. claude_mpm/utils/dependency_cache.py +1 -1
  342. claude_mpm/utils/dependency_manager.py +13 -17
  343. claude_mpm/utils/dependency_strategies.py +8 -10
  344. claude_mpm/utils/environment_context.py +3 -9
  345. claude_mpm/utils/error_handler.py +3 -13
  346. claude_mpm/utils/file_utils.py +1 -1
  347. claude_mpm/utils/path_operations.py +8 -12
  348. claude_mpm/utils/robust_installer.py +110 -33
  349. claude_mpm/utils/subprocess_utils.py +5 -6
  350. claude_mpm/validation/agent_validator.py +3 -6
  351. claude_mpm/validation/frontmatter_validator.py +1 -1
  352. {claude_mpm-4.1.0.dist-info → claude_mpm-4.1.2.dist-info}/METADATA +1 -1
  353. claude_mpm-4.1.2.dist-info/RECORD +498 -0
  354. claude_mpm-4.1.0.dist-info/RECORD +0 -494
  355. {claude_mpm-4.1.0.dist-info → claude_mpm-4.1.2.dist-info}/WHEEL +0 -0
  356. {claude_mpm-4.1.0.dist-info → claude_mpm-4.1.2.dist-info}/entry_points.txt +0 -0
  357. {claude_mpm-4.1.0.dist-info → claude_mpm-4.1.2.dist-info}/licenses/LICENSE +0 -0
  358. {claude_mpm-4.1.0.dist-info → claude_mpm-4.1.2.dist-info}/top_level.txt +0 -0
@@ -11,11 +11,8 @@ This service handles:
11
11
  Extracted from ClaudeRunner to follow Single Responsibility Principle.
12
12
  """
13
13
 
14
- import logging
15
- from typing import Dict, Optional
16
14
 
17
15
  from claude_mpm.core.base_service import BaseService
18
- from claude_mpm.core.logging_config import get_logger
19
16
  from claude_mpm.services.core.interfaces import AgentCapabilitiesInterface
20
17
 
21
18
 
@@ -28,11 +25,9 @@ class AgentCapabilitiesService(BaseService, AgentCapabilitiesInterface):
28
25
 
29
26
  async def _initialize(self) -> None:
30
27
  """Initialize the service. No special initialization needed."""
31
- pass
32
28
 
33
29
  async def _cleanup(self) -> None:
34
30
  """Cleanup service resources. No cleanup needed."""
35
- pass
36
31
 
37
32
  def generate_agent_capabilities(self, agent_type: str = "general") -> str:
38
33
  """Generate formatted agent capabilities for Claude.
@@ -108,7 +103,7 @@ class AgentCapabilitiesService(BaseService, AgentCapabilitiesInterface):
108
103
 
109
104
  # Group agents by category
110
105
  agents_by_category = {}
111
- for agent_id, agent_info in discovered_agents.items():
106
+ for _agent_id, agent_info in discovered_agents.items():
112
107
  category = agent_info["category"]
113
108
  if category not in agents_by_category:
114
109
  agents_by_category[category] = []
@@ -155,9 +150,9 @@ class AgentCapabilitiesService(BaseService, AgentCapabilitiesInterface):
155
150
 
156
151
  self.logger.info(
157
152
  f"Generated capabilities for {len(discovered_agents)} agents "
158
- + f"(project: {tier_counts.get('project', 0)}, "
159
- + f"user: {tier_counts.get('user', 0)}, "
160
- + f"system: {tier_counts.get('system', 0)})"
153
+ f"(project: {tier_counts.get('project', 0)}, "
154
+ f"user: {tier_counts.get('user', 0)}, "
155
+ f"system: {tier_counts.get('system', 0)})"
161
156
  )
162
157
  return section
163
158
 
@@ -227,30 +222,29 @@ class AgentCapabilitiesService(BaseService, AgentCapabilitiesInterface):
227
222
 
228
223
  if "engineer" in agent_id_lower or "engineering" in content_lower:
229
224
  return "Development"
230
- elif "research" in agent_id_lower or "research" in content_lower:
225
+ if "research" in agent_id_lower or "research" in content_lower:
231
226
  return "Research"
232
- elif (
227
+ if (
233
228
  "qa" in agent_id_lower
234
229
  or "test" in agent_id_lower
235
230
  or "quality" in content_lower
236
231
  ):
237
232
  return "Quality Assurance"
238
- elif "doc" in agent_id_lower or "documentation" in content_lower:
233
+ if "doc" in agent_id_lower or "documentation" in content_lower:
239
234
  return "Documentation"
240
- elif "security" in agent_id_lower or "security" in content_lower:
235
+ if "security" in agent_id_lower or "security" in content_lower:
241
236
  return "Security"
242
- elif "data" in agent_id_lower or "database" in content_lower:
237
+ if "data" in agent_id_lower or "database" in content_lower:
243
238
  return "Data"
244
- elif (
239
+ if (
245
240
  "ops" in agent_id_lower
246
241
  or "deploy" in agent_id_lower
247
242
  or "operations" in content_lower
248
243
  ):
249
244
  return "Operations"
250
- elif "git" in agent_id_lower or "version" in content_lower:
245
+ if "git" in agent_id_lower or "version" in content_lower:
251
246
  return "Version Control"
252
- else:
253
- return "General"
247
+ return "General"
254
248
 
255
249
  def _get_fallback_capabilities(self) -> str:
256
250
  """Return fallback agent capabilities when deployed agents can't be read."""
@@ -40,37 +40,37 @@ from .registry.modification_tracker import (
40
40
  )
41
41
 
42
42
  __all__ = [
43
+ "AgentCapabilitiesGenerator",
44
+ # Deployment
45
+ "AgentDeploymentService",
46
+ "AgentLifecycleManager",
47
+ "AgentLifecycleRecord",
48
+ # Management
49
+ "AgentManager",
50
+ # Memory
51
+ "AgentMemoryManager",
52
+ "AgentMetadata",
53
+ "AgentModification",
54
+ "AgentModificationTracker",
55
+ "AgentPersistenceService",
56
+ "AgentProfileLoader",
43
57
  # Registry
44
58
  "AgentRegistry",
45
- "AgentMetadata",
46
59
  "AgentTier",
47
60
  "AgentType",
61
+ "AgentVersionManager",
62
+ "BaseAgentManager",
48
63
  "DeployedAgentDiscovery",
49
- "AgentModificationTracker",
50
- "ModificationType",
51
- "ModificationTier",
52
- "AgentModification",
53
- "ModificationHistory",
54
64
  # Loading
55
65
  "FrameworkAgentLoader",
56
- "AgentProfileLoader",
57
- "BaseAgentManager",
58
- # Deployment
59
- "AgentDeploymentService",
60
- "AgentLifecycleManager",
61
- "LifecycleState",
62
66
  "LifecycleOperation",
63
- "AgentLifecycleRecord",
64
67
  "LifecycleOperationResult",
65
- "AgentVersionManager",
66
- # Memory
67
- "AgentMemoryManager",
68
- "get_memory_manager",
69
- "AgentPersistenceService",
70
- "PersistenceStrategy",
68
+ "LifecycleState",
69
+ "ModificationHistory",
70
+ "ModificationTier",
71
+ "ModificationType",
71
72
  "PersistenceOperation",
72
73
  "PersistenceRecord",
73
- # Management
74
- "AgentManager",
75
- "AgentCapabilitiesGenerator",
74
+ "PersistenceStrategy",
75
+ "get_memory_manager",
76
76
  ]
@@ -9,7 +9,6 @@ This service provides comprehensive agent lifecycle management including:
9
9
  """
10
10
 
11
11
  import json
12
- import logging
13
12
  import re
14
13
  from datetime import datetime
15
14
  from pathlib import Path
@@ -21,29 +20,38 @@ from claude_mpm.core.logging_config import get_logger
21
20
 
22
21
  class AgentBuilderService:
23
22
  """Service for building and managing agent configurations."""
24
-
23
+
25
24
  # Valid agent models
26
25
  VALID_MODELS = ["sonnet", "opus", "haiku"]
27
-
26
+
28
27
  # Valid tool choices
29
28
  VALID_TOOL_CHOICES = ["auto", "required", "any", "none"]
30
-
29
+
31
30
  # Agent categories
32
31
  AGENT_CATEGORIES = [
33
- "engineering", "qa", "documentation", "ops",
34
- "research", "security", "system", "utility"
32
+ "engineering",
33
+ "qa",
34
+ "documentation",
35
+ "ops",
36
+ "research",
37
+ "security",
38
+ "system",
39
+ "utility",
35
40
  ]
36
-
41
+
37
42
  def __init__(self, templates_dir: Optional[Path] = None):
38
43
  """Initialize the Agent Builder Service.
39
-
44
+
40
45
  Args:
41
46
  templates_dir: Path to agent templates directory
42
47
  """
43
48
  self.logger = get_logger(__name__)
44
- self.templates_dir = templates_dir or Path(__file__).parent.parent.parent / "agents" / "templates"
49
+ self.templates_dir = (
50
+ templates_dir
51
+ or Path(__file__).parent.parent.parent / "agents" / "templates"
52
+ )
45
53
  self._template_cache = {}
46
-
54
+
47
55
  def create_agent(
48
56
  self,
49
57
  agent_id: str,
@@ -53,10 +61,10 @@ class AgentBuilderService:
53
61
  tool_choice: str = "auto",
54
62
  instructions: Optional[str] = None,
55
63
  metadata: Optional[Dict[str, Any]] = None,
56
- base_template: Optional[str] = None
64
+ base_template: Optional[str] = None,
57
65
  ) -> Dict[str, Any]:
58
66
  """Create a new agent configuration.
59
-
67
+
60
68
  Args:
61
69
  agent_id: Unique identifier for the agent
62
70
  name: Display name for the agent
@@ -66,10 +74,10 @@ class AgentBuilderService:
66
74
  instructions: Markdown instructions content
67
75
  metadata: Additional agent metadata
68
76
  base_template: Optional base template to extend
69
-
77
+
70
78
  Returns:
71
79
  Complete agent configuration dictionary
72
-
80
+
73
81
  Raises:
74
82
  AgentDeploymentError: If validation fails
75
83
  """
@@ -77,79 +85,83 @@ class AgentBuilderService:
77
85
  self._validate_agent_id(agent_id)
78
86
  self._validate_model(model)
79
87
  self._validate_tool_choice(tool_choice)
80
-
88
+
81
89
  # Start with base template if provided
82
90
  if base_template:
83
91
  config = self._load_template(base_template)
84
92
  config["id"] = agent_id # Override ID
85
93
  else:
86
94
  config = {}
87
-
95
+
88
96
  # Build agent configuration
89
- config.update({
90
- "id": agent_id,
91
- "name": name,
92
- "prompt": f"{agent_id}.md",
93
- "model": model,
94
- "tool_choice": tool_choice
95
- })
96
-
97
+ config.update(
98
+ {
99
+ "id": agent_id,
100
+ "name": name,
101
+ "prompt": f"{agent_id}.md",
102
+ "model": model,
103
+ "tool_choice": tool_choice,
104
+ }
105
+ )
106
+
97
107
  # Build metadata
98
108
  agent_metadata = {
99
109
  "description": description,
100
110
  "version": "1.0.0",
101
111
  "created": datetime.now().isoformat(),
102
112
  "author": "Agent Manager",
103
- "category": "custom"
113
+ "category": "custom",
104
114
  }
105
-
115
+
106
116
  if metadata:
107
117
  agent_metadata.update(metadata)
108
-
118
+
109
119
  config["metadata"] = agent_metadata
110
-
120
+
111
121
  # Generate instructions if not provided
112
122
  if instructions is None:
113
- instructions = self._generate_default_instructions(agent_id, name, description)
114
-
123
+ instructions = self._generate_default_instructions(
124
+ agent_id, name, description
125
+ )
126
+
115
127
  return config, instructions
116
-
128
+
117
129
  def create_variant(
118
130
  self,
119
131
  base_agent_id: str,
120
132
  variant_id: str,
121
133
  variant_name: str,
122
134
  modifications: Dict[str, Any],
123
- instructions_append: Optional[str] = None
135
+ instructions_append: Optional[str] = None,
124
136
  ) -> Tuple[Dict[str, Any], str]:
125
137
  """Create an agent variant based on an existing agent.
126
-
138
+
127
139
  Args:
128
140
  base_agent_id: ID of the base agent to extend
129
141
  variant_id: Unique ID for the variant
130
142
  variant_name: Display name for the variant
131
143
  modifications: Configuration changes for the variant
132
144
  instructions_append: Additional instructions to append
133
-
145
+
134
146
  Returns:
135
147
  Tuple of (variant configuration, variant instructions)
136
-
148
+
137
149
  Raises:
138
150
  AgentDeploymentError: If base agent not found or validation fails
139
151
  """
140
152
  # Load base agent
141
153
  base_config = self._load_template(base_agent_id)
142
154
  base_instructions = self._load_instructions(base_agent_id)
143
-
155
+
144
156
  # Validate variant ID
145
157
  self._validate_agent_id(variant_id)
146
-
158
+
147
159
  # Create variant configuration
148
160
  variant_config = base_config.copy()
149
161
  variant_config["id"] = variant_id
150
162
  variant_config["name"] = variant_name
151
163
  variant_config["prompt"] = f"{variant_id}.md"
152
-
164
+
153
165
  # Apply modifications
154
166
  for key, value in modifications.items():
155
167
  if key in ["model", "tool_choice"]:
@@ -158,165 +170,170 @@ class AgentBuilderService:
158
170
  elif key == "tool_choice":
159
171
  self._validate_tool_choice(value)
160
172
  variant_config[key] = value
161
-
173
+
162
174
  # Update metadata
163
175
  if "metadata" not in variant_config:
164
176
  variant_config["metadata"] = {}
165
-
166
- variant_config["metadata"].update({
167
- "base_agent": base_agent_id,
168
- "variant": True,
169
- "variant_created": datetime.now().isoformat()
170
- })
171
-
177
+
178
+ variant_config["metadata"].update(
179
+ {
180
+ "base_agent": base_agent_id,
181
+ "variant": True,
182
+ "variant_created": datetime.now().isoformat(),
183
+ }
184
+ )
185
+
172
186
  # Build variant instructions
173
187
  variant_instructions = f"# {variant_name} (Variant of {base_config.get('name', base_agent_id)})\n\n"
174
188
  variant_instructions += base_instructions
175
-
189
+
176
190
  if instructions_append:
177
- variant_instructions += f"\n\n## Variant-Specific Instructions\n\n{instructions_append}"
178
-
191
+ variant_instructions += (
192
+ f"\n\n## Variant-Specific Instructions\n\n{instructions_append}"
193
+ )
194
+
179
195
  return variant_config, variant_instructions
180
-
196
+
181
197
  def validate_configuration(self, config: Dict[str, Any]) -> List[str]:
182
198
  """Validate an agent configuration.
183
-
199
+
184
200
  Args:
185
201
  config: Agent configuration to validate
186
-
202
+
187
203
  Returns:
188
204
  List of validation errors (empty if valid)
189
205
  """
190
206
  errors = []
191
-
207
+
192
208
  # Required fields
193
209
  required_fields = ["id", "name", "prompt", "model"]
194
210
  for field in required_fields:
195
211
  if field not in config:
196
212
  errors.append(f"Missing required field: {field}")
197
-
213
+
198
214
  # Validate ID
199
215
  if "id" in config:
200
216
  try:
201
217
  self._validate_agent_id(config["id"])
202
218
  except AgentDeploymentError as e:
203
219
  errors.append(str(e))
204
-
220
+
205
221
  # Validate model
206
222
  if "model" in config:
207
223
  try:
208
224
  self._validate_model(config["model"])
209
225
  except AgentDeploymentError as e:
210
226
  errors.append(str(e))
211
-
227
+
212
228
  # Validate tool_choice
213
229
  if "tool_choice" in config:
214
230
  try:
215
231
  self._validate_tool_choice(config["tool_choice"])
216
232
  except AgentDeploymentError as e:
217
233
  errors.append(str(e))
218
-
234
+
219
235
  # Validate metadata
220
- if "metadata" in config:
221
- if not isinstance(config["metadata"], dict):
222
- errors.append("Metadata must be a dictionary")
223
-
236
+ if "metadata" in config and not isinstance(config["metadata"], dict):
237
+ errors.append("Metadata must be a dictionary")
238
+
224
239
  return errors
225
-
240
+
226
241
  def generate_pm_instructions(
227
242
  self,
228
243
  delegation_patterns: Optional[List[str]] = None,
229
244
  workflow_overrides: Optional[Dict[str, str]] = None,
230
- custom_rules: Optional[List[str]] = None
245
+ custom_rules: Optional[List[str]] = None,
231
246
  ) -> str:
232
247
  """Generate customized PM instructions.
233
-
248
+
234
249
  Args:
235
250
  delegation_patterns: Custom delegation patterns
236
251
  workflow_overrides: Workflow sequence modifications
237
252
  custom_rules: Additional PM rules
238
-
253
+
239
254
  Returns:
240
255
  Customized PM instructions markdown
241
256
  """
242
257
  instructions = "# Custom PM Instructions\n\n"
243
-
258
+
244
259
  if delegation_patterns:
245
260
  instructions += "## Custom Delegation Patterns\n\n"
246
261
  for pattern in delegation_patterns:
247
262
  instructions += f"- {pattern}\n"
248
263
  instructions += "\n"
249
-
264
+
250
265
  if workflow_overrides:
251
266
  instructions += "## Workflow Overrides\n\n"
252
267
  for workflow, override in workflow_overrides.items():
253
268
  instructions += f"### {workflow}\n{override}\n\n"
254
-
269
+
255
270
  if custom_rules:
256
271
  instructions += "## Additional Rules\n\n"
257
272
  for rule in custom_rules:
258
273
  instructions += f"- {rule}\n"
259
-
274
+
260
275
  return instructions
261
-
276
+
262
277
  def list_available_templates(self) -> List[Dict[str, Any]]:
263
278
  """List all available agent templates.
264
-
279
+
265
280
  Returns:
266
281
  List of template metadata dictionaries
267
282
  """
268
283
  templates = []
269
-
284
+
270
285
  if not self.templates_dir.exists():
271
286
  return templates
272
-
287
+
273
288
  for template_file in self.templates_dir.glob("*.json"):
274
289
  try:
275
- with open(template_file, 'r') as f:
290
+ with open(template_file) as f:
276
291
  config = json.load(f)
277
-
292
+
278
293
  # Use filename stem as ID if not specified in config
279
294
  template_id = config.get("id") or template_file.stem
280
-
281
- templates.append({
282
- "id": template_id,
283
- "name": config.get("name", template_id),
284
- "description": config.get("metadata", {}).get("description"),
285
- "category": config.get("metadata", {}).get("category"),
286
- "version": config.get("metadata", {}).get("version"),
287
- "file": str(template_file)
288
- })
295
+
296
+ templates.append(
297
+ {
298
+ "id": template_id,
299
+ "name": config.get("name", template_id),
300
+ "description": config.get("metadata", {}).get("description"),
301
+ "category": config.get("metadata", {}).get("category"),
302
+ "version": config.get("metadata", {}).get("version"),
303
+ "file": str(template_file),
304
+ }
305
+ )
289
306
  except Exception as e:
290
307
  self.logger.warning(f"Failed to load template {template_file}: {e}")
291
-
308
+
292
309
  return templates
293
-
310
+
294
311
  def _validate_agent_id(self, agent_id: str) -> None:
295
312
  """Validate agent ID format.
296
-
313
+
297
314
  Args:
298
315
  agent_id: Agent ID to validate
299
-
316
+
300
317
  Raises:
301
318
  AgentDeploymentError: If ID is invalid
302
319
  """
303
320
  if not agent_id:
304
321
  raise AgentDeploymentError("Agent ID cannot be empty")
305
-
322
+
306
323
  if len(agent_id) > 50:
307
324
  raise AgentDeploymentError("Agent ID must be 50 characters or less")
308
-
309
- if not re.match(r'^[a-z0-9-]+$', agent_id):
325
+
326
+ if not re.match(r"^[a-z0-9-]+$", agent_id):
310
327
  raise AgentDeploymentError(
311
328
  "Agent ID must contain only lowercase letters, numbers, and hyphens"
312
329
  )
313
-
330
+
314
331
  def _validate_model(self, model: str) -> None:
315
332
  """Validate model selection.
316
-
333
+
317
334
  Args:
318
335
  model: Model to validate
319
-
336
+
320
337
  Raises:
321
338
  AgentDeploymentError: If model is invalid
322
339
  """
@@ -324,13 +341,13 @@ class AgentBuilderService:
324
341
  raise AgentDeploymentError(
325
342
  f"Invalid model '{model}'. Must be one of: {', '.join(self.VALID_MODELS)}"
326
343
  )
327
-
344
+
328
345
  def _validate_tool_choice(self, tool_choice: str) -> None:
329
346
  """Validate tool choice setting.
330
-
347
+
331
348
  Args:
332
349
  tool_choice: Tool choice to validate
333
-
350
+
334
351
  Raises:
335
352
  AgentDeploymentError: If tool choice is invalid
336
353
  """
@@ -338,44 +355,44 @@ class AgentBuilderService:
338
355
  raise AgentDeploymentError(
339
356
  f"Invalid tool_choice '{tool_choice}'. Must be one of: {', '.join(self.VALID_TOOL_CHOICES)}"
340
357
  )
341
-
358
+
342
359
  def _load_template(self, template_id: str) -> Dict[str, Any]:
343
360
  """Load an agent template.
344
-
361
+
345
362
  Args:
346
363
  template_id: Template ID to load
347
-
364
+
348
365
  Returns:
349
366
  Template configuration dictionary
350
-
367
+
351
368
  Raises:
352
369
  AgentDeploymentError: If template not found
353
370
  """
354
371
  if template_id in self._template_cache:
355
372
  return self._template_cache[template_id].copy()
356
-
373
+
357
374
  template_file = self.templates_dir / f"{template_id}.json"
358
-
375
+
359
376
  if not template_file.exists():
360
377
  raise AgentDeploymentError(f"Template '{template_id}' not found")
361
-
378
+
362
379
  try:
363
- with open(template_file, 'r') as f:
380
+ with open(template_file) as f:
364
381
  config = json.load(f)
365
382
  self._template_cache[template_id] = config
366
383
  return config.copy()
367
384
  except Exception as e:
368
385
  raise AgentDeploymentError(f"Failed to load template '{template_id}': {e}")
369
-
386
+
370
387
  def _load_instructions(self, agent_id: str) -> str:
371
388
  """Load agent instructions.
372
-
389
+
373
390
  Args:
374
391
  agent_id: Agent ID to load instructions for
375
-
392
+
376
393
  Returns:
377
394
  Instructions markdown content
378
-
395
+
379
396
  Raises:
380
397
  AgentDeploymentError: If instructions not found
381
398
  """
@@ -383,28 +400,32 @@ class AgentBuilderService:
383
400
  possible_files = [
384
401
  self.templates_dir / f"{agent_id}.md",
385
402
  self.templates_dir / f"{agent_id}_instructions.md",
386
- self.templates_dir / f"{agent_id}-instructions.md"
403
+ self.templates_dir / f"{agent_id}-instructions.md",
387
404
  ]
388
-
405
+
389
406
  for instructions_file in possible_files:
390
407
  if instructions_file.exists():
391
408
  try:
392
- with open(instructions_file, 'r') as f:
409
+ with open(instructions_file) as f:
393
410
  return f.read()
394
411
  except Exception as e:
395
- self.logger.warning(f"Failed to read instructions from {instructions_file}: {e}")
396
-
412
+ self.logger.warning(
413
+ f"Failed to read instructions from {instructions_file}: {e}"
414
+ )
415
+
397
416
  # If no instructions found, return empty
398
417
  return ""
399
-
400
- def _generate_default_instructions(self, agent_id: str, name: str, description: str) -> str:
418
+
419
+ def _generate_default_instructions(
420
+ self, agent_id: str, name: str, description: str
421
+ ) -> str:
401
422
  """Generate default agent instructions.
402
-
423
+
403
424
  Args:
404
425
  agent_id: Agent identifier
405
426
  name: Agent display name
406
427
  description: Agent description
407
-
428
+
408
429
  Returns:
409
430
  Default instructions markdown
410
431
  """
@@ -452,4 +473,4 @@ Provide structured responses with:
452
473
 
453
474
  *Agent ID: {agent_id}*
454
475
  *Generated by Agent Manager*
455
- """
476
+ """