4435e7ea0a
Services: Admin-Compliance, Backend-Compliance, AI-Compliance-SDK, Consent-SDK, Developer-Portal, PCA-Platform, DSMS Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
162 lines
5.3 KiB
TypeScript
162 lines
5.3 KiB
TypeScript
/**
|
|
* 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<void> {
|
|
return new Promise(resolve => setTimeout(resolve, ms))
|
|
}
|