@aigrc/cli 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/aigrc.js +2372 -0
- package/dist/aigrc.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.js +1029 -0
- package/dist/index.js.map +1 -0
- package/package.json +68 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/bin/aigrc.ts","../src/commands/scan.ts","../src/utils/output.ts","../src/commands/init.ts","../src/utils/prompts.ts","../src/commands/register.ts","../src/commands/validate.ts","../src/commands/status.ts","../src/commands/compliance.ts","../src/commands/classify.ts","../src/commands/check.ts","../src/commands/generate.ts","../src/commands/report.ts"],"sourcesContent":["import { program } from \"commander\";\r\nimport { scanCommand } from \"../commands/scan.js\";\r\nimport { initCommand } from \"../commands/init.js\";\r\nimport { registerCommand } from \"../commands/register.js\";\r\nimport { validateCommand } from \"../commands/validate.js\";\r\nimport { statusCommand } from \"../commands/status.js\";\r\n// Multi-jurisdiction compliance commands\r\nimport { complianceCommand } from \"../commands/compliance.js\";\r\nimport { classifyCommand } from \"../commands/classify.js\";\r\nimport { checkCommand } from \"../commands/check.js\";\r\nimport { generateCommand } from \"../commands/generate.js\";\r\nimport { reportCommand } from \"../commands/report.js\";\r\n\r\nprogram\r\n .name(\"aigrc\")\r\n .description(\"AI Governance, Risk, Compliance - CLI Tool\")\r\n .version(\"0.1.0\");\r\n\r\n// Core commands\r\nprogram.addCommand(scanCommand);\r\nprogram.addCommand(initCommand);\r\nprogram.addCommand(registerCommand);\r\nprogram.addCommand(validateCommand);\r\nprogram.addCommand(statusCommand);\r\n\r\n// Multi-jurisdiction compliance commands\r\nprogram.addCommand(complianceCommand);\r\nprogram.addCommand(classifyCommand);\r\nprogram.addCommand(checkCommand);\r\nprogram.addCommand(generateCommand);\r\nprogram.addCommand(reportCommand);\r\n\r\nprogram.parse();\r\n","import { Command } from \"commander\";\r\nimport chalk from \"chalk\";\r\nimport ora from \"ora\";\r\nimport path from \"path\";\r\nimport {\r\n scan,\r\n suggestAssetCard,\r\n initializePatterns,\r\n type ScanOptions,\r\n type ScanResult,\r\n} from \"@aigrc/core\";\r\nimport {\r\n printHeader,\r\n printScanSummary,\r\n printDetections,\r\n printAssetSuggestion,\r\n printRiskFactors,\r\n} from \"../utils/output.js\";\r\n\r\n// ─────────────────────────────────────────────────────────────────\r\n// SCAN COMMAND\r\n// ─────────────────────────────────────────────────────────────────\r\n\r\ninterface ScanCommandOptions {\r\n output?: \"text\" | \"json\" | \"yaml\";\r\n verbose?: boolean;\r\n include?: string[];\r\n exclude?: string[];\r\n maxDepth?: number;\r\n suggest?: boolean;\r\n noProgress?: boolean;\r\n}\r\n\r\nexport const scanCommand = new Command(\"scan\")\r\n .description(\"Scan a directory for AI/ML frameworks and generate risk assessments\")\r\n .argument(\"[directory]\", \"Directory to scan\", \".\")\r\n .option(\"-o, --output <format>\", \"Output format (text, json, yaml)\", \"text\")\r\n .option(\"-v, --verbose\", \"Show detailed detection information\")\r\n .option(\"-i, --include <patterns...>\", \"Include glob patterns\")\r\n .option(\"-e, --exclude <patterns...>\", \"Exclude glob patterns\")\r\n .option(\"-d, --max-depth <depth>\", \"Maximum directory depth\", parseInt)\r\n .option(\"-s, --suggest\", \"Generate asset card suggestion from detections\")\r\n .option(\"--no-progress\", \"Disable progress spinner\")\r\n .action(async (directory: string, options: ScanCommandOptions) => {\r\n await runScan(directory, options);\r\n });\r\n\r\nasync function runScan(directory: string, options: ScanCommandOptions): Promise<void> {\r\n const targetDir = path.resolve(process.cwd(), directory);\r\n\r\n if (options.output === \"text\") {\r\n printHeader();\r\n console.log(chalk.dim(`Scanning: ${targetDir}\\n`));\r\n }\r\n\r\n // Initialize pattern registry\r\n initializePatterns();\r\n\r\n // Build scan options\r\n const scanOptions: ScanOptions = {\r\n directory: targetDir,\r\n ignorePatterns: options.exclude,\r\n };\r\n\r\n let spinner: ReturnType<typeof ora> | undefined;\r\n let lastFile = \"\";\r\n\r\n if (options.output === \"text\" && options.noProgress !== false) {\r\n spinner = ora(\"Scanning...\").start();\r\n }\r\n\r\n try {\r\n const result = await scan(scanOptions, (progress) => {\r\n if (spinner && progress.currentFile !== lastFile) {\r\n lastFile = progress.currentFile;\r\n const pct = Math.round((progress.scannedFiles / Math.max(progress.totalFiles, 1)) * 100);\r\n spinner.text = `Scanning (${pct}%): ${path.basename(progress.currentFile)}`;\r\n }\r\n });\r\n\r\n spinner?.succeed(`Scanned ${result.scannedFiles} files`);\r\n\r\n // Output results\r\n if (options.output === \"json\") {\r\n outputJson(result);\r\n } else if (options.output === \"yaml\") {\r\n await outputYaml(result);\r\n } else {\r\n outputText(result, options);\r\n }\r\n\r\n // Generate asset card suggestion if requested\r\n if (options.suggest && result.detections.length > 0) {\r\n const suggestion = suggestAssetCard(result);\r\n\r\n if (options.output === \"json\") {\r\n console.log(JSON.stringify({ suggestion }, null, 2));\r\n } else if (options.output === \"yaml\") {\r\n const { stringify } = await import(\"yaml\");\r\n console.log(stringify({ suggestion }));\r\n } else {\r\n console.log();\r\n printAssetSuggestion(suggestion);\r\n }\r\n }\r\n\r\n // Exit with error code if high-risk detections found\r\n if (result.summary.byConfidence.high > 0) {\r\n process.exitCode = 1;\r\n }\r\n } catch (error) {\r\n spinner?.fail(\"Scan failed\");\r\n\r\n if (error instanceof Error) {\r\n console.error(chalk.red(`\\nError: ${error.message}`));\r\n if (options.verbose) {\r\n console.error(chalk.dim(error.stack));\r\n }\r\n }\r\n\r\n process.exit(1);\r\n }\r\n}\r\n\r\nfunction outputText(result: ScanResult, options: ScanCommandOptions): void {\r\n console.log();\r\n printScanSummary(result);\r\n\r\n if (result.detections.length > 0) {\r\n console.log();\r\n printDetections(result.detections, options.verbose);\r\n } else {\r\n console.log(chalk.dim(\"\\nNo AI/ML frameworks detected.\"));\r\n }\r\n\r\n // Show inferred risk factors if there are detections\r\n if (result.inferredRiskFactors && Object.keys(result.inferredRiskFactors).length > 0) {\r\n console.log();\r\n printRiskFactors(result.inferredRiskFactors);\r\n }\r\n}\r\n\r\nfunction outputJson(result: ScanResult): void {\r\n console.log(JSON.stringify(result, null, 2));\r\n}\r\n\r\nasync function outputYaml(result: ScanResult): Promise<void> {\r\n const { stringify } = await import(\"yaml\");\r\n console.log(stringify(result));\r\n}\r\n","import chalk from \"chalk\";\r\nimport type {\r\n ScanResult,\r\n DetectionResult,\r\n ConfidenceLevel,\r\n AssetCardSuggestion,\r\n RiskFactors,\r\n} from \"@aigrc/core\";\r\n\r\n// ─────────────────────────────────────────────────────────────────\r\n// OUTPUT FORMATTING UTILITIES\r\n// ─────────────────────────────────────────────────────────────────\r\n\r\nexport function printHeader(): void {\r\n console.log();\r\n console.log(chalk.cyan.bold(\"AIGRC\") + chalk.dim(\" - AI Governance, Risk, Compliance\"));\r\n console.log(chalk.dim(\"─\".repeat(50)));\r\n console.log();\r\n}\r\n\r\nexport function printSubheader(text: string): void {\r\n console.log();\r\n console.log(chalk.bold.cyan(`▸ ${text}`));\r\n console.log(chalk.cyan(\"─\".repeat(40)));\r\n}\r\n\r\nexport function printSuccess(text: string): void {\r\n console.log(chalk.green(`✓ ${text}`));\r\n}\r\n\r\nexport function printWarning(text: string): void {\r\n console.log(chalk.yellow(`⚠ ${text}`));\r\n}\r\n\r\nexport function printError(text: string): void {\r\n console.log(chalk.red(`✗ ${text}`));\r\n}\r\n\r\nexport function printInfo(text: string): void {\r\n console.log(chalk.gray(`ℹ ${text}`));\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────\r\n// SCAN RESULT FORMATTING\r\n// ─────────────────────────────────────────────────────────────────\r\n\r\nexport function printScanSummary(result: ScanResult): void {\r\n const { summary, scannedFiles, skippedFiles, duration } = result;\r\n\r\n printSubheader(\"Scan Summary\");\r\n\r\n console.log(` Files scanned: ${chalk.bold(scannedFiles)}`);\r\n if (skippedFiles > 0) {\r\n console.log(` Files skipped: ${chalk.yellow(skippedFiles)}`);\r\n }\r\n console.log(` Duration: ${chalk.gray(`${duration}ms`)}`);\r\n console.log();\r\n\r\n if (summary.totalDetections === 0) {\r\n printInfo(\"No AI frameworks or models detected.\");\r\n return;\r\n }\r\n\r\n console.log(` ${chalk.bold(\"Total detections:\")} ${summary.totalDetections}`);\r\n console.log();\r\n\r\n // By confidence\r\n console.log(chalk.dim(\" By confidence:\"));\r\n if (summary.byConfidence.high > 0) {\r\n console.log(` ${confidenceLabel(\"high\")}: ${summary.byConfidence.high}`);\r\n }\r\n if (summary.byConfidence.medium > 0) {\r\n console.log(` ${confidenceLabel(\"medium\")}: ${summary.byConfidence.medium}`);\r\n }\r\n if (summary.byConfidence.low > 0) {\r\n console.log(` ${confidenceLabel(\"low\")}: ${summary.byConfidence.low}`);\r\n }\r\n console.log();\r\n\r\n // By framework\r\n if (Object.keys(summary.byFramework).length > 0) {\r\n console.log(chalk.dim(\" By framework:\"));\r\n for (const [framework, count] of Object.entries(summary.byFramework)) {\r\n console.log(` ${chalk.bold(framework)}: ${count}`);\r\n }\r\n console.log();\r\n }\r\n\r\n // Primary detection\r\n if (summary.primaryFramework) {\r\n console.log(\r\n ` ${chalk.bold(\"Primary framework:\")} ${chalk.cyan(summary.primaryFramework)}`\r\n );\r\n }\r\n if (summary.primaryCategory) {\r\n console.log(\r\n ` ${chalk.bold(\"Primary category:\")} ${formatCategory(summary.primaryCategory)}`\r\n );\r\n }\r\n}\r\n\r\nexport function printDetections(detections: DetectionResult[], verbose = false, limit = 20): void {\r\n if (detections.length === 0) {\r\n return;\r\n }\r\n\r\n printSubheader(`Detections (${detections.length} total)`);\r\n\r\n const toShow = detections.slice(0, limit);\r\n\r\n for (const detection of toShow) {\r\n const confidence = confidenceLabel(detection.confidence);\r\n const location = chalk.gray(`${detection.filePath}:${detection.line}`);\r\n const framework = chalk.bold(detection.framework);\r\n\r\n console.log(` ${confidence} ${framework}`);\r\n console.log(` ${location}`);\r\n console.log(` ${chalk.dim(truncate(detection.match, 60))}`);\r\n\r\n if (verbose) {\r\n console.log(` ${chalk.dim(`Strategy: ${detection.strategy}`)}`);\r\n if (detection.implies.length > 0) {\r\n console.log(\r\n ` ${chalk.dim(`Implies: ${detection.implies.map((i) => i.factor).join(\", \")}`)}`\r\n );\r\n }\r\n }\r\n\r\n console.log();\r\n }\r\n\r\n if (detections.length > limit) {\r\n printInfo(`... and ${detections.length - limit} more detections`);\r\n }\r\n}\r\n\r\nexport function printRiskFactors(\r\n riskFactors: ScanResult[\"inferredRiskFactors\"]\r\n): void {\r\n printSubheader(\"Inferred Risk Factors\");\r\n\r\n const factors = [\r\n { key: \"autonomousDecisions\", label: \"Autonomous Decisions\", value: riskFactors.autonomousDecisions },\r\n { key: \"customerFacing\", label: \"Customer Facing\", value: riskFactors.customerFacing },\r\n { key: \"toolExecution\", label: \"Tool Execution\", value: riskFactors.toolExecution },\r\n { key: \"externalDataAccess\", label: \"External Data Access\", value: riskFactors.externalDataAccess },\r\n { key: \"piiProcessing\", label: \"PII Processing\", value: riskFactors.piiProcessing },\r\n { key: \"highStakesDecisions\", label: \"High-Stakes Decisions\", value: riskFactors.highStakesDecisions },\r\n ];\r\n\r\n for (const factor of factors) {\r\n const icon = factor.value === true || factor.value === \"yes\"\r\n ? chalk.red(\"●\")\r\n : factor.value === false || factor.value === \"no\"\r\n ? chalk.green(\"○\")\r\n : chalk.yellow(\"◐\");\r\n\r\n const valueStr = factor.value === true\r\n ? chalk.red(\"Yes\")\r\n : factor.value === false\r\n ? chalk.green(\"No\")\r\n : factor.value === \"yes\"\r\n ? chalk.red(\"Yes\")\r\n : factor.value === \"no\"\r\n ? chalk.green(\"No\")\r\n : chalk.yellow(\"Unknown\");\r\n\r\n console.log(` ${icon} ${factor.label}: ${valueStr}`);\r\n }\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────\r\n// HELPER FUNCTIONS\r\n// ─────────────────────────────────────────────────────────────────\r\n\r\nfunction confidenceLabel(confidence: ConfidenceLevel): string {\r\n switch (confidence) {\r\n case \"high\":\r\n return chalk.green(\"HIGH \");\r\n case \"medium\":\r\n return chalk.yellow(\"MEDIUM\");\r\n case \"low\":\r\n return chalk.gray(\"LOW \");\r\n }\r\n}\r\n\r\nfunction formatCategory(category: string): string {\r\n const labels: Record<string, string> = {\r\n llm_provider: \"LLM Provider\",\r\n framework: \"Framework\",\r\n agent_framework: \"Agent Framework\",\r\n ml_framework: \"ML Framework\",\r\n ml_ops: \"ML Ops\",\r\n model_file: \"Model File\",\r\n };\r\n return labels[category] ?? category;\r\n}\r\n\r\nfunction truncate(text: string, maxLength: number): string {\r\n const cleaned = text.replace(/\\s+/g, \" \").trim();\r\n if (cleaned.length <= maxLength) {\r\n return cleaned;\r\n }\r\n return cleaned.slice(0, maxLength - 3) + \"...\";\r\n}\r\n\r\n// ─────────────────────────────────────────────────────────────────\r\n// ASSET CARD SUGGESTION FORMATTING\r\n// ─────────────────────────────────────────────────────────────────\r\n\r\nexport function printAssetSuggestion(suggestion: AssetCardSuggestion): void {\r\n printSubheader(\"Asset Card Suggestion\");\r\n\r\n console.log(` ${chalk.bold(\"Name:\")} ${chalk.cyan(suggestion.name)}`);\r\n console.log(` ${chalk.bold(\"Description:\")} ${suggestion.description}`);\r\n console.log(` ${chalk.bold(\"Type:\")} ${suggestion.technical.type}`);\r\n console.log(` ${chalk.bold(\"Framework:\")} ${suggestion.technical.framework}`);\r\n console.log(` ${chalk.bold(\"Confidence:\")} ${confidenceLabel(suggestion.confidence)}`);\r\n console.log();\r\n\r\n if (suggestion.technical.components.length > 0) {\r\n console.log(chalk.dim(\" Components:\"));\r\n for (const comp of suggestion.technical.components) {\r\n const details = [comp.type];\r\n if (comp.provider) details.push(`provider: ${comp.provider}`);\r\n if (comp.model) details.push(`model: ${comp.model}`);\r\n console.log(` - ${details.join(\", \")}`);\r\n }\r\n console.log();\r\n }\r\n\r\n if (Object.keys(suggestion.riskFactors).length > 0) {\r\n console.log(chalk.dim(\" Risk Factors:\"));\r\n printRiskFactorsInline(suggestion.riskFactors);\r\n }\r\n}\r\n\r\nfunction printRiskFactorsInline(riskFactors: Partial<RiskFactors>): void {\r\n const factors = [\r\n { key: \"autonomousDecisions\" as const, label: \"Autonomous\", value: riskFactors.autonomousDecisions },\r\n { key: \"customerFacing\" as const, label: \"Customer-Facing\", value: riskFactors.customerFacing },\r\n { key: \"toolExecution\" as const, label: \"Tool Execution\", value: riskFactors.toolExecution },\r\n { key: \"externalDataAccess\" as const, label: \"External Data\", value: riskFactors.externalDataAccess },\r\n { key: \"piiProcessing\" as const, label: \"PII\", value: riskFactors.piiProcessing },\r\n { key: \"highStakesDecisions\" as const, label: \"High-Stakes\", value: riskFactors.highStakesDecisions },\r\n ];\r\n\r\n for (const factor of factors) {\r\n if (factor.value === undefined) continue;\r\n\r\n const icon =\r\n factor.value === true || factor.value === \"yes\"\r\n ? chalk.red(\"●\")\r\n : factor.value === false || factor.value === \"no\"\r\n ? chalk.green(\"○\")\r\n : chalk.yellow(\"◐\");\r\n\r\n const valueStr =\r\n factor.value === true || factor.value === \"yes\"\r\n ? chalk.red(\"Yes\")\r\n : factor.value === false || factor.value === \"no\"\r\n ? chalk.green(\"No\")\r\n : chalk.yellow(\"Unknown\");\r\n\r\n console.log(` ${icon} ${factor.label}: ${valueStr}`);\r\n }\r\n}\r\n","import { Command } from \"commander\";\r\nimport chalk from \"chalk\";\r\nimport ora from \"ora\";\r\nimport path from \"path\";\r\nimport fs from \"fs/promises\";\r\nimport { stringify } from \"yaml\";\r\nimport {\r\n scan,\r\n suggestAssetCard,\r\n initializePatterns,\r\n createAssetCard,\r\n saveAssetCard,\r\n} from \"@aigrc/core\";\r\nimport {\r\n printHeader,\r\n printAssetSuggestion,\r\n} from \"../utils/output.js\";\r\nimport { promptForRegistration } from \"../utils/prompts.js\";\r\n\r\n// ─────────────────────────────────────────────────────────────────\r\n// INIT COMMAND\r\n// ─────────────────────────────────────────────────────────────────\r\n\r\ninterface InitCommandOptions {\r\n force?: boolean;\r\n yes?: boolean;\r\n output?: string;\r\n}\r\n\r\nconst DEFAULT_CONFIG_FILE = \".aigrc.yaml\";\r\nconst DEFAULT_CARDS_DIR = \".aigrc/cards\";\r\n\r\nexport const initCommand = new Command(\"init\")\r\n .description(\"Initialize AIGRC in a project - scan, detect, and create asset card\")\r\n .argument(\"[directory]\", \"Directory to initialize\", \".\")\r\n .option(\"-f, --force\", \"Overwrite existing configuration\")\r\n .option(\"-y, --yes\", \"Accept all defaults without prompting\")\r\n .option(\"-o, --output <path>\", \"Output path for asset card\")\r\n .action(async (directory: string, options: InitCommandOptions) => {\r\n await runInit(directory, options);\r\n });\r\n\r\nasync function runInit(directory: string, options: InitCommandOptions): Promise<void> {\r\n const targetDir = path.resolve(process.cwd(), directory);\r\n\r\n printHeader();\r\n console.log(chalk.cyan(\"Initializing AIGRC in:\"), targetDir);\r\n console.log();\r\n\r\n // Check for existing config\r\n const configPath = path.join(targetDir, DEFAULT_CONFIG_FILE);\r\n const configExists = await fileExists(configPath);\r\n\r\n if (configExists && !options.force) {\r\n console.log(chalk.yellow(\"⚠ AIGRC already initialized in this directory.\"));\r\n console.log(chalk.dim(` Config file: ${configPath}`));\r\n console.log(chalk.dim(\" Use --force to reinitialize.\"));\r\n return;\r\n }\r\n\r\n // Initialize patterns and scan\r\n initializePatterns();\r\n\r\n const spinner = ora(\"Scanning for AI/ML frameworks...\").start();\r\n\r\n try {\r\n const result = await scan({\r\n directory: targetDir,\r\n ignorePatterns: [\"node_modules\", \".git\", \"dist\", \"build\", \"__pycache__\", \".venv\", \"venv\"],\r\n });\r\n\r\n spinner.succeed(`Found ${result.detections.length} AI/ML detections`);\r\n\r\n if (result.detections.length === 0) {\r\n console.log();\r\n console.log(chalk.yellow(\"No AI/ML frameworks detected.\"));\r\n console.log(chalk.dim(\"You can still create an asset card manually using:\"));\r\n console.log(chalk.dim(\" aigrc register --manual\"));\r\n return;\r\n }\r\n\r\n // Generate suggestion\r\n const suggestion = suggestAssetCard(result);\r\n\r\n console.log();\r\n printAssetSuggestion(suggestion);\r\n console.log();\r\n\r\n let registrationData;\r\n\r\n if (options.yes) {\r\n // Use defaults\r\n registrationData = {\r\n name: suggestion.name,\r\n description: suggestion.description,\r\n owner: {\r\n name: process.env.USER || process.env.USERNAME || \"Unknown\",\r\n email: `${process.env.USER || process.env.USERNAME || \"user\"}@example.com`,\r\n },\r\n confirmRiskFactors: true,\r\n };\r\n } else {\r\n // Interactive prompts\r\n registrationData = await promptForRegistration(suggestion);\r\n }\r\n\r\n // Create asset card\r\n const riskFactors = registrationData.confirmRiskFactors\r\n ? suggestion.riskFactors\r\n : { ...suggestion.riskFactors, ...registrationData.riskFactorOverrides };\r\n\r\n const assetCard = createAssetCard({\r\n name: registrationData.name,\r\n description: registrationData.description,\r\n owner: registrationData.owner,\r\n technical: {\r\n type: suggestion.technical.type,\r\n framework: suggestion.technical.framework,\r\n },\r\n riskFactors: {\r\n autonomousDecisions: riskFactors.autonomousDecisions ?? false,\r\n customerFacing: riskFactors.customerFacing ?? false,\r\n toolExecution: riskFactors.toolExecution ?? false,\r\n externalDataAccess: riskFactors.externalDataAccess ?? false,\r\n piiProcessing: riskFactors.piiProcessing ?? \"unknown\",\r\n highStakesDecisions: riskFactors.highStakesDecisions ?? false,\r\n },\r\n });\r\n\r\n // Create cards directory\r\n const cardsDir = path.join(targetDir, DEFAULT_CARDS_DIR);\r\n await fs.mkdir(cardsDir, { recursive: true });\r\n\r\n // Write asset card\r\n const cardFileName = `${sanitizeFileName(assetCard.name)}.yaml`;\r\n const cardPath = options.output || path.join(cardsDir, cardFileName);\r\n saveAssetCard(assetCard, cardPath);\r\n\r\n console.log();\r\n console.log(chalk.green(\"✓ Asset card created:\"), chalk.cyan(cardPath));\r\n\r\n // Create config file\r\n const config = {\r\n version: \"1.0\",\r\n cardsDir: DEFAULT_CARDS_DIR,\r\n scan: {\r\n exclude: [\"node_modules\", \".git\", \"dist\", \"build\", \"__pycache__\", \".venv\", \"venv\"],\r\n },\r\n };\r\n\r\n await fs.writeFile(configPath, stringify(config), \"utf-8\");\r\n console.log(chalk.green(\"✓ Config file created:\"), chalk.cyan(configPath));\r\n\r\n console.log();\r\n console.log(chalk.green(\"AIGRC initialized successfully!\"));\r\n console.log();\r\n console.log(chalk.dim(\"Next steps:\"));\r\n console.log(chalk.dim(\" 1. Review and edit the asset card: \") + chalk.cyan(cardPath));\r\n console.log(chalk.dim(\" 2. Run \") + chalk.cyan(\"aigrc validate\") + chalk.dim(\" to check compliance\"));\r\n console.log(chalk.dim(\" 3. Run \") + chalk.cyan(\"aigrc status\") + chalk.dim(\" to see current status\"));\r\n } catch (error) {\r\n spinner.fail(\"Initialization failed\");\r\n\r\n if (error instanceof Error) {\r\n console.error(chalk.red(`\\nError: ${error.message}`));\r\n }\r\n\r\n process.exit(1);\r\n }\r\n}\r\n\r\nasync function fileExists(filePath: string): Promise<boolean> {\r\n try {\r\n await fs.access(filePath);\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\nfunction sanitizeFileName(name: string): string {\r\n return name\r\n .toLowerCase()\r\n .replace(/[^a-z0-9]+/g, \"-\")\r\n .replace(/^-|-$/g, \"\");\r\n}\r\n","import inquirer from \"inquirer\";\r\nimport type { AssetCardSuggestion } from \"@aigrc/core\";\r\n\r\n// ─────────────────────────────────────────────────────────────────\r\n// INTERACTIVE PROMPTS\r\n// ─────────────────────────────────────────────────────────────────\r\n\r\nexport interface OwnerInfo {\r\n name: string;\r\n email: string;\r\n team?: string;\r\n}\r\n\r\nexport interface RegistrationAnswers {\r\n name: string;\r\n description: string;\r\n owner: OwnerInfo;\r\n confirmRiskFactors: boolean;\r\n riskFactorOverrides?: {\r\n autonomousDecisions?: boolean;\r\n customerFacing?: boolean;\r\n toolExecution?: boolean;\r\n externalDataAccess?: boolean;\r\n piiProcessing?: \"yes\" | \"no\" | \"unknown\";\r\n highStakesDecisions?: boolean;\r\n };\r\n}\r\n\r\nexport async function promptForOwner(): Promise<OwnerInfo> {\r\n const answers = await inquirer.prompt([\r\n {\r\n type: \"input\",\r\n name: \"name\",\r\n message: \"Owner name:\",\r\n validate: (input: string) => input.length > 0 || \"Name is required\",\r\n },\r\n {\r\n type: \"input\",\r\n name: \"email\",\r\n message: \"Owner email:\",\r\n validate: (input: string) =>\r\n /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(input) || \"Valid email is required\",\r\n },\r\n {\r\n type: \"input\",\r\n name: \"team\",\r\n message: \"Team name (optional):\",\r\n },\r\n ]);\r\n\r\n return {\r\n name: answers.name,\r\n email: answers.email,\r\n team: answers.team || undefined,\r\n };\r\n}\r\n\r\nexport async function promptForRegistration(\r\n suggestion: AssetCardSuggestion\r\n): Promise<RegistrationAnswers> {\r\n console.log();\r\n\r\n const basicAnswers = await inquirer.prompt([\r\n {\r\n type: \"input\",\r\n name: \"name\",\r\n message: \"Asset name:\",\r\n default: suggestion.name,\r\n validate: (input: string) => input.length > 0 || \"Name is required\",\r\n },\r\n {\r\n type: \"input\",\r\n name: \"description\",\r\n message: \"Description:\",\r\n default: suggestion.description,\r\n },\r\n ]);\r\n\r\n console.log(\"\\n-- Owner Information --\\n\");\r\n const owner = await promptForOwner();\r\n\r\n console.log(\"\\n-- Risk Factors --\\n\");\r\n console.log(\"Based on the scan, the following risk factors were inferred:\");\r\n console.log();\r\n\r\n const riskFactorLabels = [\r\n { key: \"autonomousDecisions\", label: \"Autonomous Decisions\", value: suggestion.riskFactors.autonomousDecisions },\r\n { key: \"customerFacing\", label: \"Customer Facing\", value: suggestion.riskFactors.customerFacing },\r\n { key: \"toolExecution\", label: \"Tool Execution\", value: suggestion.riskFactors.toolExecution },\r\n { key: \"externalDataAccess\", label: \"External Data Access\", value: suggestion.riskFactors.externalDataAccess },\r\n { key: \"piiProcessing\", label: \"PII Processing\", value: suggestion.riskFactors.piiProcessing },\r\n { key: \"highStakesDecisions\", label: \"High-Stakes Decisions\", value: suggestion.riskFactors.highStakesDecisions },\r\n ];\r\n\r\n for (const factor of riskFactorLabels) {\r\n const value = factor.value === true || factor.value === \"yes\"\r\n ? \"Yes\"\r\n : factor.value === false || factor.value === \"no\"\r\n ? \"No\"\r\n : \"Unknown\";\r\n console.log(` ${factor.label}: ${value}`);\r\n }\r\n console.log();\r\n\r\n const { confirmRiskFactors } = await inquirer.prompt([\r\n {\r\n type: \"confirm\",\r\n name: \"confirmRiskFactors\",\r\n message: \"Are these risk factors correct?\",\r\n default: true,\r\n },\r\n ]);\r\n\r\n let riskFactorOverrides;\r\n\r\n if (!confirmRiskFactors) {\r\n riskFactorOverrides = await promptForRiskFactorOverrides(suggestion.riskFactors);\r\n }\r\n\r\n return {\r\n name: basicAnswers.name,\r\n description: basicAnswers.description,\r\n owner,\r\n confirmRiskFactors,\r\n riskFactorOverrides,\r\n };\r\n}\r\n\r\nasync function promptForRiskFactorOverrides(\r\n current: AssetCardSuggestion[\"riskFactors\"]\r\n): Promise<RegistrationAnswers[\"riskFactorOverrides\"]> {\r\n const answers = await inquirer.prompt([\r\n {\r\n type: \"confirm\",\r\n name: \"autonomousDecisions\",\r\n message: \"Does this AI make autonomous decisions?\",\r\n default: current.autonomousDecisions ?? false,\r\n },\r\n {\r\n type: \"confirm\",\r\n name: \"customerFacing\",\r\n message: \"Is this AI customer-facing?\",\r\n default: current.customerFacing ?? false,\r\n },\r\n {\r\n type: \"confirm\",\r\n name: \"toolExecution\",\r\n message: \"Does this AI execute tools or functions?\",\r\n default: current.toolExecution ?? false,\r\n },\r\n {\r\n type: \"confirm\",\r\n name: \"externalDataAccess\",\r\n message: \"Does this AI access external data?\",\r\n default: current.externalDataAccess ?? false,\r\n },\r\n {\r\n type: \"list\",\r\n name: \"piiProcessing\",\r\n message: \"Does this AI process PII (personal data)?\",\r\n choices: [\r\n { name: \"Yes\", value: \"yes\" },\r\n { name: \"No\", value: \"no\" },\r\n { name: \"Unknown\", value: \"unknown\" },\r\n ],\r\n default: current.piiProcessing ?? \"unknown\",\r\n },\r\n {\r\n type: \"confirm\",\r\n name: \"highStakesDecisions\",\r\n message: \"Does this AI make high-stakes decisions (medical, legal, financial, hiring)?\",\r\n default: current.highStakesDecisions ?? false,\r\n },\r\n ]);\r\n\r\n return answers;\r\n}\r\n\r\nexport async function confirmAction(message: string): Promise<boolean> {\r\n const { confirmed } = await inquirer.prompt([\r\n {\r\n type: \"confirm\",\r\n name: \"confirmed\",\r\n message,\r\n default: false,\r\n },\r\n ]);\r\n\r\n return confirmed;\r\n}\r\n","import { Command } from \"commander\";\r\nimport chalk from \"chalk\";\r\nimport path from \"path\";\r\nimport fs from \"fs/promises\";\r\nimport inquirer from \"inquirer\";\r\nimport {\r\n createAssetCard,\r\n saveAssetCard,\r\n type RiskFactors,\r\n} from \"@aigrc/core\";\r\nimport { printHeader } from \"../utils/output.js\";\r\nimport { promptForOwner } from \"../utils/prompts.js\";\r\n\r\n// ─────────────────────────────────────────────────────────────────\r\n// REGISTER COMMAND\r\n// ─────────────────────────────────────────────────────────────────\r\n\r\ninterface RegisterCommandOptions {\r\n output?: string;\r\n manual?: boolean;\r\n}\r\n\r\nconst DEFAULT_CARDS_DIR = \".aigrc/cards\";\r\n\r\nexport const registerCommand = new Command(\"register\")\r\n .description(\"Manually register an AI asset without scanning\")\r\n .option(\"-o, --output <path>\", \"Output path for asset card\")\r\n .option(\"-m, --manual\", \"Skip detection and enter all details manually\")\r\n .action(async (options: RegisterCommandOptions) => {\r\n await runRegister(options);\r\n });\r\n\r\nasync function runRegister(options: RegisterCommandOptions): Promise<void> {\r\n printHeader();\r\n console.log(chalk.cyan(\"Register a new AI asset\\n\"));\r\n\r\n // Get basic information\r\n const basicInfo = await inquirer.prompt([\r\n {\r\n type: \"input\",\r\n name: \"name\",\r\n message: \"Asset name:\",\r\n validate: (input: string) => input.length > 0 || \"Name is required\",\r\n },\r\n {\r\n type: \"input\",\r\n name: \"description\",\r\n message: \"Description:\",\r\n validate: (input: string) => input.length > 0 || \"Description is required\",\r\n },\r\n {\r\n type: \"input\",\r\n name: \"purpose\",\r\n message: \"Business purpose:\",\r\n },\r\n ]);\r\n\r\n console.log(\"\\n-- Owner Information --\\n\");\r\n const owner = await promptForOwner();\r\n\r\n console.log(\"\\n-- Risk Factors --\\n\");\r\n const riskFactors = await promptForRiskFactors();\r\n\r\n console.log(\"\\n-- Framework Information --\\n\");\r\n const frameworks = await promptForFrameworks();\r\n\r\n // Determine primary framework type based on selection\r\n const frameworkTypes: Record<string, \"model\" | \"agent\" | \"api_client\" | \"framework\" | \"pipeline\"> = {\r\n openai: \"api_client\",\r\n anthropic: \"api_client\",\r\n langchain: \"framework\",\r\n llamaindex: \"framework\",\r\n \"vercel-ai-sdk\": \"framework\",\r\n pytorch: \"model\",\r\n tensorflow: \"model\",\r\n huggingface: \"model\",\r\n crewai: \"agent\",\r\n autogen: \"agent\",\r\n };\r\n\r\n const primaryFramework = frameworks[0] || \"unknown\";\r\n const technicalType = frameworkTypes[primaryFramework] || \"framework\";\r\n\r\n // Create asset card\r\n const assetCard = createAssetCard({\r\n name: basicInfo.name,\r\n description: basicInfo.description,\r\n owner,\r\n technical: {\r\n type: technicalType,\r\n framework: primaryFramework,\r\n },\r\n riskFactors,\r\n });\r\n\r\n // Determine output path\r\n const cardsDir = path.join(process.cwd(), DEFAULT_CARDS_DIR);\r\n await fs.mkdir(cardsDir, { recursive: true });\r\n\r\n const cardFileName = `${sanitizeFileName(assetCard.name)}.yaml`;\r\n const cardPath = options.output || path.join(cardsDir, cardFileName);\r\n\r\n // Write asset card\r\n saveAssetCard(assetCard, cardPath);\r\n\r\n console.log();\r\n console.log(chalk.green(\"✓ Asset card created:\"), chalk.cyan(cardPath));\r\n console.log();\r\n console.log(chalk.dim(\"Next steps:\"));\r\n console.log(chalk.dim(\" 1. Review and edit the asset card\"));\r\n console.log(chalk.dim(\" 2. Run \") + chalk.cyan(\"aigrc validate\") + chalk.dim(\" to check compliance\"));\r\n}\r\n\r\nasync function promptForRiskFactors(): Promise<RiskFactors> {\r\n const answers = await inquirer.prompt([\r\n {\r\n type: \"confirm\",\r\n name: \"autonomousDecisions\",\r\n message: \"Does this AI make autonomous decisions?\",\r\n default: false,\r\n },\r\n {\r\n type: \"confirm\",\r\n name: \"customerFacing\",\r\n message: \"Is this AI customer-facing?\",\r\n default: false,\r\n },\r\n {\r\n type: \"confirm\",\r\n name: \"toolExecution\",\r\n message: \"Does this AI execute tools or functions?\",\r\n default: false,\r\n },\r\n {\r\n type: \"confirm\",\r\n name: \"externalDataAccess\",\r\n message: \"Does this AI access external data?\",\r\n default: false,\r\n },\r\n {\r\n type: \"list\",\r\n name: \"piiProcessing\",\r\n message: \"Does this AI process PII (personal data)?\",\r\n choices: [\r\n { name: \"Yes\", value: \"yes\" },\r\n { name: \"No\", value: \"no\" },\r\n { name: \"Unknown\", value: \"unknown\" },\r\n ],\r\n default: \"unknown\",\r\n },\r\n {\r\n type: \"confirm\",\r\n name: \"highStakesDecisions\",\r\n message: \"Does this AI make high-stakes decisions (medical, legal, financial, hiring)?\",\r\n default: false,\r\n },\r\n ]);\r\n\r\n return answers;\r\n}\r\n\r\nasync function promptForFrameworks(): Promise<string[]> {\r\n const { hasFrameworks } = await inquirer.prompt([\r\n {\r\n type: \"confirm\",\r\n name: \"hasFrameworks\",\r\n message: \"Do you want to specify AI/ML frameworks used?\",\r\n default: true,\r\n },\r\n ]);\r\n\r\n if (!hasFrameworks) {\r\n return [];\r\n }\r\n\r\n const { frameworkList } = await inquirer.prompt([\r\n {\r\n type: \"checkbox\",\r\n name: \"frameworkList\",\r\n message: \"Select frameworks used:\",\r\n choices: [\r\n { name: \"OpenAI API\", value: \"openai\" },\r\n { name: \"Anthropic API\", value: \"anthropic\" },\r\n { name: \"LangChain\", value: \"langchain\" },\r\n { name: \"LlamaIndex\", value: \"llamaindex\" },\r\n { name: \"Vercel AI SDK\", value: \"vercel-ai-sdk\" },\r\n { name: \"PyTorch\", value: \"pytorch\" },\r\n { name: \"TensorFlow\", value: \"tensorflow\" },\r\n { name: \"Hugging Face\", value: \"huggingface\" },\r\n { name: \"CrewAI\", value: \"crewai\" },\r\n { name: \"AutoGen\", value: \"autogen\" },\r\n { name: \"Other\", value: \"other\" },\r\n ],\r\n },\r\n ]);\r\n\r\n if (frameworkList.includes(\"other\")) {\r\n const { otherFrameworks } = await inquirer.prompt([\r\n {\r\n type: \"input\",\r\n name: \"otherFrameworks\",\r\n message: \"Enter other frameworks (comma-separated):\",\r\n },\r\n ]);\r\n\r\n const others = otherFrameworks\r\n .split(\",\")\r\n .map((f: string) => f.trim())\r\n .filter((f: string) => f.length > 0);\r\n\r\n return [...frameworkList.filter((f: string) => f !== \"other\"), ...others];\r\n }\r\n\r\n return frameworkList;\r\n}\r\n\r\nfunction sanitizeFileName(name: string): string {\r\n return name\r\n .toLowerCase()\r\n .replace(/[^a-z0-9]+/g, \"-\")\r\n .replace(/^-|-$/g, \"\");\r\n}\r\n","import { Command } from \"commander\";\r\nimport chalk from \"chalk\";\r\nimport ora from \"ora\";\r\nimport path from \"path\";\r\nimport fs from \"fs/promises\";\r\nimport {\r\n loadAssetCard,\r\n classifyRisk,\r\n validateAssetCard,\r\n type AssetCard,\r\n type ClassificationResult,\r\n} from \"@aigrc/core\";\r\nimport { printHeader } from \"../utils/output.js\";\r\n\r\n// ─────────────────────────────────────────────────────────────────\r\n// VALIDATE COMMAND\r\n// ─────────────────────────────────────────────────────────────────\r\n\r\ninterface ValidateCommandOptions {\r\n strict?: boolean;\r\n output?: \"text\" | \"json\";\r\n all?: boolean;\r\n}\r\n\r\nconst DEFAULT_CARDS_DIR = \".aigrc/cards\";\r\n\r\nexport const validateCommand = new Command(\"validate\")\r\n .description(\"Validate asset cards against compliance requirements\")\r\n .argument(\"[path]\", \"Path to asset card or cards directory\")\r\n .option(\"-s, --strict\", \"Fail on warnings as well as errors\")\r\n .option(\"-o, --output <format>\", \"Output format (text, json)\", \"text\")\r\n .option(\"-a, --all\", \"Validate all cards in the cards directory\")\r\n .action(async (cardPath: string | undefined, options: ValidateCommandOptions) => {\r\n await runValidate(cardPath, options);\r\n });\r\n\r\nasync function runValidate(\r\n cardPath: string | undefined,\r\n options: ValidateCommandOptions\r\n): Promise<void> {\r\n if (options.output === \"text\") {\r\n printHeader();\r\n }\r\n\r\n const cardsToValidate: string[] = [];\r\n\r\n if (options.all || !cardPath) {\r\n // Find all cards in the cards directory\r\n const cardsDir = path.join(process.cwd(), DEFAULT_CARDS_DIR);\r\n\r\n try {\r\n const files = await fs.readdir(cardsDir);\r\n const yamlFiles = files.filter((f) => f.endsWith(\".yaml\") || f.endsWith(\".yml\"));\r\n\r\n for (const file of yamlFiles) {\r\n cardsToValidate.push(path.join(cardsDir, file));\r\n }\r\n } catch {\r\n if (options.output === \"text\") {\r\n console.log(chalk.yellow(\"No cards directory found.\"));\r\n console.log(chalk.dim(`Expected: ${cardsDir}`));\r\n console.log(chalk.dim(\"Run `aigrc init` to initialize AIGRC.\"));\r\n } else {\r\n console.log(JSON.stringify({ error: \"No cards directory found\" }));\r\n }\r\n process.exit(1);\r\n }\r\n } else {\r\n cardsToValidate.push(path.resolve(process.cwd(), cardPath));\r\n }\r\n\r\n if (cardsToValidate.length === 0) {\r\n if (options.output === \"text\") {\r\n console.log(chalk.yellow(\"No asset cards found to validate.\"));\r\n } else {\r\n console.log(JSON.stringify({ error: \"No asset cards found\" }));\r\n }\r\n process.exit(1);\r\n }\r\n\r\n interface ValidationResult {\r\n valid: boolean;\r\n errors: string[];\r\n }\r\n\r\n const results: Array<{\r\n path: string;\r\n card?: AssetCard;\r\n validation: ValidationResult;\r\n classification?: ClassificationResult;\r\n }> = [];\r\n\r\n let hasErrors = false;\r\n\r\n for (const cardFile of cardsToValidate) {\r\n const spinner = options.output === \"text\"\r\n ? ora(`Validating ${path.basename(cardFile)}...`).start()\r\n : undefined;\r\n\r\n try {\r\n const card = loadAssetCard(cardFile);\r\n const validation = validateAssetCard(card);\r\n const classification = classifyRisk(card.classification.riskFactors);\r\n\r\n results.push({\r\n path: cardFile,\r\n card,\r\n validation: {\r\n valid: validation.valid,\r\n errors: validation.errors ?? [],\r\n },\r\n classification,\r\n });\r\n\r\n if (!validation.valid) {\r\n hasErrors = true;\r\n spinner?.fail(`${path.basename(cardFile)}: Invalid`);\r\n } else {\r\n spinner?.succeed(`${path.basename(cardFile)}: Valid`);\r\n }\r\n } catch (error) {\r\n hasErrors = true;\r\n\r\n const errorMessage = error instanceof Error ? error.message : \"Unknown error\";\r\n\r\n results.push({\r\n path: cardFile,\r\n validation: {\r\n valid: false,\r\n errors: [errorMessage],\r\n },\r\n });\r\n\r\n spinner?.fail(`${path.basename(cardFile)}: Parse error`);\r\n }\r\n }\r\n\r\n // Output results\r\n if (options.output === \"json\") {\r\n console.log(JSON.stringify({ results }, null, 2));\r\n } else {\r\n console.log();\r\n printValidationSummary(results);\r\n }\r\n\r\n // Exit code\r\n if (hasErrors) {\r\n process.exit(1);\r\n }\r\n}\r\n\r\nfunction printValidationSummary(\r\n results: Array<{\r\n path: string;\r\n card?: AssetCard;\r\n validation: { valid: boolean; errors: string[] };\r\n classification?: ClassificationResult;\r\n }>\r\n): void {\r\n console.log(chalk.bold(\"Validation Summary\"));\r\n console.log(chalk.dim(\"─\".repeat(50)));\r\n console.log();\r\n\r\n for (const result of results) {\r\n const fileName = path.basename(result.path);\r\n\r\n if (!result.validation.valid) {\r\n console.log(chalk.red(`✗ ${fileName}`));\r\n\r\n for (const error of result.validation.errors) {\r\n console.log(chalk.red(` Error: ${error}`));\r\n }\r\n } else {\r\n console.log(chalk.green(`✓ ${fileName}`));\r\n\r\n if (result.card && result.classification) {\r\n const tierColor = getRiskLevelColor(result.classification.riskLevel);\r\n console.log(\r\n chalk.dim(\" Risk Level: \") +\r\n tierColor(result.classification.riskLevel)\r\n );\r\n\r\n if (result.classification.euAiActCategory) {\r\n console.log(\r\n chalk.dim(\" EU AI Act: \") +\r\n chalk.yellow(result.classification.euAiActCategory)\r\n );\r\n }\r\n }\r\n }\r\n\r\n console.log();\r\n }\r\n\r\n // Summary counts\r\n const valid = results.filter((r) => r.validation.valid).length;\r\n const invalid = results.filter((r) => !r.validation.valid).length;\r\n\r\n console.log(chalk.dim(\"─\".repeat(50)));\r\n console.log(\r\n `Total: ${results.length} | ` +\r\n chalk.green(`Valid: ${valid}`) +\r\n ` | ` +\r\n chalk.red(`Invalid: ${invalid}`)\r\n );\r\n}\r\n\r\nfunction getRiskLevelColor(level: string): (text: string) => string {\r\n switch (level) {\r\n case \"minimal\":\r\n return chalk.green;\r\n case \"limited\":\r\n return chalk.yellow;\r\n case \"high\":\r\n return chalk.red;\r\n case \"unacceptable\":\r\n return chalk.magenta;\r\n default:\r\n return chalk.white;\r\n }\r\n}\r\n","import { Command } from \"commander\";\r\nimport chalk from \"chalk\";\r\nimport path from \"path\";\r\nimport fs from \"fs/promises\";\r\nimport {\r\n loadAssetCard,\r\n classifyRisk,\r\n type AssetCard,\r\n type ClassificationResult,\r\n} from \"@aigrc/core\";\r\nimport { printHeader } from \"../utils/output.js\";\r\n\r\n// ─────────────────────────────────────────────────────────────────\r\n// STATUS COMMAND\r\n// ─────────────────────────────────────────────────────────────────\r\n\r\ninterface StatusCommandOptions {\r\n output?: \"text\" | \"json\";\r\n}\r\n\r\nconst DEFAULT_CARDS_DIR = \".aigrc/cards\";\r\nconst DEFAULT_CONFIG_FILE = \".aigrc.yaml\";\r\n\r\nexport const statusCommand = new Command(\"status\")\r\n .description(\"Show the current AIGRC status and registered assets\")\r\n .option(\"-o, --output <format>\", \"Output format (text, json)\", \"text\")\r\n .action(async (options: StatusCommandOptions) => {\r\n await runStatus(options);\r\n });\r\n\r\nasync function runStatus(options: StatusCommandOptions): Promise<void> {\r\n const cwd = process.cwd();\r\n\r\n if (options.output === \"text\") {\r\n printHeader();\r\n }\r\n\r\n // Check for AIGRC initialization\r\n const configPath = path.join(cwd, DEFAULT_CONFIG_FILE);\r\n const cardsDir = path.join(cwd, DEFAULT_CARDS_DIR);\r\n\r\n const configExists = await fileExists(configPath);\r\n const cardsDirExists = await directoryExists(cardsDir);\r\n\r\n if (!configExists && !cardsDirExists) {\r\n if (options.output === \"text\") {\r\n console.log(chalk.yellow(\"AIGRC is not initialized in this directory.\"));\r\n console.log(chalk.dim(\"\\nRun `aigrc init` to get started.\"));\r\n } else {\r\n console.log(JSON.stringify({ initialized: false }));\r\n }\r\n return;\r\n }\r\n\r\n // Load and display asset cards\r\n const cards: Array<{\r\n path: string;\r\n card: AssetCard;\r\n classification: ClassificationResult;\r\n }> = [];\r\n\r\n if (cardsDirExists) {\r\n try {\r\n const files = await fs.readdir(cardsDir);\r\n const yamlFiles = files.filter((f) => f.endsWith(\".yaml\") || f.endsWith(\".yml\"));\r\n\r\n for (const file of yamlFiles) {\r\n try {\r\n const filePath = path.join(cardsDir, file);\r\n const card = loadAssetCard(filePath);\r\n const classification = classifyRisk(card.classification.riskFactors);\r\n\r\n cards.push({ path: filePath, card, classification });\r\n } catch {\r\n // Skip invalid cards in status view\r\n }\r\n }\r\n } catch {\r\n // Cards directory read error\r\n }\r\n }\r\n\r\n if (options.output === \"json\") {\r\n console.log(\r\n JSON.stringify(\r\n {\r\n initialized: true,\r\n configPath,\r\n cardsDir,\r\n cards: cards.map((c) => ({\r\n path: c.path,\r\n name: c.card.name,\r\n id: c.card.id,\r\n riskLevel: c.classification.riskLevel,\r\n euAiActCategory: c.classification.euAiActCategory,\r\n })),\r\n },\r\n null,\r\n 2\r\n )\r\n );\r\n return;\r\n }\r\n\r\n // Text output\r\n console.log(chalk.bold(\"AIGRC Status\"));\r\n console.log(chalk.dim(\"─\".repeat(50)));\r\n console.log();\r\n\r\n console.log(chalk.dim(\"Config:\"), configExists ? chalk.green(\"✓\") : chalk.red(\"✗\"), configPath);\r\n console.log(chalk.dim(\"Cards:\"), cardsDirExists ? chalk.green(\"✓\") : chalk.red(\"✗\"), cardsDir);\r\n console.log();\r\n\r\n if (cards.length === 0) {\r\n console.log(chalk.yellow(\"No asset cards registered.\"));\r\n console.log(chalk.dim(\"\\nRun `aigrc init` or `aigrc register` to create an asset card.\"));\r\n return;\r\n }\r\n\r\n console.log(chalk.bold(`Registered Assets (${cards.length})`));\r\n console.log(chalk.dim(\"─\".repeat(50)));\r\n console.log();\r\n\r\n // Group by risk level\r\n const byLevel = groupByRiskLevel(cards);\r\n\r\n for (const level of [\"unacceptable\", \"high\", \"limited\", \"minimal\"]) {\r\n const levelCards = byLevel.get(level);\r\n if (!levelCards || levelCards.length === 0) continue;\r\n\r\n const levelColor = getRiskLevelColor(level);\r\n console.log(levelColor(`${level.toUpperCase()} (${levelCards.length})`));\r\n console.log();\r\n\r\n for (const { card, classification } of levelCards) {\r\n console.log(` ${chalk.bold(card.name)}`);\r\n console.log(chalk.dim(` ID: ${card.id}`));\r\n console.log(chalk.dim(` Risk Level: ${classification.riskLevel}`));\r\n\r\n if (classification.euAiActCategory) {\r\n console.log(chalk.dim(` EU AI Act: `) + chalk.yellow(classification.euAiActCategory));\r\n }\r\n\r\n if (card.ownership?.owner) {\r\n console.log(chalk.dim(` Owner: ${card.ownership.owner.name} <${card.ownership.owner.email}>`));\r\n }\r\n\r\n // Show key risk factors\r\n const activeRisks = getActiveRiskFactors(card);\r\n if (activeRisks.length > 0) {\r\n console.log(chalk.dim(` Risks: `) + activeRisks.join(\", \"));\r\n }\r\n\r\n console.log();\r\n }\r\n }\r\n\r\n // Summary\r\n printStatusSummary(cards);\r\n}\r\n\r\nfunction groupByRiskLevel(\r\n cards: Array<{\r\n path: string;\r\n card: AssetCard;\r\n classification: ClassificationResult;\r\n }>\r\n): Map<string, typeof cards> {\r\n const byLevel = new Map<string, typeof cards>();\r\n\r\n for (const item of cards) {\r\n const level = item.classification.riskLevel;\r\n if (!byLevel.has(level)) {\r\n byLevel.set(level, []);\r\n }\r\n byLevel.get(level)!.push(item);\r\n }\r\n\r\n return byLevel;\r\n}\r\n\r\nfunction printStatusSummary(\r\n cards: Array<{\r\n path: string;\r\n card: AssetCard;\r\n classification: ClassificationResult;\r\n }>\r\n): void {\r\n console.log(chalk.dim(\"─\".repeat(50)));\r\n\r\n const minimal = cards.filter((c) => c.classification.riskLevel === \"minimal\").length;\r\n const limited = cards.filter((c) => c.classification.riskLevel === \"limited\").length;\r\n const high = cards.filter((c) => c.classification.riskLevel === \"high\").length;\r\n const unacceptable = cards.filter((c) => c.classification.riskLevel === \"unacceptable\").length;\r\n\r\n console.log(\r\n `Total: ${cards.length} | ` +\r\n chalk.green(`Minimal: ${minimal}`) +\r\n ` | ` +\r\n chalk.yellow(`Limited: ${limited}`) +\r\n ` | ` +\r\n chalk.red(`High: ${high}`) +\r\n ` | ` +\r\n chalk.magenta(`Unacceptable: ${unacceptable}`)\r\n );\r\n\r\n // High-risk warning\r\n if (high > 0 || unacceptable > 0) {\r\n console.log();\r\n console.log(chalk.yellow(\"⚠ High-risk assets detected. Review compliance requirements.\"));\r\n }\r\n}\r\n\r\nfunction getActiveRiskFactors(card: AssetCard): string[] {\r\n const risks: string[] = [];\r\n const rf = card.classification?.riskFactors;\r\n if (!rf) return risks;\r\n\r\n if (rf.autonomousDecisions) risks.push(\"Autonomous\");\r\n if (rf.customerFacing) risks.push(\"Customer-Facing\");\r\n if (rf.toolExecution) risks.push(\"Tool Execution\");\r\n if (rf.externalDataAccess) risks.push(\"External Data\");\r\n if (rf.piiProcessing === \"yes\") risks.push(\"PII\");\r\n if (rf.highStakesDecisions) risks.push(\"High-Stakes\");\r\n\r\n return risks;\r\n}\r\n\r\nfunction getRiskLevelColor(level: string): (text: string) => string {\r\n switch (level) {\r\n case \"minimal\":\r\n return chalk.green;\r\n case \"limited\":\r\n return chalk.yellow;\r\n case \"high\":\r\n return chalk.red;\r\n case \"unacceptable\":\r\n return chalk.magenta;\r\n default:\r\n return chalk.white;\r\n }\r\n}\r\n\r\nasync function fileExists(filePath: string): Promise<boolean> {\r\n try {\r\n const stat = await fs.stat(filePath);\r\n return stat.isFile();\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\nasync function directoryExists(dirPath: string): Promise<boolean> {\r\n try {\r\n const stat = await fs.stat(dirPath);\r\n return stat.isDirectory();\r\n } catch {\r\n return false;\r\n }\r\n}\r\n","import { Command } from \"commander\";\r\nimport chalk from \"chalk\";\r\nimport ora from \"ora\";\r\nimport { existsSync, readFileSync, writeFileSync } from \"fs\";\r\nimport { join } from \"path\";\r\nimport YAML from \"yaml\";\r\nimport { printHeader, printSubheader, printSuccess, printError, printInfo } from \"../utils/output.js\";\r\n\r\n// ─────────────────────────────────────────────────────────────────\r\n// COMPLIANCE COMMAND\r\n// ─────────────────────────────────────────────────────────────────\r\n\r\ninterface ListOptions {\r\n active?: boolean;\r\n output?: \"text\" | \"json\" | \"yaml\";\r\n}\r\n\r\ninterface ShowOptions {\r\n output?: \"text\" | \"json\" | \"yaml\";\r\n}\r\n\r\ninterface SetOptions {\r\n stack?: boolean;\r\n}\r\n\r\n// Inline profile data since we can't easily import MCP services in CLI\r\nconst BUILTIN_PROFILES = [\r\n {\r\n id: \"eu-ai-act\",\r\n name: \"EU AI Act\",\r\n version: \"2024.1\",\r\n jurisdiction: \"EU\",\r\n description: \"European Union Artificial Intelligence Act\",\r\n },\r\n {\r\n id: \"us-omb-m24\",\r\n name: \"US OMB M-24-10/M-24-18\",\r\n version: \"2024.1\",\r\n jurisdiction: \"US\",\r\n description: \"US Federal AI governance memoranda\",\r\n },\r\n {\r\n id: \"nist-ai-rmf\",\r\n name: \"NIST AI RMF\",\r\n version: \"1.0\",\r\n jurisdiction: \"US\",\r\n description: \"NIST AI Risk Management Framework\",\r\n },\r\n {\r\n id: \"iso-42001\",\r\n name: \"ISO/IEC 42001\",\r\n version: \"2023\",\r\n jurisdiction: \"International\",\r\n description: \"AI Management System Standard\",\r\n },\r\n];\r\n\r\nexport const complianceCommand = new Command(\"compliance\")\r\n .description(\"Manage compliance profiles\")\r\n .addCommand(\r\n new Command(\"list\")\r\n .description(\"List available compliance profiles\")\r\n .option(\"-a, --active\", \"Show only active profiles\")\r\n .option(\"-o, --output <format>\", \"Output format (text, json, yaml)\", \"text\")\r\n .action(async (options: ListOptions) => {\r\n await listProfiles(options);\r\n })\r\n )\r\n .addCommand(\r\n new Command(\"show\")\r\n .description(\"Show details of a profile\")\r\n .argument(\"<profileId>\", \"Profile ID (e.g., eu-ai-act, us-omb-m24)\")\r\n .option(\"-o, --output <format>\", \"Output format (text, json, yaml)\", \"text\")\r\n .action(async (profileId: string, options: ShowOptions) => {\r\n await showProfile(profileId, options);\r\n })\r\n )\r\n .addCommand(\r\n new Command(\"set\")\r\n .description(\"Set active profiles in .aigrc.yaml\")\r\n .argument(\"<profiles...>\", \"Profile IDs to activate\")\r\n .option(\"--stack\", \"Enable profile stacking (strictest wins)\")\r\n .action(async (profiles: string[], options: SetOptions) => {\r\n await setProfiles(profiles, options);\r\n })\r\n );\r\n\r\nasync function listProfiles(options: ListOptions): Promise<void> {\r\n if (options.output === \"text\") {\r\n printHeader();\r\n printSubheader(\"Available Compliance Profiles\");\r\n }\r\n\r\n // Load active profiles from config\r\n const activeProfiles = loadActiveProfiles();\r\n\r\n const profiles = options.active\r\n ? BUILTIN_PROFILES.filter((p) => activeProfiles.includes(p.id))\r\n : BUILTIN_PROFILES;\r\n\r\n if (options.output === \"json\") {\r\n console.log(JSON.stringify(profiles, null, 2));\r\n return;\r\n }\r\n\r\n if (options.output === \"yaml\") {\r\n console.log(YAML.stringify(profiles));\r\n return;\r\n }\r\n\r\n // Text output\r\n console.log();\r\n console.log(\r\n chalk.dim(\" ID\".padEnd(16)) +\r\n chalk.dim(\"Name\".padEnd(28)) +\r\n chalk.dim(\"Jurisdiction\".padEnd(16)) +\r\n chalk.dim(\"Active\")\r\n );\r\n console.log(chalk.dim(\" \" + \"─\".repeat(70)));\r\n\r\n for (const profile of profiles) {\r\n const isActive = activeProfiles.includes(profile.id);\r\n const activeIndicator = isActive ? chalk.green(\"✓\") : chalk.gray(\"·\");\r\n console.log(\r\n ` ${chalk.cyan(profile.id.padEnd(14))} ` +\r\n `${profile.name.padEnd(26)} ` +\r\n `${chalk.dim(profile.jurisdiction.padEnd(14))} ` +\r\n `${activeIndicator}`\r\n );\r\n }\r\n\r\n console.log();\r\n printInfo(`${profiles.length} profile(s) available, ${activeProfiles.length} active`);\r\n}\r\n\r\nasync function showProfile(profileId: string, options: ShowOptions): Promise<void> {\r\n const profile = BUILTIN_PROFILES.find((p) => p.id === profileId);\r\n\r\n if (!profile) {\r\n printError(`Profile not found: ${profileId}`);\r\n console.log();\r\n printInfo(`Available profiles: ${BUILTIN_PROFILES.map((p) => p.id).join(\", \")}`);\r\n process.exit(1);\r\n }\r\n\r\n if (options.output === \"json\") {\r\n console.log(JSON.stringify(profile, null, 2));\r\n return;\r\n }\r\n\r\n if (options.output === \"yaml\") {\r\n console.log(YAML.stringify(profile));\r\n return;\r\n }\r\n\r\n // Text output\r\n printHeader();\r\n console.log(chalk.bold.cyan(`Profile: ${profile.name}`));\r\n console.log();\r\n console.log(` ${chalk.dim(\"ID:\")} ${profile.id}`);\r\n console.log(` ${chalk.dim(\"Version:\")} ${profile.version}`);\r\n console.log(` ${chalk.dim(\"Jurisdiction:\")} ${profile.jurisdiction}`);\r\n console.log(` ${chalk.dim(\"Description:\")} ${profile.description}`);\r\n\r\n // Load active status\r\n const activeProfiles = loadActiveProfiles();\r\n const isActive = activeProfiles.includes(profile.id);\r\n console.log();\r\n console.log(\r\n ` ${chalk.dim(\"Status:\")} ${isActive ? chalk.green(\"Active\") : chalk.gray(\"Inactive\")}`\r\n );\r\n}\r\n\r\nasync function setProfiles(profiles: string[], options: SetOptions): Promise<void> {\r\n printHeader();\r\n\r\n // Validate profiles\r\n const invalidProfiles = profiles.filter(\r\n (p) => !BUILTIN_PROFILES.find((bp) => bp.id === p)\r\n );\r\n\r\n if (invalidProfiles.length > 0) {\r\n printError(`Unknown profile(s): ${invalidProfiles.join(\", \")}`);\r\n console.log();\r\n printInfo(`Available profiles: ${BUILTIN_PROFILES.map((p) => p.id).join(\", \")}`);\r\n process.exit(1);\r\n }\r\n\r\n const spinner = ora(\"Updating configuration...\").start();\r\n\r\n try {\r\n const configPath = join(process.cwd(), \".aigrc.yaml\");\r\n let config: Record<string, unknown> = {};\r\n\r\n if (existsSync(configPath)) {\r\n const content = readFileSync(configPath, \"utf-8\");\r\n config = YAML.parse(content) || {};\r\n }\r\n\r\n config.profiles = profiles;\r\n if (options.stack) {\r\n config.stackProfiles = true;\r\n }\r\n\r\n writeFileSync(configPath, YAML.stringify(config, { indent: 2 }), \"utf-8\");\r\n\r\n spinner.succeed(\"Configuration updated\");\r\n console.log();\r\n printSuccess(`Active profiles: ${profiles.join(\", \")}`);\r\n\r\n if (options.stack) {\r\n printInfo(\"Profile stacking enabled (strictest requirements apply)\");\r\n }\r\n } catch (error) {\r\n spinner.fail(\"Failed to update configuration\");\r\n printError(error instanceof Error ? error.message : String(error));\r\n process.exit(1);\r\n }\r\n}\r\n\r\nfunction loadActiveProfiles(): string[] {\r\n const configPath = join(process.cwd(), \".aigrc.yaml\");\r\n\r\n if (!existsSync(configPath)) {\r\n return [\"eu-ai-act\"]; // Default\r\n }\r\n\r\n try {\r\n const content = readFileSync(configPath, \"utf-8\");\r\n const config = YAML.parse(content);\r\n return config?.profiles || [\"eu-ai-act\"];\r\n } catch {\r\n return [\"eu-ai-act\"];\r\n }\r\n}\r\n","import { Command } from \"commander\";\r\nimport chalk from \"chalk\";\r\nimport ora from \"ora\";\r\nimport { existsSync, readFileSync, writeFileSync } from \"fs\";\r\nimport { join } from \"path\";\r\nimport YAML from \"yaml\";\r\nimport { loadAssetCard, saveAssetCard, type AssetCard } from \"@aigrc/core\";\r\nimport { printHeader, printSubheader, printSuccess, printError, printInfo } from \"../utils/output.js\";\r\n\r\n// ─────────────────────────────────────────────────────────────────\r\n// CLASSIFY COMMAND\r\n// ─────────────────────────────────────────────────────────────────\r\n\r\ninterface ClassifyOptions {\r\n profiles?: string[];\r\n all?: boolean;\r\n output?: \"text\" | \"json\" | \"yaml\";\r\n update?: boolean;\r\n}\r\n\r\n// Risk level mapping per profile\r\nconst RISK_MAPPINGS: Record<string, Record<string, string>> = {\r\n \"eu-ai-act\": {\r\n minimal: \"minimal\",\r\n limited: \"limited\",\r\n high: \"high\",\r\n unacceptable: \"unacceptable\",\r\n },\r\n \"us-omb-m24\": {\r\n minimal: \"neither\",\r\n limited: \"neither\",\r\n high: \"rights-impacting\",\r\n unacceptable: \"safety-impacting\",\r\n },\r\n \"nist-ai-rmf\": {\r\n minimal: \"minimal\",\r\n limited: \"low\",\r\n high: \"high\",\r\n unacceptable: \"critical\",\r\n },\r\n \"iso-42001\": {\r\n minimal: \"low\",\r\n limited: \"medium\",\r\n high: \"high\",\r\n unacceptable: \"critical\",\r\n },\r\n};\r\n\r\nconst PROFILE_NAMES: Record<string, string> = {\r\n \"eu-ai-act\": \"EU AI Act\",\r\n \"us-omb-m24\": \"US OMB M-24\",\r\n \"nist-ai-rmf\": \"NIST AI RMF\",\r\n \"iso-42001\": \"ISO/IEC 42001\",\r\n};\r\n\r\nexport const classifyCommand = new Command(\"classify\")\r\n .description(\"Classify an asset against compliance profiles\")\r\n .argument(\"<assetPath>\", \"Path to asset card YAML file\")\r\n .option(\"-p, --profiles <profiles...>\", \"Profile IDs to classify against\")\r\n .option(\"-a, --all\", \"Classify against all available profiles\")\r\n .option(\"-o, --output <format>\", \"Output format (text, json, yaml)\", \"text\")\r\n .option(\"-u, --update\", \"Update asset card with classification results\")\r\n .action(async (assetPath: string, options: ClassifyOptions) => {\r\n await runClassify(assetPath, options);\r\n });\r\n\r\nasync function runClassify(assetPath: string, options: ClassifyOptions): Promise<void> {\r\n if (options.output === \"text\") {\r\n printHeader();\r\n }\r\n\r\n // Load asset card\r\n if (!existsSync(assetPath)) {\r\n printError(`Asset card not found: ${assetPath}`);\r\n process.exit(1);\r\n }\r\n\r\n const spinner = ora(\"Loading asset card...\").start();\r\n\r\n let card: AssetCard;\r\n try {\r\n card = loadAssetCard(assetPath);\r\n spinner.succeed(`Loaded: ${card.name}`);\r\n } catch (error) {\r\n spinner.fail(\"Failed to load asset card\");\r\n printError(error instanceof Error ? error.message : String(error));\r\n process.exit(1);\r\n }\r\n\r\n // Determine profiles to classify against\r\n let profileIds: string[];\r\n if (options.all) {\r\n profileIds = Object.keys(RISK_MAPPINGS);\r\n } else if (options.profiles && options.profiles.length > 0) {\r\n profileIds = options.profiles;\r\n } else {\r\n profileIds = loadActiveProfiles();\r\n }\r\n\r\n // Validate profiles\r\n const invalidProfiles = profileIds.filter((p) => !RISK_MAPPINGS[p]);\r\n if (invalidProfiles.length > 0) {\r\n printError(`Unknown profile(s): ${invalidProfiles.join(\", \")}`);\r\n process.exit(1);\r\n }\r\n\r\n // Classify against each profile\r\n const classifications: {\r\n profileId: string;\r\n profileName: string;\r\n aigrcLevel: string;\r\n mappedLevel: string;\r\n }[] = [];\r\n\r\n const aigrcLevel = card.classification.riskLevel;\r\n\r\n for (const profileId of profileIds) {\r\n const mapping = RISK_MAPPINGS[profileId];\r\n const mappedLevel = mapping[aigrcLevel] || aigrcLevel;\r\n\r\n classifications.push({\r\n profileId,\r\n profileName: PROFILE_NAMES[profileId] || profileId,\r\n aigrcLevel,\r\n mappedLevel,\r\n });\r\n }\r\n\r\n // Output results\r\n if (options.output === \"json\") {\r\n console.log(\r\n JSON.stringify(\r\n {\r\n asset: card.name,\r\n aigrcRiskLevel: aigrcLevel,\r\n classifications,\r\n },\r\n null,\r\n 2\r\n )\r\n );\r\n return;\r\n }\r\n\r\n if (options.output === \"yaml\") {\r\n console.log(\r\n YAML.stringify({\r\n asset: card.name,\r\n aigrcRiskLevel: aigrcLevel,\r\n classifications,\r\n })\r\n );\r\n return;\r\n }\r\n\r\n // Text output\r\n console.log();\r\n printSubheader(`Classification: ${card.name}`);\r\n console.log();\r\n console.log(` ${chalk.dim(\"AIGRC Risk Level:\")} ${formatRiskLevel(aigrcLevel)}`);\r\n console.log();\r\n\r\n console.log(\r\n chalk.dim(\" Profile\".padEnd(24)) +\r\n chalk.dim(\"Mapped Risk Level\")\r\n );\r\n console.log(chalk.dim(\" \" + \"─\".repeat(50)));\r\n\r\n for (const c of classifications) {\r\n console.log(\r\n ` ${c.profileName.padEnd(22)} ` +\r\n `${formatRiskLevel(c.mappedLevel)}`\r\n );\r\n }\r\n\r\n // Determine strictest level\r\n const riskOrder = [\"minimal\", \"neither\", \"low\", \"limited\", \"medium\", \"moderate\", \"high\", \"rights-impacting\", \"critical\", \"safety-impacting\", \"unacceptable\"];\r\n let strictestLevel = classifications[0]?.mappedLevel || aigrcLevel;\r\n let strictestIndex = riskOrder.indexOf(strictestLevel);\r\n\r\n for (const c of classifications) {\r\n const idx = riskOrder.indexOf(c.mappedLevel);\r\n if (idx > strictestIndex) {\r\n strictestIndex = idx;\r\n strictestLevel = c.mappedLevel;\r\n }\r\n }\r\n\r\n console.log();\r\n console.log(` ${chalk.dim(\"Strictest:\")} ${formatRiskLevel(strictestLevel)}`);\r\n\r\n // Update asset card if requested\r\n if (options.update) {\r\n const updateSpinner = ora(\"Updating asset card...\").start();\r\n\r\n try {\r\n // Add jurisdiction classifications\r\n const jurisdictions = classifications.map((c) => ({\r\n jurisdictionId: c.profileId,\r\n riskLevel: c.mappedLevel,\r\n lastChecked: new Date().toISOString(),\r\n }));\r\n\r\n card.classification.jurisdictions = jurisdictions;\r\n saveAssetCard(card, assetPath);\r\n\r\n updateSpinner.succeed(\"Asset card updated with classifications\");\r\n } catch (error) {\r\n updateSpinner.fail(\"Failed to update asset card\");\r\n printError(error instanceof Error ? error.message : String(error));\r\n }\r\n }\r\n}\r\n\r\nfunction formatRiskLevel(level: string): string {\r\n const colors: Record<string, (text: string) => string> = {\r\n minimal: chalk.green,\r\n neither: chalk.green,\r\n low: chalk.green,\r\n limited: chalk.yellow,\r\n medium: chalk.yellow,\r\n moderate: chalk.yellow,\r\n high: chalk.red,\r\n \"rights-impacting\": chalk.red,\r\n critical: chalk.magenta,\r\n \"safety-impacting\": chalk.magenta,\r\n unacceptable: chalk.magenta.bold,\r\n };\r\n\r\n const colorFn = colors[level] || chalk.white;\r\n return colorFn(level.toUpperCase());\r\n}\r\n\r\nfunction loadActiveProfiles(): string[] {\r\n const configPath = join(process.cwd(), \".aigrc.yaml\");\r\n\r\n if (!existsSync(configPath)) {\r\n return [\"eu-ai-act\"];\r\n }\r\n\r\n try {\r\n const content = readFileSync(configPath, \"utf-8\");\r\n const config = YAML.parse(content);\r\n return config?.profiles || [\"eu-ai-act\"];\r\n } catch {\r\n return [\"eu-ai-act\"];\r\n }\r\n}\r\n","import { Command } from \"commander\";\r\nimport chalk from \"chalk\";\r\nimport ora from \"ora\";\r\nimport { existsSync, readFileSync } from \"fs\";\r\nimport { join } from \"path\";\r\nimport YAML from \"yaml\";\r\nimport { loadAssetCard, type AssetCard } from \"@aigrc/core\";\r\nimport { printHeader, printSubheader, printSuccess, printError, printInfo, printWarning } from \"../utils/output.js\";\r\n\r\n// ─────────────────────────────────────────────────────────────────\r\n// CHECK COMMAND\r\n// ─────────────────────────────────────────────────────────────────\r\n\r\ninterface CheckOptions {\r\n profiles?: string[];\r\n stack?: boolean;\r\n output?: \"text\" | \"json\" | \"yaml\";\r\n verbose?: boolean;\r\n}\r\n\r\n// Control definitions per profile (simplified for CLI)\r\nconst PROFILE_CONTROLS: Record<string, { id: string; name: string; category: string; riskLevels: string[] }[]> = {\r\n \"eu-ai-act\": [\r\n { id: \"eu-art-9\", name: \"Risk Management System\", category: \"Risk Management\", riskLevels: [\"high\"] },\r\n { id: \"eu-art-10\", name: \"Data Governance\", category: \"Data Governance\", riskLevels: [\"high\"] },\r\n { id: \"eu-art-11\", name: \"Technical Documentation\", category: \"Documentation\", riskLevels: [\"high\"] },\r\n { id: \"eu-art-12\", name: \"Record Keeping\", category: \"Logging\", riskLevels: [\"high\"] },\r\n { id: \"eu-art-13\", name: \"Transparency\", category: \"Transparency\", riskLevels: [\"high\", \"limited\"] },\r\n { id: \"eu-art-14\", name: \"Human Oversight\", category: \"Oversight\", riskLevels: [\"high\"] },\r\n { id: \"eu-art-15\", name: \"Accuracy and Robustness\", category: \"Technical\", riskLevels: [\"high\"] },\r\n { id: \"eu-art-50\", name: \"Transparency Obligations\", category: \"Transparency\", riskLevels: [\"limited\"] },\r\n ],\r\n \"us-omb-m24\": [\r\n { id: \"us-aia\", name: \"AI Impact Assessment\", category: \"Assessment\", riskLevels: [\"rights-impacting\", \"safety-impacting\"] },\r\n { id: \"us-human-oversight\", name: \"Human Oversight\", category: \"Oversight\", riskLevels: [\"rights-impacting\", \"safety-impacting\"] },\r\n { id: \"us-equity\", name: \"Equity Assessment\", category: \"Equity\", riskLevels: [\"rights-impacting\"] },\r\n { id: \"us-notice\", name: \"Affected Individual Notice\", category: \"Transparency\", riskLevels: [\"rights-impacting\"] },\r\n { id: \"us-appeal\", name: \"Appeal Process\", category: \"Remediation\", riskLevels: [\"rights-impacting\"] },\r\n { id: \"us-safety-testing\", name: \"Safety Testing\", category: \"Testing\", riskLevels: [\"safety-impacting\"] },\r\n ],\r\n \"nist-ai-rmf\": [\r\n { id: \"nist-govern\", name: \"GOVERN Function\", category: \"Governance\", riskLevels: [\"minimal\", \"low\", \"moderate\", \"high\", \"critical\"] },\r\n { id: \"nist-map\", name: \"MAP Function\", category: \"Risk Mapping\", riskLevels: [\"low\", \"moderate\", \"high\", \"critical\"] },\r\n { id: \"nist-measure\", name: \"MEASURE Function\", category: \"Measurement\", riskLevels: [\"low\", \"moderate\", \"high\", \"critical\"] },\r\n { id: \"nist-manage\", name: \"MANAGE Function\", category: \"Management\", riskLevels: [\"low\", \"moderate\", \"high\", \"critical\"] },\r\n ],\r\n \"iso-42001\": [\r\n { id: \"iso-a5\", name: \"Leadership and Commitment\", category: \"Leadership\", riskLevels: [\"low\", \"medium\", \"high\", \"critical\"] },\r\n { id: \"iso-a6\", name: \"Planning\", category: \"Planning\", riskLevels: [\"low\", \"medium\", \"high\", \"critical\"] },\r\n { id: \"iso-a7\", name: \"Support\", category: \"Support\", riskLevels: [\"medium\", \"high\", \"critical\"] },\r\n { id: \"iso-a8\", name: \"Operation\", category: \"Operations\", riskLevels: [\"medium\", \"high\", \"critical\"] },\r\n { id: \"iso-a9\", name: \"Performance Evaluation\", category: \"Performance\", riskLevels: [\"medium\", \"high\", \"critical\"] },\r\n { id: \"iso-a10\", name: \"Improvement\", category: \"Improvement\", riskLevels: [\"high\", \"critical\"] },\r\n ],\r\n};\r\n\r\nconst RISK_MAPPINGS: Record<string, Record<string, string>> = {\r\n \"eu-ai-act\": { minimal: \"minimal\", limited: \"limited\", high: \"high\", unacceptable: \"unacceptable\" },\r\n \"us-omb-m24\": { minimal: \"neither\", limited: \"neither\", high: \"rights-impacting\", unacceptable: \"safety-impacting\" },\r\n \"nist-ai-rmf\": { minimal: \"minimal\", limited: \"low\", high: \"high\", unacceptable: \"critical\" },\r\n \"iso-42001\": { minimal: \"low\", limited: \"medium\", high: \"high\", unacceptable: \"critical\" },\r\n};\r\n\r\nconst PROFILE_NAMES: Record<string, string> = {\r\n \"eu-ai-act\": \"EU AI Act\",\r\n \"us-omb-m24\": \"US OMB M-24\",\r\n \"nist-ai-rmf\": \"NIST AI RMF\",\r\n \"iso-42001\": \"ISO/IEC 42001\",\r\n};\r\n\r\nexport const checkCommand = new Command(\"check\")\r\n .description(\"Check compliance status for an asset\")\r\n .argument(\"<assetPath>\", \"Path to asset card YAML file\")\r\n .option(\"-p, --profiles <profiles...>\", \"Profile IDs to check\")\r\n .option(\"-s, --stack\", \"Check against stacked profiles (strictest wins)\")\r\n .option(\"-o, --output <format>\", \"Output format (text, json, yaml)\", \"text\")\r\n .option(\"-v, --verbose\", \"Show detailed control status\")\r\n .action(async (assetPath: string, options: CheckOptions) => {\r\n await runCheck(assetPath, options);\r\n });\r\n\r\ninterface ControlStatus {\r\n controlId: string;\r\n controlName: string;\r\n status: \"implemented\" | \"partial\" | \"not_implemented\" | \"not_applicable\";\r\n notes?: string;\r\n}\r\n\r\ninterface ComplianceResult {\r\n profileId: string;\r\n profileName: string;\r\n riskLevel: string;\r\n compliant: boolean;\r\n percentage: number;\r\n controls: ControlStatus[];\r\n gaps: string[];\r\n}\r\n\r\nasync function runCheck(assetPath: string, options: CheckOptions): Promise<void> {\r\n if (options.output === \"text\") {\r\n printHeader();\r\n }\r\n\r\n // Load asset card\r\n if (!existsSync(assetPath)) {\r\n printError(`Asset card not found: ${assetPath}`);\r\n process.exit(1);\r\n }\r\n\r\n const spinner = ora(\"Loading asset card...\").start();\r\n\r\n let card: AssetCard;\r\n try {\r\n card = loadAssetCard(assetPath);\r\n spinner.succeed(`Loaded: ${card.name}`);\r\n } catch (error) {\r\n spinner.fail(\"Failed to load asset card\");\r\n printError(error instanceof Error ? error.message : String(error));\r\n process.exit(1);\r\n }\r\n\r\n // Determine profiles to check\r\n let profileIds: string[];\r\n if (options.profiles && options.profiles.length > 0) {\r\n profileIds = options.profiles;\r\n } else {\r\n profileIds = loadActiveProfiles();\r\n }\r\n\r\n // Check compliance for each profile\r\n const results: ComplianceResult[] = [];\r\n\r\n for (const profileId of profileIds) {\r\n const result = checkProfile(card, profileId);\r\n if (result) {\r\n results.push(result);\r\n }\r\n }\r\n\r\n // Output results\r\n if (options.output === \"json\") {\r\n console.log(JSON.stringify({ asset: card.name, results }, null, 2));\r\n return;\r\n }\r\n\r\n if (options.output === \"yaml\") {\r\n console.log(YAML.stringify({ asset: card.name, results }));\r\n return;\r\n }\r\n\r\n // Text output\r\n console.log();\r\n printSubheader(`Compliance Check: ${card.name}`);\r\n\r\n // Summary table\r\n console.log();\r\n console.log(\r\n chalk.dim(\" Profile\".padEnd(20)) +\r\n chalk.dim(\"Risk Level\".padEnd(20)) +\r\n chalk.dim(\"Compliant\".padEnd(12)) +\r\n chalk.dim(\"Score\")\r\n );\r\n console.log(chalk.dim(\" \" + \"─\".repeat(60)));\r\n\r\n for (const r of results) {\r\n const compliantIcon = r.compliant ? chalk.green(\"✓ Yes\") : chalk.red(\"✗ No\");\r\n const scoreColor = r.percentage >= 80 ? chalk.green : r.percentage >= 50 ? chalk.yellow : chalk.red;\r\n console.log(\r\n ` ${r.profileName.padEnd(18)} ` +\r\n `${formatRiskLevel(r.riskLevel).padEnd(28)} ` +\r\n `${compliantIcon.padEnd(20)} ` +\r\n `${scoreColor(r.percentage + \"%\")}`\r\n );\r\n }\r\n\r\n // Stacked summary if multiple profiles\r\n if (options.stack && results.length > 1) {\r\n console.log();\r\n const allCompliant = results.every((r) => r.compliant);\r\n const avgPercentage = Math.round(results.reduce((acc, r) => acc + r.percentage, 0) / results.length);\r\n\r\n console.log(\r\n ` ${chalk.bold(\"STACKED\")}`.padEnd(18) +\r\n `${chalk.dim(\"(strictest)\")}`.padEnd(28) +\r\n `${allCompliant ? chalk.green(\"✓ Yes\") : chalk.red(\"✗ No\")}`.padEnd(20) +\r\n `${avgPercentage}%`\r\n );\r\n }\r\n\r\n // Detailed output\r\n if (options.verbose) {\r\n for (const r of results) {\r\n console.log();\r\n printSubheader(`${r.profileName} Details`);\r\n console.log();\r\n\r\n console.log(\r\n chalk.dim(\" Control\".padEnd(32)) +\r\n chalk.dim(\"Status\")\r\n );\r\n console.log(chalk.dim(\" \" + \"─\".repeat(50)));\r\n\r\n for (const c of r.controls) {\r\n const statusIcon = getStatusIcon(c.status);\r\n console.log(` ${c.controlName.padEnd(30)} ${statusIcon}`);\r\n }\r\n\r\n if (r.gaps.length > 0) {\r\n console.log();\r\n printWarning(`${r.gaps.length} gap(s) identified:`);\r\n for (const gap of r.gaps) {\r\n console.log(chalk.yellow(` - ${gap}`));\r\n }\r\n }\r\n }\r\n } else {\r\n // Show gaps summary\r\n const allGaps: string[] = [];\r\n for (const r of results) {\r\n allGaps.push(...r.gaps);\r\n }\r\n\r\n if (allGaps.length > 0) {\r\n console.log();\r\n printWarning(`${allGaps.length} total gap(s) identified. Use --verbose for details.`);\r\n }\r\n }\r\n}\r\n\r\nfunction checkProfile(card: AssetCard, profileId: string): ComplianceResult | null {\r\n const controls = PROFILE_CONTROLS[profileId];\r\n const mapping = RISK_MAPPINGS[profileId];\r\n\r\n if (!controls || !mapping) {\r\n return null;\r\n }\r\n\r\n const aigrcLevel = card.classification.riskLevel;\r\n const mappedLevel = mapping[aigrcLevel] || aigrcLevel;\r\n\r\n // Get applicable controls for this risk level\r\n const applicableControls = controls.filter((c) => c.riskLevels.includes(mappedLevel));\r\n\r\n // Evaluate each control (simplified - check if evidence exists)\r\n const controlStatuses: ControlStatus[] = applicableControls.map((control) => {\r\n const status = evaluateControl(card, control);\r\n return {\r\n controlId: control.id,\r\n controlName: control.name,\r\n status,\r\n notes: status === \"not_implemented\" ? \"No evidence found\" : undefined,\r\n };\r\n });\r\n\r\n // Calculate compliance\r\n const implemented = controlStatuses.filter((c) => c.status === \"implemented\" || c.status === \"not_applicable\").length;\r\n const total = controlStatuses.filter((c) => c.status !== \"not_applicable\").length;\r\n const percentage = total > 0 ? Math.round((implemented / total) * 100) : 100;\r\n\r\n // Identify gaps\r\n const gaps: string[] = [];\r\n for (const c of controlStatuses) {\r\n if (c.status === \"not_implemented\") {\r\n gaps.push(`Missing: ${c.controlName}`);\r\n } else if (c.status === \"partial\") {\r\n gaps.push(`Partial: ${c.controlName}`);\r\n }\r\n }\r\n\r\n return {\r\n profileId,\r\n profileName: PROFILE_NAMES[profileId] || profileId,\r\n riskLevel: mappedLevel,\r\n compliant: percentage === 100,\r\n percentage,\r\n controls: controlStatuses,\r\n gaps,\r\n };\r\n}\r\n\r\nfunction evaluateControl(\r\n card: AssetCard,\r\n control: { id: string; name: string; category: string }\r\n): ControlStatus[\"status\"] {\r\n // Simple heuristic: check for evidence in governance, intent, or constraints\r\n const hasApprovals = card.governance.approvals.length > 0;\r\n const hasIntent = card.intent.linked;\r\n const hasConstraints = !!card.constraints;\r\n\r\n // Map categories to what we'd expect to find\r\n const categoryEvidence: Record<string, boolean> = {\r\n \"Risk Management\": hasApprovals || hasIntent,\r\n \"Data Governance\": hasConstraints,\r\n Documentation: hasIntent && !!card.intent.businessJustification,\r\n Logging: hasConstraints && card.constraints?.monitoring?.logAllDecisions,\r\n Transparency: card.intent.linked,\r\n Oversight: hasApprovals || (hasConstraints && card.constraints?.humanApprovalRequired?.length),\r\n Technical: hasConstraints,\r\n Assessment: hasIntent && !!card.intent.businessJustification,\r\n Governance: hasApprovals,\r\n Planning: hasIntent,\r\n Leadership: hasApprovals,\r\n Support: card.ownership.team !== undefined,\r\n Operations: hasConstraints,\r\n Performance: hasConstraints && card.constraints?.monitoring?.logAllDecisions,\r\n Improvement: hasApprovals && card.governance.status !== \"draft\",\r\n Equity: hasIntent && !!card.intent.businessJustification,\r\n Remediation: hasApprovals,\r\n Testing: hasConstraints,\r\n Measurement: hasConstraints && card.constraints?.monitoring,\r\n Management: hasApprovals || hasIntent,\r\n \"Risk Mapping\": hasIntent,\r\n };\r\n\r\n const hasEvidence = categoryEvidence[control.category] ?? false;\r\n\r\n if (hasEvidence) {\r\n return \"implemented\";\r\n }\r\n\r\n return \"not_implemented\";\r\n}\r\n\r\nfunction getStatusIcon(status: ControlStatus[\"status\"]): string {\r\n switch (status) {\r\n case \"implemented\":\r\n return chalk.green(\"✓ Implemented\");\r\n case \"partial\":\r\n return chalk.yellow(\"◐ Partial\");\r\n case \"not_implemented\":\r\n return chalk.red(\"✗ Missing\");\r\n case \"not_applicable\":\r\n return chalk.gray(\"- N/A\");\r\n }\r\n}\r\n\r\nfunction formatRiskLevel(level: string): string {\r\n const colors: Record<string, (text: string) => string> = {\r\n minimal: chalk.green,\r\n neither: chalk.green,\r\n low: chalk.green,\r\n limited: chalk.yellow,\r\n medium: chalk.yellow,\r\n moderate: chalk.yellow,\r\n high: chalk.red,\r\n \"rights-impacting\": chalk.red,\r\n critical: chalk.magenta,\r\n \"safety-impacting\": chalk.magenta,\r\n unacceptable: chalk.magenta.bold,\r\n };\r\n\r\n const colorFn = colors[level] || chalk.white;\r\n return colorFn(level.toUpperCase());\r\n}\r\n\r\nfunction loadActiveProfiles(): string[] {\r\n const configPath = join(process.cwd(), \".aigrc.yaml\");\r\n\r\n if (!existsSync(configPath)) {\r\n return [\"eu-ai-act\"];\r\n }\r\n\r\n try {\r\n const content = readFileSync(configPath, \"utf-8\");\r\n const config = YAML.parse(content);\r\n return config?.profiles || [\"eu-ai-act\"];\r\n } catch {\r\n return [\"eu-ai-act\"];\r\n }\r\n}\r\n","import { Command } from \"commander\";\r\nimport chalk from \"chalk\";\r\nimport ora from \"ora\";\r\nimport { existsSync, mkdirSync, writeFileSync, readFileSync } from \"fs\";\r\nimport { join, dirname } from \"path\";\r\nimport YAML from \"yaml\";\r\nimport { loadAssetCard, type AssetCard } from \"@aigrc/core\";\r\nimport { printHeader, printSubheader, printSuccess, printError, printInfo, printWarning } from \"../utils/output.js\";\r\n\r\n// ─────────────────────────────────────────────────────────────────\r\n// GENERATE COMMAND\r\n// ─────────────────────────────────────────────────────────────────\r\n\r\ninterface GenerateOptions {\r\n profile?: string;\r\n template?: string;\r\n all?: boolean;\r\n outputDir?: string;\r\n force?: boolean;\r\n}\r\n\r\n// Artifact templates per profile\r\nconst ARTIFACT_TEMPLATES: Record<string, { id: string; name: string; requiredFor: string[]; format: string }[]> = {\r\n \"eu-ai-act\": [\r\n { id: \"risk-management-plan\", name: \"Risk Management Plan\", requiredFor: [\"high\"], format: \"md\" },\r\n { id: \"technical-documentation\", name: \"Technical Documentation\", requiredFor: [\"high\"], format: \"md\" },\r\n { id: \"conformity-declaration\", name: \"EU Declaration of Conformity\", requiredFor: [\"high\"], format: \"md\" },\r\n ],\r\n \"us-omb-m24\": [\r\n { id: \"ai-impact-assessment\", name: \"AI Impact Assessment\", requiredFor: [\"rights-impacting\", \"safety-impacting\"], format: \"md\" },\r\n { id: \"equity-assessment\", name: \"Equity Assessment\", requiredFor: [\"rights-impacting\"], format: \"md\" },\r\n ],\r\n \"nist-ai-rmf\": [\r\n { id: \"nist-profile\", name: \"NIST AI RMF Profile\", requiredFor: [\"moderate\", \"high\", \"critical\"], format: \"yaml\" },\r\n { id: \"nist-playbook\", name: \"NIST AI RMF Playbook\", requiredFor: [\"high\", \"critical\"], format: \"md\" },\r\n ],\r\n \"iso-42001\": [\r\n { id: \"aims-policy\", name: \"AIMS Policy\", requiredFor: [\"low\", \"medium\", \"high\", \"critical\"], format: \"md\" },\r\n { id: \"aims-manual\", name: \"AIMS Manual\", requiredFor: [\"high\", \"critical\"], format: \"md\" },\r\n { id: \"risk-treatment-plan\", name: \"Risk Treatment Plan\", requiredFor: [\"medium\", \"high\", \"critical\"], format: \"md\" },\r\n ],\r\n};\r\n\r\nconst RISK_MAPPINGS: Record<string, Record<string, string>> = {\r\n \"eu-ai-act\": { minimal: \"minimal\", limited: \"limited\", high: \"high\", unacceptable: \"unacceptable\" },\r\n \"us-omb-m24\": { minimal: \"neither\", limited: \"neither\", high: \"rights-impacting\", unacceptable: \"safety-impacting\" },\r\n \"nist-ai-rmf\": { minimal: \"minimal\", limited: \"low\", high: \"high\", unacceptable: \"critical\" },\r\n \"iso-42001\": { minimal: \"low\", limited: \"medium\", high: \"high\", unacceptable: \"critical\" },\r\n};\r\n\r\nconst PROFILE_NAMES: Record<string, string> = {\r\n \"eu-ai-act\": \"EU AI Act\",\r\n \"us-omb-m24\": \"US OMB M-24\",\r\n \"nist-ai-rmf\": \"NIST AI RMF\",\r\n \"iso-42001\": \"ISO/IEC 42001\",\r\n};\r\n\r\nexport const generateCommand = new Command(\"generate\")\r\n .description(\"Generate compliance artifacts from templates\")\r\n .argument(\"<assetPath>\", \"Path to asset card YAML file\")\r\n .option(\"-p, --profile <profile>\", \"Profile ID for templates\")\r\n .option(\"-t, --template <template>\", \"Specific template ID to generate\")\r\n .option(\"-a, --all\", \"Generate all required artifacts\")\r\n .option(\"-o, --output-dir <dir>\", \"Output directory\", \".aigrc/artifacts\")\r\n .option(\"-f, --force\", \"Overwrite existing files\")\r\n .action(async (assetPath: string, options: GenerateOptions) => {\r\n await runGenerate(assetPath, options);\r\n });\r\n\r\nasync function runGenerate(assetPath: string, options: GenerateOptions): Promise<void> {\r\n printHeader();\r\n\r\n // Load asset card\r\n if (!existsSync(assetPath)) {\r\n printError(`Asset card not found: ${assetPath}`);\r\n process.exit(1);\r\n }\r\n\r\n const spinner = ora(\"Loading asset card...\").start();\r\n\r\n let card: AssetCard;\r\n try {\r\n card = loadAssetCard(assetPath);\r\n spinner.succeed(`Loaded: ${card.name}`);\r\n } catch (error) {\r\n spinner.fail(\"Failed to load asset card\");\r\n printError(error instanceof Error ? error.message : String(error));\r\n process.exit(1);\r\n }\r\n\r\n // Determine profile\r\n const profileId = options.profile || loadActiveProfiles()[0];\r\n const templates = ARTIFACT_TEMPLATES[profileId];\r\n\r\n if (!templates) {\r\n printError(`Unknown profile: ${profileId}`);\r\n printInfo(`Available profiles: ${Object.keys(ARTIFACT_TEMPLATES).join(\", \")}`);\r\n process.exit(1);\r\n }\r\n\r\n // Determine risk level for this profile\r\n const mapping = RISK_MAPPINGS[profileId];\r\n const mappedLevel = mapping[card.classification.riskLevel] || card.classification.riskLevel;\r\n\r\n // Determine which templates to generate\r\n let templatesToGenerate = templates.filter((t) => t.requiredFor.includes(mappedLevel));\r\n\r\n if (options.template) {\r\n const specific = templates.find((t) => t.id === options.template);\r\n if (!specific) {\r\n printError(`Template not found: ${options.template}`);\r\n printInfo(`Available templates: ${templates.map((t) => t.id).join(\", \")}`);\r\n process.exit(1);\r\n }\r\n templatesToGenerate = [specific];\r\n }\r\n\r\n if (!options.all && !options.template && templatesToGenerate.length === 0) {\r\n printInfo(`No artifacts required for risk level: ${mappedLevel}`);\r\n printInfo(\"Use --all to generate all available templates\");\r\n return;\r\n }\r\n\r\n if (options.all) {\r\n templatesToGenerate = templates;\r\n }\r\n\r\n console.log();\r\n printSubheader(`Generating Artifacts (${PROFILE_NAMES[profileId]})`);\r\n console.log();\r\n printInfo(`Risk Level: ${mappedLevel}`);\r\n printInfo(`Output Directory: ${options.outputDir}`);\r\n console.log();\r\n\r\n // Create output directory\r\n const outputDir = join(process.cwd(), options.outputDir || \".aigrc/artifacts\", profileId);\r\n if (!existsSync(outputDir)) {\r\n mkdirSync(outputDir, { recursive: true });\r\n }\r\n\r\n // Generate each template\r\n let generated = 0;\r\n let skipped = 0;\r\n\r\n for (const template of templatesToGenerate) {\r\n const filename = `${template.id}.${template.format}`;\r\n const outputPath = join(outputDir, filename);\r\n\r\n if (existsSync(outputPath) && !options.force) {\r\n printWarning(`Skipped (exists): ${filename}`);\r\n skipped++;\r\n continue;\r\n }\r\n\r\n const content = generateTemplateContent(card, profileId, template);\r\n writeFileSync(outputPath, content, \"utf-8\");\r\n printSuccess(`Generated: ${filename}`);\r\n generated++;\r\n }\r\n\r\n console.log();\r\n printInfo(`Generated: ${generated}, Skipped: ${skipped}`);\r\n\r\n if (skipped > 0) {\r\n printInfo(\"Use --force to overwrite existing files\");\r\n }\r\n}\r\n\r\nfunction generateTemplateContent(\r\n card: AssetCard,\r\n profileId: string,\r\n template: { id: string; name: string; format: string }\r\n): string {\r\n const now = new Date().toISOString().split(\"T\")[0];\r\n\r\n if (template.format === \"yaml\") {\r\n return generateYamlTemplate(card, profileId, template);\r\n }\r\n\r\n // Markdown template\r\n return `# ${template.name}\r\n\r\n## Document Information\r\n\r\n| Field | Value |\r\n|-------|-------|\r\n| Asset Name | ${card.name} |\r\n| Asset ID | ${card.id} |\r\n| Profile | ${PROFILE_NAMES[profileId]} |\r\n| Generated | ${now} |\r\n| Version | 1.0 |\r\n\r\n---\r\n\r\n## 1. Overview\r\n\r\n${card.description || \"No description provided.\"}\r\n\r\n### 1.1 Asset Classification\r\n\r\n- **Risk Level:** ${card.classification.riskLevel.toUpperCase()}\r\n- **Asset Type:** ${card.technical.type}\r\n- **Framework:** ${card.technical.framework || \"Not specified\"}\r\n\r\n### 1.2 Ownership\r\n\r\n- **Owner:** ${card.ownership.owner.name}\r\n- **Email:** ${card.ownership.owner.email}\r\n- **Team:** ${card.ownership.team || \"Not specified\"}\r\n\r\n---\r\n\r\n## 2. ${getSection2Title(template.id)}\r\n\r\n${getSection2Content(template.id, card)}\r\n\r\n---\r\n\r\n## 3. Risk Factors\r\n\r\n| Factor | Status |\r\n|--------|--------|\r\n| Autonomous Decisions | ${card.classification.riskFactors.autonomousDecisions ? \"Yes\" : \"No\"} |\r\n| Customer Facing | ${card.classification.riskFactors.customerFacing ? \"Yes\" : \"No\"} |\r\n| Tool Execution | ${card.classification.riskFactors.toolExecution ? \"Yes\" : \"No\"} |\r\n| External Data Access | ${card.classification.riskFactors.externalDataAccess ? \"Yes\" : \"No\"} |\r\n| PII Processing | ${card.classification.riskFactors.piiProcessing} |\r\n| High Stakes Decisions | ${card.classification.riskFactors.highStakesDecisions ? \"Yes\" : \"No\"} |\r\n\r\n---\r\n\r\n## 4. Governance Status\r\n\r\n- **Status:** ${card.governance.status}\r\n- **Approvals:** ${card.governance.approvals.length}\r\n\r\n---\r\n\r\n## 5. Next Steps\r\n\r\n- [ ] Review and complete all sections\r\n- [ ] Obtain required approvals\r\n- [ ] Update asset card with artifact path\r\n- [ ] Schedule periodic review\r\n\r\n---\r\n\r\n*This document was auto-generated by AIGRC CLI. Review and customize as needed.*\r\n`;\r\n}\r\n\r\nfunction generateYamlTemplate(\r\n card: AssetCard,\r\n profileId: string,\r\n template: { id: string; name: string }\r\n): string {\r\n const content = {\r\n $schema: `https://aigrc.dev/schemas/${template.id}/v1`,\r\n metadata: {\r\n assetId: card.id,\r\n assetName: card.name,\r\n profile: profileId,\r\n generated: new Date().toISOString(),\r\n version: \"1.0\",\r\n },\r\n classification: {\r\n riskLevel: card.classification.riskLevel,\r\n riskFactors: card.classification.riskFactors,\r\n },\r\n governance: {\r\n status: card.governance.status,\r\n approvalCount: card.governance.approvals.length,\r\n },\r\n // Profile-specific sections would go here\r\n implementation: {\r\n status: \"draft\",\r\n completedSections: [],\r\n pendingSections: [\"All sections require review\"],\r\n },\r\n };\r\n\r\n return YAML.stringify(content, { indent: 2 });\r\n}\r\n\r\nfunction getSection2Title(templateId: string): string {\r\n const titles: Record<string, string> = {\r\n \"risk-management-plan\": \"Risk Management\",\r\n \"technical-documentation\": \"Technical Specification\",\r\n \"conformity-declaration\": \"Declaration of Conformity\",\r\n \"ai-impact-assessment\": \"Impact Assessment\",\r\n \"equity-assessment\": \"Equity Analysis\",\r\n \"nist-playbook\": \"Implementation Playbook\",\r\n \"aims-policy\": \"AI Management Policy\",\r\n \"aims-manual\": \"Management System\",\r\n \"risk-treatment-plan\": \"Risk Treatment\",\r\n };\r\n return titles[templateId] || \"Details\";\r\n}\r\n\r\nfunction getSection2Content(templateId: string, card: AssetCard): string {\r\n // Return placeholder content based on template type\r\n const content: Record<string, string> = {\r\n \"risk-management-plan\": `\r\n### 2.1 Risk Identification\r\n\r\n*Document identified risks associated with the AI system.*\r\n\r\n### 2.2 Risk Analysis\r\n\r\n*Analyze the likelihood and impact of identified risks.*\r\n\r\n### 2.3 Risk Mitigation\r\n\r\n*Define mitigation strategies for each risk.*\r\n\r\n### 2.4 Monitoring\r\n\r\n*Define ongoing monitoring procedures.*\r\n`,\r\n \"technical-documentation\": `\r\n### 2.1 System Architecture\r\n\r\n*Describe the technical architecture of the AI system.*\r\n\r\n### 2.2 Training Data\r\n\r\n*Document training data sources, quality measures, and governance.*\r\n\r\n### 2.3 Model Performance\r\n\r\n*Document accuracy, robustness, and performance metrics.*\r\n\r\n### 2.4 Integration Points\r\n\r\n*Document integration with other systems.*\r\n`,\r\n \"ai-impact-assessment\": `\r\n### 2.1 Purpose and Scope\r\n\r\n*Define the purpose and intended use of the AI system.*\r\n\r\n### 2.2 Affected Populations\r\n\r\n*Identify populations affected by AI decisions.*\r\n\r\n### 2.3 Impact Analysis\r\n\r\n*Analyze potential impacts on affected populations.*\r\n\r\n### 2.4 Mitigation Measures\r\n\r\n*Document measures to mitigate negative impacts.*\r\n`,\r\n };\r\n\r\n return content[templateId] || `\r\n### 2.1 Purpose\r\n\r\n*Define the purpose of this document.*\r\n\r\n### 2.2 Scope\r\n\r\n*Define the scope and applicability.*\r\n\r\n### 2.3 Implementation\r\n\r\n*Document implementation details.*\r\n`;\r\n}\r\n\r\nfunction loadActiveProfiles(): string[] {\r\n const configPath = join(process.cwd(), \".aigrc.yaml\");\r\n\r\n if (!existsSync(configPath)) {\r\n return [\"eu-ai-act\"];\r\n }\r\n\r\n try {\r\n const content = readFileSync(configPath, \"utf-8\");\r\n const config = YAML.parse(content);\r\n return config?.profiles || [\"eu-ai-act\"];\r\n } catch {\r\n return [\"eu-ai-act\"];\r\n }\r\n}\r\n","import { Command } from \"commander\";\r\nimport chalk from \"chalk\";\r\nimport ora from \"ora\";\r\nimport { existsSync, mkdirSync, writeFileSync, readFileSync, readdirSync } from \"fs\";\r\nimport { join, basename } from \"path\";\r\nimport YAML from \"yaml\";\r\nimport { loadAssetCard, type AssetCard } from \"@aigrc/core\";\r\nimport { printHeader, printSubheader, printSuccess, printError, printInfo } from \"../utils/output.js\";\r\n\r\n// ─────────────────────────────────────────────────────────────────\r\n// REPORT COMMAND\r\n// ─────────────────────────────────────────────────────────────────\r\n\r\ninterface GapOptions {\r\n profiles?: string[];\r\n output?: string;\r\n format?: \"md\" | \"json\" | \"yaml\";\r\n}\r\n\r\ninterface CrosswalkOptions {\r\n profiles?: string[];\r\n output?: string;\r\n format?: \"md\" | \"json\" | \"yaml\";\r\n}\r\n\r\ninterface AuditOptions {\r\n profile?: string;\r\n output?: string;\r\n includeAssets?: string[];\r\n}\r\n\r\nconst PROFILE_NAMES: Record<string, string> = {\r\n \"eu-ai-act\": \"EU AI Act\",\r\n \"us-omb-m24\": \"US OMB M-24\",\r\n \"nist-ai-rmf\": \"NIST AI RMF\",\r\n \"iso-42001\": \"ISO/IEC 42001\",\r\n};\r\n\r\nconst RISK_MAPPINGS: Record<string, Record<string, string>> = {\r\n \"eu-ai-act\": { minimal: \"minimal\", limited: \"limited\", high: \"high\", unacceptable: \"unacceptable\" },\r\n \"us-omb-m24\": { minimal: \"neither\", limited: \"neither\", high: \"rights-impacting\", unacceptable: \"safety-impacting\" },\r\n \"nist-ai-rmf\": { minimal: \"minimal\", limited: \"low\", high: \"high\", unacceptable: \"critical\" },\r\n \"iso-42001\": { minimal: \"low\", limited: \"medium\", high: \"high\", unacceptable: \"critical\" },\r\n};\r\n\r\nconst CONTROL_CROSSWALK: Record<string, Record<string, string[]>> = {\r\n risk_management: {\r\n \"eu-ai-act\": [\"eu-art-9\"],\r\n \"us-omb-m24\": [\"us-aia\"],\r\n \"nist-ai-rmf\": [\"nist-govern\", \"nist-manage\"],\r\n \"iso-42001\": [\"iso-a6\"],\r\n },\r\n human_oversight: {\r\n \"eu-ai-act\": [\"eu-art-14\"],\r\n \"us-omb-m24\": [\"us-human-oversight\"],\r\n \"nist-ai-rmf\": [\"nist-govern\"],\r\n \"iso-42001\": [\"iso-a8\"],\r\n },\r\n transparency: {\r\n \"eu-ai-act\": [\"eu-art-13\", \"eu-art-50\"],\r\n \"us-omb-m24\": [\"us-notice\"],\r\n \"nist-ai-rmf\": [\"nist-govern\"],\r\n \"iso-42001\": [\"iso-a7\"],\r\n },\r\n testing: {\r\n \"eu-ai-act\": [\"eu-art-15\"],\r\n \"us-omb-m24\": [\"us-safety-testing\"],\r\n \"nist-ai-rmf\": [\"nist-measure\"],\r\n \"iso-42001\": [\"iso-a9\"],\r\n },\r\n data_governance: {\r\n \"eu-ai-act\": [\"eu-art-10\"],\r\n \"nist-ai-rmf\": [\"nist-map\"],\r\n \"iso-42001\": [\"iso-a8\"],\r\n },\r\n};\r\n\r\nexport const reportCommand = new Command(\"report\")\r\n .description(\"Generate compliance reports\")\r\n .addCommand(\r\n new Command(\"gap\")\r\n .description(\"Generate gap analysis report\")\r\n .argument(\"[assetPath]\", \"Path to asset card (or all in .aigrc/cards)\")\r\n .option(\"-p, --profiles <profiles...>\", \"Profile IDs to analyze\")\r\n .option(\"-o, --output <file>\", \"Output file path\")\r\n .option(\"-f, --format <format>\", \"Format (md, json, yaml)\", \"md\")\r\n .action(async (assetPath: string | undefined, options: GapOptions) => {\r\n await generateGapReport(assetPath, options);\r\n })\r\n )\r\n .addCommand(\r\n new Command(\"crosswalk\")\r\n .description(\"Generate cross-framework mapping report\")\r\n .argument(\"<assetPath>\", \"Path to asset card\")\r\n .option(\"-p, --profiles <profiles...>\", \"Profile IDs to include\")\r\n .option(\"-o, --output <file>\", \"Output file path\")\r\n .option(\"-f, --format <format>\", \"Format (md, json, yaml)\", \"md\")\r\n .action(async (assetPath: string, options: CrosswalkOptions) => {\r\n await generateCrosswalkReport(assetPath, options);\r\n })\r\n )\r\n .addCommand(\r\n new Command(\"audit\")\r\n .description(\"Generate audit package\")\r\n .option(\"-p, --profile <profile>\", \"Profile ID\", \"eu-ai-act\")\r\n .option(\"-o, --output <dir>\", \"Output directory\")\r\n .option(\"--include-assets <assets...>\", \"Specific asset card paths\")\r\n .action(async (options: AuditOptions) => {\r\n await generateAuditPackage(options);\r\n })\r\n );\r\n\r\nasync function generateGapReport(assetPath: string | undefined, options: GapOptions): Promise<void> {\r\n printHeader();\r\n\r\n const spinner = ora(\"Loading assets...\").start();\r\n\r\n // Load asset cards\r\n let cards: { path: string; card: AssetCard }[] = [];\r\n\r\n if (assetPath) {\r\n try {\r\n const card = loadAssetCard(assetPath);\r\n cards.push({ path: assetPath, card });\r\n } catch (error) {\r\n spinner.fail(\"Failed to load asset card\");\r\n printError(error instanceof Error ? error.message : String(error));\r\n process.exit(1);\r\n }\r\n } else {\r\n // Load all cards from .aigrc/cards\r\n const cardsDir = join(process.cwd(), \".aigrc/cards\");\r\n if (existsSync(cardsDir)) {\r\n const files = readdirSync(cardsDir).filter((f) => f.endsWith(\".yaml\") || f.endsWith(\".yml\"));\r\n for (const file of files) {\r\n try {\r\n const card = loadAssetCard(join(cardsDir, file));\r\n cards.push({ path: join(cardsDir, file), card });\r\n } catch {\r\n // Skip invalid cards\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (cards.length === 0) {\r\n spinner.fail(\"No asset cards found\");\r\n process.exit(1);\r\n }\r\n\r\n spinner.succeed(`Loaded ${cards.length} asset(s)`);\r\n\r\n // Determine profiles\r\n const profileIds = options.profiles || loadActiveProfiles();\r\n\r\n // Analyze gaps\r\n const gaps: {\r\n assetId: string;\r\n assetName: string;\r\n profiles: {\r\n profileId: string;\r\n riskLevel: string;\r\n gaps: { control: string; severity: string }[];\r\n }[];\r\n }[] = [];\r\n\r\n for (const { card } of cards) {\r\n const assetGaps: (typeof gaps)[0] = {\r\n assetId: card.id,\r\n assetName: card.name,\r\n profiles: [],\r\n };\r\n\r\n for (const profileId of profileIds) {\r\n const mapping = RISK_MAPPINGS[profileId];\r\n if (!mapping) continue;\r\n\r\n const mappedLevel = mapping[card.classification.riskLevel] || card.classification.riskLevel;\r\n\r\n // Simplified gap detection\r\n const gapList: { control: string; severity: string }[] = [];\r\n\r\n // Check if basic governance is in place\r\n if (card.governance.approvals.length === 0) {\r\n gapList.push({ control: \"Governance Approvals\", severity: \"high\" });\r\n }\r\n if (!card.intent.linked) {\r\n gapList.push({ control: \"Golden Thread Link\", severity: \"medium\" });\r\n }\r\n if (!card.intent.businessJustification) {\r\n gapList.push({ control: \"Business Justification\", severity: \"medium\" });\r\n }\r\n\r\n assetGaps.profiles.push({\r\n profileId,\r\n riskLevel: mappedLevel,\r\n gaps: gapList,\r\n });\r\n }\r\n\r\n gaps.push(assetGaps);\r\n }\r\n\r\n // Generate output\r\n const now = new Date().toISOString().split(\"T\")[0];\r\n\r\n if (options.format === \"json\") {\r\n const output = JSON.stringify({ generated: now, gaps }, null, 2);\r\n if (options.output) {\r\n writeFileSync(options.output, output, \"utf-8\");\r\n printSuccess(`Report saved to: ${options.output}`);\r\n } else {\r\n console.log(output);\r\n }\r\n return;\r\n }\r\n\r\n if (options.format === \"yaml\") {\r\n const output = YAML.stringify({ generated: now, gaps });\r\n if (options.output) {\r\n writeFileSync(options.output, output, \"utf-8\");\r\n printSuccess(`Report saved to: ${options.output}`);\r\n } else {\r\n console.log(output);\r\n }\r\n return;\r\n }\r\n\r\n // Markdown output\r\n let md = `# Gap Analysis Report\r\n\r\n**Generated:** ${now}\r\n**Assets Analyzed:** ${cards.length}\r\n**Profiles:** ${profileIds.join(\", \")}\r\n\r\n---\r\n\r\n`;\r\n\r\n for (const assetGaps of gaps) {\r\n md += `## ${assetGaps.assetName}\\n\\n`;\r\n md += `**Asset ID:** ${assetGaps.assetId}\\n\\n`;\r\n\r\n for (const profile of assetGaps.profiles) {\r\n md += `### ${PROFILE_NAMES[profile.profileId] || profile.profileId}\\n\\n`;\r\n md += `**Risk Level:** ${profile.riskLevel}\\n\\n`;\r\n\r\n if (profile.gaps.length === 0) {\r\n md += \"No gaps identified.\\n\\n\";\r\n } else {\r\n md += \"| Gap | Severity |\\n\";\r\n md += \"|-----|----------|\\n\";\r\n for (const gap of profile.gaps) {\r\n md += `| ${gap.control} | ${gap.severity.toUpperCase()} |\\n`;\r\n }\r\n md += \"\\n\";\r\n }\r\n }\r\n\r\n md += \"---\\n\\n\";\r\n }\r\n\r\n if (options.output) {\r\n writeFileSync(options.output, md, \"utf-8\");\r\n printSuccess(`Report saved to: ${options.output}`);\r\n } else {\r\n console.log(md);\r\n }\r\n}\r\n\r\nasync function generateCrosswalkReport(assetPath: string, options: CrosswalkOptions): Promise<void> {\r\n printHeader();\r\n\r\n // Load asset card\r\n if (!existsSync(assetPath)) {\r\n printError(`Asset card not found: ${assetPath}`);\r\n process.exit(1);\r\n }\r\n\r\n let card: AssetCard;\r\n try {\r\n card = loadAssetCard(assetPath);\r\n } catch (error) {\r\n printError(error instanceof Error ? error.message : String(error));\r\n process.exit(1);\r\n }\r\n\r\n // Determine profiles\r\n const profileIds = options.profiles || Object.keys(RISK_MAPPINGS);\r\n\r\n // Build crosswalk\r\n const classifications: { profileId: string; profileName: string; riskLevel: string }[] = [];\r\n\r\n for (const profileId of profileIds) {\r\n const mapping = RISK_MAPPINGS[profileId];\r\n if (!mapping) continue;\r\n\r\n const mappedLevel = mapping[card.classification.riskLevel] || card.classification.riskLevel;\r\n classifications.push({\r\n profileId,\r\n profileName: PROFILE_NAMES[profileId] || profileId,\r\n riskLevel: mappedLevel,\r\n });\r\n }\r\n\r\n const now = new Date().toISOString().split(\"T\")[0];\r\n\r\n if (options.format === \"json\") {\r\n const output = JSON.stringify(\r\n {\r\n generated: now,\r\n asset: { id: card.id, name: card.name },\r\n aigrcRiskLevel: card.classification.riskLevel,\r\n classifications,\r\n controlCrosswalk: CONTROL_CROSSWALK,\r\n },\r\n null,\r\n 2\r\n );\r\n if (options.output) {\r\n writeFileSync(options.output, output, \"utf-8\");\r\n printSuccess(`Report saved to: ${options.output}`);\r\n } else {\r\n console.log(output);\r\n }\r\n return;\r\n }\r\n\r\n if (options.format === \"yaml\") {\r\n const output = YAML.stringify({\r\n generated: now,\r\n asset: { id: card.id, name: card.name },\r\n aigrcRiskLevel: card.classification.riskLevel,\r\n classifications,\r\n controlCrosswalk: CONTROL_CROSSWALK,\r\n });\r\n if (options.output) {\r\n writeFileSync(options.output, output, \"utf-8\");\r\n printSuccess(`Report saved to: ${options.output}`);\r\n } else {\r\n console.log(output);\r\n }\r\n return;\r\n }\r\n\r\n // Markdown output\r\n let md = `# Cross-Framework Mapping Report\r\n\r\n**Generated:** ${now}\r\n**Asset:** ${card.name} (${card.id})\r\n**AIGRC Risk Level:** ${card.classification.riskLevel.toUpperCase()}\r\n\r\n---\r\n\r\n## Risk Level Mapping\r\n\r\n| Framework | Risk Level |\r\n|-----------|------------|\r\n`;\r\n\r\n for (const c of classifications) {\r\n md += `| ${c.profileName} | ${c.riskLevel.toUpperCase()} |\\n`;\r\n }\r\n\r\n md += `\r\n---\r\n\r\n## Control Crosswalk\r\n\r\n| Category | EU AI Act | US OMB | NIST AI RMF | ISO 42001 |\r\n|----------|-----------|--------|-------------|-----------|\r\n`;\r\n\r\n for (const [category, mappings] of Object.entries(CONTROL_CROSSWALK)) {\r\n const eu = mappings[\"eu-ai-act\"]?.join(\", \") || \"-\";\r\n const us = mappings[\"us-omb-m24\"]?.join(\", \") || \"-\";\r\n const nist = mappings[\"nist-ai-rmf\"]?.join(\", \") || \"-\";\r\n const iso = mappings[\"iso-42001\"]?.join(\", \") || \"-\";\r\n md += `| ${category.replace(/_/g, \" \")} | ${eu} | ${us} | ${nist} | ${iso} |\\n`;\r\n }\r\n\r\n md += `\r\n---\r\n\r\n*This report shows how controls and risk levels map across different regulatory frameworks.*\r\n`;\r\n\r\n if (options.output) {\r\n writeFileSync(options.output, md, \"utf-8\");\r\n printSuccess(`Report saved to: ${options.output}`);\r\n } else {\r\n console.log(md);\r\n }\r\n}\r\n\r\nasync function generateAuditPackage(options: AuditOptions): Promise<void> {\r\n printHeader();\r\n printSubheader(\"Generating Audit Package\");\r\n\r\n const spinner = ora(\"Collecting assets...\").start();\r\n\r\n // Collect asset cards\r\n let cardPaths: string[] = [];\r\n\r\n if (options.includeAssets && options.includeAssets.length > 0) {\r\n cardPaths = options.includeAssets;\r\n } else {\r\n const cardsDir = join(process.cwd(), \".aigrc/cards\");\r\n if (existsSync(cardsDir)) {\r\n cardPaths = readdirSync(cardsDir)\r\n .filter((f) => f.endsWith(\".yaml\") || f.endsWith(\".yml\"))\r\n .map((f) => join(cardsDir, f));\r\n }\r\n }\r\n\r\n if (cardPaths.length === 0) {\r\n spinner.fail(\"No asset cards found\");\r\n process.exit(1);\r\n }\r\n\r\n const cards: AssetCard[] = [];\r\n for (const path of cardPaths) {\r\n try {\r\n cards.push(loadAssetCard(path));\r\n } catch {\r\n // Skip invalid\r\n }\r\n }\r\n\r\n spinner.succeed(`Found ${cards.length} asset(s)`);\r\n\r\n // Create output directory\r\n const now = new Date().toISOString().split(\"T\")[0];\r\n const outputDir = options.output || join(process.cwd(), `.aigrc/audit-${now}`);\r\n mkdirSync(outputDir, { recursive: true });\r\n\r\n // Generate audit package\r\n const profileId = options.profile || \"eu-ai-act\";\r\n const profileName = PROFILE_NAMES[profileId] || profileId;\r\n\r\n // 1. Executive Summary\r\n const summary = `# Audit Package: ${profileName}\r\n\r\n**Generated:** ${now}\r\n**Profile:** ${profileName}\r\n**Total Assets:** ${cards.length}\r\n\r\n## Executive Summary\r\n\r\nThis audit package contains compliance documentation for ${cards.length} AI asset(s) under the ${profileName} framework.\r\n\r\n## Assets Included\r\n\r\n| Asset Name | Risk Level | Governance Status |\r\n|------------|------------|-------------------|\r\n${cards.map((c) => `| ${c.name} | ${c.classification.riskLevel} | ${c.governance.status} |`).join(\"\\n\")}\r\n\r\n## Next Steps\r\n\r\n1. Review individual asset cards\r\n2. Complete gap analysis\r\n3. Generate required artifacts\r\n4. Obtain necessary approvals\r\n`;\r\n\r\n writeFileSync(join(outputDir, \"README.md\"), summary, \"utf-8\");\r\n\r\n // 2. Copy asset cards\r\n const assetsDir = join(outputDir, \"assets\");\r\n mkdirSync(assetsDir, { recursive: true });\r\n\r\n for (const card of cards) {\r\n const filename = `${card.id}.yaml`;\r\n writeFileSync(join(assetsDir, filename), YAML.stringify(card, { indent: 2 }), \"utf-8\");\r\n }\r\n\r\n // 3. Generate inventory\r\n const inventory = {\r\n generated: now,\r\n profile: profileId,\r\n totalAssets: cards.length,\r\n byRiskLevel: {\r\n minimal: cards.filter((c) => c.classification.riskLevel === \"minimal\").length,\r\n limited: cards.filter((c) => c.classification.riskLevel === \"limited\").length,\r\n high: cards.filter((c) => c.classification.riskLevel === \"high\").length,\r\n unacceptable: cards.filter((c) => c.classification.riskLevel === \"unacceptable\").length,\r\n },\r\n byStatus: {\r\n draft: cards.filter((c) => c.governance.status === \"draft\").length,\r\n approved: cards.filter((c) => c.governance.status === \"approved\").length,\r\n production: cards.filter((c) => c.governance.status === \"production\").length,\r\n },\r\n assets: cards.map((c) => ({\r\n id: c.id,\r\n name: c.name,\r\n riskLevel: c.classification.riskLevel,\r\n status: c.governance.status,\r\n })),\r\n };\r\n\r\n writeFileSync(join(outputDir, \"inventory.yaml\"), YAML.stringify(inventory, { indent: 2 }), \"utf-8\");\r\n\r\n console.log();\r\n printSuccess(`Audit package created: ${outputDir}`);\r\n printInfo(` - README.md (Executive Summary)`);\r\n printInfo(` - inventory.yaml (Asset Inventory)`);\r\n printInfo(` - assets/ (${cards.length} asset cards)`);\r\n}\r\n\r\nfunction loadActiveProfiles(): string[] {\r\n const configPath = join(process.cwd(), \".aigrc.yaml\");\r\n\r\n if (!existsSync(configPath)) {\r\n return [\"eu-ai-act\"];\r\n }\r\n\r\n try {\r\n const content = readFileSync(configPath, \"utf-8\");\r\n const config = YAML.parse(content);\r\n return config?.profiles || [\"eu-ai-act\"];\r\n } catch {\r\n return [\"eu-ai-act\"];\r\n }\r\n}\r\n"],"mappings":"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","names":["chalk","chalk","stringify","Command","chalk","ora","path","scan","suggestAssetCard","initializePatterns","Command","path","chalk","initializePatterns","ora","scan","suggestAssetCard","Command","chalk","path","fs","inquirer","createAssetCard","saveAssetCard","DEFAULT_CARDS_DIR","Command","chalk","inquirer","createAssetCard","path","fs","sanitizeFileName","saveAssetCard","Command","chalk","ora","path","fs","DEFAULT_CARDS_DIR","Command","path","fs","chalk","ora","Command","chalk","path","fs","loadAssetCard","classifyRisk","DEFAULT_CARDS_DIR","DEFAULT_CONFIG_FILE","Command","path","fileExists","chalk","fs","loadAssetCard","classifyRisk","getRiskLevelColor","Command","chalk","ora","Command","chalk","ora","Command","chalk","ora","existsSync","readFileSync","join","YAML","loadAssetCard","saveAssetCard","Command","existsSync","ora","loadAssetCard","loadActiveProfiles","YAML","chalk","saveAssetCard","join","readFileSync","Command","chalk","ora","existsSync","readFileSync","join","YAML","loadAssetCard","RISK_MAPPINGS","PROFILE_NAMES","Command","existsSync","ora","loadAssetCard","loadActiveProfiles","YAML","chalk","formatRiskLevel","join","readFileSync","Command","ora","existsSync","writeFileSync","readFileSync","join","YAML","loadAssetCard","RISK_MAPPINGS","PROFILE_NAMES","Command","existsSync","ora","loadAssetCard","loadActiveProfiles","join","writeFileSync","YAML","readFileSync","Command","ora","existsSync","mkdirSync","writeFileSync","readFileSync","join","YAML","loadAssetCard","PROFILE_NAMES","RISK_MAPPINGS","Command","ora","loadAssetCard","join","existsSync","loadActiveProfiles","writeFileSync","YAML","path","mkdirSync","readFileSync"]}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
|
|
3
|
+
declare const scanCommand: Command;
|
|
4
|
+
|
|
5
|
+
declare const initCommand: Command;
|
|
6
|
+
|
|
7
|
+
declare const registerCommand: Command;
|
|
8
|
+
|
|
9
|
+
declare const validateCommand: Command;
|
|
10
|
+
|
|
11
|
+
declare const statusCommand: Command;
|
|
12
|
+
|
|
13
|
+
export { initCommand, registerCommand, scanCommand, statusCommand, validateCommand };
|