import { execFile } from 'node:child_process'; import { promisify } from 'node:util'; import { ROOT } from './specs.mjs'; const execFileAsync = promisify(execFile); async function gitLines(args, cwd = ROOT) { try { const { stdout } = await execFileAsync('git', args, { cwd, encoding: 'utf8' }); return stdout.split('\n').map((line) => line.trim()).filter(Boolean); } catch { return []; } } export async function getChangedFiles(since = 'origin/main', cwd = ROOT) { const files = new Set(); for (const line of await gitLines(['diff', '--name-only', `${since}...HEAD`], cwd)) files.add(line); for (const line of await gitLines(['diff', '--cached', '--name-only'], cwd)) files.add(line); for (const line of await gitLines(['diff', '--name-only'], cwd)) files.add(line); for (const line of await gitLines(['ls-files', '--others', '--exclude-standard'], cwd)) files.add(line); return [...files].sort(); }