claude-mpm 4.1.26__py3-none-any.whl ā 4.24.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of claude-mpm might be problematic. Click here for more details.
- claude_mpm/BUILD_NUMBER +1 -1
- claude_mpm/VERSION +1 -1
- claude_mpm/__init__.py +20 -5
- claude_mpm/agents/BASE_AGENT_TEMPLATE.md +118 -0
- claude_mpm/agents/BASE_DOCUMENTATION.md +53 -0
- claude_mpm/agents/BASE_ENGINEER.md +658 -0
- claude_mpm/agents/BASE_OPS.md +219 -0
- claude_mpm/agents/BASE_PM.md +420 -158
- claude_mpm/agents/BASE_PROMPT_ENGINEER.md +787 -0
- claude_mpm/agents/BASE_QA.md +167 -0
- claude_mpm/agents/BASE_RESEARCH.md +53 -0
- claude_mpm/agents/OUTPUT_STYLE.md +299 -29
- claude_mpm/agents/PM_INSTRUCTIONS.md +1159 -0
- claude_mpm/agents/WORKFLOW.md +355 -191
- claude_mpm/agents/agent_loader.py +40 -10
- claude_mpm/agents/agent_loader_integration.py +3 -2
- claude_mpm/agents/async_agent_loader.py +3 -3
- claude_mpm/agents/base_agent_loader.py +11 -9
- claude_mpm/agents/frontmatter_validator.py +291 -251
- claude_mpm/agents/system_agent_config.py +3 -2
- claude_mpm/agents/templates/README.md +465 -0
- claude_mpm/agents/templates/agent-manager.json +7 -4
- claude_mpm/agents/templates/{agentic_coder_optimizer.json ā agentic-coder-optimizer.json} +33 -7
- claude_mpm/agents/templates/api_qa.json +16 -4
- claude_mpm/agents/templates/circuit_breakers.md +638 -0
- claude_mpm/agents/templates/clerk-ops.json +235 -0
- claude_mpm/agents/templates/code_analyzer.json +10 -4
- claude_mpm/agents/templates/content-agent.json +358 -0
- claude_mpm/agents/templates/dart_engineer.json +307 -0
- claude_mpm/agents/templates/data_engineer.json +87 -14
- claude_mpm/agents/templates/documentation.json +76 -13
- claude_mpm/agents/templates/engineer.json +43 -9
- claude_mpm/agents/templates/gcp_ops_agent.json +253 -0
- claude_mpm/agents/templates/git_file_tracking.md +584 -0
- claude_mpm/agents/templates/golang_engineer.json +270 -0
- claude_mpm/agents/templates/imagemagick.json +5 -2
- claude_mpm/agents/templates/java_engineer.json +346 -0
- claude_mpm/agents/templates/javascript_engineer_agent.json +380 -0
- claude_mpm/agents/templates/local_ops_agent.json +1840 -0
- claude_mpm/agents/templates/logs/prompts/agent_engineer_20250901_010124_142.md +400 -0
- claude_mpm/agents/templates/memory_manager.json +6 -3
- claude_mpm/agents/templates/nextjs_engineer.json +285 -0
- claude_mpm/agents/templates/ops.json +14 -4
- claude_mpm/agents/templates/php-engineer.json +287 -0
- claude_mpm/agents/templates/pm_examples.md +474 -0
- claude_mpm/agents/templates/pm_red_flags.md +262 -0
- claude_mpm/agents/templates/product_owner.json +338 -0
- claude_mpm/agents/templates/project_organizer.json +19 -5
- claude_mpm/agents/templates/prompt-engineer.json +737 -0
- claude_mpm/agents/templates/python_engineer.json +387 -0
- claude_mpm/agents/templates/qa.json +25 -5
- claude_mpm/agents/templates/react_engineer.json +239 -0
- claude_mpm/agents/templates/refactoring_engineer.json +15 -5
- claude_mpm/agents/templates/research.json +46 -21
- claude_mpm/agents/templates/response_format.md +583 -0
- claude_mpm/agents/templates/ruby-engineer.json +280 -0
- claude_mpm/agents/templates/rust_engineer.json +275 -0
- claude_mpm/agents/templates/security.json +59 -10
- claude_mpm/agents/templates/svelte-engineer.json +225 -0
- claude_mpm/agents/templates/tauri_engineer.json +274 -0
- claude_mpm/agents/templates/ticketing.json +16 -7
- claude_mpm/agents/templates/typescript_engineer.json +285 -0
- claude_mpm/agents/templates/validation_templates.md +312 -0
- claude_mpm/agents/templates/vercel_ops_agent.json +164 -33
- claude_mpm/agents/templates/version_control.json +16 -4
- claude_mpm/agents/templates/web_qa.json +167 -21
- claude_mpm/agents/templates/web_ui.json +18 -5
- claude_mpm/cli/__init__.py +38 -378
- claude_mpm/cli/commands/__init__.py +2 -0
- claude_mpm/cli/commands/agent_manager.py +675 -20
- claude_mpm/cli/commands/agent_state_manager.py +186 -0
- claude_mpm/cli/commands/agents.py +722 -150
- claude_mpm/cli/commands/agents_detect.py +380 -0
- claude_mpm/cli/commands/agents_recommend.py +309 -0
- claude_mpm/cli/commands/aggregate.py +10 -6
- claude_mpm/cli/commands/analyze.py +15 -10
- claude_mpm/cli/commands/analyze_code.py +8 -4
- claude_mpm/cli/commands/auto_configure.py +570 -0
- claude_mpm/cli/commands/cleanup.py +12 -12
- claude_mpm/cli/commands/config.py +47 -13
- claude_mpm/cli/commands/configure.py +469 -1064
- claude_mpm/cli/commands/configure_agent_display.py +261 -0
- claude_mpm/cli/commands/configure_behavior_manager.py +204 -0
- claude_mpm/cli/commands/configure_hook_manager.py +225 -0
- claude_mpm/cli/commands/configure_models.py +18 -0
- claude_mpm/cli/commands/configure_navigation.py +167 -0
- claude_mpm/cli/commands/configure_paths.py +104 -0
- claude_mpm/cli/commands/configure_persistence.py +254 -0
- claude_mpm/cli/commands/configure_startup_manager.py +646 -0
- claude_mpm/cli/commands/configure_template_editor.py +497 -0
- claude_mpm/cli/commands/configure_validators.py +73 -0
- claude_mpm/cli/commands/dashboard.py +50 -52
- claude_mpm/cli/commands/debug.py +7 -7
- claude_mpm/cli/commands/doctor.py +43 -7
- claude_mpm/cli/commands/info.py +3 -4
- claude_mpm/cli/commands/local_deploy.py +537 -0
- claude_mpm/cli/commands/mcp.py +17 -10
- claude_mpm/cli/commands/mcp_command_router.py +11 -0
- claude_mpm/cli/commands/mcp_config.py +154 -0
- claude_mpm/cli/commands/mcp_external_commands.py +249 -0
- claude_mpm/cli/commands/mcp_install_commands.py +101 -32
- claude_mpm/cli/commands/mcp_pipx_config.py +2 -2
- claude_mpm/cli/commands/mcp_setup_external.py +868 -0
- claude_mpm/cli/commands/memory.py +55 -21
- claude_mpm/cli/commands/monitor.py +160 -70
- claude_mpm/cli/commands/mpm_init/__init__.py +73 -0
- claude_mpm/cli/commands/mpm_init/core.py +525 -0
- claude_mpm/cli/commands/mpm_init/display.py +341 -0
- claude_mpm/cli/commands/mpm_init/git_activity.py +427 -0
- claude_mpm/cli/commands/mpm_init/modes.py +397 -0
- claude_mpm/cli/commands/mpm_init/prompts.py +442 -0
- claude_mpm/cli/commands/mpm_init_cli.py +396 -0
- claude_mpm/cli/commands/mpm_init_handler.py +114 -4
- claude_mpm/cli/commands/run.py +169 -42
- claude_mpm/cli/commands/search.py +458 -0
- claude_mpm/cli/commands/skills.py +488 -0
- claude_mpm/cli/commands/uninstall.py +176 -0
- claude_mpm/cli/commands/upgrade.py +152 -0
- claude_mpm/cli/commands/verify.py +119 -0
- claude_mpm/cli/executor.py +204 -0
- claude_mpm/cli/helpers.py +105 -0
- claude_mpm/cli/interactive/__init__.py +21 -0
- claude_mpm/cli/interactive/agent_wizard.py +962 -0
- claude_mpm/cli/interactive/skills_wizard.py +491 -0
- claude_mpm/cli/parser.py +79 -2
- claude_mpm/cli/parsers/__init__.py +7 -1
- claude_mpm/cli/parsers/agent_manager_parser.py +161 -1
- claude_mpm/cli/parsers/agents_parser.py +116 -0
- claude_mpm/cli/parsers/auto_configure_parser.py +245 -0
- claude_mpm/cli/parsers/base_parser.py +143 -3
- claude_mpm/cli/parsers/configure_parser.py +11 -15
- claude_mpm/cli/parsers/local_deploy_parser.py +227 -0
- claude_mpm/cli/parsers/mcp_parser.py +15 -0
- claude_mpm/cli/parsers/monitor_parser.py +12 -2
- claude_mpm/cli/parsers/mpm_init_parser.py +179 -9
- claude_mpm/cli/parsers/run_parser.py +5 -0
- claude_mpm/cli/parsers/search_parser.py +245 -0
- claude_mpm/cli/parsers/skills_parser.py +137 -0
- claude_mpm/cli/shared/argument_patterns.py +20 -13
- claude_mpm/cli/shared/base_command.py +2 -2
- claude_mpm/cli/shared/output_formatters.py +28 -19
- claude_mpm/cli/startup.py +562 -0
- claude_mpm/cli/startup_logging.py +179 -13
- claude_mpm/cli/utils.py +53 -2
- claude_mpm/commands/mpm-agents-detect.md +168 -0
- claude_mpm/commands/mpm-agents-recommend.md +214 -0
- claude_mpm/commands/mpm-agents.md +118 -8
- claude_mpm/commands/mpm-auto-configure.md +269 -0
- claude_mpm/commands/mpm-config.md +137 -14
- claude_mpm/commands/mpm-help.md +285 -5
- claude_mpm/commands/mpm-init.md +374 -15
- claude_mpm/commands/mpm-monitor.md +409 -0
- claude_mpm/commands/mpm-organize.md +295 -0
- claude_mpm/commands/mpm-resume.md +372 -0
- claude_mpm/commands/mpm-status.md +71 -9
- claude_mpm/commands/mpm-tickets.md +56 -7
- claude_mpm/commands/mpm-version.md +113 -0
- claude_mpm/commands/mpm.md +2 -0
- claude_mpm/config/agent_config.py +4 -4
- claude_mpm/config/experimental_features.py +7 -7
- claude_mpm/config/model_config.py +428 -0
- claude_mpm/config/paths.py +3 -2
- claude_mpm/config/socketio_config.py +3 -3
- claude_mpm/constants.py +15 -1
- claude_mpm/core/__init__.py +53 -17
- claude_mpm/core/agent_name_normalizer.py +3 -2
- claude_mpm/core/agent_registry.py +2 -2
- claude_mpm/core/agent_session_manager.py +10 -10
- claude_mpm/core/api_validator.py +330 -0
- claude_mpm/core/base_service.py +33 -23
- claude_mpm/core/cache.py +9 -9
- claude_mpm/core/claude_runner.py +19 -8
- claude_mpm/core/config.py +85 -8
- claude_mpm/core/config_aliases.py +7 -6
- claude_mpm/core/constants.py +65 -0
- claude_mpm/core/container.py +11 -5
- claude_mpm/core/enums.py +452 -0
- claude_mpm/core/error_handler.py +623 -0
- claude_mpm/core/factories.py +1 -1
- claude_mpm/core/file_utils.py +764 -0
- claude_mpm/core/framework/__init__.py +38 -0
- claude_mpm/core/framework/formatters/__init__.py +11 -0
- claude_mpm/core/framework/formatters/capability_generator.py +367 -0
- claude_mpm/core/framework/formatters/content_formatter.py +288 -0
- claude_mpm/core/framework/formatters/context_generator.py +185 -0
- claude_mpm/core/framework/loaders/__init__.py +13 -0
- claude_mpm/core/framework/loaders/agent_loader.py +210 -0
- claude_mpm/core/framework/loaders/file_loader.py +223 -0
- claude_mpm/core/framework/loaders/instruction_loader.py +161 -0
- claude_mpm/core/framework/loaders/packaged_loader.py +232 -0
- claude_mpm/core/framework/processors/__init__.py +11 -0
- claude_mpm/core/framework/processors/memory_processor.py +230 -0
- claude_mpm/core/framework/processors/metadata_processor.py +146 -0
- claude_mpm/core/framework/processors/template_processor.py +244 -0
- claude_mpm/core/framework_loader.py +321 -1631
- claude_mpm/core/hook_manager.py +8 -6
- claude_mpm/core/injectable_service.py +11 -8
- claude_mpm/core/instruction_reinforcement_hook.py +4 -3
- claude_mpm/core/interactive_session.py +55 -8
- claude_mpm/core/interfaces.py +56 -1
- claude_mpm/core/lazy.py +3 -3
- claude_mpm/core/log_manager.py +92 -23
- claude_mpm/core/logger.py +19 -14
- claude_mpm/core/logging_config.py +6 -2
- claude_mpm/core/logging_utils.py +520 -0
- claude_mpm/core/oneshot_session.py +51 -7
- claude_mpm/core/optimized_agent_loader.py +9 -9
- claude_mpm/core/optimized_startup.py +1 -1
- claude_mpm/core/output_style_manager.py +12 -192
- claude_mpm/core/pm_hook_interceptor.py +18 -12
- claude_mpm/core/service_registry.py +7 -3
- claude_mpm/core/session_manager.py +14 -12
- claude_mpm/core/shared/config_loader.py +1 -1
- claude_mpm/core/socketio_pool.py +15 -15
- claude_mpm/core/tool_access_control.py +3 -2
- claude_mpm/core/types.py +4 -11
- claude_mpm/core/typing_utils.py +7 -6
- claude_mpm/core/unified_agent_registry.py +115 -11
- claude_mpm/core/unified_config.py +6 -6
- claude_mpm/core/unified_paths.py +23 -20
- claude_mpm/dashboard/analysis_runner.py +4 -4
- claude_mpm/dashboard/api/simple_directory.py +261 -0
- claude_mpm/dashboard/react/components/DataInspector/DataInspector.module.css +188 -0
- claude_mpm/dashboard/react/components/EventViewer/EventViewer.module.css +156 -0
- claude_mpm/dashboard/react/components/shared/ConnectionStatus.module.css +38 -0
- claude_mpm/dashboard/react/components/shared/FilterBar.module.css +92 -0
- claude_mpm/dashboard/static/archive/activity_dashboard_fixed.html +248 -0
- claude_mpm/dashboard/static/archive/activity_dashboard_test.html +61 -0
- claude_mpm/dashboard/static/archive/test_activity_connection.html +179 -0
- claude_mpm/dashboard/static/archive/test_claude_tree_tab.html +68 -0
- claude_mpm/dashboard/static/archive/test_dashboard.html +409 -0
- claude_mpm/dashboard/static/archive/test_dashboard_fixed.html +519 -0
- claude_mpm/dashboard/static/archive/test_dashboard_verification.html +181 -0
- claude_mpm/dashboard/static/archive/test_file_data.html +315 -0
- claude_mpm/dashboard/static/archive/test_file_tree_empty_state.html +243 -0
- claude_mpm/dashboard/static/archive/test_file_tree_fix.html +234 -0
- claude_mpm/dashboard/static/archive/test_file_tree_rename.html +117 -0
- claude_mpm/dashboard/static/archive/test_file_tree_tab.html +115 -0
- claude_mpm/dashboard/static/archive/test_file_viewer.html +224 -0
- claude_mpm/dashboard/static/archive/test_final_activity.html +220 -0
- claude_mpm/dashboard/static/archive/test_tab_fix.html +139 -0
- claude_mpm/dashboard/static/built/assets/events.DjpNxWNo.css +1 -0
- claude_mpm/dashboard/static/built/components/activity-tree.js +1 -1
- claude_mpm/dashboard/static/built/components/agent-hierarchy.js +777 -0
- claude_mpm/dashboard/static/built/components/agent-inference.js +1 -1
- claude_mpm/dashboard/static/built/components/build-tracker.js +333 -0
- claude_mpm/dashboard/static/built/components/code-simple.js +857 -0
- claude_mpm/dashboard/static/built/components/code-tree/tree-breadcrumb.js +353 -0
- claude_mpm/dashboard/static/built/components/code-tree/tree-constants.js +235 -0
- claude_mpm/dashboard/static/built/components/code-tree/tree-search.js +409 -0
- claude_mpm/dashboard/static/built/components/code-tree/tree-utils.js +435 -0
- claude_mpm/dashboard/static/built/components/code-tree.js +1 -1
- claude_mpm/dashboard/static/built/components/code-viewer.js +1 -1
- claude_mpm/dashboard/static/built/components/connection-debug.js +654 -0
- claude_mpm/dashboard/static/built/components/diff-viewer.js +891 -0
- claude_mpm/dashboard/static/built/components/event-processor.js +1 -1
- claude_mpm/dashboard/static/built/components/event-viewer.js +1 -1
- claude_mpm/dashboard/static/built/components/export-manager.js +1 -1
- claude_mpm/dashboard/static/built/components/file-change-tracker.js +443 -0
- claude_mpm/dashboard/static/built/components/file-change-viewer.js +690 -0
- claude_mpm/dashboard/static/built/components/file-tool-tracker.js +1 -1
- claude_mpm/dashboard/static/built/components/file-viewer.js +2 -0
- claude_mpm/dashboard/static/built/components/module-viewer.js +1 -1
- claude_mpm/dashboard/static/built/components/nav-bar.js +145 -0
- claude_mpm/dashboard/static/built/components/page-structure.js +429 -0
- claude_mpm/dashboard/static/built/components/session-manager.js +1 -1
- claude_mpm/dashboard/static/built/components/unified-data-viewer.js +1 -1
- claude_mpm/dashboard/static/built/components/working-directory.js +1 -1
- claude_mpm/dashboard/static/built/connection-manager.js +536 -0
- claude_mpm/dashboard/static/built/dashboard.js +1 -1
- claude_mpm/dashboard/static/built/extension-error-handler.js +164 -0
- claude_mpm/dashboard/static/built/react/events.js +30 -0
- claude_mpm/dashboard/static/built/shared/dom-helpers.js +396 -0
- claude_mpm/dashboard/static/built/shared/event-bus.js +330 -0
- claude_mpm/dashboard/static/built/shared/event-filter-service.js +540 -0
- claude_mpm/dashboard/static/built/shared/logger.js +385 -0
- claude_mpm/dashboard/static/built/shared/page-structure.js +249 -0
- claude_mpm/dashboard/static/built/shared/tooltip-service.js +253 -0
- claude_mpm/dashboard/static/built/socket-client.js +1 -1
- claude_mpm/dashboard/static/built/tab-isolation-fix.js +185 -0
- claude_mpm/dashboard/static/css/dashboard.css +588 -6
- claude_mpm/dashboard/static/dist/assets/events.DjpNxWNo.css +1 -0
- claude_mpm/dashboard/static/dist/components/activity-tree.js +1 -1
- claude_mpm/dashboard/static/dist/components/agent-inference.js +1 -1
- claude_mpm/dashboard/static/dist/components/code-tree.js +1 -1
- claude_mpm/dashboard/static/dist/components/code-viewer.js +1 -1
- claude_mpm/dashboard/static/dist/components/event-processor.js +1 -1
- claude_mpm/dashboard/static/dist/components/event-viewer.js +1 -1
- claude_mpm/dashboard/static/dist/components/export-manager.js +1 -1
- claude_mpm/dashboard/static/dist/components/file-tool-tracker.js +1 -1
- claude_mpm/dashboard/static/dist/components/file-viewer.js +2 -0
- claude_mpm/dashboard/static/dist/components/module-viewer.js +1 -1
- claude_mpm/dashboard/static/dist/components/session-manager.js +1 -1
- claude_mpm/dashboard/static/dist/components/unified-data-viewer.js +1 -1
- claude_mpm/dashboard/static/dist/components/working-directory.js +1 -1
- claude_mpm/dashboard/static/dist/dashboard.js +1 -1
- claude_mpm/dashboard/static/dist/react/events.js +30 -0
- claude_mpm/dashboard/static/dist/socket-client.js +1 -1
- claude_mpm/dashboard/static/events.html +607 -0
- claude_mpm/dashboard/static/index.html +635 -0
- claude_mpm/dashboard/static/js/components/activity-tree.js +3 -17
- claude_mpm/dashboard/static/js/components/agent-hierarchy.js +4 -1
- claude_mpm/dashboard/static/js/components/agent-inference.js +3 -0
- claude_mpm/dashboard/static/js/components/build-tracker.js +8 -0
- claude_mpm/dashboard/static/js/components/code-simple.js +857 -0
- claude_mpm/dashboard/static/js/components/diff-viewer.js +891 -0
- claude_mpm/dashboard/static/js/components/event-processor.js +3 -0
- claude_mpm/dashboard/static/js/components/event-viewer.js +39 -2
- claude_mpm/dashboard/static/js/components/export-manager.js +3 -0
- claude_mpm/dashboard/static/js/components/file-change-tracker.js +443 -0
- claude_mpm/dashboard/static/js/components/file-change-viewer.js +690 -0
- claude_mpm/dashboard/static/js/components/file-tool-tracker.js +30 -10
- claude_mpm/dashboard/static/js/components/file-viewer.js +580 -0
- claude_mpm/dashboard/static/js/components/module-viewer.js +26 -0
- claude_mpm/dashboard/static/js/components/session-manager.js +7 -7
- claude_mpm/dashboard/static/js/components/socket-manager.js +4 -0
- claude_mpm/dashboard/static/js/components/ui-state-manager.js +356 -41
- claude_mpm/dashboard/static/js/components/unified-data-viewer.js +455 -23
- claude_mpm/dashboard/static/js/components/working-directory.js +44 -9
- claude_mpm/dashboard/static/js/dashboard.js +245 -132
- claude_mpm/dashboard/static/js/shared/dom-helpers.js +396 -0
- claude_mpm/dashboard/static/js/shared/event-bus.js +330 -0
- claude_mpm/dashboard/static/js/shared/logger.js +385 -0
- claude_mpm/dashboard/static/js/shared/tooltip-service.js +253 -0
- claude_mpm/dashboard/static/js/socket-client.js +49 -22
- claude_mpm/dashboard/static/js/stores/dashboard-store.js +562 -0
- claude_mpm/dashboard/static/js/tab-isolation-fix.js +185 -0
- claude_mpm/dashboard/static/legacy/activity.html +736 -0
- claude_mpm/dashboard/static/legacy/agents.html +786 -0
- claude_mpm/dashboard/static/legacy/files.html +747 -0
- claude_mpm/dashboard/static/legacy/tools.html +831 -0
- claude_mpm/dashboard/static/monitors.html +431 -0
- claude_mpm/dashboard/static/production/events.html +659 -0
- claude_mpm/dashboard/static/production/main.html +698 -0
- claude_mpm/dashboard/static/production/monitors.html +483 -0
- claude_mpm/dashboard/static/socket.io.min.js +7 -0
- claude_mpm/dashboard/static/socket.io.v4.8.1.backup.js +7 -0
- claude_mpm/dashboard/static/test-archive/dashboard.html +635 -0
- claude_mpm/dashboard/static/test-archive/debug-events.html +147 -0
- claude_mpm/dashboard/static/test-archive/test-navigation.html +256 -0
- claude_mpm/dashboard/static/test-archive/test-react-exports.html +180 -0
- claude_mpm/dashboard/static/test-archive/test_debug.html +25 -0
- claude_mpm/dashboard/templates/code_simple.html +153 -0
- claude_mpm/dashboard/templates/index.html +112 -109
- claude_mpm/experimental/cli_enhancements.py +4 -2
- claude_mpm/generators/agent_profile_generator.py +5 -3
- claude_mpm/hooks/__init__.py +37 -1
- claude_mpm/hooks/base_hook.py +5 -4
- claude_mpm/hooks/claude_hooks/connection_pool.py +4 -4
- claude_mpm/hooks/claude_hooks/event_handlers.py +21 -18
- claude_mpm/hooks/claude_hooks/hook_handler.py +29 -22
- claude_mpm/hooks/claude_hooks/installer.py +67 -22
- claude_mpm/hooks/claude_hooks/memory_integration.py +3 -3
- claude_mpm/hooks/claude_hooks/response_tracking.py +57 -17
- claude_mpm/hooks/claude_hooks/services/connection_manager.py +62 -64
- claude_mpm/hooks/claude_hooks/services/connection_manager_http.py +140 -76
- claude_mpm/hooks/claude_hooks/services/state_manager.py +11 -9
- claude_mpm/hooks/claude_hooks/services/subagent_processor.py +3 -3
- claude_mpm/hooks/failure_learning/__init__.py +60 -0
- claude_mpm/hooks/failure_learning/failure_detection_hook.py +235 -0
- claude_mpm/hooks/failure_learning/fix_detection_hook.py +217 -0
- claude_mpm/hooks/failure_learning/learning_extraction_hook.py +286 -0
- claude_mpm/hooks/instruction_reinforcement.py +301 -0
- claude_mpm/hooks/kuzu_enrichment_hook.py +263 -0
- claude_mpm/hooks/kuzu_memory_hook.py +386 -0
- claude_mpm/hooks/kuzu_response_hook.py +183 -0
- claude_mpm/hooks/memory_integration_hook.py +1 -1
- claude_mpm/hooks/session_resume_hook.py +121 -0
- claude_mpm/hooks/templates/pre_tool_use_simple.py +78 -0
- claude_mpm/hooks/templates/pre_tool_use_template.py +323 -0
- claude_mpm/hooks/tool_call_interceptor.py +8 -5
- claude_mpm/hooks/validation_hooks.py +3 -3
- claude_mpm/init.py +23 -4
- claude_mpm/models/agent_session.py +8 -6
- claude_mpm/models/resume_log.py +340 -0
- claude_mpm/scripts/claude-hook-handler.sh +33 -7
- claude_mpm/scripts/launch_monitor.py +85 -0
- claude_mpm/scripts/mcp_server.py +3 -5
- claude_mpm/scripts/mpm_doctor.py +3 -2
- claude_mpm/scripts/socketio_daemon.py +159 -512
- claude_mpm/services/__init__.py +144 -160
- claude_mpm/services/agents/__init__.py +18 -5
- claude_mpm/services/agents/agent_builder.py +13 -11
- claude_mpm/services/agents/auto_config_manager.py +796 -0
- claude_mpm/services/agents/deployment/agent_configuration_manager.py +1 -1
- claude_mpm/services/agents/deployment/agent_deployment.py +38 -15
- claude_mpm/services/agents/deployment/agent_discovery_service.py +125 -7
- claude_mpm/services/agents/deployment/agent_filesystem_manager.py +5 -5
- claude_mpm/services/agents/deployment/agent_format_converter.py +56 -12
- claude_mpm/services/agents/deployment/agent_lifecycle_manager.py +4 -2
- claude_mpm/services/agents/deployment/agent_operation_service.py +2 -2
- claude_mpm/services/agents/deployment/agent_record_service.py +4 -4
- claude_mpm/services/agents/deployment/agent_state_service.py +2 -2
- claude_mpm/services/agents/deployment/agent_template_builder.py +715 -47
- claude_mpm/services/agents/deployment/agent_validator.py +31 -7
- claude_mpm/services/agents/deployment/agent_version_manager.py +8 -5
- claude_mpm/services/agents/deployment/agent_versioning.py +1 -1
- claude_mpm/services/agents/deployment/async_agent_deployment.py +1 -1
- claude_mpm/services/agents/deployment/deployment_config_loader.py +131 -7
- claude_mpm/services/agents/deployment/deployment_type_detector.py +10 -14
- claude_mpm/services/agents/deployment/deployment_wrapper.py +58 -0
- claude_mpm/services/agents/deployment/interface_adapter.py +3 -2
- claude_mpm/services/agents/deployment/local_template_deployment.py +360 -0
- claude_mpm/services/agents/deployment/multi_source_deployment_service.py +134 -38
- claude_mpm/services/agents/deployment/pipeline/steps/agent_processing_step.py +8 -7
- claude_mpm/services/agents/deployment/pipeline/steps/base_step.py +7 -16
- claude_mpm/services/agents/deployment/pipeline/steps/configuration_step.py +4 -3
- claude_mpm/services/agents/deployment/pipeline/steps/target_directory_step.py +7 -5
- claude_mpm/services/agents/deployment/pipeline/steps/validation_step.py +6 -5
- claude_mpm/services/agents/deployment/refactored_agent_deployment_service.py +9 -6
- claude_mpm/services/agents/deployment/system_instructions_deployer.py +9 -6
- claude_mpm/services/agents/deployment/validation/__init__.py +3 -1
- claude_mpm/services/agents/deployment/validation/template_validator.py +64 -44
- claude_mpm/services/agents/deployment/validation/validation_result.py +1 -9
- claude_mpm/services/agents/loading/agent_profile_loader.py +10 -9
- claude_mpm/services/agents/loading/base_agent_manager.py +16 -6
- claude_mpm/services/agents/loading/framework_agent_loader.py +2 -2
- claude_mpm/services/agents/local_template_manager.py +744 -0
- claude_mpm/services/agents/management/agent_capabilities_generator.py +3 -2
- claude_mpm/services/agents/management/agent_management_service.py +5 -5
- claude_mpm/services/agents/memory/agent_memory_manager.py +32 -29
- claude_mpm/services/agents/memory/content_manager.py +17 -9
- claude_mpm/services/agents/memory/memory_categorization_service.py +4 -2
- claude_mpm/services/agents/memory/memory_file_service.py +32 -6
- claude_mpm/services/agents/memory/memory_format_service.py +6 -4
- claude_mpm/services/agents/memory/memory_limits_service.py +4 -2
- claude_mpm/services/agents/memory/template_generator.py +3 -3
- claude_mpm/services/agents/observers.py +547 -0
- claude_mpm/services/agents/recommender.py +615 -0
- claude_mpm/services/agents/registry/deployed_agent_discovery.py +3 -3
- claude_mpm/services/agents/registry/modification_tracker.py +30 -19
- claude_mpm/services/async_session_logger.py +141 -98
- claude_mpm/services/claude_session_logger.py +82 -74
- claude_mpm/services/cli/agent_cleanup_service.py +5 -0
- claude_mpm/services/cli/agent_listing_service.py +5 -5
- claude_mpm/services/cli/agent_validation_service.py +3 -1
- claude_mpm/services/cli/memory_crud_service.py +12 -7
- claude_mpm/services/cli/memory_output_formatter.py +2 -2
- claude_mpm/services/cli/resume_service.py +617 -0
- claude_mpm/services/cli/session_manager.py +104 -13
- claude_mpm/services/cli/session_pause_manager.py +504 -0
- claude_mpm/services/cli/session_resume_helper.py +372 -0
- claude_mpm/services/cli/startup_checker.py +13 -10
- claude_mpm/services/cli/unified_dashboard_manager.py +439 -0
- claude_mpm/services/command_deployment_service.py +9 -7
- claude_mpm/services/command_handler_service.py +11 -5
- claude_mpm/services/core/__init__.py +33 -1
- claude_mpm/services/core/base.py +26 -11
- claude_mpm/services/core/interfaces/__init__.py +90 -3
- claude_mpm/services/core/interfaces/agent.py +184 -0
- claude_mpm/services/core/interfaces/health.py +172 -0
- claude_mpm/services/core/interfaces/model.py +281 -0
- claude_mpm/services/core/interfaces/process.py +372 -0
- claude_mpm/services/core/interfaces/project.py +121 -0
- claude_mpm/services/core/interfaces/restart.py +307 -0
- claude_mpm/services/core/interfaces/stability.py +260 -0
- claude_mpm/services/core/interfaces.py +56 -1
- claude_mpm/services/core/memory_manager.py +92 -47
- claude_mpm/services/core/models/__init__.py +79 -0
- claude_mpm/services/core/models/agent_config.py +384 -0
- claude_mpm/services/core/models/health.py +162 -0
- claude_mpm/services/core/models/process.py +239 -0
- claude_mpm/services/core/models/restart.py +302 -0
- claude_mpm/services/core/models/stability.py +264 -0
- claude_mpm/services/core/models/toolchain.py +306 -0
- claude_mpm/services/core/path_resolver.py +36 -14
- claude_mpm/services/diagnostics/__init__.py +2 -2
- claude_mpm/services/diagnostics/checks/__init__.py +4 -2
- claude_mpm/services/diagnostics/checks/agent_check.py +30 -32
- claude_mpm/services/diagnostics/checks/claude_code_check.py +270 -0
- claude_mpm/services/diagnostics/checks/common_issues_check.py +28 -27
- claude_mpm/services/diagnostics/checks/configuration_check.py +26 -25
- claude_mpm/services/diagnostics/checks/filesystem_check.py +18 -17
- claude_mpm/services/diagnostics/checks/installation_check.py +165 -60
- claude_mpm/services/diagnostics/checks/instructions_check.py +20 -19
- claude_mpm/services/diagnostics/checks/mcp_check.py +57 -43
- claude_mpm/services/diagnostics/checks/mcp_services_check.py +1066 -0
- claude_mpm/services/diagnostics/checks/monitor_check.py +24 -23
- claude_mpm/services/diagnostics/checks/startup_log_check.py +14 -11
- claude_mpm/services/diagnostics/diagnostic_runner.py +22 -13
- claude_mpm/services/diagnostics/doctor_reporter.py +275 -47
- claude_mpm/services/diagnostics/models.py +37 -21
- claude_mpm/services/event_aggregator.py +5 -3
- claude_mpm/services/event_bus/direct_relay.py +8 -4
- claude_mpm/services/event_bus/event_bus.py +51 -9
- claude_mpm/services/event_bus/relay.py +33 -14
- claude_mpm/services/events/consumers/dead_letter.py +7 -5
- claude_mpm/services/events/core.py +5 -6
- claude_mpm/services/events/producers/hook.py +6 -6
- claude_mpm/services/events/producers/system.py +8 -8
- claude_mpm/services/exceptions.py +5 -5
- claude_mpm/services/framework_claude_md_generator/__init__.py +1 -1
- claude_mpm/services/framework_claude_md_generator/content_assembler.py +5 -5
- claude_mpm/services/framework_claude_md_generator/content_validator.py +2 -2
- claude_mpm/services/framework_claude_md_generator/deployment_manager.py +3 -3
- claude_mpm/services/framework_claude_md_generator/section_generators/__init__.py +2 -2
- claude_mpm/services/framework_claude_md_generator/version_manager.py +1 -1
- claude_mpm/services/hook_installer_service.py +506 -0
- claude_mpm/services/hook_service.py +5 -6
- claude_mpm/services/infrastructure/context_preservation.py +13 -11
- claude_mpm/services/infrastructure/daemon_manager.py +9 -9
- claude_mpm/services/infrastructure/logging.py +2 -2
- claude_mpm/services/infrastructure/monitoring/__init__.py +1 -1
- claude_mpm/services/infrastructure/monitoring/aggregator.py +12 -12
- claude_mpm/services/infrastructure/monitoring/base.py +5 -13
- claude_mpm/services/infrastructure/monitoring/network.py +7 -6
- claude_mpm/services/infrastructure/monitoring/process.py +13 -12
- claude_mpm/services/infrastructure/monitoring/resources.py +8 -7
- claude_mpm/services/infrastructure/monitoring/service.py +16 -15
- claude_mpm/services/infrastructure/resume_log_generator.py +439 -0
- claude_mpm/services/local_ops/__init__.py +165 -0
- claude_mpm/services/local_ops/crash_detector.py +257 -0
- claude_mpm/services/local_ops/health_checks/__init__.py +28 -0
- claude_mpm/services/local_ops/health_checks/http_check.py +224 -0
- claude_mpm/services/local_ops/health_checks/process_check.py +236 -0
- claude_mpm/services/local_ops/health_checks/resource_check.py +255 -0
- claude_mpm/services/local_ops/health_manager.py +430 -0
- claude_mpm/services/local_ops/log_monitor.py +396 -0
- claude_mpm/services/local_ops/memory_leak_detector.py +294 -0
- claude_mpm/services/local_ops/process_manager.py +595 -0
- claude_mpm/services/local_ops/resource_monitor.py +331 -0
- claude_mpm/services/local_ops/restart_manager.py +401 -0
- claude_mpm/services/local_ops/restart_policy.py +387 -0
- claude_mpm/services/local_ops/state_manager.py +372 -0
- claude_mpm/services/local_ops/unified_manager.py +600 -0
- claude_mpm/services/mcp_config_manager.py +1612 -0
- claude_mpm/services/mcp_gateway/__init__.py +97 -93
- claude_mpm/services/mcp_gateway/auto_configure.py +43 -38
- claude_mpm/services/mcp_gateway/config/config_loader.py +3 -3
- claude_mpm/services/mcp_gateway/config/configuration.py +23 -4
- claude_mpm/services/mcp_gateway/core/__init__.py +1 -2
- claude_mpm/services/mcp_gateway/core/base.py +20 -33
- claude_mpm/services/mcp_gateway/core/process_pool.py +585 -31
- claude_mpm/services/mcp_gateway/core/singleton_manager.py +2 -2
- claude_mpm/services/mcp_gateway/core/startup_verification.py +3 -3
- claude_mpm/services/mcp_gateway/main.py +90 -15
- claude_mpm/services/mcp_gateway/registry/service_registry.py +4 -2
- claude_mpm/services/mcp_gateway/registry/tool_registry.py +12 -9
- claude_mpm/services/mcp_gateway/server/mcp_gateway.py +4 -4
- claude_mpm/services/mcp_gateway/server/stdio_server.py +9 -15
- claude_mpm/services/mcp_gateway/tools/__init__.py +14 -2
- claude_mpm/services/mcp_gateway/tools/base_adapter.py +15 -15
- claude_mpm/services/mcp_gateway/tools/document_summarizer.py +10 -9
- claude_mpm/services/mcp_gateway/tools/external_mcp_services.py +654 -0
- claude_mpm/services/mcp_gateway/tools/health_check_tool.py +36 -34
- claude_mpm/services/mcp_gateway/tools/hello_world.py +8 -8
- claude_mpm/services/mcp_gateway/tools/kuzu_memory_service.py +551 -0
- claude_mpm/services/mcp_gateway/utils/__init__.py +14 -0
- claude_mpm/services/mcp_gateway/utils/package_version_checker.py +160 -0
- claude_mpm/services/mcp_gateway/utils/update_preferences.py +170 -0
- claude_mpm/services/mcp_service_verifier.py +729 -0
- claude_mpm/services/memory/builder.py +9 -8
- claude_mpm/services/memory/cache/shared_prompt_cache.py +2 -1
- claude_mpm/services/memory/cache/simple_cache.py +2 -2
- claude_mpm/services/memory/failure_tracker.py +578 -0
- claude_mpm/services/memory/indexed_memory.py +8 -8
- claude_mpm/services/memory/optimizer.py +8 -9
- claude_mpm/services/memory/router.py +3 -3
- claude_mpm/services/memory_hook_service.py +165 -4
- claude_mpm/services/model/__init__.py +147 -0
- claude_mpm/services/model/base_provider.py +365 -0
- claude_mpm/services/model/claude_provider.py +412 -0
- claude_mpm/services/model/model_router.py +453 -0
- claude_mpm/services/model/ollama_provider.py +415 -0
- claude_mpm/services/monitor/__init__.py +20 -0
- claude_mpm/services/monitor/daemon.py +671 -0
- claude_mpm/services/monitor/daemon_manager.py +963 -0
- claude_mpm/services/monitor/event_emitter.py +350 -0
- claude_mpm/services/monitor/handlers/__init__.py +21 -0
- claude_mpm/services/monitor/handlers/code_analysis.py +332 -0
- claude_mpm/services/monitor/handlers/dashboard.py +299 -0
- claude_mpm/services/monitor/handlers/file.py +264 -0
- claude_mpm/services/monitor/handlers/hooks.py +512 -0
- claude_mpm/services/monitor/management/__init__.py +18 -0
- claude_mpm/services/monitor/management/health.py +124 -0
- claude_mpm/services/monitor/management/lifecycle.py +724 -0
- claude_mpm/services/monitor/server.py +817 -0
- claude_mpm/services/monitor_build_service.py +2 -2
- claude_mpm/services/native_agent_converter.py +356 -0
- claude_mpm/services/orphan_detection.py +786 -0
- claude_mpm/services/port_manager.py +2 -2
- claude_mpm/services/project/__init__.py +23 -0
- claude_mpm/services/project/analyzer.py +3 -3
- claude_mpm/services/project/architecture_analyzer.py +5 -5
- claude_mpm/services/project/archive_manager.py +1045 -0
- claude_mpm/services/project/dependency_analyzer.py +4 -4
- claude_mpm/services/project/detection_strategies.py +719 -0
- claude_mpm/services/project/documentation_manager.py +553 -0
- claude_mpm/services/project/enhanced_analyzer.py +572 -0
- claude_mpm/services/project/metrics_collector.py +4 -4
- claude_mpm/services/project/project_organizer.py +1005 -0
- claude_mpm/services/project/registry.py +13 -7
- claude_mpm/services/project/toolchain_analyzer.py +581 -0
- claude_mpm/services/project_port_allocator.py +596 -0
- claude_mpm/services/response_tracker.py +21 -10
- claude_mpm/services/runner_configuration_service.py +1 -0
- claude_mpm/services/self_upgrade_service.py +500 -0
- claude_mpm/services/session_management_service.py +7 -5
- claude_mpm/services/session_manager.py +380 -0
- claude_mpm/services/shared/__init__.py +2 -1
- claude_mpm/services/shared/async_service_base.py +16 -27
- claude_mpm/services/shared/config_service_base.py +17 -14
- claude_mpm/services/shared/lifecycle_service_base.py +1 -14
- claude_mpm/services/shared/service_factory.py +8 -5
- claude_mpm/services/socketio/client_proxy.py +60 -5
- claude_mpm/services/socketio/dashboard_server.py +361 -0
- claude_mpm/services/socketio/event_normalizer.py +10 -6
- claude_mpm/services/socketio/handlers/__init__.py +5 -2
- claude_mpm/services/socketio/handlers/base.py +2 -2
- claude_mpm/services/socketio/handlers/code_analysis.py +90 -27
- claude_mpm/services/socketio/handlers/connection.py +21 -40
- claude_mpm/services/socketio/handlers/connection_handler.py +13 -10
- claude_mpm/services/socketio/handlers/file.py +46 -10
- claude_mpm/services/socketio/handlers/git.py +8 -8
- claude_mpm/services/socketio/handlers/hook.py +29 -17
- claude_mpm/services/socketio/handlers/registry.py +4 -2
- claude_mpm/services/socketio/monitor_client.py +364 -0
- claude_mpm/services/socketio/server/broadcaster.py +9 -7
- claude_mpm/services/socketio/server/connection_manager.py +2 -2
- claude_mpm/services/socketio/server/core.py +141 -4
- claude_mpm/services/socketio/server/eventbus_integration.py +20 -14
- claude_mpm/services/socketio/server/main.py +23 -21
- claude_mpm/services/socketio_client_manager.py +4 -4
- claude_mpm/services/subprocess_launcher_service.py +19 -15
- claude_mpm/services/system_instructions_service.py +2 -2
- claude_mpm/services/ticket_services/formatter_service.py +1 -1
- claude_mpm/services/ticket_services/validation_service.py +5 -5
- claude_mpm/services/unified/__init__.py +65 -0
- claude_mpm/services/unified/analyzer_strategies/__init__.py +44 -0
- claude_mpm/services/unified/analyzer_strategies/code_analyzer.py +518 -0
- claude_mpm/services/unified/analyzer_strategies/dependency_analyzer.py +680 -0
- claude_mpm/services/unified/analyzer_strategies/performance_analyzer.py +903 -0
- claude_mpm/services/unified/analyzer_strategies/security_analyzer.py +746 -0
- claude_mpm/services/unified/analyzer_strategies/structure_analyzer.py +733 -0
- claude_mpm/services/unified/config_strategies/__init__.py +175 -0
- claude_mpm/services/unified/config_strategies/config_schema.py +731 -0
- claude_mpm/services/unified/config_strategies/context_strategy.py +747 -0
- claude_mpm/services/unified/config_strategies/error_handling_strategy.py +1005 -0
- claude_mpm/services/unified/config_strategies/file_loader_strategy.py +881 -0
- claude_mpm/services/unified/config_strategies/unified_config_service.py +823 -0
- claude_mpm/services/unified/config_strategies/validation_strategy.py +1148 -0
- claude_mpm/services/unified/deployment_strategies/__init__.py +97 -0
- claude_mpm/services/unified/deployment_strategies/base.py +553 -0
- claude_mpm/services/unified/deployment_strategies/cloud_strategies.py +573 -0
- claude_mpm/services/unified/deployment_strategies/local.py +607 -0
- claude_mpm/services/unified/deployment_strategies/utils.py +667 -0
- claude_mpm/services/unified/deployment_strategies/vercel.py +475 -0
- claude_mpm/services/unified/interfaces.py +475 -0
- claude_mpm/services/unified/migration.py +509 -0
- claude_mpm/services/unified/strategies.py +534 -0
- claude_mpm/services/unified/unified_analyzer.py +542 -0
- claude_mpm/services/unified/unified_config.py +691 -0
- claude_mpm/services/unified/unified_deployment.py +470 -0
- claude_mpm/services/utility_service.py +6 -3
- claude_mpm/services/version_control/branch_strategy.py +2 -2
- claude_mpm/services/version_control/conflict_resolution.py +8 -4
- claude_mpm/services/version_control/git_operations.py +26 -24
- claude_mpm/services/version_control/semantic_versioning.py +14 -14
- claude_mpm/services/version_control/version_parser.py +14 -11
- claude_mpm/services/version_service.py +104 -1
- claude_mpm/skills/__init__.py +42 -0
- claude_mpm/skills/agent_skills_injector.py +324 -0
- claude_mpm/skills/bundled/LICENSE_ATTRIBUTIONS.md +79 -0
- claude_mpm/skills/bundled/__init__.py +6 -0
- claude_mpm/skills/bundled/api-documentation.md +393 -0
- claude_mpm/skills/bundled/async-testing.md +571 -0
- claude_mpm/skills/bundled/code-review.md +143 -0
- claude_mpm/skills/bundled/collaboration/brainstorming/SKILL.md +79 -0
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/SKILL.md +178 -0
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/agent-prompts.md +577 -0
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/coordination-patterns.md +467 -0
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/examples.md +537 -0
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/troubleshooting.md +730 -0
- claude_mpm/skills/bundled/collaboration/requesting-code-review/SKILL.md +112 -0
- claude_mpm/skills/bundled/collaboration/requesting-code-review/references/code-reviewer-template.md +146 -0
- claude_mpm/skills/bundled/collaboration/requesting-code-review/references/review-examples.md +412 -0
- claude_mpm/skills/bundled/collaboration/writing-plans/SKILL.md +81 -0
- claude_mpm/skills/bundled/collaboration/writing-plans/references/best-practices.md +362 -0
- claude_mpm/skills/bundled/collaboration/writing-plans/references/plan-structure-templates.md +312 -0
- claude_mpm/skills/bundled/database-migration.md +199 -0
- claude_mpm/skills/bundled/debugging/root-cause-tracing/SKILL.md +152 -0
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/advanced-techniques.md +668 -0
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/examples.md +587 -0
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/integration.md +438 -0
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/tracing-techniques.md +391 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/CREATION-LOG.md +119 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/SKILL.md +148 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/anti-patterns.md +483 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/examples.md +452 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/troubleshooting.md +449 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/workflow.md +411 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-academic.md +14 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-1.md +58 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-2.md +68 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-3.md +69 -0
- claude_mpm/skills/bundled/debugging/verification-before-completion/SKILL.md +131 -0
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/gate-function.md +325 -0
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/integration-and-workflows.md +490 -0
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/red-flags-and-failures.md +425 -0
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/verification-patterns.md +499 -0
- claude_mpm/skills/bundled/docker-containerization.md +194 -0
- claude_mpm/skills/bundled/express-local-dev.md +1429 -0
- claude_mpm/skills/bundled/fastapi-local-dev.md +1199 -0
- claude_mpm/skills/bundled/git-workflow.md +414 -0
- claude_mpm/skills/bundled/imagemagick.md +204 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/scripts/validate_env.py +576 -0
- claude_mpm/skills/bundled/json-data-handling.md +223 -0
- claude_mpm/skills/bundled/main/artifacts-builder/SKILL.md +86 -0
- claude_mpm/skills/bundled/main/internal-comms/SKILL.md +43 -0
- claude_mpm/skills/bundled/main/internal-comms/examples/3p-updates.md +47 -0
- claude_mpm/skills/bundled/main/internal-comms/examples/company-newsletter.md +65 -0
- claude_mpm/skills/bundled/main/internal-comms/examples/faq-answers.md +30 -0
- claude_mpm/skills/bundled/main/internal-comms/examples/general-comms.md +16 -0
- claude_mpm/skills/bundled/main/mcp-builder/SKILL.md +160 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/design_principles.md +412 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/evaluation.md +602 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/mcp_best_practices.md +915 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/node_mcp_server.md +916 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/python_mcp_server.md +752 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/workflow.md +1237 -0
- claude_mpm/skills/bundled/main/mcp-builder/scripts/connections.py +157 -0
- claude_mpm/skills/bundled/main/mcp-builder/scripts/evaluation.py +425 -0
- claude_mpm/skills/bundled/main/skill-creator/SKILL.md +189 -0
- claude_mpm/skills/bundled/main/skill-creator/references/best-practices.md +500 -0
- claude_mpm/skills/bundled/main/skill-creator/references/creation-workflow.md +464 -0
- claude_mpm/skills/bundled/main/skill-creator/references/examples.md +619 -0
- claude_mpm/skills/bundled/main/skill-creator/references/progressive-disclosure.md +437 -0
- claude_mpm/skills/bundled/main/skill-creator/references/skill-structure.md +231 -0
- claude_mpm/skills/bundled/main/skill-creator/scripts/init_skill.py +303 -0
- claude_mpm/skills/bundled/main/skill-creator/scripts/package_skill.py +113 -0
- claude_mpm/skills/bundled/main/skill-creator/scripts/quick_validate.py +72 -0
- claude_mpm/skills/bundled/nextjs-local-dev.md +807 -0
- claude_mpm/skills/bundled/pdf.md +141 -0
- claude_mpm/skills/bundled/performance-profiling.md +573 -0
- claude_mpm/skills/bundled/php/espocrm-development/SKILL.md +170 -0
- claude_mpm/skills/bundled/php/espocrm-development/references/architecture.md +602 -0
- claude_mpm/skills/bundled/php/espocrm-development/references/common-tasks.md +821 -0
- claude_mpm/skills/bundled/php/espocrm-development/references/development-workflow.md +742 -0
- claude_mpm/skills/bundled/php/espocrm-development/references/frontend-customization.md +726 -0
- claude_mpm/skills/bundled/php/espocrm-development/references/hooks-and-services.md +764 -0
- claude_mpm/skills/bundled/php/espocrm-development/references/testing-debugging.md +831 -0
- claude_mpm/skills/bundled/refactoring-patterns.md +180 -0
- claude_mpm/skills/bundled/rust/desktop-applications/SKILL.md +226 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/architecture-patterns.md +901 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/native-gui-frameworks.md +901 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/platform-integration.md +775 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/state-management.md +937 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/tauri-framework.md +770 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/testing-deployment.md +961 -0
- claude_mpm/skills/bundled/security-scanning.md +327 -0
- claude_mpm/skills/bundled/systematic-debugging.md +473 -0
- claude_mpm/skills/bundled/test-driven-development.md +378 -0
- claude_mpm/skills/bundled/testing/condition-based-waiting/SKILL.md +119 -0
- claude_mpm/skills/bundled/testing/condition-based-waiting/references/patterns-and-implementation.md +253 -0
- claude_mpm/skills/bundled/testing/test-driven-development/SKILL.md +145 -0
- claude_mpm/skills/bundled/testing/test-driven-development/references/anti-patterns.md +543 -0
- claude_mpm/skills/bundled/testing/test-driven-development/references/examples.md +741 -0
- claude_mpm/skills/bundled/testing/test-driven-development/references/integration.md +470 -0
- claude_mpm/skills/bundled/testing/test-driven-development/references/philosophy.md +458 -0
- claude_mpm/skills/bundled/testing/test-driven-development/references/workflow.md +639 -0
- claude_mpm/skills/bundled/testing/testing-anti-patterns/SKILL.md +140 -0
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/completeness-anti-patterns.md +572 -0
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/core-anti-patterns.md +411 -0
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/detection-guide.md +569 -0
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/tdd-connection.md +695 -0
- claude_mpm/skills/bundled/testing/webapp-testing/SKILL.md +184 -0
- claude_mpm/skills/bundled/testing/webapp-testing/decision-tree.md +459 -0
- claude_mpm/skills/bundled/testing/webapp-testing/examples/console_logging.py +35 -0
- claude_mpm/skills/bundled/testing/webapp-testing/examples/element_discovery.py +44 -0
- claude_mpm/skills/bundled/testing/webapp-testing/examples/static_html_automation.py +34 -0
- claude_mpm/skills/bundled/testing/webapp-testing/playwright-patterns.md +479 -0
- claude_mpm/skills/bundled/testing/webapp-testing/reconnaissance-pattern.md +687 -0
- claude_mpm/skills/bundled/testing/webapp-testing/scripts/with_server.py +129 -0
- claude_mpm/skills/bundled/testing/webapp-testing/server-management.md +758 -0
- claude_mpm/skills/bundled/testing/webapp-testing/troubleshooting.md +868 -0
- claude_mpm/skills/bundled/vite-local-dev.md +1061 -0
- claude_mpm/skills/bundled/web-performance-optimization.md +2305 -0
- claude_mpm/skills/bundled/xlsx.md +157 -0
- claude_mpm/skills/registry.py +286 -0
- claude_mpm/skills/skill_manager.py +310 -0
- claude_mpm/skills/skills_registry.py +348 -0
- claude_mpm/skills/skills_service.py +739 -0
- claude_mpm/storage/state_storage.py +31 -31
- claude_mpm/tools/__main__.py +1 -1
- claude_mpm/tools/code_tree_analyzer/__init__.py +45 -0
- claude_mpm/tools/code_tree_analyzer/analysis.py +299 -0
- claude_mpm/tools/code_tree_analyzer/cache.py +131 -0
- claude_mpm/tools/code_tree_analyzer/core.py +380 -0
- claude_mpm/tools/code_tree_analyzer/discovery.py +403 -0
- claude_mpm/tools/code_tree_analyzer/events.py +168 -0
- claude_mpm/tools/code_tree_analyzer/gitignore.py +308 -0
- claude_mpm/tools/code_tree_analyzer/models.py +39 -0
- claude_mpm/tools/code_tree_analyzer/multilang_analyzer.py +224 -0
- claude_mpm/tools/code_tree_analyzer/python_analyzer.py +284 -0
- claude_mpm/tools/code_tree_builder.py +6 -6
- claude_mpm/tools/code_tree_events.py +14 -10
- claude_mpm/tools/socketio_debug.py +11 -11
- claude_mpm/utils/agent_dependency_loader.py +108 -27
- claude_mpm/utils/common.py +544 -0
- claude_mpm/utils/config_manager.py +12 -6
- claude_mpm/utils/database_connector.py +298 -0
- claude_mpm/utils/dependency_cache.py +2 -2
- claude_mpm/utils/dependency_strategies.py +15 -10
- claude_mpm/utils/display_helper.py +260 -0
- claude_mpm/utils/environment_context.py +4 -3
- claude_mpm/utils/error_handler.py +5 -3
- claude_mpm/utils/file_utils.py +13 -14
- claude_mpm/utils/git_analyzer.py +407 -0
- claude_mpm/utils/log_cleanup.py +627 -0
- claude_mpm/utils/path_operations.py +7 -4
- claude_mpm/utils/robust_installer.py +133 -24
- claude_mpm/utils/session_logging.py +2 -2
- claude_mpm/utils/subprocess_utils.py +9 -8
- claude_mpm/validation/agent_validator.py +6 -6
- claude_mpm/validation/frontmatter_validator.py +6 -6
- claude_mpm-4.24.0.dist-info/METADATA +675 -0
- claude_mpm-4.24.0.dist-info/RECORD +1018 -0
- {claude_mpm-4.1.26.dist-info ā claude_mpm-4.24.0.dist-info}/entry_points.txt +1 -0
- claude_mpm/agents/INSTRUCTIONS.md +0 -261
- claude_mpm/agents/templates/agent-manager.md +0 -619
- claude_mpm/cli/commands/configure_tui.py +0 -1927
- claude_mpm/cli/commands/mpm_init.py +0 -594
- claude_mpm/cli/commands/socketio_monitor.py +0 -233
- claude_mpm/dashboard/static/css/code-tree.css +0 -1408
- claude_mpm/dashboard/static/js/components/code-tree.js +0 -3220
- claude_mpm/dashboard/static/js/components/code-viewer.js +0 -480
- claude_mpm/hooks/claude_hooks/hook_handler_eventbus.py +0 -425
- claude_mpm/hooks/claude_hooks/hook_handler_original.py +0 -1040
- claude_mpm/hooks/claude_hooks/hook_handler_refactored.py +0 -347
- claude_mpm/scripts/socketio_daemon_hardened.py +0 -937
- claude_mpm/scripts/socketio_daemon_wrapper.py +0 -78
- claude_mpm/scripts/socketio_server_manager.py +0 -349
- claude_mpm/services/agents/deployment/agent_lifecycle_manager_refactored.py +0 -575
- claude_mpm/services/cli/dashboard_launcher.py +0 -423
- claude_mpm/services/cli/socketio_manager.py +0 -537
- claude_mpm/services/diagnostics/checks/claude_desktop_check.py +0 -286
- claude_mpm/services/mcp_gateway/tools/ticket_tools.py +0 -645
- claude_mpm/services/mcp_gateway/tools/unified_ticket_tool.py +0 -602
- claude_mpm/services/project/analyzer_refactored.py +0 -450
- claude_mpm/tools/code_tree_analyzer.py +0 -1693
- claude_mpm-4.1.26.dist-info/METADATA +0 -332
- claude_mpm-4.1.26.dist-info/RECORD +0 -606
- {claude_mpm-4.1.26.dist-info ā claude_mpm-4.24.0.dist-info}/WHEEL +0 -0
- {claude_mpm-4.1.26.dist-info ā claude_mpm-4.24.0.dist-info}/licenses/LICENSE +0 -0
- {claude_mpm-4.1.26.dist-info ā claude_mpm-4.24.0.dist-info}/top_level.txt +0 -0
|
@@ -1,571 +1,218 @@
|
|
|
1
1
|
#!/usr/bin/env python3
|
|
2
2
|
"""
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
This
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
- Pure Python implementation (no external deps)
|
|
11
|
-
- Virtual environment auto-detection
|
|
12
|
-
- Process management with PID tracking
|
|
13
|
-
- Signal handling for clean shutdown
|
|
14
|
-
- Port availability checking
|
|
15
|
-
- Background daemon execution
|
|
16
|
-
|
|
17
|
-
Architecture:
|
|
18
|
-
- Uses subprocess for server execution
|
|
19
|
-
- Implements daemon pattern with double-fork
|
|
20
|
-
- Maintains PID files for process tracking
|
|
21
|
-
- Auto-detects Python environment (venv/conda)
|
|
22
|
-
|
|
23
|
-
Thread Safety:
|
|
24
|
-
- Signal handlers are async-signal-safe
|
|
25
|
-
- PID file operations use atomic writes
|
|
26
|
-
- Process checks use system-level primitives
|
|
27
|
-
|
|
28
|
-
Performance Considerations:
|
|
29
|
-
- Minimal memory footprint for daemon mode
|
|
30
|
-
- Fast process detection using PID files
|
|
31
|
-
- Lazy loading of heavy imports
|
|
32
|
-
- Efficient port scanning
|
|
33
|
-
|
|
34
|
-
Security:
|
|
35
|
-
- Localhost-only binding for server
|
|
36
|
-
- PID file permissions restrict access
|
|
37
|
-
- Process ownership validation
|
|
38
|
-
- Signal handling prevents orphans
|
|
39
|
-
|
|
40
|
-
@author Claude MPM Team
|
|
41
|
-
@version 1.0
|
|
42
|
-
@since v4.0.25
|
|
3
|
+
SocketIO Daemon Script for Claude MPM.
|
|
4
|
+
|
|
5
|
+
This script provides a command-line interface to the unified monitor daemon
|
|
6
|
+
that runs the Socket.IO server for event broadcasting and dashboard functionality.
|
|
7
|
+
|
|
8
|
+
WHY: The pyproject.toml references this as an entry point for claude-mpm-socketio,
|
|
9
|
+
providing a dedicated command for managing the Socket.IO daemon process.
|
|
43
10
|
"""
|
|
44
11
|
|
|
12
|
+
import argparse
|
|
45
13
|
import os
|
|
46
14
|
import signal
|
|
47
|
-
import subprocess
|
|
48
15
|
import sys
|
|
49
16
|
import time
|
|
50
17
|
from pathlib import Path
|
|
51
18
|
|
|
19
|
+
# Add parent directory to path for imports
|
|
20
|
+
sys.path.insert(0, str(Path(__file__).parent.parent.parent.parent))
|
|
52
21
|
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
WHY this complex detection:
|
|
69
|
-
- Socket.IO server requires specific Python packages (socketio, eventlet)
|
|
70
|
-
- System Python rarely has these packages installed
|
|
71
|
-
- Virtual environments contain isolated dependencies
|
|
72
|
-
- Multiple venv tools have different conventions
|
|
73
|
-
|
|
74
|
-
Thread Safety:
|
|
75
|
-
- Read-only operations on sys and os modules
|
|
76
|
-
- File system checks are atomic
|
|
77
|
-
- No shared state modification
|
|
78
|
-
|
|
79
|
-
Performance:
|
|
80
|
-
- Early returns for common cases
|
|
81
|
-
- Minimal file system operations
|
|
82
|
-
- Cached in practice by Python import system
|
|
83
|
-
|
|
84
|
-
Returns:
|
|
85
|
-
str: Path to Python executable with required dependencies
|
|
86
|
-
|
|
87
|
-
Raises:
|
|
88
|
-
FileNotFoundError: If no suitable Python executable found
|
|
89
|
-
|
|
90
|
-
Examples:
|
|
91
|
-
>>> python_path = get_python_executable()
|
|
92
|
-
>>> # Returns: '/path/to/venv/bin/python' or '/usr/bin/python3'
|
|
93
|
-
"""
|
|
94
|
-
# First, check if we're already in a virtual environment
|
|
95
|
-
if hasattr(sys, "real_prefix") or (
|
|
96
|
-
hasattr(sys, "base_prefix") and sys.base_prefix != sys.prefix
|
|
97
|
-
):
|
|
98
|
-
# We're in a virtual environment, use its Python
|
|
99
|
-
return sys.executable
|
|
100
|
-
|
|
101
|
-
# Check for common virtual environment indicators
|
|
102
|
-
# 1. VIRTUAL_ENV environment variable (most common)
|
|
103
|
-
venv_path = os.environ.get("VIRTUAL_ENV")
|
|
104
|
-
if venv_path:
|
|
105
|
-
venv_python = Path(venv_path) / "bin" / "python"
|
|
106
|
-
if venv_python.exists():
|
|
107
|
-
return str(venv_python)
|
|
108
|
-
|
|
109
|
-
# 2. Check if current executable is in a venv directory structure
|
|
110
|
-
exe_path = Path(sys.executable).resolve()
|
|
111
|
-
for parent in exe_path.parents:
|
|
112
|
-
# Check for common venv directory names
|
|
113
|
-
if parent.name in ("venv", ".venv", "env", ".env"):
|
|
114
|
-
# This looks like a virtual environment
|
|
115
|
-
return sys.executable
|
|
116
|
-
|
|
117
|
-
# Check for typical venv structure (bin/python or Scripts/python.exe)
|
|
118
|
-
if parent.name == "bin" and (parent.parent / "pyvenv.cfg").exists():
|
|
119
|
-
return sys.executable
|
|
120
|
-
if parent.name == "Scripts" and (parent.parent / "pyvenv.cfg").exists():
|
|
121
|
-
return sys.executable
|
|
122
|
-
|
|
123
|
-
# 3. Try to detect project-specific venv
|
|
124
|
-
# Look for venv in the project root (going up from script location)
|
|
125
|
-
script_path = Path(__file__).resolve()
|
|
126
|
-
for parent in script_path.parents:
|
|
127
|
-
# Stop at src or when we've gone too far up
|
|
128
|
-
if parent.name == "src" or not (parent / "src").exists():
|
|
129
|
-
# Check for venv directories
|
|
130
|
-
for venv_name in ("venv", ".venv", "env", ".env"):
|
|
131
|
-
venv_dir = parent / venv_name
|
|
132
|
-
if venv_dir.exists():
|
|
133
|
-
venv_python = venv_dir / "bin" / "python"
|
|
134
|
-
if venv_python.exists():
|
|
135
|
-
return str(venv_python)
|
|
136
|
-
break
|
|
137
|
-
|
|
138
|
-
# Fall back to current Python executable
|
|
139
|
-
return sys.executable
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
# Store the detected Python executable for daemon usage
|
|
143
|
-
PYTHON_EXECUTABLE = get_python_executable()
|
|
144
|
-
|
|
145
|
-
import psutil
|
|
146
|
-
|
|
147
|
-
# Handle imports for both development and installed scenarios
|
|
148
|
-
script_dir = Path(__file__).parent
|
|
149
|
-
try:
|
|
150
|
-
# When installed as package, this should work directly
|
|
151
|
-
from claude_mpm.services.port_manager import PortManager
|
|
152
|
-
from claude_mpm.services.socketio.server.main import SocketIOServer
|
|
153
|
-
except ImportError:
|
|
154
|
-
# Need to add the appropriate directory to sys.path
|
|
155
|
-
import sys
|
|
156
|
-
|
|
157
|
-
# Get the absolute path of this script
|
|
158
|
-
script_path = Path(__file__).resolve()
|
|
159
|
-
|
|
160
|
-
# Determine if we're in development or installed environment
|
|
161
|
-
if "site-packages" in str(script_path):
|
|
162
|
-
# Installed environment: ~/.local/pipx/venvs/claude-mpm/lib/python3.13/site-packages/claude_mpm/scripts/socketio_daemon.py
|
|
163
|
-
# Need to add site-packages directory to path
|
|
164
|
-
parts = script_path.parts
|
|
165
|
-
site_packages_idx = next(
|
|
166
|
-
i for i, part in enumerate(parts) if part == "site-packages"
|
|
167
|
-
)
|
|
168
|
-
site_packages_path = Path(*parts[: site_packages_idx + 1])
|
|
169
|
-
|
|
170
|
-
if site_packages_path.exists() and str(site_packages_path) not in sys.path:
|
|
171
|
-
sys.path.insert(0, str(site_packages_path))
|
|
172
|
-
else:
|
|
173
|
-
# Development environment: Project/src/claude_mpm/scripts/socketio_daemon.py
|
|
174
|
-
# Need to add src directory to path
|
|
175
|
-
# Go up: scripts -> claude_mpm -> src
|
|
176
|
-
src_path = script_path.parent.parent.parent
|
|
177
|
-
|
|
178
|
-
if (
|
|
179
|
-
src_path.exists()
|
|
180
|
-
and (src_path / "claude_mpm").exists()
|
|
181
|
-
and str(src_path) not in sys.path
|
|
182
|
-
):
|
|
183
|
-
sys.path.insert(0, str(src_path))
|
|
184
|
-
|
|
185
|
-
# Try importing again after path modification
|
|
186
|
-
try:
|
|
187
|
-
from claude_mpm.services.port_manager import PortManager
|
|
188
|
-
from claude_mpm.services.socketio.server.main import SocketIOServer
|
|
189
|
-
except ImportError as e:
|
|
190
|
-
print(f"ā Failed to import SocketIOServer after path adjustment: {e}")
|
|
191
|
-
print(f"š Script path: {script_path}")
|
|
192
|
-
print(f"š Python path entries: {len(sys.path)}")
|
|
193
|
-
for i, path in enumerate(sys.path):
|
|
194
|
-
print(f" [{i}] {path}")
|
|
195
|
-
|
|
196
|
-
# Check if claude_mpm directory exists in any path
|
|
197
|
-
claude_mpm_found = False
|
|
198
|
-
for path_str in sys.path:
|
|
199
|
-
claude_mpm_path = Path(path_str) / "claude_mpm"
|
|
200
|
-
if claude_mpm_path.exists():
|
|
201
|
-
print(f"ā
Found claude_mpm at: {claude_mpm_path}")
|
|
202
|
-
claude_mpm_found = True
|
|
203
|
-
|
|
204
|
-
if not claude_mpm_found:
|
|
205
|
-
print("ā claude_mpm directory not found in any sys.path entry")
|
|
206
|
-
|
|
207
|
-
print("\nš” Troubleshooting tips:")
|
|
208
|
-
print(" 1. Ensure claude-mpm is properly installed: pip install claude-mpm")
|
|
209
|
-
print(" 2. If in development, ensure you're in the project root directory")
|
|
210
|
-
print(" 3. Check that PYTHONPATH includes the package location")
|
|
211
|
-
sys.exit(1)
|
|
212
|
-
|
|
213
|
-
# Use deployment root for daemon files to keep everything centralized
|
|
214
|
-
from claude_mpm.core.unified_paths import get_project_root
|
|
215
|
-
|
|
216
|
-
deployment_root = get_project_root()
|
|
217
|
-
PID_FILE = deployment_root / ".claude-mpm" / "socketio-server.pid"
|
|
218
|
-
LOG_FILE = deployment_root / ".claude-mpm" / "socketio-server.log"
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
def ensure_dirs():
|
|
222
|
-
"""Ensure required directories exist."""
|
|
223
|
-
PID_FILE.parent.mkdir(parents=True, exist_ok=True)
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
def is_running():
|
|
227
|
-
"""Check if server is already running."""
|
|
228
|
-
if not PID_FILE.exists():
|
|
22
|
+
from claude_mpm.core.logging_config import get_logger
|
|
23
|
+
from claude_mpm.services.monitor.daemon import UnifiedMonitorDaemon
|
|
24
|
+
from claude_mpm.services.port_manager import PortManager
|
|
25
|
+
|
|
26
|
+
# Default paths
|
|
27
|
+
DEFAULT_PID_FILE = Path.home() / ".claude-mpm" / "socketio-server.pid"
|
|
28
|
+
DEFAULT_LOG_FILE = Path.home() / ".claude-mpm" / "logs" / "socketio" / "daemon.log"
|
|
29
|
+
DEFAULT_PORT = 8765
|
|
30
|
+
|
|
31
|
+
logger = get_logger(__name__)
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def is_running(pid_file: Path) -> bool:
|
|
35
|
+
"""Check if daemon is running."""
|
|
36
|
+
if not pid_file.exists():
|
|
229
37
|
return False
|
|
230
38
|
|
|
231
39
|
try:
|
|
232
|
-
with open(
|
|
40
|
+
with pid_file.open() as f:
|
|
233
41
|
pid = int(f.read().strip())
|
|
234
42
|
|
|
235
43
|
# Check if process exists
|
|
236
|
-
|
|
237
|
-
return
|
|
238
|
-
except (
|
|
239
|
-
#
|
|
240
|
-
|
|
44
|
+
os.kill(pid, 0)
|
|
45
|
+
return True
|
|
46
|
+
except (OSError, ValueError):
|
|
47
|
+
# Process doesn't exist or invalid PID
|
|
48
|
+
if pid_file.exists():
|
|
49
|
+
pid_file.unlink()
|
|
241
50
|
return False
|
|
242
51
|
|
|
243
52
|
|
|
244
|
-
def start_server():
|
|
245
|
-
"""Start the Socket.IO server
|
|
246
|
-
|
|
247
|
-
|
|
53
|
+
def start_server(port: int = DEFAULT_PORT, daemon: bool = True) -> bool:
|
|
54
|
+
"""Start the Socket.IO server."""
|
|
55
|
+
pid_file = DEFAULT_PID_FILE
|
|
56
|
+
log_file = DEFAULT_LOG_FILE
|
|
57
|
+
|
|
58
|
+
# Ensure directories exist
|
|
59
|
+
pid_file.parent.mkdir(parents=True, exist_ok=True)
|
|
60
|
+
log_file.parent.mkdir(parents=True, exist_ok=True)
|
|
61
|
+
|
|
62
|
+
if is_running(pid_file):
|
|
63
|
+
logger.info("Socket.IO daemon is already running")
|
|
64
|
+
return False
|
|
248
65
|
|
|
249
|
-
#
|
|
250
|
-
port_manager
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
if
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
return
|
|
264
|
-
|
|
265
|
-
print(f"š Selected port: {selected_port}")
|
|
266
|
-
|
|
267
|
-
# Check for existing instances on this port
|
|
268
|
-
existing_instance = port_manager.get_instance_by_port(selected_port)
|
|
269
|
-
if existing_instance:
|
|
270
|
-
print(f"ā ļø Port {selected_port} is already used by claude-mpm instance:")
|
|
271
|
-
print(f" PID: {existing_instance.get('pid')}")
|
|
272
|
-
print(f" Started: {time.ctime(existing_instance.get('start_time', 0))}")
|
|
273
|
-
return
|
|
274
|
-
|
|
275
|
-
ensure_dirs()
|
|
276
|
-
|
|
277
|
-
# Fork to create daemon using the correct Python environment
|
|
278
|
-
pid = os.fork()
|
|
279
|
-
if pid > 0:
|
|
280
|
-
# Parent process
|
|
281
|
-
print(f"Starting Socket.IO server on port {selected_port} (PID: {pid})...")
|
|
282
|
-
print(f"Using Python: {PYTHON_EXECUTABLE}")
|
|
283
|
-
|
|
284
|
-
# Register the instance
|
|
285
|
-
instance_id = port_manager.register_instance(selected_port, pid)
|
|
286
|
-
|
|
287
|
-
# Save PID and port info
|
|
288
|
-
with open(PID_FILE, "w") as f:
|
|
289
|
-
f.write(str(pid))
|
|
290
|
-
|
|
291
|
-
# Save port info for other tools
|
|
292
|
-
port_file = PID_FILE.parent / "socketio-port"
|
|
293
|
-
with open(port_file, "w") as f:
|
|
294
|
-
f.write(str(selected_port))
|
|
295
|
-
|
|
296
|
-
print("Socket.IO server started successfully.")
|
|
297
|
-
print(f"Port: {selected_port}")
|
|
298
|
-
print(f"Instance ID: {instance_id}")
|
|
299
|
-
print(f"PID file: {PID_FILE}")
|
|
300
|
-
print(f"Log file: {LOG_FILE}")
|
|
301
|
-
sys.exit(0)
|
|
302
|
-
|
|
303
|
-
# Child process - become daemon
|
|
304
|
-
os.setsid()
|
|
305
|
-
os.umask(0)
|
|
306
|
-
|
|
307
|
-
# Redirect stdout/stderr to log file
|
|
308
|
-
with open(LOG_FILE, "a") as log:
|
|
309
|
-
os.dup2(log.fileno(), sys.stdout.fileno())
|
|
310
|
-
os.dup2(log.fileno(), sys.stderr.fileno())
|
|
311
|
-
|
|
312
|
-
# Log environment information for debugging
|
|
313
|
-
print(
|
|
314
|
-
f"[{time.strftime('%Y-%m-%d %H:%M:%S')}] Starting Socket.IO server on port {selected_port}..."
|
|
66
|
+
# Use PortManager to find available port
|
|
67
|
+
port_manager = PortManager()
|
|
68
|
+
actual_port = port_manager.find_available_port(preferred_port=port)
|
|
69
|
+
|
|
70
|
+
if actual_port != port:
|
|
71
|
+
logger.info(f"Port {port} is in use, using port {actual_port} instead")
|
|
72
|
+
|
|
73
|
+
# Create and start daemon
|
|
74
|
+
monitor_daemon = UnifiedMonitorDaemon(
|
|
75
|
+
host="localhost",
|
|
76
|
+
port=actual_port,
|
|
77
|
+
daemon_mode=daemon,
|
|
78
|
+
pid_file=str(pid_file),
|
|
79
|
+
log_file=str(log_file),
|
|
315
80
|
)
|
|
316
|
-
print(f"[{time.strftime('%Y-%m-%d %H:%M:%S')}] Python executable: {sys.executable}")
|
|
317
|
-
print(f"[{time.strftime('%Y-%m-%d %H:%M:%S')}] Python version: {sys.version}")
|
|
318
|
-
print(
|
|
319
|
-
f"[{time.strftime('%Y-%m-%d %H:%M:%S')}] Python path: {sys.path[:3]}..."
|
|
320
|
-
) # Show first 3 entries
|
|
321
|
-
server = SocketIOServer(host="localhost", port=selected_port)
|
|
322
|
-
|
|
323
|
-
# Handle signals
|
|
324
|
-
def signal_handler(signum, frame):
|
|
325
|
-
print(
|
|
326
|
-
f"[{time.strftime('%Y-%m-%d %H:%M:%S')}] Received signal {signum}, shutting down..."
|
|
327
|
-
)
|
|
328
|
-
server.stop_sync()
|
|
329
|
-
|
|
330
|
-
# Clean up instance registration
|
|
331
|
-
port_manager_cleanup = PortManager()
|
|
332
|
-
instances = port_manager_cleanup.load_instances()
|
|
333
|
-
for instance_id, instance_info in instances.items():
|
|
334
|
-
if instance_info.get("pid") == os.getpid():
|
|
335
|
-
port_manager_cleanup.remove_instance(instance_id)
|
|
336
|
-
break
|
|
337
81
|
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
f"\n[{time.strftime('%Y-%m-%d %H:%M:%S')}] Server started, checking handlers...\n"
|
|
351
|
-
)
|
|
352
|
-
if server.event_registry:
|
|
353
|
-
f.write(
|
|
354
|
-
f"[{time.strftime('%Y-%m-%d %H:%M:%S')}] Event registry exists with {len(server.event_registry.handlers)} handlers\n"
|
|
355
|
-
)
|
|
356
|
-
for handler in server.event_registry.handlers:
|
|
357
|
-
f.write(
|
|
358
|
-
f"[{time.strftime('%Y-%m-%d %H:%M:%S')}] - {handler.__class__.__name__}\n"
|
|
359
|
-
)
|
|
360
|
-
else:
|
|
361
|
-
f.write(
|
|
362
|
-
f"[{time.strftime('%Y-%m-%d %H:%M:%S')}] WARNING: No event registry found!\n"
|
|
363
|
-
)
|
|
364
|
-
|
|
365
|
-
# Check Socket.IO events
|
|
366
|
-
if server.core and server.core.sio:
|
|
367
|
-
handlers = getattr(server.core.sio, "handlers", {})
|
|
368
|
-
f.write(
|
|
369
|
-
f"[{time.strftime('%Y-%m-%d %H:%M:%S')}] Socket.IO has {len(handlers)} namespaces\n"
|
|
370
|
-
)
|
|
371
|
-
for namespace, events in handlers.items():
|
|
372
|
-
f.write(
|
|
373
|
-
f"[{time.strftime('%Y-%m-%d %H:%M:%S')}] Namespace '{namespace}': {len(events)} events\n"
|
|
374
|
-
)
|
|
375
|
-
# List all events to debug
|
|
376
|
-
event_list = list(events.keys())
|
|
377
|
-
f.write(
|
|
378
|
-
f"[{time.strftime('%Y-%m-%d %H:%M:%S')}] Events: {event_list}\n"
|
|
379
|
-
)
|
|
380
|
-
if "code:analyze:request" in events:
|
|
381
|
-
f.write(
|
|
382
|
-
f"[{time.strftime('%Y-%m-%d %H:%M:%S')}] ā
code:analyze:request is registered!\n"
|
|
383
|
-
)
|
|
384
|
-
else:
|
|
385
|
-
f.write(
|
|
386
|
-
f"[{time.strftime('%Y-%m-%d %H:%M:%S')}] ā code:analyze:request NOT found\n"
|
|
387
|
-
)
|
|
388
|
-
f.flush()
|
|
389
|
-
|
|
390
|
-
# Keep running
|
|
391
|
-
try:
|
|
392
|
-
while True:
|
|
393
|
-
time.sleep(1)
|
|
394
|
-
except KeyboardInterrupt:
|
|
395
|
-
signal_handler(signal.SIGINT, None)
|
|
82
|
+
success = monitor_daemon.start()
|
|
83
|
+
|
|
84
|
+
if success:
|
|
85
|
+
logger.info(f"Socket.IO daemon started on port {actual_port}")
|
|
86
|
+
# Save the port for clients to discover
|
|
87
|
+
port_file = pid_file.parent / "socketio-port"
|
|
88
|
+
with port_file.open("w") as f:
|
|
89
|
+
f.write(str(actual_port))
|
|
90
|
+
else:
|
|
91
|
+
logger.error("Failed to start Socket.IO daemon")
|
|
92
|
+
|
|
93
|
+
return success
|
|
396
94
|
|
|
397
95
|
|
|
398
|
-
def stop_server():
|
|
399
|
-
"""Stop the Socket.IO
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
96
|
+
def stop_server() -> bool:
|
|
97
|
+
"""Stop the Socket.IO server."""
|
|
98
|
+
pid_file = DEFAULT_PID_FILE
|
|
99
|
+
|
|
100
|
+
if not is_running(pid_file):
|
|
101
|
+
logger.info("Socket.IO daemon is not running")
|
|
102
|
+
return False
|
|
404
103
|
|
|
405
104
|
try:
|
|
406
|
-
with open(
|
|
105
|
+
with pid_file.open() as f:
|
|
407
106
|
pid = int(f.read().strip())
|
|
408
107
|
|
|
409
|
-
|
|
108
|
+
# Send SIGTERM for graceful shutdown
|
|
410
109
|
os.kill(pid, signal.SIGTERM)
|
|
411
110
|
|
|
412
|
-
# Wait for process to
|
|
111
|
+
# Wait for process to terminate
|
|
413
112
|
for _ in range(10):
|
|
414
|
-
if not is_running():
|
|
415
|
-
|
|
416
|
-
PID_FILE.unlink(missing_ok=True)
|
|
417
|
-
return
|
|
113
|
+
if not is_running(pid_file):
|
|
114
|
+
break
|
|
418
115
|
time.sleep(0.5)
|
|
419
116
|
|
|
420
117
|
# Force kill if still running
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
118
|
+
if is_running(pid_file):
|
|
119
|
+
os.kill(pid, signal.SIGKILL)
|
|
120
|
+
time.sleep(0.5)
|
|
424
121
|
|
|
425
|
-
|
|
426
|
-
|
|
122
|
+
# Clean up files
|
|
123
|
+
if pid_file.exists():
|
|
124
|
+
pid_file.unlink()
|
|
125
|
+
|
|
126
|
+
port_file = pid_file.parent / "socketio-port"
|
|
127
|
+
if port_file.exists():
|
|
128
|
+
port_file.unlink()
|
|
427
129
|
|
|
130
|
+
logger.info("Socket.IO daemon stopped")
|
|
131
|
+
return True
|
|
428
132
|
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
133
|
+
except Exception as e:
|
|
134
|
+
logger.error(f"Error stopping daemon: {e}")
|
|
135
|
+
return False
|
|
432
136
|
|
|
433
|
-
# Clean up dead instances first
|
|
434
|
-
port_manager.cleanup_dead_instances()
|
|
435
137
|
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
print(f"Socket.IO daemon server is running (PID: {pid})")
|
|
440
|
-
print(f"PID file: {PID_FILE}")
|
|
138
|
+
def restart_server(port: int = DEFAULT_PORT) -> bool:
|
|
139
|
+
"""Restart the Socket.IO server."""
|
|
140
|
+
logger.info("Restarting Socket.IO daemon...")
|
|
441
141
|
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
try:
|
|
447
|
-
with open(port_file) as f:
|
|
448
|
-
current_port = int(f.read().strip())
|
|
449
|
-
except:
|
|
450
|
-
pass
|
|
142
|
+
# Stop if running
|
|
143
|
+
if is_running(DEFAULT_PID_FILE):
|
|
144
|
+
stop_server()
|
|
145
|
+
time.sleep(1) # Brief pause between stop and start
|
|
451
146
|
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
import socket
|
|
455
|
-
|
|
456
|
-
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
|
457
|
-
result = sock.connect_ex(("localhost", current_port))
|
|
458
|
-
sock.close()
|
|
459
|
-
if result == 0:
|
|
460
|
-
print(f"ā
Server is listening on port {current_port}")
|
|
461
|
-
print("š§ Management style: daemon")
|
|
462
|
-
else:
|
|
463
|
-
print(
|
|
464
|
-
f"ā ļø WARNING: Server process exists but port {current_port} is not accessible"
|
|
465
|
-
)
|
|
466
|
-
except:
|
|
467
|
-
pass
|
|
468
|
-
|
|
469
|
-
# Show instance information
|
|
470
|
-
instance = port_manager.get_instance_by_port(current_port)
|
|
471
|
-
if instance:
|
|
472
|
-
print("\nš Instance Information:")
|
|
473
|
-
print(f" ⢠Port: {instance.get('port')}")
|
|
474
|
-
print(f" ⢠Started: {time.ctime(instance.get('start_time', 0))}")
|
|
475
|
-
print(f" ⢠Instance ID: {instance.get('instance_id')}")
|
|
476
|
-
|
|
477
|
-
# Show management commands
|
|
478
|
-
print("\nš§ Management Commands:")
|
|
479
|
-
print(f" ⢠Stop: {__file__} stop")
|
|
480
|
-
print(f" ⢠Restart: {__file__} restart")
|
|
481
|
-
print(f" ⢠List all: {__file__} list")
|
|
482
|
-
|
|
483
|
-
# Check for manager conflicts
|
|
484
|
-
try:
|
|
485
|
-
import requests
|
|
486
|
-
|
|
487
|
-
response = requests.get("http://localhost:8765/health", timeout=1.0)
|
|
488
|
-
if response.status_code == 200:
|
|
489
|
-
data = response.json()
|
|
490
|
-
if "server_id" in data and data.get("server_id") != "daemon-socketio":
|
|
491
|
-
print("\nā ļø POTENTIAL CONFLICT: HTTP-managed server also detected")
|
|
492
|
-
print(f" Server ID: {data.get('server_id')}")
|
|
493
|
-
print(" Use 'socketio_server_manager.py diagnose' to resolve")
|
|
494
|
-
except:
|
|
495
|
-
pass
|
|
147
|
+
# Start again
|
|
148
|
+
return start_server(port=port)
|
|
496
149
|
|
|
497
|
-
else:
|
|
498
|
-
print("Socket.IO daemon server is not running")
|
|
499
|
-
print("\nš§ Start Commands:")
|
|
500
|
-
print(f" ⢠Daemon: {__file__} start")
|
|
501
|
-
print(" ⢠HTTP-managed: socketio_server_manager.py start")
|
|
502
150
|
|
|
151
|
+
def status_server() -> bool:
|
|
152
|
+
"""Check status of Socket.IO server."""
|
|
153
|
+
pid_file = DEFAULT_PID_FILE
|
|
154
|
+
port_file = pid_file.parent / "socketio-port"
|
|
503
155
|
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
156
|
+
if is_running(pid_file):
|
|
157
|
+
try:
|
|
158
|
+
with pid_file.open() as f:
|
|
159
|
+
pid = int(f.read().strip())
|
|
160
|
+
|
|
161
|
+
port = DEFAULT_PORT
|
|
162
|
+
if port_file.exists():
|
|
163
|
+
with port_file.open() as f:
|
|
164
|
+
port = int(f.read().strip())
|
|
165
|
+
|
|
166
|
+
print(f"Socket.IO daemon is running (PID: {pid}, Port: {port})")
|
|
167
|
+
return True
|
|
168
|
+
except Exception as e:
|
|
169
|
+
print(f"Socket.IO daemon status unknown: {e}")
|
|
170
|
+
return False
|
|
171
|
+
else:
|
|
172
|
+
print("Socket.IO daemon is not running")
|
|
173
|
+
return False
|
|
507
174
|
|
|
508
|
-
# Clean up dead instances first
|
|
509
|
-
cleaned = port_manager.cleanup_dead_instances()
|
|
510
|
-
if cleaned > 0:
|
|
511
|
-
print(f"š§¹ Cleaned up {cleaned} dead instances")
|
|
512
175
|
|
|
513
|
-
|
|
176
|
+
def main():
|
|
177
|
+
"""Main entry point for socketio daemon management."""
|
|
178
|
+
parser = argparse.ArgumentParser(description="Manage Claude MPM Socket.IO daemon")
|
|
514
179
|
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
180
|
+
parser.add_argument(
|
|
181
|
+
"command", choices=["start", "stop", "restart", "status"], help="Daemon command"
|
|
182
|
+
)
|
|
518
183
|
|
|
519
|
-
|
|
520
|
-
|
|
184
|
+
parser.add_argument(
|
|
185
|
+
"--port",
|
|
186
|
+
type=int,
|
|
187
|
+
default=DEFAULT_PORT,
|
|
188
|
+
help=f"Port to run on (default: {DEFAULT_PORT})",
|
|
189
|
+
)
|
|
521
190
|
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
191
|
+
parser.add_argument(
|
|
192
|
+
"--foreground",
|
|
193
|
+
action="store_true",
|
|
194
|
+
help="Run in foreground instead of daemon mode",
|
|
195
|
+
)
|
|
527
196
|
|
|
528
|
-
|
|
529
|
-
print(f" ⢠PID: {pid}")
|
|
530
|
-
print(f" ⢠Started: {time.ctime(start_time)}")
|
|
531
|
-
print(f" ⢠Instance ID: {instance_id}")
|
|
532
|
-
print(f" ⢠Project: {instance.get('project_root', 'unknown')}")
|
|
533
|
-
print()
|
|
197
|
+
args = parser.parse_args()
|
|
534
198
|
|
|
199
|
+
# Execute command
|
|
200
|
+
if args.command == "start":
|
|
201
|
+
success = start_server(port=args.port, daemon=not args.foreground)
|
|
202
|
+
sys.exit(0 if success else 1)
|
|
535
203
|
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
print("Usage: socketio-daemon.py {start|stop|restart|status|list}")
|
|
540
|
-
sys.exit(1)
|
|
204
|
+
elif args.command == "stop":
|
|
205
|
+
success = stop_server()
|
|
206
|
+
sys.exit(0 if success else 1)
|
|
541
207
|
|
|
542
|
-
command
|
|
208
|
+
elif args.command == "restart":
|
|
209
|
+
success = restart_server(port=args.port)
|
|
210
|
+
sys.exit(0 if success else 1)
|
|
543
211
|
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
stop_server()
|
|
548
|
-
elif command == "restart":
|
|
549
|
-
stop_server()
|
|
550
|
-
time.sleep(1)
|
|
551
|
-
start_server()
|
|
552
|
-
elif command == "status":
|
|
553
|
-
status_server()
|
|
554
|
-
elif command == "list":
|
|
555
|
-
list_instances()
|
|
556
|
-
else:
|
|
557
|
-
print(f"Unknown command: {command}")
|
|
558
|
-
print("Usage: socketio-daemon.py {start|stop|restart|status|list}")
|
|
559
|
-
sys.exit(1)
|
|
212
|
+
elif args.command == "status":
|
|
213
|
+
success = status_server()
|
|
214
|
+
sys.exit(0 if success else 1)
|
|
560
215
|
|
|
561
216
|
|
|
562
217
|
if __name__ == "__main__":
|
|
563
|
-
# Install psutil if not available (using correct Python)
|
|
564
|
-
try:
|
|
565
|
-
import psutil
|
|
566
|
-
except ImportError:
|
|
567
|
-
print(f"Installing psutil using {PYTHON_EXECUTABLE}...")
|
|
568
|
-
subprocess.check_call([PYTHON_EXECUTABLE, "-m", "pip", "install", "psutil"])
|
|
569
|
-
import psutil
|
|
570
|
-
|
|
571
218
|
main()
|