claude-mpm 3.9.11__py3-none-any.whl → 4.0.4__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 (434) hide show
  1. claude_mpm/VERSION +1 -1
  2. claude_mpm/__init__.py +2 -2
  3. claude_mpm/__main__.py +3 -2
  4. claude_mpm/agents/__init__.py +85 -79
  5. claude_mpm/agents/agent_loader.py +464 -1003
  6. claude_mpm/agents/agent_loader_integration.py +45 -45
  7. claude_mpm/agents/agents_metadata.py +29 -30
  8. claude_mpm/agents/async_agent_loader.py +156 -138
  9. claude_mpm/agents/base_agent.json +1 -1
  10. claude_mpm/agents/base_agent_loader.py +179 -151
  11. claude_mpm/agents/frontmatter_validator.py +229 -130
  12. claude_mpm/agents/schema/agent_schema.json +1 -1
  13. claude_mpm/agents/system_agent_config.py +213 -147
  14. claude_mpm/agents/templates/__init__.py +13 -13
  15. claude_mpm/agents/templates/code_analyzer.json +2 -2
  16. claude_mpm/agents/templates/data_engineer.json +1 -1
  17. claude_mpm/agents/templates/documentation.json +23 -11
  18. claude_mpm/agents/templates/engineer.json +22 -6
  19. claude_mpm/agents/templates/memory_manager.json +1 -1
  20. claude_mpm/agents/templates/ops.json +2 -2
  21. claude_mpm/agents/templates/project_organizer.json +1 -1
  22. claude_mpm/agents/templates/qa.json +1 -1
  23. claude_mpm/agents/templates/refactoring_engineer.json +222 -0
  24. claude_mpm/agents/templates/research.json +20 -14
  25. claude_mpm/agents/templates/security.json +1 -1
  26. claude_mpm/agents/templates/ticketing.json +2 -2
  27. claude_mpm/agents/templates/version_control.json +1 -1
  28. claude_mpm/agents/templates/web_qa.json +3 -1
  29. claude_mpm/agents/templates/web_ui.json +2 -2
  30. claude_mpm/cli/__init__.py +79 -51
  31. claude_mpm/cli/__main__.py +3 -2
  32. claude_mpm/cli/commands/__init__.py +20 -20
  33. claude_mpm/cli/commands/agents.py +279 -247
  34. claude_mpm/cli/commands/aggregate.py +138 -157
  35. claude_mpm/cli/commands/cleanup.py +147 -147
  36. claude_mpm/cli/commands/config.py +93 -76
  37. claude_mpm/cli/commands/info.py +17 -16
  38. claude_mpm/cli/commands/mcp.py +140 -905
  39. claude_mpm/cli/commands/mcp_command_router.py +139 -0
  40. claude_mpm/cli/commands/mcp_config_commands.py +20 -0
  41. claude_mpm/cli/commands/mcp_install_commands.py +20 -0
  42. claude_mpm/cli/commands/mcp_server_commands.py +175 -0
  43. claude_mpm/cli/commands/mcp_tool_commands.py +34 -0
  44. claude_mpm/cli/commands/memory.py +239 -203
  45. claude_mpm/cli/commands/monitor.py +330 -86
  46. claude_mpm/cli/commands/run.py +380 -429
  47. claude_mpm/cli/commands/run_config_checker.py +160 -0
  48. claude_mpm/cli/commands/socketio_monitor.py +235 -0
  49. claude_mpm/cli/commands/tickets.py +363 -220
  50. claude_mpm/cli/parser.py +24 -1156
  51. claude_mpm/cli/parsers/__init__.py +29 -0
  52. claude_mpm/cli/parsers/agents_parser.py +136 -0
  53. claude_mpm/cli/parsers/base_parser.py +331 -0
  54. claude_mpm/cli/parsers/config_parser.py +85 -0
  55. claude_mpm/cli/parsers/mcp_parser.py +152 -0
  56. claude_mpm/cli/parsers/memory_parser.py +138 -0
  57. claude_mpm/cli/parsers/monitor_parser.py +124 -0
  58. claude_mpm/cli/parsers/run_parser.py +147 -0
  59. claude_mpm/cli/parsers/tickets_parser.py +203 -0
  60. claude_mpm/cli/ticket_cli.py +7 -3
  61. claude_mpm/cli/utils.py +55 -37
  62. claude_mpm/cli_module/__init__.py +6 -6
  63. claude_mpm/cli_module/args.py +188 -140
  64. claude_mpm/cli_module/commands.py +79 -70
  65. claude_mpm/cli_module/migration_example.py +38 -60
  66. claude_mpm/config/__init__.py +32 -25
  67. claude_mpm/config/agent_config.py +151 -119
  68. claude_mpm/config/experimental_features.py +71 -73
  69. claude_mpm/config/paths.py +94 -208
  70. claude_mpm/config/socketio_config.py +84 -73
  71. claude_mpm/constants.py +35 -18
  72. claude_mpm/core/__init__.py +9 -6
  73. claude_mpm/core/agent_name_normalizer.py +68 -71
  74. claude_mpm/core/agent_registry.py +372 -521
  75. claude_mpm/core/agent_session_manager.py +74 -63
  76. claude_mpm/core/base_service.py +116 -87
  77. claude_mpm/core/cache.py +119 -153
  78. claude_mpm/core/claude_runner.py +425 -1120
  79. claude_mpm/core/config.py +263 -168
  80. claude_mpm/core/config_aliases.py +69 -61
  81. claude_mpm/core/config_constants.py +292 -0
  82. claude_mpm/core/constants.py +57 -99
  83. claude_mpm/core/container.py +211 -178
  84. claude_mpm/core/exceptions.py +233 -89
  85. claude_mpm/core/factories.py +92 -54
  86. claude_mpm/core/framework_loader.py +378 -220
  87. claude_mpm/core/hook_manager.py +198 -83
  88. claude_mpm/core/hook_performance_config.py +136 -0
  89. claude_mpm/core/injectable_service.py +61 -55
  90. claude_mpm/core/interactive_session.py +165 -155
  91. claude_mpm/core/interfaces.py +221 -195
  92. claude_mpm/core/lazy.py +96 -96
  93. claude_mpm/core/logger.py +133 -107
  94. claude_mpm/core/logging_config.py +185 -157
  95. claude_mpm/core/minimal_framework_loader.py +20 -15
  96. claude_mpm/core/mixins.py +30 -29
  97. claude_mpm/core/oneshot_session.py +215 -181
  98. claude_mpm/core/optimized_agent_loader.py +134 -138
  99. claude_mpm/core/optimized_startup.py +159 -157
  100. claude_mpm/core/pm_hook_interceptor.py +85 -72
  101. claude_mpm/core/service_registry.py +103 -101
  102. claude_mpm/core/session_manager.py +97 -87
  103. claude_mpm/core/socketio_pool.py +212 -158
  104. claude_mpm/core/tool_access_control.py +58 -51
  105. claude_mpm/core/types.py +46 -24
  106. claude_mpm/core/typing_utils.py +166 -82
  107. claude_mpm/core/unified_agent_registry.py +721 -0
  108. claude_mpm/core/unified_config.py +550 -0
  109. claude_mpm/core/unified_paths.py +549 -0
  110. claude_mpm/dashboard/index.html +1 -1
  111. claude_mpm/dashboard/open_dashboard.py +51 -17
  112. claude_mpm/dashboard/static/built/components/agent-inference.js +2 -0
  113. claude_mpm/dashboard/static/built/components/event-processor.js +2 -0
  114. claude_mpm/dashboard/static/built/components/event-viewer.js +2 -0
  115. claude_mpm/dashboard/static/built/components/export-manager.js +2 -0
  116. claude_mpm/dashboard/static/built/components/file-tool-tracker.js +2 -0
  117. claude_mpm/dashboard/static/built/components/hud-library-loader.js +2 -0
  118. claude_mpm/dashboard/static/built/components/hud-manager.js +2 -0
  119. claude_mpm/dashboard/static/built/components/hud-visualizer.js +2 -0
  120. claude_mpm/dashboard/static/built/components/module-viewer.js +2 -0
  121. claude_mpm/dashboard/static/built/components/session-manager.js +2 -0
  122. claude_mpm/dashboard/static/built/components/socket-manager.js +2 -0
  123. claude_mpm/dashboard/static/built/components/ui-state-manager.js +2 -0
  124. claude_mpm/dashboard/static/built/components/working-directory.js +2 -0
  125. claude_mpm/dashboard/static/built/dashboard.js +2 -0
  126. claude_mpm/dashboard/static/built/socket-client.js +2 -0
  127. claude_mpm/dashboard/static/css/dashboard.css +27 -8
  128. claude_mpm/dashboard/static/dist/components/agent-inference.js +2 -0
  129. claude_mpm/dashboard/static/dist/components/event-processor.js +2 -0
  130. claude_mpm/dashboard/static/dist/components/event-viewer.js +2 -0
  131. claude_mpm/dashboard/static/dist/components/export-manager.js +2 -0
  132. claude_mpm/dashboard/static/dist/components/file-tool-tracker.js +2 -0
  133. claude_mpm/dashboard/static/dist/components/hud-library-loader.js +2 -0
  134. claude_mpm/dashboard/static/dist/components/hud-manager.js +2 -0
  135. claude_mpm/dashboard/static/dist/components/hud-visualizer.js +2 -0
  136. claude_mpm/dashboard/static/dist/components/module-viewer.js +2 -0
  137. claude_mpm/dashboard/static/dist/components/session-manager.js +2 -0
  138. claude_mpm/dashboard/static/dist/components/socket-manager.js +2 -0
  139. claude_mpm/dashboard/static/dist/components/ui-state-manager.js +2 -0
  140. claude_mpm/dashboard/static/dist/components/working-directory.js +2 -0
  141. claude_mpm/dashboard/static/dist/dashboard.js +2 -0
  142. claude_mpm/dashboard/static/dist/socket-client.js +2 -0
  143. claude_mpm/dashboard/static/js/components/agent-inference.js +80 -76
  144. claude_mpm/dashboard/static/js/components/event-processor.js +71 -67
  145. claude_mpm/dashboard/static/js/components/event-viewer.js +93 -72
  146. claude_mpm/dashboard/static/js/components/export-manager.js +31 -28
  147. claude_mpm/dashboard/static/js/components/file-tool-tracker.js +110 -96
  148. claude_mpm/dashboard/static/js/components/hud-library-loader.js +11 -11
  149. claude_mpm/dashboard/static/js/components/hud-manager.js +73 -73
  150. claude_mpm/dashboard/static/js/components/hud-visualizer.js +163 -163
  151. claude_mpm/dashboard/static/js/components/module-viewer.js +305 -233
  152. claude_mpm/dashboard/static/js/components/session-manager.js +32 -29
  153. claude_mpm/dashboard/static/js/components/socket-manager.js +27 -20
  154. claude_mpm/dashboard/static/js/components/ui-state-manager.js +21 -18
  155. claude_mpm/dashboard/static/js/components/working-directory.js +74 -71
  156. claude_mpm/dashboard/static/js/dashboard.js +178 -453
  157. claude_mpm/dashboard/static/js/extension-error-handler.js +164 -0
  158. claude_mpm/dashboard/static/js/socket-client.js +133 -53
  159. claude_mpm/dashboard/templates/index.html +40 -50
  160. claude_mpm/experimental/cli_enhancements.py +60 -58
  161. claude_mpm/generators/__init__.py +1 -1
  162. claude_mpm/generators/agent_profile_generator.py +75 -65
  163. claude_mpm/hooks/__init__.py +1 -1
  164. claude_mpm/hooks/base_hook.py +33 -28
  165. claude_mpm/hooks/claude_hooks/__init__.py +1 -1
  166. claude_mpm/hooks/claude_hooks/connection_pool.py +120 -0
  167. claude_mpm/hooks/claude_hooks/event_handlers.py +743 -0
  168. claude_mpm/hooks/claude_hooks/hook_handler.py +415 -1331
  169. claude_mpm/hooks/claude_hooks/hook_wrapper.sh +4 -4
  170. claude_mpm/hooks/claude_hooks/memory_integration.py +221 -0
  171. claude_mpm/hooks/claude_hooks/response_tracking.py +348 -0
  172. claude_mpm/hooks/claude_hooks/tool_analysis.py +230 -0
  173. claude_mpm/hooks/memory_integration_hook.py +140 -100
  174. claude_mpm/hooks/tool_call_interceptor.py +89 -76
  175. claude_mpm/hooks/validation_hooks.py +57 -49
  176. claude_mpm/init.py +145 -121
  177. claude_mpm/models/__init__.py +9 -9
  178. claude_mpm/models/agent_definition.py +33 -23
  179. claude_mpm/models/agent_session.py +228 -200
  180. claude_mpm/scripts/__init__.py +1 -1
  181. claude_mpm/scripts/socketio_daemon.py +192 -75
  182. claude_mpm/scripts/socketio_server_manager.py +328 -0
  183. claude_mpm/scripts/start_activity_logging.py +25 -22
  184. claude_mpm/services/__init__.py +68 -43
  185. claude_mpm/services/agent_capabilities_service.py +271 -0
  186. claude_mpm/services/agents/__init__.py +23 -32
  187. claude_mpm/services/agents/deployment/__init__.py +3 -3
  188. claude_mpm/services/agents/deployment/agent_config_provider.py +310 -0
  189. claude_mpm/services/agents/deployment/agent_configuration_manager.py +359 -0
  190. claude_mpm/services/agents/deployment/agent_definition_factory.py +84 -0
  191. claude_mpm/services/agents/deployment/agent_deployment.py +415 -2113
  192. claude_mpm/services/agents/deployment/agent_discovery_service.py +387 -0
  193. claude_mpm/services/agents/deployment/agent_environment_manager.py +293 -0
  194. claude_mpm/services/agents/deployment/agent_filesystem_manager.py +387 -0
  195. claude_mpm/services/agents/deployment/agent_format_converter.py +453 -0
  196. claude_mpm/services/agents/deployment/agent_frontmatter_validator.py +161 -0
  197. claude_mpm/services/agents/deployment/agent_lifecycle_manager.py +345 -495
  198. claude_mpm/services/agents/deployment/agent_metrics_collector.py +279 -0
  199. claude_mpm/services/agents/deployment/agent_restore_handler.py +88 -0
  200. claude_mpm/services/agents/deployment/agent_template_builder.py +406 -0
  201. claude_mpm/services/agents/deployment/agent_validator.py +352 -0
  202. claude_mpm/services/agents/deployment/agent_version_manager.py +313 -0
  203. claude_mpm/services/agents/deployment/agent_versioning.py +6 -9
  204. claude_mpm/services/agents/deployment/agents_directory_resolver.py +79 -0
  205. claude_mpm/services/agents/deployment/async_agent_deployment.py +298 -234
  206. claude_mpm/services/agents/deployment/config/__init__.py +13 -0
  207. claude_mpm/services/agents/deployment/config/deployment_config.py +182 -0
  208. claude_mpm/services/agents/deployment/config/deployment_config_manager.py +200 -0
  209. claude_mpm/services/agents/deployment/deployment_config_loader.py +54 -0
  210. claude_mpm/services/agents/deployment/deployment_type_detector.py +124 -0
  211. claude_mpm/services/agents/deployment/facade/__init__.py +18 -0
  212. claude_mpm/services/agents/deployment/facade/async_deployment_executor.py +159 -0
  213. claude_mpm/services/agents/deployment/facade/deployment_executor.py +73 -0
  214. claude_mpm/services/agents/deployment/facade/deployment_facade.py +270 -0
  215. claude_mpm/services/agents/deployment/facade/sync_deployment_executor.py +178 -0
  216. claude_mpm/services/agents/deployment/interface_adapter.py +227 -0
  217. claude_mpm/services/agents/deployment/lifecycle_health_checker.py +85 -0
  218. claude_mpm/services/agents/deployment/lifecycle_performance_tracker.py +100 -0
  219. claude_mpm/services/agents/deployment/pipeline/__init__.py +32 -0
  220. claude_mpm/services/agents/deployment/pipeline/pipeline_builder.py +158 -0
  221. claude_mpm/services/agents/deployment/pipeline/pipeline_context.py +159 -0
  222. claude_mpm/services/agents/deployment/pipeline/pipeline_executor.py +169 -0
  223. claude_mpm/services/agents/deployment/pipeline/steps/__init__.py +19 -0
  224. claude_mpm/services/agents/deployment/pipeline/steps/agent_processing_step.py +195 -0
  225. claude_mpm/services/agents/deployment/pipeline/steps/base_step.py +119 -0
  226. claude_mpm/services/agents/deployment/pipeline/steps/configuration_step.py +79 -0
  227. claude_mpm/services/agents/deployment/pipeline/steps/target_directory_step.py +90 -0
  228. claude_mpm/services/agents/deployment/pipeline/steps/validation_step.py +100 -0
  229. claude_mpm/services/agents/deployment/processors/__init__.py +15 -0
  230. claude_mpm/services/agents/deployment/processors/agent_deployment_context.py +98 -0
  231. claude_mpm/services/agents/deployment/processors/agent_deployment_result.py +235 -0
  232. claude_mpm/services/agents/deployment/processors/agent_processor.py +258 -0
  233. claude_mpm/services/agents/deployment/refactored_agent_deployment_service.py +318 -0
  234. claude_mpm/services/agents/deployment/results/__init__.py +13 -0
  235. claude_mpm/services/agents/deployment/results/deployment_metrics.py +200 -0
  236. claude_mpm/services/agents/deployment/results/deployment_result_builder.py +249 -0
  237. claude_mpm/services/agents/deployment/strategies/__init__.py +25 -0
  238. claude_mpm/services/agents/deployment/strategies/base_strategy.py +119 -0
  239. claude_mpm/services/agents/deployment/strategies/project_strategy.py +150 -0
  240. claude_mpm/services/agents/deployment/strategies/strategy_selector.py +117 -0
  241. claude_mpm/services/agents/deployment/strategies/system_strategy.py +116 -0
  242. claude_mpm/services/agents/deployment/strategies/user_strategy.py +137 -0
  243. claude_mpm/services/agents/deployment/system_instructions_deployer.py +108 -0
  244. claude_mpm/services/agents/deployment/validation/__init__.py +19 -0
  245. claude_mpm/services/agents/deployment/validation/agent_validator.py +323 -0
  246. claude_mpm/services/agents/deployment/validation/deployment_validator.py +238 -0
  247. claude_mpm/services/agents/deployment/validation/template_validator.py +299 -0
  248. claude_mpm/services/agents/deployment/validation/validation_result.py +226 -0
  249. claude_mpm/services/agents/loading/__init__.py +2 -2
  250. claude_mpm/services/agents/loading/agent_profile_loader.py +259 -229
  251. claude_mpm/services/agents/loading/base_agent_manager.py +90 -81
  252. claude_mpm/services/agents/loading/framework_agent_loader.py +154 -129
  253. claude_mpm/services/agents/management/__init__.py +2 -2
  254. claude_mpm/services/agents/management/agent_capabilities_generator.py +72 -58
  255. claude_mpm/services/agents/management/agent_management_service.py +209 -156
  256. claude_mpm/services/agents/memory/__init__.py +9 -6
  257. claude_mpm/services/agents/memory/agent_memory_manager.py +218 -1152
  258. claude_mpm/services/agents/memory/agent_persistence_service.py +20 -16
  259. claude_mpm/services/agents/memory/analyzer.py +430 -0
  260. claude_mpm/services/agents/memory/content_manager.py +376 -0
  261. claude_mpm/services/agents/memory/template_generator.py +468 -0
  262. claude_mpm/services/agents/registry/__init__.py +7 -10
  263. claude_mpm/services/agents/registry/deployed_agent_discovery.py +122 -97
  264. claude_mpm/services/agents/registry/modification_tracker.py +351 -285
  265. claude_mpm/services/async_session_logger.py +187 -153
  266. claude_mpm/services/claude_session_logger.py +87 -72
  267. claude_mpm/services/command_handler_service.py +217 -0
  268. claude_mpm/services/communication/__init__.py +3 -2
  269. claude_mpm/services/core/__init__.py +50 -97
  270. claude_mpm/services/core/base.py +60 -53
  271. claude_mpm/services/core/interfaces/__init__.py +188 -0
  272. claude_mpm/services/core/interfaces/agent.py +351 -0
  273. claude_mpm/services/core/interfaces/communication.py +343 -0
  274. claude_mpm/services/core/interfaces/infrastructure.py +413 -0
  275. claude_mpm/services/core/interfaces/service.py +434 -0
  276. claude_mpm/services/core/interfaces.py +19 -944
  277. claude_mpm/services/event_aggregator.py +208 -170
  278. claude_mpm/services/exceptions.py +387 -308
  279. claude_mpm/services/framework_claude_md_generator/__init__.py +75 -79
  280. claude_mpm/services/framework_claude_md_generator/content_assembler.py +69 -60
  281. claude_mpm/services/framework_claude_md_generator/content_validator.py +65 -61
  282. claude_mpm/services/framework_claude_md_generator/deployment_manager.py +68 -49
  283. claude_mpm/services/framework_claude_md_generator/section_generators/__init__.py +34 -34
  284. claude_mpm/services/framework_claude_md_generator/section_generators/agents.py +25 -22
  285. claude_mpm/services/framework_claude_md_generator/section_generators/claude_pm_init.py +10 -10
  286. claude_mpm/services/framework_claude_md_generator/section_generators/core_responsibilities.py +4 -3
  287. claude_mpm/services/framework_claude_md_generator/section_generators/delegation_constraints.py +4 -3
  288. claude_mpm/services/framework_claude_md_generator/section_generators/environment_config.py +4 -3
  289. claude_mpm/services/framework_claude_md_generator/section_generators/footer.py +6 -5
  290. claude_mpm/services/framework_claude_md_generator/section_generators/header.py +8 -7
  291. claude_mpm/services/framework_claude_md_generator/section_generators/orchestration_principles.py +4 -3
  292. claude_mpm/services/framework_claude_md_generator/section_generators/role_designation.py +6 -5
  293. claude_mpm/services/framework_claude_md_generator/section_generators/subprocess_validation.py +9 -8
  294. claude_mpm/services/framework_claude_md_generator/section_generators/todo_task_tools.py +4 -3
  295. claude_mpm/services/framework_claude_md_generator/section_generators/troubleshooting.py +5 -4
  296. claude_mpm/services/framework_claude_md_generator/section_manager.py +28 -27
  297. claude_mpm/services/framework_claude_md_generator/version_manager.py +30 -28
  298. claude_mpm/services/hook_service.py +106 -114
  299. claude_mpm/services/infrastructure/__init__.py +7 -5
  300. claude_mpm/services/infrastructure/context_preservation.py +233 -199
  301. claude_mpm/services/infrastructure/daemon_manager.py +279 -0
  302. claude_mpm/services/infrastructure/logging.py +83 -76
  303. claude_mpm/services/infrastructure/monitoring.py +547 -404
  304. claude_mpm/services/mcp_gateway/__init__.py +30 -13
  305. claude_mpm/services/mcp_gateway/config/__init__.py +2 -2
  306. claude_mpm/services/mcp_gateway/config/config_loader.py +61 -56
  307. claude_mpm/services/mcp_gateway/config/config_schema.py +50 -41
  308. claude_mpm/services/mcp_gateway/config/configuration.py +82 -75
  309. claude_mpm/services/mcp_gateway/core/__init__.py +13 -20
  310. claude_mpm/services/mcp_gateway/core/base.py +80 -67
  311. claude_mpm/services/mcp_gateway/core/exceptions.py +60 -46
  312. claude_mpm/services/mcp_gateway/core/interfaces.py +87 -84
  313. claude_mpm/services/mcp_gateway/main.py +287 -137
  314. claude_mpm/services/mcp_gateway/registry/__init__.py +1 -1
  315. claude_mpm/services/mcp_gateway/registry/service_registry.py +97 -94
  316. claude_mpm/services/mcp_gateway/registry/tool_registry.py +135 -126
  317. claude_mpm/services/mcp_gateway/server/__init__.py +2 -2
  318. claude_mpm/services/mcp_gateway/server/mcp_gateway.py +105 -110
  319. claude_mpm/services/mcp_gateway/server/stdio_handler.py +105 -107
  320. claude_mpm/services/mcp_gateway/server/stdio_server.py +691 -0
  321. claude_mpm/services/mcp_gateway/tools/__init__.py +4 -2
  322. claude_mpm/services/mcp_gateway/tools/base_adapter.py +109 -119
  323. claude_mpm/services/mcp_gateway/tools/document_summarizer.py +283 -215
  324. claude_mpm/services/mcp_gateway/tools/hello_world.py +122 -120
  325. claude_mpm/services/mcp_gateway/tools/ticket_tools.py +652 -0
  326. claude_mpm/services/mcp_gateway/tools/unified_ticket_tool.py +606 -0
  327. claude_mpm/services/memory/__init__.py +2 -2
  328. claude_mpm/services/memory/builder.py +451 -362
  329. claude_mpm/services/memory/cache/__init__.py +2 -2
  330. claude_mpm/services/memory/cache/shared_prompt_cache.py +232 -194
  331. claude_mpm/services/memory/cache/simple_cache.py +107 -93
  332. claude_mpm/services/memory/indexed_memory.py +195 -193
  333. claude_mpm/services/memory/optimizer.py +267 -234
  334. claude_mpm/services/memory/router.py +571 -263
  335. claude_mpm/services/memory_hook_service.py +237 -0
  336. claude_mpm/services/port_manager.py +575 -0
  337. claude_mpm/services/project/__init__.py +3 -3
  338. claude_mpm/services/project/analyzer.py +451 -305
  339. claude_mpm/services/project/registry.py +262 -240
  340. claude_mpm/services/recovery_manager.py +287 -231
  341. claude_mpm/services/response_tracker.py +87 -67
  342. claude_mpm/services/runner_configuration_service.py +587 -0
  343. claude_mpm/services/session_management_service.py +304 -0
  344. claude_mpm/services/socketio/__init__.py +4 -4
  345. claude_mpm/services/socketio/client_proxy.py +174 -0
  346. claude_mpm/services/socketio/handlers/__init__.py +3 -3
  347. claude_mpm/services/socketio/handlers/base.py +44 -30
  348. claude_mpm/services/socketio/handlers/connection.py +166 -64
  349. claude_mpm/services/socketio/handlers/file.py +123 -108
  350. claude_mpm/services/socketio/handlers/git.py +607 -373
  351. claude_mpm/services/socketio/handlers/hook.py +185 -0
  352. claude_mpm/services/socketio/handlers/memory.py +4 -4
  353. claude_mpm/services/socketio/handlers/project.py +4 -4
  354. claude_mpm/services/socketio/handlers/registry.py +53 -38
  355. claude_mpm/services/socketio/server/__init__.py +18 -0
  356. claude_mpm/services/socketio/server/broadcaster.py +252 -0
  357. claude_mpm/services/socketio/server/core.py +399 -0
  358. claude_mpm/services/socketio/server/main.py +323 -0
  359. claude_mpm/services/socketio_client_manager.py +160 -133
  360. claude_mpm/services/socketio_server.py +36 -1885
  361. claude_mpm/services/subprocess_launcher_service.py +316 -0
  362. claude_mpm/services/system_instructions_service.py +258 -0
  363. claude_mpm/services/ticket_manager.py +19 -533
  364. claude_mpm/services/utility_service.py +285 -0
  365. claude_mpm/services/version_control/__init__.py +18 -21
  366. claude_mpm/services/version_control/branch_strategy.py +20 -10
  367. claude_mpm/services/version_control/conflict_resolution.py +37 -13
  368. claude_mpm/services/version_control/git_operations.py +52 -21
  369. claude_mpm/services/version_control/semantic_versioning.py +92 -53
  370. claude_mpm/services/version_control/version_parser.py +145 -125
  371. claude_mpm/services/version_service.py +270 -0
  372. claude_mpm/storage/__init__.py +2 -2
  373. claude_mpm/storage/state_storage.py +177 -181
  374. claude_mpm/ticket_wrapper.py +2 -2
  375. claude_mpm/utils/__init__.py +2 -2
  376. claude_mpm/utils/agent_dependency_loader.py +453 -243
  377. claude_mpm/utils/config_manager.py +157 -118
  378. claude_mpm/utils/console.py +1 -1
  379. claude_mpm/utils/dependency_cache.py +102 -107
  380. claude_mpm/utils/dependency_manager.py +52 -47
  381. claude_mpm/utils/dependency_strategies.py +131 -96
  382. claude_mpm/utils/environment_context.py +110 -102
  383. claude_mpm/utils/error_handler.py +75 -55
  384. claude_mpm/utils/file_utils.py +80 -67
  385. claude_mpm/utils/framework_detection.py +12 -11
  386. claude_mpm/utils/import_migration_example.py +12 -60
  387. claude_mpm/utils/imports.py +48 -45
  388. claude_mpm/utils/path_operations.py +100 -93
  389. claude_mpm/utils/robust_installer.py +172 -164
  390. claude_mpm/utils/session_logging.py +30 -23
  391. claude_mpm/utils/subprocess_utils.py +99 -61
  392. claude_mpm/validation/__init__.py +1 -1
  393. claude_mpm/validation/agent_validator.py +151 -111
  394. claude_mpm/validation/frontmatter_validator.py +92 -71
  395. {claude_mpm-3.9.11.dist-info → claude_mpm-4.0.4.dist-info}/METADATA +90 -22
  396. claude_mpm-4.0.4.dist-info/RECORD +417 -0
  397. {claude_mpm-3.9.11.dist-info → claude_mpm-4.0.4.dist-info}/entry_points.txt +1 -0
  398. {claude_mpm-3.9.11.dist-info → claude_mpm-4.0.4.dist-info}/licenses/LICENSE +1 -1
  399. claude_mpm/cli/commands/run_guarded.py +0 -511
  400. claude_mpm/config/memory_guardian_config.py +0 -325
  401. claude_mpm/config/memory_guardian_yaml.py +0 -335
  402. claude_mpm/core/config_paths.py +0 -150
  403. claude_mpm/core/memory_aware_runner.py +0 -353
  404. claude_mpm/dashboard/static/js/dashboard-original.js +0 -4134
  405. claude_mpm/deployment_paths.py +0 -261
  406. claude_mpm/hooks/claude_hooks/hook_handler_fixed.py +0 -454
  407. claude_mpm/models/state_models.py +0 -433
  408. claude_mpm/services/agent/__init__.py +0 -24
  409. claude_mpm/services/agent/deployment.py +0 -2548
  410. claude_mpm/services/agent/management.py +0 -598
  411. claude_mpm/services/agent/registry.py +0 -813
  412. claude_mpm/services/agents/registry/agent_registry.py +0 -813
  413. claude_mpm/services/communication/socketio.py +0 -1935
  414. claude_mpm/services/communication/websocket.py +0 -479
  415. claude_mpm/services/framework_claude_md_generator.py +0 -624
  416. claude_mpm/services/health_monitor.py +0 -893
  417. claude_mpm/services/infrastructure/graceful_degradation.py +0 -616
  418. claude_mpm/services/infrastructure/health_monitor.py +0 -775
  419. claude_mpm/services/infrastructure/memory_dashboard.py +0 -479
  420. claude_mpm/services/infrastructure/memory_guardian.py +0 -944
  421. claude_mpm/services/infrastructure/restart_protection.py +0 -642
  422. claude_mpm/services/infrastructure/state_manager.py +0 -774
  423. claude_mpm/services/mcp_gateway/manager.py +0 -334
  424. claude_mpm/services/optimized_hook_service.py +0 -542
  425. claude_mpm/services/project_analyzer.py +0 -864
  426. claude_mpm/services/project_registry.py +0 -608
  427. claude_mpm/services/standalone_socketio_server.py +0 -1300
  428. claude_mpm/services/ticket_manager_di.py +0 -318
  429. claude_mpm/services/ticketing_service_original.py +0 -510
  430. claude_mpm/utils/paths.py +0 -395
  431. claude_mpm/utils/platform_memory.py +0 -524
  432. claude_mpm-3.9.11.dist-info/RECORD +0 -306
  433. {claude_mpm-3.9.11.dist-info → claude_mpm-4.0.4.dist-info}/WHEEL +0 -0
  434. {claude_mpm-3.9.11.dist-info → claude_mpm-4.0.4.dist-info}/top_level.txt +0 -0
