Files
breakpilot-compliance/breakpilot-compliance-sdk/packages/cli/src/commands/status.ts
Benjamin Boenisch 4435e7ea0a Initial commit: breakpilot-compliance - Compliance SDK Platform
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>
2026-02-11 23:47:28 +01:00

162 lines
5.3 KiB
TypeScript
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
* 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))
}