@aigrc/cli 0.1.0 → 0.2.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.map CHANGED
@@ -1 +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"]}
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/utils/exit-codes.ts","../src/formatters/sarif.ts","../src/formatters/text.ts","../src/fixers/auto-fix.ts","../src/commands/status.ts","../src/commands/hash.ts","../src/commands/version.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\nimport { hashCommand } from \"../commands/hash.js\";\r\nimport { versionCommand } from \"../commands/version.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\nprogram.addCommand(hashCommand);\r\nprogram.addCommand(versionCommand);\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 YAML from \"yaml\";\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\nimport { ExitCode, exit } from \"../utils/exit-codes.js\";\r\nimport { formatSarif, sarifToJson, type ValidationResult as SarifValidationResult } from \"../formatters/sarif.js\";\r\nimport { printValidationSummary as printTextSummary, type ValidationResult as TextValidationResult } from \"../formatters/text.js\";\r\nimport { autoFixAssetCard } from \"../fixers/auto-fix.js\";\r\n\r\n// ─────────────────────────────────────────────────────────────────\r\n// VALIDATE COMMAND (Enhanced for AIG-97, AIG-98, AIG-99)\r\n// ─────────────────────────────────────────────────────────────────\r\n\r\ninterface ValidateCommandOptions {\r\n strict?: boolean;\r\n output?: \"text\" | \"json\" | \"sarif\";\r\n all?: boolean;\r\n fix?: boolean;\r\n dryRun?: boolean;\r\n outputFile?: string;\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, sarif)\", \"text\")\r\n .option(\"-a, --all\", \"Validate all cards in the cards directory\")\r\n .option(\"--fix\", \"Automatically fix common issues\")\r\n .option(\"--dry-run\", \"Preview fixes without saving (requires --fix)\")\r\n .option(\"--output-file <path>\", \"Write output to file instead of stdout\")\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 // Validate options\r\n if (options.dryRun && !options.fix) {\r\n if (options.output === \"text\") {\r\n console.error(chalk.red(\"Error: --dry-run requires --fix\"));\r\n } else {\r\n console.error(JSON.stringify({ error: \"--dry-run requires --fix\" }));\r\n }\r\n exit(ExitCode.INVALID_ARGUMENTS);\r\n }\r\n\r\n if (options.output === \"text\" && !options.outputFile) {\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 (error) {\r\n if (options.output === \"text\" && !options.outputFile) {\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 const output = JSON.stringify({ error: \"No cards directory found\" });\r\n if (options.outputFile) {\r\n await fs.writeFile(options.outputFile, output);\r\n } else {\r\n console.log(output);\r\n }\r\n }\r\n exit(ExitCode.FILE_NOT_FOUND);\r\n }\r\n } else {\r\n const resolvedPath = path.resolve(process.cwd(), cardPath);\r\n try {\r\n await fs.access(resolvedPath);\r\n cardsToValidate.push(resolvedPath);\r\n } catch {\r\n if (options.output === \"text\" && !options.outputFile) {\r\n console.log(chalk.red(`Error: File not found: ${cardPath}`));\r\n } else {\r\n const output = JSON.stringify({ error: `File not found: ${cardPath}` });\r\n if (options.outputFile) {\r\n await fs.writeFile(options.outputFile, output);\r\n } else {\r\n console.log(output);\r\n }\r\n }\r\n exit(ExitCode.FILE_NOT_FOUND);\r\n }\r\n }\r\n\r\n if (cardsToValidate.length === 0) {\r\n if (options.output === \"text\" && !options.outputFile) {\r\n console.log(chalk.yellow(\"No asset cards found to validate.\"));\r\n } else {\r\n const output = JSON.stringify({ error: \"No asset cards found\" });\r\n if (options.outputFile) {\r\n await fs.writeFile(options.outputFile, output);\r\n } else {\r\n console.log(output);\r\n }\r\n }\r\n exit(ExitCode.FILE_NOT_FOUND);\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 fixed?: boolean;\r\n fixedFields?: string[];\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\" && !options.outputFile\r\n ? ora(`Validating ${path.basename(cardFile)}...`).start()\r\n : undefined;\r\n\r\n try {\r\n let card = loadAssetCard(cardFile);\r\n let fixed = false;\r\n let fixedFields: string[] = [];\r\n\r\n // Apply auto-fix if requested\r\n if (options.fix) {\r\n const fixResult = autoFixAssetCard(card);\r\n if (fixResult.fixed) {\r\n fixed = true;\r\n fixedFields = fixResult.fixedFields;\r\n card = fixResult.card;\r\n\r\n // Save fixed card unless dry-run\r\n if (!options.dryRun) {\r\n const yamlContent = YAML.stringify(card);\r\n await fs.writeFile(cardFile, yamlContent, \"utf-8\");\r\n }\r\n }\r\n }\r\n\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 fixed,\r\n fixedFields,\r\n });\r\n\r\n if (!validation.valid) {\r\n hasErrors = true;\r\n spinner?.fail(`${path.basename(cardFile)}: Invalid`);\r\n } else if (fixed) {\r\n spinner?.succeed(`${path.basename(cardFile)}: Valid (fixed ${fixedFields.length} issues)`);\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 // Format and output results\r\n await outputResults(results, options);\r\n\r\n // Exit with appropriate code\r\n if (hasErrors) {\r\n exit(ExitCode.VALIDATION_ERRORS);\r\n }\r\n exit(ExitCode.SUCCESS);\r\n}\r\n\r\nasync function outputResults(\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 fixed?: boolean;\r\n fixedFields?: string[];\r\n }>,\r\n options: ValidateCommandOptions\r\n): Promise<void> {\r\n let output: string;\r\n\r\n switch (options.output) {\r\n case \"sarif\": {\r\n const sarif = formatSarif(results);\r\n output = sarifToJson(sarif);\r\n break;\r\n }\r\n case \"json\": {\r\n output = JSON.stringify({ results }, null, 2);\r\n break;\r\n }\r\n case \"text\":\r\n default: {\r\n if (options.outputFile) {\r\n // For text output to file, create a simple text representation\r\n output = formatTextOutput(results);\r\n } else {\r\n // For stdout, use the fancy formatted output\r\n console.log();\r\n printTextSummary(results);\r\n return;\r\n }\r\n }\r\n }\r\n\r\n // Write to file or stdout\r\n if (options.outputFile) {\r\n await fs.writeFile(options.outputFile, output, \"utf-8\");\r\n if (options.output === \"text\") {\r\n console.log(chalk.green(`✓ Output written to ${options.outputFile}`));\r\n }\r\n } else {\r\n console.log(output);\r\n }\r\n}\r\n\r\nfunction formatTextOutput(\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 fixed?: boolean;\r\n fixedFields?: string[];\r\n }>\r\n): string {\r\n const lines: string[] = [];\r\n lines.push(\"Validation Summary\");\r\n lines.push(\"─\".repeat(50));\r\n lines.push(\"\");\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 lines.push(`✗ ${fileName}`);\r\n for (const error of result.validation.errors) {\r\n lines.push(` Error: ${error}`);\r\n }\r\n } else {\r\n lines.push(`✓ ${fileName}`);\r\n if (result.fixed && result.fixedFields && result.fixedFields.length > 0) {\r\n lines.push(` Fixed: ${result.fixedFields.join(\", \")}`);\r\n }\r\n if (result.card && result.classification) {\r\n lines.push(` Risk Level: ${result.classification.riskLevel}`);\r\n if (result.classification.euAiActCategory) {\r\n lines.push(` EU AI Act: ${result.classification.euAiActCategory}`);\r\n }\r\n }\r\n }\r\n lines.push(\"\");\r\n }\r\n\r\n const valid = results.filter((r) => r.validation.valid).length;\r\n const invalid = results.filter((r) => !r.validation.valid).length;\r\n const fixed = results.filter((r) => r.fixed).length;\r\n\r\n lines.push(\"─\".repeat(50));\r\n lines.push(\r\n `Total: ${results.length} | Valid: ${valid} | Invalid: ${invalid}` +\r\n (fixed > 0 ? ` | Fixed: ${fixed}` : \"\")\r\n );\r\n\r\n return lines.join(\"\\n\");\r\n}\r\n","// ─────────────────────────────────────────────────────────────────\n// EXIT CODES (AIG-99)\n// Comprehensive exit code coverage for CLI commands\n// ─────────────────────────────────────────────────────────────────\n\n/**\n * Standard exit codes for AIGRC CLI\n */\nexport enum ExitCode {\n /** Command completed successfully */\n SUCCESS = 0,\n\n /** General error - unspecified failure */\n GENERAL_ERROR = 1,\n\n /** Invalid arguments or options provided */\n INVALID_ARGUMENTS = 2,\n\n /** Validation errors detected */\n VALIDATION_ERRORS = 3,\n\n /** File or directory not found */\n FILE_NOT_FOUND = 4,\n\n /** Permission denied */\n PERMISSION_DENIED = 5,\n}\n\n/**\n * Exit the process with the specified exit code\n */\nexport function exit(code: ExitCode): never {\n process.exit(code);\n}\n\n/**\n * Exit with success code\n */\nexport function exitSuccess(): never {\n process.exit(ExitCode.SUCCESS);\n}\n\n/**\n * Exit with validation errors code\n */\nexport function exitValidationErrors(): never {\n process.exit(ExitCode.VALIDATION_ERRORS);\n}\n\n/**\n * Exit with file not found code\n */\nexport function exitFileNotFound(): never {\n process.exit(ExitCode.FILE_NOT_FOUND);\n}\n\n/**\n * Exit with invalid arguments code\n */\nexport function exitInvalidArguments(): never {\n process.exit(ExitCode.INVALID_ARGUMENTS);\n}\n\n/**\n * Exit with permission denied code\n */\nexport function exitPermissionDenied(): never {\n process.exit(ExitCode.PERMISSION_DENIED);\n}\n\n/**\n * Exit with general error code\n */\nexport function exitGeneralError(): never {\n process.exit(ExitCode.GENERAL_ERROR);\n}\n","// ─────────────────────────────────────────────────────────────────\n// SARIF OUTPUT FORMATTER (AIG-97)\n// Generate SARIF 2.1.0 compliant output for validation results\n// ─────────────────────────────────────────────────────────────────\n\nimport type { AssetCard } from \"@aigrc/core\";\n\n/**\n * SARIF 2.1.0 types\n */\nexport interface SarifLog {\n version: \"2.1.0\";\n $schema: string;\n runs: SarifRun[];\n}\n\nexport interface SarifRun {\n tool: SarifTool;\n results: SarifResult[];\n artifacts?: SarifArtifact[];\n}\n\nexport interface SarifTool {\n driver: SarifDriver;\n}\n\nexport interface SarifDriver {\n name: string;\n version: string;\n informationUri?: string;\n rules?: SarifRule[];\n}\n\nexport interface SarifRule {\n id: string;\n name?: string;\n shortDescription?: SarifMessage;\n fullDescription?: SarifMessage;\n help?: SarifMessage;\n defaultConfiguration?: {\n level: \"warning\" | \"error\" | \"note\";\n };\n}\n\nexport interface SarifResult {\n ruleId: string;\n level: \"warning\" | \"error\" | \"note\" | \"none\";\n message: SarifMessage;\n locations?: SarifLocation[];\n properties?: Record<string, unknown>;\n}\n\nexport interface SarifMessage {\n text: string;\n}\n\nexport interface SarifLocation {\n physicalLocation?: {\n artifactLocation: {\n uri: string;\n uriBaseId?: string;\n };\n region?: {\n startLine?: number;\n startColumn?: number;\n endLine?: number;\n endColumn?: number;\n };\n };\n}\n\nexport interface SarifArtifact {\n location: {\n uri: string;\n };\n length?: number;\n mimeType?: string;\n}\n\n/**\n * Validation result for SARIF formatting\n */\nexport interface ValidationResult {\n path: string;\n card?: AssetCard;\n validation: {\n valid: boolean;\n errors: string[];\n };\n}\n\n/**\n * Generate SARIF 2.1.0 output from validation results\n */\nexport function formatSarif(\n results: ValidationResult[],\n version = \"0.1.0\"\n): SarifLog {\n const sarifResults: SarifResult[] = [];\n const artifacts: SarifArtifact[] = [];\n const seenPaths = new Set<string>();\n\n for (const result of results) {\n // Add artifact if not seen\n if (!seenPaths.has(result.path)) {\n seenPaths.add(result.path);\n artifacts.push({\n location: {\n uri: result.path,\n },\n mimeType: \"application/x-yaml\",\n });\n }\n\n // Add results for each error\n if (!result.validation.valid) {\n for (const error of result.validation.errors) {\n sarifResults.push({\n ruleId: \"AIGRC001\",\n level: \"error\",\n message: {\n text: error,\n },\n locations: [\n {\n physicalLocation: {\n artifactLocation: {\n uri: result.path,\n },\n },\n },\n ],\n properties: {\n cardId: result.card?.id,\n cardName: result.card?.name,\n },\n });\n }\n } else {\n // Add success result\n sarifResults.push({\n ruleId: \"AIGRC001\",\n level: \"none\",\n message: {\n text: \"Asset card validation passed\",\n },\n locations: [\n {\n physicalLocation: {\n artifactLocation: {\n uri: result.path,\n },\n },\n },\n ],\n properties: {\n cardId: result.card?.id,\n cardName: result.card?.name,\n riskLevel: result.card?.classification?.riskLevel,\n },\n });\n }\n }\n\n const sarif: SarifLog = {\n version: \"2.1.0\",\n $schema:\n \"https://raw.githubusercontent.com/oasis-tcs/sarif-spec/master/Schemata/sarif-schema-2.1.0.json\",\n runs: [\n {\n tool: {\n driver: {\n name: \"AIGRC\",\n version,\n informationUri: \"https://github.com/aigrc/aigrc\",\n rules: [\n {\n id: \"AIGRC001\",\n name: \"AssetCardValidation\",\n shortDescription: {\n text: \"Asset card must be valid according to AIGRC schema\",\n },\n fullDescription: {\n text: \"Validates asset cards against AIGRC compliance requirements including risk classification, ownership, and regulatory framework mappings.\",\n },\n help: {\n text: \"Ensure your asset card includes all required fields and follows the AIGRC schema. Run 'aigrc validate --help' for more information.\",\n },\n defaultConfiguration: {\n level: \"error\",\n },\n },\n ],\n },\n },\n results: sarifResults,\n artifacts,\n },\n ],\n };\n\n return sarif;\n}\n\n/**\n * Convert SARIF log to JSON string\n */\nexport function sarifToJson(sarif: SarifLog, pretty = true): string {\n return JSON.stringify(sarif, null, pretty ? 2 : 0);\n}\n","// ─────────────────────────────────────────────────────────────────\n// TEXT OUTPUT FORMATTER\n// Enhanced text output formatting for validation results\n// ─────────────────────────────────────────────────────────────────\n\nimport chalk from \"chalk\";\nimport path from \"path\";\nimport type { AssetCard, ClassificationResult } from \"@aigrc/core\";\n\n/**\n * Validation result for text formatting\n */\nexport interface ValidationResult {\n path: string;\n card?: AssetCard;\n validation: {\n valid: boolean;\n errors: string[];\n };\n classification?: ClassificationResult;\n fixed?: boolean;\n fixedFields?: string[];\n}\n\n/**\n * Print validation summary in text format\n */\nexport function printValidationSummary(results: ValidationResult[]): void {\n console.log(chalk.bold(\"Validation Summary\"));\n console.log(chalk.dim(\"─\".repeat(50)));\n console.log();\n\n for (const result of results) {\n const fileName = path.basename(result.path);\n\n if (!result.validation.valid) {\n console.log(chalk.red(`✗ ${fileName}`));\n\n for (const error of result.validation.errors) {\n console.log(chalk.red(` Error: ${error}`));\n }\n\n if (result.fixed && result.fixedFields && result.fixedFields.length > 0) {\n console.log(chalk.yellow(` Fixed: ${result.fixedFields.join(\", \")}`));\n }\n } else {\n console.log(chalk.green(`✓ ${fileName}`));\n\n if (result.fixed && result.fixedFields && result.fixedFields.length > 0) {\n console.log(chalk.yellow(` Fixed: ${result.fixedFields.join(\", \")}`));\n }\n\n if (result.card && result.classification) {\n const tierColor = getRiskLevelColor(result.classification.riskLevel);\n console.log(\n chalk.dim(\" Risk Level: \") +\n tierColor(result.classification.riskLevel)\n );\n\n if (result.classification.euAiActCategory) {\n console.log(\n chalk.dim(\" EU AI Act: \") +\n chalk.yellow(result.classification.euAiActCategory)\n );\n }\n }\n }\n\n console.log();\n }\n\n // Summary counts\n const valid = results.filter((r) => r.validation.valid).length;\n const invalid = results.filter((r) => !r.validation.valid).length;\n const fixed = results.filter((r) => r.fixed).length;\n\n console.log(chalk.dim(\"─\".repeat(50)));\n console.log(\n `Total: ${results.length} | ` +\n chalk.green(`Valid: ${valid}`) +\n ` | ` +\n chalk.red(`Invalid: ${invalid}`) +\n (fixed > 0 ? ` | ${chalk.yellow(`Fixed: ${fixed}`)}` : \"\")\n );\n}\n\n/**\n * Get color function for risk level\n */\nexport function getRiskLevelColor(level: string): (text: string) => string {\n switch (level) {\n case \"minimal\":\n return chalk.green;\n case \"limited\":\n return chalk.yellow;\n case \"high\":\n return chalk.red;\n case \"unacceptable\":\n return chalk.magenta;\n default:\n return chalk.white;\n }\n}\n","// ─────────────────────────────────────────────────────────────────\n// AUTO-FIX LOGIC (AIG-98)\n// Automatically fix common issues in asset cards\n// ─────────────────────────────────────────────────────────────────\n\nimport type { AssetCard } from \"@aigrc/core\";\n\n/**\n * Auto-fix result\n */\nexport interface AutoFixResult {\n fixed: boolean;\n fixedFields: string[];\n card: AssetCard;\n}\n\n/**\n * Automatically fix common issues in asset cards\n */\nexport function autoFixAssetCard(card: AssetCard): AutoFixResult {\n const fixedFields: string[] = [];\n const fixedCard = JSON.parse(JSON.stringify(card)) as AssetCard;\n\n // Fix missing or invalid dates\n if (!fixedCard.metadata?.createdAt) {\n if (!fixedCard.metadata) {\n fixedCard.metadata = {\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n version: \"1.0.0\",\n };\n } else {\n fixedCard.metadata.createdAt = new Date().toISOString();\n }\n fixedFields.push(\"metadata.createdAt\");\n } else if (!isValidISODate(fixedCard.metadata.createdAt)) {\n fixedCard.metadata.createdAt = normalizeDate(fixedCard.metadata.createdAt);\n fixedFields.push(\"metadata.createdAt (format)\");\n }\n\n if (!fixedCard.metadata?.updatedAt) {\n if (!fixedCard.metadata) {\n fixedCard.metadata = {\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n version: \"1.0.0\",\n };\n } else {\n fixedCard.metadata.updatedAt = new Date().toISOString();\n }\n fixedFields.push(\"metadata.updatedAt\");\n } else if (!isValidISODate(fixedCard.metadata.updatedAt)) {\n fixedCard.metadata.updatedAt = normalizeDate(fixedCard.metadata.updatedAt);\n fixedFields.push(\"metadata.updatedAt (format)\");\n }\n\n // Fix missing version\n if (!fixedCard.metadata?.version) {\n if (!fixedCard.metadata) {\n fixedCard.metadata = {\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n version: \"1.0.0\",\n };\n } else {\n fixedCard.metadata.version = \"1.0.0\";\n }\n fixedFields.push(\"metadata.version\");\n }\n\n // Fix risk level mapping\n if (fixedCard.classification?.riskLevel) {\n const normalized = normalizeRiskLevel(fixedCard.classification.riskLevel);\n if (normalized !== fixedCard.classification.riskLevel) {\n fixedCard.classification.riskLevel = normalized;\n fixedFields.push(\"classification.riskLevel\");\n }\n }\n\n // Fix PII processing field (convert boolean to \"yes\"/\"no\"/\"unknown\")\n if (fixedCard.classification?.riskFactors?.piiProcessing !== undefined) {\n const pii = fixedCard.classification.riskFactors.piiProcessing;\n if (typeof pii === \"boolean\") {\n fixedCard.classification.riskFactors.piiProcessing = pii ? \"yes\" : \"no\";\n fixedFields.push(\"classification.riskFactors.piiProcessing\");\n }\n }\n\n // Fix missing ID\n if (!fixedCard.id) {\n fixedCard.id = generateId(fixedCard.name);\n fixedFields.push(\"id\");\n }\n\n // Fix missing name\n if (!fixedCard.name) {\n fixedCard.name = \"Unnamed Asset\";\n fixedFields.push(\"name\");\n }\n\n // Fix missing description\n if (!fixedCard.description) {\n fixedCard.description = \"No description provided\";\n fixedFields.push(\"description\");\n }\n\n // Fix missing classification\n if (!fixedCard.classification) {\n fixedCard.classification = {\n riskLevel: \"minimal\",\n riskFactors: {\n autonomousDecisions: false,\n customerFacing: false,\n toolExecution: false,\n externalDataAccess: false,\n piiProcessing: \"unknown\",\n highStakesDecisions: false,\n },\n };\n fixedFields.push(\"classification\");\n }\n\n // Fix missing risk factors\n if (!fixedCard.classification.riskFactors) {\n fixedCard.classification.riskFactors = {\n autonomousDecisions: false,\n customerFacing: false,\n toolExecution: false,\n externalDataAccess: false,\n piiProcessing: \"unknown\",\n highStakesDecisions: false,\n };\n fixedFields.push(\"classification.riskFactors\");\n }\n\n return {\n fixed: fixedFields.length > 0,\n fixedFields,\n card: fixedCard,\n };\n}\n\n/**\n * Check if a date string is valid ISO 8601 format\n */\nfunction isValidISODate(dateStr: string): boolean {\n const iso8601Regex = /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d{3})?Z?$/;\n if (!iso8601Regex.test(dateStr)) {\n return false;\n }\n const date = new Date(dateStr);\n return !isNaN(date.getTime());\n}\n\n/**\n * Normalize date to ISO 8601 format\n */\nfunction normalizeDate(dateStr: string): string {\n const date = new Date(dateStr);\n if (isNaN(date.getTime())) {\n return new Date().toISOString();\n }\n return date.toISOString();\n}\n\n/**\n * Normalize risk level to valid values\n */\nfunction normalizeRiskLevel(level: string): string {\n const normalized = level.toLowerCase().trim();\n const validLevels = [\"minimal\", \"limited\", \"high\", \"unacceptable\"];\n\n if (validLevels.includes(normalized)) {\n return normalized;\n }\n\n // Map common variations\n const mappings: Record<string, string> = {\n low: \"minimal\",\n medium: \"limited\",\n critical: \"unacceptable\",\n extreme: \"unacceptable\",\n none: \"minimal\",\n };\n\n return mappings[normalized] || \"minimal\";\n}\n\n/**\n * Generate a simple ID from name\n */\nfunction generateId(name: string): string {\n return name\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-|-$/g, \"\")\n .substring(0, 50);\n}\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 extractGoldenThreadComponents,\r\n verifyGoldenThreadHashSync,\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 // Show Golden Thread status for cards with Golden Thread\r\n printGoldenThreadStatus(cards);\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\r\n/**\r\n * Print Golden Thread status for cards (AIG-100)\r\n */\r\nfunction printGoldenThreadStatus(\r\n cards: Array<{\r\n path: string;\r\n card: AssetCard;\r\n classification: ClassificationResult;\r\n }>\r\n): void {\r\n const cardsWithGoldenThread = cards.filter((c) => {\r\n const components = extractGoldenThreadComponents(c.card);\r\n return components && c.card.golden_thread?.hash;\r\n });\r\n\r\n if (cardsWithGoldenThread.length === 0) {\r\n return;\r\n }\r\n\r\n console.log(chalk.bold(\"Golden Thread\"));\r\n console.log(chalk.dim(\"─\".repeat(50)));\r\n console.log();\r\n\r\n for (const { card } of cardsWithGoldenThread) {\r\n const components = extractGoldenThreadComponents(card);\r\n if (!components || !card.golden_thread?.hash) continue;\r\n\r\n console.log(chalk.bold(card.name));\r\n console.log(chalk.dim(` Hash: ${card.golden_thread.hash}`));\r\n\r\n // Verify hash\r\n try {\r\n const verification = verifyGoldenThreadHashSync(components, card.golden_thread.hash);\r\n if (verification.verified) {\r\n console.log(chalk.dim(\" Status: \") + chalk.green(\"✓ Verified\"));\r\n } else {\r\n console.log(chalk.dim(\" Status: \") + chalk.red(\"✗ Verification Failed\"));\r\n if (verification.mismatch_reason) {\r\n console.log(chalk.dim(\" Reason: \") + chalk.yellow(verification.mismatch_reason));\r\n }\r\n }\r\n } catch (error) {\r\n console.log(chalk.dim(\" Status: \") + chalk.red(\"✗ Error\"));\r\n }\r\n\r\n // Show signature if present\r\n if (card.golden_thread?.signature) {\r\n console.log(chalk.dim(\" Signature: \") + chalk.green(\"✓ RSA-SHA256\"));\r\n }\r\n\r\n console.log();\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 {\r\n loadAssetCard,\r\n extractGoldenThreadComponents,\r\n computeGoldenThreadHashSync,\r\n verifyGoldenThreadHashSync,\r\n computeCanonicalString,\r\n type GoldenThreadComponents,\r\n} from \"@aigrc/core\";\r\nimport { printHeader } from \"../utils/output.js\";\r\n\r\n// ─────────────────────────────────────────────────────────────────\r\n// HASH COMMAND (AIG-102)\r\n// Compute and verify Golden Thread hashes with simplified output\r\n// ─────────────────────────────────────────────────────────────────\r\n\r\ninterface HashCommandOptions {\r\n verify?: boolean;\r\n output?: \"text\" | \"json\";\r\n ticketId?: string;\r\n approvedBy?: string;\r\n approvedAt?: string;\r\n}\r\n\r\ninterface HashResult {\r\n success: boolean;\r\n canonical_string?: string;\r\n hash?: string;\r\n verified?: boolean;\r\n expected_hash?: string;\r\n error?: string;\r\n}\r\n\r\nexport const hashCommand = new Command(\"hash\")\r\n .description(\"Compute or verify Golden Thread hashes\")\r\n .argument(\"[path]\", \"Path to asset card file\")\r\n .option(\"-v, --verify\", \"Verify the hash in the asset card\")\r\n .option(\"-o, --output <format>\", \"Output format (text, json)\", \"text\")\r\n .option(\"--ticket-id <id>\", \"Ticket ID for manual hash computation\")\r\n .option(\"--approved-by <email>\", \"Approver email for manual hash computation\")\r\n .option(\"--approved-at <datetime>\", \"Approval timestamp (ISO 8601) for manual hash computation\")\r\n .action(async (cardPath: string | undefined, options: HashCommandOptions) => {\r\n await runHash(cardPath, options);\r\n });\r\n\r\nasync function runHash(\r\n cardPath: string | undefined,\r\n options: HashCommandOptions\r\n): Promise<void> {\r\n if (options.output === \"text\") {\r\n printHeader();\r\n }\r\n\r\n // Check if manual components provided\r\n if (options.ticketId && options.approvedBy && options.approvedAt) {\r\n await runManualHash(options);\r\n return;\r\n }\r\n\r\n if (!cardPath) {\r\n if (options.output === \"json\") {\r\n console.log(JSON.stringify({\r\n success: false,\r\n error: \"No asset card path provided. Use --ticket-id, --approved-by, --approved-at for manual computation.\",\r\n }));\r\n } else {\r\n console.log(chalk.red(\"Error: No asset card path provided.\"));\r\n console.log(chalk.gray(\"Usage: aigrc hash <path-to-card>\"));\r\n console.log(chalk.gray(\" or: aigrc hash --ticket-id <id> --approved-by <email> --approved-at <datetime>\"));\r\n }\r\n process.exit(1);\r\n }\r\n\r\n const spinner = options.output === \"text\" ? ora(\"Loading asset card...\").start() : null;\r\n\r\n try {\r\n const resolvedPath = path.resolve(process.cwd(), cardPath);\r\n const asset = loadAssetCard(resolvedPath);\r\n spinner?.succeed(\"Asset card loaded\");\r\n\r\n // Extract Golden Thread components\r\n const components = extractGoldenThreadComponents(asset);\r\n if (!components) {\r\n const result: HashResult = {\r\n success: false,\r\n error: \"Asset card does not have Golden Thread components (missing ticket_id, approved_by, or approved_at)\",\r\n };\r\n outputResult(result, options.output);\r\n process.exit(1);\r\n }\r\n\r\n if (options.verify) {\r\n await runVerify(components, asset.golden_thread?.hash, options);\r\n } else {\r\n await runCompute(components, options);\r\n }\r\n } catch (error) {\r\n spinner?.fail(\"Failed to load asset card\");\r\n const result: HashResult = {\r\n success: false,\r\n error: error instanceof Error ? error.message : String(error),\r\n };\r\n outputResult(result, options.output);\r\n process.exit(1);\r\n }\r\n}\r\n\r\nasync function runManualHash(options: HashCommandOptions): Promise<void> {\r\n const components: GoldenThreadComponents = {\r\n ticket_id: options.ticketId!,\r\n approved_by: options.approvedBy!,\r\n approved_at: options.approvedAt!,\r\n };\r\n\r\n const spinner = options.output === \"text\" ? ora(\"Computing hash...\").start() : null;\r\n\r\n try {\r\n const { canonical_string, hash } = computeGoldenThreadHashSync(components);\r\n spinner?.succeed(\"Hash computed\");\r\n\r\n const result: HashResult = {\r\n success: true,\r\n canonical_string,\r\n hash,\r\n };\r\n outputResult(result, options.output);\r\n } catch (error) {\r\n spinner?.fail(\"Failed to compute hash\");\r\n const result: HashResult = {\r\n success: false,\r\n error: error instanceof Error ? error.message : String(error),\r\n };\r\n outputResult(result, options.output);\r\n process.exit(1);\r\n }\r\n}\r\n\r\nasync function runCompute(\r\n components: GoldenThreadComponents,\r\n options: HashCommandOptions\r\n): Promise<void> {\r\n const spinner = options.output === \"text\" ? ora(\"Computing hash...\").start() : null;\r\n\r\n try {\r\n const { canonical_string, hash } = computeGoldenThreadHashSync(components);\r\n spinner?.succeed(\"Hash computed\");\r\n\r\n const result: HashResult = {\r\n success: true,\r\n canonical_string,\r\n hash,\r\n };\r\n outputResult(result, options.output);\r\n } catch (error) {\r\n spinner?.fail(\"Failed to compute hash\");\r\n const result: HashResult = {\r\n success: false,\r\n error: error instanceof Error ? error.message : String(error),\r\n };\r\n outputResult(result, options.output);\r\n process.exit(1);\r\n }\r\n}\r\n\r\nasync function runVerify(\r\n components: GoldenThreadComponents,\r\n expectedHash: string | undefined,\r\n options: HashCommandOptions\r\n): Promise<void> {\r\n const spinner = options.output === \"text\" ? ora(\"Verifying hash...\").start() : null;\r\n\r\n if (!expectedHash) {\r\n spinner?.fail(\"No hash to verify\");\r\n const result: HashResult = {\r\n success: false,\r\n error: \"Asset card does not have a hash in golden_thread.hash\",\r\n };\r\n outputResult(result, options.output);\r\n process.exit(1);\r\n }\r\n\r\n try {\r\n const verification = verifyGoldenThreadHashSync(components, expectedHash);\r\n\r\n if (verification.verified) {\r\n spinner?.succeed(\"Hash verified successfully\");\r\n } else {\r\n spinner?.fail(\"Hash verification failed\");\r\n }\r\n\r\n const result: HashResult = {\r\n success: verification.verified,\r\n canonical_string: computeCanonicalString(components),\r\n hash: verification.computed,\r\n verified: verification.verified,\r\n expected_hash: verification.expected,\r\n error: verification.mismatch_reason,\r\n };\r\n outputResult(result, options.output);\r\n\r\n if (!verification.verified) {\r\n process.exit(1);\r\n }\r\n } catch (error) {\r\n spinner?.fail(\"Failed to verify hash\");\r\n const result: HashResult = {\r\n success: false,\r\n error: error instanceof Error ? error.message : String(error),\r\n };\r\n outputResult(result, options.output);\r\n process.exit(1);\r\n }\r\n}\r\n\r\nfunction outputResult(result: HashResult, format?: \"text\" | \"json\"): void {\r\n if (format === \"json\") {\r\n console.log(JSON.stringify(result, null, 2));\r\n return;\r\n }\r\n\r\n // Simplified text output for AIG-102\r\n if (result.success) {\r\n if (result.verified !== undefined) {\r\n // For --verify mode\r\n if (result.verified) {\r\n console.log(chalk.green(\"✓ Golden Thread hash verified\"));\r\n } else {\r\n console.log(chalk.red(\"✗ Golden Thread hash verification failed\"));\r\n if (result.expected_hash) {\r\n console.log(chalk.dim(`Expected: ${result.expected_hash}`));\r\n }\r\n if (result.hash) {\r\n console.log(chalk.dim(`Computed: ${result.hash}`));\r\n }\r\n }\r\n } else {\r\n // For compute mode - just print the hash\r\n if (result.hash) {\r\n console.log(result.hash);\r\n }\r\n }\r\n } else {\r\n console.log(chalk.red(\"Error: \") + result.error);\r\n }\r\n}\r\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport fs from \"fs/promises\";\nimport path from \"path\";\nimport { fileURLToPath } from \"url\";\n\n// ─────────────────────────────────────────────────────────────────\n// VERSION COMMAND (AIG-101)\n// Enhanced version output with package details\n// ─────────────────────────────────────────────────────────────────\n\ninterface VersionCommandOptions {\n json?: boolean;\n}\n\ninterface VersionInfo {\n cli: string;\n core: string;\n node: string;\n platform: string;\n arch: string;\n}\n\nexport const versionCommand = new Command(\"version\")\n .description(\"Show version information for AIGRC CLI and packages\")\n .option(\"--json\", \"Output version information as JSON\")\n .action(async (options: VersionCommandOptions) => {\n await runVersion(options);\n });\n\nasync function runVersion(options: VersionCommandOptions): Promise<void> {\n const versionInfo = await getVersionInfo();\n\n if (options.json) {\n console.log(JSON.stringify(versionInfo, null, 2));\n } else {\n printVersionText(versionInfo);\n }\n}\n\nasync function getVersionInfo(): Promise<VersionInfo> {\n // Get CLI version\n const cliVersion = await getPackageVersion(\"@aigrc/cli\");\n\n // Get core version\n const coreVersion = await getPackageVersion(\"@aigrc/core\");\n\n // Get Node.js version\n const nodeVersion = process.version.replace(\"v\", \"\");\n\n // Get platform info\n const platform = process.platform;\n const arch = process.arch;\n\n return {\n cli: cliVersion,\n core: coreVersion,\n node: nodeVersion,\n platform,\n arch,\n };\n}\n\nasync function getPackageVersion(packageName: string): Promise<string> {\n try {\n // Try to load package.json from the package\n const pkgPath = require.resolve(`${packageName}/package.json`);\n const pkgContent = await fs.readFile(pkgPath, \"utf-8\");\n const pkg = JSON.parse(pkgContent);\n return pkg.version || \"unknown\";\n } catch {\n // If not found, try to get from current package\n try {\n const currentPkgPath = path.join(process.cwd(), \"package.json\");\n const pkgContent = await fs.readFile(currentPkgPath, \"utf-8\");\n const pkg = JSON.parse(pkgContent);\n if (pkg.name === packageName) {\n return pkg.version || \"unknown\";\n }\n // Check dependencies\n if (pkg.dependencies?.[packageName]) {\n return pkg.dependencies[packageName].replace(\"^\", \"\").replace(\"~\", \"\");\n }\n if (pkg.devDependencies?.[packageName]) {\n return pkg.devDependencies[packageName].replace(\"^\", \"\").replace(\"~\", \"\");\n }\n } catch {\n // Ignore\n }\n return \"unknown\";\n }\n}\n\nfunction printVersionText(info: VersionInfo): void {\n console.log();\n console.log(chalk.cyan.bold(\"AIGRC Version Information\"));\n console.log(chalk.dim(\"─\".repeat(50)));\n console.log();\n console.log(`${chalk.dim(\"aigrc CLI:\")} ${chalk.bold(info.cli)}`);\n console.log(`${chalk.dim(\"@aigrc/core:\")} ${chalk.bold(info.core)}`);\n console.log(`${chalk.dim(\"Node.js:\")} ${chalk.bold(\"v\" + info.node)}`);\n console.log(`${chalk.dim(\"Platform:\")} ${chalk.bold(info.platform + \" \" + info.arch)}`);\n console.log();\n}\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","chalk","path","DEFAULT_CARDS_DIR","Command","chalk","path","fs","ora","Command","chalk","path","fs","loadAssetCard","classifyRisk","DEFAULT_CARDS_DIR","DEFAULT_CONFIG_FILE","Command","path","fileExists","chalk","fs","loadAssetCard","classifyRisk","getRiskLevelColor","Command","chalk","ora","path","loadAssetCard","extractGoldenThreadComponents","verifyGoldenThreadHashSync","Command","chalk","ora","path","loadAssetCard","extractGoldenThreadComponents","verifyGoldenThreadHashSync","Command","chalk","fs","path","Command","fs","path","chalk","Command","chalk","ora","YAML","Command","YAML","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"]}