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
|
@@ -7,7 +7,7 @@ including pre and post delegation hooks.
|
|
|
7
7
|
|
|
8
8
|
import os
|
|
9
9
|
import sys
|
|
10
|
-
from datetime import datetime
|
|
10
|
+
from datetime import datetime, timezone
|
|
11
11
|
from typing import Optional
|
|
12
12
|
|
|
13
13
|
# Debug mode
|
|
@@ -122,7 +122,7 @@ class MemoryHookManager:
|
|
|
122
122
|
"session_id": session_id,
|
|
123
123
|
},
|
|
124
124
|
metadata={"source": "claude_hook_handler", "tool_name": "Task"},
|
|
125
|
-
timestamp=datetime.now().isoformat(),
|
|
125
|
+
timestamp=datetime.now(timezone.utc).isoformat(),
|
|
126
126
|
session_id=session_id,
|
|
127
127
|
)
|
|
128
128
|
|
|
@@ -200,7 +200,7 @@ class MemoryHookManager:
|
|
|
200
200
|
"tool_name": "Task",
|
|
201
201
|
"duration_ms": event.get("duration_ms", 0),
|
|
202
202
|
},
|
|
203
|
-
timestamp=datetime.now().isoformat(),
|
|
203
|
+
timestamp=datetime.now(timezone.utc).isoformat(),
|
|
204
204
|
session_id=session_id,
|
|
205
205
|
)
|
|
206
206
|
|
|
@@ -9,29 +9,29 @@ import json
|
|
|
9
9
|
import os
|
|
10
10
|
import re
|
|
11
11
|
import sys
|
|
12
|
-
from datetime import datetime
|
|
13
|
-
from
|
|
12
|
+
from datetime import datetime, timezone
|
|
13
|
+
from pathlib import Path
|
|
14
|
+
from typing import Any, Optional
|
|
14
15
|
|
|
15
16
|
# Debug mode
|
|
16
17
|
DEBUG = os.environ.get("CLAUDE_MPM_HOOK_DEBUG", "true").lower() != "false"
|
|
17
18
|
|
|
18
19
|
# Response tracking integration
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
if DEBUG:
|
|
26
|
-
print(f"Response tracking not available: {e}", file=sys.stderr)
|
|
27
|
-
RESPONSE_TRACKING_AVAILABLE = False
|
|
20
|
+
# NOTE: ResponseTracker import moved to _initialize_response_tracking() for lazy loading
|
|
21
|
+
# This prevents unnecessary import of base_agent_loader and other heavy dependencies
|
|
22
|
+
# when hooks don't need response tracking
|
|
23
|
+
RESPONSE_TRACKING_AVAILABLE = (
|
|
24
|
+
True # Assume available, will check on actual initialization
|
|
25
|
+
)
|
|
28
26
|
|
|
29
27
|
|
|
30
28
|
class ResponseTrackingManager:
|
|
31
29
|
"""Manager for response tracking functionality."""
|
|
32
30
|
|
|
33
31
|
def __init__(self):
|
|
34
|
-
self.response_tracker: Optional[
|
|
32
|
+
self.response_tracker: Optional[Any] = (
|
|
33
|
+
None # Type hint changed to Any for lazy import
|
|
34
|
+
)
|
|
35
35
|
self.response_tracking_enabled = False
|
|
36
36
|
self.track_all_interactions = (
|
|
37
37
|
False # Track all Claude interactions, not just delegations
|
|
@@ -49,8 +49,14 @@ class ResponseTrackingManager:
|
|
|
49
49
|
|
|
50
50
|
DESIGN DECISION: Check configuration to allow enabling/disabling
|
|
51
51
|
response tracking without code changes.
|
|
52
|
+
|
|
53
|
+
NOTE: ResponseTracker is imported lazily here to avoid loading
|
|
54
|
+
base_agent_loader and other heavy dependencies unless actually needed.
|
|
52
55
|
"""
|
|
53
56
|
try:
|
|
57
|
+
# Lazy import of ResponseTracker to avoid unnecessary dependency loading
|
|
58
|
+
from claude_mpm.services.response_tracker import ResponseTracker
|
|
59
|
+
|
|
54
60
|
# Create configuration with optional config file using ConfigLoader
|
|
55
61
|
config_file = os.environ.get("CLAUDE_PM_CONFIG_FILE")
|
|
56
62
|
from claude_mpm.core.shared.config_loader import ConfigLoader, ConfigPattern
|
|
@@ -59,8 +65,8 @@ class ResponseTrackingManager:
|
|
|
59
65
|
if config_file:
|
|
60
66
|
# Use specific config file with ConfigLoader
|
|
61
67
|
pattern = ConfigPattern(
|
|
62
|
-
filenames=[
|
|
63
|
-
search_paths=[
|
|
68
|
+
filenames=[Path(config_file).name],
|
|
69
|
+
search_paths=[Path(config_file).parent],
|
|
64
70
|
env_prefix="CLAUDE_MPM_",
|
|
65
71
|
)
|
|
66
72
|
config = config_loader.load_config(
|
|
@@ -192,7 +198,7 @@ class ResponseTrackingManager:
|
|
|
192
198
|
"has_error": bool(event.get("error")),
|
|
193
199
|
"duration_ms": event.get("duration_ms"),
|
|
194
200
|
"working_directory": event.get("cwd", ""),
|
|
195
|
-
"timestamp": datetime.now().isoformat(),
|
|
201
|
+
"timestamp": datetime.now(timezone.utc).isoformat(),
|
|
196
202
|
"tool_name": "Task",
|
|
197
203
|
"original_request_timestamp": request_info.get("timestamp"),
|
|
198
204
|
}
|
|
@@ -262,7 +268,10 @@ class ResponseTrackingManager:
|
|
|
262
268
|
def track_stop_response(
|
|
263
269
|
self, event: dict, session_id: str, metadata: dict, pending_prompts: dict
|
|
264
270
|
):
|
|
265
|
-
"""Track response for stop events.
|
|
271
|
+
"""Track response for stop events.
|
|
272
|
+
|
|
273
|
+
Captures Claude API stop_reason and usage data for context management.
|
|
274
|
+
"""
|
|
266
275
|
if not (self.response_tracking_enabled and self.response_tracker):
|
|
267
276
|
return
|
|
268
277
|
|
|
@@ -288,6 +297,37 @@ class ResponseTrackingManager:
|
|
|
288
297
|
# Add prompt timestamp to metadata
|
|
289
298
|
metadata["prompt_timestamp"] = prompt_data.get("timestamp")
|
|
290
299
|
|
|
300
|
+
# Capture Claude API stop_reason if available
|
|
301
|
+
if "stop_reason" in event:
|
|
302
|
+
metadata["stop_reason"] = event["stop_reason"]
|
|
303
|
+
if DEBUG:
|
|
304
|
+
print(
|
|
305
|
+
f" - Captured stop_reason: {event['stop_reason']}",
|
|
306
|
+
file=sys.stderr,
|
|
307
|
+
)
|
|
308
|
+
|
|
309
|
+
# Capture Claude API usage data if available
|
|
310
|
+
if "usage" in event:
|
|
311
|
+
usage_data = event["usage"]
|
|
312
|
+
metadata["usage"] = {
|
|
313
|
+
"input_tokens": usage_data.get("input_tokens", 0),
|
|
314
|
+
"output_tokens": usage_data.get("output_tokens", 0),
|
|
315
|
+
"cache_creation_input_tokens": usage_data.get(
|
|
316
|
+
"cache_creation_input_tokens", 0
|
|
317
|
+
),
|
|
318
|
+
"cache_read_input_tokens": usage_data.get(
|
|
319
|
+
"cache_read_input_tokens", 0
|
|
320
|
+
),
|
|
321
|
+
}
|
|
322
|
+
if DEBUG:
|
|
323
|
+
total_tokens = usage_data.get(
|
|
324
|
+
"input_tokens", 0
|
|
325
|
+
) + usage_data.get("output_tokens", 0)
|
|
326
|
+
print(
|
|
327
|
+
f" - Captured usage: {total_tokens} total tokens",
|
|
328
|
+
file=sys.stderr,
|
|
329
|
+
)
|
|
330
|
+
|
|
291
331
|
# Track the main Claude response
|
|
292
332
|
file_path = self.response_tracker.track_response(
|
|
293
333
|
agent_name="claude_main",
|
|
@@ -344,7 +384,7 @@ class ResponseTrackingManager:
|
|
|
344
384
|
|
|
345
385
|
# Track the response
|
|
346
386
|
metadata = {
|
|
347
|
-
"timestamp": datetime.now().isoformat(),
|
|
387
|
+
"timestamp": datetime.now(timezone.utc).isoformat(),
|
|
348
388
|
"prompt_timestamp": prompt_data.get("timestamp"),
|
|
349
389
|
"working_directory": prompt_data.get("working_directory", ""),
|
|
350
390
|
"event_type": "assistant_response",
|
|
@@ -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,33 +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
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
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)
|
|
164
|
+
|
|
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]:
|
|
176
179
|
if DEBUG:
|
|
177
|
-
print(
|
|
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
|
+
)
|
|
186
|
+
|
|
187
|
+
except Exception as e:
|
|
188
|
+
if DEBUG:
|
|
189
|
+
print(f"⚠️ HTTP fallback error: {e}", file=sys.stderr)
|
|
178
190
|
|
|
179
|
-
# Warn if
|
|
180
|
-
if not self.connection_pool and
|
|
181
|
-
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
|
+
)
|
|
182
197
|
|
|
183
198
|
def cleanup(self):
|
|
184
199
|
"""Cleanup connections on service destruction."""
|
|
@@ -186,5 +201,5 @@ class ConnectionManagerService:
|
|
|
186
201
|
if self.connection_pool:
|
|
187
202
|
try:
|
|
188
203
|
self.connection_pool.cleanup()
|
|
189
|
-
except:
|
|
204
|
+
except Exception:
|
|
190
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)
|