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,383 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Alfred to Moai folder structure migration for MoAI-ADK
|
|
3
|
+
|
|
4
|
+
Handles automatic migration from legacy alfred/ folders to new moai/ structure.
|
|
5
|
+
- Creates backup before migration
|
|
6
|
+
- Installs fresh moai/ templates from package
|
|
7
|
+
- Deletes alfred/ folders
|
|
8
|
+
- Updates settings.json Hook paths
|
|
9
|
+
- Records migration status in config.json
|
|
10
|
+
- Provides automatic rollback on failure
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
import json
|
|
14
|
+
import logging
|
|
15
|
+
import shutil
|
|
16
|
+
from datetime import datetime
|
|
17
|
+
from pathlib import Path
|
|
18
|
+
from typing import Optional
|
|
19
|
+
|
|
20
|
+
from .backup_manager import BackupManager
|
|
21
|
+
|
|
22
|
+
logger = logging.getLogger(__name__)
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class AlfredToMoaiMigrator:
|
|
26
|
+
"""Handles automatic migration from Alfred to Moai folder structure"""
|
|
27
|
+
|
|
28
|
+
def __init__(self, project_root: Path):
|
|
29
|
+
"""
|
|
30
|
+
Initialize Alfred to Moai migrator
|
|
31
|
+
|
|
32
|
+
Args:
|
|
33
|
+
project_root: Root directory of the project
|
|
34
|
+
"""
|
|
35
|
+
self.project_root = Path(project_root)
|
|
36
|
+
self.claude_root = self.project_root / ".claude"
|
|
37
|
+
self.config_path = self.project_root / ".moai" / "config" / "config.json"
|
|
38
|
+
self.settings_path = self.claude_root / "settings.json"
|
|
39
|
+
self.backup_manager = BackupManager(project_root)
|
|
40
|
+
|
|
41
|
+
# Define folder paths
|
|
42
|
+
self.alfred_folders = {
|
|
43
|
+
"commands": self.claude_root / "commands" / "alfred",
|
|
44
|
+
"agents": self.claude_root / "agents" / "alfred",
|
|
45
|
+
"hooks": self.claude_root / "hooks" / "alfred",
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
self.moai_folders = {
|
|
49
|
+
"commands": self.claude_root / "commands" / "moai",
|
|
50
|
+
"agents": self.claude_root / "agents" / "moai",
|
|
51
|
+
"hooks": self.claude_root / "hooks" / "moai",
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
def _load_config(self) -> dict:
|
|
55
|
+
"""
|
|
56
|
+
Load config.json
|
|
57
|
+
|
|
58
|
+
Returns:
|
|
59
|
+
Dictionary from config.json, or empty dict if not found
|
|
60
|
+
"""
|
|
61
|
+
if not self.config_path.exists():
|
|
62
|
+
return {}
|
|
63
|
+
|
|
64
|
+
try:
|
|
65
|
+
return json.loads(self.config_path.read_text(encoding="utf-8"))
|
|
66
|
+
except Exception as e:
|
|
67
|
+
logger.warning(f"Failed to load config.json: {e}")
|
|
68
|
+
return {}
|
|
69
|
+
|
|
70
|
+
def _save_config(self, config: dict) -> None:
|
|
71
|
+
"""
|
|
72
|
+
Save config.json
|
|
73
|
+
|
|
74
|
+
Args:
|
|
75
|
+
config: Configuration dictionary to save
|
|
76
|
+
|
|
77
|
+
Raises:
|
|
78
|
+
Exception: If save fails
|
|
79
|
+
"""
|
|
80
|
+
self.config_path.parent.mkdir(parents=True, exist_ok=True)
|
|
81
|
+
self.config_path.write_text(json.dumps(config, indent=2, ensure_ascii=False))
|
|
82
|
+
|
|
83
|
+
def needs_migration(self) -> bool:
|
|
84
|
+
"""
|
|
85
|
+
Check if Alfred to Moai migration is needed
|
|
86
|
+
|
|
87
|
+
Returns:
|
|
88
|
+
True if migration is needed, False otherwise
|
|
89
|
+
"""
|
|
90
|
+
# Check if already migrated
|
|
91
|
+
try:
|
|
92
|
+
config = self._load_config()
|
|
93
|
+
migration_state = config.get("migration", {}).get("alfred_to_moai", {})
|
|
94
|
+
if migration_state.get("migrated"):
|
|
95
|
+
logger.info("ā¹ļø Alfred ā Moai migration already completed")
|
|
96
|
+
if migration_state.get("timestamp"):
|
|
97
|
+
logger.info(f"Timestamp: {migration_state['timestamp']}")
|
|
98
|
+
return False
|
|
99
|
+
except Exception as e:
|
|
100
|
+
logger.debug(f"Config check error: {e}")
|
|
101
|
+
|
|
102
|
+
# Check if any alfred folder exists
|
|
103
|
+
has_alfred = any(folder.exists() for folder in self.alfred_folders.values())
|
|
104
|
+
|
|
105
|
+
if has_alfred:
|
|
106
|
+
detected = [name for name, folder in self.alfred_folders.items() if folder.exists()]
|
|
107
|
+
logger.debug(f"Alfred folders detected: {', '.join(detected)}")
|
|
108
|
+
|
|
109
|
+
return has_alfred
|
|
110
|
+
|
|
111
|
+
def execute_migration(self, backup_path: Optional[Path] = None) -> bool:
|
|
112
|
+
"""
|
|
113
|
+
Execute Alfred to Moai migration
|
|
114
|
+
|
|
115
|
+
Args:
|
|
116
|
+
backup_path: Path to use for backup (if None, creates new backup)
|
|
117
|
+
|
|
118
|
+
Returns:
|
|
119
|
+
True if migration successful, False otherwise
|
|
120
|
+
"""
|
|
121
|
+
try:
|
|
122
|
+
logger.info("\n[1/5] Backing up project...")
|
|
123
|
+
|
|
124
|
+
# Step 1: Create or use existing backup
|
|
125
|
+
if backup_path is None:
|
|
126
|
+
try:
|
|
127
|
+
backup_path = self.backup_manager.create_backup("alfred_to_moai_migration")
|
|
128
|
+
logger.info(f"ā
Backup completed: {backup_path}")
|
|
129
|
+
except Exception as e:
|
|
130
|
+
logger.error("ā Error: Backup failed")
|
|
131
|
+
logger.error(f"Cause: {str(e)}")
|
|
132
|
+
return False
|
|
133
|
+
else:
|
|
134
|
+
logger.info(f"ā
Using existing backup: {backup_path}")
|
|
135
|
+
|
|
136
|
+
# Step 2: Detect alfred folders
|
|
137
|
+
logger.info("\n[2/5] Alfred folders detected:")
|
|
138
|
+
alfred_detected = {name: folder for name, folder in self.alfred_folders.items() if folder.exists()}
|
|
139
|
+
|
|
140
|
+
if not alfred_detected:
|
|
141
|
+
logger.warning("No Alfred folders found - skipping migration")
|
|
142
|
+
return True
|
|
143
|
+
|
|
144
|
+
logger.info(", ".join(alfred_detected.keys()))
|
|
145
|
+
|
|
146
|
+
# Step 3: Verify moai folders exist (should be created in Phase 1)
|
|
147
|
+
logger.info("\n[3/5] Verifying Moai template installation...")
|
|
148
|
+
missing_moai = [name for name, folder in self.moai_folders.items() if not folder.exists()]
|
|
149
|
+
|
|
150
|
+
if missing_moai:
|
|
151
|
+
logger.error(f"ā Missing Moai folders: {', '.join(missing_moai)}")
|
|
152
|
+
logger.error("Phase 1 implementation required first (package template moai structure)")
|
|
153
|
+
self._rollback_migration(backup_path)
|
|
154
|
+
return False
|
|
155
|
+
|
|
156
|
+
logger.info("ā
Moai templates installed")
|
|
157
|
+
|
|
158
|
+
# Step 4: Update settings.json hooks
|
|
159
|
+
logger.info("\n[4/5] Updating paths...")
|
|
160
|
+
try:
|
|
161
|
+
self._update_settings_json_hooks()
|
|
162
|
+
logger.info("ā
settings.json Hook paths updated")
|
|
163
|
+
except Exception as e:
|
|
164
|
+
logger.error("ā Error: Failed to update settings.json")
|
|
165
|
+
logger.error(f"Cause: {str(e)}")
|
|
166
|
+
self._rollback_migration(backup_path)
|
|
167
|
+
return False
|
|
168
|
+
|
|
169
|
+
# Step 5: Delete alfred folders
|
|
170
|
+
logger.info("\n[5/5] Cleaning up...")
|
|
171
|
+
try:
|
|
172
|
+
self._delete_alfred_folders(alfred_detected)
|
|
173
|
+
logger.info("ā
Alfred folders deleted")
|
|
174
|
+
except Exception as e:
|
|
175
|
+
logger.error("ā Error: Failed to delete Alfred folders")
|
|
176
|
+
logger.error(f"Cause: {str(e)}")
|
|
177
|
+
self._rollback_migration(backup_path)
|
|
178
|
+
return False
|
|
179
|
+
|
|
180
|
+
# Step 6: Verify migration
|
|
181
|
+
logger.info("\n[6/6] Verifying migration...")
|
|
182
|
+
if not self._verify_migration():
|
|
183
|
+
logger.error("ā Migration verification failed")
|
|
184
|
+
self._rollback_migration(backup_path)
|
|
185
|
+
return False
|
|
186
|
+
|
|
187
|
+
logger.info("ā
Migration verification passed")
|
|
188
|
+
|
|
189
|
+
# Step 7: Record migration status
|
|
190
|
+
logger.info("\nRecording migration status...")
|
|
191
|
+
try:
|
|
192
|
+
self._record_migration_state(backup_path, len(alfred_detected))
|
|
193
|
+
logger.info("ā
Migration status recorded")
|
|
194
|
+
except Exception as e:
|
|
195
|
+
logger.warning(f"ā ļø Failed to record status: {str(e)}")
|
|
196
|
+
# Don't rollback for this, migration was successful
|
|
197
|
+
|
|
198
|
+
logger.info("\nā
Alfred ā Moai migration completed!")
|
|
199
|
+
return True
|
|
200
|
+
|
|
201
|
+
except Exception as e:
|
|
202
|
+
logger.error(f"\nā Unexpected error: {str(e)}")
|
|
203
|
+
if backup_path:
|
|
204
|
+
self._rollback_migration(backup_path)
|
|
205
|
+
return False
|
|
206
|
+
|
|
207
|
+
def _delete_alfred_folders(self, alfred_detected: dict) -> None:
|
|
208
|
+
"""
|
|
209
|
+
Delete Alfred folders
|
|
210
|
+
|
|
211
|
+
Args:
|
|
212
|
+
alfred_detected: Dictionary of detected alfred folders
|
|
213
|
+
|
|
214
|
+
Raises:
|
|
215
|
+
Exception: If deletion fails
|
|
216
|
+
"""
|
|
217
|
+
for name, folder in alfred_detected.items():
|
|
218
|
+
if folder.exists():
|
|
219
|
+
try:
|
|
220
|
+
shutil.rmtree(folder)
|
|
221
|
+
logger.debug(f"Deleted: {folder}")
|
|
222
|
+
except Exception as e:
|
|
223
|
+
raise Exception(f"Failed to delete {name} folder: {str(e)}")
|
|
224
|
+
|
|
225
|
+
def _update_settings_json_hooks(self) -> None:
|
|
226
|
+
"""
|
|
227
|
+
Update settings.json to replace alfred paths with moai paths
|
|
228
|
+
|
|
229
|
+
Raises:
|
|
230
|
+
Exception: If update fails
|
|
231
|
+
"""
|
|
232
|
+
if not self.settings_path.exists():
|
|
233
|
+
logger.warning(f"settings.json file missing: {self.settings_path}")
|
|
234
|
+
return
|
|
235
|
+
|
|
236
|
+
try:
|
|
237
|
+
# Read settings.json
|
|
238
|
+
with open(self.settings_path, "r", encoding="utf-8") as f:
|
|
239
|
+
settings_content = f.read()
|
|
240
|
+
|
|
241
|
+
# Replace all alfred references with moai
|
|
242
|
+
# Pattern: .claude/hooks/alfred/ ā .claude/hooks/moai/
|
|
243
|
+
updated_content = settings_content.replace(".claude/hooks/alfred/", ".claude/hooks/moai/")
|
|
244
|
+
updated_content = updated_content.replace(".claude/commands/alfred/", ".claude/commands/moai/")
|
|
245
|
+
updated_content = updated_content.replace(".claude/agents/alfred/", ".claude/agents/moai/")
|
|
246
|
+
|
|
247
|
+
# Write back to file
|
|
248
|
+
with open(self.settings_path, "w", encoding="utf-8") as f:
|
|
249
|
+
f.write(updated_content)
|
|
250
|
+
|
|
251
|
+
# Verify JSON validity
|
|
252
|
+
with open(self.settings_path, "r", encoding="utf-8") as f:
|
|
253
|
+
json.load(f) # This will raise if JSON is invalid
|
|
254
|
+
|
|
255
|
+
logger.debug("settings.json update and verification completed")
|
|
256
|
+
|
|
257
|
+
except json.JSONDecodeError as e:
|
|
258
|
+
raise Exception(f"settings.json JSON format error: {str(e)}")
|
|
259
|
+
except Exception as e:
|
|
260
|
+
raise Exception(f"Failed to update settings.json: {str(e)}")
|
|
261
|
+
|
|
262
|
+
def _verify_migration(self) -> bool:
|
|
263
|
+
"""
|
|
264
|
+
Verify migration was successful
|
|
265
|
+
|
|
266
|
+
Returns:
|
|
267
|
+
True if migration is valid, False otherwise
|
|
268
|
+
"""
|
|
269
|
+
# Check moai folders exist
|
|
270
|
+
for name, folder in self.moai_folders.items():
|
|
271
|
+
if not folder.exists():
|
|
272
|
+
logger.error(f"ā Missing Moai {name} folder: {folder}")
|
|
273
|
+
return False
|
|
274
|
+
|
|
275
|
+
# Check alfred folders are deleted
|
|
276
|
+
for name, folder in self.alfred_folders.items():
|
|
277
|
+
if folder.exists():
|
|
278
|
+
logger.warning(f"ā ļø Alfred {name} folder still exists: {folder}")
|
|
279
|
+
return False
|
|
280
|
+
|
|
281
|
+
# Check settings.json hooks paths (ignore pattern matching strings like "Bash(alfred:*)")
|
|
282
|
+
if self.settings_path.exists():
|
|
283
|
+
try:
|
|
284
|
+
with open(self.settings_path, "r", encoding="utf-8") as f:
|
|
285
|
+
settings_content = f.read()
|
|
286
|
+
|
|
287
|
+
# Only check for hooks/alfred paths, not pattern strings
|
|
288
|
+
if (
|
|
289
|
+
".claude/hooks/alfred/" in settings_content
|
|
290
|
+
or ".claude/commands/alfred/" in settings_content
|
|
291
|
+
or ".claude/agents/alfred/" in settings_content
|
|
292
|
+
):
|
|
293
|
+
logger.error("ā settings.json still contains alfred hook paths")
|
|
294
|
+
return False
|
|
295
|
+
|
|
296
|
+
if "moai" not in settings_content.lower():
|
|
297
|
+
logger.warning("ā ļø No moai references in settings.json")
|
|
298
|
+
|
|
299
|
+
except Exception as e:
|
|
300
|
+
logger.error(f"ā settings.json verification failed: {str(e)}")
|
|
301
|
+
return False
|
|
302
|
+
|
|
303
|
+
logger.debug("Migration verification completed")
|
|
304
|
+
return True
|
|
305
|
+
|
|
306
|
+
def _record_migration_state(self, backup_path: Path, folders_count: int) -> None:
|
|
307
|
+
"""
|
|
308
|
+
Record migration state in config.json
|
|
309
|
+
|
|
310
|
+
Args:
|
|
311
|
+
backup_path: Path to the backup
|
|
312
|
+
folders_count: Number of folders migrated
|
|
313
|
+
|
|
314
|
+
Raises:
|
|
315
|
+
Exception: If recording fails
|
|
316
|
+
"""
|
|
317
|
+
try:
|
|
318
|
+
config = self._load_config()
|
|
319
|
+
|
|
320
|
+
# Initialize migration section if not exists
|
|
321
|
+
if "migration" not in config:
|
|
322
|
+
config["migration"] = {}
|
|
323
|
+
|
|
324
|
+
config["migration"]["alfred_to_moai"] = {
|
|
325
|
+
"migrated": True,
|
|
326
|
+
"timestamp": datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
|
|
327
|
+
"folders_installed": 3, # commands, agents, hooks
|
|
328
|
+
"folders_removed": folders_count,
|
|
329
|
+
"backup_path": str(backup_path),
|
|
330
|
+
"package_version": self._get_package_version(),
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
self._save_config(config)
|
|
334
|
+
logger.debug("Migration state recorded in config.json")
|
|
335
|
+
|
|
336
|
+
except Exception as e:
|
|
337
|
+
raise Exception(f"Migration state recording failed: {str(e)}")
|
|
338
|
+
|
|
339
|
+
def _rollback_migration(self, backup_path: Path) -> None:
|
|
340
|
+
"""
|
|
341
|
+
Rollback migration from backup
|
|
342
|
+
|
|
343
|
+
Args:
|
|
344
|
+
backup_path: Path to the backup to restore from
|
|
345
|
+
"""
|
|
346
|
+
try:
|
|
347
|
+
logger.info("\nš Starting automatic rollback...")
|
|
348
|
+
logger.info("[1/3] Restoring project...")
|
|
349
|
+
|
|
350
|
+
# Restore from backup
|
|
351
|
+
self.backup_manager.restore_backup(backup_path)
|
|
352
|
+
|
|
353
|
+
logger.info("ā
Project restored")
|
|
354
|
+
logger.info("[2/3] Resetting migration state...")
|
|
355
|
+
|
|
356
|
+
# Clear migration state in config
|
|
357
|
+
try:
|
|
358
|
+
config = self._load_config()
|
|
359
|
+
if "migration" in config and "alfred_to_moai" in config["migration"]:
|
|
360
|
+
del config["migration"]["alfred_to_moai"]
|
|
361
|
+
self._save_config(config)
|
|
362
|
+
except Exception as e:
|
|
363
|
+
logger.warning(f"ā ļø Failed to reset state: {str(e)}")
|
|
364
|
+
|
|
365
|
+
logger.info("ā
Rollback completed")
|
|
366
|
+
logger.info("š” Tip: Run `moai-adk update` again after resolving the error")
|
|
367
|
+
|
|
368
|
+
except Exception as e:
|
|
369
|
+
logger.error(f"\nā Rollback failed: {str(e)}")
|
|
370
|
+
logger.error(f"ā ļø Manual recovery required: Please restore manually from backup: {backup_path}")
|
|
371
|
+
|
|
372
|
+
def _get_package_version(self) -> str:
|
|
373
|
+
"""
|
|
374
|
+
Get current package version
|
|
375
|
+
|
|
376
|
+
Returns:
|
|
377
|
+
Version string
|
|
378
|
+
"""
|
|
379
|
+
try:
|
|
380
|
+
config = self._load_config()
|
|
381
|
+
return config.get("moai", {}).get("version", "unknown")
|
|
382
|
+
except Exception:
|
|
383
|
+
return "unknown"
|
|
@@ -10,7 +10,7 @@ import logging
|
|
|
10
10
|
import shutil
|
|
11
11
|
from datetime import datetime
|
|
12
12
|
from pathlib import Path
|
|
13
|
-
from typing import Dict, List, Optional
|
|
13
|
+
from typing import Any, Dict, List, Optional
|
|
14
14
|
|
|
15
15
|
logger = logging.getLogger(__name__)
|
|
16
16
|
|
|
@@ -79,8 +79,8 @@ class BackupManager:
|
|
|
79
79
|
}
|
|
80
80
|
|
|
81
81
|
metadata_path = backup_dir / "backup_metadata.json"
|
|
82
|
-
with open(metadata_path, "w") as f:
|
|
83
|
-
json.dump(metadata, f, indent=2)
|
|
82
|
+
with open(metadata_path, "w", encoding="utf-8") as f:
|
|
83
|
+
json.dump(metadata, f, indent=2, ensure_ascii=False)
|
|
84
84
|
|
|
85
85
|
logger.info(f"ā
Backup created successfully: {backup_dir}")
|
|
86
86
|
return backup_dir
|
|
@@ -92,7 +92,7 @@ class BackupManager:
|
|
|
92
92
|
Returns:
|
|
93
93
|
List of backup information dictionaries
|
|
94
94
|
"""
|
|
95
|
-
backups = []
|
|
95
|
+
backups: List[Dict[str, Any]] = []
|
|
96
96
|
|
|
97
97
|
if not self.backup_base_dir.exists():
|
|
98
98
|
return backups
|
|
@@ -102,15 +102,13 @@ class BackupManager:
|
|
|
102
102
|
metadata_path = backup_dir / "backup_metadata.json"
|
|
103
103
|
if metadata_path.exists():
|
|
104
104
|
try:
|
|
105
|
-
with open(metadata_path, "r") as f:
|
|
105
|
+
with open(metadata_path, "r", encoding="utf-8") as f:
|
|
106
106
|
metadata = json.load(f)
|
|
107
107
|
backups.append(
|
|
108
108
|
{
|
|
109
109
|
"path": str(backup_dir),
|
|
110
110
|
"timestamp": metadata.get("timestamp", "unknown"),
|
|
111
|
-
"description": metadata.get(
|
|
112
|
-
"description", "unknown"
|
|
113
|
-
),
|
|
111
|
+
"description": metadata.get("description", "unknown"),
|
|
114
112
|
"files": len(metadata.get("backed_up_files", [])),
|
|
115
113
|
}
|
|
116
114
|
)
|
|
@@ -142,7 +140,7 @@ class BackupManager:
|
|
|
142
140
|
|
|
143
141
|
try:
|
|
144
142
|
# Read metadata
|
|
145
|
-
with open(metadata_path, "r") as f:
|
|
143
|
+
with open(metadata_path, "r", encoding="utf-8") as f:
|
|
146
144
|
metadata = json.load(f)
|
|
147
145
|
|
|
148
146
|
logger.info(f"Restoring backup from {backup_path}")
|
|
@@ -206,3 +204,74 @@ class BackupManager:
|
|
|
206
204
|
if backups:
|
|
207
205
|
return Path(backups[0]["path"])
|
|
208
206
|
return None
|
|
207
|
+
|
|
208
|
+
def create_full_project_backup(self, description: str = "pre-update-backup") -> Path:
|
|
209
|
+
"""
|
|
210
|
+
Create a complete backup of entire project structure before update
|
|
211
|
+
|
|
212
|
+
Backs up:
|
|
213
|
+
- .claude/ (entire directory)
|
|
214
|
+
- .moai/ (entire directory)
|
|
215
|
+
- CLAUDE.md (file)
|
|
216
|
+
|
|
217
|
+
Args:
|
|
218
|
+
description: Description of this backup (default: "pre-update-backup")
|
|
219
|
+
|
|
220
|
+
Returns:
|
|
221
|
+
Path to the backup directory
|
|
222
|
+
"""
|
|
223
|
+
# Create timestamped backup directory
|
|
224
|
+
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
|
|
225
|
+
backup_dir = self.project_root / ".moai-backups" / f"{description}_{timestamp}"
|
|
226
|
+
backup_dir.mkdir(parents=True, exist_ok=True)
|
|
227
|
+
|
|
228
|
+
logger.info(f"Creating full project backup at {backup_dir}")
|
|
229
|
+
|
|
230
|
+
# Directories and files to backup
|
|
231
|
+
backup_targets = [
|
|
232
|
+
(self.project_root / ".claude", True), # (path, is_directory)
|
|
233
|
+
(self.project_root / ".moai", True),
|
|
234
|
+
(self.project_root / "CLAUDE.md", False),
|
|
235
|
+
]
|
|
236
|
+
|
|
237
|
+
backed_up_items = []
|
|
238
|
+
|
|
239
|
+
for target_path, is_dir in backup_targets:
|
|
240
|
+
if not target_path.exists():
|
|
241
|
+
continue
|
|
242
|
+
|
|
243
|
+
try:
|
|
244
|
+
rel_path = target_path.relative_to(self.project_root)
|
|
245
|
+
backup_path = backup_dir / rel_path
|
|
246
|
+
|
|
247
|
+
if is_dir:
|
|
248
|
+
# Backup directory
|
|
249
|
+
shutil.copytree(target_path, backup_path, dirs_exist_ok=True)
|
|
250
|
+
backed_up_items.append(str(rel_path))
|
|
251
|
+
logger.debug(f"Backed up directory: {rel_path}")
|
|
252
|
+
else:
|
|
253
|
+
# Backup file
|
|
254
|
+
backup_path.parent.mkdir(parents=True, exist_ok=True)
|
|
255
|
+
shutil.copy2(target_path, backup_path)
|
|
256
|
+
backed_up_items.append(str(rel_path))
|
|
257
|
+
logger.debug(f"Backed up file: {rel_path}")
|
|
258
|
+
|
|
259
|
+
except Exception as e:
|
|
260
|
+
logger.error(f"Failed to backup {target_path}: {e}")
|
|
261
|
+
raise
|
|
262
|
+
|
|
263
|
+
# Save backup metadata
|
|
264
|
+
metadata = {
|
|
265
|
+
"timestamp": timestamp,
|
|
266
|
+
"description": description,
|
|
267
|
+
"backed_up_items": backed_up_items,
|
|
268
|
+
"project_root": str(self.project_root),
|
|
269
|
+
"backup_type": "full_project",
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
metadata_path = backup_dir / "backup_metadata.json"
|
|
273
|
+
with open(metadata_path, "w", encoding="utf-8") as f:
|
|
274
|
+
json.dump(metadata, f, indent=2, ensure_ascii=False)
|
|
275
|
+
|
|
276
|
+
logger.info(f"ā
Full project backup created successfully: {backup_dir}")
|
|
277
|
+
return backup_dir
|