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.
- claude_mpm/VERSION +1 -1
- claude_mpm/agents/BASE_ENGINEER.md +286 -0
- claude_mpm/agents/BASE_PM.md +272 -23
- claude_mpm/agents/OUTPUT_STYLE.md +3 -48
- claude_mpm/agents/PM_INSTRUCTIONS.md +1821 -32
- claude_mpm/agents/WORKFLOW.md +75 -2
- claude_mpm/agents/agent_loader.py +4 -4
- claude_mpm/agents/base_agent.json +6 -3
- claude_mpm/agents/frontmatter_validator.py +1 -1
- claude_mpm/agents/templates/api_qa.json +5 -2
- claude_mpm/agents/templates/circuit_breakers.md +108 -2
- claude_mpm/agents/templates/documentation.json +33 -6
- claude_mpm/agents/templates/engineer.json +5 -1
- claude_mpm/agents/templates/javascript_engineer_agent.json +380 -0
- claude_mpm/agents/templates/php-engineer.json +10 -4
- claude_mpm/agents/templates/pm_red_flags.md +89 -19
- claude_mpm/agents/templates/project_organizer.json +7 -3
- claude_mpm/agents/templates/python_engineer.json +8 -3
- claude_mpm/agents/templates/qa.json +2 -1
- claude_mpm/agents/templates/react_engineer.json +1 -0
- claude_mpm/agents/templates/research.json +82 -12
- claude_mpm/agents/templates/rust_engineer.json +12 -7
- claude_mpm/agents/templates/security.json +4 -4
- claude_mpm/agents/templates/svelte-engineer.json +225 -0
- claude_mpm/agents/templates/tauri_engineer.json +274 -0
- claude_mpm/agents/templates/ticketing.json +10 -6
- claude_mpm/agents/templates/version_control.json +4 -2
- claude_mpm/agents/templates/web_qa.json +2 -1
- claude_mpm/cli/README.md +253 -0
- claude_mpm/cli/__init__.py +11 -1
- claude_mpm/cli/commands/__init__.py +2 -0
- claude_mpm/cli/commands/aggregate.py +1 -1
- claude_mpm/cli/commands/analyze.py +3 -3
- claude_mpm/cli/commands/cleanup.py +1 -1
- claude_mpm/cli/commands/configure_agent_display.py +4 -4
- claude_mpm/cli/commands/debug.py +12 -12
- claude_mpm/cli/commands/hook_errors.py +277 -0
- claude_mpm/cli/commands/mcp_install_commands.py +1 -1
- claude_mpm/cli/commands/mcp_install_commands.py.backup +284 -0
- claude_mpm/cli/commands/mpm_init/README.md +365 -0
- claude_mpm/cli/commands/mpm_init/__init__.py +73 -0
- claude_mpm/cli/commands/mpm_init/core.py +573 -0
- claude_mpm/cli/commands/mpm_init/display.py +341 -0
- claude_mpm/cli/commands/mpm_init/git_activity.py +427 -0
- claude_mpm/cli/commands/mpm_init/modes.py +397 -0
- claude_mpm/cli/commands/mpm_init/prompts.py +442 -0
- claude_mpm/cli/commands/mpm_init_cli.py +396 -0
- claude_mpm/cli/commands/mpm_init_handler.py +67 -1
- claude_mpm/cli/commands/run.py +124 -128
- claude_mpm/cli/commands/skills.py +922 -0
- claude_mpm/cli/executor.py +58 -0
- claude_mpm/cli/interactive/agent_wizard.py +5 -5
- claude_mpm/cli/parsers/base_parser.py +35 -0
- claude_mpm/cli/parsers/mpm_init_parser.py +42 -0
- claude_mpm/cli/parsers/skills_parser.py +275 -0
- claude_mpm/cli/startup.py +168 -8
- claude_mpm/cli/startup_display.py +480 -0
- claude_mpm/cli/utils.py +1 -1
- claude_mpm/cli_module/commands.py +1 -1
- claude_mpm/cli_module/refactoring_guide.md +253 -0
- claude_mpm/commands/mpm-auto-configure.md +52 -0
- claude_mpm/commands/mpm-help.md +6 -0
- claude_mpm/commands/mpm-init.md +130 -8
- claude_mpm/commands/mpm-resume.md +372 -0
- claude_mpm/commands/mpm-tickets.md +56 -7
- claude_mpm/commands/mpm-version.md +113 -0
- claude_mpm/commands/mpm.md +2 -0
- claude_mpm/config/agent_capabilities.yaml +658 -0
- claude_mpm/config/agent_config.py +2 -2
- claude_mpm/config/async_logging_config.yaml +145 -0
- claude_mpm/constants.py +24 -0
- claude_mpm/core/.claude-mpm/logs/hooks_20250730.log +34 -0
- claude_mpm/core/api_validator.py +1 -1
- claude_mpm/core/claude_runner.py +14 -1
- claude_mpm/core/config.py +50 -0
- claude_mpm/core/constants.py +1 -1
- claude_mpm/core/factories.py +1 -1
- claude_mpm/core/framework/processors/metadata_processor.py +1 -1
- claude_mpm/core/hook_error_memory.py +381 -0
- claude_mpm/core/hook_manager.py +41 -2
- claude_mpm/core/interactive_session.py +48 -3
- claude_mpm/core/interfaces.py +56 -1
- claude_mpm/core/logger.py +3 -1
- claude_mpm/core/oneshot_session.py +39 -0
- claude_mpm/core/optimized_agent_loader.py +3 -3
- claude_mpm/d2/.gitignore +22 -0
- claude_mpm/d2/ARCHITECTURE_COMPARISON.md +273 -0
- claude_mpm/d2/FLASK_INTEGRATION.md +156 -0
- claude_mpm/d2/IMPLEMENTATION_SUMMARY.md +452 -0
- claude_mpm/d2/QUICKSTART.md +186 -0
- claude_mpm/d2/README.md +232 -0
- claude_mpm/d2/STORE_FIX_SUMMARY.md +167 -0
- claude_mpm/d2/SVELTE5_STORES_GUIDE.md +180 -0
- claude_mpm/d2/TESTING.md +288 -0
- claude_mpm/d2/index.html +118 -0
- claude_mpm/d2/package.json +19 -0
- claude_mpm/d2/src/App.svelte +110 -0
- claude_mpm/d2/src/components/Header.svelte +153 -0
- claude_mpm/d2/src/components/MainContent.svelte +74 -0
- claude_mpm/d2/src/components/Sidebar.svelte +85 -0
- claude_mpm/d2/src/components/tabs/EventsTab.svelte +326 -0
- claude_mpm/d2/src/lib/socketio.js +144 -0
- claude_mpm/d2/src/main.js +7 -0
- claude_mpm/d2/src/stores/events.js +114 -0
- claude_mpm/d2/src/stores/socket.js +108 -0
- claude_mpm/d2/src/stores/theme.js +65 -0
- claude_mpm/d2/svelte.config.js +12 -0
- claude_mpm/d2/vite.config.js +15 -0
- claude_mpm/dashboard/.claude-mpm/memories/README.md +36 -0
- claude_mpm/dashboard/BUILD_NUMBER +1 -0
- claude_mpm/dashboard/README.md +121 -0
- claude_mpm/dashboard/VERSION +1 -0
- claude_mpm/dashboard/react/components/DataInspector/DataInspector.tsx +273 -0
- claude_mpm/dashboard/react/components/ErrorBoundary.tsx +75 -0
- claude_mpm/dashboard/react/components/EventViewer/EventViewer.tsx +141 -0
- claude_mpm/dashboard/react/components/shared/ConnectionStatus.tsx +36 -0
- claude_mpm/dashboard/react/components/shared/FilterBar.tsx +89 -0
- claude_mpm/dashboard/react/contexts/DashboardContext.tsx +215 -0
- claude_mpm/dashboard/react/entries/events.tsx +165 -0
- claude_mpm/dashboard/react/hooks/useEvents.ts +191 -0
- claude_mpm/dashboard/react/hooks/useSocket.ts +225 -0
- claude_mpm/dashboard/static/built/REFACTORING_SUMMARY.md +170 -0
- claude_mpm/dashboard/static/built/components/activity-tree.js.map +1 -0
- claude_mpm/dashboard/static/built/components/agent-hierarchy.js +101 -101
- claude_mpm/dashboard/static/built/components/agent-inference.js.map +1 -0
- claude_mpm/dashboard/static/built/components/build-tracker.js +59 -59
- claude_mpm/dashboard/static/built/components/code-simple.js +107 -107
- claude_mpm/dashboard/static/built/components/code-tree/tree-breadcrumb.js +29 -29
- claude_mpm/dashboard/static/built/components/code-tree/tree-constants.js +24 -24
- claude_mpm/dashboard/static/built/components/code-tree/tree-search.js +27 -27
- claude_mpm/dashboard/static/built/components/code-tree/tree-utils.js +25 -25
- claude_mpm/dashboard/static/built/components/code-tree.js.map +1 -0
- claude_mpm/dashboard/static/built/components/code-viewer.js.map +1 -0
- claude_mpm/dashboard/static/built/components/connection-debug.js +101 -101
- claude_mpm/dashboard/static/built/components/diff-viewer.js +113 -113
- claude_mpm/dashboard/static/built/components/event-processor.js.map +1 -0
- claude_mpm/dashboard/static/built/components/event-viewer.js.map +1 -0
- claude_mpm/dashboard/static/built/components/export-manager.js.map +1 -0
- claude_mpm/dashboard/static/built/components/file-change-tracker.js +57 -57
- claude_mpm/dashboard/static/built/components/file-change-viewer.js +74 -74
- claude_mpm/dashboard/static/built/components/file-tool-tracker.js.map +1 -0
- claude_mpm/dashboard/static/built/components/file-viewer.js.map +1 -0
- claude_mpm/dashboard/static/built/components/hud-library-loader.js.map +1 -0
- claude_mpm/dashboard/static/built/components/hud-manager.js.map +1 -0
- claude_mpm/dashboard/static/built/components/hud-visualizer.js.map +1 -0
- claude_mpm/dashboard/static/built/components/module-viewer.js.map +1 -0
- claude_mpm/dashboard/static/built/components/session-manager.js.map +1 -0
- claude_mpm/dashboard/static/built/components/socket-manager.js.map +1 -0
- claude_mpm/dashboard/static/built/components/ui-state-manager.js.map +1 -0
- claude_mpm/dashboard/static/built/components/unified-data-viewer.js.map +1 -0
- claude_mpm/dashboard/static/built/components/working-directory.js.map +1 -0
- claude_mpm/dashboard/static/built/connection-manager.js +76 -76
- claude_mpm/dashboard/static/built/dashboard.js.map +1 -0
- claude_mpm/dashboard/static/built/extension-error-handler.js +22 -22
- claude_mpm/dashboard/static/built/react/events.js.map +1 -0
- claude_mpm/dashboard/static/built/shared/dom-helpers.js +9 -9
- claude_mpm/dashboard/static/built/shared/event-bus.js +5 -5
- claude_mpm/dashboard/static/built/shared/logger.js +16 -16
- claude_mpm/dashboard/static/built/shared/tooltip-service.js +6 -6
- claude_mpm/dashboard/static/built/socket-client.js.map +1 -0
- claude_mpm/dashboard/static/css/activity.css +69 -69
- claude_mpm/dashboard/static/css/connection-status.css +10 -10
- claude_mpm/dashboard/static/css/dashboard.css +15 -15
- claude_mpm/dashboard/static/index.html +22 -22
- claude_mpm/dashboard/static/js/REFACTORING_SUMMARY.md +170 -0
- claude_mpm/dashboard/static/js/components/activity-tree.js +178 -178
- claude_mpm/dashboard/static/js/components/agent-hierarchy.js +101 -101
- claude_mpm/dashboard/static/js/components/agent-inference.js +31 -31
- claude_mpm/dashboard/static/js/components/build-tracker.js +59 -59
- claude_mpm/dashboard/static/js/components/code-simple.js +107 -107
- claude_mpm/dashboard/static/js/components/connection-debug.js +101 -101
- claude_mpm/dashboard/static/js/components/diff-viewer.js +113 -113
- claude_mpm/dashboard/static/js/components/event-viewer.js +12 -12
- claude_mpm/dashboard/static/js/components/file-change-tracker.js +57 -57
- claude_mpm/dashboard/static/js/components/file-change-viewer.js +74 -74
- claude_mpm/dashboard/static/js/components/file-tool-tracker.js +6 -6
- claude_mpm/dashboard/static/js/components/file-viewer.js +42 -42
- claude_mpm/dashboard/static/js/components/module-viewer.js +27 -27
- claude_mpm/dashboard/static/js/components/session-manager.js +14 -14
- claude_mpm/dashboard/static/js/components/socket-manager.js +1 -1
- claude_mpm/dashboard/static/js/components/ui-state-manager.js +14 -14
- claude_mpm/dashboard/static/js/components/unified-data-viewer.js +110 -110
- claude_mpm/dashboard/static/js/components/working-directory.js +8 -8
- claude_mpm/dashboard/static/js/connection-manager.js +76 -76
- claude_mpm/dashboard/static/js/dashboard.js +76 -58
- claude_mpm/dashboard/static/js/extension-error-handler.js +22 -22
- claude_mpm/dashboard/static/js/shared/dom-helpers.js +9 -9
- claude_mpm/dashboard/static/js/shared/event-bus.js +5 -5
- claude_mpm/dashboard/static/js/shared/logger.js +16 -16
- claude_mpm/dashboard/static/js/shared/tooltip-service.js +6 -6
- claude_mpm/dashboard/static/js/socket-client.js +138 -121
- claude_mpm/dashboard/static/navigation-test-results.md +118 -0
- claude_mpm/dashboard/static/production/main.html +21 -21
- claude_mpm/dashboard/static/test-archive/dashboard.html +22 -22
- claude_mpm/dashboard/templates/.claude-mpm/memories/README.md +36 -0
- claude_mpm/dashboard/templates/.claude-mpm/memories/engineer_agent.md +39 -0
- claude_mpm/dashboard/templates/.claude-mpm/memories/version_control_agent.md +38 -0
- claude_mpm/dashboard/templates/code_simple.html +23 -23
- claude_mpm/dashboard/templates/index.html +18 -18
- claude_mpm/hooks/README.md +143 -0
- claude_mpm/hooks/__init__.py +8 -0
- claude_mpm/hooks/claude_hooks/event_handlers.py +3 -1
- claude_mpm/hooks/claude_hooks/hook_handler.py +24 -7
- claude_mpm/hooks/claude_hooks/installer.py +45 -0
- claude_mpm/hooks/claude_hooks/response_tracking.py +35 -1
- claude_mpm/hooks/session_resume_hook.py +121 -0
- claude_mpm/hooks/templates/README.md +180 -0
- claude_mpm/hooks/templates/pre_tool_use_simple.py +78 -0
- claude_mpm/hooks/templates/pre_tool_use_template.py +323 -0
- claude_mpm/hooks/templates/settings.json.example +147 -0
- claude_mpm/models/resume_log.py +340 -0
- claude_mpm/schemas/agent_schema.json +596 -0
- claude_mpm/schemas/frontmatter_schema.json +165 -0
- claude_mpm/scripts/claude-hook-handler.sh +3 -3
- claude_mpm/scripts/start_activity_logging.py +3 -1
- claude_mpm/services/agents/auto_config_manager.py +1 -1
- claude_mpm/services/agents/deployment/agent_configuration_manager.py +1 -1
- claude_mpm/services/agents/deployment/agent_format_converter.py +1 -1
- claude_mpm/services/agents/deployment/agent_metrics_collector.py +3 -3
- claude_mpm/services/agents/deployment/agent_record_service.py +1 -1
- claude_mpm/services/agents/deployment/agent_validator.py +17 -1
- claude_mpm/services/agents/deployment/async_agent_deployment.py +1 -1
- claude_mpm/services/agents/deployment/facade/deployment_facade.py +3 -3
- claude_mpm/services/agents/deployment/local_template_deployment.py +1 -1
- claude_mpm/services/agents/deployment/pipeline/pipeline_executor.py +2 -2
- claude_mpm/services/agents/loading/framework_agent_loader.py +8 -8
- claude_mpm/services/agents/local_template_manager.py +4 -2
- claude_mpm/services/agents/recommender.py +47 -0
- claude_mpm/services/cli/resume_service.py +617 -0
- claude_mpm/services/cli/session_manager.py +87 -0
- claude_mpm/services/cli/session_pause_manager.py +504 -0
- claude_mpm/services/cli/session_resume_helper.py +372 -0
- claude_mpm/services/cli/unified_dashboard_manager.py +1 -1
- claude_mpm/services/core/base.py +26 -11
- claude_mpm/services/core/interfaces.py +56 -1
- claude_mpm/services/core/models/agent_config.py +3 -0
- claude_mpm/services/core/models/process.py +4 -0
- claude_mpm/services/core/path_resolver.py +1 -1
- claude_mpm/services/diagnostics/checks/agent_check.py +0 -2
- claude_mpm/services/diagnostics/checks/instructions_check.py +1 -2
- claude_mpm/services/diagnostics/checks/mcp_check.py +0 -1
- claude_mpm/services/diagnostics/checks/monitor_check.py +0 -1
- claude_mpm/services/diagnostics/doctor_reporter.py +6 -4
- claude_mpm/services/diagnostics/models.py +21 -0
- claude_mpm/services/event_bus/README.md +244 -0
- claude_mpm/services/event_bus/direct_relay.py +3 -3
- claude_mpm/services/event_bus/event_bus.py +36 -3
- claude_mpm/services/event_bus/relay.py +23 -7
- claude_mpm/services/events/README.md +303 -0
- claude_mpm/services/events/consumers/logging.py +1 -2
- claude_mpm/services/framework_claude_md_generator/README.md +119 -0
- claude_mpm/services/infrastructure/monitoring/resources.py +1 -1
- claude_mpm/services/infrastructure/resume_log_generator.py +439 -0
- claude_mpm/services/local_ops/__init__.py +2 -0
- claude_mpm/services/local_ops/process_manager.py +1 -1
- claude_mpm/services/local_ops/resource_monitor.py +2 -2
- claude_mpm/services/mcp_config_manager.py +7 -131
- claude_mpm/services/mcp_gateway/README.md +185 -0
- claude_mpm/services/mcp_gateway/auto_configure.py +31 -25
- claude_mpm/services/mcp_gateway/config/configuration.py +1 -1
- claude_mpm/services/mcp_gateway/core/process_pool.py +19 -10
- claude_mpm/services/mcp_gateway/server/stdio_server.py +0 -2
- claude_mpm/services/mcp_gateway/tools/document_summarizer.py +1 -1
- claude_mpm/services/mcp_gateway/tools/external_mcp_services.py +26 -21
- claude_mpm/services/mcp_gateway/tools/kuzu_memory_service.py +6 -2
- claude_mpm/services/memory/failure_tracker.py +19 -4
- claude_mpm/services/memory/optimizer.py +1 -1
- claude_mpm/services/model/model_router.py +8 -9
- claude_mpm/services/monitor/daemon.py +1 -1
- claude_mpm/services/monitor/server.py +2 -2
- claude_mpm/services/native_agent_converter.py +356 -0
- claude_mpm/services/port_manager.py +1 -1
- claude_mpm/services/project/documentation_manager.py +2 -1
- claude_mpm/services/project/toolchain_analyzer.py +3 -1
- claude_mpm/services/runner_configuration_service.py +1 -0
- claude_mpm/services/self_upgrade_service.py +165 -7
- claude_mpm/services/session_manager.py +205 -1
- claude_mpm/services/skills_config.py +547 -0
- claude_mpm/services/skills_deployer.py +955 -0
- claude_mpm/services/socketio/handlers/connection.py +1 -1
- claude_mpm/services/socketio/handlers/connection.py.backup +217 -0
- claude_mpm/services/socketio/handlers/git.py +2 -2
- claude_mpm/services/socketio/handlers/hook.py.backup +154 -0
- claude_mpm/services/static/.gitkeep +2 -0
- claude_mpm/services/system_instructions_service.py +1 -3
- claude_mpm/services/unified/analyzer_strategies/performance_analyzer.py +0 -3
- claude_mpm/services/unified/analyzer_strategies/security_analyzer.py +0 -1
- claude_mpm/services/unified/deployment_strategies/cloud_strategies.py +1 -1
- claude_mpm/services/unified/deployment_strategies/local.py +1 -1
- claude_mpm/services/version_control/VERSION +1 -0
- claude_mpm/services/version_control/conflict_resolution.py +6 -4
- claude_mpm/services/version_service.py +104 -1
- claude_mpm/services/visualization/mermaid_generator.py +2 -3
- claude_mpm/skills/__init__.py +21 -0
- claude_mpm/skills/agent_skills_injector.py +324 -0
- claude_mpm/skills/bundled/.gitkeep +2 -0
- claude_mpm/skills/bundled/LICENSE_ATTRIBUTIONS.md +79 -0
- claude_mpm/skills/bundled/api-documentation.md +393 -0
- claude_mpm/skills/bundled/async-testing.md +571 -0
- claude_mpm/skills/bundled/code-review.md +143 -0
- claude_mpm/skills/bundled/collaboration/brainstorming/SKILL.md +79 -0
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/SKILL.md +178 -0
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/agent-prompts.md +577 -0
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/coordination-patterns.md +467 -0
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/examples.md +537 -0
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/troubleshooting.md +730 -0
- claude_mpm/skills/bundled/collaboration/git-worktrees.md +317 -0
- claude_mpm/skills/bundled/collaboration/requesting-code-review/SKILL.md +112 -0
- claude_mpm/skills/bundled/collaboration/requesting-code-review/references/code-reviewer-template.md +146 -0
- claude_mpm/skills/bundled/collaboration/requesting-code-review/references/review-examples.md +412 -0
- claude_mpm/skills/bundled/collaboration/stacked-prs.md +251 -0
- claude_mpm/skills/bundled/collaboration/writing-plans/SKILL.md +81 -0
- claude_mpm/skills/bundled/collaboration/writing-plans/references/best-practices.md +362 -0
- claude_mpm/skills/bundled/collaboration/writing-plans/references/plan-structure-templates.md +312 -0
- claude_mpm/skills/bundled/database-migration.md +199 -0
- claude_mpm/skills/bundled/debugging/root-cause-tracing/SKILL.md +152 -0
- claude_mpm/skills/bundled/debugging/root-cause-tracing/find-polluter.sh +63 -0
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/advanced-techniques.md +668 -0
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/examples.md +587 -0
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/integration.md +438 -0
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/tracing-techniques.md +391 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/CREATION-LOG.md +119 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/SKILL.md +148 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/anti-patterns.md +483 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/examples.md +452 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/troubleshooting.md +449 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/workflow.md +411 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-academic.md +14 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-1.md +58 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-2.md +68 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-3.md +69 -0
- claude_mpm/skills/bundled/debugging/verification-before-completion/SKILL.md +131 -0
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/gate-function.md +325 -0
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/integration-and-workflows.md +490 -0
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/red-flags-and-failures.md +425 -0
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/verification-patterns.md +499 -0
- claude_mpm/skills/bundled/docker-containerization.md +194 -0
- claude_mpm/skills/bundled/express-local-dev.md +1429 -0
- claude_mpm/skills/bundled/fastapi-local-dev.md +1199 -0
- claude_mpm/skills/bundled/git-workflow.md +414 -0
- claude_mpm/skills/bundled/imagemagick.md +204 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/INTEGRATION.md +611 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/README.md +596 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/SKILL.md +260 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/examples/nextjs-env-structure.md +315 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/references/frameworks.md +436 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/references/security.md +433 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/references/synchronization.md +452 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/references/troubleshooting.md +404 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/references/validation.md +420 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/scripts/validate_env.py +576 -0
- claude_mpm/skills/bundled/json-data-handling.md +223 -0
- claude_mpm/skills/bundled/main/artifacts-builder/LICENSE.txt +202 -0
- claude_mpm/skills/bundled/main/artifacts-builder/SKILL.md +86 -0
- claude_mpm/skills/bundled/main/artifacts-builder/scripts/bundle-artifact.sh +54 -0
- claude_mpm/skills/bundled/main/artifacts-builder/scripts/init-artifact.sh +322 -0
- claude_mpm/skills/bundled/main/artifacts-builder/scripts/shadcn-components.tar.gz +0 -0
- claude_mpm/skills/bundled/main/internal-comms/LICENSE.txt +202 -0
- claude_mpm/skills/bundled/main/internal-comms/SKILL.md +43 -0
- claude_mpm/skills/bundled/main/internal-comms/examples/3p-updates.md +47 -0
- claude_mpm/skills/bundled/main/internal-comms/examples/company-newsletter.md +65 -0
- claude_mpm/skills/bundled/main/internal-comms/examples/faq-answers.md +30 -0
- claude_mpm/skills/bundled/main/internal-comms/examples/general-comms.md +16 -0
- claude_mpm/skills/bundled/main/mcp-builder/LICENSE.txt +202 -0
- claude_mpm/skills/bundled/main/mcp-builder/SKILL.md +160 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/design_principles.md +412 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/evaluation.md +602 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/mcp_best_practices.md +915 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/node_mcp_server.md +916 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/python_mcp_server.md +752 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/workflow.md +1237 -0
- claude_mpm/skills/bundled/main/mcp-builder/scripts/connections.py +157 -0
- claude_mpm/skills/bundled/main/mcp-builder/scripts/evaluation.py +425 -0
- claude_mpm/skills/bundled/main/mcp-builder/scripts/example_evaluation.xml +22 -0
- claude_mpm/skills/bundled/main/mcp-builder/scripts/requirements.txt +2 -0
- claude_mpm/skills/bundled/main/skill-creator/LICENSE.txt +202 -0
- claude_mpm/skills/bundled/main/skill-creator/SKILL.md +189 -0
- claude_mpm/skills/bundled/main/skill-creator/references/best-practices.md +500 -0
- claude_mpm/skills/bundled/main/skill-creator/references/creation-workflow.md +464 -0
- claude_mpm/skills/bundled/main/skill-creator/references/examples.md +619 -0
- claude_mpm/skills/bundled/main/skill-creator/references/progressive-disclosure.md +437 -0
- claude_mpm/skills/bundled/main/skill-creator/references/skill-structure.md +231 -0
- claude_mpm/skills/bundled/main/skill-creator/scripts/init_skill.py +303 -0
- claude_mpm/skills/bundled/main/skill-creator/scripts/package_skill.py +113 -0
- claude_mpm/skills/bundled/main/skill-creator/scripts/quick_validate.py +72 -0
- claude_mpm/skills/bundled/nextjs-local-dev.md +807 -0
- claude_mpm/skills/bundled/pdf.md +141 -0
- claude_mpm/skills/bundled/performance-profiling.md +573 -0
- claude_mpm/skills/bundled/php/espocrm-development/SKILL.md +170 -0
- claude_mpm/skills/bundled/php/espocrm-development/references/architecture.md +602 -0
- claude_mpm/skills/bundled/php/espocrm-development/references/common-tasks.md +821 -0
- claude_mpm/skills/bundled/php/espocrm-development/references/development-workflow.md +742 -0
- claude_mpm/skills/bundled/php/espocrm-development/references/frontend-customization.md +726 -0
- claude_mpm/skills/bundled/php/espocrm-development/references/hooks-and-services.md +764 -0
- claude_mpm/skills/bundled/php/espocrm-development/references/testing-debugging.md +831 -0
- claude_mpm/skills/bundled/react/flexlayout-react.md +742 -0
- claude_mpm/skills/bundled/refactoring-patterns.md +180 -0
- claude_mpm/skills/bundled/rust/desktop-applications/SKILL.md +226 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/architecture-patterns.md +901 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/native-gui-frameworks.md +901 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/platform-integration.md +775 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/state-management.md +937 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/tauri-framework.md +770 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/testing-deployment.md +961 -0
- claude_mpm/skills/bundled/security-scanning.md +327 -0
- claude_mpm/skills/bundled/systematic-debugging.md +473 -0
- claude_mpm/skills/bundled/tauri/tauri-async-patterns.md +495 -0
- claude_mpm/skills/bundled/tauri/tauri-build-deploy.md +599 -0
- claude_mpm/skills/bundled/tauri/tauri-command-patterns.md +535 -0
- claude_mpm/skills/bundled/tauri/tauri-error-handling.md +613 -0
- claude_mpm/skills/bundled/tauri/tauri-event-system.md +648 -0
- claude_mpm/skills/bundled/tauri/tauri-file-system.md +673 -0
- claude_mpm/skills/bundled/tauri/tauri-frontend-integration.md +767 -0
- claude_mpm/skills/bundled/tauri/tauri-performance.md +669 -0
- claude_mpm/skills/bundled/tauri/tauri-state-management.md +573 -0
- claude_mpm/skills/bundled/tauri/tauri-testing.md +384 -0
- claude_mpm/skills/bundled/tauri/tauri-window-management.md +628 -0
- claude_mpm/skills/bundled/test-driven-development.md +378 -0
- claude_mpm/skills/bundled/testing/condition-based-waiting/SKILL.md +119 -0
- claude_mpm/skills/bundled/testing/condition-based-waiting/example.ts +158 -0
- claude_mpm/skills/bundled/testing/condition-based-waiting/references/patterns-and-implementation.md +253 -0
- claude_mpm/skills/bundled/testing/test-driven-development/SKILL.md +145 -0
- claude_mpm/skills/bundled/testing/test-driven-development/references/anti-patterns.md +543 -0
- claude_mpm/skills/bundled/testing/test-driven-development/references/examples.md +741 -0
- claude_mpm/skills/bundled/testing/test-driven-development/references/integration.md +470 -0
- claude_mpm/skills/bundled/testing/test-driven-development/references/philosophy.md +458 -0
- claude_mpm/skills/bundled/testing/test-driven-development/references/workflow.md +639 -0
- claude_mpm/skills/bundled/testing/test-quality-inspector/SKILL.md +458 -0
- claude_mpm/skills/bundled/testing/test-quality-inspector/examples/example-inspection-report.md +411 -0
- claude_mpm/skills/bundled/testing/test-quality-inspector/references/assertion-quality.md +317 -0
- claude_mpm/skills/bundled/testing/test-quality-inspector/references/inspection-checklist.md +270 -0
- claude_mpm/skills/bundled/testing/test-quality-inspector/references/red-flags.md +436 -0
- claude_mpm/skills/bundled/testing/testing-anti-patterns/SKILL.md +140 -0
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/completeness-anti-patterns.md +572 -0
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/core-anti-patterns.md +411 -0
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/detection-guide.md +569 -0
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/tdd-connection.md +695 -0
- claude_mpm/skills/bundled/testing/webapp-testing/LICENSE.txt +202 -0
- claude_mpm/skills/bundled/testing/webapp-testing/SKILL.md +184 -0
- claude_mpm/skills/bundled/testing/webapp-testing/decision-tree.md +459 -0
- claude_mpm/skills/bundled/testing/webapp-testing/examples/console_logging.py +35 -0
- claude_mpm/skills/bundled/testing/webapp-testing/examples/element_discovery.py +44 -0
- claude_mpm/skills/bundled/testing/webapp-testing/examples/static_html_automation.py +34 -0
- claude_mpm/skills/bundled/testing/webapp-testing/playwright-patterns.md +479 -0
- claude_mpm/skills/bundled/testing/webapp-testing/reconnaissance-pattern.md +687 -0
- claude_mpm/skills/bundled/testing/webapp-testing/scripts/with_server.py +129 -0
- claude_mpm/skills/bundled/testing/webapp-testing/server-management.md +758 -0
- claude_mpm/skills/bundled/testing/webapp-testing/troubleshooting.md +868 -0
- claude_mpm/skills/bundled/vite-local-dev.md +1061 -0
- claude_mpm/skills/bundled/web-performance-optimization.md +2305 -0
- claude_mpm/skills/bundled/xlsx.md +157 -0
- claude_mpm/skills/registry.py +97 -9
- claude_mpm/skills/skills_registry.py +347 -0
- claude_mpm/skills/skills_service.py +739 -0
- claude_mpm/templates/questions/EXAMPLES.md +501 -0
- claude_mpm/templates/questions/__init__.py +43 -0
- claude_mpm/templates/questions/base.py +193 -0
- claude_mpm/templates/questions/pr_strategy.py +314 -0
- claude_mpm/templates/questions/project_init.py +388 -0
- claude_mpm/templates/questions/ticket_mgmt.py +397 -0
- claude_mpm/tools/README_SOCKETIO_DEBUG.md +224 -0
- claude_mpm/tools/__main__.py +8 -8
- claude_mpm/tools/code_tree_analyzer/README.md +64 -0
- claude_mpm/tools/code_tree_analyzer/__init__.py +45 -0
- claude_mpm/tools/code_tree_analyzer/analysis.py +299 -0
- claude_mpm/tools/code_tree_analyzer/cache.py +131 -0
- claude_mpm/tools/code_tree_analyzer/core.py +380 -0
- claude_mpm/tools/code_tree_analyzer/discovery.py +403 -0
- claude_mpm/tools/code_tree_analyzer/events.py +168 -0
- claude_mpm/tools/code_tree_analyzer/gitignore.py +308 -0
- claude_mpm/tools/code_tree_analyzer/models.py +39 -0
- claude_mpm/tools/code_tree_analyzer/multilang_analyzer.py +224 -0
- claude_mpm/tools/code_tree_analyzer/python_analyzer.py +284 -0
- claude_mpm/utils/agent_dependency_loader.py +5 -5
- claude_mpm/utils/dependency_cache.py +3 -1
- claude_mpm/utils/gitignore.py +241 -0
- claude_mpm/utils/log_cleanup.py +3 -3
- claude_mpm/utils/robust_installer.py +3 -5
- claude_mpm/utils/structured_questions.py +619 -0
- claude_mpm-4.25.10.dist-info/METADATA +789 -0
- {claude_mpm-4.16.0.dist-info → claude_mpm-4.25.10.dist-info}/RECORD +485 -240
- claude_mpm/agents/INSTRUCTIONS_OLD_DEPRECATED.md +0 -602
- claude_mpm/agents/templates/.claude-mpm/memories/README.md +0 -17
- claude_mpm/agents/templates/.claude-mpm/memories/engineer_memories.md +0 -3
- claude_mpm/agents/templates/logs/prompts/agent_engineer_20250826_014258_728.md +0 -39
- claude_mpm/agents/templates/logs/prompts/agent_engineer_20250901_010124_142.md +0 -400
- claude_mpm/cli/commands/mpm_init.py +0 -2008
- claude_mpm/dashboard/.claude-mpm/socketio-instances.json +0 -1
- claude_mpm/dashboard/static/archive/activity_dashboard_test.html +0 -61
- claude_mpm/dashboard/static/archive/test_activity_connection.html +0 -179
- claude_mpm/dashboard/static/archive/test_claude_tree_tab.html +0 -68
- claude_mpm/dashboard/static/archive/test_dashboard.html +0 -409
- claude_mpm/dashboard/static/archive/test_dashboard_fixed.html +0 -519
- claude_mpm/dashboard/static/archive/test_dashboard_verification.html +0 -181
- claude_mpm/dashboard/static/archive/test_file_data.html +0 -315
- claude_mpm/dashboard/static/archive/test_file_tree_empty_state.html +0 -243
- claude_mpm/dashboard/static/archive/test_file_tree_fix.html +0 -234
- claude_mpm/dashboard/static/archive/test_file_tree_rename.html +0 -117
- claude_mpm/dashboard/static/archive/test_file_tree_tab.html +0 -115
- claude_mpm/dashboard/static/archive/test_file_viewer.html +0 -224
- claude_mpm/dashboard/static/archive/test_final_activity.html +0 -220
- claude_mpm/dashboard/static/archive/test_tab_fix.html +0 -139
- claude_mpm/dashboard/static/dist/assets/events.DjpNxWNo.css +0 -1
- claude_mpm/dashboard/static/dist/components/activity-tree.js +0 -2
- claude_mpm/dashboard/static/dist/components/agent-inference.js +0 -2
- claude_mpm/dashboard/static/dist/components/code-tree.js +0 -2
- claude_mpm/dashboard/static/dist/components/code-viewer.js +0 -2
- claude_mpm/dashboard/static/dist/components/event-processor.js +0 -2
- claude_mpm/dashboard/static/dist/components/event-viewer.js +0 -2
- claude_mpm/dashboard/static/dist/components/export-manager.js +0 -2
- claude_mpm/dashboard/static/dist/components/file-tool-tracker.js +0 -2
- claude_mpm/dashboard/static/dist/components/file-viewer.js +0 -2
- claude_mpm/dashboard/static/dist/components/hud-library-loader.js +0 -2
- claude_mpm/dashboard/static/dist/components/hud-manager.js +0 -2
- claude_mpm/dashboard/static/dist/components/hud-visualizer.js +0 -2
- claude_mpm/dashboard/static/dist/components/module-viewer.js +0 -2
- claude_mpm/dashboard/static/dist/components/session-manager.js +0 -2
- claude_mpm/dashboard/static/dist/components/socket-manager.js +0 -2
- claude_mpm/dashboard/static/dist/components/ui-state-manager.js +0 -2
- claude_mpm/dashboard/static/dist/components/unified-data-viewer.js +0 -2
- claude_mpm/dashboard/static/dist/components/working-directory.js +0 -2
- claude_mpm/dashboard/static/dist/dashboard.js +0 -2
- claude_mpm/dashboard/static/dist/react/events.js +0 -30
- claude_mpm/dashboard/static/dist/socket-client.js +0 -2
- claude_mpm/dashboard/static/test-archive/test_debug.html +0 -25
- claude_mpm/tools/code_tree_analyzer.py +0 -1825
- claude_mpm-4.16.0.dist-info/METADATA +0 -453
- {claude_mpm-4.16.0.dist-info → claude_mpm-4.25.10.dist-info}/WHEEL +0 -0
- {claude_mpm-4.16.0.dist-info → claude_mpm-4.25.10.dist-info}/entry_points.txt +0 -0
- {claude_mpm-4.16.0.dist-info → claude_mpm-4.25.10.dist-info}/licenses/LICENSE +0 -0
- {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
|
-
|
|
261
|
-
|
|
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
|
-
#
|
|
270
|
-
|
|
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
|
-
|
|
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
|
-
|
|
287
|
-
|
|
288
|
-
|
|
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
|
-
|
|
309
|
-
_relay_instance
|
|
310
|
-
|
|
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
|