claude-mpm 3.4.10__py3-none-any.whl → 5.4.55__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_OUTPUT_STYLE.md +290 -0
- claude_mpm/agents/CLAUDE_MPM_TEACHER_OUTPUT_STYLE.md +2002 -0
- claude_mpm/agents/MEMORY.md +72 -0
- claude_mpm/agents/PM_INSTRUCTIONS.md +1402 -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 +90 -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 +2503 -168
- claude_mpm/cli/commands/agents_cleanup.py +210 -0
- claude_mpm/cli/commands/agents_discover.py +338 -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 +2654 -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 +1246 -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 +297 -0
- claude_mpm/cli/helpers.py +105 -0
- claude_mpm/cli/interactive/__init__.py +21 -0
- claude_mpm/cli/interactive/agent_wizard.py +1947 -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 +644 -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 +1743 -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 +132 -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 +483 -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 +570 -0
- claude_mpm/core/unified_paths.py +941 -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/__pycache__/__init__.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/correlation_manager.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/event_handlers.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/hook_handler.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/installer.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/memory_integration.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/response_tracking.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/__pycache__/tool_analysis.cpython-311.pyc +0 -0
- 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/__pycache__/__init__.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/connection_manager_http.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/duplicate_detector.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/state_manager.cpython-311.pyc +0 -0
- claude_mpm/hooks/claude_hooks/services/__pycache__/subagent_processor.cpython-311.pyc +0 -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 +1369 -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_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/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 +1202 -0
- claude_mpm/services/agents/startup_sync.py +259 -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 +707 -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 +1324 -0
- claude_mpm/services/skills/selective_skill_deployer.py +744 -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/database-migration.md +199 -0
- claude_mpm/skills/bundled/docker-containerization.md +194 -0
- claude_mpm/skills/bundled/express-local-dev.md +1429 -0
- claude_mpm/skills/bundled/fastapi-local-dev.md +1199 -0
- claude_mpm/skills/bundled/git-workflow.md +414 -0
- claude_mpm/skills/bundled/imagemagick.md +204 -0
- claude_mpm/skills/bundled/infrastructure/env-manager/scripts/validate_env.py +576 -0
- claude_mpm/skills/bundled/json-data-handling.md +223 -0
- claude_mpm/skills/bundled/main/mcp-builder/scripts/connections.py +157 -0
- claude_mpm/skills/bundled/main/mcp-builder/scripts/evaluation.py +425 -0
- claude_mpm/skills/bundled/main/skill-creator/scripts/init_skill.py +303 -0
- claude_mpm/skills/bundled/main/skill-creator/scripts/package_skill.py +113 -0
- claude_mpm/skills/bundled/main/skill-creator/scripts/quick_validate.py +72 -0
- claude_mpm/skills/bundled/nextjs-local-dev.md +807 -0
- claude_mpm/skills/bundled/pdf.md +141 -0
- claude_mpm/skills/bundled/performance-profiling.md +573 -0
- claude_mpm/skills/bundled/refactoring-patterns.md +180 -0
- claude_mpm/skills/bundled/security-scanning.md +439 -0
- claude_mpm/skills/bundled/systematic-debugging.md +473 -0
- claude_mpm/skills/bundled/test-driven-development.md +378 -0
- claude_mpm/skills/bundled/testing/webapp-testing/examples/console_logging.py +35 -0
- claude_mpm/skills/bundled/testing/webapp-testing/examples/element_discovery.py +44 -0
- claude_mpm/skills/bundled/testing/webapp-testing/examples/static_html_automation.py +34 -0
- claude_mpm/skills/bundled/testing/webapp-testing/scripts/with_server.py +129 -0
- claude_mpm/skills/bundled/vite-local-dev.md +1061 -0
- claude_mpm/skills/bundled/web-performance-optimization.md +2305 -0
- claude_mpm/skills/bundled/xlsx.md +157 -0
- claude_mpm/skills/registry.py +286 -0
- claude_mpm/skills/skill_manager.py +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 +1090 -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 +823 -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.55.dist-info/METADATA +999 -0
- claude_mpm-5.4.55.dist-info/RECORD +868 -0
- {claude_mpm-3.4.10.dist-info → claude_mpm-5.4.55.dist-info}/entry_points.txt +1 -3
- claude_mpm-5.4.55.dist-info/licenses/LICENSE +94 -0
- claude_mpm-5.4.55.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.55.dist-info}/WHEEL +0 -0
- {claude_mpm-3.4.10.dist-info → claude_mpm-5.4.55.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,280 @@
|
|
|
1
|
+
from pathlib import Path
|
|
2
|
+
|
|
3
|
+
"""Utility service for various helper functions.
|
|
4
|
+
|
|
5
|
+
This service handles:
|
|
6
|
+
1. Agent delegation detection
|
|
7
|
+
2. Session event logging
|
|
8
|
+
3. Text processing utilities
|
|
9
|
+
4. Pattern matching utilities
|
|
10
|
+
|
|
11
|
+
Extracted from ClaudeRunner to follow Single Responsibility Principle.
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
import json
|
|
15
|
+
import re
|
|
16
|
+
import uuid
|
|
17
|
+
from datetime import datetime, timezone
|
|
18
|
+
from typing import Any, Dict, Optional, Tuple
|
|
19
|
+
|
|
20
|
+
from claude_mpm.core.base_service import BaseService
|
|
21
|
+
from claude_mpm.services.core.interfaces import UtilityServiceInterface
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class UtilityService(BaseService, UtilityServiceInterface):
|
|
25
|
+
"""Service for utility functions and helper methods."""
|
|
26
|
+
|
|
27
|
+
def __init__(self):
|
|
28
|
+
"""Initialize the utility service."""
|
|
29
|
+
super().__init__(name="utility_service")
|
|
30
|
+
|
|
31
|
+
async def _initialize(self) -> None:
|
|
32
|
+
"""Initialize the service. No special initialization needed."""
|
|
33
|
+
|
|
34
|
+
async def _cleanup(self) -> None:
|
|
35
|
+
"""Cleanup service resources. No cleanup needed."""
|
|
36
|
+
|
|
37
|
+
def contains_delegation(self, text: str) -> bool:
|
|
38
|
+
"""Check if text contains signs of agent delegation.
|
|
39
|
+
|
|
40
|
+
Args:
|
|
41
|
+
text: Text to check for delegation patterns
|
|
42
|
+
|
|
43
|
+
Returns:
|
|
44
|
+
bool: True if delegation patterns are found
|
|
45
|
+
"""
|
|
46
|
+
# Look for common delegation patterns
|
|
47
|
+
delegation_patterns = [
|
|
48
|
+
"Task(",
|
|
49
|
+
"subagent_type=",
|
|
50
|
+
"delegating to",
|
|
51
|
+
"asking the",
|
|
52
|
+
"engineer agent",
|
|
53
|
+
"qa agent",
|
|
54
|
+
"documentation agent",
|
|
55
|
+
"research agent",
|
|
56
|
+
"security agent",
|
|
57
|
+
"ops agent",
|
|
58
|
+
"version_control agent",
|
|
59
|
+
"data_engineer agent",
|
|
60
|
+
]
|
|
61
|
+
|
|
62
|
+
text_lower = text.lower()
|
|
63
|
+
return any(pattern.lower() in text_lower for pattern in delegation_patterns)
|
|
64
|
+
|
|
65
|
+
def extract_agent_from_response(self, text: str) -> Optional[str]:
|
|
66
|
+
"""Try to extract agent name from delegation response.
|
|
67
|
+
|
|
68
|
+
Args:
|
|
69
|
+
text: Response text to extract agent name from
|
|
70
|
+
|
|
71
|
+
Returns:
|
|
72
|
+
Optional[str]: Extracted agent name or None if not found
|
|
73
|
+
"""
|
|
74
|
+
# Pattern 1: subagent_type="agent_name"
|
|
75
|
+
match = re.search(r'subagent_type=["\']([^"\']*)["\'\)]', text)
|
|
76
|
+
if match:
|
|
77
|
+
return match.group(1)
|
|
78
|
+
|
|
79
|
+
# Pattern 2: "engineer agent" etc
|
|
80
|
+
agent_names = [
|
|
81
|
+
"engineer",
|
|
82
|
+
"qa",
|
|
83
|
+
"documentation",
|
|
84
|
+
"research",
|
|
85
|
+
"security",
|
|
86
|
+
"ops",
|
|
87
|
+
"version_control",
|
|
88
|
+
"data_engineer",
|
|
89
|
+
]
|
|
90
|
+
text_lower = text.lower()
|
|
91
|
+
for agent in agent_names:
|
|
92
|
+
if f"{agent} agent" in text_lower or f"agent: {agent}" in text_lower:
|
|
93
|
+
return agent
|
|
94
|
+
|
|
95
|
+
return None
|
|
96
|
+
|
|
97
|
+
def log_session_event(self, log_file: Optional[Path], event_data: Dict[str, Any]):
|
|
98
|
+
"""Log an event to the session log file.
|
|
99
|
+
|
|
100
|
+
Args:
|
|
101
|
+
log_file: Path to the session log file
|
|
102
|
+
event_data: Event data to log
|
|
103
|
+
"""
|
|
104
|
+
if not log_file:
|
|
105
|
+
return
|
|
106
|
+
|
|
107
|
+
try:
|
|
108
|
+
log_entry = {
|
|
109
|
+
"timestamp": datetime.now(timezone.utc).isoformat(),
|
|
110
|
+
**event_data,
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
with log_file.open("a") as f:
|
|
114
|
+
f.write(json.dumps(log_entry) + "\n")
|
|
115
|
+
|
|
116
|
+
except OSError as e:
|
|
117
|
+
self.logger.debug(f"IO error logging session event: {e}")
|
|
118
|
+
except Exception as e:
|
|
119
|
+
self.logger.debug(f"Failed to log session event: {e}")
|
|
120
|
+
|
|
121
|
+
def validate_prompt(self, prompt: str) -> bool:
|
|
122
|
+
"""Validate that a prompt is not empty and properly formatted.
|
|
123
|
+
|
|
124
|
+
Args:
|
|
125
|
+
prompt: Prompt to validate
|
|
126
|
+
|
|
127
|
+
Returns:
|
|
128
|
+
bool: True if prompt is valid
|
|
129
|
+
"""
|
|
130
|
+
if not prompt or not prompt.strip():
|
|
131
|
+
return False
|
|
132
|
+
|
|
133
|
+
# Check for minimum length
|
|
134
|
+
return not len(prompt.strip()) < 3
|
|
135
|
+
|
|
136
|
+
def sanitize_filename(self, filename: str) -> str:
|
|
137
|
+
"""Sanitize a filename by removing invalid characters.
|
|
138
|
+
|
|
139
|
+
Args:
|
|
140
|
+
filename: Filename to sanitize
|
|
141
|
+
|
|
142
|
+
Returns:
|
|
143
|
+
str: Sanitized filename
|
|
144
|
+
"""
|
|
145
|
+
# Remove invalid characters for filenames
|
|
146
|
+
invalid_chars = '<>:"/\\|?*'
|
|
147
|
+
sanitized = filename
|
|
148
|
+
for char in invalid_chars:
|
|
149
|
+
sanitized = sanitized.replace(char, "_")
|
|
150
|
+
|
|
151
|
+
# Remove leading/trailing whitespace and dots
|
|
152
|
+
sanitized = sanitized.strip(" .")
|
|
153
|
+
|
|
154
|
+
# Ensure filename is not empty
|
|
155
|
+
if not sanitized:
|
|
156
|
+
sanitized = "untitled"
|
|
157
|
+
|
|
158
|
+
return sanitized
|
|
159
|
+
|
|
160
|
+
def format_error_message(self, error: Exception, context: str = "") -> str:
|
|
161
|
+
"""Format an error message with context.
|
|
162
|
+
|
|
163
|
+
Args:
|
|
164
|
+
error: Exception to format
|
|
165
|
+
context: Optional context information
|
|
166
|
+
|
|
167
|
+
Returns:
|
|
168
|
+
str: Formatted error message
|
|
169
|
+
"""
|
|
170
|
+
error_type = type(error).__name__
|
|
171
|
+
error_msg = str(error)
|
|
172
|
+
|
|
173
|
+
if context:
|
|
174
|
+
return f"{context}: {error_type}: {error_msg}"
|
|
175
|
+
return f"{error_type}: {error_msg}"
|
|
176
|
+
|
|
177
|
+
def truncate_text(
|
|
178
|
+
self, text: str, max_length: int = 100, suffix: str = "..."
|
|
179
|
+
) -> str:
|
|
180
|
+
"""Truncate text to a maximum length.
|
|
181
|
+
|
|
182
|
+
Args:
|
|
183
|
+
text: Text to truncate
|
|
184
|
+
max_length: Maximum length before truncation
|
|
185
|
+
suffix: Suffix to add when truncating
|
|
186
|
+
|
|
187
|
+
Returns:
|
|
188
|
+
str: Truncated text
|
|
189
|
+
"""
|
|
190
|
+
if len(text) <= max_length:
|
|
191
|
+
return text
|
|
192
|
+
|
|
193
|
+
return text[: max_length - len(suffix)] + suffix
|
|
194
|
+
|
|
195
|
+
def parse_key_value_pairs(self, text: str) -> Dict[str, str]:
|
|
196
|
+
"""Parse key=value pairs from text.
|
|
197
|
+
|
|
198
|
+
Args:
|
|
199
|
+
text: Text containing key=value pairs
|
|
200
|
+
|
|
201
|
+
Returns:
|
|
202
|
+
Dict[str, str]: Parsed key-value pairs
|
|
203
|
+
"""
|
|
204
|
+
pairs = {}
|
|
205
|
+
|
|
206
|
+
# Look for key=value patterns
|
|
207
|
+
pattern = r'(\w+)=(["\']?)([^"\'\s]*)\2'
|
|
208
|
+
matches = re.findall(pattern, text)
|
|
209
|
+
|
|
210
|
+
for key, _quote, value in matches:
|
|
211
|
+
pairs[key] = value
|
|
212
|
+
|
|
213
|
+
return pairs
|
|
214
|
+
|
|
215
|
+
def get_service_status(self) -> Dict[str, Any]:
|
|
216
|
+
"""Get current utility service status.
|
|
217
|
+
|
|
218
|
+
Returns:
|
|
219
|
+
Dict[str, Any]: Service status information
|
|
220
|
+
"""
|
|
221
|
+
return {
|
|
222
|
+
"service_available": True,
|
|
223
|
+
"delegation_detection": True,
|
|
224
|
+
"session_logging": True,
|
|
225
|
+
"text_processing": True,
|
|
226
|
+
"pattern_matching": True,
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
# Implementation of abstract methods from UtilityServiceInterface
|
|
230
|
+
|
|
231
|
+
def format_file_size(self, size_bytes: int) -> str:
|
|
232
|
+
"""Format file size in human-readable format."""
|
|
233
|
+
if size_bytes == 0:
|
|
234
|
+
return "0 B"
|
|
235
|
+
units = ["B", "KB", "MB", "GB", "TB"]
|
|
236
|
+
unit_index = 0
|
|
237
|
+
size = float(size_bytes)
|
|
238
|
+
while size >= 1024 and unit_index < len(units) - 1:
|
|
239
|
+
size /= 1024
|
|
240
|
+
unit_index += 1
|
|
241
|
+
return (
|
|
242
|
+
f"{size:.1f} {units[unit_index]}"
|
|
243
|
+
if unit_index > 0
|
|
244
|
+
else f"{int(size)} {units[unit_index]}"
|
|
245
|
+
)
|
|
246
|
+
|
|
247
|
+
def format_duration(self, seconds: float) -> str:
|
|
248
|
+
"""Format duration in human-readable format."""
|
|
249
|
+
if seconds < 60:
|
|
250
|
+
return f"{seconds:.1f}s"
|
|
251
|
+
minutes = int(seconds // 60)
|
|
252
|
+
remaining_seconds = int(seconds % 60)
|
|
253
|
+
if minutes < 60:
|
|
254
|
+
return (
|
|
255
|
+
f"{minutes}m {remaining_seconds}s"
|
|
256
|
+
if remaining_seconds > 0
|
|
257
|
+
else f"{minutes}m"
|
|
258
|
+
)
|
|
259
|
+
hours = int(minutes // 60)
|
|
260
|
+
remaining_minutes = int(minutes % 60)
|
|
261
|
+
return (
|
|
262
|
+
f"{hours}h {remaining_minutes}m" if remaining_minutes > 0 else f"{hours}h"
|
|
263
|
+
)
|
|
264
|
+
|
|
265
|
+
def generate_unique_id(self, prefix: str = "") -> str:
|
|
266
|
+
"""Generate a unique identifier."""
|
|
267
|
+
unique_id = str(uuid.uuid4())
|
|
268
|
+
return f"{prefix}_{unique_id}" if prefix else unique_id
|
|
269
|
+
|
|
270
|
+
def validate_path(self, path: Path) -> Tuple[bool, Optional[str]]:
|
|
271
|
+
"""Validate a filesystem path."""
|
|
272
|
+
try:
|
|
273
|
+
if not isinstance(path, Path):
|
|
274
|
+
return False, "Path must be a Path object"
|
|
275
|
+
path_str = str(path)
|
|
276
|
+
if not path_str or path_str.isspace():
|
|
277
|
+
return False, "Path cannot be empty"
|
|
278
|
+
return True, None
|
|
279
|
+
except Exception as e:
|
|
280
|
+
return False, f"Path validation error: {e!s}"
|
|
@@ -8,63 +8,60 @@ This package provides modular services for the Version Control Agent including:
|
|
|
8
8
|
- Conflict resolution
|
|
9
9
|
"""
|
|
10
10
|
|
|
11
|
-
from .git_operations import (
|
|
12
|
-
GitOperationsManager,
|
|
13
|
-
GitBranchInfo,
|
|
14
|
-
GitOperationResult,
|
|
15
|
-
GitOperationError,
|
|
16
|
-
)
|
|
17
|
-
|
|
18
|
-
from .semantic_versioning import (
|
|
19
|
-
SemanticVersionManager,
|
|
20
|
-
SemanticVersion,
|
|
21
|
-
VersionBumpType,
|
|
22
|
-
VersionMetadata,
|
|
23
|
-
ChangeAnalysis,
|
|
24
|
-
)
|
|
25
|
-
|
|
26
11
|
from .branch_strategy import (
|
|
12
|
+
BranchLifecycleRule,
|
|
13
|
+
BranchNamingRule,
|
|
27
14
|
BranchStrategyManager,
|
|
28
15
|
BranchStrategyType,
|
|
29
16
|
BranchType,
|
|
30
17
|
BranchWorkflow,
|
|
31
|
-
BranchNamingRule,
|
|
32
|
-
BranchLifecycleRule,
|
|
33
18
|
)
|
|
34
|
-
|
|
35
19
|
from .conflict_resolution import (
|
|
20
|
+
ConflictAnalysis,
|
|
21
|
+
ConflictResolution,
|
|
36
22
|
ConflictResolutionManager,
|
|
37
23
|
ConflictType,
|
|
38
|
-
ResolutionStrategy,
|
|
39
24
|
FileConflict,
|
|
40
|
-
|
|
41
|
-
|
|
25
|
+
ResolutionStrategy,
|
|
26
|
+
)
|
|
27
|
+
from .git_operations import (
|
|
28
|
+
GitBranchInfo,
|
|
29
|
+
GitOperationError,
|
|
30
|
+
GitOperationResult,
|
|
31
|
+
GitOperationsManager,
|
|
32
|
+
)
|
|
33
|
+
from .semantic_versioning import (
|
|
34
|
+
ChangeAnalysis,
|
|
35
|
+
SemanticVersion,
|
|
36
|
+
SemanticVersionManager,
|
|
37
|
+
VersionBumpType,
|
|
38
|
+
VersionMetadata,
|
|
42
39
|
)
|
|
43
40
|
|
|
44
41
|
__all__ = [
|
|
45
|
-
|
|
46
|
-
"
|
|
47
|
-
"GitBranchInfo",
|
|
48
|
-
"GitOperationResult",
|
|
49
|
-
"GitOperationError",
|
|
50
|
-
# Semantic Versioning
|
|
51
|
-
"SemanticVersionManager",
|
|
52
|
-
"SemanticVersion",
|
|
53
|
-
"VersionBumpType",
|
|
54
|
-
"VersionMetadata",
|
|
55
|
-
"ChangeAnalysis",
|
|
42
|
+
"BranchLifecycleRule",
|
|
43
|
+
"BranchNamingRule",
|
|
56
44
|
# Branch Strategy
|
|
57
45
|
"BranchStrategyManager",
|
|
58
46
|
"BranchStrategyType",
|
|
59
47
|
"BranchType",
|
|
60
48
|
"BranchWorkflow",
|
|
61
|
-
"
|
|
62
|
-
"
|
|
49
|
+
"ChangeAnalysis",
|
|
50
|
+
"ConflictAnalysis",
|
|
51
|
+
"ConflictResolution",
|
|
63
52
|
# Conflict Resolution
|
|
64
53
|
"ConflictResolutionManager",
|
|
65
54
|
"ConflictType",
|
|
66
|
-
"ResolutionStrategy",
|
|
67
55
|
"FileConflict",
|
|
68
|
-
"
|
|
69
|
-
"
|
|
56
|
+
"GitBranchInfo",
|
|
57
|
+
"GitOperationError",
|
|
58
|
+
"GitOperationResult",
|
|
59
|
+
# Git Operations
|
|
60
|
+
"GitOperationsManager",
|
|
61
|
+
"ResolutionStrategy",
|
|
62
|
+
"SemanticVersion",
|
|
63
|
+
# Semantic Versioning
|
|
64
|
+
"SemanticVersionManager",
|
|
65
|
+
"VersionBumpType",
|
|
66
|
+
"VersionMetadata",
|
|
70
67
|
]
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
from pathlib import Path
|
|
2
|
+
|
|
1
3
|
"""
|
|
2
4
|
Branch Strategy Manager - Branch strategy implementations for Version Control Agent.
|
|
3
5
|
|
|
@@ -9,13 +11,14 @@ This module provides comprehensive branch strategy management including:
|
|
|
9
11
|
5. Branch lifecycle management
|
|
10
12
|
"""
|
|
11
13
|
|
|
12
|
-
from enum import Enum
|
|
13
|
-
from datetime import datetime
|
|
14
|
-
from pathlib import Path
|
|
15
|
-
from typing import Dict, List, Optional, Any, Tuple
|
|
16
|
-
from dataclasses import dataclass, field
|
|
17
14
|
import logging
|
|
18
15
|
import re
|
|
16
|
+
from dataclasses import dataclass, field
|
|
17
|
+
from datetime import datetime, timezone
|
|
18
|
+
from enum import Enum
|
|
19
|
+
from typing import Any, Dict, List, Optional, Tuple
|
|
20
|
+
|
|
21
|
+
from claude_mpm.core.unified_paths import get_path_manager
|
|
19
22
|
|
|
20
23
|
|
|
21
24
|
class BranchStrategyType(Enum):
|
|
@@ -264,7 +267,11 @@ class BranchStrategyManager:
|
|
|
264
267
|
development_branch="develop",
|
|
265
268
|
naming_rules=naming_rules,
|
|
266
269
|
lifecycle_rules=lifecycle_rules,
|
|
267
|
-
merge_targets={
|
|
270
|
+
merge_targets={
|
|
271
|
+
"feature/*": "develop",
|
|
272
|
+
"release/*": "main",
|
|
273
|
+
"hotfix/*": "main",
|
|
274
|
+
},
|
|
268
275
|
quality_gates=["testing", "code_review"],
|
|
269
276
|
)
|
|
270
277
|
|
|
@@ -303,7 +310,7 @@ class BranchStrategyManager:
|
|
|
303
310
|
"""Load strategy configuration from project files."""
|
|
304
311
|
# Try to load from configuration files
|
|
305
312
|
config_files = [
|
|
306
|
-
".
|
|
313
|
+
f"{get_path_manager().CONFIG_DIR}/config.json",
|
|
307
314
|
"workflow.md",
|
|
308
315
|
".github/workflows/branch-strategy.yml",
|
|
309
316
|
"branch-strategy.json",
|
|
@@ -351,9 +358,8 @@ class BranchStrategyManager:
|
|
|
351
358
|
self.current_strategy = self.strategies[strategy_type]
|
|
352
359
|
self.logger.info(f"Set branch strategy to {strategy_type.value}")
|
|
353
360
|
return True
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
return False
|
|
361
|
+
self.logger.error(f"Unknown strategy type: {strategy_type}")
|
|
362
|
+
return False
|
|
357
363
|
|
|
358
364
|
def generate_branch_name(
|
|
359
365
|
self,
|
|
@@ -388,10 +394,9 @@ class BranchStrategyManager:
|
|
|
388
394
|
prefix = branch_type.value + "/"
|
|
389
395
|
if ticket_id:
|
|
390
396
|
return f"{prefix}{ticket_id}"
|
|
391
|
-
|
|
397
|
+
if description:
|
|
392
398
|
return f"{prefix}{self._sanitize_branch_name(description)}"
|
|
393
|
-
|
|
394
|
-
return f"{prefix}{datetime.now().strftime('%Y%m%d')}"
|
|
399
|
+
return f"{prefix}{datetime.now(timezone.utc).strftime('%Y%m%d')}"
|
|
395
400
|
|
|
396
401
|
# Generate name based on rule
|
|
397
402
|
if strategy.strategy_type == BranchStrategyType.ISSUE_DRIVEN:
|
|
@@ -437,7 +442,10 @@ class BranchStrategyManager:
|
|
|
437
442
|
|
|
438
443
|
# Check length
|
|
439
444
|
if rule.max_length and len(branch_name) > rule.max_length:
|
|
440
|
-
return
|
|
445
|
+
return (
|
|
446
|
+
False,
|
|
447
|
+
f"Branch name exceeds maximum length: {rule.max_length}",
|
|
448
|
+
)
|
|
441
449
|
|
|
442
450
|
return True, "Valid branch name"
|
|
443
451
|
|
|
@@ -604,15 +612,16 @@ class BranchStrategyManager:
|
|
|
604
612
|
# Default merge message
|
|
605
613
|
if ticket_title:
|
|
606
614
|
return f"Merge {branch_name}: {ticket_title}"
|
|
607
|
-
|
|
608
|
-
return f"Merge {branch_name}"
|
|
615
|
+
return f"Merge {branch_name}"
|
|
609
616
|
|
|
610
617
|
def get_quality_gates(self) -> List[str]:
|
|
611
618
|
"""Get quality gates for the current strategy."""
|
|
612
619
|
strategy = self.get_current_strategy()
|
|
613
620
|
return strategy.quality_gates
|
|
614
621
|
|
|
615
|
-
def create_custom_strategy(
|
|
622
|
+
def create_custom_strategy(
|
|
623
|
+
self, name: str, config: Dict[str, Any]
|
|
624
|
+
) -> BranchWorkflow:
|
|
616
625
|
"""
|
|
617
626
|
Create a custom branch strategy.
|
|
618
627
|
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
from pathlib import Path
|
|
2
|
+
|
|
1
3
|
"""
|
|
2
4
|
Conflict Resolution Manager - Basic conflict resolution for Version Control Agent.
|
|
3
5
|
|
|
@@ -9,14 +11,11 @@ This module provides conflict resolution management including:
|
|
|
9
11
|
5. Resolution validation
|
|
10
12
|
"""
|
|
11
13
|
|
|
14
|
+
import logging
|
|
12
15
|
import re
|
|
13
|
-
import difflib
|
|
14
|
-
from datetime import datetime
|
|
15
|
-
from pathlib import Path
|
|
16
|
-
from typing import Dict, List, Optional, Any, Tuple, Union
|
|
17
16
|
from dataclasses import dataclass, field
|
|
18
17
|
from enum import Enum
|
|
19
|
-
import
|
|
18
|
+
from typing import Any, Dict, List, Optional
|
|
20
19
|
|
|
21
20
|
|
|
22
21
|
class ConflictType(Enum):
|
|
@@ -114,7 +113,11 @@ class ConflictResolutionManager:
|
|
|
114
113
|
self.logger = logger
|
|
115
114
|
|
|
116
115
|
# Conflict markers
|
|
117
|
-
self.conflict_markers = {
|
|
116
|
+
self.conflict_markers = {
|
|
117
|
+
"start": r"^<{7} ",
|
|
118
|
+
"separator": r"^={7}$",
|
|
119
|
+
"end": r"^>{7} ",
|
|
120
|
+
}
|
|
118
121
|
|
|
119
122
|
# Auto-resolution patterns
|
|
120
123
|
self.auto_resolution_patterns = {
|
|
@@ -125,7 +128,14 @@ class ConflictResolutionManager:
|
|
|
125
128
|
}
|
|
126
129
|
|
|
127
130
|
# File types that can be auto-resolved
|
|
128
|
-
self.auto_resolvable_extensions = {
|
|
131
|
+
self.auto_resolvable_extensions = {
|
|
132
|
+
".md",
|
|
133
|
+
".txt",
|
|
134
|
+
".json",
|
|
135
|
+
".yml",
|
|
136
|
+
".yaml",
|
|
137
|
+
".xml",
|
|
138
|
+
}
|
|
129
139
|
|
|
130
140
|
# Binary file extensions
|
|
131
141
|
self.binary_extensions = {
|
|
@@ -236,9 +246,7 @@ class ConflictResolutionManager:
|
|
|
236
246
|
|
|
237
247
|
conflicted_files = []
|
|
238
248
|
for line in result.stdout.strip().split("\n"):
|
|
239
|
-
if line.strip() and (
|
|
240
|
-
line.startswith("UU") or line.startswith("AA") or line.startswith("DD")
|
|
241
|
-
):
|
|
249
|
+
if line.strip() and (line.startswith(("UU", "AA", "DD"))):
|
|
242
250
|
# Extract filename
|
|
243
251
|
filename = line[3:].strip()
|
|
244
252
|
conflicted_files.append(filename)
|
|
@@ -266,7 +274,9 @@ class ConflictResolutionManager:
|
|
|
266
274
|
)
|
|
267
275
|
|
|
268
276
|
try:
|
|
269
|
-
with
|
|
277
|
+
with Path(full_path).open(
|
|
278
|
+
encoding="utf-8",
|
|
279
|
+
) as f:
|
|
270
280
|
content = f.read()
|
|
271
281
|
|
|
272
282
|
# Parse conflict markers
|
|
@@ -313,7 +323,7 @@ class ConflictResolutionManager:
|
|
|
313
323
|
|
|
314
324
|
# Check content (simple heuristic)
|
|
315
325
|
try:
|
|
316
|
-
with open(
|
|
326
|
+
with file_path.open("rb") as f:
|
|
317
327
|
chunk = f.read(1024)
|
|
318
328
|
if b"\0" in chunk:
|
|
319
329
|
return True
|
|
@@ -379,7 +389,9 @@ class ConflictResolutionManager:
|
|
|
379
389
|
# For now, default to content conflict
|
|
380
390
|
return ConflictType.CONTENT
|
|
381
391
|
|
|
382
|
-
def _is_auto_resolvable(
|
|
392
|
+
def _is_auto_resolvable(
|
|
393
|
+
self, file_path: str, markers: List[ConflictMarker]
|
|
394
|
+
) -> bool:
|
|
383
395
|
"""Determine if conflict can be automatically resolved."""
|
|
384
396
|
file_ext = Path(file_path).suffix.lower()
|
|
385
397
|
|
|
@@ -388,11 +400,7 @@ class ConflictResolutionManager:
|
|
|
388
400
|
return False
|
|
389
401
|
|
|
390
402
|
# Check if all conflicts are simple
|
|
391
|
-
for marker in markers
|
|
392
|
-
if not self._is_simple_conflict(marker):
|
|
393
|
-
return False
|
|
394
|
-
|
|
395
|
-
return True
|
|
403
|
+
return all(self._is_simple_conflict(marker) for marker in markers)
|
|
396
404
|
|
|
397
405
|
def _is_simple_conflict(self, marker: ConflictMarker) -> bool:
|
|
398
406
|
"""Check if a conflict marker represents a simple conflict."""
|
|
@@ -412,10 +420,7 @@ class ConflictResolutionManager:
|
|
|
412
420
|
return True
|
|
413
421
|
|
|
414
422
|
# Check if differences are only imports
|
|
415
|
-
|
|
416
|
-
return True
|
|
417
|
-
|
|
418
|
-
return False
|
|
423
|
+
return bool(self._only_import_differences(ours_lines, theirs_lines))
|
|
419
424
|
|
|
420
425
|
def _only_whitespace_differences(self, ours: List[str], theirs: List[str]) -> bool:
|
|
421
426
|
"""Check if differences are only whitespace."""
|
|
@@ -428,7 +433,7 @@ class ConflictResolutionManager:
|
|
|
428
433
|
# This is a simplified check
|
|
429
434
|
for line in ours + theirs:
|
|
430
435
|
stripped = line.strip()
|
|
431
|
-
if stripped and not (stripped.startswith("#"
|
|
436
|
+
if stripped and not (stripped.startswith(("#", "//"))):
|
|
432
437
|
return False
|
|
433
438
|
return True
|
|
434
439
|
|
|
@@ -442,7 +447,9 @@ class ConflictResolutionManager:
|
|
|
442
447
|
return False
|
|
443
448
|
return True
|
|
444
449
|
|
|
445
|
-
def _generate_resolution_suggestion(
|
|
450
|
+
def _generate_resolution_suggestion(
|
|
451
|
+
self, file_path: str, markers: List[ConflictMarker]
|
|
452
|
+
) -> str:
|
|
446
453
|
"""Generate resolution suggestion for a file."""
|
|
447
454
|
if not markers:
|
|
448
455
|
return "No conflict markers found"
|
|
@@ -451,15 +458,19 @@ class ConflictResolutionManager:
|
|
|
451
458
|
|
|
452
459
|
for i, marker in enumerate(markers):
|
|
453
460
|
if not marker.ours_content and marker.theirs_content:
|
|
454
|
-
suggestions.append(
|
|
461
|
+
suggestions.append(
|
|
462
|
+
f"Conflict {i + 1}: Accept incoming changes (theirs)"
|
|
463
|
+
)
|
|
455
464
|
elif marker.ours_content and not marker.theirs_content:
|
|
456
|
-
suggestions.append(f"Conflict {i+1}: Keep current changes (ours)")
|
|
457
|
-
elif self._only_whitespace_differences(
|
|
465
|
+
suggestions.append(f"Conflict {i + 1}: Keep current changes (ours)")
|
|
466
|
+
elif self._only_whitespace_differences(
|
|
467
|
+
marker.ours_content, marker.theirs_content
|
|
468
|
+
):
|
|
458
469
|
suggestions.append(
|
|
459
|
-
f"Conflict {i+1}: Whitespace differences only - can auto-resolve"
|
|
470
|
+
f"Conflict {i + 1}: Whitespace differences only - can auto-resolve"
|
|
460
471
|
)
|
|
461
472
|
else:
|
|
462
|
-
suggestions.append(f"Conflict {i+1}: Manual merge required")
|
|
473
|
+
suggestions.append(f"Conflict {i + 1}: Manual merge required")
|
|
463
474
|
|
|
464
475
|
return "; ".join(suggestions)
|
|
465
476
|
|
|
@@ -496,10 +507,9 @@ class ConflictResolutionManager:
|
|
|
496
507
|
|
|
497
508
|
if auto_ratio > 0.8:
|
|
498
509
|
return "simple"
|
|
499
|
-
|
|
510
|
+
if auto_ratio > 0.5:
|
|
500
511
|
return "moderate"
|
|
501
|
-
|
|
502
|
-
return "complex"
|
|
512
|
+
return "complex"
|
|
503
513
|
|
|
504
514
|
def _estimate_resolution_time(self, file_conflicts: List[FileConflict]) -> int:
|
|
505
515
|
"""Estimate resolution time in minutes."""
|
|
@@ -555,7 +565,9 @@ class ConflictResolutionManager:
|
|
|
555
565
|
resolutions.append(resolution)
|
|
556
566
|
|
|
557
567
|
except Exception as e:
|
|
558
|
-
self.logger.error(
|
|
568
|
+
self.logger.error(
|
|
569
|
+
f"Error resolving conflict in {conflict.file_path}: {e}"
|
|
570
|
+
)
|
|
559
571
|
resolutions.append(
|
|
560
572
|
ConflictResolution(
|
|
561
573
|
file_path=conflict.file_path,
|
|
@@ -579,14 +591,18 @@ class ConflictResolutionManager:
|
|
|
579
591
|
|
|
580
592
|
try:
|
|
581
593
|
# Read current content
|
|
582
|
-
with
|
|
594
|
+
with Path(file_path).open(
|
|
595
|
+
encoding="utf-8",
|
|
596
|
+
) as f:
|
|
583
597
|
content = f.read()
|
|
584
598
|
|
|
585
599
|
# Apply resolution strategy
|
|
586
|
-
resolved_content = self._apply_resolution_strategy(
|
|
600
|
+
resolved_content = self._apply_resolution_strategy(
|
|
601
|
+
content, conflict.markers, strategy
|
|
602
|
+
)
|
|
587
603
|
|
|
588
604
|
# Write resolved content
|
|
589
|
-
with open(
|
|
605
|
+
with file_path.open("w", encoding="utf-8") as f:
|
|
590
606
|
f.write(resolved_content)
|
|
591
607
|
|
|
592
608
|
return ConflictResolution(
|