.agents/skills/migrate-oxlint/SKILL.md
This skill guides you through migrating a JavaScript/TypeScript project from ESLint to Oxlint.
Oxlint is a high-performance linter that implements many popular ESLint rules natively in Rust. It can be used alongside ESLint or as a full replacement.
An official migration tool is available: @oxlint/migrate
Run the migration tool in the project root:
npx @oxlint/migrate
This reads your ESLint flat config and generates a .oxlintrc.json file.
| Option | Description |
|---|---|
--merge | Merge with an existing .oxlintrc.json instead of overwriting |
--type-aware | Include type-aware rules (requires running oxlint with --type-aware) |
--with-nursery | Include experimental rules still under development |
--js-plugins [bool] | Enable/disable ESLint plugin migration via jsPlugins (default: enabled) |
--details | List rules that could not be migrated |
--replace-eslint-comments | Convert // eslint-disable comments to // oxlint-disable |
--output-file <file> | Specify output path (default: .oxlintrc.json) |
If your ESLint config is not at the default location, pass the path explicitly:
npx @oxlint/migrate ./path/to/eslint.config.js
After migration, review the generated .oxlintrc.json.
The migration tool automatically maps ESLint plugins to oxlint's built-in equivalents. The following table is for reference when reviewing the generated config:
| ESLint Plugin | Oxlint Plugin Name |
|---|---|
@typescript-eslint/eslint-plugin | typescript |
eslint-plugin-react / eslint-plugin-react-hooks | react |
eslint-plugin-import / eslint-plugin-import-x | import |
eslint-plugin-unicorn | unicorn |
eslint-plugin-jsx-a11y | jsx-a11y |
eslint-plugin-react-perf | react-perf |
eslint-plugin-promise | promise |
eslint-plugin-jest | jest |
@vitest/eslint-plugin | vitest |
eslint-plugin-jsdoc | jsdoc |
eslint-plugin-next | nextjs |
eslint-plugin-node | node |
eslint-plugin-vue | vue |
Default plugins (enabled when plugins field is omitted): unicorn, typescript, oxc.
Setting the plugins array explicitly overrides these defaults.
Oxlint groups rules into categories for bulk configuration:
{
"categories": {
"correctness": "warn",
"suspicious": "warn"
}
}
Available categories: correctness (default: enabled), suspicious, pedantic, perf, style, restriction, nursery.
Individual rule settings in rules override category settings.
Run with --details to see which ESLint rules could not be migrated:
npx @oxlint/migrate --details
Review the output and decide whether to keep ESLint for those rules or find oxlint alternatives.
Some features require manual attention:
jsPluginseslint-plugin-prettier: Not supported. Use oxfmt insteadsettings in override configs: Oxlint does not support settings inside overrides blocks--js-pluginsFor ESLint plugins without a built-in oxlint equivalent, use the jsPlugins field to load them:
{
"jsPlugins": ["eslint-plugin-custom"],
"rules": {
"custom/my-rule": "warn"
}
}
Replace ESLint commands with oxlint. Path arguments are optional; oxlint defaults to the current working directory.
# Before
npx eslint src/
npx eslint --fix src/
# After
npx oxlint@latest
npx oxlint@latest --fix
| ESLint | oxlint |
|---|---|
eslint . | oxlint (default: cwd) |
eslint src/ | oxlint src/ |
eslint --fix | oxlint --fix |
eslint --max-warnings 0 | oxlint --deny-warnings or --max-warnings 0 |
eslint --format json | oxlint --format json |
eslint -c config.json | oxlint --config config.json |
Additional oxlint options:
--type-aware: Enable rules requiring TypeScript type information--tsconfig <path>: Specify tsconfig.json path for type-aware lintingcorrectness rules first (the default), then progressively add suspicious, pedantic, etc.// eslint-disable and // eslint-disable-next-line comments are supported by oxlint. Use --replace-eslint-comments to convert them to // oxlint-disable if desired.npx oxlint@latest --rules to see all supported rules."$schema": "./node_modules/oxlint/configuration_schema.json" to .oxlintrc.json for editor autocompletion.default, stylish, json, github, gitlab, junit, checkstyle, unix