claude-mpm 4.1.1__py3-none-any.whl → 4.1.3__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (389) 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/engineer.json +33 -11
  18. claude_mpm/agents/templates/imagemagick.json +256 -0
  19. claude_mpm/agents/templates/qa.json +41 -2
  20. claude_mpm/agents/templates/ticketing.json +5 -5
  21. claude_mpm/agents/templates/web_qa.json +50 -2
  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 +648 -1098
  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 +339 -967
  39. claude_mpm/cli/commands/monitor.py +117 -88
  40. claude_mpm/cli/commands/run.py +233 -542
  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 +280 -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 +22 -29
  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 +500 -680
  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 -17
  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 +99 -154
  114. claude_mpm/hooks/claude_hooks/hook_handler.py +110 -720
  115. claude_mpm/hooks/claude_hooks/hook_handler_eventbus.py +104 -77
  116. claude_mpm/hooks/claude_hooks/hook_handler_original.py +1040 -0
  117. claude_mpm/hooks/claude_hooks/hook_handler_refactored.py +347 -0
  118. claude_mpm/hooks/claude_hooks/memory_integration.py +2 -4
  119. claude_mpm/hooks/claude_hooks/response_tracking.py +15 -11
  120. claude_mpm/hooks/claude_hooks/services/__init__.py +13 -0
  121. claude_mpm/hooks/claude_hooks/services/connection_manager.py +190 -0
  122. claude_mpm/hooks/claude_hooks/services/duplicate_detector.py +106 -0
  123. claude_mpm/hooks/claude_hooks/services/state_manager.py +282 -0
  124. claude_mpm/hooks/claude_hooks/services/subagent_processor.py +374 -0
  125. claude_mpm/hooks/claude_hooks/tool_analysis.py +12 -18
  126. claude_mpm/hooks/memory_integration_hook.py +5 -5
  127. claude_mpm/hooks/tool_call_interceptor.py +1 -1
  128. claude_mpm/hooks/validation_hooks.py +4 -4
  129. claude_mpm/init.py +4 -9
  130. claude_mpm/models/__init__.py +2 -2
  131. claude_mpm/models/agent_session.py +11 -14
  132. claude_mpm/scripts/mcp_server.py +20 -11
  133. claude_mpm/scripts/mcp_wrapper.py +5 -5
  134. claude_mpm/scripts/mpm_doctor.py +321 -0
  135. claude_mpm/scripts/socketio_daemon.py +28 -25
  136. claude_mpm/scripts/socketio_daemon_hardened.py +298 -258
  137. claude_mpm/scripts/socketio_server_manager.py +116 -95
  138. claude_mpm/services/__init__.py +49 -49
  139. claude_mpm/services/agent_capabilities_service.py +12 -18
  140. claude_mpm/services/agents/__init__.py +22 -22
  141. claude_mpm/services/agents/agent_builder.py +140 -119
  142. claude_mpm/services/agents/deployment/__init__.py +3 -3
  143. claude_mpm/services/agents/deployment/agent_config_provider.py +9 -9
  144. claude_mpm/services/agents/deployment/agent_configuration_manager.py +19 -20
  145. claude_mpm/services/agents/deployment/agent_definition_factory.py +1 -5
  146. claude_mpm/services/agents/deployment/agent_deployment.py +129 -511
  147. claude_mpm/services/agents/deployment/agent_discovery_service.py +4 -8
  148. claude_mpm/services/agents/deployment/agent_environment_manager.py +2 -7
  149. claude_mpm/services/agents/deployment/agent_filesystem_manager.py +6 -10
  150. claude_mpm/services/agents/deployment/agent_format_converter.py +11 -15
  151. claude_mpm/services/agents/deployment/agent_frontmatter_validator.py +2 -3
  152. claude_mpm/services/agents/deployment/agent_lifecycle_manager.py +5 -5
  153. claude_mpm/services/agents/deployment/agent_metrics_collector.py +13 -19
  154. claude_mpm/services/agents/deployment/agent_restore_handler.py +0 -1
  155. claude_mpm/services/agents/deployment/agent_template_builder.py +26 -35
  156. claude_mpm/services/agents/deployment/agent_validator.py +0 -1
  157. claude_mpm/services/agents/deployment/agent_version_manager.py +7 -9
  158. claude_mpm/services/agents/deployment/agent_versioning.py +3 -3
  159. claude_mpm/services/agents/deployment/agents_directory_resolver.py +6 -7
  160. claude_mpm/services/agents/deployment/async_agent_deployment.py +51 -38
  161. claude_mpm/services/agents/deployment/base_agent_locator.py +132 -0
  162. claude_mpm/services/agents/deployment/config/__init__.py +1 -1
  163. claude_mpm/services/agents/deployment/config/deployment_config.py +7 -8
  164. claude_mpm/services/agents/deployment/deployment_results_manager.py +185 -0
  165. claude_mpm/services/agents/deployment/deployment_type_detector.py +1 -1
  166. claude_mpm/services/agents/deployment/deployment_wrapper.py +18 -18
  167. claude_mpm/services/agents/deployment/facade/__init__.py +1 -1
  168. claude_mpm/services/agents/deployment/facade/deployment_executor.py +0 -3
  169. claude_mpm/services/agents/deployment/facade/deployment_facade.py +3 -4
  170. claude_mpm/services/agents/deployment/interface_adapter.py +5 -7
  171. claude_mpm/services/agents/deployment/multi_source_deployment_service.py +345 -276
  172. claude_mpm/services/agents/deployment/pipeline/__init__.py +2 -2
  173. claude_mpm/services/agents/deployment/pipeline/pipeline_builder.py +1 -1
  174. claude_mpm/services/agents/deployment/pipeline/pipeline_context.py +6 -4
  175. claude_mpm/services/agents/deployment/pipeline/pipeline_executor.py +3 -3
  176. claude_mpm/services/agents/deployment/pipeline/steps/__init__.py +2 -2
  177. claude_mpm/services/agents/deployment/pipeline/steps/agent_processing_step.py +14 -13
  178. claude_mpm/services/agents/deployment/pipeline/steps/base_step.py +0 -1
  179. claude_mpm/services/agents/deployment/pipeline/steps/configuration_step.py +1 -1
  180. claude_mpm/services/agents/deployment/pipeline/steps/target_directory_step.py +8 -9
  181. claude_mpm/services/agents/deployment/pipeline/steps/validation_step.py +1 -1
  182. claude_mpm/services/agents/deployment/processors/__init__.py +1 -1
  183. claude_mpm/services/agents/deployment/processors/agent_processor.py +20 -16
  184. claude_mpm/services/agents/deployment/refactored_agent_deployment_service.py +5 -12
  185. claude_mpm/services/agents/deployment/results/__init__.py +1 -1
  186. claude_mpm/services/agents/deployment/results/deployment_result_builder.py +1 -1
  187. claude_mpm/services/agents/deployment/single_agent_deployer.py +315 -0
  188. claude_mpm/services/agents/deployment/strategies/__init__.py +2 -2
  189. claude_mpm/services/agents/deployment/strategies/base_strategy.py +1 -7
  190. claude_mpm/services/agents/deployment/strategies/project_strategy.py +1 -4
  191. claude_mpm/services/agents/deployment/strategies/system_strategy.py +2 -3
  192. claude_mpm/services/agents/deployment/strategies/user_strategy.py +3 -7
  193. claude_mpm/services/agents/deployment/validation/__init__.py +1 -1
  194. claude_mpm/services/agents/deployment/validation/agent_validator.py +1 -1
  195. claude_mpm/services/agents/deployment/validation/template_validator.py +2 -2
  196. claude_mpm/services/agents/deployment/validation/validation_result.py +2 -6
  197. claude_mpm/services/agents/loading/__init__.py +1 -1
  198. claude_mpm/services/agents/loading/agent_profile_loader.py +6 -12
  199. claude_mpm/services/agents/loading/base_agent_manager.py +5 -5
  200. claude_mpm/services/agents/loading/framework_agent_loader.py +2 -4
  201. claude_mpm/services/agents/management/__init__.py +1 -1
  202. claude_mpm/services/agents/management/agent_capabilities_generator.py +1 -3
  203. claude_mpm/services/agents/management/agent_management_service.py +5 -9
  204. claude_mpm/services/agents/memory/__init__.py +4 -4
  205. claude_mpm/services/agents/memory/agent_memory_manager.py +157 -503
  206. claude_mpm/services/agents/memory/agent_persistence_service.py +0 -2
  207. claude_mpm/services/agents/memory/content_manager.py +44 -38
  208. claude_mpm/services/agents/memory/memory_categorization_service.py +165 -0
  209. claude_mpm/services/agents/memory/memory_file_service.py +103 -0
  210. claude_mpm/services/agents/memory/memory_format_service.py +201 -0
  211. claude_mpm/services/agents/memory/memory_limits_service.py +99 -0
  212. claude_mpm/services/agents/memory/template_generator.py +4 -6
  213. claude_mpm/services/agents/registry/__init__.py +11 -7
  214. claude_mpm/services/agents/registry/deployed_agent_discovery.py +30 -27
  215. claude_mpm/services/agents/registry/modification_tracker.py +3 -6
  216. claude_mpm/services/async_session_logger.py +1 -2
  217. claude_mpm/services/claude_session_logger.py +1 -2
  218. claude_mpm/services/cli/__init__.py +18 -0
  219. claude_mpm/services/cli/agent_cleanup_service.py +407 -0
  220. claude_mpm/services/cli/agent_dependency_service.py +395 -0
  221. claude_mpm/services/cli/agent_listing_service.py +463 -0
  222. claude_mpm/services/cli/agent_output_formatter.py +605 -0
  223. claude_mpm/services/cli/agent_validation_service.py +589 -0
  224. claude_mpm/services/cli/dashboard_launcher.py +424 -0
  225. claude_mpm/services/cli/memory_crud_service.py +617 -0
  226. claude_mpm/services/cli/memory_output_formatter.py +604 -0
  227. claude_mpm/services/cli/session_manager.py +513 -0
  228. claude_mpm/services/cli/socketio_manager.py +498 -0
  229. claude_mpm/services/cli/startup_checker.py +370 -0
  230. claude_mpm/services/command_deployment_service.py +173 -0
  231. claude_mpm/services/command_handler_service.py +20 -22
  232. claude_mpm/services/core/__init__.py +25 -25
  233. claude_mpm/services/core/base.py +0 -5
  234. claude_mpm/services/core/cache_manager.py +311 -0
  235. claude_mpm/services/core/interfaces/__init__.py +32 -32
  236. claude_mpm/services/core/interfaces/agent.py +0 -21
  237. claude_mpm/services/core/interfaces/communication.py +0 -27
  238. claude_mpm/services/core/interfaces/infrastructure.py +0 -56
  239. claude_mpm/services/core/interfaces/service.py +0 -29
  240. claude_mpm/services/core/memory_manager.py +637 -0
  241. claude_mpm/services/core/path_resolver.py +498 -0
  242. claude_mpm/services/core/service_container.py +520 -0
  243. claude_mpm/services/core/service_interfaces.py +436 -0
  244. claude_mpm/services/diagnostics/__init__.py +1 -1
  245. claude_mpm/services/diagnostics/checks/__init__.py +6 -6
  246. claude_mpm/services/diagnostics/checks/agent_check.py +152 -97
  247. claude_mpm/services/diagnostics/checks/base_check.py +12 -16
  248. claude_mpm/services/diagnostics/checks/claude_desktop_check.py +84 -81
  249. claude_mpm/services/diagnostics/checks/common_issues_check.py +99 -91
  250. claude_mpm/services/diagnostics/checks/configuration_check.py +82 -77
  251. claude_mpm/services/diagnostics/checks/filesystem_check.py +67 -68
  252. claude_mpm/services/diagnostics/checks/installation_check.py +254 -94
  253. claude_mpm/services/diagnostics/checks/mcp_check.py +90 -88
  254. claude_mpm/services/diagnostics/checks/monitor_check.py +75 -76
  255. claude_mpm/services/diagnostics/checks/startup_log_check.py +67 -73
  256. claude_mpm/services/diagnostics/diagnostic_runner.py +67 -59
  257. claude_mpm/services/diagnostics/doctor_reporter.py +107 -70
  258. claude_mpm/services/diagnostics/models.py +21 -19
  259. claude_mpm/services/event_aggregator.py +10 -17
  260. claude_mpm/services/event_bus/__init__.py +1 -1
  261. claude_mpm/services/event_bus/config.py +54 -35
  262. claude_mpm/services/event_bus/event_bus.py +76 -71
  263. claude_mpm/services/event_bus/relay.py +74 -64
  264. claude_mpm/services/events/__init__.py +11 -11
  265. claude_mpm/services/events/consumers/__init__.py +3 -3
  266. claude_mpm/services/events/consumers/dead_letter.py +71 -63
  267. claude_mpm/services/events/consumers/logging.py +39 -37
  268. claude_mpm/services/events/consumers/metrics.py +56 -57
  269. claude_mpm/services/events/consumers/socketio.py +82 -81
  270. claude_mpm/services/events/core.py +110 -99
  271. claude_mpm/services/events/interfaces.py +56 -72
  272. claude_mpm/services/events/producers/__init__.py +1 -1
  273. claude_mpm/services/events/producers/hook.py +38 -38
  274. claude_mpm/services/events/producers/system.py +46 -44
  275. claude_mpm/services/exceptions.py +81 -80
  276. claude_mpm/services/framework_claude_md_generator/__init__.py +2 -4
  277. claude_mpm/services/framework_claude_md_generator/content_assembler.py +3 -5
  278. claude_mpm/services/framework_claude_md_generator/content_validator.py +1 -1
  279. claude_mpm/services/framework_claude_md_generator/deployment_manager.py +4 -4
  280. claude_mpm/services/framework_claude_md_generator/section_generators/__init__.py +0 -1
  281. claude_mpm/services/framework_claude_md_generator/section_generators/agents.py +0 -2
  282. claude_mpm/services/framework_claude_md_generator/version_manager.py +4 -5
  283. claude_mpm/services/hook_service.py +6 -9
  284. claude_mpm/services/infrastructure/__init__.py +1 -1
  285. claude_mpm/services/infrastructure/context_preservation.py +8 -12
  286. claude_mpm/services/infrastructure/monitoring.py +21 -23
  287. claude_mpm/services/mcp_gateway/__init__.py +37 -37
  288. claude_mpm/services/mcp_gateway/auto_configure.py +95 -103
  289. claude_mpm/services/mcp_gateway/config/__init__.py +1 -1
  290. claude_mpm/services/mcp_gateway/config/config_loader.py +23 -25
  291. claude_mpm/services/mcp_gateway/config/config_schema.py +5 -5
  292. claude_mpm/services/mcp_gateway/config/configuration.py +9 -6
  293. claude_mpm/services/mcp_gateway/core/__init__.py +10 -10
  294. claude_mpm/services/mcp_gateway/core/base.py +0 -3
  295. claude_mpm/services/mcp_gateway/core/interfaces.py +1 -38
  296. claude_mpm/services/mcp_gateway/core/process_pool.py +99 -93
  297. claude_mpm/services/mcp_gateway/core/singleton_manager.py +65 -62
  298. claude_mpm/services/mcp_gateway/core/startup_verification.py +75 -74
  299. claude_mpm/services/mcp_gateway/main.py +2 -1
  300. claude_mpm/services/mcp_gateway/registry/service_registry.py +5 -8
  301. claude_mpm/services/mcp_gateway/registry/tool_registry.py +1 -1
  302. claude_mpm/services/mcp_gateway/server/__init__.py +1 -1
  303. claude_mpm/services/mcp_gateway/server/mcp_gateway.py +12 -19
  304. claude_mpm/services/mcp_gateway/server/stdio_handler.py +4 -3
  305. claude_mpm/services/mcp_gateway/server/stdio_server.py +79 -71
  306. claude_mpm/services/mcp_gateway/tools/__init__.py +2 -2
  307. claude_mpm/services/mcp_gateway/tools/base_adapter.py +5 -6
  308. claude_mpm/services/mcp_gateway/tools/document_summarizer.py +13 -22
  309. claude_mpm/services/mcp_gateway/tools/health_check_tool.py +79 -78
  310. claude_mpm/services/mcp_gateway/tools/hello_world.py +12 -14
  311. claude_mpm/services/mcp_gateway/tools/ticket_tools.py +42 -49
  312. claude_mpm/services/mcp_gateway/tools/unified_ticket_tool.py +51 -55
  313. claude_mpm/services/memory/__init__.py +3 -3
  314. claude_mpm/services/memory/builder.py +3 -6
  315. claude_mpm/services/memory/cache/__init__.py +1 -1
  316. claude_mpm/services/memory/cache/shared_prompt_cache.py +3 -5
  317. claude_mpm/services/memory/cache/simple_cache.py +1 -1
  318. claude_mpm/services/memory/indexed_memory.py +5 -7
  319. claude_mpm/services/memory/optimizer.py +7 -10
  320. claude_mpm/services/memory/router.py +8 -9
  321. claude_mpm/services/memory_hook_service.py +48 -34
  322. claude_mpm/services/monitor_build_service.py +77 -73
  323. claude_mpm/services/port_manager.py +130 -108
  324. claude_mpm/services/project/analyzer.py +12 -10
  325. claude_mpm/services/project/registry.py +11 -11
  326. claude_mpm/services/recovery_manager.py +10 -19
  327. claude_mpm/services/response_tracker.py +0 -1
  328. claude_mpm/services/runner_configuration_service.py +19 -20
  329. claude_mpm/services/session_management_service.py +7 -11
  330. claude_mpm/services/shared/__init__.py +1 -1
  331. claude_mpm/services/shared/async_service_base.py +58 -50
  332. claude_mpm/services/shared/config_service_base.py +73 -67
  333. claude_mpm/services/shared/lifecycle_service_base.py +82 -78
  334. claude_mpm/services/shared/manager_base.py +94 -82
  335. claude_mpm/services/shared/service_factory.py +96 -98
  336. claude_mpm/services/socketio/__init__.py +3 -3
  337. claude_mpm/services/socketio/client_proxy.py +5 -5
  338. claude_mpm/services/socketio/event_normalizer.py +199 -181
  339. claude_mpm/services/socketio/handlers/__init__.py +3 -3
  340. claude_mpm/services/socketio/handlers/base.py +5 -4
  341. claude_mpm/services/socketio/handlers/connection.py +163 -136
  342. claude_mpm/services/socketio/handlers/file.py +13 -14
  343. claude_mpm/services/socketio/handlers/git.py +12 -7
  344. claude_mpm/services/socketio/handlers/hook.py +49 -44
  345. claude_mpm/services/socketio/handlers/memory.py +0 -1
  346. claude_mpm/services/socketio/handlers/project.py +0 -1
  347. claude_mpm/services/socketio/handlers/registry.py +37 -19
  348. claude_mpm/services/socketio/migration_utils.py +98 -84
  349. claude_mpm/services/socketio/server/__init__.py +1 -1
  350. claude_mpm/services/socketio/server/broadcaster.py +81 -87
  351. claude_mpm/services/socketio/server/core.py +65 -54
  352. claude_mpm/services/socketio/server/eventbus_integration.py +95 -56
  353. claude_mpm/services/socketio/server/main.py +64 -38
  354. claude_mpm/services/socketio_client_manager.py +10 -12
  355. claude_mpm/services/subprocess_launcher_service.py +4 -7
  356. claude_mpm/services/system_instructions_service.py +13 -14
  357. claude_mpm/services/ticket_manager.py +2 -2
  358. claude_mpm/services/utility_service.py +5 -13
  359. claude_mpm/services/version_control/__init__.py +16 -16
  360. claude_mpm/services/version_control/branch_strategy.py +5 -8
  361. claude_mpm/services/version_control/conflict_resolution.py +9 -23
  362. claude_mpm/services/version_control/git_operations.py +5 -7
  363. claude_mpm/services/version_control/semantic_versioning.py +16 -17
  364. claude_mpm/services/version_control/version_parser.py +13 -18
  365. claude_mpm/services/version_service.py +10 -11
  366. claude_mpm/storage/__init__.py +1 -1
  367. claude_mpm/storage/state_storage.py +22 -28
  368. claude_mpm/utils/__init__.py +6 -6
  369. claude_mpm/utils/agent_dependency_loader.py +47 -33
  370. claude_mpm/utils/config_manager.py +11 -14
  371. claude_mpm/utils/dependency_cache.py +1 -1
  372. claude_mpm/utils/dependency_manager.py +13 -17
  373. claude_mpm/utils/dependency_strategies.py +8 -10
  374. claude_mpm/utils/environment_context.py +3 -9
  375. claude_mpm/utils/error_handler.py +3 -13
  376. claude_mpm/utils/file_utils.py +1 -1
  377. claude_mpm/utils/path_operations.py +8 -12
  378. claude_mpm/utils/robust_installer.py +110 -33
  379. claude_mpm/utils/subprocess_utils.py +5 -6
  380. claude_mpm/validation/agent_validator.py +3 -6
  381. claude_mpm/validation/frontmatter_validator.py +1 -1
  382. {claude_mpm-4.1.1.dist-info → claude_mpm-4.1.3.dist-info}/METADATA +1 -1
  383. claude_mpm-4.1.3.dist-info/RECORD +528 -0
  384. claude_mpm/cli/commands/run_config_checker.py +0 -160
  385. claude_mpm-4.1.1.dist-info/RECORD +0 -494
  386. {claude_mpm-4.1.1.dist-info → claude_mpm-4.1.3.dist-info}/WHEEL +0 -0
  387. {claude_mpm-4.1.1.dist-info → claude_mpm-4.1.3.dist-info}/entry_points.txt +0 -0
  388. {claude_mpm-4.1.1.dist-info → claude_mpm-4.1.3.dist-info}/licenses/LICENSE +0 -0
  389. {claude_mpm-4.1.1.dist-info → claude_mpm-4.1.3.dist-info}/top_level.txt +0 -0
