claude-mpm 4.1.26__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 (845) 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 +420 -158
  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/OUTPUT_STYLE.md +299 -29
  13. claude_mpm/agents/PM_INSTRUCTIONS.md +1159 -0
  14. claude_mpm/agents/WORKFLOW.md +355 -191
  15. claude_mpm/agents/agent_loader.py +40 -10
  16. claude_mpm/agents/agent_loader_integration.py +3 -2
  17. claude_mpm/agents/async_agent_loader.py +3 -3
  18. claude_mpm/agents/base_agent_loader.py +11 -9
  19. claude_mpm/agents/frontmatter_validator.py +291 -251
  20. claude_mpm/agents/system_agent_config.py +3 -2
  21. claude_mpm/agents/templates/README.md +465 -0
  22. claude_mpm/agents/templates/agent-manager.json +7 -4
  23. claude_mpm/agents/templates/{agentic_coder_optimizer.json → agentic-coder-optimizer.json} +33 -7
  24. claude_mpm/agents/templates/api_qa.json +16 -4
  25. claude_mpm/agents/templates/circuit_breakers.md +638 -0
  26. claude_mpm/agents/templates/clerk-ops.json +235 -0
  27. claude_mpm/agents/templates/code_analyzer.json +10 -4
  28. claude_mpm/agents/templates/content-agent.json +358 -0
  29. claude_mpm/agents/templates/dart_engineer.json +307 -0
  30. claude_mpm/agents/templates/data_engineer.json +87 -14
  31. claude_mpm/agents/templates/documentation.json +76 -13
  32. claude_mpm/agents/templates/engineer.json +43 -9
  33. claude_mpm/agents/templates/gcp_ops_agent.json +253 -0
  34. claude_mpm/agents/templates/git_file_tracking.md +584 -0
  35. claude_mpm/agents/templates/golang_engineer.json +270 -0
  36. claude_mpm/agents/templates/imagemagick.json +5 -2
  37. claude_mpm/agents/templates/java_engineer.json +346 -0
  38. claude_mpm/agents/templates/javascript_engineer_agent.json +380 -0
  39. claude_mpm/agents/templates/local_ops_agent.json +1840 -0
  40. claude_mpm/agents/templates/logs/prompts/agent_engineer_20250901_010124_142.md +400 -0
  41. claude_mpm/agents/templates/memory_manager.json +6 -3
  42. claude_mpm/agents/templates/nextjs_engineer.json +285 -0
  43. claude_mpm/agents/templates/ops.json +14 -4
  44. claude_mpm/agents/templates/php-engineer.json +287 -0
  45. claude_mpm/agents/templates/pm_examples.md +474 -0
  46. claude_mpm/agents/templates/pm_red_flags.md +262 -0
  47. claude_mpm/agents/templates/product_owner.json +338 -0
  48. claude_mpm/agents/templates/project_organizer.json +19 -5
  49. claude_mpm/agents/templates/prompt-engineer.json +737 -0
  50. claude_mpm/agents/templates/python_engineer.json +387 -0
  51. claude_mpm/agents/templates/qa.json +25 -5
  52. claude_mpm/agents/templates/react_engineer.json +239 -0
  53. claude_mpm/agents/templates/refactoring_engineer.json +15 -5
  54. claude_mpm/agents/templates/research.json +46 -21
  55. claude_mpm/agents/templates/response_format.md +583 -0
  56. claude_mpm/agents/templates/ruby-engineer.json +280 -0
  57. claude_mpm/agents/templates/rust_engineer.json +275 -0
  58. claude_mpm/agents/templates/security.json +59 -10
  59. claude_mpm/agents/templates/svelte-engineer.json +225 -0
  60. claude_mpm/agents/templates/tauri_engineer.json +274 -0
  61. claude_mpm/agents/templates/ticketing.json +16 -7
  62. claude_mpm/agents/templates/typescript_engineer.json +285 -0
  63. claude_mpm/agents/templates/validation_templates.md +312 -0
  64. claude_mpm/agents/templates/vercel_ops_agent.json +164 -33
  65. claude_mpm/agents/templates/version_control.json +16 -4
  66. claude_mpm/agents/templates/web_qa.json +167 -21
  67. claude_mpm/agents/templates/web_ui.json +18 -5
  68. claude_mpm/cli/__init__.py +38 -378
  69. claude_mpm/cli/commands/__init__.py +2 -0
  70. claude_mpm/cli/commands/agent_manager.py +675 -20
  71. claude_mpm/cli/commands/agent_state_manager.py +186 -0
  72. claude_mpm/cli/commands/agents.py +722 -150
  73. claude_mpm/cli/commands/agents_detect.py +380 -0
  74. claude_mpm/cli/commands/agents_recommend.py +309 -0
  75. claude_mpm/cli/commands/aggregate.py +10 -6
  76. claude_mpm/cli/commands/analyze.py +15 -10
  77. claude_mpm/cli/commands/analyze_code.py +8 -4
  78. claude_mpm/cli/commands/auto_configure.py +570 -0
  79. claude_mpm/cli/commands/cleanup.py +12 -12
  80. claude_mpm/cli/commands/config.py +47 -13
  81. claude_mpm/cli/commands/configure.py +469 -1064
  82. claude_mpm/cli/commands/configure_agent_display.py +261 -0
  83. claude_mpm/cli/commands/configure_behavior_manager.py +204 -0
  84. claude_mpm/cli/commands/configure_hook_manager.py +225 -0
  85. claude_mpm/cli/commands/configure_models.py +18 -0
  86. claude_mpm/cli/commands/configure_navigation.py +167 -0
  87. claude_mpm/cli/commands/configure_paths.py +104 -0
  88. claude_mpm/cli/commands/configure_persistence.py +254 -0
  89. claude_mpm/cli/commands/configure_startup_manager.py +646 -0
  90. claude_mpm/cli/commands/configure_template_editor.py +497 -0
  91. claude_mpm/cli/commands/configure_validators.py +73 -0
  92. claude_mpm/cli/commands/dashboard.py +50 -52
  93. claude_mpm/cli/commands/debug.py +7 -7
  94. claude_mpm/cli/commands/doctor.py +43 -7
  95. claude_mpm/cli/commands/info.py +3 -4
  96. claude_mpm/cli/commands/local_deploy.py +537 -0
  97. claude_mpm/cli/commands/mcp.py +17 -10
  98. claude_mpm/cli/commands/mcp_command_router.py +11 -0
  99. claude_mpm/cli/commands/mcp_config.py +154 -0
  100. claude_mpm/cli/commands/mcp_external_commands.py +249 -0
  101. claude_mpm/cli/commands/mcp_install_commands.py +101 -32
  102. claude_mpm/cli/commands/mcp_pipx_config.py +2 -2
  103. claude_mpm/cli/commands/mcp_setup_external.py +868 -0
  104. claude_mpm/cli/commands/memory.py +55 -21
  105. claude_mpm/cli/commands/monitor.py +160 -70
  106. claude_mpm/cli/commands/mpm_init/__init__.py +73 -0
  107. claude_mpm/cli/commands/mpm_init/core.py +525 -0
  108. claude_mpm/cli/commands/mpm_init/display.py +341 -0
  109. claude_mpm/cli/commands/mpm_init/git_activity.py +427 -0
  110. claude_mpm/cli/commands/mpm_init/modes.py +397 -0
  111. claude_mpm/cli/commands/mpm_init/prompts.py +442 -0
  112. claude_mpm/cli/commands/mpm_init_cli.py +396 -0
  113. claude_mpm/cli/commands/mpm_init_handler.py +114 -4
  114. claude_mpm/cli/commands/run.py +169 -42
  115. claude_mpm/cli/commands/search.py +458 -0
  116. claude_mpm/cli/commands/skills.py +488 -0
  117. claude_mpm/cli/commands/uninstall.py +176 -0
  118. claude_mpm/cli/commands/upgrade.py +152 -0
  119. claude_mpm/cli/commands/verify.py +119 -0
  120. claude_mpm/cli/executor.py +204 -0
  121. claude_mpm/cli/helpers.py +105 -0
  122. claude_mpm/cli/interactive/__init__.py +21 -0
  123. claude_mpm/cli/interactive/agent_wizard.py +962 -0
  124. claude_mpm/cli/interactive/skills_wizard.py +491 -0
  125. claude_mpm/cli/parser.py +79 -2
  126. claude_mpm/cli/parsers/__init__.py +7 -1
  127. claude_mpm/cli/parsers/agent_manager_parser.py +161 -1
  128. claude_mpm/cli/parsers/agents_parser.py +116 -0
  129. claude_mpm/cli/parsers/auto_configure_parser.py +245 -0
  130. claude_mpm/cli/parsers/base_parser.py +143 -3
  131. claude_mpm/cli/parsers/configure_parser.py +11 -15
  132. claude_mpm/cli/parsers/local_deploy_parser.py +227 -0
  133. claude_mpm/cli/parsers/mcp_parser.py +15 -0
  134. claude_mpm/cli/parsers/monitor_parser.py +12 -2
  135. claude_mpm/cli/parsers/mpm_init_parser.py +179 -9
  136. claude_mpm/cli/parsers/run_parser.py +5 -0
  137. claude_mpm/cli/parsers/search_parser.py +245 -0
  138. claude_mpm/cli/parsers/skills_parser.py +137 -0
  139. claude_mpm/cli/shared/argument_patterns.py +20 -13
  140. claude_mpm/cli/shared/base_command.py +2 -2
  141. claude_mpm/cli/shared/output_formatters.py +28 -19
  142. claude_mpm/cli/startup.py +562 -0
  143. claude_mpm/cli/startup_logging.py +179 -13
  144. claude_mpm/cli/utils.py +53 -2
  145. claude_mpm/commands/mpm-agents-detect.md +168 -0
  146. claude_mpm/commands/mpm-agents-recommend.md +214 -0
  147. claude_mpm/commands/mpm-agents.md +118 -8
  148. claude_mpm/commands/mpm-auto-configure.md +269 -0
  149. claude_mpm/commands/mpm-config.md +137 -14
  150. claude_mpm/commands/mpm-help.md +285 -5
  151. claude_mpm/commands/mpm-init.md +374 -15
  152. claude_mpm/commands/mpm-monitor.md +409 -0
  153. claude_mpm/commands/mpm-organize.md +295 -0
  154. claude_mpm/commands/mpm-resume.md +372 -0
  155. claude_mpm/commands/mpm-status.md +71 -9
  156. claude_mpm/commands/mpm-tickets.md +56 -7
  157. claude_mpm/commands/mpm-version.md +113 -0
  158. claude_mpm/commands/mpm.md +2 -0
  159. claude_mpm/config/agent_config.py +4 -4
  160. claude_mpm/config/experimental_features.py +7 -7
  161. claude_mpm/config/model_config.py +428 -0
  162. claude_mpm/config/paths.py +3 -2
  163. claude_mpm/config/socketio_config.py +3 -3
  164. claude_mpm/constants.py +15 -1
  165. claude_mpm/core/__init__.py +53 -17
  166. claude_mpm/core/agent_name_normalizer.py +3 -2
  167. claude_mpm/core/agent_registry.py +2 -2
  168. claude_mpm/core/agent_session_manager.py +10 -10
  169. claude_mpm/core/api_validator.py +330 -0
  170. claude_mpm/core/base_service.py +33 -23
  171. claude_mpm/core/cache.py +9 -9
  172. claude_mpm/core/claude_runner.py +19 -8
  173. claude_mpm/core/config.py +85 -8
  174. claude_mpm/core/config_aliases.py +7 -6
  175. claude_mpm/core/constants.py +65 -0
  176. claude_mpm/core/container.py +11 -5
  177. claude_mpm/core/enums.py +452 -0
  178. claude_mpm/core/error_handler.py +623 -0
  179. claude_mpm/core/factories.py +1 -1
  180. claude_mpm/core/file_utils.py +764 -0
  181. claude_mpm/core/framework/__init__.py +38 -0
  182. claude_mpm/core/framework/formatters/__init__.py +11 -0
  183. claude_mpm/core/framework/formatters/capability_generator.py +367 -0
  184. claude_mpm/core/framework/formatters/content_formatter.py +288 -0
  185. claude_mpm/core/framework/formatters/context_generator.py +185 -0
  186. claude_mpm/core/framework/loaders/__init__.py +13 -0
  187. claude_mpm/core/framework/loaders/agent_loader.py +210 -0
  188. claude_mpm/core/framework/loaders/file_loader.py +223 -0
  189. claude_mpm/core/framework/loaders/instruction_loader.py +161 -0
  190. claude_mpm/core/framework/loaders/packaged_loader.py +232 -0
  191. claude_mpm/core/framework/processors/__init__.py +11 -0
  192. claude_mpm/core/framework/processors/memory_processor.py +230 -0
  193. claude_mpm/core/framework/processors/metadata_processor.py +146 -0
  194. claude_mpm/core/framework/processors/template_processor.py +244 -0
  195. claude_mpm/core/framework_loader.py +321 -1631
  196. claude_mpm/core/hook_manager.py +8 -6
  197. claude_mpm/core/injectable_service.py +11 -8
  198. claude_mpm/core/instruction_reinforcement_hook.py +4 -3
  199. claude_mpm/core/interactive_session.py +55 -8
  200. claude_mpm/core/interfaces.py +56 -1
  201. claude_mpm/core/lazy.py +3 -3
  202. claude_mpm/core/log_manager.py +92 -23
  203. claude_mpm/core/logger.py +19 -14
  204. claude_mpm/core/logging_config.py +6 -2
  205. claude_mpm/core/logging_utils.py +520 -0
  206. claude_mpm/core/oneshot_session.py +51 -7
  207. claude_mpm/core/optimized_agent_loader.py +9 -9
  208. claude_mpm/core/optimized_startup.py +1 -1
  209. claude_mpm/core/output_style_manager.py +12 -192
  210. claude_mpm/core/pm_hook_interceptor.py +18 -12
  211. claude_mpm/core/service_registry.py +7 -3
  212. claude_mpm/core/session_manager.py +14 -12
  213. claude_mpm/core/shared/config_loader.py +1 -1
  214. claude_mpm/core/socketio_pool.py +15 -15
  215. claude_mpm/core/tool_access_control.py +3 -2
  216. claude_mpm/core/types.py +4 -11
  217. claude_mpm/core/typing_utils.py +7 -6
  218. claude_mpm/core/unified_agent_registry.py +115 -11
  219. claude_mpm/core/unified_config.py +6 -6
  220. claude_mpm/core/unified_paths.py +23 -20
  221. claude_mpm/dashboard/analysis_runner.py +4 -4
  222. claude_mpm/dashboard/api/simple_directory.py +261 -0
  223. claude_mpm/dashboard/react/components/DataInspector/DataInspector.module.css +188 -0
  224. claude_mpm/dashboard/react/components/EventViewer/EventViewer.module.css +156 -0
  225. claude_mpm/dashboard/react/components/shared/ConnectionStatus.module.css +38 -0
  226. claude_mpm/dashboard/react/components/shared/FilterBar.module.css +92 -0
  227. claude_mpm/dashboard/static/archive/activity_dashboard_fixed.html +248 -0
  228. claude_mpm/dashboard/static/archive/activity_dashboard_test.html +61 -0
  229. claude_mpm/dashboard/static/archive/test_activity_connection.html +179 -0
  230. claude_mpm/dashboard/static/archive/test_claude_tree_tab.html +68 -0
  231. claude_mpm/dashboard/static/archive/test_dashboard.html +409 -0
  232. claude_mpm/dashboard/static/archive/test_dashboard_fixed.html +519 -0
  233. claude_mpm/dashboard/static/archive/test_dashboard_verification.html +181 -0
  234. claude_mpm/dashboard/static/archive/test_file_data.html +315 -0
  235. claude_mpm/dashboard/static/archive/test_file_tree_empty_state.html +243 -0
  236. claude_mpm/dashboard/static/archive/test_file_tree_fix.html +234 -0
  237. claude_mpm/dashboard/static/archive/test_file_tree_rename.html +117 -0
  238. claude_mpm/dashboard/static/archive/test_file_tree_tab.html +115 -0
  239. claude_mpm/dashboard/static/archive/test_file_viewer.html +224 -0
  240. claude_mpm/dashboard/static/archive/test_final_activity.html +220 -0
  241. claude_mpm/dashboard/static/archive/test_tab_fix.html +139 -0
  242. claude_mpm/dashboard/static/built/assets/events.DjpNxWNo.css +1 -0
  243. claude_mpm/dashboard/static/built/components/activity-tree.js +1 -1
  244. claude_mpm/dashboard/static/built/components/agent-hierarchy.js +777 -0
  245. claude_mpm/dashboard/static/built/components/agent-inference.js +1 -1
  246. claude_mpm/dashboard/static/built/components/build-tracker.js +333 -0
  247. claude_mpm/dashboard/static/built/components/code-simple.js +857 -0
  248. claude_mpm/dashboard/static/built/components/code-tree/tree-breadcrumb.js +353 -0
  249. claude_mpm/dashboard/static/built/components/code-tree/tree-constants.js +235 -0
  250. claude_mpm/dashboard/static/built/components/code-tree/tree-search.js +409 -0
  251. claude_mpm/dashboard/static/built/components/code-tree/tree-utils.js +435 -0
  252. claude_mpm/dashboard/static/built/components/code-tree.js +1 -1
  253. claude_mpm/dashboard/static/built/components/code-viewer.js +1 -1
  254. claude_mpm/dashboard/static/built/components/connection-debug.js +654 -0
  255. claude_mpm/dashboard/static/built/components/diff-viewer.js +891 -0
  256. claude_mpm/dashboard/static/built/components/event-processor.js +1 -1
  257. claude_mpm/dashboard/static/built/components/event-viewer.js +1 -1
  258. claude_mpm/dashboard/static/built/components/export-manager.js +1 -1
  259. claude_mpm/dashboard/static/built/components/file-change-tracker.js +443 -0
  260. claude_mpm/dashboard/static/built/components/file-change-viewer.js +690 -0
  261. claude_mpm/dashboard/static/built/components/file-tool-tracker.js +1 -1
  262. claude_mpm/dashboard/static/built/components/file-viewer.js +2 -0
  263. claude_mpm/dashboard/static/built/components/module-viewer.js +1 -1
  264. claude_mpm/dashboard/static/built/components/nav-bar.js +145 -0
  265. claude_mpm/dashboard/static/built/components/page-structure.js +429 -0
  266. claude_mpm/dashboard/static/built/components/session-manager.js +1 -1
  267. claude_mpm/dashboard/static/built/components/unified-data-viewer.js +1 -1
  268. claude_mpm/dashboard/static/built/components/working-directory.js +1 -1
  269. claude_mpm/dashboard/static/built/connection-manager.js +536 -0
  270. claude_mpm/dashboard/static/built/dashboard.js +1 -1
  271. claude_mpm/dashboard/static/built/extension-error-handler.js +164 -0
  272. claude_mpm/dashboard/static/built/react/events.js +30 -0
  273. claude_mpm/dashboard/static/built/shared/dom-helpers.js +396 -0
  274. claude_mpm/dashboard/static/built/shared/event-bus.js +330 -0
  275. claude_mpm/dashboard/static/built/shared/event-filter-service.js +540 -0
  276. claude_mpm/dashboard/static/built/shared/logger.js +385 -0
  277. claude_mpm/dashboard/static/built/shared/page-structure.js +249 -0
  278. claude_mpm/dashboard/static/built/shared/tooltip-service.js +253 -0
  279. claude_mpm/dashboard/static/built/socket-client.js +1 -1
  280. claude_mpm/dashboard/static/built/tab-isolation-fix.js +185 -0
  281. claude_mpm/dashboard/static/css/dashboard.css +588 -6
  282. claude_mpm/dashboard/static/dist/assets/events.DjpNxWNo.css +1 -0
  283. claude_mpm/dashboard/static/dist/components/activity-tree.js +1 -1
  284. claude_mpm/dashboard/static/dist/components/agent-inference.js +1 -1
  285. claude_mpm/dashboard/static/dist/components/code-tree.js +1 -1
  286. claude_mpm/dashboard/static/dist/components/code-viewer.js +1 -1
  287. claude_mpm/dashboard/static/dist/components/event-processor.js +1 -1
  288. claude_mpm/dashboard/static/dist/components/event-viewer.js +1 -1
  289. claude_mpm/dashboard/static/dist/components/export-manager.js +1 -1
  290. claude_mpm/dashboard/static/dist/components/file-tool-tracker.js +1 -1
  291. claude_mpm/dashboard/static/dist/components/file-viewer.js +2 -0
  292. claude_mpm/dashboard/static/dist/components/module-viewer.js +1 -1
  293. claude_mpm/dashboard/static/dist/components/session-manager.js +1 -1
  294. claude_mpm/dashboard/static/dist/components/unified-data-viewer.js +1 -1
  295. claude_mpm/dashboard/static/dist/components/working-directory.js +1 -1
  296. claude_mpm/dashboard/static/dist/dashboard.js +1 -1
  297. claude_mpm/dashboard/static/dist/react/events.js +30 -0
  298. claude_mpm/dashboard/static/dist/socket-client.js +1 -1
  299. claude_mpm/dashboard/static/events.html +607 -0
  300. claude_mpm/dashboard/static/index.html +635 -0
  301. claude_mpm/dashboard/static/js/components/activity-tree.js +3 -17
  302. claude_mpm/dashboard/static/js/components/agent-hierarchy.js +4 -1
  303. claude_mpm/dashboard/static/js/components/agent-inference.js +3 -0
  304. claude_mpm/dashboard/static/js/components/build-tracker.js +8 -0
  305. claude_mpm/dashboard/static/js/components/code-simple.js +857 -0
  306. claude_mpm/dashboard/static/js/components/diff-viewer.js +891 -0
  307. claude_mpm/dashboard/static/js/components/event-processor.js +3 -0
  308. claude_mpm/dashboard/static/js/components/event-viewer.js +39 -2
  309. claude_mpm/dashboard/static/js/components/export-manager.js +3 -0
  310. claude_mpm/dashboard/static/js/components/file-change-tracker.js +443 -0
  311. claude_mpm/dashboard/static/js/components/file-change-viewer.js +690 -0
  312. claude_mpm/dashboard/static/js/components/file-tool-tracker.js +30 -10
  313. claude_mpm/dashboard/static/js/components/file-viewer.js +580 -0
  314. claude_mpm/dashboard/static/js/components/module-viewer.js +26 -0
  315. claude_mpm/dashboard/static/js/components/session-manager.js +7 -7
  316. claude_mpm/dashboard/static/js/components/socket-manager.js +4 -0
  317. claude_mpm/dashboard/static/js/components/ui-state-manager.js +356 -41
  318. claude_mpm/dashboard/static/js/components/unified-data-viewer.js +455 -23
  319. claude_mpm/dashboard/static/js/components/working-directory.js +44 -9
  320. claude_mpm/dashboard/static/js/dashboard.js +245 -132
  321. claude_mpm/dashboard/static/js/shared/dom-helpers.js +396 -0
  322. claude_mpm/dashboard/static/js/shared/event-bus.js +330 -0
  323. claude_mpm/dashboard/static/js/shared/logger.js +385 -0
  324. claude_mpm/dashboard/static/js/shared/tooltip-service.js +253 -0
  325. claude_mpm/dashboard/static/js/socket-client.js +49 -22
  326. claude_mpm/dashboard/static/js/stores/dashboard-store.js +562 -0
  327. claude_mpm/dashboard/static/js/tab-isolation-fix.js +185 -0
  328. claude_mpm/dashboard/static/legacy/activity.html +736 -0
  329. claude_mpm/dashboard/static/legacy/agents.html +786 -0
  330. claude_mpm/dashboard/static/legacy/files.html +747 -0
  331. claude_mpm/dashboard/static/legacy/tools.html +831 -0
  332. claude_mpm/dashboard/static/monitors.html +431 -0
  333. claude_mpm/dashboard/static/production/events.html +659 -0
  334. claude_mpm/dashboard/static/production/main.html +698 -0
  335. claude_mpm/dashboard/static/production/monitors.html +483 -0
  336. claude_mpm/dashboard/static/socket.io.min.js +7 -0
  337. claude_mpm/dashboard/static/socket.io.v4.8.1.backup.js +7 -0
  338. claude_mpm/dashboard/static/test-archive/dashboard.html +635 -0
  339. claude_mpm/dashboard/static/test-archive/debug-events.html +147 -0
  340. claude_mpm/dashboard/static/test-archive/test-navigation.html +256 -0
  341. claude_mpm/dashboard/static/test-archive/test-react-exports.html +180 -0
  342. claude_mpm/dashboard/static/test-archive/test_debug.html +25 -0
  343. claude_mpm/dashboard/templates/code_simple.html +153 -0
  344. claude_mpm/dashboard/templates/index.html +112 -109
  345. claude_mpm/experimental/cli_enhancements.py +4 -2
  346. claude_mpm/generators/agent_profile_generator.py +5 -3
  347. claude_mpm/hooks/__init__.py +37 -1
  348. claude_mpm/hooks/base_hook.py +5 -4
  349. claude_mpm/hooks/claude_hooks/connection_pool.py +4 -4
  350. claude_mpm/hooks/claude_hooks/event_handlers.py +21 -18
  351. claude_mpm/hooks/claude_hooks/hook_handler.py +29 -22
  352. claude_mpm/hooks/claude_hooks/installer.py +67 -22
  353. claude_mpm/hooks/claude_hooks/memory_integration.py +3 -3
  354. claude_mpm/hooks/claude_hooks/response_tracking.py +57 -17
  355. claude_mpm/hooks/claude_hooks/services/connection_manager.py +62 -64
  356. claude_mpm/hooks/claude_hooks/services/connection_manager_http.py +140 -76
  357. claude_mpm/hooks/claude_hooks/services/state_manager.py +11 -9
  358. claude_mpm/hooks/claude_hooks/services/subagent_processor.py +3 -3
  359. claude_mpm/hooks/failure_learning/__init__.py +60 -0
  360. claude_mpm/hooks/failure_learning/failure_detection_hook.py +235 -0
  361. claude_mpm/hooks/failure_learning/fix_detection_hook.py +217 -0
  362. claude_mpm/hooks/failure_learning/learning_extraction_hook.py +286 -0
  363. claude_mpm/hooks/instruction_reinforcement.py +301 -0
  364. claude_mpm/hooks/kuzu_enrichment_hook.py +263 -0
  365. claude_mpm/hooks/kuzu_memory_hook.py +386 -0
  366. claude_mpm/hooks/kuzu_response_hook.py +183 -0
  367. claude_mpm/hooks/memory_integration_hook.py +1 -1
  368. claude_mpm/hooks/session_resume_hook.py +121 -0
  369. claude_mpm/hooks/templates/pre_tool_use_simple.py +78 -0
  370. claude_mpm/hooks/templates/pre_tool_use_template.py +323 -0
  371. claude_mpm/hooks/tool_call_interceptor.py +8 -5
  372. claude_mpm/hooks/validation_hooks.py +3 -3
  373. claude_mpm/init.py +23 -4
  374. claude_mpm/models/agent_session.py +8 -6
  375. claude_mpm/models/resume_log.py +340 -0
  376. claude_mpm/scripts/claude-hook-handler.sh +33 -7
  377. claude_mpm/scripts/launch_monitor.py +85 -0
  378. claude_mpm/scripts/mcp_server.py +3 -5
  379. claude_mpm/scripts/mpm_doctor.py +3 -2
  380. claude_mpm/scripts/socketio_daemon.py +159 -512
  381. claude_mpm/services/__init__.py +144 -160
  382. claude_mpm/services/agents/__init__.py +18 -5
  383. claude_mpm/services/agents/agent_builder.py +13 -11
  384. claude_mpm/services/agents/auto_config_manager.py +796 -0
  385. claude_mpm/services/agents/deployment/agent_configuration_manager.py +1 -1
  386. claude_mpm/services/agents/deployment/agent_deployment.py +38 -15
  387. claude_mpm/services/agents/deployment/agent_discovery_service.py +125 -7
  388. claude_mpm/services/agents/deployment/agent_filesystem_manager.py +5 -5
  389. claude_mpm/services/agents/deployment/agent_format_converter.py +56 -12
  390. claude_mpm/services/agents/deployment/agent_lifecycle_manager.py +4 -2
  391. claude_mpm/services/agents/deployment/agent_operation_service.py +2 -2
  392. claude_mpm/services/agents/deployment/agent_record_service.py +4 -4
  393. claude_mpm/services/agents/deployment/agent_state_service.py +2 -2
  394. claude_mpm/services/agents/deployment/agent_template_builder.py +715 -47
  395. claude_mpm/services/agents/deployment/agent_validator.py +31 -7
  396. claude_mpm/services/agents/deployment/agent_version_manager.py +8 -5
  397. claude_mpm/services/agents/deployment/agent_versioning.py +1 -1
  398. claude_mpm/services/agents/deployment/async_agent_deployment.py +1 -1
  399. claude_mpm/services/agents/deployment/deployment_config_loader.py +131 -7
  400. claude_mpm/services/agents/deployment/deployment_type_detector.py +10 -14
  401. claude_mpm/services/agents/deployment/deployment_wrapper.py +58 -0
  402. claude_mpm/services/agents/deployment/interface_adapter.py +3 -2
  403. claude_mpm/services/agents/deployment/local_template_deployment.py +360 -0
  404. claude_mpm/services/agents/deployment/multi_source_deployment_service.py +134 -38
  405. claude_mpm/services/agents/deployment/pipeline/steps/agent_processing_step.py +8 -7
  406. claude_mpm/services/agents/deployment/pipeline/steps/base_step.py +7 -16
  407. claude_mpm/services/agents/deployment/pipeline/steps/configuration_step.py +4 -3
  408. claude_mpm/services/agents/deployment/pipeline/steps/target_directory_step.py +7 -5
  409. claude_mpm/services/agents/deployment/pipeline/steps/validation_step.py +6 -5
  410. claude_mpm/services/agents/deployment/refactored_agent_deployment_service.py +9 -6
  411. claude_mpm/services/agents/deployment/system_instructions_deployer.py +9 -6
  412. claude_mpm/services/agents/deployment/validation/__init__.py +3 -1
  413. claude_mpm/services/agents/deployment/validation/template_validator.py +64 -44
  414. claude_mpm/services/agents/deployment/validation/validation_result.py +1 -9
  415. claude_mpm/services/agents/loading/agent_profile_loader.py +10 -9
  416. claude_mpm/services/agents/loading/base_agent_manager.py +16 -6
  417. claude_mpm/services/agents/loading/framework_agent_loader.py +2 -2
  418. claude_mpm/services/agents/local_template_manager.py +744 -0
  419. claude_mpm/services/agents/management/agent_capabilities_generator.py +3 -2
  420. claude_mpm/services/agents/management/agent_management_service.py +5 -5
  421. claude_mpm/services/agents/memory/agent_memory_manager.py +32 -29
  422. claude_mpm/services/agents/memory/content_manager.py +17 -9
  423. claude_mpm/services/agents/memory/memory_categorization_service.py +4 -2
  424. claude_mpm/services/agents/memory/memory_file_service.py +32 -6
  425. claude_mpm/services/agents/memory/memory_format_service.py +6 -4
  426. claude_mpm/services/agents/memory/memory_limits_service.py +4 -2
  427. claude_mpm/services/agents/memory/template_generator.py +3 -3
  428. claude_mpm/services/agents/observers.py +547 -0
  429. claude_mpm/services/agents/recommender.py +615 -0
  430. claude_mpm/services/agents/registry/deployed_agent_discovery.py +3 -3
  431. claude_mpm/services/agents/registry/modification_tracker.py +30 -19
  432. claude_mpm/services/async_session_logger.py +141 -98
  433. claude_mpm/services/claude_session_logger.py +82 -74
  434. claude_mpm/services/cli/agent_cleanup_service.py +5 -0
  435. claude_mpm/services/cli/agent_listing_service.py +5 -5
  436. claude_mpm/services/cli/agent_validation_service.py +3 -1
  437. claude_mpm/services/cli/memory_crud_service.py +12 -7
  438. claude_mpm/services/cli/memory_output_formatter.py +2 -2
  439. claude_mpm/services/cli/resume_service.py +617 -0
  440. claude_mpm/services/cli/session_manager.py +104 -13
  441. claude_mpm/services/cli/session_pause_manager.py +504 -0
  442. claude_mpm/services/cli/session_resume_helper.py +372 -0
  443. claude_mpm/services/cli/startup_checker.py +13 -10
  444. claude_mpm/services/cli/unified_dashboard_manager.py +439 -0
  445. claude_mpm/services/command_deployment_service.py +9 -7
  446. claude_mpm/services/command_handler_service.py +11 -5
  447. claude_mpm/services/core/__init__.py +33 -1
  448. claude_mpm/services/core/base.py +26 -11
  449. claude_mpm/services/core/interfaces/__init__.py +90 -3
  450. claude_mpm/services/core/interfaces/agent.py +184 -0
  451. claude_mpm/services/core/interfaces/health.py +172 -0
  452. claude_mpm/services/core/interfaces/model.py +281 -0
  453. claude_mpm/services/core/interfaces/process.py +372 -0
  454. claude_mpm/services/core/interfaces/project.py +121 -0
  455. claude_mpm/services/core/interfaces/restart.py +307 -0
  456. claude_mpm/services/core/interfaces/stability.py +260 -0
  457. claude_mpm/services/core/interfaces.py +56 -1
  458. claude_mpm/services/core/memory_manager.py +92 -47
  459. claude_mpm/services/core/models/__init__.py +79 -0
  460. claude_mpm/services/core/models/agent_config.py +384 -0
  461. claude_mpm/services/core/models/health.py +162 -0
  462. claude_mpm/services/core/models/process.py +239 -0
  463. claude_mpm/services/core/models/restart.py +302 -0
  464. claude_mpm/services/core/models/stability.py +264 -0
  465. claude_mpm/services/core/models/toolchain.py +306 -0
  466. claude_mpm/services/core/path_resolver.py +36 -14
  467. claude_mpm/services/diagnostics/__init__.py +2 -2
  468. claude_mpm/services/diagnostics/checks/__init__.py +4 -2
  469. claude_mpm/services/diagnostics/checks/agent_check.py +30 -32
  470. claude_mpm/services/diagnostics/checks/claude_code_check.py +270 -0
  471. claude_mpm/services/diagnostics/checks/common_issues_check.py +28 -27
  472. claude_mpm/services/diagnostics/checks/configuration_check.py +26 -25
  473. claude_mpm/services/diagnostics/checks/filesystem_check.py +18 -17
  474. claude_mpm/services/diagnostics/checks/installation_check.py +165 -60
  475. claude_mpm/services/diagnostics/checks/instructions_check.py +20 -19
  476. claude_mpm/services/diagnostics/checks/mcp_check.py +57 -43
  477. claude_mpm/services/diagnostics/checks/mcp_services_check.py +1066 -0
  478. claude_mpm/services/diagnostics/checks/monitor_check.py +24 -23
  479. claude_mpm/services/diagnostics/checks/startup_log_check.py +14 -11
  480. claude_mpm/services/diagnostics/diagnostic_runner.py +22 -13
  481. claude_mpm/services/diagnostics/doctor_reporter.py +275 -47
  482. claude_mpm/services/diagnostics/models.py +37 -21
  483. claude_mpm/services/event_aggregator.py +5 -3
  484. claude_mpm/services/event_bus/direct_relay.py +8 -4
  485. claude_mpm/services/event_bus/event_bus.py +51 -9
  486. claude_mpm/services/event_bus/relay.py +33 -14
  487. claude_mpm/services/events/consumers/dead_letter.py +7 -5
  488. claude_mpm/services/events/core.py +5 -6
  489. claude_mpm/services/events/producers/hook.py +6 -6
  490. claude_mpm/services/events/producers/system.py +8 -8
  491. claude_mpm/services/exceptions.py +5 -5
  492. claude_mpm/services/framework_claude_md_generator/__init__.py +1 -1
  493. claude_mpm/services/framework_claude_md_generator/content_assembler.py +5 -5
  494. claude_mpm/services/framework_claude_md_generator/content_validator.py +2 -2
  495. claude_mpm/services/framework_claude_md_generator/deployment_manager.py +3 -3
  496. claude_mpm/services/framework_claude_md_generator/section_generators/__init__.py +2 -2
  497. claude_mpm/services/framework_claude_md_generator/version_manager.py +1 -1
  498. claude_mpm/services/hook_installer_service.py +506 -0
  499. claude_mpm/services/hook_service.py +5 -6
  500. claude_mpm/services/infrastructure/context_preservation.py +13 -11
  501. claude_mpm/services/infrastructure/daemon_manager.py +9 -9
  502. claude_mpm/services/infrastructure/logging.py +2 -2
  503. claude_mpm/services/infrastructure/monitoring/__init__.py +1 -1
  504. claude_mpm/services/infrastructure/monitoring/aggregator.py +12 -12
  505. claude_mpm/services/infrastructure/monitoring/base.py +5 -13
  506. claude_mpm/services/infrastructure/monitoring/network.py +7 -6
  507. claude_mpm/services/infrastructure/monitoring/process.py +13 -12
  508. claude_mpm/services/infrastructure/monitoring/resources.py +8 -7
  509. claude_mpm/services/infrastructure/monitoring/service.py +16 -15
  510. claude_mpm/services/infrastructure/resume_log_generator.py +439 -0
  511. claude_mpm/services/local_ops/__init__.py +165 -0
  512. claude_mpm/services/local_ops/crash_detector.py +257 -0
  513. claude_mpm/services/local_ops/health_checks/__init__.py +28 -0
  514. claude_mpm/services/local_ops/health_checks/http_check.py +224 -0
  515. claude_mpm/services/local_ops/health_checks/process_check.py +236 -0
  516. claude_mpm/services/local_ops/health_checks/resource_check.py +255 -0
  517. claude_mpm/services/local_ops/health_manager.py +430 -0
  518. claude_mpm/services/local_ops/log_monitor.py +396 -0
  519. claude_mpm/services/local_ops/memory_leak_detector.py +294 -0
  520. claude_mpm/services/local_ops/process_manager.py +595 -0
  521. claude_mpm/services/local_ops/resource_monitor.py +331 -0
  522. claude_mpm/services/local_ops/restart_manager.py +401 -0
  523. claude_mpm/services/local_ops/restart_policy.py +387 -0
  524. claude_mpm/services/local_ops/state_manager.py +372 -0
  525. claude_mpm/services/local_ops/unified_manager.py +600 -0
  526. claude_mpm/services/mcp_config_manager.py +1612 -0
  527. claude_mpm/services/mcp_gateway/__init__.py +97 -93
  528. claude_mpm/services/mcp_gateway/auto_configure.py +43 -38
  529. claude_mpm/services/mcp_gateway/config/config_loader.py +3 -3
  530. claude_mpm/services/mcp_gateway/config/configuration.py +23 -4
  531. claude_mpm/services/mcp_gateway/core/__init__.py +1 -2
  532. claude_mpm/services/mcp_gateway/core/base.py +20 -33
  533. claude_mpm/services/mcp_gateway/core/process_pool.py +585 -31
  534. claude_mpm/services/mcp_gateway/core/singleton_manager.py +2 -2
  535. claude_mpm/services/mcp_gateway/core/startup_verification.py +3 -3
  536. claude_mpm/services/mcp_gateway/main.py +90 -15
  537. claude_mpm/services/mcp_gateway/registry/service_registry.py +4 -2
  538. claude_mpm/services/mcp_gateway/registry/tool_registry.py +12 -9
  539. claude_mpm/services/mcp_gateway/server/mcp_gateway.py +4 -4
  540. claude_mpm/services/mcp_gateway/server/stdio_server.py +9 -15
  541. claude_mpm/services/mcp_gateway/tools/__init__.py +14 -2
  542. claude_mpm/services/mcp_gateway/tools/base_adapter.py +15 -15
  543. claude_mpm/services/mcp_gateway/tools/document_summarizer.py +10 -9
  544. claude_mpm/services/mcp_gateway/tools/external_mcp_services.py +654 -0
  545. claude_mpm/services/mcp_gateway/tools/health_check_tool.py +36 -34
  546. claude_mpm/services/mcp_gateway/tools/hello_world.py +8 -8
  547. claude_mpm/services/mcp_gateway/tools/kuzu_memory_service.py +551 -0
  548. claude_mpm/services/mcp_gateway/utils/__init__.py +14 -0
  549. claude_mpm/services/mcp_gateway/utils/package_version_checker.py +160 -0
  550. claude_mpm/services/mcp_gateway/utils/update_preferences.py +170 -0
  551. claude_mpm/services/mcp_service_verifier.py +729 -0
  552. claude_mpm/services/memory/builder.py +9 -8
  553. claude_mpm/services/memory/cache/shared_prompt_cache.py +2 -1
  554. claude_mpm/services/memory/cache/simple_cache.py +2 -2
  555. claude_mpm/services/memory/failure_tracker.py +578 -0
  556. claude_mpm/services/memory/indexed_memory.py +8 -8
  557. claude_mpm/services/memory/optimizer.py +8 -9
  558. claude_mpm/services/memory/router.py +3 -3
  559. claude_mpm/services/memory_hook_service.py +165 -4
  560. claude_mpm/services/model/__init__.py +147 -0
  561. claude_mpm/services/model/base_provider.py +365 -0
  562. claude_mpm/services/model/claude_provider.py +412 -0
  563. claude_mpm/services/model/model_router.py +453 -0
  564. claude_mpm/services/model/ollama_provider.py +415 -0
  565. claude_mpm/services/monitor/__init__.py +20 -0
  566. claude_mpm/services/monitor/daemon.py +671 -0
  567. claude_mpm/services/monitor/daemon_manager.py +963 -0
  568. claude_mpm/services/monitor/event_emitter.py +350 -0
  569. claude_mpm/services/monitor/handlers/__init__.py +21 -0
  570. claude_mpm/services/monitor/handlers/code_analysis.py +332 -0
  571. claude_mpm/services/monitor/handlers/dashboard.py +299 -0
  572. claude_mpm/services/monitor/handlers/file.py +264 -0
  573. claude_mpm/services/monitor/handlers/hooks.py +512 -0
  574. claude_mpm/services/monitor/management/__init__.py +18 -0
  575. claude_mpm/services/monitor/management/health.py +124 -0
  576. claude_mpm/services/monitor/management/lifecycle.py +724 -0
  577. claude_mpm/services/monitor/server.py +817 -0
  578. claude_mpm/services/monitor_build_service.py +2 -2
  579. claude_mpm/services/native_agent_converter.py +356 -0
  580. claude_mpm/services/orphan_detection.py +786 -0
  581. claude_mpm/services/port_manager.py +2 -2
  582. claude_mpm/services/project/__init__.py +23 -0
  583. claude_mpm/services/project/analyzer.py +3 -3
  584. claude_mpm/services/project/architecture_analyzer.py +5 -5
  585. claude_mpm/services/project/archive_manager.py +1045 -0
  586. claude_mpm/services/project/dependency_analyzer.py +4 -4
  587. claude_mpm/services/project/detection_strategies.py +719 -0
  588. claude_mpm/services/project/documentation_manager.py +553 -0
  589. claude_mpm/services/project/enhanced_analyzer.py +572 -0
  590. claude_mpm/services/project/metrics_collector.py +4 -4
  591. claude_mpm/services/project/project_organizer.py +1005 -0
  592. claude_mpm/services/project/registry.py +13 -7
  593. claude_mpm/services/project/toolchain_analyzer.py +581 -0
  594. claude_mpm/services/project_port_allocator.py +596 -0
  595. claude_mpm/services/response_tracker.py +21 -10
  596. claude_mpm/services/runner_configuration_service.py +1 -0
  597. claude_mpm/services/self_upgrade_service.py +500 -0
  598. claude_mpm/services/session_management_service.py +7 -5
  599. claude_mpm/services/session_manager.py +380 -0
  600. claude_mpm/services/shared/__init__.py +2 -1
  601. claude_mpm/services/shared/async_service_base.py +16 -27
  602. claude_mpm/services/shared/config_service_base.py +17 -14
  603. claude_mpm/services/shared/lifecycle_service_base.py +1 -14
  604. claude_mpm/services/shared/service_factory.py +8 -5
  605. claude_mpm/services/socketio/client_proxy.py +60 -5
  606. claude_mpm/services/socketio/dashboard_server.py +361 -0
  607. claude_mpm/services/socketio/event_normalizer.py +10 -6
  608. claude_mpm/services/socketio/handlers/__init__.py +5 -2
  609. claude_mpm/services/socketio/handlers/base.py +2 -2
  610. claude_mpm/services/socketio/handlers/code_analysis.py +90 -27
  611. claude_mpm/services/socketio/handlers/connection.py +21 -40
  612. claude_mpm/services/socketio/handlers/connection_handler.py +13 -10
  613. claude_mpm/services/socketio/handlers/file.py +46 -10
  614. claude_mpm/services/socketio/handlers/git.py +8 -8
  615. claude_mpm/services/socketio/handlers/hook.py +29 -17
  616. claude_mpm/services/socketio/handlers/registry.py +4 -2
  617. claude_mpm/services/socketio/monitor_client.py +364 -0
  618. claude_mpm/services/socketio/server/broadcaster.py +9 -7
  619. claude_mpm/services/socketio/server/connection_manager.py +2 -2
  620. claude_mpm/services/socketio/server/core.py +141 -4
  621. claude_mpm/services/socketio/server/eventbus_integration.py +20 -14
  622. claude_mpm/services/socketio/server/main.py +23 -21
  623. claude_mpm/services/socketio_client_manager.py +4 -4
  624. claude_mpm/services/subprocess_launcher_service.py +19 -15
  625. claude_mpm/services/system_instructions_service.py +2 -2
  626. claude_mpm/services/ticket_services/formatter_service.py +1 -1
  627. claude_mpm/services/ticket_services/validation_service.py +5 -5
  628. claude_mpm/services/unified/__init__.py +65 -0
  629. claude_mpm/services/unified/analyzer_strategies/__init__.py +44 -0
  630. claude_mpm/services/unified/analyzer_strategies/code_analyzer.py +518 -0
  631. claude_mpm/services/unified/analyzer_strategies/dependency_analyzer.py +680 -0
  632. claude_mpm/services/unified/analyzer_strategies/performance_analyzer.py +903 -0
  633. claude_mpm/services/unified/analyzer_strategies/security_analyzer.py +746 -0
  634. claude_mpm/services/unified/analyzer_strategies/structure_analyzer.py +733 -0
  635. claude_mpm/services/unified/config_strategies/__init__.py +175 -0
  636. claude_mpm/services/unified/config_strategies/config_schema.py +731 -0
  637. claude_mpm/services/unified/config_strategies/context_strategy.py +747 -0
  638. claude_mpm/services/unified/config_strategies/error_handling_strategy.py +1005 -0
  639. claude_mpm/services/unified/config_strategies/file_loader_strategy.py +881 -0
  640. claude_mpm/services/unified/config_strategies/unified_config_service.py +823 -0
  641. claude_mpm/services/unified/config_strategies/validation_strategy.py +1148 -0
  642. claude_mpm/services/unified/deployment_strategies/__init__.py +97 -0
  643. claude_mpm/services/unified/deployment_strategies/base.py +553 -0
  644. claude_mpm/services/unified/deployment_strategies/cloud_strategies.py +573 -0
  645. claude_mpm/services/unified/deployment_strategies/local.py +607 -0
  646. claude_mpm/services/unified/deployment_strategies/utils.py +667 -0
  647. claude_mpm/services/unified/deployment_strategies/vercel.py +475 -0
  648. claude_mpm/services/unified/interfaces.py +475 -0
  649. claude_mpm/services/unified/migration.py +509 -0
  650. claude_mpm/services/unified/strategies.py +534 -0
  651. claude_mpm/services/unified/unified_analyzer.py +542 -0
  652. claude_mpm/services/unified/unified_config.py +691 -0
  653. claude_mpm/services/unified/unified_deployment.py +470 -0
  654. claude_mpm/services/utility_service.py +6 -3
  655. claude_mpm/services/version_control/branch_strategy.py +2 -2
  656. claude_mpm/services/version_control/conflict_resolution.py +8 -4
  657. claude_mpm/services/version_control/git_operations.py +26 -24
  658. claude_mpm/services/version_control/semantic_versioning.py +14 -14
  659. claude_mpm/services/version_control/version_parser.py +14 -11
  660. claude_mpm/services/version_service.py +104 -1
  661. claude_mpm/skills/__init__.py +42 -0
  662. claude_mpm/skills/agent_skills_injector.py +324 -0
  663. claude_mpm/skills/bundled/LICENSE_ATTRIBUTIONS.md +79 -0
  664. claude_mpm/skills/bundled/__init__.py +6 -0
  665. claude_mpm/skills/bundled/api-documentation.md +393 -0
  666. claude_mpm/skills/bundled/async-testing.md +571 -0
  667. claude_mpm/skills/bundled/code-review.md +143 -0
  668. claude_mpm/skills/bundled/collaboration/brainstorming/SKILL.md +79 -0
  669. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/SKILL.md +178 -0
  670. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/agent-prompts.md +577 -0
  671. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/coordination-patterns.md +467 -0
  672. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/examples.md +537 -0
  673. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/troubleshooting.md +730 -0
  674. claude_mpm/skills/bundled/collaboration/requesting-code-review/SKILL.md +112 -0
  675. claude_mpm/skills/bundled/collaboration/requesting-code-review/references/code-reviewer-template.md +146 -0
  676. claude_mpm/skills/bundled/collaboration/requesting-code-review/references/review-examples.md +412 -0
  677. claude_mpm/skills/bundled/collaboration/writing-plans/SKILL.md +81 -0
  678. claude_mpm/skills/bundled/collaboration/writing-plans/references/best-practices.md +362 -0
  679. claude_mpm/skills/bundled/collaboration/writing-plans/references/plan-structure-templates.md +312 -0
  680. claude_mpm/skills/bundled/database-migration.md +199 -0
  681. claude_mpm/skills/bundled/debugging/root-cause-tracing/SKILL.md +152 -0
  682. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/advanced-techniques.md +668 -0
  683. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/examples.md +587 -0
  684. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/integration.md +438 -0
  685. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/tracing-techniques.md +391 -0
  686. claude_mpm/skills/bundled/debugging/systematic-debugging/CREATION-LOG.md +119 -0
  687. claude_mpm/skills/bundled/debugging/systematic-debugging/SKILL.md +148 -0
  688. claude_mpm/skills/bundled/debugging/systematic-debugging/references/anti-patterns.md +483 -0
  689. claude_mpm/skills/bundled/debugging/systematic-debugging/references/examples.md +452 -0
  690. claude_mpm/skills/bundled/debugging/systematic-debugging/references/troubleshooting.md +449 -0
  691. claude_mpm/skills/bundled/debugging/systematic-debugging/references/workflow.md +411 -0
  692. claude_mpm/skills/bundled/debugging/systematic-debugging/test-academic.md +14 -0
  693. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-1.md +58 -0
  694. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-2.md +68 -0
  695. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-3.md +69 -0
  696. claude_mpm/skills/bundled/debugging/verification-before-completion/SKILL.md +131 -0
  697. claude_mpm/skills/bundled/debugging/verification-before-completion/references/gate-function.md +325 -0
  698. claude_mpm/skills/bundled/debugging/verification-before-completion/references/integration-and-workflows.md +490 -0
  699. claude_mpm/skills/bundled/debugging/verification-before-completion/references/red-flags-and-failures.md +425 -0
  700. claude_mpm/skills/bundled/debugging/verification-before-completion/references/verification-patterns.md +499 -0
  701. claude_mpm/skills/bundled/docker-containerization.md +194 -0
  702. claude_mpm/skills/bundled/express-local-dev.md +1429 -0
  703. claude_mpm/skills/bundled/fastapi-local-dev.md +1199 -0
  704. claude_mpm/skills/bundled/git-workflow.md +414 -0
  705. claude_mpm/skills/bundled/imagemagick.md +204 -0
  706. claude_mpm/skills/bundled/infrastructure/env-manager/scripts/validate_env.py +576 -0
  707. claude_mpm/skills/bundled/json-data-handling.md +223 -0
  708. claude_mpm/skills/bundled/main/artifacts-builder/SKILL.md +86 -0
  709. claude_mpm/skills/bundled/main/internal-comms/SKILL.md +43 -0
  710. claude_mpm/skills/bundled/main/internal-comms/examples/3p-updates.md +47 -0
  711. claude_mpm/skills/bundled/main/internal-comms/examples/company-newsletter.md +65 -0
  712. claude_mpm/skills/bundled/main/internal-comms/examples/faq-answers.md +30 -0
  713. claude_mpm/skills/bundled/main/internal-comms/examples/general-comms.md +16 -0
  714. claude_mpm/skills/bundled/main/mcp-builder/SKILL.md +160 -0
  715. claude_mpm/skills/bundled/main/mcp-builder/reference/design_principles.md +412 -0
  716. claude_mpm/skills/bundled/main/mcp-builder/reference/evaluation.md +602 -0
  717. claude_mpm/skills/bundled/main/mcp-builder/reference/mcp_best_practices.md +915 -0
  718. claude_mpm/skills/bundled/main/mcp-builder/reference/node_mcp_server.md +916 -0
  719. claude_mpm/skills/bundled/main/mcp-builder/reference/python_mcp_server.md +752 -0
  720. claude_mpm/skills/bundled/main/mcp-builder/reference/workflow.md +1237 -0
  721. claude_mpm/skills/bundled/main/mcp-builder/scripts/connections.py +157 -0
  722. claude_mpm/skills/bundled/main/mcp-builder/scripts/evaluation.py +425 -0
  723. claude_mpm/skills/bundled/main/skill-creator/SKILL.md +189 -0
  724. claude_mpm/skills/bundled/main/skill-creator/references/best-practices.md +500 -0
  725. claude_mpm/skills/bundled/main/skill-creator/references/creation-workflow.md +464 -0
  726. claude_mpm/skills/bundled/main/skill-creator/references/examples.md +619 -0
  727. claude_mpm/skills/bundled/main/skill-creator/references/progressive-disclosure.md +437 -0
  728. claude_mpm/skills/bundled/main/skill-creator/references/skill-structure.md +231 -0
  729. claude_mpm/skills/bundled/main/skill-creator/scripts/init_skill.py +303 -0
  730. claude_mpm/skills/bundled/main/skill-creator/scripts/package_skill.py +113 -0
  731. claude_mpm/skills/bundled/main/skill-creator/scripts/quick_validate.py +72 -0
  732. claude_mpm/skills/bundled/nextjs-local-dev.md +807 -0
  733. claude_mpm/skills/bundled/pdf.md +141 -0
  734. claude_mpm/skills/bundled/performance-profiling.md +573 -0
  735. claude_mpm/skills/bundled/php/espocrm-development/SKILL.md +170 -0
  736. claude_mpm/skills/bundled/php/espocrm-development/references/architecture.md +602 -0
  737. claude_mpm/skills/bundled/php/espocrm-development/references/common-tasks.md +821 -0
  738. claude_mpm/skills/bundled/php/espocrm-development/references/development-workflow.md +742 -0
  739. claude_mpm/skills/bundled/php/espocrm-development/references/frontend-customization.md +726 -0
  740. claude_mpm/skills/bundled/php/espocrm-development/references/hooks-and-services.md +764 -0
  741. claude_mpm/skills/bundled/php/espocrm-development/references/testing-debugging.md +831 -0
  742. claude_mpm/skills/bundled/refactoring-patterns.md +180 -0
  743. claude_mpm/skills/bundled/rust/desktop-applications/SKILL.md +226 -0
  744. claude_mpm/skills/bundled/rust/desktop-applications/references/architecture-patterns.md +901 -0
  745. claude_mpm/skills/bundled/rust/desktop-applications/references/native-gui-frameworks.md +901 -0
  746. claude_mpm/skills/bundled/rust/desktop-applications/references/platform-integration.md +775 -0
  747. claude_mpm/skills/bundled/rust/desktop-applications/references/state-management.md +937 -0
  748. claude_mpm/skills/bundled/rust/desktop-applications/references/tauri-framework.md +770 -0
  749. claude_mpm/skills/bundled/rust/desktop-applications/references/testing-deployment.md +961 -0
  750. claude_mpm/skills/bundled/security-scanning.md +327 -0
  751. claude_mpm/skills/bundled/systematic-debugging.md +473 -0
  752. claude_mpm/skills/bundled/test-driven-development.md +378 -0
  753. claude_mpm/skills/bundled/testing/condition-based-waiting/SKILL.md +119 -0
  754. claude_mpm/skills/bundled/testing/condition-based-waiting/references/patterns-and-implementation.md +253 -0
  755. claude_mpm/skills/bundled/testing/test-driven-development/SKILL.md +145 -0
  756. claude_mpm/skills/bundled/testing/test-driven-development/references/anti-patterns.md +543 -0
  757. claude_mpm/skills/bundled/testing/test-driven-development/references/examples.md +741 -0
  758. claude_mpm/skills/bundled/testing/test-driven-development/references/integration.md +470 -0
  759. claude_mpm/skills/bundled/testing/test-driven-development/references/philosophy.md +458 -0
  760. claude_mpm/skills/bundled/testing/test-driven-development/references/workflow.md +639 -0
  761. claude_mpm/skills/bundled/testing/testing-anti-patterns/SKILL.md +140 -0
  762. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/completeness-anti-patterns.md +572 -0
  763. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/core-anti-patterns.md +411 -0
  764. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/detection-guide.md +569 -0
  765. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/tdd-connection.md +695 -0
  766. claude_mpm/skills/bundled/testing/webapp-testing/SKILL.md +184 -0
  767. claude_mpm/skills/bundled/testing/webapp-testing/decision-tree.md +459 -0
  768. claude_mpm/skills/bundled/testing/webapp-testing/examples/console_logging.py +35 -0
  769. claude_mpm/skills/bundled/testing/webapp-testing/examples/element_discovery.py +44 -0
  770. claude_mpm/skills/bundled/testing/webapp-testing/examples/static_html_automation.py +34 -0
  771. claude_mpm/skills/bundled/testing/webapp-testing/playwright-patterns.md +479 -0
  772. claude_mpm/skills/bundled/testing/webapp-testing/reconnaissance-pattern.md +687 -0
  773. claude_mpm/skills/bundled/testing/webapp-testing/scripts/with_server.py +129 -0
  774. claude_mpm/skills/bundled/testing/webapp-testing/server-management.md +758 -0
  775. claude_mpm/skills/bundled/testing/webapp-testing/troubleshooting.md +868 -0
  776. claude_mpm/skills/bundled/vite-local-dev.md +1061 -0
  777. claude_mpm/skills/bundled/web-performance-optimization.md +2305 -0
  778. claude_mpm/skills/bundled/xlsx.md +157 -0
  779. claude_mpm/skills/registry.py +286 -0
  780. claude_mpm/skills/skill_manager.py +310 -0
  781. claude_mpm/skills/skills_registry.py +348 -0
  782. claude_mpm/skills/skills_service.py +739 -0
  783. claude_mpm/storage/state_storage.py +31 -31
  784. claude_mpm/tools/__main__.py +1 -1
  785. claude_mpm/tools/code_tree_analyzer/__init__.py +45 -0
  786. claude_mpm/tools/code_tree_analyzer/analysis.py +299 -0
  787. claude_mpm/tools/code_tree_analyzer/cache.py +131 -0
  788. claude_mpm/tools/code_tree_analyzer/core.py +380 -0
  789. claude_mpm/tools/code_tree_analyzer/discovery.py +403 -0
  790. claude_mpm/tools/code_tree_analyzer/events.py +168 -0
  791. claude_mpm/tools/code_tree_analyzer/gitignore.py +308 -0
  792. claude_mpm/tools/code_tree_analyzer/models.py +39 -0
  793. claude_mpm/tools/code_tree_analyzer/multilang_analyzer.py +224 -0
  794. claude_mpm/tools/code_tree_analyzer/python_analyzer.py +284 -0
  795. claude_mpm/tools/code_tree_builder.py +6 -6
  796. claude_mpm/tools/code_tree_events.py +14 -10
  797. claude_mpm/tools/socketio_debug.py +11 -11
  798. claude_mpm/utils/agent_dependency_loader.py +108 -27
  799. claude_mpm/utils/common.py +544 -0
  800. claude_mpm/utils/config_manager.py +12 -6
  801. claude_mpm/utils/database_connector.py +298 -0
  802. claude_mpm/utils/dependency_cache.py +2 -2
  803. claude_mpm/utils/dependency_strategies.py +15 -10
  804. claude_mpm/utils/display_helper.py +260 -0
  805. claude_mpm/utils/environment_context.py +4 -3
  806. claude_mpm/utils/error_handler.py +5 -3
  807. claude_mpm/utils/file_utils.py +13 -14
  808. claude_mpm/utils/git_analyzer.py +407 -0
  809. claude_mpm/utils/log_cleanup.py +627 -0
  810. claude_mpm/utils/path_operations.py +7 -4
  811. claude_mpm/utils/robust_installer.py +133 -24
  812. claude_mpm/utils/session_logging.py +2 -2
  813. claude_mpm/utils/subprocess_utils.py +9 -8
  814. claude_mpm/validation/agent_validator.py +6 -6
  815. claude_mpm/validation/frontmatter_validator.py +6 -6
  816. claude_mpm-4.24.0.dist-info/METADATA +675 -0
  817. claude_mpm-4.24.0.dist-info/RECORD +1018 -0
  818. {claude_mpm-4.1.26.dist-info → claude_mpm-4.24.0.dist-info}/entry_points.txt +1 -0
  819. claude_mpm/agents/INSTRUCTIONS.md +0 -261
  820. claude_mpm/agents/templates/agent-manager.md +0 -619
  821. claude_mpm/cli/commands/configure_tui.py +0 -1927
  822. claude_mpm/cli/commands/mpm_init.py +0 -594
  823. claude_mpm/cli/commands/socketio_monitor.py +0 -233
  824. claude_mpm/dashboard/static/css/code-tree.css +0 -1408
  825. claude_mpm/dashboard/static/js/components/code-tree.js +0 -3220
  826. claude_mpm/dashboard/static/js/components/code-viewer.js +0 -480
  827. claude_mpm/hooks/claude_hooks/hook_handler_eventbus.py +0 -425
  828. claude_mpm/hooks/claude_hooks/hook_handler_original.py +0 -1040
  829. claude_mpm/hooks/claude_hooks/hook_handler_refactored.py +0 -347
  830. claude_mpm/scripts/socketio_daemon_hardened.py +0 -937
  831. claude_mpm/scripts/socketio_daemon_wrapper.py +0 -78
  832. claude_mpm/scripts/socketio_server_manager.py +0 -349
  833. claude_mpm/services/agents/deployment/agent_lifecycle_manager_refactored.py +0 -575
  834. claude_mpm/services/cli/dashboard_launcher.py +0 -423
  835. claude_mpm/services/cli/socketio_manager.py +0 -537
  836. claude_mpm/services/diagnostics/checks/claude_desktop_check.py +0 -286
  837. claude_mpm/services/mcp_gateway/tools/ticket_tools.py +0 -645
  838. claude_mpm/services/mcp_gateway/tools/unified_ticket_tool.py +0 -602
  839. claude_mpm/services/project/analyzer_refactored.py +0 -450
  840. claude_mpm/tools/code_tree_analyzer.py +0 -1693
  841. claude_mpm-4.1.26.dist-info/METADATA +0 -332
  842. claude_mpm-4.1.26.dist-info/RECORD +0 -606
  843. {claude_mpm-4.1.26.dist-info → claude_mpm-4.24.0.dist-info}/WHEEL +0 -0
  844. {claude_mpm-4.1.26.dist-info → claude_mpm-4.24.0.dist-info}/licenses/LICENSE +0 -0
  845. {claude_mpm-4.1.26.dist-info → claude_mpm-4.24.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,1066 @@
1
+ """
2
+ Check MCP external services installation and health.
3
+
4
+ WHY: Verify that MCP services (mcp-vector-search, mcp-browser, mcp-ticketer, kuzu-memory)
5
+ are properly installed and accessible for enhanced Claude Code capabilities.
6
+ """
7
+
8
+ import asyncio
9
+ import json
10
+ import subprocess
11
+ import time
12
+ from pathlib import Path
13
+ from typing import Dict, List, Optional, Tuple
14
+
15
+ from claude_mpm.core.logger import get_logger
16
+
17
+ from ....core.enums import OperationResult, ValidationSeverity
18
+ from ..models import DiagnosticResult
19
+ from .base_check import BaseDiagnosticCheck
20
+
21
+
22
+ class MCPServicesCheck(BaseDiagnosticCheck):
23
+ """Check MCP external services installation and health."""
24
+
25
+ def __init__(self, verbose: bool = False):
26
+ """Initialize the MCP services check."""
27
+ super().__init__(verbose)
28
+ self.logger = get_logger(self.__class__.__name__)
29
+
30
+ # Define MCP services to check
31
+ MCP_SERVICES = {
32
+ "mcp-vector-search": {
33
+ "package": "mcp-vector-search",
34
+ "command": [
35
+ "mcp-vector-search",
36
+ "--version",
37
+ ], # Use --version for proper check
38
+ "description": "Vector search for semantic code navigation",
39
+ "check_health": True,
40
+ "health_command": ["mcp-vector-search", "--version"],
41
+ "pipx_run_command": ["pipx", "run", "mcp-vector-search", "--version"],
42
+ "mcp_command": [
43
+ "python",
44
+ "-m",
45
+ "mcp_vector_search.mcp.server",
46
+ ], # Command to run as MCP server
47
+ "pipx_mcp_command": [
48
+ "pipx",
49
+ "run",
50
+ "--spec",
51
+ "mcp-vector-search",
52
+ "python",
53
+ "-m",
54
+ "mcp_vector_search.mcp.server",
55
+ ],
56
+ },
57
+ "mcp-browser": {
58
+ "package": "mcp-browser",
59
+ "command": ["mcp-browser", "--version"], # Use --version for proper check
60
+ "description": "Browser automation and web interaction",
61
+ "check_health": True,
62
+ "health_command": ["mcp-browser", "--version"],
63
+ "pipx_run_command": ["pipx", "run", "mcp-browser", "--version"],
64
+ "mcp_command": ["mcp-browser", "mcp"], # Command to run as MCP server
65
+ },
66
+ "mcp-ticketer": {
67
+ "package": "mcp-ticketer",
68
+ "command": ["mcp-ticketer", "--version"], # Use --version for proper check
69
+ "description": "Ticket and task management",
70
+ "check_health": True,
71
+ "health_command": ["mcp-ticketer", "--version"],
72
+ "pipx_run_command": ["pipx", "run", "mcp-ticketer", "--version"],
73
+ "mcp_command": ["mcp-ticketer", "mcp"], # Command to run as MCP server
74
+ },
75
+ "kuzu-memory": {
76
+ "package": "kuzu-memory",
77
+ "command": ["kuzu-memory", "--version"], # Use --version for proper check
78
+ "description": "Graph-based memory system",
79
+ "check_health": True, # v1.1.0+ has version command
80
+ "health_command": ["kuzu-memory", "--version"],
81
+ "pipx_run_command": ["pipx", "run", "kuzu-memory", "--version"],
82
+ "mcp_command": [
83
+ "kuzu-memory",
84
+ "mcp",
85
+ "serve",
86
+ ], # v1.1.0+ uses 'mcp serve' args
87
+ },
88
+ }
89
+
90
+ @property
91
+ def name(self) -> str:
92
+ return "mcp_services_check"
93
+
94
+ @property
95
+ def category(self) -> str:
96
+ return "MCP Services"
97
+
98
+ def run(self) -> DiagnosticResult:
99
+ """Run MCP services diagnostics."""
100
+ try:
101
+ details = {}
102
+ sub_results = []
103
+ services_status = {}
104
+
105
+ # Use MCPConfigManager to detect and fix corrupted installations
106
+ from claude_mpm.services.mcp_config_manager import MCPConfigManager
107
+
108
+ mcp_manager = MCPConfigManager()
109
+
110
+ # Run comprehensive fix for all MCP service issues
111
+ fix_success, fix_message = mcp_manager.fix_mcp_service_issues()
112
+ if (
113
+ fix_message
114
+ and fix_message != "All MCP services are functioning correctly"
115
+ ):
116
+ # Create diagnostic result for the fixes
117
+ fix_result = DiagnosticResult(
118
+ category="MCP Service Fixes",
119
+ status=(
120
+ OperationResult.SUCCESS
121
+ if fix_success
122
+ else ValidationSeverity.WARNING
123
+ ),
124
+ message=fix_message,
125
+ details={"auto_fix_applied": True},
126
+ )
127
+ sub_results.append(fix_result)
128
+
129
+ # Also ensure configurations are updated for all projects
130
+ config_success, config_message = (
131
+ mcp_manager.ensure_mcp_services_configured()
132
+ )
133
+ if (
134
+ config_message
135
+ and config_message != "All MCP services already configured correctly"
136
+ ):
137
+ config_result = DiagnosticResult(
138
+ category="MCP Configuration Update",
139
+ status=(
140
+ OperationResult.SUCCESS
141
+ if config_success
142
+ else ValidationSeverity.WARNING
143
+ ),
144
+ message=config_message,
145
+ details={"auto_config_applied": True},
146
+ )
147
+ sub_results.append(config_result)
148
+
149
+ # Check for kuzu-memory configuration issues and offer auto-fix
150
+ kuzu_config_result = self._check_and_fix_kuzu_memory_config()
151
+ if kuzu_config_result:
152
+ sub_results.append(kuzu_config_result)
153
+
154
+ # Check each MCP service
155
+ for service_name, service_config in self.MCP_SERVICES.items():
156
+ service_result = self._check_service(service_name, service_config)
157
+ sub_results.append(service_result)
158
+
159
+ # Extract connection test info if available
160
+ connection_test = service_result.details.get("connection_test", {})
161
+
162
+ services_status[service_name] = {
163
+ "status": service_result.status.value,
164
+ "installed": service_result.details.get("installed", False),
165
+ "accessible": service_result.details.get("accessible", False),
166
+ "version": service_result.details.get("version"),
167
+ "connection_tested": bool(connection_test),
168
+ "connected": connection_test.get("connected", False),
169
+ "response_time_ms": connection_test.get("response_time_ms"),
170
+ "tools_discovered": connection_test.get("tools_discovered", 0),
171
+ "connection_error": connection_test.get("error"),
172
+ }
173
+
174
+ # Check MCP gateway configuration for services
175
+ gateway_result = self._check_gateway_configuration()
176
+ sub_results.append(gateway_result)
177
+
178
+ # Count service statuses
179
+ installed_count = sum(1 for s in services_status.values() if s["installed"])
180
+ accessible_count = sum(
181
+ 1 for s in services_status.values() if s["accessible"]
182
+ )
183
+ connected_count = sum(1 for s in services_status.values() if s["connected"])
184
+ total_services = len(self.MCP_SERVICES)
185
+
186
+ # Calculate total tools discovered
187
+ total_tools = sum(
188
+ s.get("tools_discovered", 0) for s in services_status.values()
189
+ )
190
+
191
+ details["services"] = services_status
192
+ details["installed_count"] = installed_count
193
+ details["accessible_count"] = accessible_count
194
+ details["connected_count"] = connected_count
195
+ details["total_services"] = total_services
196
+ details["total_tools_discovered"] = total_tools
197
+ details["gateway_configured"] = (
198
+ gateway_result.status == OperationResult.SUCCESS
199
+ )
200
+
201
+ # Determine overall status
202
+ errors = [r for r in sub_results if r.status == ValidationSeverity.ERROR]
203
+ [r for r in sub_results if r.status == ValidationSeverity.WARNING]
204
+
205
+ if errors:
206
+ status = ValidationSeverity.ERROR
207
+ message = f"Critical issues with {len(errors)} MCP service(s)"
208
+ elif installed_count == 0:
209
+ status = ValidationSeverity.WARNING
210
+ message = "No MCP services installed"
211
+ elif connected_count == total_services:
212
+ status = OperationResult.SUCCESS
213
+ message = f"All {total_services} MCP services connected ({total_tools} tools available)"
214
+ elif connected_count > 0:
215
+ status = ValidationSeverity.WARNING
216
+ message = f"{connected_count}/{total_services} MCP services connected, {installed_count} installed"
217
+ elif accessible_count < installed_count:
218
+ status = ValidationSeverity.WARNING
219
+ message = f"{installed_count}/{total_services} services installed, {accessible_count} accessible"
220
+ elif installed_count < total_services:
221
+ status = ValidationSeverity.WARNING
222
+ message = f"{installed_count}/{total_services} MCP services installed"
223
+ else:
224
+ status = ValidationSeverity.WARNING
225
+ message = f"All {total_services} MCP services installed but connections not tested"
226
+
227
+ return DiagnosticResult(
228
+ category=self.category,
229
+ status=status,
230
+ message=message,
231
+ details=details,
232
+ sub_results=sub_results if self.verbose else [],
233
+ )
234
+
235
+ except Exception as e:
236
+ return DiagnosticResult(
237
+ category=self.category,
238
+ status=ValidationSeverity.ERROR,
239
+ message=f"MCP services check failed: {e!s}",
240
+ details={"error": str(e)},
241
+ )
242
+
243
+ async def _test_mcp_connection(self, service_name: str, command: List[str]) -> Dict:
244
+ """Test MCP server connection by sending JSON-RPC requests."""
245
+ result = {
246
+ "connected": False,
247
+ "response_time": None,
248
+ "tools_count": 0,
249
+ "tools": [],
250
+ "error": None,
251
+ }
252
+
253
+ process = None
254
+ try:
255
+ # Start the MCP server process
256
+ start_time = time.time()
257
+ process = await asyncio.create_subprocess_exec(
258
+ *command,
259
+ stdin=asyncio.subprocess.PIPE,
260
+ stdout=asyncio.subprocess.PIPE,
261
+ stderr=asyncio.subprocess.PIPE,
262
+ )
263
+
264
+ # Give the server a moment to initialize
265
+ await asyncio.sleep(0.1)
266
+
267
+ # Prepare initialize request
268
+ init_request = {
269
+ "jsonrpc": "2.0",
270
+ "method": "initialize",
271
+ "params": {
272
+ "protocolVersion": "2024-11-05",
273
+ "capabilities": {},
274
+ "clientInfo": {"name": "mpm-doctor", "version": "1.0.0"},
275
+ },
276
+ "id": 1,
277
+ }
278
+
279
+ # Send initialize request
280
+ request_line = json.dumps(init_request) + "\n"
281
+ process.stdin.write(request_line.encode())
282
+ await process.stdin.drain()
283
+
284
+ # Read response with timeout
285
+ try:
286
+ response_line = await asyncio.wait_for(
287
+ process.stdout.readline(), timeout=5.0
288
+ )
289
+ response_time = time.time() - start_time
290
+
291
+ if response_line:
292
+ # Some MCP servers may output non-JSON before the actual response
293
+ # Try to find JSON in the response
294
+ response_text = response_line.decode().strip()
295
+
296
+ # Skip empty lines or non-JSON lines
297
+ while response_text and not response_text.startswith("{"):
298
+ # Try to read the next line
299
+ try:
300
+ response_line = await asyncio.wait_for(
301
+ process.stdout.readline(), timeout=1.0
302
+ )
303
+ if response_line:
304
+ response_text = response_line.decode().strip()
305
+ else:
306
+ break
307
+ except asyncio.TimeoutError:
308
+ break
309
+
310
+ if not response_text or not response_text.startswith("{"):
311
+ result["error"] = "No valid JSON response received"
312
+ return result
313
+
314
+ response = json.loads(response_text)
315
+
316
+ # Check for valid JSON-RPC response
317
+ if "result" in response and response.get("id") == 1:
318
+ result["connected"] = True
319
+ result["response_time"] = round(response_time * 1000, 2) # ms
320
+
321
+ # Send tools/list request
322
+ tools_request = {
323
+ "jsonrpc": "2.0",
324
+ "method": "tools/list",
325
+ "params": {},
326
+ "id": 2,
327
+ }
328
+
329
+ request_line = json.dumps(tools_request) + "\n"
330
+ process.stdin.write(request_line.encode())
331
+ await process.stdin.drain()
332
+
333
+ # Read tools response
334
+ try:
335
+ tools_response_line = await asyncio.wait_for(
336
+ process.stdout.readline(), timeout=3.0
337
+ )
338
+
339
+ if tools_response_line:
340
+ tools_response = json.loads(
341
+ tools_response_line.decode()
342
+ )
343
+ if "result" in tools_response:
344
+ tools = tools_response["result"].get("tools", [])
345
+ result["tools_count"] = len(tools)
346
+ # Store first 5 tool names for display
347
+ result["tools"] = [
348
+ tool.get("name", "unknown")
349
+ for tool in tools[:5]
350
+ ]
351
+ except asyncio.TimeoutError:
352
+ # Connection successful but tools query timed out
353
+ pass
354
+ except (json.JSONDecodeError, KeyError):
355
+ # Connection successful but tools response invalid
356
+ pass
357
+
358
+ elif "error" in response:
359
+ result["error"] = (
360
+ f"MCP error: {response['error'].get('message', 'Unknown error')}"
361
+ )
362
+ else:
363
+ result["error"] = "Invalid JSON-RPC response format"
364
+
365
+ except asyncio.TimeoutError:
366
+ # Try to get any error output from stderr
367
+ stderr_output = ""
368
+ if process and process.stderr:
369
+ try:
370
+ stderr_data = await asyncio.wait_for(
371
+ process.stderr.read(1000), timeout=0.5
372
+ )
373
+ if stderr_data:
374
+ stderr_output = stderr_data.decode(
375
+ "utf-8", errors="ignore"
376
+ )[:200]
377
+ except (asyncio.TimeoutError, OSError):
378
+ pass
379
+
380
+ if stderr_output:
381
+ result["error"] = (
382
+ f"Connection timeout (5s). Server output: {stderr_output}"
383
+ )
384
+ else:
385
+ result["error"] = "Connection timeout (5s)"
386
+
387
+ except json.JSONDecodeError as e:
388
+ # Try to get stderr for more context
389
+ stderr_output = ""
390
+ if process and process.stderr:
391
+ try:
392
+ stderr_data = await asyncio.wait_for(
393
+ process.stderr.read(1000), timeout=0.5
394
+ )
395
+ if stderr_data:
396
+ stderr_output = stderr_data.decode(
397
+ "utf-8", errors="ignore"
398
+ )[:200]
399
+ except (asyncio.TimeoutError, OSError):
400
+ pass
401
+
402
+ if stderr_output:
403
+ result["error"] = (
404
+ f"Invalid JSON response: {e!s}. Server error: {stderr_output}"
405
+ )
406
+ else:
407
+ result["error"] = f"Invalid JSON response: {e!s}"
408
+
409
+ except FileNotFoundError:
410
+ result["error"] = f"Command not found: {command[0]}"
411
+ except PermissionError:
412
+ result["error"] = f"Permission denied: {command[0]}"
413
+ except Exception as e:
414
+ result["error"] = f"Connection failed: {e!s}"
415
+ finally:
416
+ # Clean up process
417
+ if process:
418
+ try:
419
+ process.terminate()
420
+ await asyncio.wait_for(process.wait(), timeout=2.0)
421
+ except asyncio.TimeoutError:
422
+ process.kill()
423
+ await process.wait()
424
+ except Exception:
425
+ pass
426
+
427
+ return result
428
+
429
+ def _check_service(self, service_name: str, config: Dict) -> DiagnosticResult:
430
+ """Check a specific MCP service."""
431
+ details = {"service": service_name}
432
+
433
+ # Check if installed via pipx
434
+ pipx_installed, pipx_path = self._check_pipx_installation(config["package"])
435
+ details["pipx_installed"] = pipx_installed
436
+ if pipx_path:
437
+ details["pipx_path"] = pipx_path
438
+
439
+ # Special check for mcp-ticketer: ensure gql dependency
440
+ if service_name == "mcp-ticketer" and pipx_installed:
441
+ gql_fixed = self._ensure_mcp_ticketer_gql_dependency()
442
+ if gql_fixed:
443
+ details["gql_dependency_fixed"] = True
444
+
445
+ # Check if accessible in PATH
446
+ accessible, command_path = self._check_command_accessible(config["command"])
447
+ details["accessible"] = accessible
448
+ if command_path:
449
+ details["command_path"] = command_path
450
+
451
+ # If not directly accessible, try pipx run command
452
+ if (
453
+ not accessible
454
+ and "pipx_run_command" in config
455
+ and self._verify_command_works(config["pipx_run_command"])
456
+ ):
457
+ accessible = True
458
+ details["accessible_via_pipx_run"] = True
459
+ details["pipx_run_available"] = True
460
+
461
+ # Check for installation in various locations
462
+ if not pipx_installed and not accessible:
463
+ # Try common installation locations
464
+ alt_installed, alt_path = self._check_alternative_installations(
465
+ service_name
466
+ )
467
+ if alt_installed:
468
+ details["alternative_installation"] = alt_path
469
+ accessible = alt_installed
470
+
471
+ details["installed"] = pipx_installed or accessible
472
+
473
+ # Check service health/version if accessible
474
+ if accessible and config.get("check_health"):
475
+ # Try different version commands in order of preference
476
+ version_commands = []
477
+ if details.get("accessible_via_pipx_run") and "pipx_run_command" in config:
478
+ version_commands.append(config["pipx_run_command"])
479
+ if "health_command" in config:
480
+ version_commands.append(config["health_command"])
481
+ version_commands.append(config["command"])
482
+
483
+ for cmd in version_commands:
484
+ version = self._get_service_version(cmd)
485
+ if version:
486
+ details["version"] = version
487
+ break
488
+
489
+ # Test MCP connection if installed (accessible or pipx) and has mcp_command
490
+ if (accessible or pipx_installed) and "mcp_command" in config:
491
+ # Determine which command to use for MCP connection test
492
+ mcp_command = None
493
+ if pipx_installed and not accessible:
494
+ # Service is installed via pipx but not in PATH
495
+ if "pipx_mcp_command" in config:
496
+ # Use special pipx MCP command if available (e.g., for mcp-vector-search)
497
+ mcp_command = config["pipx_mcp_command"]
498
+ else:
499
+ # Build pipx run command based on package
500
+ base_cmd = config["mcp_command"]
501
+ if len(base_cmd) > 0 and base_cmd[0] == config["package"]:
502
+ # Simple case where first command is the package name
503
+ mcp_command = ["pipx", "run", config["package"], *base_cmd[1:]]
504
+ else:
505
+ # Complex case - just try running the package with mcp arg
506
+ mcp_command = ["pipx", "run", config["package"], "mcp"]
507
+ elif details.get("accessible_via_pipx_run"):
508
+ # Use pipx run for the MCP command
509
+ if "pipx_mcp_command" in config:
510
+ # Use special pipx MCP command if available (e.g., for mcp-vector-search)
511
+ mcp_command = config["pipx_mcp_command"]
512
+ else:
513
+ # Build pipx run command
514
+ base_cmd = config["mcp_command"]
515
+ if service_name == "kuzu-memory":
516
+ # Special case for kuzu-memory with args
517
+ mcp_command = ["pipx", "run", base_cmd[0], *base_cmd[1:]]
518
+ else:
519
+ mcp_command = ["pipx", "run", *base_cmd]
520
+ else:
521
+ mcp_command = config["mcp_command"]
522
+
523
+ if mcp_command:
524
+ # Run async connection test
525
+ try:
526
+ loop = asyncio.new_event_loop()
527
+ asyncio.set_event_loop(loop)
528
+ connection_result = loop.run_until_complete(
529
+ self._test_mcp_connection(service_name, mcp_command)
530
+ )
531
+ loop.close()
532
+
533
+ # Add connection test results to details
534
+ details["connection_test"] = {
535
+ "connected": connection_result["connected"],
536
+ "response_time_ms": connection_result["response_time"],
537
+ "tools_discovered": connection_result["tools_count"],
538
+ "tools_sample": connection_result["tools"],
539
+ "error": connection_result["error"],
540
+ }
541
+ except Exception as e:
542
+ details["connection_test"] = {
543
+ "connected": False,
544
+ "error": f"Test failed: {e!s}",
545
+ }
546
+
547
+ # Determine status
548
+ if not (pipx_installed or accessible):
549
+ return DiagnosticResult(
550
+ category=f"MCP Service: {service_name}",
551
+ status=ValidationSeverity.WARNING,
552
+ message=f"Not installed: {config['description']}",
553
+ details=details,
554
+ fix_command=f"pipx install {config['package']}",
555
+ fix_description=f"Install {service_name} for {config['description']}",
556
+ )
557
+
558
+ if pipx_installed and not accessible:
559
+ # Check if pipx run works
560
+ if details.get("pipx_run_available"):
561
+ # Include connection test info if available
562
+ connection_info = details.get("connection_test", {})
563
+ if connection_info.get("connected"):
564
+ message = f"Installed via pipx, connection OK ({connection_info.get('tools_discovered', 0)} tools)"
565
+ elif connection_info.get("error"):
566
+ message = f"Installed via pipx, connection failed: {connection_info['error']}"
567
+ else:
568
+ message = "Installed via pipx (use 'pipx run' to execute)"
569
+
570
+ return DiagnosticResult(
571
+ category=f"MCP Service: {service_name}",
572
+ status=(
573
+ OperationResult.SUCCESS
574
+ if connection_info.get("connected")
575
+ else ValidationSeverity.WARNING
576
+ ),
577
+ message=message,
578
+ details=details,
579
+ )
580
+ return DiagnosticResult(
581
+ category=f"MCP Service: {service_name}",
582
+ status=ValidationSeverity.WARNING,
583
+ message="Installed via pipx but not in PATH",
584
+ details=details,
585
+ fix_command="pipx ensurepath",
586
+ fix_description="Ensure pipx bin directory is in PATH",
587
+ )
588
+
589
+ # Service is accessible - check connection test results
590
+ connection_info = details.get("connection_test", {})
591
+ if connection_info:
592
+ if connection_info.get("connected"):
593
+ response_time = connection_info.get("response_time_ms")
594
+ tools_count = connection_info.get("tools_discovered", 0)
595
+ message = f"Installed, accessible, connection OK ({tools_count} tools, {response_time}ms)"
596
+ status = OperationResult.SUCCESS
597
+ else:
598
+ error = connection_info.get("error", "Unknown error")
599
+ message = f"Installed but connection failed: {error}"
600
+ status = ValidationSeverity.WARNING
601
+ else:
602
+ message = "Installed and accessible"
603
+ status = OperationResult.SUCCESS
604
+
605
+ return DiagnosticResult(
606
+ category=f"MCP Service: {service_name}",
607
+ status=status,
608
+ message=message,
609
+ details=details,
610
+ )
611
+
612
+ def _check_pipx_installation(self, package_name: str) -> Tuple[bool, Optional[str]]:
613
+ """Check if a package is installed via pipx."""
614
+ try:
615
+ result = subprocess.run(
616
+ ["pipx", "list", "--json"],
617
+ capture_output=True,
618
+ text=True,
619
+ timeout=5,
620
+ check=False,
621
+ )
622
+
623
+ if result.returncode == 0:
624
+ try:
625
+ data = json.loads(result.stdout)
626
+ venvs = data.get("venvs", {})
627
+
628
+ if package_name in venvs:
629
+ venv_info = venvs[package_name]
630
+ # Get the main app path
631
+ apps = (
632
+ venv_info.get("metadata", {})
633
+ .get("main_package", {})
634
+ .get("apps", [])
635
+ )
636
+ if apps:
637
+ app_path = (
638
+ venv_info.get("metadata", {})
639
+ .get("main_package", {})
640
+ .get("app_paths", [])
641
+ )
642
+ if app_path:
643
+ return True, app_path[0]
644
+ return True, None
645
+ except json.JSONDecodeError:
646
+ pass
647
+ except (subprocess.SubprocessError, FileNotFoundError):
648
+ pass
649
+
650
+ return False, None
651
+
652
+ def _check_command_accessible(
653
+ self, command: List[str]
654
+ ) -> Tuple[bool, Optional[str]]:
655
+ """Check if a command is accessible in PATH."""
656
+ try:
657
+ # Use 'which' on Unix-like systems
658
+ result = subprocess.run(
659
+ ["which", command[0]],
660
+ capture_output=True,
661
+ text=True,
662
+ timeout=2,
663
+ check=False,
664
+ )
665
+
666
+ if result.returncode == 0:
667
+ path = result.stdout.strip()
668
+ # Verify the command actually works with --version
669
+ if self._verify_command_works(command):
670
+ return True, path
671
+ return False, path
672
+ except (subprocess.SubprocessError, FileNotFoundError):
673
+ pass
674
+
675
+ # Try direct execution with --version
676
+ if self._verify_command_works(command):
677
+ return True, None
678
+
679
+ return False, None
680
+
681
+ def _verify_command_works(self, command: List[str]) -> bool:
682
+ """Verify a command actually works by checking its --version output."""
683
+ try:
684
+ result = subprocess.run(
685
+ command,
686
+ capture_output=True,
687
+ text=True,
688
+ timeout=5,
689
+ check=False,
690
+ )
691
+
692
+ # Check for successful execution or version output
693
+ # Don't accept error messages containing "help" or "usage" as success
694
+ if result.returncode == 0:
695
+ # Look for actual version information
696
+ output = (result.stdout + result.stderr).lower()
697
+ # Check for version indicators
698
+ if any(
699
+ keyword in output
700
+ for keyword in ["version", "v1.", "v0.", "1.", "0."]
701
+ ) and not any(
702
+ error in output
703
+ for error in [
704
+ "error",
705
+ "not found",
706
+ "no such",
707
+ "command not found",
708
+ ]
709
+ ):
710
+ return True
711
+
712
+ # For some tools, non-zero return code is OK if version is shown
713
+ elif "--version" in command or "--help" in command:
714
+ output = (result.stdout + result.stderr).lower()
715
+ # Must have version info and no error indicators
716
+ if (
717
+ "version" in output or "v1." in output or "v0." in output
718
+ ) and not any(
719
+ error in output
720
+ for error in [
721
+ "error",
722
+ "not found",
723
+ "no such",
724
+ "command not found",
725
+ "traceback",
726
+ ]
727
+ ):
728
+ return True
729
+
730
+ except (subprocess.SubprocessError, FileNotFoundError, OSError):
731
+ pass
732
+
733
+ return False
734
+
735
+ def _check_alternative_installations(
736
+ self, service_name: str
737
+ ) -> Tuple[bool, Optional[str]]:
738
+ """Check for alternative installation locations."""
739
+ # Common installation paths
740
+ paths_to_check = [
741
+ Path.home() / ".local" / "bin" / service_name,
742
+ Path("/usr/local/bin") / service_name,
743
+ Path("/opt") / service_name / "bin" / service_name,
744
+ Path.home() / ".npm" / "bin" / service_name, # For npm-based services
745
+ Path.home() / ".cargo" / "bin" / service_name, # For Rust-based services
746
+ ]
747
+
748
+ for path in paths_to_check:
749
+ if path.exists():
750
+ return True, str(path)
751
+
752
+ return False, None
753
+
754
+ def _get_service_version(self, command: List[str]) -> Optional[str]:
755
+ """Get version information for a service."""
756
+ try:
757
+ result = subprocess.run(
758
+ command,
759
+ capture_output=True,
760
+ text=True,
761
+ timeout=2,
762
+ check=False,
763
+ )
764
+
765
+ if result.returncode == 0:
766
+ output = result.stdout.strip()
767
+ # Try to extract version from output
768
+ lines = output.split("\n")
769
+ for line in lines:
770
+ if "version" in line.lower() or "v" in line.lower():
771
+ return line.strip()
772
+ # Return first line if no version line found
773
+ if lines:
774
+ return lines[0].strip()
775
+ except (subprocess.SubprocessError, FileNotFoundError):
776
+ pass
777
+
778
+ return None
779
+
780
+ def _check_and_fix_kuzu_memory_config(self) -> Optional[DiagnosticResult]:
781
+ """Check for incorrect kuzu-memory configuration in .claude.json and offer auto-fix."""
782
+ claude_config_path = Path.home() / ".claude.json"
783
+
784
+ if not claude_config_path.exists():
785
+ return None
786
+
787
+ try:
788
+ with claude_config_path.open() as f:
789
+ config = json.load(f)
790
+
791
+ mcp_servers = config.get("mcpServers", {})
792
+ kuzu_config = mcp_servers.get("kuzu-memory")
793
+
794
+ if not kuzu_config:
795
+ return None
796
+
797
+ # Check if kuzu-memory has incorrect args
798
+ args = kuzu_config.get("args", [])
799
+ needs_fix = False
800
+ fix_reason = ""
801
+ # The correct args for kuzu-memory v1.1.0+ are ["mcp", "serve"]
802
+ correct_args = ["mcp", "serve"]
803
+
804
+ # Check for any configuration that is NOT the correct one
805
+ if args != correct_args:
806
+ needs_fix = True
807
+ # Identify the specific issue
808
+ if args == ["claude", "mcp-server"]:
809
+ fix_reason = "Outdated 'claude mcp-server' format (pre-v1.1.0)"
810
+ elif args == ["serve"]:
811
+ fix_reason = "Legacy 'serve' format"
812
+ elif args == ["mcp-server"]:
813
+ fix_reason = "Incorrect 'mcp-server' format"
814
+ elif args == []:
815
+ fix_reason = "Empty args list"
816
+ else:
817
+ fix_reason = f"Incorrect args format: {args}"
818
+
819
+ if needs_fix:
820
+ # Log the issue for debugging
821
+ self.logger.warning(
822
+ f"Found incorrect kuzu-memory configuration: {fix_reason}. "
823
+ f"Current args: {args}, should be: {correct_args}"
824
+ )
825
+
826
+ # Auto-fix the configuration
827
+ fixed = self._fix_kuzu_memory_args(
828
+ claude_config_path, config, correct_args
829
+ )
830
+
831
+ if fixed:
832
+ return DiagnosticResult(
833
+ category="kuzu-memory Configuration Fix",
834
+ status=OperationResult.SUCCESS,
835
+ message="Fixed kuzu-memory configuration to use correct args",
836
+ details={
837
+ "old_args": args,
838
+ "new_args": correct_args,
839
+ "reason": fix_reason,
840
+ "auto_fixed": True,
841
+ },
842
+ )
843
+ return DiagnosticResult(
844
+ category="kuzu-memory Configuration",
845
+ status=ValidationSeverity.WARNING,
846
+ message="kuzu-memory has incorrect configuration",
847
+ details={
848
+ "current_args": args,
849
+ "correct_args": correct_args,
850
+ "reason": fix_reason,
851
+ "auto_fix_failed": True,
852
+ },
853
+ fix_command="claude-mpm configure --mcp --fix-kuzu",
854
+ fix_description="Fix kuzu-memory configuration manually",
855
+ )
856
+
857
+ # Configuration is correct - args match ["mcp", "serve"]
858
+ return None
859
+
860
+ except (json.JSONDecodeError, Exception) as e:
861
+ self.logger.debug(f"Could not check kuzu-memory config: {e}")
862
+ return None
863
+
864
+ def _fix_kuzu_memory_args(
865
+ self, config_path: Path, config: Dict, new_args: List[str]
866
+ ) -> bool:
867
+ """Fix kuzu-memory args in the configuration."""
868
+ try:
869
+ # Save old args before updating
870
+ old_args = config["mcpServers"]["kuzu-memory"].get("args", [])
871
+
872
+ # Log the exact change we're about to make
873
+ self.logger.debug(
874
+ f"Fixing kuzu-memory args: old={old_args}, new={new_args}"
875
+ )
876
+
877
+ # Create backup
878
+ backup_path = config_path.with_suffix(".json.backup")
879
+ with backup_path.open("w") as f:
880
+ json.dump(config, f, indent=2)
881
+
882
+ # Update the configuration - ensure we're setting the exact new_args
883
+ config["mcpServers"]["kuzu-memory"]["args"] = new_args
884
+
885
+ # Verify the update in memory before writing
886
+ if config["mcpServers"]["kuzu-memory"]["args"] != new_args:
887
+ self.logger.error(
888
+ f"Failed to update args in memory! "
889
+ f"Expected {new_args}, got {config['mcpServers']['kuzu-memory']['args']}"
890
+ )
891
+ return False
892
+
893
+ # Write updated configuration
894
+ with config_path.open("w") as f:
895
+ json.dump(config, f, indent=2)
896
+
897
+ # Verify the file was written correctly
898
+ with config_path.open() as f:
899
+ verify_config = json.load(f)
900
+ verify_args = (
901
+ verify_config.get("mcpServers", {})
902
+ .get("kuzu-memory", {})
903
+ .get("args", [])
904
+ )
905
+
906
+ if verify_args != new_args:
907
+ self.logger.error(
908
+ f"Configuration write verification failed! "
909
+ f"Expected {new_args}, got {verify_args}"
910
+ )
911
+ # Restore backup
912
+ with backup_path.open() as bf:
913
+ backup_config = json.load(bf)
914
+ with config_path.open("w") as f:
915
+ json.dump(backup_config, f, indent=2)
916
+ return False
917
+
918
+ self.logger.info(
919
+ f"✅ Fixed kuzu-memory configuration in {config_path}\n"
920
+ f" Changed args from {old_args} to {new_args}\n"
921
+ f" Backup saved to {backup_path}"
922
+ )
923
+
924
+ return True
925
+
926
+ except Exception as e:
927
+ self.logger.error(f"Failed to fix kuzu-memory configuration: {e}")
928
+ return False
929
+
930
+ def _check_gateway_configuration(self) -> DiagnosticResult:
931
+ """Check if MCP services are configured in the gateway."""
932
+ try:
933
+ # Check Claude config file (the correct location for Claude Code)
934
+ config_file = Path.home() / ".claude.json"
935
+
936
+ if not config_file.exists():
937
+ return DiagnosticResult(
938
+ category="MCP Gateway Configuration",
939
+ status=ValidationSeverity.WARNING,
940
+ message="Claude configuration file not found",
941
+ details={"config_path": str(config_file), "exists": False},
942
+ fix_command="claude-mpm configure --mcp",
943
+ fix_description="Initialize Claude configuration",
944
+ )
945
+
946
+ with config_file.open() as f:
947
+ config = json.load(f)
948
+
949
+ # Get the current project configuration
950
+ from pathlib import Path
951
+
952
+ current_project = str(Path.cwd())
953
+
954
+ # Check if current project has MCP servers configured
955
+ projects = config.get("projects", {})
956
+ if current_project not in projects:
957
+ return DiagnosticResult(
958
+ category="MCP Gateway Configuration",
959
+ status=ValidationSeverity.WARNING,
960
+ message="Current project not configured in Claude",
961
+ details={
962
+ "config_path": str(config_file),
963
+ "project": current_project,
964
+ },
965
+ fix_command="claude-mpm configure --mcp",
966
+ fix_description="Configure MCP services for current project",
967
+ )
968
+
969
+ project_config = projects[current_project]
970
+ mcp_servers = project_config.get("mcpServers", {})
971
+
972
+ configured_services = []
973
+ missing_services = []
974
+
975
+ for service_name in self.MCP_SERVICES:
976
+ if service_name in mcp_servers:
977
+ configured_services.append(service_name)
978
+ else:
979
+ missing_services.append(service_name)
980
+
981
+ details = {
982
+ "config_path": str(config_file),
983
+ "configured_services": configured_services,
984
+ "missing_services": missing_services,
985
+ }
986
+
987
+ if not configured_services:
988
+ return DiagnosticResult(
989
+ category="MCP Gateway Configuration",
990
+ status=ValidationSeverity.WARNING,
991
+ message="No MCP services configured in gateway",
992
+ details=details,
993
+ fix_command="claude-mpm configure --mcp --add-services",
994
+ fix_description="Add MCP services to gateway configuration",
995
+ )
996
+
997
+ if missing_services:
998
+ return DiagnosticResult(
999
+ category="MCP Gateway Configuration",
1000
+ status=ValidationSeverity.WARNING,
1001
+ message=f"{len(configured_services)} services configured, {len(missing_services)} missing",
1002
+ details=details,
1003
+ )
1004
+
1005
+ return DiagnosticResult(
1006
+ category="MCP Gateway Configuration",
1007
+ status=OperationResult.SUCCESS,
1008
+ message=f"All {len(configured_services)} services configured",
1009
+ details=details,
1010
+ )
1011
+
1012
+ except json.JSONDecodeError as e:
1013
+ return DiagnosticResult(
1014
+ category="MCP Gateway Configuration",
1015
+ status=ValidationSeverity.ERROR,
1016
+ message="Invalid JSON in MCP configuration",
1017
+ details={"error": str(e)},
1018
+ )
1019
+ except Exception as e:
1020
+ return DiagnosticResult(
1021
+ category="MCP Gateway Configuration",
1022
+ status=ValidationSeverity.WARNING,
1023
+ message=f"Could not check configuration: {e!s}",
1024
+ details={"error": str(e)},
1025
+ )
1026
+
1027
+ def _ensure_mcp_ticketer_gql_dependency(self) -> bool:
1028
+ """Ensure mcp-ticketer has the gql dependency injected."""
1029
+ try:
1030
+ # First check if mcp-ticketer can import gql
1031
+ result = subprocess.run(
1032
+ ["pipx", "run", "--spec", "mcp-ticketer", "python", "-c", "import gql"],
1033
+ capture_output=True,
1034
+ text=True,
1035
+ timeout=5,
1036
+ check=False,
1037
+ )
1038
+
1039
+ # If import fails, inject the dependency
1040
+ if result.returncode != 0:
1041
+ self.logger.info("🔧 mcp-ticketer missing gql dependency, fixing...")
1042
+
1043
+ inject_result = subprocess.run(
1044
+ ["pipx", "inject", "mcp-ticketer", "gql"],
1045
+ capture_output=True,
1046
+ text=True,
1047
+ timeout=30,
1048
+ check=False,
1049
+ )
1050
+
1051
+ if inject_result.returncode == 0:
1052
+ self.logger.info(
1053
+ "✅ Successfully injected gql dependency into mcp-ticketer"
1054
+ )
1055
+ return True
1056
+ self.logger.warning(
1057
+ f"Failed to inject gql dependency: {inject_result.stderr}"
1058
+ )
1059
+ return False
1060
+
1061
+ # Dependency already present
1062
+ return False
1063
+
1064
+ except Exception as e:
1065
+ self.logger.debug(f"Could not check/fix mcp-ticketer gql dependency: {e}")
1066
+ return False