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
@@ -5,7 +5,6 @@ WHY: Verify that agents are properly deployed, up-to-date, and functioning corre
5
5
  """
6
6
 
7
7
  from pathlib import Path
8
- from typing import Dict, Any, List
9
8
 
10
9
  from ..models import DiagnosticResult, DiagnosticStatus
11
10
  from .base_check import BaseDiagnosticCheck
@@ -13,52 +12,57 @@ from .base_check import BaseDiagnosticCheck
13
12
 
14
13
  class AgentCheck(BaseDiagnosticCheck):
15
14
  """Check agent deployment and configuration."""
16
-
15
+
17
16
  @property
18
17
  def name(self) -> str:
19
18
  return "agent_check"
20
-
19
+
21
20
  @property
22
21
  def category(self) -> str:
23
22
  return "Agents"
24
-
23
+
25
24
  def run(self) -> DiagnosticResult:
26
25
  """Run agent diagnostics."""
27
26
  try:
28
- from ....services.agents.deployment.agent_validator import AgentValidator
29
- from ....services.agents.deployment.agent_discovery_service import AgentDiscoveryService
30
-
27
+ from ....services.agents.deployment.agent_discovery_service import (
28
+ AgentDiscoveryService,
29
+ )
30
+
31
31
  sub_results = []
32
32
  details = {}
33
-
33
+
34
34
  # Get available agents
35
- discovery = AgentDiscoveryService()
36
- available_agents = discovery.discover_available_agents()
35
+ # AgentDiscoveryService requires templates_dir parameter
36
+ templates_dir = Path(__file__).parents[3] / "agents" / "templates"
37
+ discovery = AgentDiscoveryService(templates_dir)
38
+ available_agents = discovery.list_available_agents()
37
39
  details["available_count"] = len(available_agents)
38
- details["available_agents"] = [a.name for a in available_agents]
39
-
40
+ details["available_agents"] = [
41
+ a.get("name", "unknown") for a in available_agents
42
+ ]
43
+
40
44
  # Check deployed agents
41
45
  deployed_result = self._check_deployed_agents()
42
46
  sub_results.append(deployed_result)
43
47
  details["deployed_count"] = deployed_result.details.get("count", 0)
44
-
48
+
45
49
  # Check agent versions
46
50
  version_result = self._check_agent_versions()
47
51
  sub_results.append(version_result)
48
52
  details["outdated_agents"] = version_result.details.get("outdated", [])
49
-
53
+
50
54
  # Validate agent configurations
51
55
  validation_result = self._validate_agents()
52
56
  sub_results.append(validation_result)
53
-
57
+
54
58
  # Check for common agent issues
55
59
  issues_result = self._check_common_issues()
56
60
  sub_results.append(issues_result)
57
-
61
+
58
62
  # Determine overall status
59
63
  deployed_count = details["deployed_count"]
60
64
  available_count = details["available_count"]
61
-
65
+
62
66
  if deployed_count == 0:
63
67
  status = DiagnosticStatus.ERROR
64
68
  message = f"No agents deployed (0/{available_count} available)"
@@ -68,7 +72,9 @@ class AgentCheck(BaseDiagnosticCheck):
68
72
  status = DiagnosticStatus.WARNING
69
73
  message = f"{deployed_count}/{available_count} agents deployed"
70
74
  fix_command = "claude-mpm agents deploy"
71
- fix_description = f"Deploy remaining {available_count - deployed_count} agents"
75
+ fix_description = (
76
+ f"Deploy remaining {available_count - deployed_count} agents"
77
+ )
72
78
  elif any(r.status == DiagnosticStatus.ERROR for r in sub_results):
73
79
  status = DiagnosticStatus.ERROR
74
80
  message = "Agents have critical issues"
@@ -84,7 +90,7 @@ class AgentCheck(BaseDiagnosticCheck):
84
90
  message = f"All {deployed_count} agents properly deployed"
85
91
  fix_command = None
86
92
  fix_description = None
87
-
93
+
88
94
  return DiagnosticResult(
89
95
  category=self.category,
90
96
  status=status,
@@ -92,21 +98,21 @@ class AgentCheck(BaseDiagnosticCheck):
92
98
  details=details,
93
99
  fix_command=fix_command,
94
100
  fix_description=fix_description,
95
- sub_results=sub_results if self.verbose else []
101
+ sub_results=sub_results if self.verbose else [],
96
102
  )
97
-
103
+
98
104
  except Exception as e:
99
105
  return DiagnosticResult(
100
106
  category=self.category,
101
107
  status=DiagnosticStatus.ERROR,
102
- message=f"Agent check failed: {str(e)}",
103
- details={"error": str(e)}
108
+ message=f"Agent check failed: {e!s}",
109
+ details={"error": str(e)},
104
110
  )
105
-
111
+
106
112
  def _check_deployed_agents(self) -> DiagnosticResult:
107
113
  """Check deployed agents in user directory."""
108
114
  agents_dir = Path.home() / ".claude" / "agents"
109
-
115
+
110
116
  if not agents_dir.exists():
111
117
  return DiagnosticResult(
112
118
  category="Deployed Agents",
@@ -114,12 +120,12 @@ class AgentCheck(BaseDiagnosticCheck):
114
120
  message="Agents directory does not exist",
115
121
  details={"path": str(agents_dir), "count": 0},
116
122
  fix_command="claude-mpm agents deploy",
117
- fix_description="Create agents directory and deploy agents"
123
+ fix_description="Create agents directory and deploy agents",
118
124
  )
119
-
125
+
120
126
  # Count deployed agent files
121
127
  agent_files = list(agents_dir.glob("*.md"))
122
-
128
+
123
129
  if not agent_files:
124
130
  return DiagnosticResult(
125
131
  category="Deployed Agents",
@@ -127,14 +133,14 @@ class AgentCheck(BaseDiagnosticCheck):
127
133
  message="No agents deployed",
128
134
  details={"path": str(agents_dir), "count": 0},
129
135
  fix_command="claude-mpm agents deploy",
130
- fix_description="Deploy available agents"
136
+ fix_description="Deploy available agents",
131
137
  )
132
-
138
+
133
139
  # Check for required core agents
134
140
  core_agents = ["research.md", "engineer.md", "qa.md", "documentation.md"]
135
141
  deployed_names = [f.name for f in agent_files]
136
142
  missing_core = [a for a in core_agents if a not in deployed_names]
137
-
143
+
138
144
  if missing_core:
139
145
  return DiagnosticResult(
140
146
  category="Deployed Agents",
@@ -144,12 +150,12 @@ class AgentCheck(BaseDiagnosticCheck):
144
150
  "path": str(agents_dir),
145
151
  "count": len(agent_files),
146
152
  "deployed": deployed_names,
147
- "missing_core": missing_core
153
+ "missing_core": missing_core,
148
154
  },
149
155
  fix_command="claude-mpm agents deploy",
150
- fix_description="Deploy missing core agents"
156
+ fix_description="Deploy missing core agents",
151
157
  )
152
-
158
+
153
159
  return DiagnosticResult(
154
160
  category="Deployed Agents",
155
161
  status=DiagnosticStatus.OK,
@@ -157,37 +163,39 @@ class AgentCheck(BaseDiagnosticCheck):
157
163
  details={
158
164
  "path": str(agents_dir),
159
165
  "count": len(agent_files),
160
- "deployed": deployed_names
161
- }
166
+ "deployed": deployed_names,
167
+ },
162
168
  )
163
-
169
+
164
170
  def _check_agent_versions(self) -> DiagnosticResult:
165
171
  """Check if deployed agents are up-to-date."""
166
172
  try:
167
- from ....services.agents.deployment.agent_version_manager import AgentVersionManager
168
-
173
+ from ....services.agents.deployment.agent_version_manager import (
174
+ AgentVersionManager,
175
+ )
176
+
169
177
  version_manager = AgentVersionManager()
170
178
  agents_dir = Path.home() / ".claude" / "agents"
171
-
179
+
172
180
  if not agents_dir.exists():
173
181
  return DiagnosticResult(
174
182
  category="Agent Versions",
175
183
  status=DiagnosticStatus.SKIPPED,
176
184
  message="No agents to check",
177
- details={}
185
+ details={},
178
186
  )
179
-
187
+
180
188
  outdated = []
181
189
  checked = 0
182
-
190
+
183
191
  for agent_file in agents_dir.glob("*.md"):
184
192
  checked += 1
185
193
  agent_name = agent_file.stem
186
-
194
+
187
195
  # Check if agent needs update (simplified check)
188
196
  if version_manager.needs_update(agent_name):
189
197
  outdated.append(agent_name)
190
-
198
+
191
199
  if outdated:
192
200
  return DiagnosticResult(
193
201
  category="Agent Versions",
@@ -195,95 +203,95 @@ class AgentCheck(BaseDiagnosticCheck):
195
203
  message=f"{len(outdated)} agent(s) outdated",
196
204
  details={"outdated": outdated, "checked": checked},
197
205
  fix_command="claude-mpm agents update",
198
- fix_description="Update agents to latest versions"
206
+ fix_description="Update agents to latest versions",
199
207
  )
200
-
208
+
201
209
  if checked == 0:
202
210
  return DiagnosticResult(
203
211
  category="Agent Versions",
204
212
  status=DiagnosticStatus.WARNING,
205
213
  message="No agents to check",
206
- details={"checked": 0}
214
+ details={"checked": 0},
207
215
  )
208
-
216
+
209
217
  return DiagnosticResult(
210
218
  category="Agent Versions",
211
219
  status=DiagnosticStatus.OK,
212
220
  message=f"All {checked} agents up-to-date",
213
- details={"checked": checked}
221
+ details={"checked": checked},
214
222
  )
215
-
223
+
216
224
  except Exception as e:
217
225
  return DiagnosticResult(
218
226
  category="Agent Versions",
219
227
  status=DiagnosticStatus.WARNING,
220
- message=f"Could not check versions: {str(e)}",
221
- details={"error": str(e)}
228
+ message=f"Could not check versions: {e!s}",
229
+ details={"error": str(e)},
222
230
  )
223
-
231
+
224
232
  def _validate_agents(self) -> DiagnosticResult:
225
233
  """Validate agent configurations."""
226
234
  try:
227
235
  from ....services.agents.deployment.agent_validator import AgentValidator
228
-
229
- validator = AgentValidator()
236
+
237
+ AgentValidator()
230
238
  agents_dir = Path.home() / ".claude" / "agents"
231
-
239
+
232
240
  if not agents_dir.exists():
233
241
  return DiagnosticResult(
234
242
  category="Agent Validation",
235
243
  status=DiagnosticStatus.SKIPPED,
236
244
  message="No agents to validate",
237
- details={}
245
+ details={},
238
246
  )
239
-
247
+
240
248
  invalid = []
241
249
  validated = 0
242
-
250
+
243
251
  for agent_file in agents_dir.glob("*.md"):
244
252
  validated += 1
245
-
253
+
246
254
  # Basic validation
247
255
  try:
248
- with open(agent_file, 'r') as f:
256
+ with open(agent_file) as f:
249
257
  content = f.read()
250
-
258
+
251
259
  # Check for required sections
252
260
  if "## Core Identity" not in content:
253
261
  invalid.append(f"{agent_file.stem}: missing Core Identity")
254
262
  elif len(content) < 100:
255
263
  invalid.append(f"{agent_file.stem}: file too small")
256
-
264
+
257
265
  except Exception as e:
258
- invalid.append(f"{agent_file.stem}: {str(e)}")
259
-
266
+ invalid.append(f"{agent_file.stem}: {e!s}")
267
+
260
268
  if invalid:
261
269
  return DiagnosticResult(
262
270
  category="Agent Validation",
263
271
  status=DiagnosticStatus.WARNING,
264
272
  message=f"{len(invalid)} validation issue(s)",
265
- details={"issues": invalid, "validated": validated}
273
+ details={"issues": invalid, "validated": validated},
266
274
  )
267
-
275
+
268
276
  return DiagnosticResult(
269
277
  category="Agent Validation",
270
278
  status=DiagnosticStatus.OK,
271
279
  message=f"All {validated} agents valid",
272
- details={"validated": validated}
280
+ details={"validated": validated},
273
281
  )
274
-
282
+
275
283
  except Exception as e:
276
284
  return DiagnosticResult(
277
285
  category="Agent Validation",
278
286
  status=DiagnosticStatus.WARNING,
279
- message=f"Validation failed: {str(e)}",
280
- details={"error": str(e)}
287
+ message=f"Validation failed: {e!s}",
288
+ details={"error": str(e)},
281
289
  )
282
-
290
+
283
291
  def _check_common_issues(self) -> DiagnosticResult:
284
292
  """Check for common agent-related issues."""
285
293
  issues = []
286
-
294
+
287
295
  # Check for duplicate agents
288
296
  agents_dir = Path.home() / ".claude" / "agents"
289
297
  if agents_dir.exists():
@@ -294,26 +302,27 @@ class AgentCheck(BaseDiagnosticCheck):
294
302
  issues.append(f"Duplicate agent: {agent_file.stem}")
295
303
  else:
296
304
  agent_names[name] = agent_file
297
-
305
+
298
306
  # Check permissions
299
307
  if agents_dir.exists():
300
308
  import os
309
+
301
310
  if not os.access(agents_dir, os.R_OK):
302
311
  issues.append("Agents directory not readable")
303
312
  if not os.access(agents_dir, os.W_OK):
304
313
  issues.append("Agents directory not writable")
305
-
314
+
306
315
  if issues:
307
316
  return DiagnosticResult(
308
317
  category="Common Issues",
309
318
  status=DiagnosticStatus.WARNING,
310
319
  message=f"{len(issues)} issue(s) found",
311
- details={"issues": issues}
320
+ details={"issues": issues},
312
321
  )
313
-
322
+
314
323
  return DiagnosticResult(
315
324
  category="Common Issues",
316
325
  status=DiagnosticStatus.OK,
317
326
  message="No common issues detected",
318
- details={}
319
- )
327
+ details={},
328
+ )
@@ -6,59 +6,55 @@ they can be easily added, tested, and executed by the diagnostic runner.
6
6
  """
7
7
 
8
8
  from abc import ABC, abstractmethod
9
- from typing import Optional
10
9
 
11
10
  from ..models import DiagnosticResult
12
11
 
13
12
 
14
13
  class BaseDiagnosticCheck(ABC):
15
14
  """Base class for all diagnostic checks.
16
-
15
+
17
16
  WHY: Ensures all checks follow the same pattern and can be
18
17
  executed uniformly by the diagnostic runner.
19
18
  """
20
-
19
+
21
20
  def __init__(self, verbose: bool = False):
22
21
  """Initialize the check.
23
-
22
+
24
23
  Args:
25
24
  verbose: Whether to include detailed information in results
26
25
  """
27
26
  self.verbose = verbose
28
-
27
+
29
28
  @property
30
29
  @abstractmethod
31
30
  def name(self) -> str:
32
31
  """Get the name of this check."""
33
- pass
34
-
32
+
35
33
  @property
36
34
  @abstractmethod
37
35
  def category(self) -> str:
38
36
  """Get the category this check belongs to."""
39
- pass
40
-
37
+
41
38
  @property
42
39
  def description(self) -> str:
43
40
  """Get a description of what this check does."""
44
41
  return f"Checking {self.category.lower()} health"
45
-
42
+
46
43
  @abstractmethod
47
44
  def run(self) -> DiagnosticResult:
48
45
  """Run the diagnostic check.
49
-
46
+
50
47
  Returns:
51
48
  DiagnosticResult with the check results
52
49
  """
53
- pass
54
-
50
+
55
51
  def should_run(self) -> bool:
56
52
  """Determine if this check should run.
57
-
53
+
58
54
  WHY: Some checks may not be applicable in certain environments
59
55
  or configurations. This allows checks to opt out gracefully.
60
-
56
+
61
57
  Returns:
62
58
  True if the check should run, False to skip
63
59
  """
64
- return True
60
+ return True