@@ -7,9 +7,7 @@ Extracted from run.py to reduce complexity and improve maintainability.
7
7
  import os
8
8
  import subprocess
9
9
  import sys
10
- import time
11
10
  import webbrowser
12
- from pathlib import Path
13
11
 
14
12
  from ...core.unified_paths import get_package_root
15
13
  from ...services.port_manager import PortManager
@@ -43,7 +41,7 @@ class SocketIOMonitor:
43
41
  print(" This is unexpected - dependency installation may have failed.")
44
42
  return False, False
45
43
 
46
- print(f"🚀 Setting up Socket.IO monitor...")
44
+ print("🚀 Setting up Socket.IO monitor...")
47
45
  self.logger.info(f"Launching Socket.IO monitor (requested port: {port})")
48
46
 
49
47
  # First, check if there's already a running SocketIO server
@@ -79,55 +77,55 @@ class SocketIOMonitor:
79
77
  try:
80
78
  # Check if we should suppress browser opening (for tests)
81
79
  if os.environ.get("CLAUDE_MPM_NO_BROWSER") != "1":
82
- print(f"🌐 Opening dashboard in browser...")
80
+ print("🌐 Opening dashboard in browser...")
83
81
  self.open_in_browser_tab(dashboard_url)
84
82
  self.logger.info(f"Socket.IO dashboard opened: {dashboard_url}")
