claude-mpm 4.1.6__py3-none-any.whl → 4.24.0__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.

Potentially problematic release.


This version of claude-mpm might be problematic. Click here for more details.

Files changed (866) hide show
  1. claude_mpm/BUILD_NUMBER +1 -1
  2. claude_mpm/VERSION +1 -1
  3. claude_mpm/__init__.py +20 -5
  4. claude_mpm/agents/BASE_AGENT_TEMPLATE.md +118 -0
  5. claude_mpm/agents/BASE_DOCUMENTATION.md +53 -0
  6. claude_mpm/agents/BASE_ENGINEER.md +658 -0
  7. claude_mpm/agents/BASE_OPS.md +219 -0
  8. claude_mpm/agents/BASE_PM.md +431 -214
  9. claude_mpm/agents/BASE_PROMPT_ENGINEER.md +787 -0
  10. claude_mpm/agents/BASE_QA.md +167 -0
  11. claude_mpm/agents/BASE_RESEARCH.md +53 -0
  12. claude_mpm/agents/MEMORY.md +3 -0
  13. claude_mpm/agents/OUTPUT_STYLE.md +335 -0
  14. claude_mpm/agents/PM_INSTRUCTIONS.md +1159 -0
  15. claude_mpm/agents/WORKFLOW.md +355 -187
  16. claude_mpm/agents/agent_loader.py +40 -10
  17. claude_mpm/agents/agent_loader_integration.py +3 -2
  18. claude_mpm/agents/agents_metadata.py +57 -0
  19. claude_mpm/agents/async_agent_loader.py +3 -3
  20. claude_mpm/agents/base_agent_loader.py +11 -9
  21. claude_mpm/agents/frontmatter_validator.py +291 -251
  22. claude_mpm/agents/system_agent_config.py +3 -2
  23. claude_mpm/agents/templates/.claude-mpm/memories/README.md +17 -0
  24. claude_mpm/agents/templates/.claude-mpm/memories/engineer_memories.md +3 -0
  25. claude_mpm/agents/templates/README.md +465 -0
  26. claude_mpm/agents/templates/agent-manager.json +267 -18
  27. claude_mpm/agents/templates/agentic-coder-optimizer.json +248 -0
  28. claude_mpm/agents/templates/api_qa.json +16 -4
  29. claude_mpm/agents/templates/circuit_breakers.md +638 -0
  30. claude_mpm/agents/templates/clerk-ops.json +235 -0
  31. claude_mpm/agents/templates/code_analyzer.json +25 -9
  32. claude_mpm/agents/templates/content-agent.json +358 -0
  33. claude_mpm/agents/templates/dart_engineer.json +307 -0
  34. claude_mpm/agents/templates/data_engineer.json +87 -14
  35. claude_mpm/agents/templates/documentation.json +76 -13
  36. claude_mpm/agents/templates/engineer.json +44 -10
  37. claude_mpm/agents/templates/gcp_ops_agent.json +253 -0
  38. claude_mpm/agents/templates/git_file_tracking.md +584 -0
  39. claude_mpm/agents/templates/golang_engineer.json +270 -0
  40. claude_mpm/agents/templates/imagemagick.json +5 -2
  41. claude_mpm/agents/templates/java_engineer.json +346 -0
  42. claude_mpm/agents/templates/javascript_engineer_agent.json +380 -0
  43. claude_mpm/agents/templates/local_ops_agent.json +1840 -0
  44. claude_mpm/agents/templates/logs/prompts/agent_engineer_20250826_014258_728.md +39 -0
  45. claude_mpm/agents/templates/logs/prompts/agent_engineer_20250901_010124_142.md +400 -0
  46. claude_mpm/agents/templates/memory_manager.json +6 -3
  47. claude_mpm/agents/templates/nextjs_engineer.json +285 -0
  48. claude_mpm/agents/templates/ops.json +27 -8
  49. claude_mpm/agents/templates/php-engineer.json +287 -0
  50. claude_mpm/agents/templates/pm_examples.md +474 -0
  51. claude_mpm/agents/templates/pm_red_flags.md +262 -0
  52. claude_mpm/agents/templates/product_owner.json +338 -0
  53. claude_mpm/agents/templates/project_organizer.json +19 -5
  54. claude_mpm/agents/templates/prompt-engineer.json +737 -0
  55. claude_mpm/agents/templates/python_engineer.json +387 -0
  56. claude_mpm/agents/templates/qa.json +26 -6
  57. claude_mpm/agents/templates/react_engineer.json +239 -0
  58. claude_mpm/agents/templates/refactoring_engineer.json +15 -5
  59. claude_mpm/agents/templates/research.json +47 -22
  60. claude_mpm/agents/templates/response_format.md +583 -0
  61. claude_mpm/agents/templates/ruby-engineer.json +280 -0
  62. claude_mpm/agents/templates/rust_engineer.json +275 -0
  63. claude_mpm/agents/templates/security.json +59 -10
  64. claude_mpm/agents/templates/svelte-engineer.json +225 -0
  65. claude_mpm/agents/templates/tauri_engineer.json +274 -0
  66. claude_mpm/agents/templates/ticketing.json +16 -7
  67. claude_mpm/agents/templates/typescript_engineer.json +285 -0
  68. claude_mpm/agents/templates/validation_templates.md +312 -0
  69. claude_mpm/agents/templates/vercel_ops_agent.json +164 -33
  70. claude_mpm/agents/templates/version_control.json +16 -4
  71. claude_mpm/agents/templates/web_qa.json +243 -21
  72. claude_mpm/agents/templates/web_ui.json +18 -5
  73. claude_mpm/cli/__init__.py +38 -363
  74. claude_mpm/cli/commands/__init__.py +8 -0
  75. claude_mpm/cli/commands/agent_manager.py +675 -20
  76. claude_mpm/cli/commands/agent_state_manager.py +186 -0
  77. claude_mpm/cli/commands/agents.py +722 -150
  78. claude_mpm/cli/commands/agents_detect.py +380 -0
  79. claude_mpm/cli/commands/agents_recommend.py +309 -0
  80. claude_mpm/cli/commands/aggregate.py +10 -6
  81. claude_mpm/cli/commands/analyze.py +553 -0
  82. claude_mpm/cli/commands/analyze_code.py +528 -0
  83. claude_mpm/cli/commands/auto_configure.py +570 -0
  84. claude_mpm/cli/commands/cleanup.py +12 -12
  85. claude_mpm/cli/commands/config.py +47 -13
  86. claude_mpm/cli/commands/configure.py +488 -884
  87. claude_mpm/cli/commands/configure_agent_display.py +261 -0
  88. claude_mpm/cli/commands/configure_behavior_manager.py +204 -0
  89. claude_mpm/cli/commands/configure_hook_manager.py +225 -0
  90. claude_mpm/cli/commands/configure_models.py +18 -0
  91. claude_mpm/cli/commands/configure_navigation.py +167 -0
  92. claude_mpm/cli/commands/configure_paths.py +104 -0
  93. claude_mpm/cli/commands/configure_persistence.py +254 -0
  94. claude_mpm/cli/commands/configure_startup_manager.py +646 -0
  95. claude_mpm/cli/commands/configure_template_editor.py +497 -0
  96. claude_mpm/cli/commands/configure_validators.py +73 -0
  97. claude_mpm/cli/commands/dashboard.py +286 -0
  98. claude_mpm/cli/commands/debug.py +1386 -0
  99. claude_mpm/cli/commands/doctor.py +43 -7
  100. claude_mpm/cli/commands/info.py +3 -4
  101. claude_mpm/cli/commands/local_deploy.py +537 -0
  102. claude_mpm/cli/commands/mcp.py +17 -10
  103. claude_mpm/cli/commands/mcp_command_router.py +11 -0
  104. claude_mpm/cli/commands/mcp_config.py +154 -0
  105. claude_mpm/cli/commands/mcp_external_commands.py +249 -0
  106. claude_mpm/cli/commands/mcp_install_commands.py +101 -32
  107. claude_mpm/cli/commands/mcp_pipx_config.py +2 -2
  108. claude_mpm/cli/commands/mcp_setup_external.py +868 -0
  109. claude_mpm/cli/commands/memory.py +55 -21
  110. claude_mpm/cli/commands/monitor.py +168 -617
  111. claude_mpm/cli/commands/mpm_init/__init__.py +73 -0
  112. claude_mpm/cli/commands/mpm_init/core.py +525 -0
  113. claude_mpm/cli/commands/mpm_init/display.py +341 -0
  114. claude_mpm/cli/commands/mpm_init/git_activity.py +427 -0
  115. claude_mpm/cli/commands/mpm_init/modes.py +397 -0
  116. claude_mpm/cli/commands/mpm_init/prompts.py +442 -0
  117. claude_mpm/cli/commands/mpm_init_cli.py +396 -0
  118. claude_mpm/cli/commands/mpm_init_handler.py +195 -0
  119. claude_mpm/cli/commands/run.py +169 -42
  120. claude_mpm/cli/commands/search.py +458 -0
  121. claude_mpm/cli/commands/skills.py +488 -0
  122. claude_mpm/cli/commands/uninstall.py +176 -0
  123. claude_mpm/cli/commands/upgrade.py +152 -0
  124. claude_mpm/cli/commands/verify.py +119 -0
  125. claude_mpm/cli/executor.py +204 -0
  126. claude_mpm/cli/helpers.py +105 -0
  127. claude_mpm/cli/interactive/__init__.py +21 -0
  128. claude_mpm/cli/interactive/agent_wizard.py +962 -0
  129. claude_mpm/cli/interactive/skills_wizard.py +491 -0
  130. claude_mpm/cli/parser.py +79 -2
  131. claude_mpm/cli/parsers/__init__.py +7 -1
  132. claude_mpm/cli/parsers/agent_manager_parser.py +161 -1
  133. claude_mpm/cli/parsers/agents_parser.py +116 -0
  134. claude_mpm/cli/parsers/analyze_code_parser.py +170 -0
  135. claude_mpm/cli/parsers/analyze_parser.py +135 -0
  136. claude_mpm/cli/parsers/auto_configure_parser.py +245 -0
  137. claude_mpm/cli/parsers/base_parser.py +187 -3
  138. claude_mpm/cli/parsers/configure_parser.py +34 -15
  139. claude_mpm/cli/parsers/dashboard_parser.py +113 -0
  140. claude_mpm/cli/parsers/debug_parser.py +319 -0
  141. claude_mpm/cli/parsers/local_deploy_parser.py +227 -0
  142. claude_mpm/cli/parsers/mcp_parser.py +15 -0
  143. claude_mpm/cli/parsers/monitor_parser.py +12 -2
  144. claude_mpm/cli/parsers/mpm_init_parser.py +311 -0
  145. claude_mpm/cli/parsers/run_parser.py +5 -0
  146. claude_mpm/cli/parsers/search_parser.py +245 -0
  147. claude_mpm/cli/parsers/skills_parser.py +137 -0
  148. claude_mpm/cli/shared/argument_patterns.py +20 -13
  149. claude_mpm/cli/shared/base_command.py +2 -2
  150. claude_mpm/cli/shared/output_formatters.py +28 -19
  151. claude_mpm/cli/startup.py +562 -0
  152. claude_mpm/cli/startup_logging.py +179 -13
  153. claude_mpm/cli/utils.py +53 -2
  154. claude_mpm/commands/__init__.py +14 -0
  155. claude_mpm/commands/mpm-agents-detect.md +168 -0
  156. claude_mpm/commands/mpm-agents-recommend.md +214 -0
  157. claude_mpm/commands/mpm-agents.md +122 -0
  158. claude_mpm/commands/mpm-auto-configure.md +269 -0
  159. claude_mpm/commands/mpm-config.md +141 -0
  160. claude_mpm/commands/mpm-doctor.md +24 -0
  161. claude_mpm/commands/mpm-help.md +290 -0
  162. claude_mpm/commands/mpm-init.md +521 -0
  163. claude_mpm/commands/mpm-monitor.md +409 -0
  164. claude_mpm/commands/mpm-organize.md +295 -0
  165. claude_mpm/commands/mpm-resume.md +372 -0
  166. claude_mpm/commands/mpm-status.md +75 -0
  167. claude_mpm/commands/mpm-tickets.md +151 -0
  168. claude_mpm/commands/mpm-version.md +113 -0
  169. claude_mpm/commands/mpm.md +21 -0
  170. claude_mpm/config/agent_config.py +4 -4
  171. claude_mpm/config/experimental_features.py +7 -7
  172. claude_mpm/config/model_config.py +428 -0
  173. claude_mpm/config/paths.py +3 -2
  174. claude_mpm/config/socketio_config.py +36 -7
  175. claude_mpm/constants.py +27 -1
  176. claude_mpm/core/__init__.py +53 -17
  177. claude_mpm/core/agent_name_normalizer.py +3 -2
  178. claude_mpm/core/agent_registry.py +2 -2
  179. claude_mpm/core/agent_session_manager.py +10 -10
  180. claude_mpm/core/api_validator.py +330 -0
  181. claude_mpm/core/base_service.py +33 -23
  182. claude_mpm/core/cache.py +9 -9
  183. claude_mpm/core/claude_runner.py +19 -8
  184. claude_mpm/core/config.py +103 -8
  185. claude_mpm/core/config_aliases.py +7 -6
  186. claude_mpm/core/constants.py +65 -0
  187. claude_mpm/core/container.py +11 -5
  188. claude_mpm/core/enums.py +452 -0
  189. claude_mpm/core/error_handler.py +623 -0
  190. claude_mpm/core/factories.py +1 -1
  191. claude_mpm/core/file_utils.py +764 -0
  192. claude_mpm/core/framework/__init__.py +38 -0
  193. claude_mpm/core/framework/formatters/__init__.py +11 -0
  194. claude_mpm/core/framework/formatters/capability_generator.py +367 -0
  195. claude_mpm/core/framework/formatters/content_formatter.py +288 -0
  196. claude_mpm/core/framework/formatters/context_generator.py +185 -0
  197. claude_mpm/core/framework/loaders/__init__.py +13 -0
  198. claude_mpm/core/framework/loaders/agent_loader.py +210 -0
  199. claude_mpm/core/framework/loaders/file_loader.py +223 -0
  200. claude_mpm/core/framework/loaders/instruction_loader.py +161 -0
  201. claude_mpm/core/framework/loaders/packaged_loader.py +232 -0
  202. claude_mpm/core/framework/processors/__init__.py +11 -0
  203. claude_mpm/core/framework/processors/memory_processor.py +230 -0
  204. claude_mpm/core/framework/processors/metadata_processor.py +146 -0
  205. claude_mpm/core/framework/processors/template_processor.py +244 -0
  206. claude_mpm/core/framework_loader.py +323 -1491
  207. claude_mpm/core/hook_manager.py +8 -6
  208. claude_mpm/core/injectable_service.py +11 -8
  209. claude_mpm/core/instruction_reinforcement_hook.py +267 -0
  210. claude_mpm/core/interactive_session.py +55 -8
  211. claude_mpm/core/interfaces.py +56 -1
  212. claude_mpm/core/lazy.py +3 -3
  213. claude_mpm/core/log_manager.py +100 -28
  214. claude_mpm/core/logger.py +19 -14
  215. claude_mpm/core/logging_config.py +6 -2
  216. claude_mpm/core/logging_utils.py +520 -0
  217. claude_mpm/core/oneshot_session.py +51 -7
  218. claude_mpm/core/optimized_agent_loader.py +9 -9
  219. claude_mpm/core/optimized_startup.py +1 -1
  220. claude_mpm/core/output_style_manager.py +12 -192
  221. claude_mpm/core/pm_hook_interceptor.py +118 -15
  222. claude_mpm/core/service_registry.py +7 -3
  223. claude_mpm/core/session_manager.py +14 -12
  224. claude_mpm/core/shared/config_loader.py +1 -1
  225. claude_mpm/core/socketio_pool.py +15 -15
  226. claude_mpm/core/tool_access_control.py +3 -2
  227. claude_mpm/core/types.py +4 -11
  228. claude_mpm/core/typing_utils.py +7 -6
  229. claude_mpm/core/unified_agent_registry.py +116 -12
  230. claude_mpm/core/unified_config.py +6 -6
  231. claude_mpm/core/unified_paths.py +23 -20
  232. claude_mpm/dashboard/.claude-mpm/socketio-instances.json +1 -0
  233. claude_mpm/dashboard/__init__.py +12 -0
  234. claude_mpm/dashboard/analysis_runner.py +455 -0
  235. claude_mpm/dashboard/api/simple_directory.py +261 -0
  236. claude_mpm/dashboard/react/components/DataInspector/DataInspector.module.css +188 -0
  237. claude_mpm/dashboard/react/components/EventViewer/EventViewer.module.css +156 -0
  238. claude_mpm/dashboard/react/components/shared/ConnectionStatus.module.css +38 -0
  239. claude_mpm/dashboard/react/components/shared/FilterBar.module.css +92 -0
  240. claude_mpm/dashboard/static/archive/activity_dashboard_fixed.html +248 -0
  241. claude_mpm/dashboard/static/archive/activity_dashboard_test.html +61 -0
  242. claude_mpm/dashboard/static/archive/test_activity_connection.html +179 -0
  243. claude_mpm/dashboard/static/archive/test_claude_tree_tab.html +68 -0
  244. claude_mpm/dashboard/static/archive/test_dashboard.html +409 -0
  245. claude_mpm/dashboard/static/archive/test_dashboard_fixed.html +519 -0
  246. claude_mpm/dashboard/static/archive/test_dashboard_verification.html +181 -0
  247. claude_mpm/dashboard/static/archive/test_file_data.html +315 -0
  248. claude_mpm/dashboard/static/archive/test_file_tree_empty_state.html +243 -0
  249. claude_mpm/dashboard/static/archive/test_file_tree_fix.html +234 -0
  250. claude_mpm/dashboard/static/archive/test_file_tree_rename.html +117 -0
  251. claude_mpm/dashboard/static/archive/test_file_tree_tab.html +115 -0
  252. claude_mpm/dashboard/static/archive/test_file_viewer.html +224 -0
  253. claude_mpm/dashboard/static/archive/test_final_activity.html +220 -0
  254. claude_mpm/dashboard/static/archive/test_tab_fix.html +139 -0
  255. claude_mpm/dashboard/static/built/assets/events.DjpNxWNo.css +1 -0
  256. claude_mpm/dashboard/static/built/components/activity-tree.js +2 -0
  257. claude_mpm/dashboard/static/built/components/agent-hierarchy.js +777 -0
  258. claude_mpm/dashboard/static/built/components/agent-inference.js +1 -1
  259. claude_mpm/dashboard/static/built/components/build-tracker.js +333 -0
  260. claude_mpm/dashboard/static/built/components/code-simple.js +857 -0
  261. claude_mpm/dashboard/static/built/components/code-tree/tree-breadcrumb.js +353 -0
  262. claude_mpm/dashboard/static/built/components/code-tree/tree-constants.js +235 -0
  263. claude_mpm/dashboard/static/built/components/code-tree/tree-search.js +409 -0
  264. claude_mpm/dashboard/static/built/components/code-tree/tree-utils.js +435 -0
  265. claude_mpm/dashboard/static/built/components/code-tree.js +2 -0
  266. claude_mpm/dashboard/static/built/components/code-viewer.js +2 -0
  267. claude_mpm/dashboard/static/built/components/connection-debug.js +654 -0
  268. claude_mpm/dashboard/static/built/components/diff-viewer.js +891 -0
  269. claude_mpm/dashboard/static/built/components/event-processor.js +1 -1
  270. claude_mpm/dashboard/static/built/components/event-viewer.js +1 -1
  271. claude_mpm/dashboard/static/built/components/export-manager.js +1 -1
  272. claude_mpm/dashboard/static/built/components/file-change-tracker.js +443 -0
  273. claude_mpm/dashboard/static/built/components/file-change-viewer.js +690 -0
  274. claude_mpm/dashboard/static/built/components/file-tool-tracker.js +1 -1
  275. claude_mpm/dashboard/static/built/components/file-viewer.js +2 -0
  276. claude_mpm/dashboard/static/built/components/module-viewer.js +1 -1
  277. claude_mpm/dashboard/static/built/components/nav-bar.js +145 -0
  278. claude_mpm/dashboard/static/built/components/page-structure.js +429 -0
  279. claude_mpm/dashboard/static/built/components/session-manager.js +1 -1
  280. claude_mpm/dashboard/static/built/components/unified-data-viewer.js +2 -0
  281. claude_mpm/dashboard/static/built/components/working-directory.js +1 -1
  282. claude_mpm/dashboard/static/built/connection-manager.js +536 -0
  283. claude_mpm/dashboard/static/built/dashboard.js +1 -1
  284. claude_mpm/dashboard/static/built/extension-error-handler.js +164 -0
  285. claude_mpm/dashboard/static/built/react/events.js +30 -0
  286. claude_mpm/dashboard/static/built/shared/dom-helpers.js +396 -0
  287. claude_mpm/dashboard/static/built/shared/event-bus.js +330 -0
  288. claude_mpm/dashboard/static/built/shared/event-filter-service.js +540 -0
  289. claude_mpm/dashboard/static/built/shared/logger.js +385 -0
  290. claude_mpm/dashboard/static/built/shared/page-structure.js +249 -0
  291. claude_mpm/dashboard/static/built/shared/tooltip-service.js +253 -0
  292. claude_mpm/dashboard/static/built/socket-client.js +1 -1
  293. claude_mpm/dashboard/static/built/tab-isolation-fix.js +185 -0
  294. claude_mpm/dashboard/static/css/activity.css +1958 -0
  295. claude_mpm/dashboard/static/css/dashboard.css +1413 -72
  296. claude_mpm/dashboard/static/dist/assets/events.DjpNxWNo.css +1 -0
  297. claude_mpm/dashboard/static/dist/components/activity-tree.js +2 -0
  298. claude_mpm/dashboard/static/dist/components/agent-inference.js +1 -1
  299. claude_mpm/dashboard/static/dist/components/code-tree.js +2 -0
  300. claude_mpm/dashboard/static/dist/components/code-viewer.js +2 -0
  301. claude_mpm/dashboard/static/dist/components/event-processor.js +1 -1
  302. claude_mpm/dashboard/static/dist/components/event-viewer.js +1 -1
  303. claude_mpm/dashboard/static/dist/components/export-manager.js +1 -1
  304. claude_mpm/dashboard/static/dist/components/file-tool-tracker.js +1 -1
  305. claude_mpm/dashboard/static/dist/components/file-viewer.js +2 -0
  306. claude_mpm/dashboard/static/dist/components/module-viewer.js +1 -1
  307. claude_mpm/dashboard/static/dist/components/session-manager.js +1 -1
  308. claude_mpm/dashboard/static/dist/components/unified-data-viewer.js +2 -0
  309. claude_mpm/dashboard/static/dist/components/working-directory.js +1 -1
  310. claude_mpm/dashboard/static/dist/dashboard.js +1 -1
  311. claude_mpm/dashboard/static/dist/react/events.js +30 -0
  312. claude_mpm/dashboard/static/dist/socket-client.js +1 -1
  313. claude_mpm/dashboard/static/events.html +607 -0
  314. claude_mpm/dashboard/static/index.html +635 -0
  315. claude_mpm/dashboard/static/js/components/activity-tree.js +1871 -0
  316. claude_mpm/dashboard/static/js/components/agent-hierarchy.js +4 -1
  317. claude_mpm/dashboard/static/js/components/agent-inference.js +3 -0
  318. claude_mpm/dashboard/static/js/components/build-tracker.js +23 -13
  319. claude_mpm/dashboard/static/js/components/code-simple.js +857 -0
  320. claude_mpm/dashboard/static/js/components/diff-viewer.js +891 -0
  321. claude_mpm/dashboard/static/js/components/event-processor.js +3 -107
  322. claude_mpm/dashboard/static/js/components/event-viewer.js +98 -11
  323. claude_mpm/dashboard/static/js/components/export-manager.js +3 -0
  324. claude_mpm/dashboard/static/js/components/file-change-tracker.js +443 -0
  325. claude_mpm/dashboard/static/js/components/file-change-viewer.js +690 -0
  326. claude_mpm/dashboard/static/js/components/file-tool-tracker.js +30 -10
  327. claude_mpm/dashboard/static/js/components/file-viewer.js +580 -0
  328. claude_mpm/dashboard/static/js/components/module-viewer.js +68 -205
  329. claude_mpm/dashboard/static/js/components/session-manager.js +46 -10
  330. claude_mpm/dashboard/static/js/components/socket-manager.js +16 -0
  331. claude_mpm/dashboard/static/js/components/ui-state-manager.js +359 -40
  332. claude_mpm/dashboard/static/js/components/unified-data-viewer.js +1824 -0
  333. claude_mpm/dashboard/static/js/components/working-directory.js +61 -10
  334. claude_mpm/dashboard/static/js/connection-manager.js +1 -1
  335. claude_mpm/dashboard/static/js/dashboard.js +523 -622
  336. claude_mpm/dashboard/static/js/shared/dom-helpers.js +396 -0
  337. claude_mpm/dashboard/static/js/shared/event-bus.js +330 -0
  338. claude_mpm/dashboard/static/js/shared/logger.js +385 -0
  339. claude_mpm/dashboard/static/js/shared/tooltip-service.js +253 -0
  340. claude_mpm/dashboard/static/js/socket-client.js +549 -62
  341. claude_mpm/dashboard/static/js/stores/dashboard-store.js +562 -0
  342. claude_mpm/dashboard/static/js/tab-isolation-fix.js +185 -0
  343. claude_mpm/dashboard/static/legacy/activity.html +736 -0
  344. claude_mpm/dashboard/static/legacy/agents.html +786 -0
  345. claude_mpm/dashboard/static/legacy/files.html +747 -0
  346. claude_mpm/dashboard/static/legacy/tools.html +831 -0
  347. claude_mpm/dashboard/static/monitors.html +431 -0
  348. claude_mpm/dashboard/static/production/events.html +659 -0
  349. claude_mpm/dashboard/static/production/main.html +698 -0
  350. claude_mpm/dashboard/static/production/monitors.html +483 -0
  351. claude_mpm/dashboard/static/socket.io.min.js +7 -0
  352. claude_mpm/dashboard/static/socket.io.v4.8.1.backup.js +7 -0
  353. claude_mpm/dashboard/static/test-archive/dashboard.html +635 -0
  354. claude_mpm/dashboard/static/test-archive/debug-events.html +147 -0
  355. claude_mpm/dashboard/static/test-archive/test-navigation.html +256 -0
  356. claude_mpm/dashboard/static/test-archive/test-react-exports.html +180 -0
  357. claude_mpm/dashboard/static/test-archive/test_debug.html +25 -0
  358. claude_mpm/dashboard/templates/code_simple.html +153 -0
  359. claude_mpm/dashboard/templates/index.html +267 -9
  360. claude_mpm/experimental/__init__.py +10 -0
  361. claude_mpm/experimental/cli_enhancements.py +4 -2
  362. claude_mpm/generators/agent_profile_generator.py +5 -3
  363. claude_mpm/hooks/__init__.py +37 -1
  364. claude_mpm/hooks/base_hook.py +5 -4
  365. claude_mpm/hooks/claude_hooks/connection_pool.py +4 -4
  366. claude_mpm/hooks/claude_hooks/event_handlers.py +21 -18
  367. claude_mpm/hooks/claude_hooks/hook_handler.py +209 -25
  368. claude_mpm/hooks/claude_hooks/installer.py +783 -0
  369. claude_mpm/hooks/claude_hooks/memory_integration.py +3 -3
  370. claude_mpm/hooks/claude_hooks/response_tracking.py +57 -17
  371. claude_mpm/hooks/claude_hooks/services/connection_manager.py +64 -49
  372. claude_mpm/hooks/claude_hooks/services/connection_manager_http.py +140 -76
  373. claude_mpm/hooks/claude_hooks/services/state_manager.py +11 -9
  374. claude_mpm/hooks/claude_hooks/services/subagent_processor.py +3 -3
  375. claude_mpm/hooks/failure_learning/__init__.py +60 -0
  376. claude_mpm/hooks/failure_learning/failure_detection_hook.py +235 -0
  377. claude_mpm/hooks/failure_learning/fix_detection_hook.py +217 -0
  378. claude_mpm/hooks/failure_learning/learning_extraction_hook.py +286 -0
  379. claude_mpm/hooks/instruction_reinforcement.py +301 -0
  380. claude_mpm/hooks/kuzu_enrichment_hook.py +263 -0
  381. claude_mpm/hooks/kuzu_memory_hook.py +386 -0
  382. claude_mpm/hooks/kuzu_response_hook.py +183 -0
  383. claude_mpm/hooks/memory_integration_hook.py +1 -1
  384. claude_mpm/hooks/session_resume_hook.py +121 -0
  385. claude_mpm/hooks/templates/pre_tool_use_simple.py +78 -0
  386. claude_mpm/hooks/templates/pre_tool_use_template.py +323 -0
  387. claude_mpm/hooks/tool_call_interceptor.py +8 -5
  388. claude_mpm/hooks/validation_hooks.py +3 -3
  389. claude_mpm/init.py +23 -4
  390. claude_mpm/models/agent_session.py +8 -6
  391. claude_mpm/models/resume_log.py +340 -0
  392. claude_mpm/schemas/__init__.py +12 -0
  393. claude_mpm/scripts/claude-hook-handler.sh +187 -0
  394. claude_mpm/scripts/launch_monitor.py +85 -0
  395. claude_mpm/scripts/mcp_server.py +3 -5
  396. claude_mpm/scripts/mpm_doctor.py +3 -2
  397. claude_mpm/scripts/socketio_daemon.py +156 -396
  398. claude_mpm/services/__init__.py +144 -160
  399. claude_mpm/services/agents/__init__.py +18 -5
  400. claude_mpm/services/agents/agent_builder.py +13 -11
  401. claude_mpm/services/agents/auto_config_manager.py +796 -0
  402. claude_mpm/services/agents/deployment/agent_config_provider.py +127 -27
  403. claude_mpm/services/agents/deployment/agent_configuration_manager.py +1 -1
  404. claude_mpm/services/agents/deployment/agent_deployment.py +38 -15
  405. claude_mpm/services/agents/deployment/agent_discovery_service.py +125 -7
  406. claude_mpm/services/agents/deployment/agent_filesystem_manager.py +5 -5
  407. claude_mpm/services/agents/deployment/agent_format_converter.py +56 -12
  408. claude_mpm/services/agents/deployment/agent_lifecycle_manager.py +4 -2
  409. claude_mpm/services/agents/deployment/agent_operation_service.py +2 -2
  410. claude_mpm/services/agents/deployment/agent_record_service.py +5 -6
  411. claude_mpm/services/agents/deployment/agent_state_service.py +2 -2
  412. claude_mpm/services/agents/deployment/agent_template_builder.py +722 -37
  413. claude_mpm/services/agents/deployment/agent_validator.py +31 -7
  414. claude_mpm/services/agents/deployment/agent_version_manager.py +9 -1
  415. claude_mpm/services/agents/deployment/agent_versioning.py +1 -1
  416. claude_mpm/services/agents/deployment/async_agent_deployment.py +1 -1
  417. claude_mpm/services/agents/deployment/deployment_config_loader.py +131 -7
  418. claude_mpm/services/agents/deployment/deployment_type_detector.py +10 -14
  419. claude_mpm/services/agents/deployment/deployment_wrapper.py +58 -0
  420. claude_mpm/services/agents/deployment/interface_adapter.py +3 -2
  421. claude_mpm/services/agents/deployment/local_template_deployment.py +360 -0
  422. claude_mpm/services/agents/deployment/multi_source_deployment_service.py +134 -38
  423. claude_mpm/services/agents/deployment/pipeline/steps/agent_processing_step.py +8 -7
  424. claude_mpm/services/agents/deployment/pipeline/steps/base_step.py +7 -16
  425. claude_mpm/services/agents/deployment/pipeline/steps/configuration_step.py +4 -3
  426. claude_mpm/services/agents/deployment/pipeline/steps/target_directory_step.py +7 -5
  427. claude_mpm/services/agents/deployment/pipeline/steps/validation_step.py +6 -5
  428. claude_mpm/services/agents/deployment/refactored_agent_deployment_service.py +9 -6
  429. claude_mpm/services/agents/deployment/system_instructions_deployer.py +9 -6
  430. claude_mpm/services/agents/deployment/validation/__init__.py +3 -1
  431. claude_mpm/services/agents/deployment/validation/template_validator.py +64 -44
  432. claude_mpm/services/agents/deployment/validation/validation_result.py +1 -9
  433. claude_mpm/services/agents/loading/agent_profile_loader.py +10 -9
  434. claude_mpm/services/agents/loading/base_agent_manager.py +16 -6
  435. claude_mpm/services/agents/loading/framework_agent_loader.py +2 -2
  436. claude_mpm/services/agents/local_template_manager.py +744 -0
  437. claude_mpm/services/agents/management/agent_capabilities_generator.py +3 -2
  438. claude_mpm/services/agents/management/agent_management_service.py +5 -5
  439. claude_mpm/services/agents/memory/agent_memory_manager.py +32 -29
  440. claude_mpm/services/agents/memory/content_manager.py +17 -9
  441. claude_mpm/services/agents/memory/memory_categorization_service.py +4 -2
  442. claude_mpm/services/agents/memory/memory_file_service.py +32 -6
  443. claude_mpm/services/agents/memory/memory_format_service.py +7 -7
  444. claude_mpm/services/agents/memory/memory_limits_service.py +4 -2
  445. claude_mpm/services/agents/memory/template_generator.py +3 -3
  446. claude_mpm/services/agents/observers.py +547 -0
  447. claude_mpm/services/agents/recommender.py +615 -0
  448. claude_mpm/services/agents/registry/deployed_agent_discovery.py +3 -3
  449. claude_mpm/services/agents/registry/modification_tracker.py +30 -19
  450. claude_mpm/services/async_session_logger.py +141 -98
  451. claude_mpm/services/claude_session_logger.py +82 -74
  452. claude_mpm/services/cli/agent_cleanup_service.py +6 -5
  453. claude_mpm/services/cli/agent_dependency_service.py +1 -1
  454. claude_mpm/services/cli/agent_listing_service.py +5 -5
  455. claude_mpm/services/cli/agent_validation_service.py +6 -5
  456. claude_mpm/services/cli/memory_crud_service.py +12 -7
  457. claude_mpm/services/cli/memory_output_formatter.py +2 -2
  458. claude_mpm/services/cli/resume_service.py +617 -0
  459. claude_mpm/services/cli/session_manager.py +104 -13
  460. claude_mpm/services/cli/session_pause_manager.py +504 -0
  461. claude_mpm/services/cli/session_resume_helper.py +372 -0
  462. claude_mpm/services/cli/startup_checker.py +13 -21
  463. claude_mpm/services/cli/unified_dashboard_manager.py +439 -0
  464. claude_mpm/services/command_deployment_service.py +17 -9
  465. claude_mpm/services/command_handler_service.py +11 -5
  466. claude_mpm/services/core/__init__.py +33 -1
  467. claude_mpm/services/core/base.py +26 -11
  468. claude_mpm/services/core/cache_manager.py +1 -3
  469. claude_mpm/services/core/interfaces/__init__.py +90 -3
  470. claude_mpm/services/core/interfaces/agent.py +184 -0
  471. claude_mpm/services/core/interfaces/health.py +172 -0
  472. claude_mpm/services/core/interfaces/model.py +281 -0
  473. claude_mpm/services/core/interfaces/process.py +372 -0
  474. claude_mpm/services/core/interfaces/project.py +121 -0
  475. claude_mpm/services/core/interfaces/restart.py +307 -0
  476. claude_mpm/services/core/interfaces/stability.py +260 -0
  477. claude_mpm/services/core/interfaces.py +56 -1
  478. claude_mpm/services/core/memory_manager.py +92 -47
  479. claude_mpm/services/core/models/__init__.py +79 -0
  480. claude_mpm/services/core/models/agent_config.py +384 -0
  481. claude_mpm/services/core/models/health.py +162 -0
  482. claude_mpm/services/core/models/process.py +239 -0
  483. claude_mpm/services/core/models/restart.py +302 -0
  484. claude_mpm/services/core/models/stability.py +264 -0
  485. claude_mpm/services/core/models/toolchain.py +306 -0
  486. claude_mpm/services/core/path_resolver.py +37 -18
  487. claude_mpm/services/core/service_container.py +2 -2
  488. claude_mpm/services/diagnostics/__init__.py +2 -2
  489. claude_mpm/services/diagnostics/checks/__init__.py +4 -2
  490. claude_mpm/services/diagnostics/checks/agent_check.py +30 -32
  491. claude_mpm/services/diagnostics/checks/claude_code_check.py +270 -0
  492. claude_mpm/services/diagnostics/checks/common_issues_check.py +28 -27
  493. claude_mpm/services/diagnostics/checks/configuration_check.py +26 -25
  494. claude_mpm/services/diagnostics/checks/filesystem_check.py +18 -17
  495. claude_mpm/services/diagnostics/checks/installation_check.py +165 -60
  496. claude_mpm/services/diagnostics/checks/instructions_check.py +22 -24
  497. claude_mpm/services/diagnostics/checks/mcp_check.py +57 -43
  498. claude_mpm/services/diagnostics/checks/mcp_services_check.py +1066 -0
  499. claude_mpm/services/diagnostics/checks/monitor_check.py +24 -23
  500. claude_mpm/services/diagnostics/checks/startup_log_check.py +14 -11
  501. claude_mpm/services/diagnostics/diagnostic_runner.py +22 -13
  502. claude_mpm/services/diagnostics/doctor_reporter.py +275 -47
  503. claude_mpm/services/diagnostics/models.py +37 -21
  504. claude_mpm/services/event_aggregator.py +5 -3
  505. claude_mpm/services/event_bus/direct_relay.py +152 -13
  506. claude_mpm/services/event_bus/event_bus.py +51 -9
  507. claude_mpm/services/event_bus/relay.py +33 -14
  508. claude_mpm/services/events/consumers/dead_letter.py +7 -5
  509. claude_mpm/services/events/core.py +5 -6
  510. claude_mpm/services/events/producers/hook.py +6 -6
  511. claude_mpm/services/events/producers/system.py +8 -8
  512. claude_mpm/services/exceptions.py +5 -5
  513. claude_mpm/services/framework_claude_md_generator/__init__.py +1 -1
  514. claude_mpm/services/framework_claude_md_generator/content_assembler.py +5 -5
  515. claude_mpm/services/framework_claude_md_generator/content_validator.py +2 -2
  516. claude_mpm/services/framework_claude_md_generator/deployment_manager.py +3 -3
  517. claude_mpm/services/framework_claude_md_generator/section_generators/__init__.py +2 -2
  518. claude_mpm/services/framework_claude_md_generator/version_manager.py +1 -1
  519. claude_mpm/services/hook_installer_service.py +506 -0
  520. claude_mpm/services/hook_service.py +5 -6
  521. claude_mpm/services/infrastructure/context_preservation.py +13 -11
  522. claude_mpm/services/infrastructure/daemon_manager.py +9 -9
  523. claude_mpm/services/infrastructure/logging.py +2 -2
  524. claude_mpm/services/infrastructure/monitoring/__init__.py +12 -12
  525. claude_mpm/services/infrastructure/monitoring/aggregator.py +12 -12
  526. claude_mpm/services/infrastructure/monitoring/base.py +5 -13
  527. claude_mpm/services/infrastructure/monitoring/network.py +7 -6
  528. claude_mpm/services/infrastructure/monitoring/process.py +13 -12
  529. claude_mpm/services/infrastructure/monitoring/resources.py +8 -7
  530. claude_mpm/services/infrastructure/monitoring/service.py +16 -15
  531. claude_mpm/services/infrastructure/monitoring.py +12 -12
  532. claude_mpm/services/infrastructure/resume_log_generator.py +439 -0
  533. claude_mpm/services/local_ops/__init__.py +165 -0
  534. claude_mpm/services/local_ops/crash_detector.py +257 -0
  535. claude_mpm/services/local_ops/health_checks/__init__.py +28 -0
  536. claude_mpm/services/local_ops/health_checks/http_check.py +224 -0
  537. claude_mpm/services/local_ops/health_checks/process_check.py +236 -0
  538. claude_mpm/services/local_ops/health_checks/resource_check.py +255 -0
  539. claude_mpm/services/local_ops/health_manager.py +430 -0
  540. claude_mpm/services/local_ops/log_monitor.py +396 -0
  541. claude_mpm/services/local_ops/memory_leak_detector.py +294 -0
  542. claude_mpm/services/local_ops/process_manager.py +595 -0
  543. claude_mpm/services/local_ops/resource_monitor.py +331 -0
  544. claude_mpm/services/local_ops/restart_manager.py +401 -0
  545. claude_mpm/services/local_ops/restart_policy.py +387 -0
  546. claude_mpm/services/local_ops/state_manager.py +372 -0
  547. claude_mpm/services/local_ops/unified_manager.py +600 -0
  548. claude_mpm/services/mcp_config_manager.py +1612 -0
  549. claude_mpm/services/mcp_gateway/__init__.py +97 -93
  550. claude_mpm/services/mcp_gateway/auto_configure.py +43 -38
  551. claude_mpm/services/mcp_gateway/config/config_loader.py +3 -3
  552. claude_mpm/services/mcp_gateway/config/configuration.py +23 -4
  553. claude_mpm/services/mcp_gateway/core/__init__.py +1 -2
  554. claude_mpm/services/mcp_gateway/core/base.py +20 -33
  555. claude_mpm/services/mcp_gateway/core/process_pool.py +585 -31
  556. claude_mpm/services/mcp_gateway/core/singleton_manager.py +2 -2
  557. claude_mpm/services/mcp_gateway/core/startup_verification.py +3 -3
  558. claude_mpm/services/mcp_gateway/main.py +90 -15
  559. claude_mpm/services/mcp_gateway/registry/service_registry.py +4 -2
  560. claude_mpm/services/mcp_gateway/registry/tool_registry.py +12 -9
  561. claude_mpm/services/mcp_gateway/server/mcp_gateway.py +4 -4
  562. claude_mpm/services/mcp_gateway/server/stdio_server.py +9 -15
  563. claude_mpm/services/mcp_gateway/tools/__init__.py +14 -2
  564. claude_mpm/services/mcp_gateway/tools/base_adapter.py +15 -15
  565. claude_mpm/services/mcp_gateway/tools/document_summarizer.py +10 -9
  566. claude_mpm/services/mcp_gateway/tools/external_mcp_services.py +654 -0
  567. claude_mpm/services/mcp_gateway/tools/health_check_tool.py +36 -34
  568. claude_mpm/services/mcp_gateway/tools/hello_world.py +8 -8
  569. claude_mpm/services/mcp_gateway/tools/kuzu_memory_service.py +551 -0
  570. claude_mpm/services/mcp_gateway/utils/__init__.py +14 -0
  571. claude_mpm/services/mcp_gateway/utils/package_version_checker.py +160 -0
  572. claude_mpm/services/mcp_gateway/utils/update_preferences.py +170 -0
  573. claude_mpm/services/mcp_service_verifier.py +729 -0
  574. claude_mpm/services/memory/builder.py +9 -8
  575. claude_mpm/services/memory/cache/shared_prompt_cache.py +2 -1
  576. claude_mpm/services/memory/cache/simple_cache.py +2 -2
  577. claude_mpm/services/memory/failure_tracker.py +578 -0
  578. claude_mpm/services/memory/indexed_memory.py +8 -8
  579. claude_mpm/services/memory/optimizer.py +8 -9
  580. claude_mpm/services/memory/router.py +3 -3
  581. claude_mpm/services/memory_hook_service.py +165 -4
  582. claude_mpm/services/model/__init__.py +147 -0
  583. claude_mpm/services/model/base_provider.py +365 -0
  584. claude_mpm/services/model/claude_provider.py +412 -0
  585. claude_mpm/services/model/model_router.py +453 -0
  586. claude_mpm/services/model/ollama_provider.py +415 -0
  587. claude_mpm/services/monitor/__init__.py +20 -0
  588. claude_mpm/services/monitor/daemon.py +671 -0
  589. claude_mpm/services/monitor/daemon_manager.py +963 -0
  590. claude_mpm/services/monitor/event_emitter.py +350 -0
  591. claude_mpm/services/monitor/handlers/__init__.py +21 -0
  592. claude_mpm/services/monitor/handlers/code_analysis.py +332 -0
  593. claude_mpm/services/monitor/handlers/dashboard.py +299 -0
  594. claude_mpm/services/monitor/handlers/file.py +264 -0
  595. claude_mpm/services/monitor/handlers/hooks.py +512 -0
  596. claude_mpm/services/monitor/management/__init__.py +18 -0
  597. claude_mpm/services/monitor/management/health.py +124 -0
  598. claude_mpm/services/monitor/management/lifecycle.py +724 -0
  599. claude_mpm/services/monitor/server.py +817 -0
  600. claude_mpm/services/monitor_build_service.py +2 -2
  601. claude_mpm/services/native_agent_converter.py +356 -0
  602. claude_mpm/services/orphan_detection.py +786 -0
  603. claude_mpm/services/port_manager.py +2 -2
  604. claude_mpm/services/project/__init__.py +23 -0
  605. claude_mpm/services/project/analyzer.py +3 -3
  606. claude_mpm/services/project/architecture_analyzer.py +6 -6
  607. claude_mpm/services/project/archive_manager.py +1045 -0
  608. claude_mpm/services/project/dependency_analyzer.py +8 -8
  609. claude_mpm/services/project/detection_strategies.py +719 -0
  610. claude_mpm/services/project/documentation_manager.py +553 -0
  611. claude_mpm/services/project/enhanced_analyzer.py +572 -0
  612. claude_mpm/services/project/language_analyzer.py +3 -3
  613. claude_mpm/services/project/metrics_collector.py +7 -10
  614. claude_mpm/services/project/project_organizer.py +1005 -0
  615. claude_mpm/services/project/registry.py +13 -7
  616. claude_mpm/services/project/toolchain_analyzer.py +581 -0
  617. claude_mpm/services/project_port_allocator.py +596 -0
  618. claude_mpm/services/response_tracker.py +21 -10
  619. claude_mpm/services/runner_configuration_service.py +1 -0
  620. claude_mpm/services/self_upgrade_service.py +500 -0
  621. claude_mpm/services/session_management_service.py +7 -5
  622. claude_mpm/services/session_manager.py +380 -0
  623. claude_mpm/services/shared/__init__.py +2 -1
  624. claude_mpm/services/shared/async_service_base.py +16 -27
  625. claude_mpm/services/shared/config_service_base.py +17 -14
  626. claude_mpm/services/shared/lifecycle_service_base.py +1 -14
  627. claude_mpm/services/shared/service_factory.py +8 -5
  628. claude_mpm/services/socketio/client_proxy.py +60 -5
  629. claude_mpm/services/socketio/dashboard_server.py +361 -0
  630. claude_mpm/services/socketio/event_normalizer.py +74 -6
  631. claude_mpm/services/socketio/handlers/__init__.py +5 -0
  632. claude_mpm/services/socketio/handlers/base.py +2 -2
  633. claude_mpm/services/socketio/handlers/code_analysis.py +682 -0
  634. claude_mpm/services/socketio/handlers/connection.py +21 -40
  635. claude_mpm/services/socketio/handlers/connection_handler.py +16 -28
  636. claude_mpm/services/socketio/handlers/file.py +46 -10
  637. claude_mpm/services/socketio/handlers/git.py +8 -8
  638. claude_mpm/services/socketio/handlers/hook.py +29 -17
  639. claude_mpm/services/socketio/handlers/registry.py +4 -0
  640. claude_mpm/services/socketio/monitor_client.py +364 -0
  641. claude_mpm/services/socketio/server/broadcaster.py +9 -7
  642. claude_mpm/services/socketio/server/connection_manager.py +131 -68
  643. claude_mpm/services/socketio/server/core.py +275 -22
  644. claude_mpm/services/socketio/server/eventbus_integration.py +20 -14
  645. claude_mpm/services/socketio/server/main.py +99 -29
  646. claude_mpm/services/socketio_client_manager.py +4 -4
  647. claude_mpm/services/subprocess_launcher_service.py +19 -15
  648. claude_mpm/services/system_instructions_service.py +2 -2
  649. claude_mpm/services/ticket_services/formatter_service.py +1 -1
  650. claude_mpm/services/ticket_services/validation_service.py +5 -5
  651. claude_mpm/services/unified/__init__.py +65 -0
  652. claude_mpm/services/unified/analyzer_strategies/__init__.py +44 -0
  653. claude_mpm/services/unified/analyzer_strategies/code_analyzer.py +518 -0
  654. claude_mpm/services/unified/analyzer_strategies/dependency_analyzer.py +680 -0
  655. claude_mpm/services/unified/analyzer_strategies/performance_analyzer.py +903 -0
  656. claude_mpm/services/unified/analyzer_strategies/security_analyzer.py +746 -0
  657. claude_mpm/services/unified/analyzer_strategies/structure_analyzer.py +733 -0
  658. claude_mpm/services/unified/config_strategies/__init__.py +175 -0
  659. claude_mpm/services/unified/config_strategies/config_schema.py +731 -0
  660. claude_mpm/services/unified/config_strategies/context_strategy.py +747 -0
  661. claude_mpm/services/unified/config_strategies/error_handling_strategy.py +1005 -0
  662. claude_mpm/services/unified/config_strategies/file_loader_strategy.py +881 -0
  663. claude_mpm/services/unified/config_strategies/unified_config_service.py +823 -0
  664. claude_mpm/services/unified/config_strategies/validation_strategy.py +1148 -0
  665. claude_mpm/services/unified/deployment_strategies/__init__.py +97 -0
  666. claude_mpm/services/unified/deployment_strategies/base.py +553 -0
  667. claude_mpm/services/unified/deployment_strategies/cloud_strategies.py +573 -0
  668. claude_mpm/services/unified/deployment_strategies/local.py +607 -0
  669. claude_mpm/services/unified/deployment_strategies/utils.py +667 -0
  670. claude_mpm/services/unified/deployment_strategies/vercel.py +475 -0
  671. claude_mpm/services/unified/interfaces.py +475 -0
  672. claude_mpm/services/unified/migration.py +509 -0
  673. claude_mpm/services/unified/strategies.py +534 -0
  674. claude_mpm/services/unified/unified_analyzer.py +542 -0
  675. claude_mpm/services/unified/unified_config.py +691 -0
  676. claude_mpm/services/unified/unified_deployment.py +470 -0
  677. claude_mpm/services/utility_service.py +6 -3
  678. claude_mpm/services/version_control/branch_strategy.py +2 -2
  679. claude_mpm/services/version_control/conflict_resolution.py +8 -4
  680. claude_mpm/services/version_control/git_operations.py +26 -24
  681. claude_mpm/services/version_control/semantic_versioning.py +14 -14
  682. claude_mpm/services/version_control/version_parser.py +14 -11
  683. claude_mpm/services/version_service.py +104 -1
  684. claude_mpm/services/visualization/__init__.py +19 -0
  685. claude_mpm/services/visualization/mermaid_generator.py +938 -0
  686. claude_mpm/skills/__init__.py +42 -0
  687. claude_mpm/skills/agent_skills_injector.py +324 -0
  688. claude_mpm/skills/bundled/LICENSE_ATTRIBUTIONS.md +79 -0
  689. claude_mpm/skills/bundled/__init__.py +6 -0
  690. claude_mpm/skills/bundled/api-documentation.md +393 -0
  691. claude_mpm/skills/bundled/async-testing.md +571 -0
  692. claude_mpm/skills/bundled/code-review.md +143 -0
  693. claude_mpm/skills/bundled/collaboration/brainstorming/SKILL.md +79 -0
  694. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/SKILL.md +178 -0
  695. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/agent-prompts.md +577 -0
  696. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/coordination-patterns.md +467 -0
  697. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/examples.md +537 -0
  698. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/troubleshooting.md +730 -0
  699. claude_mpm/skills/bundled/collaboration/requesting-code-review/SKILL.md +112 -0
  700. claude_mpm/skills/bundled/collaboration/requesting-code-review/references/code-reviewer-template.md +146 -0
  701. claude_mpm/skills/bundled/collaboration/requesting-code-review/references/review-examples.md +412 -0
  702. claude_mpm/skills/bundled/collaboration/writing-plans/SKILL.md +81 -0
  703. claude_mpm/skills/bundled/collaboration/writing-plans/references/best-practices.md +362 -0
  704. claude_mpm/skills/bundled/collaboration/writing-plans/references/plan-structure-templates.md +312 -0
  705. claude_mpm/skills/bundled/database-migration.md +199 -0
  706. claude_mpm/skills/bundled/debugging/root-cause-tracing/SKILL.md +152 -0
  707. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/advanced-techniques.md +668 -0
  708. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/examples.md +587 -0
  709. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/integration.md +438 -0
  710. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/tracing-techniques.md +391 -0
  711. claude_mpm/skills/bundled/debugging/systematic-debugging/CREATION-LOG.md +119 -0
  712. claude_mpm/skills/bundled/debugging/systematic-debugging/SKILL.md +148 -0
  713. claude_mpm/skills/bundled/debugging/systematic-debugging/references/anti-patterns.md +483 -0
  714. claude_mpm/skills/bundled/debugging/systematic-debugging/references/examples.md +452 -0
  715. claude_mpm/skills/bundled/debugging/systematic-debugging/references/troubleshooting.md +449 -0
  716. claude_mpm/skills/bundled/debugging/systematic-debugging/references/workflow.md +411 -0
  717. claude_mpm/skills/bundled/debugging/systematic-debugging/test-academic.md +14 -0
  718. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-1.md +58 -0
  719. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-2.md +68 -0
  720. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-3.md +69 -0
  721. claude_mpm/skills/bundled/debugging/verification-before-completion/SKILL.md +131 -0
  722. claude_mpm/skills/bundled/debugging/verification-before-completion/references/gate-function.md +325 -0
  723. claude_mpm/skills/bundled/debugging/verification-before-completion/references/integration-and-workflows.md +490 -0
  724. claude_mpm/skills/bundled/debugging/verification-before-completion/references/red-flags-and-failures.md +425 -0
  725. claude_mpm/skills/bundled/debugging/verification-before-completion/references/verification-patterns.md +499 -0
  726. claude_mpm/skills/bundled/docker-containerization.md +194 -0
  727. claude_mpm/skills/bundled/express-local-dev.md +1429 -0
  728. claude_mpm/skills/bundled/fastapi-local-dev.md +1199 -0
  729. claude_mpm/skills/bundled/git-workflow.md +414 -0
  730. claude_mpm/skills/bundled/imagemagick.md +204 -0
  731. claude_mpm/skills/bundled/infrastructure/env-manager/scripts/validate_env.py +576 -0
  732. claude_mpm/skills/bundled/json-data-handling.md +223 -0
  733. claude_mpm/skills/bundled/main/artifacts-builder/SKILL.md +86 -0
  734. claude_mpm/skills/bundled/main/internal-comms/SKILL.md +43 -0
  735. claude_mpm/skills/bundled/main/internal-comms/examples/3p-updates.md +47 -0
  736. claude_mpm/skills/bundled/main/internal-comms/examples/company-newsletter.md +65 -0
  737. claude_mpm/skills/bundled/main/internal-comms/examples/faq-answers.md +30 -0
  738. claude_mpm/skills/bundled/main/internal-comms/examples/general-comms.md +16 -0
  739. claude_mpm/skills/bundled/main/mcp-builder/SKILL.md +160 -0
  740. claude_mpm/skills/bundled/main/mcp-builder/reference/design_principles.md +412 -0
  741. claude_mpm/skills/bundled/main/mcp-builder/reference/evaluation.md +602 -0
  742. claude_mpm/skills/bundled/main/mcp-builder/reference/mcp_best_practices.md +915 -0
  743. claude_mpm/skills/bundled/main/mcp-builder/reference/node_mcp_server.md +916 -0
  744. claude_mpm/skills/bundled/main/mcp-builder/reference/python_mcp_server.md +752 -0
  745. claude_mpm/skills/bundled/main/mcp-builder/reference/workflow.md +1237 -0
  746. claude_mpm/skills/bundled/main/mcp-builder/scripts/connections.py +157 -0
  747. claude_mpm/skills/bundled/main/mcp-builder/scripts/evaluation.py +425 -0
  748. claude_mpm/skills/bundled/main/skill-creator/SKILL.md +189 -0
  749. claude_mpm/skills/bundled/main/skill-creator/references/best-practices.md +500 -0
  750. claude_mpm/skills/bundled/main/skill-creator/references/creation-workflow.md +464 -0
  751. claude_mpm/skills/bundled/main/skill-creator/references/examples.md +619 -0
  752. claude_mpm/skills/bundled/main/skill-creator/references/progressive-disclosure.md +437 -0
  753. claude_mpm/skills/bundled/main/skill-creator/references/skill-structure.md +231 -0
  754. claude_mpm/skills/bundled/main/skill-creator/scripts/init_skill.py +303 -0
  755. claude_mpm/skills/bundled/main/skill-creator/scripts/package_skill.py +113 -0
  756. claude_mpm/skills/bundled/main/skill-creator/scripts/quick_validate.py +72 -0
  757. claude_mpm/skills/bundled/nextjs-local-dev.md +807 -0
  758. claude_mpm/skills/bundled/pdf.md +141 -0
  759. claude_mpm/skills/bundled/performance-profiling.md +573 -0
  760. claude_mpm/skills/bundled/php/espocrm-development/SKILL.md +170 -0
  761. claude_mpm/skills/bundled/php/espocrm-development/references/architecture.md +602 -0
  762. claude_mpm/skills/bundled/php/espocrm-development/references/common-tasks.md +821 -0
  763. claude_mpm/skills/bundled/php/espocrm-development/references/development-workflow.md +742 -0
  764. claude_mpm/skills/bundled/php/espocrm-development/references/frontend-customization.md +726 -0
  765. claude_mpm/skills/bundled/php/espocrm-development/references/hooks-and-services.md +764 -0
  766. claude_mpm/skills/bundled/php/espocrm-development/references/testing-debugging.md +831 -0
  767. claude_mpm/skills/bundled/refactoring-patterns.md +180 -0
  768. claude_mpm/skills/bundled/rust/desktop-applications/SKILL.md +226 -0
  769. claude_mpm/skills/bundled/rust/desktop-applications/references/architecture-patterns.md +901 -0
  770. claude_mpm/skills/bundled/rust/desktop-applications/references/native-gui-frameworks.md +901 -0
  771. claude_mpm/skills/bundled/rust/desktop-applications/references/platform-integration.md +775 -0
  772. claude_mpm/skills/bundled/rust/desktop-applications/references/state-management.md +937 -0
  773. claude_mpm/skills/bundled/rust/desktop-applications/references/tauri-framework.md +770 -0
  774. claude_mpm/skills/bundled/rust/desktop-applications/references/testing-deployment.md +961 -0
  775. claude_mpm/skills/bundled/security-scanning.md +327 -0
  776. claude_mpm/skills/bundled/systematic-debugging.md +473 -0
  777. claude_mpm/skills/bundled/test-driven-development.md +378 -0
  778. claude_mpm/skills/bundled/testing/condition-based-waiting/SKILL.md +119 -0
  779. claude_mpm/skills/bundled/testing/condition-based-waiting/references/patterns-and-implementation.md +253 -0
  780. claude_mpm/skills/bundled/testing/test-driven-development/SKILL.md +145 -0
  781. claude_mpm/skills/bundled/testing/test-driven-development/references/anti-patterns.md +543 -0
  782. claude_mpm/skills/bundled/testing/test-driven-development/references/examples.md +741 -0
  783. claude_mpm/skills/bundled/testing/test-driven-development/references/integration.md +470 -0
  784. claude_mpm/skills/bundled/testing/test-driven-development/references/philosophy.md +458 -0
  785. claude_mpm/skills/bundled/testing/test-driven-development/references/workflow.md +639 -0
  786. claude_mpm/skills/bundled/testing/testing-anti-patterns/SKILL.md +140 -0
  787. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/completeness-anti-patterns.md +572 -0
  788. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/core-anti-patterns.md +411 -0
  789. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/detection-guide.md +569 -0
  790. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/tdd-connection.md +695 -0
  791. claude_mpm/skills/bundled/testing/webapp-testing/SKILL.md +184 -0
  792. claude_mpm/skills/bundled/testing/webapp-testing/decision-tree.md +459 -0
  793. claude_mpm/skills/bundled/testing/webapp-testing/examples/console_logging.py +35 -0
  794. claude_mpm/skills/bundled/testing/webapp-testing/examples/element_discovery.py +44 -0
  795. claude_mpm/skills/bundled/testing/webapp-testing/examples/static_html_automation.py +34 -0
  796. claude_mpm/skills/bundled/testing/webapp-testing/playwright-patterns.md +479 -0
  797. claude_mpm/skills/bundled/testing/webapp-testing/reconnaissance-pattern.md +687 -0
  798. claude_mpm/skills/bundled/testing/webapp-testing/scripts/with_server.py +129 -0
  799. claude_mpm/skills/bundled/testing/webapp-testing/server-management.md +758 -0
  800. claude_mpm/skills/bundled/testing/webapp-testing/troubleshooting.md +868 -0
  801. claude_mpm/skills/bundled/vite-local-dev.md +1061 -0
  802. claude_mpm/skills/bundled/web-performance-optimization.md +2305 -0
  803. claude_mpm/skills/bundled/xlsx.md +157 -0
  804. claude_mpm/skills/registry.py +286 -0
  805. claude_mpm/skills/skill_manager.py +310 -0
  806. claude_mpm/skills/skills_registry.py +348 -0
  807. claude_mpm/skills/skills_service.py +739 -0
  808. claude_mpm/storage/state_storage.py +31 -31
  809. claude_mpm/tools/__init__.py +10 -0
  810. claude_mpm/tools/__main__.py +208 -0
  811. claude_mpm/tools/code_tree_analyzer/__init__.py +45 -0
  812. claude_mpm/tools/code_tree_analyzer/analysis.py +299 -0
  813. claude_mpm/tools/code_tree_analyzer/cache.py +131 -0
  814. claude_mpm/tools/code_tree_analyzer/core.py +380 -0
  815. claude_mpm/tools/code_tree_analyzer/discovery.py +403 -0
  816. claude_mpm/tools/code_tree_analyzer/events.py +168 -0
  817. claude_mpm/tools/code_tree_analyzer/gitignore.py +308 -0
  818. claude_mpm/tools/code_tree_analyzer/models.py +39 -0
  819. claude_mpm/tools/code_tree_analyzer/multilang_analyzer.py +224 -0
  820. claude_mpm/tools/code_tree_analyzer/python_analyzer.py +284 -0
  821. claude_mpm/tools/code_tree_builder.py +631 -0
  822. claude_mpm/tools/code_tree_events.py +420 -0
  823. claude_mpm/tools/socketio_debug.py +671 -0
  824. claude_mpm/utils/agent_dependency_loader.py +108 -27
  825. claude_mpm/utils/common.py +544 -0
  826. claude_mpm/utils/config_manager.py +12 -6
  827. claude_mpm/utils/database_connector.py +298 -0
  828. claude_mpm/utils/dependency_cache.py +2 -2
  829. claude_mpm/utils/dependency_strategies.py +15 -10
  830. claude_mpm/utils/display_helper.py +260 -0
  831. claude_mpm/utils/environment_context.py +4 -3
  832. claude_mpm/utils/error_handler.py +5 -3
  833. claude_mpm/utils/file_utils.py +13 -14
  834. claude_mpm/utils/git_analyzer.py +407 -0
  835. claude_mpm/utils/log_cleanup.py +627 -0
  836. claude_mpm/utils/path_operations.py +7 -4
  837. claude_mpm/utils/robust_installer.py +133 -24
  838. claude_mpm/utils/session_logging.py +2 -2
  839. claude_mpm/utils/subprocess_utils.py +9 -8
  840. claude_mpm/validation/agent_validator.py +6 -6
  841. claude_mpm/validation/frontmatter_validator.py +6 -6
  842. claude_mpm-4.24.0.dist-info/METADATA +675 -0
  843. claude_mpm-4.24.0.dist-info/RECORD +1018 -0
  844. {claude_mpm-4.1.6.dist-info → claude_mpm-4.24.0.dist-info}/entry_points.txt +1 -0
  845. claude_mpm/agents/INSTRUCTIONS.md +0 -237
  846. claude_mpm/agents/schema/agent_schema.json +0 -314
  847. claude_mpm/agents/templates/agent-manager.md +0 -304
  848. claude_mpm/cli/commands/configure_tui.py +0 -1921
  849. claude_mpm/cli/commands/socketio_monitor.py +0 -233
  850. claude_mpm/hooks/claude_hooks/hook_handler_eventbus.py +0 -425
  851. claude_mpm/hooks/claude_hooks/hook_handler_original.py +0 -1040
  852. claude_mpm/hooks/claude_hooks/hook_handler_refactored.py +0 -347
  853. claude_mpm/scripts/socketio_daemon_hardened.py +0 -937
  854. claude_mpm/scripts/socketio_server_manager.py +0 -349
  855. claude_mpm/services/agents/deployment/agent_lifecycle_manager_refactored.py +0 -575
  856. claude_mpm/services/cli/dashboard_launcher.py +0 -424
  857. claude_mpm/services/cli/socketio_manager.py +0 -498
  858. claude_mpm/services/diagnostics/checks/claude_desktop_check.py +0 -286
  859. claude_mpm/services/mcp_gateway/tools/ticket_tools.py +0 -645
  860. claude_mpm/services/mcp_gateway/tools/unified_ticket_tool.py +0 -602
  861. claude_mpm/services/project/analyzer_refactored.py +0 -450
  862. claude_mpm-4.1.6.dist-info/METADATA +0 -325
  863. claude_mpm-4.1.6.dist-info/RECORD +0 -550
  864. {claude_mpm-4.1.6.dist-info → claude_mpm-4.24.0.dist-info}/WHEEL +0 -0
  865. {claude_mpm-4.1.6.dist-info → claude_mpm-4.24.0.dist-info}/licenses/LICENSE +0 -0
  866. {claude_mpm-4.1.6.dist-info → claude_mpm-4.24.0.dist-info}/top_level.txt +0 -0
@@ -1,30 +1,31 @@
1
1
  """
2
2
  Monitor command implementation for claude-mpm.
3
3
 
4
- WHY: This module provides CLI commands for managing the Socket.IO monitoring server,
5
- allowing users to start, stop, restart, and check status of the monitoring infrastructure.
4
+ WHY: This module provides CLI commands for managing the unified monitoring daemon,
5
+ providing a single stable way to launch all monitoring functionality including
6
+ HTTP dashboard, Socket.IO events, real AST analysis, and Claude Code hook ingestion.
6
7
 
7
8
  DESIGN DECISIONS:
8
- - Use BaseCommand for consistent CLI patterns
9
- - Leverage shared utilities for argument parsing and output formatting
10
- - Maintain backward compatibility with existing Socket.IO server management
11
- - Support multiple output formats (json, yaml, table, text)
9
+ - Use UnifiedMonitorDaemon for single stable monitoring service
10
+ - Single port (8765) for all functionality
11
+ - Support both foreground and daemon modes
12
+ - Real AST analysis using CodeTreeAnalyzer
13
+ - Integrated dashboard and Socket.IO server
12
14
  """
13
15
 
14
- import subprocess
15
- import sys
16
16
  from typing import Optional
17
17
 
18
18
  from ...constants import MonitorCommands
