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>
This commit is contained in:
161
breakpilot-compliance-sdk/packages/cli/src/commands/status.ts
Normal file
161
breakpilot-compliance-sdk/packages/cli/src/commands/status.ts
Normal file
@@ -0,0 +1,161 @@
|
||||
/**
|
||||
* 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))
|
||||
}
|
||||
Reference in New Issue
Block a user