Регистрация ролей и абилок расширения
Registries
| Registry ID | Что регистрируется |
|---|---|
backend.spaceAbilities | Ability + defaults по core roles |
backend.spaceRoles | Дополнительная роль (implies optional core role) |
Объявите keys в manifest:
js
extendsRegistries: [
{ registryId: 'backend.spaceAbilities', keys: ['my-ext.approve'] },
{ registryId: 'backend.spaceRoles', keys: ['my-ext.reviewer'] },
],Backend setup
ts
import { defineExtension } from '@artiroute/extension-sdk/extension';
export default defineExtension((ctx) => {
ctx.registerSpaceRole({
id: 'my-ext.reviewer',
label: 'Reviewer',
description: 'Can approve deliverables',
implies: 'viewer', // optional: базовые grants как у viewer
});
ctx.registerSpaceAbility({
id: 'my-ext.approve',
label: 'Approve deliverables',
category: 'My extension',
defaults: {
owner: true,
editor: false,
viewer: false,
},
// configSchema — опционально, для policy UI с config
});
});Именование
- Ability ID:
<extension-id>.<action>— глобально уникален в каталоге. - Role ID:
<extension-id>.<roleName>→ policy keyext:my-ext.reviewer.
Defaults и seeding
При создании space хост мержит:
- Core defaults для
owner/editor/viewer - Defaults всех
registerSpaceAbilityиз загруженных расширений - Записывает в
SpaceAbilityPolicyperroleKey
Extension role получает отдельную policy row с key ext:<roleId>.
Использование в hooks
ts
ctx.registerEntityHook('artifact', 'beforeCreate', async (hookCtx) => {
if (!hookCtx.ability?.can('my-ext.approve')) return;
// ...
});Демо
packages/extensions/registry-test/src/backend/index.ts — registry-test.demoAction, registry-test.demoReviewer.