claude-mpm 4.1.6__py3-none-any.whl → 4.24.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of claude-mpm might be problematic. Click here for more details.
- claude_mpm/BUILD_NUMBER +1 -1
- claude_mpm/VERSION +1 -1
- claude_mpm/__init__.py +20 -5
- claude_mpm/agents/BASE_AGENT_TEMPLATE.md +118 -0
- claude_mpm/agents/BASE_DOCUMENTATION.md +53 -0
- claude_mpm/agents/BASE_ENGINEER.md +658 -0
- claude_mpm/agents/BASE_OPS.md +219 -0
- claude_mpm/agents/BASE_PM.md +431 -214
- claude_mpm/agents/BASE_PROMPT_ENGINEER.md +787 -0
- claude_mpm/agents/BASE_QA.md +167 -0
- claude_mpm/agents/BASE_RESEARCH.md +53 -0
- claude_mpm/agents/MEMORY.md +3 -0
- claude_mpm/agents/OUTPUT_STYLE.md +335 -0
- claude_mpm/agents/PM_INSTRUCTIONS.md +1159 -0
- claude_mpm/agents/WORKFLOW.md +355 -187
- claude_mpm/agents/agent_loader.py +40 -10
- claude_mpm/agents/agent_loader_integration.py +3 -2
- claude_mpm/agents/agents_metadata.py +57 -0
- claude_mpm/agents/async_agent_loader.py +3 -3
- claude_mpm/agents/base_agent_loader.py +11 -9
- claude_mpm/agents/frontmatter_validator.py +291 -251
- claude_mpm/agents/system_agent_config.py +3 -2
- claude_mpm/agents/templates/.claude-mpm/memories/README.md +17 -0
- claude_mpm/agents/templates/.claude-mpm/memories/engineer_memories.md +3 -0
- claude_mpm/agents/templates/README.md +465 -0
- claude_mpm/agents/templates/agent-manager.json +267 -18
- claude_mpm/agents/templates/agentic-coder-optimizer.json +248 -0
- claude_mpm/agents/templates/api_qa.json +16 -4
- claude_mpm/agents/templates/circuit_breakers.md +638 -0
- claude_mpm/agents/templates/clerk-ops.json +235 -0
- claude_mpm/agents/templates/code_analyzer.json +25 -9
- claude_mpm/agents/templates/content-agent.json +358 -0
- claude_mpm/agents/templates/dart_engineer.json +307 -0
- claude_mpm/agents/templates/data_engineer.json +87 -14
- claude_mpm/agents/templates/documentation.json +76 -13
- claude_mpm/agents/templates/engineer.json +44 -10
- claude_mpm/agents/templates/gcp_ops_agent.json +253 -0
- claude_mpm/agents/templates/git_file_tracking.md +584 -0
- claude_mpm/agents/templates/golang_engineer.json +270 -0
- claude_mpm/agents/templates/imagemagick.json +5 -2
- claude_mpm/agents/templates/java_engineer.json +346 -0
- claude_mpm/agents/templates/javascript_engineer_agent.json +380 -0
- claude_mpm/agents/templates/local_ops_agent.json +1840 -0
- claude_mpm/agents/templates/logs/prompts/agent_engineer_20250826_014258_728.md +39 -0
- claude_mpm/agents/templates/logs/prompts/agent_engineer_20250901_010124_142.md +400 -0
- claude_mpm/agents/templates/memory_manager.json +6 -3
- claude_mpm/agents/templates/nextjs_engineer.json +285 -0
- claude_mpm/agents/templates/ops.json +27 -8
- claude_mpm/agents/templates/php-engineer.json +287 -0
- claude_mpm/agents/templates/pm_examples.md +474 -0
- claude_mpm/agents/templates/pm_red_flags.md +262 -0
- claude_mpm/agents/templates/product_owner.json +338 -0
- claude_mpm/agents/templates/project_organizer.json +19 -5
- claude_mpm/agents/templates/prompt-engineer.json +737 -0
- claude_mpm/agents/templates/python_engineer.json +387 -0
- claude_mpm/agents/templates/qa.json +26 -6
- claude_mpm/agents/templates/react_engineer.json +239 -0
- claude_mpm/agents/templates/refactoring_engineer.json +15 -5
- claude_mpm/agents/templates/research.json +47 -22
- claude_mpm/agents/templates/response_format.md +583 -0
- claude_mpm/agents/templates/ruby-engineer.json +280 -0
- claude_mpm/agents/templates/rust_engineer.json +275 -0
- claude_mpm/agents/templates/security.json +59 -10
- claude_mpm/agents/templates/svelte-engineer.json +225 -0
- claude_mpm/agents/templates/tauri_engineer.json +274 -0
- claude_mpm/agents/templates/ticketing.json +16 -7
- claude_mpm/agents/templates/typescript_engineer.json +285 -0
- claude_mpm/agents/templates/validation_templates.md +312 -0
- claude_mpm/agents/templates/vercel_ops_agent.json +164 -33
- claude_mpm/agents/templates/version_control.json +16 -4
- claude_mpm/agents/templates/web_qa.json +243 -21
- claude_mpm/agents/templates/web_ui.json +18 -5
- claude_mpm/cli/__init__.py +38 -363
- claude_mpm/cli/commands/__init__.py +8 -0
- claude_mpm/cli/commands/agent_manager.py +675 -20
- claude_mpm/cli/commands/agent_state_manager.py +186 -0
- claude_mpm/cli/commands/agents.py +722 -150
- claude_mpm/cli/commands/agents_detect.py +380 -0
- claude_mpm/cli/commands/agents_recommend.py +309 -0
- claude_mpm/cli/commands/aggregate.py +10 -6
- claude_mpm/cli/commands/analyze.py +553 -0
- claude_mpm/cli/commands/analyze_code.py +528 -0
- claude_mpm/cli/commands/auto_configure.py +570 -0
- claude_mpm/cli/commands/cleanup.py +12 -12
- claude_mpm/cli/commands/config.py +47 -13
- claude_mpm/cli/commands/configure.py +488 -884
- claude_mpm/cli/commands/configure_agent_display.py +261 -0
- claude_mpm/cli/commands/configure_behavior_manager.py +204 -0
- claude_mpm/cli/commands/configure_hook_manager.py +225 -0
- claude_mpm/cli/commands/configure_models.py +18 -0
- claude_mpm/cli/commands/configure_navigation.py +167 -0
- claude_mpm/cli/commands/configure_paths.py +104 -0
- claude_mpm/cli/commands/configure_persistence.py +254 -0
- claude_mpm/cli/commands/configure_startup_manager.py +646 -0
- claude_mpm/cli/commands/configure_template_editor.py +497 -0
- claude_mpm/cli/commands/configure_validators.py +73 -0
- claude_mpm/cli/commands/dashboard.py +286 -0
- claude_mpm/cli/commands/debug.py +1386 -0
- claude_mpm/cli/commands/doctor.py +43 -7
- claude_mpm/cli/commands/info.py +3 -4
- claude_mpm/cli/commands/local_deploy.py +537 -0
- claude_mpm/cli/commands/mcp.py +17 -10
- claude_mpm/cli/commands/mcp_command_router.py +11 -0
- claude_mpm/cli/commands/mcp_config.py +154 -0
- claude_mpm/cli/commands/mcp_external_commands.py +249 -0
- claude_mpm/cli/commands/mcp_install_commands.py +101 -32
- claude_mpm/cli/commands/mcp_pipx_config.py +2 -2
- claude_mpm/cli/commands/mcp_setup_external.py +868 -0
- claude_mpm/cli/commands/memory.py +55 -21
- claude_mpm/cli/commands/monitor.py +168 -617
- claude_mpm/cli/commands/mpm_init/__init__.py +73 -0
- claude_mpm/cli/commands/mpm_init/core.py +525 -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 +195 -0
- claude_mpm/cli/commands/run.py +169 -42
- claude_mpm/cli/commands/search.py +458 -0
- claude_mpm/cli/commands/skills.py +488 -0
- claude_mpm/cli/commands/uninstall.py +176 -0
- claude_mpm/cli/commands/upgrade.py +152 -0
- claude_mpm/cli/commands/verify.py +119 -0
- claude_mpm/cli/executor.py +204 -0
- claude_mpm/cli/helpers.py +105 -0
- claude_mpm/cli/interactive/__init__.py +21 -0
- claude_mpm/cli/interactive/agent_wizard.py +962 -0
- claude_mpm/cli/interactive/skills_wizard.py +491 -0
- claude_mpm/cli/parser.py +79 -2
- claude_mpm/cli/parsers/__init__.py +7 -1
- claude_mpm/cli/parsers/agent_manager_parser.py +161 -1
- claude_mpm/cli/parsers/agents_parser.py +116 -0
- claude_mpm/cli/parsers/analyze_code_parser.py +170 -0
- claude_mpm/cli/parsers/analyze_parser.py +135 -0
- claude_mpm/cli/parsers/auto_configure_parser.py +245 -0
- claude_mpm/cli/parsers/base_parser.py +187 -3
- claude_mpm/cli/parsers/configure_parser.py +34 -15
- claude_mpm/cli/parsers/dashboard_parser.py +113 -0
- claude_mpm/cli/parsers/debug_parser.py +319 -0
- claude_mpm/cli/parsers/local_deploy_parser.py +227 -0
- claude_mpm/cli/parsers/mcp_parser.py +15 -0
- claude_mpm/cli/parsers/monitor_parser.py +12 -2
- claude_mpm/cli/parsers/mpm_init_parser.py +311 -0
- claude_mpm/cli/parsers/run_parser.py +5 -0
- claude_mpm/cli/parsers/search_parser.py +245 -0
- claude_mpm/cli/parsers/skills_parser.py +137 -0
- claude_mpm/cli/shared/argument_patterns.py +20 -13
- claude_mpm/cli/shared/base_command.py +2 -2
- claude_mpm/cli/shared/output_formatters.py +28 -19
- claude_mpm/cli/startup.py +562 -0
- claude_mpm/cli/startup_logging.py +179 -13
- claude_mpm/cli/utils.py +53 -2
- claude_mpm/commands/__init__.py +14 -0
- claude_mpm/commands/mpm-agents-detect.md +168 -0
- claude_mpm/commands/mpm-agents-recommend.md +214 -0
- claude_mpm/commands/mpm-agents.md +122 -0
- claude_mpm/commands/mpm-auto-configure.md +269 -0
- claude_mpm/commands/mpm-config.md +141 -0
- claude_mpm/commands/mpm-doctor.md +24 -0
- claude_mpm/commands/mpm-help.md +290 -0
- claude_mpm/commands/mpm-init.md +521 -0
- claude_mpm/commands/mpm-monitor.md +409 -0
- claude_mpm/commands/mpm-organize.md +295 -0
- claude_mpm/commands/mpm-resume.md +372 -0
- claude_mpm/commands/mpm-status.md +75 -0
- claude_mpm/commands/mpm-tickets.md +151 -0
- claude_mpm/commands/mpm-version.md +113 -0
- claude_mpm/commands/mpm.md +21 -0
- claude_mpm/config/agent_config.py +4 -4
- claude_mpm/config/experimental_features.py +7 -7
- claude_mpm/config/model_config.py +428 -0
- claude_mpm/config/paths.py +3 -2
- claude_mpm/config/socketio_config.py +36 -7
- claude_mpm/constants.py +27 -1
- claude_mpm/core/__init__.py +53 -17
- claude_mpm/core/agent_name_normalizer.py +3 -2
- claude_mpm/core/agent_registry.py +2 -2
- claude_mpm/core/agent_session_manager.py +10 -10
- claude_mpm/core/api_validator.py +330 -0
- claude_mpm/core/base_service.py +33 -23
- claude_mpm/core/cache.py +9 -9
- claude_mpm/core/claude_runner.py +19 -8
- claude_mpm/core/config.py +103 -8
- claude_mpm/core/config_aliases.py +7 -6
- claude_mpm/core/constants.py +65 -0
- claude_mpm/core/container.py +11 -5
- claude_mpm/core/enums.py +452 -0
- claude_mpm/core/error_handler.py +623 -0
- claude_mpm/core/factories.py +1 -1
- claude_mpm/core/file_utils.py +764 -0
- claude_mpm/core/framework/__init__.py +38 -0
- claude_mpm/core/framework/formatters/__init__.py +11 -0
- claude_mpm/core/framework/formatters/capability_generator.py +367 -0
- claude_mpm/core/framework/formatters/content_formatter.py +288 -0
- claude_mpm/core/framework/formatters/context_generator.py +185 -0
- claude_mpm/core/framework/loaders/__init__.py +13 -0
- claude_mpm/core/framework/loaders/agent_loader.py +210 -0
- claude_mpm/core/framework/loaders/file_loader.py +223 -0
- claude_mpm/core/framework/loaders/instruction_loader.py +161 -0
- claude_mpm/core/framework/loaders/packaged_loader.py +232 -0
- claude_mpm/core/framework/processors/__init__.py +11 -0
- claude_mpm/core/framework/processors/memory_processor.py +230 -0
- claude_mpm/core/framework/processors/metadata_processor.py +146 -0
- claude_mpm/core/framework/processors/template_processor.py +244 -0
- claude_mpm/core/framework_loader.py +323 -1491
- claude_mpm/core/hook_manager.py +8 -6
- claude_mpm/core/injectable_service.py +11 -8
- claude_mpm/core/instruction_reinforcement_hook.py +267 -0
- claude_mpm/core/interactive_session.py +55 -8
- claude_mpm/core/interfaces.py +56 -1
- claude_mpm/core/lazy.py +3 -3
- claude_mpm/core/log_manager.py +100 -28
- claude_mpm/core/logger.py +19 -14
- claude_mpm/core/logging_config.py +6 -2
- claude_mpm/core/logging_utils.py +520 -0
- claude_mpm/core/oneshot_session.py +51 -7
- claude_mpm/core/optimized_agent_loader.py +9 -9
- claude_mpm/core/optimized_startup.py +1 -1
- claude_mpm/core/output_style_manager.py +12 -192
- claude_mpm/core/pm_hook_interceptor.py +118 -15
- claude_mpm/core/service_registry.py +7 -3
- claude_mpm/core/session_manager.py +14 -12
- claude_mpm/core/shared/config_loader.py +1 -1
- claude_mpm/core/socketio_pool.py +15 -15
- claude_mpm/core/tool_access_control.py +3 -2
- claude_mpm/core/types.py +4 -11
- claude_mpm/core/typing_utils.py +7 -6
- claude_mpm/core/unified_agent_registry.py +116 -12
- claude_mpm/core/unified_config.py +6 -6
- claude_mpm/core/unified_paths.py +23 -20
- claude_mpm/dashboard/.claude-mpm/socketio-instances.json +1 -0
- claude_mpm/dashboard/__init__.py +12 -0
- claude_mpm/dashboard/analysis_runner.py +455 -0
- claude_mpm/dashboard/api/simple_directory.py +261 -0
- claude_mpm/dashboard/react/components/DataInspector/DataInspector.module.css +188 -0
- claude_mpm/dashboard/react/components/EventViewer/EventViewer.module.css +156 -0
- claude_mpm/dashboard/react/components/shared/ConnectionStatus.module.css +38 -0
- claude_mpm/dashboard/react/components/shared/FilterBar.module.css +92 -0
- claude_mpm/dashboard/static/archive/activity_dashboard_fixed.html +248 -0
- claude_mpm/dashboard/static/archive/activity_dashboard_test.html +61 -0
- claude_mpm/dashboard/static/archive/test_activity_connection.html +179 -0
- claude_mpm/dashboard/static/archive/test_claude_tree_tab.html +68 -0
- claude_mpm/dashboard/static/archive/test_dashboard.html +409 -0
- claude_mpm/dashboard/static/archive/test_dashboard_fixed.html +519 -0
- claude_mpm/dashboard/static/archive/test_dashboard_verification.html +181 -0
- claude_mpm/dashboard/static/archive/test_file_data.html +315 -0
- claude_mpm/dashboard/static/archive/test_file_tree_empty_state.html +243 -0
- claude_mpm/dashboard/static/archive/test_file_tree_fix.html +234 -0
- claude_mpm/dashboard/static/archive/test_file_tree_rename.html +117 -0
- claude_mpm/dashboard/static/archive/test_file_tree_tab.html +115 -0
- claude_mpm/dashboard/static/archive/test_file_viewer.html +224 -0
- claude_mpm/dashboard/static/archive/test_final_activity.html +220 -0
- claude_mpm/dashboard/static/archive/test_tab_fix.html +139 -0
- claude_mpm/dashboard/static/built/assets/events.DjpNxWNo.css +1 -0
- claude_mpm/dashboard/static/built/components/activity-tree.js +2 -0
- claude_mpm/dashboard/static/built/components/agent-hierarchy.js +777 -0
- claude_mpm/dashboard/static/built/components/agent-inference.js +1 -1
- claude_mpm/dashboard/static/built/components/build-tracker.js +333 -0
- claude_mpm/dashboard/static/built/components/code-simple.js +857 -0
- claude_mpm/dashboard/static/built/components/code-tree/tree-breadcrumb.js +353 -0
- claude_mpm/dashboard/static/built/components/code-tree/tree-constants.js +235 -0
- claude_mpm/dashboard/static/built/components/code-tree/tree-search.js +409 -0
- claude_mpm/dashboard/static/built/components/code-tree/tree-utils.js +435 -0
- claude_mpm/dashboard/static/built/components/code-tree.js +2 -0
- claude_mpm/dashboard/static/built/components/code-viewer.js +2 -0
- claude_mpm/dashboard/static/built/components/connection-debug.js +654 -0
- claude_mpm/dashboard/static/built/components/diff-viewer.js +891 -0
- claude_mpm/dashboard/static/built/components/event-processor.js +1 -1
- claude_mpm/dashboard/static/built/components/event-viewer.js +1 -1
- claude_mpm/dashboard/static/built/components/export-manager.js +1 -1
- claude_mpm/dashboard/static/built/components/file-change-tracker.js +443 -0
- claude_mpm/dashboard/static/built/components/file-change-viewer.js +690 -0
- claude_mpm/dashboard/static/built/components/file-tool-tracker.js +1 -1
- claude_mpm/dashboard/static/built/components/file-viewer.js +2 -0
- claude_mpm/dashboard/static/built/components/module-viewer.js +1 -1
- claude_mpm/dashboard/static/built/components/nav-bar.js +145 -0
- claude_mpm/dashboard/static/built/components/page-structure.js +429 -0
- claude_mpm/dashboard/static/built/components/session-manager.js +1 -1
- claude_mpm/dashboard/static/built/components/unified-data-viewer.js +2 -0
- claude_mpm/dashboard/static/built/components/working-directory.js +1 -1
- claude_mpm/dashboard/static/built/connection-manager.js +536 -0
- claude_mpm/dashboard/static/built/dashboard.js +1 -1
- claude_mpm/dashboard/static/built/extension-error-handler.js +164 -0
- claude_mpm/dashboard/static/built/react/events.js +30 -0
- claude_mpm/dashboard/static/built/shared/dom-helpers.js +396 -0
- claude_mpm/dashboard/static/built/shared/event-bus.js +330 -0
- claude_mpm/dashboard/static/built/shared/event-filter-service.js +540 -0
- claude_mpm/dashboard/static/built/shared/logger.js +385 -0
- claude_mpm/dashboard/static/built/shared/page-structure.js +249 -0
- claude_mpm/dashboard/static/built/shared/tooltip-service.js +253 -0
- claude_mpm/dashboard/static/built/socket-client.js +1 -1
- claude_mpm/dashboard/static/built/tab-isolation-fix.js +185 -0
- claude_mpm/dashboard/static/css/activity.css +1958 -0
- claude_mpm/dashboard/static/css/dashboard.css +1413 -72
- claude_mpm/dashboard/static/dist/assets/events.DjpNxWNo.css +1 -0
- claude_mpm/dashboard/static/dist/components/activity-tree.js +2 -0
- claude_mpm/dashboard/static/dist/components/agent-inference.js +1 -1
- claude_mpm/dashboard/static/dist/components/code-tree.js +2 -0
- claude_mpm/dashboard/static/dist/components/code-viewer.js +2 -0
- claude_mpm/dashboard/static/dist/components/event-processor.js +1 -1
- claude_mpm/dashboard/static/dist/components/event-viewer.js +1 -1
- claude_mpm/dashboard/static/dist/components/export-manager.js +1 -1
- claude_mpm/dashboard/static/dist/components/file-tool-tracker.js +1 -1
- claude_mpm/dashboard/static/dist/components/file-viewer.js +2 -0
- claude_mpm/dashboard/static/dist/components/module-viewer.js +1 -1
- claude_mpm/dashboard/static/dist/components/session-manager.js +1 -1
- claude_mpm/dashboard/static/dist/components/unified-data-viewer.js +2 -0
- claude_mpm/dashboard/static/dist/components/working-directory.js +1 -1
- claude_mpm/dashboard/static/dist/dashboard.js +1 -1
- claude_mpm/dashboard/static/dist/react/events.js +30 -0
- claude_mpm/dashboard/static/dist/socket-client.js +1 -1
- claude_mpm/dashboard/static/events.html +607 -0
- claude_mpm/dashboard/static/index.html +635 -0
- claude_mpm/dashboard/static/js/components/activity-tree.js +1871 -0
- claude_mpm/dashboard/static/js/components/agent-hierarchy.js +4 -1
- claude_mpm/dashboard/static/js/components/agent-inference.js +3 -0
- claude_mpm/dashboard/static/js/components/build-tracker.js +23 -13
- claude_mpm/dashboard/static/js/components/code-simple.js +857 -0
- claude_mpm/dashboard/static/js/components/diff-viewer.js +891 -0
- claude_mpm/dashboard/static/js/components/event-processor.js +3 -107
- claude_mpm/dashboard/static/js/components/event-viewer.js +98 -11
- claude_mpm/dashboard/static/js/components/export-manager.js +3 -0
- claude_mpm/dashboard/static/js/components/file-change-tracker.js +443 -0
- claude_mpm/dashboard/static/js/components/file-change-viewer.js +690 -0
- claude_mpm/dashboard/static/js/components/file-tool-tracker.js +30 -10
- claude_mpm/dashboard/static/js/components/file-viewer.js +580 -0
- claude_mpm/dashboard/static/js/components/module-viewer.js +68 -205
- claude_mpm/dashboard/static/js/components/session-manager.js +46 -10
- claude_mpm/dashboard/static/js/components/socket-manager.js +16 -0
- claude_mpm/dashboard/static/js/components/ui-state-manager.js +359 -40
- claude_mpm/dashboard/static/js/components/unified-data-viewer.js +1824 -0
- claude_mpm/dashboard/static/js/components/working-directory.js +61 -10
- claude_mpm/dashboard/static/js/connection-manager.js +1 -1
- claude_mpm/dashboard/static/js/dashboard.js +523 -622
- claude_mpm/dashboard/static/js/shared/dom-helpers.js +396 -0
- claude_mpm/dashboard/static/js/shared/event-bus.js +330 -0
- claude_mpm/dashboard/static/js/shared/logger.js +385 -0
- claude_mpm/dashboard/static/js/shared/tooltip-service.js +253 -0
- claude_mpm/dashboard/static/js/socket-client.js +549 -62
- claude_mpm/dashboard/static/js/stores/dashboard-store.js +562 -0
- claude_mpm/dashboard/static/js/tab-isolation-fix.js +185 -0
- claude_mpm/dashboard/static/legacy/activity.html +736 -0
- claude_mpm/dashboard/static/legacy/agents.html +786 -0
- claude_mpm/dashboard/static/legacy/files.html +747 -0
- claude_mpm/dashboard/static/legacy/tools.html +831 -0
- claude_mpm/dashboard/static/monitors.html +431 -0
- claude_mpm/dashboard/static/production/events.html +659 -0
- claude_mpm/dashboard/static/production/main.html +698 -0
- claude_mpm/dashboard/static/production/monitors.html +483 -0
- claude_mpm/dashboard/static/socket.io.min.js +7 -0
- claude_mpm/dashboard/static/socket.io.v4.8.1.backup.js +7 -0
- claude_mpm/dashboard/static/test-archive/dashboard.html +635 -0
- claude_mpm/dashboard/static/test-archive/debug-events.html +147 -0
- claude_mpm/dashboard/static/test-archive/test-navigation.html +256 -0
- claude_mpm/dashboard/static/test-archive/test-react-exports.html +180 -0
- claude_mpm/dashboard/static/test-archive/test_debug.html +25 -0
- claude_mpm/dashboard/templates/code_simple.html +153 -0
- claude_mpm/dashboard/templates/index.html +267 -9
- claude_mpm/experimental/__init__.py +10 -0
- claude_mpm/experimental/cli_enhancements.py +4 -2
- claude_mpm/generators/agent_profile_generator.py +5 -3
- claude_mpm/hooks/__init__.py +37 -1
- claude_mpm/hooks/base_hook.py +5 -4
- claude_mpm/hooks/claude_hooks/connection_pool.py +4 -4
- claude_mpm/hooks/claude_hooks/event_handlers.py +21 -18
- claude_mpm/hooks/claude_hooks/hook_handler.py +209 -25
- claude_mpm/hooks/claude_hooks/installer.py +783 -0
- claude_mpm/hooks/claude_hooks/memory_integration.py +3 -3
- claude_mpm/hooks/claude_hooks/response_tracking.py +57 -17
- claude_mpm/hooks/claude_hooks/services/connection_manager.py +64 -49
- claude_mpm/hooks/claude_hooks/services/connection_manager_http.py +140 -76
- claude_mpm/hooks/claude_hooks/services/state_manager.py +11 -9
- claude_mpm/hooks/claude_hooks/services/subagent_processor.py +3 -3
- claude_mpm/hooks/failure_learning/__init__.py +60 -0
- claude_mpm/hooks/failure_learning/failure_detection_hook.py +235 -0
- claude_mpm/hooks/failure_learning/fix_detection_hook.py +217 -0
- claude_mpm/hooks/failure_learning/learning_extraction_hook.py +286 -0
- claude_mpm/hooks/instruction_reinforcement.py +301 -0
- claude_mpm/hooks/kuzu_enrichment_hook.py +263 -0
- claude_mpm/hooks/kuzu_memory_hook.py +386 -0
- claude_mpm/hooks/kuzu_response_hook.py +183 -0
- claude_mpm/hooks/memory_integration_hook.py +1 -1
- claude_mpm/hooks/session_resume_hook.py +121 -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/tool_call_interceptor.py +8 -5
- claude_mpm/hooks/validation_hooks.py +3 -3
- claude_mpm/init.py +23 -4
- claude_mpm/models/agent_session.py +8 -6
- claude_mpm/models/resume_log.py +340 -0
- claude_mpm/schemas/__init__.py +12 -0
- claude_mpm/scripts/claude-hook-handler.sh +187 -0
- claude_mpm/scripts/launch_monitor.py +85 -0
- claude_mpm/scripts/mcp_server.py +3 -5
- claude_mpm/scripts/mpm_doctor.py +3 -2
- claude_mpm/scripts/socketio_daemon.py +156 -396
- claude_mpm/services/__init__.py +144 -160
- claude_mpm/services/agents/__init__.py +18 -5
- claude_mpm/services/agents/agent_builder.py +13 -11
- claude_mpm/services/agents/auto_config_manager.py +796 -0
- claude_mpm/services/agents/deployment/agent_config_provider.py +127 -27
- claude_mpm/services/agents/deployment/agent_configuration_manager.py +1 -1
- claude_mpm/services/agents/deployment/agent_deployment.py +38 -15
- claude_mpm/services/agents/deployment/agent_discovery_service.py +125 -7
- claude_mpm/services/agents/deployment/agent_filesystem_manager.py +5 -5
- claude_mpm/services/agents/deployment/agent_format_converter.py +56 -12
- claude_mpm/services/agents/deployment/agent_lifecycle_manager.py +4 -2
- claude_mpm/services/agents/deployment/agent_operation_service.py +2 -2
- claude_mpm/services/agents/deployment/agent_record_service.py +5 -6
- claude_mpm/services/agents/deployment/agent_state_service.py +2 -2
- claude_mpm/services/agents/deployment/agent_template_builder.py +722 -37
- claude_mpm/services/agents/deployment/agent_validator.py +31 -7
- claude_mpm/services/agents/deployment/agent_version_manager.py +9 -1
- claude_mpm/services/agents/deployment/agent_versioning.py +1 -1
- claude_mpm/services/agents/deployment/async_agent_deployment.py +1 -1
- claude_mpm/services/agents/deployment/deployment_config_loader.py +131 -7
- claude_mpm/services/agents/deployment/deployment_type_detector.py +10 -14
- claude_mpm/services/agents/deployment/deployment_wrapper.py +58 -0
- claude_mpm/services/agents/deployment/interface_adapter.py +3 -2
- claude_mpm/services/agents/deployment/local_template_deployment.py +360 -0
- claude_mpm/services/agents/deployment/multi_source_deployment_service.py +134 -38
- claude_mpm/services/agents/deployment/pipeline/steps/agent_processing_step.py +8 -7
- claude_mpm/services/agents/deployment/pipeline/steps/base_step.py +7 -16
- claude_mpm/services/agents/deployment/pipeline/steps/configuration_step.py +4 -3
- claude_mpm/services/agents/deployment/pipeline/steps/target_directory_step.py +7 -5
- claude_mpm/services/agents/deployment/pipeline/steps/validation_step.py +6 -5
- claude_mpm/services/agents/deployment/refactored_agent_deployment_service.py +9 -6
- claude_mpm/services/agents/deployment/system_instructions_deployer.py +9 -6
- claude_mpm/services/agents/deployment/validation/__init__.py +3 -1
- claude_mpm/services/agents/deployment/validation/template_validator.py +64 -44
- claude_mpm/services/agents/deployment/validation/validation_result.py +1 -9
- claude_mpm/services/agents/loading/agent_profile_loader.py +10 -9
- claude_mpm/services/agents/loading/base_agent_manager.py +16 -6
- claude_mpm/services/agents/loading/framework_agent_loader.py +2 -2
- claude_mpm/services/agents/local_template_manager.py +744 -0
- claude_mpm/services/agents/management/agent_capabilities_generator.py +3 -2
- claude_mpm/services/agents/management/agent_management_service.py +5 -5
- claude_mpm/services/agents/memory/agent_memory_manager.py +32 -29
- claude_mpm/services/agents/memory/content_manager.py +17 -9
- claude_mpm/services/agents/memory/memory_categorization_service.py +4 -2
- claude_mpm/services/agents/memory/memory_file_service.py +32 -6
- claude_mpm/services/agents/memory/memory_format_service.py +7 -7
- claude_mpm/services/agents/memory/memory_limits_service.py +4 -2
- claude_mpm/services/agents/memory/template_generator.py +3 -3
- claude_mpm/services/agents/observers.py +547 -0
- claude_mpm/services/agents/recommender.py +615 -0
- claude_mpm/services/agents/registry/deployed_agent_discovery.py +3 -3
- claude_mpm/services/agents/registry/modification_tracker.py +30 -19
- claude_mpm/services/async_session_logger.py +141 -98
- claude_mpm/services/claude_session_logger.py +82 -74
- claude_mpm/services/cli/agent_cleanup_service.py +6 -5
- claude_mpm/services/cli/agent_dependency_service.py +1 -1
- claude_mpm/services/cli/agent_listing_service.py +5 -5
- claude_mpm/services/cli/agent_validation_service.py +6 -5
- claude_mpm/services/cli/memory_crud_service.py +12 -7
- claude_mpm/services/cli/memory_output_formatter.py +2 -2
- claude_mpm/services/cli/resume_service.py +617 -0
- claude_mpm/services/cli/session_manager.py +104 -13
- claude_mpm/services/cli/session_pause_manager.py +504 -0
- claude_mpm/services/cli/session_resume_helper.py +372 -0
- claude_mpm/services/cli/startup_checker.py +13 -21
- claude_mpm/services/cli/unified_dashboard_manager.py +439 -0
- claude_mpm/services/command_deployment_service.py +17 -9
- claude_mpm/services/command_handler_service.py +11 -5
- claude_mpm/services/core/__init__.py +33 -1
- claude_mpm/services/core/base.py +26 -11
- claude_mpm/services/core/cache_manager.py +1 -3
- claude_mpm/services/core/interfaces/__init__.py +90 -3
- claude_mpm/services/core/interfaces/agent.py +184 -0
- claude_mpm/services/core/interfaces/health.py +172 -0
- claude_mpm/services/core/interfaces/model.py +281 -0
- claude_mpm/services/core/interfaces/process.py +372 -0
- claude_mpm/services/core/interfaces/project.py +121 -0
- claude_mpm/services/core/interfaces/restart.py +307 -0
- claude_mpm/services/core/interfaces/stability.py +260 -0
- claude_mpm/services/core/interfaces.py +56 -1
- claude_mpm/services/core/memory_manager.py +92 -47
- claude_mpm/services/core/models/__init__.py +79 -0
- claude_mpm/services/core/models/agent_config.py +384 -0
- claude_mpm/services/core/models/health.py +162 -0
- claude_mpm/services/core/models/process.py +239 -0
- claude_mpm/services/core/models/restart.py +302 -0
- claude_mpm/services/core/models/stability.py +264 -0
- claude_mpm/services/core/models/toolchain.py +306 -0
- claude_mpm/services/core/path_resolver.py +37 -18
- claude_mpm/services/core/service_container.py +2 -2
- claude_mpm/services/diagnostics/__init__.py +2 -2
- claude_mpm/services/diagnostics/checks/__init__.py +4 -2
- claude_mpm/services/diagnostics/checks/agent_check.py +30 -32
- claude_mpm/services/diagnostics/checks/claude_code_check.py +270 -0
- claude_mpm/services/diagnostics/checks/common_issues_check.py +28 -27
- claude_mpm/services/diagnostics/checks/configuration_check.py +26 -25
- claude_mpm/services/diagnostics/checks/filesystem_check.py +18 -17
- claude_mpm/services/diagnostics/checks/installation_check.py +165 -60
- claude_mpm/services/diagnostics/checks/instructions_check.py +22 -24
- claude_mpm/services/diagnostics/checks/mcp_check.py +57 -43
- claude_mpm/services/diagnostics/checks/mcp_services_check.py +1066 -0
- claude_mpm/services/diagnostics/checks/monitor_check.py +24 -23
- claude_mpm/services/diagnostics/checks/startup_log_check.py +14 -11
- claude_mpm/services/diagnostics/diagnostic_runner.py +22 -13
- claude_mpm/services/diagnostics/doctor_reporter.py +275 -47
- claude_mpm/services/diagnostics/models.py +37 -21
- claude_mpm/services/event_aggregator.py +5 -3
- claude_mpm/services/event_bus/direct_relay.py +152 -13
- claude_mpm/services/event_bus/event_bus.py +51 -9
- claude_mpm/services/event_bus/relay.py +33 -14
- claude_mpm/services/events/consumers/dead_letter.py +7 -5
- claude_mpm/services/events/core.py +5 -6
- claude_mpm/services/events/producers/hook.py +6 -6
- claude_mpm/services/events/producers/system.py +8 -8
- claude_mpm/services/exceptions.py +5 -5
- claude_mpm/services/framework_claude_md_generator/__init__.py +1 -1
- claude_mpm/services/framework_claude_md_generator/content_assembler.py +5 -5
- claude_mpm/services/framework_claude_md_generator/content_validator.py +2 -2
- claude_mpm/services/framework_claude_md_generator/deployment_manager.py +3 -3
- claude_mpm/services/framework_claude_md_generator/section_generators/__init__.py +2 -2
- claude_mpm/services/framework_claude_md_generator/version_manager.py +1 -1
- claude_mpm/services/hook_installer_service.py +506 -0
- claude_mpm/services/hook_service.py +5 -6
- claude_mpm/services/infrastructure/context_preservation.py +13 -11
- claude_mpm/services/infrastructure/daemon_manager.py +9 -9
- claude_mpm/services/infrastructure/logging.py +2 -2
- claude_mpm/services/infrastructure/monitoring/__init__.py +12 -12
- claude_mpm/services/infrastructure/monitoring/aggregator.py +12 -12
- claude_mpm/services/infrastructure/monitoring/base.py +5 -13
- claude_mpm/services/infrastructure/monitoring/network.py +7 -6
- claude_mpm/services/infrastructure/monitoring/process.py +13 -12
- claude_mpm/services/infrastructure/monitoring/resources.py +8 -7
- claude_mpm/services/infrastructure/monitoring/service.py +16 -15
- claude_mpm/services/infrastructure/monitoring.py +12 -12
- claude_mpm/services/infrastructure/resume_log_generator.py +439 -0
- claude_mpm/services/local_ops/__init__.py +165 -0
- claude_mpm/services/local_ops/crash_detector.py +257 -0
- claude_mpm/services/local_ops/health_checks/__init__.py +28 -0
- claude_mpm/services/local_ops/health_checks/http_check.py +224 -0
- claude_mpm/services/local_ops/health_checks/process_check.py +236 -0
- claude_mpm/services/local_ops/health_checks/resource_check.py +255 -0
- claude_mpm/services/local_ops/health_manager.py +430 -0
- claude_mpm/services/local_ops/log_monitor.py +396 -0
- claude_mpm/services/local_ops/memory_leak_detector.py +294 -0
- claude_mpm/services/local_ops/process_manager.py +595 -0
- claude_mpm/services/local_ops/resource_monitor.py +331 -0
- claude_mpm/services/local_ops/restart_manager.py +401 -0
- claude_mpm/services/local_ops/restart_policy.py +387 -0
- claude_mpm/services/local_ops/state_manager.py +372 -0
- claude_mpm/services/local_ops/unified_manager.py +600 -0
- claude_mpm/services/mcp_config_manager.py +1612 -0
- claude_mpm/services/mcp_gateway/__init__.py +97 -93
- claude_mpm/services/mcp_gateway/auto_configure.py +43 -38
- claude_mpm/services/mcp_gateway/config/config_loader.py +3 -3
- claude_mpm/services/mcp_gateway/config/configuration.py +23 -4
- claude_mpm/services/mcp_gateway/core/__init__.py +1 -2
- claude_mpm/services/mcp_gateway/core/base.py +20 -33
- claude_mpm/services/mcp_gateway/core/process_pool.py +585 -31
- claude_mpm/services/mcp_gateway/core/singleton_manager.py +2 -2
- claude_mpm/services/mcp_gateway/core/startup_verification.py +3 -3
- claude_mpm/services/mcp_gateway/main.py +90 -15
- claude_mpm/services/mcp_gateway/registry/service_registry.py +4 -2
- claude_mpm/services/mcp_gateway/registry/tool_registry.py +12 -9
- claude_mpm/services/mcp_gateway/server/mcp_gateway.py +4 -4
- claude_mpm/services/mcp_gateway/server/stdio_server.py +9 -15
- claude_mpm/services/mcp_gateway/tools/__init__.py +14 -2
- claude_mpm/services/mcp_gateway/tools/base_adapter.py +15 -15
- claude_mpm/services/mcp_gateway/tools/document_summarizer.py +10 -9
- claude_mpm/services/mcp_gateway/tools/external_mcp_services.py +654 -0
- claude_mpm/services/mcp_gateway/tools/health_check_tool.py +36 -34
- claude_mpm/services/mcp_gateway/tools/hello_world.py +8 -8
- claude_mpm/services/mcp_gateway/tools/kuzu_memory_service.py +551 -0
- claude_mpm/services/mcp_gateway/utils/__init__.py +14 -0
- claude_mpm/services/mcp_gateway/utils/package_version_checker.py +160 -0
- claude_mpm/services/mcp_gateway/utils/update_preferences.py +170 -0
- claude_mpm/services/mcp_service_verifier.py +729 -0
- claude_mpm/services/memory/builder.py +9 -8
- claude_mpm/services/memory/cache/shared_prompt_cache.py +2 -1
- claude_mpm/services/memory/cache/simple_cache.py +2 -2
- claude_mpm/services/memory/failure_tracker.py +578 -0
- claude_mpm/services/memory/indexed_memory.py +8 -8
- claude_mpm/services/memory/optimizer.py +8 -9
- claude_mpm/services/memory/router.py +3 -3
- claude_mpm/services/memory_hook_service.py +165 -4
- claude_mpm/services/model/__init__.py +147 -0
- claude_mpm/services/model/base_provider.py +365 -0
- claude_mpm/services/model/claude_provider.py +412 -0
- claude_mpm/services/model/model_router.py +453 -0
- claude_mpm/services/model/ollama_provider.py +415 -0
- claude_mpm/services/monitor/__init__.py +20 -0
- claude_mpm/services/monitor/daemon.py +671 -0
- claude_mpm/services/monitor/daemon_manager.py +963 -0
- claude_mpm/services/monitor/event_emitter.py +350 -0
- claude_mpm/services/monitor/handlers/__init__.py +21 -0
- claude_mpm/services/monitor/handlers/code_analysis.py +332 -0
- claude_mpm/services/monitor/handlers/dashboard.py +299 -0
- claude_mpm/services/monitor/handlers/file.py +264 -0
- claude_mpm/services/monitor/handlers/hooks.py +512 -0
- claude_mpm/services/monitor/management/__init__.py +18 -0
- claude_mpm/services/monitor/management/health.py +124 -0
- claude_mpm/services/monitor/management/lifecycle.py +724 -0
- claude_mpm/services/monitor/server.py +817 -0
- claude_mpm/services/monitor_build_service.py +2 -2
- claude_mpm/services/native_agent_converter.py +356 -0
- claude_mpm/services/orphan_detection.py +786 -0
- claude_mpm/services/port_manager.py +2 -2
- claude_mpm/services/project/__init__.py +23 -0
- claude_mpm/services/project/analyzer.py +3 -3
- claude_mpm/services/project/architecture_analyzer.py +6 -6
- claude_mpm/services/project/archive_manager.py +1045 -0
- claude_mpm/services/project/dependency_analyzer.py +8 -8
- claude_mpm/services/project/detection_strategies.py +719 -0
- claude_mpm/services/project/documentation_manager.py +553 -0
- claude_mpm/services/project/enhanced_analyzer.py +572 -0
- claude_mpm/services/project/language_analyzer.py +3 -3
- claude_mpm/services/project/metrics_collector.py +7 -10
- claude_mpm/services/project/project_organizer.py +1005 -0
- claude_mpm/services/project/registry.py +13 -7
- claude_mpm/services/project/toolchain_analyzer.py +581 -0
- claude_mpm/services/project_port_allocator.py +596 -0
- claude_mpm/services/response_tracker.py +21 -10
- claude_mpm/services/runner_configuration_service.py +1 -0
- claude_mpm/services/self_upgrade_service.py +500 -0
- claude_mpm/services/session_management_service.py +7 -5
- claude_mpm/services/session_manager.py +380 -0
- claude_mpm/services/shared/__init__.py +2 -1
- claude_mpm/services/shared/async_service_base.py +16 -27
- claude_mpm/services/shared/config_service_base.py +17 -14
- claude_mpm/services/shared/lifecycle_service_base.py +1 -14
- claude_mpm/services/shared/service_factory.py +8 -5
- claude_mpm/services/socketio/client_proxy.py +60 -5
- claude_mpm/services/socketio/dashboard_server.py +361 -0
- claude_mpm/services/socketio/event_normalizer.py +74 -6
- claude_mpm/services/socketio/handlers/__init__.py +5 -0
- claude_mpm/services/socketio/handlers/base.py +2 -2
- claude_mpm/services/socketio/handlers/code_analysis.py +682 -0
- claude_mpm/services/socketio/handlers/connection.py +21 -40
- claude_mpm/services/socketio/handlers/connection_handler.py +16 -28
- claude_mpm/services/socketio/handlers/file.py +46 -10
- claude_mpm/services/socketio/handlers/git.py +8 -8
- claude_mpm/services/socketio/handlers/hook.py +29 -17
- claude_mpm/services/socketio/handlers/registry.py +4 -0
- claude_mpm/services/socketio/monitor_client.py +364 -0
- claude_mpm/services/socketio/server/broadcaster.py +9 -7
- claude_mpm/services/socketio/server/connection_manager.py +131 -68
- claude_mpm/services/socketio/server/core.py +275 -22
- claude_mpm/services/socketio/server/eventbus_integration.py +20 -14
- claude_mpm/services/socketio/server/main.py +99 -29
- claude_mpm/services/socketio_client_manager.py +4 -4
- claude_mpm/services/subprocess_launcher_service.py +19 -15
- claude_mpm/services/system_instructions_service.py +2 -2
- claude_mpm/services/ticket_services/formatter_service.py +1 -1
- claude_mpm/services/ticket_services/validation_service.py +5 -5
- claude_mpm/services/unified/__init__.py +65 -0
- claude_mpm/services/unified/analyzer_strategies/__init__.py +44 -0
- claude_mpm/services/unified/analyzer_strategies/code_analyzer.py +518 -0
- claude_mpm/services/unified/analyzer_strategies/dependency_analyzer.py +680 -0
- claude_mpm/services/unified/analyzer_strategies/performance_analyzer.py +903 -0
- claude_mpm/services/unified/analyzer_strategies/security_analyzer.py +746 -0
- claude_mpm/services/unified/analyzer_strategies/structure_analyzer.py +733 -0
- claude_mpm/services/unified/config_strategies/__init__.py +175 -0
- claude_mpm/services/unified/config_strategies/config_schema.py +731 -0
- claude_mpm/services/unified/config_strategies/context_strategy.py +747 -0
- claude_mpm/services/unified/config_strategies/error_handling_strategy.py +1005 -0
- claude_mpm/services/unified/config_strategies/file_loader_strategy.py +881 -0
- claude_mpm/services/unified/config_strategies/unified_config_service.py +823 -0
- claude_mpm/services/unified/config_strategies/validation_strategy.py +1148 -0
- claude_mpm/services/unified/deployment_strategies/__init__.py +97 -0
- claude_mpm/services/unified/deployment_strategies/base.py +553 -0
- claude_mpm/services/unified/deployment_strategies/cloud_strategies.py +573 -0
- claude_mpm/services/unified/deployment_strategies/local.py +607 -0
- claude_mpm/services/unified/deployment_strategies/utils.py +667 -0
- claude_mpm/services/unified/deployment_strategies/vercel.py +475 -0
- claude_mpm/services/unified/interfaces.py +475 -0
- claude_mpm/services/unified/migration.py +509 -0
- claude_mpm/services/unified/strategies.py +534 -0
- claude_mpm/services/unified/unified_analyzer.py +542 -0
- claude_mpm/services/unified/unified_config.py +691 -0
- claude_mpm/services/unified/unified_deployment.py +470 -0
- claude_mpm/services/utility_service.py +6 -3
- claude_mpm/services/version_control/branch_strategy.py +2 -2
- claude_mpm/services/version_control/conflict_resolution.py +8 -4
- claude_mpm/services/version_control/git_operations.py +26 -24
- claude_mpm/services/version_control/semantic_versioning.py +14 -14
- claude_mpm/services/version_control/version_parser.py +14 -11
- claude_mpm/services/version_service.py +104 -1
- claude_mpm/services/visualization/__init__.py +19 -0
- claude_mpm/services/visualization/mermaid_generator.py +938 -0
- claude_mpm/skills/__init__.py +42 -0
- claude_mpm/skills/agent_skills_injector.py +324 -0
- claude_mpm/skills/bundled/LICENSE_ATTRIBUTIONS.md +79 -0
- claude_mpm/skills/bundled/__init__.py +6 -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/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/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/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/scripts/validate_env.py +576 -0
- claude_mpm/skills/bundled/json-data-handling.md +223 -0
- claude_mpm/skills/bundled/main/artifacts-builder/SKILL.md +86 -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/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/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/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/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/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/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/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 +286 -0
- claude_mpm/skills/skill_manager.py +310 -0
- claude_mpm/skills/skills_registry.py +348 -0
- claude_mpm/skills/skills_service.py +739 -0
- claude_mpm/storage/state_storage.py +31 -31
- claude_mpm/tools/__init__.py +10 -0
- claude_mpm/tools/__main__.py +208 -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/tools/code_tree_builder.py +631 -0
- claude_mpm/tools/code_tree_events.py +420 -0
- claude_mpm/tools/socketio_debug.py +671 -0
- claude_mpm/utils/agent_dependency_loader.py +108 -27
- claude_mpm/utils/common.py +544 -0
- claude_mpm/utils/config_manager.py +12 -6
- claude_mpm/utils/database_connector.py +298 -0
- claude_mpm/utils/dependency_cache.py +2 -2
- claude_mpm/utils/dependency_strategies.py +15 -10
- claude_mpm/utils/display_helper.py +260 -0
- claude_mpm/utils/environment_context.py +4 -3
- claude_mpm/utils/error_handler.py +5 -3
- claude_mpm/utils/file_utils.py +13 -14
- claude_mpm/utils/git_analyzer.py +407 -0
- claude_mpm/utils/log_cleanup.py +627 -0
- claude_mpm/utils/path_operations.py +7 -4
- claude_mpm/utils/robust_installer.py +133 -24
- claude_mpm/utils/session_logging.py +2 -2
- claude_mpm/utils/subprocess_utils.py +9 -8
- claude_mpm/validation/agent_validator.py +6 -6
- claude_mpm/validation/frontmatter_validator.py +6 -6
- claude_mpm-4.24.0.dist-info/METADATA +675 -0
- claude_mpm-4.24.0.dist-info/RECORD +1018 -0
- {claude_mpm-4.1.6.dist-info → claude_mpm-4.24.0.dist-info}/entry_points.txt +1 -0
- claude_mpm/agents/INSTRUCTIONS.md +0 -237
- claude_mpm/agents/schema/agent_schema.json +0 -314
- claude_mpm/agents/templates/agent-manager.md +0 -304
- claude_mpm/cli/commands/configure_tui.py +0 -1921
- claude_mpm/cli/commands/socketio_monitor.py +0 -233
- claude_mpm/hooks/claude_hooks/hook_handler_eventbus.py +0 -425
- claude_mpm/hooks/claude_hooks/hook_handler_original.py +0 -1040
- claude_mpm/hooks/claude_hooks/hook_handler_refactored.py +0 -347
- claude_mpm/scripts/socketio_daemon_hardened.py +0 -937
- claude_mpm/scripts/socketio_server_manager.py +0 -349
- claude_mpm/services/agents/deployment/agent_lifecycle_manager_refactored.py +0 -575
- claude_mpm/services/cli/dashboard_launcher.py +0 -424
- claude_mpm/services/cli/socketio_manager.py +0 -498
- claude_mpm/services/diagnostics/checks/claude_desktop_check.py +0 -286
- claude_mpm/services/mcp_gateway/tools/ticket_tools.py +0 -645
- claude_mpm/services/mcp_gateway/tools/unified_ticket_tool.py +0 -602
- claude_mpm/services/project/analyzer_refactored.py +0 -450
- claude_mpm-4.1.6.dist-info/METADATA +0 -325
- claude_mpm-4.1.6.dist-info/RECORD +0 -550
- {claude_mpm-4.1.6.dist-info → claude_mpm-4.24.0.dist-info}/WHEEL +0 -0
- {claude_mpm-4.1.6.dist-info → claude_mpm-4.24.0.dist-info}/licenses/LICENSE +0 -0
- {claude_mpm-4.1.6.dist-info → claude_mpm-4.24.0.dist-info}/top_level.txt +0 -0
|
@@ -2,15 +2,27 @@
|
|
|
2
2
|
|
|
3
3
|
This module provides a relay that connects EventBus directly to the
|
|
4
4
|
Socket.IO server's broadcaster, avoiding the client loopback issue.
|
|
5
|
+
|
|
6
|
+
IMPORTANT - Claude Event Format:
|
|
7
|
+
Claude sends hook events with these REQUIRED fields:
|
|
8
|
+
- hook_event_name: The event type (UserPromptSubmit, PreToolUse, PostToolUse, etc.)
|
|
9
|
+
- hook_event_type: Usually same as hook_event_name
|
|
10
|
+
- hook_input_data: Contains the actual event data
|
|
11
|
+
- sessionId: Session identifier
|
|
12
|
+
- timestamp: ISO format timestamp
|
|
13
|
+
|
|
14
|
+
DO NOT use "event" or "type" fields - use "hook_event_name" instead!
|
|
5
15
|
"""
|
|
6
16
|
|
|
7
17
|
import logging
|
|
8
|
-
from datetime import datetime
|
|
18
|
+
from datetime import datetime, timezone
|
|
9
19
|
from typing import Any
|
|
10
20
|
|
|
21
|
+
from claude_mpm.core.logging_utils import get_logger
|
|
22
|
+
|
|
11
23
|
from .event_bus import EventBus
|
|
12
24
|
|
|
13
|
-
logger =
|
|
25
|
+
logger = get_logger(__name__)
|
|
14
26
|
|
|
15
27
|
|
|
16
28
|
class DirectSocketIORelay:
|
|
@@ -37,9 +49,12 @@ class DirectSocketIORelay:
|
|
|
37
49
|
"last_relay_time": None,
|
|
38
50
|
}
|
|
39
51
|
self.debug = logger.isEnabledFor(logging.DEBUG)
|
|
52
|
+
self.connection_retries = 0
|
|
53
|
+
self.max_retries = 10
|
|
54
|
+
self.retry_delay = 1.0 # Start with 1 second
|
|
40
55
|
|
|
41
56
|
def start(self) -> None:
|
|
42
|
-
"""Start the relay by subscribing to EventBus events."""
|
|
57
|
+
"""Start the relay by subscribing to EventBus events with retry logic."""
|
|
43
58
|
if not self.enabled:
|
|
44
59
|
logger.warning("DirectSocketIORelay is disabled")
|
|
45
60
|
return
|
|
@@ -59,14 +74,67 @@ class DirectSocketIORelay:
|
|
|
59
74
|
|
|
60
75
|
# Add debug logging for verification
|
|
61
76
|
logger.info("[DirectRelay] Subscribed to hook.* events on EventBus")
|
|
77
|
+
|
|
78
|
+
# Check and log broadcaster availability with retry logic
|
|
79
|
+
broadcaster_available = self._check_broadcaster_with_retry()
|
|
80
|
+
|
|
62
81
|
logger.info(
|
|
63
|
-
f"[DirectRelay] Server broadcaster available: {
|
|
82
|
+
f"[DirectRelay] Server broadcaster available: {broadcaster_available}"
|
|
64
83
|
)
|
|
84
|
+
if not broadcaster_available:
|
|
85
|
+
if not self.server:
|
|
86
|
+
logger.warning(
|
|
87
|
+
"[DirectRelay] No server instance provided - events will not be relayed!"
|
|
88
|
+
)
|
|
89
|
+
elif not hasattr(self.server, "broadcaster"):
|
|
90
|
+
logger.warning(
|
|
91
|
+
"[DirectRelay] Server has no broadcaster attribute - events will not be relayed!"
|
|
92
|
+
)
|
|
93
|
+
else:
|
|
94
|
+
logger.warning(
|
|
95
|
+
"[DirectRelay] Server broadcaster is None after retries - events will not be relayed!"
|
|
96
|
+
)
|
|
97
|
+
|
|
65
98
|
logger.info(f"[DirectRelay] EventBus instance: {self.event_bus is not None}")
|
|
66
99
|
|
|
67
100
|
# Mark as connected after successful subscription
|
|
68
|
-
self.connected =
|
|
69
|
-
logger.info("[DirectRelay] Started
|
|
101
|
+
self.connected = broadcaster_available
|
|
102
|
+
logger.info(f"[DirectRelay] Started with connection status: {self.connected}")
|
|
103
|
+
|
|
104
|
+
def _check_broadcaster_with_retry(self) -> bool:
|
|
105
|
+
"""Check broadcaster availability with exponential backoff retry.
|
|
106
|
+
|
|
107
|
+
Returns:
|
|
108
|
+
True if broadcaster is available, False after max retries
|
|
109
|
+
"""
|
|
110
|
+
import time
|
|
111
|
+
|
|
112
|
+
retry_delay = self.retry_delay
|
|
113
|
+
|
|
114
|
+
for attempt in range(self.max_retries):
|
|
115
|
+
broadcaster_available = (
|
|
116
|
+
self.server
|
|
117
|
+
and hasattr(self.server, "broadcaster")
|
|
118
|
+
and self.server.broadcaster is not None
|
|
119
|
+
)
|
|
120
|
+
|
|
121
|
+
if broadcaster_available:
|
|
122
|
+
self.connection_retries = 0 # Reset counter on success
|
|
123
|
+
return True
|
|
124
|
+
|
|
125
|
+
if attempt < self.max_retries - 1:
|
|
126
|
+
logger.info(
|
|
127
|
+
f"[DirectRelay] Broadcaster not ready, retry {attempt + 1}/{self.max_retries} "
|
|
128
|
+
f"in {retry_delay:.1f}s"
|
|
129
|
+
)
|
|
130
|
+
time.sleep(retry_delay)
|
|
131
|
+
retry_delay = min(retry_delay * 2, 30.0) # Exponential backoff, max 30s
|
|
132
|
+
else:
|
|
133
|
+
logger.error(
|
|
134
|
+
f"[DirectRelay] Broadcaster not available after {self.max_retries} attempts"
|
|
135
|
+
)
|
|
136
|
+
|
|
137
|
+
return False
|
|
70
138
|
|
|
71
139
|
def _handle_hook_event(self, event_type: str, data: Any):
|
|
72
140
|
"""Internal method to handle hook events and broadcast them.
|
|
@@ -76,9 +144,28 @@ class DirectSocketIORelay:
|
|
|
76
144
|
data: The event data
|
|
77
145
|
"""
|
|
78
146
|
try:
|
|
79
|
-
#
|
|
147
|
+
# Enhanced debug logging for troubleshooting
|
|
80
148
|
if self.debug:
|
|
81
149
|
logger.debug(f"[DirectRelay] Received event: {event_type}")
|
|
150
|
+
logger.debug(f"[DirectRelay] Event data type: {type(data).__name__}")
|
|
151
|
+
logger.debug(
|
|
152
|
+
f"[DirectRelay] Event data keys: {list(data.keys()) if isinstance(data, dict) else 'not-dict'}"
|
|
153
|
+
)
|
|
154
|
+
logger.debug(
|
|
155
|
+
f"[DirectRelay] Relay state - enabled: {self.enabled}, connected: {self.connected}"
|
|
156
|
+
)
|
|
157
|
+
logger.debug(
|
|
158
|
+
f"[DirectRelay] Server state - has_server: {self.server is not None}, has_broadcaster: {self.server and hasattr(self.server, 'broadcaster') and self.server.broadcaster is not None}"
|
|
159
|
+
)
|
|
160
|
+
|
|
161
|
+
# Always log reception of important events
|
|
162
|
+
if event_type in [
|
|
163
|
+
"hook.pre_tool",
|
|
164
|
+
"hook.post_tool",
|
|
165
|
+
"hook.user_prompt",
|
|
166
|
+
"hook.subagent_stop",
|
|
167
|
+
]:
|
|
168
|
+
logger.info(f"[DirectRelay] Processing important event: {event_type}")
|
|
82
169
|
|
|
83
170
|
# Only relay hook events
|
|
84
171
|
if event_type.startswith("hook."):
|
|
@@ -133,19 +220,71 @@ class DirectSocketIORelay:
|
|
|
133
220
|
|
|
134
221
|
# Use the full event_type (e.g., "hook.pre_tool") as the event name
|
|
135
222
|
# The normalizer handles dotted names and will extract type and subtype correctly
|
|
136
|
-
|
|
223
|
+
try:
|
|
224
|
+
self.server.broadcaster.broadcast_event(
|
|
225
|
+
event_type, broadcast_data
|
|
226
|
+
)
|
|
227
|
+
self.stats["events_relayed"] += 1
|
|
228
|
+
self.stats["last_relay_time"] = datetime.now(
|
|
229
|
+
timezone.utc
|
|
230
|
+
).isoformat()
|
|
137
231
|
|
|
138
|
-
|
|
139
|
-
|
|
232
|
+
# Reset retry counter on successful broadcast
|
|
233
|
+
if self.connection_retries > 0:
|
|
234
|
+
self.connection_retries = 0
|
|
235
|
+
self.connected = True
|
|
236
|
+
logger.info("[DirectRelay] Connection restored")
|
|
140
237
|
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
238
|
+
if self.debug:
|
|
239
|
+
logger.debug(
|
|
240
|
+
f"[DirectRelay] Broadcasted hook event: {event_type}"
|
|
241
|
+
)
|
|
242
|
+
except Exception as broadcast_error:
|
|
243
|
+
logger.error(
|
|
244
|
+
f"[DirectRelay] Broadcast failed for {event_type}: {broadcast_error}"
|
|
144
245
|
)
|
|
246
|
+
self.stats["events_failed"] += 1
|
|
247
|
+
|
|
248
|
+
# Try to reconnect if broadcast fails
|
|
249
|
+
if self.connection_retries < self.max_retries:
|
|
250
|
+
self.connection_retries += 1
|
|
251
|
+
self.connected = self._check_broadcaster_with_retry()
|
|
252
|
+
if self.connected:
|
|
253
|
+
# Retry the broadcast
|
|
254
|
+
try:
|
|
255
|
+
self.server.broadcaster.broadcast_event(
|
|
256
|
+
event_type, broadcast_data
|
|
257
|
+
)
|
|
258
|
+
self.stats["events_relayed"] += 1
|
|
259
|
+
self.stats[
|
|
260
|
+
"events_failed"
|
|
261
|
+
] -= 1 # Undo the failure count
|
|
262
|
+
logger.info(
|
|
263
|
+
f"[DirectRelay] Retry successful for {event_type}"
|
|
264
|
+
)
|
|
265
|
+
except Exception:
|
|
266
|
+
pass # Already counted as failed
|
|
145
267
|
else:
|
|
268
|
+
# Enhanced logging when broadcaster is not available
|
|
146
269
|
logger.warning(
|
|
147
270
|
f"[DirectRelay] Server broadcaster not available for {event_type}"
|
|
148
271
|
)
|
|
272
|
+
if self.server:
|
|
273
|
+
logger.warning(
|
|
274
|
+
"[DirectRelay] Server exists but broadcaster is None"
|
|
275
|
+
)
|
|
276
|
+
logger.warning(
|
|
277
|
+
f"[DirectRelay] Server type: {type(self.server).__name__}"
|
|
278
|
+
)
|
|
279
|
+
logger.warning(
|
|
280
|
+
f"[DirectRelay] Server has broadcaster attr: {hasattr(self.server, 'broadcaster')}"
|
|
281
|
+
)
|
|
282
|
+
if hasattr(self.server, "broadcaster"):
|
|
283
|
+
logger.warning(
|
|
284
|
+
f"[DirectRelay] Broadcaster value: {self.server.broadcaster}"
|
|
285
|
+
)
|
|
286
|
+
else:
|
|
287
|
+
logger.warning("[DirectRelay] Server is None")
|
|
149
288
|
self.stats["events_failed"] += 1
|
|
150
289
|
|
|
151
290
|
except Exception as e:
|
|
@@ -11,13 +11,15 @@ WHY pyee over alternatives:
|
|
|
11
11
|
import asyncio
|
|
12
12
|
import logging
|
|
13
13
|
import threading
|
|
14
|
-
from datetime import datetime
|
|
14
|
+
from datetime import datetime, timezone
|
|
15
15
|
from typing import Any, Callable, Dict, List, Optional, Set
|
|
16
16
|
|
|
17
17
|
from pyee.asyncio import AsyncIOEventEmitter
|
|
18
18
|
|
|
19
19
|
# Configure logger
|
|
20
|
-
|
|
20
|
+
from claude_mpm.core.logging_utils import get_logger
|
|
21
|
+
|
|
22
|
+
logger = get_logger(__name__)
|
|
21
23
|
|
|
22
24
|
|
|
23
25
|
class EventBus:
|
|
@@ -63,6 +65,12 @@ class EventBus:
|
|
|
63
65
|
self._event_history: List[Dict[str, Any]] = []
|
|
64
66
|
self._max_history_size = 100
|
|
65
67
|
|
|
68
|
+
# Track async handler tasks to prevent garbage collection
|
|
69
|
+
self._handler_tasks: Set[asyncio.Task] = set()
|
|
70
|
+
|
|
71
|
+
# Track handler wrappers for removal
|
|
72
|
+
self._handler_wrappers: Dict[tuple, Callable] = {}
|
|
73
|
+
|
|
66
74
|
logger.info("EventBus initialized")
|
|
67
75
|
|
|
68
76
|
@classmethod
|
|
@@ -188,13 +196,17 @@ class EventBus:
|
|
|
188
196
|
try:
|
|
189
197
|
# Call with event_type and data for wildcard handlers
|
|
190
198
|
if asyncio.iscoroutinefunction(handler):
|
|
191
|
-
# Schedule async handlers
|
|
199
|
+
# Schedule async handlers with tracking
|
|
192
200
|
try:
|
|
193
201
|
loop = asyncio.get_event_loop()
|
|
194
202
|
if loop.is_running():
|
|
195
|
-
asyncio.create_task(
|
|
203
|
+
task = asyncio.create_task(
|
|
196
204
|
handler(event_type, data)
|
|
197
205
|
)
|
|
206
|
+
self._handler_tasks.add(task)
|
|
207
|
+
task.add_done_callback(
|
|
208
|
+
self._handler_tasks.discard
|
|
209
|
+
)
|
|
198
210
|
else:
|
|
199
211
|
loop.run_until_complete(
|
|
200
212
|
handler(event_type, data)
|
|
@@ -210,7 +222,7 @@ class EventBus:
|
|
|
210
222
|
|
|
211
223
|
# Update stats
|
|
212
224
|
self._stats["events_published"] += 1
|
|
213
|
-
self._stats["last_event_time"] = datetime.now().isoformat()
|
|
225
|
+
self._stats["last_event_time"] = datetime.now(timezone.utc).isoformat()
|
|
214
226
|
|
|
215
227
|
if self._debug:
|
|
216
228
|
logger.debug(f"Published event: {event_type}")
|
|
@@ -257,8 +269,20 @@ class EventBus:
|
|
|
257
269
|
|
|
258
270
|
logger.debug(f"Registered wildcard handler for: {event_type}")
|
|
259
271
|
else:
|
|
260
|
-
#
|
|
261
|
-
|
|
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)
|
|
262
286
|
logger.debug(f"Registered handler for: {event_type}")
|
|
263
287
|
|
|
264
288
|
def once(self, event_type: str, handler: Callable) -> None:
|
|
@@ -278,7 +302,17 @@ class EventBus:
|
|
|
278
302
|
event_type: The event type
|
|
279
303
|
handler: The handler to remove
|
|
280
304
|
"""
|
|
281
|
-
|
|
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)
|
|
282
316
|
logger.debug(f"Removed handler for: {event_type}")
|
|
283
317
|
|
|
284
318
|
def remove_all_listeners(self, event_type: Optional[str] = None) -> None:
|
|
@@ -289,9 +323,17 @@ class EventBus:
|
|
|
289
323
|
"""
|
|
290
324
|
if event_type:
|
|
291
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]
|
|
292
332
|
logger.debug(f"Removed all handlers for: {event_type}")
|
|
293
333
|
else:
|
|
294
334
|
self._emitter.remove_all_listeners()
|
|
335
|
+
# Clean up all wrappers
|
|
336
|
+
self._handler_wrappers.clear()
|
|
295
337
|
logger.debug("Removed all event handlers")
|
|
296
338
|
|
|
297
339
|
def _record_event(self, event_type: str, data: Any) -> None:
|
|
@@ -302,7 +344,7 @@ class EventBus:
|
|
|
302
344
|
data: The event data
|
|
303
345
|
"""
|
|
304
346
|
event_record = {
|
|
305
|
-
"timestamp": datetime.now().isoformat(),
|
|
347
|
+
"timestamp": datetime.now(timezone.utc).isoformat(),
|
|
306
348
|
"type": event_type,
|
|
307
349
|
"data": data,
|
|
308
350
|
}
|
|
@@ -8,10 +8,10 @@ WHY separate relay component:
|
|
|
8
8
|
- Supports batching and retry logic in one place
|
|
9
9
|
"""
|
|
10
10
|
|
|
11
|
-
import logging
|
|
12
11
|
import os
|
|
12
|
+
import threading
|
|
13
13
|
import time
|
|
14
|
-
from datetime import datetime
|
|
14
|
+
from datetime import datetime, timezone
|
|
15
15
|
from typing import Any, Dict, Optional
|
|
16
16
|
|
|
17
17
|
# Socket.IO imports
|
|
@@ -25,10 +25,12 @@ except ImportError:
|
|
|
25
25
|
|
|
26
26
|
import contextlib
|
|
27
27
|
|
|
28
|
+
# Configure logger
|
|
29
|
+
from claude_mpm.core.logging_utils import get_logger
|
|
30
|
+
|
|
28
31
|
from .event_bus import EventBus
|
|
29
32
|
|
|
30
|
-
|
|
31
|
-
logger = logging.getLogger(__name__)
|
|
33
|
+
logger = get_logger(__name__)
|
|
32
34
|
|
|
33
35
|
|
|
34
36
|
class SocketIORelay:
|
|
@@ -151,7 +153,7 @@ class SocketIORelay:
|
|
|
151
153
|
# Verify connection is still alive
|
|
152
154
|
if self.client.connected:
|
|
153
155
|
return True
|
|
154
|
-
except:
|
|
156
|
+
except Exception:
|
|
155
157
|
pass
|
|
156
158
|
|
|
157
159
|
# Need to create or reconnect
|
|
@@ -187,7 +189,9 @@ class SocketIORelay:
|
|
|
187
189
|
"subtype": (
|
|
188
190
|
event_type.split(".", 1)[1] if "." in event_type else "generic"
|
|
189
191
|
),
|
|
190
|
-
"timestamp": data.get(
|
|
192
|
+
"timestamp": data.get(
|
|
193
|
+
"timestamp", datetime.now(timezone.utc).isoformat()
|
|
194
|
+
),
|
|
191
195
|
"data": data,
|
|
192
196
|
"source": "event_bus",
|
|
193
197
|
},
|
|
@@ -195,7 +199,7 @@ class SocketIORelay:
|
|
|
195
199
|
|
|
196
200
|
# Update statistics
|
|
197
201
|
self.stats["events_relayed"] += 1
|
|
198
|
-
self.stats["last_relay_time"] = datetime.now().isoformat()
|
|
202
|
+
self.stats["last_relay_time"] = datetime.now(timezone.utc).isoformat()
|
|
199
203
|
|
|
200
204
|
if self.debug:
|
|
201
205
|
logger.debug(f"Relayed event to Socket.IO: {event_type}")
|
|
@@ -268,11 +272,15 @@ class SocketIORelay:
|
|
|
268
272
|
|
|
269
273
|
# Global relay instance
|
|
270
274
|
_relay_instance: Optional[SocketIORelay] = None
|
|
275
|
+
_relay_lock = threading.Lock()
|
|
271
276
|
|
|
272
277
|
|
|
273
278
|
def get_relay(port: Optional[int] = None) -> SocketIORelay:
|
|
274
279
|
"""Get or create the global SocketIO relay instance.
|
|
275
280
|
|
|
281
|
+
Thread-safe implementation using double-checked locking pattern to
|
|
282
|
+
prevent race conditions during concurrent initialization.
|
|
283
|
+
|
|
276
284
|
Args:
|
|
277
285
|
port: Optional port number
|
|
278
286
|
|
|
@@ -280,9 +288,16 @@ def get_relay(port: Optional[int] = None) -> SocketIORelay:
|
|
|
280
288
|
SocketIORelay: The relay instance
|
|
281
289
|
"""
|
|
282
290
|
global _relay_instance
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
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
|
|
286
301
|
|
|
287
302
|
|
|
288
303
|
def start_relay(port: Optional[int] = None) -> SocketIORelay:
|
|
@@ -300,8 +315,12 @@ def start_relay(port: Optional[int] = None) -> SocketIORelay:
|
|
|
300
315
|
|
|
301
316
|
|
|
302
317
|
def stop_relay() -> None:
|
|
303
|
-
"""Stop the global SocketIO relay.
|
|
318
|
+
"""Stop the global SocketIO relay.
|
|
319
|
+
|
|
320
|
+
Thread-safe implementation ensures proper cleanup.
|
|
321
|
+
"""
|
|
304
322
|
global _relay_instance
|
|
305
|
-
|
|
306
|
-
_relay_instance
|
|
307
|
-
|
|
323
|
+
with _relay_lock:
|
|
324
|
+
if _relay_instance:
|
|
325
|
+
_relay_instance.stop()
|
|
326
|
+
_relay_instance = None
|
|
@@ -6,7 +6,7 @@ Handles events that failed processing in other consumers.
|
|
|
6
6
|
"""
|
|
7
7
|
|
|
8
8
|
import json
|
|
9
|
-
from datetime import datetime
|
|
9
|
+
from datetime import datetime, timezone
|
|
10
10
|
from pathlib import Path
|
|
11
11
|
from typing import Any, Dict, List, Optional
|
|
12
12
|
|
|
@@ -109,7 +109,7 @@ class DeadLetterConsumer(IEventConsumer):
|
|
|
109
109
|
self._rotate_file()
|
|
110
110
|
|
|
111
111
|
# Write to file
|
|
112
|
-
with
|
|
112
|
+
with self._current_file.open("a") as f:
|
|
113
113
|
f.write(event_json)
|
|
114
114
|
|
|
115
115
|
# Update metrics
|
|
@@ -165,7 +165,7 @@ class DeadLetterConsumer(IEventConsumer):
|
|
|
165
165
|
# Find files in time range
|
|
166
166
|
for file_path in sorted(self.output_dir.glob("dead-letter-*.jsonl")):
|
|
167
167
|
try:
|
|
168
|
-
with open(
|
|
168
|
+
with file_path.open() as f:
|
|
169
169
|
for line in f:
|
|
170
170
|
event_data = json.loads(line)
|
|
171
171
|
|
|
@@ -284,7 +284,7 @@ class DeadLetterConsumer(IEventConsumer):
|
|
|
284
284
|
|
|
285
285
|
def _rotate_file(self) -> None:
|
|
286
286
|
"""Rotate to a new output file."""
|
|
287
|
-
timestamp = datetime.now().strftime("%Y%m%d-%H%M%S")
|
|
287
|
+
timestamp = datetime.now(timezone.utc).strftime("%Y%m%d-%H%M%S")
|
|
288
288
|
self._current_file = self.output_dir / f"dead-letter-{timestamp}.jsonl"
|
|
289
289
|
self._current_file_size = 0
|
|
290
290
|
self._metrics["files_created"] += 1
|
|
@@ -293,7 +293,9 @@ class DeadLetterConsumer(IEventConsumer):
|
|
|
293
293
|
|
|
294
294
|
async def _cleanup_old_files(self) -> None:
|
|
295
295
|
"""Remove files older than retention period."""
|
|
296
|
-
cutoff_time = datetime.now().timestamp() - (
|
|
296
|
+
cutoff_time = datetime.now(timezone.utc).timestamp() - (
|
|
297
|
+
self.retention_days * 86400
|
|
298
|
+
)
|
|
297
299
|
|
|
298
300
|
for file_path in self.output_dir.glob("dead-letter-*.jsonl"):
|
|
299
301
|
try:
|
|
@@ -12,7 +12,7 @@ import time
|
|
|
12
12
|
import uuid
|
|
13
13
|
from collections import defaultdict, deque
|
|
14
14
|
from dataclasses import dataclass, field
|
|
15
|
-
from datetime import datetime
|
|
15
|
+
from datetime import datetime, timezone
|
|
16
16
|
from enum import Enum
|
|
17
17
|
from typing import Any, Deque, Dict, List, Optional, Set
|
|
18
18
|
|
|
@@ -225,7 +225,7 @@ class EventBus(IEventBus):
|
|
|
225
225
|
|
|
226
226
|
# Add metadata
|
|
227
227
|
if event.metadata:
|
|
228
|
-
event.metadata.published_at = datetime.now()
|
|
228
|
+
event.metadata.published_at = datetime.now(timezone.utc)
|
|
229
229
|
|
|
230
230
|
# Queue event
|
|
231
231
|
self._event_queues[event.priority].append(event)
|
|
@@ -353,7 +353,7 @@ class EventBus(IEventBus):
|
|
|
353
353
|
# Update metrics
|
|
354
354
|
if events_processed > 0:
|
|
355
355
|
self._metrics["events_processed"] += events_processed
|
|
356
|
-
self._metrics["last_event_time"] = datetime.now()
|
|
356
|
+
self._metrics["last_event_time"] = datetime.now(timezone.utc)
|
|
357
357
|
self._metrics["queue_size"] = sum(
|
|
358
358
|
len(q) for q in self._event_queues.values()
|
|
359
359
|
)
|
|
@@ -412,9 +412,8 @@ class EventBus(IEventBus):
|
|
|
412
412
|
"""
|
|
413
413
|
try:
|
|
414
414
|
# Apply filter if configured
|
|
415
|
-
if consumer.config.filter_func:
|
|
416
|
-
|
|
417
|
-
return
|
|
415
|
+
if consumer.config.filter_func and not consumer.config.filter_func(event):
|
|
416
|
+
return
|
|
418
417
|
|
|
419
418
|
# Apply transformation if configured
|
|
420
419
|
if consumer.config.transform_func:
|
|
@@ -7,7 +7,7 @@ This replaces direct Socket.IO emission in the hook handler.
|
|
|
7
7
|
"""
|
|
8
8
|
|
|
9
9
|
import uuid
|
|
10
|
-
from datetime import datetime
|
|
10
|
+
from datetime import datetime, timezone
|
|
11
11
|
from typing import Any, Dict, List, Optional
|
|
12
12
|
|
|
13
13
|
from claude_mpm.core.logging_config import get_logger
|
|
@@ -96,7 +96,7 @@ class HookEventProducer(IEventProducer):
|
|
|
96
96
|
id=str(uuid.uuid4()),
|
|
97
97
|
topic="hook.response",
|
|
98
98
|
type="AssistantResponse",
|
|
99
|
-
timestamp=datetime.now(),
|
|
99
|
+
timestamp=datetime.now(timezone.utc),
|
|
100
100
|
source=self.source_name,
|
|
101
101
|
data=response_data,
|
|
102
102
|
correlation_id=correlation_id,
|
|
@@ -128,7 +128,7 @@ class HookEventProducer(IEventProducer):
|
|
|
128
128
|
id=str(uuid.uuid4()),
|
|
129
129
|
topic="hook.tool",
|
|
130
130
|
type="ToolUse",
|
|
131
|
-
timestamp=datetime.now(),
|
|
131
|
+
timestamp=datetime.now(timezone.utc),
|
|
132
132
|
source=self.source_name,
|
|
133
133
|
data={
|
|
134
134
|
"tool": tool_name,
|
|
@@ -164,7 +164,7 @@ class HookEventProducer(IEventProducer):
|
|
|
164
164
|
id=str(uuid.uuid4()),
|
|
165
165
|
topic="hook.error",
|
|
166
166
|
type="Error",
|
|
167
|
-
timestamp=datetime.now(),
|
|
167
|
+
timestamp=datetime.now(timezone.utc),
|
|
168
168
|
source=self.source_name,
|
|
169
169
|
data={
|
|
170
170
|
"error_type": error_type,
|
|
@@ -200,7 +200,7 @@ class HookEventProducer(IEventProducer):
|
|
|
200
200
|
id=str(uuid.uuid4()),
|
|
201
201
|
topic=f"hook.subagent.{event_type.lower()}",
|
|
202
202
|
type=f"Subagent{event_type}",
|
|
203
|
-
timestamp=datetime.now(),
|
|
203
|
+
timestamp=datetime.now(timezone.utc),
|
|
204
204
|
source=self.source_name,
|
|
205
205
|
data={
|
|
206
206
|
"subagent": subagent_name,
|
|
@@ -255,7 +255,7 @@ class HookEventProducer(IEventProducer):
|
|
|
255
255
|
id=str(uuid.uuid4()),
|
|
256
256
|
topic=topic,
|
|
257
257
|
type=hook_type,
|
|
258
|
-
timestamp=datetime.now(),
|
|
258
|
+
timestamp=datetime.now(timezone.utc),
|
|
259
259
|
source=self.source_name,
|
|
260
260
|
data=hook_data,
|
|
261
261
|
correlation_id=correlation_id,
|
|
@@ -6,7 +6,7 @@ Publishes system-level events to the event bus.
|
|
|
6
6
|
"""
|
|
7
7
|
|
|
8
8
|
import uuid
|
|
9
|
-
from datetime import datetime
|
|
9
|
+
from datetime import datetime, timezone
|
|
10
10
|
from typing import Any, Dict, List, Optional
|
|
11
11
|
|
|
12
12
|
from claude_mpm.core.logging_config import get_logger
|
|
@@ -100,7 +100,7 @@ class SystemEventProducer(IEventProducer):
|
|
|
100
100
|
id=str(uuid.uuid4()),
|
|
101
101
|
topic="system.lifecycle.startup",
|
|
102
102
|
type="ServiceStartup",
|
|
103
|
-
timestamp=datetime.now(),
|
|
103
|
+
timestamp=datetime.now(timezone.utc),
|
|
104
104
|
source=self.source_name,
|
|
105
105
|
data={
|
|
106
106
|
"service": service_name,
|
|
@@ -133,7 +133,7 @@ class SystemEventProducer(IEventProducer):
|
|
|
133
133
|
id=str(uuid.uuid4()),
|
|
134
134
|
topic="system.lifecycle.shutdown",
|
|
135
135
|
type="ServiceShutdown",
|
|
136
|
-
timestamp=datetime.now(),
|
|
136
|
+
timestamp=datetime.now(timezone.utc),
|
|
137
137
|
source=self.source_name,
|
|
138
138
|
data={
|
|
139
139
|
"service": service_name,
|
|
@@ -168,7 +168,7 @@ class SystemEventProducer(IEventProducer):
|
|
|
168
168
|
id=str(uuid.uuid4()),
|
|
169
169
|
topic="system.health",
|
|
170
170
|
type="HealthStatus",
|
|
171
|
-
timestamp=datetime.now(),
|
|
171
|
+
timestamp=datetime.now(timezone.utc),
|
|
172
172
|
source=self.source_name,
|
|
173
173
|
data={
|
|
174
174
|
"service": service_name,
|
|
@@ -206,7 +206,7 @@ class SystemEventProducer(IEventProducer):
|
|
|
206
206
|
id=str(uuid.uuid4()),
|
|
207
207
|
topic="system.config",
|
|
208
208
|
type="ConfigChange",
|
|
209
|
-
timestamp=datetime.now(),
|
|
209
|
+
timestamp=datetime.now(timezone.utc),
|
|
210
210
|
source=self.source_name,
|
|
211
211
|
data={
|
|
212
212
|
"service": service_name,
|
|
@@ -238,7 +238,7 @@ class SystemEventProducer(IEventProducer):
|
|
|
238
238
|
id=str(uuid.uuid4()),
|
|
239
239
|
topic="system.performance",
|
|
240
240
|
type="PerformanceMetrics",
|
|
241
|
-
timestamp=datetime.now(),
|
|
241
|
+
timestamp=datetime.now(timezone.utc),
|
|
242
242
|
source=self.source_name,
|
|
243
243
|
data={
|
|
244
244
|
"service": service_name,
|
|
@@ -274,7 +274,7 @@ class SystemEventProducer(IEventProducer):
|
|
|
274
274
|
id=str(uuid.uuid4()),
|
|
275
275
|
topic="system.error",
|
|
276
276
|
type="SystemError",
|
|
277
|
-
timestamp=datetime.now(),
|
|
277
|
+
timestamp=datetime.now(timezone.utc),
|
|
278
278
|
source=self.source_name,
|
|
279
279
|
data={
|
|
280
280
|
"service": service_name,
|
|
@@ -311,7 +311,7 @@ class SystemEventProducer(IEventProducer):
|
|
|
311
311
|
id=str(uuid.uuid4()),
|
|
312
312
|
topic="system.warning",
|
|
313
313
|
type="SystemWarning",
|
|
314
|
-
timestamp=datetime.now(),
|
|
314
|
+
timestamp=datetime.now(timezone.utc),
|
|
315
315
|
source=self.source_name,
|
|
316
316
|
data={
|
|
317
317
|
"service": service_name,
|