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
@@ -9,68 +9,68 @@ that dispatches to specific subcommand handlers, maintaining consistency
9
9
  with other command modules like agents.py and memory.py.
10
10
  """
11
11
 
12
+ import subprocess
12
13
  import sys
13
- from pathlib import Path
14
14
 
15
- from ...core.logger import get_logger
16
15
  from ...constants import MonitorCommands
16
+ from ...core.logger import get_logger
17
17
 
18
18
 
19
19
  def manage_monitor(args):
20
20
  """
21
21
  Manage Socket.IO monitoring server.
22
-
22
+
23
23
  WHY: The monitoring server provides real-time insights into Claude MPM sessions,
24
24
  websocket connections, and system performance. This command provides a unified
25
25
  interface for all monitor-related operations.
26
-
26
+
27
27
  DESIGN DECISION: When no subcommand is provided, we show the server status
28
28
  as the default action, giving users a quick overview of the monitoring system.
29
-
29
+
30
30
  Args:
31
31
  args: Parsed command line arguments with monitor_command attribute
32
32
  """
33
33
  logger = get_logger("cli")
34
-
34
+
35
35
  try:
36
36
  # Import ServerManager from socketio_server_manager.py
37
37
  from ...scripts.socketio_server_manager import ServerManager
38
+
38
39
  server_manager = ServerManager()
39
-
40
+
40
41
  if not args.monitor_command:
41
- # No subcommand - show help
42
- # WHY: Since we removed status, show help instead when no subcommand is provided
43
- print("Available monitor commands:")
44
- print(" start - Start the Socket.IO monitoring server")
45
- print(" stop - Stop the Socket.IO monitoring server")
46
- print(" restart - Restart the Socket.IO monitoring server")
47
- print(" port <N> - Start/restart on specific port")
48
- print()
49
- print("Use 'claude-mpm monitor <command> --help' for more information")
50
- return 0
51
-
42
+ # No subcommand - show status as default
43
+ # WHY: Status is the most common operation users want when running monitor without args
44
+ args.verbose = False # Set default for verbose flag
45
+ success = _status_server(args, server_manager)
46
+ return 0 if success else 1
47
+
52
48
  if args.monitor_command == MonitorCommands.START.value:
53
49
  success = _start_server(args, server_manager)
54
50
  return 0 if success else 1
55
-
51
+
56
52
  elif args.monitor_command == MonitorCommands.STOP.value:
57
53
  success = _stop_server(args, server_manager)
58
54
  return 0 if success else 1
59
-
55
+
60
56
  elif args.monitor_command == MonitorCommands.RESTART.value:
61
57
  success = _restart_server(args, server_manager)
62
58
  return 0 if success else 1
63
-
59
+
60
+ elif args.monitor_command == MonitorCommands.STATUS.value:
61
+ success = _status_server(args, server_manager)
62
+ return 0 if success else 1
63
+
64
64
  elif args.monitor_command == MonitorCommands.PORT.value:
65
65
  success = _port_server(args, server_manager)
66
66
  return 0 if success else 1
67
-
67
+
68
68
  else:
69
69
  logger.error(f"Unknown monitor command: {args.monitor_command}")
70
70
  print(f"Unknown monitor command: {args.monitor_command}")
71
- print("Available commands: start, stop, restart, port")
71
+ print("Available commands: start, stop, restart, status, port")
72
72
  return 1
73
-
73
+
74
74
  except ImportError as e:
75
75
  logger.error(f"Server manager not available: {e}")
76
76
  print("Error: Socket.IO server manager not available")
@@ -80,39 +80,85 @@ def manage_monitor(args):
80
80
  logger.error(f"Error managing monitor: {e}")
81
81
  print(f"Error: {e}")
82
82
  return 1
83
-
83
+
84
84
  return 0
85
85
 
86
86
 
87
87
  def _port_server(args, server_manager):
88
88
  """
89
89
  Start or restart the Socket.IO monitoring server on a specific port.
90
-
90
+
91
91
  WHY: Users need to be able to start/restart the monitoring server on a specific
92
92
  port, either if no server is running (start) or if a server is already running
93
- on a different port (restart).
94
-
93
+ on a different port (restart). Enhanced with smart process detection to reclaim
94
+ ports from debug processes.
95
+
95
96
  Args:
96
- args: Command arguments with required port and optional host
97
+ args: Command arguments with required port and optional host, force, reclaim flags
97
98
  server_manager: ServerManager instance
98
-
99
+
99
100
  Returns:
100
101
  bool: True if server started/restarted successfully, False otherwise
