Skip to content

linter: circular config extends crashes oxlint LSP without a useful error #24099

Description

@nelsonlaidev

What version of Oxlint are you using?

1.72.0

What command did you run?

No response

What does your .oxlintrc.json (or oxlint.config.ts) config file look like?

.oxlintrc.json:

{
  "$schema": "./node_modules/oxlint/configuration_schema.json",
  "extends": ["./a.json"]
}

a.json:

{
  "extends": ["./b.json"]
}

b.json:

{
  "extends": ["./a.json"]
}

What happened?

Description

Oxlint crashes with SIGILL when config files contain circular extends.

Instead of reporting a configuration error, the process is killed with an invalid machine instruction. This makes the root cause hard to discover, especially when the same config graph is loaded through the language server.

Expected behavior

Oxlint should detect circular config extends and report a clear error, for example:

Circular oxlint config extends detected:
a.json
 -> b.json
 -> a.json

Referenced from:
.oxlintrc.json
 -> a.json

The CLI and language server should not crash.

Actual behavior

Running Oxlint on a project with circular config extends crashes:

➜  oxlint-circular-lsp-test pnpm oxlint
[ERR_PNPM_RECURSIVE_EXEC_FIRST_FAIL] Command was killed with SIGILL (Invalid machine instruction): oxlint

Running the language server directly does not print a useful diagnostic:

➜  oxlint-circular-lsp-test pnpm oxlint --lsp
^C

When this is triggered through the VS Code extension, the language server can fail without making it clear that the root cause is a circular config extends chain.

VSCode extension output
2026-07-03 13:27:04.357 [info] Searching for oxlint binary.
2026-07-03 13:27:04.870 [info] Using server binary at: /Users/nelson/Developer/playground/oxlint-circular-lsp-test/node_modules/.bin/oxlint
2026-07-03 13:27:04.934 [error] 2026-07-03T05:27:04.906687Z  INFO oxc_language_server::backend: initialize: Some([WorkspaceOption { workspace_uri: Uri(Uri { scheme: "file", authority: Some(Authority { userinfo: None, host: "", host_parsed: RegName(""), port: None }), path: "/Users/nelson/Developer/playground/oxlint-circular-lsp-test", query: None, fragment: None }), options: Object {"disableNestedConfig": Bool(false), "run": String("onType"), "flags": Object {"disable_nested_config": String("false")}} }])
2026-07-03 13:27:04.934 [error] 2026-07-03T05:27:04.906700Z  INFO oxc_language_server::backend: oxlint version: 1.72.0
2026-07-03 13:27:05.240 [error] Server process exited with signal SIGILL.
2026-07-03 13:27:05.241 [error] Server initialization failed.
  Message: Pending response rejected since connection got disposed
  Code: -32097 
2026-07-03 13:27:05.241 [info] Connection to server got closed. Server will restart.
2026-07-03 13:27:05.241 [error] oxc client: couldn't create connection to server.
  Message: Pending response rejected since connection got disposed
  Code: -32097 
2026-07-03 13:27:05.500 [error] 2026-07-03T05:27:05.480323Z  INFO oxc_language_server::backend: initialize: Some([WorkspaceOption { workspace_uri: Uri(Uri { scheme: "file", authority: Some(Authority { userinfo: None, host: "", host_parsed: RegName(""), port: None }), path: "/Users/nelson/Developer/playground/oxlint-circular-lsp-test", query: None, fragment: None }), options: Object {"disableNestedConfig": Bool(false), "run": String("onType"), "flags": Object {"disable_nested_config": String("false")}} }])
2026-07-03 13:27:05.500 [error] 2026-07-03T05:27:05.480336Z  INFO oxc_language_server::backend: oxlint version: 1.72.0
2026-07-03 13:27:05.550 [error] Server process exited with signal SIGILL.
2026-07-03 13:27:05.554 [error] Server initialization failed.
  Message: Pending response rejected since connection got disposed
  Code: -32097 
