claude-mpm 4.16.0__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 (531) hide show
  1. claude_mpm/VERSION +1 -1
  2. claude_mpm/agents/BASE_ENGINEER.md +286 -0
  3. claude_mpm/agents/BASE_PM.md +272 -23
  4. claude_mpm/agents/OUTPUT_STYLE.md +3 -48
  5. claude_mpm/agents/PM_INSTRUCTIONS.md +1821 -32
  6. claude_mpm/agents/WORKFLOW.md +75 -2
  7. claude_mpm/agents/agent_loader.py +4 -4
  8. claude_mpm/agents/base_agent.json +6 -3
  9. claude_mpm/agents/frontmatter_validator.py +1 -1
  10. claude_mpm/agents/templates/api_qa.json +5 -2
  11. claude_mpm/agents/templates/circuit_breakers.md +108 -2
  12. claude_mpm/agents/templates/documentation.json +33 -6
  13. claude_mpm/agents/templates/engineer.json +5 -1
  14. claude_mpm/agents/templates/javascript_engineer_agent.json +380 -0
  15. claude_mpm/agents/templates/php-engineer.json +10 -4
  16. claude_mpm/agents/templates/pm_red_flags.md +89 -19
  17. claude_mpm/agents/templates/project_organizer.json +7 -3
  18. claude_mpm/agents/templates/python_engineer.json +8 -3
  19. claude_mpm/agents/templates/qa.json +2 -1
  20. claude_mpm/agents/templates/react_engineer.json +1 -0
  21. claude_mpm/agents/templates/research.json +82 -12
  22. claude_mpm/agents/templates/rust_engineer.json +12 -7
  23. claude_mpm/agents/templates/security.json +4 -4
  24. claude_mpm/agents/templates/svelte-engineer.json +225 -0
  25. claude_mpm/agents/templates/tauri_engineer.json +274 -0
  26. claude_mpm/agents/templates/ticketing.json +10 -6
  27. claude_mpm/agents/templates/version_control.json +4 -2
  28. claude_mpm/agents/templates/web_qa.json +2 -1
  29. claude_mpm/cli/README.md +253 -0
  30. claude_mpm/cli/__init__.py +11 -1
  31. claude_mpm/cli/commands/__init__.py +2 -0
  32. claude_mpm/cli/commands/aggregate.py +1 -1
  33. claude_mpm/cli/commands/analyze.py +3 -3
  34. claude_mpm/cli/commands/cleanup.py +1 -1
  35. claude_mpm/cli/commands/configure_agent_display.py +4 -4
  36. claude_mpm/cli/commands/debug.py +12 -12
  37. claude_mpm/cli/commands/hook_errors.py +277 -0
  38. claude_mpm/cli/commands/mcp_install_commands.py +1 -1
  39. claude_mpm/cli/commands/mcp_install_commands.py.backup +284 -0
  40. claude_mpm/cli/commands/mpm_init/README.md +365 -0
  41. claude_mpm/cli/commands/mpm_init/__init__.py +73 -0
  42. claude_mpm/cli/commands/mpm_init/core.py +573 -0
  43. claude_mpm/cli/commands/mpm_init/display.py +341 -0
  44. claude_mpm/cli/commands/mpm_init/git_activity.py +427 -0
  45. claude_mpm/cli/commands/mpm_init/modes.py +397 -0
  46. claude_mpm/cli/commands/mpm_init/prompts.py +442 -0
  47. claude_mpm/cli/commands/mpm_init_cli.py +396 -0
  48. claude_mpm/cli/commands/mpm_init_handler.py +67 -1
  49. claude_mpm/cli/commands/run.py +124 -128
  50. claude_mpm/cli/commands/skills.py +922 -0
  51. claude_mpm/cli/executor.py +58 -0
  52. claude_mpm/cli/interactive/agent_wizard.py +5 -5
  53. claude_mpm/cli/parsers/base_parser.py +35 -0
  54. claude_mpm/cli/parsers/mpm_init_parser.py +42 -0
  55. claude_mpm/cli/parsers/skills_parser.py +275 -0
  56. claude_mpm/cli/startup.py +168 -8
  57. claude_mpm/cli/startup_display.py +480 -0
  58. claude_mpm/cli/utils.py +1 -1
  59. claude_mpm/cli_module/commands.py +1 -1
  60. claude_mpm/cli_module/refactoring_guide.md +253 -0
  61. claude_mpm/commands/mpm-auto-configure.md +52 -0
  62. claude_mpm/commands/mpm-help.md +6 -0
  63. claude_mpm/commands/mpm-init.md +130 -8
  64. claude_mpm/commands/mpm-resume.md +372 -0
  65. claude_mpm/commands/mpm-tickets.md +56 -7
  66. claude_mpm/commands/mpm-version.md +113 -0
  67. claude_mpm/commands/mpm.md +2 -0
  68. claude_mpm/config/agent_capabilities.yaml +658 -0
  69. claude_mpm/config/agent_config.py +2 -2
  70. claude_mpm/config/async_logging_config.yaml +145 -0
  71. claude_mpm/constants.py +24 -0
  72. claude_mpm/core/.claude-mpm/logs/hooks_20250730.log +34 -0
  73. claude_mpm/core/api_validator.py +1 -1
  74. claude_mpm/core/claude_runner.py +14 -1
  75. claude_mpm/core/config.py +50 -0
  76. claude_mpm/core/constants.py +1 -1
  77. claude_mpm/core/factories.py +1 -1
  78. claude_mpm/core/framework/processors/metadata_processor.py +1 -1
  79. claude_mpm/core/hook_error_memory.py +381 -0
  80. claude_mpm/core/hook_manager.py +41 -2
  81. claude_mpm/core/interactive_session.py +48 -3
  82. claude_mpm/core/interfaces.py +56 -1
  83. claude_mpm/core/logger.py +3 -1
  84. claude_mpm/core/oneshot_session.py +39 -0
  85. claude_mpm/core/optimized_agent_loader.py +3 -3
  86. claude_mpm/d2/.gitignore +22 -0
  87. claude_mpm/d2/ARCHITECTURE_COMPARISON.md +273 -0
  88. claude_mpm/d2/FLASK_INTEGRATION.md +156 -0
  89. claude_mpm/d2/IMPLEMENTATION_SUMMARY.md +452 -0
  90. claude_mpm/d2/QUICKSTART.md +186 -0
  91. claude_mpm/d2/README.md +232 -0
  92. claude_mpm/d2/STORE_FIX_SUMMARY.md +167 -0
  93. claude_mpm/d2/SVELTE5_STORES_GUIDE.md +180 -0
  94. claude_mpm/d2/TESTING.md +288 -0
  95. claude_mpm/d2/index.html +118 -0
  96. claude_mpm/d2/package.json +19 -0
  97. claude_mpm/d2/src/App.svelte +110 -0
  98. claude_mpm/d2/src/components/Header.svelte +153 -0
  99. claude_mpm/d2/src/components/MainContent.svelte +74 -0
  100. claude_mpm/d2/src/components/Sidebar.svelte +85 -0
  101. claude_mpm/d2/src/components/tabs/EventsTab.svelte +326 -0
  102. claude_mpm/d2/src/lib/socketio.js +144 -0
  103. claude_mpm/d2/src/main.js +7 -0
  104. claude_mpm/d2/src/stores/events.js +114 -0
  105. claude_mpm/d2/src/stores/socket.js +108 -0
  106. claude_mpm/d2/src/stores/theme.js +65 -0
  107. claude_mpm/d2/svelte.config.js +12 -0
  108. claude_mpm/d2/vite.config.js +15 -0
  109. claude_mpm/dashboard/.claude-mpm/memories/README.md +36 -0
  110. claude_mpm/dashboard/BUILD_NUMBER +1 -0
  111. claude_mpm/dashboard/README.md +121 -0
  112. claude_mpm/dashboard/VERSION +1 -0
  113. claude_mpm/dashboard/react/components/DataInspector/DataInspector.tsx +273 -0
  114. claude_mpm/dashboard/react/components/ErrorBoundary.tsx +75 -0
  115. claude_mpm/dashboard/react/components/EventViewer/EventViewer.tsx +141 -0
  116. claude_mpm/dashboard/react/components/shared/ConnectionStatus.tsx +36 -0
  117. claude_mpm/dashboard/react/components/shared/FilterBar.tsx +89 -0
  118. claude_mpm/dashboard/react/contexts/DashboardContext.tsx +215 -0
  119. claude_mpm/dashboard/react/entries/events.tsx +165 -0
  120. claude_mpm/dashboard/react/hooks/useEvents.ts +191 -0
  121. claude_mpm/dashboard/react/hooks/useSocket.ts +225 -0
  122. claude_mpm/dashboard/static/built/REFACTORING_SUMMARY.md +170 -0
  123. claude_mpm/dashboard/static/built/components/activity-tree.js.map +1 -0
  124. claude_mpm/dashboard/static/built/components/agent-hierarchy.js +101 -101
  125. claude_mpm/dashboard/static/built/components/agent-inference.js.map +1 -0
  126. claude_mpm/dashboard/static/built/components/build-tracker.js +59 -59
  127. claude_mpm/dashboard/static/built/components/code-simple.js +107 -107
  128. claude_mpm/dashboard/static/built/components/code-tree/tree-breadcrumb.js +29 -29
  129. claude_mpm/dashboard/static/built/components/code-tree/tree-constants.js +24 -24
  130. claude_mpm/dashboard/static/built/components/code-tree/tree-search.js +27 -27
  131. claude_mpm/dashboard/static/built/components/code-tree/tree-utils.js +25 -25
  132. claude_mpm/dashboard/static/built/components/code-tree.js.map +1 -0
  133. claude_mpm/dashboard/static/built/components/code-viewer.js.map +1 -0
  134. claude_mpm/dashboard/static/built/components/connection-debug.js +101 -101
  135. claude_mpm/dashboard/static/built/components/diff-viewer.js +113 -113
  136. claude_mpm/dashboard/static/built/components/event-processor.js.map +1 -0
  137. claude_mpm/dashboard/static/built/components/event-viewer.js.map +1 -0
  138. claude_mpm/dashboard/static/built/components/export-manager.js.map +1 -0
  139. claude_mpm/dashboard/static/built/components/file-change-tracker.js +57 -57
  140. claude_mpm/dashboard/static/built/components/file-change-viewer.js +74 -74
  141. claude_mpm/dashboard/static/built/components/file-tool-tracker.js.map +1 -0
  142. claude_mpm/dashboard/static/built/components/file-viewer.js.map +1 -0
  143. claude_mpm/dashboard/static/built/components/hud-library-loader.js.map +1 -0
  144. claude_mpm/dashboard/static/built/components/hud-manager.js.map +1 -0
  145. claude_mpm/dashboard/static/built/components/hud-visualizer.js.map +1 -0
  146. claude_mpm/dashboard/static/built/components/module-viewer.js.map +1 -0
  147. claude_mpm/dashboard/static/built/components/session-manager.js.map +1 -0
  148. claude_mpm/dashboard/static/built/components/socket-manager.js.map +1 -0
  149. claude_mpm/dashboard/static/built/components/ui-state-manager.js.map +1 -0
  150. claude_mpm/dashboard/static/built/components/unified-data-viewer.js.map +1 -0
  151. claude_mpm/dashboard/static/built/components/working-directory.js.map +1 -0
  152. claude_mpm/dashboard/static/built/connection-manager.js +76 -76
  153. claude_mpm/dashboard/static/built/dashboard.js.map +1 -0
  154. claude_mpm/dashboard/static/built/extension-error-handler.js +22 -22
  155. claude_mpm/dashboard/static/built/react/events.js.map +1 -0
  156. claude_mpm/dashboard/static/built/shared/dom-helpers.js +9 -9
  157. claude_mpm/dashboard/static/built/shared/event-bus.js +5 -5
  158. claude_mpm/dashboard/static/built/shared/logger.js +16 -16
  159. claude_mpm/dashboard/static/built/shared/tooltip-service.js +6 -6
  160. claude_mpm/dashboard/static/built/socket-client.js.map +1 -0
  161. claude_mpm/dashboard/static/css/activity.css +69 -69
  162. claude_mpm/dashboard/static/css/connection-status.css +10 -10
  163. claude_mpm/dashboard/static/css/dashboard.css +15 -15
  164. claude_mpm/dashboard/static/index.html +22 -22
  165. claude_mpm/dashboard/static/js/REFACTORING_SUMMARY.md +170 -0
  166. claude_mpm/dashboard/static/js/components/activity-tree.js +178 -178
  167. claude_mpm/dashboard/static/js/components/agent-hierarchy.js +101 -101
  168. claude_mpm/dashboard/static/js/components/agent-inference.js +31 -31
  169. claude_mpm/dashboard/static/js/components/build-tracker.js +59 -59
  170. claude_mpm/dashboard/static/js/components/code-simple.js +107 -107
  171. claude_mpm/dashboard/static/js/components/connection-debug.js +101 -101
  172. claude_mpm/dashboard/static/js/components/diff-viewer.js +113 -113
  173. claude_mpm/dashboard/static/js/components/event-viewer.js +12 -12
  174. claude_mpm/dashboard/static/js/components/file-change-tracker.js +57 -57
  175. claude_mpm/dashboard/static/js/components/file-change-viewer.js +74 -74
  176. claude_mpm/dashboard/static/js/components/file-tool-tracker.js +6 -6
  177. claude_mpm/dashboard/static/js/components/file-viewer.js +42 -42
  178. claude_mpm/dashboard/static/js/components/module-viewer.js +27 -27
  179. claude_mpm/dashboard/static/js/components/session-manager.js +14 -14
  180. claude_mpm/dashboard/static/js/components/socket-manager.js +1 -1
  181. claude_mpm/dashboard/static/js/components/ui-state-manager.js +14 -14
  182. claude_mpm/dashboard/static/js/components/unified-data-viewer.js +110 -110
  183. claude_mpm/dashboard/static/js/components/working-directory.js +8 -8
  184. claude_mpm/dashboard/static/js/connection-manager.js +76 -76
  185. claude_mpm/dashboard/static/js/dashboard.js +76 -58
  186. claude_mpm/dashboard/static/js/extension-error-handler.js +22 -22
  187. claude_mpm/dashboard/static/js/shared/dom-helpers.js +9 -9
  188. claude_mpm/dashboard/static/js/shared/event-bus.js +5 -5
  189. claude_mpm/dashboard/static/js/shared/logger.js +16 -16
  190. claude_mpm/dashboard/static/js/shared/tooltip-service.js +6 -6
  191. claude_mpm/dashboard/static/js/socket-client.js +138 -121
  192. claude_mpm/dashboard/static/navigation-test-results.md +118 -0
  193. claude_mpm/dashboard/static/production/main.html +21 -21
  194. claude_mpm/dashboard/static/test-archive/dashboard.html +22 -22
  195. claude_mpm/dashboard/templates/.claude-mpm/memories/README.md +36 -0
  196. claude_mpm/dashboard/templates/.claude-mpm/memories/engineer_agent.md +39 -0
  197. claude_mpm/dashboard/templates/.claude-mpm/memories/version_control_agent.md +38 -0
  198. claude_mpm/dashboard/templates/code_simple.html +23 -23
  199. claude_mpm/dashboard/templates/index.html +18 -18
  200. claude_mpm/hooks/README.md +143 -0
  201. claude_mpm/hooks/__init__.py +8 -0
  202. claude_mpm/hooks/claude_hooks/event_handlers.py +3 -1
  203. claude_mpm/hooks/claude_hooks/hook_handler.py +24 -7
  204. claude_mpm/hooks/claude_hooks/installer.py +45 -0
  205. claude_mpm/hooks/claude_hooks/response_tracking.py +35 -1
  206. claude_mpm/hooks/session_resume_hook.py +121 -0
  207. claude_mpm/hooks/templates/README.md +180 -0
  208. claude_mpm/hooks/templates/pre_tool_use_simple.py +78 -0
  209. claude_mpm/hooks/templates/pre_tool_use_template.py +323 -0
  210. claude_mpm/hooks/templates/settings.json.example +147 -0
  211. claude_mpm/models/resume_log.py +340 -0
  212. claude_mpm/schemas/agent_schema.json +596 -0
  213. claude_mpm/schemas/frontmatter_schema.json +165 -0
  214. claude_mpm/scripts/claude-hook-handler.sh +3 -3
  215. claude_mpm/scripts/start_activity_logging.py +3 -1
  216. claude_mpm/services/agents/auto_config_manager.py +1 -1
  217. claude_mpm/services/agents/deployment/agent_configuration_manager.py +1 -1
  218. claude_mpm/services/agents/deployment/agent_format_converter.py +1 -1
  219. claude_mpm/services/agents/deployment/agent_metrics_collector.py +3 -3
  220. claude_mpm/services/agents/deployment/agent_record_service.py +1 -1
  221. claude_mpm/services/agents/deployment/agent_validator.py +17 -1
  222. claude_mpm/services/agents/deployment/async_agent_deployment.py +1 -1
  223. claude_mpm/services/agents/deployment/facade/deployment_facade.py +3 -3
  224. claude_mpm/services/agents/deployment/local_template_deployment.py +1 -1
  225. claude_mpm/services/agents/deployment/pipeline/pipeline_executor.py +2 -2
  226. claude_mpm/services/agents/loading/framework_agent_loader.py +8 -8
  227. claude_mpm/services/agents/local_template_manager.py +4 -2
  228. claude_mpm/services/agents/recommender.py +47 -0
  229. claude_mpm/services/cli/resume_service.py +617 -0
  230. claude_mpm/services/cli/session_manager.py +87 -0
  231. claude_mpm/services/cli/session_pause_manager.py +504 -0
  232. claude_mpm/services/cli/session_resume_helper.py +372 -0
  233. claude_mpm/services/cli/unified_dashboard_manager.py +1 -1
  234. claude_mpm/services/core/base.py +26 -11
  235. claude_mpm/services/core/interfaces.py +56 -1
  236. claude_mpm/services/core/models/agent_config.py +3 -0
  237. claude_mpm/services/core/models/process.py +4 -0
  238. claude_mpm/services/core/path_resolver.py +1 -1
  239. claude_mpm/services/diagnostics/checks/agent_check.py +0 -2
  240. claude_mpm/services/diagnostics/checks/instructions_check.py +1 -2
  241. claude_mpm/services/diagnostics/checks/mcp_check.py +0 -1
  242. claude_mpm/services/diagnostics/checks/monitor_check.py +0 -1
  243. claude_mpm/services/diagnostics/doctor_reporter.py +6 -4
  244. claude_mpm/services/diagnostics/models.py +21 -0
  245. claude_mpm/services/event_bus/README.md +244 -0
  246. claude_mpm/services/event_bus/direct_relay.py +3 -3
  247. claude_mpm/services/event_bus/event_bus.py +36 -3
  248. claude_mpm/services/event_bus/relay.py +23 -7
  249. claude_mpm/services/events/README.md +303 -0
  250. claude_mpm/services/events/consumers/logging.py +1 -2
  251. claude_mpm/services/framework_claude_md_generator/README.md +119 -0
  252. claude_mpm/services/infrastructure/monitoring/resources.py +1 -1
  253. claude_mpm/services/infrastructure/resume_log_generator.py +439 -0
  254. claude_mpm/services/local_ops/__init__.py +2 -0
  255. claude_mpm/services/local_ops/process_manager.py +1 -1
  256. claude_mpm/services/local_ops/resource_monitor.py +2 -2
  257. claude_mpm/services/mcp_config_manager.py +7 -131
  258. claude_mpm/services/mcp_gateway/README.md +185 -0
  259. claude_mpm/services/mcp_gateway/auto_configure.py +31 -25
  260. claude_mpm/services/mcp_gateway/config/configuration.py +1 -1
  261. claude_mpm/services/mcp_gateway/core/process_pool.py +19 -10
  262. claude_mpm/services/mcp_gateway/server/stdio_server.py +0 -2
  263. claude_mpm/services/mcp_gateway/tools/document_summarizer.py +1 -1
  264. claude_mpm/services/mcp_gateway/tools/external_mcp_services.py +26 -21
  265. claude_mpm/services/mcp_gateway/tools/kuzu_memory_service.py +6 -2
  266. claude_mpm/services/memory/failure_tracker.py +19 -4
  267. claude_mpm/services/memory/optimizer.py +1 -1
  268. claude_mpm/services/model/model_router.py +8 -9
  269. claude_mpm/services/monitor/daemon.py +1 -1
  270. claude_mpm/services/monitor/server.py +2 -2
  271. claude_mpm/services/native_agent_converter.py +356 -0
  272. claude_mpm/services/port_manager.py +1 -1
  273. claude_mpm/services/project/documentation_manager.py +2 -1
  274. claude_mpm/services/project/toolchain_analyzer.py +3 -1
  275. claude_mpm/services/runner_configuration_service.py +1 -0
  276. claude_mpm/services/self_upgrade_service.py +165 -7
  277. claude_mpm/services/session_manager.py +205 -1
  278. claude_mpm/services/skills_config.py +547 -0
  279. claude_mpm/services/skills_deployer.py +955 -0
  280. claude_mpm/services/socketio/handlers/connection.py +1 -1
  281. claude_mpm/services/socketio/handlers/connection.py.backup +217 -0
  282. claude_mpm/services/socketio/handlers/git.py +2 -2
  283. claude_mpm/services/socketio/handlers/hook.py.backup +154 -0
  284. claude_mpm/services/static/.gitkeep +2 -0
  285. claude_mpm/services/system_instructions_service.py +1 -3
  286. claude_mpm/services/unified/analyzer_strategies/performance_analyzer.py +0 -3
  287. claude_mpm/services/unified/analyzer_strategies/security_analyzer.py +0 -1
  288. claude_mpm/services/unified/deployment_strategies/cloud_strategies.py +1 -1
  289. claude_mpm/services/unified/deployment_strategies/local.py +1 -1
  290. claude_mpm/services/version_control/VERSION +1 -0
  291. claude_mpm/services/version_control/conflict_resolution.py +6 -4
  292. claude_mpm/services/version_service.py +104 -1
  293. claude_mpm/services/visualization/mermaid_generator.py +2 -3
  294. claude_mpm/skills/__init__.py +21 -0
  295. claude_mpm/skills/agent_skills_injector.py +324 -0
  296. claude_mpm/skills/bundled/.gitkeep +2 -0
  297. claude_mpm/skills/bundled/LICENSE_ATTRIBUTIONS.md +79 -0
  298. claude_mpm/skills/bundled/api-documentation.md +393 -0
  299. claude_mpm/skills/bundled/async-testing.md +571 -0
  300. claude_mpm/skills/bundled/code-review.md +143 -0
  301. claude_mpm/skills/bundled/collaboration/brainstorming/SKILL.md +79 -0
  302. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/SKILL.md +178 -0
  303. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/agent-prompts.md +577 -0
  304. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/coordination-patterns.md +467 -0
  305. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/examples.md +537 -0
  306. claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/troubleshooting.md +730 -0
  307. claude_mpm/skills/bundled/collaboration/git-worktrees.md +317 -0
  308. claude_mpm/skills/bundled/collaboration/requesting-code-review/SKILL.md +112 -0
  309. claude_mpm/skills/bundled/collaboration/requesting-code-review/references/code-reviewer-template.md +146 -0
  310. claude_mpm/skills/bundled/collaboration/requesting-code-review/references/review-examples.md +412 -0
  311. claude_mpm/skills/bundled/collaboration/stacked-prs.md +251 -0
  312. claude_mpm/skills/bundled/collaboration/writing-plans/SKILL.md +81 -0
  313. claude_mpm/skills/bundled/collaboration/writing-plans/references/best-practices.md +362 -0
  314. claude_mpm/skills/bundled/collaboration/writing-plans/references/plan-structure-templates.md +312 -0
  315. claude_mpm/skills/bundled/database-migration.md +199 -0
  316. claude_mpm/skills/bundled/debugging/root-cause-tracing/SKILL.md +152 -0
  317. claude_mpm/skills/bundled/debugging/root-cause-tracing/find-polluter.sh +63 -0
  318. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/advanced-techniques.md +668 -0
  319. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/examples.md +587 -0
  320. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/integration.md +438 -0
  321. claude_mpm/skills/bundled/debugging/root-cause-tracing/references/tracing-techniques.md +391 -0
  322. claude_mpm/skills/bundled/debugging/systematic-debugging/CREATION-LOG.md +119 -0
  323. claude_mpm/skills/bundled/debugging/systematic-debugging/SKILL.md +148 -0
  324. claude_mpm/skills/bundled/debugging/systematic-debugging/references/anti-patterns.md +483 -0
  325. claude_mpm/skills/bundled/debugging/systematic-debugging/references/examples.md +452 -0
  326. claude_mpm/skills/bundled/debugging/systematic-debugging/references/troubleshooting.md +449 -0
  327. claude_mpm/skills/bundled/debugging/systematic-debugging/references/workflow.md +411 -0
  328. claude_mpm/skills/bundled/debugging/systematic-debugging/test-academic.md +14 -0
  329. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-1.md +58 -0
  330. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-2.md +68 -0
  331. claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-3.md +69 -0
  332. claude_mpm/skills/bundled/debugging/verification-before-completion/SKILL.md +131 -0
  333. claude_mpm/skills/bundled/debugging/verification-before-completion/references/gate-function.md +325 -0
  334. claude_mpm/skills/bundled/debugging/verification-before-completion/references/integration-and-workflows.md +490 -0
  335. claude_mpm/skills/bundled/debugging/verification-before-completion/references/red-flags-and-failures.md +425 -0
  336. claude_mpm/skills/bundled/debugging/verification-before-completion/references/verification-patterns.md +499 -0
  337. claude_mpm/skills/bundled/docker-containerization.md +194 -0
  338. claude_mpm/skills/bundled/express-local-dev.md +1429 -0
  339. claude_mpm/skills/bundled/fastapi-local-dev.md +1199 -0
  340. claude_mpm/skills/bundled/git-workflow.md +414 -0
  341. claude_mpm/skills/bundled/imagemagick.md +204 -0
  342. claude_mpm/skills/bundled/infrastructure/env-manager/INTEGRATION.md +611 -0
  343. claude_mpm/skills/bundled/infrastructure/env-manager/README.md +596 -0
  344. claude_mpm/skills/bundled/infrastructure/env-manager/SKILL.md +260 -0
  345. claude_mpm/skills/bundled/infrastructure/env-manager/examples/nextjs-env-structure.md +315 -0
  346. claude_mpm/skills/bundled/infrastructure/env-manager/references/frameworks.md +436 -0
  347. claude_mpm/skills/bundled/infrastructure/env-manager/references/security.md +433 -0
  348. claude_mpm/skills/bundled/infrastructure/env-manager/references/synchronization.md +452 -0
  349. claude_mpm/skills/bundled/infrastructure/env-manager/references/troubleshooting.md +404 -0
  350. claude_mpm/skills/bundled/infrastructure/env-manager/references/validation.md +420 -0
  351. claude_mpm/skills/bundled/infrastructure/env-manager/scripts/validate_env.py +576 -0
  352. claude_mpm/skills/bundled/json-data-handling.md +223 -0
  353. claude_mpm/skills/bundled/main/artifacts-builder/LICENSE.txt +202 -0
  354. claude_mpm/skills/bundled/main/artifacts-builder/SKILL.md +86 -0
  355. claude_mpm/skills/bundled/main/artifacts-builder/scripts/bundle-artifact.sh +54 -0
  356. claude_mpm/skills/bundled/main/artifacts-builder/scripts/init-artifact.sh +322 -0
  357. claude_mpm/skills/bundled/main/artifacts-builder/scripts/shadcn-components.tar.gz +0 -0
  358. claude_mpm/skills/bundled/main/internal-comms/LICENSE.txt +202 -0
  359. claude_mpm/skills/bundled/main/internal-comms/SKILL.md +43 -0
  360. claude_mpm/skills/bundled/main/internal-comms/examples/3p-updates.md +47 -0
  361. claude_mpm/skills/bundled/main/internal-comms/examples/company-newsletter.md +65 -0
  362. claude_mpm/skills/bundled/main/internal-comms/examples/faq-answers.md +30 -0
  363. claude_mpm/skills/bundled/main/internal-comms/examples/general-comms.md +16 -0
  364. claude_mpm/skills/bundled/main/mcp-builder/LICENSE.txt +202 -0
  365. claude_mpm/skills/bundled/main/mcp-builder/SKILL.md +160 -0
  366. claude_mpm/skills/bundled/main/mcp-builder/reference/design_principles.md +412 -0
  367. claude_mpm/skills/bundled/main/mcp-builder/reference/evaluation.md +602 -0
  368. claude_mpm/skills/bundled/main/mcp-builder/reference/mcp_best_practices.md +915 -0
  369. claude_mpm/skills/bundled/main/mcp-builder/reference/node_mcp_server.md +916 -0
  370. claude_mpm/skills/bundled/main/mcp-builder/reference/python_mcp_server.md +752 -0
  371. claude_mpm/skills/bundled/main/mcp-builder/reference/workflow.md +1237 -0
  372. claude_mpm/skills/bundled/main/mcp-builder/scripts/connections.py +157 -0
  373. claude_mpm/skills/bundled/main/mcp-builder/scripts/evaluation.py +425 -0
  374. claude_mpm/skills/bundled/main/mcp-builder/scripts/example_evaluation.xml +22 -0
  375. claude_mpm/skills/bundled/main/mcp-builder/scripts/requirements.txt +2 -0
  376. claude_mpm/skills/bundled/main/skill-creator/LICENSE.txt +202 -0
  377. claude_mpm/skills/bundled/main/skill-creator/SKILL.md +189 -0
  378. claude_mpm/skills/bundled/main/skill-creator/references/best-practices.md +500 -0
  379. claude_mpm/skills/bundled/main/skill-creator/references/creation-workflow.md +464 -0
  380. claude_mpm/skills/bundled/main/skill-creator/references/examples.md +619 -0
  381. claude_mpm/skills/bundled/main/skill-creator/references/progressive-disclosure.md +437 -0
  382. claude_mpm/skills/bundled/main/skill-creator/references/skill-structure.md +231 -0
  383. claude_mpm/skills/bundled/main/skill-creator/scripts/init_skill.py +303 -0
  384. claude_mpm/skills/bundled/main/skill-creator/scripts/package_skill.py +113 -0
  385. claude_mpm/skills/bundled/main/skill-creator/scripts/quick_validate.py +72 -0
  386. claude_mpm/skills/bundled/nextjs-local-dev.md +807 -0
  387. claude_mpm/skills/bundled/pdf.md +141 -0
  388. claude_mpm/skills/bundled/performance-profiling.md +573 -0
  389. claude_mpm/skills/bundled/php/espocrm-development/SKILL.md +170 -0
  390. claude_mpm/skills/bundled/php/espocrm-development/references/architecture.md +602 -0
  391. claude_mpm/skills/bundled/php/espocrm-development/references/common-tasks.md +821 -0
  392. claude_mpm/skills/bundled/php/espocrm-development/references/development-workflow.md +742 -0
  393. claude_mpm/skills/bundled/php/espocrm-development/references/frontend-customization.md +726 -0
  394. claude_mpm/skills/bundled/php/espocrm-development/references/hooks-and-services.md +764 -0
  395. claude_mpm/skills/bundled/php/espocrm-development/references/testing-debugging.md +831 -0
  396. claude_mpm/skills/bundled/react/flexlayout-react.md +742 -0
  397. claude_mpm/skills/bundled/refactoring-patterns.md +180 -0
  398. claude_mpm/skills/bundled/rust/desktop-applications/SKILL.md +226 -0
  399. claude_mpm/skills/bundled/rust/desktop-applications/references/architecture-patterns.md +901 -0
  400. claude_mpm/skills/bundled/rust/desktop-applications/references/native-gui-frameworks.md +901 -0
  401. claude_mpm/skills/bundled/rust/desktop-applications/references/platform-integration.md +775 -0
  402. claude_mpm/skills/bundled/rust/desktop-applications/references/state-management.md +937 -0
  403. claude_mpm/skills/bundled/rust/desktop-applications/references/tauri-framework.md +770 -0
  404. claude_mpm/skills/bundled/rust/desktop-applications/references/testing-deployment.md +961 -0
  405. claude_mpm/skills/bundled/security-scanning.md +327 -0
  406. claude_mpm/skills/bundled/systematic-debugging.md +473 -0
  407. claude_mpm/skills/bundled/tauri/tauri-async-patterns.md +495 -0
  408. claude_mpm/skills/bundled/tauri/tauri-build-deploy.md +599 -0
  409. claude_mpm/skills/bundled/tauri/tauri-command-patterns.md +535 -0
  410. claude_mpm/skills/bundled/tauri/tauri-error-handling.md +613 -0
  411. claude_mpm/skills/bundled/tauri/tauri-event-system.md +648 -0
  412. claude_mpm/skills/bundled/tauri/tauri-file-system.md +673 -0
  413. claude_mpm/skills/bundled/tauri/tauri-frontend-integration.md +767 -0
  414. claude_mpm/skills/bundled/tauri/tauri-performance.md +669 -0
  415. claude_mpm/skills/bundled/tauri/tauri-state-management.md +573 -0
  416. claude_mpm/skills/bundled/tauri/tauri-testing.md +384 -0
  417. claude_mpm/skills/bundled/tauri/tauri-window-management.md +628 -0
  418. claude_mpm/skills/bundled/test-driven-development.md +378 -0
  419. claude_mpm/skills/bundled/testing/condition-based-waiting/SKILL.md +119 -0
  420. claude_mpm/skills/bundled/testing/condition-based-waiting/example.ts +158 -0
  421. claude_mpm/skills/bundled/testing/condition-based-waiting/references/patterns-and-implementation.md +253 -0
  422. claude_mpm/skills/bundled/testing/test-driven-development/SKILL.md +145 -0
  423. claude_mpm/skills/bundled/testing/test-driven-development/references/anti-patterns.md +543 -0
  424. claude_mpm/skills/bundled/testing/test-driven-development/references/examples.md +741 -0
  425. claude_mpm/skills/bundled/testing/test-driven-development/references/integration.md +470 -0
  426. claude_mpm/skills/bundled/testing/test-driven-development/references/philosophy.md +458 -0
  427. claude_mpm/skills/bundled/testing/test-driven-development/references/workflow.md +639 -0
  428. claude_mpm/skills/bundled/testing/test-quality-inspector/SKILL.md +458 -0
  429. claude_mpm/skills/bundled/testing/test-quality-inspector/examples/example-inspection-report.md +411 -0
  430. claude_mpm/skills/bundled/testing/test-quality-inspector/references/assertion-quality.md +317 -0
  431. claude_mpm/skills/bundled/testing/test-quality-inspector/references/inspection-checklist.md +270 -0
  432. claude_mpm/skills/bundled/testing/test-quality-inspector/references/red-flags.md +436 -0
  433. claude_mpm/skills/bundled/testing/testing-anti-patterns/SKILL.md +140 -0
  434. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/completeness-anti-patterns.md +572 -0
  435. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/core-anti-patterns.md +411 -0
  436. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/detection-guide.md +569 -0
  437. claude_mpm/skills/bundled/testing/testing-anti-patterns/references/tdd-connection.md +695 -0
  438. claude_mpm/skills/bundled/testing/webapp-testing/LICENSE.txt +202 -0
  439. claude_mpm/skills/bundled/testing/webapp-testing/SKILL.md +184 -0
  440. claude_mpm/skills/bundled/testing/webapp-testing/decision-tree.md +459 -0
  441. claude_mpm/skills/bundled/testing/webapp-testing/examples/console_logging.py +35 -0
  442. claude_mpm/skills/bundled/testing/webapp-testing/examples/element_discovery.py +44 -0
  443. claude_mpm/skills/bundled/testing/webapp-testing/examples/static_html_automation.py +34 -0
  444. claude_mpm/skills/bundled/testing/webapp-testing/playwright-patterns.md +479 -0
  445. claude_mpm/skills/bundled/testing/webapp-testing/reconnaissance-pattern.md +687 -0
  446. claude_mpm/skills/bundled/testing/webapp-testing/scripts/with_server.py +129 -0
  447. claude_mpm/skills/bundled/testing/webapp-testing/server-management.md +758 -0
  448. claude_mpm/skills/bundled/testing/webapp-testing/troubleshooting.md +868 -0
  449. claude_mpm/skills/bundled/vite-local-dev.md +1061 -0
  450. claude_mpm/skills/bundled/web-performance-optimization.md +2305 -0
  451. claude_mpm/skills/bundled/xlsx.md +157 -0
  452. claude_mpm/skills/registry.py +97 -9
  453. claude_mpm/skills/skills_registry.py +347 -0
  454. claude_mpm/skills/skills_service.py +739 -0
  455. claude_mpm/templates/questions/EXAMPLES.md +501 -0
  456. claude_mpm/templates/questions/__init__.py +43 -0
  457. claude_mpm/templates/questions/base.py +193 -0
  458. claude_mpm/templates/questions/pr_strategy.py +314 -0
  459. claude_mpm/templates/questions/project_init.py +388 -0
  460. claude_mpm/templates/questions/ticket_mgmt.py +397 -0
  461. claude_mpm/tools/README_SOCKETIO_DEBUG.md +224 -0
  462. claude_mpm/tools/__main__.py +8 -8
  463. claude_mpm/tools/code_tree_analyzer/README.md +64 -0
  464. claude_mpm/tools/code_tree_analyzer/__init__.py +45 -0
  465. claude_mpm/tools/code_tree_analyzer/analysis.py +299 -0
  466. claude_mpm/tools/code_tree_analyzer/cache.py +131 -0
  467. claude_mpm/tools/code_tree_analyzer/core.py +380 -0
  468. claude_mpm/tools/code_tree_analyzer/discovery.py +403 -0
  469. claude_mpm/tools/code_tree_analyzer/events.py +168 -0
  470. claude_mpm/tools/code_tree_analyzer/gitignore.py +308 -0
  471. claude_mpm/tools/code_tree_analyzer/models.py +39 -0
  472. claude_mpm/tools/code_tree_analyzer/multilang_analyzer.py +224 -0
  473. claude_mpm/tools/code_tree_analyzer/python_analyzer.py +284 -0
  474. claude_mpm/utils/agent_dependency_loader.py +5 -5
  475. claude_mpm/utils/dependency_cache.py +3 -1
  476. claude_mpm/utils/gitignore.py +241 -0
  477. claude_mpm/utils/log_cleanup.py +3 -3
  478. claude_mpm/utils/robust_installer.py +3 -5
  479. claude_mpm/utils/structured_questions.py +619 -0
  480. claude_mpm-4.25.10.dist-info/METADATA +789 -0
  481. {claude_mpm-4.16.0.dist-info → claude_mpm-4.25.10.dist-info}/RECORD +485 -240
  482. claude_mpm/agents/INSTRUCTIONS_OLD_DEPRECATED.md +0 -602
  483. claude_mpm/agents/templates/.claude-mpm/memories/README.md +0 -17
  484. claude_mpm/agents/templates/.claude-mpm/memories/engineer_memories.md +0 -3
  485. claude_mpm/agents/templates/logs/prompts/agent_engineer_20250826_014258_728.md +0 -39
  486. claude_mpm/agents/templates/logs/prompts/agent_engineer_20250901_010124_142.md +0 -400
  487. claude_mpm/cli/commands/mpm_init.py +0 -2008
  488. claude_mpm/dashboard/.claude-mpm/socketio-instances.json +0 -1
  489. claude_mpm/dashboard/static/archive/activity_dashboard_test.html +0 -61
  490. claude_mpm/dashboard/static/archive/test_activity_connection.html +0 -179
  491. claude_mpm/dashboard/static/archive/test_claude_tree_tab.html +0 -68
  492. claude_mpm/dashboard/static/archive/test_dashboard.html +0 -409
  493. claude_mpm/dashboard/static/archive/test_dashboard_fixed.html +0 -519
  494. claude_mpm/dashboard/static/archive/test_dashboard_verification.html +0 -181
  495. claude_mpm/dashboard/static/archive/test_file_data.html +0 -315
  496. claude_mpm/dashboard/static/archive/test_file_tree_empty_state.html +0 -243
  497. claude_mpm/dashboard/static/archive/test_file_tree_fix.html +0 -234
  498. claude_mpm/dashboard/static/archive/test_file_tree_rename.html +0 -117
  499. claude_mpm/dashboard/static/archive/test_file_tree_tab.html +0 -115
  500. claude_mpm/dashboard/static/archive/test_file_viewer.html +0 -224
  501. claude_mpm/dashboard/static/archive/test_final_activity.html +0 -220
  502. claude_mpm/dashboard/static/archive/test_tab_fix.html +0 -139
  503. claude_mpm/dashboard/static/dist/assets/events.DjpNxWNo.css +0 -1
  504. claude_mpm/dashboard/static/dist/components/activity-tree.js +0 -2
  505. claude_mpm/dashboard/static/dist/components/agent-inference.js +0 -2
  506. claude_mpm/dashboard/static/dist/components/code-tree.js +0 -2
  507. claude_mpm/dashboard/static/dist/components/code-viewer.js +0 -2
  508. claude_mpm/dashboard/static/dist/components/event-processor.js +0 -2
  509. claude_mpm/dashboard/static/dist/components/event-viewer.js +0 -2
  510. claude_mpm/dashboard/static/dist/components/export-manager.js +0 -2
  511. claude_mpm/dashboard/static/dist/components/file-tool-tracker.js +0 -2
  512. claude_mpm/dashboard/static/dist/components/file-viewer.js +0 -2
  513. claude_mpm/dashboard/static/dist/components/hud-library-loader.js +0 -2
  514. claude_mpm/dashboard/static/dist/components/hud-manager.js +0 -2
  515. claude_mpm/dashboard/static/dist/components/hud-visualizer.js +0 -2
  516. claude_mpm/dashboard/static/dist/components/module-viewer.js +0 -2
  517. claude_mpm/dashboard/static/dist/components/session-manager.js +0 -2
  518. claude_mpm/dashboard/static/dist/components/socket-manager.js +0 -2
  519. claude_mpm/dashboard/static/dist/components/ui-state-manager.js +0 -2
  520. claude_mpm/dashboard/static/dist/components/unified-data-viewer.js +0 -2
  521. claude_mpm/dashboard/static/dist/components/working-directory.js +0 -2
  522. claude_mpm/dashboard/static/dist/dashboard.js +0 -2
  523. claude_mpm/dashboard/static/dist/react/events.js +0 -30
  524. claude_mpm/dashboard/static/dist/socket-client.js +0 -2
  525. claude_mpm/dashboard/static/test-archive/test_debug.html +0 -25
  526. claude_mpm/tools/code_tree_analyzer.py +0 -1825
  527. claude_mpm-4.16.0.dist-info/METADATA +0 -453
  528. {claude_mpm-4.16.0.dist-info → claude_mpm-4.25.10.dist-info}/WHEEL +0 -0
  529. {claude_mpm-4.16.0.dist-info → claude_mpm-4.25.10.dist-info}/entry_points.txt +0 -0
  530. {claude_mpm-4.16.0.dist-info → claude_mpm-4.25.10.dist-info}/licenses/LICENSE +0 -0
  531. {claude_mpm-4.16.0.dist-info → claude_mpm-4.25.10.dist-info}/top_level.txt +0 -0
@@ -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
@@ -0,0 +1,303 @@
1
+ # Event Bus System
2
+
3
+ A decoupled, reliable event system for Claude MPM that separates event producers from consumers, enabling better testing, maintenance, and extensibility.
4
+
5
+ ## Overview
6
+
7
+ The Event Bus system provides a central hub for all events in the Claude MPM framework. Instead of components directly calling Socket.IO or other services, they publish events to the bus, which routes them to interested consumers.
8
+
9
+ ## Architecture
10
+
11
+ ```
12
+ Producers → Event Bus → Consumers
13
+ ```
14
+
15
+ ### Key Components
16
+
17
+ - **EventBus**: Central routing and queuing system
18
+ - **Event**: Standard event format with metadata
19
+ - **Producers**: Publish events without knowing consumers
20
+ - **Consumers**: Subscribe to topics and process events
21
+ - **Topics**: Hierarchical event categorization
22
+
23
+ ## Benefits
24
+
25
+ ### 1. Decoupling
26
+ - Producers don't know about consumers
27
+ - Socket.IO is just another consumer
28
+ - Easy to add/remove consumers without affecting producers
29
+
30
+ ### 2. Reliability
31
+ - Events queued when consumers unavailable
32
+ - Retry logic with exponential backoff
33
+ - Dead letter queue for failed events
34
+ - Graceful degradation
35
+
36
+ ### 3. Testability
37
+ - Test producers without Socket.IO
38
+ - Mock event bus for unit tests
39
+ - Test consumers in isolation
40
+ - Deterministic event flow
41
+
42
+ ### 4. Observability
43
+ - Central metrics collection
44
+ - Event flow monitoring
45
+ - Performance tracking
46
+ - Debug logging
47
+
48
+ ### 5. Flexibility
49
+ - Topic-based filtering
50
+ - Event transformation
51
+ - Batch processing
52
+ - Priority queuing
53
+
54
+ ## Usage
55
+
56
+ ### Basic Setup
57
+
58
+ ```python
59
+ from claude_mpm.services.events import EventBus, SocketIOConsumer, LoggingConsumer
60
+
61
+ # Create and start event bus
62
+ bus = EventBus()
63
+ await bus.start()
64
+
65
+ # Add consumers
66
+ socketio_consumer = SocketIOConsumer()
67
+ await bus.subscribe(socketio_consumer)
68
+
69
+ logging_consumer = LoggingConsumer(topics=["hook.**"])
70
+ await bus.subscribe(logging_consumer)
71
+ ```
72
+
73
+ ### Publishing Events
74
+
75
+ ```python
76
+ from claude_mpm.services.events import HookEventProducer
77
+
78
+ # Create producer
79
+ producer = HookEventProducer(bus)
80
+
81
+ # Publish events
82
+ await producer.publish_response({
83
+ "content": "Assistant response text",
84
+ "model": "claude-3",
85
+ })
86
+
87
+ await producer.publish_tool_use(
88
+ tool_name="Read",
89
+ tool_params={"file_path": "/path/to/file"},
90
+ tool_result="File contents",
91
+ )
92
+ ```
93
+
94
+ ### Creating Custom Consumers
95
+
96
+ ```python
97
+ from claude_mpm.services.events import IEventConsumer, ConsumerConfig
98
+
99
+ class CustomConsumer(IEventConsumer):
100
+ def __init__(self):
101
+ self._config = ConsumerConfig(
102
+ name="CustomConsumer",
103
+ topics=["system.**"], # Subscribe to system events
104
+ priority=ConsumerPriority.NORMAL,
105
+ )
106
+
107
+ async def consume(self, event: Event) -> bool:
108
+ # Process event
109
+ print(f"Processing: {event.topic} - {event.type}")
110
+ return True
111
+
112
+ # Implement other required methods...
113
+ ```
114
+
115
+ ## Topic Hierarchy
116
+
117
+ Events are organized in a hierarchical topic structure:
118
+
119
+ ```
120
+ hook.* # Hook system events
121
+ .response # Assistant responses
122
+ .tool # Tool usage
123
+ .subagent.* # Subagent events
124
+ .error # Hook errors
125
+
126
+ system.* # System events
127
+ .lifecycle.* # Service startup/shutdown
128
+ .health # Health status
129
+ .config # Configuration changes
130
+ .performance # Performance metrics
131
+ .error # System errors
132
+ .warning # System warnings
133
+
134
+ cli.* # CLI command events
135
+ agent.* # Agent events
136
+ build.* # Build monitoring events
137
+ ```
138
+
139
+ ### Topic Patterns
140
+
141
+ - `hook.*` - Matches `hook.response` but not `hook.tool.usage`
142
+ - `hook.**` - Matches all hook events including nested
143
+ - `**` - Matches all events
144
+
145
+ ## Event Format
146
+
147
+ ```python
148
+ @dataclass
149
+ class Event:
150
+ id: str # Unique event ID
151
+ topic: str # Event topic
152
+ type: str # Event type
153
+ timestamp: datetime # Creation time
154
+ source: str # Event source
155
+ data: Dict[str, Any] # Event payload
156
+ metadata: EventMetadata # Processing metadata
157
+ correlation_id: str # Track related events
158
+ priority: EventPriority # Processing priority
159
+ ```
160
+
161
+ ## Consumers
162
+
163
+ ### Built-in Consumers
164
+
165
+ #### SocketIOConsumer
166
+ - Emits events via Socket.IO
167
+ - Batching for efficiency
168
+ - Automatic reconnection
169
+ - Connection pooling
170
+
171
+ #### LoggingConsumer
172
+ - Logs events for debugging
173
+ - Configurable log levels
174
+ - JSON formatting
175
+ - Topic filtering
176
+
177
+ #### MetricsConsumer
178
+ - Collects event statistics
179
+ - Rate calculation
180
+ - Latency tracking
181
+ - Top event analysis
182
+
183
+ #### DeadLetterConsumer
184
+ - Stores failed events
185
+ - Event replay capability
186
+ - Retention policies
187
+ - Failure analysis
188
+
189
+ ## Producers
190
+
191
+ ### Built-in Producers
192
+
193
+ #### HookEventProducer
194
+ - Publishes hook system events
195
+ - Helper methods for common events
196
+ - Correlation tracking
197
+
198
+ #### SystemEventProducer
199
+ - Publishes system-level events
200
+ - Service lifecycle events
201
+ - Health and metrics
202
+ - Configuration changes
203
+
204
+ ## Configuration
205
+
206
+ ### EventBus Options
207
+
208
+ ```python
209
+ EventBus(
210
+ max_queue_size=10000, # Maximum queued events
211
+ process_interval=0.01, # Processing frequency
212
+ batch_timeout=0.1, # Batch wait time
213
+ enable_metrics=True, # Track metrics
214
+ enable_persistence=False, # Persist to disk
215
+ )
216
+ ```
217
+
218
+ ### Consumer Configuration
219
+
220
+ ```python
221
+ ConsumerConfig(
222
+ name="MyConsumer",
223
+ topics=["hook.**"], # Topics to subscribe
224
+ priority=ConsumerPriority.HIGH,
225
+ batch_size=10, # Process in batches
226
+ batch_timeout=0.5, # Batch wait time
227
+ max_retries=3, # Retry failed events
228
+ retry_backoff=2.0, # Backoff multiplier
229
+ filter_func=my_filter, # Event filter
230
+ transform_func=my_transform, # Event transformer
231
+ )
232
+ ```
233
+
234
+ ## Migration Guide
235
+
236
+ ### Updating Hook Handler
237
+
238
+ Before (Direct Socket.IO):
239
+ ```python
240
+ # Old: Direct Socket.IO dependency
241
+ socketio_client = socketio.Client()
242
+ socketio_client.emit("hook_event", event_data)
243
+ ```
244
+
245
+ After (Event Bus):
246
+ ```python
247
+ # New: Publish to event bus
248
+ producer = HookEventProducer(event_bus)
249
+ await producer.publish_response(response_data)
250
+ ```
251
+
252
+ ### Testing
253
+
254
+ Before:
255
+ ```python
256
+ # Hard to test - needs Socket.IO server
257
+ def test_hook_handler():
258
+ # Complex setup with Socket.IO
259
+ pass
260
+ ```
261
+
262
+ After:
263
+ ```python
264
+ # Easy to test - mock event bus
265
+ def test_hook_handler():
266
+ mock_bus = Mock()
267
+ producer = HookEventProducer(mock_bus)
268
+ await producer.publish_response(data)
269
+ mock_bus.publish.assert_called_once()
270
+ ```
271
+
272
+ ## Performance
273
+
274
+ - **Publish Latency**: <1ms average
275
+ - **Processing Throughput**: 10,000+ events/sec
276
+ - **Memory Usage**: ~100 bytes per queued event
277
+ - **CPU Overhead**: <5% for typical load
278
+
279
+ ## Best Practices
280
+
281
+ 1. **Use Topics Wisely**: Create logical topic hierarchies
282
+ 2. **Set Priorities**: Critical events should have higher priority
283
+ 3. **Handle Errors**: Consumers should handle their own errors
284
+ 4. **Monitor Metrics**: Track queue size and processing rates
285
+ 5. **Test in Isolation**: Test producers and consumers separately
286
+ 6. **Batch When Possible**: Improve efficiency with batching
287
+ 7. **Clean Shutdown**: Always call `bus.stop()` for graceful shutdown
288
+
289
+ ## Examples
290
+
291
+ See the `scripts/` directory for complete examples:
292
+ - `test_event_bus.py` - Basic event bus demonstration
293
+ - `hook_handler_with_event_bus.py` - Hook handler integration
294
+
295
+ ## Future Enhancements
296
+
297
+ - [ ] Persistent event storage
298
+ - [ ] Event replay from timestamp
299
+ - [ ] Distributed event bus (Redis/RabbitMQ backend)
300
+ - [ ] Event schema validation
301
+ - [ ] Advanced routing rules
302
+ - [ ] Event compression
303
+ - [ ] WebSocket consumer for real-time streaming
@@ -133,8 +133,7 @@ class LoggingConsumer(IEventConsumer):
133
133
  """Format an event for logging."""
134
134
  # Build base message
135
135
  message = (
136
- f"[{event.topic}] {event.type} "
137
- f"(id={event.id[:8]}, source={event.source})"
136
+ f"[{event.topic}] {event.type} (id={event.id[:8]}, source={event.source})"
138
137
  )
139
138
 
140
139
  # Add data if configured