101
102
  """
102
103
  port = args.port
103
- host = getattr(args, 'host', 'localhost')
104
-
104
+ host = getattr(args, "host", "localhost")
105
+ force = getattr(args, "force", False)
106
+ reclaim = getattr(args, "reclaim", True)
107
+
105
108
  print(f"Managing Socket.IO monitoring server on port {port}...")
106
109
  print(f"Target: {host}:{port}")
107
110
  print()
108
-
111
+
109
112
  try:
110
- # Check if there are any running servers
111
- running_servers = server_manager.list_running_servers()
113
+ # Import PortManager to check port status
114
+ from ...services.port_manager import PortManager
115
+ port_manager = PortManager()
116
+
117
+ # Get detailed port status
118
+ port_status = port_manager.get_port_status(port)
112
119
 
113
- # Check if server is already running on this port
114
- server_on_port = any(server.get('port') == port for server in running_servers)
120
+ # Check if port is in use
121
+ if not port_status["available"]:
122
+ process_info = port_status.get("process")
123
+ if process_info:
124
+ print(f"⚠️ Port {port} is in use:")
125
+ print(f" Process: {process_info['name']} (PID: {process_info['pid']})")
126
+
127
+ if process_info['is_ours']:
128
+ if process_info['is_debug']:
129
+ print(f" Type: Debug/Test script (can be reclaimed)")
130
+ if reclaim:
131
+ print(f" Action: Attempting to reclaim port...")
132
+ if port_manager.kill_process_on_port(port, force=force):
133
+ print(f" ✅ Successfully reclaimed port {port}")
134
+ else:
135
+ print(f" ❌ Failed to reclaim port {port}")
136
+ return False
137
+ elif process_info['is_daemon']:
138
+ print(f" Type: Daemon process")
139
+ if force:
140
+ print(f" Action: Force killing daemon (--force flag used)...")
141
+ if port_manager.kill_process_on_port(port, force=True):
142
+ print(f" ✅ Successfully killed daemon on port {port}")
143
+ else:
144
+ print(f" ❌ Failed to kill daemon on port {port}")
145
+ return False
146
+ else:
147
+ print(f" ❌ Cannot start: Daemon already running")
148
+ print(f" Recommendation: {port_status['recommendation']}")
149
+ return False
150
+ else:
151
+ print(f" Type: External process")
152
+ print(f" ❌ Cannot start: {port_status['recommendation']}")
153
+ return False
154
+ print()
115
155
 
156
+ # Check if there are any running servers
157
+ running_servers = server_manager.list_running_servers()
158
+
159
+ # Check if server is already running on this port after reclaim
160
+ server_on_port = any(server.get("port") == port for server in running_servers)
161
+
116
162
  if server_on_port:
117
163
  print(f"Server already running on port {port}. Restarting...")
118
164
  success = server_manager.restart_server(port=port)
@@ -122,17 +168,19 @@ def _port_server(args, server_manager):
122
168
  if running_servers:
123
169
  print("Servers running on other ports:")
124
170
  for server in running_servers:
125
- server_port = server.get('port')
126
- server_id = server.get('server_id', 'unknown')
171
+ server_port = server.get("port")
172
+ server_id = server.get("server_id", "unknown")
127
173
  print(f" • Server '{server_id}' on port {server_port}")
128
174
  print()
129
175
  print(f"Starting new server on port {port}...")
130
176
  else:
131
177
  print("No servers currently running. Starting new server...")
132
-
133
- success = server_manager.start_server(port=port, host=host, server_id="monitor-server")
178
+
179
+ success = server_manager.start_server(
180
+ port=port, host=host, server_id="monitor-server"
181
+ )
134
182
  action = "started"
135
-
183
+
136
184
  if success:
137
185
  print()
138
186
  print(f"Monitor server {action} successfully on port {port}")
@@ -150,9 +198,9 @@ def _port_server(args, server_manager):
150
198
  print(f" • Check if port {port} is available: lsof -i :{port}")
151
199
  print(f" • Try a different port: claude-mpm monitor port {port + 1}")
152
200
  print(" • Check system resources: free -h && df -h")
153
-
201
+
154
202
  return success
155
-
203
+
156
204
  except Exception as e:
157
205
  print(f"Error managing server on port {port}: {e}")
158
206
  print()
@@ -166,27 +214,67 @@ def _port_server(args, server_manager):
166
214
  def _start_server(args, server_manager):
167
215
  """
168
216
  Start the Socket.IO monitoring server.
169
-
217
+
170
218
  WHY: Users need to start the monitoring server to enable real-time monitoring
