@aigrc/cli 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +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"]}
package/package.json ADDED
@@ -0,0 +1,68 @@
1
+ {
2
+ "name": "@aigrc/cli",
3
+ "version": "0.1.0",
4
+ "description": "CLI for AIGRC - AI Governance, Risk, Compliance",
5
+ "license": "Apache-2.0",
6
+ "author": "AIGRC <contact@aigrc.dev>",
7
+ "homepage": "https://github.com/aigrc/aigrc#readme",
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "git+https://github.com/aigrc/aigrc.git",
11
+ "directory": "packages/cli"
12
+ },
13
+ "bugs": {
14
+ "url": "https://github.com/aigrc/aigrc/issues"
15
+ },
16
+ "keywords": [
17
+ "aigrc",
18
+ "ai-governance",
19
+ "risk-management",
20
+ "compliance",
21
+ "eu-ai-act",
22
+ "nist-ai-rmf",
23
+ "iso-42001",
24
+ "cli",
25
+ "command-line"
26
+ ],
27
+ "engines": {
28
+ "node": ">=18.0.0"
29
+ },
30
+ "publishConfig": {
31
+ "access": "public"
32
+ },
33
+ "type": "module",
34
+ "bin": {
35
+ "aigrc": "./dist/aigrc.js"
36
+ },
37
+ "main": "./dist/index.js",
38
+ "types": "./dist/index.d.ts",
39
+ "exports": {
40
+ ".": {
41
+ "types": "./dist/index.d.ts",
42
+ "import": "./dist/index.js"
43
+ }
44
+ },
45
+ "files": ["dist"],
46
+ "scripts": {
47
+ "build": "tsup",
48
+ "dev": "tsup --watch",
49
+ "start": "node dist/aigrc.js",
50
+ "typecheck": "tsc --noEmit",
51
+ "clean": "rimraf dist"
52
+ },
53
+ "dependencies": {
54
+ "@aigrc/core": "^0.1.0",
55
+ "commander": "^12.1.0",
56
+ "chalk": "^5.3.0",
57
+ "ora": "^8.1.0",
58
+ "inquirer": "^9.3.0",
59
+ "yaml": "^2.3.4"
60
+ },
61
+ "devDependencies": {
62
+ "@types/inquirer": "^9.0.7",
63
+ "@types/node": "^20.10.0",
64
+ "rimraf": "^5.0.0",
65
+ "tsup": "^8.0.1",
66
+ "typescript": "^5.3.0"
67
+ }
68
+ }