/** * Modification Prompt * * Interactive prompts for handling user-modified files. */ import chalk from 'chalk'; import { confirm, select } from '@inquirer/prompts'; import type { FileModificationStatus } from './file-detector.js'; /** * Modification prompt options */ export interface ModificationPromptOptions { /** Modified file to prompt about */ file: FileModificationStatus; /** Default choice */ defaultChoice?: 'skip' | 'backup' | 'overwrite'; } /** * Prompt result for single file */ export type PromptResult = 'skip' | 'backup' | 'overwrite' | 'cancel'; /** * Prompt for single file modification * * @param options - Prompt options * @returns User's choice */ export async function promptFileModification(options: ModificationPromptOptions): Promise { const { file } = options; console.log(''); console.log(chalk.yellow('⚠ Modified file detected:'), chalk.bold(path.basename(file.filePath))); console.log(chalk.dim(`Path: ${file.filePath}`)); console.log(chalk.dim(`This file was generated by k0ntext but has been modified.`)); console.log(''); const choice = await select({ message: 'What would you like to do?', choices: [ { name: 'Skip this file (keep current version)', value: 'skip', description: 'Leave the file as-is and continue' }, { name: 'Backup then overwrite', value: 'backup', description: 'Create a backup of current version, then regenerate' }, { name: 'Overwrite without backup', value: 'overwrite', description: 'Discard current changes and regenerate (no backup)' }, { name: 'Cancel generation', value: 'cancel', description: 'Stop the generation process' } ], default: options.defaultChoice || 'skip' }); return choice; } /** * Show a summary of modified files * * @param modifications - Array of modification statuses * @returns True if user wants to proceed */ export async function showSummary(modifications: FileModificationStatus[]): Promise { if (modifications.length === 0) { return true; } console.log(''); console.log(chalk.yellow(`⚠ ${modifications.length} modified file(s) detected:`)); console.log(''); for (const mod of modifications) { console.log(chalk.dim(' •'), mod.filePath); } console.log(''); const proceed = await confirm({ message: 'These files have custom modifications. Continue?', default: false }); return proceed; } /** * Format modification status for display * * @param status - Modification status * @returns Formatted string */ export function formatModificationStatus(status: FileModificationStatus): string { const icon = status.isModified ? '⚠' : '✓'; const modified = status.isModified ? chalk.yellow('modified') : chalk.green('unmodified'); return `${icon} ${status.filePath} (${modified})`; } import path from 'path';