@@ -2,139 +2,181 @@
2
2
 
3
3
  import argparse
4
4
  from pathlib import Path
5
- from typing import Dict, Any, Optional, Callable
5
+ from typing import Any, Callable, Dict, Optional
6
6
 
7
7
 
8
8
  class ArgumentRegistry:
9
9
  """Registry for managing CLI argument definitions.
10
-
10
+
11
11
  This class consolidates argument definitions to reduce duplication
12
12
  and simplify the main CLI function.
13
13
  """
14
-
14
+
15
15
  def __init__(self):
16
16
  """Initialize the registry with common argument groups."""
17
17
  self._arguments: Dict[str, Dict[str, Any]] = {}
18
18
  self._groups: Dict[str, list] = {
19
- 'global': [],
20
- 'run': [],
21
- 'logging': [],
22
- 'framework': [],
23
- 'orchestration': []
19
+ "global": [],
20
+ "run": [],
21
+ "logging": [],
22
+ "framework": [],
23
+ "orchestration": [],
24
24
  }
25
25
  self._register_common_arguments()
26
-
26
+
27
27
  def _register_common_arguments(self):
28
28
  """Register all common argument definitions."""
29
29
  # Version argument
30
- self.register('version', {
31
- 'flags': ['--version'],
32
- 'action': 'version',
33
- 'help': 'Show version and exit',
34
- 'groups': ['global']
35
- })
36
-
30
+ self.register(
31
+ "version",
32
+ {
33
+ "flags": ["--version"],
34
+ "action": "version",
35
+ "help": "Show version and exit",
36
+ "groups": ["global"],
37
+ },
38
+ )
39
+
37
40
  # Logging arguments
