claude-mpm 4.1.26__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 +420 -158
- 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/OUTPUT_STYLE.md +299 -29
- claude_mpm/agents/PM_INSTRUCTIONS.md +1159 -0
- claude_mpm/agents/WORKFLOW.md +355 -191
- claude_mpm/agents/agent_loader.py +40 -10
- claude_mpm/agents/agent_loader_integration.py +3 -2
- 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/README.md +465 -0
- claude_mpm/agents/templates/agent-manager.json +7 -4
- claude_mpm/agents/templates/{agentic_coder_optimizer.json → agentic-coder-optimizer.json} +33 -7
- 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 +10 -4
- 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 +43 -9
- 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_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 +14 -4
- 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 +25 -5
- claude_mpm/agents/templates/react_engineer.json +239 -0
- claude_mpm/agents/templates/refactoring_engineer.json +15 -5
- claude_mpm/agents/templates/research.json +46 -21
- 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 +167 -21
- claude_mpm/agents/templates/web_ui.json +18 -5
- claude_mpm/cli/__init__.py +38 -378
- claude_mpm/cli/commands/__init__.py +2 -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 +15 -10
- claude_mpm/cli/commands/analyze_code.py +8 -4
- 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 +469 -1064
- 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 +50 -52
- claude_mpm/cli/commands/debug.py +7 -7
- 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 +160 -70
- 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 +114 -4
- 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/auto_configure_parser.py +245 -0
- claude_mpm/cli/parsers/base_parser.py +143 -3
- claude_mpm/cli/parsers/configure_parser.py +11 -15
- 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 +179 -9
- 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/mpm-agents-detect.md +168 -0
- claude_mpm/commands/mpm-agents-recommend.md +214 -0
- claude_mpm/commands/mpm-agents.md +118 -8
- claude_mpm/commands/mpm-auto-configure.md +269 -0
- claude_mpm/commands/mpm-config.md +137 -14
- claude_mpm/commands/mpm-help.md +285 -5
- claude_mpm/commands/mpm-init.md +374 -15
- 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 +71 -9
- claude_mpm/commands/mpm-tickets.md +56 -7
- claude_mpm/commands/mpm-version.md +113 -0
- claude_mpm/commands/mpm.md +2 -0
- claude_mpm/config/agent_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 +3 -3
- claude_mpm/constants.py +15 -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 +85 -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 +321 -1631
- claude_mpm/core/hook_manager.py +8 -6
- claude_mpm/core/injectable_service.py +11 -8
- claude_mpm/core/instruction_reinforcement_hook.py +4 -3
- 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 +92 -23
- 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 +18 -12
- 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 +115 -11
- claude_mpm/core/unified_config.py +6 -6
- claude_mpm/core/unified_paths.py +23 -20
- claude_mpm/dashboard/analysis_runner.py +4 -4
- 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 +1 -1
- 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 +1 -1
- claude_mpm/dashboard/static/built/components/code-viewer.js +1 -1
- 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 +1 -1
- 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/dashboard.css +588 -6
- claude_mpm/dashboard/static/dist/assets/events.DjpNxWNo.css +1 -0
- claude_mpm/dashboard/static/dist/components/activity-tree.js +1 -1
- claude_mpm/dashboard/static/dist/components/agent-inference.js +1 -1
- claude_mpm/dashboard/static/dist/components/code-tree.js +1 -1
- claude_mpm/dashboard/static/dist/components/code-viewer.js +1 -1
- 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 +1 -1
- 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 +3 -17
- 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 +8 -0
- 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 -0
- claude_mpm/dashboard/static/js/components/event-viewer.js +39 -2
- 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 +26 -0
- claude_mpm/dashboard/static/js/components/session-manager.js +7 -7
- claude_mpm/dashboard/static/js/components/socket-manager.js +4 -0
- claude_mpm/dashboard/static/js/components/ui-state-manager.js +356 -41
- claude_mpm/dashboard/static/js/components/unified-data-viewer.js +455 -23
- claude_mpm/dashboard/static/js/components/working-directory.js +44 -9
- claude_mpm/dashboard/static/js/dashboard.js +245 -132
- 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 +49 -22
- 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 +112 -109
- 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 +29 -22
- claude_mpm/hooks/claude_hooks/installer.py +67 -22
- 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 +62 -64
- 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/scripts/claude-hook-handler.sh +33 -7
- 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 +159 -512
- 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_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 +4 -4
- claude_mpm/services/agents/deployment/agent_state_service.py +2 -2
- claude_mpm/services/agents/deployment/agent_template_builder.py +715 -47
- claude_mpm/services/agents/deployment/agent_validator.py +31 -7
- claude_mpm/services/agents/deployment/agent_version_manager.py +8 -5
- 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 +6 -4
- 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 +5 -0
- claude_mpm/services/cli/agent_listing_service.py +5 -5
- claude_mpm/services/cli/agent_validation_service.py +3 -1
- 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 -10
- claude_mpm/services/cli/unified_dashboard_manager.py +439 -0
- claude_mpm/services/command_deployment_service.py +9 -7
- 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/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 +36 -14
- 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 +20 -19
- 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 +8 -4
- 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 +1 -1
- 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/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 +5 -5
- claude_mpm/services/project/archive_manager.py +1045 -0
- claude_mpm/services/project/dependency_analyzer.py +4 -4
- 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/metrics_collector.py +4 -4
- 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 +10 -6
- claude_mpm/services/socketio/handlers/__init__.py +5 -2
- claude_mpm/services/socketio/handlers/base.py +2 -2
- claude_mpm/services/socketio/handlers/code_analysis.py +90 -27
- claude_mpm/services/socketio/handlers/connection.py +21 -40
- claude_mpm/services/socketio/handlers/connection_handler.py +13 -10
- 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 -2
- 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 +2 -2
- claude_mpm/services/socketio/server/core.py +141 -4
- claude_mpm/services/socketio/server/eventbus_integration.py +20 -14
- claude_mpm/services/socketio/server/main.py +23 -21
- 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/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/__main__.py +1 -1
- 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 +6 -6
- claude_mpm/tools/code_tree_events.py +14 -10
- claude_mpm/tools/socketio_debug.py +11 -11
- 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.26.dist-info → claude_mpm-4.24.0.dist-info}/entry_points.txt +1 -0
- claude_mpm/agents/INSTRUCTIONS.md +0 -261
- claude_mpm/agents/templates/agent-manager.md +0 -619
- claude_mpm/cli/commands/configure_tui.py +0 -1927
- claude_mpm/cli/commands/mpm_init.py +0 -594
- claude_mpm/cli/commands/socketio_monitor.py +0 -233
- claude_mpm/dashboard/static/css/code-tree.css +0 -1408
- claude_mpm/dashboard/static/js/components/code-tree.js +0 -3220
- claude_mpm/dashboard/static/js/components/code-viewer.js +0 -480
- 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_daemon_wrapper.py +0 -78
- 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 -423
- claude_mpm/services/cli/socketio_manager.py +0 -537
- 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/tools/code_tree_analyzer.py +0 -1693
- claude_mpm-4.1.26.dist-info/METADATA +0 -332
- claude_mpm-4.1.26.dist-info/RECORD +0 -606
- {claude_mpm-4.1.26.dist-info → claude_mpm-4.24.0.dist-info}/WHEEL +0 -0
- {claude_mpm-4.1.26.dist-info → claude_mpm-4.24.0.dist-info}/licenses/LICENSE +0 -0
- {claude_mpm-4.1.26.dist-info → claude_mpm-4.24.0.dist-info}/top_level.txt +0 -0
|
@@ -1,15 +1,24 @@
|
|
|
1
1
|
"""Connection management service for Claude hook handler.
|
|
2
2
|
|
|
3
|
+
This service implements the SINGLE-PATH EVENT EMISSION ARCHITECTURE
|
|
4
|
+
to eliminate duplicate events and improve performance.
|
|
5
|
+
|
|
6
|
+
ARCHITECTURE: Hook → ConnectionManager → Direct Socket.IO → Dashboard
|
|
7
|
+
↓ (fallback only)
|
|
8
|
+
HTTP POST → Monitor → Dashboard
|
|
9
|
+
|
|
10
|
+
CRITICAL: This service must maintain the single emission path principle.
|
|
11
|
+
See docs/developer/EVENT_EMISSION_ARCHITECTURE.md for full documentation.
|
|
12
|
+
|
|
3
13
|
This service manages:
|
|
4
14
|
- SocketIO connection pool initialization
|
|
5
|
-
-
|
|
6
|
-
- Event emission through both channels
|
|
15
|
+
- Direct event emission with HTTP fallback
|
|
7
16
|
- Connection cleanup
|
|
8
17
|
"""
|
|
9
18
|
|
|
10
19
|
import os
|
|
11
20
|
import sys
|
|
12
|
-
from datetime import datetime
|
|
21
|
+
from datetime import datetime, timezone
|
|
13
22
|
|
|
14
23
|
# Debug mode is enabled by default for better visibility into hook processing
|
|
15
24
|
DEBUG = os.environ.get("CLAUDE_MPM_HOOK_DEBUG", "true").lower() != "false"
|
|
@@ -53,7 +62,7 @@ except ImportError:
|
|
|
53
62
|
"type": event_data.get("type", "unknown"),
|
|
54
63
|
"subtype": event_data.get("subtype", "generic"),
|
|
55
64
|
"timestamp": event_data.get(
|
|
56
|
-
"timestamp", datetime.now().isoformat()
|
|
65
|
+
"timestamp", datetime.now(timezone.utc).isoformat()
|
|
57
66
|
),
|
|
58
67
|
"data": event_data.get("data", event_data),
|
|
59
68
|
}
|
|
@@ -61,14 +70,8 @@ except ImportError:
|
|
|
61
70
|
)
|
|
62
71
|
|
|
63
72
|
|
|
64
|
-
#
|
|
65
|
-
|
|
66
|
-
from claude_mpm.services.event_bus import EventBus
|
|
67
|
-
|
|
68
|
-
EVENTBUS_AVAILABLE = True
|
|
69
|
-
except ImportError:
|
|
70
|
-
EVENTBUS_AVAILABLE = False
|
|
71
|
-
EventBus = None
|
|
73
|
+
# EventBus removed - using direct Socket.IO calls with HTTP fallback
|
|
74
|
+
# This eliminates duplicate events and improves performance
|
|
72
75
|
|
|
73
76
|
|
|
74
77
|
class ConnectionManagerService:
|
|
@@ -84,9 +87,7 @@ class ConnectionManagerService:
|
|
|
84
87
|
self.connection_pool = None
|
|
85
88
|
self._initialize_socketio_pool()
|
|
86
89
|
|
|
87
|
-
#
|
|
88
|
-
self.event_bus = None
|
|
89
|
-
self._initialize_eventbus()
|
|
90
|
+
# EventBus removed - using direct Socket.IO with HTTP fallback only
|
|
90
91
|
|
|
91
92
|
def _initialize_socketio_pool(self):
|
|
92
93
|
"""Initialize the SocketIO connection pool."""
|
|
@@ -102,31 +103,23 @@ class ConnectionManagerService:
|
|
|
102
103
|
)
|
|
103
104
|
self.connection_pool = None
|
|
104
105
|
|
|
105
|
-
def _initialize_eventbus(self):
|
|
106
|
-
"""Initialize the EventBus for in-process distribution."""
|
|
107
|
-
if EVENTBUS_AVAILABLE:
|
|
108
|
-
try:
|
|
109
|
-
self.event_bus = EventBus.get_instance()
|
|
110
|
-
if DEBUG:
|
|
111
|
-
print("✅ EventBus initialized for hook handler", file=sys.stderr)
|
|
112
|
-
except Exception as e:
|
|
113
|
-
if DEBUG:
|
|
114
|
-
print(f"⚠️ Failed to initialize EventBus: {e}", file=sys.stderr)
|
|
115
|
-
self.event_bus = None
|
|
116
|
-
|
|
117
106
|
def emit_event(self, namespace: str, event: str, data: dict):
|
|
118
|
-
"""Emit event through
|
|
107
|
+
"""Emit event through direct Socket.IO connection with HTTP fallback.
|
|
108
|
+
|
|
109
|
+
🚨 CRITICAL: This method implements the SINGLE-PATH EMISSION ARCHITECTURE.
|
|
110
|
+
DO NOT add additional emission paths (EventBus, etc.) as this creates duplicates.
|
|
111
|
+
See docs/developer/EVENT_EMISSION_ARCHITECTURE.md for details.
|
|
119
112
|
|
|
120
|
-
|
|
121
|
-
-
|
|
122
|
-
-
|
|
123
|
-
-
|
|
113
|
+
High-performance single-path approach:
|
|
114
|
+
- Primary: Direct Socket.IO connection for ultra-low latency
|
|
115
|
+
- Fallback: HTTP POST for reliability when direct connection fails
|
|
116
|
+
- Eliminates duplicate events from multiple emission paths
|
|
124
117
|
"""
|
|
125
118
|
# Create event data for normalization
|
|
126
119
|
raw_event = {
|
|
127
120
|
"type": "hook",
|
|
128
121
|
"subtype": event, # e.g., "user_prompt", "pre_tool", "subagent_stop"
|
|
129
|
-
"timestamp": datetime.now().isoformat(),
|
|
122
|
+
"timestamp": datetime.now(timezone.utc).isoformat(),
|
|
130
123
|
"data": data,
|
|
131
124
|
"source": "claude_hooks", # Identify the source
|
|
132
125
|
"session_id": data.get("sessionId"), # Include session if available
|
|
@@ -152,50 +145,55 @@ class ConnectionManagerService:
|
|
|
152
145
|
file=sys.stderr,
|
|
153
146
|
)
|
|
154
147
|
|
|
155
|
-
#
|
|
156
|
-
# This
|
|
148
|
+
# Emit through direct Socket.IO connection pool (primary path)
|
|
149
|
+
# This provides ultra-low latency direct async communication
|
|
157
150
|
if self.connection_pool:
|
|
158
151
|
try:
|
|
159
152
|
# Emit to Socket.IO server directly
|
|
160
153
|
self.connection_pool.emit("claude_event", claude_event_data)
|
|
161
154
|
if DEBUG:
|
|
162
155
|
print(f"✅ Emitted via connection pool: {event}", file=sys.stderr)
|
|
156
|
+
return # Success - no need for fallback
|
|
163
157
|
except Exception as e:
|
|
164
158
|
if DEBUG:
|
|
165
159
|
print(f"⚠️ Failed to emit via connection pool: {e}", file=sys.stderr)
|
|
166
160
|
|
|
167
|
-
#
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
# Publish to EventBus with topic format: hook.{event}
|
|
171
|
-
topic = f"hook.{event}"
|
|
172
|
-
self.event_bus.publish(topic, claude_event_data)
|
|
161
|
+
# HTTP fallback for cross-process communication (when direct calls fail)
|
|
162
|
+
# This replaces EventBus for reliability without the complexity
|
|
163
|
+
self._try_http_fallback(claude_event_data)
|
|
173
164
|
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
)
|
|
189
|
-
except Exception as e:
|
|
165
|
+
def _try_http_fallback(self, claude_event_data: dict):
|
|
166
|
+
"""HTTP fallback when direct Socket.IO connection fails."""
|
|
167
|
+
try:
|
|
168
|
+
import requests
|
|
169
|
+
|
|
170
|
+
# Send to monitor server HTTP API
|
|
171
|
+
response = requests.post(
|
|
172
|
+
"http://localhost:8765/api/events",
|
|
173
|
+
json=claude_event_data,
|
|
174
|
+
timeout=2.0,
|
|
175
|
+
headers={"Content-Type": "application/json"},
|
|
176
|
+
)
|
|
177
|
+
|
|
178
|
+
if response.status_code in [200, 204]:
|
|
190
179
|
if DEBUG:
|
|
191
|
-
print(
|
|
192
|
-
|
|
180
|
+
print("✅ HTTP fallback successful", file=sys.stderr)
|
|
181
|
+
elif DEBUG:
|
|
182
|
+
print(
|
|
183
|
+
f"⚠️ HTTP fallback failed: {response.status_code}",
|
|
184
|
+
file=sys.stderr,
|
|
185
|
+
)
|
|
193
186
|
|
|
194
|
-
|
|
187
|
+
except Exception as e:
|
|
188
|
+
if DEBUG:
|
|
189
|
+
print(f"⚠️ HTTP fallback error: {e}", file=sys.stderr)
|
|
195
190
|
|
|
196
|
-
# Warn if
|
|
197
|
-
if not self.connection_pool and
|
|
198
|
-
print(
|
|
191
|
+
# Warn if no emission method is available
|
|
192
|
+
if not self.connection_pool and DEBUG:
|
|
193
|
+
print(
|
|
194
|
+
f"⚠️ No event emission method available for: {claude_event_data.get('event', 'unknown')}",
|
|
195
|
+
file=sys.stderr,
|
|
196
|
+
)
|
|
199
197
|
|
|
200
198
|
def cleanup(self):
|
|
201
199
|
"""Cleanup connections on service destruction."""
|
|
@@ -203,5 +201,5 @@ class ConnectionManagerService:
|
|
|
203
201
|
if self.connection_pool:
|
|
204
202
|
try:
|
|
205
203
|
self.connection_pool.cleanup()
|
|
206
|
-
except:
|
|
204
|
+
except Exception:
|
|
207
205
|
pass # Ignore cleanup errors during destruction
|
|
@@ -2,17 +2,18 @@
|
|
|
2
2
|
|
|
3
3
|
This service manages:
|
|
4
4
|
- HTTP POST event emission for ephemeral hook processes
|
|
5
|
-
- EventBus
|
|
6
|
-
- Event emission through both channels
|
|
5
|
+
- Direct event emission without EventBus complexity
|
|
7
6
|
|
|
8
7
|
DESIGN DECISION: Use stateless HTTP POST instead of persistent SocketIO
|
|
9
8
|
connections because hook handlers are ephemeral processes (< 1 second lifetime).
|
|
10
9
|
This eliminates disconnection issues and matches the process lifecycle.
|
|
11
10
|
"""
|
|
12
11
|
|
|
12
|
+
import asyncio
|
|
13
13
|
import os
|
|
14
14
|
import sys
|
|
15
|
-
from
|
|
15
|
+
from concurrent.futures import ThreadPoolExecutor
|
|
16
|
+
from datetime import datetime, timezone
|
|
16
17
|
|
|
17
18
|
# Debug mode is enabled by default for better visibility into hook processing
|
|
18
19
|
DEBUG = os.environ.get("CLAUDE_MPM_HOOK_DEBUG", "true").lower() != "false"
|
|
@@ -26,6 +27,9 @@ except ImportError:
|
|
|
26
27
|
REQUESTS_AVAILABLE = False
|
|
27
28
|
requests = None
|
|
28
29
|
|
|
30
|
+
# Import high-performance event emitter - lazy loaded in _async_emit()
|
|
31
|
+
# to reduce hook handler initialization time by ~85% (792ms -> minimal)
|
|
32
|
+
|
|
29
33
|
# Import EventNormalizer for consistent event formatting
|
|
30
34
|
try:
|
|
31
35
|
from claude_mpm.services.socketio.event_normalizer import EventNormalizer
|
|
@@ -43,7 +47,7 @@ except ImportError:
|
|
|
43
47
|
"type": event_data.get("type", "unknown"),
|
|
44
48
|
"subtype": event_data.get("subtype", "generic"),
|
|
45
49
|
"timestamp": event_data.get(
|
|
46
|
-
"timestamp", datetime.now().isoformat()
|
|
50
|
+
"timestamp", datetime.now(timezone.utc).isoformat()
|
|
47
51
|
),
|
|
48
52
|
"data": event_data.get("data", event_data),
|
|
49
53
|
}
|
|
@@ -51,14 +55,8 @@ except ImportError:
|
|
|
51
55
|
)
|
|
52
56
|
|
|
53
57
|
|
|
54
|
-
#
|
|
55
|
-
|
|
56
|
-
from claude_mpm.services.event_bus import EventBus
|
|
57
|
-
|
|
58
|
-
EVENTBUS_AVAILABLE = True
|
|
59
|
-
except ImportError:
|
|
60
|
-
EVENTBUS_AVAILABLE = False
|
|
61
|
-
EventBus = None
|
|
58
|
+
# EventBus removed - using direct HTTP POST only
|
|
59
|
+
# This eliminates duplicate events and simplifies the architecture
|
|
62
60
|
|
|
63
61
|
|
|
64
62
|
class ConnectionManagerService:
|
|
@@ -74,45 +72,41 @@ class ConnectionManagerService:
|
|
|
74
72
|
self.server_port = int(os.environ.get("CLAUDE_MPM_SERVER_PORT", "8765"))
|
|
75
73
|
self.http_endpoint = f"http://{self.server_host}:{self.server_port}/api/events"
|
|
76
74
|
|
|
77
|
-
#
|
|
78
|
-
self.event_bus = None
|
|
79
|
-
self._initialize_eventbus()
|
|
75
|
+
# EventBus removed - using direct HTTP POST only
|
|
80
76
|
|
|
81
77
|
# For backward compatibility with tests
|
|
82
78
|
self.connection_pool = None # No longer used
|
|
83
79
|
|
|
80
|
+
# Track async emit tasks to prevent garbage collection
|
|
81
|
+
self._emit_tasks: set = set()
|
|
82
|
+
|
|
83
|
+
# Thread pool for non-blocking HTTP requests
|
|
84
|
+
# WHY: Prevents HTTP POST from blocking hook processing (2s timeout → 0ms blocking)
|
|
85
|
+
# max_workers=2: Sufficient for low-frequency HTTP fallback events
|
|
86
|
+
self._http_executor = ThreadPoolExecutor(
|
|
87
|
+
max_workers=2, thread_name_prefix="http-emit"
|
|
88
|
+
)
|
|
89
|
+
|
|
84
90
|
if DEBUG:
|
|
85
91
|
print(
|
|
86
92
|
f"✅ HTTP connection manager initialized - endpoint: {self.http_endpoint}",
|
|
87
93
|
file=sys.stderr,
|
|
88
94
|
)
|
|
89
95
|
|
|
90
|
-
def _initialize_eventbus(self):
|
|
91
|
-
"""Initialize the EventBus for in-process distribution."""
|
|
92
|
-
if EVENTBUS_AVAILABLE:
|
|
93
|
-
try:
|
|
94
|
-
self.event_bus = EventBus.get_instance()
|
|
95
|
-
if DEBUG:
|
|
96
|
-
print("✅ EventBus initialized for hook handler", file=sys.stderr)
|
|
97
|
-
except Exception as e:
|
|
98
|
-
if DEBUG:
|
|
99
|
-
print(f"⚠️ Failed to initialize EventBus: {e}", file=sys.stderr)
|
|
100
|
-
self.event_bus = None
|
|
101
|
-
|
|
102
96
|
def emit_event(self, namespace: str, event: str, data: dict):
|
|
103
|
-
"""Emit event using
|
|
97
|
+
"""Emit event using high-performance async emitter with HTTP fallback.
|
|
104
98
|
|
|
105
|
-
WHY
|
|
106
|
-
-
|
|
107
|
-
-
|
|
108
|
-
-
|
|
109
|
-
-
|
|
99
|
+
WHY Hybrid approach:
|
|
100
|
+
- Direct async calls for ultra-low latency in-process events
|
|
101
|
+
- HTTP POST fallback for cross-process communication
|
|
102
|
+
- Connection pooling for memory protection
|
|
103
|
+
- Automatic routing based on availability
|
|
110
104
|
"""
|
|
111
105
|
# Create event data for normalization
|
|
112
106
|
raw_event = {
|
|
113
107
|
"type": "hook",
|
|
114
108
|
"subtype": event, # e.g., "user_prompt", "pre_tool", "subagent_stop"
|
|
115
|
-
"timestamp": datetime.now().isoformat(),
|
|
109
|
+
"timestamp": datetime.now(timezone.utc).isoformat(),
|
|
116
110
|
"data": data,
|
|
117
111
|
"source": "claude_hooks", # Identify the source
|
|
118
112
|
"session_id": data.get("sessionId"), # Include session if available
|
|
@@ -138,53 +132,123 @@ class ConnectionManagerService:
|
|
|
138
132
|
file=sys.stderr,
|
|
139
133
|
)
|
|
140
134
|
|
|
141
|
-
#
|
|
142
|
-
|
|
143
|
-
if
|
|
135
|
+
# Try high-performance async emitter first (direct calls)
|
|
136
|
+
success = self._try_async_emit(namespace, event, claude_event_data)
|
|
137
|
+
if success:
|
|
138
|
+
return
|
|
139
|
+
|
|
140
|
+
# Fallback to HTTP POST for cross-process communication
|
|
141
|
+
self._try_http_emit(namespace, event, claude_event_data)
|
|
142
|
+
|
|
143
|
+
def _try_async_emit(self, namespace: str, event: str, data: dict) -> bool:
|
|
144
|
+
"""Try to emit event using high-performance async emitter."""
|
|
145
|
+
try:
|
|
146
|
+
# Run async emission in the current event loop or create one
|
|
147
|
+
loop = None
|
|
144
148
|
try:
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
f"⚠️ HTTP POST returned status {response.status_code} for: {event}",
|
|
157
|
-
file=sys.stderr,
|
|
158
|
-
)
|
|
159
|
-
except requests.exceptions.Timeout:
|
|
160
|
-
# Timeout is expected for fire-and-forget pattern
|
|
161
|
-
if DEBUG:
|
|
162
|
-
print(f"✅ HTTP POST sent (timeout OK): {event}", file=sys.stderr)
|
|
163
|
-
except requests.exceptions.ConnectionError:
|
|
164
|
-
# Server might not be running - this is OK
|
|
165
|
-
if DEBUG:
|
|
166
|
-
print(f"⚠️ Server not available for: {event}", file=sys.stderr)
|
|
167
|
-
except Exception as e:
|
|
149
|
+
loop = asyncio.get_running_loop()
|
|
150
|
+
except RuntimeError:
|
|
151
|
+
# No running loop, create a new one
|
|
152
|
+
pass
|
|
153
|
+
|
|
154
|
+
if loop:
|
|
155
|
+
# We're in an async context, create a task with tracking
|
|
156
|
+
task = loop.create_task(self._async_emit(namespace, event, data))
|
|
157
|
+
self._emit_tasks.add(task)
|
|
158
|
+
task.add_done_callback(self._emit_tasks.discard)
|
|
159
|
+
# Don't wait for completion to maintain low latency
|
|
168
160
|
if DEBUG:
|
|
169
|
-
print(f"
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
161
|
+
print(f"✅ Async emit scheduled: {event}", file=sys.stderr)
|
|
162
|
+
return True
|
|
163
|
+
# No event loop, run synchronously
|
|
164
|
+
success = asyncio.run(self._async_emit(namespace, event, data))
|
|
165
|
+
if DEBUG and success:
|
|
166
|
+
print(f"✅ Async emit successful: {event}", file=sys.stderr)
|
|
167
|
+
return success
|
|
168
|
+
|
|
169
|
+
except Exception as e:
|
|
170
|
+
if DEBUG:
|
|
171
|
+
print(f"⚠️ Async emit failed: {e}", file=sys.stderr)
|
|
172
|
+
return False
|
|
173
|
+
|
|
174
|
+
async def _async_emit(self, namespace: str, event: str, data: dict) -> bool:
|
|
175
|
+
"""Async helper for event emission."""
|
|
176
|
+
try:
|
|
177
|
+
# Lazy load event emitter to reduce initialization overhead
|
|
178
|
+
from claude_mpm.services.monitor.event_emitter import get_event_emitter
|
|
179
|
+
|
|
180
|
+
emitter = await get_event_emitter()
|
|
181
|
+
return await emitter.emit_event(namespace, "claude_event", data)
|
|
182
|
+
except ImportError:
|
|
183
|
+
if DEBUG:
|
|
184
|
+
print("⚠️ Event emitter not available", file=sys.stderr)
|
|
185
|
+
return False
|
|
186
|
+
except Exception as e:
|
|
187
|
+
if DEBUG:
|
|
188
|
+
print(f"⚠️ Async emitter error: {e}", file=sys.stderr)
|
|
189
|
+
return False
|
|
190
|
+
|
|
191
|
+
def _try_http_emit(self, namespace: str, event: str, data: dict):
|
|
192
|
+
"""Try to emit event using HTTP POST fallback (non-blocking).
|
|
193
|
+
|
|
194
|
+
WHY non-blocking: HTTP POST can take up to 2 seconds (timeout),
|
|
195
|
+
blocking hook processing. Thread pool makes it fire-and-forget.
|
|
196
|
+
"""
|
|
197
|
+
if not REQUESTS_AVAILABLE:
|
|
198
|
+
if DEBUG:
|
|
199
|
+
print(
|
|
200
|
+
"⚠️ requests module not available - cannot emit via HTTP",
|
|
201
|
+
file=sys.stderr,
|
|
202
|
+
)
|
|
203
|
+
return
|
|
204
|
+
|
|
205
|
+
# Submit to thread pool - don't wait for result (fire-and-forget)
|
|
206
|
+
self._http_executor.submit(self._http_emit_blocking, namespace, event, data)
|
|
207
|
+
|
|
208
|
+
def _http_emit_blocking(self, namespace: str, event: str, data: dict):
|
|
209
|
+
"""HTTP emission in background thread (blocking operation isolated)."""
|
|
210
|
+
try:
|
|
211
|
+
# Create payload for HTTP API
|
|
212
|
+
payload = {
|
|
213
|
+
"namespace": namespace,
|
|
214
|
+
"event": "claude_event", # Standard event name for dashboard
|
|
215
|
+
"data": data,
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
# Send HTTP POST with reasonable timeout
|
|
219
|
+
response = requests.post(
|
|
220
|
+
self.http_endpoint,
|
|
221
|
+
json=payload,
|
|
222
|
+
timeout=2.0, # 2 second timeout
|
|
223
|
+
headers={"Content-Type": "application/json"},
|
|
174
224
|
)
|
|
175
225
|
|
|
176
|
-
|
|
177
|
-
if self.event_bus and EVENTBUS_AVAILABLE:
|
|
178
|
-
try:
|
|
179
|
-
# Publish to EventBus with topic format: hook.{event}
|
|
180
|
-
topic = f"hook.{event}"
|
|
181
|
-
self.event_bus.publish(topic, claude_event_data)
|
|
182
|
-
if DEBUG:
|
|
183
|
-
print(f"✅ Published to EventBus: {topic}", file=sys.stderr)
|
|
184
|
-
except Exception as e:
|
|
226
|
+
if response.status_code in [200, 204]:
|
|
185
227
|
if DEBUG:
|
|
186
|
-
print(f"
|
|
228
|
+
print(f"✅ HTTP POST successful: {event}", file=sys.stderr)
|
|
229
|
+
elif DEBUG:
|
|
230
|
+
print(
|
|
231
|
+
f"⚠️ HTTP POST failed with status {response.status_code}: {event}",
|
|
232
|
+
file=sys.stderr,
|
|
233
|
+
)
|
|
234
|
+
|
|
235
|
+
except requests.exceptions.Timeout:
|
|
236
|
+
if DEBUG:
|
|
237
|
+
print(f"⚠️ HTTP POST timeout for: {event}", file=sys.stderr)
|
|
238
|
+
except requests.exceptions.ConnectionError:
|
|
239
|
+
if DEBUG:
|
|
240
|
+
print(
|
|
241
|
+
f"⚠️ HTTP POST connection failed for: {event} (server not running?)",
|
|
242
|
+
file=sys.stderr,
|
|
243
|
+
)
|
|
244
|
+
except Exception as e:
|
|
245
|
+
if DEBUG:
|
|
246
|
+
print(f"⚠️ HTTP POST error for {event}: {e}", file=sys.stderr)
|
|
187
247
|
|
|
188
248
|
def cleanup(self):
|
|
189
249
|
"""Cleanup connections on service destruction."""
|
|
190
|
-
#
|
|
250
|
+
# Shutdown HTTP executor gracefully
|
|
251
|
+
if hasattr(self, "_http_executor"):
|
|
252
|
+
self._http_executor.shutdown(wait=False)
|
|
253
|
+
if DEBUG:
|
|
254
|
+
print("✅ HTTP executor shutdown", file=sys.stderr)
|
|
@@ -11,7 +11,8 @@ import os
|
|
|
11
11
|
import subprocess
|
|
12
12
|
import time
|
|
13
13
|
from collections import deque
|
|
14
|
-
from datetime import datetime
|
|
14
|
+
from datetime import datetime, timezone
|
|
15
|
+
from pathlib import Path
|
|
15
16
|
from typing import Optional
|
|
16
17
|
|
|
17
18
|
# Import constants for configuration
|
|
@@ -77,7 +78,7 @@ class StateManagerService:
|
|
|
77
78
|
|
|
78
79
|
if session_id and agent_type and agent_type != "unknown":
|
|
79
80
|
self.active_delegations[session_id] = agent_type
|
|
80
|
-
key = f"{session_id}:{datetime.now().timestamp()}"
|
|
81
|
+
key = f"{session_id}:{datetime.now(timezone.utc).timestamp()}"
|
|
81
82
|
self.delegation_history.append((key, agent_type))
|
|
82
83
|
|
|
83
84
|
# Store request data for response tracking correlation
|
|
@@ -85,7 +86,7 @@ class StateManagerService:
|
|
|
85
86
|
self.delegation_requests[session_id] = {
|
|
86
87
|
"agent_type": agent_type,
|
|
87
88
|
"request": request_data,
|
|
88
|
-
"timestamp": datetime.now().isoformat(),
|
|
89
|
+
"timestamp": datetime.now(timezone.utc).isoformat(),
|
|
89
90
|
}
|
|
90
91
|
if DEBUG:
|
|
91
92
|
import sys
|
|
@@ -100,7 +101,7 @@ class StateManagerService:
|
|
|
100
101
|
)
|
|
101
102
|
|
|
102
103
|
# Clean up old delegations (older than 5 minutes)
|
|
103
|
-
cutoff_time = datetime.now().timestamp() - 300
|
|
104
|
+
cutoff_time = datetime.now(timezone.utc).timestamp() - 300
|
|
104
105
|
keys_to_remove = []
|
|
105
106
|
for sid in list(self.active_delegations.keys()):
|
|
106
107
|
# Check if this is an old entry by looking in history
|
|
@@ -136,7 +137,7 @@ class StateManagerService:
|
|
|
136
137
|
|
|
137
138
|
def cleanup_old_entries(self):
|
|
138
139
|
"""Clean up old entries to prevent memory growth."""
|
|
139
|
-
datetime.now().timestamp() - self.MAX_CACHE_AGE_SECONDS
|
|
140
|
+
datetime.now(timezone.utc).timestamp() - self.MAX_CACHE_AGE_SECONDS
|
|
140
141
|
|
|
141
142
|
# Clean up delegation tracking dictionaries
|
|
142
143
|
for storage in [self.active_delegations, self.delegation_requests]:
|
|
@@ -158,7 +159,8 @@ class StateManagerService:
|
|
|
158
159
|
expired_keys = [
|
|
159
160
|
key
|
|
160
161
|
for key, cache_time in self._git_branch_cache_time.items()
|
|
161
|
-
if datetime.now().timestamp() - cache_time
|
|
162
|
+
if datetime.now(timezone.utc).timestamp() - cache_time
|
|
163
|
+
> self.MAX_CACHE_AGE_SECONDS
|
|
162
164
|
]
|
|
163
165
|
for key in expired_keys:
|
|
164
166
|
self._git_branch_cache.pop(key, None)
|
|
@@ -175,10 +177,10 @@ class StateManagerService:
|
|
|
175
177
|
"""
|
|
176
178
|
# Use current working directory if not specified
|
|
177
179
|
if not working_dir:
|
|
178
|
-
working_dir =
|
|
180
|
+
working_dir = Path.cwd()
|
|
179
181
|
|
|
180
182
|
# Check cache first (cache for 30 seconds)
|
|
181
|
-
current_time = datetime.now().timestamp()
|
|
183
|
+
current_time = datetime.now(timezone.utc).timestamp()
|
|
182
184
|
cache_key = working_dir
|
|
183
185
|
|
|
184
186
|
if (
|
|
@@ -191,7 +193,7 @@ class StateManagerService:
|
|
|
191
193
|
# Try to get git branch
|
|
192
194
|
try:
|
|
193
195
|
# Change to the working directory temporarily
|
|
194
|
-
original_cwd =
|
|
196
|
+
original_cwd = Path.cwd()
|
|
195
197
|
os.chdir(working_dir)
|
|
196
198
|
|
|
197
199
|
# Run git command to get current branch
|
|
@@ -11,7 +11,7 @@ import json
|
|
|
11
11
|
import os
|
|
12
12
|
import re
|
|
13
13
|
import sys
|
|
14
|
-
from datetime import datetime
|
|
14
|
+
from datetime import datetime, timezone
|
|
15
15
|
from typing import Optional, Tuple
|
|
16
16
|
|
|
17
17
|
# Debug mode is enabled by default for better visibility into hook processing
|
|
@@ -272,7 +272,7 @@ class SubagentResponseProcessor:
|
|
|
272
272
|
"duration_ms": event.get("duration_ms"),
|
|
273
273
|
"working_directory": working_dir,
|
|
274
274
|
"git_branch": git_branch,
|
|
275
|
-
"timestamp": datetime.now().isoformat(),
|
|
275
|
+
"timestamp": datetime.now(timezone.utc).isoformat(),
|
|
276
276
|
"event_type": "subagent_stop",
|
|
277
277
|
"reason": reason,
|
|
278
278
|
"original_request_timestamp": request_info.get("timestamp"),
|
|
@@ -347,7 +347,7 @@ class SubagentResponseProcessor:
|
|
|
347
347
|
"session_id": session_id,
|
|
348
348
|
"working_directory": working_dir,
|
|
349
349
|
"git_branch": git_branch,
|
|
350
|
-
"timestamp": datetime.now().isoformat(),
|
|
350
|
+
"timestamp": datetime.now(timezone.utc).isoformat(),
|
|
351
351
|
"is_successful_completion": reason in ["completed", "finished", "done"],
|
|
352
352
|
"is_error_termination": reason in ["error", "timeout", "failed", "blocked"],
|
|
353
353
|
"is_delegation_related": agent_type
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
Failure-Learning Hook System
|
|
4
|
+
=============================
|
|
5
|
+
|
|
6
|
+
Automatic learning extraction from failure-fix cycles.
|
|
7
|
+
|
|
8
|
+
WHY: When tasks fail and agents fix them, valuable knowledge is created. This
|
|
9
|
+
hook system automatically captures failures, detects fixes, and extracts learnings
|
|
10
|
+
without requiring manual intervention.
|
|
11
|
+
|
|
12
|
+
Components:
|
|
13
|
+
- FailureDetectionHook (priority 85): Detects task failures from tool outputs
|
|
14
|
+
- FixDetectionHook (priority 87): Matches successful executions with failures
|
|
15
|
+
- LearningExtractionHook (priority 89): Synthesizes and persists learnings
|
|
16
|
+
|
|
17
|
+
Integration:
|
|
18
|
+
The hooks work together as a chain:
|
|
19
|
+
1. Tool executes and fails → FailureDetectionHook records failure
|
|
20
|
+
2. User or agent makes changes
|
|
21
|
+
3. Tool executes and succeeds → FixDetectionHook detects fix
|
|
22
|
+
4. Fix matched with failure → LearningExtractionHook creates learning
|
|
23
|
+
5. Learning written to agent memory file
|
|
24
|
+
|
|
25
|
+
Usage:
|
|
26
|
+
from claude_mpm.hooks.failure_learning import (
|
|
27
|
+
get_failure_detection_hook,
|
|
28
|
+
get_fix_detection_hook,
|
|
29
|
+
get_learning_extraction_hook,
|
|
30
|
+
)
|
|
31
|
+
|
|
32
|
+
# Register hooks with hook service
|
|
33
|
+
hook_service.register_hook(get_failure_detection_hook())
|
|
34
|
+
hook_service.register_hook(get_fix_detection_hook())
|
|
35
|
+
hook_service.register_hook(get_learning_extraction_hook())
|
|
36
|
+
"""
|
|
37
|
+
|
|
38
|
+
from .failure_detection_hook import (
|
|
39
|
+
FailureDetectionHook,
|
|
40
|
+
get_failure_detection_hook,
|
|
41
|
+
)
|
|
42
|
+
from .fix_detection_hook import (
|
|
43
|
+
FixDetectionHook,
|
|
44
|
+
get_fix_detection_hook,
|
|
45
|
+
)
|
|
46
|
+
from .learning_extraction_hook import (
|
|
47
|
+
LearningExtractionHook,
|
|
48
|
+
get_learning_extraction_hook,
|
|
49
|
+
)
|
|
50
|
+
|
|
51
|
+
__all__ = [
|
|
52
|
+
# Hooks
|
|
53
|
+
"FailureDetectionHook",
|
|
54
|
+
"FixDetectionHook",
|
|
55
|
+
"LearningExtractionHook",
|
|
56
|
+
# Factory functions
|
|
57
|
+
"get_failure_detection_hook",
|
|
58
|
+
"get_fix_detection_hook",
|
|
59
|
+
"get_learning_extraction_hook",
|
|
60
|
+
]
|