claude-mpm 4.1.26__py3-none-any.whl → 5.0.9__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.
- 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 +432 -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 +254 -29
- claude_mpm/agents/PM_INSTRUCTIONS.md +969 -0
- claude_mpm/agents/PM_INSTRUCTIONS_TEACH.md +1322 -0
- claude_mpm/agents/WORKFLOW.md +355 -191
- claude_mpm/agents/__init__.py +6 -0
- claude_mpm/agents/agent_loader.py +41 -14
- claude_mpm/agents/agent_loader_integration.py +3 -2
- claude_mpm/agents/async_agent_loader.py +3 -3
- claude_mpm/agents/base_agent.json +6 -3
- claude_mpm/agents/base_agent_loader.py +21 -44
- claude_mpm/agents/frontmatter_validator.py +292 -252
- claude_mpm/agents/system_agent_config.py +3 -2
- claude_mpm/agents/templates/README.md +465 -0
- claude_mpm/agents/templates/circuit-breakers.md +1005 -0
- claude_mpm/agents/templates/context-management-examples.md +544 -0
- claude_mpm/agents/templates/git-file-tracking.md +584 -0
- claude_mpm/agents/templates/pm-examples.md +474 -0
- claude_mpm/agents/templates/pm-red-flags.md +310 -0
- claude_mpm/agents/templates/pr-workflow-examples.md +427 -0
- claude_mpm/agents/templates/research-gate-examples.md +669 -0
- claude_mpm/agents/templates/response-format.md +583 -0
- claude_mpm/agents/templates/structured-questions-examples.md +615 -0
- claude_mpm/agents/templates/ticket-completeness-examples.md +139 -0
- claude_mpm/agents/templates/ticketing-examples.md +277 -0
- claude_mpm/agents/templates/validation-templates.md +312 -0
- claude_mpm/cli/__init__.py +72 -376
- claude_mpm/cli/commands/__init__.py +4 -0
- claude_mpm/cli/commands/agent_manager.py +675 -20
- claude_mpm/cli/commands/agent_source.py +774 -0
- claude_mpm/cli/commands/agent_state_manager.py +344 -0
- claude_mpm/cli/commands/agents.py +1673 -178
- claude_mpm/cli/commands/agents_cleanup.py +210 -0
- claude_mpm/cli/commands/agents_detect.py +380 -0
- claude_mpm/cli/commands/agents_discover.py +338 -0
- claude_mpm/cli/commands/agents_recommend.py +309 -0
- claude_mpm/cli/commands/aggregate.py +11 -7
- claude_mpm/cli/commands/analyze.py +18 -13
- claude_mpm/cli/commands/analyze_code.py +8 -4
- claude_mpm/cli/commands/auto_configure.py +566 -0
- claude_mpm/cli/commands/cleanup.py +12 -12
- claude_mpm/cli/commands/config.py +54 -17
- claude_mpm/cli/commands/configure.py +1184 -1055
- 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 +184 -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 +19 -19
- claude_mpm/cli/commands/doctor.py +51 -7
- claude_mpm/cli/commands/hook_errors.py +277 -0
- claude_mpm/cli/commands/info.py +3 -4
- claude_mpm/cli/commands/local_deploy.py +534 -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 +573 -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/postmortem.py +401 -0
- claude_mpm/cli/commands/run.py +252 -167
- claude_mpm/cli/commands/search.py +458 -0
- claude_mpm/cli/commands/skill_source.py +694 -0
- claude_mpm/cli/commands/skills.py +1225 -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 +279 -0
- claude_mpm/cli/helpers.py +105 -0
- claude_mpm/cli/interactive/__init__.py +21 -0
- claude_mpm/cli/interactive/agent_wizard.py +1872 -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/agent_source_parser.py +171 -0
- claude_mpm/cli/parsers/agents_parser.py +369 -1
- claude_mpm/cli/parsers/auto_configure_parser.py +245 -0
- claude_mpm/cli/parsers/base_parser.py +196 -3
- claude_mpm/cli/parsers/config_parser.py +96 -43
- 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/skill_source_parser.py +169 -0
- claude_mpm/cli/parsers/skills_parser.py +282 -0
- claude_mpm/cli/parsers/source_parser.py +138 -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 +994 -0
- claude_mpm/cli/startup_display.py +480 -0
- claude_mpm/cli/startup_logging.py +179 -13
- claude_mpm/cli/utils.py +54 -3
- claude_mpm/cli_module/commands.py +1 -1
- claude_mpm/commands/mpm-agents-auto-configure.md +278 -0
- claude_mpm/commands/mpm-agents-detect.md +177 -0
- claude_mpm/commands/mpm-agents-list.md +131 -0
- claude_mpm/commands/mpm-agents-recommend.md +223 -0
- claude_mpm/commands/mpm-config-view.md +150 -0
- claude_mpm/commands/mpm-doctor.md +9 -0
- claude_mpm/commands/mpm-help.md +297 -5
- claude_mpm/commands/mpm-init.md +401 -17
- claude_mpm/commands/mpm-monitor.md +418 -0
- claude_mpm/commands/mpm-postmortem.md +123 -0
- claude_mpm/commands/mpm-session-resume.md +381 -0
- claude_mpm/commands/mpm-status.md +79 -8
- claude_mpm/commands/mpm-ticket-organize.md +304 -0
- claude_mpm/commands/mpm-ticket-view.md +552 -0
- claude_mpm/commands/mpm-version.md +122 -0
- claude_mpm/commands/mpm.md +12 -0
- claude_mpm/config/agent_config.py +4 -4
- claude_mpm/config/agent_presets.py +488 -0
- claude_mpm/config/agent_sources.py +325 -0
- 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/skill_presets.py +392 -0
- claude_mpm/config/skill_sources.py +590 -0
- claude_mpm/config/socketio_config.py +3 -3
- claude_mpm/constants.py +28 -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 +24 -42
- claude_mpm/core/config.py +101 -8
- claude_mpm/core/config_aliases.py +7 -6
- claude_mpm/core/constants.py +66 -1
- 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 +25 -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 +176 -0
- claude_mpm/core/framework/loaders/instruction_loader.py +181 -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_error_memory.py +381 -0
- claude_mpm/core/hook_manager.py +49 -8
- claude_mpm/core/injectable_service.py +11 -8
- claude_mpm/core/instruction_reinforcement_hook.py +4 -3
- claude_mpm/core/interactive_session.py +146 -18
- 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 +22 -15
- claude_mpm/core/logging_config.py +6 -2
- claude_mpm/core/logging_utils.py +520 -0
- claude_mpm/core/oneshot_session.py +122 -15
- 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/protocols/__init__.py +23 -0
- claude_mpm/core/protocols/runner_protocol.py +103 -0
- claude_mpm/core/protocols/session_protocol.py +131 -0
- 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/shared/singleton_manager.py +11 -4
- claude_mpm/core/socketio_pool.py +15 -15
- claude_mpm/core/system_context.py +38 -0
- 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/static/css/activity.css +69 -69
- claude_mpm/dashboard/static/css/connection-status.css +10 -10
- claude_mpm/dashboard/static/css/dashboard.css +600 -18
- claude_mpm/dashboard/static/js/components/activity-tree.js +181 -195
- claude_mpm/dashboard/static/js/components/agent-hierarchy.js +105 -102
- claude_mpm/dashboard/static/js/components/agent-inference.js +34 -31
- claude_mpm/dashboard/static/js/components/build-tracker.js +67 -59
- claude_mpm/dashboard/static/js/components/code-simple.js +857 -0
- claude_mpm/dashboard/static/js/components/connection-debug.js +101 -101
- 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 +50 -13
- 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 +36 -16
- claude_mpm/dashboard/static/js/components/file-viewer.js +580 -0
- claude_mpm/dashboard/static/js/components/module-viewer.js +49 -23
- claude_mpm/dashboard/static/js/components/session-manager.js +19 -19
- claude_mpm/dashboard/static/js/components/socket-manager.js +5 -1
- claude_mpm/dashboard/static/js/components/ui-state-manager.js +356 -41
- claude_mpm/dashboard/static/js/components/unified-data-viewer.js +520 -88
- claude_mpm/dashboard/static/js/components/working-directory.js +46 -11
- claude_mpm/dashboard/static/js/connection-manager.js +76 -76
- claude_mpm/dashboard/static/js/dashboard.js +309 -178
- claude_mpm/dashboard/static/js/extension-error-handler.js +22 -22
- claude_mpm/dashboard/static/js/socket-client.js +183 -139
- claude_mpm/dashboard/static/js/tab-isolation-fix.js +185 -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/templates/code_simple.html +153 -0
- claude_mpm/dashboard/templates/index.html +125 -122
- claude_mpm/experimental/cli_enhancements.py +5 -7
- 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/__pycache__/__init__.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/event_handlers.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/hook_handler.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/memory_integration.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/response_tracking.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/tool_analysis.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/connection_pool.py +4 -4
- claude_mpm/hooks/claude_hooks/event_handlers.py +24 -19
- 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/__pycache__/__init__.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager_http.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/duplicate_detector.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/state_manager.cpython-313.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/subagent_processor.cpython-313.pyc +0 -0
- 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 +54 -0
- claude_mpm/hooks/failure_learning/failure_detection_hook.py +230 -0
- claude_mpm/hooks/failure_learning/fix_detection_hook.py +212 -0
- claude_mpm/hooks/failure_learning/learning_extraction_hook.py +281 -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 +179 -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/git_repository.py +198 -0
- claude_mpm/models/resume_log.py +340 -0
- claude_mpm/scripts/claude-hook-handler.sh +35 -9
- 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/scripts/start_activity_logging.py +3 -1
- claude_mpm/services/__init__.py +144 -160
- claude_mpm/services/agents/__init__.py +18 -5
- claude_mpm/services/agents/agent_builder.py +56 -18
- claude_mpm/services/agents/agent_preset_service.py +238 -0
- claude_mpm/services/agents/agent_selection_service.py +484 -0
- claude_mpm/services/agents/auto_config_manager.py +796 -0
- claude_mpm/services/agents/auto_deploy_index_parser.py +569 -0
- claude_mpm/services/agents/cache_git_manager.py +621 -0
- claude_mpm/services/agents/deployment/agent_configuration_manager.py +1 -1
- claude_mpm/services/agents/deployment/agent_deployment.py +164 -17
- claude_mpm/services/agents/deployment/agent_discovery_service.py +191 -41
- 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 +5 -7
- claude_mpm/services/agents/deployment/agent_metrics_collector.py +3 -3
- 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_restore_handler.py +1 -4
- claude_mpm/services/agents/deployment/agent_state_service.py +2 -2
- claude_mpm/services/agents/deployment/agent_template_builder.py +939 -50
- 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/agents_directory_resolver.py +101 -15
- claude_mpm/services/agents/deployment/async_agent_deployment.py +3 -2
- 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/facade/deployment_facade.py +3 -3
- 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 +249 -53
- claude_mpm/services/agents/deployment/pipeline/pipeline_executor.py +2 -2
- 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 +10 -10
- claude_mpm/services/agents/deployment/remote_agent_discovery_service.py +363 -0
- claude_mpm/services/agents/deployment/single_agent_deployer.py +2 -2
- claude_mpm/services/agents/deployment/system_instructions_deployer.py +168 -43
- claude_mpm/services/agents/deployment/validation/__init__.py +3 -1
- claude_mpm/services/agents/deployment/validation/deployment_validator.py +2 -2
- 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/git_source_manager.py +629 -0
- 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 +11 -14
- claude_mpm/services/agents/local_template_manager.py +784 -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/agents/single_tier_deployment_service.py +696 -0
- claude_mpm/services/agents/sources/__init__.py +13 -0
- claude_mpm/services/agents/sources/agent_sync_state.py +516 -0
- claude_mpm/services/agents/sources/git_source_sync_service.py +1087 -0
- claude_mpm/services/agents/startup_sync.py +239 -0
- claude_mpm/services/agents/toolchain_detector.py +474 -0
- claude_mpm/services/analysis/__init__.py +25 -0
- claude_mpm/services/analysis/postmortem_reporter.py +474 -0
- claude_mpm/services/analysis/postmortem_service.py +765 -0
- 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 +209 -13
- claude_mpm/services/command_handler_service.py +11 -5
- claude_mpm/services/core/__init__.py +33 -1
- claude_mpm/services/core/base.py +31 -11
- claude_mpm/services/core/interfaces/__init__.py +88 -3
- claude_mpm/services/core/interfaces/agent.py +184 -0
- claude_mpm/services/core/interfaces/health.py +169 -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 +70 -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 +8 -2
- claude_mpm/services/diagnostics/checks/agent_check.py +30 -34
- claude_mpm/services/diagnostics/checks/agent_sources_check.py +577 -0
- 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 +21 -21
- claude_mpm/services/diagnostics/checks/mcp_check.py +57 -44
- claude_mpm/services/diagnostics/checks/mcp_services_check.py +1058 -0
- claude_mpm/services/diagnostics/checks/monitor_check.py +24 -24
- claude_mpm/services/diagnostics/checks/skill_sources_check.py +587 -0
- claude_mpm/services/diagnostics/checks/startup_log_check.py +14 -11
- claude_mpm/services/diagnostics/diagnostic_runner.py +31 -13
- claude_mpm/services/diagnostics/doctor_reporter.py +305 -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 +11 -7
- 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/consumers/logging.py +1 -2
- 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/git/__init__.py +21 -0
- claude_mpm/services/git/git_operations_service.py +494 -0
- claude_mpm/services/github/__init__.py +21 -0
- claude_mpm/services/github/github_cli_service.py +397 -0
- 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 +2 -6
- claude_mpm/services/infrastructure/monitoring/aggregator.py +13 -18
- 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/instructions/__init__.py +9 -0
- claude_mpm/services/instructions/instruction_cache_service.py +374 -0
- claude_mpm/services/local_ops/__init__.py +155 -0
- claude_mpm/services/local_ops/crash_detector.py +257 -0
- claude_mpm/services/local_ops/health_checks/__init__.py +26 -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 +427 -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 +1542 -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 +24 -5
- 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 +591 -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 +5 -10
- claude_mpm/services/mcp_gateway/server/stdio_server.py +9 -17
- 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 +555 -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 +732 -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 +452 -0
- claude_mpm/services/model/ollama_provider.py +415 -0
- claude_mpm/services/monitor/__init__.py +20 -0
- claude_mpm/services/monitor/daemon.py +691 -0
- claude_mpm/services/monitor/daemon_manager.py +1040 -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 +3 -3
- claude_mpm/services/pr/__init__.py +14 -0
- claude_mpm/services/pr/pr_template_service.py +329 -0
- 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 +554 -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 +583 -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 +17 -3
- claude_mpm/services/self_upgrade_service.py +500 -0
- claude_mpm/services/session_management_service.py +23 -9
- 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/skills/__init__.py +18 -0
- claude_mpm/services/skills/git_skill_source_manager.py +1169 -0
- claude_mpm/services/skills/skill_discovery_service.py +568 -0
- claude_mpm/services/skills_config.py +547 -0
- claude_mpm/services/skills_deployer.py +955 -0
- 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 +22 -41
- 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 +9 -9
- 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 +142 -8
- claude_mpm/services/socketio/server/eventbus_integration.py +20 -14
- claude_mpm/services/socketio/server/main.py +24 -24
- 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 +3 -5
- 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 +900 -0
- claude_mpm/services/unified/analyzer_strategies/security_analyzer.py +745 -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 +471 -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 +466 -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 +14 -8
- claude_mpm/services/version_control/git_operations.py +26 -24
- claude_mpm/services/version_control/semantic_versioning.py +14 -14
- claude_mpm/services/version_control/version_parser.py +14 -11
- claude_mpm/services/version_service.py +104 -1
- claude_mpm/services/visualization/__init__.py +1 -5
- claude_mpm/services/visualization/mermaid_generator.py +2 -3
- 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/database-migration.md +199 -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/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/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/refactoring-patterns.md +180 -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/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/scripts/with_server.py +129 -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 +347 -0
- claude_mpm/skills/skills_service.py +739 -0
- claude_mpm/storage/state_storage.py +31 -31
- claude_mpm/templates/questions/__init__.py +38 -0
- claude_mpm/templates/questions/base.py +193 -0
- claude_mpm/templates/questions/pr_strategy.py +311 -0
- claude_mpm/templates/questions/project_init.py +385 -0
- claude_mpm/templates/questions/ticket_mgmt.py +394 -0
- claude_mpm/tools/__main__.py +9 -9
- 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 +184 -36
- claude_mpm/utils/agent_filters.py +288 -0
- 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 +5 -3
- 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/gitignore.py +241 -0
- claude_mpm/utils/log_cleanup.py +627 -0
- claude_mpm/utils/migration.py +372 -0
- claude_mpm/utils/path_operations.py +7 -4
- claude_mpm/utils/progress.py +387 -0
- claude_mpm/utils/robust_installer.py +131 -24
- claude_mpm/utils/session_logging.py +2 -2
- claude_mpm/utils/structured_questions.py +619 -0
- 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-5.0.9.dist-info/METADATA +1028 -0
- claude_mpm-5.0.9.dist-info/RECORD +864 -0
- {claude_mpm-4.1.26.dist-info → claude_mpm-5.0.9.dist-info}/entry_points.txt +1 -0
- claude_mpm/agents/INSTRUCTIONS.md +0 -261
- claude_mpm/agents/templates/.claude-mpm/memories/README.md +0 -17
- claude_mpm/agents/templates/.claude-mpm/memories/engineer_memories.md +0 -3
- claude_mpm/agents/templates/agent-manager.json +0 -270
- claude_mpm/agents/templates/agent-manager.md +0 -619
- claude_mpm/agents/templates/agentic_coder_optimizer.json +0 -222
- claude_mpm/agents/templates/api_qa.json +0 -171
- claude_mpm/agents/templates/code_analyzer.json +0 -95
- claude_mpm/agents/templates/data_engineer.json +0 -152
- claude_mpm/agents/templates/documentation.json +0 -175
- claude_mpm/agents/templates/engineer.json +0 -176
- claude_mpm/agents/templates/imagemagick.json +0 -261
- claude_mpm/agents/templates/logs/prompts/agent_engineer_20250826_014258_728.md +0 -39
- claude_mpm/agents/templates/memory_manager.json +0 -155
- claude_mpm/agents/templates/ops.json +0 -175
- claude_mpm/agents/templates/project_organizer.json +0 -130
- claude_mpm/agents/templates/qa.json +0 -223
- claude_mpm/agents/templates/refactoring_engineer.json +0 -266
- claude_mpm/agents/templates/research.json +0 -163
- claude_mpm/agents/templates/security.json +0 -153
- claude_mpm/agents/templates/ticketing.json +0 -169
- claude_mpm/agents/templates/vercel_ops_agent.json +0 -281
- claude_mpm/agents/templates/version_control.json +0 -147
- claude_mpm/agents/templates/web_qa.json +0 -254
- claude_mpm/agents/templates/web_ui.json +0 -176
- 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/commands/mpm-agents.md +0 -12
- claude_mpm/commands/mpm-config.md +0 -18
- claude_mpm/commands/mpm-tickets.md +0 -102
- claude_mpm/dashboard/.claude-mpm/socketio-instances.json +0 -1
- claude_mpm/dashboard/static/built/components/activity-tree.js +0 -2
- claude_mpm/dashboard/static/built/components/agent-inference.js +0 -2
- claude_mpm/dashboard/static/built/components/code-tree.js +0 -2
- claude_mpm/dashboard/static/built/components/code-viewer.js +0 -2
- claude_mpm/dashboard/static/built/components/event-processor.js +0 -2
- claude_mpm/dashboard/static/built/components/event-viewer.js +0 -2
- claude_mpm/dashboard/static/built/components/export-manager.js +0 -2
- claude_mpm/dashboard/static/built/components/file-tool-tracker.js +0 -2
- claude_mpm/dashboard/static/built/components/hud-library-loader.js +0 -2
- claude_mpm/dashboard/static/built/components/hud-manager.js +0 -2
- claude_mpm/dashboard/static/built/components/hud-visualizer.js +0 -2
- claude_mpm/dashboard/static/built/components/module-viewer.js +0 -2
- claude_mpm/dashboard/static/built/components/session-manager.js +0 -2
- claude_mpm/dashboard/static/built/components/socket-manager.js +0 -2
- claude_mpm/dashboard/static/built/components/ui-state-manager.js +0 -2
- claude_mpm/dashboard/static/built/components/unified-data-viewer.js +0 -2
- claude_mpm/dashboard/static/built/components/working-directory.js +0 -2
- claude_mpm/dashboard/static/built/dashboard.js +0 -2
- claude_mpm/dashboard/static/built/socket-client.js +0 -2
- claude_mpm/dashboard/static/css/code-tree.css +0 -1408
- claude_mpm/dashboard/static/dist/components/activity-tree.js +0 -2
- claude_mpm/dashboard/static/dist/components/agent-inference.js +0 -2
- claude_mpm/dashboard/static/dist/components/code-tree.js +0 -2
- claude_mpm/dashboard/static/dist/components/code-viewer.js +0 -2
- claude_mpm/dashboard/static/dist/components/event-processor.js +0 -2
- claude_mpm/dashboard/static/dist/components/event-viewer.js +0 -2
- claude_mpm/dashboard/static/dist/components/export-manager.js +0 -2
- claude_mpm/dashboard/static/dist/components/file-tool-tracker.js +0 -2
- claude_mpm/dashboard/static/dist/components/hud-library-loader.js +0 -2
- claude_mpm/dashboard/static/dist/components/hud-manager.js +0 -2
- claude_mpm/dashboard/static/dist/components/hud-visualizer.js +0 -2
- claude_mpm/dashboard/static/dist/components/module-viewer.js +0 -2
- claude_mpm/dashboard/static/dist/components/session-manager.js +0 -2
- claude_mpm/dashboard/static/dist/components/socket-manager.js +0 -2
- claude_mpm/dashboard/static/dist/components/ui-state-manager.js +0 -2
- claude_mpm/dashboard/static/dist/components/unified-data-viewer.js +0 -2
- claude_mpm/dashboard/static/dist/components/working-directory.js +0 -2
- claude_mpm/dashboard/static/dist/dashboard.js +0 -2
- claude_mpm/dashboard/static/dist/socket-client.js +0 -2
- 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-5.0.9.dist-info}/WHEEL +0 -0
- {claude_mpm-4.1.26.dist-info → claude_mpm-5.0.9.dist-info}/licenses/LICENSE +0 -0
- {claude_mpm-4.1.26.dist-info → claude_mpm-5.0.9.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,387 @@
|
|
|
1
|
+
"""ASCII Progress Bar Utility for Git Operations.
|
|
2
|
+
|
|
3
|
+
WHY: Provides visual feedback during long-running operations like agent/skill downloads
|
|
4
|
+
from Git sources. Enhances user experience with real-time progress indicators.
|
|
5
|
+
|
|
6
|
+
DESIGN DECISION: Terminal-aware progress bar with graceful degradation
|
|
7
|
+
|
|
8
|
+
Rationale: Use sys.stdout for line overwriting with \r to create animated progress bars.
|
|
9
|
+
Detect TTY environments to avoid breaking non-interactive terminals (CI/CD, pipes).
|
|
10
|
+
ASCII-based to ensure compatibility across all terminal types.
|
|
11
|
+
|
|
12
|
+
Trade-offs:
|
|
13
|
+
- Performance: Progress updates are throttled to avoid output flooding
|
|
14
|
+
- Compatibility: Works in both TTY and non-TTY modes (graceful degradation)
|
|
15
|
+
- Simplicity: Pure Python, no external dependencies (tqdm would be overkill)
|
|
16
|
+
|
|
17
|
+
Extension Points: Can be extended to support multi-line progress (parallel downloads),
|
|
18
|
+
nested progress bars, or integration with logging frameworks.
|
|
19
|
+
|
|
20
|
+
Performance:
|
|
21
|
+
- Time Complexity: O(1) for each update operation
|
|
22
|
+
- Space Complexity: O(1) - no state accumulation
|
|
23
|
+
- Expected Performance: <1ms per update, negligible overhead
|
|
24
|
+
|
|
25
|
+
Example Usage:
|
|
26
|
+
>>> with ProgressBar(total=100, prefix="Downloading") as pb:
|
|
27
|
+
... for i in range(100):
|
|
28
|
+
... time.sleep(0.01)
|
|
29
|
+
... pb.update(i + 1)
|
|
30
|
+
... # Progress bar updates automatically
|
|
31
|
+
>>> # Automatically prints completion message and newline
|
|
32
|
+
"""
|
|
33
|
+
|
|
34
|
+
import os
|
|
35
|
+
import sys
|
|
36
|
+
import time
|
|
37
|
+
from typing import Any, Optional
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
class ProgressBar:
|
|
41
|
+
"""ASCII progress bar for terminal output.
|
|
42
|
+
|
|
43
|
+
Features:
|
|
44
|
+
- Animated progress bar with percentage
|
|
45
|
+
- Current/total item counter
|
|
46
|
+
- Customizable prefix message
|
|
47
|
+
- TTY detection for safe degradation
|
|
48
|
+
- Automatic terminal width detection
|
|
49
|
+
- Context manager support for cleanup
|
|
50
|
+
|
|
51
|
+
Design Decision: Use █ (U+2588) for filled sections and ░ (U+2591) for empty
|
|
52
|
+
|
|
53
|
+
Rationale: These Unicode block characters provide clear visual progress while
|
|
54
|
+
maintaining compatibility with most modern terminals. Alternative ASCII chars
|
|
55
|
+
like '#' and '-' were rejected for being less visually appealing.
|
|
56
|
+
|
|
57
|
+
Compatibility: Gracefully degrades to simple logging in non-TTY environments
|
|
58
|
+
(CI/CD, redirected output, etc.)
|
|
59
|
+
"""
|
|
60
|
+
|
|
61
|
+
def __init__(
|
|
62
|
+
self,
|
|
63
|
+
total: int,
|
|
64
|
+
prefix: str = "Progress",
|
|
65
|
+
bar_width: int = 20,
|
|
66
|
+
show_percentage: bool = True,
|
|
67
|
+
show_counter: bool = True,
|
|
68
|
+
enabled: Optional[bool] = None,
|
|
69
|
+
):
|
|
70
|
+
"""Initialize progress bar.
|
|
71
|
+
|
|
72
|
+
Args:
|
|
73
|
+
total: Total number of items to process
|
|
74
|
+
prefix: Message to display before progress bar (e.g., "Downloading")
|
|
75
|
+
bar_width: Width of the progress bar in characters (default: 20)
|
|
76
|
+
show_percentage: Show percentage complete (default: True)
|
|
77
|
+
show_counter: Show current/total counter (default: True)
|
|
78
|
+
enabled: Override TTY detection (None = auto-detect, True = always show, False = disable)
|
|
79
|
+
|
|
80
|
+
Example:
|
|
81
|
+
>>> pb = ProgressBar(100, prefix="Syncing agents", bar_width=30)
|
|
82
|
+
>>> pb.update(50, message="agent.md")
|
|
83
|
+
>>> # Displays: Syncing agents [███████████████░░░░░░░░░░░░░░░] 50% (50/100) agent.md
|
|
84
|
+
"""
|
|
85
|
+
self.total = total
|
|
86
|
+
self.prefix = prefix
|
|
87
|
+
self.bar_width = bar_width
|
|
88
|
+
self.show_percentage = show_percentage
|
|
89
|
+
self.show_counter = show_counter
|
|
90
|
+
self.current = 0
|
|
91
|
+
self.start_time = time.time()
|
|
92
|
+
self.last_update_time = 0.0
|
|
93
|
+
self.update_throttle = (
|
|
94
|
+
0.1 # Minimum seconds between updates (throttle to 10 Hz)
|
|
95
|
+
)
|
|
96
|
+
|
|
97
|
+
# Auto-detect TTY unless explicitly overridden
|
|
98
|
+
if enabled is None:
|
|
99
|
+
self.enabled = self._is_tty()
|
|
100
|
+
else:
|
|
101
|
+
self.enabled = enabled
|
|
102
|
+
|
|
103
|
+
# Terminal width detection for preventing overflow
|
|
104
|
+
self.terminal_width = self._get_terminal_width()
|
|
105
|
+
|
|
106
|
+
def _is_tty(self) -> bool:
|
|
107
|
+
"""Check if stdout is a TTY (interactive terminal).
|
|
108
|
+
|
|
109
|
+
Returns:
|
|
110
|
+
True if stdout is a TTY, False otherwise (e.g., piped, redirected)
|
|
111
|
+
|
|
112
|
+
Design Decision: Disable progress bars in non-TTY environments
|
|
113
|
+
|
|
114
|
+
Rationale: Progress bars use \r (carriage return) for line overwriting,
|
|
115
|
+
which appears as garbage in log files, CI/CD output, and piped commands.
|
|
116
|
+
Detecting TTY ensures clean output in all contexts.
|
|
117
|
+
|
|
118
|
+
Example:
|
|
119
|
+
$ python script.py # TTY - progress bars enabled
|
|
120
|
+
$ python script.py > log.txt # Non-TTY - simple logging
|
|
121
|
+
$ python script.py | grep foo # Non-TTY - simple logging
|
|
122
|
+
"""
|
|
123
|
+
try:
|
|
124
|
+
return sys.stdout.isatty()
|
|
125
|
+
except AttributeError:
|
|
126
|
+
# sys.stdout might not have isatty() in some environments
|
|
127
|
+
return False
|
|
128
|
+
|
|
129
|
+
def _get_terminal_width(self) -> int:
|
|
130
|
+
"""Get terminal width for preventing line overflow.
|
|
131
|
+
|
|
132
|
+
Returns:
|
|
133
|
+
Terminal width in characters (default: 80 if detection fails)
|
|
134
|
+
|
|
135
|
+
Error Handling:
|
|
136
|
+
- OSError: Returns 80 (standard terminal width)
|
|
137
|
+
- AttributeError: Returns 80 (fallback)
|
|
138
|
+
- ValueError: Returns 80 (invalid terminal size)
|
|
139
|
+
"""
|
|
140
|
+
try:
|
|
141
|
+
# Try to get terminal size from os module (Python 3.3+)
|
|
142
|
+
size = os.get_terminal_size()
|
|
143
|
+
return size.columns
|
|
144
|
+
except (OSError, AttributeError, ValueError):
|
|
145
|
+
# Fallback to standard terminal width
|
|
146
|
+
return 80
|
|
147
|
+
|
|
148
|
+
def update(self, current: int, message: str = "") -> None:
|
|
149
|
+
"""Update progress bar to current position.
|
|
150
|
+
|
|
151
|
+
Args:
|
|
152
|
+
current: Current progress value (0 to total)
|
|
153
|
+
message: Optional message to display after progress bar (e.g., filename)
|
|
154
|
+
|
|
155
|
+
Performance: Updates are throttled to 10 Hz to avoid output flooding.
|
|
156
|
+
Non-TTY mode: Logs milestone updates (0%, 25%, 50%, 75%, 100%) instead of every update.
|
|
157
|
+
|
|
158
|
+
Example:
|
|
159
|
+
>>> pb = ProgressBar(10, prefix="Downloading")
|
|
160
|
+
>>> for i in range(10):
|
|
161
|
+
... pb.update(i + 1, message=f"file_{i}.md")
|
|
162
|
+
>>> # Progress bar updates in-place, then prints completion
|
|
163
|
+
"""
|
|
164
|
+
self.current = min(current, self.total) # Clamp to total
|
|
165
|
+
|
|
166
|
+
# Throttle updates to avoid flooding terminal
|
|
167
|
+
current_time = time.time()
|
|
168
|
+
if (
|
|
169
|
+
current_time - self.last_update_time < self.update_throttle
|
|
170
|
+
and current < self.total
|
|
171
|
+
):
|
|
172
|
+
return # Skip update, too soon since last one
|
|
173
|
+
|
|
174
|
+
self.last_update_time = current_time
|
|
175
|
+
|
|
176
|
+
if not self.enabled:
|
|
177
|
+
# Non-TTY mode: Log milestone updates only
|
|
178
|
+
self._log_milestone(message)
|
|
179
|
+
return
|
|
180
|
+
|
|
181
|
+
# TTY mode: Render and display progress bar
|
|
182
|
+
self._render_progress_bar(message)
|
|
183
|
+
|
|
184
|
+
def _log_milestone(self, message: str) -> None:
|
|
185
|
+
"""Log progress at milestone percentages in non-TTY mode.
|
|
186
|
+
|
|
187
|
+
Milestones: 0%, 25%, 50%, 75%, 100%
|
|
188
|
+
|
|
189
|
+
Args:
|
|
190
|
+
message: Optional message to include in log
|
|
191
|
+
|
|
192
|
+
Design Decision: Log milestones instead of every update in non-TTY
|
|
193
|
+
|
|
194
|
+
Rationale: Avoids flooding logs with hundreds of progress lines while
|
|
195
|
+
still providing useful feedback. Rejected logging every update because
|
|
196
|
+
it creates noise in CI/CD logs and log files.
|
|
197
|
+
|
|
198
|
+
Respects show_percentage and show_counter settings for consistent output
|
|
199
|
+
across TTY and non-TTY modes.
|
|
200
|
+
"""
|
|
201
|
+
percentage = int((self.current / self.total) * 100) if self.total > 0 else 0
|
|
202
|
+
|
|
203
|
+
# Log at milestones: 0%, 25%, 50%, 75%, 100%
|
|
204
|
+
milestones = [0, 25, 50, 75, 100]
|
|
205
|
+
if percentage in milestones or self.current == self.total:
|
|
206
|
+
# Build output respecting show_percentage and show_counter settings
|
|
207
|
+
if message and not (self.show_counter or self.show_percentage):
|
|
208
|
+
# Simple format: "Prefix: message"
|
|
209
|
+
output = f"{self.prefix}: {message}"
|
|
210
|
+
else:
|
|
211
|
+
# Complex format with counter/percentage
|
|
212
|
+
parts = [self.prefix]
|
|
213
|
+
|
|
214
|
+
if self.show_counter:
|
|
215
|
+
parts.append(f"{self.current}/{self.total}")
|
|
216
|
+
|
|
217
|
+
if self.show_percentage:
|
|
218
|
+
parts.append(f"({percentage}%)")
|
|
219
|
+
|
|
220
|
+
if message:
|
|
221
|
+
parts.append(f"- {message}")
|
|
222
|
+
|
|
223
|
+
output = " ".join(parts)
|
|
224
|
+
|
|
225
|
+
print(output, flush=True)
|
|
226
|
+
|
|
227
|
+
def _render_progress_bar(self, message: str) -> None:
|
|
228
|
+
"""Render and display progress bar in TTY mode.
|
|
229
|
+
|
|
230
|
+
Args:
|
|
231
|
+
message: Optional message to display after progress bar
|
|
232
|
+
|
|
233
|
+
Output Format:
|
|
234
|
+
[Prefix] [████████░░░░░░░░░░░░] XX% (current/total) message
|
|
235
|
+
|
|
236
|
+
Design Decision: Use \r to overwrite same line for animation effect
|
|
237
|
+
|
|
238
|
+
Rationale: Creates smooth animation by updating the same line instead
|
|
239
|
+
of printing new lines. Requires TTY for proper display (hence TTY check).
|
|
240
|
+
|
|
241
|
+
Terminal Width Handling:
|
|
242
|
+
- Calculates available space based on terminal width
|
|
243
|
+
- Truncates message if output would overflow
|
|
244
|
+
- Ensures progress bar always fits on one line
|
|
245
|
+
"""
|
|
246
|
+
percentage = int((self.current / self.total) * 100) if self.total > 0 else 0
|
|
247
|
+
filled = (
|
|
248
|
+
int(self.bar_width * self.current / self.total) if self.total > 0 else 0
|
|
249
|
+
)
|
|
250
|
+
bar = "█" * filled + "░" * (self.bar_width - filled)
|
|
251
|
+
|
|
252
|
+
# Build output components
|
|
253
|
+
parts = [f"{self.prefix} [{bar}]"]
|
|
254
|
+
|
|
255
|
+
if self.show_percentage:
|
|
256
|
+
parts.append(f"{percentage}%")
|
|
257
|
+
|
|
258
|
+
if self.show_counter:
|
|
259
|
+
parts.append(f"({self.current}/{self.total})")
|
|
260
|
+
|
|
261
|
+
if message:
|
|
262
|
+
parts.append(message)
|
|
263
|
+
|
|
264
|
+
output = " ".join(parts)
|
|
265
|
+
|
|
266
|
+
# Truncate if exceeds terminal width (leave 2 chars margin)
|
|
267
|
+
max_width = self.terminal_width - 2
|
|
268
|
+
if len(output) > max_width:
|
|
269
|
+
# Truncate message part, preserve progress bar
|
|
270
|
+
truncate_at = max_width - 3 # Leave room for "..."
|
|
271
|
+
output = output[:truncate_at] + "..."
|
|
272
|
+
|
|
273
|
+
# Pad output to terminal width to clear previous longer text
|
|
274
|
+
# This prevents text artifacts when current message is shorter than previous
|
|
275
|
+
padded_output = output.ljust(max_width)
|
|
276
|
+
|
|
277
|
+
# Write to stdout with carriage return (overwrite current line)
|
|
278
|
+
sys.stdout.write(f"\r{padded_output}")
|
|
279
|
+
sys.stdout.flush()
|
|
280
|
+
|
|
281
|
+
def finish(self, message: str = "Complete") -> None:
|
|
282
|
+
"""Complete progress bar and print final message.
|
|
283
|
+
|
|
284
|
+
Args:
|
|
285
|
+
message: Final message to display (default: "Complete")
|
|
286
|
+
|
|
287
|
+
Design Decision: Print newline after completion to prevent terminal corruption
|
|
288
|
+
|
|
289
|
+
Rationale: Without newline, next shell prompt or log message would
|
|
290
|
+
overwrite the final progress bar state. Explicit finish() ensures
|
|
291
|
+
clean terminal output.
|
|
292
|
+
|
|
293
|
+
Bug Fix: Avoid duplicate completion messages in non-TTY mode by not
|
|
294
|
+
calling update() again if already at 100%. The final milestone was
|
|
295
|
+
already logged during the last update() call.
|
|
296
|
+
|
|
297
|
+
Example:
|
|
298
|
+
>>> pb = ProgressBar(100)
|
|
299
|
+
>>> pb.update(100)
|
|
300
|
+
>>> pb.finish(message="Download complete")
|
|
301
|
+
>>> # Output: [████████████████████] 100% (100/100) Download complete
|
|
302
|
+
"""
|
|
303
|
+
if self.enabled:
|
|
304
|
+
# TTY mode: Update to show final message, then add newline
|
|
305
|
+
self.update(self.total, message=message)
|
|
306
|
+
sys.stdout.write("\n")
|
|
307
|
+
sys.stdout.flush()
|
|
308
|
+
# Non-TTY mode: Only log if not already at 100%
|
|
309
|
+
# If already at 100%, _log_milestone() already printed during last update()
|
|
310
|
+
elif self.current < self.total:
|
|
311
|
+
self.update(self.total, message=message)
|
|
312
|
+
|
|
313
|
+
def __enter__(self) -> "ProgressBar":
|
|
314
|
+
"""Context manager entry.
|
|
315
|
+
|
|
316
|
+
Returns:
|
|
317
|
+
Self for use in with statements
|
|
318
|
+
|
|
319
|
+
Example:
|
|
320
|
+
>>> with ProgressBar(100, prefix="Processing") as pb:
|
|
321
|
+
... for i in range(100):
|
|
322
|
+
... pb.update(i + 1)
|
|
323
|
+
>>> # Automatically calls finish() on exit
|
|
324
|
+
"""
|
|
325
|
+
return self
|
|
326
|
+
|
|
327
|
+
def __exit__(
|
|
328
|
+
self,
|
|
329
|
+
exc_type: Optional[type],
|
|
330
|
+
exc_val: Optional[BaseException],
|
|
331
|
+
exc_tb: Optional[Any],
|
|
332
|
+
) -> None:
|
|
333
|
+
"""Context manager exit - ensures finish() is called.
|
|
334
|
+
|
|
335
|
+
Args:
|
|
336
|
+
exc_type: Exception type (if raised)
|
|
337
|
+
exc_val: Exception value (if raised)
|
|
338
|
+
exc_tb: Exception traceback (if raised)
|
|
339
|
+
|
|
340
|
+
Error Handling:
|
|
341
|
+
- Calls finish() even if exception occurred
|
|
342
|
+
- Displays "Failed" message if exception raised
|
|
343
|
+
- Re-raises exception after cleanup
|
|
344
|
+
|
|
345
|
+
Returns:
|
|
346
|
+
None (does not suppress exceptions)
|
|
347
|
+
"""
|
|
348
|
+
if exc_type is not None:
|
|
349
|
+
# Exception occurred - finish with error message
|
|
350
|
+
self.finish(message="Failed")
|
|
351
|
+
else:
|
|
352
|
+
# Normal completion
|
|
353
|
+
self.finish()
|
|
354
|
+
|
|
355
|
+
# Don't suppress exceptions (returning None is equivalent to returning False)
|
|
356
|
+
|
|
357
|
+
|
|
358
|
+
# Convenience function for simple use cases
|
|
359
|
+
def create_progress_bar(
|
|
360
|
+
total: int,
|
|
361
|
+
prefix: str = "Progress",
|
|
362
|
+
enabled: Optional[bool] = None,
|
|
363
|
+
) -> ProgressBar:
|
|
364
|
+
"""Create a progress bar with sensible defaults.
|
|
365
|
+
|
|
366
|
+
Args:
|
|
367
|
+
total: Total number of items
|
|
368
|
+
prefix: Progress message
|
|
369
|
+
enabled: Override TTY detection (None = auto)
|
|
370
|
+
|
|
371
|
+
Returns:
|
|
372
|
+
Configured ProgressBar instance
|
|
373
|
+
|
|
374
|
+
Example:
|
|
375
|
+
>>> pb = create_progress_bar(100, "Downloading agents")
|
|
376
|
+
>>> for i in range(100):
|
|
377
|
+
... pb.update(i + 1, message=f"agent_{i}.md")
|
|
378
|
+
>>> pb.finish()
|
|
379
|
+
"""
|
|
380
|
+
return ProgressBar(
|
|
381
|
+
total=total,
|
|
382
|
+
prefix=prefix,
|
|
383
|
+
bar_width=20,
|
|
384
|
+
show_percentage=True,
|
|
385
|
+
show_counter=True,
|
|
386
|
+
enabled=enabled,
|
|
387
|
+
)
|
|
@@ -9,6 +9,7 @@ DESIGN DECISION: We implement exponential backoff for retries and provide
|
|
|
9
9
|
multiple installation strategies (pip, conda, source) to maximize success rate.
|
|
10
10
|
"""
|
|
11
11
|
|
|
12
|
+
import os
|
|
12
13
|
import re
|
|
13
14
|
import subprocess
|
|
14
15
|
import sys
|
|
@@ -80,6 +81,7 @@ class RobustPackageInstaller:
|
|
|
80
81
|
self.use_cache = use_cache
|
|
81
82
|
self.attempts: List[InstallAttempt] = []
|
|
82
83
|
self.success_cache: Dict[str, bool] = {}
|
|
84
|
+
self.in_virtualenv = self._check_virtualenv()
|
|
83
85
|
self.is_pep668_managed = self._check_pep668_managed()
|
|
84
86
|
self.pep668_warning_shown = False
|
|
85
87
|
|
|
@@ -100,10 +102,9 @@ class RobustPackageInstaller:
|
|
|
100
102
|
Tuple of (success, error_message)
|
|
101
103
|
"""
|
|
102
104
|
# Check success cache first
|
|
103
|
-
if
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
return True, None
|
|
105
|
+
if self.success_cache.get(package_spec):
|
|
106
|
+
logger.debug(f"Package {package_spec} already successfully installed")
|
|
107
|
+
return True, None
|
|
107
108
|
|
|
108
109
|
# Default strategy order
|
|
109
110
|
if strategies is None:
|
|
@@ -202,6 +203,33 @@ class RobustPackageInstaller:
|
|
|
202
203
|
except Exception as e:
|
|
203
204
|
return False, f"Unexpected error: {e!s}"
|
|
204
205
|
|
|
206
|
+
def _check_virtualenv(self) -> bool:
|
|
207
|
+
"""
|
|
208
|
+
Check if running inside a virtual environment.
|
|
209
|
+
|
|
210
|
+
WHY: Virtual environments are already isolated and don't need
|
|
211
|
+
--user or --break-system-packages flags. In fact, using --user
|
|
212
|
+
in a virtualenv causes errors.
|
|
213
|
+
|
|
214
|
+
Returns:
|
|
215
|
+
True if in a virtualenv, False otherwise
|
|
216
|
+
"""
|
|
217
|
+
# Multiple ways to detect virtualenv
|
|
218
|
+
return (
|
|
219
|
+
(
|
|
220
|
+
# venv creates sys.base_prefix
|
|
221
|
+
hasattr(sys, "base_prefix") and sys.base_prefix != sys.prefix
|
|
222
|
+
)
|
|
223
|
+
or (
|
|
224
|
+
# virtualenv creates sys.real_prefix
|
|
225
|
+
hasattr(sys, "real_prefix")
|
|
226
|
+
)
|
|
227
|
+
or (
|
|
228
|
+
# VIRTUAL_ENV environment variable
|
|
229
|
+
os.environ.get("VIRTUAL_ENV") is not None
|
|
230
|
+
)
|
|
231
|
+
)
|
|
232
|
+
|
|
205
233
|
def _check_pep668_managed(self) -> bool:
|
|
206
234
|
"""
|
|
207
235
|
Check if Python environment is PEP 668 externally managed.
|
|
@@ -212,6 +240,11 @@ class RobustPackageInstaller:
|
|
|
212
240
|
Returns:
|
|
213
241
|
True if PEP 668 managed, False otherwise
|
|
214
242
|
"""
|
|
243
|
+
# If in virtualenv, PEP 668 doesn't apply
|
|
244
|
+
if self.in_virtualenv:
|
|
245
|
+
logger.debug("Running in virtualenv, PEP 668 restrictions don't apply")
|
|
246
|
+
return False
|
|
247
|
+
|
|
215
248
|
# Check for EXTERNALLY-MANAGED marker file
|
|
216
249
|
stdlib_path = sysconfig.get_path("stdlib")
|
|
217
250
|
marker_file = Path(stdlib_path) / "EXTERNALLY-MANAGED"
|
|
@@ -241,7 +274,7 @@ class RobustPackageInstaller:
|
|
|
241
274
|
"Your Python installation is marked as externally managed (PEP 668).\n"
|
|
242
275
|
"This typically means you're using a system Python managed by Homebrew, apt, etc.\n"
|
|
243
276
|
"\n"
|
|
244
|
-
"Installing packages with --break-system-packages
|
|
277
|
+
"Installing packages with --break-system-packages flag...\n"
|
|
245
278
|
"\n"
|
|
246
279
|
"RECOMMENDED: Use a virtual environment instead:\n"
|
|
247
280
|
" python -m venv .venv\n"
|
|
@@ -256,8 +289,10 @@ class RobustPackageInstaller:
|
|
|
256
289
|
"""
|
|
257
290
|
Build the installation command for a given strategy.
|
|
258
291
|
|
|
259
|
-
WHY:
|
|
260
|
-
|
|
292
|
+
WHY: Proper environment detection ensures we use the right pip flags:
|
|
293
|
+
- Virtualenv: No special flags needed (already isolated)
|
|
294
|
+
- PEP 668 system: Use --break-system-packages only
|
|
295
|
+
- Normal system: Use --user for user-local install
|
|
261
296
|
|
|
262
297
|
Args:
|
|
263
298
|
package_spec: Package specification
|
|
@@ -268,14 +303,19 @@ class RobustPackageInstaller:
|
|
|
268
303
|
"""
|
|
269
304
|
base_cmd = [sys.executable, "-m", "pip", "install"]
|
|
270
305
|
|
|
271
|
-
#
|
|
272
|
-
if self.
|
|
306
|
+
# Determine appropriate flags based on environment
|
|
307
|
+
if self.in_virtualenv:
|
|
308
|
+
# In virtualenv - no special flags needed
|
|
309
|
+
logger.debug("Installing in virtualenv (no special flags)")
|
|
310
|
+
elif self.is_pep668_managed:
|
|
311
|
+
# System Python with PEP 668 - use --break-system-packages only
|
|
273
312
|
self._show_pep668_warning()
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
)
|
|
313
|
+
base_cmd.append("--break-system-packages")
|
|
314
|
+
logger.debug("Added --break-system-packages flag for PEP 668 environment")
|
|
315
|
+
else:
|
|
316
|
+
# Normal system Python - use --user for user-local install
|
|
317
|
+
base_cmd.append("--user")
|
|
318
|
+
logger.debug("Added --user flag for user-local installation")
|
|
279
319
|
|
|
280
320
|
# Add cache control
|
|
281
321
|
if not self.use_cache:
|
|
@@ -340,6 +380,12 @@ class RobustPackageInstaller:
|
|
|
340
380
|
"tree-sitter-java",
|
|
341
381
|
"tree-sitter-cpp",
|
|
342
382
|
"tree-sitter-c",
|
|
383
|
+
# Database packages that require compilation
|
|
384
|
+
"mysqlclient", # Requires MySQL development headers
|
|
385
|
+
"psycopg2", # Requires PostgreSQL development headers
|
|
386
|
+
"cx_oracle", # Requires Oracle client libraries
|
|
387
|
+
"pycairo", # Requires Cairo development headers
|
|
388
|
+
"lxml", # Requires libxml2 development headers
|
|
343
389
|
}
|
|
344
390
|
|
|
345
391
|
return package_name.lower() in special_packages
|
|
@@ -363,6 +409,35 @@ class RobustPackageInstaller:
|
|
|
363
409
|
InstallStrategy.PIP_NO_DEPS,
|
|
364
410
|
]
|
|
365
411
|
|
|
412
|
+
# Database packages that require compilation
|
|
413
|
+
compilation_packages = {
|
|
414
|
+
"mysqlclient": ["pymysql"], # Pure Python alternative
|
|
415
|
+
"psycopg2": ["psycopg2-binary"], # Binary wheel alternative
|
|
416
|
+
"cx_oracle": [], # No good alternative
|
|
417
|
+
"pycairo": [], # No good alternative
|
|
418
|
+
"lxml": [], # Usually works with binary wheels
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
package_lower = package_name.lower()
|
|
422
|
+
if package_lower in compilation_packages:
|
|
423
|
+
# Try normal install first, but with limited retries
|
|
424
|
+
strategies = [InstallStrategy.PIP]
|
|
425
|
+
|
|
426
|
+
# If there are alternatives, log suggestion
|
|
427
|
+
alternatives = compilation_packages[package_lower]
|
|
428
|
+
if alternatives:
|
|
429
|
+
logger.info(
|
|
430
|
+
f"Package {package_name} requires compilation. "
|
|
431
|
+
f"Consider using alternative: {', '.join(alternatives)}"
|
|
432
|
+
)
|
|
433
|
+
else:
|
|
434
|
+
logger.warning(
|
|
435
|
+
f"Package {package_name} requires compilation and may fail on systems "
|
|
436
|
+
f"without development headers installed."
|
|
437
|
+
)
|
|
438
|
+
|
|
439
|
+
return strategies
|
|
440
|
+
|
|
366
441
|
return [InstallStrategy.PIP, InstallStrategy.PIP_UPGRADE]
|
|
367
442
|
|
|
368
443
|
def _verify_installation(self, package_spec: str) -> bool:
|
|
@@ -459,6 +534,27 @@ class RobustPackageInstaller:
|
|
|
459
534
|
if not stderr:
|
|
460
535
|
return "Unknown error"
|
|
461
536
|
|
|
537
|
+
# Check for specific compilation errors
|
|
538
|
+
stderr_lower = stderr.lower()
|
|
539
|
+
|
|
540
|
+
if "mysql_config" in stderr_lower or "mysql.h" in stderr_lower:
|
|
541
|
+
return (
|
|
542
|
+
"mysqlclient compilation failed (missing MySQL development headers). "
|
|
543
|
+
"Use 'pip install pymysql' for a pure Python alternative that doesn't require compilation."
|
|
544
|
+
)
|
|
545
|
+
|
|
546
|
+
if "pg_config" in stderr_lower or "libpq-fe.h" in stderr_lower:
|
|
547
|
+
return (
|
|
548
|
+
"psycopg2 compilation failed (missing PostgreSQL development headers). "
|
|
549
|
+
"Use 'pip install psycopg2-binary' for a pre-compiled version."
|
|
550
|
+
)
|
|
551
|
+
|
|
552
|
+
if "oracle" in stderr_lower and "client" in stderr_lower:
|
|
553
|
+
return (
|
|
554
|
+
"cx_Oracle compilation failed (missing Oracle client libraries). "
|
|
555
|
+
"Use 'pip install oracledb' for a pure Python alternative."
|
|
556
|
+
)
|
|
557
|
+
|
|
462
558
|
# Look for ERROR: lines
|
|
463
559
|
error_lines = []
|
|
464
560
|
for line in stderr.splitlines():
|
|
@@ -557,11 +653,16 @@ class RobustPackageInstaller:
|
|
|
557
653
|
try:
|
|
558
654
|
cmd = [sys.executable, "-m", "pip", "install"]
|
|
559
655
|
|
|
560
|
-
# Add
|
|
561
|
-
if self.
|
|
656
|
+
# Add appropriate flags based on environment
|
|
657
|
+
if self.in_virtualenv:
|
|
658
|
+
logger.debug("Batch install in virtualenv (no special flags)")
|
|
659
|
+
elif self.is_pep668_managed:
|
|
562
660
|
self._show_pep668_warning()
|
|
563
|
-
cmd.
|
|
564
|
-
logger.debug("Added
|
|
661
|
+
cmd.append("--break-system-packages")
|
|
662
|
+
logger.debug("Added --break-system-packages for batch installation")
|
|
663
|
+
else:
|
|
664
|
+
cmd.append("--user")
|
|
665
|
+
logger.debug("Added --user flag for batch installation")
|
|
565
666
|
|
|
566
667
|
cmd.extend(packages)
|
|
567
668
|
|
|
@@ -599,12 +700,18 @@ class RobustPackageInstaller:
|
|
|
599
700
|
lines.append("INSTALLATION REPORT")
|
|
600
701
|
lines.append("=" * 60)
|
|
601
702
|
|
|
602
|
-
# Add
|
|
603
|
-
|
|
604
|
-
|
|
703
|
+
# Add environment status
|
|
704
|
+
lines.append("")
|
|
705
|
+
if self.in_virtualenv:
|
|
706
|
+
lines.append("✓ Environment: Virtual Environment (isolated)")
|
|
707
|
+
lines.append(" No special pip flags needed")
|
|
708
|
+
elif self.is_pep668_managed:
|
|
605
709
|
lines.append("⚠️ PEP 668 Managed Environment: YES")
|
|
606
|
-
lines.append(" Installations used --break-system-packages
|
|
710
|
+
lines.append(" Installations used --break-system-packages flag")
|
|
607
711
|
lines.append(" Consider using a virtual environment for better isolation")
|
|
712
|
+
else:
|
|
713
|
+
lines.append("Environment: System Python")
|
|
714
|
+
lines.append(" Installations used --user flag for user-local install")
|
|
608
715
|
|
|
609
716
|
# Summary
|
|
610
717
|
total_attempts = len(self.attempts)
|
|
@@ -617,7 +724,7 @@ class RobustPackageInstaller:
|
|
|
617
724
|
lines.append("")
|
|
618
725
|
|
|
619
726
|
# Details by package
|
|
620
|
-
packages = {}
|
|
727
|
+
packages: Dict[str, List[InstallAttempt]] = {}
|
|
621
728
|
for attempt in self.attempts:
|
|
622
729
|
if attempt.package not in packages:
|
|
623
730
|
packages[attempt.package] = []
|
|
@@ -659,7 +766,7 @@ def install_with_retry(
|
|
|
659
766
|
logging.getLogger().setLevel(logging.DEBUG)
|
|
660
767
|
|
|
661
768
|
installer = RobustPackageInstaller(max_retries=max_retries)
|
|
662
|
-
|
|
769
|
+
_successful, failed, errors = installer.install_packages(packages)
|
|
663
770
|
|
|
664
771
|
if verbose:
|
|
665
772
|
print(installer.get_report())
|
|
@@ -6,13 +6,13 @@ Session Logging Utilities
|
|
|
6
6
|
Convenience functions for session-based response logging.
|
|
7
7
|
"""
|
|
8
8
|
|
|
9
|
-
import logging
|
|
10
9
|
import os
|
|
11
10
|
from typing import Any, Dict, Optional
|
|
12
11
|
|
|
12
|
+
from claude_mpm.core.logging_utils import get_logger
|
|
13
13
|
from claude_mpm.services.claude_session_logger import get_session_logger
|
|
14
14
|
|
|
15
|
-
logger =
|
|
15
|
+
logger = get_logger(__name__)
|
|
16
16
|
|
|
17
17
|
|
|
18
18
|
def is_session_logging_enabled() -> bool:
|