#!/usr/bin/env node /** * Impeccable CLI * * Usage: * npx impeccable detect [file-or-dir-or-url...] * npx impeccable live [--port=PORT] * npx impeccable live stop * npx impeccable skills help|install|update * npx impeccable --help */ import { readFileSync } from 'node:fs'; import { join, dirname } from 'node:path'; import { fileURLToPath } from 'node:url'; const __dirname = dirname(fileURLToPath(import.meta.url)); const args = process.argv.slice(2); const command = args[0]; if (!command || command === '--help' || command === '-h') { console.log(`Usage: impeccable [options] Commands: detect [file-or-dir-or-url...] Scan for UI anti-patterns and design quality issues live [--port=PORT] Start browser detection overlay server live stop Stop a running live server skills help List all available skills and commands skills install Install impeccable skills into your project skills update Update skills to the latest version Options: --help Show this help message --version Show version number Run 'impeccable --help' for command-specific options.`); process.exit(0); } if (command === '--version' || command === '-v') { const pkg = JSON.parse(readFileSync(join(__dirname, '..', 'package.json'), 'utf8')); console.log(pkg.version); process.exit(0); } if (command === 'detect') { process.argv = [process.argv[0], process.argv[1], ...args.slice(1)]; const { detectCli } = await import('../src/detect-antipatterns.mjs'); await detectCli(); } else if (command === 'live') { process.argv = [process.argv[0], process.argv[1], ...args.slice(1)]; const { liveCli } = await import('../src/detect-antipatterns.mjs'); await liveCli(); } else if (command === 'skills') { const { run } = await import('./commands/skills.mjs'); await run(args.slice(1)); } else { // Default: treat as detect arguments (allow `npx impeccable src/` shorthand) process.argv = [process.argv[0], process.argv[1], ...args]; const { detectCli } = await import('../src/detect-antipatterns.mjs'); await detectCli(); }