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
|
@@ -13,7 +13,7 @@ import asyncio
|
|
|
13
13
|
import threading
|
|
14
14
|
import time
|
|
15
15
|
from collections import deque
|
|
16
|
-
from datetime import datetime
|
|
16
|
+
from datetime import datetime, timezone
|
|
17
17
|
from pathlib import Path
|
|
18
18
|
from typing import Any, Dict, Set
|
|
19
19
|
|
|
@@ -195,6 +195,9 @@ class SocketIOServerCore:
|
|
|
195
195
|
# Setup HTTP API endpoints for receiving events from hook handlers
|
|
196
196
|
self._setup_http_api()
|
|
197
197
|
|
|
198
|
+
# Setup simple directory API
|
|
199
|
+
self._setup_directory_api()
|
|
200
|
+
|
|
198
201
|
# Find and serve static files
|
|
199
202
|
self._setup_static_files()
|
|
200
203
|
|
|
@@ -208,7 +211,7 @@ class SocketIOServerCore:
|
|
|
208
211
|
await self.site.start()
|
|
209
212
|
|
|
210
213
|
self.running = True
|
|
211
|
-
self.stats["start_time"] = datetime.now()
|
|
214
|
+
self.stats["start_time"] = datetime.now(timezone.utc)
|
|
212
215
|
|
|
213
216
|
self.logger.info(
|
|
214
217
|
f"Socket.IO server listening on http://{self.host}:{self.port}"
|
|
@@ -390,6 +393,118 @@ class SocketIOServerCore:
|
|
|
390
393
|
self.app.router.add_post("/api/events", api_events_handler)
|
|
391
394
|
self.logger.info("✅ HTTP API endpoint registered at /api/events")
|
|
392
395
|
|
|
396
|
+
# Add working directory endpoint
|
|
397
|
+
async def working_directory_handler(request):
|
|
398
|
+
"""Handle GET /api/working-directory to provide current working directory."""
|
|
399
|
+
from pathlib import Path
|
|
400
|
+
|
|
401
|
+
try:
|
|
402
|
+
working_dir = Path.cwd()
|
|
403
|
+
home_dir = str(Path.home())
|
|
404
|
+
|
|
405
|
+
return web.json_response(
|
|
406
|
+
{
|
|
407
|
+
"working_directory": working_dir,
|
|
408
|
+
"home_directory": home_dir,
|
|
409
|
+
"process_cwd": working_dir,
|
|
410
|
+
"session_id": getattr(self, "session_id", None),
|
|
411
|
+
}
|
|
412
|
+
)
|
|
413
|
+
except Exception as e:
|
|
414
|
+
self.logger.error(f"Error getting working directory: {e}")
|
|
415
|
+
return web.json_response(
|
|
416
|
+
{
|
|
417
|
+
"working_directory": "/Users/masa/Projects/claude-mpm",
|
|
418
|
+
"home_directory": "/Users/masa",
|
|
419
|
+
"error": str(e),
|
|
420
|
+
},
|
|
421
|
+
status=500,
|
|
422
|
+
)
|
|
423
|
+
|
|
424
|
+
self.app.router.add_get("/api/working-directory", working_directory_handler)
|
|
425
|
+
self.logger.info(
|
|
426
|
+
"✅ Working directory endpoint registered at /api/working-directory"
|
|
427
|
+
)
|
|
428
|
+
|
|
429
|
+
# Add file reading endpoint for source viewer
|
|
430
|
+
async def file_read_handler(request):
|
|
431
|
+
"""Handle GET /api/file/read for reading source files."""
|
|
432
|
+
|
|
433
|
+
file_path = request.query.get("path", "")
|
|
434
|
+
|
|
435
|
+
if not file_path:
|
|
436
|
+
return web.json_response({"error": "No path provided"}, status=400)
|
|
437
|
+
|
|
438
|
+
abs_path = Path(Path(file_path).resolve().expanduser())
|
|
439
|
+
|
|
440
|
+
# Security check - ensure file is within the project
|
|
441
|
+
try:
|
|
442
|
+
project_root = Path.cwd()
|
|
443
|
+
if not abs_path.startswith(project_root):
|
|
444
|
+
return web.json_response({"error": "Access denied"}, status=403)
|
|
445
|
+
except Exception:
|
|
446
|
+
pass
|
|
447
|
+
|
|
448
|
+
if not Path(abs_path).exists():
|
|
449
|
+
return web.json_response({"error": "File not found"}, status=404)
|
|
450
|
+
|
|
451
|
+
if not Path(abs_path).is_file():
|
|
452
|
+
return web.json_response({"error": "Not a file"}, status=400)
|
|
453
|
+
|
|
454
|
+
try:
|
|
455
|
+
# Read file with appropriate encoding
|
|
456
|
+
encodings = ["utf-8", "latin-1", "cp1252"]
|
|
457
|
+
content = None
|
|
458
|
+
|
|
459
|
+
for encoding in encodings:
|
|
460
|
+
try:
|
|
461
|
+
with Path(abs_path).open(
|
|
462
|
+
encoding=encoding,
|
|
463
|
+
) as f:
|
|
464
|
+
content = f.read()
|
|
465
|
+
break
|
|
466
|
+
except UnicodeDecodeError:
|
|
467
|
+
continue
|
|
468
|
+
|
|
469
|
+
if content is None:
|
|
470
|
+
return web.json_response(
|
|
471
|
+
{"error": "Could not decode file"}, status=400
|
|
472
|
+
)
|
|
473
|
+
|
|
474
|
+
return web.json_response(
|
|
475
|
+
{
|
|
476
|
+
"path": abs_path,
|
|
477
|
+
"name": Path(abs_path).name,
|
|
478
|
+
"content": content,
|
|
479
|
+
"lines": len(content.splitlines()),
|
|
480
|
+
"size": Path(abs_path).stat().st_size,
|
|
481
|
+
}
|
|
482
|
+
)
|
|
483
|
+
|
|
484
|
+
except PermissionError:
|
|
485
|
+
return web.json_response({"error": "Permission denied"}, status=403)
|
|
486
|
+
except Exception as e:
|
|
487
|
+
return web.json_response({"error": str(e)}, status=500)
|
|
488
|
+
|
|
489
|
+
self.app.router.add_get("/api/file/read", file_read_handler)
|
|
490
|
+
self.logger.info("✅ File reading API registered at /api/file/read")
|
|
491
|
+
|
|
492
|
+
def _setup_directory_api(self):
|
|
493
|
+
"""Setup simple directory listing API.
|
|
494
|
+
|
|
495
|
+
WHY: Provides a dead-simple way to list directory contents via HTTP GET
|
|
496
|
+
without complex WebSocket interactions.
|
|
497
|
+
"""
|
|
498
|
+
try:
|
|
499
|
+
from claude_mpm.dashboard.api.simple_directory import register_routes
|
|
500
|
+
|
|
501
|
+
register_routes(self.app)
|
|
502
|
+
self.logger.info(
|
|
503
|
+
"✅ Simple directory API registered at /api/directory/list"
|
|
504
|
+
)
|
|
505
|
+
except Exception as e:
|
|
506
|
+
self.logger.error(f"Failed to setup directory API: {e}")
|
|
507
|
+
|
|
393
508
|
def _setup_static_files(self):
|
|
394
509
|
"""Setup static file serving for the dashboard."""
|
|
395
510
|
try:
|
|
@@ -440,6 +555,26 @@ class SocketIOServerCore:
|
|
|
440
555
|
|
|
441
556
|
self.app.router.add_get("/dashboard", dashboard_handler)
|
|
442
557
|
|
|
558
|
+
# Serve simple code view template at /code-simple
|
|
559
|
+
async def code_simple_handler(request):
|
|
560
|
+
code_simple_template = (
|
|
561
|
+
self.dashboard_path.parent / "templates" / "code_simple.html"
|
|
562
|
+
)
|
|
563
|
+
if code_simple_template.exists():
|
|
564
|
+
self.logger.debug(
|
|
565
|
+
f"Serving code simple template from: {code_simple_template}"
|
|
566
|
+
)
|
|
567
|
+
return web.FileResponse(code_simple_template)
|
|
568
|
+
# Return error if template doesn't exist
|
|
569
|
+
self.logger.warning(
|
|
570
|
+
f"Code simple template not found at: {code_simple_template}"
|
|
571
|
+
)
|
|
572
|
+
return web.Response(
|
|
573
|
+
text="Simple code view not available", status=404
|
|
574
|
+
)
|
|
575
|
+
|
|
576
|
+
self.app.router.add_get("/code-simple", code_simple_handler)
|
|
577
|
+
|
|
443
578
|
# Serve version.json from dashboard directory
|
|
444
579
|
async def version_handler(request):
|
|
445
580
|
version_file = self.dashboard_path / "version.json"
|
|
@@ -614,7 +749,9 @@ class SocketIOServerCore:
|
|
|
614
749
|
uptime_seconds = 0
|
|
615
750
|
if self.stats.get("start_time"):
|
|
616
751
|
uptime_seconds = int(
|
|
617
|
-
(
|
|
752
|
+
(
|
|
753
|
+
datetime.now(timezone.utc) - self.stats["start_time"]
|
|
754
|
+
).total_seconds()
|
|
618
755
|
)
|
|
619
756
|
|
|
620
757
|
# Get active sessions from main server if available
|
|
@@ -631,7 +768,7 @@ class SocketIOServerCore:
|
|
|
631
768
|
heartbeat_data = {
|
|
632
769
|
"type": "system",
|
|
633
770
|
"subtype": "heartbeat",
|
|
634
|
-
"timestamp": datetime.now().isoformat(),
|
|
771
|
+
"timestamp": datetime.now(timezone.utc).isoformat(),
|
|
635
772
|
"source": "server",
|
|
636
773
|
"data": {
|
|
637
774
|
"uptime_seconds": uptime_seconds,
|
|
@@ -7,14 +7,15 @@ WHY this integration module:
|
|
|
7
7
|
- Provides clean separation of concerns
|
|
8
8
|
"""
|
|
9
9
|
|
|
10
|
-
import
|
|
10
|
+
from datetime import datetime, timezone
|
|
11
11
|
from typing import Optional
|
|
12
12
|
|
|
13
|
+
from claude_mpm.core.logging_utils import get_logger
|
|
13
14
|
from claude_mpm.services.event_bus import EventBus
|
|
14
15
|
from claude_mpm.services.event_bus.config import get_config
|
|
15
16
|
from claude_mpm.services.event_bus.direct_relay import DirectSocketIORelay
|
|
16
17
|
|
|
17
|
-
logger =
|
|
18
|
+
logger = get_logger(__name__)
|
|
18
19
|
|
|
19
20
|
|
|
20
21
|
class EventBusIntegration:
|
|
@@ -48,17 +49,16 @@ class EventBusIntegration:
|
|
|
48
49
|
Returns:
|
|
49
50
|
bool: True if setup successful
|
|
50
51
|
"""
|
|
51
|
-
from datetime import datetime
|
|
52
52
|
|
|
53
53
|
print(
|
|
54
|
-
f"[{datetime.now().isoformat()}] EventBusIntegration.setup() called",
|
|
54
|
+
f"[{datetime.now(timezone.utc).isoformat()}] EventBusIntegration.setup() called",
|
|
55
55
|
flush=True,
|
|
56
56
|
)
|
|
57
57
|
|
|
58
58
|
if not self.enabled:
|
|
59
59
|
logger.info("EventBus integration disabled by configuration")
|
|
60
60
|
print(
|
|
61
|
-
f"[{datetime.now().isoformat()}] EventBus integration disabled by configuration",
|
|
61
|
+
f"[{datetime.now(timezone.utc).isoformat()}] EventBus integration disabled by configuration",
|
|
62
62
|
flush=True,
|
|
63
63
|
)
|
|
64
64
|
return False
|
|
@@ -66,12 +66,13 @@ class EventBusIntegration:
|
|
|
66
66
|
try:
|
|
67
67
|
# Get EventBus instance
|
|
68
68
|
print(
|
|
69
|
-
f"[{datetime.now().isoformat()}] Getting EventBus instance...",
|
|
69
|
+
f"[{datetime.now(timezone.utc).isoformat()}] Getting EventBus instance...",
|
|
70
70
|
flush=True,
|
|
71
71
|
)
|
|
72
72
|
self.event_bus = EventBus.get_instance()
|
|
73
73
|
print(
|
|
74
|
-
f"[{datetime.now().isoformat()}] EventBus instance obtained",
|
|
74
|
+
f"[{datetime.now(timezone.utc).isoformat()}] EventBus instance obtained",
|
|
75
|
+
flush=True,
|
|
75
76
|
)
|
|
76
77
|
|
|
77
78
|
# Apply configuration
|
|
@@ -79,31 +80,36 @@ class EventBusIntegration:
|
|
|
79
80
|
|
|
80
81
|
# Create direct relay that uses server's broadcaster
|
|
81
82
|
print(
|
|
82
|
-
f"[{datetime.now().isoformat()}] Creating DirectSocketIORelay...",
|
|
83
|
+
f"[{datetime.now(timezone.utc).isoformat()}] Creating DirectSocketIORelay...",
|
|
83
84
|
flush=True,
|
|
84
85
|
)
|
|
85
86
|
if self.server:
|
|
86
87
|
self.relay = DirectSocketIORelay(self.server)
|
|
87
88
|
print(
|
|
88
|
-
f"[{datetime.now().isoformat()}] DirectSocketIORelay created with server instance",
|
|
89
|
+
f"[{datetime.now(timezone.utc).isoformat()}] DirectSocketIORelay created with server instance",
|
|
89
90
|
flush=True,
|
|
90
91
|
)
|
|
91
92
|
else:
|
|
92
93
|
logger.warning("No server instance provided, relay won't work")
|
|
93
94
|
print(
|
|
94
|
-
f"[{datetime.now().isoformat()}] WARNING: No server instance for relay",
|
|
95
|
+
f"[{datetime.now(timezone.utc).isoformat()}] WARNING: No server instance for relay",
|
|
95
96
|
flush=True,
|
|
96
97
|
)
|
|
97
98
|
return False
|
|
98
99
|
|
|
99
100
|
# Start the relay
|
|
100
|
-
print(
|
|
101
|
+
print(
|
|
102
|
+
f"[{datetime.now(timezone.utc).isoformat()}] Starting relay...",
|
|
103
|
+
flush=True,
|
|
104
|
+
)
|
|
101
105
|
self.relay.start()
|
|
102
|
-
print(
|
|
106
|
+
print(
|
|
107
|
+
f"[{datetime.now(timezone.utc).isoformat()}] Relay started", flush=True
|
|
108
|
+
)
|
|
103
109
|
|
|
104
110
|
logger.info("EventBus integration setup complete with DirectSocketIORelay")
|
|
105
111
|
print(
|
|
106
|
-
f"[{datetime.now().isoformat()}] EventBus integration setup complete with DirectSocketIORelay",
|
|
112
|
+
f"[{datetime.now(timezone.utc).isoformat()}] EventBus integration setup complete with DirectSocketIORelay",
|
|
107
113
|
flush=True,
|
|
108
114
|
)
|
|
109
115
|
return True
|
|
@@ -111,7 +117,7 @@ class EventBusIntegration:
|
|
|
111
117
|
except Exception as e:
|
|
112
118
|
logger.error(f"Failed to setup EventBus integration: {e}")
|
|
113
119
|
print(
|
|
114
|
-
f"[{datetime.now().isoformat()}] Failed to setup EventBus integration: {e}",
|
|
120
|
+
f"[{datetime.now(timezone.utc).isoformat()}] Failed to setup EventBus integration: {e}",
|
|
115
121
|
flush=True,
|
|
116
122
|
)
|
|
117
123
|
import traceback
|
|
@@ -13,9 +13,11 @@ import asyncio
|
|
|
13
13
|
import threading
|
|
14
14
|
import time
|
|
15
15
|
from collections import deque
|
|
16
|
-
from datetime import datetime
|
|
16
|
+
from datetime import datetime, timezone
|
|
17
17
|
from typing import Any, Dict, List, Optional, Set
|
|
18
18
|
|
|
19
|
+
from ....core.enums import ServiceState
|
|
20
|
+
|
|
19
21
|
try:
|
|
20
22
|
import aiohttp
|
|
21
23
|
import socketio
|
|
@@ -107,7 +109,7 @@ class SocketIOServer(SocketIOServiceInterface):
|
|
|
107
109
|
# Debug logging for EventBus initialization
|
|
108
110
|
self.logger.info("Starting Socket.IO server with EventBus integration...")
|
|
109
111
|
print(
|
|
110
|
-
f"[{datetime.now().isoformat()}] SocketIOServer.start_sync() called",
|
|
112
|
+
f"[{datetime.now(timezone.utc).isoformat()}] SocketIOServer.start_sync() called",
|
|
111
113
|
flush=True,
|
|
112
114
|
)
|
|
113
115
|
|
|
@@ -172,7 +174,7 @@ class SocketIOServer(SocketIOServiceInterface):
|
|
|
172
174
|
# WHY: This connects the EventBus to the Socket.IO server, allowing
|
|
173
175
|
# events from other parts of the system to be broadcast to dashboard
|
|
174
176
|
print(
|
|
175
|
-
f"[{datetime.now().isoformat()}] Setting up EventBus integration...",
|
|
177
|
+
f"[{datetime.now(timezone.utc).isoformat()}] Setting up EventBus integration...",
|
|
176
178
|
flush=True,
|
|
177
179
|
)
|
|
178
180
|
|
|
@@ -183,26 +185,26 @@ class SocketIOServer(SocketIOServiceInterface):
|
|
|
183
185
|
"Broadcaster not initialized - cannot setup EventBus integration"
|
|
184
186
|
)
|
|
185
187
|
print(
|
|
186
|
-
f"[{datetime.now().isoformat()}] ERROR: Broadcaster not initialized",
|
|
188
|
+
f"[{datetime.now(timezone.utc).isoformat()}] ERROR: Broadcaster not initialized",
|
|
187
189
|
flush=True,
|
|
188
190
|
)
|
|
189
191
|
else:
|
|
190
192
|
print(
|
|
191
|
-
f"[{datetime.now().isoformat()}] Broadcaster ready, proceeding with EventBus setup",
|
|
193
|
+
f"[{datetime.now(timezone.utc).isoformat()}] Broadcaster ready, proceeding with EventBus setup",
|
|
192
194
|
flush=True,
|
|
193
195
|
)
|
|
194
196
|
|
|
195
197
|
try:
|
|
196
198
|
self.eventbus_integration = EventBusIntegration(self)
|
|
197
199
|
print(
|
|
198
|
-
f"[{datetime.now().isoformat()}] EventBusIntegration instance created",
|
|
200
|
+
f"[{datetime.now(timezone.utc).isoformat()}] EventBusIntegration instance created",
|
|
199
201
|
flush=True,
|
|
200
202
|
)
|
|
201
203
|
|
|
202
204
|
if self.eventbus_integration.setup(self.port):
|
|
203
205
|
self.logger.info("EventBus integration setup successful")
|
|
204
206
|
print(
|
|
205
|
-
f"[{datetime.now().isoformat()}] EventBus integration setup successful",
|
|
207
|
+
f"[{datetime.now(timezone.utc).isoformat()}] EventBus integration setup successful",
|
|
206
208
|
flush=True,
|
|
207
209
|
)
|
|
208
210
|
|
|
@@ -214,19 +216,19 @@ class SocketIOServer(SocketIOServiceInterface):
|
|
|
214
216
|
relay_stats = self.eventbus_integration.relay.get_stats()
|
|
215
217
|
self.logger.info(f"EventBus relay stats: {relay_stats}")
|
|
216
218
|
print(
|
|
217
|
-
f"[{datetime.now().isoformat()}] EventBus relay stats: {relay_stats}",
|
|
219
|
+
f"[{datetime.now(timezone.utc).isoformat()}] EventBus relay stats: {relay_stats}",
|
|
218
220
|
flush=True,
|
|
219
221
|
)
|
|
220
222
|
else:
|
|
221
223
|
self.logger.warning("EventBus integration setup failed or disabled")
|
|
222
224
|
print(
|
|
223
|
-
f"[{datetime.now().isoformat()}] EventBus integration setup failed or disabled",
|
|
225
|
+
f"[{datetime.now(timezone.utc).isoformat()}] EventBus integration setup failed or disabled",
|
|
224
226
|
flush=True,
|
|
225
227
|
)
|
|
226
228
|
except Exception as e:
|
|
227
229
|
self.logger.error(f"Failed to setup EventBus integration: {e}")
|
|
228
230
|
print(
|
|
229
|
-
f"[{datetime.now().isoformat()}] Failed to setup EventBus integration: {e}",
|
|
231
|
+
f"[{datetime.now(timezone.utc).isoformat()}] Failed to setup EventBus integration: {e}",
|
|
230
232
|
flush=True,
|
|
231
233
|
)
|
|
232
234
|
import traceback
|
|
@@ -265,15 +267,15 @@ class SocketIOServer(SocketIOServiceInterface):
|
|
|
265
267
|
except Exception as e:
|
|
266
268
|
self.logger.error(f"Error during EventBus teardown: {e}")
|
|
267
269
|
|
|
268
|
-
# Stop
|
|
270
|
+
# Stop event handlers
|
|
269
271
|
if self.event_registry:
|
|
270
|
-
from ..handlers import
|
|
271
|
-
|
|
272
|
-
# Stop analysis runner
|
|
273
|
-
analysis_handler = self.event_registry.get_handler(CodeAnalysisEventHandler)
|
|
274
|
-
if analysis_handler and hasattr(analysis_handler, "cleanup"):
|
|
275
|
-
analysis_handler.cleanup()
|
|
272
|
+
from ..handlers import ConnectionEventHandler
|
|
276
273
|
|
|
274
|
+
# DISABLED: File Tree interface removed from dashboard
|
|
275
|
+
# Stop analysis runner (code analysis handler is disabled)
|
|
276
|
+
# analysis_handler = self.event_registry.get_handler(CodeAnalysisEventHandler)
|
|
277
|
+
# if analysis_handler and hasattr(analysis_handler, "cleanup"):
|
|
278
|
+
# analysis_handler.cleanup()
|
|
277
279
|
# Stop health monitoring in connection handler
|
|
278
280
|
conn_handler = self.event_registry.get_handler(ConnectionEventHandler)
|
|
279
281
|
if conn_handler and hasattr(conn_handler, "stop_health_monitoring"):
|
|
@@ -382,9 +384,9 @@ class SocketIOServer(SocketIOServiceInterface):
|
|
|
382
384
|
# Track active session for heartbeat
|
|
383
385
|
self.active_sessions[session_id] = {
|
|
384
386
|
"session_id": session_id,
|
|
385
|
-
"start_time": datetime.now().isoformat(),
|
|
387
|
+
"start_time": datetime.now(timezone.utc).isoformat(),
|
|
386
388
|
"agent": "pm", # Default to PM, will be updated if delegated
|
|
387
|
-
"status":
|
|
389
|
+
"status": ServiceState.RUNNING,
|
|
388
390
|
"launch_method": launch_method,
|
|
389
391
|
"working_dir": working_dir,
|
|
390
392
|
}
|
|
@@ -472,7 +474,7 @@ class SocketIOServer(SocketIOServiceInterface):
|
|
|
472
474
|
WHY: Provides session information for system heartbeat events.
|
|
473
475
|
"""
|
|
474
476
|
# Clean up old sessions (older than 1 hour)
|
|
475
|
-
cutoff_time = datetime.now().timestamp() - 3600
|
|
477
|
+
cutoff_time = datetime.now(timezone.utc).timestamp() - 3600
|
|
476
478
|
sessions_to_remove = []
|
|
477
479
|
|
|
478
480
|
for session_id, session_data in self.active_sessions.items():
|
|
@@ -480,7 +482,7 @@ class SocketIOServer(SocketIOServiceInterface):
|
|
|
480
482
|
start_time = datetime.fromisoformat(session_data["start_time"])
|
|
481
483
|
if start_time.timestamp() < cutoff_time:
|
|
482
484
|
sessions_to_remove.append(session_id)
|
|
483
|
-
except:
|
|
485
|
+
except Exception:
|
|
484
486
|
pass
|
|
485
487
|
|
|
486
488
|
for session_id in sessions_to_remove:
|
|
@@ -18,7 +18,7 @@ import importlib.metadata
|
|
|
18
18
|
import socket
|
|
19
19
|
import threading
|
|
20
20
|
import time
|
|
21
|
-
from datetime import datetime
|
|
21
|
+
from datetime import datetime, timezone
|
|
22
22
|
from typing import Any, Dict, List, Optional, Tuple
|
|
23
23
|
|
|
24
24
|
from claude_mpm.core.constants import NetworkConfig, PerformanceConfig, TimeoutConfig
|
|
@@ -59,7 +59,7 @@ class ServerInfo:
|
|
|
59
59
|
"supported_client_versions", []
|
|
60
60
|
)
|
|
61
61
|
self.compatibility_matrix = response_data.get("compatibility_matrix", {})
|
|
62
|
-
self.detected_at = datetime.
|
|
62
|
+
self.detected_at = datetime.now(timezone.utc)
|
|
63
63
|
|
|
64
64
|
@property
|
|
65
65
|
def url(self) -> str:
|
|
@@ -161,7 +161,7 @@ class SocketIOClientManager:
|
|
|
161
161
|
self.logger.debug(f"Error checking {host}:{port}: {e}")
|
|
162
162
|
continue
|
|
163
163
|
|
|
164
|
-
self.last_discovery = datetime.
|
|
164
|
+
self.last_discovery = datetime.now(timezone.utc)
|
|
165
165
|
return discovered
|
|
166
166
|
|
|
167
167
|
def find_best_server(
|
|
@@ -323,7 +323,7 @@ class SocketIOClientManager:
|
|
|
323
323
|
try:
|
|
324
324
|
event_data = {
|
|
325
325
|
"type": event_type,
|
|
326
|
-
"timestamp": datetime.
|
|
326
|
+
"timestamp": datetime.now(timezone.utc).isoformat() + "Z",
|
|
327
327
|
"data": data,
|
|
328
328
|
"client_version": self.client_version,
|
|
329
329
|
}
|
|
@@ -22,6 +22,7 @@ import tty
|
|
|
22
22
|
from typing import Any, Dict, List, Optional
|
|
23
23
|
|
|
24
24
|
from claude_mpm.core.base_service import BaseService
|
|
25
|
+
from claude_mpm.core.enums import OperationResult, ServiceState
|
|
25
26
|
from claude_mpm.services.core.interfaces import SubprocessLauncherInterface
|
|
26
27
|
|
|
27
28
|
|
|
@@ -62,9 +63,17 @@ class SubprocessLauncherService(BaseService, SubprocessLauncherInterface):
|
|
|
62
63
|
try:
|
|
63
64
|
env = kwargs.get("env", self.prepare_subprocess_environment())
|
|
64
65
|
self.launch_subprocess_interactive(command, env)
|
|
65
|
-
return {
|
|
66
|
+
return {
|
|
67
|
+
"status": OperationResult.SUCCESS,
|
|
68
|
+
"command": command,
|
|
69
|
+
"method": "interactive",
|
|
70
|
+
}
|
|
66
71
|
except Exception as e:
|
|
67
|
-
return {
|
|
72
|
+
return {
|
|
73
|
+
"status": OperationResult.FAILED,
|
|
74
|
+
"error": str(e),
|
|
75
|
+
"command": command,
|
|
76
|
+
}
|
|
68
77
|
|
|
69
78
|
async def launch_subprocess_async(
|
|
70
79
|
self, command: List[str], **kwargs
|
|
@@ -109,7 +118,7 @@ class SubprocessLauncherService(BaseService, SubprocessLauncherInterface):
|
|
|
109
118
|
# For now, return unknown status
|
|
110
119
|
return {
|
|
111
120
|
"process_id": process_id,
|
|
112
|
-
"status":
|
|
121
|
+
"status": OperationResult.UNKNOWN,
|
|
113
122
|
"message": "Process tracking not implemented",
|
|
114
123
|
}
|
|
115
124
|
|
|
@@ -160,7 +169,7 @@ class SubprocessLauncherService(BaseService, SubprocessLauncherInterface):
|
|
|
160
169
|
# Notify WebSocket clients
|
|
161
170
|
if self.websocket_server:
|
|
162
171
|
self.websocket_server.claude_status_changed(
|
|
163
|
-
status=
|
|
172
|
+
status=ServiceState.RUNNING,
|
|
164
173
|
pid=process.pid,
|
|
165
174
|
message="Claude subprocess started",
|
|
166
175
|
)
|
|
@@ -195,7 +204,7 @@ class SubprocessLauncherService(BaseService, SubprocessLauncherInterface):
|
|
|
195
204
|
# Notify WebSocket clients
|
|
196
205
|
if self.websocket_server:
|
|
197
206
|
self.websocket_server.claude_status_changed(
|
|
198
|
-
status=
|
|
207
|
+
status=ServiceState.STOPPED,
|
|
199
208
|
message=f"Claude subprocess exited with code {process.returncode}",
|
|
200
209
|
)
|
|
201
210
|
|
|
@@ -268,16 +277,11 @@ class SubprocessLauncherService(BaseService, SubprocessLauncherInterface):
|
|
|
268
277
|
Returns:
|
|
269
278
|
True if subprocess mode with PTY is available
|
|
270
279
|
"""
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
import tty
|
|
277
|
-
|
|
278
|
-
return True
|
|
279
|
-
except ImportError:
|
|
280
|
-
return False
|
|
280
|
+
import importlib.util
|
|
281
|
+
|
|
282
|
+
# Check if we can import required modules
|
|
283
|
+
required = ["pty", "select", "termios", "tty"]
|
|
284
|
+
return all(importlib.util.find_spec(mod) is not None for mod in required)
|
|
281
285
|
|
|
282
286
|
def create_subprocess_command(
|
|
283
287
|
self, base_cmd: List[str], additional_args: Optional[List[str]] = None
|
|
@@ -10,7 +10,7 @@ Extracted from ClaudeRunner to follow Single Responsibility Principle.
|
|
|
10
10
|
"""
|
|
11
11
|
|
|
12
12
|
import re
|
|
13
|
-
from datetime import datetime
|
|
13
|
+
from datetime import datetime, timezone
|
|
14
14
|
from typing import List, Optional, Tuple
|
|
15
15
|
|
|
16
16
|
from claude_mpm.config.paths import paths
|
|
@@ -126,7 +126,7 @@ class SystemInstructionsService(BaseService, SystemInstructionsInterface):
|
|
|
126
126
|
|
|
127
127
|
# Replace current date
|
|
128
128
|
if "{{CURRENT_DATE}}" in base_pm_content:
|
|
129
|
-
current_date = datetime.now().strftime("%Y-%m-%d")
|
|
129
|
+
current_date = datetime.now(timezone.utc).strftime("%Y-%m-%d")
|
|
130
130
|
base_pm_content = base_pm_content.replace(
|
|
131
131
|
"{{CURRENT_DATE}}", current_date
|
|
132
132
|
)
|
|
@@ -11,17 +11,17 @@ DESIGN DECISIONS:
|
|
|
11
11
|
- Provides sanitization for user inputs
|
|
12
12
|
"""
|
|
13
13
|
|
|
14
|
-
from typing import Any, Dict, List, Optional, Tuple
|
|
14
|
+
from typing import Any, ClassVar, Dict, List, Optional, Tuple
|
|
15
15
|
|
|
16
16
|
|
|
17
17
|
class TicketValidationService:
|
|
18
18
|
"""Service for validating ticket inputs."""
|
|
19
19
|
|
|
20
20
|
# Valid ticket types
|
|
21
|
-
VALID_TYPES = ["task", "issue", "epic", "bug", "feature", "story"]
|
|
21
|
+
VALID_TYPES: ClassVar[list] = ["task", "issue", "epic", "bug", "feature", "story"]
|
|
22
22
|
|
|
23
23
|
# Valid ticket statuses
|
|
24
|
-
VALID_STATUSES = [
|
|
24
|
+
VALID_STATUSES: ClassVar[list] = [
|
|
25
25
|
"open",
|
|
26
26
|
"in_progress",
|
|
27
27
|
"ready",
|
|
@@ -34,10 +34,10 @@ class TicketValidationService:
|
|
|
34
34
|
]
|
|
35
35
|
|
|
36
36
|
# Valid priorities
|
|
37
|
-
VALID_PRIORITIES = ["low", "medium", "high", "critical"]
|
|
37
|
+
VALID_PRIORITIES: ClassVar[list] = ["low", "medium", "high", "critical"]
|
|
38
38
|
|
|
39
39
|
# Valid workflow states
|
|
40
|
-
VALID_WORKFLOW_STATES = [
|
|
40
|
+
VALID_WORKFLOW_STATES: ClassVar[list] = [
|
|
41
41
|
"todo",
|
|
42
42
|
"in_progress",
|
|
43
43
|
"ready",
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Unified Services Module for Phase 2 Service Consolidation
|
|
3
|
+
=========================================================
|
|
4
|
+
|
|
5
|
+
This module implements the strategy pattern framework for consolidating
|
|
6
|
+
Claude MPM's 314 service files into approximately 180 more maintainable services.
|
|
7
|
+
|
|
8
|
+
Architecture:
|
|
9
|
+
- Base service interfaces for common service patterns
|
|
10
|
+
- Strategy pattern for pluggable behavior
|
|
11
|
+
- Backward compatibility layer for existing services
|
|
12
|
+
- Feature flags for gradual migration
|
|
13
|
+
|
|
14
|
+
Components:
|
|
15
|
+
- interfaces.py: Core service interfaces (IDeploymentService, IAnalyzerService, etc.)
|
|
16
|
+
- strategies.py: Strategy pattern framework with plugin registry
|
|
17
|
+
- migration.py: Migration utilities and backward compatibility
|
|
18
|
+
- Unified service implementations for major service categories
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
from .interfaces import (
|
|
22
|
+
IAnalyzerService,
|
|
23
|
+
IConfigurationService,
|
|
24
|
+
IDeploymentService,
|
|
25
|
+
ServiceCapability,
|
|
26
|
+
ServiceMetadata,
|
|
27
|
+
)
|
|
28
|
+
from .migration import (
|
|
29
|
+
FeatureFlag,
|
|
30
|
+
MigrationStatus,
|
|
31
|
+
ServiceMapper,
|
|
32
|
+
create_compatibility_wrapper,
|
|
33
|
+
)
|
|
34
|
+
from .strategies import (
|
|
35
|
+
AnalyzerStrategy,
|
|
36
|
+
ConfigStrategy,
|
|
37
|
+
DeploymentStrategy,
|
|
38
|
+
StrategyRegistry,
|
|
39
|
+
)
|
|
40
|
+
from .unified_analyzer import UnifiedAnalyzer
|
|
41
|
+
from .unified_config import UnifiedConfigManager
|
|
42
|
+
from .unified_deployment import UnifiedDeploymentService
|
|
43
|
+
|
|
44
|
+
__all__ = [
|
|
45
|
+
"AnalyzerStrategy",
|
|
46
|
+
"ConfigStrategy",
|
|
47
|
+
# Strategies
|
|
48
|
+
"DeploymentStrategy",
|
|
49
|
+
"FeatureFlag",
|
|
50
|
+
"IAnalyzerService",
|
|
51
|
+
"IConfigurationService",
|
|
52
|
+
# Interfaces
|
|
53
|
+
"IDeploymentService",
|
|
54
|
+
"MigrationStatus",
|
|
55
|
+
"ServiceCapability",
|
|
56
|
+
# Migration
|
|
57
|
+
"ServiceMapper",
|
|
58
|
+
"ServiceMetadata",
|
|
59
|
+
"StrategyRegistry",
|
|
60
|
+
"UnifiedAnalyzer",
|
|
61
|
+
"UnifiedConfigManager",
|
|
62
|
+
# Unified Services
|
|
63
|
+
"UnifiedDeploymentService",
|
|
64
|
+
"create_compatibility_wrapper",
|
|
65
|
+
]
|