// built-in skill: package compatibility check import type { RNXSkill } from '../types' export const skill: RNXSkill = { name: 'compat-check', description: 'Check package compatibility with rnx', type: 'review', version: '1.0.0', triggers: ['compatibility', 'compat', 'check package', 'supported packages'], tools: [ { name: 'check_compatibility', description: 'Scan project dependencies for rnx compatibility', parameters: { packageName: { type: 'string', description: 'Specific package to check (optional)', }, }, async execute(params, context) { const fs = await import('node:fs') const path = await import('node:path') const { COMPAT_RESULT_CAVEAT, formatPackageStatus, formatScanCounts, scanDeps } = await import('../../../../compat/src/web.ts') const packagePath = path.join(context.projectDir, 'package.json') if (!fs.existsSync(packagePath)) { return { success: false, message: 'No package.json found' } } const parsed: unknown = JSON.parse(fs.readFileSync(packagePath, 'utf8')) if (!parsed || typeof parsed !== 'object') { return { success: false, message: 'package.json is not an object' } } const dependencies = readDependencies(parsed) const scan = params.packageName ? scanDeps({ dependencies: { [params.packageName]: dependencies[params.packageName] ?? '*', }, }) : scanDeps(parsed) const packageResult = params.packageName ? scan.packages[0] : undefined const message = packageResult ? `${params.packageName}: ${formatPackageStatus(packageResult)}. ${COMPAT_RESULT_CAVEAT}` : `${formatScanCounts(scan)}. ${COMPAT_RESULT_CAVEAT}` const reportPath = path.join(context.outputDir, 'compat-report.json') fs.mkdirSync(path.dirname(reportPath), { recursive: true }) fs.writeFileSync(reportPath, `${JSON.stringify(scan, null, 2)}\n`) return { success: true, message, artifacts: [{ type: 'report', name: 'compat-report', path: reportPath }], data: scan, } }, }, ], } function readDependencies(value: object): Record { const dependencies = Reflect.get(value, 'dependencies') const devDependencies = Reflect.get(value, 'devDependencies') return { ...(dependencies && typeof dependencies === 'object' ? dependencies : {}), ...(devDependencies && typeof devDependencies === 'object' ? devDependencies : {}), } }