2026-07-03 13:27:05.554 [info] Connection to server got closed. Server will restart.
2026-07-03 13:27:05.554 [error] oxc client: couldn't create connection to server.
  Message: Pending response rejected since connection got disposed
  Code: -32097 
2026-07-03 13:27:05.594 [error] 2026-07-03T05:27:05.593733Z  INFO oxc_language_server::backend: initialize: Some([WorkspaceOption { workspace_uri: Uri(Uri { scheme: "file", authority: Some(Authority { userinfo: None, host: "", host_parsed: RegName(""), port: None }), path: "/Users/nelson/Developer/playground/oxlint-circular-lsp-test", query: None, fragment: None }), options: Object {"disableNestedConfig": Bool(false), "run": String("onType"), "flags": Object {"disable_nested_config": String("false")}} }])
2026-07-03 13:27:05.594 [error] 2026-07-03T05:27:05.593746Z  INFO oxc_language_server::backend: oxlint version: 1.72.0
2026-07-03 13:27:05.665 [error] Server process exited with signal SIGILL.
2026-07-03 13:27:05.666 [error] Server initialization failed.
  Message: Pending response rejected since connection got disposed
  Code: -32097 
2026-07-03 13:27:05.666 [info] Connection to server got closed. Server will restart.
2026-07-03 13:27:05.666 [error] oxc client: couldn't create connection to server.
  Message: Pending response rejected since connection got disposed
  Code: -32097 
2026-07-03 13:27:05.666 [error] Restarting server failed
  Message: Pending response rejected since connection got disposed
  Code: -32097 
2026-07-03 13:27:05.704 [error] 2026-07-03T05:27:05.704021Z  INFO oxc_language_server::backend: initialize: Some([WorkspaceOption { workspace_uri: Uri(Uri { scheme: "file", authority: Some(Authority { userinfo: None, host: "", host_parsed: RegName(""), port: None }), path: "/Users/nelson/Developer/playground/oxlint-circular-lsp-test", query: None, fragment: None }), options: Object {"disableNestedConfig": Bool(false), "run": String("onType"), "flags": Object {"disable_nested_config": String("false")}} }])
2026-07-03 13:27:05.704 [error] 2026-07-03T05:27:05.704037Z  INFO oxc_language_server::backend: oxlint version: 1.72.0
2026-07-03 13:27:05.897 [error] Server process exited with signal SIGILL.
2026-07-03 13:27:05.897 [error] Server initialization failed.
  Message: Pending response rejected since connection got disposed
  Code: -32097 
2026-07-03 13:27:05.897 [info] Connection to server got closed. Server will restart.
2026-07-03 13:27:05.897 [error] oxc client: couldn't create connection to server.
  Message: Pending response rejected since connection got disposed
  Code: -32097 
2026-07-03 13:27:05.897 [error] Restarting server failed
  Message: Pending response rejected since connection got disposed
  Code: -32097 
2026-07-03 13:27:05.948 [error] 2026-07-03T05:27:05.948857Z  INFO oxc_language_server::backend: initialize: Some([WorkspaceOption { workspace_uri: Uri(Uri { scheme: "file", authority: Some(Authority { userinfo: None, host: "", host_parsed: RegName(""), port: None }), path: "/Users/nelson/Developer/playground/oxlint-circular-lsp-test", query: None, fragment: None }), options: Object {"disableNestedConfig": Bool(false), "run": String("onType"), "flags": Object {"disable_nested_config": String("false")}} }])
2026-07-03 13:27:05.948 [error] 2026-07-03T05:27:05.948870Z  INFO oxc_language_server::backend: oxlint version: 1.72.0
2026-07-03 13:27:06.013 [error] Server process exited with signal SIGILL.
2026-07-03 13:27:06.013 [error] Server initialization failed.
  Message: Pending response rejected since connection got disposed
  Code: -32097 
