fayzfayz sdk

Manifesto do plugin — referência

A referência completa do PluginManifest — cada campo que um plugin pode declarar e o que o runtime faz com ele. Para a introdução conceitual, veja Manifesto do plugin.

O tipo canônico vive em @fayz-ai/core (PluginManifest). Um plugin — oficial ou app-local — é sempre uma factory que devolve este objeto.

Campos de identidade

CampoTipoObrigatórioDescrição
idstringsimIdentificador único do plugin.
namestringsimNome exibido.
iconstringsimNome do ícone.
versionstringsimVersão do plugin (semver).
apiVersionnumbernãoVersão do contrato de plugin. O runtime recusa um plugin construído para um contrato mais novo do que suporta. Omitir = legado/compatível.
descriptionstringnãoDescrição curta.
scopePluginScopenãocore · vertical · universal · addon · tenant.
verticalIdVerticalIdnãobeauty · food · health · services · retail · education · (custom).
scaffoldsScaffoldType[]nãoScaffolds que o plugin suporta. Omitir = universal.
defaultEnabledbooleannãoSe já vem ligado.
dependenciesstring[]nãoIds de outros plugins de que depende.
tenantIdstringnãoVincula o plugin a um tenant específico (instâncias por tenant).
schemastringnãoSchema de banco em que as tabelas do plugin vivem.

UI e navegação

CampoTipoObrigatórioDescrição
navigationPluginNavigationEntry[]simItens de menu. Cada um: section (main/secondary/settings), position, label, route, icon?, badge?, permission?.
routesPluginRouteDefinition[]simRotas. Cada uma: path, component ou componentId, guard? (authenticated/role/public/share-token), roles?, permission?, fullBleed?.
settingsPluginSettingsTab[]nãoAbas na tela de configurações. id, label, component/componentId, order?, permission?.
widgetsPluginWidgetDefinition[]nãoComponentes injetados em zonas do shell. id, zone (WidgetZone), component/componentId, order?, visibility?.
dashboardWidgetsDashboardWidgetDef[]nãoKPIs/gráficos/tabelas contribuídos ao dashboard. id, title, kind (kpi/chart/table/onboarding/custom), span?, surfaces?.
onboardingPluginOnboardingnãoFluxo de primeiro uso. component/componentId, title?, description?.

Componente por valor ou por id: em toda parte (rotas, abas, widgets), você fornece ou component (o componente React direto) ou componentId (um id resolvido pelo registry) — exatamente um.

Comportamento e integração

CampoTipoDescrição
eventsPluginEventDefinition[]Eventos que o plugin emite no bus. name namespaced (agenda.booking.confirmed), description?, payloadSchema?.
capabilitiesPluginCapability[]Capacidades declaradas. id, label, kind? (page/widget/data/integration).
aiToolsPluginAITool[]Ferramentas para um agente de IA. id, name, description, mode (read/persist), parameters?, permission?, suggestions?.
connectorsConnectorDefinition[]Conectores para provedores externos (o plugin como addon de um host). Veja o catálogo de Integrações.
registriesPluginRegistryDef[]Entidades registradas com seedData/mockData e display (table/cards/tree).

Dados, permissões e diagnóstico

CampoTipoDescrição
entitiesstring[]Entidades de dados que o plugin registra.
permissionsstring[]Permissões que o plugin usa.
declaredFeaturesFeatureDeclaration[]Features declaradas para o controle de acesso.
migrationsPluginMigration[]O SQL das tabelas do plugin. Cada uma: id, version, sql, description?.
diagnosticsPluginDiagnostic[]Pré-requisitos de backend verificados pelo fayz doctor. requires (rpcs/views/tables/migrations/env), level? (error/warn/info).
localesRecord<string, Record<string, string>>Traduções por idioma.

Exemplo mínimo

O plugin gerado pelo incubator — o menor manifesto válido e útil:

import type { PluginManifest } from '@fayz-ai/core'

export function createFidelidadePlugin(): PluginManifest {
  const Page = () => /* ... */ null
  return {
    id: 'fidelidade',
    name: 'Fidelidade',
    icon: 'Puzzle',
    version: '0.1.0',
    navigation: [
      { section: 'main', position: 50, label: 'Fidelidade', route: '/fidelidade', icon: 'Puzzle' },
    ],
    routes: [{ path: '/fidelidade', component: Page }],
  }
}

Exemplo com seams

O mesmo plugin declarando dados, permissões e um diagnóstico:

return {
  id: 'fidelidade',
  name: 'Fidelidade',
  icon: 'Puzzle',
  version: '0.1.0',
  apiVersion: 1,
  navigation: [{ section: 'main', position: 50, label: 'Fidelidade', route: '/fidelidade', icon: 'Award' }],
  routes: [{ path: '/fidelidade', component: Page }],
  permissions: ['fidelidade:read', 'fidelidade:write'],
  migrations: [{ id: 'fidelidade-0001', version: '0.1.0', sql: 'create table fid_points (...)' }],
  diagnostics: [
    { id: 'fid-tables', requires: { tables: ['fid_points'] }, level: 'warn' },
  ],
  locales: {
    'pt-BR': { 'fidelidade.title': 'Fidelidade' },
    en: { 'fidelidade.title': 'Loyalty' },
  },
}

Próximo: a ferramenta que valida tudo isso em CLI.