Coverage for src/moai_adk/cli/commands/migrate.py: 17.81%
73 statements
« prev ^ index » next coverage.py v7.11.3, created at 2025-11-20 15:28 +0900
« prev ^ index » next coverage.py v7.11.3, created at 2025-11-20 15:28 +0900
1"""
2Migration CLI command for MoAI-ADK
4Provides command-line interface for project version migrations.
5"""
7import logging
8import sys
9from pathlib import Path
11import click
13from moai_adk.core.migration import VersionMigrator
15logger = logging.getLogger(__name__)
18@click.command()
19@click.option(
20 "--check",
21 is_flag=True,
22 help="Check if migration is needed without executing",
23)
24@click.option(
25 "--dry-run",
26 is_flag=True,
27 help="Show migration plan without making changes",
28)
29@click.option(
30 "--no-cleanup",
31 is_flag=True,
32 help="Keep old files after migration",
33)
34@click.option(
35 "--rollback",
36 is_flag=True,
37 help="Rollback to the latest backup",
38)
39@click.option(
40 "--list-backups",
41 is_flag=True,
42 help="List available backups",
43)
44def migrate(check, dry_run, no_cleanup, rollback, list_backups):
45 """
46 Migrate MoAI-ADK project to the latest version
48 This command automatically migrates your project structure to match
49 the latest MoAI-ADK version. It creates backups before migration
50 and can rollback if issues occur.
52 Examples:
54 # Check if migration is needed
55 moai-adk migrate --check
57 # Preview migration plan
58 moai-adk migrate --dry-run
60 # Execute migration
61 moai-adk migrate
63 # Migrate without cleaning up old files
64 moai-adk migrate --no-cleanup
66 # Rollback to latest backup
67 moai-adk migrate --rollback
69 # List available backups
70 moai-adk migrate --list-backups
71 """
72 try:
73 project_root = Path.cwd()
74 migrator = VersionMigrator(project_root)
76 # List backups
77 if list_backups:
78 backups = migrator.backup_manager.list_backups()
79 if not backups:
80 click.echo("📦 No backups found")
81 return
83 click.echo("📦 Available backups:\n")
84 for i, backup in enumerate(backups, 1):
85 click.echo(f"{i}. {backup['description']} ({backup['timestamp']})")
86 click.echo(f" Path: {backup['path']}")
87 click.echo(f" Files: {backup['files']}")
88 click.echo()
89 return
91 # Rollback
92 if rollback:
93 click.echo("🔙 Rolling back to latest backup...")
94 if migrator.rollback_to_latest_backup():
95 click.echo("✅ Rollback completed successfully")
96 sys.exit(0)
97 else:
98 click.echo("❌ Rollback failed", err=True)
99 sys.exit(1)
101 # Check status
102 if check:
103 status = migrator.check_status()
104 version_info = status["version"]
105 migration_info = status["migration"]
107 click.echo("📊 Migration Status:\n")
108 click.echo(f"Current Version: {version_info['detected_version']}")
109 click.echo(
110 f"Needs Migration: {'Yes' if version_info['needs_migration'] else 'No'}"
111 )
113 if version_info["needs_migration"]:
114 click.echo(f"Target Version: {migration_info['target_version']}")
115 click.echo(f"Files to migrate: {migration_info['file_count']}")
116 click.echo("\n💡 Run 'moai-adk migrate' to execute migration")
117 else:
118 click.echo("\n✅ Project is up to date")
120 return
122 # Dry run
123 if dry_run:
124 if migrator.needs_migration():
125 migrator.migrate_to_v024(dry_run=True)
126 else:
127 click.echo("✅ Project is already up to date")
128 return
130 # Execute migration
131 if not migrator.needs_migration():
132 click.echo("✅ Project is already up to date")
133 return
135 click.echo("🚀 MoAI-ADK Project Migration\n")
136 click.echo("This will migrate your project to v0.24.0")
137 click.echo("A backup will be created automatically\n")
139 # Confirm with user
140 if not click.confirm("Do you want to proceed?"):
141 click.echo("❌ Migration cancelled")
142 return
144 # Execute migration
145 success = migrator.migrate_to_v024(dry_run=False, cleanup=not no_cleanup)
147 if success:
148 click.echo("\n🎉 Migration completed successfully!")
149 sys.exit(0)
150 else:
151 click.echo("\n❌ Migration failed", err=True)
152 click.echo("💡 Use 'moai-adk migrate --rollback' to restore from backup")
153 sys.exit(1)
155 except Exception as e:
156 logger.error(f"Migration command failed: {e}", exc_info=True)
157 click.echo(f"❌ Error: {e}", err=True)
158 sys.exit(1)