/** * Search command */ import chalk from 'chalk'; import ora from 'ora'; import { SearchService, SearchOptions } from '../services/search'; export async function searchCommand( pattern: string, options: SearchOptions & { path?: string } ): Promise { const cwd = options.path || process.cwd(); const search = new SearchService(cwd); const spinner = ora('Searching...').start(); try { const results = await search.search(pattern, options); spinner.stop(); if (results.length === 0) { console.log(chalk.yellow('\n⚠ No results found\n')); return; } console.log(chalk.bold.cyan(`\nšŸ” Found ${results.length} results\n`)); results.forEach((result, index) => { console.log( chalk.gray(`${index + 1}.`) + ` ${chalk.cyan(result.file)}:${chalk.yellow(result.line)}:${chalk.gray(result.column)}` ); console.log(chalk.gray(' Match: ') + chalk.green(`"${result.match}"`)); if (options.contextLines && options.contextLines > 0) { console.log(chalk.gray(' Context:')); const lines = result.context.split('\n'); const middleLine = Math.floor(lines.length / 2); lines.forEach((line, i) => { const prefix = i === middleLine ? chalk.green(' →') : chalk.gray(' '); console.log(`${prefix} ${line}`); }); } console.log(''); }); } catch (error) { spinner.fail(chalk.red('Search failed: ' + (error as Error).message)); } }