38
- self.register('debug', {
39
- 'flags': ['-d', '--debug'],
40
- 'action': 'store_true',
41
- 'help': 'Enable debug logging (deprecated, use --logging DEBUG)',
42
- 'groups': ['logging', 'global']
43
- })
44
-
45
- self.register('logging', {
46
- 'flags': ['--logging'],
47
- 'choices': ['OFF', 'INFO', 'DEBUG'],
48
- 'default': 'OFF',
49
- 'help': 'Logging level (default: OFF)',
50
- 'groups': ['logging', 'global']
51
- })
52
-
53
- self.register('log_dir', {
54
- 'flags': ['--log-dir'],
55
- 'type': Path,
56
- 'help': 'Custom log directory (default: ~/.claude-mpm/logs)',
57
- 'groups': ['logging', 'global']
58
- })
59
-
41
+ self.register(
42
+ "debug",
43
+ {
44
+ "flags": ["-d", "--debug"],
45
+ "action": "store_true",
46
+ "help": "Enable debug logging (deprecated, use --logging DEBUG)",
47
+ "groups": ["logging", "global"],
48
+ },
49
+ )
50
+
51
+ self.register(
52
+ "logging",
53
+ {
54
+ "flags": ["--logging"],
55
+ "choices": ["OFF", "INFO", "DEBUG"],
56
+ "default": "OFF",
57
+ "help": "Logging level (default: OFF)",
58
+ "groups": ["logging", "global"],
59
+ },
60
+ )
61
+
62
+ self.register(
63
+ "log_dir",
64
+ {
65
+ "flags": ["--log-dir"],
66
+ "type": Path,
67
+ "help": "Custom log directory (default: ~/.claude-mpm/logs)",
68
+ "groups": ["logging", "global"],
69
+ },
70
+ )
71
+
60
72
  # Framework arguments