2026-07-03 13:27:06.013 [error] The oxc server crashed 5 times in the last 3 minutes. The server will not be restarted. See the output for more information.
2026-07-03 13:27:06.013 [error] oxc client: couldn't create connection to server.
  Message: Pending response rejected since connection got disposed
  Code: -32097 
2026-07-03 13:27:06.013 [error] Restarting server failed
  Message: Pending response rejected since connection got disposed
  Code: -32097 
2026-07-03 13:27:20.348 [info] Searching for oxlint binary.
2026-07-03 13:27:20.841 [info] Using server binary at: /Users/nelson/Developer/playground/oxlint-circular-lsp-test/node_modules/.bin/oxlint
2026-07-03 13:27:20.889 [error] 2026-07-03T05:27:20.876812Z  INFO oxc_language_server::backend: initialize: Some([WorkspaceOption { workspace_uri: Uri(Uri { scheme: "file", authority: Some(Authority { userinfo: None, host: "", host_parsed: RegName(""), port: None }), path: "/Users/nelson/Developer/playground/oxlint-circular-lsp-test", query: None, fragment: None }), options: Object {"disableNestedConfig": Bool(false), "run": String("onType"), "flags": Object {"disable_nested_config": String("false")}} }])
2026-07-03 13:27:20.889 [error] 2026-07-03T05:27:20.876826Z  INFO oxc_language_server::backend: oxlint version: 1.72.0
2026-07-03 13:27:21.371 [error] Server process exited with signal SIGILL.
2026-07-03 13:27:21.371 [error] Server initialization failed.
  Message: Pending response rejected since connection got disposed
  Code: -32097 
2026-07-03 13:27:21.371 [info] Connection to server got closed. Server will restart.
2026-07-03 13:27:21.371 [error] oxc client: couldn't create connection to server.
  Message: Pending response rejected since connection got disposed
  Code: -32097 
2026-07-03 13:27:21.483 [error] 2026-07-03T05:27:21.471089Z  INFO oxc_language_server::backend: initialize: Some([WorkspaceOption { workspace_uri: Uri(Uri { scheme: "file", authority: Some(Authority { userinfo: None, host: "", host_parsed: RegName(""), port: None }), path: "/Users/nelson/Developer/playground/oxlint-circular-lsp-test", query: None, fragment: None }), options: Object {"disableNestedConfig": Bool(false), "run": String("onType"), "flags": Object {"disable_nested_config": String("false")}} }])
2026-07-03 13:27:21.483 [error] 2026-07-03T05:27:21.471101Z  INFO oxc_language_server::backend: oxlint version: 1.72.0
2026-07-03 13:27:21.536 [error] Server process exited with signal SIGILL.
2026-07-03 13:27:21.536 [error] Server initialization failed.
  Message: Pending response rejected since connection got disposed
  Code: -32097 
2026-07-03 13:27:21.536 [info] Connection to server got closed. Server will restart.
2026-07-03 13:27:21.536 [error] oxc client: couldn't create connection to server.
  Message: Pending response rejected since connection got disposed
  Code: -32097 
2026-07-03 13:27:21.578 [error] 2026-07-03T05:27:21.578226Z  INFO oxc_language_server::backend: initialize: Some([WorkspaceOption { workspace_uri: Uri(Uri { scheme: "file", authority: Some(Authority { userinfo: None, host: "", host_parsed: RegName(""), port: None }), path: "/Users/nelson/Developer/playground/oxlint-circular-lsp-test", query: None, fragment: None }), options: Object {"disableNestedConfig": Bool(false), "run": String("onType"), "flags": Object {"disable_nested_config": String("false")}} }])
2026-07-03 13:27:21.578 [error] 2026-07-03T05:27:21.578241Z  INFO oxc_language_server::backend: oxlint version: 1.72.0
2026-07-03 13:27:21.639 [error] Server process exited with signal SIGILL.
2026-07-03 13:27:21.640 [error] Server initialization failed.
  Message: Pending response rejected since connection got disposed
  Code: -32097 