85
83
  else:
86
- print(f"🌐 Browser opening suppressed (CLAUDE_MPM_NO_BROWSER=1)")
84
+ print("🌐 Browser opening suppressed (CLAUDE_MPM_NO_BROWSER=1)")
87
85
  self.logger.info(
88
- f"Browser opening suppressed by environment variable"
86
+ "Browser opening suppressed by environment variable"
89
87
  )
90
88
  return True, True
91
89
  except Exception as e:
92
90
  self.logger.warning(f"Failed to open browser: {e}")
93
- print(f"⚠️ Could not open browser automatically")
91
+ print("⚠️ Could not open browser automatically")
94
92
  print(f"📊 Please open manually: {dashboard_url}")
95
93
  return True, False
96
94
  else:
97
95
  # Start standalone Socket.IO server
98
- print(f"🔧 Starting Socket.IO server...")
96
+ print("🔧 Starting Socket.IO server...")
99
97
  server_started = self.start_standalone_server(socketio_port)
100
98
 
101
99
  if server_started:
102
- print(f"✅ Socket.IO server started successfully")
100
+ print("✅ Socket.IO server started successfully")
103
101
  print(f"📊 Dashboard: {dashboard_url}")
104
102
 
105
103
  # Open browser
106
104
  try:
107
105
  if os.environ.get("CLAUDE_MPM_NO_BROWSER") != "1":
