Manifesto central.app.json
Referência completa do manifesto do App (schemaVersion 2) — identidade, arquitetura, módulos, capabilities, compatibilidade, ativação, autenticação, RBAC e métricas de uso.
O central.app.json fica na raiz do App (ou em backend/) e é a declaração de quem o App é e o que ele pode fazer. É validado no boot do backend, pela conformance e pela publicação. Um manifesto inválido interrompe o startup listando cada problema:
- compatibility.core.minVersion: requer OonCore 0.8.0 ou superior; instalado 0.7.43.
- rbac.roles[1].permissions[0]: permissão não declarada: pedidos.aprovar.
Exemplo completo
{
"$schema": "./node_modules/@oondemand/create-central-oon/schemas/central.app.schema.json",
"schemaVersion": 2,
"id": "central-compras",
"name": "Central de Compras",
"slug": "central-compras",
"appKind": "member-central",
"tenancyModel": "single_tenant",
"availability": "self",
"accessMode": "explicit_users",
"authorizationMode": "rbac",
"modules": {
"collections": true,
"documents": false,
"pipelines": true,
"assistants": false,
"currencies": false
},
"capabilities": ["core.transactional-email"],
"capabilitySettings": {
"core.transactional-email": {
"enabled": true,
"scopePolicy": "tenant_override",
"retentionDays": 30,
"attachmentsPolicy": { "allowed": false },
"templates": [{ "code": "pedido-aprovado", "definition": "./backend/emails/pedido-aprovado.json", "initialStatus": "active" }]
}
},
"compatibility": {
"core": { "minVersion": "0.7.43", "maxVersionExclusive": "0.8.0" }
},
"activation": { "enabled": true, "configurationVersion": 1, "fields": [] },
"auth": { "invitations": "central" },
"rbac": {
"invitationTtlHours": 72,
"permissions": ["pedidos.read", "pedidos.write", "pedidos.approve"],
"roles": [
{ "code": "admin", "name": "Administrador", "admin": true, "permissions": ["*"] },
{ "code": "comprador", "name": "Comprador", "permissions": ["pedidos.read", "pedidos.write"] },
{ "code": "gestor", "name": "Gestor", "permissions": ["pedidos.read", "pedidos.approve", "users.read", "users.invite"] },
{ "code": "viewer", "name": "Consulta", "permissions": ["pedidos.read"] }
]
},
"usageMetrics": [
{ "code": "pedidos", "name": "Pedidos emitidos", "unit": "pedido", "defaults": { "included": 500, "onLimit": "block" } }
]
}
Identidade
| Campo | Regra |
|---|---|
schemaVersion |
Obrigatório; deve ser 2. |
id |
Letras minúsculas, números, ., - ou _. Usado como app.id no frontend. |
name |
Texto não vazio. |
slug |
Minúsculas separadas por hífen. |
appKind |
member-central, root-central ou portal-cockpit. |
Arquitetura
| Campo | Valores |
|---|---|
tenancyModel |
none, single_tenant, multi_tenant |
availability |
system, common, self, licensed |
accessMode |
tenant_members, explicit_users, authenticated_users |
authorizationMode |
none, rbac |
deploymentMode |
Omitir em manifestos novos — o Core deriva do tenancy. |
As combinações são validadas por appArchitecture.resolveAppArchitecture. Veja a matriz em Tipos de App e tenancy.
Módulos
modules é um objeto de booleanos com as chaves collections, documents, pipelines, assistants e currencies. Chaves desconhecidas são rejeitadas.
Capabilities
capabilities— lista de identificadores namespaced e únicos, comocore.transactional-emailoucore.secrets.capabilitySettings— configuração por capability (nunca credenciais).
Compatibilidade
{ "compatibility": { "core": { "minVersion": "0.7.43", "maxVersionExclusive": "0.8.0" } } }
Ambos usam versão semântica. O scaffold gera minVersion igual à release e maxVersionExclusive igual à próxima minor. Só aumente o mínimo depois de validar a migração.
Ativação
| Campo | Regra |
|---|---|
activation.enabled |
Booleano. |
activation.configurationVersion |
Inteiro ≥ 1. |
activation.fields |
Lista de campos de parametrização da instância. |
Autenticação
| Campo | Valores |
|---|---|
auth.invitations |
local (padrão) ou central — convites geridos pela Central de Ativações. |
auth.sessionScope |
ecosystem — sessão de ecossistema para portais globais. |
RBAC
| Campo | Regra |
|---|---|
rbac.permissions |
Lista de permissões no formato recurso.acao (^[a-z][a-z0-9-]*(\.[a-z][a-z0-9-]*)+$), sem duplicatas. |
rbac.roles |
Pelo menos um perfil; pelo menos um administrativo. |
roles[].code |
Código estável em minúsculas (^[a-z][a-z0-9_-]*$). |
roles[].name |
Obrigatório. description opcional. |
roles[].permissions |
Somente permissões declaradas em rbac.permissions, nativas do Core ou "*". |
roles[].admin |
Booleano; obrigatório true quando o perfil usa "*". |
rbac.invitationTtlHours |
Inteiro entre 1 e 720. |
Permissões nativas do Core não precisam ser declaradas: users.read, users.invite, users.update, users.disable, roles.read.
Métricas de uso
usageMetrics aceita até 10 métricas que a Central usa para pré-preencher os limites dos planos. Veja Métricas de uso.
| Campo | Regra |
|---|---|
code |
^[a-z][a-z0-9_.-]{1,62}$, único |
name |
Obrigatório, até 80 caracteres |
unit, description |
Opcionais |
defaults.included |
Inteiro ≥ 0 |
defaults.onLimit |
block ou auto_addon |
defaults.overage |
{ mode: "unit" | "block", priceMinor, blockSize? } |
Validação programática
const { validateAppManifest, loadAppManifest, AppManifestError } = require("@oondemand/oon-core-back");
try {
loadAppManifest(process.cwd());
} catch (error) {
if (error instanceof AppManifestError) console.error(error.issues);
}