#!/usr/bin/env tsx import Database from 'better-sqlite3'; import fs from 'fs'; import path from 'path'; import { MigrationRunner } from '../apps/service/src/migration-runner'; const args = process.argv.slice(2); const command = args[0]; if (!command) { console.log('Usage: migrate '); console.log('Commands:'); console.log(' up - Apply all pending migrations'); console.log(' create - Create a new migration file'); console.log(' status - Show migration status'); process.exit(1); } // Find project root let projectRoot = process.cwd(); while (projectRoot !== path.dirname(projectRoot)) { if (fs.existsSync(path.join(projectRoot, 'package.json'))) { try { const pkg = JSON.parse( fs.readFileSync(path.join(projectRoot, 'package.json'), 'utf-8'), ); if (pkg.name === 'watch-finished-turbo') { break; } } catch (e) { // ignore } } projectRoot = path.dirname(projectRoot); } const dbPath = path.resolve(projectRoot, 'data/database.db'); const migrationsDir = path.resolve(projectRoot, 'data/migrations'); // Ensure directories exist if (!fs.existsSync(path.dirname(dbPath))) { fs.mkdirSync(path.dirname(dbPath), { recursive: true }); } if (!fs.existsSync(migrationsDir)) { fs.mkdirSync(migrationsDir, { recursive: true }); } const db = new Database(dbPath); const runner = new MigrationRunner(db, migrationsDir); try { switch (command) { case 'up': runner.applyPendingMigrations(); break; case 'create': const name = args[1]; if (!name) { console.error('Migration name is required'); process.exit(1); } runner.createMigration(name); break; case 'status': runner.init(); const applied = runner.getAppliedMigrations(); const available = runner.getAvailableMigrations(); const pending = available.filter(m => !applied.includes(m)); console.log('Migration Status:'); console.log(`Applied: ${applied.length}`); console.log(`Available: ${available.length}`); console.log(`Pending: ${pending.length}`); if (pending.length > 0) { console.log('\nPending migrations:'); pending.forEach(m => console.log(` - ${m}`)); } break; default: console.error(`Unknown command: ${command}`); process.exit(1); } } finally { db.close(); }