19
- from ...core.logger import get_logger
19
+ from ...services.monitor.daemon import UnifiedMonitorDaemon
20
20
  from ..shared import BaseCommand, CommandResult
21
21
 
22
22
 
23
23
  class MonitorCommand(BaseCommand):
24
- """Monitor command using shared utilities."""
24
+ """Monitor command for managing the unified monitoring daemon."""
25
25
 
26
26
  def __init__(self):
27
27
  super().__init__("monitor")
28
+ self.daemon = None
28
29
 
29
30
  def validate_args(self, args) -> Optional[str]:
30
31
  """Validate command arguments."""
@@ -37,41 +38,24 @@ class MonitorCommand(BaseCommand):
37
38
  return None
38
39
 
39
40
  def run(self, args) -> CommandResult:
40
- """Execute the monitor command."""
41
+ """Execute the monitor command using unified monitoring daemon."""
41
42
  try:
42
- # Import ServerManager
43
- from ...scripts.socketio_server_manager import ServerManager
43
+ self.logger.info("Monitor command using unified monitoring daemon")
44
44
 
45
- server_manager = ServerManager()
46
-
47
- # Handle default case (no subcommand)
45
+ # Handle default case (no subcommand) - default to status
48
46
  if not hasattr(args, "monitor_command") or not args.monitor_command:
49
- # Default to status
50
- success = self._status_server(args, server_manager)
51
- if success:
52
- return CommandResult.success_result(
53
- "Monitor status retrieved successfully"
54
- )
55
- return CommandResult.error_result("Failed to retrieve monitor status")
56
-
57
- # Route to specific subcommand handlers
58
- command_map = {
59
- MonitorCommands.START.value: self._start_server,
60
- MonitorCommands.STOP.value: self._stop_server,
61
- MonitorCommands.RESTART.value: self._restart_server,
62
- MonitorCommands.STATUS.value: self._status_server,
63
- MonitorCommands.PORT.value: self._port_server,
64
- }
65
-
66
- if args.monitor_command in command_map:
67
- success = command_map[args.monitor_command](args, server_manager)
68
- if success:
69
- return CommandResult.success_result(
70
- f"Monitor {args.monitor_command} completed successfully"
71
- )
72
- return CommandResult.error_result(
73
- f"Monitor {args.monitor_command} failed"
74
- )
47
+ return self._status_monitor(args)
48
+
49
+ # Route to specific monitor commands
50
+ if args.monitor_command == MonitorCommands.START.value:
51
+ return self._start_monitor(args)
52
+ if args.monitor_command == MonitorCommands.STOP.value:
53
+ return self._stop_monitor(args)
54
+ if args.monitor_command == MonitorCommands.RESTART.value:
55
+ return self._restart_monitor(args)
56
+ if args.monitor_command == MonitorCommands.STATUS.value:
57
+ return self._status_monitor(args)
58
+
75
59
  return CommandResult.error_result(
76
60
  f"Unknown monitor command: {args.monitor_command}"
77
61
  )
@@ -80,616 +64,183 @@ class MonitorCommand(BaseCommand):
80
64
  self.logger.error(f"Error executing monitor command: {e}", exc_info=True)
81
65
  return CommandResult.error_result(f"Error executing monitor command: {e}")
82
66
 
83
- def _start_server(self, args, server_manager) -> bool:
84
- """Start the monitoring server."""
85
- return _start_server(args, server_manager)
86
-
87
- def _stop_server(self, args, server_manager) -> bool:
88
- """Stop the monitoring server."""
89
- return _stop_server(args, server_manager)
90
-
91
- def _restart_server(self, args, server_manager) -> bool:
92
- """Restart the monitoring server."""
93
- return _restart_server(args, server_manager)
94
-
95
- def _status_server(self, args, server_manager) -> bool:
96
- """Get monitoring server status."""
97
- return _status_server(args, server_manager)
98
-
99
- def _port_server(self, args, server_manager) -> bool:
100
- """Start/restart server on specific port."""
101
- return _port_server(args, server_manager)
102
-
103
-
104
- def manage_monitor(args):
105
- """
106
- Main entry point for monitor command.
107
-
108
- This function maintains backward compatibility while using the new BaseCommand pattern.
109
- """
110
- command = MonitorCommand()
111
- result = command.execute(args)
112
-
113
- # Print result if structured output format is requested
114
- if hasattr(args, "format") and args.format in ["json", "yaml"]:
115
- command.print_result(result, args)
116
-
117
- return result.exit_code
118
-
119
-
120
- def manage_monitor_legacy(args):
121
- """
122
- Legacy monitor command dispatcher.
123
-
124
- WHY: This contains the original manage_monitor logic, preserved during migration
125
- to BaseCommand pattern. Will be gradually refactored into the MonitorCommand class.
126
-
127
- DESIGN DECISION: When no subcommand is provided, we show the server status
128
- as the default action, giving users a quick overview of the monitoring system.
129
-
130
- Args:
131
- args: Parsed command line arguments with monitor_command attribute
132
- """
133
- logger = get_logger("cli")
134
-
135
- try:
136
- # Import ServerManager from socketio_server_manager.py
137
- from ...scripts.socketio_server_manager import ServerManager
138
-
139
- server_manager = ServerManager()
140
-
141
- if not args.monitor_command:
142
- # No subcommand - show status as default
143
- # WHY: Status is the most common operation users want when running monitor without args
144
- args.verbose = False # Set default for verbose flag
145
- success = _status_server(args, server_manager)
146
- return 0 if success else 1
147
-
148
- if args.monitor_command == MonitorCommands.START.value:
149
- success = _start_server(args, server_manager)
150
- return 0 if success else 1
151
-
152
- if args.monitor_command == MonitorCommands.STOP.value:
153
- success = _stop_server(args, server_manager)
154
- return 0 if success else 1
155
-
156
- if args.monitor_command == MonitorCommands.RESTART.value:
157
- success = _restart_server(args, server_manager)
158
- return 0 if success else 1
159
-
160
- if args.monitor_command == MonitorCommands.STATUS.value:
161
- success = _status_server(args, server_manager)
162
- return 0 if success else 1
163
-
164
- if args.monitor_command == MonitorCommands.PORT.value:
165
- success = _port_server(args, server_manager)
166
- return 0 if success else 1
167
-
168
- logger.error(f"Unknown monitor command: {args.monitor_command}")
169
- print(f"Unknown monitor command: {args.monitor_command}")
170
- print("Available commands: start, stop, restart, status, port")
171
- return 1
67
+ def _start_monitor(self, args) -> CommandResult:
68
+ """Start the unified monitor daemon."""
69
+ port = getattr(args, "port", None)
70
+ if port is None:
71
+ port = 8765 # Default to 8765 for unified monitor
72
+ host = getattr(args, "host", "localhost")
73
+
74
+ # Check for explicit foreground flag first, then background flag
75
+ # Default to daemon/background mode if neither specified
76
+ if getattr(args, "foreground", False):
77
+ daemon_mode = False
78
+ elif getattr(args, "background", None) is not None:
79
+ daemon_mode = getattr(args, "background", False)
80
+ else:
81
+ # Default to daemon/background mode
82
+ daemon_mode = True
172
83
 
173
- except ImportError as e:
174
- logger.error(f"Server manager not available: {e}")
175
- print("Error: Socket.IO server manager not available")
176
- print("This may indicate a missing dependency or installation issue.")
177
- return 1
178
- except Exception as e:
179
- logger.error(f"Error managing monitor: {e}")
180
- print(f"Error: {e}")
181
- return 1
84
+ mode_str = "background/daemon" if daemon_mode else "foreground"
85
+ self.logger.info(
86
+ f"Starting unified monitor daemon on {host}:{port} (mode: {mode_str})"
87
+ )
182
88
 
183
- return 0
89
+ # Create unified monitor daemon
90
+ self.daemon = UnifiedMonitorDaemon(
91
+ host=host, port=port, daemon_mode=daemon_mode
92
+ )
184
93
 
94
+ # Get force restart flag
95
+ force_restart = getattr(args, "force", False)
96
+
97
+ # Check if already running
98
+ if self.daemon.lifecycle.is_running() and not force_restart:
99
+ existing_pid = self.daemon.lifecycle.get_pid()
100
+ return CommandResult.success_result(
101
+ f"Unified monitor daemon already running with PID {existing_pid}",
102
+ data={
103
+ "url": f"http://{host}:{port}",
104
+ "port": port,
105
+ "pid": existing_pid,
106
+ },
107
+ )
185
108
 
