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

1""" 

2Migration CLI command for MoAI-ADK 

3 

4Provides command-line interface for project version migrations. 

5""" 

6 

7import logging 

8import sys 

9from pathlib import Path 

10 

11import click 

12 

13from moai_adk.core.migration import VersionMigrator 

14 

15logger = logging.getLogger(__name__) 

16 

17 

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 

47 

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. 

51 

52 Examples: 

53 

54 # Check if migration is needed 

55 moai-adk migrate --check 

56 

57 # Preview migration plan 

58 moai-adk migrate --dry-run 

59 

60 # Execute migration 

61 moai-adk migrate 

62 

63 # Migrate without cleaning up old files 

64 moai-adk migrate --no-cleanup 

65 

66 # Rollback to latest backup 

67 moai-adk migrate --rollback 

68 

69 # List available backups 

70 moai-adk migrate --list-backups 

71 """ 

72 try: 

73 project_root = Path.cwd() 

74 migrator = VersionMigrator(project_root) 

75 

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 

82 

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 

90 

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) 

100 

101 # Check status 

102 if check: 

103 status = migrator.check_status() 

104 version_info = status["version"] 

105 migration_info = status["migration"] 

106 

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 ) 

112 

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") 

119 

120 return 

121 

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 

129 

130 # Execute migration 

131 if not migrator.needs_migration(): 

132 click.echo("✅ Project is already up to date") 

133 return 

134 

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") 

138 

139 # Confirm with user 

140 if not click.confirm("Do you want to proceed?"): 

141 click.echo("❌ Migration cancelled") 

142 return 

143 

144 # Execute migration 

145 success = migrator.migrate_to_v024(dry_run=False, cleanup=not no_cleanup) 

146 

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) 

154 

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)