Changelog / Migration Guide
This release moves admin UI authorship out of plugin packages and into the UI layer. Plugins now declare typed capability schemas; the UI generates pages automatically. It also introduces a namespaced i18n system with plugin-seeded UI strings.
0.11.0 Highlights
- Admin Vue pages removed from all plugin packages — capability metadata drives UI generation
- i18n namespace system:
content,ui,ui:plugin-<id>namespaces - Plugin
seedTranslations— per-locale JSON files seeded idempotently on install TranslationStoreaddsbulkUpsertTranslations()andgetUiStrings()- Expanded
AppCapability:policies,tenancy,publicConfigsurfaces - API path convention:
/admin/<resource>(no/apiprefix) - Package renames for three plugins
Breaking Changes
1. Plugin package renames
| Old name | New name |
|---|---|
@system-core/plugin-events | @system-core/plugin-event |
@system-core/plugin-jobs | @system-core/plugin-job |
@system-core/plugin-team-faqs-testimonials | @system-core/plugin-team-faq-testimonial |
Update package.json and all import paths.
2. Admin pages removed from plugin packages
Plugins no longer ship Vue pages under src/pages/. The AppCapabilityCrudResource entries on each capability now include typed field schemas that the UI layer (@maxnate-ui/system-core) uses to auto-generate list and edit pages.
If you were importing Vue components from plugin packages directly:
// Before — no longer exported
import PostsPage from '@system-core/plugin-blog/pages/admin/cms/blog/posts.vue'Use the CRUD resource capability metadata from the plugin instead and let the UI layer render it.
3. API path convention change
Plugin admin API paths no longer include a leading /api segment.
Before: /api/admin/events
After: /admin/eventsUpdate any hardcoded fetch paths in your integration layer or admin shell.
4. Translation row gains namespace field
The Translation interface now requires namespace: string. If you maintain a custom TranslationDeps implementation, add the field to your store and schema.
// Before
export interface Translation {
entityType: string
entityId: string
locale: Locale
fields: Record<string, string>
// ...
}
// After
export interface Translation {
namespace: string // NEW — required
entityType: string
entityId: string
locale: Locale
fields: Record<string, string>
// ...
}5. TranslationDeps signature changes
// Before
find(entityType, entityId, locale): Promise<Translation | null>
findMany(entityType, entityId): Promise<Translation[]>
delete(entityType, entityId, locale): Promise<void>
// After
find(entityType, entityId, locale, namespace?): Promise<Translation | null>
findMany(filters?: TranslationFilters): Promise<Translation[]>
delete(entityType, entityId, locale, namespace?): Promise<void>New Features
Plugin seed translations
Plugins can now seed UI strings at install time:
export const backend = installCapabilityPlugin(capability, {
version: VERSION,
seedTranslations: {
en: { 'events.list.title': 'Events', 'events.action.new': 'New Event' },
fr: { 'events.list.title': 'Événements', 'events.action.new': 'Nouvel événement' }
}
})Conventional file layout:
src/
i18n/
en.json
fr.jsonSeeds are written once per locale per capability namespace. Admin edits are never overwritten.
getUiStrings() on the public config
createSystem() exposes seeded and persisted UI strings:
const system = await createSystem({ prisma, plugins: [...] })
// server-side
system.uiStrings // Record<string, string> for the default locale
// via public config endpoint
publicConfig.uiStringsExpanded AppCapability surfaces
Three new surfaces are available on plugin capabilities:
export interface AppCapability {
// ...existing...
policies?: PolicyDefinition[]
tenancy?: AppCapabilityTenancy
publicConfig?: Record<string, unknown>
}Upgrade Checklist
- Update package names in
package.json:plugin-events→plugin-eventplugin-jobs→plugin-jobplugin-team-faqs-testimonials→plugin-team-faq-testimonial
- Remove any direct imports of Vue admin pages from plugin packages.
- Update admin API fetch paths from
/api/admin/<resource>to/admin/<resource>. - If you have a custom
TranslationDepsimplementation, addnamespace: stringto your store schema and update thefind/findMany/deletesignatures. - Optionally add
seedTranslationsto your own plugins for UI string localisation.