@oondemand/create-central-oon 0.7.3 → 0.7.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/README.md +18 -14
  2. package/bin/cli.js +12 -2
  3. package/docs/AGENTS.md +12 -56
  4. package/docs/AGENT_WORKFLOW.md +8 -15
  5. package/docs/BACKEND_API.md +5 -5
  6. package/docs/BACKEND_DOMAIN_MANIFEST.md +1 -1
  7. package/docs/CAPABILITIES.md +11 -3
  8. package/docs/CHECKLIST_IMPLEMENTACAO.md +4 -5
  9. package/docs/CORE_UPGRADE.md +17 -14
  10. package/docs/ERRORS.md +1 -1
  11. package/docs/EXECUTABLE_EXAMPLE.md +42 -0
  12. package/docs/NATIVE_RESOURCES.md +94 -0
  13. package/docs/OON_APP_AGENT_GUIDE.md +26 -45
  14. package/docs/PDF_RENDERING.md +2 -3
  15. package/docs/PUBLIC_CONTRACTS.md +124 -0
  16. package/docs/RBAC_SECURITY.md +1 -1
  17. package/docs/ROUTES_HOOKS_WORKERS.md +19 -8
  18. package/docs/SECRETS.md +54 -0
  19. package/docs/TASK_EXAMPLES.md +134 -0
  20. package/docs/TASK_INDEX.md +36 -0
  21. package/docs/TESTING_CONFORMANCE.md +12 -19
  22. package/docs/TRANSACTIONAL_EMAIL.md +1 -1
  23. package/examples/first-journey/FIRST_JOURNEY.md +27 -0
  24. package/examples/first-journey/backend/central.domain.json +141 -0
  25. package/examples/first-journey/backend/central.process.json +105 -0
  26. package/examples/first-journey/backend/emails/confirmacao.json +12 -0
  27. package/examples/first-journey/backend/src/models/Documento.js +9 -0
  28. package/examples/first-journey/backend/src/models/Pessoa.js +6 -0
  29. package/examples/first-journey/backend/src/routes/integracao.js +23 -0
  30. package/examples/first-journey/backend/src/routes/jornada.js +10 -0
  31. package/examples/first-journey/backend/src/routes/recursos.js +26 -0
  32. package/examples/first-journey/backend/src/routes/segredos.js +27 -0
  33. package/examples/first-journey/backend/src/services/confirmacao.js +11 -0
  34. package/examples/first-journey/frontend/src/pages/JourneyPage.tsx +32 -0
  35. package/examples/first-journey/frontend/src/pages/NativeResourcesPage.tsx +50 -0
  36. package/examples/first-journey/frontend/src/pages/SecretsPage.tsx +31 -0
  37. package/package.json +3 -2
  38. package/schemas/central.app.schema.json +12 -0
  39. package/src/doctor.js +90 -0
  40. package/src/example.js +39 -0
  41. package/src/index.js +31 -16
  42. package/templates/_base/README.md +17 -46
  43. package/templates/_base/backend/package.json +1 -1
  44. package/templates/_base/frontend/package.json +1 -1
  45. package/templates/_base/frontend/src/app/app.tsx +2 -2
  46. package/templates/_base/frontend/src/pages/HomePage.tsx +3 -3
  47. package/templates/_base/package.json +2 -2
package/README.md CHANGED
@@ -2,13 +2,24 @@
2
2
 
3
3
  Gerador estrutural de Apps Oon. Ele cria backend e frontend code-first prontos para consumir `@oondemand/oon-core-back` e `@oondemand/oon-core-front` e inclui a documentação pública versionada necessária para Agents.
4
4
 
5
- ## Uso
5
+ ## Comece com uma jornada
6
+
7
+ Resolva uma release publicada uma vez e gere a base oficial (Bash):
6
8
 
7
9
  ```bash
8
- npx --yes --package @oondemand/create-central-oon@0.6 create-central-oon central-exemplo
10
+ OONCORE_VERSION="$(npm view @oondemand/create-central-oon version)"
11
+ npx --yes --package "@oondemand/create-central-oon@$OONCORE_VERSION" create-central-oon meu-app --no-install
12
+ cd meu-app
13
+ npm install
14
+ npm install --prefix backend
15
+ npm install --prefix frontend
9
16
  ```
10
17
 
11
- O gerador possui uma única base `_base`. Não há seleção ou catálogo de templates funcionais. O binário também responde por `scaffold-central-oon`.
18
+ O guia gerado em `.ooncore/docs/OON_APP_AGENT_GUIDE.md` contém o comando com a versão exata do pacote instalado: gerar → executar → implementar primeira jornada → validar → publicar pelo fluxo existente. Consulte `.ooncore/docs/TASK_INDEX.md` somente para a tarefa necessária.
19
+
20
+ O gerador possui uma única base `_base`; não há catálogo de templates funcionais. Após gerar uma base limpa, `npx --no-install create-central-oon example` instala a jornada opt-in documentada em `.ooncore/docs/EXECUTABLE_EXAMPLE.md`. O binário também responde por `scaffold-central-oon`. Os tokens `__OONCORE_*__` nas fontes documentais são resolvidos pelo sync oficial a partir do `package.json`, inclusive nos hashes do cache.
21
+
22
+ As seções abaixo são referências sob demanda, não pré-requisitos para começar.
12
23
 
13
24
  ## Contrato `central.app.json`
14
25
 
@@ -74,22 +85,15 @@ Um domínio declarativo pode adicionar `backend/central.domain.json` conforme se
74
85
 
75
86
  A documentação em `.ooncore/` é autocontida. Um Agent deve conseguir criar e customizar o App sem ler o monorepo do OonCore, `node_modules`, outros Apps ou documentação privada.
76
87
 
77
- Comece por:
78
-
79
- 1. `.ooncore/AGENTS.md`;
80
- 2. `.ooncore/docs/OON_APP_AGENT_GUIDE.md`;
81
- 3. `.ooncore/docs/CAPABILITIES.md`;
82
- 4. o contrato dedicado apontado para a tarefa.
83
-
84
- Se faltar informação pública, registre a lacuna; não deduza APIs por implementação interna.
88
+ Comece pela entrada curta `.ooncore/AGENTS.md` e pelo índice por intenção. Se faltar informação pública, registre a lacuna, use extensão pública adequada no App e continue partes independentes. Não invente APIs nem use internals como contrato. O contexto consolidado é opcional.
85
89
 
86
90
  ## Conformidade
87
91
 
88
92
  ```bash
89
- npm run ooncore:docs:check
90
- npm run ooncore:conformance
91
93
  npm run check
92
- npm test
94
+ npm run build --prefix frontend
93
95
  ```
94
96
 
95
97
  A verificação exige schema v2 e bootstrap code-first, protege rotas reservadas, guards de segurança e imports internos, e rejeita código remoto, segredos no bundle e dependências fora do frontend.
98
+
99
+ Execute também os testes relevantes declarados pelo App. O scaffold não cria `npm test` na raiz. Plataforma homologada: consuma os fluxos existentes; não reabra sua implementação ou homologação global a cada jornada.
package/bin/cli.js CHANGED
@@ -31,7 +31,7 @@ function parseArgs(argv) {
31
31
  else throw new Error(`Opção desconhecida: ${arg}.`);
32
32
  }
