claude-mpm 4.1.6__py3-none-any.whl → 4.24.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of claude-mpm might be problematic. Click here for more details.
- claude_mpm/BUILD_NUMBER +1 -1
- claude_mpm/VERSION +1 -1
- claude_mpm/__init__.py +20 -5
- claude_mpm/agents/BASE_AGENT_TEMPLATE.md +118 -0
- claude_mpm/agents/BASE_DOCUMENTATION.md +53 -0
- claude_mpm/agents/BASE_ENGINEER.md +658 -0
- claude_mpm/agents/BASE_OPS.md +219 -0
- claude_mpm/agents/BASE_PM.md +431 -214
- claude_mpm/agents/BASE_PROMPT_ENGINEER.md +787 -0
- claude_mpm/agents/BASE_QA.md +167 -0
- claude_mpm/agents/BASE_RESEARCH.md +53 -0
- claude_mpm/agents/MEMORY.md +3 -0
- claude_mpm/agents/OUTPUT_STYLE.md +335 -0
- claude_mpm/agents/PM_INSTRUCTIONS.md +1159 -0
- claude_mpm/agents/WORKFLOW.md +355 -187
- claude_mpm/agents/agent_loader.py +40 -10
- claude_mpm/agents/agent_loader_integration.py +3 -2
- claude_mpm/agents/agents_metadata.py +57 -0
- claude_mpm/agents/async_agent_loader.py +3 -3
- claude_mpm/agents/base_agent_loader.py +11 -9
- claude_mpm/agents/frontmatter_validator.py +291 -251
- claude_mpm/agents/system_agent_config.py +3 -2
- claude_mpm/agents/templates/.claude-mpm/memories/README.md +17 -0
- claude_mpm/agents/templates/.claude-mpm/memories/engineer_memories.md +3 -0
- claude_mpm/agents/templates/README.md +465 -0
- claude_mpm/agents/templates/agent-manager.json +267 -18
- claude_mpm/agents/templates/agentic-coder-optimizer.json +248 -0
- claude_mpm/agents/templates/api_qa.json +16 -4
- claude_mpm/agents/templates/circuit_breakers.md +638 -0
- claude_mpm/agents/templates/clerk-ops.json +235 -0
- claude_mpm/agents/templates/code_analyzer.json +25 -9
- claude_mpm/agents/templates/content-agent.json +358 -0
- claude_mpm/agents/templates/dart_engineer.json +307 -0
- claude_mpm/agents/templates/data_engineer.json +87 -14
- claude_mpm/agents/templates/documentation.json +76 -13
- claude_mpm/agents/templates/engineer.json +44 -10
- claude_mpm/agents/templates/gcp_ops_agent.json +253 -0
- claude_mpm/agents/templates/git_file_tracking.md +584 -0
- claude_mpm/agents/templates/golang_engineer.json +270 -0
- claude_mpm/agents/templates/imagemagick.json +5 -2
- claude_mpm/agents/templates/java_engineer.json +346 -0
- claude_mpm/agents/templates/javascript_engineer_agent.json +380 -0
- claude_mpm/agents/templates/local_ops_agent.json +1840 -0
- claude_mpm/agents/templates/logs/prompts/agent_engineer_20250826_014258_728.md +39 -0
- claude_mpm/agents/templates/logs/prompts/agent_engineer_20250901_010124_142.md +400 -0
- claude_mpm/agents/templates/memory_manager.json +6 -3
- claude_mpm/agents/templates/nextjs_engineer.json +285 -0
- claude_mpm/agents/templates/ops.json +27 -8
- claude_mpm/agents/templates/php-engineer.json +287 -0
- claude_mpm/agents/templates/pm_examples.md +474 -0
- claude_mpm/agents/templates/pm_red_flags.md +262 -0
- claude_mpm/agents/templates/product_owner.json +338 -0
- claude_mpm/agents/templates/project_organizer.json +19 -5
- claude_mpm/agents/templates/prompt-engineer.json +737 -0
- claude_mpm/agents/templates/python_engineer.json +387 -0
- claude_mpm/agents/templates/qa.json +26 -6
- claude_mpm/agents/templates/react_engineer.json +239 -0
- claude_mpm/agents/templates/refactoring_engineer.json +15 -5
- claude_mpm/agents/templates/research.json +47 -22
- claude_mpm/agents/templates/response_format.md +583 -0
- claude_mpm/agents/templates/ruby-engineer.json +280 -0
- claude_mpm/agents/templates/rust_engineer.json +275 -0
- claude_mpm/agents/templates/security.json +59 -10
- claude_mpm/agents/templates/svelte-engineer.json +225 -0
- claude_mpm/agents/templates/tauri_engineer.json +274 -0
- claude_mpm/agents/templates/ticketing.json +16 -7
- claude_mpm/agents/templates/typescript_engineer.json +285 -0
- claude_mpm/agents/templates/validation_templates.md +312 -0
- claude_mpm/agents/templates/vercel_ops_agent.json +164 -33
- claude_mpm/agents/templates/version_control.json +16 -4
- claude_mpm/agents/templates/web_qa.json +243 -21
- claude_mpm/agents/templates/web_ui.json +18 -5
- claude_mpm/cli/__init__.py +38 -363
- claude_mpm/cli/commands/__init__.py +8 -0
- claude_mpm/cli/commands/agent_manager.py +675 -20
- claude_mpm/cli/commands/agent_state_manager.py +186 -0
- claude_mpm/cli/commands/agents.py +722 -150
- claude_mpm/cli/commands/agents_detect.py +380 -0
- claude_mpm/cli/commands/agents_recommend.py +309 -0
- claude_mpm/cli/commands/aggregate.py +10 -6
- claude_mpm/cli/commands/analyze.py +553 -0
- claude_mpm/cli/commands/analyze_code.py +528 -0
- claude_mpm/cli/commands/auto_configure.py +570 -0
- claude_mpm/cli/commands/cleanup.py +12 -12
- claude_mpm/cli/commands/config.py +47 -13
- claude_mpm/cli/commands/configure.py +488 -884
- claude_mpm/cli/commands/configure_agent_display.py +261 -0
- claude_mpm/cli/commands/configure_behavior_manager.py +204 -0
- claude_mpm/cli/commands/configure_hook_manager.py +225 -0
- claude_mpm/cli/commands/configure_models.py +18 -0
- claude_mpm/cli/commands/configure_navigation.py +167 -0
- claude_mpm/cli/commands/configure_paths.py +104 -0
- claude_mpm/cli/commands/configure_persistence.py +254 -0
- claude_mpm/cli/commands/configure_startup_manager.py +646 -0
- claude_mpm/cli/commands/configure_template_editor.py +497 -0
- claude_mpm/cli/commands/configure_validators.py +73 -0
- claude_mpm/cli/commands/dashboard.py +286 -0
- claude_mpm/cli/commands/debug.py +1386 -0
- claude_mpm/cli/commands/doctor.py +43 -7
- claude_mpm/cli/commands/info.py +3 -4
- claude_mpm/cli/commands/local_deploy.py +537 -0
- claude_mpm/cli/commands/mcp.py +17 -10
- claude_mpm/cli/commands/mcp_command_router.py +11 -0
- claude_mpm/cli/commands/mcp_config.py +154 -0
- claude_mpm/cli/commands/mcp_external_commands.py +249 -0
- claude_mpm/cli/commands/mcp_install_commands.py +101 -32
- claude_mpm/cli/commands/mcp_pipx_config.py +2 -2
- claude_mpm/cli/commands/mcp_setup_external.py +868 -0
- claude_mpm/cli/commands/memory.py +55 -21
- claude_mpm/cli/commands/monitor.py +168 -617
- claude_mpm/cli/commands/mpm_init/__init__.py +73 -0
- claude_mpm/cli/commands/mpm_init/core.py +525 -0
- claude_mpm/cli/commands/mpm_init/display.py +341 -0
- claude_mpm/cli/commands/mpm_init/git_activity.py +427 -0
- claude_mpm/cli/commands/mpm_init/modes.py +397 -0
- claude_mpm/cli/commands/mpm_init/prompts.py +442 -0
- claude_mpm/cli/commands/mpm_init_cli.py +396 -0
- claude_mpm/cli/commands/mpm_init_handler.py +195 -0
- claude_mpm/cli/commands/run.py +169 -42
- claude_mpm/cli/commands/search.py +458 -0
- claude_mpm/cli/commands/skills.py +488 -0
- claude_mpm/cli/commands/uninstall.py +176 -0
- claude_mpm/cli/commands/upgrade.py +152 -0
- claude_mpm/cli/commands/verify.py +119 -0
- claude_mpm/cli/executor.py +204 -0
- claude_mpm/cli/helpers.py +105 -0
- claude_mpm/cli/interactive/__init__.py +21 -0
- claude_mpm/cli/interactive/agent_wizard.py +962 -0
- claude_mpm/cli/interactive/skills_wizard.py +491 -0
- claude_mpm/cli/parser.py +79 -2
- claude_mpm/cli/parsers/__init__.py +7 -1
- claude_mpm/cli/parsers/agent_manager_parser.py +161 -1
- claude_mpm/cli/parsers/agents_parser.py +116 -0
- claude_mpm/cli/parsers/analyze_code_parser.py +170 -0
- claude_mpm/cli/parsers/analyze_parser.py +135 -0
- claude_mpm/cli/parsers/auto_configure_parser.py +245 -0
- claude_mpm/cli/parsers/base_parser.py +187 -3
- claude_mpm/cli/parsers/configure_parser.py +34 -15
- claude_mpm/cli/parsers/dashboard_parser.py +113 -0
- claude_mpm/cli/parsers/debug_parser.py +319 -0
- claude_mpm/cli/parsers/local_deploy_parser.py +227 -0
- claude_mpm/cli/parsers/mcp_parser.py +15 -0
- claude_mpm/cli/parsers/monitor_parser.py +12 -2
- claude_mpm/cli/parsers/mpm_init_parser.py +311 -0
- claude_mpm/cli/parsers/run_parser.py +5 -0
- claude_mpm/cli/parsers/search_parser.py +245 -0
- claude_mpm/cli/parsers/skills_parser.py +137 -0
- claude_mpm/cli/shared/argument_patterns.py +20 -13
- claude_mpm/cli/shared/base_command.py +2 -2
- claude_mpm/cli/shared/output_formatters.py +28 -19
- claude_mpm/cli/startup.py +562 -0
- claude_mpm/cli/startup_logging.py +179 -13
- claude_mpm/cli/utils.py +53 -2
- claude_mpm/commands/__init__.py +14 -0
- claude_mpm/commands/mpm-agents-detect.md +168 -0
- claude_mpm/commands/mpm-agents-recommend.md +214 -0
- claude_mpm/commands/mpm-agents.md +122 -0
- claude_mpm/commands/mpm-auto-configure.md +269 -0
- claude_mpm/commands/mpm-config.md +141 -0
- claude_mpm/commands/mpm-doctor.md +24 -0
- claude_mpm/commands/mpm-help.md +290 -0
- claude_mpm/commands/mpm-init.md +521 -0
- claude_mpm/commands/mpm-monitor.md +409 -0
- claude_mpm/commands/mpm-organize.md +295 -0
- claude_mpm/commands/mpm-resume.md +372 -0
- claude_mpm/commands/mpm-status.md +75 -0
- claude_mpm/commands/mpm-tickets.md +151 -0
- claude_mpm/commands/mpm-version.md +113 -0
- claude_mpm/commands/mpm.md +21 -0
- claude_mpm/config/agent_config.py +4 -4
- claude_mpm/config/experimental_features.py +7 -7
- claude_mpm/config/model_config.py +428 -0
- claude_mpm/config/paths.py +3 -2
- claude_mpm/config/socketio_config.py +36 -7
- claude_mpm/constants.py +27 -1
- claude_mpm/core/__init__.py +53 -17
- claude_mpm/core/agent_name_normalizer.py +3 -2
- claude_mpm/core/agent_registry.py +2 -2
- claude_mpm/core/agent_session_manager.py +10 -10
- claude_mpm/core/api_validator.py +330 -0
- claude_mpm/core/base_service.py +33 -23
- claude_mpm/core/cache.py +9 -9
- claude_mpm/core/claude_runner.py +19 -8
- claude_mpm/core/config.py +103 -8
- claude_mpm/core/config_aliases.py +7 -6
- claude_mpm/core/constants.py +65 -0
- claude_mpm/core/container.py +11 -5
- claude_mpm/core/enums.py +452 -0
- claude_mpm/core/error_handler.py +623 -0
- claude_mpm/core/factories.py +1 -1
- claude_mpm/core/file_utils.py +764 -0
- claude_mpm/core/framework/__init__.py +38 -0
- claude_mpm/core/framework/formatters/__init__.py +11 -0
- claude_mpm/core/framework/formatters/capability_generator.py +367 -0
- claude_mpm/core/framework/formatters/content_formatter.py +288 -0
- claude_mpm/core/framework/formatters/context_generator.py +185 -0
- claude_mpm/core/framework/loaders/__init__.py +13 -0
- claude_mpm/core/framework/loaders/agent_loader.py +210 -0
- claude_mpm/core/framework/loaders/file_loader.py +223 -0
- claude_mpm/core/framework/loaders/instruction_loader.py +161 -0
- claude_mpm/core/framework/loaders/packaged_loader.py +232 -0
- claude_mpm/core/framework/processors/__init__.py +11 -0
- claude_mpm/core/framework/processors/memory_processor.py +230 -0
- claude_mpm/core/framework/processors/metadata_processor.py +146 -0
- claude_mpm/core/framework/processors/template_processor.py +244 -0
- claude_mpm/core/framework_loader.py +323 -1491
- claude_mpm/core/hook_manager.py +8 -6
- claude_mpm/core/injectable_service.py +11 -8
- claude_mpm/core/instruction_reinforcement_hook.py +267 -0
- claude_mpm/core/interactive_session.py +55 -8
- claude_mpm/core/interfaces.py +56 -1
- claude_mpm/core/lazy.py +3 -3
- claude_mpm/core/log_manager.py +100 -28
- claude_mpm/core/logger.py +19 -14
- claude_mpm/core/logging_config.py +6 -2
- claude_mpm/core/logging_utils.py +520 -0
- claude_mpm/core/oneshot_session.py +51 -7
- claude_mpm/core/optimized_agent_loader.py +9 -9
- claude_mpm/core/optimized_startup.py +1 -1
- claude_mpm/core/output_style_manager.py +12 -192
- claude_mpm/core/pm_hook_interceptor.py +118 -15
- claude_mpm/core/service_registry.py +7 -3
- claude_mpm/core/session_manager.py +14 -12
- claude_mpm/core/shared/config_loader.py +1 -1
- claude_mpm/core/socketio_pool.py +15 -15
- claude_mpm/core/tool_access_control.py +3 -2
- claude_mpm/core/types.py +4 -11
- claude_mpm/core/typing_utils.py +7 -6
- claude_mpm/core/unified_agent_registry.py +116 -12
- claude_mpm/core/unified_config.py +6 -6
- claude_mpm/core/unified_paths.py +23 -20
- claude_mpm/dashboard/.claude-mpm/socketio-instances.json +1 -0
- claude_mpm/dashboard/__init__.py +12 -0
- claude_mpm/dashboard/analysis_runner.py +455 -0
- claude_mpm/dashboard/api/simple_directory.py +261 -0
- claude_mpm/dashboard/react/components/DataInspector/DataInspector.module.css +188 -0
- claude_mpm/dashboard/react/components/EventViewer/EventViewer.module.css +156 -0
- claude_mpm/dashboard/react/components/shared/ConnectionStatus.module.css +38 -0
- claude_mpm/dashboard/react/components/shared/FilterBar.module.css +92 -0
- claude_mpm/dashboard/static/archive/activity_dashboard_fixed.html +248 -0
- claude_mpm/dashboard/static/archive/activity_dashboard_test.html +61 -0
- claude_mpm/dashboard/static/archive/test_activity_connection.html +179 -0
- claude_mpm/dashboard/static/archive/test_claude_tree_tab.html +68 -0
- claude_mpm/dashboard/static/archive/test_dashboard.html +409 -0
- claude_mpm/dashboard/static/archive/test_dashboard_fixed.html +519 -0
- claude_mpm/dashboard/static/archive/test_dashboard_verification.html +181 -0
- claude_mpm/dashboard/static/archive/test_file_data.html +315 -0
- claude_mpm/dashboard/static/archive/test_file_tree_empty_state.html +243 -0
- claude_mpm/dashboard/static/archive/test_file_tree_fix.html +234 -0
- claude_mpm/dashboard/static/archive/test_file_tree_rename.html +117 -0
- claude_mpm/dashboard/static/archive/test_file_tree_tab.html +115 -0
- claude_mpm/dashboard/static/archive/test_file_viewer.html +224 -0
- claude_mpm/dashboard/static/archive/test_final_activity.html +220 -0
- claude_mpm/dashboard/static/archive/test_tab_fix.html +139 -0
- claude_mpm/dashboard/static/built/assets/events.DjpNxWNo.css +1 -0
- claude_mpm/dashboard/static/built/components/activity-tree.js +2 -0
- claude_mpm/dashboard/static/built/components/agent-hierarchy.js +777 -0
- claude_mpm/dashboard/static/built/components/agent-inference.js +1 -1
- claude_mpm/dashboard/static/built/components/build-tracker.js +333 -0
- claude_mpm/dashboard/static/built/components/code-simple.js +857 -0
- claude_mpm/dashboard/static/built/components/code-tree/tree-breadcrumb.js +353 -0
- claude_mpm/dashboard/static/built/components/code-tree/tree-constants.js +235 -0
- claude_mpm/dashboard/static/built/components/code-tree/tree-search.js +409 -0
- claude_mpm/dashboard/static/built/components/code-tree/tree-utils.js +435 -0
- claude_mpm/dashboard/static/built/components/code-tree.js +2 -0
- claude_mpm/dashboard/static/built/components/code-viewer.js +2 -0
- claude_mpm/dashboard/static/built/components/connection-debug.js +654 -0
- claude_mpm/dashboard/static/built/components/diff-viewer.js +891 -0
- claude_mpm/dashboard/static/built/components/event-processor.js +1 -1
- claude_mpm/dashboard/static/built/components/event-viewer.js +1 -1
- claude_mpm/dashboard/static/built/components/export-manager.js +1 -1
- claude_mpm/dashboard/static/built/components/file-change-tracker.js +443 -0
- claude_mpm/dashboard/static/built/components/file-change-viewer.js +690 -0
- claude_mpm/dashboard/static/built/components/file-tool-tracker.js +1 -1
- claude_mpm/dashboard/static/built/components/file-viewer.js +2 -0
- claude_mpm/dashboard/static/built/components/module-viewer.js +1 -1
- claude_mpm/dashboard/static/built/components/nav-bar.js +145 -0
- claude_mpm/dashboard/static/built/components/page-structure.js +429 -0
- claude_mpm/dashboard/static/built/components/session-manager.js +1 -1
- claude_mpm/dashboard/static/built/components/unified-data-viewer.js +2 -0
- claude_mpm/dashboard/static/built/components/working-directory.js +1 -1
- claude_mpm/dashboard/static/built/connection-manager.js +536 -0
- claude_mpm/dashboard/static/built/dashboard.js +1 -1
- claude_mpm/dashboard/static/built/extension-error-handler.js +164 -0
- claude_mpm/dashboard/static/built/react/events.js +30 -0
- claude_mpm/dashboard/static/built/shared/dom-helpers.js +396 -0
- claude_mpm/dashboard/static/built/shared/event-bus.js +330 -0
- claude_mpm/dashboard/static/built/shared/event-filter-service.js +540 -0
- claude_mpm/dashboard/static/built/shared/logger.js +385 -0
- claude_mpm/dashboard/static/built/shared/page-structure.js +249 -0
- claude_mpm/dashboard/static/built/shared/tooltip-service.js +253 -0
- claude_mpm/dashboard/static/built/socket-client.js +1 -1
- claude_mpm/dashboard/static/built/tab-isolation-fix.js +185 -0
- claude_mpm/dashboard/static/css/activity.css +1958 -0
- claude_mpm/dashboard/static/css/dashboard.css +1413 -72
- claude_mpm/dashboard/static/dist/assets/events.DjpNxWNo.css +1 -0
- claude_mpm/dashboard/static/dist/components/activity-tree.js +2 -0
- claude_mpm/dashboard/static/dist/components/agent-inference.js +1 -1
- claude_mpm/dashboard/static/dist/components/code-tree.js +2 -0
- claude_mpm/dashboard/static/dist/components/code-viewer.js +2 -0
- claude_mpm/dashboard/static/dist/components/event-processor.js +1 -1
- claude_mpm/dashboard/static/dist/components/event-viewer.js +1 -1
- claude_mpm/dashboard/static/dist/components/export-manager.js +1 -1
- claude_mpm/dashboard/static/dist/components/file-tool-tracker.js +1 -1
- claude_mpm/dashboard/static/dist/components/file-viewer.js +2 -0
- claude_mpm/dashboard/static/dist/components/module-viewer.js +1 -1
- claude_mpm/dashboard/static/dist/components/session-manager.js +1 -1
- claude_mpm/dashboard/static/dist/components/unified-data-viewer.js +2 -0
- claude_mpm/dashboard/static/dist/components/working-directory.js +1 -1
- claude_mpm/dashboard/static/dist/dashboard.js +1 -1
- claude_mpm/dashboard/static/dist/react/events.js +30 -0
- claude_mpm/dashboard/static/dist/socket-client.js +1 -1
- claude_mpm/dashboard/static/events.html +607 -0
- claude_mpm/dashboard/static/index.html +635 -0
- claude_mpm/dashboard/static/js/components/activity-tree.js +1871 -0
- claude_mpm/dashboard/static/js/components/agent-hierarchy.js +4 -1
- claude_mpm/dashboard/static/js/components/agent-inference.js +3 -0
- claude_mpm/dashboard/static/js/components/build-tracker.js +23 -13
- claude_mpm/dashboard/static/js/components/code-simple.js +857 -0
- claude_mpm/dashboard/static/js/components/diff-viewer.js +891 -0
- claude_mpm/dashboard/static/js/components/event-processor.js +3 -107
- claude_mpm/dashboard/static/js/components/event-viewer.js +98 -11
- claude_mpm/dashboard/static/js/components/export-manager.js +3 -0
- claude_mpm/dashboard/static/js/components/file-change-tracker.js +443 -0
- claude_mpm/dashboard/static/js/components/file-change-viewer.js +690 -0
- claude_mpm/dashboard/static/js/components/file-tool-tracker.js +30 -10
- claude_mpm/dashboard/static/js/components/file-viewer.js +580 -0
- claude_mpm/dashboard/static/js/components/module-viewer.js +68 -205
- claude_mpm/dashboard/static/js/components/session-manager.js +46 -10
- claude_mpm/dashboard/static/js/components/socket-manager.js +16 -0
- claude_mpm/dashboard/static/js/components/ui-state-manager.js +359 -40
- claude_mpm/dashboard/static/js/components/unified-data-viewer.js +1824 -0
- claude_mpm/dashboard/static/js/components/working-directory.js +61 -10
- claude_mpm/dashboard/static/js/connection-manager.js +1 -1
- claude_mpm/dashboard/static/js/dashboard.js +523 -622
- claude_mpm/dashboard/static/js/shared/dom-helpers.js +396 -0
- claude_mpm/dashboard/static/js/shared/event-bus.js +330 -0
- claude_mpm/dashboard/static/js/shared/logger.js +385 -0
- claude_mpm/dashboard/static/js/shared/tooltip-service.js +253 -0
- claude_mpm/dashboard/static/js/socket-client.js +549 -62
- claude_mpm/dashboard/static/js/stores/dashboard-store.js +562 -0
- claude_mpm/dashboard/static/js/tab-isolation-fix.js +185 -0
- claude_mpm/dashboard/static/legacy/activity.html +736 -0
- claude_mpm/dashboard/static/legacy/agents.html +786 -0
- claude_mpm/dashboard/static/legacy/files.html +747 -0
- claude_mpm/dashboard/static/legacy/tools.html +831 -0
- claude_mpm/dashboard/static/monitors.html +431 -0
- claude_mpm/dashboard/static/production/events.html +659 -0
- claude_mpm/dashboard/static/production/main.html +698 -0
- claude_mpm/dashboard/static/production/monitors.html +483 -0
- claude_mpm/dashboard/static/socket.io.min.js +7 -0
- claude_mpm/dashboard/static/socket.io.v4.8.1.backup.js +7 -0
- claude_mpm/dashboard/static/test-archive/dashboard.html +635 -0
- claude_mpm/dashboard/static/test-archive/debug-events.html +147 -0
- claude_mpm/dashboard/static/test-archive/test-navigation.html +256 -0
- claude_mpm/dashboard/static/test-archive/test-react-exports.html +180 -0
- claude_mpm/dashboard/static/test-archive/test_debug.html +25 -0
- claude_mpm/dashboard/templates/code_simple.html +153 -0
- claude_mpm/dashboard/templates/index.html +267 -9
- claude_mpm/experimental/__init__.py +10 -0
- claude_mpm/experimental/cli_enhancements.py +4 -2
- claude_mpm/generators/agent_profile_generator.py +5 -3
- claude_mpm/hooks/__init__.py +37 -1
- claude_mpm/hooks/base_hook.py +5 -4
- claude_mpm/hooks/claude_hooks/connection_pool.py +4 -4
- claude_mpm/hooks/claude_hooks/event_handlers.py +21 -18
- claude_mpm/hooks/claude_hooks/hook_handler.py +209 -25
- claude_mpm/hooks/claude_hooks/installer.py +783 -0
- claude_mpm/hooks/claude_hooks/memory_integration.py +3 -3
- claude_mpm/hooks/claude_hooks/response_tracking.py +57 -17
- claude_mpm/hooks/claude_hooks/services/connection_manager.py +64 -49
- claude_mpm/hooks/claude_hooks/services/connection_manager_http.py +140 -76
- claude_mpm/hooks/claude_hooks/services/state_manager.py +11 -9
- claude_mpm/hooks/claude_hooks/services/subagent_processor.py +3 -3
- claude_mpm/hooks/failure_learning/__init__.py +60 -0
- claude_mpm/hooks/failure_learning/failure_detection_hook.py +235 -0
- claude_mpm/hooks/failure_learning/fix_detection_hook.py +217 -0
- claude_mpm/hooks/failure_learning/learning_extraction_hook.py +286 -0
- claude_mpm/hooks/instruction_reinforcement.py +301 -0
- claude_mpm/hooks/kuzu_enrichment_hook.py +263 -0
- claude_mpm/hooks/kuzu_memory_hook.py +386 -0
- claude_mpm/hooks/kuzu_response_hook.py +183 -0
- claude_mpm/hooks/memory_integration_hook.py +1 -1
- claude_mpm/hooks/session_resume_hook.py +121 -0
- claude_mpm/hooks/templates/pre_tool_use_simple.py +78 -0
- claude_mpm/hooks/templates/pre_tool_use_template.py +323 -0
- claude_mpm/hooks/tool_call_interceptor.py +8 -5
- claude_mpm/hooks/validation_hooks.py +3 -3
- claude_mpm/init.py +23 -4
- claude_mpm/models/agent_session.py +8 -6
- claude_mpm/models/resume_log.py +340 -0
- claude_mpm/schemas/__init__.py +12 -0
- claude_mpm/scripts/claude-hook-handler.sh +187 -0
- claude_mpm/scripts/launch_monitor.py +85 -0
- claude_mpm/scripts/mcp_server.py +3 -5
- claude_mpm/scripts/mpm_doctor.py +3 -2
- claude_mpm/scripts/socketio_daemon.py +156 -396
- claude_mpm/services/__init__.py +144 -160
- claude_mpm/services/agents/__init__.py +18 -5
- claude_mpm/services/agents/agent_builder.py +13 -11
- claude_mpm/services/agents/auto_config_manager.py +796 -0
- claude_mpm/services/agents/deployment/agent_config_provider.py +127 -27
- claude_mpm/services/agents/deployment/agent_configuration_manager.py +1 -1
- claude_mpm/services/agents/deployment/agent_deployment.py +38 -15
- claude_mpm/services/agents/deployment/agent_discovery_service.py +125 -7
- claude_mpm/services/agents/deployment/agent_filesystem_manager.py +5 -5
- claude_mpm/services/agents/deployment/agent_format_converter.py +56 -12
- claude_mpm/services/agents/deployment/agent_lifecycle_manager.py +4 -2
- claude_mpm/services/agents/deployment/agent_operation_service.py +2 -2
- claude_mpm/services/agents/deployment/agent_record_service.py +5 -6
- claude_mpm/services/agents/deployment/agent_state_service.py +2 -2
- claude_mpm/services/agents/deployment/agent_template_builder.py +722 -37
- claude_mpm/services/agents/deployment/agent_validator.py +31 -7
- claude_mpm/services/agents/deployment/agent_version_manager.py +9 -1
- claude_mpm/services/agents/deployment/agent_versioning.py +1 -1
- claude_mpm/services/agents/deployment/async_agent_deployment.py +1 -1
- claude_mpm/services/agents/deployment/deployment_config_loader.py +131 -7
- claude_mpm/services/agents/deployment/deployment_type_detector.py +10 -14
- claude_mpm/services/agents/deployment/deployment_wrapper.py +58 -0
- claude_mpm/services/agents/deployment/interface_adapter.py +3 -2
- claude_mpm/services/agents/deployment/local_template_deployment.py +360 -0
- claude_mpm/services/agents/deployment/multi_source_deployment_service.py +134 -38
- claude_mpm/services/agents/deployment/pipeline/steps/agent_processing_step.py +8 -7
- claude_mpm/services/agents/deployment/pipeline/steps/base_step.py +7 -16
- claude_mpm/services/agents/deployment/pipeline/steps/configuration_step.py +4 -3
- claude_mpm/services/agents/deployment/pipeline/steps/target_directory_step.py +7 -5
- claude_mpm/services/agents/deployment/pipeline/steps/validation_step.py +6 -5
- claude_mpm/services/agents/deployment/refactored_agent_deployment_service.py +9 -6
- claude_mpm/services/agents/deployment/system_instructions_deployer.py +9 -6
- claude_mpm/services/agents/deployment/validation/__init__.py +3 -1
- claude_mpm/services/agents/deployment/validation/template_validator.py +64 -44
- claude_mpm/services/agents/deployment/validation/validation_result.py +1 -9
- claude_mpm/services/agents/loading/agent_profile_loader.py +10 -9
- claude_mpm/services/agents/loading/base_agent_manager.py +16 -6
- claude_mpm/services/agents/loading/framework_agent_loader.py +2 -2
- claude_mpm/services/agents/local_template_manager.py +744 -0
- claude_mpm/services/agents/management/agent_capabilities_generator.py +3 -2
- claude_mpm/services/agents/management/agent_management_service.py +5 -5
- claude_mpm/services/agents/memory/agent_memory_manager.py +32 -29
- claude_mpm/services/agents/memory/content_manager.py +17 -9
- claude_mpm/services/agents/memory/memory_categorization_service.py +4 -2
- claude_mpm/services/agents/memory/memory_file_service.py +32 -6
- claude_mpm/services/agents/memory/memory_format_service.py +7 -7
- claude_mpm/services/agents/memory/memory_limits_service.py +4 -2
- claude_mpm/services/agents/memory/template_generator.py +3 -3
- claude_mpm/services/agents/observers.py +547 -0
- claude_mpm/services/agents/recommender.py +615 -0
- claude_mpm/services/agents/registry/deployed_agent_discovery.py +3 -3
- claude_mpm/services/agents/registry/modification_tracker.py +30 -19
- claude_mpm/services/async_session_logger.py +141 -98
- claude_mpm/services/claude_session_logger.py +82 -74
- claude_mpm/services/cli/agent_cleanup_service.py +6 -5
- claude_mpm/services/cli/agent_dependency_service.py +1 -1
- claude_mpm/services/cli/agent_listing_service.py +5 -5
- claude_mpm/services/cli/agent_validation_service.py +6 -5
- claude_mpm/services/cli/memory_crud_service.py +12 -7
- claude_mpm/services/cli/memory_output_formatter.py +2 -2
- claude_mpm/services/cli/resume_service.py +617 -0
- claude_mpm/services/cli/session_manager.py +104 -13
- claude_mpm/services/cli/session_pause_manager.py +504 -0
- claude_mpm/services/cli/session_resume_helper.py +372 -0
- claude_mpm/services/cli/startup_checker.py +13 -21
- claude_mpm/services/cli/unified_dashboard_manager.py +439 -0
- claude_mpm/services/command_deployment_service.py +17 -9
- claude_mpm/services/command_handler_service.py +11 -5
- claude_mpm/services/core/__init__.py +33 -1
- claude_mpm/services/core/base.py +26 -11
- claude_mpm/services/core/cache_manager.py +1 -3
- claude_mpm/services/core/interfaces/__init__.py +90 -3
- claude_mpm/services/core/interfaces/agent.py +184 -0
- claude_mpm/services/core/interfaces/health.py +172 -0
- claude_mpm/services/core/interfaces/model.py +281 -0
- claude_mpm/services/core/interfaces/process.py +372 -0
- claude_mpm/services/core/interfaces/project.py +121 -0
- claude_mpm/services/core/interfaces/restart.py +307 -0
- claude_mpm/services/core/interfaces/stability.py +260 -0
- claude_mpm/services/core/interfaces.py +56 -1
- claude_mpm/services/core/memory_manager.py +92 -47
- claude_mpm/services/core/models/__init__.py +79 -0
- claude_mpm/services/core/models/agent_config.py +384 -0
- claude_mpm/services/core/models/health.py +162 -0
- claude_mpm/services/core/models/process.py +239 -0
- claude_mpm/services/core/models/restart.py +302 -0
- claude_mpm/services/core/models/stability.py +264 -0
- claude_mpm/services/core/models/toolchain.py +306 -0
- claude_mpm/services/core/path_resolver.py +37 -18
- claude_mpm/services/core/service_container.py +2 -2
- claude_mpm/services/diagnostics/__init__.py +2 -2
- claude_mpm/services/diagnostics/checks/__init__.py +4 -2
- claude_mpm/services/diagnostics/checks/agent_check.py +30 -32
- claude_mpm/services/diagnostics/checks/claude_code_check.py +270 -0
- claude_mpm/services/diagnostics/checks/common_issues_check.py +28 -27
- claude_mpm/services/diagnostics/checks/configuration_check.py +26 -25
- claude_mpm/services/diagnostics/checks/filesystem_check.py +18 -17
- claude_mpm/services/diagnostics/checks/installation_check.py +165 -60
- claude_mpm/services/diagnostics/checks/instructions_check.py +22 -24
- claude_mpm/services/diagnostics/checks/mcp_check.py +57 -43
- claude_mpm/services/diagnostics/checks/mcp_services_check.py +1066 -0
- claude_mpm/services/diagnostics/checks/monitor_check.py +24 -23
- claude_mpm/services/diagnostics/checks/startup_log_check.py +14 -11
- claude_mpm/services/diagnostics/diagnostic_runner.py +22 -13
- claude_mpm/services/diagnostics/doctor_reporter.py +275 -47
- claude_mpm/services/diagnostics/models.py +37 -21
- claude_mpm/services/event_aggregator.py +5 -3
- claude_mpm/services/event_bus/direct_relay.py +152 -13
- claude_mpm/services/event_bus/event_bus.py +51 -9
- claude_mpm/services/event_bus/relay.py +33 -14
- claude_mpm/services/events/consumers/dead_letter.py +7 -5
- claude_mpm/services/events/core.py +5 -6
- claude_mpm/services/events/producers/hook.py +6 -6
- claude_mpm/services/events/producers/system.py +8 -8
- claude_mpm/services/exceptions.py +5 -5
- claude_mpm/services/framework_claude_md_generator/__init__.py +1 -1
- claude_mpm/services/framework_claude_md_generator/content_assembler.py +5 -5
- claude_mpm/services/framework_claude_md_generator/content_validator.py +2 -2
- claude_mpm/services/framework_claude_md_generator/deployment_manager.py +3 -3
- claude_mpm/services/framework_claude_md_generator/section_generators/__init__.py +2 -2
- claude_mpm/services/framework_claude_md_generator/version_manager.py +1 -1
- claude_mpm/services/hook_installer_service.py +506 -0
- claude_mpm/services/hook_service.py +5 -6
- claude_mpm/services/infrastructure/context_preservation.py +13 -11
- claude_mpm/services/infrastructure/daemon_manager.py +9 -9
- claude_mpm/services/infrastructure/logging.py +2 -2
- claude_mpm/services/infrastructure/monitoring/__init__.py +12 -12
- claude_mpm/services/infrastructure/monitoring/aggregator.py +12 -12
- claude_mpm/services/infrastructure/monitoring/base.py +5 -13
- claude_mpm/services/infrastructure/monitoring/network.py +7 -6
- claude_mpm/services/infrastructure/monitoring/process.py +13 -12
- claude_mpm/services/infrastructure/monitoring/resources.py +8 -7
- claude_mpm/services/infrastructure/monitoring/service.py +16 -15
- claude_mpm/services/infrastructure/monitoring.py +12 -12
- claude_mpm/services/infrastructure/resume_log_generator.py +439 -0
- claude_mpm/services/local_ops/__init__.py +165 -0
- claude_mpm/services/local_ops/crash_detector.py +257 -0
- claude_mpm/services/local_ops/health_checks/__init__.py +28 -0
- claude_mpm/services/local_ops/health_checks/http_check.py +224 -0
- claude_mpm/services/local_ops/health_checks/process_check.py +236 -0
- claude_mpm/services/local_ops/health_checks/resource_check.py +255 -0
- claude_mpm/services/local_ops/health_manager.py +430 -0
- claude_mpm/services/local_ops/log_monitor.py +396 -0
- claude_mpm/services/local_ops/memory_leak_detector.py +294 -0
- claude_mpm/services/local_ops/process_manager.py +595 -0
- claude_mpm/services/local_ops/resource_monitor.py +331 -0
- claude_mpm/services/local_ops/restart_manager.py +401 -0
- claude_mpm/services/local_ops/restart_policy.py +387 -0
- claude_mpm/services/local_ops/state_manager.py +372 -0
- claude_mpm/services/local_ops/unified_manager.py +600 -0
- claude_mpm/services/mcp_config_manager.py +1612 -0
- claude_mpm/services/mcp_gateway/__init__.py +97 -93
- claude_mpm/services/mcp_gateway/auto_configure.py +43 -38
- claude_mpm/services/mcp_gateway/config/config_loader.py +3 -3
- claude_mpm/services/mcp_gateway/config/configuration.py +23 -4
- claude_mpm/services/mcp_gateway/core/__init__.py +1 -2
- claude_mpm/services/mcp_gateway/core/base.py +20 -33
- claude_mpm/services/mcp_gateway/core/process_pool.py +585 -31
- claude_mpm/services/mcp_gateway/core/singleton_manager.py +2 -2
- claude_mpm/services/mcp_gateway/core/startup_verification.py +3 -3
- claude_mpm/services/mcp_gateway/main.py +90 -15
- claude_mpm/services/mcp_gateway/registry/service_registry.py +4 -2
- claude_mpm/services/mcp_gateway/registry/tool_registry.py +12 -9
- claude_mpm/services/mcp_gateway/server/mcp_gateway.py +4 -4
- claude_mpm/services/mcp_gateway/server/stdio_server.py +9 -15
- claude_mpm/services/mcp_gateway/tools/__init__.py +14 -2
- claude_mpm/services/mcp_gateway/tools/base_adapter.py +15 -15
- claude_mpm/services/mcp_gateway/tools/document_summarizer.py +10 -9
- claude_mpm/services/mcp_gateway/tools/external_mcp_services.py +654 -0
- claude_mpm/services/mcp_gateway/tools/health_check_tool.py +36 -34
- claude_mpm/services/mcp_gateway/tools/hello_world.py +8 -8
- claude_mpm/services/mcp_gateway/tools/kuzu_memory_service.py +551 -0
- claude_mpm/services/mcp_gateway/utils/__init__.py +14 -0
- claude_mpm/services/mcp_gateway/utils/package_version_checker.py +160 -0
- claude_mpm/services/mcp_gateway/utils/update_preferences.py +170 -0
- claude_mpm/services/mcp_service_verifier.py +729 -0
- claude_mpm/services/memory/builder.py +9 -8
- claude_mpm/services/memory/cache/shared_prompt_cache.py +2 -1
- claude_mpm/services/memory/cache/simple_cache.py +2 -2
- claude_mpm/services/memory/failure_tracker.py +578 -0
- claude_mpm/services/memory/indexed_memory.py +8 -8
- claude_mpm/services/memory/optimizer.py +8 -9
- claude_mpm/services/memory/router.py +3 -3
- claude_mpm/services/memory_hook_service.py +165 -4
- claude_mpm/services/model/__init__.py +147 -0
- claude_mpm/services/model/base_provider.py +365 -0
- claude_mpm/services/model/claude_provider.py +412 -0
- claude_mpm/services/model/model_router.py +453 -0
- claude_mpm/services/model/ollama_provider.py +415 -0
- claude_mpm/services/monitor/__init__.py +20 -0
- claude_mpm/services/monitor/daemon.py +671 -0
- claude_mpm/services/monitor/daemon_manager.py +963 -0
- claude_mpm/services/monitor/event_emitter.py +350 -0
- claude_mpm/services/monitor/handlers/__init__.py +21 -0
- claude_mpm/services/monitor/handlers/code_analysis.py +332 -0
- claude_mpm/services/monitor/handlers/dashboard.py +299 -0
- claude_mpm/services/monitor/handlers/file.py +264 -0
- claude_mpm/services/monitor/handlers/hooks.py +512 -0
- claude_mpm/services/monitor/management/__init__.py +18 -0
- claude_mpm/services/monitor/management/health.py +124 -0
- claude_mpm/services/monitor/management/lifecycle.py +724 -0
- claude_mpm/services/monitor/server.py +817 -0
- claude_mpm/services/monitor_build_service.py +2 -2
- claude_mpm/services/native_agent_converter.py +356 -0
- claude_mpm/services/orphan_detection.py +786 -0
- claude_mpm/services/port_manager.py +2 -2
- claude_mpm/services/project/__init__.py +23 -0
- claude_mpm/services/project/analyzer.py +3 -3
- claude_mpm/services/project/architecture_analyzer.py +6 -6
- claude_mpm/services/project/archive_manager.py +1045 -0
- claude_mpm/services/project/dependency_analyzer.py +8 -8
- claude_mpm/services/project/detection_strategies.py +719 -0
- claude_mpm/services/project/documentation_manager.py +553 -0
- claude_mpm/services/project/enhanced_analyzer.py +572 -0
- claude_mpm/services/project/language_analyzer.py +3 -3
- claude_mpm/services/project/metrics_collector.py +7 -10
- claude_mpm/services/project/project_organizer.py +1005 -0
- claude_mpm/services/project/registry.py +13 -7
- claude_mpm/services/project/toolchain_analyzer.py +581 -0
- claude_mpm/services/project_port_allocator.py +596 -0
- claude_mpm/services/response_tracker.py +21 -10
- claude_mpm/services/runner_configuration_service.py +1 -0
- claude_mpm/services/self_upgrade_service.py +500 -0
- claude_mpm/services/session_management_service.py +7 -5
- claude_mpm/services/session_manager.py +380 -0
- claude_mpm/services/shared/__init__.py +2 -1
- claude_mpm/services/shared/async_service_base.py +16 -27
- claude_mpm/services/shared/config_service_base.py +17 -14
- claude_mpm/services/shared/lifecycle_service_base.py +1 -14
- claude_mpm/services/shared/service_factory.py +8 -5
- claude_mpm/services/socketio/client_proxy.py +60 -5
- claude_mpm/services/socketio/dashboard_server.py +361 -0
- claude_mpm/services/socketio/event_normalizer.py +74 -6
- claude_mpm/services/socketio/handlers/__init__.py +5 -0
- claude_mpm/services/socketio/handlers/base.py +2 -2
- claude_mpm/services/socketio/handlers/code_analysis.py +682 -0
- claude_mpm/services/socketio/handlers/connection.py +21 -40
- claude_mpm/services/socketio/handlers/connection_handler.py +16 -28
- claude_mpm/services/socketio/handlers/file.py +46 -10
- claude_mpm/services/socketio/handlers/git.py +8 -8
- claude_mpm/services/socketio/handlers/hook.py +29 -17
- claude_mpm/services/socketio/handlers/registry.py +4 -0
- claude_mpm/services/socketio/monitor_client.py +364 -0
- claude_mpm/services/socketio/server/broadcaster.py +9 -7
- claude_mpm/services/socketio/server/connection_manager.py +131 -68
- claude_mpm/services/socketio/server/core.py +275 -22
- claude_mpm/services/socketio/server/eventbus_integration.py +20 -14
- claude_mpm/services/socketio/server/main.py +99 -29
- claude_mpm/services/socketio_client_manager.py +4 -4
- claude_mpm/services/subprocess_launcher_service.py +19 -15
- claude_mpm/services/system_instructions_service.py +2 -2
- claude_mpm/services/ticket_services/formatter_service.py +1 -1
- claude_mpm/services/ticket_services/validation_service.py +5 -5
- claude_mpm/services/unified/__init__.py +65 -0
- claude_mpm/services/unified/analyzer_strategies/__init__.py +44 -0
- claude_mpm/services/unified/analyzer_strategies/code_analyzer.py +518 -0
- claude_mpm/services/unified/analyzer_strategies/dependency_analyzer.py +680 -0
- claude_mpm/services/unified/analyzer_strategies/performance_analyzer.py +903 -0
- claude_mpm/services/unified/analyzer_strategies/security_analyzer.py +746 -0
- claude_mpm/services/unified/analyzer_strategies/structure_analyzer.py +733 -0
- claude_mpm/services/unified/config_strategies/__init__.py +175 -0
- claude_mpm/services/unified/config_strategies/config_schema.py +731 -0
- claude_mpm/services/unified/config_strategies/context_strategy.py +747 -0
- claude_mpm/services/unified/config_strategies/error_handling_strategy.py +1005 -0
- claude_mpm/services/unified/config_strategies/file_loader_strategy.py +881 -0
- claude_mpm/services/unified/config_strategies/unified_config_service.py +823 -0
- claude_mpm/services/unified/config_strategies/validation_strategy.py +1148 -0
- claude_mpm/services/unified/deployment_strategies/__init__.py +97 -0
- claude_mpm/services/unified/deployment_strategies/base.py +553 -0
- claude_mpm/services/unified/deployment_strategies/cloud_strategies.py +573 -0
- claude_mpm/services/unified/deployment_strategies/local.py +607 -0
- claude_mpm/services/unified/deployment_strategies/utils.py +667 -0
- claude_mpm/services/unified/deployment_strategies/vercel.py +475 -0
- claude_mpm/services/unified/interfaces.py +475 -0
- claude_mpm/services/unified/migration.py +509 -0
- claude_mpm/services/unified/strategies.py +534 -0
- claude_mpm/services/unified/unified_analyzer.py +542 -0
- claude_mpm/services/unified/unified_config.py +691 -0
- claude_mpm/services/unified/unified_deployment.py +470 -0
- claude_mpm/services/utility_service.py +6 -3
- claude_mpm/services/version_control/branch_strategy.py +2 -2
- claude_mpm/services/version_control/conflict_resolution.py +8 -4
- claude_mpm/services/version_control/git_operations.py +26 -24
- claude_mpm/services/version_control/semantic_versioning.py +14 -14
- claude_mpm/services/version_control/version_parser.py +14 -11
- claude_mpm/services/version_service.py +104 -1
- claude_mpm/services/visualization/__init__.py +19 -0
- claude_mpm/services/visualization/mermaid_generator.py +938 -0
- claude_mpm/skills/__init__.py +42 -0
- claude_mpm/skills/agent_skills_injector.py +324 -0
- claude_mpm/skills/bundled/LICENSE_ATTRIBUTIONS.md +79 -0
- claude_mpm/skills/bundled/__init__.py +6 -0
- claude_mpm/skills/bundled/api-documentation.md +393 -0
- claude_mpm/skills/bundled/async-testing.md +571 -0
- claude_mpm/skills/bundled/code-review.md +143 -0
- claude_mpm/skills/bundled/collaboration/brainstorming/SKILL.md +79 -0
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/SKILL.md +178 -0
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/agent-prompts.md +577 -0
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/coordination-patterns.md +467 -0
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/examples.md +537 -0
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/troubleshooting.md +730 -0
- claude_mpm/skills/bundled/collaboration/requesting-code-review/SKILL.md +112 -0
- claude_mpm/skills/bundled/collaboration/requesting-code-review/references/code-reviewer-template.md +146 -0
- claude_mpm/skills/bundled/collaboration/requesting-code-review/references/review-examples.md +412 -0
- claude_mpm/skills/bundled/collaboration/writing-plans/SKILL.md +81 -0
- claude_mpm/skills/bundled/collaboration/writing-plans/references/best-practices.md +362 -0
- claude_mpm/skills/bundled/collaboration/writing-plans/references/plan-structure-templates.md +312 -0
- claude_mpm/skills/bundled/database-migration.md +199 -0
- claude_mpm/skills/bundled/debugging/root-cause-tracing/SKILL.md +152 -0
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/advanced-techniques.md +668 -0
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/examples.md +587 -0
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/integration.md +438 -0
- claude_mpm/skills/bundled/debugging/root-cause-tracing/references/tracing-techniques.md +391 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/CREATION-LOG.md +119 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/SKILL.md +148 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/anti-patterns.md +483 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/examples.md +452 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/troubleshooting.md +449 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/workflow.md +411 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-academic.md +14 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-1.md +58 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-2.md +68 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-3.md +69 -0
- claude_mpm/skills/bundled/debugging/verification-before-completion/SKILL.md +131 -0
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/gate-function.md +325 -0
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/integration-and-workflows.md +490 -0
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/red-flags-and-failures.md +425 -0
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/verification-patterns.md +499 -0
- claude_mpm/skills/bundled/docker-containerization.md +194 -0
- claude_mpm/skills/bundled/express-local-dev.md +1429 -0
- claude_mpm/skills/bundled/fastapi-local-dev.md +1199 -0
- claude_mpm/skills/bundled/git-workflow.md +414 -0
- claude_mpm/skills/bundled/imagemagick.md +204 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/scripts/validate_env.py +576 -0
- claude_mpm/skills/bundled/json-data-handling.md +223 -0
- claude_mpm/skills/bundled/main/artifacts-builder/SKILL.md +86 -0
- claude_mpm/skills/bundled/main/internal-comms/SKILL.md +43 -0
- claude_mpm/skills/bundled/main/internal-comms/examples/3p-updates.md +47 -0
- claude_mpm/skills/bundled/main/internal-comms/examples/company-newsletter.md +65 -0
- claude_mpm/skills/bundled/main/internal-comms/examples/faq-answers.md +30 -0
- claude_mpm/skills/bundled/main/internal-comms/examples/general-comms.md +16 -0
- claude_mpm/skills/bundled/main/mcp-builder/SKILL.md +160 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/design_principles.md +412 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/evaluation.md +602 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/mcp_best_practices.md +915 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/node_mcp_server.md +916 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/python_mcp_server.md +752 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/workflow.md +1237 -0
- claude_mpm/skills/bundled/main/mcp-builder/scripts/connections.py +157 -0
- claude_mpm/skills/bundled/main/mcp-builder/scripts/evaluation.py +425 -0
- claude_mpm/skills/bundled/main/skill-creator/SKILL.md +189 -0
- claude_mpm/skills/bundled/main/skill-creator/references/best-practices.md +500 -0
- claude_mpm/skills/bundled/main/skill-creator/references/creation-workflow.md +464 -0
- claude_mpm/skills/bundled/main/skill-creator/references/examples.md +619 -0
- claude_mpm/skills/bundled/main/skill-creator/references/progressive-disclosure.md +437 -0
- claude_mpm/skills/bundled/main/skill-creator/references/skill-structure.md +231 -0
- claude_mpm/skills/bundled/main/skill-creator/scripts/init_skill.py +303 -0
- claude_mpm/skills/bundled/main/skill-creator/scripts/package_skill.py +113 -0
- claude_mpm/skills/bundled/main/skill-creator/scripts/quick_validate.py +72 -0
- claude_mpm/skills/bundled/nextjs-local-dev.md +807 -0
- claude_mpm/skills/bundled/pdf.md +141 -0
- claude_mpm/skills/bundled/performance-profiling.md +573 -0
- claude_mpm/skills/bundled/php/espocrm-development/SKILL.md +170 -0
- claude_mpm/skills/bundled/php/espocrm-development/references/architecture.md +602 -0
- claude_mpm/skills/bundled/php/espocrm-development/references/common-tasks.md +821 -0
- claude_mpm/skills/bundled/php/espocrm-development/references/development-workflow.md +742 -0
- claude_mpm/skills/bundled/php/espocrm-development/references/frontend-customization.md +726 -0
- claude_mpm/skills/bundled/php/espocrm-development/references/hooks-and-services.md +764 -0
- claude_mpm/skills/bundled/php/espocrm-development/references/testing-debugging.md +831 -0
- claude_mpm/skills/bundled/refactoring-patterns.md +180 -0
- claude_mpm/skills/bundled/rust/desktop-applications/SKILL.md +226 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/architecture-patterns.md +901 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/native-gui-frameworks.md +901 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/platform-integration.md +775 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/state-management.md +937 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/tauri-framework.md +770 -0
- claude_mpm/skills/bundled/rust/desktop-applications/references/testing-deployment.md +961 -0
- claude_mpm/skills/bundled/security-scanning.md +327 -0
- claude_mpm/skills/bundled/systematic-debugging.md +473 -0
- claude_mpm/skills/bundled/test-driven-development.md +378 -0
- claude_mpm/skills/bundled/testing/condition-based-waiting/SKILL.md +119 -0
- claude_mpm/skills/bundled/testing/condition-based-waiting/references/patterns-and-implementation.md +253 -0
- claude_mpm/skills/bundled/testing/test-driven-development/SKILL.md +145 -0
- claude_mpm/skills/bundled/testing/test-driven-development/references/anti-patterns.md +543 -0
- claude_mpm/skills/bundled/testing/test-driven-development/references/examples.md +741 -0
- claude_mpm/skills/bundled/testing/test-driven-development/references/integration.md +470 -0
- claude_mpm/skills/bundled/testing/test-driven-development/references/philosophy.md +458 -0
- claude_mpm/skills/bundled/testing/test-driven-development/references/workflow.md +639 -0
- claude_mpm/skills/bundled/testing/testing-anti-patterns/SKILL.md +140 -0
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/completeness-anti-patterns.md +572 -0
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/core-anti-patterns.md +411 -0
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/detection-guide.md +569 -0
- claude_mpm/skills/bundled/testing/testing-anti-patterns/references/tdd-connection.md +695 -0
- claude_mpm/skills/bundled/testing/webapp-testing/SKILL.md +184 -0
- claude_mpm/skills/bundled/testing/webapp-testing/decision-tree.md +459 -0
- claude_mpm/skills/bundled/testing/webapp-testing/examples/console_logging.py +35 -0
- claude_mpm/skills/bundled/testing/webapp-testing/examples/element_discovery.py +44 -0
- claude_mpm/skills/bundled/testing/webapp-testing/examples/static_html_automation.py +34 -0
- claude_mpm/skills/bundled/testing/webapp-testing/playwright-patterns.md +479 -0
- claude_mpm/skills/bundled/testing/webapp-testing/reconnaissance-pattern.md +687 -0
- claude_mpm/skills/bundled/testing/webapp-testing/scripts/with_server.py +129 -0
- claude_mpm/skills/bundled/testing/webapp-testing/server-management.md +758 -0
- claude_mpm/skills/bundled/testing/webapp-testing/troubleshooting.md +868 -0
- claude_mpm/skills/bundled/vite-local-dev.md +1061 -0
- claude_mpm/skills/bundled/web-performance-optimization.md +2305 -0
- claude_mpm/skills/bundled/xlsx.md +157 -0
- claude_mpm/skills/registry.py +286 -0
- claude_mpm/skills/skill_manager.py +310 -0
- claude_mpm/skills/skills_registry.py +348 -0
- claude_mpm/skills/skills_service.py +739 -0
- claude_mpm/storage/state_storage.py +31 -31
- claude_mpm/tools/__init__.py +10 -0
- claude_mpm/tools/__main__.py +208 -0
- claude_mpm/tools/code_tree_analyzer/__init__.py +45 -0
- claude_mpm/tools/code_tree_analyzer/analysis.py +299 -0
- claude_mpm/tools/code_tree_analyzer/cache.py +131 -0
- claude_mpm/tools/code_tree_analyzer/core.py +380 -0
- claude_mpm/tools/code_tree_analyzer/discovery.py +403 -0
- claude_mpm/tools/code_tree_analyzer/events.py +168 -0
- claude_mpm/tools/code_tree_analyzer/gitignore.py +308 -0
- claude_mpm/tools/code_tree_analyzer/models.py +39 -0
- claude_mpm/tools/code_tree_analyzer/multilang_analyzer.py +224 -0
- claude_mpm/tools/code_tree_analyzer/python_analyzer.py +284 -0
- claude_mpm/tools/code_tree_builder.py +631 -0
- claude_mpm/tools/code_tree_events.py +420 -0
- claude_mpm/tools/socketio_debug.py +671 -0
- claude_mpm/utils/agent_dependency_loader.py +108 -27
- claude_mpm/utils/common.py +544 -0
- claude_mpm/utils/config_manager.py +12 -6
- claude_mpm/utils/database_connector.py +298 -0
- claude_mpm/utils/dependency_cache.py +2 -2
- claude_mpm/utils/dependency_strategies.py +15 -10
- claude_mpm/utils/display_helper.py +260 -0
- claude_mpm/utils/environment_context.py +4 -3
- claude_mpm/utils/error_handler.py +5 -3
- claude_mpm/utils/file_utils.py +13 -14
- claude_mpm/utils/git_analyzer.py +407 -0
- claude_mpm/utils/log_cleanup.py +627 -0
- claude_mpm/utils/path_operations.py +7 -4
- claude_mpm/utils/robust_installer.py +133 -24
- claude_mpm/utils/session_logging.py +2 -2
- claude_mpm/utils/subprocess_utils.py +9 -8
- claude_mpm/validation/agent_validator.py +6 -6
- claude_mpm/validation/frontmatter_validator.py +6 -6
- claude_mpm-4.24.0.dist-info/METADATA +675 -0
- claude_mpm-4.24.0.dist-info/RECORD +1018 -0
- {claude_mpm-4.1.6.dist-info → claude_mpm-4.24.0.dist-info}/entry_points.txt +1 -0
- claude_mpm/agents/INSTRUCTIONS.md +0 -237
- claude_mpm/agents/schema/agent_schema.json +0 -314
- claude_mpm/agents/templates/agent-manager.md +0 -304
- claude_mpm/cli/commands/configure_tui.py +0 -1921
- claude_mpm/cli/commands/socketio_monitor.py +0 -233
- claude_mpm/hooks/claude_hooks/hook_handler_eventbus.py +0 -425
- claude_mpm/hooks/claude_hooks/hook_handler_original.py +0 -1040
- claude_mpm/hooks/claude_hooks/hook_handler_refactored.py +0 -347
- claude_mpm/scripts/socketio_daemon_hardened.py +0 -937
- claude_mpm/scripts/socketio_server_manager.py +0 -349
- claude_mpm/services/agents/deployment/agent_lifecycle_manager_refactored.py +0 -575
- claude_mpm/services/cli/dashboard_launcher.py +0 -424
- claude_mpm/services/cli/socketio_manager.py +0 -498
- claude_mpm/services/diagnostics/checks/claude_desktop_check.py +0 -286
- claude_mpm/services/mcp_gateway/tools/ticket_tools.py +0 -645
- claude_mpm/services/mcp_gateway/tools/unified_ticket_tool.py +0 -602
- claude_mpm/services/project/analyzer_refactored.py +0 -450
- claude_mpm-4.1.6.dist-info/METADATA +0 -325
- claude_mpm-4.1.6.dist-info/RECORD +0 -550
- {claude_mpm-4.1.6.dist-info → claude_mpm-4.24.0.dist-info}/WHEEL +0 -0
- {claude_mpm-4.1.6.dist-info → claude_mpm-4.24.0.dist-info}/licenses/LICENSE +0 -0
- {claude_mpm-4.1.6.dist-info → claude_mpm-4.24.0.dist-info}/top_level.txt +0 -0
|
@@ -1,30 +1,31 @@
|
|
|
1
1
|
"""
|
|
2
2
|
Monitor command implementation for claude-mpm.
|
|
3
3
|
|
|
4
|
-
WHY: This module provides CLI commands for managing the
|
|
5
|
-
|
|
4
|
+
WHY: This module provides CLI commands for managing the unified monitoring daemon,
|
|
5
|
+
providing a single stable way to launch all monitoring functionality including
|
|
6
|
+
HTTP dashboard, Socket.IO events, real AST analysis, and Claude Code hook ingestion.
|
|
6
7
|
|
|
7
8
|
DESIGN DECISIONS:
|
|
8
|
-
- Use
|
|
9
|
-
-
|
|
10
|
-
-
|
|
11
|
-
-
|
|
9
|
+
- Use UnifiedMonitorDaemon for single stable monitoring service
|
|
10
|
+
- Single port (8765) for all functionality
|
|
11
|
+
- Support both foreground and daemon modes
|
|
12
|
+
- Real AST analysis using CodeTreeAnalyzer
|
|
13
|
+
- Integrated dashboard and Socket.IO server
|
|
12
14
|
"""
|
|
13
15
|
|
|
14
|
-
import subprocess
|
|
15
|
-
import sys
|
|
16
16
|
from typing import Optional
|
|
17
17
|
|
|
18
18
|
from ...constants import MonitorCommands
|
|
19
|
-
from ...
|
|
19
|
+
from ...services.monitor.daemon import UnifiedMonitorDaemon
|
|
20
20
|
from ..shared import BaseCommand, CommandResult
|
|
21
21
|
|
|
22
22
|
|
|
23
23
|
class MonitorCommand(BaseCommand):
|
|
24
|
-
"""Monitor command
|
|
24
|
+
"""Monitor command for managing the unified monitoring daemon."""
|
|
25
25
|
|
|
26
26
|
def __init__(self):
|
|
27
27
|
super().__init__("monitor")
|
|
28
|
+
self.daemon = None
|
|
28
29
|
|
|
29
30
|
def validate_args(self, args) -> Optional[str]:
|
|
30
31
|
"""Validate command arguments."""
|
|
@@ -37,41 +38,24 @@ class MonitorCommand(BaseCommand):
|
|
|
37
38
|
return None
|
|
38
39
|
|
|
39
40
|
def run(self, args) -> CommandResult:
|
|
40
|
-
"""Execute the monitor command."""
|
|
41
|
+
"""Execute the monitor command using unified monitoring daemon."""
|
|
41
42
|
try:
|
|
42
|
-
|
|
43
|
-
from ...scripts.socketio_server_manager import ServerManager
|
|
43
|
+
self.logger.info("Monitor command using unified monitoring daemon")
|
|
44
44
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
# Handle default case (no subcommand)
|
|
45
|
+
# Handle default case (no subcommand) - default to status
|
|
48
46
|
if not hasattr(args, "monitor_command") or not args.monitor_command:
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
return
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
MonitorCommands.RESTART.value: self._restart_server,
|
|
62
|
-
MonitorCommands.STATUS.value: self._status_server,
|
|
63
|
-
MonitorCommands.PORT.value: self._port_server,
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
if args.monitor_command in command_map:
|
|
67
|
-
success = command_map[args.monitor_command](args, server_manager)
|
|
68
|
-
if success:
|
|
69
|
-
return CommandResult.success_result(
|
|
70
|
-
f"Monitor {args.monitor_command} completed successfully"
|
|
71
|
-
)
|
|
72
|
-
return CommandResult.error_result(
|
|
73
|
-
f"Monitor {args.monitor_command} failed"
|
|
74
|
-
)
|
|
47
|
+
return self._status_monitor(args)
|
|
48
|
+
|
|
49
|
+
# Route to specific monitor commands
|
|
50
|
+
if args.monitor_command == MonitorCommands.START.value:
|
|
51
|
+
return self._start_monitor(args)
|
|
52
|
+
if args.monitor_command == MonitorCommands.STOP.value:
|
|
53
|
+
return self._stop_monitor(args)
|
|
54
|
+
if args.monitor_command == MonitorCommands.RESTART.value:
|
|
55
|
+
return self._restart_monitor(args)
|
|
56
|
+
if args.monitor_command == MonitorCommands.STATUS.value:
|
|
57
|
+
return self._status_monitor(args)
|
|
58
|
+
|
|
75
59
|
return CommandResult.error_result(
|
|
76
60
|
f"Unknown monitor command: {args.monitor_command}"
|
|
77
61
|
)
|
|
@@ -80,616 +64,183 @@ class MonitorCommand(BaseCommand):
|
|
|
80
64
|
self.logger.error(f"Error executing monitor command: {e}", exc_info=True)
|
|
81
65
|
return CommandResult.error_result(f"Error executing monitor command: {e}")
|
|
82
66
|
|
|
83
|
-
def
|
|
84
|
-
"""Start the
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
def _port_server(self, args, server_manager) -> bool:
|
|
100
|
-
"""Start/restart server on specific port."""
|
|
101
|
-
return _port_server(args, server_manager)
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
def manage_monitor(args):
|
|
105
|
-
"""
|
|
106
|
-
Main entry point for monitor command.
|
|
107
|
-
|
|
108
|
-
This function maintains backward compatibility while using the new BaseCommand pattern.
|
|
109
|
-
"""
|
|
110
|
-
command = MonitorCommand()
|
|
111
|
-
result = command.execute(args)
|
|
112
|
-
|
|
113
|
-
# Print result if structured output format is requested
|
|
114
|
-
if hasattr(args, "format") and args.format in ["json", "yaml"]:
|
|
115
|
-
command.print_result(result, args)
|
|
116
|
-
|
|
117
|
-
return result.exit_code
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
def manage_monitor_legacy(args):
|
|
121
|
-
"""
|
|
122
|
-
Legacy monitor command dispatcher.
|
|
123
|
-
|
|
124
|
-
WHY: This contains the original manage_monitor logic, preserved during migration
|
|
125
|
-
to BaseCommand pattern. Will be gradually refactored into the MonitorCommand class.
|
|
126
|
-
|
|
127
|
-
DESIGN DECISION: When no subcommand is provided, we show the server status
|
|
128
|
-
as the default action, giving users a quick overview of the monitoring system.
|
|
129
|
-
|
|
130
|
-
Args:
|
|
131
|
-
args: Parsed command line arguments with monitor_command attribute
|
|
132
|
-
"""
|
|
133
|
-
logger = get_logger("cli")
|
|
134
|
-
|
|
135
|
-
try:
|
|
136
|
-
# Import ServerManager from socketio_server_manager.py
|
|
137
|
-
from ...scripts.socketio_server_manager import ServerManager
|
|
138
|
-
|
|
139
|
-
server_manager = ServerManager()
|
|
140
|
-
|
|
141
|
-
if not args.monitor_command:
|
|
142
|
-
# No subcommand - show status as default
|
|
143
|
-
# WHY: Status is the most common operation users want when running monitor without args
|
|
144
|
-
args.verbose = False # Set default for verbose flag
|
|
145
|
-
success = _status_server(args, server_manager)
|
|
146
|
-
return 0 if success else 1
|
|
147
|
-
|
|
148
|
-
if args.monitor_command == MonitorCommands.START.value:
|
|
149
|
-
success = _start_server(args, server_manager)
|
|
150
|
-
return 0 if success else 1
|
|
151
|
-
|
|
152
|
-
if args.monitor_command == MonitorCommands.STOP.value:
|
|
153
|
-
success = _stop_server(args, server_manager)
|
|
154
|
-
return 0 if success else 1
|
|
155
|
-
|
|
156
|
-
if args.monitor_command == MonitorCommands.RESTART.value:
|
|
157
|
-
success = _restart_server(args, server_manager)
|
|
158
|
-
return 0 if success else 1
|
|
159
|
-
|
|
160
|
-
if args.monitor_command == MonitorCommands.STATUS.value:
|
|
161
|
-
success = _status_server(args, server_manager)
|
|
162
|
-
return 0 if success else 1
|
|
163
|
-
|
|
164
|
-
if args.monitor_command == MonitorCommands.PORT.value:
|
|
165
|
-
success = _port_server(args, server_manager)
|
|
166
|
-
return 0 if success else 1
|
|
167
|
-
|
|
168
|
-
logger.error(f"Unknown monitor command: {args.monitor_command}")
|
|
169
|
-
print(f"Unknown monitor command: {args.monitor_command}")
|
|
170
|
-
print("Available commands: start, stop, restart, status, port")
|
|
171
|
-
return 1
|
|
67
|
+
def _start_monitor(self, args) -> CommandResult:
|
|
68
|
+
"""Start the unified monitor daemon."""
|
|
69
|
+
port = getattr(args, "port", None)
|
|
70
|
+
if port is None:
|
|
71
|
+
port = 8765 # Default to 8765 for unified monitor
|
|
72
|
+
host = getattr(args, "host", "localhost")
|
|
73
|
+
|
|
74
|
+
# Check for explicit foreground flag first, then background flag
|
|
75
|
+
# Default to daemon/background mode if neither specified
|
|
76
|
+
if getattr(args, "foreground", False):
|
|
77
|
+
daemon_mode = False
|
|
78
|
+
elif getattr(args, "background", None) is not None:
|
|
79
|
+
daemon_mode = getattr(args, "background", False)
|
|
80
|
+
else:
|
|
81
|
+
# Default to daemon/background mode
|
|
82
|
+
daemon_mode = True
|
|
172
83
|
|
|
173
|
-
|
|
174
|
-
logger.
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
return 1
|
|
178
|
-
except Exception as e:
|
|
179
|
-
logger.error(f"Error managing monitor: {e}")
|
|
180
|
-
print(f"Error: {e}")
|
|
181
|
-
return 1
|
|
84
|
+
mode_str = "background/daemon" if daemon_mode else "foreground"
|
|
85
|
+
self.logger.info(
|
|
86
|
+
f"Starting unified monitor daemon on {host}:{port} (mode: {mode_str})"
|
|
87
|
+
)
|
|
182
88
|
|
|
183
|
-
|
|
89
|
+
# Create unified monitor daemon
|
|
90
|
+
self.daemon = UnifiedMonitorDaemon(
|
|
91
|
+
host=host, port=port, daemon_mode=daemon_mode
|
|
92
|
+
)
|
|
184
93
|
|
|
94
|
+
# Get force restart flag
|
|
95
|
+
force_restart = getattr(args, "force", False)
|
|
96
|
+
|
|
97
|
+
# Check if already running
|
|
98
|
+
if self.daemon.lifecycle.is_running() and not force_restart:
|
|
99
|
+
existing_pid = self.daemon.lifecycle.get_pid()
|
|
100
|
+
return CommandResult.success_result(
|
|
101
|
+
f"Unified monitor daemon already running with PID {existing_pid}",
|
|
102
|
+
data={
|
|
103
|
+
"url": f"http://{host}:{port}",
|
|
104
|
+
"port": port,
|
|
105
|
+
"pid": existing_pid,
|
|
106
|
+
},
|
|
107
|
+
)
|
|
185
108
|
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
109
|
+
# Start the daemon (with force restart if specified)
|
|
110
|
+
if self.daemon.start(force_restart=force_restart):
|
|
111
|
+
# For daemon mode, verify it actually started
|
|
112
|
+
if daemon_mode:
|
|
113
|
+
# Give it a moment to fully initialize
|
|
114
|
+
import time
|
|
189
115
|
|
|
190
|
-
|
|
191
|
-
port, either if no server is running (start) or if a server is already running
|
|
192
|
-
on a different port (restart). Enhanced with smart process detection to reclaim
|
|
193
|
-
ports from debug processes.
|
|
116
|
+
time.sleep(0.5)
|
|
194
117
|
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
118
|
+
# Check if it's actually running
|
|
119
|
+
if not self.daemon.lifecycle.is_running():
|
|
120
|
+
return CommandResult.error_result(
|
|
121
|
+
"Monitor daemon failed to start. Check ~/.claude-mpm/monitor-daemon.log for details."
|
|
122
|
+
)
|
|
198
123
|
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
port = args.port
|
|
203
|
-
host = getattr(args, "host", "localhost")
|
|
204
|
-
force = getattr(args, "force", False)
|
|
205
|
-
reclaim = getattr(args, "reclaim", True)
|
|
206
|
-
|
|
207
|
-
print(f"Managing Socket.IO monitoring server on port {port}...")
|
|
208
|
-
print(f"Target: {host}:{port}")
|
|
209
|
-
print()
|
|
210
|
-
|
|
211
|
-
try:
|
|
212
|
-
# Import PortManager to check port status
|
|
213
|
-
from ...services.port_manager import PortManager
|
|
214
|
-
|
|
215
|
-
port_manager = PortManager()
|
|
216
|
-
|
|
217
|
-
# Get detailed port status
|
|
218
|
-
port_status = port_manager.get_port_status(port)
|
|
219
|
-
|
|
220
|
-
# Check if port is in use
|
|
221
|
-
if not port_status["available"]:
|
|
222
|
-
process_info = port_status.get("process")
|
|
223
|
-
if process_info:
|
|
224
|
-
print(f"⚠️ Port {port} is in use:")
|
|
225
|
-
print(f" Process: {process_info['name']} (PID: {process_info['pid']})")
|
|
226
|
-
|
|
227
|
-
if process_info["is_ours"]:
|
|
228
|
-
if process_info["is_debug"]:
|
|
229
|
-
print(" Type: Debug/Test script (can be reclaimed)")
|
|
230
|
-
if reclaim:
|
|
231
|
-
print(" Action: Attempting to reclaim port...")
|
|
232
|
-
if port_manager.kill_process_on_port(port, force=force):
|
|
233
|
-
print(f" ✅ Successfully reclaimed port {port}")
|
|
234
|
-
else:
|
|
235
|
-
print(f" ❌ Failed to reclaim port {port}")
|
|
236
|
-
return False
|
|
237
|
-
elif process_info["is_daemon"]:
|
|
238
|
-
print(" Type: Daemon process")
|
|
239
|
-
if force:
|
|
240
|
-
print(
|
|
241
|
-
" Action: Force killing daemon (--force flag used)..."
|
|
242
|
-
)
|
|
243
|
-
if port_manager.kill_process_on_port(port, force=True):
|
|
244
|
-
print(f" ✅ Successfully killed daemon on port {port}")
|
|
245
|
-
else:
|
|
246
|
-
print(f" ❌ Failed to kill daemon on port {port}")
|
|
247
|
-
return False
|
|
248
|
-
else:
|
|
249
|
-
print(" ❌ Cannot start: Daemon already running")
|
|
250
|
-
print(f" Recommendation: {port_status['recommendation']}")
|
|
251
|
-
return False
|
|
252
|
-
else:
|
|
253
|
-
print(" Type: External process")
|
|
254
|
-
print(f" ❌ Cannot start: {port_status['recommendation']}")
|
|
255
|
-
return False
|
|
256
|
-
print()
|
|
257
|
-
|
|
258
|
-
# Check if there are any running servers
|
|
259
|
-
running_servers = server_manager.list_running_servers()
|
|
260
|
-
|
|
261
|
-
# Check if server is already running on this port after reclaim
|
|
262
|
-
server_on_port = any(server.get("port") == port for server in running_servers)
|
|
263
|
-
|
|
264
|
-
if server_on_port:
|
|
265
|
-
print(f"Server already running on port {port}. Restarting...")
|
|
266
|
-
success = server_manager.restart_server(port=port)
|
|
267
|
-
action = "restarted"
|
|
268
|
-
else:
|
|
269
|
-
# Check if servers are running on other ports
|
|
270
|
-
if running_servers:
|
|
271
|
-
print("Servers running on other ports:")
|
|
272
|
-
for server in running_servers:
|
|
273
|
-
server_port = server.get("port")
|
|
274
|
-
server_id = server.get("server_id", "unknown")
|
|
275
|
-
print(f" • Server '{server_id}' on port {server_port}")
|
|
276
|
-
print()
|
|
277
|
-
print(f"Starting new server on port {port}...")
|
|
124
|
+
# Get the actual PID
|
|
125
|
+
actual_pid = self.daemon.lifecycle.get_pid()
|
|
126
|
+
mode_info = f" in background (PID: {actual_pid})"
|
|
278
127
|
else:
|
|
279
|
-
|
|
128
|
+
mode_info = " in foreground"
|
|
280
129
|
|
|
281
|
-
|
|
282
|
-
|
|
130
|
+
return CommandResult.success_result(
|
|
131
|
+
f"Unified monitor daemon started on {host}:{port}{mode_info}",
|
|
132
|
+
data={"url": f"http://{host}:{port}", "port": port, "mode": mode_str},
|
|
283
133
|
)
|
|
284
|
-
action = "started"
|
|
285
|
-
|
|
286
|
-
if success:
|
|
287
|
-
print()
|
|
288
|
-
print(f"Monitor server {action} successfully on port {port}")
|
|
289
|
-
print()
|
|
290
|
-
print("Server management commands:")
|
|
291
|
-
print(" Status: ps aux | grep socketio")
|
|
292
|
-
print(f" Stop: claude-mpm monitor stop --port {port}")
|
|
293
|
-
print(f" Restart: claude-mpm monitor restart --port {port}")
|
|
294
|
-
print()
|
|
295
|
-
print(f"WebSocket URL: ws://{host}:{port}")
|
|
296
|
-
else:
|
|
297
|
-
print(f"Failed to {action.replace('ed', '')} server on port {port}")
|
|
298
|
-
print()
|
|
299
|
-
print("Troubleshooting:")
|
|
300
|
-
print(f" • Check if port {port} is available: lsof -i :{port}")
|
|
301
|
-
print(f" • Try a different port: claude-mpm monitor port {port + 1}")
|
|
302
|
-
print(" • Check system resources: free -h && df -h")
|
|
303
|
-
|
|
304
|
-
return success
|
|
305
|
-
|
|
306
|
-
except Exception as e:
|
|
307
|
-
print(f"Error managing server on port {port}: {e}")
|
|
308
|
-
print()
|
|
309
|
-
print("Troubleshooting:")
|
|
310
|
-
print(f" • Verify port {port} is valid and available")
|
|
311
|
-
print(" • Check system resources and permissions")
|
|
312
|
-
print(" • Try manual start/stop operations")
|
|
313
|
-
return False
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
def _start_server(args, server_manager):
|
|
317
|
-
"""
|
|
318
|
-
Start the Socket.IO monitoring server.
|
|
319
|
-
|
|
320
|
-
WHY: Users need to start the monitoring server to enable real-time monitoring
|
|
321
|
-
of Claude MPM sessions and websocket connections. Enhanced with smart process
|
|
322
|
-
detection to automatically reclaim ports from debug scripts.
|
|
323
|
-
|
|
324
|
-
Args:
|
|
325
|
-
args: Command arguments with optional port, host, force, and reclaim flags
|
|
326
|
-
server_manager: ServerManager instance
|
|
327
134
|
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
"""
|
|
331
|
-
port = getattr(args, "port", None)
|
|
332
|
-
host = getattr(args, "host", "localhost")
|
|
333
|
-
force = getattr(args, "force", False)
|
|
334
|
-
reclaim = getattr(args, "reclaim", True)
|
|
135
|
+
# Check if error was due to port already in use
|
|
136
|
+
import socket
|
|
335
137
|
|
|
336
|
-
|
|
138
|
+
try:
|
|
139
|
+
test_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
|
140
|
+
test_sock.connect((host, port))
|
|
141
|
+
test_sock.close()
|
|
142
|
+
return CommandResult.error_result(
|
|
143
|
+
f"Port {port} is already in use. Try 'claude-mpm monitor stop' first or use a different port."
|
|
144
|
+
)
|
|
145
|
+
except Exception:
|
|
146
|
+
pass
|
|
337
147
|
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
148
|
+
return CommandResult.error_result(
|
|
149
|
+
"Failed to start unified monitor daemon. Check ~/.claude-mpm/monitor-daemon.log for details."
|
|
150
|
+
)
|
|
341
151
|
|
|
342
|
-
|
|
152
|
+
def _stop_monitor(self, args) -> CommandResult:
|
|
153
|
+
"""Stop the unified monitor daemon."""
|
|
154
|
+
# Don't log here - the daemon will log when it stops
|
|
343
155
|
|
|
344
|
-
#
|
|
156
|
+
# Get parameters from args or use defaults
|
|
157
|
+
port = getattr(args, "port", None)
|
|
345
158
|
if port is None:
|
|
346
|
-
port =
|
|
347
|
-
|
|
348
|
-
print("❌ No available ports found")
|
|
349
|
-
print(
|
|
350
|
-
"Try specifying a port with --port or use --force to reclaim daemon ports"
|
|
351
|
-
)
|
|
352
|
-
return False
|
|
353
|
-
print(f"Selected port: {port}")
|
|
354
|
-
else:
|
|
355
|
-
# Check if specified port needs reclaiming
|
|
356
|
-
port_status = port_manager.get_port_status(port)
|
|
357
|
-
if not port_status["available"]:
|
|
358
|
-
process_info = port_status.get("process")
|
|
359
|
-
if process_info:
|
|
360
|
-
print(
|
|
361
|
-
f"⚠️ Port {port} is in use by {process_info['name']} (PID: {process_info['pid']})"
|
|
362
|
-
)
|
|
159
|
+
port = 8765 # Default to 8765 for unified monitor
|
|
160
|
+
host = getattr(args, "host", "localhost")
|
|
363
161
|
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
return False
|
|
370
|
-
print(f"✅ Successfully reclaimed port {port}")
|
|
371
|
-
else:
|
|
372
|
-
print(
|
|
373
|
-
f"❌ Port {port} unavailable and --no-reclaim specified"
|
|
374
|
-
)
|
|
375
|
-
return False
|
|
376
|
-
else:
|
|
377
|
-
print(
|
|
378
|
-
f"❌ Cannot reclaim port: {port_status['recommendation']}"
|
|
379
|
-
)
|
|
380
|
-
return False
|
|
381
|
-
|
|
382
|
-
print(f"Target: {host}:{port}")
|
|
383
|
-
print()
|
|
384
|
-
|
|
385
|
-
success = server_manager.start_server(
|
|
386
|
-
port=port, host=host, server_id="monitor-server"
|
|
387
|
-
)
|
|
162
|
+
# Create daemon instance to check status and stop
|
|
163
|
+
# For stop, we need to know if it was started in daemon mode
|
|
164
|
+
# We default to daemon mode since that's the usual case
|
|
165
|
+
daemon_mode = True
|
|
166
|
+
daemon = UnifiedMonitorDaemon(host=host, port=port, daemon_mode=daemon_mode)
|
|
388
167
|
|
|
389
|
-
if
|
|
390
|
-
|
|
391
|
-
print("Monitor server management commands:")
|
|
392
|
-
print(" Status: claude-mpm monitor status")
|
|
393
|
-
print(" Stop: claude-mpm monitor stop")
|
|
394
|
-
print(" Restart: claude-mpm monitor restart")
|
|
395
|
-
print()
|
|
396
|
-
print(f"WebSocket URL: ws://{host}:{port}")
|
|
168
|
+
if not daemon.lifecycle.is_running():
|
|
169
|
+
return CommandResult.success_result("No unified monitor daemon running")
|
|
397
170
|
|
|
398
|
-
|
|
171
|
+
# Stop the daemon
|
|
172
|
+
if daemon.stop():
|
|
173
|
+
return CommandResult.success_result("Unified monitor daemon stopped")
|
|
174
|
+
return CommandResult.error_result("Failed to stop unified monitor daemon")
|
|
399
175
|
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
print("Troubleshooting:")
|
|
404
|
-
print(f" • Check if port {port} is available: lsof -i :{port}")
|
|
405
|
-
print(f" • Try a different port: claude-mpm monitor start --port {port + 1}")
|
|
406
|
-
print(" • Check system resources: free -h && df -h")
|
|
407
|
-
return False
|
|
176
|
+
def _restart_monitor(self, args) -> CommandResult:
|
|
177
|
+
"""Restart the unified monitor daemon."""
|
|
178
|
+
self.logger.info("Restarting unified monitor daemon")
|
|
408
179
|
|
|
180
|
+
# Get parameters from args or use defaults
|
|
181
|
+
port = getattr(args, "port", None)
|
|
182
|
+
if port is None:
|
|
183
|
+
port = 8765 # Default to 8765 for unified monitor
|
|
184
|
+
host = getattr(args, "host", "localhost")
|
|
409
185
|
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
186
|
+
# For restart, default to daemon mode (the usual use case)
|
|
187
|
+
# unless explicitly running in foreground
|
|
188
|
+
daemon_mode = not getattr(args, "foreground", False)
|
|
413
189
|
|
|
414
|
-
|
|
415
|
-
|
|
190
|
+
# Create daemon instance with proper parameters
|
|
191
|
+
daemon = UnifiedMonitorDaemon(host=host, port=port, daemon_mode=daemon_mode)
|
|
416
192
|
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
193
|
+
# Restart the daemon
|
|
194
|
+
if daemon.restart():
|
|
195
|
+
return CommandResult.success_result(
|
|
196
|
+
f"Unified monitor daemon restarted on {host}:{port}"
|
|
197
|
+
)
|
|
198
|
+
return CommandResult.error_result("Failed to restart unified monitor daemon")
|
|
420
199
|
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
"""
|
|
424
|
-
port = getattr(args, "port", None)
|
|
200
|
+
def _status_monitor(self, args) -> CommandResult:
|
|
201
|
+
"""Get unified monitor daemon status."""
|
|
425
202
|
|
|
426
|
-
|
|
203
|
+
# Create daemon instance to check status
|
|
204
|
+
daemon = UnifiedMonitorDaemon()
|
|
205
|
+
status_data = daemon.status()
|
|
427
206
|
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
print("No running servers found to stop")
|
|
434
|
-
return True
|
|
435
|
-
|
|
436
|
-
# Stop the first server (or all if multiple)
|
|
437
|
-
success = True
|
|
438
|
-
for server in running_servers:
|
|
439
|
-
server_port = server.get("port")
|
|
440
|
-
server_id = server.get("server_id", "unknown")
|
|
441
|
-
print(f"Stopping server '{server_id}' on port {server_port}...")
|
|
442
|
-
|
|
443
|
-
if not server_manager.stop_server(port=server_port):
|
|
444
|
-
print(f"Failed to stop server on port {server_port}")
|
|
445
|
-
success = False
|
|
446
|
-
|
|
447
|
-
return success
|
|
448
|
-
# Stop specific server on given port
|
|
449
|
-
success = server_manager.stop_server(port=port)
|
|
450
|
-
|
|
451
|
-
if success:
|
|
452
|
-
print(f"Monitor server stopped on port {port}")
|
|
207
|
+
# Format output message
|
|
208
|
+
if status_data["running"]:
|
|
209
|
+
message = f"Unified monitor daemon is running at http://{status_data['host']}:{status_data['port']}"
|
|
210
|
+
if status_data.get("pid"):
|
|
211
|
+
message += f" (PID: {status_data['pid']})"
|
|
453
212
|
else:
|
|
454
|
-
|
|
455
|
-
print()
|
|
456
|
-
print("Troubleshooting:")
|
|
457
|
-
print(" • Check if server is running: claude-mpm monitor status")
|
|
458
|
-
print(f" • Try force kill: kill $(lsof -ti :{port})")
|
|
459
|
-
|
|
460
|
-
return success
|
|
461
|
-
|
|
462
|
-
except Exception as e:
|
|
463
|
-
print(f"Error stopping server: {e}")
|
|
464
|
-
return False
|
|
213
|
+
message = "Unified monitor daemon is not running"
|
|
465
214
|
|
|
215
|
+
return CommandResult.success_result(message, data=status_data)
|
|
466
216
|
|
|
467
|
-
def _status_server(args, server_manager):
|
|
468
|
-
"""
|
|
469
|
-
Check the status of Socket.IO monitoring servers.
|
|
470
|
-
|
|
471
|
-
WHY: Users need to check if the monitoring server is running, what port
|
|
472
|
-
it's using, and other diagnostic information without starting/stopping it.
|
|
473
|
-
Enhanced to show what processes are using ports.
|
|
474
|
-
|
|
475
|
-
Args:
|
|
476
|
-
args: Command arguments with optional verbose flag
|
|
477
|
-
server_manager: ServerManager instance
|
|
478
217
|
|
|
479
|
-
|
|
480
|
-
bool: True if status check succeeded, False otherwise
|
|
218
|
+
def manage_monitor(args):
|
|
481
219
|
"""
|
|
482
|
-
|
|
483
|
-
show_ports = getattr(args, "show_ports", False)
|
|
484
|
-
|
|
485
|
-
print("Checking Socket.IO monitoring server status...")
|
|
486
|
-
print()
|
|
487
|
-
|
|
488
|
-
try:
|
|
489
|
-
# Check for daemon server using socketio_daemon.py
|
|
490
|
-
daemon_script = server_manager.daemon_script
|
|
491
|
-
if daemon_script and daemon_script.exists():
|
|
492
|
-
# Try to get status from daemon
|
|
493
|
-
result = subprocess.run(
|
|
494
|
-
[sys.executable, str(daemon_script), "status"],
|
|
495
|
-
capture_output=True,
|
|
496
|
-
text=True,
|
|
497
|
-
check=False,
|
|
498
|
-
)
|
|
499
|
-
|
|
500
|
-
if result.returncode == 0 and result.stdout:
|
|
501
|
-
# Daemon provided status information
|
|
502
|
-
print(result.stdout)
|
|
503
|
-
|
|
504
|
-
if verbose:
|
|
505
|
-
# Show additional information
|
|
506
|
-
print("\nAdditional Details:")
|
|
507
|
-
print("─" * 40)
|
|
508
|
-
|
|
509
|
-
# List all running servers from ServerManager
|
|
510
|
-
running_servers = server_manager.list_running_servers()
|
|
511
|
-
if running_servers:
|
|
512
|
-
print(f"Found {len(running_servers)} running server(s):")
|
|
513
|
-
for server in running_servers:
|
|
514
|
-
server_port = server.get("port", "unknown")
|
|
515
|
-
server_id = server.get("server_id", "unknown")
|
|
516
|
-
server_pid = server.get("pid", "unknown")
|
|
517
|
-
print(f" • Server '{server_id}'")
|
|
518
|
-
print(f" Port: {server_port}")
|
|
519
|
-
print(f" PID: {server_pid}")
|
|
520
|
-
else:
|
|
521
|
-
print("No additional servers found via ServerManager")
|
|
522
|
-
|
|
523
|
-
return True
|
|
524
|
-
|
|
525
|
-
# Fall back to ServerManager's list_running_servers
|
|
526
|
-
running_servers = server_manager.list_running_servers()
|
|
527
|
-
|
|
528
|
-
if not running_servers:
|
|
529
|
-
print("❌ No Socket.IO monitoring servers are currently running")
|
|
530
|
-
print()
|
|
531
|
-
print("To start a server:")
|
|
532
|
-
print(" claude-mpm monitor start")
|
|
533
|
-
print(" claude-mpm monitor start --port 8765")
|
|
534
|
-
return True
|
|
535
|
-
|
|
536
|
-
# Import PortManager for enhanced status
|
|
537
|
-
from ...services.port_manager import PortManager
|
|
538
|
-
|
|
539
|
-
port_manager = PortManager()
|
|
540
|
-
|
|
541
|
-
# Display server information
|
|
542
|
-
print(f"✅ Found {len(running_servers)} running server(s):")
|
|
543
|
-
print()
|
|
544
|
-
|
|
545
|
-
for server in running_servers:
|
|
546
|
-
server_port = server.get("port", "unknown")
|
|
547
|
-
server_id = server.get("server_id", "unknown")
|
|
548
|
-
server_pid = server.get("pid", "unknown")
|
|
549
|
-
server_host = server.get("host", "localhost")
|
|
550
|
-
|
|
551
|
-
print(f"Server: {server_id}")
|
|
552
|
-
print(f" • PID: {server_pid}")
|
|
553
|
-
print(f" • Port: {server_port}")
|
|
554
|
-
print(f" • Host: {server_host}")
|
|
555
|
-
print(f" • WebSocket URL: ws://{server_host}:{server_port}")
|
|
556
|
-
|
|
557
|
-
# Show port status if verbose
|
|
558
|
-
if verbose and server_port != "unknown":
|
|
559
|
-
port_status = port_manager.get_port_status(int(server_port))
|
|
560
|
-
if port_status.get("process"):
|
|
561
|
-
process = port_status["process"]
|
|
562
|
-
print(
|
|
563
|
-
f" • Process Type: {'Debug' if process['is_debug'] else 'Daemon' if process['is_daemon'] else 'Regular'}"
|
|
564
|
-
)
|
|
220
|
+
Main entry point for monitor command.
|
|
565
221
|
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
import socket
|
|
570
|
-
|
|
571
|
-
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
|
572
|
-
result = sock.connect_ex((server_host, server_port))
|
|
573
|
-
sock.close()
|
|
574
|
-
if result == 0:
|
|
575
|
-
print(" • Status: ✅ Listening")
|
|
576
|
-
else:
|
|
577
|
-
print(" • Status: ⚠️ Not responding on port")
|
|
578
|
-
except Exception as e:
|
|
579
|
-
print(f" • Status: ❌ Error checking: {e}")
|
|
580
|
-
|
|
581
|
-
print()
|
|
582
|
-
|
|
583
|
-
# Show port range status if requested
|
|
584
|
-
if show_ports or verbose:
|
|
585
|
-
print("\nPort Range Status (8765-8785):")
|
|
586
|
-
print("─" * 40)
|
|
587
|
-
for check_port in range(8765, 8771): # Show first 6 ports
|
|
588
|
-
status = port_manager.get_port_status(check_port)
|
|
589
|
-
if status["available"]:
|
|
590
|
-
print(f" Port {check_port}: ✅ Available")
|
|
591
|
-
else:
|
|
592
|
-
process = status.get("process")
|
|
593
|
-
if process:
|
|
594
|
-
if process["is_ours"]:
|
|
595
|
-
if process["is_debug"]:
|
|
596
|
-
print(
|
|
597
|
-
f" Port {check_port}: 🔧 Debug script (PID: {process['pid']})"
|
|
598
|
-
)
|
|
599
|
-
elif process["is_daemon"]:
|
|
600
|
-
print(
|
|
601
|
-
f" Port {check_port}: 🚀 Daemon (PID: {process['pid']})"
|
|
602
|
-
)
|
|
603
|
-
else:
|
|
604
|
-
print(
|
|
605
|
-
f" Port {check_port}: 📦 Our process (PID: {process['pid']})"
|
|
606
|
-
)
|
|
607
|
-
else:
|
|
608
|
-
print(
|
|
609
|
-
f" Port {check_port}: ⛔ External ({process['name']})"
|
|
610
|
-
)
|
|
611
|
-
else:
|
|
612
|
-
print(f" Port {check_port}: ❓ In use (unknown process)")
|
|
613
|
-
print()
|
|
614
|
-
|
|
615
|
-
print("Server management commands:")
|
|
616
|
-
print(" Stop all: claude-mpm monitor stop")
|
|
617
|
-
print(" Restart: claude-mpm monitor restart")
|
|
618
|
-
print(" Reclaim: claude-mpm monitor start --force # Kill debug scripts")
|
|
619
|
-
if len(running_servers) == 1:
|
|
620
|
-
port = running_servers[0].get("port", 8765)
|
|
621
|
-
print(f" Stop this: claude-mpm monitor stop --port {port}")
|
|
622
|
-
|
|
623
|
-
return True
|
|
624
|
-
|
|
625
|
-
except Exception as e:
|
|
626
|
-
print(f"Error checking server status: {e}")
|
|
627
|
-
print()
|
|
628
|
-
print("Try manual checks:")
|
|
629
|
-
print(" • Process list: ps aux | grep socketio")
|
|
630
|
-
print(" • Port usage: lsof -i :8765")
|
|
631
|
-
return False
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
def _restart_server(args, server_manager):
|
|
222
|
+
The monitor command manages the unified monitoring daemon that provides
|
|
223
|
+
a single stable way to launch all monitoring functionality including
|
|
224
|
+
HTTP dashboard, Socket.IO events, real AST analysis, and Claude Code hooks.
|
|
635
225
|
"""
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
WHY: Users need to restart the monitoring server to apply configuration
|
|
639
|
-
changes or recover from error states.
|
|
226
|
+
command = MonitorCommand()
|
|
227
|
+
error = command.validate_args(args)
|
|
640
228
|
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
229
|
+
if error:
|
|
230
|
+
command.logger.error(error)
|
|
231
|
+
print(f"Error: {error}")
|
|
232
|
+
return 1
|
|
644
233
|
|
|
645
|
-
|
|
646
|
-
bool: True if server restarted successfully, False otherwise
|
|
647
|
-
"""
|
|
648
|
-
port = getattr(args, "port", None)
|
|
234
|
+
result = command.run(args)
|
|
649
235
|
|
|
650
|
-
|
|
236
|
+
if result.success:
|
|
237
|
+
if result.message:
|
|
238
|
+
print(result.message)
|
|
239
|
+
if result.data and getattr(args, "verbose", False):
|
|
240
|
+
import json
|
|
651
241
|
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
print(
|
|
658
|
-
"No running servers found. Starting new server on default port..."
|
|
659
|
-
)
|
|
660
|
-
return _start_server(args, server_manager)
|
|
661
|
-
|
|
662
|
-
# Restart the first server found
|
|
663
|
-
server = running_servers[0]
|
|
664
|
-
port = server.get("port", 8765)
|
|
665
|
-
|
|
666
|
-
print(f"Using port {port} for restart...")
|
|
667
|
-
|
|
668
|
-
# Use ServerManager's restart method
|
|
669
|
-
success = server_manager.restart_server(port=port)
|
|
670
|
-
|
|
671
|
-
if success:
|
|
672
|
-
print(f"Monitor server restarted successfully on port {port}")
|
|
673
|
-
print()
|
|
674
|
-
print("Server management commands:")
|
|
675
|
-
print(" Status: claude-mpm monitor status")
|
|
676
|
-
print(f" Stop: claude-mpm monitor stop --port {port}")
|
|
677
|
-
print(f" Start: claude-mpm monitor start --port {port}")
|
|
678
|
-
else:
|
|
679
|
-
print(f"Failed to restart server on port {port}")
|
|
680
|
-
print()
|
|
681
|
-
print("Troubleshooting:")
|
|
682
|
-
print(" • Try stopping and starting manually:")
|
|
683
|
-
print(f" claude-mpm monitor stop --port {port}")
|
|
684
|
-
print(f" claude-mpm monitor start --port {port}")
|
|
685
|
-
print(" • Check server logs for errors")
|
|
686
|
-
|
|
687
|
-
return success
|
|
688
|
-
|
|
689
|
-
except Exception as e:
|
|
690
|
-
print(f"Error restarting server: {e}")
|
|
691
|
-
print()
|
|
692
|
-
print("Fallback options:")
|
|
693
|
-
print(" • Manual restart: stop then start")
|
|
694
|
-
print(" • Check system resources and try again")
|
|
695
|
-
return False
|
|
242
|
+
print(json.dumps(result.data, indent=2))
|
|
243
|
+
return 0
|
|
244
|
+
if result.message:
|
|
245
|
+
print(f"Error: {result.message}")
|
|
246
|
+
return 1
|