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,605 @@
|
|
|
1
|
+
"""Claude Code Headless-based Merge Analyzer
|
|
2
|
+
|
|
3
|
+
Analyzes template merge differences using Claude Code headless mode
|
|
4
|
+
for intelligent backup vs new template comparison and recommendations.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import json
|
|
8
|
+
import logging
|
|
9
|
+
import os
|
|
10
|
+
import re
|
|
11
|
+
import shutil
|
|
12
|
+
import subprocess
|
|
13
|
+
import sys
|
|
14
|
+
from difflib import unified_diff
|
|
15
|
+
from pathlib import Path
|
|
16
|
+
from typing import Any, Optional
|
|
17
|
+
|
|
18
|
+
import click
|
|
19
|
+
from rich.console import Console
|
|
20
|
+
from rich.live import Live
|
|
21
|
+
from rich.spinner import Spinner
|
|
22
|
+
from rich.table import Table
|
|
23
|
+
|
|
24
|
+
console = Console()
|
|
25
|
+
logger = logging.getLogger(__name__)
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class MergeAnalyzer:
|
|
29
|
+
"""Merge analyzer using Claude Code for intelligent template merge analysis
|
|
30
|
+
|
|
31
|
+
Compares backed-up user configurations with new templates,
|
|
32
|
+
analyzes them using Claude AI, and provides merge recommendations.
|
|
33
|
+
"""
|
|
34
|
+
|
|
35
|
+
# Primary files to analyze
|
|
36
|
+
ANALYZED_FILES = [
|
|
37
|
+
"CLAUDE.md",
|
|
38
|
+
".claude/settings.json",
|
|
39
|
+
".moai/config/config.yaml", # Updated: JSON → YAML migration
|
|
40
|
+
".gitignore",
|
|
41
|
+
]
|
|
42
|
+
|
|
43
|
+
# Claude headless execution settings
|
|
44
|
+
CLAUDE_TIMEOUT = 120 # Maximum 2 minutes
|
|
45
|
+
CLAUDE_MODEL = "claude-haiku-4-5-20251001" # Latest Haiku (cost optimized)
|
|
46
|
+
CLAUDE_TOOLS = ["Read", "Glob", "Grep"] # Read-only tools
|
|
47
|
+
|
|
48
|
+
def __init__(self, project_path: Path):
|
|
49
|
+
"""Initialize analyzer with project path."""
|
|
50
|
+
self.project_path = project_path
|
|
51
|
+
|
|
52
|
+
def analyze_merge(self, backup_path: Path, template_path: Path) -> dict[str, Any]:
|
|
53
|
+
"""Perform merge analysis using Claude Code headless mode
|
|
54
|
+
|
|
55
|
+
Args:
|
|
56
|
+
backup_path: Path to backed-up configuration directory
|
|
57
|
+
template_path: Path to new template directory
|
|
58
|
+
|
|
59
|
+
Returns:
|
|
60
|
+
Dictionary containing analysis results:
|
|
61
|
+
- files: List of changes by file
|
|
62
|
+
- safe_to_auto_merge: Whether auto-merge is safe
|
|
63
|
+
- user_action_required: Whether user intervention is needed
|
|
64
|
+
- summary: Overall summary
|
|
65
|
+
- error: Error message (if any)
|
|
66
|
+
"""
|
|
67
|
+
# 1. Collect files to compare
|
|
68
|
+
diff_files = self._collect_diff_files(backup_path, template_path)
|
|
69
|
+
|
|
70
|
+
# 2. Create Claude headless prompt
|
|
71
|
+
prompt = self._create_analysis_prompt(backup_path, template_path, diff_files)
|
|
72
|
+
|
|
73
|
+
# 3. Run Claude Code headless (show spinner)
|
|
74
|
+
spinner = Spinner("dots", text="[cyan]Running Claude Code analysis...[/cyan]")
|
|
75
|
+
|
|
76
|
+
try:
|
|
77
|
+
with Live(spinner, refresh_per_second=12):
|
|
78
|
+
result = subprocess.run(
|
|
79
|
+
self._build_claude_command(),
|
|
80
|
+
input=prompt,
|
|
81
|
+
capture_output=True,
|
|
82
|
+
text=True,
|
|
83
|
+
timeout=self.CLAUDE_TIMEOUT,
|
|
84
|
+
)
|
|
85
|
+
|
|
86
|
+
if result.returncode == 0:
|
|
87
|
+
# Use new response parsing method
|
|
88
|
+
analysis = self._parse_claude_response(result.stdout)
|
|
89
|
+
if "error" not in analysis:
|
|
90
|
+
console.print("[green]✅ Analysis complete[/green]")
|
|
91
|
+
return analysis
|
|
92
|
+
else:
|
|
93
|
+
console.print(f"[yellow]⚠️ Analysis failed: {analysis.get('summary', 'Unknown error')}[/yellow]")
|
|
94
|
+
return self._fallback_analysis(backup_path, template_path, diff_files)
|
|
95
|
+
else:
|
|
96
|
+
# Use improved error detection with full context
|
|
97
|
+
error_msg = self._detect_claude_errors(
|
|
98
|
+
result.stderr,
|
|
99
|
+
returncode=result.returncode,
|
|
100
|
+
stdout=result.stdout,
|
|
101
|
+
)
|
|
102
|
+
logger.warning(
|
|
103
|
+
f"Claude Code failed: returncode={result.returncode}, "
|
|
104
|
+
f"stderr={result.stderr[:200] if result.stderr else 'empty'}, "
|
|
105
|
+
f"stdout_hint={result.stdout[:100] if result.stdout else 'empty'}"
|
|
106
|
+
)
|
|
107
|
+
console.print(f"[yellow]⚠️ Claude execution error: {error_msg}[/yellow]")
|
|
108
|
+
return self._fallback_analysis(backup_path, template_path, diff_files)
|
|
109
|
+
|
|
110
|
+
except subprocess.TimeoutExpired:
|
|
111
|
+
console.print("[yellow]⚠️ Claude analysis timeout (exceeded 120 seconds)[/yellow]")
|
|
112
|
+
return self._fallback_analysis(backup_path, template_path, diff_files)
|
|
113
|
+
except FileNotFoundError:
|
|
114
|
+
console.print("[red]❌ Claude Code not found.[/red]")
|
|
115
|
+
console.print("[cyan] Install Claude Code: https://claude.com/claude-code[/cyan]")
|
|
116
|
+
return self._fallback_analysis(backup_path, template_path, diff_files)
|
|
117
|
+
|
|
118
|
+
def ask_user_confirmation(self, analysis: dict[str, Any]) -> bool:
|
|
119
|
+
"""Display analysis results and request user confirmation
|
|
120
|
+
|
|
121
|
+
Args:
|
|
122
|
+
analysis: Result from analyze_merge()
|
|
123
|
+
|
|
124
|
+
Returns:
|
|
125
|
+
True: Proceed, False: Cancel
|
|
126
|
+
"""
|
|
127
|
+
# 1. Display analysis results
|
|
128
|
+
self._display_analysis(analysis)
|
|
129
|
+
|
|
130
|
+
# 2. User confirmation
|
|
131
|
+
if analysis.get("user_action_required", False):
|
|
132
|
+
console.print(
|
|
133
|
+
"\n⚠️ User intervention required. Please review the following:",
|
|
134
|
+
style="warning",
|
|
135
|
+
)
|
|
136
|
+
for file_info in analysis.get("files", []):
|
|
137
|
+
if file_info.get("conflict_severity") in ["medium", "high"]:
|
|
138
|
+
console.print(
|
|
139
|
+
f" • {file_info['filename']}: {file_info.get('note', '')}",
|
|
140
|
+
)
|
|
141
|
+
|
|
142
|
+
# 3. Confirmation prompt
|
|
143
|
+
proceed = click.confirm(
|
|
144
|
+
"\nProceed with merge?",
|
|
145
|
+
default=analysis.get("safe_to_auto_merge", False),
|
|
146
|
+
)
|
|
147
|
+
|
|
148
|
+
return proceed
|
|
149
|
+
|
|
150
|
+
def _collect_diff_files(self, backup_path: Path, template_path: Path) -> dict[str, dict[str, Any]]:
|
|
151
|
+
"""Collect differences between backup and template files
|
|
152
|
+
|
|
153
|
+
Returns:
|
|
154
|
+
Dictionary with diff information per file
|
|
155
|
+
"""
|
|
156
|
+
diff_files = {}
|
|
157
|
+
|
|
158
|
+
for file_name in self.ANALYZED_FILES:
|
|
159
|
+
backup_file = backup_path / file_name
|
|
160
|
+
template_file = template_path / file_name
|
|
161
|
+
|
|
162
|
+
if not backup_file.exists() and not template_file.exists():
|
|
163
|
+
continue
|
|
164
|
+
|
|
165
|
+
diff_info = {
|
|
166
|
+
"backup_exists": backup_file.exists(),
|
|
167
|
+
"template_exists": template_file.exists(),
|
|
168
|
+
"has_diff": False,
|
|
169
|
+
"diff_lines": 0,
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
if backup_file.exists() and template_file.exists():
|
|
173
|
+
backup_content = backup_file.read_text(encoding="utf-8")
|
|
174
|
+
template_content = template_file.read_text(encoding="utf-8")
|
|
175
|
+
|
|
176
|
+
if backup_content != template_content:
|
|
177
|
+
diff = list(
|
|
178
|
+
unified_diff(
|
|
179
|
+
backup_content.splitlines(),
|
|
180
|
+
template_content.splitlines(),
|
|
181
|
+
lineterm="",
|
|
182
|
+
)
|
|
183
|
+
)
|
|
184
|
+
diff_info["has_diff"] = True
|
|
185
|
+
diff_info["diff_lines"] = len(diff)
|
|
186
|
+
|
|
187
|
+
diff_files[file_name] = diff_info
|
|
188
|
+
|
|
189
|
+
return diff_files
|
|
190
|
+
|
|
191
|
+
def _create_analysis_prompt(
|
|
192
|
+
self,
|
|
193
|
+
backup_path: Path,
|
|
194
|
+
template_path: Path,
|
|
195
|
+
diff_files: dict[str, dict[str, Any]],
|
|
196
|
+
) -> str:
|
|
197
|
+
"""Generate Claude headless analysis prompt
|
|
198
|
+
|
|
199
|
+
Returns:
|
|
200
|
+
Analysis prompt to send to Claude
|
|
201
|
+
"""
|
|
202
|
+
return f"""You are a MoAI-ADK configuration file merge expert.
|
|
203
|
+
|
|
204
|
+
## Context
|
|
205
|
+
- Backed-up user configuration: {backup_path}
|
|
206
|
+
- New template: {template_path}
|
|
207
|
+
- Files to analyze: {", ".join(self.ANALYZED_FILES)}
|
|
208
|
+
|
|
209
|
+
## Files to Analyze
|
|
210
|
+
{self._format_diff_summary(diff_files)}
|
|
211
|
+
|
|
212
|
+
## Analysis Tasks
|
|
213
|
+
Analyze the following items and provide a JSON response:
|
|
214
|
+
|
|
215
|
+
1. Identify changes per file
|
|
216
|
+
2. Assess conflict risk (low/medium/high)
|
|
217
|
+
3. Merge recommendations (use_template/keep_existing/smart_merge)
|
|
218
|
+
4. Overall safety assessment
|
|
219
|
+
|
|
220
|
+
## Response Format (JSON)
|
|
221
|
+
{{
|
|
222
|
+
"files": [
|
|
223
|
+
{{
|
|
224
|
+
"filename": "CLAUDE.md",
|
|
225
|
+
"changes": "Description of changes",
|
|
226
|
+
"recommendation": "use_template|keep_existing|smart_merge",
|
|
227
|
+
"conflict_severity": "low|medium|high",
|
|
228
|
+
"note": "Additional notes (optional)"
|
|
229
|
+
}}
|
|
230
|
+
],
|
|
231
|
+
"safe_to_auto_merge": true/false,
|
|
232
|
+
"user_action_required": true/false,
|
|
233
|
+
"summary": "Whether merge is safe and why",
|
|
234
|
+
"risk_assessment": "Risk assessment"
|
|
235
|
+
}}
|
|
236
|
+
|
|
237
|
+
## Merge Rules Reference
|
|
238
|
+
- CLAUDE.md: Preserve Project Information section
|
|
239
|
+
- settings.json: Merge env variables, prioritize template permissions.deny
|
|
240
|
+
- config.json: Preserve user metadata, update schema
|
|
241
|
+
- .gitignore: Additions only (preserve existing items)
|
|
242
|
+
|
|
243
|
+
## Additional Considerations
|
|
244
|
+
- Assess risk of user customization loss
|
|
245
|
+
- Determine if force overwriting Alfred infrastructure files
|
|
246
|
+
- Review rollback possibilities
|
|
247
|
+
"""
|
|
248
|
+
|
|
249
|
+
def _display_analysis(self, analysis: dict[str, Any]) -> None:
|
|
250
|
+
"""Display analysis results in Rich format"""
|
|
251
|
+
# Title
|
|
252
|
+
console.print("\n📊 Merge Analysis Results (Claude Code)", style="bold")
|
|
253
|
+
|
|
254
|
+
# Summary
|
|
255
|
+
summary = analysis.get("summary", "No analysis results")
|
|
256
|
+
console.print(f"\n📝 {summary}")
|
|
257
|
+
|
|
258
|
+
# Risk assessment
|
|
259
|
+
risk_assessment = analysis.get("risk_assessment", "")
|
|
260
|
+
if risk_assessment:
|
|
261
|
+
risk_style = "green" if "safe" in risk_assessment.lower() else "yellow"
|
|
262
|
+
console.print(f"⚠️ Risk Level: {risk_assessment}", style=risk_style)
|
|
263
|
+
|
|
264
|
+
# Changes by file table
|
|
265
|
+
files_list = analysis.get("files")
|
|
266
|
+
if files_list and isinstance(files_list, list):
|
|
267
|
+
table = Table(title="Changes by File")
|
|
268
|
+
table.add_column("File", style="cyan")
|
|
269
|
+
table.add_column("Changes", style="white")
|
|
270
|
+
table.add_column("Recommendation", style="yellow")
|
|
271
|
+
table.add_column("Risk", style="red")
|
|
272
|
+
|
|
273
|
+
for file_info in files_list:
|
|
274
|
+
# Ensure file_info is a dictionary
|
|
275
|
+
if not isinstance(file_info, dict):
|
|
276
|
+
continue
|
|
277
|
+
|
|
278
|
+
severity_style = {
|
|
279
|
+
"low": "green",
|
|
280
|
+
"medium": "yellow",
|
|
281
|
+
"high": "red",
|
|
282
|
+
}.get(file_info.get("conflict_severity", "low"), "white")
|
|
283
|
+
|
|
284
|
+
table.add_row(
|
|
285
|
+
file_info.get("filename", "?"),
|
|
286
|
+
file_info.get("changes", "")[:30],
|
|
287
|
+
file_info.get("recommendation", "?"),
|
|
288
|
+
file_info.get("conflict_severity", "?"),
|
|
289
|
+
style=severity_style,
|
|
290
|
+
)
|
|
291
|
+
|
|
292
|
+
console.print(table)
|
|
293
|
+
|
|
294
|
+
# Additional details
|
|
295
|
+
for file_info in files_list:
|
|
296
|
+
# Ensure file_info is a dictionary
|
|
297
|
+
if not isinstance(file_info, dict):
|
|
298
|
+
continue
|
|
299
|
+
|
|
300
|
+
if file_info.get("note"):
|
|
301
|
+
console.print(
|
|
302
|
+
f"\n💡 {file_info['filename']}: {file_info['note']}",
|
|
303
|
+
style="dim",
|
|
304
|
+
)
|
|
305
|
+
|
|
306
|
+
def _parse_claude_response(self, response_text: str) -> dict[str, Any]:
|
|
307
|
+
"""Parse Claude Code response supporting both v1.x and v2.0+ formats.
|
|
308
|
+
|
|
309
|
+
Args:
|
|
310
|
+
response_text: Raw response text from Claude Code
|
|
311
|
+
|
|
312
|
+
Returns:
|
|
313
|
+
Parsed analysis dictionary
|
|
314
|
+
"""
|
|
315
|
+
try:
|
|
316
|
+
# First try direct JSON parsing (v1.x format)
|
|
317
|
+
return json.loads(response_text)
|
|
318
|
+
except json.JSONDecodeError:
|
|
319
|
+
# Try v2.0+ wrapped format
|
|
320
|
+
try:
|
|
321
|
+
# Look for JSON in the response
|
|
322
|
+
if '"type":' in response_text and '"result":' in response_text:
|
|
323
|
+
# Parse the wrapped v2.0+ format
|
|
324
|
+
response_obj = json.loads(response_text)
|
|
325
|
+
if "result" in response_obj:
|
|
326
|
+
result_text = response_obj["result"]
|
|
327
|
+
|
|
328
|
+
# Try to extract JSON from the result field
|
|
329
|
+
if isinstance(result_text, str):
|
|
330
|
+
# Look for JSON blocks in the result
|
|
331
|
+
if "```json" in result_text:
|
|
332
|
+
# Extract JSON from code block
|
|
333
|
+
start = result_text.find("```json") + 7
|
|
334
|
+
end = result_text.find("```", start)
|
|
335
|
+
if end != -1:
|
|
336
|
+
json_text = result_text[start:end].strip()
|
|
337
|
+
return json.loads(json_text)
|
|
338
|
+
elif result_text.strip().startswith("{"):
|
|
339
|
+
# Try direct JSON parsing
|
|
340
|
+
return json.loads(result_text)
|
|
341
|
+
else:
|
|
342
|
+
# Try to find JSON pattern in text
|
|
343
|
+
json_match = re.search(r"\{[^{}]*(?:\{[^{}]*\}[^{}]*)*\}", result_text)
|
|
344
|
+
if json_match:
|
|
345
|
+
try:
|
|
346
|
+
return json.loads(json_match.group(0))
|
|
347
|
+
except json.JSONDecodeError:
|
|
348
|
+
pass
|
|
349
|
+
|
|
350
|
+
# Fallback: try to find any JSON in the text
|
|
351
|
+
json_match = re.search(r"\{[^{}]*(?:\{[^{}]*\}[^{}]*)*\}", response_text)
|
|
352
|
+
if json_match:
|
|
353
|
+
return json.loads(json_match.group(0))
|
|
354
|
+
|
|
355
|
+
except (json.JSONDecodeError, KeyError, TypeError) as e:
|
|
356
|
+
console.print(f"[yellow]⚠️ Failed to parse Claude v2.0+ response: {e}[/yellow]")
|
|
357
|
+
logger.warning(f"Claude response parsing failed: {e}")
|
|
358
|
+
|
|
359
|
+
# If all parsing attempts fail, return error structure
|
|
360
|
+
logger.error(f"Could not parse Claude response. Raw response: {response_text[:500]}...")
|
|
361
|
+
return {
|
|
362
|
+
"files": [],
|
|
363
|
+
"safe_to_auto_merge": False,
|
|
364
|
+
"user_action_required": True,
|
|
365
|
+
"summary": "Failed to parse Claude response",
|
|
366
|
+
"risk_assessment": "High - Response parsing failed",
|
|
367
|
+
"error": "response_parse_failed",
|
|
368
|
+
"raw_response": response_text[:500] if response_text else "",
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
def _detect_claude_errors(
|
|
372
|
+
self,
|
|
373
|
+
stderr: str,
|
|
374
|
+
returncode: int = None,
|
|
375
|
+
stdout: str = None,
|
|
376
|
+
) -> str:
|
|
377
|
+
"""Detect and interpret Claude Code specific errors.
|
|
378
|
+
|
|
379
|
+
Args:
|
|
380
|
+
stderr: Standard error output from Claude Code
|
|
381
|
+
returncode: Process exit code (optional, for better diagnostics)
|
|
382
|
+
stdout: Standard output (optional, may contain error hints)
|
|
383
|
+
|
|
384
|
+
Returns:
|
|
385
|
+
User-friendly error message with actionable guidance
|
|
386
|
+
"""
|
|
387
|
+
# Case 1: Process failed but stderr is empty (silent failure)
|
|
388
|
+
if not stderr and returncode is not None and returncode != 0:
|
|
389
|
+
# Try to extract hints from stdout
|
|
390
|
+
if stdout:
|
|
391
|
+
stdout_lower = stdout.lower()
|
|
392
|
+
if "error" in stdout_lower or "failed" in stdout_lower or "exception" in stdout_lower:
|
|
393
|
+
stdout_hint = stdout[:300] if len(stdout) > 300 else stdout
|
|
394
|
+
return f"Process failed (exit code {returncode}). Output: {stdout_hint}"
|
|
395
|
+
return (
|
|
396
|
+
f"Process failed silently (exit code {returncode}). "
|
|
397
|
+
"No error details available. Try 'claude --version' to verify installation."
|
|
398
|
+
)
|
|
399
|
+
|
|
400
|
+
# Case 2: No stderr and no returncode context
|
|
401
|
+
if not stderr:
|
|
402
|
+
return "No error details available. Try running 'claude --version' to verify installation."
|
|
403
|
+
|
|
404
|
+
error_lower = stderr.lower()
|
|
405
|
+
|
|
406
|
+
# Pattern matching for specific known errors
|
|
407
|
+
if "model not found" in error_lower or "unknown model" in error_lower:
|
|
408
|
+
return f"Claude model '{self.CLAUDE_MODEL}' not found. Run 'claude --models' to see available models."
|
|
409
|
+
|
|
410
|
+
if "permission denied" in error_lower:
|
|
411
|
+
return "Permission denied. Check file permissions and Claude Code access rights."
|
|
412
|
+
|
|
413
|
+
if "timeout" in error_lower:
|
|
414
|
+
return f"Claude analysis timed out after {self.CLAUDE_TIMEOUT} seconds. Consider increasing timeout."
|
|
415
|
+
|
|
416
|
+
if "file not found" in error_lower:
|
|
417
|
+
return "Required files not found. Check project structure and file paths."
|
|
418
|
+
|
|
419
|
+
if "invalid argument" in error_lower or "unknown option" in error_lower:
|
|
420
|
+
return "Invalid Claude Code arguments. This might be a version compatibility issue. Try 'claude --help'."
|
|
421
|
+
|
|
422
|
+
if "api key" in error_lower or "authentication" in error_lower or "unauthorized" in error_lower:
|
|
423
|
+
return "Authentication error. Check your Claude API key configuration."
|
|
424
|
+
|
|
425
|
+
if "rate limit" in error_lower or "too many requests" in error_lower:
|
|
426
|
+
return "Rate limit exceeded. Please wait a moment and try again."
|
|
427
|
+
|
|
428
|
+
if "connection" in error_lower or "network" in error_lower:
|
|
429
|
+
return "Network connection error. Check your internet connection."
|
|
430
|
+
|
|
431
|
+
# Return generic error with exit code if available (extended to 300 chars)
|
|
432
|
+
exit_info = f" (exit code {returncode})" if returncode is not None else ""
|
|
433
|
+
return f"Claude Code error{exit_info}: {stderr[:300]}"
|
|
434
|
+
|
|
435
|
+
def _find_claude_executable(self) -> Optional[str]:
|
|
436
|
+
"""Find Claude Code executable path with Windows compatibility.
|
|
437
|
+
|
|
438
|
+
Searches for Claude Code in:
|
|
439
|
+
1. System PATH (shutil.which)
|
|
440
|
+
2. Windows npm global directory
|
|
441
|
+
3. Windows local AppData directory
|
|
442
|
+
4. Common installation paths
|
|
443
|
+
|
|
444
|
+
Returns:
|
|
445
|
+
Full path to Claude executable or None if not found
|
|
446
|
+
"""
|
|
447
|
+
# First try system PATH
|
|
448
|
+
claude_path = shutil.which("claude")
|
|
449
|
+
if claude_path:
|
|
450
|
+
return claude_path
|
|
451
|
+
|
|
452
|
+
# Windows-specific additional paths
|
|
453
|
+
if sys.platform == "win32":
|
|
454
|
+
possible_paths = []
|
|
455
|
+
|
|
456
|
+
# npm global installation
|
|
457
|
+
appdata = os.environ.get("APPDATA", "")
|
|
458
|
+
if appdata:
|
|
459
|
+
possible_paths.extend(
|
|
460
|
+
[
|
|
461
|
+
Path(appdata) / "npm" / "claude.cmd",
|
|
462
|
+
Path(appdata) / "npm" / "claude.exe",
|
|
463
|
+
Path(appdata) / "npm" / "claude",
|
|
464
|
+
]
|
|
465
|
+
)
|
|
466
|
+
|
|
467
|
+
# Local AppData installation
|
|
468
|
+
localappdata = os.environ.get("LOCALAPPDATA", "")
|
|
469
|
+
if localappdata:
|
|
470
|
+
possible_paths.extend(
|
|
471
|
+
[
|
|
472
|
+
Path(localappdata) / "Programs" / "claude" / "claude.exe",
|
|
473
|
+
Path(localappdata)
|
|
474
|
+
/ "Microsoft"
|
|
475
|
+
/ "WinGet"
|
|
476
|
+
/ "Packages"
|
|
477
|
+
/ "Anthropic.ClaudeCode_*"
|
|
478
|
+
/ "claude.exe",
|
|
479
|
+
]
|
|
480
|
+
)
|
|
481
|
+
|
|
482
|
+
# User profile paths
|
|
483
|
+
userprofile = os.environ.get("USERPROFILE", "")
|
|
484
|
+
if userprofile:
|
|
485
|
+
possible_paths.extend(
|
|
486
|
+
[
|
|
487
|
+
Path(userprofile) / ".claude" / "claude.exe",
|
|
488
|
+
Path(userprofile) / "AppData" / "Local" / "Programs" / "claude" / "claude.exe",
|
|
489
|
+
]
|
|
490
|
+
)
|
|
491
|
+
|
|
492
|
+
# Check each possible path
|
|
493
|
+
for p in possible_paths:
|
|
494
|
+
# Handle glob patterns
|
|
495
|
+
if "*" in str(p):
|
|
496
|
+
parent = p.parent
|
|
497
|
+
pattern = p.name
|
|
498
|
+
if parent.exists():
|
|
499
|
+
matches = list(parent.glob(pattern))
|
|
500
|
+
if matches:
|
|
501
|
+
return str(matches[0])
|
|
502
|
+
elif p.exists():
|
|
503
|
+
return str(p)
|
|
504
|
+
|
|
505
|
+
return None
|
|
506
|
+
|
|
507
|
+
def _build_claude_command(self) -> list[str]:
|
|
508
|
+
"""Build Claude Code headless command (based on official v4.0+)
|
|
509
|
+
|
|
510
|
+
Claude Code CLI official options:
|
|
511
|
+
- -p: Non-interactive headless mode
|
|
512
|
+
- --model: Explicit model selection (Haiku)
|
|
513
|
+
- --output-format: JSON response format
|
|
514
|
+
- --tools: Read-only tools only (space-separated - POSIX standard)
|
|
515
|
+
- --permission-mode: Auto-approval (background task)
|
|
516
|
+
|
|
517
|
+
Returns:
|
|
518
|
+
List of Claude CLI command arguments
|
|
519
|
+
|
|
520
|
+
Raises:
|
|
521
|
+
FileNotFoundError: If Claude Code executable is not found
|
|
522
|
+
"""
|
|
523
|
+
# Find Claude executable with Windows compatibility
|
|
524
|
+
claude_path = self._find_claude_executable()
|
|
525
|
+
if not claude_path:
|
|
526
|
+
raise FileNotFoundError("Claude Code executable not found")
|
|
527
|
+
|
|
528
|
+
# Tools list space-separated (POSIX standard, officially recommended)
|
|
529
|
+
tools_str = " ".join(self.CLAUDE_TOOLS)
|
|
530
|
+
|
|
531
|
+
return [
|
|
532
|
+
claude_path, # Use full path instead of just "claude"
|
|
533
|
+
"-p", # Non-interactive headless mode
|
|
534
|
+
"--model",
|
|
535
|
+
self.CLAUDE_MODEL, # Explicit model specification (Haiku)
|
|
536
|
+
"--output-format",
|
|
537
|
+
"json", # Single JSON response
|
|
538
|
+
"--tools",
|
|
539
|
+
tools_str, # Space-separated (Read Glob Grep)
|
|
540
|
+
"--permission-mode",
|
|
541
|
+
"dontAsk", # Auto-approval (safe, read-only)
|
|
542
|
+
]
|
|
543
|
+
|
|
544
|
+
def _format_diff_summary(self, diff_files: dict[str, dict[str, Any]]) -> str:
|
|
545
|
+
"""Format diff_files for prompt"""
|
|
546
|
+
summary = []
|
|
547
|
+
for file_name, info in diff_files.items():
|
|
548
|
+
if info["backup_exists"] and info["template_exists"]:
|
|
549
|
+
status = f"✏️ Modified ({info['diff_lines']} lines)" if info["has_diff"] else "✓ Identical"
|
|
550
|
+
elif info["backup_exists"]:
|
|
551
|
+
status = "❌ Deleted from template"
|
|
552
|
+
else:
|
|
553
|
+
status = "✨ New file (from template)"
|
|
554
|
+
|
|
555
|
+
summary.append(f"- {file_name}: {status}")
|
|
556
|
+
|
|
557
|
+
return "\n".join(summary)
|
|
558
|
+
|
|
559
|
+
def _fallback_analysis(
|
|
560
|
+
self,
|
|
561
|
+
backup_path: Path,
|
|
562
|
+
template_path: Path,
|
|
563
|
+
diff_files: dict[str, dict[str, Any]],
|
|
564
|
+
) -> dict[str, Any]:
|
|
565
|
+
"""Fallback analysis when Claude call fails (difflib-based)
|
|
566
|
+
|
|
567
|
+
Returns basic analysis results when Claude is unavailable
|
|
568
|
+
"""
|
|
569
|
+
console.print(
|
|
570
|
+
"⚠️ Claude Code unavailable. Using fallback analysis.",
|
|
571
|
+
style="yellow",
|
|
572
|
+
)
|
|
573
|
+
|
|
574
|
+
files_analysis = []
|
|
575
|
+
has_high_risk = False
|
|
576
|
+
|
|
577
|
+
for file_name, info in diff_files.items():
|
|
578
|
+
if not info["has_diff"]:
|
|
579
|
+
continue
|
|
580
|
+
|
|
581
|
+
# Simple risk assessment
|
|
582
|
+
severity = "low"
|
|
583
|
+
if file_name in [".claude/settings.json", ".moai/config/config.json"]:
|
|
584
|
+
severity = "medium" if info["diff_lines"] > 10 else "low"
|
|
585
|
+
|
|
586
|
+
files_analysis.append(
|
|
587
|
+
{
|
|
588
|
+
"filename": file_name,
|
|
589
|
+
"changes": f"{info['diff_lines']} lines changed",
|
|
590
|
+
"recommendation": "smart_merge",
|
|
591
|
+
"conflict_severity": severity,
|
|
592
|
+
}
|
|
593
|
+
)
|
|
594
|
+
|
|
595
|
+
if severity == "high":
|
|
596
|
+
has_high_risk = True
|
|
597
|
+
|
|
598
|
+
return {
|
|
599
|
+
"files": files_analysis,
|
|
600
|
+
"safe_to_auto_merge": not has_high_risk,
|
|
601
|
+
"user_action_required": has_high_risk,
|
|
602
|
+
"summary": f"{len(files_analysis)} files changed (fallback analysis)",
|
|
603
|
+
"risk_assessment": ("High - Claude unavailable, manual review recommended" if has_high_risk else "Low"),
|
|
604
|
+
"fallback": True,
|
|
605
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Migration module for MoAI-ADK version upgrades
|
|
3
|
+
|
|
4
|
+
Handles automatic migration of configuration files and project structure
|
|
5
|
+
when upgrading between versions.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from .backup_manager import BackupManager
|
|
9
|
+
from .file_migrator import FileMigrator
|
|
10
|
+
from .version_detector import VersionDetector
|
|
11
|
+
from .version_migrator import VersionMigrator
|
|
12
|
+
|
|
13
|
+
__all__ = [
|
|
14
|
+
"VersionMigrator",
|
|
15
|
+
"VersionDetector",
|
|
16
|
+
"BackupManager",
|
|
17
|
+
"FileMigrator",
|
|
18
|
+
]
|