4.92.0
(feat): fern automations generate now writes a richer GitHub Actions step
summary. The summary is an HTML table grouped by API and generator group
(with rowspan cells), a heading that shows the succeeded/total count on
failure, a duration column, and a links column with the PR, SDK repo, and
generators.yml entry (the latter deep-linked to the exact line when running
under GitHub Actions). Generators excluded from automation now surface as
explicit skipped rows with reasons (Skipped - local output, Skipped - opted out), replacing the silent drop.
4.91.1
(fix): Update CLI v2 authentication error messages to reference fern auth login instead of fern login.
This covers SDK generation permission errors, docs publish auth failures, and missing-token hints
produced by CLI v2 code paths. The legacy fern login wording is preserved for the v1 CLI.
4.91.0
(internal): Remove the abandoned @fern-api/docs-parsers dependency from @fern-api/docs-resolver and drop
the hidden fern fdr <path> --v2 code path that was the only remaining consumer. The upstream
package was deleted from fern-platform in https://github.com/fern-api/fern-platform/pull/2420
and hasn’t been published since; removing it clears the transitive uuid@9.0.1 from the lockfile.
4.90.0
(internal): Implement the FER-9980 autoversion pipeline. A new GenerationCommitStep +
AutoVersionStep run between the [fern-generated] commit and replay
detect/apply, diffing prev vs new [fern-generated] SHAs (both pure
generator output), calling Fern AI for a semver bump + changelog entry,
rewriting the placeholder version, prepending changelog.md, and committing
[fern-autoversion]. Consumes the two-phase @fern-api/replay@0.12.0 API.
Prep refactors (moved AutoVersioningService / AutoVersioningCache /
VersionUtils from @fern-api/local-workspace-runner into
@fern-api/generator-cli/autoversion to resolve a circular-dep blocker) are
folded into this entry. Opt-in via config.autoVersion.enabled; no
behavior change for non-replay flows.
4.89.0
(feat): fern generate now accepts multiple --api flags. Previously, running
fern generate --api api1 --api api2 failed because yargs collapsed the values into a single
comma-joined string that was then looked up as a workspace name. --api is now declared as an
array option, so each --api <name> value is parsed individually and the command generates for
the union of the specified API workspaces (de-duplicated).
4.88.0
(feat): fern generate now accepts multiple --group flags. Passing e.g.
fern generate --group typescript --group java --group python generates
for all of the listed groups instead of failing with
'typescript,java,python' is not a valid group or alias. Each value is
resolved independently (including aliases) and the union is generated.
4.87.1
(fix): Gracefully handle “Self-referencing circular pointer” errors from OpenAPI specs.
Instead of failing the entire publish, the CLI now logs a warning with the
offending file path and circular $ref breadcrumbs, then continues processing
without full reference resolution.
4.87.0
(feat): Add new docs.yml metadata fields for controlling dynamically generated OG images:
og:dynamic:text-color, og:dynamic:background-color, og:dynamic:logo-color
(dark | light), and five visibility toggle flags (og:dynamic:show-logo,
og:dynamic:show-section, og:dynamic:show-description, og:dynamic:show-url,
og:dynamic:show-gradient).
Also fixes a pre-existing gap where og:dynamic and og:background-image were
missing from the Zod MetadataConfig schema, causing fern check to reject them.
(fix): Populate apiNameToId in fern docs dev so MDX widgets that resolve APIs by
user-facing name (e.g. <MergeSupportedFieldsByIntegrationWidget apiName="hris_v2" ... />)
work in local preview. Previously the preview server hardcoded this mapping to
{}, causing such widgets to throw MergeWidgetResolutionError and render the
affected pages as 500 Internal Server Error.
(chore): Emit non-fatal warnings during fern check / fern docs dev when docs.yml
metadata settings silently conflict. Covered cases:
og:dynamic: truecombined withog:imageortwitter:image(the static images only apply to the homepage once dynamic generation is enabled).og:dynamic:*sub-settings orog:background-imageset withoutog:dynamic: true(they are ignored).og:dynamic:logo-colorset withog:dynamic:show-logo: false(no effect).og:image:width/og:image:heightset withoutog:image.og:dynamic:text-colorequal toog:dynamic:background-color(text is invisible).
4.86.2
(fix): Gate the consolidation of top-level OpenAPI servers into a single multi-URL
environment behind a new setting, multi-server-strategy, with values
environment-per-server (default) and urls-per-environment. Previously
(since 4.71.4) any spec where endpoint-level servers: overrides referenced
top-level x-fern-server-name values would collapse all top-level servers
into one environment, silently removing named environment constants
(e.g. Environment.AGENT) from generated SDKs. The old pre-4.71.4 behavior
of emitting one environment per top-level server is now restored by default;
customers who want the Box-style “one logical environment with multiple
named base URLs” behavior can opt in by setting
multi-server-strategy: urls-per-environment under
api.specs[].settings.
(fix): Fix WebSocket base URLs silently overwriting HTTP base URLs when both share
the same x-fern-server-name (OpenAPI + AsyncAPI) inside a consolidated
environment. Colliding WebSocket URLs are now suffixed with their protocol
(e.g. Agent_wss) so both the HTTP and WSS URLs remain addressable. Only
applies when multi-server-strategy: urls-per-environment is set.
4.86.1
(chore): When an OpenAPI endpoint has multiple request and response examples that cannot be paired by matching summary fields, the CLI now emits a warning explaining which response example had no match and how to fix it, rather than silently producing an extra example with an empty request body.
4.86.0
(feat): Allow theme.product-switcher: tabs in docs.yml. When set, the product
switcher renders as a row of tabs in the docs header on desktop, with a
dropdown fallback on mobile.
4.85.2
(chore): Surface descriptive Fiddle error messages (e.g. GithubAppNotInstalled) in
the CLI instead of the generic “Failed to create job. Please try again or
contact support@buildwithfern.com” fallback. The _other visitor callback
receives core.Fetcher.Error directly ({ reason, statusCode, body }), but
extractErrorMessage was looking one level too deep under .content, so
the descriptive message was never extracted.
4.85.1
(fix): Fix x-fern-discriminated: true to correctly keep specific schemas as discriminated unions when prefer-undiscriminated-unions-with-literals is enabled.
4.85.0
(fix): Fix shell completion triggering upgrade notices and slow network calls.
Suppress upgrade messages and skip version redirection when the shell
invokes --get-yargs-completions so that TAB completions are fast and
side-effect-free.
(feat): Add shell completion support to CLI v2 with content-aware completions
for --group, --api, and --instance flags. The completion reads
fern.yml to suggest valid values when the user presses TAB.
4.84.2
(fix): Fix wire test infrastructure to correctly handle array query parameters in WireMock stubs and test verification across all generators with wire test support.
4.84.1
(fix): Fix [object Object] being logged (and recorded in the automation summary) when a
generator fails during fern automations generate. The automation-mode catch in the
remote workspace runner now propagates TaskAbortSignal instead of stringifying it,
and pulls the real failure message off the task context for the run summary. Also
makes InteractiveTaskContextImpl.finish() idempotent so the duplicate Failed.
line is gone.
4.84.0
(feat): Add --skip-if-no-diff flag to fern generate that skips opening a PR / pushing when the
generated output has no diff from the base branch. The existing no-diff skip behavior is
decoupled from automationMode and now gated behind its own skipIfNoDiff config.
fern automations generate continues to skip no-diff PRs by default.
4.83.0
(internal): Harden Sentry reporting for the legacy CLI:
- Opt in to the
onUncaughtException,onUnhandledRejection,linkedErrors, andnodeContextintegrations so errors that escape the top-level handler (fire-and-forget callbacks, unhandled rejections, wrapped.causechains) still reach Sentry with full context. - Attach stack traces even for non-Error throws, and disable client reports and performance sampling since the CLI doesn’t emit transactions.
- Drop the
UNCLASSIFIEDerror code now that every CLI package has been migrated to the typedCliErrorsystem. Unknown errors now fall back toINTERNAL_ERRORand are reported to Sentry, closing the last gap where uncategorized failures went unobserved.
4.82.0
(feat): Forward the CLI’s telemetry setting to local generator containers. When the CLI
has telemetry disabled (via FERN_DISABLE_TELEMETRY, FERN_TELEMETRY_DISABLED, or
fern telemetry disable), fern generate --local now sets
FERN_DISABLE_TELEMETRY=true inside the generator container so the generator
runtime’s Sentry client is disabled too. Remote generation is unaffected.
4.81.1
(fix): Thread the --version flag through to the Go SDK when using
output.location: local-file-system. The CLI now populates a Go publish
target on the IR’s filesystem publishing config when the user explicitly
passes --version, so the Go generator can stamp the generated SDK with
the requested version. No version is populated when --version is not
provided.
4.81.0
(feat): fern automations generate now fans out across every eligible generator when targeting
flags are omitted. It continues past per-generator failures, auto-writes a markdown
summary to $GITHUB_STEP_SUMMARY when running in GitHub Actions, and optionally emits
a CI-neutral JSON summary via --json-file-output <path>. Generators with
automations.generate: false are silently skipped during fan-out; explicit targeting
of an opted-out generator is now rejected with a clear error. Exit code is non-zero
if any generator fails.
(chore): fern generate and fern automations generate now render generation progress as a nested
hierarchy of API → group → generator tasks in the terminal, so fan-out runs are easier to
follow when multiple APIs, groups, and generators are running at once. Behavior is unchanged;
only the live task display is different.
4.80.4
(fix): Fix “Expected list. Received null.” error when importing OpenAPI specs with null security scopes.
Some real-world specs use {oauth2: null} instead of {oauth2: []} in security requirement
objects. The OpenAPI importers now sanitize null scope values to empty arrays.
4.80.3
(fix): Thread the explicit --version flag through to the TypeScript SDK when
generating locally with output.location: local-file-system. Previously,
running fern generate --group <ts-group> --version <x.y.z> --local would
silently drop the version and emit a package.json without a version
field. The CLI now populates PublishingConfig.filesystem.publishTarget
with an npm target (carrying the user-provided version and the
config.packageJson.name) so the generator can produce the correct
package.json and X-Fern-SDK-Version header. Only --version that was
explicitly passed is threaded through; auto-computed versions are not, to
avoid behavior changes for users who manage package.json themselves.
4.80.2
(chore): Remove the hidden fern automations list generate command.
4.80.1
(fix): Display descriptions for discriminated and undiscriminated union variants.
4.80.0
(feat): Add fern automations preview command that discovers previewable generator
groups and runs SDK preview for each one, aggregating results. Replaces the
previous fern automations list preview listing-only command with a single
command that handles both discovery and execution. Designed for consumption
by the fern-preview GitHub Action.
4.79.4
(fix): Resolve $ref pointers to external markdown files inside OpenAPI description
fields by inlining the file contents as a string at spec load time. Previously
such specs failed with e.replace is not a function during SDK generation.
4.79.3
(fix): Support x-fern-discriminator-context extension on OpenAPI discriminator objects and auto-infer
protocol context for SSE-shaped discriminated unions.
4.79.2
(fix): Fix AsyncAPI bundler silently degrading typed models to unknown when
multi-file specs use file-local $ref pointers (e.g. $ref: '#/Sibling')
inside schemas that are inlined from external files.
4.79.1
(fix): Fix auto-detected global headers generating type-incorrect example values. When headers like Request-Timeout (integer type) were auto-promoted to global headers, the example generator used the header name as a string value instead of skipping the example.
4.79.0
(feat): Add a docs.yml setting to disable editing the API reference environment URL.
This preserves the default editable behavior while allowing docs sites to lock the
displayed base URL when desired.
4.78.0
(feat): Add more traceability to .fern/metadata.json so generator output makes it
clearer how and by whom the SDK was generated. The IR generationMetadata
object now carries four additional optional fields:
invokedBy: source of the CLI invocation (autopilot,autorelease,ci, ormanual). Set explicitly via theFERN_INVOKERenvironment variable, otherwise inferred from standard CI env vars.requestedVersion: the raw value passed to--version(e.g.AUTOor1.2.3) so consumers can tell whether auto-versioning was requested.ciProvider: the name of the CI provider (e.g.github,gitlab) when running in CI. Only the provider name is recorded — no repo, run, branch, commit, or actor metadata is captured.originGitCommitIsDirty: whether the Fern configuration repository had uncommitted changes at the time of generation.
The existing originGitCommit field continues to record the git commit of
the Fern configuration repository at the time of generation.
4.77.0
(feat): Add fern replay commands to CLI v2: init, resolve, status, and forget.
4.76.2
(fix): Fix the missing-redirects check to ignore stale historical slug-table rows
and only compare against the most recent published slug per page.
4.76.1
(fix): Support array examples for query parameters in OpenAPI specs. Parameters with
explode: false and array examples now flow through to generated wire tests.
4.76.0
(feat): Replace fake time-based extraction progress bar with real file-count
tracking, and add a new progress bar for Windows symlink patching.
4.75.0
(feat): When using fern sdk preview --push-diff, the diff branch now uses the
original package name instead of the preview-scoped name. This makes the
diff show only real API changes without preview artifacts like package
name rewrites.
4.74.0
(feat): Resolve Windows symlinks via NTFS junctions during bundle extraction instead
of running pnpm install in standalone. This enables docs preview on Windows
without elevated privileges.
4.73.0
(feat): Present an interactive TUI dropdown when the user omits --api,
--instance, or --group flags and multiple options exist.
In TTY environments the CLI now prompts for selection instead of
failing hard. Non-TTY environments retain the previous error behavior.
4.72.0
(feat): Polish fern config migrate command: point the docs key at the
existing docs.yml file via $ref syntax instead of inlining, drop
legacy defaultGroup and group fields from SDK target output, and
automatically update GitHub Actions workflow files to use the v2 CLI
syntax (fern sdk generate, --target instead of --group).
4.71.6
(fix): Fix MDX rendering of C++ library docs by properly escaping angle brackets
in template parameters and HTML-like tags within description text. Unescaped
angle brackets (e.g. vector<int>, <para>) caused MDX parse failures.
4.71.5
(fix): fern automations list generate now skips generators with local-file-system output
or autorelease disabled, matching the behavior of autopilot.
4.71.4
(fix): Fix per-endpoint server overrides being ignored when top-level servers
define multiple base URLs with x-fern-server-name. Endpoints now correctly
resolve to their specified server URL instead of always using the default.
4.71.3
(fix): Fix OpenAPI-to-IR conversion to resolve custom properties (e.g., grant_type)
in OAuth token endpoint requests. Previously, customProperties was always set
to undefined for OpenAPI specs, causing generated SDKs to omit required
literal properties from the token request.
4.71.2
(fix): Fix allOf composition bugs in V3 OpenAPI importer: resolve ref-resolved
schemas, preserve inline status through allOf merge path, handle nullable
enum patterns in allOf shortcuts, detect cycles across recursive
single-element allOf chains, filter unresolved $ref objects from nested allOf
flattening, recursively flatten deeply-nested allOf arrays, strip oneOf/anyOf
from child schemas during allOf merging, and propagate outer schema metadata
through single-element allOf paths.
4.71.1
(fix): Fix false positive warnings in the missing-redirects check. Pages are no
longer flagged as removed or moved when their old URL is still actively
served by another page in the local docs config.
4.71.0
(feat): Add --id flag to fern docs preview delete, allowing deletion of preview deployments by their stable preview ID instead of the full URL. The org is resolved automatically from fern.config.json. Existing usage of fern docs preview delete <url> continues to work unchanged via the new auto-detecting [target] positional.
4.70.2
(fix): Fix “Edit this page” button appearing on docs sites that never configured it.
The default editThisPageLaunch is now undefined instead of "dashboard",
so the button only renders when explicitly configured.
4.70.1
(fix): Fix “Edit this page” button appearing on docs sites that never configured it.
The default editThisPageLaunch is now undefined instead of "dashboard",
so the button only renders when explicitly configured.
4.70.0
(feat): Enable --push-diff flag for fern sdk preview to push a preview diff
branch to the SDK repo in addition to publishing to the preview registry.
Adds diff_url to the JSON and text output for use by CI integrations.
4.69.0
(feat): Improve auto-versioning prompts for better SDK version bump determination and changelog quality.
Commit type now matches version bump severity, per-chunk changelog entries use category tags,
consolidation prompt deduplicates aggressively, and version context is passed to consolidation.
4.68.5
(chore): Migrate CLI to a unified error system using a shared CliError class with typed error codes.
Error codes drive Sentry reporting eligibility; unclassified errors are temporarily suppressed
from Sentry until all call sites are migrated.
4.68.4
(fix): Deduplicate global headers when merging IRs from multiple OpenAPI specs. Previously, if multiple specs shared the same globalHeaderOverrides from generators.yml, the same header would appear once per spec in the merged IR.
4.68.3
(fix): Fix global headers from generators.yml not appearing in documentation endpoints. The new OpenAPI v3 parser (openapi-to-ir) had a TODO placeholder but never converted globalHeaderOverrides into IR headers.
4.68.2
(fix): Fix an issue where api:<apiName>:METHOD/path links worked on published docs sites but did not resolve in fern docs dev.