/** * module terraform-unlock command * * Removes a stale Terraform state lock for a module. * Only use this if you are certain no other deploy is running. */ import { existsSync, rmSync } from 'node:fs'; import { join } from 'node:path'; import { eq } from 'drizzle-orm'; import { getDb } from '../../db/client'; import { modules } from '../../db/schema'; import { validateRequiredArgs } from '../parser'; import { log } from '../prompts'; import type { CommandResult } from '../types'; export async function handleModuleTerraformUnlock(args: string[]): Promise { const error = validateRequiredArgs(args, 1); if (error) { return { success: false, error: 'Usage: celilo module terraform-unlock ', }; } const moduleId = args[0]; const db = getDb(); const module = await db.select().from(modules).where(eq(modules.id, moduleId)).get(); if (!module) { return { success: false, error: `Module not found: ${moduleId}` }; } const lockFile = join( module.sourcePath, 'generated', 'terraform', '.terraform.tfstate.lock.info', ); if (!existsSync(lockFile)) { log.success(`No state lock found for ${moduleId}`); return { success: true, message: `No state lock found for ${moduleId}` }; } try { rmSync(lockFile); log.success(`State lock removed for ${moduleId}`); log.message('You can now retry the deploy.'); return { success: true, message: `State lock removed for ${moduleId}` }; } catch (err) { return { success: false, error: `Failed to remove lock file: ${err instanceof Error ? err.message : String(err)}\n\nTry manually: rm ${lockFile}`, }; } }