/** * Status command - Check compliance status */ import { Command } from 'commander' interface StatusOptions { json?: boolean verbose?: boolean } export const statusCommand = new Command('status') .description('Check current compliance status') .option('-j, --json', 'Output as JSON', false) .option('-v, --verbose', 'Show detailed status', false) .action(async (options: StatusOptions) => { const chalk = (await import('chalk')).default const ora = (await import('ora')).default if (!options.json) { console.log(chalk.bold.blue('\nšŸ“Š BreakPilot Compliance Status\n')) } const spinner = options.json ? null : ora('Fetching status...').start() try { // Simulate fetching status from API await sleep(1000) const status = { lastUpdated: new Date().toISOString(), overallScore: 78, trend: 'UP', regulations: { DSGVO: { score: 85, status: 'COMPLIANT' }, NIS2: { score: 72, status: 'PARTIAL' }, 'AI Act': { score: 65, status: 'IN_PROGRESS' }, }, controls: { total: 44, implemented: 35, partial: 6, notImplemented: 3, }, risks: { total: 12, critical: 1, high: 2, medium: 5, low: 4, }, evidence: { total: 28, valid: 24, expiring: 3, expired: 1, }, dsrRequests: { pending: 2, inProgress: 1, completed: 15, }, nextActions: [ { priority: 'HIGH', action: 'Address critical risk: Data breach potential', dueDate: '2024-02-15', }, { priority: 'MEDIUM', action: 'Update expired evidence: Security audit report', dueDate: '2024-02-20', }, { priority: 'MEDIUM', action: 'Complete NIS2 gap assessment', dueDate: '2024-03-01', }, ], } if (options.json) { console.log(JSON.stringify(status, null, 2)) return } spinner?.succeed('Status retrieved') // Overall Score const scoreColor = status.overallScore >= 80 ? chalk.green : status.overallScore >= 60 ? chalk.yellow : chalk.red const trendIcon = status.trend === 'UP' ? '↑' : status.trend === 'DOWN' ? '↓' : '→' console.log(chalk.bold('\nšŸŽÆ Overall Compliance Score')) console.log(` ${scoreColor.bold(status.overallScore + '%')} ${chalk.gray(trendIcon)}`) // Regulations console.log(chalk.bold('\nšŸ“œ Regulations')) Object.entries(status.regulations).forEach(([reg, data]) => { const color = data.score >= 80 ? chalk.green : data.score >= 60 ? chalk.yellow : chalk.red const statusIcon = data.status === 'COMPLIANT' ? 'āœ“' : data.status === 'PARTIAL' ? '◐' : 'ā—‹' console.log(` ${statusIcon} ${reg.padEnd(12)} ${color(data.score + '%')} ${chalk.gray(data.status)}`) }) // Controls console.log(chalk.bold('\nšŸ”§ Controls')) console.log(` ${chalk.green('ā—')} Implemented: ${status.controls.implemented}`) console.log(` ${chalk.yellow('ā—')} Partial: ${status.controls.partial}`) console.log(` ${chalk.red('ā—')} Not Implemented: ${status.controls.notImplemented}`) console.log(chalk.gray(` Total: ${status.controls.total}`)) // Risks console.log(chalk.bold('\nāš ļø Risks')) if (status.risks.critical > 0) { console.log(` ${chalk.red.bold('šŸ”“')} Critical: ${status.risks.critical}`) } if (status.risks.high > 0) { console.log(` ${chalk.red('🟠')} High: ${status.risks.high}`) } console.log(` ${chalk.yellow('🟔')} Medium: ${status.risks.medium}`) console.log(` ${chalk.gray('🟢')} Low: ${status.risks.low}`) // Evidence if (options.verbose) { console.log(chalk.bold('\nšŸ“Ž Evidence')) console.log(` ${chalk.green('ā—')} Valid: ${status.evidence.valid}`) console.log(` ${chalk.yellow('ā—')} Expiring: ${status.evidence.expiring}`) console.log(` ${chalk.red('ā—')} Expired: ${status.evidence.expired}`) } // DSR Requests if (options.verbose) { console.log(chalk.bold('\nšŸ“¬ DSR Requests')) console.log(` Pending: ${status.dsrRequests.pending}`) console.log(` In Progress: ${status.dsrRequests.inProgress}`) console.log(` Completed: ${status.dsrRequests.completed}`) } // Next Actions console.log(chalk.bold('\nšŸ“‹ Next Actions')) status.nextActions.forEach(action => { const priorityColor = action.priority === 'HIGH' ? chalk.red : action.priority === 'MEDIUM' ? chalk.yellow : chalk.gray console.log(` ${priorityColor('ā—')} ${action.action}`) console.log(chalk.gray(` Due: ${action.dueDate}`)) }) console.log('') } catch (error) { spinner?.fail('Failed to fetch status') console.error(chalk.red('Error:'), error) process.exit(1) } }) function sleep(ms: number): Promise { return new Promise(resolve => setTimeout(resolve, ms)) }