Bulk Actions overhaul — Custom Abilities admin page
UI-only release. Replaces the Custom Abilities Bulk Actions dropdown (Publish / Unpublish / Delete) with four ability-native optgroups that mirror the per-row edit drawer:
- Site Access — Force Allow / Inherit / Force Block
- MCP Exposure — Enable / Default / Disable
- User Access — Add / edit access rule… (opens a modal mounting the composer
<AccessControl>picker, applies one rule to all selected slugs) + Reset to Default (allow everyone) - Overrides — Force Reset (clears every override column per slug)
Destructive transitions prompt for confirmation. Row-level checkbox now works on every ability regardless of Source (Plugin / Core / Theme / Custom) — the previous db-only gate was a hangover from the deleted Delete flow. Full-screen busy overlay with WP-native .spinner is-active + body scroll-lock during every bulk apply.
Also fixed
Composer User Access rule keys were storing the ability slug with the / character stripped when applied via the (new) bulk path — the resulting rows were orphan in the DB. Root cause + fix documented under BUG-COMPOSER-AC-SLUG-DOUBLE-ENCODE in docs/memory/BUGS.md. Guarded by a Jest regression test.
Scope
Client-side only. Reuses existing REST endpoints; no new database tables, no new endpoints, no PHP changes, no dependency changes, no permission changes. Server-side sanitisation and authorisation are unchanged. Safe upgrade.
Test coverage
25 new Jest tests across three suites cover payload discipline, partial-failure re-throw, null-response guard on the composer path, and the slug-encoding regression.
Deferred to a follow-up
UserAccessBulkModal.jsx component-level Jest coverage — tracked as issue #84 (composer <AccessControl> needs a React test-double).
Full changelog: https://github.com/acrossai-co/acrossai-abilities-manager/blob/main/README.txt
Feature PR: #85 · Release PR: #86 · Follow-up issue: #84