Skip to content

v2.2.0

Choose a tag to compare

@github-actions github-actions released this 25 Aug 12:19
· 12 commits to main since this release
0b206d9

Minor Changes

  • f3eefcc: UI apps are GA (BEX-290). brevo app create offers the UI app type in every build (interactive-only — no --type flag), and brevo app install [account-id] / brevo app uninstall [account-id] now ship in the published CLI. Public app distribution (--distribution public, app submit / app status / app withdraw) remains pre-GA and excluded from published builds.

    Per-entry card size (BEX-416). Each ui_app.surface_point_list entry accepts an optional size with width / height as CSS lengths — "<positive integer>px" or "<1-100>%" — overriding the host page's default card size for that placement. Both axes are optional; an omitted axis keeps the host default.

    CTA fields moved into each entry (BEX-426). label, more_info, redirect_link and modal_iframe_url now live on each surface_point_list entry instead of the ui_app root, so every placement can carry its own label and destination. The root spellings are refused with a migration hint, and the per-type rules run per entry (actionLink requires redirect_link and refuses modal_iframe_url; iframeExtension the reverse). brevo app create authors exactly one placement — add more by editing app-config.json and running brevo app upload.

    Install/uninstall improvements. Both commands refuse an app that is not a UI app (previously an OAuth app "installed" with nothing to render), name the resolved target account — installed into Acme Retail (account 4043630) — with an additive accountName in --json, and uninstall's corporate sub-account picker asks "uninstall from" instead of "install into". Their interactive app picker now offers only UI apps — an OAuth app in the list was a choice whose only outcome was that refusal one step later — and errors with a pointer at brevo app create when there is no UI app to offer.

    brevo app upload diffs the ui_app block, and warns before it changes an installed app. The summary used to print the block's desired state with a bare (changed) marker; it now diffs it against the server placement by placement — every changed value as before → after, added placements tagged (new), dropped ones trailing (removed), matched by slot slug so a reordered surface_point_list is not a change. For a UI app the command then warns that the app may already be installed in Brevo accounts (the configuration is shared by every install, and an upload is live there immediately, with no re-install) and asks "Proceed with upload and update every account this app is installed in?". --yes skips the question but still prints the warning; --json prints neither and stays a single parseable document.

    brevo app install shows what it is about to install. Before the confirmation it prints the app's configuration as stored on the server — app ID, name, version, extension_type and every placement — because that snapshot, not the local app-config.json, is what the account will render. --json gains additive version and ui_app keys carrying the same facts. When the app came from a linked project whose ui_app block has drifted from the stored one, the command says so and points at brevo app upload, then installs anyway (exit 0) — installing an already-uploaded configuration is legitimate, so this is a notice rather than a refusal.

    brevo app credentials refuses a UI app. A UI app has no OAuth credentials, so the command now exits 1 with a typed message pointing at brevo app list, instead of printing an empty credential form (blank client ID, "(none)" scopes and URLs) and caching the emptiness locally.

    brevo app delete warns before the confirm that deletion also removes the app from every account where it is installed or published, and that installs and credentials cannot be recovered. --force still deletes without prompting, but now prints the same consequence line so a scripted delete leaves a record; it is kept out of --json output, which stays parseable JSON only.

    A 502 Bad Gateway is now retried only for idempotent methods. The automatic retry replays GET, PUT and DELETE; POST and PATCH surface the 502 as an error instead. A 502 comes from a gateway, so the origin may already have processed the request — blindly replaying a create could duplicate the resource (observed: brevo app create producing two identical apps). If it happens on app create, check brevo app list before retrying, since the app may already exist.

    The app install / app uninstall app picker is refused when it cannot be drawn. Omitting --app-id outside a linked project under --json (or off a TTY) now exits 1 naming the --app-id form, instead of rendering the picker's choice list into what a script is parsing and then aborting on a raw readline error. Matches the guard app delete, app credentials and app withdraw already carry.

    A scaffolded UI app's project docs now describe a UI app. CLAUDE.md, AGENTS.md and README.md branch on the app type, so a UI-app project documents the ui_app block, the per-entry placement fields and the brevo app upload → brevo app install flow. Previously all three were written from the OAuth templates regardless of type, which told the partner to yarn --cwd src/oauth install and brevo app start oauth against a src/oauth/ directory a UI app never receives. OAuth projects get byte-identical files to before.

    Smaller changes: app create's placement prompt is labelled from the registry's own names; the UI integration-type prompt offers Link only until iframe authoring is ready (a hand-authored iframeExtension block still uploads); --help examples for --app-id show a UUID instead of 42; a surface_point_list entry missing its surface_point_name key is reported as a missing key — with a rename hint when the pre-rename surface_point spelling is present — instead of as a blank slot name.