#!/usr/bin/env node import { Command } from 'commander'; import * as dotenv from 'dotenv'; import { DesignComplianceBot } from './index'; dotenv.config(); const program = new Command(); program .name('design-compliance') .description('Design system compliance checker for Figma') .version('1.0.0'); program .command('check') .description('Check a Figma file for design violations') .requiredOption('-f, --file ', 'Figma file key') .option('-r, --rules ', 'Path to design rules JSON file', './design-rules.json') .option('-s, --slack-webhook ', 'Slack webhook URL') .option('-d, --discord-webhook ', 'Discord webhook URL') .action(async (options) => { const bot = new DesignComplianceBot({ figmaToken: process.env.FIGMA_ACCESS_TOKEN!, rules: options.rules, slackWebhook: options.slackWebhook || process.env.SLACK_WEBHOOK_URL, discordWebhook: options.discordWebhook || process.env.DISCORD_WEBHOOK_URL, githubToken: process.env.GITHUB_TOKEN, }); console.log('šŸ” Checking design compliance...'); const violations = await bot.check(options.file); console.log(`\nāœ… Check complete!`); console.log(`šŸ“Š Found ${violations.length} violations`); if (violations.length > 0) { const summary = violations.reduce((acc, v) => { acc[v.severity] = (acc[v.severity] || 0) + 1; return acc; }, {} as Record); console.log(` šŸ”“ Critical: ${summary.critical || 0}`); console.log(` 🟔 Warnings: ${summary.warning || 0}`); console.log(` šŸ”µ Info: ${summary.info || 0}`); } }); program .command('report') .description('Generate a compliance report') .requiredOption('-f, --file ', 'Figma file key') .option('-r, --rules ', 'Path to design rules JSON file', './design-rules.json') .option('-o, --output ', 'Output file path', 'compliance-report.html') .option('--format ', 'Output format (html|pdf)', 'html') .action(async (options) => { const bot = new DesignComplianceBot({ figmaToken: process.env.FIGMA_ACCESS_TOKEN!, rules: options.rules, }); console.log('šŸ“ Generating compliance report...'); const reportPath = await bot.generateReport(options.file, { format: options.format, output: options.output, }); console.log(`\nāœ… Report generated: ${reportPath}`); }); program .command('schedule') .description('Schedule periodic compliance checks') .option('-c, --cron ', 'Cron expression', '0 9 * * *') .option('-r, --rules ', 'Path to design rules JSON file', './design-rules.json') .requiredOption('-f, --files ', 'Figma file keys to check') .action(async (options) => { const bot = new DesignComplianceBot({ figmaToken: process.env.FIGMA_ACCESS_TOKEN!, rules: options.rules, githubToken: process.env.GITHUB_TOKEN, slackWebhook: process.env.SLACK_WEBHOOK_URL, discordWebhook: process.env.DISCORD_WEBHOOK_URL, }); console.log(`ā° Scheduling checks with cron: ${options.cron}`); console.log(`šŸ“ Monitoring ${options.files.length} file(s)`); bot.schedule(options.cron, async () => { console.log(`\nšŸ” Running scheduled check at ${new Date().toISOString()}`); for (const fileKey of options.files) { const violations = await bot.check(fileKey); console.log(` ${fileKey}: ${violations.length} violations`); } }); console.log('\nāœ… Scheduler started. Press Ctrl+C to stop.\n'); // Keep process alive process.stdin.resume(); }); program.parse();