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
|
@@ -41,6 +41,14 @@ class CodeAnalysisEventHandler(BaseEventHandler):
|
|
|
41
41
|
self.logger = get_logger(__name__)
|
|
42
42
|
self.analysis_runner = None
|
|
43
43
|
self.code_analyzer = None # For lazy loading operations
|
|
44
|
+
self._emit_tasks: set = set() # Track emit tasks to prevent GC
|
|
45
|
+
|
|
46
|
+
def _create_emit_task(self, coro):
|
|
47
|
+
"""Create a tracked emit task to prevent garbage collection."""
|
|
48
|
+
task = asyncio.get_event_loop().create_task(coro)
|
|
49
|
+
self._emit_tasks.add(task)
|
|
50
|
+
task.add_done_callback(self._emit_tasks.discard)
|
|
51
|
+
return task
|
|
44
52
|
|
|
45
53
|
def initialize(self):
|
|
46
54
|
"""Initialize the analysis runner."""
|
|
@@ -218,7 +226,7 @@ class CodeAnalysisEventHandler(BaseEventHandler):
|
|
|
218
226
|
|
|
219
227
|
# SECURITY: Validate the requested path
|
|
220
228
|
# Allow access to the explicitly chosen working directory and its subdirectories
|
|
221
|
-
|
|
229
|
+
Path(path).absolute()
|
|
222
230
|
|
|
223
231
|
# For now, we trust the frontend to send valid paths
|
|
224
232
|
# In production, you might want to maintain a server-side list of allowed directories
|
|
@@ -246,16 +254,14 @@ class CodeAnalysisEventHandler(BaseEventHandler):
|
|
|
246
254
|
# Special handling for 'info' events - they should be passed through directly
|
|
247
255
|
if event_type == "info":
|
|
248
256
|
# INFO events for granular tracking
|
|
249
|
-
|
|
250
|
-
loop.create_task(
|
|
257
|
+
self._create_emit_task(
|
|
251
258
|
self.server.core.sio.emit(
|
|
252
259
|
"info", {"request_id": request_id, **event_data}
|
|
253
260
|
)
|
|
254
261
|
)
|
|
255
262
|
else:
|
|
256
263
|
# Regular code analysis events
|
|
257
|
-
|
|
258
|
-
loop.create_task(
|
|
264
|
+
self._create_emit_task(
|
|
259
265
|
self.server.core.sio.emit(
|
|
260
266
|
event_type, {"request_id": request_id, **event_data}
|
|
261
267
|
)
|
|
@@ -266,7 +272,11 @@ class CodeAnalysisEventHandler(BaseEventHandler):
|
|
|
266
272
|
emitter.emit = socket_emit
|
|
267
273
|
# Initialize CodeTreeAnalyzer with emitter keyword argument
|
|
268
274
|
self.logger.info("Creating CodeTreeAnalyzer")
|
|
269
|
-
|
|
275
|
+
# Pass emit_events=False to prevent duplicate events from the analyzer
|
|
276
|
+
# The emitter will still work but the analyzer won't create its own stdout emitter
|
|
277
|
+
self.code_analyzer = CodeTreeAnalyzer(
|
|
278
|
+
emit_events=False, emitter=emitter
|
|
279
|
+
)
|
|
270
280
|
|
|
271
281
|
# Use the provided path as-is - the frontend sends the absolute path
|
|
272
282
|
# Make sure we're using an absolute path
|
|
@@ -433,16 +443,14 @@ class CodeAnalysisEventHandler(BaseEventHandler):
|
|
|
433
443
|
# Special handling for 'info' events - they should be passed through directly
|
|
434
444
|
if event_type == "info":
|
|
435
445
|
# INFO events for granular tracking
|
|
436
|
-
|
|
437
|
-
loop.create_task(
|
|
446
|
+
self._create_emit_task(
|
|
438
447
|
self.server.core.sio.emit(
|
|
439
448
|
"info", {"request_id": request_id, **event_data}
|
|
440
449
|
)
|
|
441
450
|
)
|
|
442
451
|
else:
|
|
443
452
|
# Regular code analysis events
|
|
444
|
-
|
|
445
|
-
loop.create_task(
|
|
453
|
+
self._create_emit_task(
|
|
446
454
|
self.server.core.sio.emit(
|
|
447
455
|
event_type, {"request_id": request_id, **event_data}
|
|
448
456
|
)
|
|
@@ -452,7 +460,11 @@ class CodeAnalysisEventHandler(BaseEventHandler):
|
|
|
452
460
|
emitter.emit = socket_emit
|
|
453
461
|
# Initialize CodeTreeAnalyzer with emitter keyword argument
|
|
454
462
|
self.logger.info("Creating CodeTreeAnalyzer")
|
|
455
|
-
|
|
463
|
+
# Pass emit_events=False to prevent duplicate events from the analyzer
|
|
464
|
+
# The emitter will still work but the analyzer won't create its own stdout emitter
|
|
465
|
+
self.code_analyzer = CodeTreeAnalyzer(
|
|
466
|
+
emit_events=False, emitter=emitter
|
|
467
|
+
)
|
|
456
468
|
|
|
457
469
|
# Discover directory
|
|
458
470
|
result = self.code_analyzer.discover_directory(path, ignore_patterns)
|
|
@@ -463,14 +475,41 @@ class CodeAnalysisEventHandler(BaseEventHandler):
|
|
|
463
475
|
)
|
|
464
476
|
self.logger.debug(f"Full result: {result}")
|
|
465
477
|
|
|
478
|
+
# DEBUG: Log exact children being sent
|
|
479
|
+
children = result.get("children", [])
|
|
480
|
+
if children:
|
|
481
|
+
self.logger.info(
|
|
482
|
+
f"Children being sent: {[child.get('name') for child in children]}"
|
|
483
|
+
)
|
|
484
|
+
self.logger.info(f"Full children data: {children}")
|
|
485
|
+
else:
|
|
486
|
+
self.logger.warning(f"No children found for {path}")
|
|
487
|
+
|
|
488
|
+
# Prepare the response data
|
|
489
|
+
response_data = {
|
|
490
|
+
"request_id": request_id,
|
|
491
|
+
"path": path, # Absolute path as requested
|
|
492
|
+
"name": Path(path).name, # Just the directory name for display
|
|
493
|
+
"type": result.get("type", "directory"),
|
|
494
|
+
"children": children, # Send children array directly
|
|
495
|
+
}
|
|
496
|
+
|
|
497
|
+
# CRITICAL DEBUG: Log exact JSON that will be sent
|
|
498
|
+
import json
|
|
499
|
+
|
|
500
|
+
self.logger.info(
|
|
501
|
+
f"Sending response data (JSON): {json.dumps(response_data, indent=2)}"
|
|
502
|
+
)
|
|
503
|
+
self.logger.info(
|
|
504
|
+
f"Children count in response: {len(response_data.get('children', []))}"
|
|
505
|
+
)
|
|
506
|
+
|
|
466
507
|
# Send result with correct event name (using colons, not dots!)
|
|
508
|
+
# Include both absolute path and relative name for frontend compatibility
|
|
509
|
+
# IMPORTANT: Don't use **result as it overwrites path and name
|
|
467
510
|
await self.server.core.sio.emit(
|
|
468
511
|
"code:directory:discovered",
|
|
469
|
-
|
|
470
|
-
"request_id": request_id,
|
|
471
|
-
"path": path,
|
|
472
|
-
**result,
|
|
473
|
-
},
|
|
512
|
+
response_data,
|
|
474
513
|
room=sid,
|
|
475
514
|
)
|
|
476
515
|
|
|
@@ -497,7 +536,7 @@ class CodeAnalysisEventHandler(BaseEventHandler):
|
|
|
497
536
|
|
|
498
537
|
path = data.get("path")
|
|
499
538
|
request_id = data.get("request_id")
|
|
500
|
-
|
|
539
|
+
data.get("show_hidden_files", False)
|
|
501
540
|
|
|
502
541
|
if not path:
|
|
503
542
|
await self.server.core.sio.emit(
|
|
@@ -556,8 +595,11 @@ class CodeAnalysisEventHandler(BaseEventHandler):
|
|
|
556
595
|
return
|
|
557
596
|
|
|
558
597
|
try:
|
|
598
|
+
self.logger.info(f"Starting file analysis for: {path}")
|
|
599
|
+
|
|
559
600
|
# Ensure analyzer exists
|
|
560
601
|
if not self.code_analyzer:
|
|
602
|
+
self.logger.info("Creating new CodeTreeAnalyzer instance")
|
|
561
603
|
emitter = CodeTreeEventEmitter(use_stdout=False)
|
|
562
604
|
# Override emit method to send to Socket.IO
|
|
563
605
|
original_emit = emitter.emit
|
|
@@ -571,16 +613,14 @@ class CodeAnalysisEventHandler(BaseEventHandler):
|
|
|
571
613
|
# Special handling for 'info' events - they should be passed through directly
|
|
572
614
|
if event_type == "info":
|
|
573
615
|
# INFO events for granular tracking
|
|
574
|
-
|
|
575
|
-
loop.create_task(
|
|
616
|
+
self._create_emit_task(
|
|
576
617
|
self.server.core.sio.emit(
|
|
577
618
|
"info", {"request_id": request_id, **event_data}
|
|
578
619
|
)
|
|
579
620
|
)
|
|
580
621
|
else:
|
|
581
622
|
# Regular code analysis events
|
|
582
|
-
|
|
583
|
-
loop.create_task(
|
|
623
|
+
self._create_emit_task(
|
|
584
624
|
self.server.core.sio.emit(
|
|
585
625
|
event_type, {"request_id": request_id, **event_data}
|
|
586
626
|
)
|
|
@@ -590,24 +630,47 @@ class CodeAnalysisEventHandler(BaseEventHandler):
|
|
|
590
630
|
emitter.emit = socket_emit
|
|
591
631
|
# Initialize CodeTreeAnalyzer with emitter keyword argument
|
|
592
632
|
self.logger.info("Creating CodeTreeAnalyzer")
|
|
593
|
-
|
|
633
|
+
# Pass emit_events=False to prevent duplicate events from the analyzer
|
|
634
|
+
# The emitter will still work but the analyzer won't create its own stdout emitter
|
|
635
|
+
self.code_analyzer = CodeTreeAnalyzer(
|
|
636
|
+
emit_events=False, emitter=emitter
|
|
637
|
+
)
|
|
638
|
+
self.logger.info("CodeTreeAnalyzer created successfully")
|
|
594
639
|
|
|
595
640
|
# Analyze file
|
|
641
|
+
self.logger.info(f"Calling analyze_file for: {path}")
|
|
596
642
|
result = self.code_analyzer.analyze_file(path)
|
|
643
|
+
self.logger.info(
|
|
644
|
+
f"Analysis complete. Result keys: {list(result.keys()) if result else 'None'}"
|
|
645
|
+
)
|
|
646
|
+
|
|
647
|
+
if result:
|
|
648
|
+
self.logger.info(
|
|
649
|
+
f"Analysis result: elements={len(result.get('elements', []))}, nodes={len(result.get('nodes', []))}"
|
|
650
|
+
)
|
|
651
|
+
else:
|
|
652
|
+
self.logger.warning("Analysis returned None or empty result")
|
|
597
653
|
|
|
598
654
|
# Send result with correct event name (using colons, not dots!)
|
|
655
|
+
response_data = {
|
|
656
|
+
"request_id": request_id,
|
|
657
|
+
"path": path,
|
|
658
|
+
**result,
|
|
659
|
+
}
|
|
660
|
+
|
|
661
|
+
self.logger.info(f"Emitting code:file:analyzed event to {sid}")
|
|
599
662
|
await self.server.core.sio.emit(
|
|
600
663
|
"code:file:analyzed",
|
|
601
|
-
|
|
602
|
-
"request_id": request_id,
|
|
603
|
-
"path": path,
|
|
604
|
-
**result,
|
|
605
|
-
},
|
|
664
|
+
response_data,
|
|
606
665
|
room=sid,
|
|
607
666
|
)
|
|
667
|
+
self.logger.info("Event emitted successfully")
|
|
608
668
|
|
|
609
669
|
except Exception as e:
|
|
610
670
|
self.logger.error(f"Error analyzing file {path}: {e}")
|
|
671
|
+
import traceback
|
|
672
|
+
|
|
673
|
+
self.logger.error(f"Full traceback: {traceback.format_exc()}")
|
|
611
674
|
await self.server.core.sio.emit(
|
|
612
675
|
"code:analysis:error",
|
|
613
676
|
{
|
|
@@ -8,11 +8,15 @@ from other handlers makes connection management more maintainable.
|
|
|
8
8
|
import asyncio
|
|
9
9
|
import functools
|
|
10
10
|
import time
|
|
11
|
-
from datetime import datetime
|
|
11
|
+
from datetime import datetime, timezone
|
|
12
12
|
from typing import Any, Callable, Dict, List, Optional
|
|
13
13
|
|
|
14
|
+
from claude_mpm.core.logging_utils import get_logger
|
|
15
|
+
|
|
14
16
|
from .base import BaseEventHandler
|
|
15
17
|
|
|
18
|
+
logger = get_logger(__name__)
|
|
19
|
+
|
|
16
20
|
|
|
17
21
|
def timeout_handler(timeout_seconds: float = 5.0):
|
|
18
22
|
"""Decorator to add timeout protection to async handlers.
|
|
@@ -39,49 +43,26 @@ def timeout_handler(timeout_seconds: float = 5.0):
|
|
|
39
43
|
|
|
40
44
|
elapsed = time.time() - start_time
|
|
41
45
|
if elapsed > timeout_seconds * 0.8: # Warn if close to timeout
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
logger = logging.getLogger(__name__)
|
|
47
|
-
logger.warning(
|
|
48
|
-
f"⚠️ Handler {handler_name} took {elapsed:.2f}s "
|
|
49
|
-
f"(close to {timeout_seconds}s timeout)"
|
|
50
|
-
)
|
|
51
|
-
except:
|
|
52
|
-
print(
|
|
53
|
-
f"⚠️ Handler {handler_name} took {elapsed:.2f}s (close to {timeout_seconds}s timeout)"
|
|
54
|
-
)
|
|
46
|
+
logger.warning(
|
|
47
|
+
f"⚠️ Handler {handler_name} took {elapsed:.2f}s "
|
|
48
|
+
f"(close to {timeout_seconds}s timeout)"
|
|
49
|
+
)
|
|
55
50
|
|
|
56
51
|
return result
|
|
57
52
|
|
|
58
53
|
except asyncio.TimeoutError:
|
|
59
54
|
elapsed = time.time() - start_time
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
logger = logging.getLogger(__name__)
|
|
65
|
-
logger.error(
|
|
66
|
-
f"❌ Handler {handler_name} timed out after {elapsed:.2f}s"
|
|
67
|
-
)
|
|
68
|
-
except:
|
|
69
|
-
print(f"❌ Handler {handler_name} timed out after {elapsed:.2f}s")
|
|
55
|
+
logger.error(
|
|
56
|
+
f"❌ Handler {handler_name} timed out after {elapsed:.2f}s"
|
|
57
|
+
)
|
|
70
58
|
|
|
71
59
|
return None
|
|
72
60
|
|
|
73
61
|
except Exception as e:
|
|
74
62
|
elapsed = time.time() - start_time
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
logger = logging.getLogger(__name__)
|
|
80
|
-
logger.error(
|
|
81
|
-
f"❌ Handler {handler_name} failed after {elapsed:.2f}s: {e}"
|
|
82
|
-
)
|
|
83
|
-
except:
|
|
84
|
-
print(f"❌ Handler {handler_name} failed after {elapsed:.2f}s: {e}")
|
|
63
|
+
logger.error(
|
|
64
|
+
f"❌ Handler {handler_name} failed after {elapsed:.2f}s: {e}"
|
|
65
|
+
)
|
|
85
66
|
raise
|
|
86
67
|
|
|
87
68
|
return wrapper
|
|
@@ -274,7 +255,7 @@ class ConnectionEventHandler(BaseEventHandler):
|
|
|
274
255
|
# Force disconnect if still connected
|
|
275
256
|
try:
|
|
276
257
|
await self.sio.disconnect(sid)
|
|
277
|
-
except:
|
|
258
|
+
except Exception:
|
|
278
259
|
pass # Already disconnected
|
|
279
260
|
|
|
280
261
|
self.logger.info(f"🔌 Cleaned up stale connection: {sid}")
|
|
@@ -326,7 +307,7 @@ class ConnectionEventHandler(BaseEventHandler):
|
|
|
326
307
|
status_data = {
|
|
327
308
|
"type": "connection",
|
|
328
309
|
"subtype": "status",
|
|
329
|
-
"timestamp": datetime.
|
|
310
|
+
"timestamp": datetime.now(timezone.utc).isoformat() + "Z",
|
|
330
311
|
"source": "server",
|
|
331
312
|
"session_id": self.server.session_id,
|
|
332
313
|
"data": {
|
|
@@ -348,13 +329,13 @@ class ConnectionEventHandler(BaseEventHandler):
|
|
|
348
329
|
{
|
|
349
330
|
"type": "connection",
|
|
350
331
|
"subtype": "welcome",
|
|
351
|
-
"timestamp": datetime.
|
|
332
|
+
"timestamp": datetime.now(timezone.utc).isoformat() + "Z",
|
|
352
333
|
"source": "server",
|
|
353
334
|
"session_id": self.server.session_id,
|
|
354
335
|
"data": {
|
|
355
336
|
"message": "Connected to Claude MPM Socket.IO server",
|
|
356
337
|
"client_id": sid,
|
|
357
|
-
"server_time": datetime.
|
|
338
|
+
"server_time": datetime.now(timezone.utc).isoformat() + "Z",
|
|
358
339
|
"build_info": monitor_build_info,
|
|
359
340
|
},
|
|
360
341
|
},
|
|
@@ -401,7 +382,7 @@ class ConnectionEventHandler(BaseEventHandler):
|
|
|
401
382
|
status_data = {
|
|
402
383
|
"type": "connection",
|
|
403
384
|
"subtype": "status",
|
|
404
|
-
"timestamp": datetime.
|
|
385
|
+
"timestamp": datetime.now(timezone.utc).isoformat() + "Z",
|
|
405
386
|
"source": "server",
|
|
406
387
|
"session_id": self.server.session_id,
|
|
407
388
|
"data": {
|
|
@@ -456,7 +437,7 @@ class ConnectionEventHandler(BaseEventHandler):
|
|
|
456
437
|
{
|
|
457
438
|
"type": "connection",
|
|
458
439
|
"subtype": "subscribed",
|
|
459
|
-
"timestamp": datetime.
|
|
440
|
+
"timestamp": datetime.now(timezone.utc).isoformat() + "Z",
|
|
460
441
|
"source": "server",
|
|
461
442
|
"data": {"channels": channels},
|
|
462
443
|
},
|
|
@@ -8,7 +8,7 @@ DESIGN DECISION: Centralized connection event handling ensures consistent
|
|
|
8
8
|
state management and provides resilient event delivery across reconnections.
|
|
9
9
|
"""
|
|
10
10
|
|
|
11
|
-
from datetime import datetime
|
|
11
|
+
from datetime import datetime, timezone
|
|
12
12
|
|
|
13
13
|
from .base import BaseEventHandler
|
|
14
14
|
|
|
@@ -50,7 +50,7 @@ class EnhancedConnectionEventHandler(BaseEventHandler):
|
|
|
50
50
|
# Store client info
|
|
51
51
|
self.server.client_info[sid] = {
|
|
52
52
|
"client_id": conn.client_id,
|
|
53
|
-
"connected_at": datetime.now().isoformat(),
|
|
53
|
+
"connected_at": datetime.now(timezone.utc).isoformat(),
|
|
54
54
|
"user_agent": environ.get("HTTP_USER_AGENT", "unknown"),
|
|
55
55
|
"remote_addr": environ.get("REMOTE_ADDR", "unknown"),
|
|
56
56
|
}
|
|
@@ -61,7 +61,7 @@ class EnhancedConnectionEventHandler(BaseEventHandler):
|
|
|
61
61
|
{
|
|
62
62
|
"client_id": conn.client_id,
|
|
63
63
|
"sid": sid,
|
|
64
|
-
"timestamp": datetime.now().isoformat(),
|
|
64
|
+
"timestamp": datetime.now(timezone.utc).isoformat(),
|
|
65
65
|
"server_version": self.get_server_version(),
|
|
66
66
|
},
|
|
67
67
|
room=sid,
|
|
@@ -120,7 +120,7 @@ class EnhancedConnectionEventHandler(BaseEventHandler):
|
|
|
120
120
|
self.server.stats["connections_total"] += 1
|
|
121
121
|
|
|
122
122
|
self.server.client_info[sid] = {
|
|
123
|
-
"connected_at": datetime.now().isoformat(),
|
|
123
|
+
"connected_at": datetime.now(timezone.utc).isoformat(),
|
|
124
124
|
"user_agent": environ.get("HTTP_USER_AGENT", "unknown"),
|
|
125
125
|
"remote_addr": environ.get("REMOTE_ADDR", "unknown"),
|
|
126
126
|
}
|
|
@@ -185,8 +185,8 @@ class EnhancedConnectionEventHandler(BaseEventHandler):
|
|
|
185
185
|
await sio.emit(
|
|
186
186
|
"pong",
|
|
187
187
|
{
|
|
188
|
-
"timestamp": datetime.now().isoformat(),
|
|
189
|
-
"server_time": datetime.now().timestamp(),
|
|
188
|
+
"timestamp": datetime.now(timezone.utc).isoformat(),
|
|
189
|
+
"server_time": datetime.now(timezone.utc).timestamp(),
|
|
190
190
|
},
|
|
191
191
|
room=sid,
|
|
192
192
|
)
|
|
@@ -210,7 +210,10 @@ class EnhancedConnectionEventHandler(BaseEventHandler):
|
|
|
210
210
|
# Optional: Send confirmation
|
|
211
211
|
await sio.emit(
|
|
212
212
|
"ack_confirmed",
|
|
213
|
-
{
|
|
213
|
+
{
|
|
214
|
+
"sequence": sequence,
|
|
215
|
+
"timestamp": datetime.now(timezone.utc).isoformat(),
|
|
216
|
+
},
|
|
214
217
|
room=sid,
|
|
215
218
|
)
|
|
216
219
|
|
|
@@ -263,7 +266,7 @@ class EnhancedConnectionEventHandler(BaseEventHandler):
|
|
|
263
266
|
"""Get connection statistics for debugging."""
|
|
264
267
|
try:
|
|
265
268
|
stats = {
|
|
266
|
-
"timestamp": datetime.now().isoformat(),
|
|
269
|
+
"timestamp": datetime.now(timezone.utc).isoformat(),
|
|
267
270
|
"total_connections": len(self.server.connected_clients),
|
|
268
271
|
"server_stats": self.server.stats,
|
|
269
272
|
}
|
|
@@ -312,7 +315,7 @@ class EnhancedConnectionEventHandler(BaseEventHandler):
|
|
|
312
315
|
if self.server.stats.get("start_time")
|
|
313
316
|
else None
|
|
314
317
|
),
|
|
315
|
-
"timestamp": datetime.now().isoformat(),
|
|
318
|
+
"timestamp": datetime.now(timezone.utc).isoformat(),
|
|
316
319
|
}
|
|
317
320
|
|
|
318
321
|
await self.server.core.sio.emit("server_status", status_data, room=sid)
|
|
@@ -326,5 +329,5 @@ class EnhancedConnectionEventHandler(BaseEventHandler):
|
|
|
326
329
|
from claude_mpm.services.version_service import VersionService
|
|
327
330
|
|
|
328
331
|
return VersionService().get_version()
|
|
329
|
-
except:
|
|
332
|
+
except Exception:
|
|
330
333
|
return "unknown"
|
|
@@ -5,7 +5,6 @@ safely with security checks. Separating file operations improves security
|
|
|
5
5
|
auditing and makes it easier to add file-related features.
|
|
6
6
|
"""
|
|
7
7
|
|
|
8
|
-
import os
|
|
9
8
|
from pathlib import Path
|
|
10
9
|
from typing import Any, Dict, Optional
|
|
11
10
|
|
|
@@ -24,6 +23,12 @@ class FileEventHandler(BaseEventHandler):
|
|
|
24
23
|
|
|
25
24
|
def register_events(self) -> None:
|
|
26
25
|
"""Register file operation event handlers."""
|
|
26
|
+
self.logger.info(
|
|
27
|
+
"[FileEventHandler] Starting registration of read_file event handler"
|
|
28
|
+
)
|
|
29
|
+
|
|
30
|
+
# Capture self reference to avoid closure issues
|
|
31
|
+
handler_self = self
|
|
27
32
|
|
|
28
33
|
@self.sio.event
|
|
29
34
|
async def read_file(sid, data):
|
|
@@ -33,13 +38,19 @@ class FileEventHandler(BaseEventHandler):
|
|
|
33
38
|
click on files, but we must ensure secure file access with
|
|
34
39
|
proper validation and size limits.
|
|
35
40
|
"""
|
|
41
|
+
handler_self.logger.info(
|
|
42
|
+
f"[FileEventHandler] Received read_file event from {sid} with data: {data}"
|
|
43
|
+
)
|
|
36
44
|
try:
|
|
37
45
|
file_path = data.get("file_path")
|
|
38
|
-
working_dir = data.get("working_dir",
|
|
46
|
+
working_dir = data.get("working_dir", Path.cwd())
|
|
39
47
|
max_size = data.get("max_size", 1024 * 1024) # 1MB default limit
|
|
40
48
|
|
|
41
49
|
if not file_path:
|
|
42
|
-
|
|
50
|
+
handler_self.logger.warning(
|
|
51
|
+
f"[FileEventHandler] Missing file_path in request from {sid}"
|
|
52
|
+
)
|
|
53
|
+
await handler_self.emit_to_client(
|
|
43
54
|
sid,
|
|
44
55
|
"file_content_response",
|
|
45
56
|
{
|
|
@@ -51,14 +62,29 @@ class FileEventHandler(BaseEventHandler):
|
|
|
51
62
|
return
|
|
52
63
|
|
|
53
64
|
# Use the shared file reading logic
|
|
54
|
-
|
|
65
|
+
handler_self.logger.info(
|
|
66
|
+
f"[FileEventHandler] Reading file: {file_path} from working_dir: {working_dir}"
|
|
67
|
+
)
|
|
68
|
+
result = await handler_self._read_file_safely(
|
|
69
|
+
file_path, working_dir, max_size
|
|
70
|
+
)
|
|
55
71
|
|
|
56
72
|
# Send the result back to the client
|
|
57
|
-
|
|
73
|
+
handler_self.logger.info(
|
|
74
|
+
f"[FileEventHandler] Sending file_content_response to {sid}, success: {result.get('success', False)}"
|
|
75
|
+
)
|
|
76
|
+
await handler_self.emit_to_client(sid, "file_content_response", result)
|
|
77
|
+
handler_self.logger.info(
|
|
78
|
+
f"[FileEventHandler] Response sent successfully to {sid}"
|
|
79
|
+
)
|
|
58
80
|
|
|
59
81
|
except Exception as e:
|
|
60
|
-
|
|
61
|
-
|
|
82
|
+
handler_self.logger.error(
|
|
83
|
+
f"[FileEventHandler] Exception in read_file handler: {e}",
|
|
84
|
+
exc_info=True,
|
|
85
|
+
)
|
|
86
|
+
handler_self.log_error("read_file", e, data)
|
|
87
|
+
await handler_self.emit_to_client(
|
|
62
88
|
sid,
|
|
63
89
|
"file_content_response",
|
|
64
90
|
{
|
|
@@ -67,6 +93,14 @@ class FileEventHandler(BaseEventHandler):
|
|
|
67
93
|
"file_path": data.get("file_path", "unknown"),
|
|
68
94
|
},
|
|
69
95
|
)
|
|
96
|
+
handler_self.logger.info(
|
|
97
|
+
f"[FileEventHandler] Error response sent to {sid}"
|
|
98
|
+
)
|
|
99
|
+
|
|
100
|
+
# Log successful registration
|
|
101
|
+
self.logger.info(
|
|
102
|
+
"[FileEventHandler] read_file event handler registered successfully"
|
|
103
|
+
)
|
|
70
104
|
|
|
71
105
|
async def _read_file_safely(
|
|
72
106
|
self,
|
|
@@ -90,7 +124,7 @@ class FileEventHandler(BaseEventHandler):
|
|
|
90
124
|
"""
|
|
91
125
|
try:
|
|
92
126
|
if working_dir is None:
|
|
93
|
-
working_dir =
|
|
127
|
+
working_dir = Path.cwd()
|
|
94
128
|
|
|
95
129
|
# Resolve absolute path based on working directory
|
|
96
130
|
file_path_obj = Path(file_path)
|
|
@@ -156,7 +190,9 @@ class FileEventHandler(BaseEventHandler):
|
|
|
156
190
|
|
|
157
191
|
# Read file content
|
|
158
192
|
try:
|
|
159
|
-
with
|
|
193
|
+
with Path(real_path).open(
|
|
194
|
+
encoding="utf-8",
|
|
195
|
+
) as f:
|
|
160
196
|
content = f.read()
|
|
161
197
|
|
|
162
198
|
# Get file extension for syntax highlighting hint
|
|
@@ -189,7 +225,7 @@ class FileEventHandler(BaseEventHandler):
|
|
|
189
225
|
be displayed as text.
|
|
190
226
|
"""
|
|
191
227
|
try:
|
|
192
|
-
with open(
|
|
228
|
+
with real_path.open("rb") as f:
|
|
193
229
|
binary_content = f.read()
|
|
194
230
|
|
|
195
231
|
# Check if it's a text file by looking for common text patterns
|
|
@@ -106,7 +106,7 @@ class GitEventHandler(BaseEventHandler):
|
|
|
106
106
|
"""
|
|
107
107
|
try:
|
|
108
108
|
file_path = data.get("file_path")
|
|
109
|
-
working_dir = data.get("working_dir",
|
|
109
|
+
working_dir = data.get("working_dir", Path.cwd())
|
|
110
110
|
|
|
111
111
|
if not file_path:
|
|
112
112
|
await self.emit_to_client(
|
|
@@ -162,7 +162,7 @@ class GitEventHandler(BaseEventHandler):
|
|
|
162
162
|
"""
|
|
163
163
|
try:
|
|
164
164
|
file_path = data.get("file_path")
|
|
165
|
-
working_dir = data.get("working_dir",
|
|
165
|
+
working_dir = data.get("working_dir", Path.cwd())
|
|
166
166
|
|
|
167
167
|
# Debug: check_git_status called
|
|
168
168
|
|
|
@@ -287,7 +287,7 @@ class GitEventHandler(BaseEventHandler):
|
|
|
287
287
|
"""
|
|
288
288
|
try:
|
|
289
289
|
file_path = data.get("file_path")
|
|
290
|
-
working_dir = data.get("working_dir",
|
|
290
|
+
working_dir = data.get("working_dir", Path.cwd())
|
|
291
291
|
|
|
292
292
|
# Debug: git_add_file called
|
|
293
293
|
|
|
@@ -389,7 +389,7 @@ class GitEventHandler(BaseEventHandler):
|
|
|
389
389
|
if working_dir in invalid_states or (
|
|
390
390
|
isinstance(working_dir, str) and working_dir.strip() == ""
|
|
391
391
|
):
|
|
392
|
-
working_dir =
|
|
392
|
+
working_dir = Path.cwd()
|
|
393
393
|
self.logger.info(
|
|
394
394
|
f"[{operation}] working_dir was invalid ({original_working_dir!r}), using cwd: {working_dir}"
|
|
395
395
|
)
|
|
@@ -404,7 +404,7 @@ class GitEventHandler(BaseEventHandler):
|
|
|
404
404
|
self.logger.warning(
|
|
405
405
|
f"[{operation}] working_dir contains null bytes, using cwd instead"
|
|
406
406
|
)
|
|
407
|
-
working_dir =
|
|
407
|
+
working_dir = Path.cwd()
|
|
408
408
|
|
|
409
409
|
return working_dir
|
|
410
410
|
|
|
@@ -640,7 +640,7 @@ class GitEventHandler(BaseEventHandler):
|
|
|
640
640
|
|
|
641
641
|
# Handle case where working_dir is None, empty string, or 'Unknown'
|
|
642
642
|
if not working_dir or working_dir == "Unknown" or working_dir.strip() == "":
|
|
643
|
-
working_dir =
|
|
643
|
+
working_dir = Path.cwd()
|
|
644
644
|
# Debug: working_dir was invalid, using cwd
|
|
645
645
|
else:
|
|
646
646
|
# Debug: Using provided working_dir
|
|
@@ -648,7 +648,7 @@ class GitEventHandler(BaseEventHandler):
|
|
|
648
648
|
|
|
649
649
|
# For read-only git operations, we can work from any directory
|
|
650
650
|
# by passing the -C flag to git commands instead of changing directories
|
|
651
|
-
original_cwd =
|
|
651
|
+
original_cwd = Path.cwd()
|
|
652
652
|
try:
|
|
653
653
|
# We'll use git -C <working_dir> for all commands instead of chdir
|
|
654
654
|
|
|
@@ -792,7 +792,7 @@ class GitEventHandler(BaseEventHandler):
|
|
|
792
792
|
stdout=asyncio.subprocess.PIPE,
|
|
793
793
|
stderr=asyncio.subprocess.PIPE,
|
|
794
794
|
)
|
|
795
|
-
diff_output,
|
|
795
|
+
diff_output, _diff_error = await diff_proc.communicate()
|
|
796
796
|
|
|
797
797
|
if diff_proc.returncode == 0:
|
|
798
798
|
return {
|