claude-mpm 3.9.9__py3-none-any.whl → 4.0.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 (411) 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 +155 -0
  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 +1 -1
  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 +90 -49
  31. claude_mpm/cli/__main__.py +3 -2
  32. claude_mpm/cli/commands/__init__.py +21 -18
  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 +143 -762
  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 +203 -81
  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 +305 -197
  50. claude_mpm/cli/parser.py +24 -1150
  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 +104 -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 +217 -0
  69. claude_mpm/config/paths.py +94 -208
  70. claude_mpm/config/socketio_config.py +84 -73
  71. claude_mpm/constants.py +36 -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/css/dashboard.css +27 -8
  113. claude_mpm/dashboard/static/dist/components/agent-inference.js +2 -0
  114. claude_mpm/dashboard/static/dist/components/event-processor.js +2 -0
  115. claude_mpm/dashboard/static/dist/components/event-viewer.js +2 -0
  116. claude_mpm/dashboard/static/dist/components/export-manager.js +2 -0
  117. claude_mpm/dashboard/static/dist/components/file-tool-tracker.js +2 -0
  118. claude_mpm/dashboard/static/dist/components/hud-library-loader.js +2 -0
  119. claude_mpm/dashboard/static/dist/components/hud-manager.js +2 -0
  120. claude_mpm/dashboard/static/dist/components/hud-visualizer.js +2 -0
  121. claude_mpm/dashboard/static/dist/components/module-viewer.js +2 -0
  122. claude_mpm/dashboard/static/dist/components/session-manager.js +2 -0
  123. claude_mpm/dashboard/static/dist/components/socket-manager.js +2 -0
  124. claude_mpm/dashboard/static/dist/components/ui-state-manager.js +2 -0
  125. claude_mpm/dashboard/static/dist/components/working-directory.js +2 -0
  126. claude_mpm/dashboard/static/dist/dashboard.js +2 -0
  127. claude_mpm/dashboard/static/dist/socket-client.js +2 -0
  128. claude_mpm/dashboard/static/js/components/agent-inference.js +80 -76
  129. claude_mpm/dashboard/static/js/components/event-processor.js +71 -67
  130. claude_mpm/dashboard/static/js/components/event-viewer.js +74 -70
  131. claude_mpm/dashboard/static/js/components/export-manager.js +31 -28
  132. claude_mpm/dashboard/static/js/components/file-tool-tracker.js +106 -92
  133. claude_mpm/dashboard/static/js/components/hud-library-loader.js +11 -11
  134. claude_mpm/dashboard/static/js/components/hud-manager.js +73 -73
  135. claude_mpm/dashboard/static/js/components/hud-visualizer.js +163 -163
  136. claude_mpm/dashboard/static/js/components/module-viewer.js +305 -233
  137. claude_mpm/dashboard/static/js/components/session-manager.js +32 -29
  138. claude_mpm/dashboard/static/js/components/socket-manager.js +27 -20
  139. claude_mpm/dashboard/static/js/components/ui-state-manager.js +21 -18
  140. claude_mpm/dashboard/static/js/components/working-directory.js +74 -71
  141. claude_mpm/dashboard/static/js/dashboard.js +178 -453
  142. claude_mpm/dashboard/static/js/extension-error-handler.js +164 -0
  143. claude_mpm/dashboard/static/js/socket-client.js +120 -54
  144. claude_mpm/dashboard/templates/index.html +40 -50
  145. claude_mpm/experimental/cli_enhancements.py +60 -58
  146. claude_mpm/generators/__init__.py +1 -1
  147. claude_mpm/generators/agent_profile_generator.py +75 -65
  148. claude_mpm/hooks/__init__.py +1 -1
  149. claude_mpm/hooks/base_hook.py +33 -28
  150. claude_mpm/hooks/claude_hooks/__init__.py +1 -1
  151. claude_mpm/hooks/claude_hooks/connection_pool.py +120 -0
  152. claude_mpm/hooks/claude_hooks/event_handlers.py +743 -0
  153. claude_mpm/hooks/claude_hooks/hook_handler.py +415 -1331
  154. claude_mpm/hooks/claude_hooks/hook_wrapper.sh +4 -4
  155. claude_mpm/hooks/claude_hooks/memory_integration.py +221 -0
  156. claude_mpm/hooks/claude_hooks/response_tracking.py +348 -0
  157. claude_mpm/hooks/claude_hooks/tool_analysis.py +230 -0
  158. claude_mpm/hooks/memory_integration_hook.py +140 -100
  159. claude_mpm/hooks/tool_call_interceptor.py +89 -76
  160. claude_mpm/hooks/validation_hooks.py +57 -49
  161. claude_mpm/init.py +145 -121
  162. claude_mpm/models/__init__.py +9 -9
  163. claude_mpm/models/agent_definition.py +33 -23
  164. claude_mpm/models/agent_session.py +228 -200
  165. claude_mpm/scripts/__init__.py +1 -1
  166. claude_mpm/scripts/socketio_daemon.py +192 -75
  167. claude_mpm/scripts/socketio_server_manager.py +328 -0
  168. claude_mpm/scripts/start_activity_logging.py +25 -22
  169. claude_mpm/services/__init__.py +68 -43
  170. claude_mpm/services/agent_capabilities_service.py +271 -0
  171. claude_mpm/services/agents/__init__.py +23 -32
  172. claude_mpm/services/agents/deployment/__init__.py +3 -3
  173. claude_mpm/services/agents/deployment/agent_config_provider.py +310 -0
  174. claude_mpm/services/agents/deployment/agent_configuration_manager.py +359 -0
  175. claude_mpm/services/agents/deployment/agent_definition_factory.py +84 -0
  176. claude_mpm/services/agents/deployment/agent_deployment.py +415 -2113
  177. claude_mpm/services/agents/deployment/agent_discovery_service.py +387 -0
  178. claude_mpm/services/agents/deployment/agent_environment_manager.py +293 -0
  179. claude_mpm/services/agents/deployment/agent_filesystem_manager.py +387 -0
  180. claude_mpm/services/agents/deployment/agent_format_converter.py +453 -0
  181. claude_mpm/services/agents/deployment/agent_frontmatter_validator.py +161 -0
  182. claude_mpm/services/agents/deployment/agent_lifecycle_manager.py +345 -495
  183. claude_mpm/services/agents/deployment/agent_metrics_collector.py +279 -0
  184. claude_mpm/services/agents/deployment/agent_restore_handler.py +88 -0
  185. claude_mpm/services/agents/deployment/agent_template_builder.py +406 -0
  186. claude_mpm/services/agents/deployment/agent_validator.py +352 -0
  187. claude_mpm/services/agents/deployment/agent_version_manager.py +313 -0
  188. claude_mpm/services/agents/deployment/agent_versioning.py +6 -9
  189. claude_mpm/services/agents/deployment/agents_directory_resolver.py +79 -0
  190. claude_mpm/services/agents/deployment/async_agent_deployment.py +298 -234
  191. claude_mpm/services/agents/deployment/config/__init__.py +13 -0
  192. claude_mpm/services/agents/deployment/config/deployment_config.py +182 -0
  193. claude_mpm/services/agents/deployment/config/deployment_config_manager.py +200 -0
  194. claude_mpm/services/agents/deployment/deployment_config_loader.py +54 -0
  195. claude_mpm/services/agents/deployment/deployment_type_detector.py +124 -0
  196. claude_mpm/services/agents/deployment/facade/__init__.py +18 -0
  197. claude_mpm/services/agents/deployment/facade/async_deployment_executor.py +159 -0
  198. claude_mpm/services/agents/deployment/facade/deployment_executor.py +73 -0
  199. claude_mpm/services/agents/deployment/facade/deployment_facade.py +270 -0
  200. claude_mpm/services/agents/deployment/facade/sync_deployment_executor.py +178 -0
  201. claude_mpm/services/agents/deployment/interface_adapter.py +227 -0
  202. claude_mpm/services/agents/deployment/lifecycle_health_checker.py +85 -0
  203. claude_mpm/services/agents/deployment/lifecycle_performance_tracker.py +100 -0
  204. claude_mpm/services/agents/deployment/pipeline/__init__.py +32 -0
  205. claude_mpm/services/agents/deployment/pipeline/pipeline_builder.py +158 -0
  206. claude_mpm/services/agents/deployment/pipeline/pipeline_context.py +159 -0
  207. claude_mpm/services/agents/deployment/pipeline/pipeline_executor.py +169 -0
  208. claude_mpm/services/agents/deployment/pipeline/steps/__init__.py +19 -0
  209. claude_mpm/services/agents/deployment/pipeline/steps/agent_processing_step.py +195 -0
  210. claude_mpm/services/agents/deployment/pipeline/steps/base_step.py +119 -0
  211. claude_mpm/services/agents/deployment/pipeline/steps/configuration_step.py +79 -0
  212. claude_mpm/services/agents/deployment/pipeline/steps/target_directory_step.py +90 -0
  213. claude_mpm/services/agents/deployment/pipeline/steps/validation_step.py +100 -0
  214. claude_mpm/services/agents/deployment/processors/__init__.py +15 -0
  215. claude_mpm/services/agents/deployment/processors/agent_deployment_context.py +98 -0
  216. claude_mpm/services/agents/deployment/processors/agent_deployment_result.py +235 -0
  217. claude_mpm/services/agents/deployment/processors/agent_processor.py +258 -0
  218. claude_mpm/services/agents/deployment/refactored_agent_deployment_service.py +318 -0
  219. claude_mpm/services/agents/deployment/results/__init__.py +13 -0
  220. claude_mpm/services/agents/deployment/results/deployment_metrics.py +200 -0
  221. claude_mpm/services/agents/deployment/results/deployment_result_builder.py +249 -0
  222. claude_mpm/services/agents/deployment/strategies/__init__.py +25 -0
  223. claude_mpm/services/agents/deployment/strategies/base_strategy.py +119 -0
  224. claude_mpm/services/agents/deployment/strategies/project_strategy.py +150 -0
  225. claude_mpm/services/agents/deployment/strategies/strategy_selector.py +117 -0
  226. claude_mpm/services/agents/deployment/strategies/system_strategy.py +116 -0
  227. claude_mpm/services/agents/deployment/strategies/user_strategy.py +137 -0
  228. claude_mpm/services/agents/deployment/system_instructions_deployer.py +108 -0
  229. claude_mpm/services/agents/deployment/validation/__init__.py +19 -0
  230. claude_mpm/services/agents/deployment/validation/agent_validator.py +323 -0
  231. claude_mpm/services/agents/deployment/validation/deployment_validator.py +238 -0
  232. claude_mpm/services/agents/deployment/validation/template_validator.py +299 -0
  233. claude_mpm/services/agents/deployment/validation/validation_result.py +226 -0
  234. claude_mpm/services/agents/loading/__init__.py +2 -2
  235. claude_mpm/services/agents/loading/agent_profile_loader.py +259 -229
  236. claude_mpm/services/agents/loading/base_agent_manager.py +90 -81
  237. claude_mpm/services/agents/loading/framework_agent_loader.py +154 -129
  238. claude_mpm/services/agents/management/__init__.py +2 -2
  239. claude_mpm/services/agents/management/agent_capabilities_generator.py +72 -58
  240. claude_mpm/services/agents/management/agent_management_service.py +209 -156
  241. claude_mpm/services/agents/memory/__init__.py +9 -6
  242. claude_mpm/services/agents/memory/agent_memory_manager.py +218 -1152
  243. claude_mpm/services/agents/memory/agent_persistence_service.py +20 -16
  244. claude_mpm/services/agents/memory/analyzer.py +430 -0
  245. claude_mpm/services/agents/memory/content_manager.py +376 -0
  246. claude_mpm/services/agents/memory/template_generator.py +468 -0
  247. claude_mpm/services/agents/registry/__init__.py +7 -10
  248. claude_mpm/services/agents/registry/deployed_agent_discovery.py +122 -97
  249. claude_mpm/services/agents/registry/modification_tracker.py +351 -285
  250. claude_mpm/services/async_session_logger.py +187 -153
  251. claude_mpm/services/claude_session_logger.py +87 -72
  252. claude_mpm/services/command_handler_service.py +217 -0
  253. claude_mpm/services/communication/__init__.py +3 -2
  254. claude_mpm/services/core/__init__.py +50 -97
  255. claude_mpm/services/core/base.py +60 -53
  256. claude_mpm/services/core/interfaces/__init__.py +188 -0
  257. claude_mpm/services/core/interfaces/agent.py +351 -0
  258. claude_mpm/services/core/interfaces/communication.py +343 -0
  259. claude_mpm/services/core/interfaces/infrastructure.py +413 -0
  260. claude_mpm/services/core/interfaces/service.py +434 -0
  261. claude_mpm/services/core/interfaces.py +19 -944
  262. claude_mpm/services/event_aggregator.py +208 -170
  263. claude_mpm/services/exceptions.py +387 -308
  264. claude_mpm/services/framework_claude_md_generator/__init__.py +75 -79
  265. claude_mpm/services/framework_claude_md_generator/content_assembler.py +69 -60
  266. claude_mpm/services/framework_claude_md_generator/content_validator.py +65 -61
  267. claude_mpm/services/framework_claude_md_generator/deployment_manager.py +68 -49
  268. claude_mpm/services/framework_claude_md_generator/section_generators/__init__.py +34 -34
  269. claude_mpm/services/framework_claude_md_generator/section_generators/agents.py +25 -22
  270. claude_mpm/services/framework_claude_md_generator/section_generators/claude_pm_init.py +10 -10
  271. claude_mpm/services/framework_claude_md_generator/section_generators/core_responsibilities.py +4 -3
  272. claude_mpm/services/framework_claude_md_generator/section_generators/delegation_constraints.py +4 -3
  273. claude_mpm/services/framework_claude_md_generator/section_generators/environment_config.py +4 -3
  274. claude_mpm/services/framework_claude_md_generator/section_generators/footer.py +6 -5
  275. claude_mpm/services/framework_claude_md_generator/section_generators/header.py +8 -7
  276. claude_mpm/services/framework_claude_md_generator/section_generators/orchestration_principles.py +4 -3
  277. claude_mpm/services/framework_claude_md_generator/section_generators/role_designation.py +6 -5
  278. claude_mpm/services/framework_claude_md_generator/section_generators/subprocess_validation.py +9 -8
  279. claude_mpm/services/framework_claude_md_generator/section_generators/todo_task_tools.py +4 -3
  280. claude_mpm/services/framework_claude_md_generator/section_generators/troubleshooting.py +5 -4
  281. claude_mpm/services/framework_claude_md_generator/section_manager.py +28 -27
  282. claude_mpm/services/framework_claude_md_generator/version_manager.py +30 -28
  283. claude_mpm/services/hook_service.py +106 -114
  284. claude_mpm/services/infrastructure/__init__.py +7 -5
  285. claude_mpm/services/infrastructure/context_preservation.py +571 -0
  286. claude_mpm/services/infrastructure/daemon_manager.py +279 -0
  287. claude_mpm/services/infrastructure/logging.py +83 -76
  288. claude_mpm/services/infrastructure/monitoring.py +547 -404
  289. claude_mpm/services/mcp_gateway/__init__.py +40 -23
  290. claude_mpm/services/mcp_gateway/config/__init__.py +2 -2
  291. claude_mpm/services/mcp_gateway/config/config_loader.py +61 -56
  292. claude_mpm/services/mcp_gateway/config/config_schema.py +50 -41
  293. claude_mpm/services/mcp_gateway/config/configuration.py +82 -75
  294. claude_mpm/services/mcp_gateway/core/__init__.py +14 -21
  295. claude_mpm/services/mcp_gateway/core/base.py +80 -67
  296. claude_mpm/services/mcp_gateway/core/exceptions.py +60 -46
  297. claude_mpm/services/mcp_gateway/core/interfaces.py +97 -93
  298. claude_mpm/services/mcp_gateway/main.py +307 -127
  299. claude_mpm/services/mcp_gateway/registry/__init__.py +1 -1
  300. claude_mpm/services/mcp_gateway/registry/service_registry.py +100 -101
  301. claude_mpm/services/mcp_gateway/registry/tool_registry.py +135 -126
  302. claude_mpm/services/mcp_gateway/server/__init__.py +4 -4
  303. claude_mpm/services/mcp_gateway/server/{mcp_server.py → mcp_gateway.py} +149 -153
  304. claude_mpm/services/mcp_gateway/server/stdio_handler.py +105 -107
  305. claude_mpm/services/mcp_gateway/server/stdio_server.py +691 -0
  306. claude_mpm/services/mcp_gateway/tools/__init__.py +4 -2
  307. claude_mpm/services/mcp_gateway/tools/base_adapter.py +110 -121
  308. claude_mpm/services/mcp_gateway/tools/document_summarizer.py +283 -215
  309. claude_mpm/services/mcp_gateway/tools/hello_world.py +122 -120
  310. claude_mpm/services/mcp_gateway/tools/ticket_tools.py +652 -0
  311. claude_mpm/services/mcp_gateway/tools/unified_ticket_tool.py +606 -0
  312. claude_mpm/services/memory/__init__.py +2 -2
  313. claude_mpm/services/memory/builder.py +451 -362
  314. claude_mpm/services/memory/cache/__init__.py +2 -2
  315. claude_mpm/services/memory/cache/shared_prompt_cache.py +232 -194
  316. claude_mpm/services/memory/cache/simple_cache.py +107 -93
  317. claude_mpm/services/memory/indexed_memory.py +195 -193
  318. claude_mpm/services/memory/optimizer.py +267 -234
  319. claude_mpm/services/memory/router.py +571 -263
  320. claude_mpm/services/memory_hook_service.py +237 -0
  321. claude_mpm/services/port_manager.py +223 -0
  322. claude_mpm/services/project/__init__.py +3 -3
  323. claude_mpm/services/project/analyzer.py +451 -305
  324. claude_mpm/services/project/registry.py +262 -240
  325. claude_mpm/services/recovery_manager.py +287 -231
  326. claude_mpm/services/response_tracker.py +87 -67
  327. claude_mpm/services/runner_configuration_service.py +587 -0
  328. claude_mpm/services/session_management_service.py +304 -0
  329. claude_mpm/services/socketio/__init__.py +4 -4
  330. claude_mpm/services/socketio/client_proxy.py +174 -0
  331. claude_mpm/services/socketio/handlers/__init__.py +3 -3
  332. claude_mpm/services/socketio/handlers/base.py +44 -30
  333. claude_mpm/services/socketio/handlers/connection.py +145 -65
  334. claude_mpm/services/socketio/handlers/file.py +123 -108
  335. claude_mpm/services/socketio/handlers/git.py +607 -373
  336. claude_mpm/services/socketio/handlers/hook.py +170 -0
  337. claude_mpm/services/socketio/handlers/memory.py +4 -4
  338. claude_mpm/services/socketio/handlers/project.py +4 -4
  339. claude_mpm/services/socketio/handlers/registry.py +53 -38
  340. claude_mpm/services/socketio/server/__init__.py +18 -0
  341. claude_mpm/services/socketio/server/broadcaster.py +252 -0
  342. claude_mpm/services/socketio/server/core.py +399 -0
  343. claude_mpm/services/socketio/server/main.py +323 -0
  344. claude_mpm/services/socketio_client_manager.py +160 -133
  345. claude_mpm/services/socketio_server.py +36 -1885
  346. claude_mpm/services/subprocess_launcher_service.py +316 -0
  347. claude_mpm/services/system_instructions_service.py +258 -0
  348. claude_mpm/services/ticket_manager.py +20 -534
  349. claude_mpm/services/utility_service.py +285 -0
  350. claude_mpm/services/version_control/__init__.py +18 -21
  351. claude_mpm/services/version_control/branch_strategy.py +20 -10
  352. claude_mpm/services/version_control/conflict_resolution.py +37 -13
  353. claude_mpm/services/version_control/git_operations.py +52 -21
  354. claude_mpm/services/version_control/semantic_versioning.py +92 -53
  355. claude_mpm/services/version_control/version_parser.py +145 -125
  356. claude_mpm/services/version_service.py +270 -0
  357. claude_mpm/storage/__init__.py +9 -0
  358. claude_mpm/storage/state_storage.py +552 -0
  359. claude_mpm/ticket_wrapper.py +2 -2
  360. claude_mpm/utils/__init__.py +2 -2
  361. claude_mpm/utils/agent_dependency_loader.py +453 -243
  362. claude_mpm/utils/config_manager.py +157 -118
  363. claude_mpm/utils/console.py +1 -1
  364. claude_mpm/utils/dependency_cache.py +102 -107
  365. claude_mpm/utils/dependency_manager.py +52 -47
  366. claude_mpm/utils/dependency_strategies.py +131 -96
  367. claude_mpm/utils/environment_context.py +110 -102
  368. claude_mpm/utils/error_handler.py +75 -55
  369. claude_mpm/utils/file_utils.py +80 -67
  370. claude_mpm/utils/framework_detection.py +12 -11
  371. claude_mpm/utils/import_migration_example.py +12 -60
  372. claude_mpm/utils/imports.py +48 -45
  373. claude_mpm/utils/path_operations.py +100 -93
  374. claude_mpm/utils/robust_installer.py +172 -164
  375. claude_mpm/utils/session_logging.py +30 -23
  376. claude_mpm/utils/subprocess_utils.py +99 -61
  377. claude_mpm/validation/__init__.py +1 -1
  378. claude_mpm/validation/agent_validator.py +151 -111
  379. claude_mpm/validation/frontmatter_validator.py +92 -71
  380. {claude_mpm-3.9.9.dist-info → claude_mpm-4.0.3.dist-info}/METADATA +51 -2
  381. claude_mpm-4.0.3.dist-info/RECORD +402 -0
  382. {claude_mpm-3.9.9.dist-info → claude_mpm-4.0.3.dist-info}/entry_points.txt +1 -0
  383. {claude_mpm-3.9.9.dist-info → claude_mpm-4.0.3.dist-info}/licenses/LICENSE +1 -1
  384. claude_mpm/config/memory_guardian_config.py +0 -325
  385. claude_mpm/core/config_paths.py +0 -150
  386. claude_mpm/dashboard/static/js/dashboard-original.js +0 -4134
  387. claude_mpm/deployment_paths.py +0 -261
  388. claude_mpm/hooks/claude_hooks/hook_handler_fixed.py +0 -454
  389. claude_mpm/models/state_models.py +0 -433
  390. claude_mpm/services/agent/__init__.py +0 -24
  391. claude_mpm/services/agent/deployment.py +0 -2548
  392. claude_mpm/services/agent/management.py +0 -598
  393. claude_mpm/services/agent/registry.py +0 -813
  394. claude_mpm/services/agents/registry/agent_registry.py +0 -813
  395. claude_mpm/services/communication/socketio.py +0 -1935
  396. claude_mpm/services/communication/websocket.py +0 -479
  397. claude_mpm/services/framework_claude_md_generator.py +0 -624
  398. claude_mpm/services/health_monitor.py +0 -893
  399. claude_mpm/services/infrastructure/memory_guardian.py +0 -770
  400. claude_mpm/services/mcp_gateway/server/mcp_server_simple.py +0 -444
  401. claude_mpm/services/optimized_hook_service.py +0 -542
  402. claude_mpm/services/project_analyzer.py +0 -864
  403. claude_mpm/services/project_registry.py +0 -608
  404. claude_mpm/services/standalone_socketio_server.py +0 -1300
  405. claude_mpm/services/ticket_manager_di.py +0 -318
  406. claude_mpm/services/ticketing_service_original.py +0 -510
  407. claude_mpm/utils/paths.py +0 -395
  408. claude_mpm/utils/platform_memory.py +0 -524
  409. claude_mpm-3.9.9.dist-info/RECORD +0 -293
  410. {claude_mpm-3.9.9.dist-info → claude_mpm-4.0.3.dist-info}/WHEEL +0 -0
  411. {claude_mpm-3.9.9.dist-info → claude_mpm-4.0.3.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
+ )