108
- print(f"🌐 Opening dashboard in browser...")
106
+ print("🌐 Opening dashboard in browser...")
109
107
  self.open_in_browser_tab(dashboard_url)
110
108
  self.logger.info(
111
109
  f"Socket.IO dashboard opened: {dashboard_url}"
112
110
  )
113
111
  else:
114
112
  print(
115
- f"🌐 Browser opening suppressed (CLAUDE_MPM_NO_BROWSER=1)"
113
+ "🌐 Browser opening suppressed (CLAUDE_MPM_NO_BROWSER=1)"
116
114
  )
117
115
  return True, True
118
116
  except Exception as e:
119
117
  self.logger.warning(f"Failed to open browser: {e}")
120
- print(f"⚠️ Could not open browser automatically")
118
+ print("⚠️ Could not open browser automatically")
121
119
  print(f"📊 Please open manually: {dashboard_url}")
122
120
  return True, False
123
121
  else:
124
- print(f"❌ Failed to start Socket.IO server")
125
- print(f"💡 Troubleshooting tips:")
122
+ print("❌ Failed to start Socket.IO server")
123
+ print("💡 Troubleshooting tips:")
126
124
  print(f" - Check if port {socketio_port} is already in use")
127
125
  print(
128
- f" - Verify Socket.IO dependencies: pip install python-socketio aiohttp"
126
+ " - Verify Socket.IO dependencies: pip install python-socketio aiohttp"
129
127
  )
130
- print(f" - Try a different port with --websocket-port")
128
+ print(" - Try a different port with --websocket-port")
131
129
  return False, False
132
130
 
133
131
  except Exception as e:
@@ -188,6 +186,7 @@ class SocketIOMonitor:
188
186
  capture_output=True,
189
187
  text=True,
190
188
  timeout=30,
189
+ check=False,
191
190
  )
192
191
 
193
192
  if result.returncode == 0:
@@ -195,9 +194,8 @@ class SocketIOMonitor:
195
194
  f"Socket.IO daemon started successfully on port {port}"
196
195
  )
197
196
  return True
198
- else:
199
- self.logger.error(f"Failed to start Socket.IO daemon: {result.stderr}")
200
- return False
197
+ self.logger.error(f"Failed to start Socket.IO daemon: {result.stderr}")
198
+ return False
201
199
 
202
200
  except Exception as e:
203
201
  self.logger.error(f"Failed to start standalone Socket.IO server: {e}")
@@ -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
  ]