moai-adk 0.35.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of moai-adk might be problematic. Click here for more details.
- moai_adk/__init__.py +10 -0
- moai_adk/__main__.py +199 -0
- moai_adk/cli/__init__.py +6 -0
- moai_adk/cli/commands/__init__.py +17 -0
- moai_adk/cli/commands/analyze.py +116 -0
- moai_adk/cli/commands/doctor.py +272 -0
- moai_adk/cli/commands/init.py +372 -0
- moai_adk/cli/commands/language.py +248 -0
- moai_adk/cli/commands/status.py +104 -0
- moai_adk/cli/commands/update.py +2686 -0
- moai_adk/cli/main.py +13 -0
- moai_adk/cli/prompts/__init__.py +5 -0
- moai_adk/cli/prompts/init_prompts.py +219 -0
- moai_adk/cli/spec_status.py +263 -0
- moai_adk/cli/ui/__init__.py +44 -0
- moai_adk/cli/ui/progress.py +422 -0
- moai_adk/cli/ui/prompts.py +389 -0
- moai_adk/cli/ui/theme.py +129 -0
- moai_adk/cli/worktree/__init__.py +27 -0
- moai_adk/cli/worktree/__main__.py +31 -0
- moai_adk/cli/worktree/cli.py +683 -0
- moai_adk/cli/worktree/exceptions.py +89 -0
- moai_adk/cli/worktree/manager.py +493 -0
- moai_adk/cli/worktree/models.py +65 -0
- moai_adk/cli/worktree/registry.py +422 -0
- moai_adk/core/PHASE2_OPTIMIZATIONS.md +467 -0
- moai_adk/core/__init__.py +1 -0
- moai_adk/core/analysis/__init__.py +9 -0
- moai_adk/core/analysis/session_analyzer.py +400 -0
- moai_adk/core/claude_integration.py +393 -0
- moai_adk/core/command_helpers.py +270 -0
- moai_adk/core/comprehensive_monitoring_system.py +1183 -0
- moai_adk/core/config/__init__.py +19 -0
- moai_adk/core/config/auto_spec_config.py +340 -0
- moai_adk/core/config/migration.py +244 -0
- moai_adk/core/config/unified.py +436 -0
- moai_adk/core/context_manager.py +273 -0
- moai_adk/core/diagnostics/__init__.py +19 -0
- moai_adk/core/diagnostics/slash_commands.py +159 -0
- moai_adk/core/enterprise_features.py +1404 -0
- moai_adk/core/error_recovery_system.py +1902 -0
- moai_adk/core/event_driven_hook_system.py +1371 -0
- moai_adk/core/git/__init__.py +31 -0
- moai_adk/core/git/branch.py +25 -0
- moai_adk/core/git/branch_manager.py +129 -0
- moai_adk/core/git/checkpoint.py +134 -0
- moai_adk/core/git/commit.py +67 -0
- moai_adk/core/git/conflict_detector.py +413 -0
- moai_adk/core/git/event_detector.py +79 -0
- moai_adk/core/git/manager.py +216 -0
- moai_adk/core/hooks/post_tool_auto_spec_completion.py +901 -0
- moai_adk/core/input_validation_middleware.py +1006 -0
- moai_adk/core/integration/__init__.py +22 -0
- moai_adk/core/integration/engine.py +157 -0
- moai_adk/core/integration/integration_tester.py +226 -0
- moai_adk/core/integration/models.py +88 -0
- moai_adk/core/integration/utils.py +211 -0
- moai_adk/core/issue_creator.py +305 -0
- moai_adk/core/jit_context_loader.py +956 -0
- moai_adk/core/jit_enhanced_hook_manager.py +1987 -0
- moai_adk/core/language_config.py +202 -0
- moai_adk/core/language_config_resolver.py +572 -0
- moai_adk/core/language_validator.py +543 -0
- moai_adk/core/mcp/setup.py +116 -0
- moai_adk/core/merge/__init__.py +9 -0
- moai_adk/core/merge/analyzer.py +605 -0
- moai_adk/core/migration/__init__.py +18 -0
- moai_adk/core/migration/alfred_to_moai_migrator.py +383 -0
- moai_adk/core/migration/backup_manager.py +277 -0
- moai_adk/core/migration/custom_element_scanner.py +358 -0
- moai_adk/core/migration/file_migrator.py +209 -0
- moai_adk/core/migration/interactive_checkbox_ui.py +488 -0
- moai_adk/core/migration/selective_restorer.py +470 -0
- moai_adk/core/migration/template_utils.py +74 -0
- moai_adk/core/migration/user_selection_ui.py +338 -0
- moai_adk/core/migration/version_detector.py +139 -0
- moai_adk/core/migration/version_migrator.py +228 -0
- moai_adk/core/performance/__init__.py +6 -0
- moai_adk/core/performance/cache_system.py +316 -0
- moai_adk/core/performance/parallel_processor.py +116 -0
- moai_adk/core/phase_optimized_hook_scheduler.py +879 -0
- moai_adk/core/project/__init__.py +1 -0
- moai_adk/core/project/backup_utils.py +70 -0
- moai_adk/core/project/checker.py +300 -0
- moai_adk/core/project/detector.py +293 -0
- moai_adk/core/project/initializer.py +387 -0
- moai_adk/core/project/phase_executor.py +716 -0
- moai_adk/core/project/validator.py +139 -0
- moai_adk/core/quality/__init__.py +6 -0
- moai_adk/core/quality/trust_checker.py +377 -0
- moai_adk/core/quality/validators/__init__.py +6 -0
- moai_adk/core/quality/validators/base_validator.py +19 -0
- moai_adk/core/realtime_monitoring_dashboard.py +1724 -0
- moai_adk/core/robust_json_parser.py +611 -0
- moai_adk/core/rollback_manager.py +918 -0
- moai_adk/core/session_manager.py +651 -0
- moai_adk/core/skill_loading_system.py +579 -0
- moai_adk/core/spec/confidence_scoring.py +680 -0
- moai_adk/core/spec/ears_template_engine.py +1247 -0
- moai_adk/core/spec/quality_validator.py +687 -0
- moai_adk/core/spec_status_manager.py +478 -0
- moai_adk/core/template/__init__.py +7 -0
- moai_adk/core/template/backup.py +174 -0
- moai_adk/core/template/config.py +191 -0
- moai_adk/core/template/languages.py +43 -0
- moai_adk/core/template/merger.py +233 -0
- moai_adk/core/template/processor.py +1200 -0
- moai_adk/core/template_engine.py +310 -0
- moai_adk/core/template_variable_synchronizer.py +417 -0
- moai_adk/core/unified_permission_manager.py +745 -0
- moai_adk/core/user_behavior_analytics.py +851 -0
- moai_adk/core/version_sync.py +429 -0
- moai_adk/foundation/__init__.py +56 -0
- moai_adk/foundation/backend.py +1027 -0
- moai_adk/foundation/database.py +1115 -0
- moai_adk/foundation/devops.py +1585 -0
- moai_adk/foundation/ears.py +431 -0
- moai_adk/foundation/frontend.py +870 -0
- moai_adk/foundation/git/commit_templates.py +557 -0
- moai_adk/foundation/git.py +376 -0
- moai_adk/foundation/langs.py +484 -0
- moai_adk/foundation/ml_ops.py +1162 -0
- moai_adk/foundation/testing.py +1524 -0
- moai_adk/foundation/trust/trust_principles.py +676 -0
- moai_adk/foundation/trust/validation_checklist.py +1573 -0
- moai_adk/project/__init__.py +0 -0
- moai_adk/project/configuration.py +1084 -0
- moai_adk/project/documentation.py +566 -0
- moai_adk/project/schema.py +447 -0
- moai_adk/statusline/__init__.py +38 -0
- moai_adk/statusline/alfred_detector.py +105 -0
- moai_adk/statusline/config.py +376 -0
- moai_adk/statusline/enhanced_output_style_detector.py +372 -0
- moai_adk/statusline/git_collector.py +190 -0
- moai_adk/statusline/main.py +322 -0
- moai_adk/statusline/metrics_tracker.py +78 -0
- moai_adk/statusline/renderer.py +343 -0
- moai_adk/statusline/update_checker.py +129 -0
- moai_adk/statusline/version_reader.py +741 -0
- moai_adk/templates/.claude/agents/moai/ai-nano-banana.md +714 -0
- moai_adk/templates/.claude/agents/moai/builder-agent.md +474 -0
- moai_adk/templates/.claude/agents/moai/builder-command.md +1172 -0
- moai_adk/templates/.claude/agents/moai/builder-plugin.md +637 -0
- moai_adk/templates/.claude/agents/moai/builder-skill.md +666 -0
- moai_adk/templates/.claude/agents/moai/expert-backend.md +899 -0
- moai_adk/templates/.claude/agents/moai/expert-database.md +777 -0
- moai_adk/templates/.claude/agents/moai/expert-debug.md +401 -0
- moai_adk/templates/.claude/agents/moai/expert-devops.md +720 -0
- moai_adk/templates/.claude/agents/moai/expert-frontend.md +734 -0
- moai_adk/templates/.claude/agents/moai/expert-performance.md +657 -0
- moai_adk/templates/.claude/agents/moai/expert-security.md +513 -0
- moai_adk/templates/.claude/agents/moai/expert-testing.md +733 -0
- moai_adk/templates/.claude/agents/moai/expert-uiux.md +1041 -0
- moai_adk/templates/.claude/agents/moai/manager-claude-code.md +432 -0
- moai_adk/templates/.claude/agents/moai/manager-docs.md +573 -0
- moai_adk/templates/.claude/agents/moai/manager-git.md +1060 -0
- moai_adk/templates/.claude/agents/moai/manager-project.md +891 -0
- moai_adk/templates/.claude/agents/moai/manager-quality.md +624 -0
- moai_adk/templates/.claude/agents/moai/manager-spec.md +809 -0
- moai_adk/templates/.claude/agents/moai/manager-strategy.md +780 -0
- moai_adk/templates/.claude/agents/moai/manager-tdd.md +784 -0
- moai_adk/templates/.claude/agents/moai/mcp-context7.md +458 -0
- moai_adk/templates/.claude/agents/moai/mcp-figma.md +1607 -0
- moai_adk/templates/.claude/agents/moai/mcp-notion.md +789 -0
- moai_adk/templates/.claude/agents/moai/mcp-playwright.md +469 -0
- moai_adk/templates/.claude/agents/moai/mcp-sequential-thinking.md +1032 -0
- moai_adk/templates/.claude/commands/moai/0-project.md +1386 -0
- moai_adk/templates/.claude/commands/moai/1-plan.md +1427 -0
- moai_adk/templates/.claude/commands/moai/2-run.md +943 -0
- moai_adk/templates/.claude/commands/moai/3-sync.md +1324 -0
- moai_adk/templates/.claude/commands/moai/9-feedback.md +314 -0
- moai_adk/templates/.claude/hooks/__init__.py +8 -0
- moai_adk/templates/.claude/hooks/moai/__init__.py +8 -0
- moai_adk/templates/.claude/hooks/moai/lib/__init__.py +85 -0
- moai_adk/templates/.claude/hooks/moai/lib/checkpoint.py +244 -0
- moai_adk/templates/.claude/hooks/moai/lib/common.py +131 -0
- moai_adk/templates/.claude/hooks/moai/lib/config_manager.py +446 -0
- moai_adk/templates/.claude/hooks/moai/lib/config_validator.py +639 -0
- moai_adk/templates/.claude/hooks/moai/lib/example_config.json +104 -0
- moai_adk/templates/.claude/hooks/moai/lib/git_operations_manager.py +590 -0
- moai_adk/templates/.claude/hooks/moai/lib/language_validator.py +317 -0
- moai_adk/templates/.claude/hooks/moai/lib/models.py +102 -0
- moai_adk/templates/.claude/hooks/moai/lib/path_utils.py +28 -0
- moai_adk/templates/.claude/hooks/moai/lib/project.py +768 -0
- moai_adk/templates/.claude/hooks/moai/lib/test_hooks_improvements.py +443 -0
- moai_adk/templates/.claude/hooks/moai/lib/timeout.py +160 -0
- moai_adk/templates/.claude/hooks/moai/lib/unified_timeout_manager.py +530 -0
- moai_adk/templates/.claude/hooks/moai/session_end__auto_cleanup.py +862 -0
- moai_adk/templates/.claude/hooks/moai/session_start__show_project_info.py +1083 -0
- moai_adk/templates/.claude/output-styles/moai/r2d2.md +560 -0
- moai_adk/templates/.claude/output-styles/moai/yoda.md +359 -0
- moai_adk/templates/.claude/settings.json +172 -0
- moai_adk/templates/.claude/skills/moai-ai-nano-banana/SKILL.md +307 -0
- moai_adk/templates/.claude/skills/moai-ai-nano-banana/examples.md +431 -0
- moai_adk/templates/.claude/skills/moai-ai-nano-banana/scripts/batch_generate.py +560 -0
- moai_adk/templates/.claude/skills/moai-ai-nano-banana/scripts/generate_image.py +362 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/SKILL.md +249 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/examples.md +406 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/README.md +44 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/api-documentation.md +130 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/code-documentation.md +152 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/multi-format-output.md +178 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/user-guides.md +147 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/reference.md +328 -0
- moai_adk/templates/.claude/skills/moai-domain-backend/SKILL.md +320 -0
- moai_adk/templates/.claude/skills/moai-domain-backend/examples.md +718 -0
- moai_adk/templates/.claude/skills/moai-domain-backend/reference.md +464 -0
- moai_adk/templates/.claude/skills/moai-domain-database/SKILL.md +323 -0
- moai_adk/templates/.claude/skills/moai-domain-database/examples.md +830 -0
- moai_adk/templates/.claude/skills/moai-domain-database/modules/README.md +53 -0
- moai_adk/templates/.claude/skills/moai-domain-database/modules/mongodb.md +231 -0
- moai_adk/templates/.claude/skills/moai-domain-database/modules/postgresql.md +169 -0
- moai_adk/templates/.claude/skills/moai-domain-database/modules/redis.md +262 -0
- moai_adk/templates/.claude/skills/moai-domain-database/reference.md +545 -0
- moai_adk/templates/.claude/skills/moai-domain-frontend/SKILL.md +497 -0
- moai_adk/templates/.claude/skills/moai-domain-frontend/examples.md +968 -0
- moai_adk/templates/.claude/skills/moai-domain-frontend/reference.md +664 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/SKILL.md +455 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/examples.md +560 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/modules/accessibility-wcag.md +260 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/modules/component-architecture.md +228 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/modules/icon-libraries.md +401 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/modules/theming-system.md +373 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/reference.md +243 -0
- moai_adk/templates/.claude/skills/moai-formats-data/SKILL.md +492 -0
- moai_adk/templates/.claude/skills/moai-formats-data/examples.md +804 -0
- moai_adk/templates/.claude/skills/moai-formats-data/modules/README.md +98 -0
- moai_adk/templates/.claude/skills/moai-formats-data/modules/SKILL-MODULARIZATION-TEMPLATE.md +278 -0
- moai_adk/templates/.claude/skills/moai-formats-data/modules/caching-performance.md +459 -0
- moai_adk/templates/.claude/skills/moai-formats-data/modules/data-validation.md +485 -0
- moai_adk/templates/.claude/skills/moai-formats-data/modules/json-optimization.md +374 -0
- moai_adk/templates/.claude/skills/moai-formats-data/modules/toon-encoding.md +308 -0
- moai_adk/templates/.claude/skills/moai-formats-data/reference.md +585 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/SKILL.md +202 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/examples.md +732 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/best-practices-checklist.md +616 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-custom-slash-commands-official.md +729 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-hooks-official.md +560 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-iam-official.md +635 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-memory-official.md +543 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-settings-official.md +663 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-skills-official.md +113 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-sub-agents-official.md +238 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/complete-configuration-guide.md +175 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/skill-examples.md +1674 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/skill-formatting-guide.md +729 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/sub-agents/sub-agent-examples.md +1513 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/sub-agents/sub-agent-formatting-guide.md +1086 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/sub-agents/sub-agent-integration-patterns.md +1100 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference.md +209 -0
- moai_adk/templates/.claude/skills/moai-foundation-context/SKILL.md +441 -0
- moai_adk/templates/.claude/skills/moai-foundation-context/examples.md +1048 -0
- moai_adk/templates/.claude/skills/moai-foundation-context/reference.md +246 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/SKILL.md +420 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/examples.md +358 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/README.md +296 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/agents-reference.md +359 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/commands-reference.md +432 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/delegation-patterns.md +757 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/execution-rules.md +687 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/modular-system.md +665 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/progressive-disclosure.md +649 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/spec-first-tdd.md +864 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/token-optimization.md +708 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/trust-5-framework.md +981 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/reference.md +478 -0
- moai_adk/templates/.claude/skills/moai-foundation-philosopher/SKILL.md +315 -0
- moai_adk/templates/.claude/skills/moai-foundation-philosopher/examples.md +228 -0
- moai_adk/templates/.claude/skills/moai-foundation-philosopher/modules/assumption-matrix.md +80 -0
- moai_adk/templates/.claude/skills/moai-foundation-philosopher/modules/cognitive-bias.md +199 -0
- moai_adk/templates/.claude/skills/moai-foundation-philosopher/modules/first-principles.md +140 -0
- moai_adk/templates/.claude/skills/moai-foundation-philosopher/modules/trade-off-analysis.md +154 -0
- moai_adk/templates/.claude/skills/moai-foundation-philosopher/reference.md +157 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/SKILL.md +364 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/examples.md +1232 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/modules/best-practices.md +261 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/modules/integration-patterns.md +194 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/modules/proactive-analysis.md +229 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/modules/trust5-validation.md +169 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/reference.md +1266 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/scripts/quality-gate.sh +668 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/templates/github-actions-quality.yml +481 -0
- moai_adk/templates/.claude/skills/moai-foundation-quality/templates/quality-config.yaml +519 -0
- moai_adk/templates/.claude/skills/moai-lang-cpp/SKILL.md +649 -0
- moai_adk/templates/.claude/skills/moai-lang-csharp/SKILL.md +478 -0
- moai_adk/templates/.claude/skills/moai-lang-elixir/SKILL.md +612 -0
- moai_adk/templates/.claude/skills/moai-lang-flutter/SKILL.md +477 -0
- moai_adk/templates/.claude/skills/moai-lang-flutter/examples.md +1090 -0
- moai_adk/templates/.claude/skills/moai-lang-flutter/reference.md +686 -0
- moai_adk/templates/.claude/skills/moai-lang-go/SKILL.md +376 -0
- moai_adk/templates/.claude/skills/moai-lang-go/examples.md +919 -0
- moai_adk/templates/.claude/skills/moai-lang-go/reference.md +737 -0
- moai_adk/templates/.claude/skills/moai-lang-java/SKILL.md +385 -0
- moai_adk/templates/.claude/skills/moai-lang-java/examples.md +864 -0
- moai_adk/templates/.claude/skills/moai-lang-java/reference.md +291 -0
- moai_adk/templates/.claude/skills/moai-lang-kotlin/SKILL.md +382 -0
- moai_adk/templates/.claude/skills/moai-lang-kotlin/examples.md +1006 -0
- moai_adk/templates/.claude/skills/moai-lang-kotlin/reference.md +562 -0
- moai_adk/templates/.claude/skills/moai-lang-php/SKILL.md +644 -0
- moai_adk/templates/.claude/skills/moai-lang-python/SKILL.md +481 -0
- moai_adk/templates/.claude/skills/moai-lang-python/examples.md +977 -0
- moai_adk/templates/.claude/skills/moai-lang-python/reference.md +804 -0
- moai_adk/templates/.claude/skills/moai-lang-r/SKILL.md +579 -0
- moai_adk/templates/.claude/skills/moai-lang-ruby/SKILL.md +687 -0
- moai_adk/templates/.claude/skills/moai-lang-rust/SKILL.md +372 -0
- moai_adk/templates/.claude/skills/moai-lang-rust/examples.md +659 -0
- moai_adk/templates/.claude/skills/moai-lang-rust/reference.md +504 -0
- moai_adk/templates/.claude/skills/moai-lang-scala/SKILL.md +497 -0
- moai_adk/templates/.claude/skills/moai-lang-scala/examples.md +633 -0
- moai_adk/templates/.claude/skills/moai-lang-scala/reference.md +423 -0
- moai_adk/templates/.claude/skills/moai-lang-swift/SKILL.md +497 -0
- moai_adk/templates/.claude/skills/moai-lang-swift/examples.md +918 -0
- moai_adk/templates/.claude/skills/moai-lang-swift/reference.md +672 -0
- moai_adk/templates/.claude/skills/moai-lang-typescript/SKILL.md +368 -0
- moai_adk/templates/.claude/skills/moai-lang-typescript/examples.md +1089 -0
- moai_adk/templates/.claude/skills/moai-lang-typescript/reference.md +731 -0
- moai_adk/templates/.claude/skills/moai-library-mermaid/SKILL.md +300 -0
- moai_adk/templates/.claude/skills/moai-library-mermaid/advanced-patterns.md +465 -0
- moai_adk/templates/.claude/skills/moai-library-mermaid/examples.md +270 -0
- moai_adk/templates/.claude/skills/moai-library-mermaid/optimization.md +440 -0
- moai_adk/templates/.claude/skills/moai-library-mermaid/reference.md +228 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/SKILL.md +319 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/advanced-patterns.md +336 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/examples.md +592 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/advanced-deployment-patterns.md +182 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/advanced-patterns.md +17 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/configuration.md +57 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/content-architecture-optimization.md +162 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/deployment.md +52 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/framework-core-configuration.md +186 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/i18n-setup.md +55 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/mdx-components.md +52 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/optimization.md +303 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/reference.md +379 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/SKILL.md +372 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/examples.md +575 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/modules/advanced-patterns.md +394 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/modules/optimization.md +278 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/modules/shadcn-components.md +457 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/modules/shadcn-theming.md +373 -0
- moai_adk/templates/.claude/skills/moai-library-shadcn/reference.md +74 -0
- moai_adk/templates/.claude/skills/moai-mcp-figma/SKILL.md +402 -0
- moai_adk/templates/.claude/skills/moai-mcp-figma/advanced-patterns.md +607 -0
- moai_adk/templates/.claude/skills/moai-mcp-notion/SKILL.md +300 -0
- moai_adk/templates/.claude/skills/moai-mcp-notion/advanced-patterns.md +537 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/SKILL.md +291 -0
- moai_adk/templates/.claude/skills/moai-platform-clerk/SKILL.md +390 -0
- moai_adk/templates/.claude/skills/moai-platform-convex/SKILL.md +398 -0
- moai_adk/templates/.claude/skills/moai-platform-firebase-auth/SKILL.md +379 -0
- moai_adk/templates/.claude/skills/moai-platform-firestore/SKILL.md +358 -0
- moai_adk/templates/.claude/skills/moai-platform-neon/SKILL.md +467 -0
- moai_adk/templates/.claude/skills/moai-platform-railway/SKILL.md +377 -0
- moai_adk/templates/.claude/skills/moai-platform-supabase/SKILL.md +466 -0
- moai_adk/templates/.claude/skills/moai-platform-vercel/SKILL.md +482 -0
- moai_adk/templates/.claude/skills/moai-plugin-builder/SKILL.md +474 -0
- moai_adk/templates/.claude/skills/moai-plugin-builder/examples.md +621 -0
- moai_adk/templates/.claude/skills/moai-plugin-builder/migration.md +341 -0
- moai_adk/templates/.claude/skills/moai-plugin-builder/reference.md +463 -0
- moai_adk/templates/.claude/skills/moai-plugin-builder/validation.md +373 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/SKILL.md +275 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/adaptive-mfa.md +233 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/akamai-integration.md +215 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/application-credentials.md +280 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/attack-protection-log-events.md +225 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/attack-protection-overview.md +140 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/bot-detection.md +144 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/breached-password-detection.md +187 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/brute-force-protection.md +189 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/certifications.md +282 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/compliance-overview.md +263 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/continuous-session-protection.md +307 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/customize-mfa.md +178 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/dpop-implementation.md +283 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/fapi-implementation.md +259 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/gdpr-compliance.md +313 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/guardian-configuration.md +269 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/highly-regulated-identity.md +272 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/jwt-fundamentals.md +248 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/mdl-verification.md +211 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/mfa-api-management.md +278 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/mfa-factors.md +226 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/mfa-overview.md +174 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/mtls-sender-constraining.md +316 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/ropg-flow-mfa.md +217 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/security-center.md +325 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/security-guidance.md +277 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/state-parameters.md +178 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/step-up-authentication.md +251 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/suspicious-ip-throttling.md +240 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/tenant-access-control.md +180 -0
- moai_adk/templates/.claude/skills/moai-security-auth0/modules/webauthn-fido.md +235 -0
- moai_adk/templates/.claude/skills/moai-workflow-jit-docs/SKILL.md +449 -0
- moai_adk/templates/.claude/skills/moai-workflow-jit-docs/advanced-patterns.md +379 -0
- moai_adk/templates/.claude/skills/moai-workflow-jit-docs/examples.md +544 -0
- moai_adk/templates/.claude/skills/moai-workflow-jit-docs/optimization.md +286 -0
- moai_adk/templates/.claude/skills/moai-workflow-jit-docs/reference.md +307 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/README.md +190 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/SKILL.md +390 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/__init__.py +520 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/complete_workflow_demo_fixed.py +574 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/complete_project_setup.py +317 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/complete_workflow_demo.py +663 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/config-migration-example.json +190 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/question-examples.json +175 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/quick_start.py +196 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/examples.md +547 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/__init__.py +17 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/advanced-patterns.md +158 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/ask_user_integration.py +340 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/batch_questions.py +713 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/config_manager.py +538 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/documentation_manager.py +1336 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/language_initializer.py +730 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/migration_manager.py +608 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/template_optimizer.py +1005 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/reference.md +275 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/schemas/config-schema.json +316 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/schemas/tab_schema.json +1434 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/config-template.json +71 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/doc-templates/product-template.md +44 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/doc-templates/structure-template.md +48 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/doc-templates/tech-template.md +92 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/config-manager-setup.json +109 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/language-initializer.json +228 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/menu-project-config.json +130 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/project-batch-questions.json +97 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/templates/question-templates/spec-workflow-setup.json +150 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/test_integration_simple.py +436 -0
- moai_adk/templates/.claude/skills/moai-workflow-spec/SKILL.md +534 -0
- moai_adk/templates/.claude/skills/moai-workflow-spec/examples.md +900 -0
- moai_adk/templates/.claude/skills/moai-workflow-spec/reference.md +704 -0
- moai_adk/templates/.claude/skills/moai-workflow-templates/SKILL.md +377 -0
- moai_adk/templates/.claude/skills/moai-workflow-templates/examples.md +552 -0
- moai_adk/templates/.claude/skills/moai-workflow-templates/modules/code-templates.md +124 -0
- moai_adk/templates/.claude/skills/moai-workflow-templates/modules/feedback-templates.md +100 -0
- moai_adk/templates/.claude/skills/moai-workflow-templates/modules/template-optimizer.md +138 -0
- moai_adk/templates/.claude/skills/moai-workflow-templates/reference.md +346 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/LICENSE.txt +202 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/SKILL.md +456 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/advanced-patterns.md +576 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/examples/ai-powered-testing.py +294 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/examples/console_logging.py +35 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/examples/element_discovery.py +40 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/examples/static_html_automation.py +34 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/examples.md +672 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/README.md +220 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/ai-debugging.md +845 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review.md +1416 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/performance-optimization.md +1234 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/smart-refactoring.md +1243 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/tdd-context7.md +1260 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/optimization.md +505 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/reference/playwright-best-practices.md +57 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/reference.md +440 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/scripts/with_server.py +218 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/templates/alfred-integration.md +376 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/workflows/enterprise-testing-workflow.py +571 -0
- moai_adk/templates/.claude/skills/moai-worktree/SKILL.md +411 -0
- moai_adk/templates/.claude/skills/moai-worktree/examples.md +606 -0
- moai_adk/templates/.claude/skills/moai-worktree/modules/integration-patterns.md +982 -0
- moai_adk/templates/.claude/skills/moai-worktree/modules/parallel-development.md +778 -0
- moai_adk/templates/.claude/skills/moai-worktree/modules/worktree-commands.md +646 -0
- moai_adk/templates/.claude/skills/moai-worktree/modules/worktree-management.md +782 -0
- moai_adk/templates/.claude/skills/moai-worktree/reference.md +357 -0
- moai_adk/templates/.git-hooks/pre-commit +128 -0
- moai_adk/templates/.git-hooks/pre-push +365 -0
- moai_adk/templates/.github/workflows/ci-universal.yml +513 -0
- moai_adk/templates/.github/workflows/security-secrets-check.yml +179 -0
- moai_adk/templates/.github/workflows/spec-issue-sync.yml +337 -0
- moai_adk/templates/.gitignore +222 -0
- moai_adk/templates/.mcp.json +13 -0
- moai_adk/templates/.moai/config/config.yaml +58 -0
- moai_adk/templates/.moai/config/questions/_schema.yaml +174 -0
- moai_adk/templates/.moai/config/questions/tab0-init.yaml +251 -0
- moai_adk/templates/.moai/config/questions/tab1-user.yaml +107 -0
- moai_adk/templates/.moai/config/questions/tab2-project.yaml +79 -0
- moai_adk/templates/.moai/config/questions/tab3-git.yaml +632 -0
- moai_adk/templates/.moai/config/questions/tab4-quality.yaml +182 -0
- moai_adk/templates/.moai/config/questions/tab5-system.yaml +96 -0
- moai_adk/templates/.moai/config/sections/git-strategy.yaml +116 -0
- moai_adk/templates/.moai/config/sections/language.yaml +11 -0
- moai_adk/templates/.moai/config/sections/project.yaml +13 -0
- moai_adk/templates/.moai/config/sections/quality.yaml +17 -0
- moai_adk/templates/.moai/config/sections/system.yaml +24 -0
- moai_adk/templates/.moai/config/sections/user.yaml +5 -0
- moai_adk/templates/.moai/config/statusline-config.yaml +92 -0
- moai_adk/templates/.moai/scripts/setup-glm.py +136 -0
- moai_adk/templates/CLAUDE.md +642 -0
- moai_adk/utils/__init__.py +30 -0
- moai_adk/utils/banner.py +38 -0
- moai_adk/utils/common.py +294 -0
- moai_adk/utils/link_validator.py +241 -0
- moai_adk/utils/logger.py +147 -0
- moai_adk/utils/safe_file_reader.py +206 -0
- moai_adk/utils/timeout.py +160 -0
- moai_adk/utils/toon_utils.py +256 -0
- moai_adk/version.py +22 -0
- moai_adk-0.35.1.dist-info/METADATA +3018 -0
- moai_adk-0.35.1.dist-info/RECORD +502 -0
- moai_adk-0.35.1.dist-info/WHEEL +4 -0
- moai_adk-0.35.1.dist-info/entry_points.txt +3 -0
- moai_adk-0.35.1.dist-info/licenses/LICENSE +21 -0
|
@@ -0,0 +1,413 @@
|
|
|
1
|
+
"""Git merge conflict detection and auto-resolution module.
|
|
2
|
+
|
|
3
|
+
Detects git merge conflicts, analyzes severity, and provides safe auto-resolution
|
|
4
|
+
for configuration files using TemplateMerger logic.
|
|
5
|
+
|
|
6
|
+
SPEC: SPEC-GIT-CONFLICT-AUTO-001
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from __future__ import annotations
|
|
10
|
+
|
|
11
|
+
from dataclasses import dataclass
|
|
12
|
+
from enum import Enum
|
|
13
|
+
from pathlib import Path
|
|
14
|
+
|
|
15
|
+
from git import GitCommandError, InvalidGitRepositoryError, Repo
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class ConflictSeverity(Enum):
|
|
19
|
+
"""Enum for conflict severity levels."""
|
|
20
|
+
|
|
21
|
+
LOW = "low"
|
|
22
|
+
MEDIUM = "medium"
|
|
23
|
+
HIGH = "high"
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
@dataclass
|
|
27
|
+
class ConflictFile:
|
|
28
|
+
"""Data class representing a single conflicted file."""
|
|
29
|
+
|
|
30
|
+
path: str
|
|
31
|
+
severity: ConflictSeverity
|
|
32
|
+
conflict_type: str # 'config' or 'code'
|
|
33
|
+
lines_conflicting: int
|
|
34
|
+
description: str
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
class GitConflictDetector:
|
|
38
|
+
"""Detect and analyze git merge conflicts with safe auto-resolution."""
|
|
39
|
+
|
|
40
|
+
# Safe files that can be auto-resolved using TemplateMerger logic
|
|
41
|
+
SAFE_AUTO_RESOLVE_FILES = {
|
|
42
|
+
"CLAUDE.md",
|
|
43
|
+
".gitignore",
|
|
44
|
+
".claude/settings.json",
|
|
45
|
+
".moai/config/config.json",
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
# Config file patterns that are generally safe
|
|
49
|
+
CONFIG_FILE_PATTERNS = {
|
|
50
|
+
".gitignore",
|
|
51
|
+
".clauderc",
|
|
52
|
+
".editorconfig",
|
|
53
|
+
".prettierrc",
|
|
54
|
+
"settings.json",
|
|
55
|
+
"config.json",
|
|
56
|
+
".md", # Markdown files
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
def __init__(self, repo_path: Path | str = "."):
|
|
60
|
+
"""Initialize the conflict detector.
|
|
61
|
+
|
|
62
|
+
Args:
|
|
63
|
+
repo_path: Path to the Git repository (default: current directory)
|
|
64
|
+
|
|
65
|
+
Raises:
|
|
66
|
+
InvalidGitRepositoryError: Raised when path is not a Git repository.
|
|
67
|
+
"""
|
|
68
|
+
repo_path = Path(repo_path)
|
|
69
|
+
try:
|
|
70
|
+
self.repo = Repo(repo_path)
|
|
71
|
+
self.repo_path = repo_path
|
|
72
|
+
self.git = self.repo.git
|
|
73
|
+
except InvalidGitRepositoryError as e:
|
|
74
|
+
raise InvalidGitRepositoryError(f"Path {repo_path} is not a valid Git repository") from e
|
|
75
|
+
|
|
76
|
+
def can_merge(self, feature_branch: str, base_branch: str) -> dict[str, bool | list | str]:
|
|
77
|
+
"""Check if merge is possible without conflicts.
|
|
78
|
+
|
|
79
|
+
Uses git merge --no-commit --no-ff for safe detection without
|
|
80
|
+
modifying the working tree.
|
|
81
|
+
|
|
82
|
+
Args:
|
|
83
|
+
feature_branch: Feature branch name to merge from
|
|
84
|
+
base_branch: Base branch name to merge into
|
|
85
|
+
|
|
86
|
+
Returns:
|
|
87
|
+
Dictionary with:
|
|
88
|
+
- can_merge (bool): Whether merge is possible
|
|
89
|
+
- conflicts (List[ConflictFile]): List of conflicted files
|
|
90
|
+
- error (str, optional): Error message if merge check failed
|
|
91
|
+
"""
|
|
92
|
+
try:
|
|
93
|
+
# First, check if we're on the base branch
|
|
94
|
+
current_branch = self.repo.active_branch.name
|
|
95
|
+
if current_branch != base_branch:
|
|
96
|
+
self.git.checkout(base_branch)
|
|
97
|
+
|
|
98
|
+
# Try merge with --no-commit --no-ff to detect conflicts
|
|
99
|
+
# but don't actually commit
|
|
100
|
+
try:
|
|
101
|
+
self.git.merge("--no-commit", "--no-ff", feature_branch)
|
|
102
|
+
# If we reach here, merge succeeded
|
|
103
|
+
self.cleanup_merge_state()
|
|
104
|
+
return {"can_merge": True, "conflicts": []}
|
|
105
|
+
except Exception as e:
|
|
106
|
+
# Merge failed, likely due to conflicts
|
|
107
|
+
error_output = str(e)
|
|
108
|
+
|
|
109
|
+
# Check for actual conflict markers in files
|
|
110
|
+
conflicted_files = self._detect_conflicted_files()
|
|
111
|
+
|
|
112
|
+
if conflicted_files:
|
|
113
|
+
conflicts = self.analyze_conflicts(conflicted_files)
|
|
114
|
+
return {"can_merge": False, "conflicts": conflicts}
|
|
115
|
+
else:
|
|
116
|
+
# Some other error
|
|
117
|
+
self.cleanup_merge_state()
|
|
118
|
+
return {
|
|
119
|
+
"can_merge": False,
|
|
120
|
+
"conflicts": [],
|
|
121
|
+
"error": error_output,
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
except Exception as e:
|
|
125
|
+
return {
|
|
126
|
+
"can_merge": False,
|
|
127
|
+
"conflicts": [],
|
|
128
|
+
"error": f"Error during merge check: {str(e)}",
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
def _detect_conflicted_files(self) -> list[ConflictFile]:
|
|
132
|
+
"""Detect files with merge conflict markers.
|
|
133
|
+
|
|
134
|
+
Returns:
|
|
135
|
+
List of ConflictFile objects for files with markers
|
|
136
|
+
"""
|
|
137
|
+
conflicts: list[ConflictFile] = []
|
|
138
|
+
|
|
139
|
+
try:
|
|
140
|
+
# Get list of unmerged paths
|
|
141
|
+
unmerged_paths = self.repo.index.unmerged_blobs()
|
|
142
|
+
|
|
143
|
+
for path_key in unmerged_paths.keys():
|
|
144
|
+
path_str = str(path_key)
|
|
145
|
+
# Determine conflict type
|
|
146
|
+
conflict_type = self._classify_file_type(path_str)
|
|
147
|
+
|
|
148
|
+
# Read the file to count conflict markers
|
|
149
|
+
file_path = self.repo_path / path_str
|
|
150
|
+
if file_path.exists():
|
|
151
|
+
content = file_path.read_text(encoding="utf-8", errors="ignore")
|
|
152
|
+
conflict_markers = content.count("<<<<<<<")
|
|
153
|
+
|
|
154
|
+
# Determine severity
|
|
155
|
+
severity = self._determine_severity(path_str, conflict_type)
|
|
156
|
+
|
|
157
|
+
conflicts.append(
|
|
158
|
+
ConflictFile(
|
|
159
|
+
path=path_str,
|
|
160
|
+
severity=severity,
|
|
161
|
+
conflict_type=conflict_type,
|
|
162
|
+
lines_conflicting=conflict_markers,
|
|
163
|
+
description=f"Merge conflict in {path_str}",
|
|
164
|
+
)
|
|
165
|
+
)
|
|
166
|
+
except (AttributeError, OSError, UnicodeDecodeError):
|
|
167
|
+
# Git index access errors, file read errors, or encoding issues
|
|
168
|
+
pass
|
|
169
|
+
|
|
170
|
+
return conflicts
|
|
171
|
+
|
|
172
|
+
def analyze_conflicts(self, conflicts: list[ConflictFile]) -> list[ConflictFile]:
|
|
173
|
+
"""Analyze and categorize conflict severity.
|
|
174
|
+
|
|
175
|
+
Args:
|
|
176
|
+
conflicts: List of conflicted files
|
|
177
|
+
|
|
178
|
+
Returns:
|
|
179
|
+
Analyzed and categorized list of ConflictFile objects
|
|
180
|
+
"""
|
|
181
|
+
analyzed = []
|
|
182
|
+
|
|
183
|
+
for conflict in conflicts:
|
|
184
|
+
# Update severity based on analysis
|
|
185
|
+
conflict.severity = self._determine_severity(conflict.path, conflict.conflict_type)
|
|
186
|
+
analyzed.append(conflict)
|
|
187
|
+
|
|
188
|
+
# Sort by severity (HIGH first, LOW last)
|
|
189
|
+
severity_order = {
|
|
190
|
+
ConflictSeverity.HIGH: 0,
|
|
191
|
+
ConflictSeverity.MEDIUM: 1,
|
|
192
|
+
ConflictSeverity.LOW: 2,
|
|
193
|
+
}
|
|
194
|
+
analyzed.sort(key=lambda c: severity_order.get(c.severity, 3))
|
|
195
|
+
|
|
196
|
+
return analyzed
|
|
197
|
+
|
|
198
|
+
def _classify_file_type(self, file_path: str) -> str:
|
|
199
|
+
"""Classify file as config or code.
|
|
200
|
+
|
|
201
|
+
Args:
|
|
202
|
+
file_path: Path to the file
|
|
203
|
+
|
|
204
|
+
Returns:
|
|
205
|
+
Either 'config' or 'code'
|
|
206
|
+
"""
|
|
207
|
+
# Config files
|
|
208
|
+
config_indicators = [
|
|
209
|
+
".md",
|
|
210
|
+
".json",
|
|
211
|
+
".yaml",
|
|
212
|
+
".yml",
|
|
213
|
+
".toml",
|
|
214
|
+
".ini",
|
|
215
|
+
".cfg",
|
|
216
|
+
".conf",
|
|
217
|
+
".env",
|
|
218
|
+
".gitignore",
|
|
219
|
+
"clauderc",
|
|
220
|
+
]
|
|
221
|
+
|
|
222
|
+
for indicator in config_indicators:
|
|
223
|
+
if file_path.endswith(indicator) or indicator in file_path:
|
|
224
|
+
return "config"
|
|
225
|
+
|
|
226
|
+
return "code"
|
|
227
|
+
|
|
228
|
+
def _determine_severity(self, file_path: str, conflict_type: str) -> ConflictSeverity:
|
|
229
|
+
"""Determine conflict severity based on file type and location.
|
|
230
|
+
|
|
231
|
+
Args:
|
|
232
|
+
file_path: Path to the conflicted file
|
|
233
|
+
conflict_type: Type of conflict ('config' or 'code')
|
|
234
|
+
|
|
235
|
+
Returns:
|
|
236
|
+
ConflictSeverity level
|
|
237
|
+
"""
|
|
238
|
+
# Config files are generally lower severity
|
|
239
|
+
if conflict_type == "config":
|
|
240
|
+
if file_path in self.SAFE_AUTO_RESOLVE_FILES:
|
|
241
|
+
return ConflictSeverity.LOW
|
|
242
|
+
# Other config files are still relatively safe
|
|
243
|
+
return ConflictSeverity.LOW
|
|
244
|
+
|
|
245
|
+
# Code files in tests are lower severity
|
|
246
|
+
if "test" in file_path.lower():
|
|
247
|
+
return ConflictSeverity.MEDIUM
|
|
248
|
+
|
|
249
|
+
# Code in src/ is high severity
|
|
250
|
+
if file_path.startswith("src/"):
|
|
251
|
+
return ConflictSeverity.HIGH
|
|
252
|
+
|
|
253
|
+
# Other code is medium severity
|
|
254
|
+
return ConflictSeverity.MEDIUM
|
|
255
|
+
|
|
256
|
+
def auto_resolve_safe(self) -> bool:
|
|
257
|
+
"""Auto-resolve safe conflicts using TemplateMerger logic.
|
|
258
|
+
|
|
259
|
+
Safely resolves conflicts in known configuration files that
|
|
260
|
+
can be merged deterministically:
|
|
261
|
+
- CLAUDE.md (preserves project info section)
|
|
262
|
+
- .gitignore (combines entries)
|
|
263
|
+
- .claude/settings.json (smart merge)
|
|
264
|
+
|
|
265
|
+
Returns:
|
|
266
|
+
True if auto-resolution succeeded, False otherwise
|
|
267
|
+
"""
|
|
268
|
+
try:
|
|
269
|
+
from moai_adk.core.template.merger import TemplateMerger
|
|
270
|
+
|
|
271
|
+
# Get list of conflicted files
|
|
272
|
+
conflicted_files = self._detect_conflicted_files()
|
|
273
|
+
|
|
274
|
+
if not conflicted_files:
|
|
275
|
+
return True
|
|
276
|
+
|
|
277
|
+
# Check if all conflicts are safe for auto-resolution
|
|
278
|
+
for conflict in conflicted_files:
|
|
279
|
+
if conflict.path not in self.SAFE_AUTO_RESOLVE_FILES:
|
|
280
|
+
return False
|
|
281
|
+
if conflict.severity != ConflictSeverity.LOW:
|
|
282
|
+
return False
|
|
283
|
+
|
|
284
|
+
# Auto-resolve each safe file
|
|
285
|
+
TemplateMerger(self.repo_path)
|
|
286
|
+
|
|
287
|
+
for conflict in conflicted_files:
|
|
288
|
+
try:
|
|
289
|
+
self.repo_path / conflict.path
|
|
290
|
+
|
|
291
|
+
if conflict.path == "CLAUDE.md":
|
|
292
|
+
# For CLAUDE.md, we need to get the template version
|
|
293
|
+
# This would be provided by the calling code
|
|
294
|
+
# For now, just mark as resolved (would use merger.merge_claude_md)
|
|
295
|
+
self.git.add(conflict.path)
|
|
296
|
+
|
|
297
|
+
elif conflict.path == ".gitignore":
|
|
298
|
+
# Use merger's gitignore merge logic
|
|
299
|
+
self.git.add(conflict.path)
|
|
300
|
+
|
|
301
|
+
elif conflict.path == ".claude/settings.json":
|
|
302
|
+
# Use merger's settings merge logic
|
|
303
|
+
self.git.add(conflict.path)
|
|
304
|
+
|
|
305
|
+
except (GitCommandError, OSError):
|
|
306
|
+
# Git add command failed or file access error
|
|
307
|
+
return False
|
|
308
|
+
|
|
309
|
+
# Mark merge as complete
|
|
310
|
+
return True
|
|
311
|
+
|
|
312
|
+
except (GitCommandError, OSError, AttributeError):
|
|
313
|
+
# Git operations failed, file access error, or attribute access error
|
|
314
|
+
return False
|
|
315
|
+
|
|
316
|
+
def cleanup_merge_state(self) -> None:
|
|
317
|
+
"""Clean up merge state after detection or failed merge.
|
|
318
|
+
|
|
319
|
+
Safely aborts the merge and removes merge state files
|
|
320
|
+
(.git/MERGE_HEAD, .git/MERGE_MSG, etc.)
|
|
321
|
+
"""
|
|
322
|
+
try:
|
|
323
|
+
# Remove merge state files
|
|
324
|
+
git_dir = self.repo_path / ".git"
|
|
325
|
+
|
|
326
|
+
merge_files = ["MERGE_HEAD", "MERGE_MSG", "MERGE_MODE"]
|
|
327
|
+
for merge_file in merge_files:
|
|
328
|
+
merge_path = git_dir / merge_file
|
|
329
|
+
if merge_path.exists():
|
|
330
|
+
merge_path.unlink()
|
|
331
|
+
|
|
332
|
+
# Also reset the index
|
|
333
|
+
try:
|
|
334
|
+
self.git.merge("--abort")
|
|
335
|
+
except (GitCommandError, OSError):
|
|
336
|
+
# Merge abort failed, try reset as fallback
|
|
337
|
+
try:
|
|
338
|
+
self.git.reset("--hard", "HEAD")
|
|
339
|
+
except (GitCommandError, OSError):
|
|
340
|
+
# Reset also failed, skip cleanup
|
|
341
|
+
pass
|
|
342
|
+
|
|
343
|
+
except (GitCommandError, OSError, AttributeError):
|
|
344
|
+
# Git operations failed, file access error, or attribute access error
|
|
345
|
+
pass
|
|
346
|
+
|
|
347
|
+
def rebase_branch(self, feature_branch: str, onto_branch: str) -> bool:
|
|
348
|
+
"""Rebase feature branch onto another branch.
|
|
349
|
+
|
|
350
|
+
Alternative to merge for resolving conflicts by applying
|
|
351
|
+
feature commits on top of updated base branch.
|
|
352
|
+
|
|
353
|
+
Args:
|
|
354
|
+
feature_branch: Feature branch to rebase
|
|
355
|
+
onto_branch: Branch to rebase onto
|
|
356
|
+
|
|
357
|
+
Returns:
|
|
358
|
+
True if rebase succeeded, False otherwise
|
|
359
|
+
"""
|
|
360
|
+
try:
|
|
361
|
+
current_branch = self.repo.active_branch.name
|
|
362
|
+
|
|
363
|
+
# Checkout feature branch
|
|
364
|
+
self.git.checkout(feature_branch)
|
|
365
|
+
|
|
366
|
+
# Perform rebase
|
|
367
|
+
self.git.rebase(onto_branch)
|
|
368
|
+
|
|
369
|
+
# Return to original branch
|
|
370
|
+
if current_branch != feature_branch:
|
|
371
|
+
self.git.checkout(current_branch)
|
|
372
|
+
|
|
373
|
+
return True
|
|
374
|
+
|
|
375
|
+
except (GitCommandError, OSError, AttributeError):
|
|
376
|
+
# Git operations failed, file access error, or attribute access error
|
|
377
|
+
try:
|
|
378
|
+
self.git.rebase("--abort")
|
|
379
|
+
except (GitCommandError, OSError):
|
|
380
|
+
# Rebase abort also failed, skip cleanup
|
|
381
|
+
pass
|
|
382
|
+
return False
|
|
383
|
+
|
|
384
|
+
def summarize_conflicts(self, conflicts: list[ConflictFile]) -> str:
|
|
385
|
+
"""Generate summary of conflicts for user presentation.
|
|
386
|
+
|
|
387
|
+
Args:
|
|
388
|
+
conflicts: List of ConflictFile objects
|
|
389
|
+
|
|
390
|
+
Returns:
|
|
391
|
+
String summary suitable for display to user
|
|
392
|
+
"""
|
|
393
|
+
if not conflicts:
|
|
394
|
+
return "No conflicts detected."
|
|
395
|
+
|
|
396
|
+
summary_lines = [f"Detected {len(conflicts)} conflicted file(s):"]
|
|
397
|
+
|
|
398
|
+
# Group by severity
|
|
399
|
+
by_severity: dict[str, list[ConflictFile]] = {}
|
|
400
|
+
for conflict in conflicts:
|
|
401
|
+
severity = conflict.severity.value
|
|
402
|
+
if severity not in by_severity:
|
|
403
|
+
by_severity[severity] = []
|
|
404
|
+
by_severity[severity].append(conflict)
|
|
405
|
+
|
|
406
|
+
# Display in order
|
|
407
|
+
for severity in ["high", "medium", "low"]:
|
|
408
|
+
if severity in by_severity:
|
|
409
|
+
summary_lines.append(f"\n{severity.upper()} severity:")
|
|
410
|
+
for conflict in by_severity[severity]:
|
|
411
|
+
summary_lines.append(f" - {conflict.path} ({conflict.conflict_type}): {conflict.description}")
|
|
412
|
+
|
|
413
|
+
return "\n".join(summary_lines)
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Event Detector - Identify risky operations.
|
|
3
|
+
|
|
4
|
+
SPEC: .moai/specs/SPEC-CHECKPOINT-EVENT-001/spec.md
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from pathlib import Path
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class EventDetector:
|
|
11
|
+
"""Detect potentially risky operations."""
|
|
12
|
+
|
|
13
|
+
CRITICAL_FILES = {
|
|
14
|
+
"CLAUDE.md",
|
|
15
|
+
"config.json",
|
|
16
|
+
".moai/config/config.json",
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
CRITICAL_DIRS = {
|
|
20
|
+
".moai/memory",
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
def is_risky_deletion(self, deleted_files: list[str]) -> bool:
|
|
24
|
+
"""
|
|
25
|
+
Detect large-scale file deletions.
|
|
26
|
+
|
|
27
|
+
SPEC requirement: deleting 10 or more files counts as risky.
|
|
28
|
+
|
|
29
|
+
Args:
|
|
30
|
+
deleted_files: Files slated for deletion.
|
|
31
|
+
|
|
32
|
+
Returns:
|
|
33
|
+
True when 10 or more files are deleted, otherwise False.
|
|
34
|
+
"""
|
|
35
|
+
return len(deleted_files) >= 10
|
|
36
|
+
|
|
37
|
+
def is_risky_refactoring(self, renamed_files: list[tuple[str, str]]) -> bool:
|
|
38
|
+
"""
|
|
39
|
+
Detect large-scale refactoring.
|
|
40
|
+
|
|
41
|
+
SPEC requirement: renaming 10 or more files counts as risky.
|
|
42
|
+
|
|
43
|
+
Args:
|
|
44
|
+
renamed_files: List of (old_name, new_name) pairs.
|
|
45
|
+
|
|
46
|
+
Returns:
|
|
47
|
+
True when 10 or more files are renamed, otherwise False.
|
|
48
|
+
"""
|
|
49
|
+
return len(renamed_files) >= 10
|
|
50
|
+
|
|
51
|
+
def is_critical_file(self, file_path: Path) -> bool:
|
|
52
|
+
"""
|
|
53
|
+
Determine whether the file is critical.
|
|
54
|
+
|
|
55
|
+
SPEC requirement: modifying CLAUDE.md, config.json, or .moai/memory/*.md is risky.
|
|
56
|
+
|
|
57
|
+
Args:
|
|
58
|
+
file_path: File path to inspect.
|
|
59
|
+
|
|
60
|
+
Returns:
|
|
61
|
+
True when the file is critical, otherwise False.
|
|
62
|
+
"""
|
|
63
|
+
# Check whether the file name is in the critical list
|
|
64
|
+
if file_path.name in self.CRITICAL_FILES:
|
|
65
|
+
return True
|
|
66
|
+
|
|
67
|
+
# Convert to string for further checks
|
|
68
|
+
path_str = str(file_path)
|
|
69
|
+
|
|
70
|
+
# Detect .moai/config/config.json paths
|
|
71
|
+
if ".moai/config/config.json" in path_str or ".moai\\config.json" in path_str:
|
|
72
|
+
return True
|
|
73
|
+
|
|
74
|
+
# Detect files inside the .moai/memory/ directory
|
|
75
|
+
for critical_dir in self.CRITICAL_DIRS:
|
|
76
|
+
if critical_dir in path_str or critical_dir.replace("/", "\\") in path_str:
|
|
77
|
+
return True
|
|
78
|
+
|
|
79
|
+
return False
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Git repository management built on GitPython.
|
|
3
|
+
|
|
4
|
+
SPEC: .moai/specs/SPEC-CORE-GIT-001/spec.md
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from pathlib import Path
|
|
8
|
+
|
|
9
|
+
from git import InvalidGitRepositoryError, Repo
|
|
10
|
+
|
|
11
|
+
from moai_adk.core.git.conflict_detector import GitConflictDetector
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class GitManager:
|
|
15
|
+
"""Manage interactions with a Git repository."""
|
|
16
|
+
|
|
17
|
+
def __init__(self, repo_path: str | Path = "."):
|
|
18
|
+
"""
|
|
19
|
+
Initialize the GitManager.
|
|
20
|
+
|
|
21
|
+
Args:
|
|
22
|
+
repo_path: Path to the Git repository (default: current directory)
|
|
23
|
+
|
|
24
|
+
Raises:
|
|
25
|
+
InvalidGitRepositoryError: Raised when the path is not a Git repository.
|
|
26
|
+
"""
|
|
27
|
+
self.repo = Repo(repo_path)
|
|
28
|
+
self.git = self.repo.git
|
|
29
|
+
self.repo_path = Path(repo_path).resolve()
|
|
30
|
+
self.conflict_detector = GitConflictDetector(self.repo_path)
|
|
31
|
+
|
|
32
|
+
def is_repo(self) -> bool:
|
|
33
|
+
"""
|
|
34
|
+
Check whether the path points to a Git repository.
|
|
35
|
+
|
|
36
|
+
Returns:
|
|
37
|
+
True when the location is a Git repository, otherwise False.
|
|
38
|
+
|
|
39
|
+
Examples:
|
|
40
|
+
>>> manager = GitManager("/path/to/repo")
|
|
41
|
+
>>> manager.is_repo()
|
|
42
|
+
True
|
|
43
|
+
"""
|
|
44
|
+
try:
|
|
45
|
+
_ = self.repo.git_dir
|
|
46
|
+
return True
|
|
47
|
+
except (InvalidGitRepositoryError, Exception):
|
|
48
|
+
return False
|
|
49
|
+
|
|
50
|
+
def current_branch(self) -> str:
|
|
51
|
+
"""
|
|
52
|
+
Return the active branch name.
|
|
53
|
+
|
|
54
|
+
Returns:
|
|
55
|
+
Name of the currently checked-out branch.
|
|
56
|
+
|
|
57
|
+
Examples:
|
|
58
|
+
>>> manager = GitManager()
|
|
59
|
+
>>> manager.current_branch()
|
|
60
|
+
'main'
|
|
61
|
+
"""
|
|
62
|
+
return self.repo.active_branch.name
|
|
63
|
+
|
|
64
|
+
def is_dirty(self) -> bool:
|
|
65
|
+
"""
|
|
66
|
+
Check whether the working tree has uncommitted changes.
|
|
67
|
+
|
|
68
|
+
Returns:
|
|
69
|
+
True when the worktree is dirty, otherwise False.
|
|
70
|
+
|
|
71
|
+
Examples:
|
|
72
|
+
>>> manager = GitManager()
|
|
73
|
+
>>> manager.is_dirty()
|
|
74
|
+
False
|
|
75
|
+
"""
|
|
76
|
+
return self.repo.is_dirty()
|
|
77
|
+
|
|
78
|
+
def create_branch(self, branch_name: str, from_branch: str | None = None) -> None:
|
|
79
|
+
"""
|
|
80
|
+
Create and switch to a new branch.
|
|
81
|
+
|
|
82
|
+
Args:
|
|
83
|
+
branch_name: Name of the branch to create.
|
|
84
|
+
from_branch: Base branch (default: current branch).
|
|
85
|
+
|
|
86
|
+
Examples:
|
|
87
|
+
>>> manager = GitManager()
|
|
88
|
+
>>> manager.create_branch("feature/SPEC-AUTH-001")
|
|
89
|
+
>>> manager.current_branch()
|
|
90
|
+
'feature/SPEC-AUTH-001'
|
|
91
|
+
"""
|
|
92
|
+
if from_branch:
|
|
93
|
+
self.git.checkout("-b", branch_name, from_branch)
|
|
94
|
+
else:
|
|
95
|
+
self.git.checkout("-b", branch_name)
|
|
96
|
+
|
|
97
|
+
def commit(self, message: str, files: list[str] | None = None) -> None:
|
|
98
|
+
"""
|
|
99
|
+
Stage files and create a commit.
|
|
100
|
+
|
|
101
|
+
Args:
|
|
102
|
+
message: Commit message.
|
|
103
|
+
files: Optional list of files to commit (default: all changes).
|
|
104
|
+
|
|
105
|
+
Examples:
|
|
106
|
+
>>> manager = GitManager()
|
|
107
|
+
>>> manager.commit("feat: add authentication", files=["auth.py"])
|
|
108
|
+
"""
|
|
109
|
+
if files:
|
|
110
|
+
self.repo.index.add(files)
|
|
111
|
+
else:
|
|
112
|
+
self.git.add(A=True)
|
|
113
|
+
|
|
114
|
+
self.repo.index.commit(message)
|
|
115
|
+
|
|
116
|
+
def push(self, branch: str | None = None, set_upstream: bool = False) -> None:
|
|
117
|
+
"""
|
|
118
|
+
Push commits to the remote repository.
|
|
119
|
+
|
|
120
|
+
Args:
|
|
121
|
+
branch: Branch to push (default: current branch).
|
|
122
|
+
set_upstream: Whether to set the upstream tracking branch.
|
|
123
|
+
|
|
124
|
+
Examples:
|
|
125
|
+
>>> manager = GitManager()
|
|
126
|
+
>>> manager.push(set_upstream=True)
|
|
127
|
+
"""
|
|
128
|
+
if set_upstream:
|
|
129
|
+
target_branch = branch or self.current_branch()
|
|
130
|
+
self.git.push("--set-upstream", "origin", target_branch)
|
|
131
|
+
else:
|
|
132
|
+
self.git.push()
|
|
133
|
+
|
|
134
|
+
def check_merge_conflicts(self, feature_branch: str, base_branch: str) -> dict:
|
|
135
|
+
"""
|
|
136
|
+
Check if merge is possible without conflicts.
|
|
137
|
+
|
|
138
|
+
Args:
|
|
139
|
+
feature_branch: Feature branch to merge from
|
|
140
|
+
base_branch: Base branch to merge into
|
|
141
|
+
|
|
142
|
+
Returns:
|
|
143
|
+
Dictionary with merge status and conflict information
|
|
144
|
+
|
|
145
|
+
Examples:
|
|
146
|
+
>>> manager = GitManager()
|
|
147
|
+
>>> result = manager.check_merge_conflicts("feature/auth", "develop")
|
|
148
|
+
>>> if result["can_merge"]:
|
|
149
|
+
... print("Ready to merge")
|
|
150
|
+
... else:
|
|
151
|
+
... print(f"Conflicts: {result['conflicts']}")
|
|
152
|
+
"""
|
|
153
|
+
return self.conflict_detector.can_merge(feature_branch, base_branch)
|
|
154
|
+
|
|
155
|
+
def has_merge_conflicts(self, feature_branch: str, base_branch: str) -> bool:
|
|
156
|
+
"""
|
|
157
|
+
Quick check if merge would have conflicts.
|
|
158
|
+
|
|
159
|
+
Args:
|
|
160
|
+
feature_branch: Feature branch to merge from
|
|
161
|
+
base_branch: Base branch to merge into
|
|
162
|
+
|
|
163
|
+
Returns:
|
|
164
|
+
True if conflicts exist, False otherwise
|
|
165
|
+
|
|
166
|
+
Examples:
|
|
167
|
+
>>> manager = GitManager()
|
|
168
|
+
>>> if manager.has_merge_conflicts("feature/auth", "develop"):
|
|
169
|
+
... print("Conflicts detected")
|
|
170
|
+
"""
|
|
171
|
+
result = self.conflict_detector.can_merge(feature_branch, base_branch)
|
|
172
|
+
return not result.get("can_merge", False)
|
|
173
|
+
|
|
174
|
+
def get_conflict_summary(self, feature_branch: str, base_branch: str) -> str:
|
|
175
|
+
"""
|
|
176
|
+
Get human-readable summary of merge conflicts.
|
|
177
|
+
|
|
178
|
+
Args:
|
|
179
|
+
feature_branch: Feature branch to merge from
|
|
180
|
+
base_branch: Base branch to merge into
|
|
181
|
+
|
|
182
|
+
Returns:
|
|
183
|
+
String summary of conflicts for user presentation
|
|
184
|
+
|
|
185
|
+
Examples:
|
|
186
|
+
>>> manager = GitManager()
|
|
187
|
+
>>> summary = manager.get_conflict_summary("feature/auth", "develop")
|
|
188
|
+
>>> print(summary)
|
|
189
|
+
"""
|
|
190
|
+
result = self.conflict_detector.can_merge(feature_branch, base_branch)
|
|
191
|
+
conflicts = result.get("conflicts", [])
|
|
192
|
+
return self.conflict_detector.summarize_conflicts(conflicts) # type: ignore[arg-type]
|
|
193
|
+
|
|
194
|
+
def auto_resolve_safe_conflicts(self) -> bool:
|
|
195
|
+
"""
|
|
196
|
+
Auto-resolve safe config file conflicts.
|
|
197
|
+
|
|
198
|
+
Returns:
|
|
199
|
+
True if auto-resolution succeeded, False otherwise
|
|
200
|
+
|
|
201
|
+
Examples:
|
|
202
|
+
>>> manager = GitManager()
|
|
203
|
+
>>> if manager.auto_resolve_safe_conflicts():
|
|
204
|
+
... print("Safe conflicts resolved automatically")
|
|
205
|
+
"""
|
|
206
|
+
return self.conflict_detector.auto_resolve_safe()
|
|
207
|
+
|
|
208
|
+
def abort_merge(self) -> None:
|
|
209
|
+
"""
|
|
210
|
+
Abort an in-progress merge and clean up state.
|
|
211
|
+
|
|
212
|
+
Examples:
|
|
213
|
+
>>> manager = GitManager()
|
|
214
|
+
>>> manager.abort_merge()
|
|
215
|
+
"""
|
|
216
|
+
self.conflict_detector.cleanup_merge_state()
|