Skip to content

Манифест расширения

Файл extension.manifest.mjs экспортирует extensionManifest — контракт между расширением и хостом.

Обязательные поля

ПолеОписание
idУникальный идентификатор, например @artiroute/project-notes
nameЧеловекочитаемое имя
versionSemver
extensionApiMajor 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 проходит без ошибок

AI workspace для командных материалов и знаний