33
33
 
34
- if (["docs", "conformance", "dev"].includes(positionals[0])) {
34
+ if (["docs", "conformance", "dev", "doctor", "example"].includes(positionals[0])) {
35
35
  opts.command = positionals[0];
36
36
  if (opts.command === "docs" && positionals[1] === "check") opts.docsCheck = true;
37
37
  if (opts.command === "docs" && positionals[1] === "sync") opts.docsSync = true;
@@ -44,12 +44,22 @@ function printUsage() {
44
44
  console.error(" npx create-central-oon <nome-do-app>");
45
45
  console.error(" npx create-central-oon docs sync|check");
46
46
  console.error(" npx create-central-oon conformance [--root .] [--json]");
47
- console.error(" npx create-central-oon dev");
47
+ console.error(" npx create-central-oon dev|doctor|example [--root .]");
48
48
  }
49
49
 
50
50
  async function main() {
51
51
  try {
52
52
  const opts = parseArgs(process.argv.slice(2));
53
+ if (opts.command === "example") {
54
+ require("../src/example").installExample({ cwd: opts.root || process.cwd() });
55
+ return;
56
+ }
57
+ if (opts.command === "doctor") {
58
+ const result = require("../src/doctor").doctor({ cwd: opts.root || process.cwd() });
59
+ console.log(JSON.stringify(result, null, 2));
60
+ process.exitCode = result.ok ? 0 : 1;
61
+ return;
62
+ }
53
63
  if (opts.command === "docs") {
54
64
  if (opts.docsCheck) checkDocs();
55
65
  else syncDocs();
package/docs/AGENTS.md CHANGED
@@ -1,58 +1,14 @@
1
1
  # OonCore — entrada canônica para IA/Agents
2
2
 
3
- Este arquivo é o contrato inicial neutro para Codex, ChatGPT, Kimi, Manus e outros Agents que criem ou alterem uma Central Oon.
4
-
5
- ## Contrato de autonomia
6
-
7
- O Agent deve trabalhar em modo **closed-book**: a árvore do App gerado, incluindo `.ooncore/`, é suficiente. Código-fonte do OonCore, `node_modules`, repositórios de outros Apps e documentação privada não são contratos de extensão e não devem ser usados para descobrir comportamento suportado.
8
-
9
- Se a documentação distribuída não responder à tarefa, pare e registre a lacuna. Não invente API nem contorne a fronteira pública.
10
-
11
- ## Ordem de leitura
12
-
13
- 1. Leia primeiro o `AGENTS.md` da raiz do projeto consumidor, quando existir.
14
- 2. Confirme `schemaVersion`, `version`, `docsHash` e `entrypointsHash` em `.ooncore/manifest.json`.
15
- 3. Rode `npm run ooncore:docs:check`; se falhar, rode `npm run ooncore:docs` e verifique novamente.
16
- 4. Leia [OON_APP_AGENT_GUIDE.md](OON_APP_AGENT_GUIDE.md).
17
- 5. Consulte [CAPABILITIES.md](CAPABILITIES.md) antes de criar código.
18
- 6. Leia os contratos de backend, frontend, runtime, RBAC ou capability indicados abaixo.
19
- 7. Leia a documentação de domínio do projeto consumidor.
20
-
21
- O `AGENTS.md` da raiz pertence ao projeto e nunca pode ser sobrescrito pelo scaffold ou pelo sync do Core.
22
-
23
- ## Roteamento por tarefa
24
-
25
- | Tarefa | Leitura obrigatória |
26
- |---|---|
27
- | Criar um App ou definir onde customizar | [OON_APP_AGENT_GUIDE.md](OON_APP_AGENT_GUIDE.md), [CAPABILITIES.md](CAPABILITIES.md) |
28
- | Domínio, models, validações e fórmulas | [BACKEND_API.md](BACKEND_API.md), [BACKEND_DOMAIN_MANIFEST.md](BACKEND_DOMAIN_MANIFEST.md), [BACKEND_PATTERNS.md](BACKEND_PATTERNS.md), [REACTIVE_DOMAIN_FORMULAS.md](REACTIVE_DOMAIN_FORMULAS.md) |
29
- | CRUD, metadata e UI | [METADATA_CRUD_UI.md](METADATA_CRUD_UI.md), [FRONTEND_API.md](FRONTEND_API.md), [FRONTEND_CODE_FIRST.md](FRONTEND_CODE_FIRST.md) |
30
- | Auth, ativação, tenant ou permissões | [AUTH_ACTIVATION_RBAC.md](AUTH_ACTIVATION_RBAC.md), [RBAC_SECURITY.md](RBAC_SECURITY.md), [DO_AND_DONT.md](DO_AND_DONT.md) |
31
- | Renderizar, visualizar ou baixar PDF | [PDF_RENDERING.md](PDF_RENDERING.md), [BACKEND_API.md](BACKEND_API.md), [FRONTEND_API.md](FRONTEND_API.md) |
32
- | Configurar templates ou enviar e-mail | [TRANSACTIONAL_EMAIL.md](TRANSACTIONAL_EMAIL.md), [RBAC_SECURITY.md](RBAC_SECURITY.md) |
33
- | Execução local | [RUNTIME_MODES.md](RUNTIME_MODES.md), [LOCAL_DEVELOPMENT.md](LOCAL_DEVELOPMENT.md), [LOCAL_SECURITY_BOUNDARY.md](LOCAL_SECURITY_BOUNDARY.md) |
34
- | Rotas, hooks, jobs e filas | [ROUTES_HOOKS_WORKERS.md](ROUTES_HOOKS_WORKERS.md), [BACKEND_PATTERNS.md](BACKEND_PATTERNS.md) |
35
- | Publicação, imports e assets de runtime | [APP_PACKAGING.md](APP_PACKAGING.md) |
36
- | Upgrade do Core | [CORE_UPGRADE.md](CORE_UPGRADE.md), [TESTING_CONFORMANCE.md](TESTING_CONFORMANCE.md), [releases/0.7.0.md](releases/0.7.0.md) |
37
- | UX avançada | [ADVANCED_UX_PATTERNS.md](ADVANCED_UX_PATTERNS.md), [DETAIL_MODAL_AND_RELATED_GRIDS.md](DETAIL_MODAL_AND_RELATED_GRIDS.md), [PORTAL_COCKPIT_PATTERNS.md](PORTAL_COCKPIT_PATTERNS.md) |
38
-
39
- ## Fronteira obrigatória
40
-
41
- - O App declara domínio e experiência em código; o Core fornece bootstrap, autenticação, ativação, RBAC, tenant, CRUD, metadata, shell, componentes genéricos e deployment.
42
- - Use somente exports públicos documentados. Arquivos internos de `src/` não são contrato de extensão.
43
- - Autorização, tenant e regras que alteram dados são sempre validados no backend.
44
- - Não crie autenticação, ativação, RBAC, CRUD, shell, registry ou infraestrutura paralelos.
45
- - Não coloque segredos em manifesto, frontend, log, URL permanente ou documentação.
46
- - Recursos de plataforma devem falhar fechado no runtime local.
47
-
48
- ## Gates antes de concluir
49
-
50
- ```bash
51
- npm run ooncore:docs:check
52
- npm run ooncore:conformance
53
- npm run check
54
- npm test
55
- ```
56
-
57
- Uma entrega que depende da leitura de fonte privada ou de outro App não está concluída: registre a lacuna na documentação distribuída.
58
-
3
+ Leia o `AGENTS.md` da raiz do App, quando existir, e siga o roteiro curto em [OON_APP_AGENT_GUIDE.md](OON_APP_AGENT_GUIDE.md). Para uma alteração existente, vá direto à intenção em [TASK_INDEX.md](TASK_INDEX.md).
4
+
5
+ - Use a documentação distribuída correspondente aos pacotes instalados. `npm run check` verifica cache e conformidade; se o cache estiver desatualizado, regenere com `npm run ooncore:docs`.
6
+ - Leia somente a referência necessária à jornada. `context.generated.md` é uma compilação opcional para consulta, não uma leitura inicial obrigatória.
7
+ - Use exports públicos; fontes internas e outros Apps não substituem contratos. Exemplos de domínio de outros Apps não são scaffold.
8
+ - Se faltar contrato, registre a lacuna com versão, tarefa e informação ausente. Use uma extensão pública documentada no próprio App quando adequada e continue as partes independentes. Suspenda apenas a operação que não pode ser implementada com segurança; não invente APIs nem importe internals.
9
+ - Preserve autenticação, autorização de backend, contexto autorizado, isolamento, auditoria e proteção de segredos. POC reduz escopo funcional, não proteção.
10
+ - Plataforma homologada: consuma identidade, acesso, tenancy, licenciamento e delivery existentes. Não repita sua implementação/homologação global no App. Nova Capacidade exige escopo separado e explícito.
11
+ - Entregue uma jornada utilizável com página, navegação, endpoint e permissão. Admin pode validar a POC controlada; uma matriz final de perfis, roadmap completo e novas Capacidades não são pré-requisitos.
12
+ - Antes do PR: `npm run check`, build do frontend e testes relevantes existentes. Relate separadamente implementação, build, publicação e homologação da jornada.
13
+
14
+ O `AGENTS.md` da raiz pertence ao App; o gerador e o sync não o sobrescrevem. Consulte [CORE_UPGRADE.md](CORE_UPGRADE.md) para migração e [releases/0.7.0.md](releases/0.7.0.md) para o histórico desta linha.
@@ -1,20 +1,13 @@
1
1
  # Fluxo de trabalho para Agents
2
2
 
3
- 1. **Gerar:** para um App novo, siga [OON_APP_AGENT_GUIDE.md](OON_APP_AGENT_GUIDE.md) e confirme que `.ooncore/` foi criada.
4
- 2. **Descobrir:** leia `AGENTS.md`, o manifesto documental e [CAPABILITIES.md](CAPABILITIES.md).
5
- 3. **Classificar:** separe contrato do Core, domínio da Central e recurso exclusivo da plataforma.
6
- 4. **Escolher extensão:** manifesto → validation/trigger/hook/mapping → renderer/rota pequena → código customizado somente se necessário.
7
- 5. **Implementar:** use exports públicos documentados; preserve segurança, tenant, auditoria e idempotência.
8
- 6. **Executar local:** `npm run dev`, sem cadastro ou conexão com a plataforma; capabilities de plataforma falham fechado.
9
- 7. **Validar:** docs check, conformance, testes, typecheck e provas específicas do projeto.
10
- 8. **Relatar:** arquivos, contratos usados, riscos, limitações e evidências.
3
+ 1. Gere a base oficial e execute: [OON_APP_AGENT_GUIDE.md](OON_APP_AGENT_GUIDE.md).
4
+ 2. Escolha a jornada e consulte somente a intenção em [TASK_INDEX.md](TASK_INDEX.md).
5
+ 3. Implemente domínio e experiência pelos contratos públicos, preservando permissões, contexto e segredos.
6
+ 4. Valide com `npm run check`, build e testes relevantes disponíveis; prove a jornada.
7
+ 5. Publique pelo fluxo existente e registre commit e evidência em Dev.
11
8
 
12
- ## Regra closed-book
9
+ A documentação desta release é __OONCORE_VERSION__, linha __OONCORE_LINE__.x. Para coordenar os três pacotes, consulte [CORE_UPGRADE.md](CORE_UPGRADE.md).
13
10
 
14
- Mantenha os três pacotes OonCore na linha 0.7.x declarada pelo App e sincronize `.ooncore` após qualquer atualização.
11
+ Se faltar assinatura, declaração, exemplo ou limite, registre a lacuna e continue partes independentes com extensões públicas documentadas no App. Apenas a operação sem contrato seguro fica pendente. Nunca use internals como API, invente contratos ou crie autoridade de autenticação/RBAC paralela.
15
12
 
16
- Trabalhe somente com o App e sua `.ooncore/`. Não leia fonte privada, `node_modules` ou outros Apps para descobrir como usar o Core. Se faltar assinatura, declaração, exemplo, erro ou limite necessário, interrompa essa parte e registre a lacuna documental.
17
-
18
- Prompt operacional:
19
-
20
- > Crie ou atualize o Oon App usando exclusivamente a documentação versionada em `.ooncore`. Preserve o domínio e o AGENTS.md do projeto, consulte o catálogo e os contratos públicos de back, front e capabilities, use apenas extensões suportadas, execute os gates e homologue em `127.0.0.1` sem conexão com a plataforma. Não leia fonte privada ou outros Apps e não crie autenticação, ativação, RBAC, CRUD, shell ou infraestrutura paralelos.
13
+ Não exija leitura integral do contexto consolidado, planejamento completo nem homologação global da Plataforma para começar. Consulte referências detalhadas sob demanda.
@@ -4,8 +4,8 @@ Importe exclusivamente de `@oondemand/oon-core-back`. Caminhos internos não tê
4
4
 
5
5
  ## Boot e definição
6
6
 
7
- - `start(options)`: carrega a Central, conecta Mongo, inicializa capabilities e inicia HTTP. `options.listen=false` devolve somente o app.
8
- - `createApp()`: cria o Express já protegido e com rotas do Core.
7
+ - `start({ cwd, listen })`: carrega o backend indicado por `cwd`, conecta Mongo, inicializa capabilities e inicia HTTP. `listen=false` devolve `{ app }`; com escuta, `{ app, server }`.
8
+ - `createApp()`: monta o Express já protegido usando o registro existente; não carrega os módulos do App nem conecta o banco sozinho.
9
9
  - `activate()`: fluxo legado de ativação; não é usado no runtime local.
10
10
  - `defineCentral`, `defineModel`, `defineCollection`, `defineDocument`, `definePipeline`, `defineRoutes`, `defineValidation`, `defineTrigger`: extensões imperativas suportadas.
11
11
  - `fields`: factories de campos compatíveis com schema e metadata.
@@ -13,10 +13,10 @@ Importe exclusivamente de `@oondemand/oon-core-back`. Caminhos internos não tê
13
13
 
14
14
  ## Segurança, RBAC e tenant
15
15
 
16
- - `requirePermission(permission)`: middleware obrigatório em rotas sensíveis.
16
+ - `requirePermission(permission)`: middleware público de autorização. Em `router.private`, declare `{ permission }` no segundo argumento; não passe middleware nessa posição. Veja [PUBLIC_CONTRACTS.md](PUBLIC_CONTRACTS.md).
17
17
  - `CORE_PERMISSIONS`, `rbacPolicy`, `roleByCode`, `permissionGranted`: leitura e avaliação da política declarada.
18
18
  - `TENANT_HEADER`, `TENANCY_MODELS`, `DATA_SCOPES`: constantes canônicas.
19
- - `createAccessContext`, `readRequestedTenantId`: produzem contexto validado.
19
+ - `createAccessContext` estrutura identidade já verificada; `readRequestedTenantId` lê a seleção solicitada, sem autenticá-la. Nas rotas use `req.accessContext`.
20
20
  - `scopeFilter`, `mergeScopedFilter`, `scopeMutation`, `scopedIdFilter`: aplicam isolamento aos dados. Nunca aceite tenant do body como autoridade.
21
21
 
22
22
  ## Manifestos
@@ -46,4 +46,4 @@ O namespace público `localDevelopment` expõe detecção, validação de loopba
46
46
 
47
47
  ## Erros
48
48
 
49
- `GenericError(message, { statusCode, code, details })` é o erro operacional base. Rotas devem lançá-lo e deixar o middleware do Core produzir o envelope sanitizado.
49
+ `GenericError(message, { statusCode, code, details })` é o erro operacional base. O App deve fornecer mensagem/detalhes seguros; o middleware produz o envelope, mas não remove automaticamente segredos do conteúdo arbitrário fornecido pelo App. Bootstrap, rotas, prefixos, permissões e `sensitiveBody` estão consolidados em [PUBLIC_CONTRACTS.md](PUBLIC_CONTRACTS.md).
@@ -229,7 +229,7 @@ Não declare a mesma model no manifesto e em `src/models`. O registry interrompe
229
229
  Campos calculados:
230
230
 
231
231
  - são automaticamente `readonly`;
232
- - recebem `immutable` no schema Mongoose;
232
+ - são protegidos pelo pipeline de mutação HTTP; valores calculados continuam graváveis pelo próprio Core após recálculo;
233
233
  - são recalculados no backend em criação, edição, patch e importação;
234
234
  - são calculados em ordem de dependência;
235
235
  - não podem formar ciclos;
@@ -1,6 +1,6 @@
1
1
  # Catálogo de capacidades do OonCore
2
2
 
3
- Consulte este catálogo antes de criar infraestrutura ou componentes customizados. Para capabilities nativas, o guia dedicado é leitura obrigatória.
3
+ Comece pela tarefa em [TASK_INDEX.md](TASK_INDEX.md), com API pública, piso de versão, exemplo e limite. Este catálogo é referência adicional sob demanda; consulte somente os guias das capabilities usadas.
4
4
 
5
5
  | Capacidade | Backend | Frontend | Declaração/extensão | Local | Plataforma |
6
6
  |---|---|---|---|---|---|
@@ -14,10 +14,18 @@ Consulte este catálogo antes de criar infraestrutura ou componentes customizado
14
14
  | Tenant e escopo | access context e scope helpers | `TenantProvider` | `central.app.json` | Contexto técnico | Contexto autorizado |
15
15
  | Auditoria | CRUD e request context | headers do SDK | automática/extensão | Local | Operacional |
16
16
  | Rotas customizadas | `defineRoutes` | página/ação declarada | `backend/src/routes` | Sim | Sim |
17
- | Jobs e workers | process workers | status operacional | manifestos/hooks | Sim | Sim |
17
+ | Recálculos de processo | manifesto de processo; execução específica | projeção do estado | `central.process.json` | Sim | Sim |
18
18
  | E-mail transacional | `capabilities.transactionalEmail` | `CoreTransactionalEmail` | [TRANSACTIONAL_EMAIL.md](TRANSACTIONAL_EMAIL.md) | Fail-closed/dublê de teste | Implementação resolvida pelo Core |
19
+ | Segredos V1 | `capabilities.secrets` | Formulário do App | [SECRETS.md](SECRETS.md) | Chave local explícita | Chave por runtime dedicado/ambiente |
19
20
  | PDF | `capabilities.pdf.render` | `useOonApi`/download | [PDF_RENDERING.md](PDF_RENDERING.md) | Fail-closed/dublê de teste | Implementação resolvida pelo runtime |
20
- | Publicação/promoção | contratos de delivery | indisponível no App | CLI/ponte pública | Não | Sim |
21
+ | Publicação/promoção | serviço homologado da Plataforma | Workspace existente | consumir fluxo existente; não reimplementar | Não | Sim |
21
22
  | Runtime local | sessão e guardas locais | bootstrap/cookie/banner | `OON_RUNTIME_MODE=local` | Sim | Não aplicável |
22
23
 
23
24
  Para cada capacidade, use o manifesto quando houver contrato declarativo e código da Central apenas nos pontos de extensão documentados. Se uma capability não possuir guia dedicado suficiente, registre uma lacuna; não descubra o contrato lendo fonte privada ou outro repositório.
25
+
26
+
27
+ Não há contrato público genérico de integration runtime. Workers de e-mail e jobs de recálculo são específicos; execução durável genérica e diagnóstico de integrações são propostas separadas. Consulte [ROUTES_HOOKS_WORKERS.md](ROUTES_HOOKS_WORKERS.md).
28
+
29
+ ## Aplicação dos recursos nativos
30
+
31
+ A página `/recursos` do exemplo demonstra fórmulas, validações, bindings, invariantes, documentos, dashboard e PDF. O serviço de e-mail é opt-in. Consulte [NATIVE_RESOURCES.md](NATIVE_RESOURCES.md) para o roteiro, helpers de escopo e limites reais de isolamento, auditoria e execução.
@@ -1,6 +1,6 @@
1
1
  # Checklist de Implementação
2
2
 
3
- Use este checklist antes de concluir qualquer tarefa de codificação em uma Central Oon.
3
+ Referência sob demanda: aplique somente os itens relevantes à jornada alterada. Não é um gate para começar uma POC nem exige homologar novamente a Plataforma.
4
4
 
5
5
  ## Contexto e documentação
6
6
 
@@ -34,7 +34,7 @@ Use este checklist antes de concluir qualquer tarefa de codificação em uma Cen
34
34
  ## Integrações e capabilities
35
35
 
36
36
  - [ ] Fiz a declaração no manifesto indicado pelo guia.
37
- - [ ] Usei camada de integração/capability pública.
37
+ - [ ] Usei serviço do App ou capability com contrato público publicado; não assumi uma fila genérica do Core.
38
38
  - [ ] Modelei mapping e status operacional quando necessário.
39
39
  - [ ] Normalizei erros externos e respeitei `retryable`.
40
40
  - [ ] O runtime local falha fechado ou usa dublê somente no teste.
@@ -42,9 +42,8 @@ Use este checklist antes de concluir qualquer tarefa de codificação em uma Cen
42
42
 
43
43
  ## Entrega
44
44
 
45
- - [ ] `npm run ooncore:docs:check` passou.
46
- - [ ] `npm run ooncore:conformance` passou.
47
- - [ ] `npm run check` e `npm test` passaram.
45
+ - [ ] `npm run check` passou (inclui docs check e conformance).
46
+ - [ ] Build e testes relevantes declarados pelo App passaram.
48
47
  - [ ] Provei o fluxo específico do usuário.
49
48
  - [ ] A Central continua atualizável com novas versões do Core.
50
49
  - [ ] A alteração é pequena, coesa e aderente à arquitetura.
@@ -1,20 +1,23 @@
1
1
  # Atualização coordenada do OonCore
2
2
 
3
- Os três pacotes devem permanecer na mesma linha:
3
+ Esta documentação corresponde à release **__OONCORE_VERSION__**, linha `__OONCORE_LINE__.x`. Preserve as regras e o domínio do App. Escolha uma versão publicada e compatível e atualize backend, frontend e gerador juntos.
4
4
 
5
- - `@oondemand/oon-core-back`;
6
- - `@oondemand/oon-core-front`;
7
- - `@oondemand/create-central-oon`.
5
+ Na raiz do App, para adotar a release deste guia:
8
6
 
9
- ## Procedimento para Agent
7
+ ```bash
8
+ npm install --save-dev --save-exact @oondemand/create-central-oon@__OONCORE_VERSION__
9
+ npm install --prefix backend --save-exact @oondemand/oon-core-back@__OONCORE_VERSION__
10
+ npm install --prefix frontend --save-exact @oondemand/oon-core-front@__OONCORE_VERSION__
11
+ npm run ooncore:docs
12
+ npx --no-install create-central-oon doctor
13
+ npm run build --prefix frontend
14
+ ```
10
15
 
11
- 1. Leia o `AGENTS.md` da raiz e preserve regras/domínio do projeto.
12
- 2. Registre versões atuais, lockfiles e `central.app.json`.
13
- 3. Atualize os três pacotes para a mesma versão `0.7.x`.
14
- 4. Ajuste compatibilidade para `>=0.7.0 <0.8.0` somente quando a migração estiver pronta.
15
- 5. Rode `npm run ooncore:docs` e revise o diff de `.ooncore/`.
16
- 6. Remova `DEV_TOKEN`, `VITE_DEV_TOKEN`, tokens fixos e URLs da plataforma do caminho local.
17
- 7. Preserve `AGENTS.md` raiz, models, regras, provas e documentação do domínio.
18
- 8. Execute docs check, conformance, typecheck, testes e smoke offline.
16
+ O comando oficial regenera cache, manifesto e hashes; nunca edite `.ooncore` à mão. Versione os três package.json, seus lockfiles e o cache. Em Apps organizados como workspaces, use as opções de workspace equivalentes e preserve o lockfile único do projeto.
19
17
 
20
- Não atualize somente um pacote e não copie arquivos do Core manualmente para a Central.
18
+ Revise `central.app.json#compatibility.core` conforme as funções usadas e só aumente o mínimo após validar a migração. A faixa da linha é `__OONCORE_RANGE__`; os exemplos de [TASK_INDEX.md](TASK_INDEX.md) indicam seu piso específico. Não confunda o schema do manifesto com a versão do pacote.
19
+
20
+ Execute os testes existentes e o smoke da jornada. Testes do App devem verificar comportamento/compatibilidade, não um literal de versão antiga sem justificativa. Preserve configurações operacionais de publicação; tokens fixos e identidade de plataforma não pertencem ao caminho local. Publique pelo fluxo existente e registre o commit homologado em Dev. Nenhum outro App precisa atualizar por causa desta entrega.
21
+
22
+
23
+ Em Apps existentes, altere o script raiz `check` para `create-central-oon doctor`. Ele já inclui cache e conformance: não duplique essas duas verificações no mesmo CI. O procedimento acima preserva o domínio; o comando `example` é somente para bases novas. Falha parcial em npm install exige concluir os três upgrades antes do sync/check; não publique versões divergentes.
package/docs/ERRORS.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Contrato de erros
2
2
 
3
- Erros operacionais usam `{ error: { code, message, details?, requestId? } }` e status HTTP coerente.
3
+ Erros de domínio lançados com `GenericError` e `code` usam `{ message, error: { code, message, details?, requestId? } }` e status HTTP coerente. O App fornece mensagem/detalhes seguros; não há sanitização genérica de qualquer objeto externo. Respostas legadas/auth podem ter somente `message` e um 404 de proxy/Express pode ser HTML. Veja [PUBLIC_CONTRACTS.md](PUBLIC_CONTRACTS.md).
4
4
 
5
5
  | Código | Significado |
6
6
  |---|---|
@@ -0,0 +1,42 @@
1
+ # Exemplo integrado e diagnóstico de autoria
2
+
3
+ Disponível na release __OONCORE_VERSION__. Gere a base oficial seguindo [a entrada curta](OON_APP_AGENT_GUIDE.md). Na raiz da base limpa, com gerador instalado:
4
+
5
+ ```bash
6
+ npx --no-install create-central-oon example
7
+ npm run dev
8
+ ```
9
+
10
+ O comando instala model/CRUD/lista de Pessoas, formulário com rota privada, Tickets com transição de processo e consulta externa HTTPS. Inclui página `/jornada`, item **Primeira jornada** no menu e permissões no manifesto. `FIRST_JOURNEY.md` acompanha os arquivos e explica a execução. O comando verifica colisões e composição original antes de escrever; não sobrescreve trabalho existente. A base neutra continua sendo o padrão e o exemplo é opcional.
11
+
12
+ Use admin para validar a jornada; viewer comprova 403 sem reconfigurar a Plataforma. O segredo de integração fica exclusivamente na variável backend `INTEGRACAO_TOKEN`; `INTEGRACAO_URL` deve ser um destino HTTPS controlado pelo operador, sem credenciais na URL. Não envie token pela UI, não versione `.env`, não salve segredo pelo CRUD genérico. A rota `/integracao/testar` não armazena credenciais. A jornada adicional `/segredos` usa core.secrets V1 conforme [SECRETS.md](SECRETS.md), com cadastro em objeto, estado, uso e remoção. Não há fila ou retry genéricos. A página permanece visível para demonstrar a recusa e exibir diagnóstico; a proteção efetiva está nos endpoints.
13
+
14
+ Pessoa usa escopo tenant explícito. Ticket declarativo é restrito a single_tenant dedicado devido ao limite atual de propagação de escopo do domain manifest. O exemplo não é contrato para compartilhar essa model entre tenants.
15
+
16
+ ## Uma entrada de checks
17
+
18
+ ```bash
19
+ npm run check
20
+ npm run build --prefix frontend
21
+ ```
22
+
23
+ O novo scaffold usa `create-central-oon doctor` em `check`. Para um App anterior, substitua seu comando equivalente, preservando testes próprios. Doctor inclui:
24
+
25
+ - mesma versão instalada de backend/frontend/gerador e correspondência entre package.json e lockfile;
26
+ - lockfiles npm v2/v3 separados, ou lock único de workspace com backend/frontend declarados;
27
+ - App manifest, manifestos opcionais de domínio/processo e conformidade;
28
+ - cache oficial e hashes; corrija com `npm run ooncore:docs`;
29
+ - módulos TS/ESM não autocarregáveis, sintaxe CommonJS e imports relativos de diretórios de autoload que escapam de backend/;
30
+ - indicação de cwd e mapeamento `/api` público para rota interna, conforme configuração do scaffold.
31
+
32
+ Saída JSON contém códigos/caminhos e retorna exit code 1 quando houver pendências. Doctor não executa código do App, não resolve imports dinâmicos, não prova configurações de proxy modificadas e não substitui HTTP autenticado nem validação da imagem. Veja [empacotamento](APP_PACKAGING.md).
33
+
34
+ ## Provas no SDK
35
+
36
+ A suíte gera o App pela base oficial e instala esses mesmos arquivos. Com o Core real, MongoDB descartável e servidor HTTPS de teste, verifica execução do handler, validação, CRUD persistido, transição permitida/recusada, sessão/CSRF, 401/403, chamada externa e ausência do segredo em respostas/requestLog. Reinicia em outro processo com a estrutura backend/ + central.app.json, confirma persistência e testa cwd absoluto, relativo e diretório de execução backend.
37
+
38
+ `npm run check:authoring` no monorepo valida o gerador e compila a UI gerada após o build frontend. A suíte backend é executada separadamente uma única vez pelo CI e contém a jornada HTTP. Essas provas não afirmam que uma release já foi publicada, que uma imagem foi homologada ou que o emissor já foi atualizado. O 404 do emissor requer sua própria prova funcional em Dev.
39
+
40
+ ## Aplicação dos recursos nativos
41
+
42
+ A página `/recursos` do exemplo demonstra fórmulas, validações, bindings, invariantes, documentos, dashboard e PDF. O serviço de e-mail é opt-in. Consulte [NATIVE_RESOURCES.md](NATIVE_RESOURCES.md) para o roteiro, helpers de escopo e limites reais de isolamento, auditoria e execução.
@@ -0,0 +1,94 @@
1
+ # Recursos nativos: usar por tarefa, com fronteiras claras
2
+
3
+ Release **__OONCORE_VERSION__**. Esta é uma demonstração opcional, não uma migração obrigatória. Instale o exemplo em uma base limpa com `npx --no-install create-central-oon example`; abra **Primeira jornada** (`/jornada`) e **Recursos nativos** (`/recursos`). O App existente pode adotar somente a parte necessária. As fontes ficam em `examples/first-journey` do gerador instalado e são copiadas para o App; os testes do SDK executam esses mesmos arquivos com Core e MongoDB reais.
4
+
5
+ ## O que usar e o que continua no App
6
+
7
+ | Necessidade | Recurso público demonstrado | Fronteira |
8
+ |---|---|---|
9
+ | Cadastro/lista/formulário | `defineModel`, `fields`, CRUD, metadata e `CoreCollection` | Regras de negócio são declaradas pelo App; não salvar segredos no CRUD genérico |
10
+ | Regras do próprio registro | `central.domain.json`: validações e `computed` | AST fechada; backend recalcula e recusa adulteração, prévia na UI não concede autoridade |
11
+ | Etapas e bloqueios | `central.process.json`: workflow; `CorePipeline` em `/jornada` | PATCH direto também precisa satisfazer a regra; esconder botão não protege dado |
12
+ | Valores relacionados | bindings `lookup`, `aggregate`, `expression` | Dependências e filtros devem estar declarados; não é sincronização com Omie |
13
+ | Limite concorrente | `relatedSumLteParentField` | Transação MongoDB exige replica set; protege mutações da model filha, não toda mudança arbitrária no pai |
14
+ | Documentos | `CoreDocument` com model `Documento` | Cadastro de textos; não promete upload, aprovação ou assinatura. Essas operações exigem contratos próprios |
15
+ | Indicadores | `CoreDashboard`: count, sum, groupCount | Agrega no backend; exemplo usa apenas models do banco single-tenant dedicado |
16
+ | UX específica | Página React local, `useOonApi`, componentes públicos | Composição code-first; não substituir shell, sessão, RBAC ou guards |
17
+ | Rota/dado autorizado | `defineRoutes`, `req.accessContext`, helpers de escopo | Contexto vem da autenticação; não de tenant/app/roles enviados livremente |
18
+ | Rastreabilidade | Auditoria do CRUD, `audit`, requestLog e `sensitiveBody` | Nenhum desses recursos cifra automaticamente os dados de domínio |
19
+ | PDF/e-mail | `capabilities.pdf.render`, `capabilities.transactionalEmail.send` | Capabilities existentes, declaradas/configuradas separadamente; não são fila genérica de integração |
20
+
21
+ ## Roteiro de domínio e processo
22
+
23
+ Em **Contratos**, crie título `Exemplo`, quantidade `2`, valor unitário `50`. A metadata gera o formulário; o backend calcula `total=100`. A validação ilustrativa limita total a 1000. Enviar total adulterado pelo PATCH é recusado. A regra comercial e os valores são apenas didáticos.
24
+
25
+ Em **Parcelas**, selecione esse contrato e informe 40. O lookup preenche `tituloContrato`; o agregado atualiza `pago=40`; a expressão produz `saldo=60`. Renomeie o contrato enquanto aberto: o lookup é recalculado assincronamente. Reabra/atualize a lista para ver o estado persistido; não há promessa de push em tempo real.
26
+
27
+ Feche o contrato antes de continuar as parcelas. `lockedFieldsByStage` impede alterar título, quantidade e valor unitário; não é permitido voltar para Aberto. Uma parcela de 61 é recusada pela invariável. Duas requisições simultâneas de 40 disputando saldo 60 resultam em uma inclusão e uma recusa. A exclusão do contrato com parcelas também é bloqueada.
28
+
29
+ **Limite do exemplo:** a invariável está na model filha. Não garante que reduzir o total de um pai aberto preserve a soma anterior. A aplicação real precisa definir sua política para alteração/reabertura do pai; fechar o contrato estabiliza as entradas neste roteiro. O exemplo não é um módulo financeiro pronto.
30
+
31
+ `Contrato`, `Parcela` e `Ticket` são restritos ao App **single_tenant dedicado**: o domain manifest desta linha não propaga `scope`/`tenancy` para as models. Não adicionar campos inventados ao JSON nem adotar esses exemplos para isolamento de linhas multi-tenant. `Pessoa` e `Documento` usam `defineModel({ scope: "tenant" })` explicitamente.
32
+
33
+ O dashboard desta release aplica `crud.permissions.read` (com fallback legado de roles) e os helpers de escopo a todas as agregações. Models `legacy` continuam sem filtro de linha: a declaração correta do escopo permanece necessária. O exemplo demonstra Contrato no banco dedicado e a suíte comprova que Pessoa com escopo tenant não conta nem agrupa registros de outro tenant.
34
+
35
+ Referências sob demanda: [domínio](BACKEND_DOMAIN_MANIFEST.md), [fórmulas](REACTIVE_DOMAIN_FORMULAS.md), [processo](BACKEND_PROCESS_MANIFEST.md), [coleções/esteiras](COLLECTIONS_AND_PIPELINES.md).
36
+
37
+ ## Rotas e helpers de escopo
38
+
39
+ O `defineModel` público devolve a entrada da model, com `definition` e `mongooseModel`. O exemplo exporta essa entrada de `src/models/Pessoa.js`. A rota `GET /recursos/pessoas/contagem` exige `pessoas.read` e usa:
40
+
41
+ ```js
42
+ const { mergeScopedFilter } = require("@oondemand/oon-core-back");
43
+ const pessoa = require("../models/Pessoa");
44
+ // Dentro de um handler privado já autenticado/autorizado:
45
+ const filter = mergeScopedFilter(pessoa, {}, req.accessContext);
46
+ const total = await pessoa.mongooseModel.countDocuments(filter);
47
+ ```
48
+
49
+ | Helper | Assinatura | Uso |
50
+ |---|---|---|
51
+ | `scopeFilter` | `(entryOrDefinition, accessContext)` | Filtro obrigatório de tenant/usuário |
52
+ | `mergeScopedFilter` | `(entryOrDefinition, filter, accessContext)` | Acrescenta escopo confiável a filtros de negócio permitidos |
53
+ | `scopedIdFilter` | `(entryOrDefinition, id, accessContext)` | Busca por ID dentro do escopo |
54
+ | `scopeMutation` | `(entryOrDefinition, data, accessContext)` | Impõe identidade confiável ao payload |
55
+
56
+ Os helpers não autenticam, não concedem permissão e não validam regras de domínio. Para `scope: "tenant"`, contexto sem tenant é recusado; `legacy`/`system` não produzem filtro de isolamento. Nunca repasse `req.query`/operadores Mongo arbitrários. `createAccessContext` estrutura uma identidade **já verificada**: não verifica um token nem autentica um body. Prefira `req.accessContext` nas rotas do App. Mutação direta pelo Mongoose não substitui o pipeline de validação, processo e auditoria do CRUD; a demonstração customizada é somente leitura.
57
+
58
+ ## Auditoria e segredos
59
+
60
+ CRUD oficial registra mutações bem-sucedidas em `ControleAlteracao`. Rotas privadas customizadas podem declarar `audit: { entidade: "MinhaEntidade", acao: "alterado" }`; a auditoria captura dados da resposta. Isso não equivale a uma trilha imutável de todas as tentativas ou a um histórico completo antes/depois. Não inclua credenciais no resultado auditado.
61
+
62
+ `requestLog` registra requisições não-GET; `sensitiveBody: true` em mutações privadas omite corpo de entrada e resposta naquele log, inclusive nas recusas. Não cifra banco; não mascara console, URL, query string, cabeçalhos, logs de integração, auditoria nem mensagens de erro. GET não ganha proteção adicional com essa opção. A rota de PDF usa corpo sensível; o exemplo externo da Entrega 2 mantém segredo exclusivamente no ambiente backend. Persistência cifrada de credenciais é responsabilidade de um contrato disponível ou do App. [Contrato completo](PUBLIC_CONTRACTS.md).
63
+
64
+ ## PDF e e-mail sem infraestrutura paralela
65
+
66
+ A página PDF chama `POST /recursos/pdf`, exige `pdf.render` e utiliza `capabilities.pdf.render(input, context)` com contexto autorizado, correlação e cancelamento. Sem capability resolvida retorna `PDF_RENDERING_UNAVAILABLE`. Para usar no ambiente publicado, acrescente a declaração de `oon.deploy.json` conforme [PDF_RENDERING.md](PDF_RENDERING.md); não configure endpoint/credencial de infraestrutura no App. O teste injeta transporte de PDF apenas no processo de teste, nunca no exemplo distribuído.
67
+
68
+ E-mail é **opt-in separado**, para não enviar mensagens nem exigir configuração ao iniciar o exemplo. O serviço `backend/src/services/confirmacao.js` demonstra o contrato público. Chame-o de uma ação privada autorizada depois de resolver destinatário e evento de negócio no backend. A chave `eventId` deve ser estável na repetição da mesma operação; não gere uma nova chave a cada retry. O resultado `accepted`/`duplicate` indica aceite, não entrega.
69
+
70
+ Para habilitar, preserve o manifesto e adicione `core.transactional-email` ao array `capabilities`, com estas configurações:
71
+
72
+ ```json
73
+ {
74
+ "capabilitySettings": {
75
+ "core.transactional-email": {
76
+ "enabled": true,
77
+ "scopePolicy": "tenant_override",
78
+ "retentionDays": 30,
79
+ "attachmentsPolicy": { "allowed": false },
80
+ "templates": [{ "code": "confirmacao", "definition": "./backend/emails/confirmacao.json", "initialStatus": "active" }]
81
+ }
82
+ }
83
+ }
84
+ ```
85
+
86
+ O caminho acima parte do `central.app.json` na raiz e aponta para o asset já instalado **dentro de backend/**, que acompanha o empacotamento. Se o manifesto ficar dentro de backend, use `./emails/confirmacao.json`. Configure o provedor no painel `CoreTransactionalEmail`, registrando página, menu e as permissões necessárias conforme [TRANSACTIONAL_EMAIL.md](TRANSACTIONAL_EMAIL.md). Não ponha credenciais em JSON. Sem declaração o serviço recusa com `EMAIL_CAPABILITY_NOT_DECLARED`; sem configuração não há garantia de envio. Não habilite envio real em testes.
87
+
88
+ ## Limites de execução
89
+
90
+ `recalculate: "async"` e `drainProcessJobs()` atendem recálculos do processo; a fila interna não é um contrato público durável de enqueue/claim/retry. A fila transacional de e-mail é específica de e-mail. Integrações Omie, mapeamentos fiscais, idempotência de efeitos externos, tickets e recuperação de negócio continuam no App ou em biblioteca de domínio compatível. Novas Capacidades têm acompanhamento independente e não bloqueiam a POC.
91
+
92
+ ## Evidências e aceite local
93
+
94
+ `check:authoring` gera a base, instala o exemplo, sincroniza/verifica o cache oficial e valida typecheck/build. A jornada HTTP do backend cobre fórmulas, adulteração, validação, lookup, agregado, recálculo assíncrono, transição/bloqueio, exclusão protegida, concorrência transacional, metadata, dashboard, escopo da consulta própria, auditoria, 401/403 e PDF indisponível/transport de teste. E-mail sem declaração falha fechado; a suíte própria da capability cobre envio/idempotência com dublês. Nenhum teste envia e-mail real. Build, release npm, publicação e homologação do App são estados distintos.
@@ -1,72 +1,53 @@
1
1
  # Criar e customizar um Oon App com um Agent
2
2
 
3
- Este é o roteiro canônico de autoria. O contrato de aceite é **closed-book**: o Agent recebe somente a árvore do App gerado, incluindo `.ooncore/`, e não precisa consultar o código-fonte do OonCore, repositórios de outros Apps ou documentação privada.
3
+ Roteiro da release **__OONCORE_VERSION__**. Comece por uma jornada pequena: uma pessoa abre uma página, executa uma ação e vê o resultado ou um erro útil. A árvore gerada e suas referências públicas devem ser suficientes.
4
4
 
5
- ## 1. Gerar a base
6
-
7
- Em um diretório vazio:
5
+ ## 1. Gerar
8
6
 
9
7
  ```bash
10
- npx --yes --package @oondemand/create-central-oon@0.6 create-central-oon meu-app --no-install
8
+ npx --yes --package @oondemand/create-central-oon@__OONCORE_VERSION__ create-central-oon meu-app --no-install
11
9
  cd meu-app
12
10
  npm install
13
- npm run ooncore:docs:check
11
+ npm install --prefix backend
12
+ npm install --prefix frontend
14
13
  ```
15
14
 
16
- O gerador cria backend, frontend, manifestos, gates e a documentação versionada em `.ooncore/`. Não copie arquivos de outro App para iniciar uma Central.
17
-
18
- ## 2. Ler antes de alterar
15
+ Use sempre o gerador oficial. Preserve o `AGENTS.md` próprio do projeto. Não copie outro App como base.
19
16
 
20
- 1. Leia `.ooncore/AGENTS.md`.
21
- 2. Confira `.ooncore/manifest.json` e rode `npm run ooncore:docs:check`.
22
- 3. Consulte [CAPABILITIES.md](CAPABILITIES.md).
23
- 4. Abra somente os contratos indicados para a tarefa.
24
- 5. Leia o `AGENTS.md` da raiz, quando o projeto possuir regras próprias.
17
+ ## 2. Executar
25
18
 
26
- Se a resposta não estiver nesses arquivos, pare e registre uma lacuna documental. Não deduza contrato lendo `node_modules`, `src/` privado ou outros repositórios.
19
+ Requer Node compatível com os pacotes instalados e MongoDB local disponível. Configure `MONGO_URI` no arquivo abaixo para um banco de desenvolvimento.
27
20
 
28
- ## 3. Separar os contratos
21
+ ```bash
22
+ cp backend/.env.example backend/.env
23
+ cp frontend/.env.example frontend/.env
24
+ npm run dev
25
+ ```
29
26
 
30
- | Necessidade | Local correto |
31
- |---|---|
32
- | Identidade, tipo do App, tenant, acesso, módulos e RBAC | `central.app.json` |
33
- | Recursos exigidos do ambiente de publicação | `oon.deploy.json` |
34
- | Models e regras de domínio | `backend/src` ou `backend/central.domain.json`, quando o contrato declarativo for adotado |
35
- | Rotas e serviços específicos | `backend/src/routes` e `backend/src/services` |
36
- | Rotas, navegação, páginas, tema e experiência | `frontend/src/app`, `frontend/src/pages` e `frontend/src/components` |
37
- | Auth, ativação, shell, CRUD, metadata e infraestrutura | OonCore; não reimplementar |
27
+ O comando inicia back/front em loopback e abre uma sessão técnica local. Não é necessário cadastrar o App na Plataforma para essa execução. PDF e outras operações de plataforma podem falhar fechado; detalhes sob demanda em [LOCAL_DEVELOPMENT.md](LOCAL_DEVELOPMENT.md).
38
28
 
39
- `central.app.json` e `oon.deploy.json` têm finalidades diferentes. Uma capability funcional do App pode exigir declaração no primeiro; uma dependência de infraestrutura, como renderização de PDF, é declarada no segundo. Siga o guia da capability.
29
+ ## 3. Implementar a primeira jornada
40
30
 
41
- ## 4. Customizar
31
+ Escolha uma intenção em [TASK_INDEX.md](TASK_INDEX.md). Para começar com página + ação + endpoint, use o exemplo de [PUBLIC_CONTRACTS.md](PUBLIC_CONTRACTS.md). Ajuste o domínio em `backend/src`, a experiência em `frontend/src` e as permissões em `central.app.json`.
42
32
 
43
- - Domínio: use [BACKEND_API.md](BACKEND_API.md), [BACKEND_DOMAIN_MANIFEST.md](BACKEND_DOMAIN_MANIFEST.md) e [BACKEND_PATTERNS.md](BACKEND_PATTERNS.md).
44
- - Frontend: use [FRONTEND_CODE_FIRST.md](FRONTEND_CODE_FIRST.md), [FRONTEND_API.md](FRONTEND_API.md) e os padrões de UI indicados no catálogo.
45
- - Segurança: declare permissões em `central.app.json`, aplique `requirePermission` no backend e use guards públicos no frontend.
46
- - Capabilities: abra o contrato dedicado antes de declarar ou consumir.
47
- - Runtime local: preserve o comportamento fail-closed descrito em [LOCAL_SECURITY_BOUNDARY.md](LOCAL_SECURITY_BOUNDARY.md).
33
+ Não antecipe lista completa de funcionalidades, múltiplos épicos ou matriz final de perfis. Para uma POC controlada, use o admin já declarado e mantenha as verificações de backend. Registre próximas funções em um backlog curto.
48
34
 
49
- Crie apenas código de negócio. URLs internas, credenciais, registries, transports e detalhes de implementação não pertencem ao App.
35
+ Se faltar informação, registre a lacuna, use extensão pública adequada no App e continue o que for independente. Não invente assinatura, leia internals como contrato ou remova controles de acesso para avançar.
50
36
 
51
- ## 5. Validar
37
+ ## 4. Validar
52
38
 
53
39
  ```bash
54
- npm run ooncore:docs:check
55
- npm run ooncore:conformance
56
40
  npm run check
57
- npm test
41
+ npm run build --prefix frontend
58
42
  ```
59
43
 
60
- Além dos gates, prove o fluxo de usuário da tarefa. Para respostas binárias, valide tipo, assinatura e download; para mutações, valide permissão, tenant, idempotência e erros.
44
+ `check` executa doctor, que reúne versões, lockfiles, manifestos, docs check e conformance; não é necessário repeti-los. Execute testes do App quando houver script e os testes relevantes da jornada. O scaffold neutro não cria `npm test` na raiz.
45
+
46
+ Prove ação, resultado e erro pela UI/API; para mutações, confirme persistência e acesso indevido recusado. Teste local não comprova integração externa nem publicação. `context.generated.md` fica disponível apenas para referência, sem leitura integral obrigatória.
61
47
 
62
- ## Critério final do Agent
48
+ ## 5. Publicar e validar em Dev
63
49
 
64
- O relato de entrega deve informar:
50
+ Versione código, manifestos, lockfiles e o cache `.ooncore`. Publique pelo fluxo já existente do Workspace/Plataforma e confira a jornada pelo endereço público autenticado de Dev. Registre o commit publicado e o resultado. Consulte [APP_PACKAGING.md](APP_PACKAGING.md) somente para detalhes de empacotamento.
65
51
 
66
- - contratos públicos consultados;
67
- - manifestos e pontos de extensão alterados;
68
- - testes e gates executados;
69
- - limitações do runtime local;
70
- - qualquer lacuna documental encontrada.
52
+ Identidade, tenancy, licenciamento, publicação e promoção são serviços homologados consumidos pelo App. Não os reimplemente nem reabra sua homologação global. Necessidade de nova Capacidade é um escopo separado. Build aprovado, publicado e homologado são estados distintos.
71
53
 
72
- Citar fonte privada como requisito de implementação significa que a tarefa ainda não atende a este contrato.