v0.86.1: admin papercuts, drawer APG dialog, migrations shipping
Two admin passes since 0.86.0: the admin reorganization (flat zero-config sidebar, zen recede) and the admin papercuts + DX pass. A patch — no new public API surface, and no Consumers must: lines, so it is a drop-in bump.
Added
- The D1 migrations (
0000_auth.sqland the roles migration0001_roles.sql) now ship inside the npm package undermigrations/, so a site installed from the registry can apply them without a repo checkout: copy them fromnode_modules/@glw907/cairn-cms/migrations/into your ownmigrations/directory, thenwrangler d1 migrations apply. A packaging gate (check:package) now fails if the migrations ever drop out of the published file set. cairn-doctorgains anauth.role-wiringcheck. A site that declares a custom role vocabulary on its adapter but forgets to pass the same vocabulary tocreateAuthGuard({ roles })gets a guard on the implicit owner/editor fallback, which resolves every custom role to thenonecapability. The existingauth.role-vocabularycheck cannot see this; the new check reads thecreateAuthGuardcall insrc/hooks.server.tsand fails only on a high-confidence miss.
Fixed
- Admin papercuts from the 2026-07-15 UX audit, all internal to the admin chrome a consumer never imports: the edit-route desk band and the editor footer compose at phone widths instead of colliding or truncating; office lists cap at a readable width at 2560 and recompose at 320; the command palette gains a phone top inset and the admin focus ring; the guarded Publish and Figure controls read as deliberately disabled; the dark-mode Published badge clears its contrast floor; the nav drawer gains the full APG modal-dialog treatment (focus trap,
inertbackground, independent Escape, focus return on every open method); and a copy sweep brings the admin's editor-facing strings to the calibrated voice.
Changed (from the admin reorganization pass)
- The zero-config sidebar default renders every item, cairn's own screens and a site's flat
adminNaventries alike, as a loose top-level entry with no synthesizedCoresection. See Organize your admin nav for the grouping guidance. - A
navFilterthat matched the literalCoresection label now sees those items as loose nodes instead, since noCoresection exists to match; no known consumer does this. - Zen now recedes the persistent sidebar too, at every width, alongside the topbar it already dropped.