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))
|
||
}
|