documentator:export,
documentator:generate, and documentator:check accept --openapi=3.1|3.2.
OpenAPI 3.2 remains native; incompatible QUERY and streaming constructs are
reported, with explicit --omit-unsupported support for reduced exports.recordAsDocumentationExample() to validate, redact, persist, and publish a
named OpenAPI response example without Documentator dispatching any requests.documentator:typescript writes a
dependency-free typed fetch client with path/query/header/cookie inputs,
body encoding, bearer auth, structured errors, HTTP QUERY, and readable
streaming responses.#[Callback] and #[Webhook] attributes
describe out-of-band requests, while #[Response(stream: true)] emits
OpenAPI 3.2 streaming itemSchema content. Validation, drift checks, the
built-in UI, compatibility reports, and TypeScript output understand them.assertMatchesDocumentation() on a TestResponse to verify that the real
route, status, media type, and response body match the generated OpenAPI
contract. Failures point to the exact nested body field and understand local
schema references, composites, enums, formats, bounds, and object/array
constraints.page and per_page as URI query parameters when the endpoint already
documents them as request content. QUERY and POST search operations carry
those inputs in the request body, so emitting them as URI parameters as well
described a single input in two places..gitattributes.QUERY routes are emitted as first-class
OpenAPI operations with request bodies, and are supported by validation,
contract diffs, section filtering, Postman exports, the built-in explorer,
try-it requests, and generated code snippets.query Path Item field. Consumers pinned to
OpenAPI 3.1-only tooling must update before consuming newly generated specs.QUERY examples, diagnosis, provenance, contract checks,
and corrected descriptions of documentator:check and unreadable routes.^8.2 constraint already permitted 8.5; no consumer changes are
required.documentator:explain METHOD URI shows the ordered
strategy trace behind every documented field, parameter and response; --json
provides the same provenance for tooling.documentator:check --against=<spec> --fail-on=breaking allows additive drift while still failing on breaking
changes. Semantic comparison now follows local schema references and covers
nullability, bounds, patterns, composites, additional properties, response
headers, and security scopes.abort, abort_if and
abort_unless calls, controller/Gate authorization, and recognized Laravel or
Symfony HTTP exceptions contribute their possible 4xx/5xx responses.when*/mergeWhen fields are optional instead of nullable.
array_merge(parent::toArray(), [...]) composition and field descriptions,
[@var](https://github.com/var) types, and [@example](https://github.com/example) values are preserved.Optional/Lazy
unions now affect property names and requiredness.oneOf instead of silently keeping
only the first branch.boost:install (an always-on guideline plus
the on-demand documentator-api-docs skill, under resources/boost/). Without
Boost, php artisan vendor:publish --tag=documentator-ai installs the same
guidance for Claude Code (.claude/skills/), Cursor (.cursor/rules/),
Gemini CLI (GEMINI.md), Codex (AGENTS.md) and any other agent
(.ai/guidelines/).textContent
instead of interpolating arbitrary response content into innerHTML, reducing
XSS risk from hostile API responses.documentator.enabled now defaults
to false; set DOCUMENTATOR_ENABLED=true to expose the UI/OpenAPI routes,
then protect private APIs with route middleware and/or Documentator::auth().ui.auth_storage now
defaults to memory instead of persistent localStorage, while session and
local remain available for teams that explicitly choose persistence.multipart/form-data request
bodies now export as Postman formdata, with binary and array-of-binary
properties emitted as file fields and the remaining properties emitted as
sampled text fields.OpenApiValidator. The validator now reports
duplicate operationIds and path-template mismatches — path parameters that
are declared but missing from the template, template placeholders with no
matching parameter, and parameter names that aren't valid OpenAPI path names.{product:slug} (and typed constraints) are
now normalized to {product} in OpenAPI paths and Postman URLs, and the path
parameter is still extracted, instead of emitting an invalid path template.operationIds are made unique. When several routes resolve to
the same controller action, generated operationIds now receive a numeric
suffix so each operation stays unique, as OpenAPI requires.#[Response] that supplies a
schema (or a type string) together with an example now emits both under
the media type; previously the example replaced the schema.SchemaSampler now resolves
array-typed type values such as ['string', 'null'] to their first
non-null type, so generated examples and Postman bodies no longer collapse
nullable fields to null.document.cookie with credentials: 'include') instead of an
illegal Cookie request header that browsers silently drop.multipart/form-data
bodies into bracketed field names such as items[0][sku].components.securitySchemes
serialized as an empty JSON object ({}) is coerced back to an array before
the Postman auth helpers read it, avoiding a type error.app.js bundle is now a small entrypoint that loads core.js (the reading
surface and try-it console) and snippets.js (request-snippet generation) as
native ES modules via <script type="module">. The asset route serves
core.js and snippets.js alongside app.css / app.js; there is still no
build step and the explorer behaves the same.#[HeaderParam],
#[CookieParam], #[ResponseHeader], #[OperationId], #[RequestMediaType],
#[Server], #[TagDescription] and #[SchemaName] attributes expose more of
OpenAPI without custom transformers. The built-in UI now shows documented
request headers/cookies, includes them in try-it requests and snippets, and
displays documented response headers.type values can now express
useful schemas with scalars, nullable unions, list<T>, T[],
array<string, T> and array shapes such as
array{id: int, status?: string}. #[Response(type: ...)] can document a
response body without a Resource or example.Validator::make(..., [...])
rules and request accessors such as $request->integer('page'),
$request->boolean('active'), $request->query('q') and request('q') are
now documented automatically.allowedFilters,
allowedSorts, defaultSort, allowedIncludes and allowedFields calls are
inferred from source, including local variable arrays, class constants, simple
aliases and literal ignored filter values.JsonApiResource responses
are emitted with application/vnd.api+json, JSON:API data envelopes,
include / fields[type] query parameters, and jsonPaginate()
page[number] / page[size] parameters.asController()
methods can now infer request rules from rules() and response schemas from
handle() return types.[@var](https://github.com/var), [@example](https://github.com/example), [@default](https://github.com/default), [@query](https://github.com/query), [@body](https://github.com/body) and
[@ignoreParam](https://github.com/ignoreParam) tags.user\.uuid, exists / inline Rule::exists and Rule::when are
understood better, and custom rule transformers can be registered through
extensions.validation_rule_transformers.grouping.sections to split a
large app into stable docs surfaces such as /docs/api and /docs/app, each
with its own filtered OpenAPI document (/{section}/openapi.json). The root
/docs redirects to the first configured section, and documentator:generate
writes matching split cache files next to the full cached spec.grouping.source, path_depth,
ignore_path_prefixes and ignore_path_parameters let controller-less routes
and localized/tenant routes group by meaningful path segments instead of
falling back to a generic "Endpoints" bucket.global_path_parameters describes shared
placeholders like {pathlang} or {tenant} once, applies that metadata to
every matching operation parameter, emits x-documentator-global on each use,
and publishes the shared definitions under
x-documentator-global-path-parameters.routes.exclude_middleware filters routes
by middleware alias or class pattern, useful for internal/docs-only/admin
surfaces that share URI prefixes with public API routes.auth_middleware maps custom
middleware aliases (for example internal.auth) to OpenAPI security schemes,
while still supporting guard-aware auth:* defaults.documentator:check output. The check command now prints
documentation health metrics, supports --json for dashboards, and adds
--suggest-hidden to flag suspicious internal, debug, operational or tooling
routes that may need #[Hidden], routes.exclude, or
routes.exclude_middleware.ExtractInlineResponses now recognizes
common Laravel response helpers, service-returned arrays, plain-text
responses, views and redirects, including non-JSON media types such as
text/plain and text/html.application/json.$request->validate([...]) inference. A new
ExtractInlineValidationRules strategy parses literal validation arrays in the
controller body and documents them as parameters (query for GET/HEAD, body
otherwise) — so endpoints that validate inline instead of via a FormRequest are
no longer blank. Dynamic rule variables are skipped; attributes still override.ExtractInlineResponses reads literal
return response()->json([...], 202) returns and documents the resulting status
and body shape, complementing the Resource/model return-type inference.documentator:check. A new OpenApiValidator
runs lightweight 3.1 sanity checks (broken $refs, malformed path / operation /
schema shapes) against the emitted document; any error fails the command
regardless of --strict.#[Group(version: 'v2')]. Keep one public group name
across versions: the version is emitted as x-documentator-group-version
(and x-documentator-version on the tag), shown as a group badge in the
built-in UI, prefixes generated operation IDs to avoid collisions, and splits
Postman folders per version.ui.auth_storage
(DOCUMENTATOR_AUTH_STORAGE) selects where the try-it console persists the auth
token — local (default), session, or memory (never persisted).apikey, basic,
or bearer auth matching the operation's security scheme (and honours
root-level security), instead of always emitting bearer.nullable: true flag to JSON Schema's type: [..., "null"] form throughout
nested properties / items / oneOf / anyOf / allOf, so the public
document uses the 3.1-native representation.extensions.strategies) — resolved from the container and inserted just before
ExtractAttributes, so attributes still override them — and OpenAPI
transformers (extensions.openapi_transformers) that receive the generated spec
array and may return a modified one for organization-specific naming or metadata.auth:<guard> middleware now maps to a
configured security scheme whose key matches the guard name, falling back to
default, instead of always emitting default.abilities: / ability: / scopes: / scope:
middleware are surfaced as the operation's security scopes in its OpenAPI
security requirement.ExtractResponses now statically parses a Resource::collection(...) return
statement, documenting a { data: [...] } collection — or the full paginated
shape plus page / per_page query parameters when the argument calls
paginate() / simplePaginate() / cursorPaginate() — even when the method's
return type is only AnonymousResourceCollection.components/schemas and referenced by $ref
(named from the resource and its kind — …Collection / …Paginated) instead of
being inlined repeatedly.documentator:check --against now lists the
specific path / operation / response changes (new Support/OpenApiDiff) instead
of only reporting that the spec drifted.#[Response(paginationLinks: false)]. Opt a custom collection out of
Laravel's links blocks when it drops them from the paginator shape.PaginationSchema honours a
ResourceCollection::paginationInformation() override, pruning the documented
links / meta to what the collection actually returns, and now documents the
meta.links page-link array.mergeWhen([...]) / merge([...]) blocks have
their fields inlined (marked nullable when conditional), more when* helpers are
recognized (whenCounted, whenAggregated, whenPivotLoadedAs, …), and
*_count fields infer integer.SchemaSampler is now field-name aware
(email, uuid, url, *_name, title, description, *_at, *_date),
respects minItems, and resolves oneOf / anyOf / allOf.textarea + execCommand copy so they work outside secure
contexts and on older browsers.// comments and the
keywords used by the newly added languages.Request / Response interfaces derived from the endpoint's schemas and an
async fetch wrapper, including automatic Date hydration for date /
date-time fields and FormData handling for multipart bodies.#[Summary] / #[Description].DateTime, #[DataCollectionOf], nullability.
Auto-detected and a no-op when the package isn't installed.$casts and [@property](https://github.com/property) docblock.email → [email protected],
enums, dates, …). Toggle with generate_examples.201, DELETE → 204 instead of
always 200. Toggle with infer_status_codes.page and per_page query parameters.documentator:check command. Audits the docs for gaps (closure routes,
missing success schema); --strict fails CI on issues and --against=<spec>
fails on drift from a committed spec.Rule::enum() / Rule::in() rule objects,
regex: → pattern, digits / digits_between → integer, all-numeric enums
(int-backed) → integer enum, and confirmed → a mirrored {field}_confirmation.integer when the route
has a numeric constraint (->whereNumber()) or binds a model with an integer
key, instead of always string.documentator:generate,
documentator:export and documentator:postman commands.How can I help you explore Laravel packages today?