186
- def _port_server(args, server_manager):
187
- """
188
- Start or restart the Socket.IO monitoring server on a specific port.
109
+ # Start the daemon (with force restart if specified)
110
+ if self.daemon.start(force_restart=force_restart):
111
+ # For daemon mode, verify it actually started
112
+ if daemon_mode:
113
+ # Give it a moment to fully initialize
114
+ import time
189
115
 
190
- WHY: Users need to be able to start/restart the monitoring server on a specific
191
- port, either if no server is running (start) or if a server is already running
192
- on a different port (restart). Enhanced with smart process detection to reclaim
193
- ports from debug processes.
116
+ time.sleep(0.5)
194
117
 
195
- Args:
196
- args: Command arguments with required port and optional host, force, reclaim flags
197
- server_manager: ServerManager instance
118
+ # Check if it's actually running
119
+ if not self.daemon.lifecycle.is_running():
120
+ return CommandResult.error_result(
121
+ "Monitor daemon failed to start. Check ~/.claude-mpm/monitor-daemon.log for details."
122
+ )
198
123
 
199
- Returns:
200
- bool: True if server started/restarted successfully, False otherwise
201
- """
202
- port = args.port
203
- host = getattr(args, "host", "localhost")
204
- force = getattr(args, "force", False)
205
- reclaim = getattr(args, "reclaim", True)
206
-
207
- print(f"Managing Socket.IO monitoring server on port {port}...")
208
- print(f"Target: {host}:{port}")
209
- print()
210
-
211
- try:
212
- # Import PortManager to check port status
213
- from ...services.port_manager import PortManager
214
-
215
- port_manager = PortManager()
216
-
217
- # Get detailed port status
218
- port_status = port_manager.get_port_status(port)
219
-
220
- # Check if port is in use
221
- if not port_status["available"]:
222
- process_info = port_status.get("process")
223
- if process_info:
224
- print(f"⚠️ Port {port} is in use:")
225
- print(f" Process: {process_info['name']} (PID: {process_info['pid']})")
226
-
227
- if process_info["is_ours"]:
228
- if process_info["is_debug"]:
229
- print(" Type: Debug/Test script (can be reclaimed)")
230
- if reclaim:
231
- print(" Action: Attempting to reclaim port...")
232
- if port_manager.kill_process_on_port(port, force=force):
233
- print(f" ✅ Successfully reclaimed port {port}")
234
- else:
235
- print(f" ❌ Failed to reclaim port {port}")
236
- return False
237
- elif process_info["is_daemon"]:
238
- print(" Type: Daemon process")
239
- if force:
240
- print(
241
- " Action: Force killing daemon (--force flag used)..."
242
- )
243
- if port_manager.kill_process_on_port(port, force=True):
244
- print(f" ✅ Successfully killed daemon on port {port}")
245
- else:
246
- print(f" ❌ Failed to kill daemon on port {port}")
247
- return False
248
- else:
249
- print(" ❌ Cannot start: Daemon already running")
250
- print(f" Recommendation: {port_status['recommendation']}")
251
- return False
252
- else:
253
- print(" Type: External process")
254
- print(f" ❌ Cannot start: {port_status['recommendation']}")
255
- return False
256
- print()
257
-
258
- # Check if there are any running servers
259
- running_servers = server_manager.list_running_servers()
260
-
261
- # Check if server is already running on this port after reclaim
262
- server_on_port = any(server.get("port") == port for server in running_servers)
263
-
264
- if server_on_port:
265
- print(f"Server already running on port {port}. Restarting...")
266
- success = server_manager.restart_server(port=port)
267
- action = "restarted"
268
- else:
269
- # Check if servers are running on other ports
270
- if running_servers:
271
- print("Servers running on other ports:")
272
- for server in running_servers:
273
- server_port = server.get("port")
274
- server_id = server.get("server_id", "unknown")
275
- print(f" • Server '{server_id}' on port {server_port}")
276
- print()
277
- print(f"Starting new server on port {port}...")
124
+ # Get the actual PID
125
+ actual_pid = self.daemon.lifecycle.get_pid()
126
+ mode_info = f" in background (PID: {actual_pid})"
278
127
  else:
279
- print("No servers currently running. Starting new server...")
128
+ mode_info = " in foreground"
280
129
 
281
- success = server_manager.start_server(
282
- port=port, host=host, server_id="monitor-server"
130
+ return CommandResult.success_result(
131
+ f"Unified monitor daemon started on {host}:{port}{mode_info}",
132
+ data={"url": f"http://{host}:{port}", "port": port, "mode": mode_str},
283
133
  )
284
- action = "started"
285
-
286
- if success:
287
- print()
288
- print(f"Monitor server {action} successfully on port {port}")
289
- print()
290
- print("Server management commands:")
291
- print(" Status: ps aux | grep socketio")
292
- print(f" Stop: claude-mpm monitor stop --port {port}")
293
- print(f" Restart: claude-mpm monitor restart --port {port}")
294
- print()
295
- print(f"WebSocket URL: ws://{host}:{port}")
296
- else:
297
- print(f"Failed to {action.replace('ed', '')} server on port {port}")
298
- print()
299
- print("Troubleshooting:")
300
- print(f" • Check if port {port} is available: lsof -i :{port}")
301
- print(f" • Try a different port: claude-mpm monitor port {port + 1}")
302
- print(" • Check system resources: free -h && df -h")
303
-
304
- return success
305
-
306
- except Exception as e:
307
- print(f"Error managing server on port {port}: {e}")
308
- print()
309
- print("Troubleshooting:")
310
- print(f" • Verify port {port} is valid and available")
311
- print(" • Check system resources and permissions")
312
- print(" • Try manual start/stop operations")
313
- return False
314
-
315
-
316
- def _start_server(args, server_manager):
317
- """
318
- Start the Socket.IO monitoring server.
319
-
320
- WHY: Users need to start the monitoring server to enable real-time monitoring
321
- of Claude MPM sessions and websocket connections. Enhanced with smart process
322
- detection to automatically reclaim ports from debug scripts.
323
-
324
- Args:
325
- args: Command arguments with optional port, host, force, and reclaim flags
326
- server_manager: ServerManager instance
327
134
 
328
- Returns:
329
- bool: True if server started successfully, False otherwise
330
- """
331
- port = getattr(args, "port", None)
332
- host = getattr(args, "host", "localhost")
333
- force = getattr(args, "force", False)
334
- reclaim = getattr(args, "reclaim", True)
135
+ # Check if error was due to port already in use
136
+ import socket
335
137
 
336
- print("Starting Socket.IO monitoring server...")
138
+ try:
139
+ test_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
140
+ test_sock.connect((host, port))
141
+ test_sock.close()
142
+ return CommandResult.error_result(
143
+ f"Port {port} is already in use. Try 'claude-mpm monitor stop' first or use a different port."
144
+ )
145
+ except Exception:
146
+ pass
337
147
 
338
- try:
339
- # Import PortManager for smart port selection
340
- from ...services.port_manager import PortManager
148
+ return CommandResult.error_result(
149
+ "Failed to start unified monitor daemon. Check ~/.claude-mpm/monitor-daemon.log for details."
150
+ )
341
151
 
342
- port_manager = PortManager()
152
+ def _stop_monitor(self, args) -> CommandResult:
153
+ """Stop the unified monitor daemon."""
154
+ # Don't log here - the daemon will log when it stops
343
155
 
344
- # If no port specified, find an available one with smart reclaim
156
+ # Get parameters from args or use defaults
157
+ port = getattr(args, "port", None)
345
158
  if port is None:
346
- port = port_manager.find_available_port(reclaim=reclaim)
347
- if port is None:
348
- print("❌ No available ports found")
349
- print(
350
- "Try specifying a port with --port or use --force to reclaim daemon ports"
351
- )
352
- return False
353
- print(f"Selected port: {port}")
354
- else:
355
- # Check if specified port needs reclaiming
356
- port_status = port_manager.get_port_status(port)
357
- if not port_status["available"]:
358
- process_info = port_status.get("process")
359
- if process_info:
360
- print(
361
- f"⚠️ Port {port} is in use by {process_info['name']} (PID: {process_info['pid']})"
362
- )
159
+ port = 8765 # Default to 8765 for unified monitor
160
+ host = getattr(args, "host", "localhost")
363
161
 
364
- if process_info["is_ours"] and (process_info["is_debug"] or force):
365
- if reclaim:
366
- print(f"Attempting to reclaim port {port}...")
367
- if not port_manager.kill_process_on_port(port, force=force):
368
- print(f"❌ Failed to reclaim port {port}")
369
- return False
370
- print(f"✅ Successfully reclaimed port {port}")
371
- else:
372
- print(
373
- f"❌ Port {port} unavailable and --no-reclaim specified"
374
- )
375
- return False
376
- else:
377
- print(
378
- f"❌ Cannot reclaim port: {port_status['recommendation']}"
379
- )
380
- return False
381
-
382
- print(f"Target: {host}:{port}")
383
- print()
384
-
385
- success = server_manager.start_server(
386
- port=port, host=host, server_id="monitor-server"
387
- )
162
+ # Create daemon instance to check status and stop
163
+ # For stop, we need to know if it was started in daemon mode
164
+ # We default to daemon mode since that's the usual case
165
+ daemon_mode = True
166
+ daemon = UnifiedMonitorDaemon(host=host, port=port, daemon_mode=daemon_mode)
388
167
 
389
- if success:
390
- print()
391
- print("Monitor server management commands:")
392
- print(" Status: claude-mpm monitor status")
393
- print(" Stop: claude-mpm monitor stop")
394
- print(" Restart: claude-mpm monitor restart")
395
- print()
396
- print(f"WebSocket URL: ws://{host}:{port}")
168
+ if not daemon.lifecycle.is_running():
169
+ return CommandResult.success_result("No unified monitor daemon running")
397
170
 
398
- return success
171
+ # Stop the daemon
172
+ if daemon.stop():
173
+ return CommandResult.success_result("Unified monitor daemon stopped")
174
+ return CommandResult.error_result("Failed to stop unified monitor daemon")
399
175
 
400
- except Exception as e:
401
- print(f"Failed to start monitoring server: {e}")
402
- print()
403
- print("Troubleshooting:")
404
- print(f" • Check if port {port} is available: lsof -i :{port}")
405
- print(f" • Try a different port: claude-mpm monitor start --port {port + 1}")
406
- print(" • Check system resources: free -h && df -h")
407
- return False
176
+ def _restart_monitor(self, args) -> CommandResult:
177
+ """Restart the unified monitor daemon."""
178
+ self.logger.info("Restarting unified monitor daemon")
408
179
 
180
+ # Get parameters from args or use defaults
181
+ port = getattr(args, "port", None)
182
+ if port is None:
183
+ port = 8765 # Default to 8765 for unified monitor
184
+ host = getattr(args, "host", "localhost")
409
185
 
410
- def _stop_server(args, server_manager):
411
- """
412
- Stop the Socket.IO monitoring server.
186
+ # For restart, default to daemon mode (the usual use case)
187
+ # unless explicitly running in foreground
188
+ daemon_mode = not getattr(args, "foreground", False)
413
189
 
414
- WHY: Users need to stop the monitoring server when it's no longer needed
415
- or when troubleshooting connection issues.
190
+ # Create daemon instance with proper parameters
191
+ daemon = UnifiedMonitorDaemon(host=host, port=port, daemon_mode=daemon_mode)
416
192
 
417
- Args:
418
- args: Command arguments with optional port
419
- server_manager: ServerManager instance
193
+ # Restart the daemon
194
+ if daemon.restart():
195
+ return CommandResult.success_result(
196
+ f"Unified monitor daemon restarted on {host}:{port}"
197
+ )
198
+ return CommandResult.error_result("Failed to restart unified monitor daemon")
420
199
 
421
- Returns:
422
- bool: True if server stopped successfully, False otherwise
423
- """
424
- port = getattr(args, "port", None)
200
+ def _status_monitor(self, args) -> CommandResult:
201
+ """Get unified monitor daemon status."""
425
202
 
426
- print("Stopping Socket.IO monitoring server...")
203
+ # Create daemon instance to check status
204
+ daemon = UnifiedMonitorDaemon()
205
+ status_data = daemon.status()
427
206
 
428
- try:
429
- # If no port specified, try to find running servers and stop them
430
- if port is None:
431
- running_servers = server_manager.list_running_servers()
432
- if not running_servers:
433
- print("No running servers found to stop")
434
- return True
435
-
436
- # Stop the first server (or all if multiple)
437
- success = True
438
- for server in running_servers:
439
- server_port = server.get("port")
440
- server_id = server.get("server_id", "unknown")
441
- print(f"Stopping server '{server_id}' on port {server_port}...")
442
-
443
- if not server_manager.stop_server(port=server_port):
444
- print(f"Failed to stop server on port {server_port}")
445
- success = False
446
-
447
- return success
448
- # Stop specific server on given port
449
- success = server_manager.stop_server(port=port)
450
-
451
- if success:
452
- print(f"Monitor server stopped on port {port}")
207
+ # Format output message
208
+ if status_data["running"]:
209
+ message = f"Unified monitor daemon is running at http://{status_data['host']}:{status_data['port']}"
210
+ if status_data.get("pid"):
211
+ message += f" (PID: {status_data['pid']})"
453
212
  else:
454
- print(f"Failed to stop server on port {port}")
455
- print()
456
- print("Troubleshooting:")
457
- print(" • Check if server is running: claude-mpm monitor status")
458
- print(f" • Try force kill: kill $(lsof -ti :{port})")
459
-
460
- return success
461
-
462
- except Exception as e:
463
- print(f"Error stopping server: {e}")
464
- return False
213
+ message = "Unified monitor daemon is not running"
465
214
 
215
+ return CommandResult.success_result(message, data=status_data)
466
216
 
467
- def _status_server(args, server_manager):
468
- """
469
- Check the status of Socket.IO monitoring servers.
470
-
471
- WHY: Users need to check if the monitoring server is running, what port
472
- it's using, and other diagnostic information without starting/stopping it.
473
- Enhanced to show what processes are using ports.
474
-
475
- Args:
476
- args: Command arguments with optional verbose flag
477
- server_manager: ServerManager instance
478
217
 
479
- Returns:
480
- bool: True if status check succeeded, False otherwise
218
+ def manage_monitor(args):
481
219
  """
482
- verbose = getattr(args, "verbose", False)
483
- show_ports = getattr(args, "show_ports", False)
484
-
485
- print("Checking Socket.IO monitoring server status...")
486
- print()
487
-
488
- try:
489
- # Check for daemon server using socketio_daemon.py
490
- daemon_script = server_manager.daemon_script
491
- if daemon_script and daemon_script.exists():
492
- # Try to get status from daemon
493
- result = subprocess.run(
494
- [sys.executable, str(daemon_script), "status"],
495
- capture_output=True,
496
- text=True,
497
- check=False,
498
- )
499
-
500
- if result.returncode == 0 and result.stdout:
501
- # Daemon provided status information
502
- print(result.stdout)
503
-
504
- if verbose:
505
- # Show additional information
506
- print("\nAdditional Details:")
507
- print("─" * 40)
508
-
509
- # List all running servers from ServerManager
510
- running_servers = server_manager.list_running_servers()
511
- if running_servers:
512
- print(f"Found {len(running_servers)} running server(s):")
513
- for server in running_servers:
514
- server_port = server.get("port", "unknown")
515
- server_id = server.get("server_id", "unknown")
516
- server_pid = server.get("pid", "unknown")
517
- print(f" • Server '{server_id}'")
518
- print(f" Port: {server_port}")
519
- print(f" PID: {server_pid}")
520
- else:
521
- print("No additional servers found via ServerManager")
522
-
523
- return True
524
-
525
- # Fall back to ServerManager's list_running_servers
526
- running_servers = server_manager.list_running_servers()
527
-
528
- if not running_servers:
529
- print("❌ No Socket.IO monitoring servers are currently running")
530
- print()
531
- print("To start a server:")
532
- print(" claude-mpm monitor start")
533
- print(" claude-mpm monitor start --port 8765")
534
- return True
535
-
536
- # Import PortManager for enhanced status
537
- from ...services.port_manager import PortManager
538
-
539
- port_manager = PortManager()
540
-
541
- # Display server information
542
- print(f"✅ Found {len(running_servers)} running server(s):")
543
- print()
544
-
545
- for server in running_servers:
546
- server_port = server.get("port", "unknown")
547
- server_id = server.get("server_id", "unknown")
548
- server_pid = server.get("pid", "unknown")
549
- server_host = server.get("host", "localhost")
550
-
551
- print(f"Server: {server_id}")
552
- print(f" • PID: {server_pid}")
553
- print(f" • Port: {server_port}")
554
- print(f" • Host: {server_host}")
555
- print(f" • WebSocket URL: ws://{server_host}:{server_port}")
556
-
557
- # Show port status if verbose
558
- if verbose and server_port != "unknown":
559
- port_status = port_manager.get_port_status(int(server_port))
560
- if port_status.get("process"):
561
- process = port_status["process"]
562
- print(
563
- f" • Process Type: {'Debug' if process['is_debug'] else 'Daemon' if process['is_daemon'] else 'Regular'}"
564
- )
220
+ Main entry point for monitor command.
565
221
 
566
- if verbose:
567
- # Check if port is actually listening
568
- try:
569
- import socket
570
-
571
- sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
572
- result = sock.connect_ex((server_host, server_port))
573
- sock.close()
574
- if result == 0:
575
- print(" • Status: ✅ Listening")
576
- else:
577
- print(" • Status: ⚠️ Not responding on port")
578
- except Exception as e:
579
- print(f" • Status: ❌ Error checking: {e}")
580
-
581
- print()
582
-
583
- # Show port range status if requested
584
- if show_ports or verbose:
585
- print("\nPort Range Status (8765-8785):")
586
- print("─" * 40)
587
- for check_port in range(8765, 8771): # Show first 6 ports
588
- status = port_manager.get_port_status(check_port)
589
- if status["available"]:
590
- print(f" Port {check_port}: ✅ Available")
591
- else:
592
- process = status.get("process")
593
- if process:
594
- if process["is_ours"]:
595
- if process["is_debug"]:
596
- print(
597
- f" Port {check_port}: 🔧 Debug script (PID: {process['pid']})"
598
- )
599
- elif process["is_daemon"]:
600
- print(
601
- f" Port {check_port}: 🚀 Daemon (PID: {process['pid']})"
602
- )
603
- else:
604
- print(
605
- f" Port {check_port}: 📦 Our process (PID: {process['pid']})"
606
- )
607
- else:
608
- print(
609
- f" Port {check_port}: ⛔ External ({process['name']})"
610
- )
611
- else:
612
- print(f" Port {check_port}: ❓ In use (unknown process)")
613
- print()
614
-
615
- print("Server management commands:")
616
- print(" Stop all: claude-mpm monitor stop")
617
- print(" Restart: claude-mpm monitor restart")
618
- print(" Reclaim: claude-mpm monitor start --force # Kill debug scripts")
619
- if len(running_servers) == 1:
620
- port = running_servers[0].get("port", 8765)
621
- print(f" Stop this: claude-mpm monitor stop --port {port}")
622
-
623
- return True
624
-
625
- except Exception as e:
626
- print(f"Error checking server status: {e}")
627
- print()
628
- print("Try manual checks:")
629
- print(" • Process list: ps aux | grep socketio")
630
- print(" • Port usage: lsof -i :8765")
631
- return False
632
-
633
-
634
- def _restart_server(args, server_manager):
222
+ The monitor command manages the unified monitoring daemon that provides
223
+ a single stable way to launch all monitoring functionality including
224
+ HTTP dashboard, Socket.IO events, real AST analysis, and Claude Code hooks.
635
225
  """
636
- Restart the Socket.IO monitoring server.
637
-
638
- WHY: Users need to restart the monitoring server to apply configuration
639
- changes or recover from error states.
226
+ command = MonitorCommand()
227
+ error = command.validate_args(args)
640
228
 
641
- Args:
642
- args: Command arguments with optional port
643
- server_manager: ServerManager instance
229
+ if error:
230
+ command.logger.error(error)
231
+ print(f"Error: {error}")
232
+ return 1
644
233
 
645
- Returns:
646
- bool: True if server restarted successfully, False otherwise
647
- """
648
- port = getattr(args, "port", None)
234
+ result = command.run(args)
649
235
 
650
- print("Restarting Socket.IO monitoring server...")
236
+ if result.success:
237
+ if result.message:
238
+ print(result.message)
239
+ if result.data and getattr(args, "verbose", False):
240
+ import json
651
241
 
652
- try:
653
- # If no port specified, find running servers to restart
654
- if port is None:
655
- running_servers = server_manager.list_running_servers()
656
- if not running_servers:
657
- print(
658
- "No running servers found. Starting new server on default port..."
659
- )
660
- return _start_server(args, server_manager)
661
-
662
- # Restart the first server found
663
- server = running_servers[0]
664
- port = server.get("port", 8765)
665
-
666
- print(f"Using port {port} for restart...")
667
-
668
- # Use ServerManager's restart method
669
- success = server_manager.restart_server(port=port)
670
-
671
- if success:
672
- print(f"Monitor server restarted successfully on port {port}")
673
- print()
674
- print("Server management commands:")
675
- print(" Status: claude-mpm monitor status")
676
- print(f" Stop: claude-mpm monitor stop --port {port}")
677
- print(f" Start: claude-mpm monitor start --port {port}")
678
- else:
679
- print(f"Failed to restart server on port {port}")
680
- print()
681
- print("Troubleshooting:")
682
- print(" • Try stopping and starting manually:")
683
- print(f" claude-mpm monitor stop --port {port}")
684
- print(f" claude-mpm monitor start --port {port}")
685
- print(" • Check server logs for errors")
686
-
687
- return success
688
-
689
- except Exception as e:
690
- print(f"Error restarting server: {e}")
691
- print()
692
- print("Fallback options:")
693
- print(" • Manual restart: stop then start")
694
- print(" • Check system resources and try again")
695
- return False
242
+ print(json.dumps(result.data, indent=2))
243
+ return 0
244
+ if result.message:
245
+ print(f"Error: {result.message}")
246
+ return 1