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
|
@@ -0,0 +1,298 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Database Connector with Fallback Support
|
|
3
|
+
=========================================
|
|
4
|
+
|
|
5
|
+
WHY: Database connectivity packages often have compilation requirements that
|
|
6
|
+
can fail on certain systems. This module provides intelligent fallback to
|
|
7
|
+
pure Python alternatives when native packages are unavailable.
|
|
8
|
+
|
|
9
|
+
DESIGN DECISION: We prioritize pure Python implementations over native ones
|
|
10
|
+
for better cross-platform compatibility, even if they might be slightly slower.
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
from typing import Any, ClassVar, Dict, Optional, Tuple
|
|
14
|
+
|
|
15
|
+
from ..core.logger import get_logger
|
|
16
|
+
|
|
17
|
+
logger = get_logger(__name__)
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class DatabaseConnector:
|
|
21
|
+
"""
|
|
22
|
+
Manages database connections with automatic fallback to alternative drivers.
|
|
23
|
+
|
|
24
|
+
WHY: Provides a unified interface for database connections that automatically
|
|
25
|
+
handles missing or failed driver installations by falling back to alternatives.
|
|
26
|
+
"""
|
|
27
|
+
|
|
28
|
+
# Database drivers in order of preference (first is preferred)
|
|
29
|
+
MYSQL_DRIVERS: ClassVar[list] = [
|
|
30
|
+
("pymysql", "pymysql"), # Pure Python, no compilation required
|
|
31
|
+
("mysqlclient", "MySQLdb"), # Faster but requires MySQL dev headers
|
|
32
|
+
("mysql-connector-python", "mysql.connector"), # Oracle's pure Python driver
|
|
33
|
+
]
|
|
34
|
+
|
|
35
|
+
POSTGRESQL_DRIVERS: ClassVar[list] = [
|
|
36
|
+
("psycopg2-binary", "psycopg2"), # Binary wheel, no compilation
|
|
37
|
+
("psycopg2", "psycopg2"), # Requires PostgreSQL dev headers
|
|
38
|
+
("pg8000", "pg8000"), # Pure Python alternative
|
|
39
|
+
]
|
|
40
|
+
|
|
41
|
+
ORACLE_DRIVERS: ClassVar[list] = [
|
|
42
|
+
("cx_Oracle", "cx_Oracle"), # Requires Oracle client libraries
|
|
43
|
+
("oracledb", "oracledb"), # Pure Python Oracle driver (newer)
|
|
44
|
+
]
|
|
45
|
+
|
|
46
|
+
def __init__(self):
|
|
47
|
+
"""Initialize the database connector."""
|
|
48
|
+
self.available_drivers: Dict[str, Tuple[str, Any]] = {}
|
|
49
|
+
self._scan_available_drivers()
|
|
50
|
+
|
|
51
|
+
def _scan_available_drivers(self) -> None:
|
|
52
|
+
"""
|
|
53
|
+
Scan for available database drivers and cache them.
|
|
54
|
+
|
|
55
|
+
WHY: Pre-scanning allows us to know what's available without
|
|
56
|
+
repeatedly trying imports, improving performance.
|
|
57
|
+
"""
|
|
58
|
+
# Check MySQL drivers
|
|
59
|
+
for package_name, import_name in self.MYSQL_DRIVERS:
|
|
60
|
+
driver = self._try_import(import_name)
|
|
61
|
+
if driver and "mysql" not in self.available_drivers:
|
|
62
|
+
self.available_drivers["mysql"] = (package_name, driver)
|
|
63
|
+
logger.info(f"MySQL driver available: {package_name}")
|
|
64
|
+
|
|
65
|
+
# Check PostgreSQL drivers
|
|
66
|
+
for package_name, import_name in self.POSTGRESQL_DRIVERS:
|
|
67
|
+
driver = self._try_import(import_name)
|
|
68
|
+
if driver and "postgresql" not in self.available_drivers:
|
|
69
|
+
self.available_drivers["postgresql"] = (package_name, driver)
|
|
70
|
+
logger.info(f"PostgreSQL driver available: {package_name}")
|
|
71
|
+
|
|
72
|
+
# Check Oracle drivers
|
|
73
|
+
for package_name, import_name in self.ORACLE_DRIVERS:
|
|
74
|
+
driver = self._try_import(import_name)
|
|
75
|
+
if driver and "oracle" not in self.available_drivers:
|
|
76
|
+
self.available_drivers["oracle"] = (package_name, driver)
|
|
77
|
+
logger.info(f"Oracle driver available: {package_name}")
|
|
78
|
+
|
|
79
|
+
def _try_import(self, module_name: str) -> Optional[Any]:
|
|
80
|
+
"""
|
|
81
|
+
Try to import a module and return it if successful.
|
|
82
|
+
|
|
83
|
+
Args:
|
|
84
|
+
module_name: Name of the module to import
|
|
85
|
+
|
|
86
|
+
Returns:
|
|
87
|
+
The imported module or None if import fails
|
|
88
|
+
"""
|
|
89
|
+
try:
|
|
90
|
+
import importlib
|
|
91
|
+
|
|
92
|
+
return importlib.import_module(module_name)
|
|
93
|
+
except ImportError:
|
|
94
|
+
return None
|
|
95
|
+
|
|
96
|
+
def get_mysql_connection_string(
|
|
97
|
+
self, host: str, database: str, user: str, password: str, port: int = 3306
|
|
98
|
+
) -> Optional[str]:
|
|
99
|
+
"""
|
|
100
|
+
Get a SQLAlchemy connection string for MySQL with automatic driver selection.
|
|
101
|
+
|
|
102
|
+
WHY: SQLAlchemy needs different connection string formats depending on the driver.
|
|
103
|
+
This method automatically selects the best available driver.
|
|
104
|
+
|
|
105
|
+
Args:
|
|
106
|
+
host: Database host
|
|
107
|
+
database: Database name
|
|
108
|
+
user: Username
|
|
109
|
+
password: Password
|
|
110
|
+
port: Port number (default 3306)
|
|
111
|
+
|
|
112
|
+
Returns:
|
|
113
|
+
SQLAlchemy connection string or None if no driver available
|
|
114
|
+
"""
|
|
115
|
+
if "mysql" not in self.available_drivers:
|
|
116
|
+
logger.error(
|
|
117
|
+
"No MySQL driver available. Install one of: pymysql, mysqlclient, or mysql-connector-python"
|
|
118
|
+
)
|
|
119
|
+
return None
|
|
120
|
+
|
|
121
|
+
package_name, _ = self.available_drivers["mysql"]
|
|
122
|
+
|
|
123
|
+
# Format connection string based on driver
|
|
124
|
+
if package_name == "pymysql":
|
|
125
|
+
return f"mysql+pymysql://{user}:{password}@{host}:{port}/{database}"
|
|
126
|
+
if package_name == "mysqlclient":
|
|
127
|
+
return f"mysql+mysqldb://{user}:{password}@{host}:{port}/{database}"
|
|
128
|
+
if package_name == "mysql-connector-python":
|
|
129
|
+
return f"mysql+mysqlconnector://{user}:{password}@{host}:{port}/{database}"
|
|
130
|
+
|
|
131
|
+
return None
|
|
132
|
+
|
|
133
|
+
def get_postgresql_connection_string(
|
|
134
|
+
self, host: str, database: str, user: str, password: str, port: int = 5432
|
|
135
|
+
) -> Optional[str]:
|
|
136
|
+
"""
|
|
137
|
+
Get a SQLAlchemy connection string for PostgreSQL with automatic driver selection.
|
|
138
|
+
|
|
139
|
+
Args:
|
|
140
|
+
host: Database host
|
|
141
|
+
database: Database name
|
|
142
|
+
user: Username
|
|
143
|
+
password: Password
|
|
144
|
+
port: Port number (default 5432)
|
|
145
|
+
|
|
146
|
+
Returns:
|
|
147
|
+
SQLAlchemy connection string or None if no driver available
|
|
148
|
+
"""
|
|
149
|
+
if "postgresql" not in self.available_drivers:
|
|
150
|
+
logger.error(
|
|
151
|
+
"No PostgreSQL driver available. Install one of: psycopg2-binary, psycopg2, or pg8000"
|
|
152
|
+
)
|
|
153
|
+
return None
|
|
154
|
+
|
|
155
|
+
package_name, _ = self.available_drivers["postgresql"]
|
|
156
|
+
|
|
157
|
+
# Format connection string based on driver
|
|
158
|
+
if package_name in ["psycopg2-binary", "psycopg2"]:
|
|
159
|
+
return f"postgresql+psycopg2://{user}:{password}@{host}:{port}/{database}"
|
|
160
|
+
if package_name == "pg8000":
|
|
161
|
+
return f"postgresql+pg8000://{user}:{password}@{host}:{port}/{database}"
|
|
162
|
+
|
|
163
|
+
return None
|
|
164
|
+
|
|
165
|
+
def get_oracle_connection_string(
|
|
166
|
+
self, host: str, database: str, user: str, password: str, port: int = 1521
|
|
167
|
+
) -> Optional[str]:
|
|
168
|
+
"""
|
|
169
|
+
Get a SQLAlchemy connection string for Oracle with automatic driver selection.
|
|
170
|
+
|
|
171
|
+
Args:
|
|
172
|
+
host: Database host
|
|
173
|
+
database: Database name/SID
|
|
174
|
+
user: Username
|
|
175
|
+
password: Password
|
|
176
|
+
port: Port number (default 1521)
|
|
177
|
+
|
|
178
|
+
Returns:
|
|
179
|
+
SQLAlchemy connection string or None if no driver available
|
|
180
|
+
"""
|
|
181
|
+
if "oracle" not in self.available_drivers:
|
|
182
|
+
logger.error(
|
|
183
|
+
"No Oracle driver available. Install one of: cx_Oracle or oracledb"
|
|
184
|
+
)
|
|
185
|
+
return None
|
|
186
|
+
|
|
187
|
+
package_name, _ = self.available_drivers["oracle"]
|
|
188
|
+
|
|
189
|
+
# Format connection string based on driver
|
|
190
|
+
if package_name == "cx_Oracle":
|
|
191
|
+
return f"oracle+cx_oracle://{user}:{password}@{host}:{port}/{database}"
|
|
192
|
+
if package_name == "oracledb":
|
|
193
|
+
return f"oracle+oracledb://{user}:{password}@{host}:{port}/{database}"
|
|
194
|
+
|
|
195
|
+
return None
|
|
196
|
+
|
|
197
|
+
def get_available_drivers(self) -> Dict[str, str]:
|
|
198
|
+
"""
|
|
199
|
+
Get a summary of available database drivers.
|
|
200
|
+
|
|
201
|
+
Returns:
|
|
202
|
+
Dictionary mapping database type to driver package name
|
|
203
|
+
"""
|
|
204
|
+
return {
|
|
205
|
+
db_type: driver_info[0]
|
|
206
|
+
for db_type, driver_info in self.available_drivers.items()
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
def suggest_missing_drivers(self) -> Dict[str, str]:
|
|
210
|
+
"""
|
|
211
|
+
Suggest drivers to install for databases without drivers.
|
|
212
|
+
|
|
213
|
+
Returns:
|
|
214
|
+
Dictionary mapping database type to recommended package
|
|
215
|
+
"""
|
|
216
|
+
suggestions = {}
|
|
217
|
+
|
|
218
|
+
if "mysql" not in self.available_drivers:
|
|
219
|
+
suggestions["mysql"] = "pymysql" # Pure Python, always works
|
|
220
|
+
|
|
221
|
+
if "postgresql" not in self.available_drivers:
|
|
222
|
+
suggestions["postgresql"] = "psycopg2-binary" # No compilation needed
|
|
223
|
+
|
|
224
|
+
if "oracle" not in self.available_drivers:
|
|
225
|
+
suggestions["oracle"] = "oracledb" # Pure Python, newer
|
|
226
|
+
|
|
227
|
+
return suggestions
|
|
228
|
+
|
|
229
|
+
@staticmethod
|
|
230
|
+
def get_installation_help() -> str:
|
|
231
|
+
"""
|
|
232
|
+
Get helpful installation instructions for database drivers.
|
|
233
|
+
|
|
234
|
+
Returns:
|
|
235
|
+
Formatted help text
|
|
236
|
+
"""
|
|
237
|
+
return """
|
|
238
|
+
Database Driver Installation Help
|
|
239
|
+
=================================
|
|
240
|
+
|
|
241
|
+
For MySQL:
|
|
242
|
+
Recommended: pip install pymysql (pure Python, no compilation)
|
|
243
|
+
Alternative: pip install mysql-connector-python (Oracle's pure Python)
|
|
244
|
+
Fastest (requires MySQL dev headers):
|
|
245
|
+
macOS: brew install mysql && pip install mysqlclient
|
|
246
|
+
Ubuntu: sudo apt-get install libmysqlclient-dev && pip install mysqlclient
|
|
247
|
+
|
|
248
|
+
For PostgreSQL:
|
|
249
|
+
Recommended: pip install psycopg2-binary (pre-compiled, no headers needed)
|
|
250
|
+
Alternative: pip install pg8000 (pure Python, slightly slower)
|
|
251
|
+
Fastest (requires PostgreSQL dev headers):
|
|
252
|
+
macOS: brew install postgresql && pip install psycopg2
|
|
253
|
+
Ubuntu: sudo apt-get install libpq-dev && pip install psycopg2
|
|
254
|
+
|
|
255
|
+
For Oracle:
|
|
256
|
+
Recommended: pip install oracledb (pure Python, no Oracle client needed)
|
|
257
|
+
Alternative (requires Oracle Instant Client):
|
|
258
|
+
1. Download Oracle Instant Client from oracle.com
|
|
259
|
+
2. Set environment variables (LD_LIBRARY_PATH, etc.)
|
|
260
|
+
3. pip install cx_Oracle
|
|
261
|
+
|
|
262
|
+
Note: Pure Python drivers are slightly slower but much easier to install
|
|
263
|
+
and maintain. They're recommended unless you have specific performance needs.
|
|
264
|
+
"""
|
|
265
|
+
|
|
266
|
+
|
|
267
|
+
def test_database_connectivity() -> None:
|
|
268
|
+
"""
|
|
269
|
+
Test database connectivity and report available drivers.
|
|
270
|
+
|
|
271
|
+
WHY: Helps users understand what database drivers are available and
|
|
272
|
+
what they might need to install.
|
|
273
|
+
"""
|
|
274
|
+
connector = DatabaseConnector()
|
|
275
|
+
|
|
276
|
+
print("Database Driver Status")
|
|
277
|
+
print("=" * 50)
|
|
278
|
+
|
|
279
|
+
available = connector.get_available_drivers()
|
|
280
|
+
if available:
|
|
281
|
+
print("\nAvailable Drivers:")
|
|
282
|
+
for db_type, driver in available.items():
|
|
283
|
+
print(f" {db_type:12} -> {driver}")
|
|
284
|
+
else:
|
|
285
|
+
print("\nNo database drivers found!")
|
|
286
|
+
|
|
287
|
+
suggestions = connector.suggest_missing_drivers()
|
|
288
|
+
if suggestions:
|
|
289
|
+
print("\nRecommended installations for missing drivers:")
|
|
290
|
+
for db_type, package in suggestions.items():
|
|
291
|
+
print(f" {db_type:12} -> pip install {package}")
|
|
292
|
+
|
|
293
|
+
print("\n" + connector.get_installation_help())
|
|
294
|
+
|
|
295
|
+
|
|
296
|
+
if __name__ == "__main__":
|
|
297
|
+
# Run connectivity test when module is executed directly
|
|
298
|
+
test_database_connectivity()
|
|
@@ -66,7 +66,7 @@ class DependencyCache:
|
|
|
66
66
|
return self._cache_data
|
|
67
67
|
|
|
68
68
|
try:
|
|
69
|
-
with
|
|
69
|
+
with self.cache_file.open() as f:
|
|
70
70
|
self._cache_data = json.load(f)
|
|
71
71
|
return self._cache_data
|
|
72
72
|
except Exception as e:
|
|
@@ -85,7 +85,7 @@ class DependencyCache:
|
|
|
85
85
|
# Ensure directory exists
|
|
86
86
|
self.cache_dir.mkdir(parents=True, exist_ok=True)
|
|
87
87
|
|
|
88
|
-
with
|
|
88
|
+
with self.cache_file.open("w") as f:
|
|
89
89
|
json.dump(cache_data, f, indent=2)
|
|
90
90
|
|
|
91
91
|
self._cache_data = cache_data
|
|
@@ -10,7 +10,7 @@ based on the execution context and user preferences.
|
|
|
10
10
|
import json
|
|
11
11
|
import os
|
|
12
12
|
import sys
|
|
13
|
-
from datetime import datetime, timedelta
|
|
13
|
+
from datetime import datetime, timedelta, timezone
|
|
14
14
|
from enum import Enum
|
|
15
15
|
from typing import Any, Dict, Optional, Tuple
|
|
16
16
|
|
|
@@ -106,7 +106,7 @@ class DependencyStrategy:
|
|
|
106
106
|
def _is_docker(self) -> bool:
|
|
107
107
|
"""Check if running inside Docker container."""
|
|
108
108
|
return (
|
|
109
|
-
|
|
109
|
+
Path("/.dockerenv").exists()
|
|
110
110
|
or os.environ.get("KUBERNETES_SERVICE_HOST") is not None
|
|
111
111
|
)
|
|
112
112
|
|
|
@@ -128,7 +128,7 @@ class DependencyStrategy:
|
|
|
128
128
|
# Try to load YAML config
|
|
129
129
|
import yaml
|
|
130
130
|
|
|
131
|
-
with
|
|
131
|
+
with self.config_path.open() as f:
|
|
132
132
|
config = yaml.safe_load(f)
|
|
133
133
|
mode_str = config.get("dependency_mode")
|
|
134
134
|
if mode_str:
|
|
@@ -155,12 +155,14 @@ class DependencyStrategy:
|
|
|
155
155
|
return True
|
|
156
156
|
|
|
157
157
|
try:
|
|
158
|
-
with
|
|
158
|
+
with self.cache_path.open() as f:
|
|
159
159
|
cache = json.load(f)
|
|
160
160
|
last_check = datetime.fromisoformat(cache.get("timestamp", ""))
|
|
161
161
|
|
|
162
162
|
# Check if cache is still valid
|
|
163
|
-
if datetime.now() - last_check < timedelta(
|
|
163
|
+
if datetime.now(timezone.utc) - last_check < timedelta(
|
|
164
|
+
seconds=cache_ttl
|
|
165
|
+
):
|
|
164
166
|
logger.debug(f"Using cached dependency check from {last_check}")
|
|
165
167
|
return False
|
|
166
168
|
|
|
@@ -179,9 +181,12 @@ class DependencyStrategy:
|
|
|
179
181
|
try:
|
|
180
182
|
self.cache_path.parent.mkdir(parents=True, exist_ok=True)
|
|
181
183
|
|
|
182
|
-
cache_data = {
|
|
184
|
+
cache_data = {
|
|
185
|
+
"timestamp": datetime.now(timezone.utc).isoformat(),
|
|
186
|
+
"results": results,
|
|
187
|
+
}
|
|
183
188
|
|
|
184
|
-
with
|
|
189
|
+
with self.cache_path.open("w") as f:
|
|
185
190
|
json.dump(cache_data, f, indent=2)
|
|
186
191
|
|
|
187
192
|
logger.debug(f"Cached dependency results to {self.cache_path}")
|
|
@@ -200,7 +205,7 @@ class DependencyStrategy:
|
|
|
200
205
|
return None
|
|
201
206
|
|
|
202
207
|
try:
|
|
203
|
-
with
|
|
208
|
+
with self.cache_path.open() as f:
|
|
204
209
|
cache = json.load(f)
|
|
205
210
|
return cache.get("results")
|
|
206
211
|
except Exception:
|
|
@@ -280,7 +285,7 @@ class DependencyStrategy:
|
|
|
280
285
|
if self.config_path.exists():
|
|
281
286
|
import yaml
|
|
282
287
|
|
|
283
|
-
with
|
|
288
|
+
with self.config_path.open() as f:
|
|
284
289
|
config = yaml.safe_load(f) or {}
|
|
285
290
|
|
|
286
291
|
# Update dependency mode
|
|
@@ -289,7 +294,7 @@ class DependencyStrategy:
|
|
|
289
294
|
# Save config
|
|
290
295
|
import yaml
|
|
291
296
|
|
|
292
|
-
with
|
|
297
|
+
with self.config_path.open("w") as f:
|
|
293
298
|
yaml.dump(config, f, default_flow_style=False)
|
|
294
299
|
|
|
295
300
|
print(f"✓ Saved preference: {mode.value}")
|
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Display Helper for Rich Console Output.
|
|
3
|
+
|
|
4
|
+
WHY: Centralizes display formatting logic to reduce code duplication
|
|
5
|
+
across CLI commands. Provides reusable components for tables, panels,
|
|
6
|
+
reports, and structured output.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from typing import Any, Dict, List, Tuple
|
|
10
|
+
|
|
11
|
+
from rich.console import Console
|
|
12
|
+
from rich.panel import Panel
|
|
13
|
+
from rich.table import Table
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class DisplayHelper:
|
|
17
|
+
"""Centralized display formatting for Rich console output."""
|
|
18
|
+
|
|
19
|
+
def __init__(self, console: Console):
|
|
20
|
+
"""Initialize display helper with console instance."""
|
|
21
|
+
self.console = console
|
|
22
|
+
|
|
23
|
+
def display_separator(self, char: str = "=", width: int = 60) -> None:
|
|
24
|
+
"""Display a separator line."""
|
|
25
|
+
self.console.print(char * width)
|
|
26
|
+
|
|
27
|
+
def display_header(self, title: str, width: int = 60) -> None:
|
|
28
|
+
"""Display a formatted header with separators."""
|
|
29
|
+
self.display_separator(width=width)
|
|
30
|
+
self.console.print(f"[bold]{title}[/bold]")
|
|
31
|
+
self.display_separator(width=width)
|
|
32
|
+
self.console.print()
|
|
33
|
+
|
|
34
|
+
def display_section_title(self, title: str, emoji: str = "") -> None:
|
|
35
|
+
"""Display a section title with optional emoji."""
|
|
36
|
+
if emoji:
|
|
37
|
+
self.console.print(f"[bold cyan]{emoji} {title}[/bold cyan]")
|
|
38
|
+
else:
|
|
39
|
+
self.console.print(f"[bold cyan]{title}[/bold cyan]")
|
|
40
|
+
|
|
41
|
+
def display_key_value_table(
|
|
42
|
+
self,
|
|
43
|
+
title: str,
|
|
44
|
+
data: Dict[str, Any],
|
|
45
|
+
key_style: str = "cyan",
|
|
46
|
+
value_style: str = "white",
|
|
47
|
+
) -> None:
|
|
48
|
+
"""Display a two-column key-value table."""
|
|
49
|
+
table = Table(title=title, show_header=True)
|
|
50
|
+
table.add_column("Property", style=key_style)
|
|
51
|
+
table.add_column("Value", style=value_style)
|
|
52
|
+
|
|
53
|
+
for key, value in data.items():
|
|
54
|
+
# Handle various value types
|
|
55
|
+
if isinstance(value, bool):
|
|
56
|
+
display_value = "✓" if value else "✗"
|
|
57
|
+
elif isinstance(value, int) and key.lower().find("size") >= 0:
|
|
58
|
+
display_value = f"{value:,} characters"
|
|
59
|
+
else:
|
|
60
|
+
display_value = str(value)
|
|
61
|
+
table.add_row(key, display_value)
|
|
62
|
+
|
|
63
|
+
self.console.print(table)
|
|
64
|
+
|
|
65
|
+
def display_list_section(
|
|
66
|
+
self, title: str, items: List[str], max_items: int = 10, color: str = "white"
|
|
67
|
+
) -> None:
|
|
68
|
+
"""Display a titled list of items."""
|
|
69
|
+
self.console.print(f"\n[bold cyan]{title}[/bold cyan]")
|
|
70
|
+
for item in items[:max_items]:
|
|
71
|
+
self.console.print(f" [{color}]{item}[/{color}]")
|
|
72
|
+
|
|
73
|
+
def display_warning_list(self, title: str, items: List[str]) -> None:
|
|
74
|
+
"""Display a list of warning items."""
|
|
75
|
+
self.console.print(f"\n[yellow]{title}[/yellow]")
|
|
76
|
+
for item in items:
|
|
77
|
+
self.console.print(f" • {item}")
|
|
78
|
+
|
|
79
|
+
def display_info_list(self, title: str, items: List[str]) -> None:
|
|
80
|
+
"""Display a list of info items."""
|
|
81
|
+
self.console.print(f"\n[blue]{title}[/blue]")
|
|
82
|
+
for item in items[:5]:
|
|
83
|
+
self.console.print(f" • {item}")
|
|
84
|
+
|
|
85
|
+
def display_metric_row(
|
|
86
|
+
self, label: str, value: Any, indent: int = 2, warning: bool = False
|
|
87
|
+
) -> None:
|
|
88
|
+
"""Display a single metric row with label and value."""
|
|
89
|
+
indent_str = " " * indent
|
|
90
|
+
if warning:
|
|
91
|
+
self.console.print(f"{indent_str}[yellow]{label}: {value}[/yellow]")
|
|
92
|
+
else:
|
|
93
|
+
self.console.print(f"{indent_str}{label}: {value}")
|
|
94
|
+
|
|
95
|
+
def display_metrics_section(
|
|
96
|
+
self, title: str, metrics: Dict[str, Any], emoji: str = ""
|
|
97
|
+
) -> None:
|
|
98
|
+
"""Display a section with multiple metrics."""
|
|
99
|
+
self.display_section_title(title, emoji)
|
|
100
|
+
for label, value in metrics.items():
|
|
101
|
+
self.display_metric_row(label, value)
|
|
102
|
+
|
|
103
|
+
def display_report_section(
|
|
104
|
+
self,
|
|
105
|
+
title: str,
|
|
106
|
+
data: Dict[str, Any],
|
|
107
|
+
emoji: str = "",
|
|
108
|
+
show_warnings: bool = True,
|
|
109
|
+
) -> None:
|
|
110
|
+
"""Display a generic report section with data and optional warnings."""
|
|
111
|
+
self.display_section_title(title, emoji)
|
|
112
|
+
|
|
113
|
+
for key, value in data.items():
|
|
114
|
+
if isinstance(value, dict):
|
|
115
|
+
# Handle nested dictionaries
|
|
116
|
+
self.console.print(f" {key}:")
|
|
117
|
+
for sub_key, sub_value in value.items():
|
|
118
|
+
self.console.print(f" {sub_key}: {sub_value}")
|
|
119
|
+
elif isinstance(value, list):
|
|
120
|
+
# Handle lists
|
|
121
|
+
self.console.print(f" {key}:")
|
|
122
|
+
for item in value[:5]: # Limit to first 5 items
|
|
123
|
+
if isinstance(item, dict):
|
|
124
|
+
# Handle dict items in list
|
|
125
|
+
desc = item.get("description") or str(item)
|
|
126
|
+
prefix = "⚠️ " if show_warnings else "•"
|
|
127
|
+
self.console.print(f" {prefix} {desc}")
|
|
128
|
+
else:
|
|
129
|
+
self.console.print(f" • {item}")
|
|
130
|
+
else:
|
|
131
|
+
# Simple key-value
|
|
132
|
+
self.console.print(f" {key}: {value}")
|
|
133
|
+
|
|
134
|
+
def display_recommendations(self, recommendations: List[str]) -> None:
|
|
135
|
+
"""Display a recommendations section."""
|
|
136
|
+
if recommendations:
|
|
137
|
+
self.display_section_title("💡 Recommendations")
|
|
138
|
+
for rec in recommendations[:5]:
|
|
139
|
+
self.console.print(f" → {rec}")
|
|
140
|
+
|
|
141
|
+
def display_documentation_status(
|
|
142
|
+
self, analysis: Dict, title: str = "Current CLAUDE.md Status"
|
|
143
|
+
) -> None:
|
|
144
|
+
"""Display documentation status table."""
|
|
145
|
+
data = {
|
|
146
|
+
"Size": analysis.get("size", 0),
|
|
147
|
+
"Lines": analysis.get("lines", 0),
|
|
148
|
+
"Sections": len(analysis.get("sections", [])),
|
|
149
|
+
"Has Priority Index": analysis.get("has_priority_index", False),
|
|
150
|
+
"Has Priority Markers": analysis.get("has_priority_markers", False),
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
if analysis.get("last_modified"):
|
|
154
|
+
data["Last Modified"] = analysis["last_modified"]
|
|
155
|
+
|
|
156
|
+
self.display_key_value_table(title, data)
|
|
157
|
+
|
|
158
|
+
# Display warnings if present
|
|
159
|
+
if analysis.get("outdated_patterns"):
|
|
160
|
+
self.display_warning_list(
|
|
161
|
+
"⚠️ Outdated patterns detected:", analysis["outdated_patterns"]
|
|
162
|
+
)
|
|
163
|
+
|
|
164
|
+
# Display custom sections if present
|
|
165
|
+
if analysis.get("custom_sections"):
|
|
166
|
+
self.display_info_list(
|
|
167
|
+
"[INFO]️ Custom sections found:", analysis["custom_sections"]
|
|
168
|
+
)
|
|
169
|
+
|
|
170
|
+
def display_activity_summary(
|
|
171
|
+
self, summary: Dict, period: str = "Last 30 days"
|
|
172
|
+
) -> None:
|
|
173
|
+
"""Display activity summary metrics."""
|
|
174
|
+
metrics = {
|
|
175
|
+
"Total commits": summary.get("total_commits", 0),
|
|
176
|
+
"Active contributors": summary.get("total_authors", 0),
|
|
177
|
+
"Files modified": summary.get("files_changed", 0),
|
|
178
|
+
"Current branch": summary.get("current_branch", "unknown"),
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
self.display_metrics_section(
|
|
182
|
+
f"📊 Activity Overview ({period.lower()})", metrics
|
|
183
|
+
)
|
|
184
|
+
|
|
185
|
+
if summary.get("has_uncommitted"):
|
|
186
|
+
self.display_metric_row(
|
|
187
|
+
"⚠️ Uncommitted changes",
|
|
188
|
+
f"{summary.get('uncommitted_count', 0)} files",
|
|
189
|
+
warning=True,
|
|
190
|
+
)
|
|
191
|
+
|
|
192
|
+
def display_commit_list(
|
|
193
|
+
self, commits: List[Dict], title: str = "📝 Recent Commits (last 10)"
|
|
194
|
+
) -> None:
|
|
195
|
+
"""Display a list of commits."""
|
|
196
|
+
if commits:
|
|
197
|
+
self.display_section_title(title)
|
|
198
|
+
for commit in commits[:10]:
|
|
199
|
+
msg = commit.get("message", "")[:60]
|
|
200
|
+
hash_val = commit.get("hash", "")
|
|
201
|
+
author = commit.get("author", "")
|
|
202
|
+
self.console.print(f" [{hash_val}] {msg} - {author}")
|
|
203
|
+
|
|
204
|
+
def display_file_change_list(
|
|
205
|
+
self, files: List[Tuple[str, int]], title: str = "🔥 Most Changed Files"
|
|
206
|
+
) -> None:
|
|
207
|
+
"""Display a list of changed files with change counts."""
|
|
208
|
+
if files:
|
|
209
|
+
self.display_section_title(title)
|
|
210
|
+
for file_path, changes in files[:10]:
|
|
211
|
+
self.console.print(f" {file_path}: {changes} changes")
|
|
212
|
+
|
|
213
|
+
def display_branch_list(
|
|
214
|
+
self,
|
|
215
|
+
branches: List[str],
|
|
216
|
+
current_branch: str,
|
|
217
|
+
title: str = "🌿 Active Branches",
|
|
218
|
+
) -> None:
|
|
219
|
+
"""Display a list of branches with current branch marked."""
|
|
220
|
+
if branches:
|
|
221
|
+
self.display_section_title(title)
|
|
222
|
+
for branch in branches:
|
|
223
|
+
marker = "→" if branch == current_branch else " "
|
|
224
|
+
self.console.print(f" {marker} {branch}")
|
|
225
|
+
|
|
226
|
+
def display_success_panel(
|
|
227
|
+
self,
|
|
228
|
+
title: str,
|
|
229
|
+
content: str,
|
|
230
|
+
border_style: str = "green",
|
|
231
|
+
) -> None:
|
|
232
|
+
"""Display a success panel with content."""
|
|
233
|
+
self.console.print(Panel(content, title=title, border_style=border_style))
|
|
234
|
+
|
|
235
|
+
def display_info_panel(
|
|
236
|
+
self,
|
|
237
|
+
title: str,
|
|
238
|
+
content: str,
|
|
239
|
+
border_style: str = "cyan",
|
|
240
|
+
) -> None:
|
|
241
|
+
"""Display an info panel with content."""
|
|
242
|
+
self.console.print(Panel(content, title=title, border_style=border_style))
|
|
243
|
+
|
|
244
|
+
def display_files_list(
|
|
245
|
+
self, title: str, files: List[str], prefix: str = "•"
|
|
246
|
+
) -> None:
|
|
247
|
+
"""Display a list of files."""
|
|
248
|
+
if files:
|
|
249
|
+
self.console.print(f"[bold]{title}[/bold]")
|
|
250
|
+
for file in files:
|
|
251
|
+
self.console.print(f" {prefix} {file}")
|
|
252
|
+
self.console.print()
|
|
253
|
+
|
|
254
|
+
def display_next_steps(self, steps: List[str]) -> None:
|
|
255
|
+
"""Display next steps list."""
|
|
256
|
+
if steps:
|
|
257
|
+
self.console.print("[bold]Next Steps:[/bold]")
|
|
258
|
+
for step in steps:
|
|
259
|
+
self.console.print(f" → {step}")
|
|
260
|
+
self.console.print()
|
|
@@ -7,6 +7,7 @@ prompting is appropriate for dependency installation.
|
|
|
7
7
|
|
|
8
8
|
import os
|
|
9
9
|
import sys
|
|
10
|
+
from pathlib import Path
|
|
10
11
|
from typing import Dict, Tuple
|
|
11
12
|
|
|
12
13
|
from ..core.logger import get_logger
|
|
@@ -139,7 +140,7 @@ class EnvironmentContext:
|
|
|
139
140
|
"""
|
|
140
141
|
# Check for Docker-specific files
|
|
141
142
|
for indicator_file in cls.CONTAINER_INDICATORS:
|
|
142
|
-
if
|
|
143
|
+
if Path(indicator_file).exists():
|
|
143
144
|
logger.debug(f"Container detected via {indicator_file}")
|
|
144
145
|
return True
|
|
145
146
|
|
|
@@ -149,7 +150,7 @@ class EnvironmentContext:
|
|
|
149
150
|
|
|
150
151
|
# Check cgroup for docker/containerd references
|
|
151
152
|
try:
|
|
152
|
-
with
|
|
153
|
+
with Path("/proc/1/cgroup").open() as f:
|
|
153
154
|
cgroup_content = f.read()
|
|
154
155
|
if "docker" in cgroup_content or "containerd" in cgroup_content:
|
|
155
156
|
return True
|
|
@@ -189,7 +190,7 @@ class EnvironmentContext:
|
|
|
189
190
|
get_ipython = globals().get("get_ipython")
|
|
190
191
|
if get_ipython is not None:
|
|
191
192
|
return True
|
|
192
|
-
except:
|
|
193
|
+
except Exception:
|
|
193
194
|
pass
|
|
194
195
|
|
|
195
196
|
# Check for Jupyter-specific environment variables
|