claude-mpm 4.20.3__py3-none-any.whl → 4.25.10__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of claude-mpm might be problematic. Click here for more details.
- claude_mpm/VERSION +1 -1
- claude_mpm/agents/BASE_PM.md +23 -6
- claude_mpm/agents/OUTPUT_STYLE.md +3 -48
- claude_mpm/agents/PM_INSTRUCTIONS.md +1783 -34
- claude_mpm/agents/WORKFLOW.md +75 -2
- 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/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/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/security.json +4 -4
- 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/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 +522 -34
- claude_mpm/cli/executor.py +56 -0
- claude_mpm/cli/interactive/agent_wizard.py +5 -5
- claude_mpm/cli/parsers/base_parser.py +28 -0
- claude_mpm/cli/parsers/mpm_init_parser.py +42 -0
- claude_mpm/cli/parsers/skills_parser.py +138 -0
- claude_mpm/cli/startup.py +111 -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-help.md +3 -0
- claude_mpm/commands/mpm-init.md +19 -3
- claude_mpm/commands/mpm-resume.md +372 -0
- claude_mpm/commands/mpm-tickets.md +56 -7
- claude_mpm/commands/mpm.md +1 -0
- claude_mpm/config/agent_capabilities.yaml +658 -0
- claude_mpm/config/async_logging_config.yaml +145 -0
- claude_mpm/constants.py +12 -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 +8 -0
- claude_mpm/core/constants.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/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/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/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/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/deployment/agent_format_converter.py +1 -1
- claude_mpm/services/agents/deployment/agent_metrics_collector.py +3 -3
- claude_mpm/services/agents/deployment/facade/deployment_facade.py +3 -3
- 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 +3 -1
- claude_mpm/services/cli/session_pause_manager.py +504 -0
- claude_mpm/services/cli/session_resume_helper.py +36 -16
- 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/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/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_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/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/version_control/VERSION +1 -0
- claude_mpm/services/version_control/conflict_resolution.py +6 -4
- claude_mpm/services/visualization/mermaid_generator.py +2 -3
- claude_mpm/skills/__init__.py +3 -3
- claude_mpm/skills/agent_skills_injector.py +42 -49
- claude_mpm/skills/bundled/.gitkeep +2 -0
- claude_mpm/skills/bundled/collaboration/brainstorming/SKILL.md +4 -0
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/SKILL.md +108 -114
- 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 +46 -41
- 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 +36 -73
- 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/debugging/root-cause-tracing/SKILL.md +100 -125
- 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/verification-before-completion/SKILL.md +28 -72
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/gate-function.md +11 -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 +272 -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/main/artifacts-builder/LICENSE.txt +202 -0
- claude_mpm/skills/bundled/main/artifacts-builder/SKILL.md +13 -1
- 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 +11 -0
- claude_mpm/skills/bundled/main/mcp-builder/LICENSE.txt +202 -0
- claude_mpm/skills/bundled/main/mcp-builder/SKILL.md +109 -277
- claude_mpm/skills/bundled/main/mcp-builder/reference/design_principles.md +412 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/workflow.md +1237 -0
- claude_mpm/skills/bundled/main/mcp-builder/scripts/connections.py +17 -10
- claude_mpm/skills/bundled/main/mcp-builder/scripts/evaluation.py +92 -39
- 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 +135 -155
- 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 +13 -12
- claude_mpm/skills/bundled/main/skill-creator/scripts/package_skill.py +5 -3
- claude_mpm/skills/bundled/main/skill-creator/scripts/quick_validate.py +19 -12
- claude_mpm/skills/bundled/performance-profiling.md +6 -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/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/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/testing/condition-based-waiting/SKILL.md +21 -25
- 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-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 +86 -250
- 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 +145 -57
- claude_mpm/skills/bundled/testing/webapp-testing/decision-tree.md +459 -0
- claude_mpm/skills/bundled/testing/webapp-testing/examples/console_logging.py +6 -6
- claude_mpm/skills/bundled/testing/webapp-testing/examples/element_discovery.py +13 -9
- claude_mpm/skills/bundled/testing/webapp-testing/examples/static_html_automation.py +8 -8
- 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 +37 -15
- 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/skills_registry.py +44 -48
- claude_mpm/skills/skills_service.py +117 -108
- 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 +3 -3
- 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.20.3.dist-info → claude_mpm-4.25.10.dist-info}/METADATA +218 -31
- {claude_mpm-4.20.3.dist-info → claude_mpm-4.25.10.dist-info}/RECORD +409 -246
- 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 -2093
- 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/skills/bundled/debugging/verification-before-completion/references/common-failures.md +0 -213
- claude_mpm/tools/code_tree_analyzer.py +0 -1825
- /claude_mpm/skills/bundled/collaboration/requesting-code-review/{code-reviewer.md → references/code-reviewer-template.md} +0 -0
- {claude_mpm-4.20.3.dist-info → claude_mpm-4.25.10.dist-info}/WHEEL +0 -0
- {claude_mpm-4.20.3.dist-info → claude_mpm-4.25.10.dist-info}/entry_points.txt +0 -0
- {claude_mpm-4.20.3.dist-info → claude_mpm-4.25.10.dist-info}/licenses/LICENSE +0 -0
- {claude_mpm-4.20.3.dist-info → claude_mpm-4.25.10.dist-info}/top_level.txt +0 -0
|
@@ -20,7 +20,62 @@ focused modules for better maintainability and testing.
|
|
|
20
20
|
"""
|
|
21
21
|
|
|
22
22
|
# Re-export everything from the new modular structure for backward compatibility
|
|
23
|
-
from .interfaces import
|
|
23
|
+
from .interfaces import ( # noqa: F401
|
|
24
|
+
AgentCapabilitiesInterface,
|
|
25
|
+
AgentDeploymentInterface,
|
|
26
|
+
AgentMetadata,
|
|
27
|
+
CacheEntry,
|
|
28
|
+
CommandHandlerInterface,
|
|
29
|
+
HealthStatus,
|
|
30
|
+
HookServiceInterface,
|
|
31
|
+
IAgentRecommender,
|
|
32
|
+
IAgentRegistry,
|
|
33
|
+
IAutoConfigManager,
|
|
34
|
+
ICacheService,
|
|
35
|
+
IConfigurationManager,
|
|
36
|
+
IConfigurationService,
|
|
37
|
+
ICrashDetector,
|
|
38
|
+
IDeploymentStateManager,
|
|
39
|
+
IErrorHandler,
|
|
40
|
+
IEventBus,
|
|
41
|
+
IHealthCheck,
|
|
42
|
+
IHealthCheckManager,
|
|
43
|
+
IHealthMonitor,
|
|
44
|
+
ILocalProcessManager,
|
|
45
|
+
ILogMonitor,
|
|
46
|
+
IMemoryLeakDetector,
|
|
47
|
+
IModelProvider,
|
|
48
|
+
IModelRouter,
|
|
49
|
+
InterfaceRegistry,
|
|
50
|
+
IPerformanceMonitor,
|
|
51
|
+
IPromptCache,
|
|
52
|
+
IResourceMonitor,
|
|
53
|
+
IRestartManager,
|
|
54
|
+
IRestartPolicy,
|
|
55
|
+
IServiceContainer,
|
|
56
|
+
IServiceFactory,
|
|
57
|
+
IServiceLifecycle,
|
|
58
|
+
IStructuredLogger,
|
|
59
|
+
ITemplateManager,
|
|
60
|
+
IToolchainAnalyzer,
|
|
61
|
+
MemoryHookInterface,
|
|
62
|
+
MemoryServiceInterface,
|
|
63
|
+
ModelCapability,
|
|
64
|
+
ModelProvider,
|
|
65
|
+
ModelResponse,
|
|
66
|
+
ProjectAnalyzerInterface,
|
|
67
|
+
RunnerConfigurationInterface,
|
|
68
|
+
ServiceType,
|
|
69
|
+
SessionManagementInterface,
|
|
70
|
+
SocketIOServiceInterface,
|
|
71
|
+
SubprocessLauncherInterface,
|
|
72
|
+
SystemInstructionsInterface,
|
|
73
|
+
T,
|
|
74
|
+
TemplateRenderContext,
|
|
75
|
+
TicketManagerInterface,
|
|
76
|
+
UtilityServiceInterface,
|
|
77
|
+
VersionServiceInterface,
|
|
78
|
+
)
|
|
24
79
|
|
|
25
80
|
# All interface definitions have been moved to the interfaces/ package
|
|
26
81
|
# This file now serves as a compatibility layer that delegates to the modular structure
|
|
@@ -19,6 +19,9 @@ from typing import Any, Dict, List, Optional
|
|
|
19
19
|
|
|
20
20
|
from ....core.enums import OperationResult, ValidationSeverity
|
|
21
21
|
|
|
22
|
+
# Backward compatibility alias (consolidated in Phase 3A Batch 25)
|
|
23
|
+
ConfigurationStatus = OperationResult
|
|
24
|
+
|
|
22
25
|
|
|
23
26
|
class AgentSpecialization(str, Enum):
|
|
24
27
|
"""Agent specialization categories.
|
|
@@ -25,6 +25,9 @@ from typing import Any, Dict, List, Optional
|
|
|
25
25
|
|
|
26
26
|
from claude_mpm.core.enums import ServiceState
|
|
27
27
|
|
|
28
|
+
# Backward compatibility alias (consolidated in Phase 3A Batch 24)
|
|
29
|
+
ProcessStatus = ServiceState
|
|
30
|
+
|
|
28
31
|
|
|
29
32
|
@dataclass
|
|
30
33
|
class DeploymentState:
|
|
@@ -230,6 +233,7 @@ __all__ = [
|
|
|
230
233
|
"PROTECTED_PORT_RANGES",
|
|
231
234
|
"DeploymentState",
|
|
232
235
|
"ProcessInfo",
|
|
236
|
+
"ProcessStatus", # Backward compatibility alias for ServiceState
|
|
233
237
|
"StartConfig",
|
|
234
238
|
"is_port_protected",
|
|
235
239
|
]
|
|
@@ -188,7 +188,6 @@ class AgentCheck(BaseDiagnosticCheck):
|
|
|
188
188
|
def _check_agent_versions(self) -> DiagnosticResult:
|
|
189
189
|
"""Check if deployed agents are up-to-date."""
|
|
190
190
|
try:
|
|
191
|
-
|
|
192
191
|
from ....services.agents.deployment.agent_version_manager import (
|
|
193
192
|
AgentVersionManager,
|
|
194
193
|
)
|
|
@@ -258,7 +257,6 @@ class AgentCheck(BaseDiagnosticCheck):
|
|
|
258
257
|
def _validate_agents(self) -> DiagnosticResult:
|
|
259
258
|
"""Validate agent configurations."""
|
|
260
259
|
try:
|
|
261
|
-
|
|
262
260
|
from ....services.agents.deployment.agent_validator import AgentValidator
|
|
263
261
|
|
|
264
262
|
AgentValidator()
|
|
@@ -220,8 +220,7 @@ class InstructionsCheck(BaseDiagnosticCheck):
|
|
|
220
220
|
files_str = ", ".join(str(path) for path, _ in occurrences)
|
|
221
221
|
snippet = occurrences[0][1]
|
|
222
222
|
duplicates.append(
|
|
223
|
-
f"Duplicate content found in: {files_str}\n"
|
|
224
|
-
f" Snippet: {snippet}..."
|
|
223
|
+
f"Duplicate content found in: {files_str}\n Snippet: {snippet}..."
|
|
225
224
|
)
|
|
226
225
|
|
|
227
226
|
if duplicates:
|
|
@@ -271,15 +271,17 @@ class DoctorReporter:
|
|
|
271
271
|
+ summary.skipped_count
|
|
272
272
|
)
|
|
273
273
|
if total > 0:
|
|
274
|
-
print(f"| ✅ OK | {summary.ok_count} | {summary.ok_count*100//total}% |")
|
|
275
274
|
print(
|
|
276
|
-
f"|
|
|
275
|
+
f"| ✅ OK | {summary.ok_count} | {summary.ok_count * 100 // total}% |"
|
|
277
276
|
)
|
|
278
277
|
print(
|
|
279
|
-
f"|
|
|
278
|
+
f"| ⚠️ Warning | {summary.warning_count} | {summary.warning_count * 100 // total}% |"
|
|
280
279
|
)
|
|
281
280
|
print(
|
|
282
|
-
f"|
|
|
281
|
+
f"| ❌ Error | {summary.error_count} | {summary.error_count * 100 // total}% |"
|
|
282
|
+
)
|
|
283
|
+
print(
|
|
284
|
+
f"| ⏭️ Skipped | {summary.skipped_count} | {summary.skipped_count * 100 // total}% |"
|
|
283
285
|
)
|
|
284
286
|
print()
|
|
285
287
|
|
|
@@ -6,11 +6,32 @@ consistency across all checks and reporting.
|
|
|
6
6
|
"""
|
|
7
7
|
|
|
8
8
|
from dataclasses import dataclass, field
|
|
9
|
+
from enum import Enum
|
|
9
10
|
from typing import Any, Dict, List, Optional, Union
|
|
10
11
|
|
|
11
12
|
from ...core.enums import OperationResult, ValidationSeverity
|
|
12
13
|
|
|
13
14
|
|
|
15
|
+
class DiagnosticStatus(str, Enum):
|
|
16
|
+
"""Backward compatibility wrapper for diagnostic status values.
|
|
17
|
+
|
|
18
|
+
WHY: Provides backward compatibility for tests and code that use
|
|
19
|
+
DiagnosticStatus instead of the consolidated OperationResult/ValidationSeverity.
|
|
20
|
+
|
|
21
|
+
DESIGN DECISION: Maps to the appropriate consolidated enum values:
|
|
22
|
+
- OK → OperationResult.SUCCESS
|
|
23
|
+
- WARNING → ValidationSeverity.WARNING
|
|
24
|
+
- ERROR → ValidationSeverity.ERROR
|
|
25
|
+
|
|
26
|
+
Note: This is a compatibility layer. New code should use OperationResult
|
|
27
|
+
and ValidationSeverity directly.
|
|
28
|
+
"""
|
|
29
|
+
|
|
30
|
+
OK = "success" # Maps to OperationResult.SUCCESS
|
|
31
|
+
WARNING = "warning" # Maps to ValidationSeverity.WARNING
|
|
32
|
+
ERROR = "error" # Maps to ValidationSeverity.ERROR
|
|
33
|
+
|
|
34
|
+
|
|
14
35
|
@dataclass
|
|
15
36
|
class DiagnosticResult:
|
|
16
37
|
"""Result from a diagnostic check.
|
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
# EventBus Service
|
|
2
|
+
|
|
3
|
+
A decoupled event handling system for claude-mpm that enables loose coupling between event producers (like hooks) and consumers (like Socket.IO).
|
|
4
|
+
|
|
5
|
+
## Overview
|
|
6
|
+
|
|
7
|
+
The EventBus service provides a centralized publish-subscribe system that:
|
|
8
|
+
- Decouples event producers from consumers
|
|
9
|
+
- Supports both synchronous and asynchronous handlers
|
|
10
|
+
- Provides event filtering and routing capabilities
|
|
11
|
+
- Isolates failures in individual consumers
|
|
12
|
+
- Offers comprehensive monitoring and statistics
|
|
13
|
+
|
|
14
|
+
## Architecture
|
|
15
|
+
|
|
16
|
+
```
|
|
17
|
+
Hook Handler → EventBus → Multiple Consumers
|
|
18
|
+
├── Socket.IO Relay
|
|
19
|
+
├── Logging Service
|
|
20
|
+
├── Analytics
|
|
21
|
+
└── Custom Handlers
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
## Key Components
|
|
25
|
+
|
|
26
|
+
### EventBus (`event_bus.py`)
|
|
27
|
+
- Singleton pattern for centralized event coordination
|
|
28
|
+
- Thread-safe event publishing from any context
|
|
29
|
+
- Support for wildcard subscriptions (`hook.*`)
|
|
30
|
+
- Event filtering and routing
|
|
31
|
+
- Built-in statistics and history tracking
|
|
32
|
+
|
|
33
|
+
### SocketIORelay (`relay.py`)
|
|
34
|
+
- Consumes events from EventBus
|
|
35
|
+
- Relays to Socket.IO clients
|
|
36
|
+
- Handles connection failures gracefully
|
|
37
|
+
- Single point of Socket.IO management
|
|
38
|
+
|
|
39
|
+
### Configuration (`config.py`)
|
|
40
|
+
- Environment variable support
|
|
41
|
+
- Runtime configuration changes
|
|
42
|
+
- Easy testing with different settings
|
|
43
|
+
|
|
44
|
+
## Installation
|
|
45
|
+
|
|
46
|
+
The EventBus requires `pyee` (Python EventEmitter):
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
pip install pyee>=13.0.0
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
## Usage
|
|
53
|
+
|
|
54
|
+
### Basic Publishing
|
|
55
|
+
|
|
56
|
+
```python
|
|
57
|
+
from claude_mpm.services.event_bus import EventBus
|
|
58
|
+
|
|
59
|
+
# Get singleton instance
|
|
60
|
+
event_bus = EventBus.get_instance()
|
|
61
|
+
|
|
62
|
+
# Publish an event
|
|
63
|
+
event_bus.publish("hook.pre_tool", {
|
|
64
|
+
"tool_name": "Read",
|
|
65
|
+
"file_path": "/example.py",
|
|
66
|
+
"sessionId": "abc-123"
|
|
67
|
+
})
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
### Subscribing to Events
|
|
71
|
+
|
|
72
|
+
```python
|
|
73
|
+
# Subscribe to specific event
|
|
74
|
+
def handle_pre_tool(data):
|
|
75
|
+
print(f"Tool: {data.get('tool_name')}")
|
|
76
|
+
|
|
77
|
+
event_bus.on("hook.pre_tool", handle_pre_tool)
|
|
78
|
+
|
|
79
|
+
# Subscribe to wildcard pattern
|
|
80
|
+
def handle_all_hooks(event_type, data):
|
|
81
|
+
print(f"Hook event: {event_type}")
|
|
82
|
+
|
|
83
|
+
event_bus.on("hook.*", handle_all_hooks)
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
### Async Handlers
|
|
87
|
+
|
|
88
|
+
```python
|
|
89
|
+
async def async_handler(data):
|
|
90
|
+
await process_async(data)
|
|
91
|
+
|
|
92
|
+
event_bus.on("app.async_event", async_handler)
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
### Event Filtering
|
|
96
|
+
|
|
97
|
+
```python
|
|
98
|
+
# Only allow specific events
|
|
99
|
+
event_bus.add_filter("hook.*")
|
|
100
|
+
event_bus.add_filter("system.critical.*")
|
|
101
|
+
|
|
102
|
+
# Events outside filters will be dropped
|
|
103
|
+
event_bus.publish("app.user_action", {}) # Filtered out
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
### Socket.IO Integration
|
|
107
|
+
|
|
108
|
+
```python
|
|
109
|
+
from claude_mpm.services.event_bus import SocketIORelay
|
|
110
|
+
|
|
111
|
+
# Create and start relay
|
|
112
|
+
relay = SocketIORelay(port=8765)
|
|
113
|
+
relay.start()
|
|
114
|
+
|
|
115
|
+
# Events published to EventBus will be relayed to Socket.IO
|
|
116
|
+
event_bus.publish("hook.subagent_stop", {
|
|
117
|
+
"agent_type": "Engineer",
|
|
118
|
+
"result": "Success"
|
|
119
|
+
})
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
## Configuration
|
|
123
|
+
|
|
124
|
+
Configure via environment variables:
|
|
125
|
+
|
|
126
|
+
```bash
|
|
127
|
+
# EventBus settings
|
|
128
|
+
export CLAUDE_MPM_EVENTBUS_ENABLED=true
|
|
129
|
+
export CLAUDE_MPM_EVENTBUS_DEBUG=false
|
|
130
|
+
export CLAUDE_MPM_EVENTBUS_HISTORY_SIZE=100
|
|
131
|
+
export CLAUDE_MPM_EVENTBUS_FILTERS="hook.*,system.critical.*"
|
|
132
|
+
|
|
133
|
+
# Relay settings
|
|
134
|
+
export CLAUDE_MPM_RELAY_ENABLED=true
|
|
135
|
+
export CLAUDE_MPM_SOCKETIO_PORT=8765
|
|
136
|
+
export CLAUDE_MPM_RELAY_DEBUG=false
|
|
137
|
+
export CLAUDE_MPM_RELAY_MAX_RETRIES=3
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
## Migration from Direct Socket.IO
|
|
141
|
+
|
|
142
|
+
### Before (Direct Socket.IO)
|
|
143
|
+
```python
|
|
144
|
+
# In hook_handler.py
|
|
145
|
+
client = socketio.Client()
|
|
146
|
+
client.connect("http://localhost:8765")
|
|
147
|
+
client.emit("claude_event", normalized_data)
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
### After (EventBus)
|
|
151
|
+
```python
|
|
152
|
+
# In hook_handler.py
|
|
153
|
+
event_bus = EventBus.get_instance()
|
|
154
|
+
event_bus.publish("hook.pre_tool", data)
|
|
155
|
+
|
|
156
|
+
# Socket.IO handled by relay (separate concern)
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
## Benefits
|
|
160
|
+
|
|
161
|
+
1. **Decoupling**: Hooks don't need to know about Socket.IO
|
|
162
|
+
2. **Testability**: Easy to test without Socket.IO running
|
|
163
|
+
3. **Reliability**: Failures in one consumer don't affect others
|
|
164
|
+
4. **Flexibility**: Add new consumers without modifying producers
|
|
165
|
+
5. **Performance**: Events processed asynchronously
|
|
166
|
+
6. **Monitoring**: Built-in statistics and event history
|
|
167
|
+
|
|
168
|
+
## Testing
|
|
169
|
+
|
|
170
|
+
Run the test suite:
|
|
171
|
+
|
|
172
|
+
```bash
|
|
173
|
+
# Integration tests
|
|
174
|
+
python scripts/test_eventbus_integration.py
|
|
175
|
+
|
|
176
|
+
# Usage examples
|
|
177
|
+
python scripts/eventbus_usage_example.py
|
|
178
|
+
|
|
179
|
+
# Complete flow test
|
|
180
|
+
python scripts/test_eventbus_flow.py
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
## Monitoring
|
|
184
|
+
|
|
185
|
+
Get EventBus statistics:
|
|
186
|
+
|
|
187
|
+
```python
|
|
188
|
+
stats = event_bus.get_stats()
|
|
189
|
+
print(f"Events published: {stats['events_published']}")
|
|
190
|
+
print(f"Events filtered: {stats['events_filtered']}")
|
|
191
|
+
|
|
192
|
+
# Recent event history
|
|
193
|
+
recent = event_bus.get_recent_events(10)
|
|
194
|
+
for event in recent:
|
|
195
|
+
print(f"{event['type']} at {event['timestamp']}")
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
## Error Handling
|
|
199
|
+
|
|
200
|
+
Errors in consumers are isolated:
|
|
201
|
+
|
|
202
|
+
```python
|
|
203
|
+
def good_handler(data):
|
|
204
|
+
process(data) # Always runs
|
|
205
|
+
|
|
206
|
+
def bad_handler(data):
|
|
207
|
+
raise Exception("Error") # Doesn't affect good_handler
|
|
208
|
+
|
|
209
|
+
event_bus.on("app.event", good_handler)
|
|
210
|
+
event_bus.on("app.event", bad_handler)
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
## Performance
|
|
214
|
+
|
|
215
|
+
- Handles 30,000+ events/second
|
|
216
|
+
- Minimal memory overhead
|
|
217
|
+
- Thread-safe for concurrent publishing
|
|
218
|
+
- Efficient wildcard matching
|
|
219
|
+
|
|
220
|
+
## Troubleshooting
|
|
221
|
+
|
|
222
|
+
### Events not being received
|
|
223
|
+
1. Check if EventBus is enabled: `CLAUDE_MPM_EVENTBUS_ENABLED=true`
|
|
224
|
+
2. Verify no filters are blocking: `event_bus.clear_filters()`
|
|
225
|
+
3. Check handler registration: `event_bus.on("event_type", handler)`
|
|
226
|
+
|
|
227
|
+
### Socket.IO relay not working
|
|
228
|
+
1. Verify Socket.IO server is running on configured port
|
|
229
|
+
2. Check relay is started: `relay.start()`
|
|
230
|
+
3. Enable debug logging: `CLAUDE_MPM_RELAY_DEBUG=true`
|
|
231
|
+
|
|
232
|
+
### High memory usage
|
|
233
|
+
1. Reduce history size: `CLAUDE_MPM_EVENTBUS_HISTORY_SIZE=50`
|
|
234
|
+
2. Clear history periodically: `event_bus.clear_history()`
|
|
235
|
+
|
|
236
|
+
## Future Enhancements
|
|
237
|
+
|
|
238
|
+
- [ ] Persistent event storage
|
|
239
|
+
- [ ] Event replay capabilities
|
|
240
|
+
- [ ] Advanced routing rules
|
|
241
|
+
- [ ] Event prioritization
|
|
242
|
+
- [ ] Distributed EventBus (Redis backend)
|
|
243
|
+
- [ ] Event schema validation
|
|
244
|
+
- [ ] Rate limiting per consumer
|
|
@@ -256,9 +256,9 @@ class DirectSocketIORelay:
|
|
|
256
256
|
event_type, broadcast_data
|
|
257
257
|
)
|
|
258
258
|
self.stats["events_relayed"] += 1
|
|
259
|
-
self.stats[
|
|
260
|
-
|
|
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
|