Манифест расширения
Файл extension.manifest.mjs экспортирует extensionManifest — контракт между расширением и хостом.
Обязательные поля
| Поле | Описание |
|---|---|
id | Уникальный идентификатор, например @artiroute/project-notes |
name | Человекочитаемое имя |
version | Semver |
extensionApi | Major API SDK, сейчас "1" |
targets | Какие entry собирать: backend, frontend, ai |
Пример
js
export const extensionManifest = {
id: '@artiroute/project-notes',
name: 'Project Notes',
version: '1.0.0',
description: 'Demo extension',
extensionApi: '1',
targets: {
backend: {},
frontend: {},
ai: {},
},
contributes: {
ext: {
extendsRegistries: [
{ registryId: 'app.sidebar', keys: ['project-notes'] },
{ registryId: 'app.routes', keys: ['project-notes'] },
{ registryId: 'app.widgets', keys: ['project-notes'] },
{ registryId: 'app.artifactTypes', keys: ['notes-doc'] },
{ registryId: 'ai.artifactTypes', keys: ['notes-doc'] },
{ registryId: 'ai.artifactDrivers', keys: ['notes-doc'] },
],
},
},
};contributes.ext
extendsRegistries
Декларирует, какие ключи расширение займёт в реестрах хоста или других расширений:
js
{
registryId: 'app.sidebar',
keys: ['my-key'],
}registryId+keyдолжны быть уникальны среди всех расширений- Ключ в manifest должен совпадать с первым аргументом
.register(key, …)в setup - Для UI-слотов key часто формируется из region, см. UI-слоты
declaresRegistries
Если расширение владеет собственным реестром:
js
declaresRegistries: [{ id: '@my/feature.actions', title: 'Feature actions' }];Другие расширения могут расширять его через extendsRegistries — тогда сработает implied dependency.
KNOWN_HOST_REGISTRY_IDS
Реестры, объявленные хостом (не требуют declaresRegistries от расширения-владельца):
app.sidebar
app.routes
app.widgets
app.dashboardWidgets
app.projectTabs
app.settingsTabs
app.artifactTypes
app.dialogs
app.uiSlots
ai.artifactTypes
ai.artifactDriversПолный каталог: Итерируемые реестры, UI-слоты.
extensionDependencies
Явные зависимости между расширениями (semver):
js
extensionDependencies: {
'@artiroute/other-ext': '^1.0.0',
}Implied dependencies добавляются автоматически при extendsRegistries чужого реестра.
engines.host
Ограничение версии хоста:
js
engines: {
host: '>=1.0.0',
}При несовпадении semver расширение не загрузится.
dist/manifest.json
При сборке extension-build записывает dist/manifest.json — runtime-манифест с путями к entry (frontend/index.js, backend/index.js, ai/index.js). Backend discovery читает именно его из data/extensions/<slug>/.
Чеклист перед публикацией
- [ ] Каждый
keyвextendsRegistriesзарегистрирован в setup - [ ]
extensionApiсовпадает с SDK - [ ] Artifact type keys совпадают в
app.artifactTypes,ai.artifactTypes,ai.artifactDrivers - [ ]
pnpm build:extensions && pnpm install:extensionsпроходит без ошибок