2026-07-03 13:27:21.640 [info] Connection to server got closed. Server will restart.
2026-07-03 13:27:21.640 [error] oxc client: couldn't create connection to server.
  Message: Pending response rejected since connection got disposed
  Code: -32097 
2026-07-03 13:27:21.640 [error] Restarting server failed
  Message: Pending response rejected since connection got disposed
  Code: -32097 
2026-07-03 13:27:21.678 [error] 2026-07-03T05:27:21.678055Z  INFO oxc_language_server::backend: initialize: Some([WorkspaceOption { workspace_uri: Uri(Uri { scheme: "file", authority: Some(Authority { userinfo: None, host: "", host_parsed: RegName(""), port: None }), path: "/Users/nelson/Developer/playground/oxlint-circular-lsp-test", query: None, fragment: None }), options: Object {"disableNestedConfig": Bool(false), "run": String("onType"), "flags": Object {"disable_nested_config": String("false")}} }])
2026-07-03 13:27:21.678 [error] 2026-07-03T05:27:21.678070Z  INFO oxc_language_server::backend: oxlint version: 1.72.0
2026-07-03 13:27:21.870 [error] Server process exited with signal SIGILL.
2026-07-03 13:27:21.870 [error] Server initialization failed.
  Message: Pending response rejected since connection got disposed
  Code: -32097 
2026-07-03 13:27:21.870 [info] Connection to server got closed. Server will restart.
2026-07-03 13:27:21.870 [error] oxc client: couldn't create connection to server.
  Message: Pending response rejected since connection got disposed
  Code: -32097 
2026-07-03 13:27:21.870 [error] Restarting server failed
  Message: Pending response rejected since connection got disposed
  Code: -32097 
2026-07-03 13:27:21.912 [error] 2026-07-03T05:27:21.912700Z  INFO oxc_language_server::backend: initialize: Some([WorkspaceOption { workspace_uri: Uri(Uri { scheme: "file", authority: Some(Authority { userinfo: None, host: "", host_parsed: RegName(""), port: None }), path: "/Users/nelson/Developer/playground/oxlint-circular-lsp-test", query: None, fragment: None }), options: Object {"disableNestedConfig": Bool(false), "run": String("onType"), "flags": Object {"disable_nested_config": String("false")}} }])
2026-07-03 13:27:21.912 [error] 2026-07-03T05:27:21.912715Z  INFO oxc_language_server::backend: oxlint version: 1.72.0
2026-07-03 13:27:21.974 [error] Server initialization failed.
  Message: Pending response rejected since connection got disposed
  Code: -32097 
2026-07-03 13:27:21.974 [error] The oxc server crashed 5 times in the last 3 minutes. The server will not be restarted. See the output for more information.
2026-07-03 13:27:21.974 [error] oxc client: couldn't create connection to server.
  Message: Pending response rejected since connection got disposed
  Code: -32097 
2026-07-03 13:27:21.974 [error] Restarting server failed
  Message: Pending response rejected since connection got disposed
  Code: -32097 
2026-07-03 13:27:21.974 [error] Server process exited with signal SIGILL.

Minimal reproduction

Project structure:

.
├── .oxlintrc.json
├── a.json
├── b.json
└── pnpm-lock.yaml

Create two new Oxlint config files that extend each other:

.oxlintrc.json:

{
  "$schema": "./node_modules/oxlint/configuration_schema.json",
  "extends": ["./a.json"]
}

a.json:

{
  "extends": ["./b.json"]
}

b.json:

{
  "extends": ["./a.json"]
}

Then run:

pnpm oxlint

Environment

  • OS: macOS arm64
  • Node: darwin arm64
  • oxlint: 1.72.0
  • Package manager: pnpm

Notes

This seems to be a config resolution issue in Oxlint itself, since the CLI crashes with SIGILL. The VS Code language server issue appears to be a downstream effect when the same circular config graph is loaded through oxlint --lsp.

Metadata

Metadata

Assignees

Labels

Type

Fields

Priority

None yet

Effort

None yet

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions