claude-mpm 4.20.3__py3-none-any.whl → 4.25.10__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 (454) hide show
  1. claude_mpm/VERSION +1 -1
  2. claude_mpm/agents/BASE_PM.md +23 -6
  3. claude_mpm/agents/OUTPUT_STYLE.md +3 -48
  4. claude_mpm/agents/PM_INSTRUCTIONS.md +1783 -34
  5. claude_mpm/agents/WORKFLOW.md +75 -2
  6. claude_mpm/agents/base_agent.json +6 -3
  7. claude_mpm/agents/frontmatter_validator.py +1 -1
  8. claude_mpm/agents/templates/api_qa.json +5 -2
  9. claude_mpm/agents/templates/circuit_breakers.md +108 -2
  10. claude_mpm/agents/templates/documentation.json +33 -6
  11. claude_mpm/agents/templates/javascript_engineer_agent.json +380 -0
  12. claude_mpm/agents/templates/php-engineer.json +10 -4
  13. claude_mpm/agents/templates/pm_red_flags.md +89 -19
  14. claude_mpm/agents/templates/project_organizer.json +7 -3
  15. claude_mpm/agents/templates/qa.json +2 -1
  16. claude_mpm/agents/templates/react_engineer.json +1 -0
  17. claude_mpm/agents/templates/research.json +82 -12
  18. claude_mpm/agents/templates/security.json +4 -4
  19. claude_mpm/agents/templates/tauri_engineer.json +274 -0
  20. claude_mpm/agents/templates/ticketing.json +10 -6
  21. claude_mpm/agents/templates/version_control.json +4 -2
  22. claude_mpm/agents/templates/web_qa.json +2 -1
  23. claude_mpm/cli/README.md +253 -0
  24. claude_mpm/cli/__init__.py +11 -1
  25. claude_mpm/cli/commands/aggregate.py +1 -1
  26. claude_mpm/cli/commands/analyze.py +3 -3
  27. claude_mpm/cli/commands/cleanup.py +1 -1
  28. claude_mpm/cli/commands/configure_agent_display.py +4 -4
  29. claude_mpm/cli/commands/debug.py +12 -12
  30. claude_mpm/cli/commands/hook_errors.py +277 -0
  31. claude_mpm/cli/commands/mcp_install_commands.py +1 -1
  32. claude_mpm/cli/commands/mcp_install_commands.py.backup +284 -0
  33. claude_mpm/cli/commands/mpm_init/README.md +365 -0
  34. claude_mpm/cli/commands/mpm_init/__init__.py +73 -0
  35. claude_mpm/cli/commands/mpm_init/core.py +573 -0
  36. claude_mpm/cli/commands/mpm_init/display.py +341 -0
  37. claude_mpm/cli/commands/mpm_init/git_activity.py +427 -0
  38. claude_mpm/cli/commands/mpm_init/modes.py +397 -0
  39. claude_mpm/cli/commands/mpm_init/prompts.py +442 -0
  40. claude_mpm/cli/commands/mpm_init_cli.py +396 -0
  41. claude_mpm/cli/commands/mpm_init_handler.py +67 -1
  42. claude_mpm/cli/commands/run.py +124 -128
  43. claude_mpm/cli/commands/skills.py +522 -34
  44. claude_mpm/cli/executor.py +56 -0
  45. claude_mpm/cli/interactive/agent_wizard.py +5 -5
  46. claude_mpm/cli/parsers/base_parser.py +28 -0
  47. claude_mpm/cli/parsers/mpm_init_parser.py +42 -0
  48. claude_mpm/cli/parsers/skills_parser.py +138 -0
  49. claude_mpm/cli/startup.py +111 -8
  50. claude_mpm/cli/startup_display.py +480 -0
  51. claude_mpm/cli/utils.py +1 -1
  52. claude_mpm/cli_module/commands.py +1 -1
  53. claude_mpm/cli_module/refactoring_guide.md +253 -0
  54. claude_mpm/commands/mpm-help.md +3 -0
  55. claude_mpm/commands/mpm-init.md +19 -3
  56. claude_mpm/commands/mpm-resume.md +372 -0
  57. claude_mpm/commands/mpm-tickets.md +56 -7
  58. claude_mpm/commands/mpm.md +1 -0
  59. claude_mpm/config/agent_capabilities.yaml +658 -0
  60. claude_mpm/config/async_logging_config.yaml +145 -0
  61. claude_mpm/constants.py +12 -0
  62. claude_mpm/core/.claude-mpm/logs/hooks_20250730.log +34 -0
  63. claude_mpm/core/api_validator.py +1 -1
  64. claude_mpm/core/claude_runner.py +14 -1
  65. claude_mpm/core/config.py +8 -0
  66. claude_mpm/core/constants.py +1 -1
  67. claude_mpm/core/framework/processors/metadata_processor.py +1 -1
  68. claude_mpm/core/hook_error_memory.py +381 -0
  69. claude_mpm/core/hook_manager.py +41 -2
  70. claude_mpm/core/interactive_session.py +48 -3
  71. claude_mpm/core/interfaces.py +56 -1
  72. claude_mpm/core/logger.py +3 -1
  73. claude_mpm/core/oneshot_session.py +39 -0
  74. claude_mpm/d2/.gitignore +22 -0
  75. claude_mpm/d2/ARCHITECTURE_COMPARISON.md +273 -0
  76. claude_mpm/d2/FLASK_INTEGRATION.md +156 -0
  77. claude_mpm/d2/IMPLEMENTATION_SUMMARY.md +452 -0
  78. claude_mpm/d2/QUICKSTART.md +186 -0
  79. claude_mpm/d2/README.md +232 -0
  80. claude_mpm/d2/STORE_FIX_SUMMARY.md +167 -0
  81. claude_mpm/d2/SVELTE5_STORES_GUIDE.md +180 -0
  82. claude_mpm/d2/TESTING.md +288 -0
  83. claude_mpm/d2/index.html +118 -0
  84. claude_mpm/d2/package.json +19 -0
  85. claude_mpm/d2/src/App.svelte +110 -0
  86. claude_mpm/d2/src/components/Header.svelte +153 -0
  87. claude_mpm/d2/src/components/MainContent.svelte +74 -0
  88. claude_mpm/d2/src/components/Sidebar.svelte +85 -0
  89. claude_mpm/d2/src/components/tabs/EventsTab.svelte +326 -0
  90. claude_mpm/d2/src/lib/socketio.js +144 -0
  91. claude_mpm/d2/src/main.js +7 -0
  92. claude_mpm/d2/src/stores/events.js +114 -0
  93. claude_mpm/d2/src/stores/socket.js +108 -0
  94. claude_mpm/d2/src/stores/theme.js +65 -0
  95. claude_mpm/d2/svelte.config.js +12 -0
  96. claude_mpm/d2/vite.config.js +15 -0
  97. claude_mpm/dashboard/.claude-mpm/memories/README.md +36 -0
  98. claude_mpm/dashboard/BUILD_NUMBER +1 -0
  99. claude_mpm/dashboard/README.md +121 -0
  100. claude_mpm/dashboard/VERSION +1 -0
  101. claude_mpm/dashboard/react/components/DataInspector/DataInspector.tsx +273 -0
  102. claude_mpm/dashboard/react/components/ErrorBoundary.tsx +75 -0
  103. claude_mpm/dashboard/react/components/EventViewer/EventViewer.tsx +141 -0
  104. claude_mpm/dashboard/react/components/shared/ConnectionStatus.tsx +36 -0
  105. claude_mpm/dashboard/react/components/shared/FilterBar.tsx +89 -0
  106. claude_mpm/dashboard/react/contexts/DashboardContext.tsx +215 -0
  107. claude_mpm/dashboard/react/entries/events.tsx +165 -0
  108. claude_mpm/dashboard/react/hooks/useEvents.ts +191 -0
  109. claude_mpm/dashboard/react/hooks/useSocket.ts +225 -0
  110. claude_mpm/dashboard/static/built/REFACTORING_SUMMARY.md +170 -0
  111. claude_mpm/dashboard/static/built/components/activity-tree.js.map +1 -0
  112. claude_mpm/dashboard/static/built/components/agent-hierarchy.js +101 -101
  113. claude_mpm/dashboard/static/built/components/agent-inference.js.map +1 -0
  114. claude_mpm/dashboard/static/built/components/build-tracker.js +59 -59
  115. claude_mpm/dashboard/static/built/components/code-simple.js +107 -107
  116. claude_mpm/dashboard/static/built/components/code-tree/tree-breadcrumb.js +29 -29
  117. claude_mpm/dashboard/static/built/components/code-tree/tree-constants.js +24 -24
  118. claude_mpm/dashboard/static/built/components/code-tree/tree-search.js +27 -27
  119. claude_mpm/dashboard/static/built/components/code-tree/tree-utils.js +25 -25
  120. claude_mpm/dashboard/static/built/components/code-tree.js.map +1 -0
  121. claude_mpm/dashboard/static/built/components/code-viewer.js.map +1 -0
  122. claude_mpm/dashboard/static/built/components/connection-debug.js +101 -101
  123. claude_mpm/dashboard/static/built/components/diff-viewer.js +113 -113
  124. claude_mpm/dashboard/static/built/components/event-processor.js.map +1 -0
  125. claude_mpm/dashboard/static/built/components/event-viewer.js.map +1 -0
  126. claude_mpm/dashboard/static/built/components/export-manager.js.map +1 -0
  127. claude_mpm/dashboard/static/built/components/file-change-tracker.js +57 -57
  128. claude_mpm/dashboard/static/built/components/file-change-viewer.js +74 -74
  129. claude_mpm/dashboard/static/built/components/file-tool-tracker.js.map +1 -0
  130. claude_mpm/dashboard/static/built/components/file-viewer.js.map +1 -0
  131. claude_mpm/dashboard/static/built/components/hud-library-loader.js.map +1 -0
  132. claude_mpm/dashboard/static/built/components/hud-manager.js.map +1 -0
  133. claude_mpm/dashboard/static/built/components/hud-visualizer.js.map +1 -0
  134. claude_mpm/dashboard/static/built/components/module-viewer.js.map +1 -0
  135. claude_mpm/dashboard/static/built/components/session-manager.js.map +1 -0
  136. claude_mpm/dashboard/static/built/components/socket-manager.js.map +1 -0
  137. claude_mpm/dashboard/static/built/components/ui-state-manager.js.map +1 -0
  138. claude_mpm/dashboard/static/built/components/unified-data-viewer.js.map +1 -0
  139. claude_mpm/dashboard/static/built/components/working-directory.js.map +1 -0
  140. claude_mpm/dashboard/static/built/connection-manager.js +76 -76
  141. claude_mpm/dashboard/static/built/dashboard.js.map +1 -0
  142. claude_mpm/dashboard/static/built/extension-error-handler.js +22 -22
  143. claude_mpm/dashboard/static/built/react/events.js.map +1 -0
  144. claude_mpm/dashboard/static/built/shared/dom-helpers.js +9 -9
  145. claude_mpm/dashboard/static/built/shared/event-bus.js +5 -5
  146. claude_mpm/dashboard/static/built/shared/logger.js +16 -16
  147. claude_mpm/dashboard/static/built/shared/tooltip-service.js +6 -6
  148. claude_mpm/dashboard/static/built/socket-client.js.map +1 -0
  149. claude_mpm/dashboard/static/css/activity.css +69 -69
  150. claude_mpm/dashboard/static/css/connection-status.css +10 -10
  151. claude_mpm/dashboard/static/css/dashboard.css +15 -15
  152. claude_mpm/dashboard/static/index.html +22 -22
  153. claude_mpm/dashboard/static/js/REFACTORING_SUMMARY.md +170 -0
  154. claude_mpm/dashboard/static/js/components/activity-tree.js +178 -178
  155. claude_mpm/dashboard/static/js/components/agent-hierarchy.js +101 -101
  156. claude_mpm/dashboard/static/js/components/agent-inference.js +31 -31
  157. claude_mpm/dashboard/static/js/components/build-tracker.js +59 -59
  158. claude_mpm/dashboard/static/js/components/code-simple.js +107 -107
  159. claude_mpm/dashboard/static/js/components/connection-debug.js +101 -101
  160. claude_mpm/dashboard/static/js/components/diff-viewer.js +113 -113
  161. claude_mpm/dashboard/static/js/components/event-viewer.js +12 -12
  162. claude_mpm/dashboard/static/js/components/file-change-tracker.js +57 -57
  163. claude_mpm/dashboard/static/js/components/file-change-viewer.js +74 -74
  164. claude_mpm/dashboard/static/js/components/file-tool-tracker.js +6 -6
  165. claude_mpm/dashboard/static/js/components/file-viewer.js +42 -42
  166. claude_mpm/dashboard/static/js/components/module-viewer.js +27 -27
  167. claude_mpm/dashboard/static/js/components/session-manager.js +14 -14
  168. claude_mpm/dashboard/static/js/components/socket-manager.js +1 -1
  169. claude_mpm/dashboard/static/js/components/ui-state-manager.js +14 -14
  170. claude_mpm/dashboard/static/js/components/unified-data-viewer.js +110 -110
  171. claude_mpm/dashboard/static/js/components/working-directory.js +8 -8
  172. claude_mpm/dashboard/static/js/connection-manager.js +76 -76
  173. claude_mpm/dashboard/static/js/dashboard.js +76 -58
  174. claude_mpm/dashboard/static/js/extension-error-handler.js +22 -22
  175. claude_mpm/dashboard/static/js/shared/dom-helpers.js +9 -9
  176. claude_mpm/dashboard/static/js/shared/event-bus.js +5 -5
  177. claude_mpm/dashboard/static/js/shared/logger.js +16 -16
  178. claude_mpm/dashboard/static/js/shared/tooltip-service.js +6 -6
  179. claude_mpm/dashboard/static/js/socket-client.js +138 -121
  180. claude_mpm/dashboard/static/navigation-test-results.md +118 -0
  181. claude_mpm/dashboard/static/production/main.html +21 -21
  182. claude_mpm/dashboard/static/test-archive/dashboard.html +22 -22
  183. claude_mpm/dashboard/templates/.claude-mpm/memories/README.md +36 -0
  184. claude_mpm/dashboard/templates/.claude-mpm/memories/engineer_agent.md +39 -0
  185. claude_mpm/dashboard/templates/.claude-mpm/memories/version_control_agent.md +38 -0
  186. claude_mpm/dashboard/templates/code_simple.html +23 -23
  187. claude_mpm/dashboard/templates/index.html +18 -18
  188. claude_mpm/hooks/README.md +143 -0
  189. claude_mpm/hooks/claude_hooks/event_handlers.py +3 -1
  190. claude_mpm/hooks/claude_hooks/hook_handler.py +24 -7
  191. claude_mpm/hooks/claude_hooks/installer.py +45 -0
  192. claude_mpm/hooks/templates/README.md +180 -0
  193. claude_mpm/hooks/templates/pre_tool_use_simple.py +78 -0
  194. claude_mpm/hooks/templates/pre_tool_use_template.py +323 -0
  195. claude_mpm/hooks/templates/settings.json.example +147 -0
  196. claude_mpm/schemas/agent_schema.json +596 -0
  197. claude_mpm/schemas/frontmatter_schema.json +165 -0
  198. claude_mpm/scripts/claude-hook-handler.sh +3 -3
  199. claude_mpm/scripts/start_activity_logging.py +3 -1
  200. claude_mpm/services/agents/deployment/agent_format_converter.py +1 -1
  201. claude_mpm/services/agents/deployment/agent_metrics_collector.py +3 -3
  202. claude_mpm/services/agents/deployment/facade/deployment_facade.py +3 -3
  203. claude_mpm/services/agents/deployment/pipeline/pipeline_executor.py +2 -2
  204. claude_mpm/services/agents/loading/framework_agent_loader.py +8 -8
  205. claude_mpm/services/agents/local_template_manager.py +3 -1
  206. claude_mpm/services/cli/session_pause_manager.py +504 -0
  207. claude_mpm/services/cli/session_resume_helper.py +36 -16
  208. claude_mpm/services/cli/unified_dashboard_manager.py +1 -1
  209. claude_mpm/services/core/base.py +26 -11
  210. claude_mpm/services/core/interfaces.py +56 -1
  211. claude_mpm/services/core/models/agent_config.py +3 -0
  212. claude_mpm/services/core/models/process.py +4 -0
  213. claude_mpm/services/diagnostics/checks/agent_check.py +0 -2
  214. claude_mpm/services/diagnostics/checks/instructions_check.py +1 -2
  215. claude_mpm/services/diagnostics/checks/mcp_check.py +0 -1
  216. claude_mpm/services/diagnostics/checks/monitor_check.py +0 -1
  217. claude_mpm/services/diagnostics/doctor_reporter.py +6 -4
  218. claude_mpm/services/diagnostics/models.py +21 -0
  219. claude_mpm/services/event_bus/README.md +244 -0
  220. claude_mpm/services/event_bus/direct_relay.py +3 -3
  221. claude_mpm/services/event_bus/event_bus.py +36 -3
  222. claude_mpm/services/event_bus/relay.py +23 -7
  223. claude_mpm/services/events/README.md +303 -0
  224. claude_mpm/services/events/consumers/logging.py +1 -2
  225. claude_mpm/services/framework_claude_md_generator/README.md +119 -0
  226. claude_mpm/services/infrastructure/monitoring/resources.py +1 -1
  227. claude_mpm/services/local_ops/__init__.py +2 -0
  228. claude_mpm/services/local_ops/process_manager.py +1 -1
  229. claude_mpm/services/local_ops/resource_monitor.py +2 -2
  230. claude_mpm/services/mcp_gateway/README.md +185 -0
  231. claude_mpm/services/mcp_gateway/auto_configure.py +31 -25
  232. claude_mpm/services/mcp_gateway/config/configuration.py +1 -1
  233. claude_mpm/services/mcp_gateway/core/process_pool.py +19 -10
  234. claude_mpm/services/mcp_gateway/server/stdio_server.py +0 -2
  235. claude_mpm/services/mcp_gateway/tools/document_summarizer.py +1 -1
  236. claude_mpm/services/mcp_gateway/tools/external_mcp_services.py +26 -21
  237. claude_mpm/services/mcp_gateway/tools/kuzu_memory_service.py +6 -2
  238. claude_mpm/services/memory/failure_tracker.py +19 -4
  239. claude_mpm/services/memory/optimizer.py +1 -1
  240. claude_mpm/services/model/model_router.py +8 -9
  241. claude_mpm/services/monitor/daemon.py +1 -1
  242. claude_mpm/services/monitor/server.py +2 -2
  243. claude_mpm/services/native_agent_converter.py +356 -0
  244. claude_mpm/services/port_manager.py +1 -1
  245. claude_mpm/services/project/documentation_manager.py +2 -1
  246. claude_mpm/services/project/toolchain_analyzer.py +3 -1
  247. claude_mpm/services/runner_configuration_service.py +1 -0
  248. claude_mpm/services/self_upgrade_service.py +165 -7
  249. claude_mpm/services/skills_config.py +547 -0
  250. claude_mpm/services/skills_deployer.py +955 -0
  251. claude_mpm/services/socketio/handlers/connection.py +1 -1
  252. claude_mpm/services/socketio/handlers/connection.py.backup +217 -0
  253. claude_mpm/services/socketio/handlers/git.py +2 -2
  254. claude_mpm/services/socketio/handlers/hook.py.backup +154 -0
  255. claude_mpm/services/static/.gitkeep +2 -0
  256. claude_mpm/services/system_instructions_service.py +1 -3
  257. claude_mpm/services/unified/analyzer_strategies/performance_analyzer.py +0 -3
  258. claude_mpm/services/unified/analyzer_strategies/security_analyzer.py +0 -1
  259. claude_mpm/services/unified/deployment_strategies/cloud_strategies.py +1 -1
  260. claude_mpm/services/version_control/VERSION +1 -0
  261. claude_mpm/services/version_control/conflict_resolution.py +6 -4
  262. claude_mpm/services/visualization/mermaid_generator.py +2 -3
  263. claude_mpm/skills/__init__.py +3 -3
  264. claude_mpm/skills/agent_skills_injector.py +42 -49
  265. claude_mpm/skills/bundled/.gitkeep +2 -0
  266. claude_mpm/skills/bundled/collaboration/brainstorming/SKILL.md +4 -0
  267. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/SKILL.md +108 -114
  268. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/agent-prompts.md +577 -0
  269. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/coordination-patterns.md +467 -0
  270. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/examples.md +537 -0
  271. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/troubleshooting.md +730 -0
  272. claude_mpm/skills/bundled/collaboration/git-worktrees.md +317 -0
  273. claude_mpm/skills/bundled/collaboration/requesting-code-review/SKILL.md +46 -41
  274. claude_mpm/skills/bundled/collaboration/requesting-code-review/references/review-examples.md +412 -0
  275. claude_mpm/skills/bundled/collaboration/stacked-prs.md +251 -0
  276. claude_mpm/skills/bundled/collaboration/writing-plans/SKILL.md +36 -73
  277. claude_mpm/skills/bundled/collaboration/writing-plans/references/best-practices.md +362 -0
  278. claude_mpm/skills/bundled/collaboration/writing-plans/references/plan-structure-templates.md +312 -0
  279. claude_mpm/skills/bundled/debugging/root-cause-tracing/SKILL.md +100 -125
  280. claude_mpm/skills/bundled/debugging/root-cause-tracing/find-polluter.sh +63 -0
  281. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/advanced-techniques.md +668 -0
  282. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/examples.md +587 -0
  283. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/integration.md +438 -0
  284. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/tracing-techniques.md +391 -0
  285. claude_mpm/skills/bundled/debugging/verification-before-completion/SKILL.md +28 -72
  286. claude_mpm/skills/bundled/debugging/verification-before-completion/references/gate-function.md +11 -0
  287. claude_mpm/skills/bundled/debugging/verification-before-completion/references/integration-and-workflows.md +490 -0
  288. claude_mpm/skills/bundled/debugging/verification-before-completion/references/red-flags-and-failures.md +425 -0
  289. claude_mpm/skills/bundled/debugging/verification-before-completion/references/verification-patterns.md +272 -0
  290. claude_mpm/skills/bundled/infrastructure/env-manager/INTEGRATION.md +611 -0
  291. claude_mpm/skills/bundled/infrastructure/env-manager/README.md +596 -0
  292. claude_mpm/skills/bundled/infrastructure/env-manager/SKILL.md +260 -0
  293. claude_mpm/skills/bundled/infrastructure/env-manager/examples/nextjs-env-structure.md +315 -0
  294. claude_mpm/skills/bundled/infrastructure/env-manager/references/frameworks.md +436 -0
  295. claude_mpm/skills/bundled/infrastructure/env-manager/references/security.md +433 -0
  296. claude_mpm/skills/bundled/infrastructure/env-manager/references/synchronization.md +452 -0
  297. claude_mpm/skills/bundled/infrastructure/env-manager/references/troubleshooting.md +404 -0
  298. claude_mpm/skills/bundled/infrastructure/env-manager/references/validation.md +420 -0
  299. claude_mpm/skills/bundled/infrastructure/env-manager/scripts/validate_env.py +576 -0
  300. claude_mpm/skills/bundled/main/artifacts-builder/LICENSE.txt +202 -0
  301. claude_mpm/skills/bundled/main/artifacts-builder/SKILL.md +13 -1
  302. claude_mpm/skills/bundled/main/artifacts-builder/scripts/bundle-artifact.sh +54 -0
  303. claude_mpm/skills/bundled/main/artifacts-builder/scripts/init-artifact.sh +322 -0
  304. claude_mpm/skills/bundled/main/artifacts-builder/scripts/shadcn-components.tar.gz +0 -0
  305. claude_mpm/skills/bundled/main/internal-comms/LICENSE.txt +202 -0
  306. claude_mpm/skills/bundled/main/internal-comms/SKILL.md +11 -0
  307. claude_mpm/skills/bundled/main/mcp-builder/LICENSE.txt +202 -0
  308. claude_mpm/skills/bundled/main/mcp-builder/SKILL.md +109 -277
  309. claude_mpm/skills/bundled/main/mcp-builder/reference/design_principles.md +412 -0
  310. claude_mpm/skills/bundled/main/mcp-builder/reference/workflow.md +1237 -0
  311. claude_mpm/skills/bundled/main/mcp-builder/scripts/connections.py +17 -10
  312. claude_mpm/skills/bundled/main/mcp-builder/scripts/evaluation.py +92 -39
  313. claude_mpm/skills/bundled/main/mcp-builder/scripts/example_evaluation.xml +22 -0
  314. claude_mpm/skills/bundled/main/mcp-builder/scripts/requirements.txt +2 -0
  315. claude_mpm/skills/bundled/main/skill-creator/LICENSE.txt +202 -0
  316. claude_mpm/skills/bundled/main/skill-creator/SKILL.md +135 -155
  317. claude_mpm/skills/bundled/main/skill-creator/references/best-practices.md +500 -0
  318. claude_mpm/skills/bundled/main/skill-creator/references/creation-workflow.md +464 -0
  319. claude_mpm/skills/bundled/main/skill-creator/references/examples.md +619 -0
  320. claude_mpm/skills/bundled/main/skill-creator/references/progressive-disclosure.md +437 -0
  321. claude_mpm/skills/bundled/main/skill-creator/references/skill-structure.md +231 -0
  322. claude_mpm/skills/bundled/main/skill-creator/scripts/init_skill.py +13 -12
  323. claude_mpm/skills/bundled/main/skill-creator/scripts/package_skill.py +5 -3
  324. claude_mpm/skills/bundled/main/skill-creator/scripts/quick_validate.py +19 -12
  325. claude_mpm/skills/bundled/performance-profiling.md +6 -0
  326. claude_mpm/skills/bundled/php/espocrm-development/SKILL.md +170 -0
  327. claude_mpm/skills/bundled/php/espocrm-development/references/architecture.md +602 -0
  328. claude_mpm/skills/bundled/php/espocrm-development/references/common-tasks.md +821 -0
  329. claude_mpm/skills/bundled/php/espocrm-development/references/development-workflow.md +742 -0
  330. claude_mpm/skills/bundled/php/espocrm-development/references/frontend-customization.md +726 -0
  331. claude_mpm/skills/bundled/php/espocrm-development/references/hooks-and-services.md +764 -0
  332. claude_mpm/skills/bundled/php/espocrm-development/references/testing-debugging.md +831 -0
  333. claude_mpm/skills/bundled/react/flexlayout-react.md +742 -0
  334. claude_mpm/skills/bundled/rust/desktop-applications/SKILL.md +226 -0
  335. claude_mpm/skills/bundled/rust/desktop-applications/references/architecture-patterns.md +901 -0
  336. claude_mpm/skills/bundled/rust/desktop-applications/references/native-gui-frameworks.md +901 -0
  337. claude_mpm/skills/bundled/rust/desktop-applications/references/platform-integration.md +775 -0
  338. claude_mpm/skills/bundled/rust/desktop-applications/references/state-management.md +937 -0
  339. claude_mpm/skills/bundled/rust/desktop-applications/references/tauri-framework.md +770 -0
  340. claude_mpm/skills/bundled/rust/desktop-applications/references/testing-deployment.md +961 -0
  341. claude_mpm/skills/bundled/tauri/tauri-async-patterns.md +495 -0
  342. claude_mpm/skills/bundled/tauri/tauri-build-deploy.md +599 -0
  343. claude_mpm/skills/bundled/tauri/tauri-command-patterns.md +535 -0
  344. claude_mpm/skills/bundled/tauri/tauri-error-handling.md +613 -0
  345. claude_mpm/skills/bundled/tauri/tauri-event-system.md +648 -0
  346. claude_mpm/skills/bundled/tauri/tauri-file-system.md +673 -0
  347. claude_mpm/skills/bundled/tauri/tauri-frontend-integration.md +767 -0
  348. claude_mpm/skills/bundled/tauri/tauri-performance.md +669 -0
  349. claude_mpm/skills/bundled/tauri/tauri-state-management.md +573 -0
  350. claude_mpm/skills/bundled/tauri/tauri-testing.md +384 -0
  351. claude_mpm/skills/bundled/tauri/tauri-window-management.md +628 -0
  352. claude_mpm/skills/bundled/testing/condition-based-waiting/SKILL.md +21 -25
  353. claude_mpm/skills/bundled/testing/condition-based-waiting/example.ts +158 -0
  354. claude_mpm/skills/bundled/testing/condition-based-waiting/references/patterns-and-implementation.md +253 -0
  355. claude_mpm/skills/bundled/testing/test-quality-inspector/SKILL.md +458 -0
  356. claude_mpm/skills/bundled/testing/test-quality-inspector/examples/example-inspection-report.md +411 -0
  357. claude_mpm/skills/bundled/testing/test-quality-inspector/references/assertion-quality.md +317 -0
  358. claude_mpm/skills/bundled/testing/test-quality-inspector/references/inspection-checklist.md +270 -0
  359. claude_mpm/skills/bundled/testing/test-quality-inspector/references/red-flags.md +436 -0
  360. claude_mpm/skills/bundled/testing/testing-anti-patterns/SKILL.md +86 -250
  361. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/completeness-anti-patterns.md +572 -0
  362. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/core-anti-patterns.md +411 -0
  363. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/detection-guide.md +569 -0
  364. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/tdd-connection.md +695 -0
  365. claude_mpm/skills/bundled/testing/webapp-testing/LICENSE.txt +202 -0
  366. claude_mpm/skills/bundled/testing/webapp-testing/SKILL.md +145 -57
  367. claude_mpm/skills/bundled/testing/webapp-testing/decision-tree.md +459 -0
  368. claude_mpm/skills/bundled/testing/webapp-testing/examples/console_logging.py +6 -6
  369. claude_mpm/skills/bundled/testing/webapp-testing/examples/element_discovery.py +13 -9
  370. claude_mpm/skills/bundled/testing/webapp-testing/examples/static_html_automation.py +8 -8
  371. claude_mpm/skills/bundled/testing/webapp-testing/playwright-patterns.md +479 -0
  372. claude_mpm/skills/bundled/testing/webapp-testing/reconnaissance-pattern.md +687 -0
  373. claude_mpm/skills/bundled/testing/webapp-testing/scripts/with_server.py +37 -15
  374. claude_mpm/skills/bundled/testing/webapp-testing/server-management.md +758 -0
  375. claude_mpm/skills/bundled/testing/webapp-testing/troubleshooting.md +868 -0
  376. claude_mpm/skills/skills_registry.py +44 -48
  377. claude_mpm/skills/skills_service.py +117 -108
  378. claude_mpm/templates/questions/EXAMPLES.md +501 -0
  379. claude_mpm/templates/questions/__init__.py +43 -0
  380. claude_mpm/templates/questions/base.py +193 -0
  381. claude_mpm/templates/questions/pr_strategy.py +314 -0
  382. claude_mpm/templates/questions/project_init.py +388 -0
  383. claude_mpm/templates/questions/ticket_mgmt.py +397 -0
  384. claude_mpm/tools/README_SOCKETIO_DEBUG.md +224 -0
  385. claude_mpm/tools/__main__.py +8 -8
  386. claude_mpm/tools/code_tree_analyzer/README.md +64 -0
  387. claude_mpm/tools/code_tree_analyzer/__init__.py +45 -0
  388. claude_mpm/tools/code_tree_analyzer/analysis.py +299 -0
  389. claude_mpm/tools/code_tree_analyzer/cache.py +131 -0
  390. claude_mpm/tools/code_tree_analyzer/core.py +380 -0
  391. claude_mpm/tools/code_tree_analyzer/discovery.py +403 -0
  392. claude_mpm/tools/code_tree_analyzer/events.py +168 -0
  393. claude_mpm/tools/code_tree_analyzer/gitignore.py +308 -0
  394. claude_mpm/tools/code_tree_analyzer/models.py +39 -0
  395. claude_mpm/tools/code_tree_analyzer/multilang_analyzer.py +224 -0
  396. claude_mpm/tools/code_tree_analyzer/python_analyzer.py +284 -0
  397. claude_mpm/utils/agent_dependency_loader.py +3 -3
  398. claude_mpm/utils/dependency_cache.py +3 -1
  399. claude_mpm/utils/gitignore.py +241 -0
  400. claude_mpm/utils/log_cleanup.py +3 -3
  401. claude_mpm/utils/robust_installer.py +3 -5
  402. claude_mpm/utils/structured_questions.py +619 -0
  403. {claude_mpm-4.20.3.dist-info → claude_mpm-4.25.10.dist-info}/METADATA +218 -31
  404. {claude_mpm-4.20.3.dist-info → claude_mpm-4.25.10.dist-info}/RECORD +409 -246
  405. claude_mpm/agents/templates/.claude-mpm/memories/README.md +0 -17
  406. claude_mpm/agents/templates/.claude-mpm/memories/engineer_memories.md +0 -3
  407. claude_mpm/agents/templates/logs/prompts/agent_engineer_20250826_014258_728.md +0 -39
  408. claude_mpm/agents/templates/logs/prompts/agent_engineer_20250901_010124_142.md +0 -400
  409. claude_mpm/cli/commands/mpm_init.py +0 -2093
  410. claude_mpm/dashboard/.claude-mpm/socketio-instances.json +0 -1
  411. claude_mpm/dashboard/static/archive/activity_dashboard_test.html +0 -61
  412. claude_mpm/dashboard/static/archive/test_activity_connection.html +0 -179
  413. claude_mpm/dashboard/static/archive/test_claude_tree_tab.html +0 -68
  414. claude_mpm/dashboard/static/archive/test_dashboard.html +0 -409
  415. claude_mpm/dashboard/static/archive/test_dashboard_fixed.html +0 -519
  416. claude_mpm/dashboard/static/archive/test_dashboard_verification.html +0 -181
  417. claude_mpm/dashboard/static/archive/test_file_data.html +0 -315
  418. claude_mpm/dashboard/static/archive/test_file_tree_empty_state.html +0 -243
  419. claude_mpm/dashboard/static/archive/test_file_tree_fix.html +0 -234
  420. claude_mpm/dashboard/static/archive/test_file_tree_rename.html +0 -117
  421. claude_mpm/dashboard/static/archive/test_file_tree_tab.html +0 -115
  422. claude_mpm/dashboard/static/archive/test_file_viewer.html +0 -224
  423. claude_mpm/dashboard/static/archive/test_final_activity.html +0 -220
  424. claude_mpm/dashboard/static/archive/test_tab_fix.html +0 -139
  425. claude_mpm/dashboard/static/dist/assets/events.DjpNxWNo.css +0 -1
  426. claude_mpm/dashboard/static/dist/components/activity-tree.js +0 -2
  427. claude_mpm/dashboard/static/dist/components/agent-inference.js +0 -2
  428. claude_mpm/dashboard/static/dist/components/code-tree.js +0 -2
  429. claude_mpm/dashboard/static/dist/components/code-viewer.js +0 -2
  430. claude_mpm/dashboard/static/dist/components/event-processor.js +0 -2
  431. claude_mpm/dashboard/static/dist/components/event-viewer.js +0 -2
  432. claude_mpm/dashboard/static/dist/components/export-manager.js +0 -2
  433. claude_mpm/dashboard/static/dist/components/file-tool-tracker.js +0 -2
  434. claude_mpm/dashboard/static/dist/components/file-viewer.js +0 -2
  435. claude_mpm/dashboard/static/dist/components/hud-library-loader.js +0 -2
  436. claude_mpm/dashboard/static/dist/components/hud-manager.js +0 -2
  437. claude_mpm/dashboard/static/dist/components/hud-visualizer.js +0 -2
  438. claude_mpm/dashboard/static/dist/components/module-viewer.js +0 -2
  439. claude_mpm/dashboard/static/dist/components/session-manager.js +0 -2
  440. claude_mpm/dashboard/static/dist/components/socket-manager.js +0 -2
  441. claude_mpm/dashboard/static/dist/components/ui-state-manager.js +0 -2
  442. claude_mpm/dashboard/static/dist/components/unified-data-viewer.js +0 -2
  443. claude_mpm/dashboard/static/dist/components/working-directory.js +0 -2
  444. claude_mpm/dashboard/static/dist/dashboard.js +0 -2
  445. claude_mpm/dashboard/static/dist/react/events.js +0 -30
  446. claude_mpm/dashboard/static/dist/socket-client.js +0 -2
  447. claude_mpm/dashboard/static/test-archive/test_debug.html +0 -25
  448. claude_mpm/skills/bundled/debugging/verification-before-completion/references/common-failures.md +0 -213
  449. claude_mpm/tools/code_tree_analyzer.py +0 -1825
  450. /claude_mpm/skills/bundled/collaboration/requesting-code-review/{code-reviewer.md → references/code-reviewer-template.md} +0 -0
  451. {claude_mpm-4.20.3.dist-info → claude_mpm-4.25.10.dist-info}/WHEEL +0 -0
  452. {claude_mpm-4.20.3.dist-info → claude_mpm-4.25.10.dist-info}/entry_points.txt +0 -0
  453. {claude_mpm-4.20.3.dist-info → claude_mpm-4.25.10.dist-info}/licenses/LICENSE +0 -0
  454. {claude_mpm-4.20.3.dist-info → claude_mpm-4.25.10.dist-info}/top_level.txt +0 -0
