5.45.4
(fix): Fix fs.cp resolving relative symlinks to absolute temp-directory paths
during local generation. Adds verbatimSymlinks: true so symlinks like
.claude -> .agents are preserved as-is when copying generator output.
(fix): Fix fs.cp resolving relative symlinks to absolute temp-directory paths
during local generation. Adds verbatimSymlinks: true so symlinks like
.claude -> .agents are preserved as-is when copying generator output.
(feat): Add support for x-fern-subtitle OpenAPI extension on endpoints. When set,
the subtitle is rendered below the endpoint title in the docs UI.
(feat): Add a --local flag to fern docs md generate that runs the library
documentation parsers locally in Docker instead of using Fern’s servers.
Local generation requires no authentication and operates on path inputs
(local source); git inputs continue to be generated remotely.
(fix): Fix frontmatter values with leading zeros being corrupted during docs publish.
grayMatter.stringify() in parseImagePaths would strip quotes from values
like '001999' (non-octal digits), causing downstream YAML 1.2 parsers to
interpret them as integers and lose leading zeros.
(fix): Fix v3 OpenAPI importer dropping types that are only referenced through a
list/map of a $ref when audience filtering is enabled. Array and map
aliases now record the referenced named type in referencedTypes (matching
how object properties already do), so audience reachability no longer prunes
the referenced type and leaves a dangling reference. This restores the
“Show N variants” UI in docs for discriminated unions referenced via a list
(e.g. Cohere’s v2 chat messages field under an audience filter).
(fix): Group GraphQL queries by parent field in the sidebar; mutations and subscriptions remain flat. Field path is now included on all GraphQL operations for correct snippet nesting.
(fix): Include field-level arguments when converting GraphQL object types and interfaces
to FDR format. Previously, arguments were only captured for top-level query/mutation
fields but not for nested object type fields (e.g., Image.url(width, height, lossy)).
Namespace grouping types (object types whose fields are all promoted to top-level
operations) are no longer double-registered as plain type definitions.
(fix): Use string literal for this.name in error classes instead of
this.constructor.name, which gets mangled by minifiers.
(fix): Fix text/* content types (e.g. text/csv, text/xml) being silently converted
to text/plain during OpenAPI export. The original media type is now preserved
through the IR via a new optional contentType field on TextResponse.
(fix): Stop dropping custom scalars in the GraphQL converter. Custom scalars (e.g. DateTime,
URL, EmailAddress) are now emitted as named alias types in the types map with a stable
id, and references to them point to that id so the type can be linked to in documentation.
(fix): Fix v3 OpenAPI importer producing empty discriminated unions when
discriminator.propertyName is present but discriminator.mapping is absent.
The importer now infers the mapping from oneOf/anyOf $ref schemas,
using const/single-element enum values on the discriminant property
(falling back to the schema name from the $ref path). This restores the
“Show N variants” UI in docs for specs like Cohere’s chat messages field.
(feat): Add page-actions.options.skills to docs.yml to enable and configure the “Install skills”
page action on docs sites. Presence of the key enables the action (an empty object enables it
with all defaults); title, description, learn-more-url, repository, and
install-command (string or list, rendered one command per line) customize the modal, and
skills lists the available skills. If the site also serves a /.well-known skills manifest,
the served manifest replaces the hand-listed skills.
(feat): Upload Agent Skills bundles placed under .well-known/skills/ or .well-known/agent-skills/
in the docs folder when publishing docs, so Fern-hosted docs sites serve them and
npx skills add https://<docs-domain> installs them. fern check now validates skill
bundles: the index.json discovery manifest must exist and parse, and each skill’s
SKILL.md frontmatter needs a kebab-case name (max 64 characters) matching its parent
directory and a non-empty description (max 1024 characters).
(fix): Bump bundled @fern-api/replay (via generator-cli 0.9.38) to 0.18.0: replay
detection filters .fernignore-protected files before materializing patches,
handles trailing-slash patterns like docs/, and no longer crashes with an
unhandled write EPIPE during patch application.
(feat): Add OIDC support for PyPI publishing in local generation. When
token: OIDC is configured for a PyPI output, the CLI now detects
the OIDC credential and propagates it through both the GitHub publish
info and the publish config so the Python generator can activate its
OIDC trusted-publisher workflow.
(feat): Track which validation rules fired during fern check as part of the PostHog CLI telemetry event.
The event now includes validationRules (array of rule names that produced violations),
numErrors, numWarnings, and passed properties.
(fix): Bump @fern-api/generator-cli to 0.9.36: AutoVersionStep now calls the hosted FAI
service with fernToken when no BAML ai config is supplied, restoring real
version bumps and changelog entries for replay-enabled remote generations.
(chore): Upgrade Venus API SDK from v0.22.34 to v5.0.0 with HTTPBearer root-level authentication.
(fix): Fix native generator execution to correctly pass raw API specs directory
via FERN_SPECS_DIR environment variable, enabling local seed tests for
generators that consume OpenAPI specs (e.g. CLI generator).
(fix): Fix v3 OpenAPI importer to check x-fern-server-name extension in getEndpointBaseUrls(),
preventing path-level server descriptions from being misinterpreted as base URL IDs when the
extension is present.
(feat): The ai.provider field in generators.yml now uses BAML provider
identifiers directly. bedrock has been renamed to aws-bedrock.
Update your config: provider: bedrock → provider: aws-bedrock.
(fix): Fix fern export to emit top-level servers array for multi-URL environments
(multipleBaseUrls). Previously only single-URL environments produced servers.
Each environment × base-URL combination is now listed with a description like
"Production (api)". Endpoint-level servers also now include the environment
name in their description.
(fix): Fix fern check parameter-name collision validator to honor x-fern-parameter-name.
Previously, parameters with distinct x-fern-parameter-name overrides were still
flagged as collisions based on their raw OpenAPI name field.
(fix): Fix SPM auto-compiling dynamic snippet files as 650+ separate executables by
moving snippets into Tests/Snippets/ and wrapping them as library code (compiled
as part of the test target instead of standalone executables).
(chore): Combine build and test into single swift test -c release invocation to avoid
redundant recompilation in seed scripts.
(fix): Fix AI example enhancement to backfill missing required fields from the auto-generated
example. When the AI Lambda produces a partial example (e.g., missing fields from nested
allOf chains), the missing fields are now merged from the correct auto-generated example,
ensuring all required fields are present in published documentation.
(fix): Fix false positive warnings in the missing-redirects check for changelog
entries and embedded content pages. FDR stores an empty slug for pages that
don’t resolve to a standalone navigation node; these are no longer reported as
removed pages whose previously published URL was ”/”, even when the site’s home
page lives under a non-root slug or basepath.
(fix): Fix fern check validators (valid-local-references, no-non-component-refs) incorrectly reporting $ref values found inside YAML comments.
(fix): Fix example generation for nested allOf $ref chains. When a schema uses
multi-level allOf (e.g. UserPost → UserBase → UserStrict), properties from
grandparent schemas were missing from generated code snippets because
mergeAllOfProperties only resolved one level of allOf. Now recursively
resolves the full chain so all required fields appear in examples.
(fix): Fix AsyncAPI v2 enum collision where multiple channels with identically
named query parameters (or headers/path params) that have different enum
values would overwrite each other. The v2 channel converter now passes
parameterNamePrefix (the channel path) to the ParameterConverter,
matching the v3 converter behavior.
(fix): Update CLI irVersion metadata from 66 to 67 so that FDR correctly
reports IR 67-compatible generator versions (e.g. CLI generator ≥ 0.2.0)
when resolving fern generator upgrade.
(chore): Rename the CLI generator Docker image from fernapi/fern-cli to
fernapi/fern-cli-generator.
(fix): Fix docs rendering dropping parent properties when an allOf parent schema
itself uses allOf with ref objects during allOf flattening instead of silently
filtering them out.
(fix): Fix OpenAPI parser emitting redundant or wrongly-required base properties for
discriminated unions when infer-discriminated-union-base-properties: true.
The inference now (1) skips properties every variant already inherits via a
shared allOf $ref parent — the parent schema is the single source of truth —
and (2) lifts an inferred property as optional if any variant declares it as
not-required. Together these prevent generated TypeScript SDKs from synthesizing
a _Base interface that collides with the real parent on either presence or
optionality (TS2320).
(fix): Fix localized docs builds so translated OpenAPI specs are used for API reference content and navigation titles.
(fix): Fix ENOTEMPTY error during local generation when removing the temporary
.git directory in copyGeneratedFilesWithFernIgnoreInTempRepo. The fs.rm
call now uses maxRetries: 3 to handle race conditions with git background
processes (e.g. auto-gc) that may still hold references to .git/objects/pack.
Also disables git auto-gc during the temporary git init to reduce the
likelihood of the race condition.