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
@@ -16,7 +16,7 @@ DESIGN DECISIONS:
16
16
  import json
17
17
  import subprocess
18
18
  import sys
19
- from typing import Any, Dict, List, Optional
19
+ from typing import Optional
20
20
 
21
21
  from ...constants import TicketCommands
22
22
  from ...core.logger import get_logger
@@ -31,7 +31,7 @@ class TicketsCommand(BaseCommand):
31
31
 
32
32
  def validate_args(self, args) -> Optional[str]:
33
33
  """Validate command arguments."""
34
- if not hasattr(args, 'tickets_command') or not args.tickets_command:
34
+ if not hasattr(args, "tickets_command") or not args.tickets_command:
35
35
  return "No tickets subcommand specified"
36
36
 
37
37
  valid_commands = [cmd.value for cmd in TicketCommands]
@@ -58,8 +58,9 @@ class TicketsCommand(BaseCommand):
58
58
 
59
59
  if args.tickets_command in command_map:
60
60
  return command_map[args.tickets_command](args)
61
- else:
62
- return CommandResult.error_result(f"Unknown tickets command: {args.tickets_command}")
61
+ return CommandResult.error_result(
62
+ f"Unknown tickets command: {args.tickets_command}"
63
+ )
63
64
 
64
65
  except Exception as e:
65
66
  self.logger.error(f"Error executing tickets command: {e}", exc_info=True)
@@ -71,8 +72,9 @@ class TicketsCommand(BaseCommand):
71
72
  exit_code = create_ticket_legacy(args)
72
73
  if exit_code == 0:
73
74
  return CommandResult.success_result("Ticket created successfully")
74
- else:
75
- return CommandResult.error_result("Failed to create ticket", exit_code=exit_code)
75
+ return CommandResult.error_result(
76
+ "Failed to create ticket", exit_code=exit_code
77
+ )
76
78
  except Exception as e:
77
79
  self.logger.error(f"Error creating ticket: {e}")
78
80
  return CommandResult.error_result(f"Error creating ticket: {e}")
@@ -83,8 +85,9 @@ class TicketsCommand(BaseCommand):
83
85
  exit_code = list_tickets_legacy(args)
84
86
  if exit_code == 0:
85
87
  return CommandResult.success_result("Tickets listed successfully")
86
- else:
87
- return CommandResult.error_result("Failed to list tickets", exit_code=exit_code)
88
+ return CommandResult.error_result(
89
+ "Failed to list tickets", exit_code=exit_code
90
+ )
88
91
  except Exception as e:
89
92
  self.logger.error(f"Error listing tickets: {e}")
90
93
  return CommandResult.error_result(f"Error listing tickets: {e}")
@@ -95,8 +98,9 @@ class TicketsCommand(BaseCommand):
95
98
  exit_code = view_ticket_legacy(args)
96
99
  if exit_code == 0:
97
100
  return CommandResult.success_result("Ticket viewed successfully")
98
- else:
99
- return CommandResult.error_result("Failed to view ticket", exit_code=exit_code)
101
+ return CommandResult.error_result(
102
+ "Failed to view ticket", exit_code=exit_code
103
+ )
100
104
  except Exception as e:
101
105
  self.logger.error(f"Error viewing ticket: {e}")
102
106
  return CommandResult.error_result(f"Error viewing ticket: {e}")
@@ -107,8 +111,9 @@ class TicketsCommand(BaseCommand):
107
111
  exit_code = update_ticket_legacy(args)
108
112
  if exit_code == 0:
109
113
  return CommandResult.success_result("Ticket updated successfully")
110
- else:
111
- return CommandResult.error_result("Failed to update ticket", exit_code=exit_code)
114
+ return CommandResult.error_result(
115
+ "Failed to update ticket", exit_code=exit_code
116
+ )
112
117
  except Exception as e:
113
118
  self.logger.error(f"Error updating ticket: {e}")
114
119
  return CommandResult.error_result(f"Error updating ticket: {e}")
@@ -119,8 +124,9 @@ class TicketsCommand(BaseCommand):
119
124
  exit_code = close_ticket_legacy(args)
120
125
  if exit_code == 0:
121
126
  return CommandResult.success_result("Ticket closed successfully")
122
- else:
123
- return CommandResult.error_result("Failed to close ticket", exit_code=exit_code)
127
+ return CommandResult.error_result(
128
+ "Failed to close ticket", exit_code=exit_code
129
+ )
124
130
  except Exception as e:
125
131
  self.logger.error(f"Error closing ticket: {e}")
126
132
  return CommandResult.error_result(f"Error closing ticket: {e}")
@@ -131,8 +137,9 @@ class TicketsCommand(BaseCommand):
131
137
  exit_code = delete_ticket_legacy(args)
132
138
  if exit_code == 0:
133
139
  return CommandResult.success_result("Ticket deleted successfully")
134
- else:
135
- return CommandResult.error_result("Failed to delete ticket", exit_code=exit_code)
140
+ return CommandResult.error_result(
141
+ "Failed to delete ticket", exit_code=exit_code
142
+ )
136
143
  except Exception as e:
137
144
  self.logger.error(f"Error deleting ticket: {e}")
138
145
  return CommandResult.error_result(f"Error deleting ticket: {e}")
@@ -143,8 +150,9 @@ class TicketsCommand(BaseCommand):
143
150
  exit_code = search_tickets_legacy(args)
144
151
  if exit_code == 0:
145
152
  return CommandResult.success_result("Tickets searched successfully")
146
- else:
147
- return CommandResult.error_result("Failed to search tickets", exit_code=exit_code)
153
+ return CommandResult.error_result(
154
+ "Failed to search tickets", exit_code=exit_code
155
+ )
148
156
  except Exception as e:
149
157
  self.logger.error(f"Error searching tickets: {e}")
150
158
  return CommandResult.error_result(f"Error searching tickets: {e}")
@@ -155,8 +163,9 @@ class TicketsCommand(BaseCommand):
155
163
  exit_code = add_comment_legacy(args)
156
164
  if exit_code == 0:
157
165
  return CommandResult.success_result("Comment added successfully")
158
- else:
159
- return CommandResult.error_result("Failed to add comment", exit_code=exit_code)
166
+ return CommandResult.error_result(
167
+ "Failed to add comment", exit_code=exit_code
168
+ )
160
169
  except Exception as e:
161
170
  self.logger.error(f"Error adding comment: {e}")
162
171
  return CommandResult.error_result(f"Error adding comment: {e}")
@@ -167,8 +176,9 @@ class TicketsCommand(BaseCommand):
167
176
  exit_code = update_workflow_legacy(args)
168
177
  if exit_code == 0:
169
178
  return CommandResult.success_result("Workflow updated successfully")
170
- else:
171
- return CommandResult.error_result("Failed to update workflow", exit_code=exit_code)
179
+ return CommandResult.error_result(
180
+ "Failed to update workflow", exit_code=exit_code
181
+ )
172
182
  except Exception as e:
173
183
  self.logger.error(f"Error updating workflow: {e}")
174
184
  return CommandResult.error_result(f"Error updating workflow: {e}")
@@ -184,7 +194,7 @@ def manage_tickets(args):
184
194
  result = command.execute(args)
185
195
 
186
196
  # Print result if structured output format is requested
187
- if hasattr(args, 'format') and args.format in ['json', 'yaml']:
197
+ if hasattr(args, "format") and args.format in ["json", "yaml"]:
188
198
  command.print_result(result, args)
189
199
 
190
200
  return result.exit_code
@@ -278,7 +288,7 @@ def create_ticket_legacy(args):
278
288
  Returns:
279
289
  Exit code (0 for success, non-zero for errors)
280
290
  """
281
- logger = get_logger("cli.tickets")
291
+ get_logger("cli.tickets")
282
292
 
283
293
  try:
284
294
  from ...services.ticket_manager import TicketManager
@@ -317,9 +327,8 @@ def create_ticket_legacy(args):
317
327
  if getattr(args, "parent_issue", None):
318
328
  print(f" Parent Issue: {args.parent_issue}")
319
329
  return 0
320
- else:
321
- print("❌ Failed to create ticket")
322
- return 1
330
+ print("❌ Failed to create ticket")
331
+ return 1
323
332
 
324
333
 
325
334
  def list_tickets_legacy(args):
@@ -501,7 +510,7 @@ def view_ticket_legacy(args):
501
510
  Returns:
502
511
  Exit code (0 for success, non-zero for errors)
503
512
  """
504
- logger = get_logger("cli.tickets")
513
+ get_logger("cli.tickets")
505
514
 
506
515
  try:
507
516
  from ...services.ticket_manager import TicketManager
@@ -510,7 +519,7 @@ def view_ticket_legacy(args):
510
519
 
511
520
  ticket_manager = TicketManager()
512
521
  # Handle both 'id' and 'ticket_id' attributes for compatibility
513
- ticket_id = getattr(args, 'ticket_id', getattr(args, 'id', None))
522
+ ticket_id = getattr(args, "ticket_id", getattr(args, "id", None))
514
523
  if not ticket_id:
515
524
  print("❌ No ticket ID provided")
516
525
  return 1
@@ -540,7 +549,7 @@ def view_ticket_legacy(args):
540
549
  if metadata.get("parent_issue"):
541
550
  print(f"Parent Issue: {metadata['parent_issue']}")
542
551
 
543
- print(f"\nDescription:")
552
+ print("\nDescription:")
544
553
  print("-" * 40)
545
554
  print(ticket.get("description", "No description"))
546
555
 
@@ -548,7 +557,7 @@ def view_ticket_legacy(args):
548
557
  print(f"Updated: {ticket['updated_at']}")
549
558
 
550
559
  if args.verbose and ticket.get("metadata"):
551
- print(f"\nMetadata:")
560
+ print("\nMetadata:")
552
561
  print("-" * 40)
553
562
  for key, value in ticket["metadata"].items():
554
563
  if key not in [
@@ -587,7 +596,7 @@ def update_ticket_legacy(args):
587
596
  ticket_manager = TicketManager()
588
597
 
589
598
  # Handle both 'id' and 'ticket_id' attributes for compatibility
590
- ticket_id = getattr(args, 'ticket_id', getattr(args, 'id', None))
599
+ ticket_id = getattr(args, "ticket_id", getattr(args, "id", None))
591
600
  if not ticket_id:
592
601
  print("❌ No ticket ID provided")
593
602
  return 1
@@ -620,36 +629,35 @@ def update_ticket_legacy(args):
620
629
  if success:
621
630
  print(f"✅ Updated ticket: {ticket_id}")
622
631
  return 0
623
- else:
624
- # Fallback to aitrackdown CLI for status transitions
625
- if args.status:
626
- logger.info("Attempting update via aitrackdown CLI")
627
- cmd = ["aitrackdown", "transition", ticket_id, args.status]
628
-
629
- # Add comment with other updates
630
- comment_parts = []
631
- if args.priority:
632
- comment_parts.append(f"Priority: {args.priority}")
633
- if args.assign:
634
- comment_parts.append(f"Assigned to: {args.assign}")
635
- if args.tags:
636
- comment_parts.append(f"Tags: {args.tags}")
637
-
638
- if comment_parts:
639
- comment = " | ".join(comment_parts)
640
- cmd.extend(["--comment", comment])
632
+ # Fallback to aitrackdown CLI for status transitions
633
+ if args.status:
634
+ logger.info("Attempting update via aitrackdown CLI")
635
+ cmd = ["aitrackdown", "transition", ticket_id, args.status]
636
+
637
+ # Add comment with other updates
638
+ comment_parts = []
639
+ if args.priority:
640
+ comment_parts.append(f"Priority: {args.priority}")
641
+ if args.assign:
642
+ comment_parts.append(f"Assigned to: {args.assign}")
643
+ if args.tags:
644
+ comment_parts.append(f"Tags: {args.tags}")
645
+
646
+ if comment_parts:
647
+ comment = " | ".join(comment_parts)
648
+ cmd.extend(["--comment", comment])
641
649
 
642
- try:
643
- subprocess.run(cmd, check=True, capture_output=True, text=True)
644
- print(f"✅ Updated ticket: {ticket_id}")
645
- return 0
646
- except subprocess.CalledProcessError as e:
647
- logger.error(f"Failed to update via CLI: {e}")
648
- print(f"❌ Failed to update ticket: {ticket_id}")
649
- return 1
650
- else:
650
+ try:
651
+ subprocess.run(cmd, check=True, capture_output=True, text=True)
652
+ print(f"✅ Updated ticket: {ticket_id}")
653
+ return 0
654
+ except subprocess.CalledProcessError as e:
655
+ logger.error(f"Failed to update via CLI: {e}")
651
656
  print(f"❌ Failed to update ticket: {ticket_id}")
652
657
  return 1
658
+ else:
659
+ print(f"❌ Failed to update ticket: {ticket_id}")
660
+ return 1
653
661
 
654
662
 
655
663
  def close_ticket_legacy(args):
@@ -674,7 +682,7 @@ def close_ticket_legacy(args):
674
682
  ticket_manager = TicketManager()
675
683
 
676
684
  # Handle both 'id' and 'ticket_id' attributes for compatibility
677
- ticket_id = getattr(args, 'ticket_id', getattr(args, 'id', None))
685
+ ticket_id = getattr(args, "ticket_id", getattr(args, "id", None))
678
686
  if not ticket_id:
679
687
  print("❌ No ticket ID provided")
680
688
  return 1
@@ -686,21 +694,20 @@ def close_ticket_legacy(args):
686
694
  if success:
687
695
  print(f"✅ Closed ticket: {ticket_id}")
688
696
  return 0
689
- else:
690
- # Fallback to aitrackdown CLI
691
- logger.info("Attempting close via aitrackdown CLI")
692
- cmd = ["aitrackdown", "close", ticket_id]
697
+ # Fallback to aitrackdown CLI
698
+ logger.info("Attempting close via aitrackdown CLI")
699
+ cmd = ["aitrackdown", "close", ticket_id]
693
700
 
694
- if resolution:
695
- cmd.extend(["--comment", resolution])
701
+ if resolution:
702
+ cmd.extend(["--comment", resolution])
696
703
 
697
- try:
698
- subprocess.run(cmd, check=True, capture_output=True, text=True)
699
- print(f"✅ Closed ticket: {ticket_id}")
700
- return 0
701
- except subprocess.CalledProcessError:
702
- print(f"❌ Failed to close ticket: {ticket_id}")
703
- return 1
704
+ try:
705
+ subprocess.run(cmd, check=True, capture_output=True, text=True)
706
+ print(f"✅ Closed ticket: {ticket_id}")
707
+ return 0
708
+ except subprocess.CalledProcessError:
709
+ print(f"❌ Failed to close ticket: {ticket_id}")
710
+ return 1
704
711
 
705
712
 
706
713
  def delete_ticket_legacy(args):
@@ -719,10 +726,10 @@ def delete_ticket_legacy(args):
719
726
  Returns:
720
727
  Exit code (0 for success, non-zero for errors)
721
728
  """
722
- logger = get_logger("cli.tickets")
729
+ get_logger("cli.tickets")
723
730
 
724
731
  # Handle both 'id' and 'ticket_id' attributes for compatibility
725
- ticket_id = getattr(args, 'ticket_id', getattr(args, 'id', None))
732
+ ticket_id = getattr(args, "ticket_id", getattr(args, "id", None))
726
733
  if not ticket_id:
727
734
  print("❌ No ticket ID provided")
728
735
  return 1
@@ -749,7 +756,9 @@ def delete_ticket_legacy(args):
749
756
  # In TTY environment, use normal input()
750
757
  try:
751
758
  response = (
752
- input(f"Are you sure you want to delete ticket {ticket_id}? (y/N): ")
759
+ input(
760
+ f"Are you sure you want to delete ticket {ticket_id}? (y/N): "
761
+ )
753
762
  .strip()
754
763
  .lower()
755
764
  )
@@ -789,7 +798,7 @@ def search_tickets_legacy(args):
789
798
  Returns:
790
799
  Exit code (0 for success, non-zero for errors)
791
800
  """
792
- logger = get_logger("cli.tickets")
801
+ get_logger("cli.tickets")
793
802
 
794
803
  try:
795
804
  from ...services.ticket_manager import TicketManager
@@ -819,9 +828,8 @@ def search_tickets_legacy(args):
819
828
  continue
820
829
 
821
830
  # Apply status filter
822
- if args.status != "all":
823
- if ticket.get("status") != args.status:
824
- continue
831
+ if args.status != "all" and ticket.get("status") != args.status:
832
+ continue
825
833
 
826
834
  matched_tickets.append(ticket)
827
835
  if len(matched_tickets) >= args.limit:
@@ -878,10 +886,10 @@ def add_comment_legacy(args):
878
886
  Returns:
879
887
  Exit code (0 for success, non-zero for errors)
880
888
  """
881
- logger = get_logger("cli.tickets")
889
+ get_logger("cli.tickets")
882
890
 
883
891
  # Handle both 'id' and 'ticket_id' attributes for compatibility
884
- ticket_id = getattr(args, 'ticket_id', getattr(args, 'id', None))
892
+ ticket_id = getattr(args, "ticket_id", getattr(args, "id", None))
885
893
  if not ticket_id:
886
894
  print("❌ No ticket ID provided")
887
895
  return 1
@@ -917,23 +925,15 @@ def update_workflow_legacy(args):
917
925
  Returns:
918
926
  Exit code (0 for success, non-zero for errors)
919
927
  """
920
- logger = get_logger("cli.tickets")
928
+ get_logger("cli.tickets")
921
929
 
922
930
  # Handle both 'id' and 'ticket_id' attributes for compatibility
923
- ticket_id = getattr(args, 'ticket_id', getattr(args, 'id', None))
931
+ ticket_id = getattr(args, "ticket_id", getattr(args, "id", None))
924
932
  if not ticket_id:
925
933
  print("❌ No ticket ID provided")
926
934
  return 1
927
935
 
928
936
  # Map workflow states to status if needed
929
- state_mapping = {
930
- "todo": "open",
931
- "in_progress": "in_progress",
932
- "ready": "ready",
933
- "tested": "tested",
934
- "done": "done",
935
- "blocked": "blocked",
936
- }
937
937
 
938
938
  # Use aitrackdown transition command
939
939
  cmd = ["aitrackdown", "transition", ticket_id, args.state]
claude_mpm/cli/parser.py CHANGED
@@ -19,15 +19,11 @@ REFACTORING NOTE: The original 961-line create_parser function has been split in
19
19
  - parsers/mcp_parser.py: MCP Gateway commands
20
20
  """
21
21
 
22
- import argparse
23
- from pathlib import Path
24
- from typing import List, Optional
25
-
26
22
  # Import from the new modular structure
27
23
  from .parsers import add_common_arguments, create_parser, preprocess_args
28
24
 
29
25
  # Re-export for backward compatibility
30
- __all__ = ["create_parser", "add_common_arguments", "preprocess_args"]
26
+ __all__ = ["add_common_arguments", "create_parser", "preprocess_args"]
31
27
 
32
28
  # Legacy functions removed - all functionality moved to parsers/ modules
33
29
  # The original parser.py file contained a massive 961-line create_parser function
@@ -22,8 +22,8 @@ from .base_parser import add_common_arguments, create_parser, preprocess_args
22
22
  from .run_parser import add_run_arguments
23
23
 
24
24
  __all__ = [
25
- "create_parser",
26
25
  "add_common_arguments",
27
26
  "add_run_arguments",
27
+ "create_parser",
28
28
  "preprocess_args",
29
29
  ]