Skip to content

chore(deps): migrate eslint config to flat format for v10 compat#9222

Merged
jdx merged 2 commits intomainfrom
fix-eslint-flat-config
Apr 18, 2026
Merged

chore(deps): migrate eslint config to flat format for v10 compat#9222
jdx merged 2 commits intomainfrom
fix-eslint-flat-config

Conversation

@jdx
Copy link
Copy Markdown
Owner

@jdx jdx commented Apr 18, 2026

Summary

  • ESLint v10 bump in chore(deps): update dependency eslint to v10 #9200 broke mise run render:fig because v10 removed support for legacy .eslintrc.* configs and requires a flat eslint.config.js.
  • @fig/eslint-config-autocomplete is v8-only (peerDep caps at ^8.56.0, loads LegacyESLint which was removed in v10), so it's swapped out.
  • New eslint.config.mjs uses the modern unified typescript-eslint package + eslint-plugin-compat@7 (both support v10), and keeps the @withfig/fig-linter rules that were actually doing work (no-malicious-script, no-useless-insertvalue, no-empty-array-values, no-name-equals).
  • eslint --fix also removed an unused eslint-disable @withfig/fig-linter/conventional-descriptions directive from generators.ts and src/mise.ts; the re-render is stable.

Test plan

  • mise run render:fig completes cleanly locally
  • Re-running mise run render:fig produces no further diff (idempotent)
  • bun run lint-fig exits 0
  • pre-commit hooks (prettier, cargo-fmt, etc.) all pass

🤖 Generated with Claude Code


Note

Low Risk
Low risk: changes are limited to development lint tooling/config and dependency updates, though misconfiguration could cause lint-fig/render:fig to fail in CI.

Overview
Switches ESLint configuration to the v10 flat config by removing .eslintrc.cjs and adding eslint.config.mjs scoped to xtasks/fig/**/*.ts, using typescript-eslint, eslint-plugin-compat, and @withfig/eslint-plugin-fig-linter rules.

Updates package.json/bun.lock to drop @fig/eslint-config-autocomplete, add the new lint deps, and bumps related transitive packages; also removes now-unnecessary eslint-disable directives in the Fig generator sources.

Reviewed by Cursor Bugbot for commit 4c3a66f. Bugbot is set up for automated code reviews on this repo. Configure here.

ESLint v10 removed support for the legacy .eslintrc.* format, so
render:fig was failing with "ESLint couldn't find an eslint.config file"
after the v10 bump in #9200. @fig/eslint-config-autocomplete is
eslint-v8-only (its v2.0.0 peerDep caps at ^8.56.0 and it still imports
LegacyESLint which is gone in v10), so swap it for a flat config that
uses the modern typescript-eslint package, eslint-plugin-compat v7, and
keeps the fig-linter rules we were actually using.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@socket-security
Copy link
Copy Markdown

socket-security Bot commented Apr 18, 2026

Review the following changes in direct dependencies. Learn more about Socket for GitHub.

Diff Package Supply Chain
Security
Vulnerability Quality Maintenance License
Addednpm/​@​withfig/​eslint-plugin-fig-linter@​1.4.1871007085100
Addednpm/​typescript-eslint@​8.58.21001007498100
Addednpm/​eslint-plugin-compat@​7.0.19910010089100

View full report

Copy link
Copy Markdown
Contributor

@gemini-code-assist gemini-code-assist Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request migrates the project to a flat ESLint configuration by introducing eslint.config.mjs and updating dependencies, including the addition of typescript-eslint and eslint-plugin-compat. Feedback indicates that @withfig/eslint-plugin-fig-linter is missing from devDependencies despite being used in the new configuration. Additionally, it is recommended to avoid disabling core safety rules such as no-var and no-unused-vars globally within the ESLint configuration.

Comment thread package.json
"@types/node": "^25.0.0",
"@withfig/autocomplete-tools": "^2.11.0",
"@withfig/autocomplete-types": "^1.31.0",
"eslint": "^10.0.0",
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

critical

The package @withfig/eslint-plugin-fig-linter is imported in eslint.config.mjs but is missing from devDependencies. It was previously a transitive dependency of @fig/eslint-config-autocomplete, which has been removed. This will cause the linting process to fail because the module cannot be found.