@@ -20,7 +20,62 @@ focused modules for better maintainability and testing.
20
20
  """
21
21
 
22
22
  # Re-export everything from the new modular structure for backward compatibility
23
- from .interfaces import *
23
+ from .interfaces import ( # noqa: F401
24
+ AgentCapabilitiesInterface,
25
+ AgentDeploymentInterface,
26
+ AgentMetadata,
27
+ CacheEntry,
28
+ CommandHandlerInterface,
29
+ HealthStatus,
30
+ HookServiceInterface,
31
+ IAgentRecommender,
32
+ IAgentRegistry,
33
+ IAutoConfigManager,
34
+ ICacheService,
35
+ IConfigurationManager,
36
+ IConfigurationService,
37
+ ICrashDetector,
38
+ IDeploymentStateManager,
39
+ IErrorHandler,
40
+ IEventBus,
41
+ IHealthCheck,
42
+ IHealthCheckManager,
43
+ IHealthMonitor,
44
+ ILocalProcessManager,
45
+ ILogMonitor,
46
+ IMemoryLeakDetector,
47
+ IModelProvider,
48
+ IModelRouter,
49
+ InterfaceRegistry,
50
+ IPerformanceMonitor,
51
+ IPromptCache,
52
+ IResourceMonitor,
53
+ IRestartManager,
54
+ IRestartPolicy,
55
+ IServiceContainer,
56
+ IServiceFactory,
57
+ IServiceLifecycle,
58
+ IStructuredLogger,
59
+ ITemplateManager,
60
+ IToolchainAnalyzer,
61
+ MemoryHookInterface,
62
+ MemoryServiceInterface,
63
+ ModelCapability,
64
+ ModelProvider,
65
+ ModelResponse,
66
+ ProjectAnalyzerInterface,
67
+ RunnerConfigurationInterface,
68
+ ServiceType,
69
+ SessionManagementInterface,
70
+ SocketIOServiceInterface,
71
+ SubprocessLauncherInterface,
72
+ SystemInstructionsInterface,
73
+ T,
74
+ TemplateRenderContext,
75
+ TicketManagerInterface,
76
+ UtilityServiceInterface,
77
+ VersionServiceInterface,
78
+ )
24
79
 
25
80
  # All interface definitions have been moved to the interfaces/ package
26
81
  # This file now serves as a compatibility layer that delegates to the modular structure
@@ -19,6 +19,9 @@ from typing import Any, Dict, List, Optional
19
19
 
20
20
  from ....core.enums import OperationResult, ValidationSeverity
21
21
 
22
+ # Backward compatibility alias (consolidated in Phase 3A Batch 25)
23
+ ConfigurationStatus = OperationResult
24
+
22
25
 
23
26
  class AgentSpecialization(str, Enum):
24
27
  """Agent specialization categories.
