Skip to content

feat(linter): add the @nx/oxlint plugin - #36491

Merged
FrozenPandaz merged 189 commits into
masterfrom
feature/nxc-4312-add-oxlint-plugin
Aug 11, 2026
Merged

feat(linter): add the @nx/oxlint plugin#36491
FrozenPandaz merged 189 commits into
masterfrom
feature/nxc-4312-add-oxlint-plugin

Conversation

@FrozenPandaz

@FrozenPandaz FrozenPandaz commented Jul 28, 2026

Copy link
Copy Markdown
Contributor

Current Behavior

@nx/oxlint resides in the nx-labs repository, shipping on its own cadence and unavailable through generators. No Nx generator offers an option to request an Oxlint project.

Additionally, the linter option has never reflected workspace choices. Every generator carried static JSON-schema defaults, so nx g @nx/react:lib in an Oxlint-adopting workspace still produced ESLint projects. Workspaces created with --linter=none had ESLint inferred on first generator run without explicit flags. Plugin workspace creation ignored the choice entirely—@nx/plugin:preset hardcoded ESLint.

Expected Behavior

@nx/oxlint graduates into packages/oxlint, shipping experimental. Additions include an inference plugin detecting Oxlint from config files, a configuration generator, and a bridge enabling Nx's enforce-module-boundaries rule under Oxlint's JS-plugin API.

Project generators now follow workspace linter preferences. The new detectLinters function reads the workspace and returns every linter it has, most-preferred first, so [0] is the one a generator should follow:

Workspace State Result
Has oxlint Oxlint
Has eslint ESLint
Has neither None

Previously, detection only distinguished between Oxlint and ESLint, collapsing "uses ESLint" and "uses nothing" into one category.

Verification involved 17 generators tested against all three workspace configurations without --linter flags—51/51 matched workspace preferences. An additional 25-generator sweep confirmed detection never overrides explicit requests.

Breaking-ish Changes

  • detectLinters replaces four hand-rolled isEslintInstalled helpers. Those probed require('eslint'), which resolves from the generator's own scope; eslint is a peer dependency of several first-party plugins, so they returned true in workspaces that do not use it. detectLinters reads the tree and is exported through @nx/js/internal.

  • 12 generators declare linter as optional on input schema.d.ts where previously required, though required on NormalizedSchema. This is strictly more permissive; missing resolution now becomes a compile error rather than silent failure.

  • Non-interactive nx g <framework>:app|lib in linter-free workspaces now generates no linter, where previously ESLint was generated. User-visible on paths unrelated to Oxlint; warrants a release note.

  • Generators no longer ask which linter to use when the workspace already has one. Following the workspace is not a question; the prompt is reserved for a workspace with no linter, where there is a real choice. Pass --linter to override. Cost: opting a single project out interactively now needs --linter=none.

  • The linter prompt moved from schemas into every generator. Previously, JSON x-prompt always highlighted the first enum value regardless of workspace setup. Generators now resolve through normalizeLinterOption.

  • @nx/angular:host resolves the linter once for host and remotes. Angular's normalizeOptions returns a new object, so resolved values never reached callers—each delegation resolved independently, allowing divergent answers.

  • create-nx-plugin now prompts for Nx Cloud in an interactive terminal. Declaring --interactive (below) also un-skips determineNxCloud, which read the same flag. The prompt was never a decision to omit—it was dead because the flag did not exist—and this brings create-nx-plugin in line with create-nx-workspace.

  • @nx/web no longer scaffolds a Jest src/test-setup.ts. Its web-components setup file only ever held the document-register-element polyfill, which was removed from the template long ago; the value has since produced an empty file wired into setupFilesAfterEnv. The file, its setupFilesAfterEnv entry and its tsconfig.spec.json include are all gated on the same value and go together.

  • @nx/oxlint declares engines: { node: "^20.19.0 || >=22.12.0" }. It's the only ESM package under packages/, requiring synchronous require compatibility.

Workspace Creation

Plugin workspace creation now respects --linter. The option threads through @nx/plugin:preset, with resolution occurring once—child generators prompt independently.

create-nx-plugin gained --interactive (default true), which it never declared. Without it, prompts reading this flag saw undefined and skipped themselves.

A detected none no longer pins into nx.json. Recording eslint or oxlint preserves real choices, but freezing none prevents workspaces from adopting linting later.

The linter question now precedes the test-runner questions. It previously trailed unitTestRunner and e2eTestRunner, sitting beside the formatter—a workspace-level question deliberately asked last. Every stack now asks it after the appearance questions (bundler, style, SSR) and before the test runners, so linter, unit-test runner and e2e runner read as one block. The react stack's preset branch was split to make this possible: the bundler resolves first, since determineUnitTestRunner still keys off preferVitest: bundler === 'vite'. The Next.js and React Native/Expo arms were identical and merged rather than duplicated.

Each stack resolves its own linter inside its determine*Options function, alongside every other per-stack option (appName, framework, unitTestRunner, e2eTestRunner, formatter). Resolution is deliberately not hoisted above the preset switch: apps, ts and npm reach no generator that takes a linter, so a hoisted call would ask a question and discard the answer on the most travelled path in the CLI.

--preset=web-components received its own web stack. It was the only Preset member mapped to the unknown catch-all, which skips option resolution—harmless until this PR replaced @nx/web:application's internal || 'eslint' with detection, at which point it scaffolded unlinted. All 24 Preset members are now explicitly cased.

--preset=ts-standalone previously asked twice—parent and child each resolved independently. The preset now forwards --linter so the child short-circuits.

--no-workspaces now asks about linters. Previously, only workspaced stacks determined linters; this layout independence is now respected.

At creation time, ESLint remains the default when prompts cannot run (CI, --no-interactive)—determineLinterOptions keeps initial: 0 deliberately while Oxlint remains experimental.

Generated Code Passes Lint

Generating a project and immediately linting it surfaced three failures, all measured against oxlint 1.75 rather than reasoned about.

  • The React routing scaffold used <div role="navigation">, which jsx-a11y/prefer-tag-over-role reports; it is now a <nav>, which carries that role implicitly. create-nx-workspace defaults React workspaces to routing, so every generated app hit this. Nothing selected the wrapper by role — no stylesheet, no attribute selector, no test query — and addRoute locates Route and Link by tag name.
  • The @nx/next welcome page lacked the prefer-tag-over-role suppression that the React and Remix welcome templates already carry. @nx/next enables the jsx-a11y plugin and the page embeds five inline SVGs with role="img", which has no tag to swap for. Both routers inject the same content, so both wrappers carry it. Sweeping every package, jsx-a11y is enabled only for react, next and remix — expo and react-native get react/react-perf, vue and nuxt get vue, and the role= attributes in angular and web live in template literals rather than JSX.
  • The empty Jest setup file described above, reported by unicorn/no-empty-file.

Documentation

New Oxlint pages cover setup, inferred tasks, config format, task naming, type-aware linting, and module-boundaries bridging. Four knowledge-base pages show create-nx-workspace terminal transcripts with the linter prompt in the position it actually occupies—before the test-runner questions. The prompt is absent from --preset=apps transcripts, where it cannot fire.

Related Issue(s)

Relates to NXC-4312

Fixes NXC-4774 — Oxlint a11y rules give contradictory guidance on role="navigation" vs <nav>. Note the reported second, circular violation did not reproduce: <nav> and even <nav role="navigation"> are both clean, and oxlint has no no-redundant-roles rule.

Fixes NXC-4776 — Oxlint unicorn/no-empty-file flags the Jest test-setup file in the generated web app.

Known follow-up, deliberately not addressed here: NXC-4784 — the inference plugin decides on lint targets by extension count alone, so a project whose files are all ignored still gets a target, and that target fails.


View session information ↗

@netlify

netlify Bot commented Jul 28, 2026

Copy link
Copy Markdown

Deploy Preview for nx-docs ready!

Name Link
🔨 Latest commit 578e1de
🔍 Latest deploy log https://app.netlify.com/projects/nx-docs/deploys/6a7b69ef629db80008f634dd
😎 Deploy Preview https://deploy-preview-36491--nx-docs.netlify.app
📱 Preview on mobile
Toggle QR Code...

QR Code

Use your smartphone camera to open QR code link.

To edit notification comments on pull requests, go to your Netlify project configuration.

@netlify

netlify Bot commented Jul 28, 2026

Copy link
Copy Markdown

Deploy Preview for nx-dev ready!

Name Link
🔨 Latest commit 578e1de
🔍 Latest deploy log https://app.netlify.com/projects/nx-dev/deploys/6a7b69ef0999ac00080ca1a7
😎 Deploy Preview https://deploy-preview-36491--nx-dev.netlify.app
📱 Preview on mobile
Toggle QR Code...

QR Code

Use your smartphone camera to open QR code link.

To edit notification comments on pull requests, go to your Netlify project configuration.

@nx-cloud

nx-cloud Bot commented Jul 28, 2026

Copy link
Copy Markdown
Contributor

View your CI Pipeline Execution ↗ for commit d958c99

Command Status Duration Result
nx affected --targets=lint,test,build,e2e,e2e-c... ✅ Succeeded 10m 59s View ↗
nx run-many -t check-imports check-lock-files c... ✅ Succeeded 2s View ↗
nx-cloud record -- pnpm nx-cloud conformance:check ✅ Succeeded 28s View ↗
nx build workspace-plugin ✅ Succeeded <1s View ↗
nx-cloud record -- nx sync:check ✅ Succeeded 13s View ↗
nx-cloud record -- nx format:check ✅ Succeeded 9s View ↗
nx affected -t e2e-macos-local --parallel=2 --b... ✅ Succeeded 1m 48s View ↗

☁️ Nx Cloud last updated this comment at 2026-08-11 18:43:59 UTC

@FrozenPandaz
FrozenPandaz force-pushed the feature/nxc-4312-add-oxlint-plugin branch 3 times, most recently from d210b9f to 9b8d7c4 Compare July 29, 2026 04:31
nx-cloud[bot]

This comment was marked as outdated.

@FrozenPandaz FrozenPandaz changed the title feat(oxlint): add the @nx/oxlint plugin feat(linter): add the @nx/oxlint plugin Jul 29, 2026
Comment on lines +209 to +210
{% aside type="caution" title="It skips silently without a project graph" %}
When no cached project graph is available, the rule reports nothing and the task still passes. The notice it prints is not a lint diagnostic, so `--deny-warnings` and `--max-warnings` don't catch it either. Run it behind `nx lint` rather than invoking `oxlint` directly, and don't rely on it as your only boundary check until that's fixed.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Suggested change
{% aside type="caution" title="It skips silently without a project graph" %}
When no cached project graph is available, the rule reports nothing and the task still passes. The notice it prints is not a lint diagnostic, so `--deny-warnings` and `--max-warnings` don't catch it either. Run it behind `nx lint` rather than invoking `oxlint` directly, and don't rely on it as your only boundary check until that's fixed.

Comment on lines +211 to +213

The ESLint rule loads the project graph through the same code path, so switching linters doesn't avoid this.
{% /aside %}

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Suggested change
The ESLint rule loads the project graph through the same code path, so switching linters doesn't avoid this.
{% /aside %}

Comment on lines +215 to +220
`@nx/eslint-plugin` is an optional peer of `@nx/oxlint`, so no package manager installs it for you. `nx add` takes one package at a time, so add both:

```shell
nx add @nx/oxlint
nx add @nx/eslint-plugin
```

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Suggested change
`@nx/eslint-plugin` is an optional peer of `@nx/oxlint`, so no package manager installs it for you. `nx add` takes one package at a time, so add both:
```shell
nx add @nx/oxlint
nx add @nx/eslint-plugin
```

This is weird.. perhaps it should be a dependency


{% aside type="note" %}
This rule requires ESLint and only works for JavaScript/TypeScript projects. For language-agnostic boundary enforcement across all project dependencies, see the [Conformance plugin's Enforce Project Boundaries rule](/docs/enterprise/conformance).
This rule only works for JavaScript/TypeScript projects. It runs on ESLint, and experimentally on [Oxlint](/docs/technologies/oxlint/introduction). On both, it reports nothing and still passes if no cached project graph is available, so don't rely on it as your only boundary check. For language-agnostic boundary enforcement across all project dependencies, see the [Conformance plugin's Enforce Project Boundaries rule](/docs/enterprise/conformance).

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Suggested change
This rule only works for JavaScript/TypeScript projects. It runs on ESLint, and experimentally on [Oxlint](/docs/technologies/oxlint/introduction). On both, it reports nothing and still passes if no cached project graph is available, so don't rely on it as your only boundary check. For language-agnostic boundary enforcement across all project dependencies, see the [Conformance plugin's Enforce Project Boundaries rule](/docs/enterprise/conformance).
This rule only works for JavaScript/TypeScript projects. It runs on ESLint, and experimentally on [Oxlint](/docs/technologies/oxlint/introduction). For language-agnostic boundary enforcement across all project dependencies, see the [Conformance plugin's Enforce Project Boundaries rule](/docs/enterprise/conformance).

---

[Oxlint](https://oxc.rs/docs/guide/usage/linter/) is a linter written in Rust.
The `@nx/oxlint` plugin runs it as a cached Nx task, so a change re-lints only the projects it affects.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Suggested change
The `@nx/oxlint` plugin runs it as a cached Nx task, so a change re-lints only the projects it affects.
The `@nx/oxlint` plugin runs it as a cacheable Nx task, so a change re-lints only the projects it affects.

Comment on lines 96 to 97
unitTestRunner: options.unitTestRunner,
...options,

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Wouldn't this already be in ...options?

Comment on lines 80 to 81
unitTestRunner: options.unitTestRunner,
...options,

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Wouldn't this already be in ...options?

Comment on lines +1 to +5
// `LinterType` comes from `@nx/js`, not `@nx/eslint`: this package is the one
// `@nx/eslint` importer that does not declare it as a dependency, so the
// specifier resolves to the published tarball, whose `LinterType` predates
// `oxlint` and would contradict the enum in schema.json.
import type { Linter } from '@nx/eslint';

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Mm.. we should just not import from '@nx/eslint'?

@@ -0,0 +1,89 @@
import 'nx/src/internal-testing-utils/mock-project-graph';

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

can this be imported from @nx/devkit/internals instead?

Comment thread packages/js/src/utils/linter.ts Outdated
return 'oxlint';
}

return 'eslint';

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Shouldn't this also check if eslint is being used or not? if not, it should return none?


## Customizing the task

`@nx/oxlint` has no executor. Every Oxlint task comes from inference, so the plugin is registered even when `useInferencePlugins` is disabled.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Suggested change
`@nx/oxlint` has no executor. Every Oxlint task comes from inference, so the plugin is registered even when `useInferencePlugins` is disabled.

Comment on lines +75 to +85
To change how one project is linted, override the inferred target in its `project.json`:

```json
{
"targets": {
"lint": {
"command": "oxlint --type-aware ."
}
}
}
```

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Use args as an example instead.. otherwise too much of the target will get overwritten.a

Comment on lines +100 to +104
## Add Oxlint to an ESLint workspace

Oxlint runs alongside ESLint, so the setup above is all you need and nothing about your ESLint config changes. ESLint keeps the `lint` target, so Oxlint registers as `oxlint` and every project with lintable files gets one.

Nx doesn't translate ESLint rules into Oxlint rules. To generate an `.oxlintrc.json` from your existing ESLint config, run [`@oxlint/migrate`](https://github.com/oxc-project/oxlint-migrate). To stop ESLint from re-reporting what Oxlint already covers, add [`eslint-plugin-oxlint`](https://www.npmjs.com/package/eslint-plugin-oxlint) to the ESLint config.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

this is still a weird section... I think maybe let's remove it for now until we know what the questions need to be answered.

tree: Tree,
options: CyLinterOptions
) {
if (options.linter === 'none') {

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

maybe this should stay?

Tree,
} from '@nx/devkit';
import { Linter, LinterType, lintProjectGenerator } from '@nx/eslint';
import { Linter, LinterType } from '@nx/eslint';

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

why does this come from eslint? It should probably only LinterType from js

Comment on lines +20 to +25
export function configurationGenerator(
tree: Tree,
options: ConfigurationGeneratorSchema
) {
return configurationGeneratorInternal(tree, options);
}

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Do we need an internal one vs a public one? they're the same.. so probably not

Comment thread packages/oxlint/src/generators/init/init.ts Outdated
nx-cloud[bot]

This comment was marked as outdated.

nx-cloud[bot]

This comment was marked as outdated.

@FrozenPandaz
FrozenPandaz force-pushed the feature/nxc-4312-add-oxlint-plugin branch 3 times, most recently from 7b1787b to 711cc46 Compare August 6, 2026 23:39
nx-cloud[bot]

This comment was marked as outdated.

@polygraph-app
polygraph-app Bot marked this pull request as ready for review August 7, 2026 05:50
@polygraph-app
polygraph-app Bot requested a review from a team as a code owner August 7, 2026 05:50
@polygraph-app
polygraph-app Bot requested a review from lourw August 7, 2026 05:50
nx-cloud[bot]

This comment was marked as outdated.

nx-cloud[bot]

This comment was marked as outdated.

nx-cloud[bot]

This comment was marked as outdated.

nx-cloud[bot]

This comment was marked as outdated.

@polygraph-app
polygraph-app Bot force-pushed the feature/nxc-4312-add-oxlint-plugin branch from c7de098 to f3973de Compare August 10, 2026 20:04
FrozenPandaz and others added 20 commits August 11, 2026 12:35
@nx/next enables the jsx-a11y oxlint plugin, and the welcome page embeds
five inline SVGs carrying role="img". An SVG has no tag to swap the role
for, so the rule is suppressed at the top of the page, matching what the
react and remix welcome templates already do.

Both routers inject the same content, so both wrappers carry it.
The rebase resolved every pnpm-lock.yaml conflict in favour of upstream, which
dropped the root oxlint entry that package.json still declares. Regenerated so
a frozen install resolves; verified with pnpm install --frozen-lockfile.
The install-avoidance rationale is true where @nx/eslint is a devDependency
reached only through require. In @nx/react it is a hard dependency and this
file imports it statically, so ensurePackage can never install it and the
guard is a plain early-out.
Every other converted schema.d.ts imports LinterType from @nx/js; this one was
hand-widened to an inline union, and @nx/remix already depends on @nx/js.

Also corrects both sync comments: three copies exist, not two, and nothing
enforces that they agree.
Six of AddLintingToProjectOptions' ten fields are documented as ignored
depending on the linter, so an option bag that type-checks can silently do
nothing. That is first-party generator plumbing, not a shape worth committing
to publicly.

Moved beside detectLinters on @nx/js/internal, which the file's own comment
already gives the reason for. LinterType stays public.
…target

A project owning a config got a target regardless of content, so a docs project
carrying an .oxlintrc.json produced a task that exits 1 with "No files found to
lint". The comment above the gate already said docs-only projects should get
none; the config-owning arm defeated it.

The gate now requires lintable files in every case, and the count comes from
oxlint --debug=files, which honours ignorePatterns, .eslintignore and .gitignore
including nested project configs. One root invocation, ~40ms on 4k files.

It falls back to the previous glob whenever oxlint cannot answer: not installed,
wedged, or a single malformed config anywhere aborting the run. That path cannot
see ignore rules, so the inferred command carries
--no-error-on-unmatched-pattern, which still exits 1 on a real violation.
…c entry

Three call sites import it across several lines, so the earlier same-line
rewrite missed them: @nx/plugin's e2e-project, @nx/web's application and
@nx/remix's application. They failed to compile, and @nx/plugin failed at
runtime with addLintingToProject is not a function.

Also sets windowsHide on the oxlint enumeration spawn, which the repo's own
require-windows-hide rule requires.
@nx/workspace keeps a standalone copy because @nx/js depends on it, not the
other way round, and the comment asking to keep them in sync was the only thing
holding it.

The assertion sits in linter.ts rather than a spec because tsconfig.lib.json is
what CI compiles: spec files are excluded from it, packages/js has no typecheck
target, and jest strips types with swc without reading them. Verified by
mutation under tsgo -b, the compiler the build actually uses — adding or
removing a member on either side fails the build, and nothing is emitted.

Exporting LinterType from @nx/workspace's root gives the assertion a resolvable
specifier; the root already exported the deprecated Linter enum beside it.
packages/oxlint declares no name, so nx derives @nx/oxlint from its
package.json. dependsOn listed "oxlint", which matches no project, and
findMatchingProjects returns an empty list without warning — so the docs build
never waited on the package it needs.
These were the only linter-bearing schemas left without an enum, so a typo
reached the dispatcher and failed there instead of at the CLI. create-nx-workspace
already gates the same flag through its yargs choices, so this only aligns the
direct generator path with it.
Two it.each blocks were byte-identical in body and differed only in title, which
reads as if the second covers something the first does not.
addLintingToProject returns a no-op for 'none' at add-linting-to-project.ts:84,
so the second half of the condition never changed the outcome.
…ommand

The flag does not exist below oxlint 1.60.0, while this package declares and
asserts a floor of 1.43.0. Measured: 1.43.0 through 1.59.0 reject it with
"not expected in this context" and exit 1, so every inferred lint target failed
outright on a supported version rather than linting. 1.60.0 is the first release
whose --help lists it.

It was only a backstop for the glob fallback, which cannot see ignore rules. The
inference gate still keeps targets off projects with nothing to lint whenever the
oxlint enumeration is available; a fully-ignored project on the fallback path
keeps failing, which is what NXC-4784 tracks.
The page said a project gets a task when it owns a config or has lintable files,
and that a docs-only project opts in by adding a config of its own. Owning a
config stopped being sufficient when the inference gate changed, so following the
page produced no target at all.
Inference enumerates lintable files by spawning oxlint --debug=files, which
needs two things that only line up from 1.70.0: the --debug flag, and a
./package.json entry in oxlint's exports so require.resolve can locate the
binary. Measured across published releases: 1.43.0 has neither, 1.60.0 has the
exports entry only, 1.70.0 has both.

Below the new floor both fail into the glob fallback, so the plugin kept working
while silently losing the ignore-awareness the docs describe. The declared range
now matches what the plugin actually needs.
The generator's description promised linting unconditionally. It resolves the
linter like every other generator, so a workspace with none that cannot prompt
resolves to none and the generator exits having written nothing. Both copies of
the description now say so.
The example claims it adds ESLint but omitted --linter, so it only held in a
workspace that already used ESLint. The example is about Angular-specific ESLint
rules, so stating the linter keeps it meaningful and true anywhere.
The example claimed it adds ESLint. It sets up whichever linter the workspace
uses; only the ESLint arm adds the Angular-specific selector rules, and the
prefix feeds those rules alone, so it is inert under oxlint.
@FrozenPandaz
FrozenPandaz force-pushed the feature/nxc-4312-add-oxlint-plugin branch from 40601bb to 1e552dc Compare August 11, 2026 16:37
nx-cloud[bot]

This comment was marked as outdated.

FrozenPandaz and others added 2 commits August 11, 2026 13:45
Moving addLintingToProject to @nx/js/internal added a second import statement to
files that already imported from that module, so several ended up importing the
same module twice. Merged back into one statement per module.

@nx-cloud nx-cloud Bot left a comment

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.

Nx Cloud has identified a flaky task in your failed CI:

🔂 Since the failure was identified as flaky, we triggered a CI rerun by adding an empty commit to this branch.

Nx Cloud View detailed reasoning in Nx Cloud ↗

🔔 Heads up, your workspace has pending recommendations ↗ to auto-apply fixes for similar failures.


🎓 Learn more about Self-Healing CI on nx.dev

@FrozenPandaz
FrozenPandaz merged commit bc454cf into master Aug 11, 2026
18 checks passed
@FrozenPandaz
FrozenPandaz deleted the feature/nxc-4312-add-oxlint-plugin branch August 11, 2026 18:46
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants