@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 +879 -211
- package/dist/aigrc.js.map +1 -1
- package/dist/index.js +507 -94
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../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"],"sourcesContent":["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"],"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"]}
|
|
1
|
+
{"version":3,"sources":["../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"],"sourcesContent":["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"],"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"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aigrc/cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "CLI for AIGRC - AI Governance, Risk, Compliance",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"author": "AIGRC <contact@aigrc.dev>",
|
|
@@ -51,7 +51,7 @@
|
|
|
51
51
|
"clean": "rimraf dist"
|
|
52
52
|
},
|
|
53
53
|
"dependencies": {
|
|
54
|
-
"@aigrc/core": "^0.
|
|
54
|
+
"@aigrc/core": "^0.2.0",
|
|
55
55
|
"commander": "^12.1.0",
|
|
56
56
|
"chalk": "^5.3.0",
|
|
57
57
|
"ora": "^8.1.0",
|