Suggested change
"eslint": "^10.0.0",
"@withfig/eslint-plugin-fig-linter": "^1.4.1",
"eslint": "^10.0.0",

Comment thread eslint.config.mjs
Comment on lines +24 to +26
"no-unused-vars": "off",
"no-var": "off",
"@typescript-eslint/no-unused-vars": "off",
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

Disabling no-unused-vars, no-var, and @typescript-eslint/no-unused-vars globally for these files reduces code quality and safety. It is recommended to keep these rules enabled to prevent the use of legacy var declarations and to identify dead code. If certain variables must remain unused, consider prefixing them with an underscore (e.g., _unused) and configuring the rule to ignore that pattern, or use specific inline disable comments where necessary.

Suggested change
"no-unused-vars": "off",
"no-var": "off",
"@typescript-eslint/no-unused-vars": "off",
rules: {
"@typescript-eslint/explicit-module-boundary-types": "off",
"@withfig/fig-linter/no-malicious-script": "error",
},

@greptile-apps
Copy link
Copy Markdown
Contributor

greptile-apps Bot commented Apr 18, 2026

Greptile Summary

Migrates the Fig completion linting setup from the legacy .eslintrc.cjs format (which relied on @fig/eslint-config-autocomplete, incompatible with ESLint v10) to a flat eslint.config.mjs using typescript-eslint + eslint-plugin-compat@7 + @withfig/eslint-plugin-fig-linter. The four active fig-linter rules are preserved, the now-redundant eslint-disable directives in generators.ts and src/mise.ts are cleaned up, and package.json/bun.lock are updated accordingly.

Confidence Score: 5/5

Safe to merge — tooling-only change with no runtime impact and all findings are P2 or lower.

All changed files are dev tooling (ESLint config, lockfile, fig generator source cleanup). The previous P1 concern about the missing @withfig/eslint-plugin-fig-linter dependency has been addressed. TypeScript 6.0.3 satisfies the typescript-eslint peer dep constraint (>=4.8.4 <6.1.0). No runtime code is affected.

No files require special attention.

Important Files Changed

Filename Overview
eslint.config.mjs New flat ESLint config targeting xtasks/fig/**/*.ts; correctly imports the three new packages and preserves the four fig-linter rules; split into two blocks mirrors old rule scoping.
package.json Removes @fig/eslint-config-autocomplete and adds @withfig/eslint-plugin-fig-linter, eslint-plugin-compat@^7, and typescript-eslint@^8.58.2 as explicit devDependencies.
.eslintrc.cjs Deleted legacy config that extended @fig/eslint-config-autocomplete; fully replaced by eslint.config.mjs.
xtasks/fig/generators.ts Removed now-redundant eslint-disable @withfig/fig-linter/conventional-descriptions directive; no logic changes.
xtasks/fig/src/mise.ts Same as generators.ts — stale eslint-disable comment removed; no logic changes.
bun.lock Lockfile updated to reflect removed/added packages; @typescript-eslint/* bumped from v7 to v8; minor transitive dep pruning (globby, graphemer, slash, etc.).

Flowchart

%%{init: {'theme': 'neutral'}}%%
flowchart TD
    A["mise run render:fig"] --> B["bun run lint-fig"]
    B --> C["eslint.config.mjs"]
    C --> D["typescript-eslint v8 recommended"]
    C --> E["eslint-plugin-compat v7 flat/recommended"]
    C --> F["@withfig/eslint-plugin-fig-linter rules"]
    F --> F1["no-malicious-script"]
    F --> F2["no-useless-insertvalue"]
    F --> F3["no-empty-array-values"]
    F --> F4["no-name-equals"]
    C --> G["xtasks/fig/**/*.ts"]
    G --> H["generators.ts"]
    G --> I["src/mise.ts"]
Loading

Reviews (2): Last reviewed commit: "chore(deps): add @withfig/eslint-plugin-..." | Re-trigger Greptile

Comment thread eslint.config.mjs
@@ -0,0 +1,38 @@
import compat from "eslint-plugin-compat";
import figLinter from "@withfig/eslint-plugin-fig-linter";
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Missing dependency for @withfig/eslint-plugin-fig-linter