61
- self.register('framework_path', {
62
- 'flags': ['--framework-path'],
63
- 'type': Path,
64
- 'help': 'Path to claude-mpm framework',
65
- 'groups': ['framework', 'global']
66
- })
67
-
68
- self.register('agents_dir', {
69
- 'flags': ['--agents-dir'],
70
- 'type': Path,
71
- 'help': 'Custom agents directory to use',
72
- 'groups': ['framework', 'global']
73
- })
74
-
75
- self.register('no_hooks', {
76
- 'flags': ['--no-hooks'],
77
- 'action': 'store_true',
78
- 'help': 'Disable hook service (runs without hooks)',
79
- 'groups': ['framework', 'global', 'run']
80
- })
81
-
73
+ self.register(
74
+ "framework_path",
75
+ {
76
+ "flags": ["--framework-path"],
77
+ "type": Path,
78
+ "help": "Path to claude-mpm framework",
79
+ "groups": ["framework", "global"],
80
+ },
81
+ )
82
+
83
+ self.register(
84
+ "agents_dir",
85
+ {
86
+ "flags": ["--agents-dir"],
87
+ "type": Path,
88
+ "help": "Custom agents directory to use",
89
+ "groups": ["framework", "global"],
90
+ },
91
+ )
92
+
93
+ self.register(
94
+ "no_hooks",
95
+ {
96
+ "flags": ["--no-hooks"],
97
+ "action": "store_true",
98
+ "help": "Disable hook service (runs without hooks)",
99
+ "groups": ["framework", "global", "run"],
100
+ },
101
+ )
102
+
82
103
  # Run command arguments
83
- self.register('no_tickets', {
84
- 'flags': ['--no-tickets'],
85
- 'action': 'store_true',
86
- 'help': 'Disable automatic ticket creation',
87
- 'groups': ['run']
88
- })
89
-
90
- self.register('input', {
91
- 'flags': ['-i', '--input'],
92
- 'type': str,
93
- 'help': 'Input text or file path (for non-interactive mode)',
94
- 'groups': ['run']
95
- })
96
-
97
- self.register('non_interactive', {
98
- 'flags': ['--non-interactive'],
99
- 'action': 'store_true',
100
- 'help': 'Run in non-interactive mode (read from stdin or --input)',
101
- 'groups': ['run']
102
- })
103
-
104
+ self.register(
105
+ "no_tickets",
106
+ {
107
+ "flags": ["--no-tickets"],
108
+ "action": "store_true",
109
+ "help": "Disable automatic ticket creation",
110
+ "groups": ["run"],
111
+ },
112
+ )
113
+
114
+ self.register(
115
+ "input",
116
+ {
117
+ "flags": ["-i", "--input"],
118
+ "type": str,
119
+ "help": "Input text or file path (for non-interactive mode)",
120
+ "groups": ["run"],
121
+ },
122
+ )
123
+
124
+ self.register(
125
+ "non_interactive",
126
+ {
127
+ "flags": ["--non-interactive"],
128
+ "action": "store_true",
129
+ "help": "Run in non-interactive mode (read from stdin or --input)",
130
+ "groups": ["run"],
131
+ },
132
+ )
133
+
104
134
  # Orchestration arguments
105
- self.register('subprocess', {
106
- 'flags': ['--subprocess'],
107
- 'action': 'store_true',
108
- 'help': 'Use subprocess orchestration for agent delegations',
109
- 'groups': ['orchestration', 'run']
110
- })
111
-
112
- self.register('interactive_subprocess', {
113
- 'flags': ['--interactive-subprocess'],
114
- 'action': 'store_true',
115
- 'help': 'Use interactive subprocess orchestration with pexpect control',
116
- 'groups': ['orchestration', 'run']
117
- })
118
-
119
- self.register('todo_hijack', {
120
- 'flags': ['--todo-hijack'],
121
- 'action': 'store_true',
122
- 'help': 'Enable TODO hijacking to transform Claude\'s TODOs into agent delegations',
123
- 'groups': ['orchestration', 'run']
124
- })
125
-
135
+ self.register(
136
+ "subprocess",
137
+ {
138
+ "flags": ["--subprocess"],
139
+ "action": "store_true",
140
+ "help": "Use subprocess orchestration for agent delegations",
141
+ "groups": ["orchestration", "run"],
142
+ },
143
+ )
144
+
145
+ self.register(
146
+ "interactive_subprocess",
147
+ {
148
+ "flags": ["--interactive-subprocess"],
149
+ "action": "store_true",
150
+ "help": "Use interactive subprocess orchestration with pexpect control",
151
+ "groups": ["orchestration", "run"],
152
+ },
153
+ )
154
+
155
+ self.register(
156
+ "todo_hijack",
157
+ {
158
+ "flags": ["--todo-hijack"],
159
+ "action": "store_true",
160
+ "help": "Enable TODO hijacking to transform Claude's TODOs into agent delegations",
161
+ "groups": ["orchestration", "run"],
162
+ },
163
+ )
164
+
126
165
  # Ticket list arguments
127
- self.register('limit', {
128
- 'flags': ['-n', '--limit'],
129
- 'type': int,
130
- 'default': 10,
131
- 'help': 'Number of tickets to show',
132
- 'groups': ['tickets']
133
- })
134
-
166
+ self.register(
167
+ "limit",
168
+ {
169
+ "flags": ["-n", "--limit"],
170
+ "type": int,
171
+ "default": 10,
172
+ "help": "Number of tickets to show",
173
+ "groups": ["tickets"],
174
+ },
175
+ )
176
+
135
177
  def register(self, name: str, definition: Dict[str, Any]):
136
178
  """Register a new argument definition.
137
-
179
+
138
180
  Args:
139
181
  name: Internal name for the argument
140
182
  definition: Dictionary containing argument configuration:
@@ -143,18 +185,21 @@ class ArgumentRegistry:
143
185
  - All other kwargs are passed to add_argument()
144
186
  """
145
187
  self._arguments[name] = definition
146
-
188
+
147
189
  # Add to groups
148
- for group in definition.get('groups', []):
190
+ for group in definition.get("groups", []):
149
191
  if group not in self._groups:
150
192
  self._groups[group] = []
151
193
  self._groups[group].append(name)
152
-
153
- def apply_arguments(self, parser: argparse.ArgumentParser,
154
- groups: Optional[list] = None,
155
- exclude: Optional[list] = None):
194
+
195
+ def apply_arguments(
196
+ self,
197
+ parser: argparse.ArgumentParser,
198
+ groups: Optional[list] = None,
199
+ exclude: Optional[list] = None,
200
+ ):
156
201
  """Apply argument definitions to a parser.
157
-
202
+
158
203
  Args:
159
204
  parser: ArgumentParser or subparser to add arguments to
160
205
  groups: List of group names to include (None = all)
@@ -170,37 +215,40 @@ class ArgumentRegistry:
170
215
  # Remove duplicates while preserving order
171
216
  seen = set()
172
217
  arg_names = [x for x in arg_names if not (x in seen or seen.add(x))]
173
-
218
+
174
219
  # Apply exclusions
175
220
  if exclude:
176
221
  arg_names = [n for n in arg_names if n not in exclude]
177
-
222
+
178
223
  # Add arguments to parser
179
224
  for name in arg_names:
180
225
  definition = self._arguments[name].copy()
181
- flags = definition.pop('flags')
182
- definition.pop('groups', None) # Remove groups from kwargs
183
-
226
+ flags = definition.pop("flags")
227
+ definition.pop("groups", None) # Remove groups from kwargs
228
+
184
229
  # Special handling for version
185
- if name == 'version' and hasattr(parser, '_version'):
186
- definition['version'] = parser._version
187
-
230
+ if name == "version" and hasattr(parser, "_version"):
231
+ definition["version"] = parser._version
232
+
188
233
  parser.add_argument(*flags, **definition)
189
-
234
+
190
235
  def get_argument_groups(self) -> Dict[str, list]:
191
236
  """Get all argument groups and their members."""
192
237
  return self._groups.copy()
193
-
238
+
194
239
  def get_argument_definition(self, name: str) -> Optional[Dict[str, Any]]:
195
240
  """Get the definition for a specific argument."""
196
241
  return self._arguments.get(name, {}).copy()
197
-
198
- def create_argument_group(self, parser: argparse.ArgumentParser,
199
- group_name: str,
200
- title: str,
201
- description: Optional[str] = None):
242
+
243
+ def create_argument_group(
244
+ self,
245
+ parser: argparse.ArgumentParser,
246
+ group_name: str,
247
+ title: str,
248
+ description: Optional[str] = None,
249
+ ):
202
250
  """Create an argument group and add arguments from a named group.
203
-
251
+
204
252
  Args:
205
253
  parser: Parser to add the group to
206
254
  group_name: Name of the argument group in registry
@@ -208,15 +256,15 @@ class ArgumentRegistry:
208
256
  description: Optional description for the group
209
257
  """
210
258
  group = parser.add_argument_group(title, description)
211
-
259
+
212
260
  # Get arguments for this group
213
261
  arg_names = self._groups.get(group_name, [])
214
-
262
+
215
263
  for name in arg_names:
216
264
  definition = self._arguments[name].copy()
217
- flags = definition.pop('flags')
218
- definition.pop('groups', None)
219
-
265
+ flags = definition.pop("flags")
266
+ definition.pop("groups", None)
267
+
220
268
  group.add_argument(*flags, **definition)
221
-
222
- return group
269
+
270
+ return group
@@ -1,19 +1,24 @@
1
1
  """Command registry for managing CLI subcommands."""
2
2
 
3
3
  import argparse
4
- from typing import Dict, Any, Optional, Callable, List
4
+ from typing import Any, Callable, Dict, List, Optional
5
+
5
6
  from .args import ArgumentRegistry
6
7
 
7
8
 
8
9
  class CommandDefinition:
9
10
  """Definition for a CLI command."""
10
-
11
- def __init__(self, name: str, help_text: str,
12
- handler: Callable,
13
- argument_groups: Optional[List[str]] = None,
14
- extra_args: Optional[Dict[str, Dict[str, Any]]] = None):
11
+
12
+ def __init__(
13
+ self,
14
+ name: str,
15
+ help_text: str,
16
+ handler: Callable,
17
+ argument_groups: Optional[List[str]] = None,
18
+ extra_args: Optional[Dict[str, Dict[str, Any]]] = None,
19
+ ):
15
20
  """Initialize command definition.
16
-
21
+
17
22
  Args:
18
23
  name: Command name
19
24
  help_text: Help text for the command
@@ -30,27 +35,32 @@ class CommandDefinition:
30
35
 
31
36
  class CommandRegistry:
32
37
  """Registry for managing CLI subcommands.
33
-
38
+
34
39
  This class simplifies subcommand management and reduces
35
40
  complexity in the main CLI function.
36
41
  """
37
-
42
+
38
43
  def __init__(self, arg_registry: Optional[ArgumentRegistry] = None):
39
44
  """Initialize the command registry.
40
-
45
+
41
46
  Args:
42
47
  arg_registry: ArgumentRegistry instance for applying arguments
43
48
  """
44
49
  self._commands: Dict[str, CommandDefinition] = {}
45
50
  self._arg_registry = arg_registry or ArgumentRegistry()
46
51
  self._default_command: Optional[str] = None
47
-
48
- def register(self, name: str, help_text: str, handler: Callable,
49
- argument_groups: Optional[List[str]] = None,
50
- extra_args: Optional[Dict[str, Dict[str, Any]]] = None,
51
- is_default: bool = False):
52
+
53
+ def register(
54
+ self,
55
+ name: str,
56
+ help_text: str,
57
+ handler: Callable,
58
+ argument_groups: Optional[List[str]] = None,
59
+ extra_args: Optional[Dict[str, Dict[str, Any]]] = None,
60
+ is_default: bool = False,
61
+ ):
52
62
  """Register a new command.
53
-
63
+
54
64
  Args:
55
65
  name: Command name
56
66
  help_text: Help text for the command
@@ -64,59 +74,54 @@ class CommandRegistry:
64
74
  help_text=help_text,
65
75
  handler=handler,
66
76
  argument_groups=argument_groups,
67
- extra_args=extra_args
77
+ extra_args=extra_args,
68
78
  )
69
-
79
+
70
80
  self._commands[name] = command
71
-
81
+
72
82
  if is_default:
73
83
  self._default_command = name
74
-
75
- def setup_subcommands(self, parser: argparse.ArgumentParser) -> argparse._SubParsersAction:
84
+
85
+ def setup_subcommands(
86
+ self, parser: argparse.ArgumentParser
87
+ ) -> argparse._SubParsersAction:
76
88
  """Set up all registered subcommands on the parser.
77
-
89
+
78
90
  Args:
79
91
  parser: Main argument parser
80
-
92
+
81
93
  Returns:
82
94
  The subparsers object
83
95
  """
84
- subparsers = parser.add_subparsers(
85
- dest="command",
86
- help="Available commands"
87
- )
88
-
96
+ subparsers = parser.add_subparsers(dest="command", help="Available commands")
97
+
89
98
  for name, command in self._commands.items():
90
99
  # Create subparser
91
- subparser = subparsers.add_parser(
92
- name,
93
- help=command.help_text
94
- )
95
-
100
+ subparser = subparsers.add_parser(name, help=command.help_text)
101
+
96
102
  # Apply argument groups
97
103
  if command.argument_groups:
98
104
  self._arg_registry.apply_arguments(
99
- subparser,
100
- groups=command.argument_groups
105
+ subparser, groups=command.argument_groups
101
106
  )
102
-
107
+
103
108
  # Apply extra arguments
104
109
  for arg_name, arg_config in command.extra_args.items():
105
- flags = arg_config.pop('flags', [f'--{arg_name.replace("_", "-")}'])
110
+ flags = arg_config.pop("flags", [f'--{arg_name.replace("_", "-")}'])
106
111
  subparser.add_argument(*flags, **arg_config)
107
-
112
+
108
113
  # Store handler reference
109
114
  subparser.set_defaults(_handler=command.handler)
110
-
115
+
111
116
  return subparsers
112
-
117
+
113
118
  def execute_command(self, args: argparse.Namespace, **kwargs) -> Any:
114
119
  """Execute the appropriate command handler.
115
-
120
+
116
121
  Args:
117
122
  args: Parsed command line arguments
118
123
  **kwargs: Additional keyword arguments to pass to handler
119
-
124
+
120
125
  Returns:
121
126
  Result from the command handler
122
127
  """
@@ -125,7 +130,7 @@ class CommandRegistry:
125
130
  if not command_name and self._default_command:
126
131
  command_name = self._default_command
127
132
  args.command = command_name
128
-
133
+
129
134
  # Apply default command's argument defaults
130
135
  command = self._commands.get(command_name)
131
136
  if command:
@@ -133,14 +138,18 @@ class CommandRegistry:
133
138
  for group in command.argument_groups:
134
139
  for arg_name in self._arg_registry._groups.get(group, []):
135
140
  if not hasattr(args, arg_name):
136
- definition = self._arg_registry.get_argument_definition(arg_name)
137
- if definition and 'default' in definition:
138
- setattr(args, arg_name, definition['default'])
139
- elif definition and definition.get('action') == 'store_true':
141
+ definition = self._arg_registry.get_argument_definition(
142
+ arg_name
143
+ )
144
+ if definition and "default" in definition:
145
+ setattr(args, arg_name, definition["default"])
146
+ elif (
147
+ definition and definition.get("action") == "store_true"
148
+ ):
140
149
  setattr(args, arg_name, False)
141
-
150
+
142
151
  # Get command handler
143
- if hasattr(args, '_handler'):
152
+ if hasattr(args, "_handler"):
144
153
  handler = args._handler
145
154
  else:
146
155
  command = self._commands.get(command_name)
@@ -148,18 +157,18 @@ class CommandRegistry:
148
157
  handler = command.handler
149
158
  else:
150
159
  return None
151
-
160
+
152
161
  # Execute handler
153
162
  return handler(args, **kwargs)
154
-
163
+
155
164
  def get_command_names(self) -> List[str]:
156
165
  """Get list of all registered command names."""
157
166
  return list(self._commands.keys())
158
-
167
+
159
168
  def get_default_command(self) -> Optional[str]:
160
169
  """Get the default command name."""
161
170
  return self._default_command
162
-
171
+
163
172
  def has_command(self, name: str) -> bool:
164
173
  """Check if a command is registered."""
165
174
  return name in self._commands
@@ -167,37 +176,37 @@ class CommandRegistry:
167
176
 
168
177
  def register_standard_commands(registry: CommandRegistry):
169
178
  """Register the standard claude-mpm commands.
170
-
179
+
171
180
  This function registers all the standard commands that claude-mpm
172
181
  supports, reducing the setup code in main().
173
-
182
+
174
183
  Args:
175
184
  registry: CommandRegistry instance to register commands with
176
185
  """
177
186
  # Import handlers (these would be refactored from cli.py)
178
- from ..cli import run_session, list_tickets, show_info
179
-
187
+ from ..cli import list_tickets, run_session, show_info
188
+
180
189
  # Register run command (default)
181
190
  registry.register(
182
- name='run',
183
- help_text='Run orchestrated Claude session (default)',
191
+ name="run",
192
+ help_text="Run orchestrated Claude session (default)",
184
193
  handler=run_session,
185
- argument_groups=['run', 'orchestration'],
186
- is_default=True
194
+ argument_groups=["run", "orchestration"],
195
+ is_default=True,
187
196
  )
188
-
197
+
189
198
  # Register tickets command
190
199
  registry.register(
191
- name='tickets',
192
- help_text='List recent tickets',
200
+ name="tickets",
201
+ help_text="List recent tickets",
193
202
  handler=list_tickets,
194
- argument_groups=['tickets']
203
+ argument_groups=["tickets"],
195
204
  )
196
-
205
+
197
206
  # Register info command
198
207
  registry.register(
199
- name='info',
200
- help_text='Show framework and configuration info',
208
+ name="info",
209
+ help_text="Show framework and configuration info",
201
210
  handler=show_info,
202
- argument_groups=[] # No specific arguments needed
203
- )
211
+ argument_groups=[], # No specific arguments needed
212
+ )