moai-adk 0.25.4__py3-none-any.whl → 0.32.8__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 +2 -5
- moai_adk/__main__.py +114 -82
- moai_adk/cli/__init__.py +6 -1
- moai_adk/cli/commands/__init__.py +1 -3
- moai_adk/cli/commands/analyze.py +5 -16
- moai_adk/cli/commands/doctor.py +6 -18
- moai_adk/cli/commands/init.py +56 -125
- moai_adk/cli/commands/language.py +14 -35
- moai_adk/cli/commands/status.py +9 -15
- moai_adk/cli/commands/update.py +1555 -190
- moai_adk/cli/prompts/init_prompts.py +112 -56
- 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 +672 -0
- moai_adk/cli/worktree/exceptions.py +89 -0
- moai_adk/cli/worktree/manager.py +490 -0
- moai_adk/cli/worktree/models.py +65 -0
- moai_adk/cli/worktree/registry.py +128 -0
- moai_adk/core/PHASE2_OPTIMIZATIONS.md +467 -0
- moai_adk/core/analysis/session_analyzer.py +17 -56
- moai_adk/core/claude_integration.py +26 -54
- moai_adk/core/command_helpers.py +10 -10
- moai_adk/core/comprehensive_monitoring_system.py +1183 -0
- moai_adk/core/config/auto_spec_config.py +5 -11
- moai_adk/core/config/migration.py +19 -9
- moai_adk/core/config/unified.py +436 -0
- moai_adk/core/context_manager.py +6 -12
- moai_adk/core/enterprise_features.py +1404 -0
- moai_adk/core/error_recovery_system.py +725 -112
- moai_adk/core/event_driven_hook_system.py +1371 -0
- moai_adk/core/git/__init__.py +8 -0
- moai_adk/core/git/branch_manager.py +3 -11
- moai_adk/core/git/checkpoint.py +1 -3
- moai_adk/core/git/conflict_detector.py +413 -0
- moai_adk/core/git/manager.py +91 -1
- moai_adk/core/hooks/post_tool_auto_spec_completion.py +56 -80
- moai_adk/core/input_validation_middleware.py +1006 -0
- moai_adk/core/integration/engine.py +6 -18
- moai_adk/core/integration/integration_tester.py +10 -9
- moai_adk/core/integration/utils.py +1 -1
- moai_adk/core/issue_creator.py +10 -28
- moai_adk/core/jit_context_loader.py +956 -0
- moai_adk/core/jit_enhanced_hook_manager.py +1987 -0
- moai_adk/core/language_config_resolver.py +485 -0
- moai_adk/core/language_validator.py +28 -41
- moai_adk/core/mcp/setup.py +15 -12
- moai_adk/core/merge/__init__.py +9 -0
- moai_adk/core/merge/analyzer.py +481 -0
- moai_adk/core/migration/alfred_to_moai_migrator.py +383 -0
- moai_adk/core/migration/backup_manager.py +78 -9
- moai_adk/core/migration/custom_element_scanner.py +358 -0
- moai_adk/core/migration/file_migrator.py +8 -17
- 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 +6 -10
- moai_adk/core/migration/version_migrator.py +3 -3
- moai_adk/core/performance/cache_system.py +8 -10
- moai_adk/core/phase_optimized_hook_scheduler.py +879 -0
- moai_adk/core/project/checker.py +2 -4
- moai_adk/core/project/detector.py +1 -3
- moai_adk/core/project/initializer.py +135 -23
- moai_adk/core/project/phase_executor.py +54 -81
- moai_adk/core/project/validator.py +6 -12
- moai_adk/core/quality/trust_checker.py +9 -27
- moai_adk/core/realtime_monitoring_dashboard.py +1724 -0
- moai_adk/core/robust_json_parser.py +611 -0
- moai_adk/core/rollback_manager.py +73 -148
- moai_adk/core/session_manager.py +10 -26
- moai_adk/core/skill_loading_system.py +579 -0
- moai_adk/core/spec/confidence_scoring.py +31 -100
- moai_adk/core/spec/ears_template_engine.py +351 -286
- moai_adk/core/spec/quality_validator.py +35 -69
- moai_adk/core/spec_status_manager.py +64 -74
- moai_adk/core/template/backup.py +45 -20
- moai_adk/core/template/config.py +112 -39
- moai_adk/core/template/merger.py +11 -19
- moai_adk/core/template/processor.py +253 -149
- moai_adk/core/template_engine.py +73 -40
- 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 +4 -12
- 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 +23 -72
- moai_adk/foundation/trust/validation_checklist.py +57 -162
- 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/alfred_detector.py +1 -3
- moai_adk/statusline/config.py +13 -4
- moai_adk/statusline/enhanced_output_style_detector.py +23 -15
- moai_adk/statusline/main.py +51 -15
- moai_adk/statusline/renderer.py +104 -48
- moai_adk/statusline/update_checker.py +3 -9
- moai_adk/statusline/version_reader.py +140 -46
- moai_adk/templates/.claude/agents/moai/ai-nano-banana.md +549 -0
- moai_adk/templates/.claude/agents/moai/builder-agent.md +445 -0
- moai_adk/templates/.claude/agents/moai/builder-command.md +1132 -0
- moai_adk/templates/.claude/agents/moai/builder-skill.md +601 -0
- moai_adk/templates/.claude/agents/moai/expert-backend.md +831 -0
- moai_adk/templates/.claude/agents/moai/expert-database.md +774 -0
- moai_adk/templates/.claude/agents/moai/expert-debug.md +396 -0
- moai_adk/templates/.claude/agents/moai/expert-devops.md +711 -0
- moai_adk/templates/.claude/agents/moai/expert-frontend.md +666 -0
- moai_adk/templates/.claude/agents/moai/expert-security.md +474 -0
- moai_adk/templates/.claude/agents/moai/expert-uiux.md +1038 -0
- moai_adk/templates/.claude/agents/moai/manager-claude-code.md +429 -0
- moai_adk/templates/.claude/agents/moai/manager-docs.md +570 -0
- moai_adk/templates/.claude/agents/moai/manager-git.md +937 -0
- moai_adk/templates/.claude/agents/moai/manager-project.md +891 -0
- moai_adk/templates/.claude/agents/moai/manager-quality.md +598 -0
- moai_adk/templates/.claude/agents/moai/manager-spec.md +713 -0
- moai_adk/templates/.claude/agents/moai/manager-strategy.md +600 -0
- moai_adk/templates/.claude/agents/moai/manager-tdd.md +603 -0
- moai_adk/templates/.claude/agents/moai/mcp-context7.md +369 -0
- moai_adk/templates/.claude/agents/moai/mcp-figma.md +1567 -0
- moai_adk/templates/.claude/agents/moai/mcp-notion.md +749 -0
- moai_adk/templates/.claude/agents/moai/mcp-playwright.md +427 -0
- moai_adk/templates/.claude/agents/moai/mcp-sequential-thinking.md +994 -0
- moai_adk/templates/.claude/commands/moai/0-project.md +1143 -0
- moai_adk/templates/.claude/commands/moai/1-plan.md +1435 -0
- moai_adk/templates/.claude/commands/moai/2-run.md +883 -0
- moai_adk/templates/.claude/commands/moai/3-sync.md +993 -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 +921 -0
- moai_adk/templates/.claude/output-styles/moai/r2d2.md +380 -0
- moai_adk/templates/.claude/output-styles/moai/yoda.md +338 -0
- moai_adk/templates/.claude/settings.json +172 -0
- moai_adk/templates/.claude/skills/moai-docs-generation/SKILL.md +247 -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-domain-backend/SKILL.md +319 -0
- moai_adk/templates/.claude/skills/moai-domain-database/SKILL.md +320 -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-frontend/SKILL.md +496 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/SKILL.md +453 -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/design-system-tokens.md +405 -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 +491 -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-foundation-claude/SKILL.md +201 -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-context/SKILL.md +438 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/SKILL.md +515 -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 +346 -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-quality/SKILL.md +362 -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-integration-mcp/SKILL.md +352 -0
- moai_adk/templates/.claude/skills/moai-integration-mcp/modules/README.md +52 -0
- moai_adk/templates/.claude/skills/moai-integration-mcp/modules/error-handling.md +334 -0
- moai_adk/templates/.claude/skills/moai-integration-mcp/modules/integration-patterns.md +310 -0
- moai_adk/templates/.claude/skills/moai-integration-mcp/modules/security-authentication.md +256 -0
- moai_adk/templates/.claude/skills/moai-integration-mcp/modules/server-architecture.md +253 -0
- moai_adk/templates/.claude/skills/moai-lang-unified/README.md +133 -0
- moai_adk/templates/.claude/skills/moai-lang-unified/SKILL.md +296 -0
- moai_adk/templates/.claude/skills/moai-lang-unified/examples.md +1269 -0
- moai_adk/templates/.claude/skills/moai-lang-unified/reference.md +331 -0
- moai_adk/templates/.claude/skills/moai-library-mermaid/SKILL.md +298 -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 +316 -0
- moai_adk/templates/.claude/skills/moai-library-nextra/advanced-patterns.md +336 -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-shadcn/SKILL.md +370 -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-platform-baas/README.md +186 -0
- moai_adk/templates/.claude/skills/moai-platform-baas/SKILL.md +290 -0
- moai_adk/templates/.claude/skills/moai-platform-baas/examples.md +1225 -0
- moai_adk/templates/.claude/skills/moai-platform-baas/reference.md +567 -0
- moai_adk/templates/.claude/skills/moai-platform-baas/scripts/provider-selector.py +323 -0
- moai_adk/templates/.claude/skills/moai-platform-baas/templates/stack-config.yaml +204 -0
- moai_adk/templates/.claude/skills/moai-workflow-jit-docs/SKILL.md +446 -0
- moai_adk/templates/.claude/skills/moai-workflow-jit-docs/advanced-patterns.md +379 -0
- moai_adk/templates/.claude/skills/moai-workflow-jit-docs/optimization.md +286 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/README.md +190 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/SKILL.md +387 -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 +135 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/quick_start.py +196 -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/schemas/config-schema.json +316 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/schemas/tab_schema.json +1362 -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 +71 -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-templates/SKILL.md +374 -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-testing/LICENSE.txt +202 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/SKILL.md +453 -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/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/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 +410 -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 +103 -41
- moai_adk/templates/.git-hooks/pre-push +116 -21
- moai_adk/templates/.github/workflows/ci-universal.yml +513 -0
- moai_adk/templates/.github/workflows/security-secrets-check.yml +179 -0
- moai_adk/templates/.gitignore +184 -44
- moai_adk/templates/.mcp.json +7 -9
- moai_adk/templates/.moai/cache/personalization.json +10 -0
- moai_adk/templates/.moai/config/config.yaml +344 -0
- moai_adk/templates/.moai/config/presets/manual.yaml +28 -0
- moai_adk/templates/.moai/config/presets/personal.yaml +30 -0
- moai_adk/templates/.moai/config/presets/team.yaml +33 -0
- moai_adk/templates/.moai/config/questions/_schema.yaml +79 -0
- moai_adk/templates/.moai/config/questions/tab1-user.yaml +108 -0
- moai_adk/templates/.moai/config/questions/tab2-project.yaml +122 -0
- moai_adk/templates/.moai/config/questions/tab3-git.yaml +542 -0
- moai_adk/templates/.moai/config/questions/tab4-quality.yaml +167 -0
- moai_adk/templates/.moai/config/questions/tab5-system.yaml +152 -0
- moai_adk/templates/.moai/config/sections/git-strategy.yaml +40 -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 +15 -0
- moai_adk/templates/.moai/config/sections/system.yaml +14 -0
- moai_adk/templates/.moai/config/sections/user.yaml +5 -0
- moai_adk/templates/.moai/config/statusline-config.yaml +86 -0
- moai_adk/templates/.moai/scripts/setup-glm.py +136 -0
- moai_adk/templates/CLAUDE.md +382 -501
- moai_adk/utils/__init__.py +24 -1
- moai_adk/utils/banner.py +7 -10
- moai_adk/utils/common.py +16 -30
- moai_adk/utils/link_validator.py +4 -12
- moai_adk/utils/safe_file_reader.py +2 -6
- moai_adk/utils/timeout.py +160 -0
- moai_adk/utils/toon_utils.py +256 -0
- moai_adk/version.py +22 -0
- moai_adk-0.32.8.dist-info/METADATA +2478 -0
- moai_adk-0.32.8.dist-info/RECORD +396 -0
- {moai_adk-0.25.4.dist-info → moai_adk-0.32.8.dist-info}/WHEEL +1 -1
- {moai_adk-0.25.4.dist-info → moai_adk-0.32.8.dist-info}/entry_points.txt +1 -0
- moai_adk/cli/commands/backup.py +0 -82
- moai_adk/cli/commands/improve_user_experience.py +0 -348
- moai_adk/cli/commands/migrate.py +0 -158
- moai_adk/cli/commands/validate_links.py +0 -118
- moai_adk/templates/.github/workflows/moai-gitflow.yml +0 -413
- moai_adk/templates/.github/workflows/moai-release-create.yml +0 -100
- moai_adk/templates/.github/workflows/moai-release-pipeline.yml +0 -188
- moai_adk/utils/user_experience.py +0 -531
- moai_adk-0.25.4.dist-info/METADATA +0 -2279
- moai_adk-0.25.4.dist-info/RECORD +0 -112
- {moai_adk-0.25.4.dist-info → moai_adk-0.32.8.dist-info}/licenses/LICENSE +0 -0
|
@@ -0,0 +1,608 @@
|
|
|
1
|
+
"""
|
|
2
|
+
MoAI Menu Project - Configuration Migration Manager
|
|
3
|
+
|
|
4
|
+
This module handles migration from legacy configuration formats to the new
|
|
5
|
+
unified configuration system, supporting rollback and history tracking.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
import json
|
|
9
|
+
import logging
|
|
10
|
+
from dataclasses import dataclass
|
|
11
|
+
from pathlib import Path
|
|
12
|
+
from typing import Any, Dict, List, Optional, Union
|
|
13
|
+
|
|
14
|
+
from .config_manager import UnifiedConfigManager
|
|
15
|
+
|
|
16
|
+
logger = logging.getLogger(__name__)
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
@dataclass
|
|
20
|
+
class MigrationStep:
|
|
21
|
+
"""Single migration step definition."""
|
|
22
|
+
|
|
23
|
+
from_version: str
|
|
24
|
+
to_version: str
|
|
25
|
+
description: str
|
|
26
|
+
migration_func: str
|
|
27
|
+
rollback_func: Optional[str] = None
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
@dataclass
|
|
31
|
+
class LegacyConfigInfo:
|
|
32
|
+
"""Information about legacy configuration file."""
|
|
33
|
+
|
|
34
|
+
path: Path
|
|
35
|
+
module_name: str
|
|
36
|
+
version: str
|
|
37
|
+
format: str # 'json', 'yaml', 'ini', etc.
|
|
38
|
+
priority: int # Migration priority (lower = higher priority)
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
class LegacyConfigDetector:
|
|
42
|
+
"""Detects and analyzes legacy configuration files."""
|
|
43
|
+
|
|
44
|
+
def __init__(self, search_dirs: List[Path]):
|
|
45
|
+
"""
|
|
46
|
+
Initialize detector with search directories.
|
|
47
|
+
|
|
48
|
+
Args:
|
|
49
|
+
search_dirs: List of directories to search for legacy configs
|
|
50
|
+
"""
|
|
51
|
+
self.search_dirs = search_dirs
|
|
52
|
+
self.legacy_patterns = {
|
|
53
|
+
"batch_questions": [
|
|
54
|
+
"batch_questions_config.json",
|
|
55
|
+
"batch-config.json",
|
|
56
|
+
".batch_questions.json",
|
|
57
|
+
],
|
|
58
|
+
"documentation": [
|
|
59
|
+
"docs_config.json",
|
|
60
|
+
"documentation.json",
|
|
61
|
+
".docs_config.json",
|
|
62
|
+
],
|
|
63
|
+
"language_config": [
|
|
64
|
+
"language_settings.json",
|
|
65
|
+
"i18n_config.json",
|
|
66
|
+
".language_config.json",
|
|
67
|
+
],
|
|
68
|
+
"template_optimizer": [
|
|
69
|
+
"template_config.json",
|
|
70
|
+
"optimizer_config.json",
|
|
71
|
+
".template_config.json",
|
|
72
|
+
],
|
|
73
|
+
"project_initializer": [
|
|
74
|
+
"init_config.json",
|
|
75
|
+
"project_config.json",
|
|
76
|
+
".init_config.json",
|
|
77
|
+
],
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
def find_legacy_configs(self) -> List[LegacyConfigInfo]:
|
|
81
|
+
"""
|
|
82
|
+
Find all legacy configuration files.
|
|
83
|
+
|
|
84
|
+
Returns:
|
|
85
|
+
List of legacy configuration information
|
|
86
|
+
"""
|
|
87
|
+
legacy_configs = []
|
|
88
|
+
|
|
89
|
+
for search_dir in self.search_dirs:
|
|
90
|
+
if not search_dir.exists():
|
|
91
|
+
continue
|
|
92
|
+
|
|
93
|
+
for module_name, patterns in self.legacy_patterns.items():
|
|
94
|
+
for pattern in patterns:
|
|
95
|
+
for file_path in search_dir.glob(f"**/{pattern}"):
|
|
96
|
+
try:
|
|
97
|
+
config_info = self._analyze_config_file(file_path, module_name)
|
|
98
|
+
if config_info:
|
|
99
|
+
legacy_configs.append(config_info)
|
|
100
|
+
except Exception as e:
|
|
101
|
+
logger.warning(f"Failed to analyze {file_path}: {e}")
|
|
102
|
+
|
|
103
|
+
# Sort by priority and path
|
|
104
|
+
legacy_configs.sort(key=lambda x: (x.priority, str(x.path)))
|
|
105
|
+
return legacy_configs
|
|
106
|
+
|
|
107
|
+
def _analyze_config_file(self, file_path: Path, module_name: str) -> Optional[LegacyConfigInfo]:
|
|
108
|
+
"""Analyze individual configuration file."""
|
|
109
|
+
if not file_path.is_file():
|
|
110
|
+
return None
|
|
111
|
+
|
|
112
|
+
# Determine format
|
|
113
|
+
suffix = file_path.suffix.lower()
|
|
114
|
+
if suffix == ".json":
|
|
115
|
+
format_type = "json"
|
|
116
|
+
elif suffix in [".yml", ".yaml"]:
|
|
117
|
+
format_type = "yaml"
|
|
118
|
+
elif suffix == ".ini":
|
|
119
|
+
format_type = "ini"
|
|
120
|
+
else:
|
|
121
|
+
format_type = "unknown"
|
|
122
|
+
|
|
123
|
+
# Try to load and analyze
|
|
124
|
+
try:
|
|
125
|
+
with open(file_path, "r", encoding="utf-8") as f:
|
|
126
|
+
if format_type == "json":
|
|
127
|
+
data = json.load(f)
|
|
128
|
+
elif format_type == "yaml":
|
|
129
|
+
try:
|
|
130
|
+
import yaml
|
|
131
|
+
|
|
132
|
+
data = yaml.safe_load(f)
|
|
133
|
+
except ImportError:
|
|
134
|
+
logger.warning(f"PyYAML not available, skipping {file_path}")
|
|
135
|
+
return None
|
|
136
|
+
else:
|
|
137
|
+
return None
|
|
138
|
+
|
|
139
|
+
# Extract version if available
|
|
140
|
+
version = data.get("version", "1.0.0") if isinstance(data, dict) else "1.0.0"
|
|
141
|
+
|
|
142
|
+
# Determine priority based on file location and naming
|
|
143
|
+
priority = self._calculate_priority(file_path, module_name)
|
|
144
|
+
|
|
145
|
+
return LegacyConfigInfo(
|
|
146
|
+
path=file_path,
|
|
147
|
+
module_name=module_name,
|
|
148
|
+
version=version,
|
|
149
|
+
format=format_type,
|
|
150
|
+
priority=priority,
|
|
151
|
+
)
|
|
152
|
+
|
|
153
|
+
except Exception as e:
|
|
154
|
+
logger.warning(f"Failed to load config file {file_path}: {e}")
|
|
155
|
+
return None
|
|
156
|
+
|
|
157
|
+
def _calculate_priority(self, file_path: Path, module_name: str) -> int:
|
|
158
|
+
"""Calculate migration priority for config file."""
|
|
159
|
+
priority = 100 # Default priority
|
|
160
|
+
|
|
161
|
+
# Hidden files have higher priority
|
|
162
|
+
if file_path.name.startswith("."):
|
|
163
|
+
priority -= 30
|
|
164
|
+
|
|
165
|
+
# Files in .moai or .claude directories have higher priority
|
|
166
|
+
if ".moai" in str(file_path) or ".claude" in str(file_path):
|
|
167
|
+
priority -= 20
|
|
168
|
+
|
|
169
|
+
# Files with exact module name have higher priority
|
|
170
|
+
if module_name in file_path.name:
|
|
171
|
+
priority -= 10
|
|
172
|
+
|
|
173
|
+
# Files closer to root have higher priority
|
|
174
|
+
depth = len(file_path.relative_to(Path.cwd()).parts)
|
|
175
|
+
priority += depth * 5
|
|
176
|
+
|
|
177
|
+
return priority
|
|
178
|
+
|
|
179
|
+
|
|
180
|
+
class ConfigurationMigrator:
|
|
181
|
+
"""
|
|
182
|
+
Handles migration from legacy configurations to unified format.
|
|
183
|
+
"""
|
|
184
|
+
|
|
185
|
+
def __init__(self, config_manager: UnifiedConfigManager, dry_run: bool = False):
|
|
186
|
+
"""
|
|
187
|
+
Initialize migrator.
|
|
188
|
+
|
|
189
|
+
Args:
|
|
190
|
+
config_manager: Target configuration manager
|
|
191
|
+
dry_run: If True, only show what would be migrated
|
|
192
|
+
"""
|
|
193
|
+
self.config_manager = config_manager
|
|
194
|
+
self.dry_run = dry_run
|
|
195
|
+
self.detector = LegacyConfigDetector([Path.cwd()])
|
|
196
|
+
|
|
197
|
+
# Migration steps registry
|
|
198
|
+
self.migration_steps: Dict[str, List[MigrationStep]] = {
|
|
199
|
+
"batch_questions": self._get_batch_questions_migrations(),
|
|
200
|
+
"documentation": self._get_documentation_migrations(),
|
|
201
|
+
"language_config": self._get_language_config_migrations(),
|
|
202
|
+
"template_optimizer": self._get_template_optimizer_migrations(),
|
|
203
|
+
"project_initializer": self._get_project_initializer_migrations(),
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
def detect_and_migrate(self, backup: bool = True) -> Dict[str, Any]:
|
|
207
|
+
"""
|
|
208
|
+
Detect legacy configurations and migrate them.
|
|
209
|
+
|
|
210
|
+
Args:
|
|
211
|
+
backup: Whether to create backup before migration
|
|
212
|
+
|
|
213
|
+
Returns:
|
|
214
|
+
Migration result summary
|
|
215
|
+
"""
|
|
216
|
+
logger.info("Detecting legacy configurations...")
|
|
217
|
+
legacy_configs = self.detector.find_legacy_configs()
|
|
218
|
+
|
|
219
|
+
if not legacy_configs:
|
|
220
|
+
logger.info("No legacy configurations found")
|
|
221
|
+
return {"migrated": 0, "failed": 0, "skipped": 0, "details": []}
|
|
222
|
+
|
|
223
|
+
logger.info(f"Found {len(legacy_configs)} legacy configuration files")
|
|
224
|
+
|
|
225
|
+
# Group by module
|
|
226
|
+
module_configs = {}
|
|
227
|
+
for config_info in legacy_configs:
|
|
228
|
+
if config_info.module_name not in module_configs:
|
|
229
|
+
module_configs[config_info.module_name] = []
|
|
230
|
+
module_configs[config_info.module_name].append(config_info)
|
|
231
|
+
|
|
232
|
+
# Migrate each module
|
|
233
|
+
results = {"migrated": 0, "failed": 0, "skipped": 0, "details": []}
|
|
234
|
+
|
|
235
|
+
for module_name, configs in module_configs.items():
|
|
236
|
+
try:
|
|
237
|
+
module_result = self._migrate_module(module_name, configs, backup)
|
|
238
|
+
results["details"].append(module_result)
|
|
239
|
+
|
|
240
|
+
if module_result["status"] == "success":
|
|
241
|
+
results["migrated"] += len(configs)
|
|
242
|
+
elif module_result["status"] == "failed":
|
|
243
|
+
results["failed"] += len(configs)
|
|
244
|
+
else:
|
|
245
|
+
results["skipped"] += len(configs)
|
|
246
|
+
|
|
247
|
+
except Exception as e:
|
|
248
|
+
logger.error(f"Failed to migrate module {module_name}: {e}")
|
|
249
|
+
results["failed"] += len(configs)
|
|
250
|
+
results["details"].append(
|
|
251
|
+
{
|
|
252
|
+
"module": module_name,
|
|
253
|
+
"status": "failed",
|
|
254
|
+
"error": str(e),
|
|
255
|
+
"files": [str(c.path) for c in configs],
|
|
256
|
+
}
|
|
257
|
+
)
|
|
258
|
+
|
|
259
|
+
return results
|
|
260
|
+
|
|
261
|
+
def _migrate_module(self, module_name: str, configs: List[LegacyConfigInfo], backup: bool) -> Dict[str, Any]:
|
|
262
|
+
"""Migrate configurations for a specific module."""
|
|
263
|
+
logger.info(f"Migrating {len(configs)} configuration files for module {module_name}")
|
|
264
|
+
|
|
265
|
+
# Load existing unified config
|
|
266
|
+
unified_config = self.config_manager.load_config()
|
|
267
|
+
|
|
268
|
+
# Merge legacy configurations
|
|
269
|
+
merged_legacy_config = {}
|
|
270
|
+
|
|
271
|
+
for config_info in configs:
|
|
272
|
+
try:
|
|
273
|
+
legacy_data = self._load_legacy_config(config_info)
|
|
274
|
+
|
|
275
|
+
# Apply transformations based on version
|
|
276
|
+
transformed_data = self._transform_legacy_data(
|
|
277
|
+
legacy_data, config_info.module_name, config_info.version
|
|
278
|
+
)
|
|
279
|
+
|
|
280
|
+
# Merge into unified format
|
|
281
|
+
merged_legacy_config.update(transformed_data)
|
|
282
|
+
|
|
283
|
+
logger.debug(f"Merged {config_info.path}")
|
|
284
|
+
|
|
285
|
+
except Exception as e:
|
|
286
|
+
logger.error(f"Failed to load {config_info.path}: {e}")
|
|
287
|
+
raise
|
|
288
|
+
|
|
289
|
+
if not merged_legacy_config:
|
|
290
|
+
return {
|
|
291
|
+
"module": module_name,
|
|
292
|
+
"status": "skipped",
|
|
293
|
+
"message": "No valid configuration data found",
|
|
294
|
+
"files": [str(c.path) for c in configs],
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
# Create backup if requested
|
|
298
|
+
if backup and not self.dry_run:
|
|
299
|
+
self.config_manager._create_backup()
|
|
300
|
+
|
|
301
|
+
# Update unified configuration
|
|
302
|
+
if module_name in unified_config:
|
|
303
|
+
# Merge with existing configuration
|
|
304
|
+
unified_config[module_name].update(merged_legacy_config)
|
|
305
|
+
else:
|
|
306
|
+
unified_config[module_name] = merged_legacy_config
|
|
307
|
+
|
|
308
|
+
# Save updated configuration
|
|
309
|
+
if not self.dry_run:
|
|
310
|
+
self.config_manager.save_config(unified_config)
|
|
311
|
+
logger.info(f"Successfully migrated {module_name} configuration")
|
|
312
|
+
|
|
313
|
+
return {
|
|
314
|
+
"module": module_name,
|
|
315
|
+
"status": "success",
|
|
316
|
+
"merged_keys": list(merged_legacy_config.keys()),
|
|
317
|
+
"files": [str(c.path) for c in configs],
|
|
318
|
+
"dry_run": self.dry_run,
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
def _load_legacy_config(self, config_info: LegacyConfigInfo) -> Dict[str, Any]:
|
|
322
|
+
"""Load legacy configuration file."""
|
|
323
|
+
try:
|
|
324
|
+
with open(config_info.path, "r", encoding="utf-8") as f:
|
|
325
|
+
if config_info.format == "json":
|
|
326
|
+
return json.load(f)
|
|
327
|
+
elif config_info.format == "yaml":
|
|
328
|
+
try:
|
|
329
|
+
import yaml
|
|
330
|
+
|
|
331
|
+
return yaml.safe_load(f)
|
|
332
|
+
except ImportError:
|
|
333
|
+
raise ImportError("PyYAML is required for YAML migration")
|
|
334
|
+
else:
|
|
335
|
+
raise ValueError(f"Unsupported format: {config_info.format}")
|
|
336
|
+
|
|
337
|
+
except Exception as e:
|
|
338
|
+
logger.error(f"Failed to load {config_info.path}: {e}")
|
|
339
|
+
raise
|
|
340
|
+
|
|
341
|
+
def _transform_legacy_data(self, data: Dict[str, Any], module_name: str, version: str) -> Dict[str, Any]:
|
|
342
|
+
"""Transform legacy data to unified format."""
|
|
343
|
+
if module_name not in self.migration_steps:
|
|
344
|
+
logger.warning(f"No migration steps defined for {module_name}")
|
|
345
|
+
return data
|
|
346
|
+
|
|
347
|
+
# Apply version-specific transformations
|
|
348
|
+
for step in self.migration_steps[module_name]:
|
|
349
|
+
if self._version_matches(version, step.from_version):
|
|
350
|
+
try:
|
|
351
|
+
migration_func = getattr(self, step.migration_func)
|
|
352
|
+
data = migration_func(data)
|
|
353
|
+
logger.debug(f"Applied migration {step.from_version}->{step.to_version} for {module_name}")
|
|
354
|
+
except Exception as e:
|
|
355
|
+
logger.error(f"Failed to apply migration {step.from_version}->{step.to_version}: {e}")
|
|
356
|
+
raise
|
|
357
|
+
|
|
358
|
+
return data
|
|
359
|
+
|
|
360
|
+
def _version_matches(self, current_version: str, target_version: str) -> bool:
|
|
361
|
+
"""Check if current version matches target pattern."""
|
|
362
|
+
# Simple version matching - can be enhanced
|
|
363
|
+
return current_version.startswith(target_version.rstrip("x"))
|
|
364
|
+
|
|
365
|
+
def _get_batch_questions_migrations(self) -> List[MigrationStep]:
|
|
366
|
+
"""Get migration steps for batch questions module."""
|
|
367
|
+
return [
|
|
368
|
+
MigrationStep(
|
|
369
|
+
from_version="1.0",
|
|
370
|
+
to_version="1.0.0",
|
|
371
|
+
description="Initial format standardization",
|
|
372
|
+
migration_func="_migrate_batch_questions_1_0",
|
|
373
|
+
)
|
|
374
|
+
]
|
|
375
|
+
|
|
376
|
+
def _get_documentation_migrations(self) -> List[MigrationStep]:
|
|
377
|
+
"""Get migration steps for documentation module."""
|
|
378
|
+
return [
|
|
379
|
+
MigrationStep(
|
|
380
|
+
from_version="1.0",
|
|
381
|
+
to_version="1.0.0",
|
|
382
|
+
description="Initial format standardization",
|
|
383
|
+
migration_func="_migrate_documentation_1_0",
|
|
384
|
+
)
|
|
385
|
+
]
|
|
386
|
+
|
|
387
|
+
def _get_language_config_migrations(self) -> List[MigrationStep]:
|
|
388
|
+
"""Get migration steps for language configuration module."""
|
|
389
|
+
return [
|
|
390
|
+
MigrationStep(
|
|
391
|
+
from_version="1.0",
|
|
392
|
+
to_version="1.0.0",
|
|
393
|
+
description="Initial format standardization",
|
|
394
|
+
migration_func="_migrate_language_config_1_0",
|
|
395
|
+
)
|
|
396
|
+
]
|
|
397
|
+
|
|
398
|
+
def _get_template_optimizer_migrations(self) -> List[MigrationStep]:
|
|
399
|
+
"""Get migration steps for template optimizer module."""
|
|
400
|
+
return [
|
|
401
|
+
MigrationStep(
|
|
402
|
+
from_version="1.0",
|
|
403
|
+
to_version="1.0.0",
|
|
404
|
+
description="Initial format standardization",
|
|
405
|
+
migration_func="_migrate_template_optimizer_1_0",
|
|
406
|
+
)
|
|
407
|
+
]
|
|
408
|
+
|
|
409
|
+
def _get_project_initializer_migrations(self) -> List[MigrationStep]:
|
|
410
|
+
"""Get migration steps for project initializer module."""
|
|
411
|
+
return [
|
|
412
|
+
MigrationStep(
|
|
413
|
+
from_version="1.0",
|
|
414
|
+
to_version="1.0.0",
|
|
415
|
+
description="Initial format standardization",
|
|
416
|
+
migration_func="_migrate_project_initializer_1_0",
|
|
417
|
+
)
|
|
418
|
+
]
|
|
419
|
+
|
|
420
|
+
# Migration functions
|
|
421
|
+
def _migrate_batch_questions_1_0(self, data: Dict[str, Any]) -> Dict[str, Any]:
|
|
422
|
+
"""Migrate batch questions from 1.0 format."""
|
|
423
|
+
# Example transformation logic
|
|
424
|
+
if "max_batch_size" in data:
|
|
425
|
+
data["max_questions"] = data.pop("max_batch_size")
|
|
426
|
+
|
|
427
|
+
if "timeout" in data:
|
|
428
|
+
data["timeout_seconds"] = data.pop("timeout")
|
|
429
|
+
|
|
430
|
+
# Ensure default values
|
|
431
|
+
data.setdefault("enabled", True)
|
|
432
|
+
data.setdefault("max_questions", 50)
|
|
433
|
+
data.setdefault("timeout_seconds", 300)
|
|
434
|
+
data.setdefault("retry_attempts", 3)
|
|
435
|
+
data.setdefault("output_format", "json")
|
|
436
|
+
|
|
437
|
+
return data
|
|
438
|
+
|
|
439
|
+
def _migrate_documentation_1_0(self, data: Dict[str, Any]) -> Dict[str, Any]:
|
|
440
|
+
"""Migrate documentation from 1.0 format."""
|
|
441
|
+
# Example transformation logic
|
|
442
|
+
if "auto_docs" in data:
|
|
443
|
+
data["auto_generate"] = data.pop("auto_docs")
|
|
444
|
+
|
|
445
|
+
if "doc_format" in data:
|
|
446
|
+
data["format"] = data.pop("doc_format")
|
|
447
|
+
|
|
448
|
+
# Ensure defaults
|
|
449
|
+
data.setdefault("auto_generate", True)
|
|
450
|
+
data.setdefault("format", "markdown")
|
|
451
|
+
data.setdefault("include_api_docs", True)
|
|
452
|
+
data.setdefault("include_examples", True)
|
|
453
|
+
data.setdefault("template_engine", "jinja2")
|
|
454
|
+
data.setdefault("output_directory", "docs")
|
|
455
|
+
|
|
456
|
+
return data
|
|
457
|
+
|
|
458
|
+
def _migrate_language_config_1_0(self, data: Dict[str, Any]) -> Dict[str, Any]:
|
|
459
|
+
"""Migrate language configuration from 1.0 format."""
|
|
460
|
+
# Example transformation logic
|
|
461
|
+
if "default_lang" in data:
|
|
462
|
+
data["default_language"] = data.pop("default_lang")
|
|
463
|
+
|
|
464
|
+
if "supported_langs" in data:
|
|
465
|
+
data["supported_languages"] = data.pop("supported_langs")
|
|
466
|
+
|
|
467
|
+
# Ensure defaults
|
|
468
|
+
data.setdefault("default_language", "en")
|
|
469
|
+
data.setdefault("supported_languages", ["en"])
|
|
470
|
+
data.setdefault("auto_detect", True)
|
|
471
|
+
data.setdefault("fallback_language", "en")
|
|
472
|
+
|
|
473
|
+
return data
|
|
474
|
+
|
|
475
|
+
def _migrate_template_optimizer_1_0(self, data: Dict[str, Any]) -> Dict[str, Any]:
|
|
476
|
+
"""Migrate template optimizer from 1.0 format."""
|
|
477
|
+
# Example transformation logic
|
|
478
|
+
if "optimize_level" in data:
|
|
479
|
+
data["optimization_level"] = data.pop("optimize_level")
|
|
480
|
+
|
|
481
|
+
# Ensure defaults
|
|
482
|
+
data.setdefault("enabled", True)
|
|
483
|
+
data.setdefault("optimization_level", "basic")
|
|
484
|
+
data.setdefault("minification", False)
|
|
485
|
+
|
|
486
|
+
return data
|
|
487
|
+
|
|
488
|
+
def _migrate_project_initializer_1_0(self, data: Dict[str, Any]) -> Dict[str, Any]:
|
|
489
|
+
"""Migrate project initializer from 1.0 format."""
|
|
490
|
+
# Example transformation logic
|
|
491
|
+
if "auto_install" in data:
|
|
492
|
+
data["auto_dependencies"] = data.pop("auto_install")
|
|
493
|
+
|
|
494
|
+
# Ensure defaults
|
|
495
|
+
data.setdefault("auto_dependencies", True)
|
|
496
|
+
data.setdefault("git_init", True)
|
|
497
|
+
data.setdefault("create_virtual_env", True)
|
|
498
|
+
|
|
499
|
+
return data
|
|
500
|
+
|
|
501
|
+
def rollback_migration(self, target_timestamp: Optional[str] = None) -> bool:
|
|
502
|
+
"""
|
|
503
|
+
Rollback migration to specific timestamp or latest backup.
|
|
504
|
+
|
|
505
|
+
Args:
|
|
506
|
+
target_timestamp: Target timestamp for rollback (optional)
|
|
507
|
+
|
|
508
|
+
Returns:
|
|
509
|
+
True if rollback successful, False otherwise
|
|
510
|
+
"""
|
|
511
|
+
try:
|
|
512
|
+
backups = self.config_manager.list_backups()
|
|
513
|
+
|
|
514
|
+
if not backups:
|
|
515
|
+
logger.error("No backups available for rollback")
|
|
516
|
+
return False
|
|
517
|
+
|
|
518
|
+
# Find target backup
|
|
519
|
+
if target_timestamp:
|
|
520
|
+
target_backup = None
|
|
521
|
+
for backup in backups:
|
|
522
|
+
if target_timestamp in backup:
|
|
523
|
+
target_backup = backup
|
|
524
|
+
break
|
|
525
|
+
|
|
526
|
+
if not target_backup:
|
|
527
|
+
logger.error(f"Backup with timestamp {target_timestamp} not found")
|
|
528
|
+
return False
|
|
529
|
+
else:
|
|
530
|
+
target_backup = backups[0] # Use latest backup
|
|
531
|
+
|
|
532
|
+
# Restore backup
|
|
533
|
+
self.config_manager.restore_backup(target_backup)
|
|
534
|
+
logger.info(f"Successfully rolled back to {target_backup}")
|
|
535
|
+
return True
|
|
536
|
+
|
|
537
|
+
except Exception as e:
|
|
538
|
+
logger.error(f"Rollback failed: {e}")
|
|
539
|
+
return False
|
|
540
|
+
|
|
541
|
+
def preview_migration(self) -> Dict[str, Any]:
|
|
542
|
+
"""
|
|
543
|
+
Preview what would be migrated without actually doing it.
|
|
544
|
+
|
|
545
|
+
Returns:
|
|
546
|
+
Migration preview information
|
|
547
|
+
"""
|
|
548
|
+
# Create temporary migrator in dry-run mode
|
|
549
|
+
preview_migrator = ConfigurationMigrator(self.config_manager, dry_run=True)
|
|
550
|
+
|
|
551
|
+
# Run migration detection
|
|
552
|
+
return preview_migrator.detect_and_migrate(backup=False)
|
|
553
|
+
|
|
554
|
+
|
|
555
|
+
# Utility functions
|
|
556
|
+
def run_migration(config_dir: Union[str, Path], backup: bool = True, dry_run: bool = False) -> Dict[str, Any]:
|
|
557
|
+
"""
|
|
558
|
+
Run complete migration process.
|
|
559
|
+
|
|
560
|
+
Args:
|
|
561
|
+
config_dir: Directory containing configuration files
|
|
562
|
+
backup: Whether to create backup before migration
|
|
563
|
+
dry_run: If True, only preview what would be migrated
|
|
564
|
+
|
|
565
|
+
Returns:
|
|
566
|
+
Migration result summary
|
|
567
|
+
"""
|
|
568
|
+
config_dir = Path(config_dir)
|
|
569
|
+
config_manager = UnifiedConfigManager(config_dir / "config.json")
|
|
570
|
+
migrator = ConfigurationMigrator(config_manager, dry_run=dry_run)
|
|
571
|
+
|
|
572
|
+
return migrator.detect_and_migrate(backup=backup)
|
|
573
|
+
|
|
574
|
+
|
|
575
|
+
def check_migration_status(config_dir: Union[str, Path]) -> Dict[str, Any]:
|
|
576
|
+
"""
|
|
577
|
+
Check migration status for configuration directory.
|
|
578
|
+
|
|
579
|
+
Args:
|
|
580
|
+
config_dir: Directory to check
|
|
581
|
+
|
|
582
|
+
Returns:
|
|
583
|
+
Migration status information
|
|
584
|
+
"""
|
|
585
|
+
config_dir = Path(config_dir)
|
|
586
|
+
|
|
587
|
+
# Check for unified config
|
|
588
|
+
unified_config_path = config_dir / "config.json"
|
|
589
|
+
has_unified_config = unified_config_path.exists()
|
|
590
|
+
|
|
591
|
+
# Check for legacy configs
|
|
592
|
+
detector = LegacyConfigDetector([config_dir])
|
|
593
|
+
legacy_configs = detector.find_legacy_configs()
|
|
594
|
+
|
|
595
|
+
return {
|
|
596
|
+
"has_unified_config": has_unified_config,
|
|
597
|
+
"legacy_configs_found": len(legacy_configs),
|
|
598
|
+
"legacy_configs": [
|
|
599
|
+
{
|
|
600
|
+
"path": str(c.path),
|
|
601
|
+
"module": c.module_name,
|
|
602
|
+
"version": c.version,
|
|
603
|
+
"format": c.format,
|
|
604
|
+
}
|
|
605
|
+
for c in legacy_configs
|
|
606
|
+
],
|
|
607
|
+
"migration_needed": len(legacy_configs) > 0,
|
|
608
|
+
}
|