Skip to content

v2.4.0

Choose a tag to compare

@sylvesterdamgaard sylvesterdamgaard released this 05 May 13:54

What's new

Per-field wire-format spec

BlueprintsRouter::get now emits a _format_spec per field describing the exact wire format — shape, allowed node types/marks, set handles, recursive set definitions, and canonical examples. Covers bard (inline + full), replicator, grid, group, markdown, scalar, select/checkbox, relationship, asset, table, and date fields. This eliminates the guessing game that caused agents to produce malformed bard/replicator payloads. (#29)

Configurable confirmation actions

New confirmation.actions config block allows per-domain control over which MCP actions require confirmation tokens. Operators can now gate entries.update, entries.publish, globals.update, etc. without forking the package. Domains not listed fall back to default. * gates every action; [] disables the gate. Shipped defaults preserve existing behaviour. (#26)

Client-safe exception messages

FieldFormatException, ValidationException, FieldtypeNotFoundException, and BlueprintNotFoundException messages now survive production sanitization — agents get actionable error messages instead of a generic placeholder.

Bug fixes

  • Entry slug self-collision on updateupdateEntry() no longer fails with "slug already taken" when updating an entry without changing its slug (#28)
  • Table cell normalizationSanitizesFieldData now correctly normalizes {value: …} objects in table cells to plain strings, preventing [object Object] rendering in the CP
  • Playwright CI stability — Browser tests now use shared auth state (single login per run), preventing Statamic's login throttle from failing tests

Full Changelog: v2.3.0...v2.4.0