171
- of Claude MPM sessions and websocket connections.
172
-
219
+ of Claude MPM sessions and websocket connections. Enhanced with smart process
220
+ detection to automatically reclaim ports from debug scripts.
221
+
173
222
  Args:
174
- args: Command arguments with optional port and host
223
+ args: Command arguments with optional port, host, force, and reclaim flags
175
224
  server_manager: ServerManager instance
176
-
225
+
177
226
  Returns:
178
227
  bool: True if server started successfully, False otherwise
179
228
  """
180
- port = getattr(args, 'port', 8765)
181
- host = getattr(args, 'host', 'localhost')
182
-
229
+ port = getattr(args, "port", None)
230
+ host = getattr(args, "host", "localhost")
231
+ force = getattr(args, "force", False)
232
+ reclaim = getattr(args, "reclaim", True)
233
+
183
234
  print(f"Starting Socket.IO monitoring server...")
184
- print(f"Target: {host}:{port}")
185
- print()
186
235
 
187
236
  try:
188
- success = server_manager.start_server(port=port, host=host, server_id="monitor-server")
237
+ # Import PortManager for smart port selection
238
+ from ...services.port_manager import PortManager
239
+ port_manager = PortManager()
240
+
241
+ # If no port specified, find an available one with smart reclaim
242
+ if port is None:
243
+ port = port_manager.find_available_port(reclaim=reclaim)
244
+ if port is None:
245
+ print("❌ No available ports found")
246
+ print("Try specifying a port with --port or use --force to reclaim daemon ports")
247
+ return False
248
+ print(f"Selected port: {port}")
249
+ else:
250
+ # Check if specified port needs reclaiming
251
+ port_status = port_manager.get_port_status(port)
252
+ if not port_status["available"]:
253
+ process_info = port_status.get("process")
254
+ if process_info:
255
+ print(f"⚠️ Port {port} is in use by {process_info['name']} (PID: {process_info['pid']})")
256
+
257
+ if process_info['is_ours'] and (process_info['is_debug'] or force):
258
+ if reclaim:
259
+ print(f"Attempting to reclaim port {port}...")
260
+ if not port_manager.kill_process_on_port(port, force=force):
261
+ print(f"❌ Failed to reclaim port {port}")
262
+ return False
263
+ print(f"✅ Successfully reclaimed port {port}")
264
+ else:
265
+ print(f"❌ Port {port} unavailable and --no-reclaim specified")
266
+ return False
267
+ else:
268
+ print(f"❌ Cannot reclaim port: {port_status['recommendation']}")
269
+ return False
189
270
 
271
+ print(f"Target: {host}:{port}")
272
+ print()
273
+
274
+ success = server_manager.start_server(
275
+ port=port, host=host, server_id="monitor-server"
276
+ )
277
+
190
278
  if success:
191
279
  print()
192
280
  print("Monitor server management commands:")
@@ -195,9 +283,9 @@ def _start_server(args, server_manager):
195
283
  print(f" Restart: claude-mpm monitor restart")
196
284
  print()
197
285
  print(f"WebSocket URL: ws://{host}:{port}")
198
-
286
+
199
287
  return success
200
-
288
+
201
289
  except Exception as e:
202
290
  print(f"Failed to start monitoring server: {e}")
203
291
  print()
@@ -211,21 +299,21 @@ def _start_server(args, server_manager):
211
299
  def _stop_server(args, server_manager):
212
300
  """
213
301
  Stop the Socket.IO monitoring server.
214
-
302
+
215
303
  WHY: Users need to stop the monitoring server when it's no longer needed
216
304
  or when troubleshooting connection issues.
217
-
305
+
218
306
  Args:
219
307
  args: Command arguments with optional port
220
308
  server_manager: ServerManager instance
221
-
309
+
222
310
  Returns:
223
311
  bool: True if server stopped successfully, False otherwise
224
312
  """
225
- port = getattr(args, 'port', None)
226
-
313
+ port = getattr(args, "port", None)
314
+
227
315
  print("Stopping Socket.IO monitoring server...")
228
-
316
+
229
317
  try:
230
318
  # If no port specified, try to find running servers and stop them
231
319
  if port is None:
@@ -233,23 +321,23 @@ def _stop_server(args, server_manager):
233
321
  if not running_servers:
234
322
  print("No running servers found to stop")
235
323
  return True
236
-
324
+
237
325
  # Stop the first server (or all if multiple)
238
326
  success = True
239
327
  for server in running_servers:
240
- server_port = server.get('port')
241
- server_id = server.get('server_id', 'unknown')
328
+ server_port = server.get("port")
329
+ server_id = server.get("server_id", "unknown")
242
330
  print(f"Stopping server '{server_id}' on port {server_port}...")
243
-
331
+
244
332
  if not server_manager.stop_server(port=server_port):
245
333
  print(f"Failed to stop server on port {server_port}")
246
334
  success = False
247
-
335
+
248
336
  return success
249
337
  else:
250
338
  # Stop specific server on given port
251
339
  success = server_manager.stop_server(port=port)
252
-
340
+
253
341
  if success:
254
342
  print(f"Monitor server stopped on port {port}")
255
343
  else:
@@ -258,49 +346,205 @@ def _stop_server(args, server_manager):
258
346
  print("Troubleshooting:")
259
347
  print(f" • Check if server is running: claude-mpm monitor status")
260
348
  print(f" • Try force kill: kill $(lsof -ti :{port})")
261
-
349
+
262
350
  return success
263
-
351
+
264
352
  except Exception as e:
265
353
  print(f"Error stopping server: {e}")
266
354
  return False
267
355
 
268
356
 
357
+ def _status_server(args, server_manager):
358
+ """
359
+ Check the status of Socket.IO monitoring servers.
360
+
361
+ WHY: Users need to check if the monitoring server is running, what port
362
+ it's using, and other diagnostic information without starting/stopping it.
363
+ Enhanced to show what processes are using ports.
364
+
365
+ Args:
366
+ args: Command arguments with optional verbose flag
367
+ server_manager: ServerManager instance
368
+
369
+ Returns:
370
+ bool: True if status check succeeded, False otherwise
371
+ """
372
+ verbose = getattr(args, "verbose", False)
373
+ show_ports = getattr(args, "show_ports", False)
374
+
375
+ print("Checking Socket.IO monitoring server status...")
376
+ print()
377
+
378
+ try:
379
+ # Check for daemon server using socketio_daemon.py
380
+ daemon_script = server_manager.daemon_script
381
+ if daemon_script and daemon_script.exists():
382
+ # Try to get status from daemon
383
+ result = subprocess.run(
384
+ [sys.executable, str(daemon_script), "status"],
385
+ capture_output=True,
386
+ text=True
387
+ )
388
+
389
+ if result.returncode == 0 and result.stdout:
390
+ # Daemon provided status information
391
+ print(result.stdout)
392
+
393
+ if verbose:
394
+ # Show additional information
395
+ print("\nAdditional Details:")
396
+ print("─" * 40)
397
+
398
+ # List all running servers from ServerManager
399
+ running_servers = server_manager.list_running_servers()
400
+ if running_servers:
401
+ print(f"Found {len(running_servers)} running server(s):")
402
+ for server in running_servers:
403
+ server_port = server.get("port", "unknown")
404
+ server_id = server.get("server_id", "unknown")
405
+ server_pid = server.get("pid", "unknown")
406
+ print(f" • Server '{server_id}'")
407
+ print(f" Port: {server_port}")
408
+ print(f" PID: {server_pid}")
409
+ else:
410
+ print("No additional servers found via ServerManager")
411
+
412
+ return True
413
+
414
+ # Fall back to ServerManager's list_running_servers
415
+ running_servers = server_manager.list_running_servers()
416
+
417
+ if not running_servers:
418
+ print("❌ No Socket.IO monitoring servers are currently running")
419
+ print()
420
+ print("To start a server:")
421
+ print(" claude-mpm monitor start")
422
+ print(" claude-mpm monitor start --port 8765")
423
+ return True
424
+
425
+ # Import PortManager for enhanced status
426
+ from ...services.port_manager import PortManager
427
+ port_manager = PortManager()
428
+
429
+ # Display server information
430
+ print(f"✅ Found {len(running_servers)} running server(s):")
431
+ print()
432
+
433
+ for server in running_servers:
434
+ server_port = server.get("port", "unknown")
435
+ server_id = server.get("server_id", "unknown")
436
+ server_pid = server.get("pid", "unknown")
437
+ server_host = server.get("host", "localhost")
438
+
439
+ print(f"Server: {server_id}")
440
+ print(f" • PID: {server_pid}")
441
+ print(f" • Port: {server_port}")
442
+ print(f" • Host: {server_host}")
443
+ print(f" • WebSocket URL: ws://{server_host}:{server_port}")
444
+
445
+ # Show port status if verbose
446
+ if verbose and server_port != "unknown":
447
+ port_status = port_manager.get_port_status(int(server_port))
448
+ if port_status.get("process"):
449
+ process = port_status["process"]
450
+ print(f" • Process Type: {'Debug' if process['is_debug'] else 'Daemon' if process['is_daemon'] else 'Regular'}")
451
+
452
+ if verbose:
453
+ # Check if port is actually listening
454
+ try:
455
+ import socket
456
+ sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
457
+ result = sock.connect_ex((server_host, server_port))
458
+ sock.close()
459
+ if result == 0:
460
+ print(f" • Status: ✅ Listening")
461
+ else:
462
+ print(f" • Status: ⚠️ Not responding on port")
463
+ except Exception as e:
464
+ print(f" • Status: ❌ Error checking: {e}")
465
+
466
+ print()
467
+
468
+ # Show port range status if requested
469
+ if show_ports or verbose:
470
+ print("\nPort Range Status (8765-8785):")
471
+ print("─" * 40)
472
+ for check_port in range(8765, 8771): # Show first 6 ports
473
+ status = port_manager.get_port_status(check_port)
474
+ if status["available"]:
475
+ print(f" Port {check_port}: ✅ Available")
476
+ else:
477
+ process = status.get("process")
478
+ if process:
479
+ if process["is_ours"]:
480
+ if process["is_debug"]:
481
+ print(f" Port {check_port}: 🔧 Debug script (PID: {process['pid']})")
482
+ elif process["is_daemon"]:
483
+ print(f" Port {check_port}: 🚀 Daemon (PID: {process['pid']})")
484
+ else:
485
+ print(f" Port {check_port}: 📦 Our process (PID: {process['pid']})")
486
+ else:
487
+ print(f" Port {check_port}: ⛔ External ({process['name']})")
488
+ else:
489
+ print(f" Port {check_port}: ❓ In use (unknown process)")
490
+ print()
491
+
492
+ print("Server management commands:")
493
+ print(" Stop all: claude-mpm monitor stop")
494
+ print(" Restart: claude-mpm monitor restart")
495
+ print(" Reclaim: claude-mpm monitor start --force # Kill debug scripts")
496
+ if len(running_servers) == 1:
497
+ port = running_servers[0].get("port", 8765)
498
+ print(f" Stop this: claude-mpm monitor stop --port {port}")
499
+
500
+ return True
501
+
502
+ except Exception as e:
503
+ print(f"Error checking server status: {e}")
504
+ print()
505
+ print("Try manual checks:")
506
+ print(" • Process list: ps aux | grep socketio")
507
+ print(" • Port usage: lsof -i :8765")
508
+ return False
509
+
510
+
269
511
  def _restart_server(args, server_manager):
270
512
  """
