claude-mpm 3.4.10__py3-none-any.whl → 5.4.85__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 -0
- claude_mpm/VERSION +1 -0
- claude_mpm/__init__.py +50 -12
- claude_mpm/__main__.py +7 -2
- claude_mpm/agents/BASE_AGENT.md +164 -0
- claude_mpm/agents/BASE_ENGINEER.md +658 -0
- claude_mpm/agents/CLAUDE_MPM_FOUNDERS_OUTPUT_STYLE.md +405 -0
- claude_mpm/agents/CLAUDE_MPM_OUTPUT_STYLE.md +112 -0
- claude_mpm/agents/CLAUDE_MPM_TEACHER_OUTPUT_STYLE.md +186 -0
- claude_mpm/agents/MEMORY.md +72 -0
- claude_mpm/agents/PM_INSTRUCTIONS.md +1429 -0
- claude_mpm/agents/WORKFLOW.md +111 -0
- claude_mpm/agents/__init__.py +92 -80
- claude_mpm/agents/agent-template.yaml +83 -0
- claude_mpm/agents/agent_loader.py +560 -745
- claude_mpm/agents/agent_loader_integration.py +53 -55
- claude_mpm/agents/agents_metadata.py +186 -27
- claude_mpm/agents/async_agent_loader.py +436 -0
- claude_mpm/agents/base_agent.json +8 -4
- claude_mpm/agents/frontmatter_validator.py +754 -0
- claude_mpm/agents/system_agent_config.py +222 -155
- claude_mpm/agents/templates/README.md +465 -0
- claude_mpm/agents/templates/__init__.py +17 -13
- claude_mpm/agents/templates/circuit-breakers.md +1391 -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 +94 -128
- claude_mpm/cli/__main__.py +33 -0
- claude_mpm/cli/chrome_devtools_installer.py +175 -0
- claude_mpm/cli/commands/__init__.py +36 -12
- claude_mpm/cli/commands/agent_manager.py +1403 -0
- claude_mpm/cli/commands/agent_source.py +774 -0
- claude_mpm/cli/commands/agent_state_manager.py +335 -0
- claude_mpm/cli/commands/agents.py +2501 -168
- claude_mpm/cli/commands/agents_cleanup.py +210 -0
- claude_mpm/cli/commands/agents_discover.py +338 -0
- claude_mpm/cli/commands/agents_reconcile.py +197 -0
- claude_mpm/cli/commands/aggregate.py +540 -0
- claude_mpm/cli/commands/analyze.py +553 -0
- claude_mpm/cli/commands/analyze_code.py +528 -0
- claude_mpm/cli/commands/auto_configure.py +1053 -0
- claude_mpm/cli/commands/cleanup.py +588 -0
- claude_mpm/cli/commands/cleanup_orphaned_agents.py +150 -0
- claude_mpm/cli/commands/config.py +586 -0
- claude_mpm/cli/commands/configure.py +3253 -0
- claude_mpm/cli/commands/configure_agent_display.py +282 -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 +286 -0
- claude_mpm/cli/commands/debug.py +1386 -0
- claude_mpm/cli/commands/doctor.py +243 -0
- claude_mpm/cli/commands/hook_errors.py +277 -0
- claude_mpm/cli/commands/info.py +195 -74
- claude_mpm/cli/commands/local_deploy.py +534 -0
- claude_mpm/cli/commands/mcp.py +205 -0
- claude_mpm/cli/commands/mcp_command_router.py +161 -0
- claude_mpm/cli/commands/mcp_config.py +154 -0
- claude_mpm/cli/commands/mcp_config_commands.py +20 -0
- claude_mpm/cli/commands/mcp_external_commands.py +249 -0
- claude_mpm/cli/commands/mcp_install_commands.py +346 -0
- claude_mpm/cli/commands/mcp_pipx_config.py +208 -0
- claude_mpm/cli/commands/mcp_server_commands.py +155 -0
- claude_mpm/cli/commands/mcp_setup_external.py +868 -0
- claude_mpm/cli/commands/mcp_tool_commands.py +34 -0
- claude_mpm/cli/commands/memory.py +585 -846
- claude_mpm/cli/commands/monitor.py +228 -310
- claude_mpm/cli/commands/mpm_init/__init__.py +73 -0
- claude_mpm/cli/commands/mpm_init/core.py +759 -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/knowledge_extractor.py +481 -0
- claude_mpm/cli/commands/mpm_init/modes.py +397 -0
- claude_mpm/cli/commands/mpm_init/prompts.py +722 -0
- claude_mpm/cli/commands/mpm_init_cli.py +396 -0
- claude_mpm/cli/commands/mpm_init_handler.py +195 -0
- claude_mpm/cli/commands/postmortem.py +401 -0
- claude_mpm/cli/commands/profile.py +276 -0
- claude_mpm/cli/commands/run.py +910 -488
- claude_mpm/cli/commands/search.py +458 -0
- claude_mpm/cli/commands/skill_source.py +694 -0
- claude_mpm/cli/commands/skills.py +1398 -0
- claude_mpm/cli/commands/summarize.py +413 -0
- claude_mpm/cli/commands/tickets.py +536 -53
- 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 +298 -0
- claude_mpm/cli/helpers.py +105 -0
- claude_mpm/cli/interactive/__init__.py +31 -0
- claude_mpm/cli/interactive/agent_wizard.py +1927 -0
- claude_mpm/cli/interactive/questionary_styles.py +65 -0
- claude_mpm/cli/interactive/skill_selector.py +481 -0
- claude_mpm/cli/interactive/skills_wizard.py +491 -0
- claude_mpm/cli/parser.py +87 -563
- claude_mpm/cli/parsers/__init__.py +35 -0
- claude_mpm/cli/parsers/agent_manager_parser.py +393 -0
- claude_mpm/cli/parsers/agent_source_parser.py +171 -0
- claude_mpm/cli/parsers/agents_parser.py +575 -0
- claude_mpm/cli/parsers/analyze_code_parser.py +170 -0
- claude_mpm/cli/parsers/analyze_parser.py +135 -0
- claude_mpm/cli/parsers/auto_configure_parser.py +120 -0
- claude_mpm/cli/parsers/base_parser.py +649 -0
- claude_mpm/cli/parsers/config_parser.py +208 -0
- claude_mpm/cli/parsers/configure_parser.py +138 -0
- claude_mpm/cli/parsers/dashboard_parser.py +113 -0
- claude_mpm/cli/parsers/debug_parser.py +319 -0
- claude_mpm/cli/parsers/local_deploy_parser.py +227 -0
- claude_mpm/cli/parsers/mcp_parser.py +195 -0
- claude_mpm/cli/parsers/memory_parser.py +138 -0
- claude_mpm/cli/parsers/monitor_parser.py +142 -0
- claude_mpm/cli/parsers/mpm_init_parser.py +311 -0
- claude_mpm/cli/parsers/profile_parser.py +147 -0
- claude_mpm/cli/parsers/run_parser.py +157 -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 +277 -0
- claude_mpm/cli/parsers/source_parser.py +138 -0
- claude_mpm/cli/parsers/tickets_parser.py +203 -0
- claude_mpm/cli/shared/__init__.py +40 -0
- claude_mpm/cli/shared/argument_patterns.py +205 -0
- claude_mpm/cli/shared/base_command.py +242 -0
- claude_mpm/cli/shared/error_handling.py +242 -0
- claude_mpm/cli/shared/output_formatters.py +241 -0
- claude_mpm/cli/startup.py +1578 -0
- claude_mpm/cli/startup_display.py +480 -0
- claude_mpm/cli/startup_logging.py +839 -0
- claude_mpm/cli/utils.py +136 -47
- claude_mpm/cli_module/__init__.py +6 -6
- claude_mpm/cli_module/args.py +188 -140
- claude_mpm/cli_module/commands.py +79 -70
- claude_mpm/cli_module/migration_example.py +42 -64
- claude_mpm/commands/__init__.py +14 -0
- claude_mpm/commands/mpm-config.md +28 -0
- claude_mpm/commands/mpm-doctor.md +20 -0
- claude_mpm/commands/mpm-help.md +20 -0
- claude_mpm/commands/mpm-init.md +120 -0
- claude_mpm/commands/mpm-monitor.md +31 -0
- claude_mpm/commands/mpm-organize.md +120 -0
- claude_mpm/commands/mpm-postmortem.md +21 -0
- claude_mpm/commands/mpm-session-resume.md +30 -0
- claude_mpm/commands/mpm-status.md +20 -0
- claude_mpm/commands/mpm-ticket-view.md +109 -0
- claude_mpm/commands/mpm-version.md +20 -0
- claude_mpm/commands/mpm.md +31 -0
- claude_mpm/config/__init__.py +42 -2
- claude_mpm/config/agent_config.py +402 -0
- claude_mpm/config/agent_presets.py +488 -0
- claude_mpm/config/agent_sources.py +352 -0
- claude_mpm/config/experimental_features.py +217 -0
- claude_mpm/config/model_config.py +428 -0
- claude_mpm/config/paths.py +258 -0
- claude_mpm/config/skill_presets.py +392 -0
- claude_mpm/config/skill_sources.py +590 -0
- claude_mpm/config/socketio_config.py +125 -83
- claude_mpm/constants.py +133 -22
- claude_mpm/core/__init__.py +62 -36
- claude_mpm/core/agent_name_normalizer.py +71 -73
- claude_mpm/core/agent_registry.py +385 -492
- claude_mpm/core/agent_session_manager.py +81 -70
- claude_mpm/core/api_validator.py +330 -0
- claude_mpm/core/base_service.py +159 -122
- claude_mpm/core/cache.py +560 -0
- claude_mpm/core/claude_runner.py +696 -916
- claude_mpm/core/config.py +613 -122
- claude_mpm/core/config_aliases.py +74 -73
- claude_mpm/core/config_constants.py +314 -0
- claude_mpm/core/constants.py +361 -0
- claude_mpm/core/container.py +646 -104
- claude_mpm/core/enums.py +452 -0
- claude_mpm/core/error_handler.py +623 -0
- claude_mpm/core/exceptions.py +536 -0
- claude_mpm/core/factories.py +105 -109
- 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 +278 -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 +213 -0
- claude_mpm/core/framework/loaders/file_loader.py +176 -0
- claude_mpm/core/framework/loaders/instruction_loader.py +222 -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 +485 -414
- claude_mpm/core/hook_error_memory.py +381 -0
- claude_mpm/core/hook_manager.py +246 -86
- claude_mpm/core/hook_performance_config.py +147 -0
- claude_mpm/core/injectable_service.py +72 -63
- claude_mpm/core/instruction_reinforcement_hook.py +267 -0
- claude_mpm/core/interactive_session.py +670 -0
- claude_mpm/core/interfaces.py +570 -164
- claude_mpm/core/lazy.py +467 -0
- claude_mpm/core/log_manager.py +707 -0
- claude_mpm/core/logger.py +295 -134
- claude_mpm/core/logging_config.py +474 -0
- claude_mpm/core/logging_utils.py +520 -0
- claude_mpm/core/minimal_framework_loader.py +24 -22
- claude_mpm/core/mixins.py +30 -29
- claude_mpm/core/oneshot_session.py +594 -0
- claude_mpm/core/optimized_agent_loader.py +479 -0
- claude_mpm/core/optimized_startup.py +554 -0
- claude_mpm/core/output_style_manager.py +491 -0
- claude_mpm/core/pm_hook_interceptor.py +197 -82
- 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 +153 -116
- claude_mpm/core/session_manager.py +179 -64
- claude_mpm/core/shared/__init__.py +17 -0
- claude_mpm/core/shared/config_loader.py +326 -0
- claude_mpm/core/shared/path_resolver.py +281 -0
- claude_mpm/core/shared/singleton_manager.py +221 -0
- claude_mpm/core/socketio_pool.py +400 -137
- claude_mpm/core/system_context.py +38 -0
- claude_mpm/core/tool_access_control.py +64 -57
- claude_mpm/core/types.py +307 -0
- claude_mpm/core/typing_utils.py +553 -0
- claude_mpm/core/unified_agent_registry.py +969 -0
- claude_mpm/core/unified_config.py +612 -0
- claude_mpm/core/unified_paths.py +958 -0
- claude_mpm/dashboard/__init__.py +12 -0
- claude_mpm/dashboard/api/simple_directory.py +261 -0
- claude_mpm/dashboard/static/svelte-build/_app/env.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/0.DWzvg0-y.css +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/assets/2.ThTw9_ym.css +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/4TdZjIqw.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/5shd3_w0.js +24 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/B0uc0UOD.js +36 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/B7RN905-.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/B7xVLGWV.js +2 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BIF9m_hv.js +61 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BKjSRqUr.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BPYeabCQ.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BQaXIfA_.js +331 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BSNlmTZj.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Be7GpZd6.js +7 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Bh0LDWpI.js +145 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BofRWZRR.js +10 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/BovzEFCE.js +30 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/C30mlcqg.js +165 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/C4B-KCzX.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/C4JcI4KD.js +122 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CBBdVcY8.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CDuw-vjf.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/C_Usid8X.js +15 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Cfqx1Qun.js +10 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CiIAseT4.js +128 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CmKTTxBW.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CnA0NrzZ.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Cs_tUR18.js +24 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Cu_Erd72.js +261 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CyWMqx4W.js +43 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CzZX-COe.js +220 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/CzeYkLYB.js +65 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/D3k0OPJN.js +4 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/D9lljYKQ.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DGkLK5U1.js +267 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DI7hHRFL.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DLVjFsZ3.js +139 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DUrLdbGD.js +89 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DVp1hx9R.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DY1XQ8fi.js +2 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DZX00Y4g.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Da0KfYnO.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DaimHw_p.js +68 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Dfy6j1xT.js +323 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Dhb8PKl3.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Dle-35c7.js +64 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DmxopI1J.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/DwBR2MJi.js +60 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/GYwsonyD.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Gi6I4Gst.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/NqQ1dWOy.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/RJiighC3.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/Vzk33B_K.js +2 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/ZGh7QtNv.js +7 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/bT1r9zLR.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/bTOqqlTd.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/eNVUfhuA.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/iEWssX7S.js +162 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/sQeU3Y1z.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/chunks/uuIeMWc-.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/entry/app.D6-I5TpK.js +2 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/entry/start.NWzMBYRp.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/0.m1gL8KXf.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/1.CgNOuw-d.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/immutable/nodes/2.C0GcWctS.js +1 -0
- claude_mpm/dashboard/static/svelte-build/_app/version.json +1 -0
- claude_mpm/dashboard/static/svelte-build/favicon.svg +7 -0
- claude_mpm/dashboard/static/svelte-build/index.html +36 -0
- claude_mpm/dashboard-svelte/node_modules/katex/src/fonts/generate_fonts.py +58 -0
- claude_mpm/dashboard-svelte/node_modules/katex/src/metrics/extract_tfms.py +114 -0
- claude_mpm/dashboard-svelte/node_modules/katex/src/metrics/extract_ttfs.py +122 -0
- claude_mpm/dashboard-svelte/node_modules/katex/src/metrics/format_json.py +28 -0
- claude_mpm/dashboard-svelte/node_modules/katex/src/metrics/parse_tfm.py +211 -0
- claude_mpm/experimental/__init__.py +10 -0
- claude_mpm/experimental/cli_enhancements.py +104 -89
- claude_mpm/generators/__init__.py +1 -1
- claude_mpm/generators/agent_profile_generator.py +76 -66
- claude_mpm/hooks/__init__.py +37 -1
- claude_mpm/hooks/base_hook.py +37 -32
- claude_mpm/hooks/claude_hooks/__init__.py +1 -1
- claude_mpm/hooks/claude_hooks/connection_pool.py +250 -0
- claude_mpm/hooks/claude_hooks/correlation_manager.py +60 -0
- claude_mpm/hooks/claude_hooks/event_handlers.py +888 -0
- claude_mpm/hooks/claude_hooks/hook_handler.py +652 -875
- claude_mpm/hooks/claude_hooks/hook_wrapper.sh +10 -7
- claude_mpm/hooks/claude_hooks/installer.py +806 -0
- claude_mpm/hooks/claude_hooks/memory_integration.py +249 -0
- claude_mpm/hooks/claude_hooks/response_tracking.py +412 -0
- claude_mpm/hooks/claude_hooks/services/__init__.py +15 -0
- claude_mpm/hooks/claude_hooks/services/connection_manager.py +229 -0
- claude_mpm/hooks/claude_hooks/services/connection_manager_http.py +254 -0
- claude_mpm/hooks/claude_hooks/services/duplicate_detector.py +106 -0
- claude_mpm/hooks/claude_hooks/services/state_manager.py +284 -0
- claude_mpm/hooks/claude_hooks/services/subagent_processor.py +374 -0
- claude_mpm/hooks/claude_hooks/tool_analysis.py +224 -0
- 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 +201 -107
- 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 +92 -76
- claude_mpm/hooks/validation_hooks.py +62 -54
- claude_mpm/init.py +518 -83
- claude_mpm/models/__init__.py +9 -9
- claude_mpm/models/agent_definition.py +40 -23
- claude_mpm/models/agent_session.py +538 -0
- claude_mpm/models/git_repository.py +198 -0
- claude_mpm/models/resume_log.py +340 -0
- claude_mpm/schemas/__init__.py +12 -0
- claude_mpm/scripts/__init__.py +15 -0
- claude_mpm/scripts/claude-hook-handler.sh +227 -0
- claude_mpm/scripts/launch_monitor.py +165 -0
- claude_mpm/scripts/mpm_doctor.py +322 -0
- claude_mpm/scripts/socketio_daemon.py +189 -200
- claude_mpm/scripts/start_activity_logging.py +91 -0
- claude_mpm/services/__init__.py +208 -39
- claude_mpm/services/agent_capabilities_service.py +266 -0
- claude_mpm/services/agents/__init__.py +89 -0
- claude_mpm/services/agents/agent_builder.py +514 -0
- claude_mpm/services/agents/agent_preset_service.py +238 -0
- claude_mpm/services/agents/agent_recommendation_service.py +278 -0
- claude_mpm/services/agents/agent_review_service.py +280 -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/__init__.py +21 -0
- claude_mpm/services/agents/deployment/agent_config_provider.py +410 -0
- claude_mpm/services/agents/deployment/agent_configuration_manager.py +358 -0
- claude_mpm/services/agents/deployment/agent_definition_factory.py +80 -0
- claude_mpm/services/agents/deployment/agent_deployment.py +1037 -0
- claude_mpm/services/agents/deployment/agent_discovery_service.py +546 -0
- claude_mpm/services/agents/deployment/agent_environment_manager.py +288 -0
- claude_mpm/services/agents/deployment/agent_filesystem_manager.py +383 -0
- claude_mpm/services/agents/deployment/agent_format_converter.py +505 -0
- claude_mpm/services/agents/deployment/agent_frontmatter_validator.py +160 -0
- claude_mpm/services/agents/deployment/agent_lifecycle_manager.py +957 -0
- claude_mpm/services/agents/deployment/agent_metrics_collector.py +273 -0
- claude_mpm/services/agents/deployment/agent_operation_service.py +573 -0
- claude_mpm/services/agents/deployment/agent_record_service.py +418 -0
- claude_mpm/services/agents/deployment/agent_restore_handler.py +84 -0
- claude_mpm/services/agents/deployment/agent_state_service.py +381 -0
- claude_mpm/services/agents/deployment/agent_template_builder.py +1377 -0
- claude_mpm/services/agents/deployment/agent_validator.py +376 -0
- claude_mpm/services/agents/deployment/agent_version_manager.py +322 -0
- claude_mpm/services/{agent_versioning.py → agents/deployment/agent_versioning.py} +10 -13
- claude_mpm/services/agents/deployment/agents_directory_resolver.py +149 -0
- claude_mpm/services/agents/deployment/async_agent_deployment.py +768 -0
- claude_mpm/services/agents/deployment/base_agent_locator.py +132 -0
- claude_mpm/services/agents/deployment/config/__init__.py +13 -0
- claude_mpm/services/agents/deployment/config/deployment_config.py +181 -0
- claude_mpm/services/agents/deployment/config/deployment_config_manager.py +200 -0
- claude_mpm/services/agents/deployment/deployment_config_loader.py +178 -0
- claude_mpm/services/agents/deployment/deployment_reconciler.py +577 -0
- claude_mpm/services/agents/deployment/deployment_results_manager.py +185 -0
- claude_mpm/services/agents/deployment/deployment_type_detector.py +120 -0
- claude_mpm/services/agents/deployment/deployment_wrapper.py +129 -0
- claude_mpm/services/agents/deployment/facade/__init__.py +18 -0
- claude_mpm/services/agents/deployment/facade/async_deployment_executor.py +159 -0
- claude_mpm/services/agents/deployment/facade/deployment_executor.py +70 -0
- claude_mpm/services/agents/deployment/facade/deployment_facade.py +269 -0
- claude_mpm/services/agents/deployment/facade/sync_deployment_executor.py +178 -0
- claude_mpm/services/agents/deployment/interface_adapter.py +226 -0
- claude_mpm/services/agents/deployment/lifecycle_health_checker.py +85 -0
- claude_mpm/services/agents/deployment/lifecycle_performance_tracker.py +100 -0
- claude_mpm/services/agents/deployment/local_template_deployment.py +362 -0
- claude_mpm/services/agents/deployment/multi_source_deployment_service.py +1478 -0
- claude_mpm/services/agents/deployment/pipeline/__init__.py +32 -0
- claude_mpm/services/agents/deployment/pipeline/pipeline_builder.py +158 -0
- claude_mpm/services/agents/deployment/pipeline/pipeline_context.py +162 -0
- claude_mpm/services/agents/deployment/pipeline/pipeline_executor.py +169 -0
- claude_mpm/services/agents/deployment/pipeline/steps/__init__.py +19 -0
- claude_mpm/services/agents/deployment/pipeline/steps/agent_processing_step.py +240 -0
- claude_mpm/services/agents/deployment/pipeline/steps/base_step.py +110 -0
- claude_mpm/services/agents/deployment/pipeline/steps/configuration_step.py +80 -0
- claude_mpm/services/agents/deployment/pipeline/steps/target_directory_step.py +92 -0
- claude_mpm/services/agents/deployment/pipeline/steps/validation_step.py +101 -0
- claude_mpm/services/agents/deployment/processors/__init__.py +15 -0
- claude_mpm/services/agents/deployment/processors/agent_deployment_context.py +102 -0
- claude_mpm/services/agents/deployment/processors/agent_deployment_result.py +235 -0
- claude_mpm/services/agents/deployment/processors/agent_processor.py +269 -0
- claude_mpm/services/agents/deployment/refactored_agent_deployment_service.py +311 -0
- claude_mpm/services/agents/deployment/remote_agent_discovery_service.py +862 -0
- claude_mpm/services/agents/deployment/results/__init__.py +13 -0
- claude_mpm/services/agents/deployment/results/deployment_metrics.py +200 -0
- claude_mpm/services/agents/deployment/results/deployment_result_builder.py +249 -0
- claude_mpm/services/agents/deployment/single_agent_deployer.py +315 -0
- claude_mpm/services/agents/deployment/startup_reconciliation.py +138 -0
- claude_mpm/services/agents/deployment/strategies/__init__.py +25 -0
- claude_mpm/services/agents/deployment/strategies/base_strategy.py +113 -0
- claude_mpm/services/agents/deployment/strategies/project_strategy.py +148 -0
- claude_mpm/services/agents/deployment/strategies/strategy_selector.py +117 -0
- claude_mpm/services/agents/deployment/strategies/system_strategy.py +131 -0
- claude_mpm/services/agents/deployment/strategies/user_strategy.py +130 -0
- claude_mpm/services/agents/deployment/system_instructions_deployer.py +228 -0
- claude_mpm/services/agents/deployment/validation/__init__.py +21 -0
- claude_mpm/services/agents/deployment/validation/agent_validator.py +323 -0
- claude_mpm/services/agents/deployment/validation/deployment_validator.py +238 -0
- claude_mpm/services/agents/deployment/validation/template_validator.py +319 -0
- claude_mpm/services/agents/deployment/validation/validation_result.py +214 -0
- claude_mpm/services/agents/git_source_manager.py +682 -0
- claude_mpm/services/agents/loading/__init__.py +11 -0
- claude_mpm/services/{agent_profile_loader.py → agents/loading/agent_profile_loader.py} +306 -228
- claude_mpm/services/{base_agent_manager.py → agents/loading/base_agent_manager.py} +106 -91
- claude_mpm/services/agents/loading/framework_agent_loader.py +433 -0
- claude_mpm/services/agents/local_template_manager.py +784 -0
- claude_mpm/services/agents/management/__init__.py +9 -0
- claude_mpm/services/{agent_capabilities_generator.py → agents/management/agent_capabilities_generator.py} +92 -69
- claude_mpm/services/{agent_management_service.py → agents/management/agent_management_service.py} +219 -168
- claude_mpm/services/agents/memory/__init__.py +22 -0
- claude_mpm/services/agents/memory/agent_memory_manager.py +784 -0
- claude_mpm/services/{agent_persistence_service.py → agents/memory/agent_persistence_service.py} +20 -18
- claude_mpm/services/agents/memory/content_manager.py +470 -0
- claude_mpm/services/agents/memory/memory_categorization_service.py +167 -0
- claude_mpm/services/agents/memory/memory_file_service.py +129 -0
- claude_mpm/services/agents/memory/memory_format_service.py +201 -0
- claude_mpm/services/agents/memory/memory_limits_service.py +101 -0
- claude_mpm/services/agents/memory/template_generator.py +83 -0
- claude_mpm/services/agents/observers.py +547 -0
- claude_mpm/services/agents/recommender.py +617 -0
- claude_mpm/services/agents/registry/__init__.py +30 -0
- claude_mpm/services/agents/registry/deployed_agent_discovery.py +273 -0
- claude_mpm/services/{agent_modification_tracker.py → agents/registry/modification_tracker.py} +370 -295
- 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 +1205 -0
- claude_mpm/services/agents/startup_sync.py +262 -0
- claude_mpm/services/agents/toolchain_detector.py +478 -0
- claude_mpm/services/analysis/__init__.py +35 -0
- claude_mpm/services/analysis/clone_detector.py +1030 -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 +665 -0
- claude_mpm/services/claude_session_logger.py +321 -0
- claude_mpm/services/cli/__init__.py +18 -0
- claude_mpm/services/cli/agent_cleanup_service.py +408 -0
- claude_mpm/services/cli/agent_dependency_service.py +395 -0
- claude_mpm/services/cli/agent_listing_service.py +463 -0
- claude_mpm/services/cli/agent_output_formatter.py +605 -0
- claude_mpm/services/cli/agent_validation_service.py +590 -0
- claude_mpm/services/cli/memory_crud_service.py +622 -0
- claude_mpm/services/cli/memory_output_formatter.py +604 -0
- claude_mpm/services/cli/resume_service.py +617 -0
- claude_mpm/services/cli/session_manager.py +604 -0
- 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 +362 -0
- claude_mpm/services/cli/unified_dashboard_manager.py +439 -0
- claude_mpm/services/command_deployment_service.py +446 -0
- claude_mpm/services/command_handler_service.py +221 -0
- claude_mpm/services/communication/__init__.py +22 -0
- claude_mpm/services/core/__init__.py +108 -0
- claude_mpm/services/core/base.py +269 -0
- claude_mpm/services/core/cache_manager.py +309 -0
- claude_mpm/services/core/interfaces/__init__.py +273 -0
- claude_mpm/services/core/interfaces/agent.py +514 -0
- claude_mpm/services/core/interfaces/communication.py +316 -0
- claude_mpm/services/core/interfaces/health.py +169 -0
- claude_mpm/services/core/interfaces/infrastructure.py +357 -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/service.py +405 -0
- claude_mpm/services/core/interfaces/stability.py +260 -0
- claude_mpm/services/core/interfaces.py +81 -0
- claude_mpm/services/core/memory_manager.py +682 -0
- 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 +517 -0
- claude_mpm/services/core/service_container.py +520 -0
- claude_mpm/services/core/service_interfaces.py +436 -0
- claude_mpm/services/diagnostics/__init__.py +18 -0
- claude_mpm/services/diagnostics/checks/__init__.py +38 -0
- claude_mpm/services/diagnostics/checks/agent_check.py +370 -0
- claude_mpm/services/diagnostics/checks/agent_sources_check.py +577 -0
- claude_mpm/services/diagnostics/checks/base_check.py +60 -0
- claude_mpm/services/diagnostics/checks/claude_code_check.py +270 -0
- claude_mpm/services/diagnostics/checks/common_issues_check.py +363 -0
- claude_mpm/services/diagnostics/checks/configuration_check.py +306 -0
- claude_mpm/services/diagnostics/checks/filesystem_check.py +233 -0
- claude_mpm/services/diagnostics/checks/installation_check.py +520 -0
- claude_mpm/services/diagnostics/checks/instructions_check.py +415 -0
- claude_mpm/services/diagnostics/checks/mcp_check.py +330 -0
- claude_mpm/services/diagnostics/checks/mcp_services_check.py +1058 -0
- claude_mpm/services/diagnostics/checks/monitor_check.py +281 -0
- claude_mpm/services/diagnostics/checks/skill_sources_check.py +587 -0
- claude_mpm/services/diagnostics/checks/startup_log_check.py +319 -0
- claude_mpm/services/diagnostics/diagnostic_runner.py +286 -0
- claude_mpm/services/diagnostics/doctor_reporter.py +578 -0
- claude_mpm/services/diagnostics/models.py +138 -0
- claude_mpm/services/event_aggregator.py +582 -0
- claude_mpm/services/event_bus/__init__.py +18 -0
- claude_mpm/services/event_bus/config.py +186 -0
- claude_mpm/services/event_bus/direct_relay.py +312 -0
- claude_mpm/services/event_bus/event_bus.py +396 -0
- claude_mpm/services/event_bus/relay.py +326 -0
- claude_mpm/services/events/__init__.py +44 -0
- claude_mpm/services/events/consumers/__init__.py +18 -0
- claude_mpm/services/events/consumers/dead_letter.py +306 -0
- claude_mpm/services/events/consumers/logging.py +184 -0
- claude_mpm/services/events/consumers/metrics.py +241 -0
- claude_mpm/services/events/consumers/socketio.py +377 -0
- claude_mpm/services/events/core.py +480 -0
- claude_mpm/services/events/interfaces.py +214 -0
- claude_mpm/services/events/producers/__init__.py +14 -0
- claude_mpm/services/events/producers/hook.py +269 -0
- claude_mpm/services/events/producers/system.py +329 -0
- claude_mpm/services/exceptions.py +433 -353
- claude_mpm/services/framework_claude_md_generator/__init__.py +81 -80
- claude_mpm/services/framework_claude_md_generator/content_assembler.py +74 -67
- claude_mpm/services/framework_claude_md_generator/content_validator.py +66 -62
- claude_mpm/services/framework_claude_md_generator/deployment_manager.py +82 -60
- claude_mpm/services/framework_claude_md_generator/section_generators/__init__.py +36 -37
- claude_mpm/services/framework_claude_md_generator/section_generators/agents.py +41 -40
- claude_mpm/services/framework_claude_md_generator/section_generators/claude_pm_init.py +15 -15
- claude_mpm/services/framework_claude_md_generator/section_generators/core_responsibilities.py +5 -4
- claude_mpm/services/framework_claude_md_generator/section_generators/delegation_constraints.py +4 -3
- claude_mpm/services/framework_claude_md_generator/section_generators/environment_config.py +4 -3
- claude_mpm/services/framework_claude_md_generator/section_generators/footer.py +6 -5
- claude_mpm/services/framework_claude_md_generator/section_generators/header.py +8 -7
- claude_mpm/services/framework_claude_md_generator/section_generators/orchestration_principles.py +5 -4
- claude_mpm/services/framework_claude_md_generator/section_generators/role_designation.py +6 -5
- claude_mpm/services/framework_claude_md_generator/section_generators/subprocess_validation.py +9 -8
- claude_mpm/services/framework_claude_md_generator/section_generators/todo_task_tools.py +26 -30
- claude_mpm/services/framework_claude_md_generator/section_generators/troubleshooting.py +6 -5
- claude_mpm/services/framework_claude_md_generator/section_manager.py +28 -27
- claude_mpm/services/framework_claude_md_generator/version_manager.py +31 -30
- claude_mpm/services/git/__init__.py +21 -0
- claude_mpm/services/git/git_operations_service.py +579 -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 +159 -111
- claude_mpm/services/infrastructure/__init__.py +52 -0
- claude_mpm/services/infrastructure/context_preservation.py +569 -0
- claude_mpm/services/infrastructure/daemon_manager.py +279 -0
- claude_mpm/services/infrastructure/logging.py +209 -0
- claude_mpm/services/infrastructure/monitoring/__init__.py +39 -0
- claude_mpm/services/infrastructure/monitoring/aggregator.py +432 -0
- claude_mpm/services/infrastructure/monitoring/base.py +122 -0
- claude_mpm/services/infrastructure/monitoring/legacy.py +203 -0
- claude_mpm/services/infrastructure/monitoring/network.py +219 -0
- claude_mpm/services/infrastructure/monitoring/process.py +343 -0
- claude_mpm/services/infrastructure/monitoring/resources.py +244 -0
- claude_mpm/services/infrastructure/monitoring/service.py +368 -0
- claude_mpm/services/infrastructure/monitoring.py +71 -0
- 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_service_verifier.py +732 -0
- claude_mpm/services/memory/__init__.py +19 -0
- claude_mpm/services/{memory_builder.py → memory/builder.py} +465 -373
- claude_mpm/services/memory/cache/__init__.py +14 -0
- claude_mpm/services/{shared_prompt_cache.py → memory/cache/shared_prompt_cache.py} +237 -200
- claude_mpm/services/memory/cache/simple_cache.py +331 -0
- claude_mpm/services/memory/failure_tracker.py +578 -0
- claude_mpm/services/memory/indexed_memory.py +648 -0
- claude_mpm/services/{memory_optimizer.py → memory/optimizer.py} +272 -243
- claude_mpm/services/memory/router.py +951 -0
- claude_mpm/services/memory_hook_service.py +470 -0
- 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 +698 -0
- claude_mpm/services/monitor/daemon_manager.py +1076 -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 +730 -0
- claude_mpm/services/monitor/server.py +1493 -0
- claude_mpm/services/monitor_build_service.py +349 -0
- claude_mpm/services/native_agent_converter.py +356 -0
- claude_mpm/services/orphan_detection.py +786 -0
- claude_mpm/services/pm_skills_deployer.py +711 -0
- claude_mpm/services/port_manager.py +597 -0
- claude_mpm/services/pr/__init__.py +14 -0
- claude_mpm/services/pr/pr_template_service.py +329 -0
- claude_mpm/services/profile_manager.py +337 -0
- claude_mpm/services/project/__init__.py +44 -0
- claude_mpm/services/{project_analyzer.py → project/analyzer.py} +541 -291
- claude_mpm/services/project/analyzer_v2.py +566 -0
- claude_mpm/services/project/architecture_analyzer.py +461 -0
- claude_mpm/services/project/archive_manager.py +1045 -0
- claude_mpm/services/project/dependency_analyzer.py +462 -0
- 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/language_analyzer.py +265 -0
- claude_mpm/services/project/metrics_collector.py +407 -0
- claude_mpm/services/project/project_organizer.py +1009 -0
- claude_mpm/services/project/registry.py +636 -0
- claude_mpm/services/project/toolchain_analyzer.py +583 -0
- claude_mpm/services/project_port_allocator.py +596 -0
- claude_mpm/services/recovery_manager.py +293 -240
- claude_mpm/services/response_tracker.py +267 -0
- claude_mpm/services/runner_configuration_service.py +605 -0
- claude_mpm/services/self_upgrade_service.py +608 -0
- claude_mpm/services/session_management_service.py +314 -0
- claude_mpm/services/session_manager.py +380 -0
- claude_mpm/services/shared/__init__.py +21 -0
- claude_mpm/services/shared/async_service_base.py +216 -0
- claude_mpm/services/shared/config_service_base.py +301 -0
- claude_mpm/services/shared/lifecycle_service_base.py +308 -0
- claude_mpm/services/shared/manager_base.py +315 -0
- claude_mpm/services/shared/service_factory.py +309 -0
- claude_mpm/services/skills/__init__.py +21 -0
- claude_mpm/services/skills/git_skill_source_manager.py +1340 -0
- claude_mpm/services/skills/selective_skill_deployer.py +743 -0
- claude_mpm/services/skills/skill_discovery_service.py +568 -0
- claude_mpm/services/skills/skill_to_agent_mapper.py +406 -0
- claude_mpm/services/skills_config.py +547 -0
- claude_mpm/services/skills_deployer.py +1168 -0
- claude_mpm/services/socketio/__init__.py +25 -0
- claude_mpm/services/socketio/client_proxy.py +229 -0
- claude_mpm/services/socketio/dashboard_server.py +362 -0
- claude_mpm/services/socketio/event_normalizer.py +798 -0
- claude_mpm/services/socketio/handlers/__init__.py +30 -0
- claude_mpm/services/socketio/handlers/base.py +136 -0
- claude_mpm/services/socketio/handlers/code_analysis.py +682 -0
- claude_mpm/services/socketio/handlers/connection.py +643 -0
- claude_mpm/services/socketio/handlers/connection_handler.py +333 -0
- claude_mpm/services/socketio/handlers/file.py +263 -0
- claude_mpm/services/socketio/handlers/git.py +962 -0
- claude_mpm/services/socketio/handlers/hook.py +211 -0
- claude_mpm/services/socketio/handlers/memory.py +26 -0
- claude_mpm/services/socketio/handlers/project.py +24 -0
- claude_mpm/services/socketio/handlers/registry.py +214 -0
- claude_mpm/services/socketio/migration_utils.py +343 -0
- claude_mpm/services/socketio/monitor_client.py +364 -0
- claude_mpm/services/socketio/server/__init__.py +18 -0
- claude_mpm/services/socketio/server/broadcaster.py +569 -0
- claude_mpm/services/socketio/server/connection_manager.py +579 -0
- claude_mpm/services/socketio/server/core.py +1079 -0
- claude_mpm/services/socketio/server/eventbus_integration.py +245 -0
- claude_mpm/services/socketio/server/main.py +501 -0
- claude_mpm/services/socketio_client_manager.py +173 -143
- claude_mpm/services/socketio_server.py +38 -1657
- claude_mpm/services/subprocess_launcher_service.py +322 -0
- claude_mpm/services/system_instructions_service.py +270 -0
- claude_mpm/services/ticket_manager.py +25 -209
- claude_mpm/services/ticket_services/__init__.py +26 -0
- claude_mpm/services/ticket_services/crud_service.py +328 -0
- claude_mpm/services/ticket_services/formatter_service.py +290 -0
- claude_mpm/services/ticket_services/search_service.py +324 -0
- claude_mpm/services/ticket_services/validation_service.py +303 -0
- claude_mpm/services/ticket_services/workflow_service.py +244 -0
- 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 +280 -0
- claude_mpm/services/version_control/__init__.py +34 -37
- claude_mpm/services/version_control/branch_strategy.py +26 -17
- claude_mpm/services/version_control/conflict_resolution.py +52 -36
- claude_mpm/services/version_control/git_operations.py +183 -49
- claude_mpm/services/version_control/semantic_versioning.py +172 -61
- claude_mpm/services/version_control/version_parser.py +546 -0
- claude_mpm/services/version_service.py +379 -0
- claude_mpm/services/visualization/__init__.py +15 -0
- claude_mpm/services/visualization/mermaid_generator.py +937 -0
- claude_mpm/skills/__init__.py +42 -0
- claude_mpm/skills/agent_skills_injector.py +324 -0
- claude_mpm/skills/bundled/LICENSE_ATTRIBUTIONS.md +79 -0
- claude_mpm/skills/bundled/__init__.py +6 -0
- claude_mpm/skills/bundled/api-documentation.md +393 -0
- claude_mpm/skills/bundled/async-testing.md +571 -0
- claude_mpm/skills/bundled/code-review.md +143 -0
- claude_mpm/skills/bundled/collaboration/brainstorming/SKILL.md +79 -0
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/SKILL.md +178 -0
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/agent-prompts.md +577 -0
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/coordination-patterns.md +467 -0
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/examples.md +537 -0
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/references/troubleshooting.md +730 -0
- claude_mpm/skills/bundled/collaboration/git-worktrees.md +317 -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/stacked-prs.md +251 -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/INTEGRATION.md +611 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/README.md +596 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/SKILL.md +260 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/examples/nextjs-env-structure.md +315 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/references/frameworks.md +436 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/references/security.md +433 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/references/synchronization.md +452 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/references/troubleshooting.md +404 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/references/validation.md +420 -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/pm/pm-bug-reporting/pm-bug-reporting.md +248 -0
- claude_mpm/skills/bundled/pm/pm-delegation-patterns/SKILL.md +167 -0
- claude_mpm/skills/bundled/pm/pm-git-file-tracking/SKILL.md +113 -0
- claude_mpm/skills/bundled/pm/pm-pr-workflow/SKILL.md +124 -0
- claude_mpm/skills/bundled/pm/pm-teaching-mode/SKILL.md +657 -0
- claude_mpm/skills/bundled/pm/pm-ticketing-integration/SKILL.md +154 -0
- claude_mpm/skills/bundled/pm/pm-verification-protocols/SKILL.md +198 -0
- claude_mpm/skills/bundled/react/flexlayout-react.md +742 -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 +439 -0
- claude_mpm/skills/bundled/systematic-debugging.md +473 -0
- claude_mpm/skills/bundled/tauri/tauri-async-patterns.md +495 -0
- claude_mpm/skills/bundled/tauri/tauri-build-deploy.md +599 -0
- claude_mpm/skills/bundled/tauri/tauri-command-patterns.md +535 -0
- claude_mpm/skills/bundled/tauri/tauri-error-handling.md +613 -0
- claude_mpm/skills/bundled/tauri/tauri-event-system.md +648 -0
- claude_mpm/skills/bundled/tauri/tauri-file-system.md +673 -0
- claude_mpm/skills/bundled/tauri/tauri-frontend-integration.md +767 -0
- claude_mpm/skills/bundled/tauri/tauri-performance.md +669 -0
- claude_mpm/skills/bundled/tauri/tauri-state-management.md +573 -0
- claude_mpm/skills/bundled/tauri/tauri-testing.md +384 -0
- claude_mpm/skills/bundled/tauri/tauri-window-management.md +628 -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/test-quality-inspector/SKILL.md +458 -0
- claude_mpm/skills/bundled/testing/test-quality-inspector/examples/example-inspection-report.md +411 -0
- claude_mpm/skills/bundled/testing/test-quality-inspector/references/assertion-quality.md +317 -0
- claude_mpm/skills/bundled/testing/test-quality-inspector/references/inspection-checklist.md +270 -0
- claude_mpm/skills/bundled/testing/test-quality-inspector/references/red-flags.md +436 -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 +405 -0
- claude_mpm/skills/skills_registry.py +347 -0
- claude_mpm/skills/skills_service.py +739 -0
- claude_mpm/storage/__init__.py +9 -0
- claude_mpm/storage/state_storage.py +546 -0
- claude_mpm/templates/.pre-commit-config.yaml +112 -0
- 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/ticket_wrapper.py +2 -2
- claude_mpm/tools/__init__.py +10 -0
- claude_mpm/tools/__main__.py +208 -0
- claude_mpm/tools/code_tree_analyzer/__init__.py +45 -0
- claude_mpm/tools/code_tree_analyzer/analysis.py +299 -0
- claude_mpm/tools/code_tree_analyzer/cache.py +131 -0
- claude_mpm/tools/code_tree_analyzer/core.py +380 -0
- claude_mpm/tools/code_tree_analyzer/discovery.py +403 -0
- claude_mpm/tools/code_tree_analyzer/events.py +168 -0
- claude_mpm/tools/code_tree_analyzer/gitignore.py +308 -0
- claude_mpm/tools/code_tree_analyzer/models.py +39 -0
- claude_mpm/tools/code_tree_analyzer/multilang_analyzer.py +224 -0
- claude_mpm/tools/code_tree_analyzer/python_analyzer.py +284 -0
- claude_mpm/tools/code_tree_builder.py +631 -0
- claude_mpm/tools/code_tree_events.py +420 -0
- claude_mpm/tools/socketio_debug.py +671 -0
- claude_mpm/utils/__init__.py +8 -8
- claude_mpm/utils/agent_dependency_loader.py +1189 -0
- claude_mpm/utils/agent_filters.py +261 -0
- claude_mpm/utils/common.py +544 -0
- claude_mpm/utils/config_manager.py +168 -126
- claude_mpm/utils/console.py +11 -0
- claude_mpm/utils/database_connector.py +298 -0
- claude_mpm/utils/dependency_cache.py +373 -0
- claude_mpm/utils/dependency_manager.py +60 -59
- claude_mpm/utils/dependency_strategies.py +381 -0
- claude_mpm/utils/display_helper.py +260 -0
- claude_mpm/utils/environment_context.py +313 -0
- claude_mpm/utils/error_handler.py +78 -66
- claude_mpm/utils/file_utils.py +305 -0
- claude_mpm/utils/framework_detection.py +12 -11
- claude_mpm/utils/git_analyzer.py +407 -0
- claude_mpm/utils/gitignore.py +244 -0
- claude_mpm/utils/import_migration_example.py +12 -60
- claude_mpm/utils/imports.py +48 -45
- claude_mpm/utils/log_cleanup.py +627 -0
- claude_mpm/utils/migration.py +372 -0
- claude_mpm/utils/path_operations.py +110 -104
- claude_mpm/utils/progress.py +387 -0
- claude_mpm/utils/robust_installer.py +844 -0
- claude_mpm/utils/session_logging.py +121 -0
- claude_mpm/utils/structured_questions.py +619 -0
- claude_mpm/utils/subprocess_utils.py +343 -0
- claude_mpm/validation/__init__.py +1 -1
- claude_mpm/validation/agent_validator.py +214 -108
- claude_mpm/validation/frontmatter_validator.py +252 -0
- claude_mpm-5.4.85.dist-info/METADATA +1023 -0
- claude_mpm-5.4.85.dist-info/RECORD +980 -0
- {claude_mpm-3.4.10.dist-info → claude_mpm-5.4.85.dist-info}/entry_points.txt +1 -3
- claude_mpm-5.4.85.dist-info/licenses/LICENSE +94 -0
- claude_mpm-5.4.85.dist-info/licenses/LICENSE-FAQ.md +153 -0
- claude_mpm/agents/BASE_AGENT_TEMPLATE.md +0 -88
- claude_mpm/agents/INSTRUCTIONS.md +0 -352
- claude_mpm/agents/backups/INSTRUCTIONS.md +0 -352
- claude_mpm/agents/base_agent_loader.py +0 -529
- claude_mpm/agents/schema/agent_schema.json +0 -314
- claude_mpm/agents/templates/.claude-mpm/memories/README.md +0 -36
- claude_mpm/agents/templates/backup/data_engineer_agent_20250726_234551.json +0 -46
- claude_mpm/agents/templates/backup/documentation_agent_20250726_234551.json +0 -45
- claude_mpm/agents/templates/backup/engineer_agent_20250726_234551.json +0 -49
- claude_mpm/agents/templates/backup/ops_agent_20250726_234551.json +0 -46
- claude_mpm/agents/templates/backup/qa_agent_20250726_234551.json +0 -45
- claude_mpm/agents/templates/backup/research_agent_20250726_234551.json +0 -49
- claude_mpm/agents/templates/backup/security_agent_20250726_234551.json +0 -46
- claude_mpm/agents/templates/backup/version_control_agent_20250726_234551.json +0 -46
- claude_mpm/agents/templates/data_engineer.json +0 -110
- claude_mpm/agents/templates/documentation.json +0 -109
- claude_mpm/agents/templates/engineer.json +0 -113
- claude_mpm/agents/templates/ops.json +0 -109
- claude_mpm/agents/templates/pm.json +0 -25
- claude_mpm/agents/templates/qa.json +0 -111
- claude_mpm/agents/templates/research.json +0 -65
- claude_mpm/agents/templates/security.json +0 -113
- claude_mpm/agents/templates/test_integration.json +0 -112
- claude_mpm/agents/templates/version_control.json +0 -107
- claude_mpm/cli/commands/ui.py +0 -57
- claude_mpm/core/simple_runner.py +0 -1046
- claude_mpm/dashboard/open_dashboard.py +0 -34
- claude_mpm/deployment_paths.py +0 -261
- claude_mpm/hooks/builtin/__init__.py +0 -1
- claude_mpm/hooks/builtin/logging_hook_example.py +0 -165
- claude_mpm/hooks/builtin/memory_hooks_example.py +0 -67
- claude_mpm/hooks/builtin/mpm_command_hook.py +0 -125
- claude_mpm/hooks/builtin/post_delegation_hook_example.py +0 -124
- claude_mpm/hooks/builtin/pre_delegation_hook_example.py +0 -125
- claude_mpm/hooks/builtin/submit_hook_example.py +0 -100
- claude_mpm/hooks/builtin/ticket_extraction_hook_example.py +0 -237
- claude_mpm/hooks/builtin/todo_agent_prefix_hook.py +0 -240
- claude_mpm/hooks/builtin/workflow_start_hook.py +0 -181
- claude_mpm/orchestration/__init__.py +0 -6
- claude_mpm/orchestration/archive/direct_orchestrator.py +0 -195
- claude_mpm/orchestration/archive/factory.py +0 -215
- claude_mpm/orchestration/archive/hook_enabled_orchestrator.py +0 -188
- claude_mpm/orchestration/archive/hook_integration_example.py +0 -178
- claude_mpm/orchestration/archive/interactive_subprocess_orchestrator.py +0 -826
- claude_mpm/orchestration/archive/orchestrator.py +0 -501
- claude_mpm/orchestration/archive/pexpect_orchestrator.py +0 -252
- claude_mpm/orchestration/archive/pty_orchestrator.py +0 -270
- claude_mpm/orchestration/archive/simple_orchestrator.py +0 -82
- claude_mpm/orchestration/archive/subprocess_orchestrator.py +0 -801
- claude_mpm/orchestration/archive/system_prompt_orchestrator.py +0 -278
- claude_mpm/orchestration/archive/wrapper_orchestrator.py +0 -187
- claude_mpm/schemas/workflow_validator.py +0 -411
- claude_mpm/services/agent_deployment.py +0 -1534
- claude_mpm/services/agent_lifecycle_manager.py +0 -1169
- claude_mpm/services/agent_memory_manager.py +0 -1415
- claude_mpm/services/agent_registry.py +0 -676
- claude_mpm/services/deployed_agent_discovery.py +0 -226
- claude_mpm/services/framework_agent_loader.py +0 -337
- claude_mpm/services/framework_claude_md_generator.py +0 -621
- claude_mpm/services/health_monitor.py +0 -892
- claude_mpm/services/memory_router.py +0 -538
- claude_mpm/services/parent_directory_manager/__init__.py +0 -577
- claude_mpm/services/parent_directory_manager/backup_manager.py +0 -258
- claude_mpm/services/parent_directory_manager/config_manager.py +0 -210
- claude_mpm/services/parent_directory_manager/deduplication_manager.py +0 -279
- claude_mpm/services/parent_directory_manager/framework_protector.py +0 -143
- claude_mpm/services/parent_directory_manager/operations.py +0 -186
- claude_mpm/services/parent_directory_manager/state_manager.py +0 -624
- claude_mpm/services/parent_directory_manager/template_deployer.py +0 -579
- claude_mpm/services/parent_directory_manager/validation_manager.py +0 -378
- claude_mpm/services/parent_directory_manager/version_control_helper.py +0 -339
- claude_mpm/services/parent_directory_manager/version_manager.py +0 -222
- claude_mpm/services/standalone_socketio_server.py +0 -1300
- claude_mpm/services/ticket_manager_di.py +0 -318
- claude_mpm/services/ticketing_service_original.py +0 -508
- claude_mpm/ui/__init__.py +0 -1
- claude_mpm/ui/rich_terminal_ui.py +0 -295
- claude_mpm/ui/terminal_ui.py +0 -328
- claude_mpm/utils/paths.py +0 -289
- claude_mpm-3.4.10.dist-info/METADATA +0 -183
- claude_mpm-3.4.10.dist-info/RECORD +0 -201
- claude_mpm-3.4.10.dist-info/licenses/LICENSE +0 -21
- {claude_mpm-3.4.10.dist-info → claude_mpm-5.4.85.dist-info}/WHEEL +0 -0
- {claude_mpm-3.4.10.dist-info → claude_mpm-5.4.85.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,844 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Robust dependency installer with retry logic and fallback strategies.
|
|
3
|
+
|
|
4
|
+
WHY: Network issues and temporary unavailability can cause dependency installation
|
|
5
|
+
to fail. This module provides resilient installation with automatic retries,
|
|
6
|
+
fallback strategies, and clear error reporting.
|
|
7
|
+
|
|
8
|
+
DESIGN DECISION: We implement exponential backoff for retries and provide
|
|
9
|
+
multiple installation strategies (pip, conda, source) to maximize success rate.
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
import os
|
|
13
|
+
import re
|
|
14
|
+
import subprocess
|
|
15
|
+
import sys
|
|
16
|
+
import sysconfig
|
|
17
|
+
import time
|
|
18
|
+
from dataclasses import dataclass
|
|
19
|
+
from enum import Enum
|
|
20
|
+
from pathlib import Path
|
|
21
|
+
from typing import Dict, List, Optional, Tuple
|
|
22
|
+
|
|
23
|
+
from ..core.logger import get_logger
|
|
24
|
+
|
|
25
|
+
logger = get_logger(__name__)
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class InstallStrategy(Enum):
|
|
29
|
+
"""Available installation strategies."""
|
|
30
|
+
|
|
31
|
+
PIP = "pip"
|
|
32
|
+
PIP_NO_DEPS = "pip_no_deps"
|
|
33
|
+
PIP_UPGRADE = "pip_upgrade"
|
|
34
|
+
PIP_INDEX_URL = "pip_index_url"
|
|
35
|
+
SOURCE = "source"
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
@dataclass
|
|
39
|
+
class InstallAttempt:
|
|
40
|
+
"""Record of an installation attempt."""
|
|
41
|
+
|
|
42
|
+
strategy: InstallStrategy
|
|
43
|
+
package: str
|
|
44
|
+
success: bool
|
|
45
|
+
error: Optional[str]
|
|
46
|
+
duration: float
|
|
47
|
+
retry_count: int
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
class RobustPackageInstaller:
|
|
51
|
+
"""
|
|
52
|
+
Robust package installer with retry logic and multiple strategies.
|
|
53
|
+
|
|
54
|
+
WHY: This class handles the complexity of package installation in various
|
|
55
|
+
environments, network conditions, and Python versions. It ensures maximum
|
|
56
|
+
success rate while providing clear feedback on failures.
|
|
57
|
+
|
|
58
|
+
DECISION: Added PEP 668 detection and handling to work with externally managed
|
|
59
|
+
Python environments (like Homebrew's Python 3.13).
|
|
60
|
+
"""
|
|
61
|
+
|
|
62
|
+
def __init__(
|
|
63
|
+
self,
|
|
64
|
+
max_retries: int = 3,
|
|
65
|
+
retry_delay: float = 2.0,
|
|
66
|
+
timeout: int = 300,
|
|
67
|
+
use_cache: bool = True,
|
|
68
|
+
):
|
|
69
|
+
"""
|
|
70
|
+
Initialize robust installer.
|
|
71
|
+
|
|
72
|
+
Args:
|
|
73
|
+
max_retries: Maximum number of retry attempts per package
|
|
74
|
+
retry_delay: Initial delay between retries (uses exponential backoff)
|
|
75
|
+
timeout: Maximum time for each installation attempt in seconds
|
|
76
|
+
use_cache: Whether to use pip cache
|
|
77
|
+
"""
|
|
78
|
+
self.max_retries = max_retries
|
|
79
|
+
self.retry_delay = retry_delay
|
|
80
|
+
self.timeout = timeout
|
|
81
|
+
self.use_cache = use_cache
|
|
82
|
+
self.attempts: List[InstallAttempt] = []
|
|
83
|
+
self.success_cache: Dict[str, bool] = {}
|
|
84
|
+
self.in_virtualenv = self._check_virtualenv()
|
|
85
|
+
self.is_uv_tool = self._check_uv_tool_installation()
|
|
86
|
+
self.is_pep668_managed = self._check_pep668_managed()
|
|
87
|
+
self.pep668_warning_shown = False
|
|
88
|
+
|
|
89
|
+
def install_package(
|
|
90
|
+
self, package_spec: str, strategies: Optional[List[InstallStrategy]] = None
|
|
91
|
+
) -> Tuple[bool, Optional[str]]:
|
|
92
|
+
"""
|
|
93
|
+
Install a package using robust retry logic and multiple strategies.
|
|
94
|
+
|
|
95
|
+
WHY: Single installation attempts often fail due to transient issues.
|
|
96
|
+
This method tries multiple strategies with retries to maximize success.
|
|
97
|
+
|
|
98
|
+
Args:
|
|
99
|
+
package_spec: Package specification (e.g., "pandas>=2.0.0")
|
|
100
|
+
strategies: List of strategies to try (defaults to sensible order)
|
|
101
|
+
|
|
102
|
+
Returns:
|
|
103
|
+
Tuple of (success, error_message)
|
|
104
|
+
"""
|
|
105
|
+
# Check success cache first
|
|
106
|
+
if self.success_cache.get(package_spec):
|
|
107
|
+
logger.debug(f"Package {package_spec} already successfully installed")
|
|
108
|
+
return True, None
|
|
109
|
+
|
|
110
|
+
# Default strategy order
|
|
111
|
+
if strategies is None:
|
|
112
|
+
strategies = [
|
|
113
|
+
InstallStrategy.PIP,
|
|
114
|
+
InstallStrategy.PIP_UPGRADE,
|
|
115
|
+
InstallStrategy.PIP_NO_DEPS,
|
|
116
|
+
InstallStrategy.PIP_INDEX_URL,
|
|
117
|
+
]
|
|
118
|
+
|
|
119
|
+
# Extract package name for special handling
|
|
120
|
+
package_name = self._extract_package_name(package_spec)
|
|
121
|
+
|
|
122
|
+
# Special handling for known problematic packages
|
|
123
|
+
if self._needs_special_handling(package_name):
|
|
124
|
+
strategies = self._get_special_strategies(package_name)
|
|
125
|
+
|
|
126
|
+
# Try each strategy with retries
|
|
127
|
+
for strategy in strategies:
|
|
128
|
+
for retry in range(self.max_retries):
|
|
129
|
+
start_time = time.time()
|
|
130
|
+
|
|
131
|
+
# Calculate delay with exponential backoff
|
|
132
|
+
if retry > 0:
|
|
133
|
+
delay = self.retry_delay * (2 ** (retry - 1))
|
|
134
|
+
logger.info(
|
|
135
|
+
f"Retry {retry}/{self.max_retries} after {delay:.1f}s delay..."
|
|
136
|
+
)
|
|
137
|
+
time.sleep(delay)
|
|
138
|
+
|
|
139
|
+
# Attempt installation
|
|
140
|
+
success, error = self._attempt_install(package_spec, strategy)
|
|
141
|
+
duration = time.time() - start_time
|
|
142
|
+
|
|
143
|
+
# Record attempt
|
|
144
|
+
self.attempts.append(
|
|
145
|
+
InstallAttempt(
|
|
146
|
+
strategy=strategy,
|
|
147
|
+
package=package_spec,
|
|
148
|
+
success=success,
|
|
149
|
+
error=error,
|
|
150
|
+
duration=duration,
|
|
151
|
+
retry_count=retry,
|
|
152
|
+
)
|
|
153
|
+
)
|
|
154
|
+
|
|
155
|
+
if success:
|
|
156
|
+
logger.info(
|
|
157
|
+
f"Successfully installed {package_spec} using {strategy.value}"
|
|
158
|
+
)
|
|
159
|
+
self.success_cache[package_spec] = True
|
|
160
|
+
return True, None
|
|
161
|
+
|
|
162
|
+
# Check if error is retryable
|
|
163
|
+
if not self._is_retryable_error(error):
|
|
164
|
+
logger.warning(f"Non-retryable error for {package_spec}: {error}")
|
|
165
|
+
break
|
|
166
|
+
|
|
167
|
+
# All attempts failed
|
|
168
|
+
self.success_cache[package_spec] = False
|
|
169
|
+
final_error = self._get_consolidated_error(package_spec)
|
|
170
|
+
return False, final_error
|
|
171
|
+
|
|
172
|
+
def _attempt_install(
|
|
173
|
+
self, package_spec: str, strategy: InstallStrategy
|
|
174
|
+
) -> Tuple[bool, Optional[str]]:
|
|
175
|
+
"""
|
|
176
|
+
Attempt to install a package using a specific strategy.
|
|
177
|
+
|
|
178
|
+
Args:
|
|
179
|
+
package_spec: Package specification
|
|
180
|
+
strategy: Installation strategy to use
|
|
181
|
+
|
|
182
|
+
Returns:
|
|
183
|
+
Tuple of (success, error_message)
|
|
184
|
+
"""
|
|
185
|
+
try:
|
|
186
|
+
cmd = self._build_install_command(package_spec, strategy)
|
|
187
|
+
logger.debug(f"Running: {' '.join(cmd)}")
|
|
188
|
+
|
|
189
|
+
result = subprocess.run(
|
|
190
|
+
cmd, capture_output=True, text=True, timeout=self.timeout, check=False
|
|
191
|
+
)
|
|
192
|
+
|
|
193
|
+
if result.returncode == 0:
|
|
194
|
+
# Verify installation
|
|
195
|
+
if self._verify_installation(package_spec):
|
|
196
|
+
return True, None
|
|
197
|
+
return False, "Package installed but verification failed"
|
|
198
|
+
error_msg = self._extract_error_message(result.stderr)
|
|
199
|
+
logger.debug(f"Installation failed: {error_msg}")
|
|
200
|
+
return False, error_msg
|
|
201
|
+
|
|
202
|
+
except subprocess.TimeoutExpired:
|
|
203
|
+
return False, f"Installation timed out after {self.timeout}s"
|
|
204
|
+
except Exception as e:
|
|
205
|
+
return False, f"Unexpected error: {e!s}"
|
|
206
|
+
|
|
207
|
+
def _check_virtualenv(self) -> bool:
|
|
208
|
+
"""
|
|
209
|
+
Check if running inside a virtual environment.
|
|
210
|
+
|
|
211
|
+
WHY: Virtual environments are already isolated and don't need
|
|
212
|
+
--user or --break-system-packages flags. In fact, using --user
|
|
213
|
+
in a virtualenv causes errors.
|
|
214
|
+
|
|
215
|
+
Returns:
|
|
216
|
+
True if in a virtualenv, False otherwise
|
|
217
|
+
"""
|
|
218
|
+
# Multiple ways to detect virtualenv
|
|
219
|
+
return (
|
|
220
|
+
(
|
|
221
|
+
# venv creates sys.base_prefix
|
|
222
|
+
hasattr(sys, "base_prefix") and sys.base_prefix != sys.prefix
|
|
223
|
+
)
|
|
224
|
+
or (
|
|
225
|
+
# virtualenv creates sys.real_prefix
|
|
226
|
+
hasattr(sys, "real_prefix")
|
|
227
|
+
)
|
|
228
|
+
or (
|
|
229
|
+
# VIRTUAL_ENV environment variable
|
|
230
|
+
os.environ.get("VIRTUAL_ENV") is not None
|
|
231
|
+
)
|
|
232
|
+
)
|
|
233
|
+
|
|
234
|
+
def _check_pep668_managed(self) -> bool:
|
|
235
|
+
"""
|
|
236
|
+
Check if Python environment is PEP 668 externally managed.
|
|
237
|
+
|
|
238
|
+
WHY: PEP 668 prevents pip from installing packages into system Python
|
|
239
|
+
to avoid conflicts with system package managers (like Homebrew).
|
|
240
|
+
|
|
241
|
+
Returns:
|
|
242
|
+
True if PEP 668 managed, False otherwise
|
|
243
|
+
"""
|
|
244
|
+
# If in virtualenv, PEP 668 doesn't apply
|
|
245
|
+
if self.in_virtualenv:
|
|
246
|
+
logger.debug("Running in virtualenv, PEP 668 restrictions don't apply")
|
|
247
|
+
return False
|
|
248
|
+
|
|
249
|
+
# Check for EXTERNALLY-MANAGED marker file
|
|
250
|
+
stdlib_path = sysconfig.get_path("stdlib")
|
|
251
|
+
marker_file = Path(stdlib_path) / "EXTERNALLY-MANAGED"
|
|
252
|
+
|
|
253
|
+
if marker_file.exists():
|
|
254
|
+
logger.debug(f"PEP 668 EXTERNALLY-MANAGED marker found at {marker_file}")
|
|
255
|
+
return True
|
|
256
|
+
|
|
257
|
+
# Also check parent directory (some Python installations place it there)
|
|
258
|
+
parent_marker = marker_file.parent.parent / "EXTERNALLY-MANAGED"
|
|
259
|
+
if parent_marker.exists():
|
|
260
|
+
logger.debug(f"PEP 668 EXTERNALLY-MANAGED marker found at {parent_marker}")
|
|
261
|
+
return True
|
|
262
|
+
|
|
263
|
+
return False
|
|
264
|
+
|
|
265
|
+
def _check_uv_tool_installation(self) -> bool:
|
|
266
|
+
"""
|
|
267
|
+
Check if running in UV tool environment (no pip available).
|
|
268
|
+
|
|
269
|
+
WHY: UV tool environments don't have pip installed. The executable
|
|
270
|
+
path typically contains ".local/share/uv/tools/" and the UV_TOOL_DIR
|
|
271
|
+
environment variable is set. In such environments, we need to use
|
|
272
|
+
'uv pip' instead of 'python -m pip'.
|
|
273
|
+
|
|
274
|
+
Returns:
|
|
275
|
+
True if UV tool environment, False otherwise
|
|
276
|
+
"""
|
|
277
|
+
import os
|
|
278
|
+
|
|
279
|
+
# Check UV_TOOL_DIR environment variable
|
|
280
|
+
uv_tool_dir = os.environ.get("UV_TOOL_DIR", "")
|
|
281
|
+
if uv_tool_dir and "claude-mpm" in uv_tool_dir:
|
|
282
|
+
logger.debug(f"UV tool environment detected via UV_TOOL_DIR: {uv_tool_dir}")
|
|
283
|
+
return True
|
|
284
|
+
|
|
285
|
+
# Check executable path for UV tool patterns
|
|
286
|
+
executable = sys.executable
|
|
287
|
+
if ".local/share/uv/tools/" in executable or "/uv/tools/" in executable:
|
|
288
|
+
logger.debug(
|
|
289
|
+
f"UV tool environment detected via executable path: {executable}"
|
|
290
|
+
)
|
|
291
|
+
return True
|
|
292
|
+
|
|
293
|
+
return False
|
|
294
|
+
|
|
295
|
+
def _show_pep668_warning(self) -> None:
|
|
296
|
+
"""
|
|
297
|
+
Show warning about PEP 668 managed environment.
|
|
298
|
+
|
|
299
|
+
WHY: Users should understand why we're bypassing PEP 668 restrictions
|
|
300
|
+
and be encouraged to use virtual environments as best practice.
|
|
301
|
+
"""
|
|
302
|
+
if not self.pep668_warning_shown:
|
|
303
|
+
logger.warning(
|
|
304
|
+
"⚠️ PEP 668 MANAGED ENVIRONMENT DETECTED\n"
|
|
305
|
+
"Your Python installation is marked as externally managed (PEP 668).\n"
|
|
306
|
+
"This typically means you're using a system Python managed by Homebrew, apt, etc.\n"
|
|
307
|
+
"\n"
|
|
308
|
+
"Installing packages with --break-system-packages flag...\n"
|
|
309
|
+
"\n"
|
|
310
|
+
"RECOMMENDED: Use a virtual environment instead:\n"
|
|
311
|
+
" python -m venv .venv\n"
|
|
312
|
+
" source .venv/bin/activate # On Windows: .venv\\Scripts\\activate\n"
|
|
313
|
+
" pip install claude-mpm\n"
|
|
314
|
+
)
|
|
315
|
+
self.pep668_warning_shown = True
|
|
316
|
+
|
|
317
|
+
def _build_install_command(
|
|
318
|
+
self, package_spec: str, strategy: InstallStrategy
|
|
319
|
+
) -> List[str]:
|
|
320
|
+
"""
|
|
321
|
+
Build the installation command for a given strategy.
|
|
322
|
+
|
|
323
|
+
WHY: Proper environment detection ensures we use the right pip flags:
|
|
324
|
+
- Virtualenv: No special flags needed (already isolated)
|
|
325
|
+
- PEP 668 system: Use --break-system-packages only
|
|
326
|
+
- Normal system: Use --user for user-local install
|
|
327
|
+
|
|
328
|
+
Args:
|
|
329
|
+
package_spec: Package specification
|
|
330
|
+
strategy: Installation strategy
|
|
331
|
+
|
|
332
|
+
Returns:
|
|
333
|
+
Command as list of arguments
|
|
334
|
+
"""
|
|
335
|
+
# UV tool environments don't have pip; use uv pip install --python instead
|
|
336
|
+
if self.is_uv_tool:
|
|
337
|
+
base_cmd = ["uv", "pip", "install", "--python", sys.executable]
|
|
338
|
+
logger.debug(
|
|
339
|
+
f"Using 'uv pip install --python {sys.executable}' for UV tool environment"
|
|
340
|
+
)
|
|
341
|
+
else:
|
|
342
|
+
base_cmd = [sys.executable, "-m", "pip", "install"]
|
|
343
|
+
|
|
344
|
+
# Determine appropriate flags based on environment
|
|
345
|
+
if self.in_virtualenv:
|
|
346
|
+
# In virtualenv - no special flags needed
|
|
347
|
+
logger.debug("Installing in virtualenv (no special flags)")
|
|
348
|
+
elif self.is_pep668_managed:
|
|
349
|
+
# System Python with PEP 668 - use --break-system-packages only
|
|
350
|
+
self._show_pep668_warning()
|
|
351
|
+
base_cmd.append("--break-system-packages")
|
|
352
|
+
logger.debug("Added --break-system-packages flag for PEP 668 environment")
|
|
353
|
+
else:
|
|
354
|
+
# Normal system Python - use --user for user-local install
|
|
355
|
+
base_cmd.append("--user")
|
|
356
|
+
logger.debug("Added --user flag for user-local installation")
|
|
357
|
+
|
|
358
|
+
# Add cache control
|
|
359
|
+
if not self.use_cache:
|
|
360
|
+
base_cmd.append("--no-cache-dir")
|
|
361
|
+
|
|
362
|
+
if strategy == InstallStrategy.PIP:
|
|
363
|
+
return [*base_cmd, package_spec]
|
|
364
|
+
|
|
365
|
+
if strategy == InstallStrategy.PIP_NO_DEPS:
|
|
366
|
+
return [*base_cmd, "--no-deps", package_spec]
|
|
367
|
+
|
|
368
|
+
if strategy == InstallStrategy.PIP_UPGRADE:
|
|
369
|
+
return [*base_cmd, "--upgrade", package_spec]
|
|
370
|
+
|
|
371
|
+
if strategy == InstallStrategy.PIP_INDEX_URL:
|
|
372
|
+
# Try alternative index (PyPI mirror)
|
|
373
|
+
return [
|
|
374
|
+
*base_cmd,
|
|
375
|
+
"--index-url",
|
|
376
|
+
"https://pypi.org/simple",
|
|
377
|
+
"--extra-index-url",
|
|
378
|
+
"https://pypi.python.org/simple",
|
|
379
|
+
package_spec,
|
|
380
|
+
]
|
|
381
|
+
|
|
382
|
+
return [*base_cmd, package_spec]
|
|
383
|
+
|
|
384
|
+
def _extract_package_name(self, package_spec: str) -> str:
|
|
385
|
+
"""
|
|
386
|
+
Extract package name from specification.
|
|
387
|
+
|
|
388
|
+
Args:
|
|
389
|
+
package_spec: Package specification (e.g., "pandas>=2.0.0")
|
|
390
|
+
|
|
391
|
+
Returns:
|
|
392
|
+
Package name (e.g., "pandas")
|
|
393
|
+
"""
|
|
394
|
+
# Remove version specifiers
|
|
395
|
+
match = re.match(r"^([a-zA-Z0-9_-]+)", package_spec)
|
|
396
|
+
if match:
|
|
397
|
+
return match.group(1)
|
|
398
|
+
return package_spec
|
|
399
|
+
|
|
400
|
+
def _needs_special_handling(self, package_name: str) -> bool:
|
|
401
|
+
"""
|
|
402
|
+
Check if package needs special installation handling.
|
|
403
|
+
|
|
404
|
+
Args:
|
|
405
|
+
package_name: Name of the package
|
|
406
|
+
|
|
407
|
+
Returns:
|
|
408
|
+
True if package needs special handling
|
|
409
|
+
"""
|
|
410
|
+
# Known problematic packages
|
|
411
|
+
special_packages = {
|
|
412
|
+
"tree-sitter-ruby",
|
|
413
|
+
"tree-sitter-php",
|
|
414
|
+
"tree-sitter-javascript",
|
|
415
|
+
"tree-sitter-typescript",
|
|
416
|
+
"tree-sitter-go",
|
|
417
|
+
"tree-sitter-rust",
|
|
418
|
+
"tree-sitter-java",
|
|
419
|
+
"tree-sitter-cpp",
|
|
420
|
+
"tree-sitter-c",
|
|
421
|
+
# Database packages that require compilation
|
|
422
|
+
"mysqlclient", # Requires MySQL development headers
|
|
423
|
+
"psycopg2", # Requires PostgreSQL development headers
|
|
424
|
+
"cx_oracle", # Requires Oracle client libraries
|
|
425
|
+
"pycairo", # Requires Cairo development headers
|
|
426
|
+
"lxml", # Requires libxml2 development headers
|
|
427
|
+
}
|
|
428
|
+
|
|
429
|
+
return package_name.lower() in special_packages
|
|
430
|
+
|
|
431
|
+
def _get_special_strategies(self, package_name: str) -> List[InstallStrategy]:
|
|
432
|
+
"""
|
|
433
|
+
Get special installation strategies for problematic packages.
|
|
434
|
+
|
|
435
|
+
Args:
|
|
436
|
+
package_name: Name of the package
|
|
437
|
+
|
|
438
|
+
Returns:
|
|
439
|
+
List of strategies to try
|
|
440
|
+
"""
|
|
441
|
+
# For tree-sitter packages, try upgrade first (often fixes version conflicts)
|
|
442
|
+
if package_name.startswith("tree-sitter-"):
|
|
443
|
+
return [
|
|
444
|
+
InstallStrategy.PIP_UPGRADE,
|
|
445
|
+
InstallStrategy.PIP,
|
|
446
|
+
InstallStrategy.PIP_INDEX_URL,
|
|
447
|
+
InstallStrategy.PIP_NO_DEPS,
|
|
448
|
+
]
|
|
449
|
+
|
|
450
|
+
# Database packages that require compilation
|
|
451
|
+
compilation_packages = {
|
|
452
|
+
"mysqlclient": ["pymysql"], # Pure Python alternative
|
|
453
|
+
"psycopg2": ["psycopg2-binary"], # Binary wheel alternative
|
|
454
|
+
"cx_oracle": [], # No good alternative
|
|
455
|
+
"pycairo": [], # No good alternative
|
|
456
|
+
"lxml": [], # Usually works with binary wheels
|
|
457
|
+
}
|
|
458
|
+
|
|
459
|
+
package_lower = package_name.lower()
|
|
460
|
+
if package_lower in compilation_packages:
|
|
461
|
+
# Try normal install first, but with limited retries
|
|
462
|
+
strategies = [InstallStrategy.PIP]
|
|
463
|
+
|
|
464
|
+
# If there are alternatives, log suggestion
|
|
465
|
+
alternatives = compilation_packages[package_lower]
|
|
466
|
+
if alternatives:
|
|
467
|
+
logger.info(
|
|
468
|
+
f"Package {package_name} requires compilation. "
|
|
469
|
+
f"Consider using alternative: {', '.join(alternatives)}"
|
|
470
|
+
)
|
|
471
|
+
else:
|
|
472
|
+
logger.warning(
|
|
473
|
+
f"Package {package_name} requires compilation and may fail on systems "
|
|
474
|
+
f"without development headers installed."
|
|
475
|
+
)
|
|
476
|
+
|
|
477
|
+
return strategies
|
|
478
|
+
|
|
479
|
+
return [InstallStrategy.PIP, InstallStrategy.PIP_UPGRADE]
|
|
480
|
+
|
|
481
|
+
def _verify_installation(self, package_spec: str) -> bool:
|
|
482
|
+
"""
|
|
483
|
+
Verify that a package was successfully installed in the TARGET environment.
|
|
484
|
+
|
|
485
|
+
WHY: UV installs packages to its own Python environment, not the current process.
|
|
486
|
+
We must verify in the same environment where packages were installed.
|
|
487
|
+
|
|
488
|
+
Args:
|
|
489
|
+
package_spec: Package specification
|
|
490
|
+
|
|
491
|
+
Returns:
|
|
492
|
+
True if package is installed and importable in the target environment
|
|
493
|
+
"""
|
|
494
|
+
package_name = self._extract_package_name(package_spec)
|
|
495
|
+
|
|
496
|
+
try:
|
|
497
|
+
if self.is_uv_tool:
|
|
498
|
+
# For UV tool, verify via UV's Python environment
|
|
499
|
+
verify_cmd = [
|
|
500
|
+
"uv",
|
|
501
|
+
"run",
|
|
502
|
+
"--no-project",
|
|
503
|
+
"python",
|
|
504
|
+
"-c",
|
|
505
|
+
f"import importlib.metadata; print(importlib.metadata.version('{package_name}'))",
|
|
506
|
+
]
|
|
507
|
+
result = subprocess.run(
|
|
508
|
+
verify_cmd, capture_output=True, timeout=30, check=False
|
|
509
|
+
)
|
|
510
|
+
if result.returncode == 0:
|
|
511
|
+
logger.debug(
|
|
512
|
+
f"Package {package_name} verified in UV environment: {result.stdout.decode().strip()}"
|
|
513
|
+
)
|
|
514
|
+
return True
|
|
515
|
+
logger.debug(
|
|
516
|
+
f"Package {package_name} not found in UV environment: {result.stderr.decode().strip()}"
|
|
517
|
+
)
|
|
518
|
+
return False
|
|
519
|
+
# For normal Python, use importlib.metadata in current process
|
|
520
|
+
import importlib.metadata
|
|
521
|
+
|
|
522
|
+
try:
|
|
523
|
+
version = importlib.metadata.version(package_name)
|
|
524
|
+
logger.debug(f"Package {package_name} version {version} is installed")
|
|
525
|
+
return True
|
|
526
|
+
|
|
527
|
+
except importlib.metadata.PackageNotFoundError:
|
|
528
|
+
return False
|
|
529
|
+
|
|
530
|
+
except subprocess.TimeoutExpired:
|
|
531
|
+
logger.warning(f"Verification timeout for {package_name}")
|
|
532
|
+
return False
|
|
533
|
+
except ImportError:
|
|
534
|
+
# Fallback for older Python versions
|
|
535
|
+
try:
|
|
536
|
+
import pkg_resources
|
|
537
|
+
|
|
538
|
+
pkg_resources.get_distribution(package_name)
|
|
539
|
+
return True
|
|
540
|
+
except pkg_resources.DistributionNotFound:
|
|
541
|
+
return False
|
|
542
|
+
except Exception as e:
|
|
543
|
+
logger.debug(f"Verification error for {package_name}: {e}")
|
|
544
|
+
return False
|
|
545
|
+
|
|
546
|
+
def _is_retryable_error(self, error: Optional[str]) -> bool:
|
|
547
|
+
"""
|
|
548
|
+
Determine if an error is worth retrying.
|
|
549
|
+
|
|
550
|
+
Args:
|
|
551
|
+
error: Error message
|
|
552
|
+
|
|
553
|
+
Returns:
|
|
554
|
+
True if error is retryable
|
|
555
|
+
"""
|
|
556
|
+
if not error:
|
|
557
|
+
return False
|
|
558
|
+
|
|
559
|
+
# Retryable error patterns
|
|
560
|
+
retryable_patterns = [
|
|
561
|
+
"connection",
|
|
562
|
+
"timeout",
|
|
563
|
+
"temporary failure",
|
|
564
|
+
"network",
|
|
565
|
+
"unreachable",
|
|
566
|
+
"could not find",
|
|
567
|
+
"no matching distribution",
|
|
568
|
+
"httperror",
|
|
569
|
+
"http error",
|
|
570
|
+
"ssl",
|
|
571
|
+
"certificate",
|
|
572
|
+
"readtimeout",
|
|
573
|
+
"connectionerror",
|
|
574
|
+
]
|
|
575
|
+
|
|
576
|
+
error_lower = error.lower()
|
|
577
|
+
return any(pattern in error_lower for pattern in retryable_patterns)
|
|
578
|
+
|
|
579
|
+
def _extract_error_message(self, stderr: str) -> str:
|
|
580
|
+
"""
|
|
581
|
+
Extract meaningful error message from pip stderr.
|
|
582
|
+
|
|
583
|
+
Args:
|
|
584
|
+
stderr: Standard error output from pip
|
|
585
|
+
|
|
586
|
+
Returns:
|
|
587
|
+
Extracted error message
|
|
588
|
+
"""
|
|
589
|
+
if not stderr:
|
|
590
|
+
return "Unknown error"
|
|
591
|
+
|
|
592
|
+
# Check for specific compilation errors
|
|
593
|
+
stderr_lower = stderr.lower()
|
|
594
|
+
|
|
595
|
+
if "mysql_config" in stderr_lower or "mysql.h" in stderr_lower:
|
|
596
|
+
return (
|
|
597
|
+
"mysqlclient compilation failed (missing MySQL development headers). "
|
|
598
|
+
"Use 'pip install pymysql' for a pure Python alternative that doesn't require compilation."
|
|
599
|
+
)
|
|
600
|
+
|
|
601
|
+
if "pg_config" in stderr_lower or "libpq-fe.h" in stderr_lower:
|
|
602
|
+
return (
|
|
603
|
+
"psycopg2 compilation failed (missing PostgreSQL development headers). "
|
|
604
|
+
"Use 'pip install psycopg2-binary' for a pre-compiled version."
|
|
605
|
+
)
|
|
606
|
+
|
|
607
|
+
if "oracle" in stderr_lower and "client" in stderr_lower:
|
|
608
|
+
return (
|
|
609
|
+
"cx_Oracle compilation failed (missing Oracle client libraries). "
|
|
610
|
+
"Use 'pip install oracledb' for a pure Python alternative."
|
|
611
|
+
)
|
|
612
|
+
|
|
613
|
+
# Look for ERROR: lines
|
|
614
|
+
error_lines = []
|
|
615
|
+
for line in stderr.splitlines():
|
|
616
|
+
if "ERROR:" in line:
|
|
617
|
+
error_lines.append(line.split("ERROR:", 1)[1].strip())
|
|
618
|
+
|
|
619
|
+
if error_lines:
|
|
620
|
+
return " | ".join(error_lines)
|
|
621
|
+
|
|
622
|
+
# Fall back to last non-empty line
|
|
623
|
+
lines = [l.strip() for l in stderr.splitlines() if l.strip()]
|
|
624
|
+
if lines:
|
|
625
|
+
return lines[-1]
|
|
626
|
+
|
|
627
|
+
return "Installation failed"
|
|
628
|
+
|
|
629
|
+
def _get_consolidated_error(self, package_spec: str) -> str:
|
|
630
|
+
"""
|
|
631
|
+
Get a consolidated error message from all attempts.
|
|
632
|
+
|
|
633
|
+
Args:
|
|
634
|
+
package_spec: Package specification that failed
|
|
635
|
+
|
|
636
|
+
Returns:
|
|
637
|
+
Consolidated error message
|
|
638
|
+
"""
|
|
639
|
+
# Get unique error messages from attempts
|
|
640
|
+
errors = set()
|
|
641
|
+
for attempt in self.attempts:
|
|
642
|
+
if attempt.package == package_spec and attempt.error:
|
|
643
|
+
errors.add(attempt.error)
|
|
644
|
+
|
|
645
|
+
if not errors:
|
|
646
|
+
return (
|
|
647
|
+
f"Failed to install {package_spec} after {len(self.attempts)} attempts"
|
|
648
|
+
)
|
|
649
|
+
|
|
650
|
+
# Format error message
|
|
651
|
+
if len(errors) == 1:
|
|
652
|
+
return next(iter(errors))
|
|
653
|
+
return f"Multiple errors: {' | '.join(errors)}"
|
|
654
|
+
|
|
655
|
+
def install_packages(
|
|
656
|
+
self, packages: List[str], parallel: bool = False
|
|
657
|
+
) -> Tuple[List[str], List[str], Dict[str, str]]:
|
|
658
|
+
"""
|
|
659
|
+
Install multiple packages with robust error handling.
|
|
660
|
+
|
|
661
|
+
Args:
|
|
662
|
+
packages: List of package specifications
|
|
663
|
+
parallel: Whether to attempt parallel installation
|
|
664
|
+
|
|
665
|
+
Returns:
|
|
666
|
+
Tuple of (successful_packages, failed_packages, error_map)
|
|
667
|
+
"""
|
|
668
|
+
successful = []
|
|
669
|
+
failed = []
|
|
670
|
+
errors = {}
|
|
671
|
+
|
|
672
|
+
# Group packages that can be installed together
|
|
673
|
+
if parallel and len(packages) > 1:
|
|
674
|
+
# Try to install all at once first
|
|
675
|
+
logger.info(f"Attempting batch installation of {len(packages)} packages...")
|
|
676
|
+
success, error = self._attempt_batch_install(packages)
|
|
677
|
+
|
|
678
|
+
if success:
|
|
679
|
+
logger.info("Batch installation successful")
|
|
680
|
+
return packages, [], {}
|
|
681
|
+
logger.warning(f"Batch installation failed: {error}")
|
|
682
|
+
logger.info("Falling back to individual installation...")
|
|
683
|
+
|
|
684
|
+
# Install packages individually
|
|
685
|
+
for i, package in enumerate(packages, 1):
|
|
686
|
+
logger.info(f"Installing package {i}/{len(packages)}: {package}")
|
|
687
|
+
|
|
688
|
+
success, error = self.install_package(package)
|
|
689
|
+
|
|
690
|
+
if success:
|
|
691
|
+
successful.append(package)
|
|
692
|
+
else:
|
|
693
|
+
failed.append(package)
|
|
694
|
+
errors[package] = error or "Unknown error"
|
|
695
|
+
|
|
696
|
+
return successful, failed, errors
|
|
697
|
+
|
|
698
|
+
def _attempt_batch_install(self, packages: List[str]) -> Tuple[bool, Optional[str]]:
|
|
699
|
+
"""
|
|
700
|
+
Attempt to install multiple packages in a single pip command.
|
|
701
|
+
|
|
702
|
+
Args:
|
|
703
|
+
packages: List of package specifications
|
|
704
|
+
|
|
705
|
+
Returns:
|
|
706
|
+
Tuple of (success, error_message)
|
|
707
|
+
"""
|
|
708
|
+
try:
|
|
709
|
+
# UV tool environments don't have pip; use uv pip install --python instead
|
|
710
|
+
if self.is_uv_tool:
|
|
711
|
+
cmd = ["uv", "pip", "install", "--python", sys.executable]
|
|
712
|
+
logger.debug(
|
|
713
|
+
f"Using 'uv pip install --python {sys.executable}' for batch installation"
|
|
714
|
+
)
|
|
715
|
+
else:
|
|
716
|
+
cmd = [sys.executable, "-m", "pip", "install"]
|
|
717
|
+
|
|
718
|
+
# Add appropriate flags based on environment
|
|
719
|
+
if self.in_virtualenv:
|
|
720
|
+
logger.debug("Batch install in virtualenv (no special flags)")
|
|
721
|
+
elif self.is_pep668_managed:
|
|
722
|
+
self._show_pep668_warning()
|
|
723
|
+
cmd.append("--break-system-packages")
|
|
724
|
+
logger.debug("Added --break-system-packages for batch installation")
|
|
725
|
+
else:
|
|
726
|
+
cmd.append("--user")
|
|
727
|
+
logger.debug("Added --user flag for batch installation")
|
|
728
|
+
|
|
729
|
+
cmd.extend(packages)
|
|
730
|
+
|
|
731
|
+
result = subprocess.run(
|
|
732
|
+
cmd,
|
|
733
|
+
capture_output=True,
|
|
734
|
+
text=True,
|
|
735
|
+
timeout=self.timeout * 2,
|
|
736
|
+
check=False, # Longer timeout for batch
|
|
737
|
+
)
|
|
738
|
+
|
|
739
|
+
if result.returncode == 0:
|
|
740
|
+
# Verify all packages
|
|
741
|
+
all_verified = all(self._verify_installation(pkg) for pkg in packages)
|
|
742
|
+
if all_verified:
|
|
743
|
+
return True, None
|
|
744
|
+
return False, "Some packages failed verification"
|
|
745
|
+
error_msg = self._extract_error_message(result.stderr)
|
|
746
|
+
return False, error_msg
|
|
747
|
+
|
|
748
|
+
except subprocess.TimeoutExpired:
|
|
749
|
+
return False, "Batch installation timed out"
|
|
750
|
+
except Exception as e:
|
|
751
|
+
return False, f"Batch installation error: {e!s}"
|
|
752
|
+
|
|
753
|
+
def get_report(self) -> str:
|
|
754
|
+
"""
|
|
755
|
+
Generate a report of installation attempts.
|
|
756
|
+
|
|
757
|
+
Returns:
|
|
758
|
+
Formatted report string
|
|
759
|
+
"""
|
|
760
|
+
lines = []
|
|
761
|
+
lines.append("=" * 60)
|
|
762
|
+
lines.append("INSTALLATION REPORT")
|
|
763
|
+
lines.append("=" * 60)
|
|
764
|
+
|
|
765
|
+
# Add environment status
|
|
766
|
+
lines.append("")
|
|
767
|
+
if self.is_uv_tool:
|
|
768
|
+
lines.append("✓ Environment: UV Tool Environment")
|
|
769
|
+
lines.append(" Using 'uv pip' command (pip not available)")
|
|
770
|
+
elif self.in_virtualenv:
|
|
771
|
+
lines.append("✓ Environment: Virtual Environment (isolated)")
|
|
772
|
+
lines.append(" No special pip flags needed")
|
|
773
|
+
elif self.is_pep668_managed:
|
|
774
|
+
lines.append("⚠️ PEP 668 Managed Environment: YES")
|
|
775
|
+
lines.append(" Installations used --break-system-packages flag")
|
|
776
|
+
lines.append(" Consider using a virtual environment for better isolation")
|
|
777
|
+
else:
|
|
778
|
+
lines.append("Environment: System Python")
|
|
779
|
+
lines.append(" Installations used --user flag for user-local install")
|
|
780
|
+
|
|
781
|
+
# Summary
|
|
782
|
+
total_attempts = len(self.attempts)
|
|
783
|
+
successful = sum(1 for a in self.attempts if a.success)
|
|
784
|
+
failed = total_attempts - successful
|
|
785
|
+
|
|
786
|
+
lines.append(f"Total attempts: {total_attempts}")
|
|
787
|
+
lines.append(f"Successful: {successful}")
|
|
788
|
+
lines.append(f"Failed: {failed}")
|
|
789
|
+
lines.append("")
|
|
790
|
+
|
|
791
|
+
# Details by package
|
|
792
|
+
packages: Dict[str, List[InstallAttempt]] = {}
|
|
793
|
+
for attempt in self.attempts:
|
|
794
|
+
if attempt.package not in packages:
|
|
795
|
+
packages[attempt.package] = []
|
|
796
|
+
packages[attempt.package].append(attempt)
|
|
797
|
+
|
|
798
|
+
for package, attempts in packages.items():
|
|
799
|
+
success = any(a.success for a in attempts)
|
|
800
|
+
status = "✓" if success else "✗"
|
|
801
|
+
lines.append(f"{status} {package}:")
|
|
802
|
+
|
|
803
|
+
for attempt in attempts:
|
|
804
|
+
retry_str = (
|
|
805
|
+
f" (retry {attempt.retry_count})" if attempt.retry_count > 0 else ""
|
|
806
|
+
)
|
|
807
|
+
result = "success" if attempt.success else f"failed: {attempt.error}"
|
|
808
|
+
lines.append(f" - {attempt.strategy.value}{retry_str}: {result}")
|
|
809
|
+
|
|
810
|
+
lines.append("=" * 60)
|
|
811
|
+
return "\n".join(lines)
|
|
812
|
+
|
|
813
|
+
|
|
814
|
+
def install_with_retry(
|
|
815
|
+
packages: List[str], max_retries: int = 3, verbose: bool = False
|
|
816
|
+
) -> Tuple[bool, str]:
|
|
817
|
+
"""
|
|
818
|
+
Convenience function to install packages with retry logic.
|
|
819
|
+
|
|
820
|
+
Args:
|
|
821
|
+
packages: List of package specifications
|
|
822
|
+
max_retries: Maximum retry attempts
|
|
823
|
+
verbose: Whether to print verbose output
|
|
824
|
+
|
|
825
|
+
Returns:
|
|
826
|
+
Tuple of (all_success, error_message)
|
|
827
|
+
"""
|
|
828
|
+
if verbose:
|
|
829
|
+
import logging
|
|
830
|
+
|
|
831
|
+
logging.getLogger().setLevel(logging.DEBUG)
|
|
832
|
+
|
|
833
|
+
installer = RobustPackageInstaller(max_retries=max_retries)
|
|
834
|
+
_successful, failed, errors = installer.install_packages(packages)
|
|
835
|
+
|
|
836
|
+
if verbose:
|
|
837
|
+
print(installer.get_report())
|
|
838
|
+
|
|
839
|
+
if failed:
|
|
840
|
+
error_msg = f"Failed to install {len(failed)} packages: "
|
|
841
|
+
error_msg += ", ".join(f"{pkg} ({errors[pkg]})" for pkg in failed)
|
|
842
|
+
return False, error_msg
|
|
843
|
+
|
|
844
|
+
return True, ""
|