For AI agents: the complete documentation index is available at https://mfdoctor.kevinbeier.com/llms.txt, the full documentation bundle is available at https://mfdoctor.kevinbeier.com/llms-full.txt, and this page is available as Markdown at https://mfdoctor.kevinbeier.com/compatibility.md.

Compatibility matrix

Documented and CI-exercised support for every bundler and runtime MFDoctor claims in v1. Status labels are tied to analysis capabilities and real build+MFDoctor paths — not fixture-only confidence.

Related: capabilities · limitations · #15 (MFDOCTOR-106).

Status labels

StatusMeaning
supportedFirst-class adapter + real bundler build writes MFDoctor facts; exercised in CI
partialUsable with honest gaps — emits doctor/partial-analysis (or weaker evidence) instead of lying
unsupportedOut of v1 scope (post-v1 or permanent non-goal)

Bundlers

BundlerStatusAdapter entryCI evidenceNotes
Vitesupported@tonoizer/mfdoctor/vitecompatibility workflow → host-vite build + MFDoctorPrimary host path in examples/mixed-federation
Vite 5 + CommonJSsupported@tonoizer/mfdoctor/vitecompatibility workflow → vite-cjs-v5 build + MFDoctorAsync ESM bridge for the Vite MF plugin; validates MFDoctor's published CommonJS adapter
Rolldown / Vite Pluspartial@tonoizer/mfdoctor/viteunit lifecycle hooks + honest doctor/partial-analysisSame Vite entry; usable with gaps until a real Rolldown/Vite Plus smoke build lands in CI (#11)
Rspacksupported@tonoizer/mfdoctor/rspackcompatibility workflow → remote-rspack build + MFDoctorDirect @module-federation/enhanced/rspack (first-class)
Rsbuildsupported@tonoizer/mfdoctor/rsbuildcompatibility workflow → remote-rsbuild build + MFDoctor@module-federation/rsbuild-plugin
Webpacksupported@tonoizer/mfdoctor/webpackcompatibility workflow → webpack-smoke build + MFDoctor@module-federation/enhanced/webpack (#10 shipped)
Modern.jspartial@tonoizer/mfdoctor/moderncompatibility workflow → modern-smoke (Rspack stub)Adapter API + Rspack-under-the-hood smoke; the package export is fixed in #4897, but the core-demo unblock remains unverified and this is not full @modern-js/app-tools evidence yet (#130)
Nuxt 3/4partial@tonoizer/mfdoctor/nuxtadapter unit contract + pinned upstream recordPublic vite:extendConfig adapter; full Nuxt app build remains baseline-blocked upstream (nuxt/nuxt#36009)

Variant coverage

The machine-readable contract lives in fixtures/compatibility-matrix.json. It distinguishes reproducible local CI cells from unit contracts and pinned upstream validation records:

SurfaceCurrent evidenceMatrix status
Vite current ESM + Vite 5 CommonJSProduction build + project/report/SARIF assertions on Node 22, 24, and 26CI
Rspack, Rsbuild, Webpack, Modern.js adapterProduction build + MFDoctor report assertionsCI
Svelte and SvelteKit SSRPinned upstream app reports plus SvelteKit SSR-entry regression testvalidated
AngularPinned upstream validation; the example's existing package baseline blocks the buildbaseline-blocked
Nuxt 3/4Adapter contract and pinned upstream validation recordbaseline-blocked

The upstream rows are evidence records, not release claims: CI uses pinned local fixtures so a moving external repository cannot silently change the release gate. Refresh the pinned ref and rerun the external validation before changing a row's status.

Nuxt 3 / Nuxt 4 use the partial adapter @tonoizer/mfdoctor/nuxt. It hooks the public vite:extendConfig API and is covered by the adapter contract test plus pinned Nuxt provenance in the full E2E gate. A full Nuxt application build remains dependent on the upstream package-resolution issue tracked in nuxt/nuxt#36009 — so Nuxt is not a first-class supported CI gate.

Runtime-only Module Federation (no bundler MF build plugin) is unsupported as a first-class path — see limitations and #34.

Analysis depth (partial honesty)

PathStatusBehavior when incomplete
Bundler MF plugin + MFDoctor adapter + shared mfOptionssupportedFull post-emit facts; CI defaults to terminal + JSON + SARIF
CLI check with explicit MF config, no emitpartialConfig/imports only; weaker without artifacts
Unresolved dynamic import(expr) / non-literal loadRemote / etc.partialRecords imports.unresolvedDynamic; prefers doctor/partial-analysis
Opt-in Observability runtimeTrace / mfdoctor runtimesupported*Offline correlation when a valid export is supplied; invalid/missing → partial
On-disk / deployed mf-manifest.json (check discover / probe)partialProducer/deploy evidence only

*Runtime traces are opt-in and never fetch remote URLs or execute remote JS.

Partial cells must not silently skip gaps. Prefer doctor/partial-analysis over false certainty (shared/unused, invented remotes, scraped private plugin fields).

Runtime capture compatibility

Runtime capture is a separate, opt-in Node/offline boundary. The checked-in contract at fixtures/runtime-capture-compatibility.json and scripts/verify-runtime-capture-compatibility.mjs exercise the public @tonoizer/mfdoctor/capture entry point after every package build:

SurfaceStatusEvidenceCompatibility guarantee
Current Observability exportsupportedcurrent-2.5.3.jsonProjects bounded reports/events and preserves source capability state.
Legacy Observability exportsupportedhealthy.jsonKeeps legacy report parsing and leaves absent fields unknown.
Partial/sensitive exportsupportedremote-load-failed.jsonRedacts credentials/secrets before output and never retains raw error internals.
Official DevTools exportsupportedpartial-devtools.jsonRetains source-partial metadata and does not upgrade missing report facts.
Node/SSR JSON exportsupportedNode wrapper around current-2.5.3.jsonUses the node-file transport and a separate SSR realm.
Preview runtime / disabled snapshotsupportedFallback contract casesPreview versions do not infer shared lifecycle; disableSnapshot is not-applicable.
Browser frame / worker realmssupportedBrowser connector contract casesNavigation, realm, and source scope remain isolated and user-approved.

The default @tonoizer/mfdoctor entry and bundler adapter entries do not expose capture functions. Capture remains available only from the explicit @tonoizer/mfdoctor/capture subpath, and no automatic browser agent is part of the package.

Node.js

CellStatusExact versions
package.json enginessupportednode: ">=22.12.0"
CI engines floorsupportedNode 22 (latest 22.x ≥ 22.12.0) via .github/workflows/compatibility.yml
CI current linesupportedNode 24 (same workflow + quality/integration/e2e defaults)
Node < 22.12.0unsupportedOutside engines; not tested

Package managers

ManagerStatusNotes
pnpm (primary)supportedVite+ delegates to pnpm 11 (packageManager: "pnpm@11.17.0"; engines.pnpm: ">=11.0.0 <12.0.0"); CI uses vp install --frozen-lockfile; workspace filters for examples; ten-day release-age and explicit build approvals are enforced
npmpartialPublished package installs with npm i -D @tonoizer/mfdoctor; CLI via npx mfdoctor. This monorepo’s lockfile and filters are pnpm-only — do not expect npm install at the repo root to reproduce CI.
yarn (classic / Berry)partialSame published-package install/CLI story as npm. Yarn workspaces are not the repo’s CI path; use pnpm for contributing and matrix jobs.

Where paths differ: contributors and CI always use pnpm. Consumers of the published tarball may use npm or yarn to install MFDoctor into their own app; the CLI binary name remains mfdoctor.

Report surfaces

SurfaceLocal defaultCI / --ci / mode: "ci"Artifact
terminalyes (quiet on clean)yes (quiet on clean)stdout when findings exist
JSONyes (report.json)yes.mf/doctor/report.json
SARIFoff unless requestedyes.mf/doctor/results.sarif

CI auto-detect (CI, GITHUB_ACTIONS, …) enables failOn: "error" and terminal + JSON + SARIF without setting mode: "ci" in plugin config. The compatibility workflow asserts report artifacts after each supported bundler build. Terminal success lines stay off unless --verbose / printLog.success / MFDOCTOR_QUIET=0 is set.

pnpm mfdoctor check --format terminal,json,sarif

Failure policy (release blockers)

Reds that block a release claim for supported cells:

  1. Vite, Rspack, Rsbuild, or Webpack real build + MFDoctor path fails on Node 22 or 24 in the compatibility workflow.
  2. Missing MFDoctor artifacts after a green bundler build (project.json, report.json, or results.sarif on the CI path).
  3. Quality / package / integration / e2e gates that already guard the adapters.

Reds that do not block other cells:

  1. npm/yarn consumer-path differences — documented partial; monorepo CI stays pnpm.
  2. Expected doctor/partial-analysis warnings on partial analysis paths — honest gaps, not matrix failures.
  3. Rolldown / Vite Plus — documented partial (unit lifecycle coverage only; no release claim until a real smoke build is in compatibility.yml).
  4. Modern.js — documented partial (adapter API + Rspack-under-the-hood smoke; no full supported claim until a real @modern-js/app-tools build is in compatibility.yml).
  5. Nuxt 3/4 — documented partial (adapter + unit contract; upstream app build remains baseline-blocked; not a supported release gate).

CI map

WorkflowWhat it proves
compatibility.ymlPer-bundler build+MFDoctor on Node 22, 24 + 26; report surfaces
doctor.ymlMixed + nested federation builds + workspace gates + SARIF upload
integration.yml / e2e.ymlAdapter tests plus the full matrix and Playwright mixed-federation path
package.ymlPack/consume smoke on Node 22, 24 + 26 (includes Webpack)
quality.ymlfmt, lint, types, unit tests, docs:build

mf-toolkit shapes

MFDoctor soft-recognizes intentional mf-toolkit config shapes so agents do not get false broken-remote / component-DTS guidance:

ShapeSignalSoft-exception
mf-bridgeexpose ./entryentry.* module (toolkit register / createMFEntry / defineMFEntry contract)Skip component-style DTS producer guidance (artifact/dts-disabled, artifact/types-missing, artifact/types-metadata-missing)
mf-ssrfragment URL/path remotes (/api/fragments/..., not remoteEntry.js)Skip config/remote-entry-invalid for those entries
shared-inspector (optional)MF2 shared-array on manifest-only evidenceSkip shared/unused certainty; prefer doctor/partial-analysis

Recognition defaults on when these signals are present. Disable with recognizeMfToolkit: false in mfdoctor.config / adapter options, or turn the specific rule "off" / use a fingerprint baseline. Soft-exceptions skip findings rather than changing evidence shapes (fingerprint-stable for classic apps).

In-repo fixtures (no toolkit checkout): fixtures/mf-bridge-entry, fixtures/mf-ssr-fragment, fixtures/shared-inspector-mf2. Full Bridge pack coverage is #131, not this compatibility note.