@@ -25,6 +25,9 @@ from typing import Any, Dict, List, Optional
25
25
 
26
26
  from claude_mpm.core.enums import ServiceState
27
27
 
28
+ # Backward compatibility alias (consolidated in Phase 3A Batch 24)
29
+ ProcessStatus = ServiceState
30
+
28
31
 
29
32
  @dataclass
30
33
  class DeploymentState:
@@ -230,6 +233,7 @@ __all__ = [
230
233
  "PROTECTED_PORT_RANGES",
231
234
  "DeploymentState",
232
235
  "ProcessInfo",
236
+ "ProcessStatus", # Backward compatibility alias for ServiceState
233
237
  "StartConfig",
234
238
  "is_port_protected",
235
239
  ]
@@ -188,7 +188,6 @@ class AgentCheck(BaseDiagnosticCheck):
188
188
  def _check_agent_versions(self) -> DiagnosticResult:
189
189
  """Check if deployed agents are up-to-date."""
190
190
  try:
191
-
192
191
  from ....services.agents.deployment.agent_version_manager import (
193
192
  AgentVersionManager,
194
193
  )
@@ -258,7 +257,6 @@ class AgentCheck(BaseDiagnosticCheck):
258
257
  def _validate_agents(self) -> DiagnosticResult:
259
258
  """Validate agent configurations."""
260
259
  try:
261
-
262
260
  from ....services.agents.deployment.agent_validator import AgentValidator
263
261
 
264
262
  AgentValidator()
@@ -220,8 +220,7 @@ class InstructionsCheck(BaseDiagnosticCheck):
220
220
  files_str = ", ".join(str(path) for path, _ in occurrences)
221
221
  snippet = occurrences[0][1]
222
222
  duplicates.append(
223
- f"Duplicate content found in: {files_str}\n"
224
- f" Snippet: {snippet}..."
223
+ f"Duplicate content found in: {files_str}\n Snippet: {snippet}..."
225
224
  )
226
225
 
227
226
  if duplicates:
@@ -29,7 +29,6 @@ class MCPCheck(BaseDiagnosticCheck):
29
29
  def run(self) -> DiagnosticResult:
30
30
  """Run MCP diagnostics."""
31
31
  try:
32
-
33
32
  sub_results = []
34
33
  details = {}
35
34
 
@@ -26,7 +26,6 @@ class MonitorCheck(BaseDiagnosticCheck):
26
26
  def run(self) -> DiagnosticResult:
27
27
  """Run monitor diagnostics."""
28
28
  try:
29
-
30
29
  sub_results = []
31
30
  details = {}
32
31
 
@@ -271,15 +271,17 @@ class DoctorReporter:
271
271
  + summary.skipped_count
272
272
  )
273
273
  if total > 0:
274
- print(f"| ✅ OK | {summary.ok_count} | {summary.ok_count*100//total}% |")
275
274
  print(
276
- f"| ⚠️ Warning | {summary.warning_count} | {summary.warning_count*100//total}% |"
275
+ f"| OK | {summary.ok_count} | {summary.ok_count * 100 // total}% |"
277
276
  )
278
277
  print(
279
- f"| Error | {summary.error_count} | {summary.error_count*100//total}% |"
278
+ f"| ⚠️ Warning | {summary.warning_count} | {summary.warning_count * 100 // total}% |"
280
279
  )
281
280
  print(
282
- f"| ⏭️ Skipped | {summary.skipped_count} | {summary.skipped_count*100//total}% |"
281
+ f"| Error | {summary.error_count} | {summary.error_count * 100 // total}% |"
282
+ )
283
+ print(
284
+ f"| ⏭️ Skipped | {summary.skipped_count} | {summary.skipped_count * 100 // total}% |"
283
285
  )
284
286
  print()
285
287
 
@@ -6,11 +6,32 @@ consistency across all checks and reporting.
6
6
  """
7
7
 
8
8
  from dataclasses import dataclass, field
9
+ from enum import Enum
9
10
  from typing import Any, Dict, List, Optional, Union
10
11
 
11
12
  from ...core.enums import OperationResult, ValidationSeverity
12
13
 
13
14
 
15
+ class DiagnosticStatus(str, Enum):
16
+ """Backward compatibility wrapper for diagnostic status values.
17
+
18
+ WHY: Provides backward compatibility for tests and code that use
19
+ DiagnosticStatus instead of the consolidated OperationResult/ValidationSeverity.
20
+
21
+ DESIGN DECISION: Maps to the appropriate consolidated enum values:
22
+ - OK → OperationResult.SUCCESS
23
+ - WARNING → ValidationSeverity.WARNING
24
+ - ERROR → ValidationSeverity.ERROR
25
+
26
+ Note: This is a compatibility layer. New code should use OperationResult
27
+ and ValidationSeverity directly.
28
+ """
29
+
30
+ OK = "success" # Maps to OperationResult.SUCCESS
31
+ WARNING = "warning" # Maps to ValidationSeverity.WARNING
32
+ ERROR = "error" # Maps to ValidationSeverity.ERROR
33
+
34
+
14
35
  @dataclass
15
36
  class DiagnosticResult:
16
37
  """Result from a diagnostic check.
@@ -0,0 +1,244 @@
1
+ # EventBus Service
2
+
3
+ A decoupled event handling system for claude-mpm that enables loose coupling between event producers (like hooks) and consumers (like Socket.IO).
4
+
5
+ ## Overview
6
+
7
+ The EventBus service provides a centralized publish-subscribe system that:
8
+ - Decouples event producers from consumers
9
+ - Supports both synchronous and asynchronous handlers
10
+ - Provides event filtering and routing capabilities
11
+ - Isolates failures in individual consumers
12
+ - Offers comprehensive monitoring and statistics
13
+
14
+ ## Architecture
15
+
16
+ ```
17
+ Hook Handler → EventBus → Multiple Consumers
18
+ ├── Socket.IO Relay
19
+ ├── Logging Service
20
+ ├── Analytics
21
+ └── Custom Handlers
22
+ ```
23
+
24
+ ## Key Components
25
+
26
+ ### EventBus (`event_bus.py`)
27
+ - Singleton pattern for centralized event coordination
28
+ - Thread-safe event publishing from any context
29
+ - Support for wildcard subscriptions (`hook.*`)
30
+ - Event filtering and routing
31
+ - Built-in statistics and history tracking
32
+
33
+ ### SocketIORelay (`relay.py`)
34
+ - Consumes events from EventBus
35
+ - Relays to Socket.IO clients
36
+ - Handles connection failures gracefully
37
+ - Single point of Socket.IO management
38
+
39
+ ### Configuration (`config.py`)
40
+ - Environment variable support
41
+ - Runtime configuration changes
42
+ - Easy testing with different settings
43
+
44
+ ## Installation
45
+
46
+ The EventBus requires `pyee` (Python EventEmitter):
47
+
48
+ ```bash
49
+ pip install pyee>=13.0.0
50
+ ```
51
+
52
+ ## Usage
53
+
54
+ ### Basic Publishing
55
+
56
+ ```python
57
+ from claude_mpm.services.event_bus import EventBus
58
+
59
+ # Get singleton instance
60
+ event_bus = EventBus.get_instance()
61
+
62
+ # Publish an event
63
+ event_bus.publish("hook.pre_tool", {
64
+ "tool_name": "Read",
65
+ "file_path": "/example.py",
66
+ "sessionId": "abc-123"
67
+ })
68
+ ```
69
+
70
+ ### Subscribing to Events
71
+
72
+ ```python
73
+ # Subscribe to specific event
74
+ def handle_pre_tool(data):
75
+ print(f"Tool: {data.get('tool_name')}")
76
+
77
+ event_bus.on("hook.pre_tool", handle_pre_tool)
78
+
79
+ # Subscribe to wildcard pattern
80
+ def handle_all_hooks(event_type, data):
81
+ print(f"Hook event: {event_type}")
82
+
83
+ event_bus.on("hook.*", handle_all_hooks)
84
+ ```
85
+
86
+ ### Async Handlers
87
+
88
+ ```python
89
+ async def async_handler(data):
90
+ await process_async(data)
91
+
92
+ event_bus.on("app.async_event", async_handler)
93
+ ```
94
+
95
+ ### Event Filtering
96
+
97
+ ```python
98
+ # Only allow specific events
99
+ event_bus.add_filter("hook.*")
100
+ event_bus.add_filter("system.critical.*")
101
+
102
+ # Events outside filters will be dropped
103
+ event_bus.publish("app.user_action", {}) # Filtered out
104
+ ```
105
+
106
+ ### Socket.IO Integration
107
+
108
+ ```python
109
+ from claude_mpm.services.event_bus import SocketIORelay
110
+
111
+ # Create and start relay
112
+ relay = SocketIORelay(port=8765)
113
+ relay.start()
114
+
115
+ # Events published to EventBus will be relayed to Socket.IO
116
+ event_bus.publish("hook.subagent_stop", {
117
+ "agent_type": "Engineer",
118
+ "result": "Success"
119
+ })
120
+ ```
121
+
122
+ ## Configuration
123
+
124
+ Configure via environment variables:
125
+
126
+ ```bash
127
+ # EventBus settings
128
+ export CLAUDE_MPM_EVENTBUS_ENABLED=true
129
+ export CLAUDE_MPM_EVENTBUS_DEBUG=false
130
+ export CLAUDE_MPM_EVENTBUS_HISTORY_SIZE=100
131
+ export CLAUDE_MPM_EVENTBUS_FILTERS="hook.*,system.critical.*"
132
+
133
+ # Relay settings
134
+ export CLAUDE_MPM_RELAY_ENABLED=true
135
+ export CLAUDE_MPM_SOCKETIO_PORT=8765
136
+ export CLAUDE_MPM_RELAY_DEBUG=false
137
+ export CLAUDE_MPM_RELAY_MAX_RETRIES=3
138
+ ```
139
+
140
+ ## Migration from Direct Socket.IO
141
+
142
+ ### Before (Direct Socket.IO)
143
+ ```python
144
+ # In hook_handler.py
145
+ client = socketio.Client()
146
+ client.connect("http://localhost:8765")
147
+ client.emit("claude_event", normalized_data)
148
+ ```
149
+
150
+ ### After (EventBus)
151
+ ```python
152
+ # In hook_handler.py
153
+ event_bus = EventBus.get_instance()
154
+ event_bus.publish("hook.pre_tool", data)
155
+
156
+ # Socket.IO handled by relay (separate concern)
157
+ ```
158
+
159
+ ## Benefits
160
+
161
+ 1. **Decoupling**: Hooks don't need to know about Socket.IO
162
+ 2. **Testability**: Easy to test without Socket.IO running
163
+ 3. **Reliability**: Failures in one consumer don't affect others
164
+ 4. **Flexibility**: Add new consumers without modifying producers
165
+ 5. **Performance**: Events processed asynchronously
166
+ 6. **Monitoring**: Built-in statistics and event history
167
+
168
+ ## Testing
169
+
170
+ Run the test suite:
171
+
172
+ ```bash
173
+ # Integration tests
174
+ python scripts/test_eventbus_integration.py
175
+
176
+ # Usage examples
177
+ python scripts/eventbus_usage_example.py
178
+
179
+ # Complete flow test
180
+ python scripts/test_eventbus_flow.py
181
+ ```
182
+
183
+ ## Monitoring
184
+
185
+ Get EventBus statistics:
186
+
187
+ ```python
188
+ stats = event_bus.get_stats()
189
+ print(f"Events published: {stats['events_published']}")
190
+ print(f"Events filtered: {stats['events_filtered']}")
191
+
192
+ # Recent event history
193
+ recent = event_bus.get_recent_events(10)
194
+ for event in recent:
195
+ print(f"{event['type']} at {event['timestamp']}")
196
+ ```
197
+
198
+ ## Error Handling
199
+
200
+ Errors in consumers are isolated:
201
+
202
+ ```python
203
+ def good_handler(data):
204
+ process(data) # Always runs
205
+
206
+ def bad_handler(data):
207
+ raise Exception("Error") # Doesn't affect good_handler
208
+
209
+ event_bus.on("app.event", good_handler)
210
+ event_bus.on("app.event", bad_handler)
211
+ ```
212
+
213
+ ## Performance
214
+
215
+ - Handles 30,000+ events/second
216
+ - Minimal memory overhead
217
+ - Thread-safe for concurrent publishing
218
+ - Efficient wildcard matching
219
+
220
+ ## Troubleshooting
221
+
222
+ ### Events not being received
223
+ 1. Check if EventBus is enabled: `CLAUDE_MPM_EVENTBUS_ENABLED=true`
224
+ 2. Verify no filters are blocking: `event_bus.clear_filters()`
225
+ 3. Check handler registration: `event_bus.on("event_type", handler)`
226
+
227
+ ### Socket.IO relay not working
228
+ 1. Verify Socket.IO server is running on configured port
229
+ 2. Check relay is started: `relay.start()`
230
+ 3. Enable debug logging: `CLAUDE_MPM_RELAY_DEBUG=true`
231
+
232
+ ### High memory usage
233
+ 1. Reduce history size: `CLAUDE_MPM_EVENTBUS_HISTORY_SIZE=50`
234
+ 2. Clear history periodically: `event_bus.clear_history()`
235
+
236
+ ## Future Enhancements
237
+
238
+ - [ ] Persistent event storage
239
+ - [ ] Event replay capabilities
240
+ - [ ] Advanced routing rules
241
+ - [ ] Event prioritization
242
+ - [ ] Distributed EventBus (Redis backend)
243
+ - [ ] Event schema validation
244
+ - [ ] Rate limiting per consumer
@@ -256,9 +256,9 @@ class DirectSocketIORelay:
256
256
  event_type, broadcast_data
257
257
  )
258
258
  self.stats["events_relayed"] += 1
259
- self.stats[
260
- "events_failed"
261
- ] -= 1 # Undo the failure count
259
+ self.stats["events_failed"] -= (
260
+ 1 # Undo the failure count
261
+ )
262
262
  logger.info(
263
263
  f"[DirectRelay] Retry successful for {event_type}"
264
264
  )
@@ -68,6 +68,9 @@ class EventBus:
68
68
  # Track async handler tasks to prevent garbage collection
69
69
  self._handler_tasks: Set[asyncio.Task] = set()
70
70
 
71
+ # Track handler wrappers for removal
72
+ self._handler_wrappers: Dict[tuple, Callable] = {}
73
+
71
74
  logger.info("EventBus initialized")
72
75
 
73
76
  @classmethod
@@ -266,8 +269,20 @@ class EventBus:
266
269
 
267
270
  logger.debug(f"Registered wildcard handler for: {event_type}")
268
271
  else:
269
- # Regular event registration
270
- self._emitter.on(event_type, handler)
272
+ # Wrap handler to catch exceptions and prevent them from stopping other handlers
273
+ def safe_handler(data):
274
+ try:
275
+ handler(data)
276
+ except Exception as e:
277
+ if self._debug:
278
+ logger.debug(f"Handler error for {event_type}: {e}")
279
+
280
+ # Store mapping for later removal
281
+ wrapper_key = (event_type, handler)
282
+ self._handler_wrappers[wrapper_key] = safe_handler
283
+
284
+ # Regular event registration with wrapped handler
285
+ self._emitter.on(event_type, safe_handler)
271
286
  logger.debug(f"Registered handler for: {event_type}")
272
287
 
273
288
  def once(self, event_type: str, handler: Callable) -> None:
@@ -287,7 +302,17 @@ class EventBus:
287
302
  event_type: The event type
288
303
  handler: The handler to remove
289
304
  """
290
- self._emitter.remove_listener(event_type, handler)
305
+ # Check if we have a wrapped version of this handler
306
+ wrapper_key = (event_type, handler)
307
+ if wrapper_key in self._handler_wrappers:
308
+ # Remove the wrapped handler from pyee
309
+ wrapped_handler = self._handler_wrappers[wrapper_key]
310
+ self._emitter.remove_listener(event_type, wrapped_handler)
311
+ # Remove from our tracking dict
312
+ del self._handler_wrappers[wrapper_key]
313
+ else:
314
+ # No wrapper, remove directly (e.g., for wildcard handlers or direct registrations)
315
+ self._emitter.remove_listener(event_type, handler)
291
316
  logger.debug(f"Removed handler for: {event_type}")
292
317
 
293
318
  def remove_all_listeners(self, event_type: Optional[str] = None) -> None:
@@ -298,9 +323,17 @@ class EventBus:
298
323
  """
299
324
  if event_type:
300
325
  self._emitter.remove_all_listeners(event_type)
326
+ # Clean up wrappers for this event type
327
+ wrappers_to_remove = [
328
+ key for key in self._handler_wrappers if key[0] == event_type
329
+ ]
330
+ for key in wrappers_to_remove:
331
+ del self._handler_wrappers[key]
301
332
  logger.debug(f"Removed all handlers for: {event_type}")
302
333
  else:
303
334
  self._emitter.remove_all_listeners()
335
+ # Clean up all wrappers
336
+ self._handler_wrappers.clear()
304
337
  logger.debug("Removed all event handlers")
305
338
 
306
339
  def _record_event(self, event_type: str, data: Any) -> None:
@@ -9,6 +9,7 @@ WHY separate relay component:
9
9
  """
10
10
 
11
11
  import os
12
+ import threading
12
13
  import time
13
14
  from datetime import datetime, timezone
14
15
  from typing import Any, Dict, Optional
@@ -271,11 +272,15 @@ class SocketIORelay:
271
272
 
272
273
  # Global relay instance
273
274
  _relay_instance: Optional[SocketIORelay] = None
275
+ _relay_lock = threading.Lock()
274
276
 
275
277
 
276
278
  def get_relay(port: Optional[int] = None) -> SocketIORelay:
277
279
  """Get or create the global SocketIO relay instance.
278
280
 
281
+ Thread-safe implementation using double-checked locking pattern to
282
+ prevent race conditions during concurrent initialization.
283
+
279
284
  Args:
280
285
  port: Optional port number
281
286
 
@@ -283,9 +288,16 @@ def get_relay(port: Optional[int] = None) -> SocketIORelay:
283
288
  SocketIORelay: The relay instance
284
289
  """
285
290
  global _relay_instance
286
- if _relay_instance is None:
287
- _relay_instance = SocketIORelay(port)
288
- return _relay_instance
291
+
292
+ # Fast path - check without lock
293
+ if _relay_instance is not None:
294
+ return _relay_instance
295
+
296
+ # Slow path - acquire lock and double-check
297
+ with _relay_lock:
298
+ if _relay_instance is None:
299
+ _relay_instance = SocketIORelay(port)
300
+ return _relay_instance
289
301
 
290
302
 
291
303
  def start_relay(port: Optional[int] = None) -> SocketIORelay:
@@ -303,8 +315,12 @@ def start_relay(port: Optional[int] = None) -> SocketIORelay:
303
315
 
304
316
 
305
317
  def stop_relay() -> None:
306
- """Stop the global SocketIO relay."""
318
+ """Stop the global SocketIO relay.
319
+
320
+ Thread-safe implementation ensures proper cleanup.
321
+ """
307
322
  global _relay_instance
308
- if _relay_instance:
309
- _relay_instance.stop()
310
- _relay_instance = None
323
+ with _relay_lock:
324
+ if _relay_instance:
325
+ _relay_instance.stop()
326
+ _relay_instance = None