271
513
  Restart the Socket.IO monitoring server.
272
-
514
+
273
515
  WHY: Users need to restart the monitoring server to apply configuration
274
516
  changes or recover from error states.
275
-
517
+
276
518
  Args:
277
519
  args: Command arguments with optional port
278
520
  server_manager: ServerManager instance
279
-
521
+
280
522
  Returns:
281
523
  bool: True if server restarted successfully, False otherwise
282
524
  """
283
- port = getattr(args, 'port', None)
284
-
525
+ port = getattr(args, "port", None)
526
+
285
527
  print("Restarting Socket.IO monitoring server...")
286
-
528
+
287
529
  try:
288
530
  # If no port specified, find running servers to restart
289
531
  if port is None:
290
532
  running_servers = server_manager.list_running_servers()
291
533
  if not running_servers:
292
- print("No running servers found. Starting new server on default port...")
534
+ print(
535
+ "No running servers found. Starting new server on default port..."
536
+ )
293
537
  return _start_server(args, server_manager)
294
-
538
+
295
539
  # Restart the first server found
296
540
  server = running_servers[0]
297
- port = server.get('port', 8765)
298
-
541
+ port = server.get("port", 8765)
542
+
299
543
  print(f"Using port {port} for restart...")
300
-
544
+
301
545
  # Use ServerManager's restart method
302
546
  success = server_manager.restart_server(port=port)
303
-
547
+
304
548
  if success:
305
549
  print(f"Monitor server restarted successfully on port {port}")
306
550
  print()
@@ -316,13 +560,13 @@ def _restart_server(args, server_manager):
316
560
  print(f" claude-mpm monitor stop --port {port}")
317
561
  print(f" claude-mpm monitor start --port {port}")
318
562
  print(" • Check server logs for errors")
319
-
563
+
320
564
  return success
321
-
565
+
322
566
  except Exception as e:
323
567
  print(f"Error restarting server: {e}")
324
568
  print()
325
569
  print("Fallback options:")
326
570
  print(" • Manual restart: stop then start")
327
571
  print(" • Check system resources and try again")
328
- return False
572
+ return False