@withfig/eslint-plugin-fig-linter is imported here but is not listed in package.json devDependencies and has been removed from bun.lock. Any developer running bun install from scratch will get a module-not-found error when bun run lint-fig (or mise run render:fig) hits this import. The package needs to be added explicitly since it was previously a transitive dependency of @fig/eslint-config-autocomplete (now removed).

Add "@withfig/eslint-plugin-fig-linter": "^1.4.1" to devDependencies in package.json and regenerate the lockfile.

Fix in Claude Code

Copy link
Copy Markdown

@cursor cursor Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit d2a74f6. Configure here.

Comment thread eslint.config.mjs
@github-actions
Copy link
Copy Markdown

github-actions Bot commented Apr 18, 2026

Hyperfine Performance

mise x -- echo

Command Mean [ms] Min [ms] Max [ms] Relative
mise-2026.4.16 x -- echo 21.7 ± 0.4 20.8 24.4 1.00
mise x -- echo 22.4 ± 0.7 21.3 29.1 1.03 ± 0.04

mise env

Command Mean [ms] Min [ms] Max [ms] Relative
mise-2026.4.16 env 21.2 ± 0.6 20.4 27.7 1.00
mise env 21.7 ± 0.4 20.8 23.8 1.02 ± 0.04

mise hook-env

Command Mean [ms] Min [ms] Max [ms] Relative
mise-2026.4.16 hook-env 22.1 ± 0.4 21.3 24.5 1.00
mise hook-env 22.6 ± 0.6 21.4 26.7 1.02 ± 0.03

mise ls

Command Mean [ms] Min [ms] Max [ms] Relative
mise-2026.4.16 ls 19.3 ± 0.5 18.4 21.0 1.00
mise ls 20.0 ± 0.5 18.8 21.5 1.03 ± 0.03

xtasks/test/perf

Command mise-2026.4.16 mise Variance
install (cached) 143ms 148ms -3%
ls (cached) 76ms 77ms -1%
bin-paths (cached) 80ms 82ms -2%
task-ls (cached) 794ms 797ms +0%

Previously pulled in transitively via @fig/eslint-config-autocomplete
which this PR removed. Without an explicit entry, fresh installs fail
with module-not-found when eslint.config.mjs imports it.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@jdx jdx enabled auto-merge (squash) April 18, 2026 01:26
@jdx jdx merged commit e83a86d into main Apr 18, 2026
37 checks passed
@jdx jdx deleted the fix-eslint-flat-config branch April 18, 2026 01:30
jdx pushed a commit that referenced this pull request Apr 18, 2026
### 🐛 Bug Fixes

