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
@@ -0,0 +1,868 @@
1
+ """MCP external services setup module.
2
+
3
+ This module handles the registration of external MCP services
4
+ (mcp-vector-search, mcp-browser) as separate MCP servers in Claude Code.
5
+ """
6
+
7
+ import json
8
+ import subprocess
9
+ import sys
10
+ from datetime import timezone
11
+ from pathlib import Path
12
+ from typing import Dict, Optional, Tuple
13
+
14
+
15
+ class MCPExternalServicesSetup:
16
+ """Handles setup of external MCP services in Claude Code configuration."""
17
+
18
+ def get_project_services(self, project_path: Path) -> Dict:
19
+ """Get external services configuration for the current project.
20
+
21
+ Args:
22
+ project_path: Path to the project directory
23
+
24
+ Returns:
25
+ Dict: Configuration for external services
26
+ """
27
+ # Detect best command paths for services
28
+ mcp_browser_config = self._get_best_service_config("mcp-browser", project_path)
29
+ mcp_vector_search_config = self._get_best_service_config(
30
+ "mcp-vector-search", project_path
31
+ )
32
+
33
+ return {
34
+ "mcp-vector-search": {
35
+ "package_name": "mcp-vector-search",
36
+ "module_name": "mcp_vector_search",
37
+ "description": "Semantic code search with vector embeddings",
38
+ "config": mcp_vector_search_config,
39
+ },
40
+ "mcp-browser": {
41
+ "package_name": "mcp-browser",
42
+ "module_name": "mcp_browser",
43
+ "description": "Web browsing and content extraction",
44
+ "config": mcp_browser_config,
45
+ },
46
+ }
47
+
48
+ def _get_best_service_config(self, service_name: str, project_path: Path) -> Dict:
49
+ """Get the best configuration for a service.
50
+
51
+ Priority order:
52
+ 1. Pipx installation (preferred for isolation and reliability)
53
+ 2. Local development installation (e.g., ~/Projects/managed/)
54
+ 3. Local project venv
55
+ 4. System Python
56
+
57
+ Args:
58
+ service_name: Name of the service
59
+ project_path: Path to the project directory
60
+
61
+ Returns:
62
+ Dict: Service configuration
63
+ """
64
+ # First try pipx (preferred for isolation and reliability)
65
+ pipx_config = self._get_pipx_config(service_name, project_path)
66
+ if pipx_config:
67
+ # Verify the executable actually exists before using it
68
+ command = pipx_config.get("command", "")
69
+ if Path(command).exists():
70
+ return pipx_config
71
+
72
+ # Then try local development installations
73
+ local_dev_config = self._get_local_dev_config(service_name, project_path)
74
+ if local_dev_config:
75
+ # Verify the command exists
76
+ command = local_dev_config.get("command", "")
77
+ if Path(command).exists():
78
+ return local_dev_config
79
+
80
+ # Then try local venv if exists
81
+ venv_config = self._get_venv_config(service_name, project_path)
82
+ if venv_config:
83
+ command = venv_config.get("command", "")
84
+ if Path(command).exists():
85
+ return venv_config
86
+
87
+ # Fall back to system Python
88
+ return self._get_system_config(service_name, project_path)
89
+
90
+ def _get_local_dev_config(
91
+ self, service_name: str, project_path: Path
92
+ ) -> Optional[Dict]:
93
+ """Get configuration for a locally developed service.
94
+
95
+ Checks common development locations like ~/Projects/managed/
96
+
97
+ Args:
98
+ service_name: Name of the service
99
+ project_path: Path to the project directory
100
+
101
+ Returns:
102
+ Configuration dict or None if not available
103
+ """
104
+ # Check common local development locations
105
+ dev_locations = [
106
+ Path.home() / "Projects" / "managed" / service_name,
107
+ Path.home() / "Projects" / service_name,
108
+ Path.home() / "Development" / service_name,
109
+ Path.home() / "dev" / service_name,
110
+ ]
111
+
112
+ for dev_path in dev_locations:
113
+ if not dev_path.exists():
114
+ continue
115
+
116
+ # Check for venv in the development location
117
+ venv_paths = [
118
+ dev_path / ".venv" / "bin" / "python",
119
+ dev_path / "venv" / "bin" / "python",
120
+ dev_path / "env" / "bin" / "python",
121
+ ]
122
+
123
+ for venv_python in venv_paths:
124
+ if venv_python.exists():
125
+ # Special handling for mcp-browser
126
+ if service_name == "mcp-browser":
127
+ # First check for mcp-browser binary in the same directory as python
128
+ mcp_browser_binary = venv_python.parent / "mcp-browser"
129
+ if mcp_browser_binary.exists():
130
+ return {
131
+ "type": "stdio",
132
+ "command": str(mcp_browser_binary),
133
+ "args": ["mcp"],
134
+ "env": {
135
+ "MCP_BROWSER_HOME": str(
136
+ Path.home() / ".mcp-browser"
137
+ )
138
+ },
139
+ }
140
+
141
+ # Then check for mcp-server.py
142
+ mcp_server = dev_path / "mcp-server.py"
143
+ if mcp_server.exists():
144
+ return {
145
+ "type": "stdio",
146
+ "command": str(venv_python),
147
+ "args": [str(mcp_server)],
148
+ "env": {
149
+ "MCP_BROWSER_HOME": str(
150
+ Path.home() / ".mcp-browser"
151
+ ),
152
+ "PYTHONPATH": str(dev_path),
153
+ },
154
+ }
155
+
156
+ # Check if the package is installed in this venv
157
+ module_name = service_name.replace("-", "_")
158
+ try:
159
+ result = subprocess.run(
160
+ [str(venv_python), "-c", f"import {module_name}"],
161
+ capture_output=True,
162
+ timeout=5,
163
+ check=False,
164
+ )
165
+ if result.returncode == 0:
166
+ # Use special configuration for local dev
167
+ if service_name == "mcp-vector-search":
168
+ return {
169
+ "type": "stdio",
170
+ "command": str(venv_python),
171
+ "args": [
172
+ "-m",
173
+ "mcp_vector_search.mcp.server",
174
+ str(project_path),
175
+ ],
176
+ "env": {},
177
+ }
178
+ if service_name == "mcp-browser":
179
+ # Fallback for mcp-browser without mcp-server.py
180
+ return {
181
+ "type": "stdio",
182
+ "command": str(venv_python),
183
+ "args": ["-m", "mcp_browser", "mcp"],
184
+ "env": {
185
+ "MCP_BROWSER_HOME": str(
186
+ Path.home() / ".mcp-browser"
187
+ ),
188
+ "PYTHONPATH": str(dev_path),
189
+ },
190
+ }
191
+ except Exception:
192
+ continue
193
+
194
+ return None
195
+
196
+ def _get_venv_config(self, service_name: str, project_path: Path) -> Optional[Dict]:
197
+ """Get configuration for a service in the local virtual environment.
198
+
199
+ Args:
200
+ service_name: Name of the service
201
+ project_path: Path to the project directory
202
+
203
+ Returns:
204
+ Configuration dict or None if not available
205
+ """
206
+ # Check common venv locations
207
+ venv_paths = [
208
+ project_path / "venv" / "bin" / "python",
209
+ project_path / ".venv" / "bin" / "python",
210
+ project_path / "env" / "bin" / "python",
211
+ ]
212
+
213
+ for venv_python in venv_paths:
214
+ if venv_python.exists():
215
+ # Check if the package is installed in this venv
216
+ module_name = service_name.replace("-", "_")
217
+ try:
218
+ result = subprocess.run(
219
+ [str(venv_python), "-c", f"import {module_name}"],
220
+ capture_output=True,
221
+ timeout=5,
222
+ check=False,
223
+ )
224
+ if result.returncode == 0:
225
+ return self._create_service_config(
226
+ service_name, str(venv_python), project_path
227
+ )
228
+ except Exception:
229
+ continue
230
+
231
+ return None
232
+
233
+ def _get_system_config(self, service_name: str, project_path: Path) -> Dict:
234
+ """Get configuration using system Python.
235
+
236
+ Args:
237
+ service_name: Name of the service
238
+ project_path: Path to the project directory
239
+
240
+ Returns:
241
+ Configuration dict
242
+ """
243
+ return self._create_service_config(service_name, sys.executable, project_path)
244
+
245
+ def _create_service_config(
246
+ self, service_name: str, python_path: str, project_path: Path
247
+ ) -> Dict:
248
+ """Create service configuration for the given Python executable.
249
+
250
+ Args:
251
+ service_name: Name of the service
252
+ python_path: Path to Python executable
253
+ project_path: Path to the project directory
254
+
255
+ Returns:
256
+ Configuration dict
257
+ """
258
+ if service_name == "mcp-browser":
259
+ # Check if mcp-browser binary exists (for pipx installations)
260
+ binary_path = Path(python_path).parent / "mcp-browser"
261
+ if binary_path.exists():
262
+ return {
263
+ "type": "stdio",
264
+ "command": str(binary_path),
265
+ "args": ["mcp"],
266
+ "env": {"MCP_BROWSER_HOME": str(Path.home() / ".mcp-browser")},
267
+ }
268
+ # Use Python module invocation
269
+ return {
270
+ "type": "stdio",
271
+ "command": python_path,
272
+ "args": ["-m", "mcp_browser", "mcp"],
273
+ "env": {"MCP_BROWSER_HOME": str(Path.home() / ".mcp-browser")},
274
+ }
275
+ if service_name == "mcp-vector-search":
276
+ return {
277
+ "type": "stdio",
278
+ "command": python_path,
279
+ "args": ["-m", "mcp_vector_search.mcp.server", str(project_path)],
280
+ "env": {},
281
+ }
282
+ # Generic configuration for other services
283
+ module_name = service_name.replace("-", "_")
284
+ return {
285
+ "type": "stdio",
286
+ "command": python_path,
287
+ "args": ["-m", module_name],
288
+ "env": {},
289
+ }
290
+
291
+ def detect_mcp_installations(self) -> Dict[str, Dict]:
292
+ """Detect all MCP service installations and their locations.
293
+
294
+ Returns:
295
+ Dict mapping service name to installation info:
296
+ {
297
+ "service-name": {
298
+ "type": "local_dev" | "pipx" | "venv" | "system" | "not_installed",
299
+ "path": "/path/to/installation",
300
+ "config": {...} # Ready-to-use configuration
301
+ }
302
+ }
303
+ """
304
+ installations = {}
305
+ project_path = Path.cwd()
306
+
307
+ for service_name in ["mcp-browser", "mcp-vector-search"]:
308
+ # Try each detection method in priority order
309
+ local_dev_config = self._get_local_dev_config(service_name, project_path)
310
+ if local_dev_config:
311
+ installations[service_name] = {
312
+ "type": "local_dev",
313
+ "path": local_dev_config["command"],
314
+ "config": local_dev_config,
315
+ }
316
+ continue
317
+
318
+ pipx_config = self._get_pipx_config(service_name, project_path)
319
+ if pipx_config:
320
+ # Verify the command actually exists before reporting it as available
321
+ command_path = Path(pipx_config["command"])
322
+ if command_path.exists():
323
+ installations[service_name] = {
324
+ "type": "pipx",
325
+ "path": pipx_config["command"],
326
+ "config": pipx_config,
327
+ }
328
+ continue
329
+
330
+ venv_config = self._get_venv_config(service_name, project_path)
331
+ if venv_config:
332
+ installations[service_name] = {
333
+ "type": "venv",
334
+ "path": venv_config["command"],
335
+ "config": venv_config,
336
+ }
337
+ continue
338
+
339
+ # Check if available in system Python
340
+ module_name = service_name.replace("-", "_")
341
+ if self._check_python_package(module_name):
342
+ system_config = self._get_system_config(service_name, project_path)
343
+ installations[service_name] = {
344
+ "type": "system",
345
+ "path": system_config["command"],
346
+ "config": system_config,
347
+ }
348
+ else:
349
+ installations[service_name] = {
350
+ "type": "not_installed",
351
+ "path": None,
352
+ "config": None,
353
+ }
354
+
355
+ return installations
356
+
357
+ def update_mcp_json_with_detected(self, force: bool = False) -> bool:
358
+ """Update .mcp.json with auto-detected service configurations.
359
+
360
+ Args:
361
+ force: Whether to overwrite existing configurations
362
+
363
+ Returns:
364
+ bool: True if configuration was updated successfully
365
+ """
366
+ print("\nšŸ” Auto-detecting MCP service installations...")
367
+ print("=" * 50)
368
+
369
+ installations = self.detect_mcp_installations()
370
+
371
+ # Display detected installations
372
+ for service_name, info in installations.items():
373
+ print(f"\n{service_name}:")
374
+ if info["type"] == "not_installed":
375
+ print(" āŒ Not installed")
376
+ else:
377
+ type_emoji = {
378
+ "local_dev": "šŸ”§",
379
+ "pipx": "šŸ“¦",
380
+ "venv": "šŸ",
381
+ "system": "šŸ’»",
382
+ }.get(info["type"], "ā“")
383
+ print(f" {type_emoji} Type: {info['type']}")
384
+ print(f" šŸ“ Path: {info['path']}")
385
+
386
+ # Load current configuration
387
+ config_path = Path.cwd() / ".mcp.json"
388
+ config = self._load_config(config_path)
389
+ if not config:
390
+ print("\nāŒ Failed to load configuration")
391
+ return False
392
+
393
+ # Update configurations
394
+ updated = False
395
+ for service_name, info in installations.items():
396
+ if info["type"] == "not_installed":
397
+ continue
398
+
399
+ # Check if already configured
400
+ if service_name in config.get("mcpServers", {}) and not force:
401
+ print(
402
+ f"\nāš ļø {service_name} already configured, skipping (use --force to override)"
403
+ )
404
+ continue
405
+
406
+ # Update configuration
407
+ if "mcpServers" not in config:
408
+ config["mcpServers"] = {}
409
+
410
+ config["mcpServers"][service_name] = info["config"]
411
+ print(f"\nāœ… Updated {service_name} configuration")
412
+ updated = True
413
+
414
+ # Save configuration if updated
415
+ if updated:
416
+ if self._save_config(config, config_path):
417
+ print(
418
+ "\nāœ… Successfully updated .mcp.json with detected configurations"
419
+ )
420
+ return True
421
+ print("\nāŒ Failed to save configuration")
422
+ return False
423
+ print("\nšŸ“Œ No updates needed")
424
+ return True
425
+
426
+ def __init__(self, logger):
427
+ """Initialize the external services setup handler."""
428
+ self.logger = logger
429
+ self._pipx_path = Path.home() / ".local" / "pipx" / "venvs"
430
+
431
+ def setup_external_services(self, force: bool = False) -> bool:
432
+ """Setup external MCP services in project .mcp.json file.
433
+
434
+ Args:
435
+ force: Whether to overwrite existing configurations
436
+
437
+ Returns:
438
+ bool: True if all services were set up successfully
439
+ """
440
+ print("\nšŸ“¦ Setting up External MCP Services")
441
+ print("=" * 50)
442
+
443
+ # Use project-level .mcp.json file
444
+ project_path = Path.cwd()
445
+ config_path = project_path / ".mcp.json"
446
+
447
+ print(f"šŸ“ Project directory: {project_path}")
448
+ print(f"šŸ“„ Using config: {config_path}")
449
+
450
+ # Load existing configuration
451
+ config = self._load_config(config_path)
452
+ if config is None:
453
+ print("āŒ Failed to load configuration")
454
+ return False
455
+
456
+ # Ensure mcpServers section exists
457
+ if "mcpServers" not in config:
458
+ config["mcpServers"] = {}
459
+
460
+ # Setup each external service
461
+ success_count = 0
462
+ for service_name, service_info in self.get_project_services(
463
+ project_path
464
+ ).items():
465
+ if self._setup_service(config, service_name, service_info, force):
466
+ success_count += 1
467
+
468
+ # Save the updated configuration
469
+ if success_count > 0:
470
+ if self._save_config(config, config_path):
471
+ print(
472
+ f"\nāœ… Successfully configured {success_count} external services in .mcp.json"
473
+ )
474
+ print("\nšŸ“Œ Note: Claude Code will automatically load these services")
475
+ print(" when you open this project directory in Claude Code.")
476
+ return True
477
+ print("āŒ Failed to save configuration")
478
+ return False
479
+ print("\nāš ļø No external services were configured")
480
+ return False
481
+
482
+ def _setup_service(
483
+ self, config: Dict, service_name: str, service_info: Dict, force: bool
484
+ ) -> bool:
485
+ """Setup a single external MCP service.
486
+
487
+ Args:
488
+ config: The Claude Code configuration
489
+ service_name: Name of the service to setup
490
+ service_info: Service configuration information
491
+ force: Whether to overwrite existing configuration
492
+
493
+ Returns:
494
+ bool: True if service was set up successfully
495
+ """
496
+ print(f"\nšŸ“¦ Setting up {service_name}...")
497
+
498
+ # Check if already configured
499
+ if service_name in config["mcpServers"] and not force:
500
+ existing_config = config["mcpServers"][service_name]
501
+ print(f" āš ļø {service_name} already configured")
502
+ print(f" Current command: {existing_config.get('command')}")
503
+ print(f" Current args: {existing_config.get('args')}")
504
+
505
+ # Check if it's using a local development path
506
+ command = str(existing_config.get("command", ""))
507
+ if any(
508
+ path in command
509
+ for path in ["/Projects/managed/", "/Projects/", "/Development/"]
510
+ ):
511
+ print(" šŸ“ Using local development version")
512
+ response = (
513
+ input(" Keep local development version? (Y/n): ").strip().lower()
514
+ )
515
+ if response not in ["n", "no"]:
516
+ print(
517
+ f" āœ… Keeping existing local configuration for {service_name}"
518
+ )
519
+ return True # Consider it successfully configured
520
+ else:
521
+ response = input(" Overwrite? (y/N): ").strip().lower()
522
+ if response not in ["y", "yes"]:
523
+ print(f" ā­ļø Skipping {service_name}")
524
+ return False
525
+
526
+ # Check if Python package is available
527
+ module_name = service_info.get("module_name", service_name.replace("-", "_"))
528
+ if not self._check_python_package(module_name):
529
+ print(f" āš ļø Python package {service_info['package_name']} not installed")
530
+ print(f" [INFO]ļø Installing {service_info['package_name']}...")
531
+ if not self._install_python_package(service_info["package_name"]):
532
+ print(f" āŒ Failed to install {service_info['package_name']}")
533
+ print(
534
+ f" [INFO]ļø Install manually with: pip install {service_info['package_name']}"
535
+ )
536
+ return False
537
+
538
+ # Add service configuration
539
+ config["mcpServers"][service_name] = service_info["config"]
540
+ print(f" āœ… Configured {service_name}")
541
+ print(f" Command: {service_info['config']['command']}")
542
+ print(f" Args: {service_info['config']['args']}")
543
+ if "env" in service_info["config"]:
544
+ print(f" Environment: {list(service_info['config']['env'].keys())}")
545
+
546
+ return True
547
+
548
+ def check_and_install_pip_packages(self) -> bool:
549
+ """Check and install Python packages for external services.
550
+
551
+ Returns:
552
+ bool: True if all packages are available
553
+ """
554
+ print("\nšŸ Checking Python packages for external services...")
555
+
556
+ packages_to_check = [
557
+ ("mcp-vector-search", "mcp_vector_search"),
558
+ ("mcp-browser", "mcp_browser"),
559
+ ]
560
+
561
+ all_installed = True
562
+ for package_name, module_name in packages_to_check:
563
+ if self._check_python_package(module_name):
564
+ print(f" āœ… {package_name} is installed")
565
+ else:
566
+ print(f" šŸ“¦ Installing {package_name}...")
567
+ if self._install_python_package(package_name):
568
+ print(f" āœ… Successfully installed {package_name}")
569
+ else:
570
+ print(f" āŒ Failed to install {package_name}")
571
+ all_installed = False
572
+
573
+ return all_installed
574
+
575
+ def _check_python_package(self, module_name: str) -> bool:
576
+ """Check if a Python package is installed.
577
+
578
+ Args:
579
+ module_name: Name of the module to import
580
+
581
+ Returns:
582
+ bool: True if package is installed
583
+ """
584
+ try:
585
+ import importlib.util
586
+
587
+ spec = importlib.util.find_spec(module_name)
588
+ return spec is not None
589
+ except (ImportError, ModuleNotFoundError):
590
+ return False
591
+
592
+ def _install_python_package(self, package_name: str) -> bool:
593
+ """Install a Python package using pip.
594
+
595
+ Args:
596
+ package_name: Name of the package to install
597
+
598
+ Returns:
599
+ bool: True if installation was successful
600
+ """
601
+ try:
602
+ result = subprocess.run(
603
+ [sys.executable, "-m", "pip", "install", package_name],
604
+ capture_output=True,
605
+ text=True,
606
+ timeout=60,
607
+ check=False,
608
+ )
609
+ return result.returncode == 0
610
+ except (subprocess.TimeoutExpired, subprocess.CalledProcessError):
611
+ return False
612
+
613
+ def _load_config(self, config_path: Path) -> Optional[Dict]:
614
+ """Load MCP configuration.
615
+
616
+ Args:
617
+ config_path: Path to the configuration file
618
+
619
+ Returns:
620
+ Optional[Dict]: Configuration dictionary or None if failed
621
+ """
622
+ try:
623
+ if config_path.exists():
624
+ with config_path.open() as f:
625
+ config = json.load(f)
626
+ # Ensure mcpServers key exists
627
+ if "mcpServers" not in config:
628
+ config["mcpServers"] = {}
629
+ return config
630
+ else:
631
+ # Create new configuration
632
+ print(" šŸ“ Creating new .mcp.json file")
633
+ return {"mcpServers": {}}
634
+ except (OSError, json.JSONDecodeError) as e:
635
+ print(f"āŒ Error loading config: {e}")
636
+ # Try to return empty config instead of None
637
+ return {"mcpServers": {}}
638
+
639
+ def _save_config(self, config: Dict, config_path: Path) -> bool:
640
+ """Save MCP configuration.
641
+
642
+ Args:
643
+ config: Configuration dictionary
644
+ config_path: Path to save the configuration
645
+
646
+ Returns:
647
+ bool: True if save was successful
648
+ """
649
+ try:
650
+ # Ensure directory exists
651
+ config_path.parent.mkdir(parents=True, exist_ok=True)
652
+
653
+ # Create backup if file exists
654
+ if config_path.exists():
655
+ from datetime import datetime
656
+
657
+ backup_path = (
658
+ config_path.parent
659
+ / f".mcp.backup.{datetime.now(timezone.utc).strftime('%Y%m%d_%H%M%S')}.json"
660
+ )
661
+ import shutil
662
+
663
+ shutil.copy2(config_path, backup_path)
664
+ print(f" šŸ“ Created backup: {backup_path}")
665
+
666
+ # Write configuration with proper formatting
667
+ with config_path.open("w") as f:
668
+ json.dump(config, f, indent=2)
669
+ f.write("\n") # Add newline at end of file
670
+
671
+ print(f" šŸ’¾ Saved configuration to {config_path}")
672
+ return True
673
+
674
+ except Exception as e:
675
+ print(f"āŒ Error saving config: {e}")
676
+ return False
677
+
678
+ def _get_pipx_config(self, package_name: str, project_path: Path) -> Optional[Dict]:
679
+ """Get configuration for a pipx-installed package.
680
+
681
+ Args:
682
+ package_name: Name of the package (e.g., "mcp-browser")
683
+ project_path: Path to the project directory
684
+
685
+ Returns:
686
+ Configuration dict for the service or None if not found
687
+ """
688
+ pipx_venv = self._pipx_path / package_name
689
+ if not pipx_venv.exists():
690
+ return None
691
+
692
+ if package_name == "mcp-browser":
693
+ # mcp-browser uses Python module invocation for MCP mode
694
+ python_path = pipx_venv / "bin" / "python"
695
+ if python_path.exists():
696
+ # Check if module is importable
697
+ try:
698
+ result = subprocess.run(
699
+ [str(python_path), "-c", "import mcp_browser.cli.main"],
700
+ capture_output=True,
701
+ timeout=5,
702
+ check=False,
703
+ )
704
+ if result.returncode == 0:
705
+ return {
706
+ "type": "stdio",
707
+ "command": str(python_path),
708
+ "args": ["-m", "mcp_browser.cli.main", "mcp"],
709
+ "env": {
710
+ "MCP_BROWSER_HOME": str(Path.home() / ".mcp-browser")
711
+ },
712
+ }
713
+ except Exception:
714
+ pass
715
+ elif package_name == "mcp-vector-search":
716
+ # mcp-vector-search uses Python module invocation
717
+ python_path = pipx_venv / "bin" / "python"
718
+ if python_path.exists():
719
+ # Check if module is importable
720
+ try:
721
+ result = subprocess.run(
722
+ [str(python_path), "-c", "import mcp_vector_search"],
723
+ capture_output=True,
724
+ timeout=5,
725
+ check=False,
726
+ )
727
+ if result.returncode == 0:
728
+ return {
729
+ "type": "stdio",
730
+ "command": str(python_path),
731
+ "args": [
732
+ "-m",
733
+ "mcp_vector_search.mcp.server",
734
+ str(project_path),
735
+ ],
736
+ "env": {},
737
+ }
738
+ except Exception:
739
+ pass
740
+
741
+ return None
742
+
743
+ def _check_pipx_installation(self, package_name: str) -> Tuple[bool, str]:
744
+ """Check if a package is installed via pipx.
745
+
746
+ Args:
747
+ package_name: Name of the package to check
748
+
749
+ Returns:
750
+ Tuple of (is_installed, installation_type)
751
+ """
752
+ pipx_venv = self._pipx_path / package_name
753
+ if pipx_venv.exists():
754
+ return True, "pipx"
755
+
756
+ # Check if available as Python module
757
+ module_name = package_name.replace("-", "_")
758
+ if self._check_python_package(module_name):
759
+ return True, "pip"
760
+
761
+ return False, "none"
762
+
763
+ def fix_browser_configuration(self) -> bool:
764
+ """Quick fix for mcp-browser configuration in project .mcp.json.
765
+
766
+ Updates only the mcp-browser configuration in the project's .mcp.json
767
+ to use the best available installation (pipx preferred).
768
+
769
+ Returns:
770
+ bool: True if configuration was updated successfully
771
+ """
772
+ print("\nšŸ”§ Fixing mcp-browser Configuration")
773
+ print("=" * 50)
774
+
775
+ project_path = Path.cwd()
776
+ config_path = project_path / ".mcp.json"
777
+
778
+ print(f"šŸ“ Project directory: {project_path}")
779
+ print(f"šŸ“„ Using config: {config_path}")
780
+
781
+ # Check if mcp-browser is installed
782
+ is_installed, install_type = self._check_pipx_installation("mcp-browser")
783
+ if not is_installed:
784
+ print("āŒ mcp-browser is not installed")
785
+ print(" Install with: pipx install mcp-browser")
786
+ return False
787
+
788
+ if install_type != "pipx":
789
+ print("āš ļø mcp-browser is not installed via pipx")
790
+ print(" For best results, install with: pipx install mcp-browser")
791
+
792
+ # Get best configuration for mcp-browser
793
+ browser_config = self._get_best_service_config("mcp-browser", project_path)
794
+ if not browser_config:
795
+ print("āŒ Could not determine mcp-browser configuration")
796
+ return False
797
+
798
+ # Load project configuration
799
+ config = self._load_config(config_path)
800
+ if not config:
801
+ print("āŒ Failed to load configuration")
802
+ return False
803
+
804
+ # Update mcp-browser configuration
805
+ if "mcpServers" not in config:
806
+ config["mcpServers"] = {}
807
+
808
+ config["mcpServers"]["mcp-browser"] = browser_config
809
+
810
+ # Save configuration
811
+ if self._save_config(config, config_path):
812
+ print("āœ… Successfully updated mcp-browser configuration in .mcp.json")
813
+ print(f" Command: {browser_config['command']}")
814
+ print(f" Args: {browser_config['args']}")
815
+ print("\nšŸ“Œ Note: Claude Code will automatically use this configuration")
816
+ print(" when you open this project directory.")
817
+ return True
818
+ print("āŒ Failed to save configuration")
819
+ return False
820
+
821
+ def list_external_services(self) -> None:
822
+ """List all available external MCP services and their status."""
823
+ print("\nšŸ“‹ Available External MCP Services")
824
+ print("=" * 50)
825
+
826
+ # Check project-level .mcp.json
827
+ project_path = Path.cwd()
828
+ mcp_config_path = project_path / ".mcp.json"
829
+ mcp_config = {}
830
+
831
+ if mcp_config_path.exists():
832
+ try:
833
+ with mcp_config_path.open() as f:
834
+ mcp_config = json.load(f)
835
+ print(f"\nšŸ“ Project MCP config: {mcp_config_path}")
836
+ except Exception:
837
+ print("\nāš ļø Could not read project .mcp.json")
838
+ else:
839
+ print("\nšŸ“ No .mcp.json found in project directory")
840
+
841
+ # Get service configurations for this project
842
+ services = self.get_project_services(project_path)
843
+
844
+ for service_name, service_info in services.items():
845
+ print(f"\n{service_name}:")
846
+ print(f" Description: {service_info['description']}")
847
+ print(f" Python Package: {service_info['package_name']}")
848
+
849
+ # Check if configured in .mcp.json
850
+ if mcp_config.get("mcpServers", {}).get(service_name):
851
+ print(" Project Status: āœ… Configured in .mcp.json")
852
+ service_config = mcp_config["mcpServers"][service_name]
853
+ print(f" Command: {service_config.get('command')}")
854
+ if service_config.get("args"):
855
+ print(f" Args: {service_config.get('args')}")
856
+ else:
857
+ print(" Project Status: āŒ Not configured in .mcp.json")
858
+
859
+ # Check installation type
860
+ is_installed, install_type = self._check_pipx_installation(service_name)
861
+ if is_installed:
862
+ if install_type == "pipx":
863
+ print(" Installation: āœ… Installed via pipx (recommended)")
864
+ else:
865
+ print(" Installation: āœ… Installed via pip")
866
+ else:
867
+ print(" Installation: āŒ Not installed")
868
+ print(f" Install with: pipx install {service_info['package_name']}")