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
claude_mpm/cli/parser.py CHANGED
@@ -1,1166 +1,34 @@
1
1
  """
2
2
  Argument parser for claude-mpm CLI.
3
3
 
4
- WHY: This module centralizes all argument parsing logic to avoid duplication and provide
5
- a single source of truth for CLI arguments. It uses inheritance to share common arguments
6
- across commands while keeping command-specific args organized.
7
-
8
- DESIGN DECISION: We use a base parser factory pattern to create parsers with common
9
- arguments, then extend them for specific commands. This reduces duplication while
10
- maintaining flexibility.
4
+ WHY: This module provides backward compatibility and delegates to the new modular
5
+ parser structure. The massive create_parser function has been split into focused
6
+ modules in the parsers/ package.
7
+
8
+ DESIGN DECISION: We maintain this file for backward compatibility while the actual
9
+ parser logic has been moved to parsers/ modules for better maintainability.
10
+
11
+ REFACTORING NOTE: The original 961-line create_parser function has been split into:
12
+ - parsers/base_parser.py: Common arguments and main parser setup
13
+ - parsers/run_parser.py: Run command arguments
14
+ - parsers/agents_parser.py: Agent management commands
15
+ - parsers/memory_parser.py: Memory management commands
16
+ - parsers/tickets_parser.py: Ticket management commands
17
+ - parsers/config_parser.py: Configuration commands
18
+ - parsers/monitor_parser.py: Monitoring commands
19
+ - parsers/mcp_parser.py: MCP Gateway commands
11
20
  """
12
21
 
13
22
  import argparse
14
23
  from pathlib import Path
15
- from typing import Optional, List
16
-
17
- from ..constants import CLICommands, CLIPrefix, AgentCommands, MemoryCommands, MonitorCommands, LogLevel, ConfigCommands, AggregateCommands, TicketCommands, MCPCommands
18
-
19
-
20
- def add_common_arguments(parser: argparse.ArgumentParser, version: str = None) -> None:
21
- """
22
- Add common arguments that apply to all commands.
23
-
24
- WHY: These arguments are needed across multiple commands, so we centralize them
25
- to ensure consistency and avoid duplication.
26
-
27
- Args:
28
- parser: The argument parser to add arguments to
29
- version: Version string to display (only needed for main parser)
30
- """
31
- # Version - only add to main parser, not subparsers
32
- if version is not None:
33
- parser.add_argument(
34
- "--version",
35
- action="version",
36
- version=f"%(prog)s {version}"
37
- )
38
-
39
- # Logging arguments
40
- logging_group = parser.add_argument_group('logging options')
41
- logging_group.add_argument(
42
- "-d", "--debug",
43
- action="store_true",
44
- help="Enable debug logging (deprecated, use --logging DEBUG)"
45
- )
46
- logging_group.add_argument(
47
- "--logging",
48
- choices=[level.value for level in LogLevel],
49
- default=LogLevel.INFO.value,
50
- help="Logging level (default: INFO)"
51
- )
52
- logging_group.add_argument(
53
- "--log-dir",
54
- type=Path,
55
- help="Custom log directory (default: ~/.claude-mpm/logs)"
56
- )
57
-
58
- # Framework configuration
59
- framework_group = parser.add_argument_group('framework options')
60
- framework_group.add_argument(
61
- "--framework-path",
62
- type=Path,
63
- help="Path to claude-mpm framework"
64
- )
65
- framework_group.add_argument(
66
- "--agents-dir",
67
- type=Path,
68
- help="Custom agents directory to use"
69
- )
70
-
71
-
72
- def add_run_arguments(parser: argparse.ArgumentParser) -> None:
73
- """
74
- Add arguments specific to the run command.
75
-
76
- WHY: The run command has specific arguments for controlling how Claude sessions
77
- are executed, including hook management, ticket creation, and interaction modes.
78
-
79
- Args:
80
- parser: The argument parser to add arguments to
81
- """
82
- run_group = parser.add_argument_group('run options')
83
-
84
- run_group.add_argument(
85
- "--no-hooks",
86
- action="store_true",
87
- help="Disable hook service (runs without hooks)"
88
- )
89
- run_group.add_argument(
90
- "--no-tickets",
91
- action="store_true",
92
- help="Disable automatic ticket creation"
93
- )
94
- run_group.add_argument(
95
- "--intercept-commands",
96
- action="store_true",
97
- help="Enable command interception in interactive mode (intercepts /mpm: commands)"
98
- )
99
- run_group.add_argument(
100
- "--no-native-agents",
101
- action="store_true",
102
- help="Disable deployment of Claude Code native agents"
103
- )
104
- run_group.add_argument(
105
- "--launch-method",
106
- choices=["exec", "subprocess"],
107
- default="exec",
108
- help="Method to launch Claude: exec (replace process) or subprocess (child process)"
109
- )
110
- # Monitor options - consolidated monitoring and management interface
111
- run_group.add_argument(
112
- "--monitor",
113
- action="store_true",
114
- help="Enable monitoring and management interface with WebSocket server and dashboard (default port: 8765)"
115
- )
116
- run_group.add_argument(
117
- "--websocket-port",
118
- type=int,
119
- default=8765,
120
- help="WebSocket server port (default: 8765)"
121
- )
122
- run_group.add_argument(
123
- "--resume",
124
- type=str,
125
- nargs="?",
126
- const="last",
127
- help="Resume a session (last session if no ID specified, or specific session ID)"
128
- )
129
-
130
- # Dependency checking options
131
- dep_group = parser.add_argument_group('dependency options')
132
- dep_group.add_argument(
133
- "--no-check-dependencies",
134
- action="store_false",
135
- dest="check_dependencies",
136
- help="Skip agent dependency checking at startup"
137
- )
138
- dep_group.add_argument(
139
- "--force-check-dependencies",
140
- action="store_true",
141
- help="Force dependency checking even if cached results exist"
142
- )
143
- dep_group.add_argument(
144
- "--no-prompt",
145
- action="store_true",
146
- help="Never prompt for dependency installation (non-interactive mode)"
147
- )
148
- dep_group.add_argument(
149
- "--force-prompt",
150
- action="store_true",
151
- help="Force interactive prompting even in non-TTY environments (use with caution)"
152
- )
153
-
154
- # Input/output options
155
- io_group = parser.add_argument_group('input/output options')
156
- io_group.add_argument(
157
- "-i", "--input",
158
- type=str,
159
- help="Input text or file path (for non-interactive mode)"
160
- )
161
- io_group.add_argument(
162
- "--non-interactive",
163
- action="store_true",
164
- help="Run in non-interactive mode (read from stdin or --input)"
165
- )
166
-
167
- # Claude CLI arguments
168
- parser.add_argument(
169
- "claude_args",
170
- nargs=argparse.REMAINDER,
171
- help="Additional arguments to pass to Claude CLI (use -- before Claude args)"
172
- )
173
-
24
+ from typing import List, Optional
174
25
 
175
- def create_parser(prog_name: str = "claude-mpm", version: str = "0.0.0") -> argparse.ArgumentParser:
176
- """
177
- Create the main argument parser with all subcommands.
178
-
179
- WHY: This factory function creates a complete parser with all commands and their
180
- arguments. It's the single entry point for creating the CLI parser, ensuring
181
- consistency across the application.
182
-
183
- DESIGN DECISION: We use subparsers for commands to provide a clean, git-like
184
- interface while maintaining backward compatibility with the original CLI.
185
-
186
- Args:
187
- prog_name: The program name to use
188
- version: The version string to display
189
-
190
- Returns:
191
- Configured ArgumentParser instance
192
- """
193
- # Main parser
194
- parser = argparse.ArgumentParser(
195
- prog=prog_name,
196
- description=f"Claude Multi-Agent Project Manager v{version} - Orchestrate Claude with agent delegation and ticket tracking",
197
- epilog="By default, runs an orchestrated Claude session. Use 'claude-mpm' for interactive mode or 'claude-mpm -i \"prompt\"' for non-interactive mode.\n\nTo pass arguments to Claude CLI, use -- separator: claude-mpm run -- --model sonnet --temperature 0.1",
198
- formatter_class=argparse.RawDescriptionHelpFormatter
199
- )
200
-
201
- # Add common arguments to main parser with version
202
- add_common_arguments(parser, version=version)
203
-
204
- # Add run-specific arguments at top level for default behavior
205
- # WHY: This maintains backward compatibility - users can run `claude-mpm -i "prompt"`
206
- # without specifying the 'run' command
207
- # NOTE: We don't add claude_args here because REMAINDER interferes with subcommands
208
- run_group = parser.add_argument_group('run options (when no command specified)')
209
-
210
- run_group.add_argument(
211
- "--no-hooks",
212
- action="store_true",
213
- help="Disable hook service (runs without hooks)"
214
- )
215
- run_group.add_argument(
216
- "--no-tickets",
217
- action="store_true",
218
- help="Disable automatic ticket creation"
219
- )
220
- run_group.add_argument(
221
- "--intercept-commands",
222
- action="store_true",
223
- help="Enable command interception in interactive mode (intercepts /mpm: commands)"
224
- )
225
- run_group.add_argument(
226
- "--no-native-agents",
227
- action="store_true",
228
- help="Disable deployment of Claude Code native agents"
229
- )
230
- run_group.add_argument(
231
- "--launch-method",
232
- choices=["exec", "subprocess"],
233
- default="exec",
234
- help="Method to launch Claude: exec (replace process) or subprocess (child process)"
235
- )
236
- # Monitor options - consolidated monitoring and management interface
237
- run_group.add_argument(
238
- "--monitor",
239
- action="store_true",
240
- help="Enable monitoring and management interface with WebSocket server and dashboard (default port: 8765)"
241
- )
242
- run_group.add_argument(
243
- "--websocket-port",
244
- type=int,
245
- default=8765,
246
- help="WebSocket server port (default: 8765)"
247
- )
248
- run_group.add_argument(
249
- "--resume",
250
- type=str,
251
- nargs="?",
252
- const="last",
253
- help="Resume a session (last session if no ID specified, or specific session ID)"
254
- )
255
- run_group.add_argument(
256
- "--force",
257
- action="store_true",
258
- help="Force operations even with warnings (e.g., large .claude.json file)"
259
- )
260
-
261
- # Dependency checking options (for backward compatibility at top level)
262
- dep_group_top = parser.add_argument_group('dependency options (when no command specified)')
263
- dep_group_top.add_argument(
264
- "--no-check-dependencies",
265
- action="store_false",
266
- dest="check_dependencies",
267
- help="Skip agent dependency checking at startup"
268
- )
269
- dep_group_top.add_argument(
270
- "--force-check-dependencies",
271
- action="store_true",
272
- help="Force dependency checking even if cached results exist"
273
- )
274
- dep_group_top.add_argument(
275
- "--no-prompt",
276
- action="store_true",
277
- help="Never prompt for dependency installation (non-interactive mode)"
278
- )
279
- dep_group_top.add_argument(
280
- "--force-prompt",
281
- action="store_true",
282
- help="Force interactive prompting even in non-TTY environments (use with caution)"
283
- )
284
-
285
- # Input/output options
286
- io_group = parser.add_argument_group('input/output options (when no command specified)')
287
- io_group.add_argument(
288
- "-i", "--input",
289
- type=str,
290
- help="Input text or file path (for non-interactive mode)"
291
- )
292
- io_group.add_argument(
293
- "--non-interactive",
294
- action="store_true",
295
- help="Run in non-interactive mode (read from stdin or --input)"
296
- )
297
-
298
- # Create subparsers for commands
299
- subparsers = parser.add_subparsers(
300
- dest="command",
301
- help="Available commands",
302
- metavar="COMMAND"
303
- )
304
-
305
- # Run command (explicit)
306
- run_parser = subparsers.add_parser(
307
- CLICommands.RUN.value,
308
- help="Run orchestrated Claude session (default)",
309
- formatter_class=argparse.RawDescriptionHelpFormatter
310
- )
311
- add_common_arguments(run_parser)
312
- add_run_arguments(run_parser)
313
-
314
- # Tickets command with subcommands
315
- tickets_parser = subparsers.add_parser(
316
- CLICommands.TICKETS.value,
317
- help="Manage tickets and tracking"
318
- )
319
- add_common_arguments(tickets_parser)
320
-
321
- tickets_subparsers = tickets_parser.add_subparsers(
322
- dest="tickets_command",
323
- help="Ticket commands",
324
- metavar="SUBCOMMAND"
325
- )
326
-
327
- # Create ticket
328
- create_ticket_parser = tickets_subparsers.add_parser(
329
- TicketCommands.CREATE.value,
330
- help="Create a new ticket"
331
- )
332
- create_ticket_parser.add_argument(
333
- "title",
334
- help="Ticket title"
335
- )
336
- create_ticket_parser.add_argument(
337
- "-t", "--type",
338
- default="task",
339
- choices=["task", "bug", "feature", "issue", "epic"],
340
- help="Ticket type (default: task)"
341
- )
342
- create_ticket_parser.add_argument(
343
- "-p", "--priority",
344
- default="medium",
345
- choices=["low", "medium", "high", "critical"],
346
- help="Priority level (default: medium)"
347
- )
348
- create_ticket_parser.add_argument(
349
- "-d", "--description",
350
- nargs="*",
351
- help="Ticket description"
352
- )
353
- create_ticket_parser.add_argument(
354
- "--tags",
355
- help="Comma-separated tags"
356
- )
357
- create_ticket_parser.add_argument(
358
- "--parent-epic",
359
- help="Parent epic ID"
360
- )
361
- create_ticket_parser.add_argument(
362
- "--parent-issue",
363
- help="Parent issue ID"
364
- )
365
- create_ticket_parser.add_argument(
366
- "-v", "--verbose",
367
- action="store_true",
368
- help="Verbose output"
369
- )
370
-
371
- # List tickets
372
- list_tickets_parser = tickets_subparsers.add_parser(
373
- TicketCommands.LIST.value,
374
- help="List recent tickets"
375
- )
376
- list_tickets_parser.add_argument(
377
- "-n", "--limit",
378
- type=int,
379
- default=10,
380
- help="Number of tickets to show (default: 10)"
381
- )
382
- list_tickets_parser.add_argument(
383
- "--type",
384
- choices=["task", "bug", "feature", "issue", "epic", "all"],
385
- default="all",
386
- help="Filter by ticket type"
387
- )
388
- list_tickets_parser.add_argument(
389
- "--status",
390
- choices=["open", "in_progress", "done", "closed", "blocked", "all"],
391
- default="all",
392
- help="Filter by status"
393
- )
394
- list_tickets_parser.add_argument(
395
- "-v", "--verbose",
396
- action="store_true",
397
- help="Show detailed ticket information"
398
- )
399
-
400
- # View ticket
401
- view_ticket_parser = tickets_subparsers.add_parser(
402
- TicketCommands.VIEW.value,
403
- help="View a specific ticket"
404
- )
405
- view_ticket_parser.add_argument(
406
- "id",
407
- help="Ticket ID (e.g., TSK-0001)"
408
- )
409
- view_ticket_parser.add_argument(
410
- "-v", "--verbose",
411
- action="store_true",
412
- help="Show metadata and full details"
413
- )
414
-
415
- # Update ticket
416
- update_ticket_parser = tickets_subparsers.add_parser(
417
- TicketCommands.UPDATE.value,
418
- help="Update a ticket"
419
- )
420
- update_ticket_parser.add_argument(
421
- "id",
422
- help="Ticket ID"
423
- )
424
- update_ticket_parser.add_argument(
425
- "-s", "--status",
426
- choices=["waiting", "in_progress", "ready", "tested"],
427
- help="Update workflow state (aitrackdown compatible)"
428
- )
429
- update_ticket_parser.add_argument(
430
- "-p", "--priority",
431
- choices=["low", "medium", "high", "critical"],
432
- help="Update priority"
433
- )
434
- update_ticket_parser.add_argument(
435
- "-a", "--assign",
436
- help="Assign to user"
437
- )
438
- update_ticket_parser.add_argument(
439
- "--tags",
440
- help="Update tags (comma-separated)"
441
- )
442
- update_ticket_parser.add_argument(
443
- "-d", "--description",
444
- nargs="*",
445
- help="Update description"
446
- )
447
-
448
- # Close ticket
449
- close_ticket_parser = tickets_subparsers.add_parser(
450
- TicketCommands.CLOSE.value,
451
- help="Close a ticket"
452
- )
453
- close_ticket_parser.add_argument(
454
- "id",
455
- help="Ticket ID"
456
- )
457
- close_ticket_parser.add_argument(
458
- "--resolution",
459
- help="Resolution description"
460
- )
461
-
462
- # Delete ticket
463
- delete_ticket_parser = tickets_subparsers.add_parser(
464
- TicketCommands.DELETE.value,
465
- help="Delete a ticket"
466
- )
467
- delete_ticket_parser.add_argument(
468
- "id",
469
- help="Ticket ID"
470
- )
471
- delete_ticket_parser.add_argument(
472
- "--force",
473
- action="store_true",
474
- help="Force deletion without confirmation"
475
- )
476
-
477
- # Search tickets
478
- search_tickets_parser = tickets_subparsers.add_parser(
479
- TicketCommands.SEARCH.value,
480
- help="Search tickets"
481
- )
482
- search_tickets_parser.add_argument(
483
- "query",
484
- help="Search query"
485
- )
486
- search_tickets_parser.add_argument(
487
- "--type",
488
- choices=["task", "bug", "feature", "issue", "epic", "all"],
489
- default="all",
490
- help="Filter by ticket type"
491
- )
492
- search_tickets_parser.add_argument(
493
- "--status",
494
- choices=["open", "in_progress", "done", "closed", "blocked", "all"],
495
- default="all",
496
- help="Filter by status"
497
- )
498
- search_tickets_parser.add_argument(
499
- "-n", "--limit",
500
- type=int,
501
- default=20,
502
- help="Maximum results to show"
503
- )
504
-
505
- # Add comment to ticket
506
- comment_ticket_parser = tickets_subparsers.add_parser(
507
- TicketCommands.COMMENT.value,
508
- help="Add comment to a ticket"
509
- )
510
- comment_ticket_parser.add_argument(
511
- "id",
512
- help="Ticket ID"
513
- )
514
- comment_ticket_parser.add_argument(
515
- "comment",
516
- nargs="+",
517
- help="Comment text"
518
- )
519
-
520
- # Update workflow state
521
- workflow_ticket_parser = tickets_subparsers.add_parser(
522
- TicketCommands.WORKFLOW.value,
523
- help="Update ticket workflow state"
524
- )
525
- workflow_ticket_parser.add_argument(
526
- "id",
527
- help="Ticket ID"
528
- )
529
- workflow_ticket_parser.add_argument(
530
- "state",
531
- choices=["todo", "in_progress", "ready", "tested", "done", "blocked"],
532
- help="New workflow state"
533
- )
534
- workflow_ticket_parser.add_argument(
535
- "--comment",
536
- help="Optional comment for the transition"
537
- )
538
-
539
- # Info command
540
- info_parser = subparsers.add_parser(
541
- CLICommands.INFO.value,
542
- help="Show framework and configuration info"
543
- )
544
- add_common_arguments(info_parser)
545
-
546
- # Agents command with subcommands
547
- agents_parser = subparsers.add_parser(
548
- CLICommands.AGENTS.value,
549
- help="Manage Claude Code native agents"
550
- )
551
- add_common_arguments(agents_parser)
552
-
553
- agents_subparsers = agents_parser.add_subparsers(
554
- dest="agents_command",
555
- help="Agent commands",
556
- metavar="SUBCOMMAND"
557
- )
558
-
559
- # List agents
560
- list_agents_parser = agents_subparsers.add_parser(
561
- AgentCommands.LIST.value,
562
- help="List available agents"
563
- )
564
- list_agents_parser.add_argument(
565
- "--system",
566
- action="store_true",
567
- help="List system agents"
568
- )
569
- list_agents_parser.add_argument(
570
- "--deployed",
571
- action="store_true",
572
- help="List deployed agents"
573
- )
574
- list_agents_parser.add_argument(
575
- "--by-tier",
576
- action="store_true",
577
- help="List agents grouped by precedence tier (PROJECT > USER > SYSTEM)"
578
- )
579
-
580
- # View agent details
581
- view_agent_parser = agents_subparsers.add_parser(
582
- AgentCommands.VIEW.value,
583
- help="View detailed information about a specific agent"
584
- )
585
- view_agent_parser.add_argument(
586
- "agent_name",
587
- help="Name of the agent to view"
588
- )
589
-
590
- # Fix agent frontmatter
591
- fix_agents_parser = agents_subparsers.add_parser(
592
- AgentCommands.FIX.value,
593
- help="Fix agent frontmatter issues"
594
- )
595
- fix_agents_parser.add_argument(
596
- "agent_name",
597
- nargs="?",
598
- help="Name of specific agent to fix (fix all if not specified with --all)"
599
- )
600
- fix_agents_parser.add_argument(
601
- "--dry-run",
602
- action="store_true",
603
- help="Preview changes without applying them"
604
- )
605
- fix_agents_parser.add_argument(
606
- "--all",
607
- action="store_true",
608
- help="Fix all agents"
609
- )
610
-
611
- # Deploy agents
612
- deploy_agents_parser = agents_subparsers.add_parser(
613
- AgentCommands.DEPLOY.value,
614
- help="Deploy system agents"
615
- )
616
- deploy_agents_parser.add_argument(
617
- "--target",
618
- type=Path,
619
- help="Target directory (default: .claude/agents/)"
620
- )
621
- deploy_agents_parser.add_argument(
622
- "--include-all",
623
- action="store_true",
624
- help="Include all agents, overriding exclusion configuration"
625
- )
626
-
627
- # Force deploy agents
628
- force_deploy_parser = agents_subparsers.add_parser(
629
- AgentCommands.FORCE_DEPLOY.value,
630
- help="Force deploy all system agents"
631
- )
632
- force_deploy_parser.add_argument(
633
- "--target",
634
- type=Path,
635
- help="Target directory (default: .claude/agents/)"
636
- )
637
- force_deploy_parser.add_argument(
638
- "--include-all",
639
- action="store_true",
640
- help="Include all agents, overriding exclusion configuration"
641
- )
642
-
643
- # Clean agents
644
- clean_agents_parser = agents_subparsers.add_parser(
645
- AgentCommands.CLEAN.value,
646
- help="Remove deployed system agents"
647
- )
648
- clean_agents_parser.add_argument(
649
- "--target",
650
- type=Path,
651
- help="Target directory (default: .claude/)"
652
- )
653
-
654
- # Memory command with subcommands
655
- memory_parser = subparsers.add_parser(
656
- CLICommands.MEMORY.value,
657
- help="Manage agent memory files"
658
- )
659
- add_common_arguments(memory_parser)
660
-
661
- memory_subparsers = memory_parser.add_subparsers(
662
- dest="memory_command",
663
- help="Memory commands",
664
- metavar="SUBCOMMAND"
665
- )
666
-
667
- # Init command
668
- init_parser = memory_subparsers.add_parser(
669
- MemoryCommands.INIT.value,
670
- help="Initialize project-specific memories via PM agent"
671
- )
672
-
673
- # Status command
674
- status_parser = memory_subparsers.add_parser(
675
- MemoryCommands.STATUS.value,
676
- help="Show memory file status"
677
- )
678
-
679
- # View command
680
- view_parser = memory_subparsers.add_parser(
681
- MemoryCommands.VIEW.value,
682
- help="View agent memory file"
683
- )
684
- view_parser.add_argument(
685
- "agent_id",
686
- nargs="?",
687
- help="Agent ID to view memory for (optional - shows all agents if not provided)"
688
- )
689
-
690
- # Add command
691
- add_parser = memory_subparsers.add_parser(
692
- MemoryCommands.ADD.value,
693
- help="Manually add learning to agent memory"
694
- )
695
- add_parser.add_argument(
696
- "agent_id",
697
- help="Agent ID to add learning to"
698
- )
699
- add_parser.add_argument(
700
- "learning_type",
701
- choices=["pattern", "error", "optimization", "preference", "context"],
702
- help="Type of learning to add"
703
- )
704
- add_parser.add_argument(
705
- "content",
706
- help="Learning content to add"
707
- )
708
-
709
- # Clean command
710
- clean_memory_parser = memory_subparsers.add_parser(
711
- MemoryCommands.CLEAN.value,
712
- help="Clean up old/unused memory files"
713
- )
714
-
715
- # Optimize command
716
- optimize_parser = memory_subparsers.add_parser(
717
- MemoryCommands.OPTIMIZE.value,
718
- help="Optimize memory files by removing duplicates and consolidating similar items"
719
- )
720
- optimize_parser.add_argument(
721
- "agent_id",
722
- nargs="?",
723
- help="Agent ID to optimize (optimize all if not specified)"
724
- )
725
-
726
- # Build command
727
- build_parser = memory_subparsers.add_parser(
728
- MemoryCommands.BUILD.value,
729
- help="Build agent memories from project documentation"
730
- )
731
- build_parser.add_argument(
732
- "--force-rebuild",
733
- action="store_true",
734
- help="Force rebuild even if docs haven't changed"
735
- )
736
-
737
- # Cross-reference command
738
- cross_ref_parser = memory_subparsers.add_parser(
739
- MemoryCommands.CROSS_REF.value,
740
- help="Find cross-references and common patterns across agent memories"
741
- )
742
- cross_ref_parser.add_argument(
743
- "--query",
744
- type=str,
745
- help="Optional search query to filter cross-references"
746
- )
747
-
748
- # Route command
749
- route_parser = memory_subparsers.add_parser(
750
- MemoryCommands.ROUTE.value,
751
- help="Test memory command routing logic"
752
- )
753
- route_parser.add_argument(
754
- "--content",
755
- type=str,
756
- required=True,
757
- help="Content to analyze for routing"
758
- )
759
-
760
- # Show command
761
- show_parser = memory_subparsers.add_parser(
762
- MemoryCommands.SHOW.value,
763
- help="Show agent memories in user-friendly format with cross-references"
764
- )
765
- show_parser.add_argument(
766
- "agent_id",
767
- nargs="?",
768
- help="Agent ID to show memory for (show all if not specified)"
769
- )
770
- show_parser.add_argument(
771
- "--format",
772
- choices=["summary", "detailed", "full"],
773
- default="summary",
774
- help="Display format: summary (default), detailed, or full"
775
- )
776
- show_parser.add_argument(
777
- "--raw",
778
- action="store_true",
779
- help="Output raw memory content in JSON format for programmatic processing"
780
- )
781
-
782
- # Add dependency management subcommands to agents
783
- deps_check_parser = agents_subparsers.add_parser(
784
- 'deps-check',
785
- help='Check dependencies for deployed agents'
786
- )
787
- deps_check_parser.add_argument(
788
- '--verbose',
789
- action='store_true',
790
- help='Enable verbose output'
791
- )
792
- deps_check_parser.add_argument(
793
- '--agent',
794
- type=str,
795
- help='Check dependencies for a specific agent only'
796
- )
797
-
798
- deps_install_parser = agents_subparsers.add_parser(
799
- 'deps-install',
800
- help='Install missing dependencies for deployed agents'
801
- )
802
- deps_install_parser.add_argument(
803
- '--agent',
804
- type=str,
805
- help='Install dependencies for a specific agent only'
806
- )
807
- deps_install_parser.add_argument(
808
- '--dry-run',
809
- action='store_true',
810
- help='Show what would be installed without actually installing'
811
- )
812
-
813
- deps_list_parser = agents_subparsers.add_parser(
814
- 'deps-list',
815
- help='List all dependencies from deployed agents'
816
- )
817
- deps_list_parser.add_argument(
818
- '--format',
819
- choices=['text', 'pip', 'json'],
820
- default='text',
821
- help='Output format for dependency list'
822
- )
823
-
824
- deps_fix_parser = agents_subparsers.add_parser(
825
- 'deps-fix',
826
- help='Fix missing agent dependencies with robust retry logic'
827
- )
828
- deps_fix_parser.add_argument(
829
- '--max-retries',
830
- type=int,
831
- default=3,
832
- help='Maximum retry attempts per package (default: 3)'
833
- )
834
-
835
- # Config command with subcommands
836
- config_parser = subparsers.add_parser(
837
- CLICommands.CONFIG.value,
838
- help="Validate and manage configuration"
839
- )
840
- add_common_arguments(config_parser)
841
-
842
- config_subparsers = config_parser.add_subparsers(
843
- dest="config_command",
844
- help="Config commands",
845
- metavar="SUBCOMMAND"
846
- )
847
-
848
- # Validate config
849
- validate_config_parser = config_subparsers.add_parser(
850
- ConfigCommands.VALIDATE.value,
851
- help="Validate configuration file"
852
- )
853
- validate_config_parser.add_argument(
854
- "--config-file",
855
- type=Path,
856
- help="Path to configuration file (default: .claude-mpm/configuration.yaml)"
857
- )
858
- validate_config_parser.add_argument(
859
- "--strict",
860
- action="store_true",
861
- help="Treat warnings as errors"
862
- )
863
-
864
- # View config
865
- view_config_parser = config_subparsers.add_parser(
866
- ConfigCommands.VIEW.value,
867
- help="View current configuration"
868
- )
869
- view_config_parser.add_argument(
870
- "--config-file",
871
- type=Path,
872
- help="Path to configuration file"
873
- )
874
- view_config_parser.add_argument(
875
- "--section",
876
- help="View specific configuration section"
877
- )
878
- view_config_parser.add_argument(
879
- "--format",
880
- choices=["table", "json", "yaml"],
881
- default="table",
882
- help="Output format (default: table)"
883
- )
884
-
885
- # Config status
886
- status_config_parser = config_subparsers.add_parser(
887
- ConfigCommands.STATUS.value,
888
- help="Show configuration status and health"
889
- )
890
- status_config_parser.add_argument(
891
- "--config-file",
892
- type=Path,
893
- help="Path to configuration file"
894
- )
895
- status_config_parser.add_argument(
896
- "--check-response-logging",
897
- action="store_true",
898
- help="Show detailed response logging configuration"
899
- )
900
- status_config_parser.add_argument(
901
- "--verbose",
902
- action="store_true",
903
- help="Show detailed errors and warnings"
904
- )
905
-
906
- # Monitor command with subcommands
907
- monitor_parser = subparsers.add_parser(
908
- CLICommands.MONITOR.value,
909
- help="Manage Socket.IO monitoring server"
910
- )
911
- add_common_arguments(monitor_parser)
912
-
913
- monitor_subparsers = monitor_parser.add_subparsers(
914
- dest="monitor_command",
915
- help="Monitor commands",
916
- metavar="SUBCOMMAND"
917
- )
918
-
919
- # Start monitor
920
- start_monitor_parser = monitor_subparsers.add_parser(
921
- MonitorCommands.START.value,
922
- help="Start Socket.IO monitoring server"
923
- )
924
- start_monitor_parser.add_argument(
925
- "--port",
926
- type=int,
927
- default=8765,
928
- help="Port to start server on (default: 8765)"
929
- )
930
- start_monitor_parser.add_argument(
931
- "--host",
932
- default="localhost",
933
- help="Host to bind to (default: localhost)"
934
- )
935
-
936
- # Stop monitor
937
- stop_monitor_parser = monitor_subparsers.add_parser(
938
- MonitorCommands.STOP.value,
939
- help="Stop Socket.IO monitoring server"
940
- )
941
- stop_monitor_parser.add_argument(
942
- "--port",
943
- type=int,
944
- help="Port of server to stop (auto-detect if not specified)"
945
- )
946
-
947
- # Restart monitor
948
- restart_monitor_parser = monitor_subparsers.add_parser(
949
- MonitorCommands.RESTART.value,
950
- help="Restart Socket.IO monitoring server"
951
- )
952
- restart_monitor_parser.add_argument(
953
- "--port",
954
- type=int,
955
- help="Port of server to restart (auto-detect if not specified)"
956
- )
957
-
958
- # Port monitor - start/restart on specific port
959
- port_monitor_parser = monitor_subparsers.add_parser(
960
- MonitorCommands.PORT.value,
961
- help="Start/restart Socket.IO monitoring server on specific port"
962
- )
963
- port_monitor_parser.add_argument(
964
- "port",
965
- type=int,
966
- help="Port number to start/restart server on"
967
- )
968
- port_monitor_parser.add_argument(
969
- "--host",
970
- default="localhost",
971
- help="Host to bind to (default: localhost)"
972
- )
973
-
974
- # Import and add aggregate command parser
975
- from .commands.aggregate import add_aggregate_parser
976
- add_aggregate_parser(subparsers)
977
-
978
- # Import and add cleanup command parser
979
- from .commands.cleanup import add_cleanup_parser
980
- add_cleanup_parser(subparsers)
981
-
982
- # Import and add run-guarded command parser (EXPERIMENTAL)
983
- # WHY: run-guarded is kept separate from run to maintain stability
984
- # DESIGN DECISION: Experimental features are clearly marked and isolated
985
- from .commands.run_guarded import add_run_guarded_parser
986
- add_run_guarded_parser(subparsers)
987
-
988
- # MCP command with subcommands
989
- mcp_parser = subparsers.add_parser(
990
- CLICommands.MCP.value,
991
- help="Manage MCP Gateway server and tools"
992
- )
993
- add_common_arguments(mcp_parser)
994
-
995
- mcp_subparsers = mcp_parser.add_subparsers(
996
- dest="mcp_command",
997
- help="MCP commands",
998
- metavar="SUBCOMMAND"
999
- )
1000
-
1001
- # Install MCP Gateway
1002
- install_mcp_parser = mcp_subparsers.add_parser(
1003
- MCPCommands.INSTALL.value,
1004
- help="Install and configure MCP Gateway"
1005
- )
1006
- install_mcp_parser.add_argument(
1007
- "--force",
1008
- action="store_true",
1009
- help="Force overwrite existing configuration"
1010
- )
1011
-
1012
- # Start MCP server
1013
- start_mcp_parser = mcp_subparsers.add_parser(
1014
- MCPCommands.START.value,
1015
- help="Start the MCP Gateway server"
1016
- )
1017
- start_mcp_parser.add_argument(
1018
- "--mode",
1019
- choices=["stdio", "standalone"],
1020
- default="stdio",
1021
- help="Server mode: stdio for Claude integration, standalone for testing (default: stdio)"
1022
- )
1023
- start_mcp_parser.add_argument(
1024
- "--port",
1025
- type=int,
1026
- default=8766,
1027
- help="Port for standalone mode (default: 8766)"
1028
- )
1029
- start_mcp_parser.add_argument(
1030
- "--config-file",
1031
- type=Path,
1032
- help="Path to MCP configuration file"
1033
- )
1034
-
1035
- # Stop MCP server
1036
- stop_mcp_parser = mcp_subparsers.add_parser(
1037
- MCPCommands.STOP.value,
1038
- help="Stop the MCP Gateway server"
1039
- )
1040
-
1041
- # MCP status
1042
- status_mcp_parser = mcp_subparsers.add_parser(
1043
- MCPCommands.STATUS.value,
1044
- help="Check server and tool status"
1045
- )
1046
- status_mcp_parser.add_argument(
1047
- "--verbose",
1048
- action="store_true",
1049
- help="Show detailed status information"
1050
- )
1051
-
1052
- # List/manage tools
1053
- tools_mcp_parser = mcp_subparsers.add_parser(
1054
- MCPCommands.TOOLS.value,
1055
- help="List and manage registered tools"
1056
- )
1057
- tools_mcp_parser.add_argument(
1058
- "tool_action",
1059
- nargs="?",
1060
- choices=["list", "enable", "disable"],
1061
- default="list",
1062
- help="Tool action (default: list)"
1063
- )
1064
- tools_mcp_parser.add_argument(
1065
- "tool_name",
1066
- nargs="?",
1067
- help="Tool name for enable/disable actions"
1068
- )
1069
- tools_mcp_parser.add_argument(
1070
- "--verbose",
1071
- action="store_true",
1072
- help="Show detailed tool information including schemas"
1073
- )
1074
-
1075
- # Register new tool
1076
- register_mcp_parser = mcp_subparsers.add_parser(
1077
- MCPCommands.REGISTER.value,
1078
- help="Register a new MCP tool"
1079
- )
1080
- register_mcp_parser.add_argument(
1081
- "name",
1082
- help="Tool name"
1083
- )
1084
- register_mcp_parser.add_argument(
1085
- "description",
1086
- help="Tool description"
1087
- )
1088
- register_mcp_parser.add_argument(
1089
- "--schema-file",
1090
- type=Path,
1091
- help="Path to JSON schema file for tool input"
1092
- )
1093
- register_mcp_parser.add_argument(
1094
- "--adapter",
1095
- help="Path to custom tool adapter module"
1096
- )
1097
- register_mcp_parser.add_argument(
1098
- "--save",
1099
- action="store_true",
1100
- help="Save tool to configuration"
1101
- )
1102
-
1103
- # Test tool invocation
1104
- test_mcp_parser = mcp_subparsers.add_parser(
1105
- MCPCommands.TEST.value,
1106
- help="Test MCP tool invocation"
1107
- )
1108
- test_mcp_parser.add_argument(
1109
- "tool_name",
1110
- help="Name of tool to test"
1111
- )
1112
- test_mcp_parser.add_argument(
1113
- "--args",
1114
- help="Tool arguments as JSON string"
1115
- )
1116
- test_mcp_parser.add_argument(
1117
- "--args-file",
1118
- type=Path,
1119
- help="Path to JSON file containing tool arguments"
1120
- )
1121
-
1122
- # Manage configuration
1123
- config_mcp_parser = mcp_subparsers.add_parser(
1124
- MCPCommands.CONFIG.value,
1125
- help="View and manage MCP configuration"
1126
- )
1127
- config_mcp_parser.add_argument(
1128
- "config_action",
1129
- nargs="?",
1130
- choices=["view", "edit", "reset"],
1131
- default="view",
1132
- help="Configuration action (default: view)"
1133
- )
1134
-
1135
- return parser
26
+ # Import from the new modular structure
27
+ from .parsers import add_common_arguments, create_parser, preprocess_args
1136
28
 
29
+ # Re-export for backward compatibility
30
+ __all__ = ["create_parser", "add_common_arguments", "preprocess_args"]
1137
31
 
1138
- def preprocess_args(argv: Optional[List[str]] = None) -> List[str]:
1139
- """
1140
- Preprocess arguments to handle --mpm: prefix commands.
1141
-
1142
- WHY: We support both --mpm:command and regular command syntax for flexibility
1143
- and backward compatibility. This function normalizes the input.
1144
-
1145
- Args:
1146
- argv: List of command line arguments, or None to use sys.argv[1:]
1147
-
1148
- Returns:
1149
- Processed list of arguments with prefixes removed
1150
- """
1151
- import sys
1152
-
1153
- if argv is None:
1154
- argv = sys.argv[1:]
1155
-
1156
- # Convert --mpm:command to command for argparse compatibility
1157
- processed_args = []
1158
- for arg in argv:
1159
- if arg.startswith(CLIPrefix.MPM.value):
1160
- # Extract command after prefix
1161
- command = arg[len(CLIPrefix.MPM.value):]
1162
- processed_args.append(command)
1163
- else:
1164
- processed_args.append(arg)
1165
-
1166
- return processed_args
32
+ # Legacy functions removed - all functionality moved to parsers/ modules
33
+ # The original parser.py file contained a massive 961-line create_parser function
34
+ # that has been split into focused modules for better maintainability.