- **(backend)** respect install_before in latest lookup by @risu729 in
[#9193](#9193)
- **(backend)** route explicit latest through stable lookup by @risu729
in [#9228](#9228)
- **(backends)** deprecate b shorthand by @risu729 in
[#9234](#9234)
- **(config)** warn for deprecated env keys by @risu729 in
[#9205](#9205)
- **(config)** treat enable_tools empty as disable-all by @risu729 in
[#9108](#9108)
- **(github)** avoid auth on release asset downloads by @risu729 in
[#9060](#9060)
- **(gitlab)** warn when glab OAuth2 token is expired by @stanhu in
[#9195](#9195)
- **(npm)** honor install_before without day drift by @risu729 in
[#9157](#9157)
- **(npm)** warn on old bun and pnpm for install_before by @risu729 in
[#9232](#9232)
- **(pipx)** honor install_before for uv and pipx installs by @risu729
in [#9190](#9190)
- **(registry)** allow shfmt on Windows by @zeitlinger in
[#9191](#9191)

### 🚜 Refactor

- **(backend)** remove unused rolling release helper by @risu729 in
[#9175](#9175)
- **(backend)** use file util for removals by @risu729 in
[#9206](#9206)

### 📚 Documentation

- **(config)** clarify always_keep_download behavior by @risu729 in
[#9235](#9235)
- **(configuration)** add rust to idiomatic version files by @jjt in
[#9233](#9233)
- **(contributing)** expand contribution guide introduction by
@marianwolf in [#9208](#9208)
- **(github)** document multiple release assets workaround by @risu729
in [#9236](#9236)

### 📦️ Dependency Updates

- update actions/setup-node action to v6 by @renovate[bot] in
[#9183](#9183)
- update dependency @types/node to v25 by @renovate[bot] in
[#9187](#9187)
- update crazy-max/ghaction-import-gpg action to v7 by @renovate[bot] in
[#9186](#9186)
- update actions/cache action to v5 by @renovate[bot] in
[#9181](#9181)
- update amannn/action-semantic-pull-request action to v6 by
@renovate[bot] in [#9184](#9184)
- update apple-actions/import-codesign-certs action to v6 by
@renovate[bot] in [#9185](#9185)
- update dependency eslint to v10 by @renovate[bot] in
[#9200](#9200)
- update dependency toml to v4 by @renovate[bot] in
[#9201](#9201)
- update rust crate reqwest to 0.13 by @renovate[bot] in
[#9171](#9171)
- update ghcr.io/jdx/mise:deb docker digest to 523d826 by @renovate[bot]
in [#9198](#9198)
- update ghcr.io/jdx/mise:alpine docker digest to 05617e0 by
@renovate[bot] in [#9196](#9196)
- update ghcr.io/jdx/mise:rpm docker digest to c1992f9 by @renovate[bot]
in [#9199](#9199)
- update ghcr.io/jdx/mise:copr docker digest to 90db6cd by
@renovate[bot] in [#9197](#9197)
- update taiki-e/install-action digest to 58e8625 by @renovate[bot] in
[#9209](#9209)
- update fedora docker tag to v45 by @renovate[bot] in
[#9213](#9213)
- update docker/setup-buildx-action action to v4 by @renovate[bot] in
[#9212](#9212)
- update docker/metadata-action action to v6 by @renovate[bot] in
[#9211](#9211)
- update docker/login-action action to v4 by @renovate[bot] in
[#9210](#9210)
- update dependency typescript to v6 by @renovate[bot] in
[#9202](#9202)
- update docker/build-push-action action to v7 by @renovate[bot] in
[#9203](#9203)
- update github artifact actions (major) by @renovate[bot] in
[#9215](#9215)
- update rust crate duct to v1 by @renovate[bot] in
[#9220](#9220)
- update rust crate demand to v2 by @renovate[bot] in
[#9219](#9219)
- update rust crate clx to v2 by @renovate[bot] in
[#9218](#9218)
- update nick-fields/retry action to v4 by @renovate[bot] in
[#9217](#9217)
- update jdx/mise-action action to v4 by @renovate[bot] in
[#9216](#9216)
- update rust crate self_update to 0.44 by @renovate[bot] in
[#9174](#9174)
- migrate eslint config to flat format for v10 compat by @jdx in
[#9222](#9222)
- update actions/checkout action to v6 by @renovate[bot] in
[#9182](#9182)
- update rust crate toml to v1 by @renovate[bot] in
[#9225](#9225)
- update rust crate versions to v7 by @renovate[bot] in
[#9226](#9226)
- update rust crate which to v8 by @renovate[bot] in
[#9227](#9227)
- update rust crate rmcp to v1 by @renovate[bot] in
[#9221](#9221)

### 📦 Registry

- add sheldon by @3w36zj6 in
[#9104](#9104)
- add pocketbase by @ranfdev in
[#9123](#9123)
- add worktrunk ([aqua:max-sixty/worktrunk,
cargo:worktrunk](https://github.com/max-sixty/worktrunk,
cargo:worktrunk))#1 by @edouardr in
[#8796](#8796)
- add dependency-check
([aqua:dependency-check/DependencyCheck](https://github.com/dependency-check/DependencyCheck))
by @kapitoshka438 in [#9204](#9204)
- add janet by @ranfdev in
[#9241](#9241)

### New Contributors

- @ranfdev made their first contribution in
[#9241](#9241)
- @jjt made their first contribution in
[#9233](#9233)
- @marianwolf made their first contribution in
[#9208](#9208)
- @edouardr made their first contribution in
[#8796](#8796)

## 📦 Aqua Registry Updates

#### New Packages (3)

- [`LargeModGames/spotatui`](https://github.com/LargeModGames/spotatui)
-
[`android-sms-gateway/cli`](https://github.com/android-sms-gateway/cli)
- [`velero-io/velero`](https://github.com/velero-io/velero)

#### Updated Packages (1)

- [`skim-rs/skim`](https://github.com/skim-rs/skim)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant