@seedgrid/ai-toolkit 0.3.3 → 0.3.4
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.
- package/README.md +2 -2
- package/dist/adapters/shared.js +1 -0
- package/docs/formato.md +1 -1
- package/package.json +1 -1
- package/seedgridKB/SeedGrid/Toolkit/agents/backend-java.md +1 -1
- package/seedgridKB/SeedGrid/Toolkit/agents/backend-rust.md +1 -1
- package/seedgridKB/SeedGrid/Toolkit/agents/qa.md +1 -1
- package/seedgridKB/SeedGrid/Toolkit/rules/backend-java-seedgrid.md +13 -25
- package/seedgridKB/SeedGrid/Toolkit/rules/backend-seedgrid.md +45 -0
- package/seedgridKB/SeedGrid/Toolkit/skills/sg-crud-back/SKILL.md +3 -3
- package/seedgridKB/SeedGrid/Toolkit/skills/sg-review/SKILL.md +3 -3
- package/seedgridKB/manifest.json +2 -1
package/README.md
CHANGED
|
@@ -23,7 +23,7 @@ Cada pasta de `.ai/` (`rules`, `agents`, `skills`, `templates`, `references`) te
|
|
|
23
23
|
| Destino | Conteúdo |
|
|
24
24
|
| --- | --- |
|
|
25
25
|
| `.ai/agents/` | Papéis (`arquiteto`, `backend-java`, `backend-rust`, `frontend-react`, `qa`, `revisor`) e `index.md` gerado |
|
|
26
|
-
| `.ai/rules/` | Coordenação, formato de entrega, personalização local e os **padrões SeedGrid obrigatórios** (`frontend-seedgrid`, `backend-java-seedgrid`) |
|
|
26
|
+
| `.ai/rules/` | Coordenação, formato de entrega, personalização local e os **padrões SeedGrid obrigatórios** (`frontend-seedgrid`, `backend-seedgrid`, `backend-java-seedgrid`) |
|
|
27
27
|
| `.ai/templates/` | Especificação de tarefa, decisão de arquitetura, relatório de validação |
|
|
28
28
|
| `.ai/references/` | Modos shared/native e glossário |
|
|
29
29
|
| `.ai/skills/index.md` | Índice gerado das skills (o que faz e quando usar) |
|
|
@@ -101,7 +101,7 @@ seedgrid-ai review back --tool codex # só o back-end, usando o Code
|
|
|
101
101
|
|
|
102
102
|
### `seedgrid-ai review`
|
|
103
103
|
|
|
104
|
-
Executa a skill `sg-review` na ferramenta de IA instalada, em modo não interativo e somente leitura (Claude Code: `claude -p` com ferramentas de leitura; Codex: `codex exec --sandbox read-only`). A skill confere o código contra as regras `FE-nn` e `BE-nn` (`.ai/rules/frontend-seedgrid.md` e `backend-java-seedgrid.md`) e o CLI mostra o relatório e devolve o código de saída.
|
|
104
|
+
Executa a skill `sg-review` na ferramenta de IA instalada, em modo não interativo e somente leitura (Claude Code: `claude -p` com ferramentas de leitura; Codex: `codex exec --sandbox read-only`). A skill confere o código contra as regras `FE-nn` e `BE-nn` (`.ai/rules/frontend-seedgrid.md`, `backend-seedgrid.md` e `backend-java-seedgrid.md`) e o CLI mostra o relatório e devolve o código de saída.
|
|
105
105
|
|
|
106
106
|
- **Escopo:** `front`, `back` ou nenhum (os dois). Por padrão revisa os arquivos alterados (diff); `--full` revisa o projeto inteiro.
|
|
107
107
|
- **Ferramenta:** `--tool claude|codex`. Sem a opção, usa a primeira disponível nesta ordem: Claude Code, Codex. Considera só os targets instalados no projeto que tenham a skill e o executável no `PATH`. O CLI não detecta em qual ferramenta você está trabalhando.
|
package/dist/adapters/shared.js
CHANGED
|
@@ -103,6 +103,7 @@ function brainLines(bundle) {
|
|
|
103
103
|
}
|
|
104
104
|
const STANDARD_RULES = [
|
|
105
105
|
['rules/frontend-seedgrid.md', 'front-end'],
|
|
106
|
+
['rules/backend-seedgrid.md', 'back-end, comum a todas as linguagens'],
|
|
106
107
|
['rules/backend-java-seedgrid.md', 'back-end Java'],
|
|
107
108
|
];
|
|
108
109
|
/** Padrões SeedGrid obrigatórios (front e back), quando o conteúdo os inclui. */
|
package/docs/formato.md
CHANGED
|
@@ -57,7 +57,7 @@ Arquivos e pastas que começam com ponto são ignorados.
|
|
|
57
57
|
```json
|
|
58
58
|
{
|
|
59
59
|
"schemaVersion": 2,
|
|
60
|
-
"contentVersion": "0.3.
|
|
60
|
+
"contentVersion": "0.3.4",
|
|
61
61
|
"toolkitBase": "SeedGrid/Toolkit",
|
|
62
62
|
"components": [
|
|
63
63
|
{ "id": "agents", "type": "agents", "files": ["agents/arquiteto.md"] },
|
package/package.json
CHANGED
|
@@ -24,7 +24,7 @@ Implementar mudanças no backend Java com código coerente com o projeto, testes
|
|
|
24
24
|
|
|
25
25
|
## Responsabilidades
|
|
26
26
|
|
|
27
|
-
- Seguir `.ai/rules/backend-java-seedgrid.md` (estrutura, injeção por construtor, `BaseEntity
|
|
27
|
+
- Seguir `.ai/rules/backend-seedgrid.md` (comum: `publicId`, busca por prefixo, testes, guardiões, LGPD, auditoria) e `.ai/rules/backend-java-seedgrid.md` (estrutura, injeção por construtor, `BaseEntity`/Panache, Flyway, DTOs).
|
|
28
28
|
- **Usar as extensions SeedGrid para acelerar**: antes de escrever autenticação, permissões, auditoria, notificação, billing, cache, storage ou criptografia, consulte o índice da KB (`.ai/brain/SeedGrid/Extensions/Indice.md`) e use a extension que já cobre a necessidade, configurada pelas propriedades documentadas. Só escreva código próprio quando nenhuma cobrir, e diga isso na entrega.
|
|
29
29
|
- **LGPD**: dado pessoal (CPF, CNPJ de pessoa física, telefone, e-mail, endereço, data de nascimento) segue o `seedgrid-privacy`: `@EncryptedField` (com `searchField` quando precisar buscar) e mascaramento nas saídas de auditoria, log e API (`@PersonalData`/`@MaskRule`). Cadastro novo usa a skill `sg-crud-back`.
|
|
30
30
|
- **Auditoria**: operações de criação, alteração e exclusão de entidades de negócio usam `@Audit` (extension `audit`).
|
|
@@ -28,7 +28,7 @@ Implementar mudanças em backends Rust do ecossistema SeedGrid reaproveitando os
|
|
|
28
28
|
- **LGPD**: dado pessoal (CPF, telefone, e-mail, endereço) segue o crate `seedgrid-rust-crate-privacy` (`#[derive(PersonalData)]`, criptografia de campo e hash de busca; mascaramento nas saídas de auditoria, log e API). Veja `.ai/brain/SeedGrid/Extensions/privacy/Rust.md`.
|
|
29
29
|
- **Auditoria**: alterações em entidades de negócio passam pelo crate `audit`.
|
|
30
30
|
- Os crates Rust são portes das extensions Java e o Java é a fonte da verdade: quando a nota Rust não cobrir um comportamento, consulte a nota Java e confirme no código antes de assumir equivalência. Não invente propriedades nem valores padrão.
|
|
31
|
-
- As regras de API e de dados que não dependem da linguagem valem aqui: nunca expor o `id` interno (expor `publicId`), migrations versionadas, busca textual por prefixo (`term%`), exceptions/erros tipados e testes de integração com PostgreSQL real.
|
|
31
|
+
- As regras de API e de dados que não dependem da linguagem valem aqui: nunca expor o `id` interno (expor `publicId`), migrations versionadas, busca textual por prefixo (`term%`), exceptions/erros tipados e testes de integração com PostgreSQL real. Siga `.ai/rules/backend-seedgrid.md` (regras `BE-nn` comuns a todas as linguagens, incluindo os testes-guardiões `...GuardianTest` do BE-42, que rodam no `cargo test`). Não há, no toolkit, regras próprias para Rust além dessas; siga o padrão do projeto e informe divergências.
|
|
32
32
|
- Tratar erros com tipos próprios (sem `unwrap`/`expect` em caminho de requisição), validar entradas e não registrar dados sensíveis em log.
|
|
33
33
|
- Escrever ou ajustar testes proporcionais à mudança; executar `cargo build`, `cargo test` e `cargo clippy` relevantes e relatar o resultado real.
|
|
34
34
|
|
|
@@ -27,7 +27,7 @@ Provar, com testes escritos e executados, que a mudança atende aos critérios d
|
|
|
27
27
|
## Responsabilidades
|
|
28
28
|
|
|
29
29
|
- Mapear cada critério de aceite para pelo menos uma verificação concreta e automatizada quando possível.
|
|
30
|
-
- **Criar os testes que faltam** nos padrões do projeto: unitários, de integração (no back SeedGrid, com Testcontainers e PostgreSQL; veja `.ai/rules/backend-
|
|
30
|
+
- **Criar os testes que faltam** nos padrões do projeto: unitários, de integração (no back SeedGrid, com Testcontainers e PostgreSQL; veja `.ai/rules/backend-seedgrid.md`) e de regressão. Vários asserts no mesmo teste ficam em `assertAll`. Teste-guardião (`...GuardianIT`/`...GuardianTest`, BE-42) nunca é alterado, enfraquecido nem desabilitado para fazer o build passar: se falhar, o defeito está no código de produção; em dúvida, pergunte ao dono.
|
|
31
31
|
- Executar build, lint, testes afetados e a suíte relevante; exercitar o comportamento alterado quando possível.
|
|
32
32
|
- Registrar comandos, resultados e evidências no formato do relatório de validação (`.ai/templates/relatorio-validacao.md`).
|
|
33
33
|
- Diferenciar "passou", "falhou" e "não executado (motivo)". Teste instável é repetido uma vez e relatado, nunca ocultado.
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
---
|
|
2
|
-
description: "Padrões obrigatórios do back-end Java SeedGrid: estrutura de pastas, injeção por construtor, exceptions tipadas, Flyway,
|
|
2
|
+
description: "Padrões obrigatórios do back-end Java SeedGrid (complementam backend-seedgrid.md): estrutura de pastas, injeção por construtor, exceptions tipadas, Flyway, Panache e BaseEntity, RestControllerPath, DTOs, assertAll, LGPD (privacy) e auditoria em Java. Leia antes de criar ou alterar código Java."
|
|
3
3
|
---
|
|
4
4
|
# Padrões do back-end Java SeedGrid
|
|
5
5
|
|
|
6
|
-
Regras **obrigatórias** para
|
|
6
|
+
Regras **obrigatórias** para projetos Java que usam o SeedGrid. Cada regra tem um id (`BE-nn`) para citar em revisões (`sg-review`). Leia junto com `.ai/rules/backend-seedgrid.md`, que traz o que vale em qualquer linguagem (dados, API, testes, guardiões, LGPD, auditoria); os ids são os mesmos, e esta rule acrescenta o **como** em Java. Para as extensions existentes (propriedades, enums, exemplos), consulte a KB: comece por `.ai/brain/SeedGrid/Extensions/Indice.md`.
|
|
7
7
|
|
|
8
8
|
## Estrutura e nomes
|
|
9
9
|
|
|
10
|
-
- **BE-01.** Quando aplicável, use as pastas `configs/`, `controllers/`, `dtos/`, `exceptions/`, `filters/`, `entities/`, `repositories
|
|
10
|
+
- **BE-01.** Quando aplicável, use as pastas `configs/`, `controllers/`, `dtos/`, `exceptions/`, `filters/`, `entities/`, `repositories/`, `services/`, `utils/` (com parcimônia) e `spis/`. Não crie pasta sem propósito claro.
|
|
11
11
|
- **BE-02.** Toda pasta (pacote) no **plural**.
|
|
12
12
|
- **BE-03.** Resources REST terminam em `Controller`, não `Resource` (`ClienteController`).
|
|
13
13
|
- **BE-04.** Use sempre a biblioteca `seedgrid-commons` nos projetos.
|
|
@@ -36,43 +36,31 @@ public record ClienteDTORes(
|
|
|
36
36
|
String categoriaPublicId, String categoriaDescricao
|
|
37
37
|
) {}
|
|
38
38
|
```
|
|
39
|
-
- **BE-06.** Todo SPI criado é indexado com o `jandex-maven-plugin` (goal `jandex`).
|
|
40
39
|
|
|
41
40
|
## Injeção e exceptions
|
|
42
41
|
|
|
43
42
|
- **BE-10.** Injeção **somente por construtor**, dependências `private final`. Nunca `@Inject` em atributo (só é permitido quando houver mais de um construtor).
|
|
44
|
-
- **BE-11.** Exceptions **tipadas** que reflitam o objetivo; nunca lance `RuntimeException` direto.
|
|
43
|
+
- **BE-11.** Exceptions **tipadas** que reflitam o objetivo; nunca lance `RuntimeException` direto.
|
|
45
44
|
|
|
46
45
|
## Persistência
|
|
47
46
|
|
|
48
|
-
- **BE-20.** Flyway, com migrations separadas por projeto: `src/main/resources/db/migration/<project-name>` e `src/test/resources/db/migration/<project-name>`.
|
|
49
|
-
- **BE-21.**
|
|
50
|
-
- **BE-
|
|
51
|
-
- **BE-23.** Toda entidade JPA estende uma base de `br.com.seedgrid.commons.persistence` (traz `id`, `publicId`, datas e usuário de criação/alteração): `BaseEntity` (JPA puro, inclui `active`) em **libs**, e `BaseEntityPanache` (estende `PanacheEntityBase`, sem `active`) em **hosts** que usam Panache (BE-21). Os relacionamentos usam o `id`; o `publicId` é só para busca externa.
|
|
52
|
-
- **BE-24.** Índice único para o `publicId`: `CREATE UNIQUE INDEX idx_<table>_public_id ON <table>(public_id);`.
|
|
53
|
-
- **BE-25.** Proibido `UPDATE` em massa por JPQL ou SQL direto: quebra a auditoria (`@PreUpdate`) e ignora regras de negócio.
|
|
47
|
+
- **BE-20.** Flyway, com migrations separadas por projeto: `src/main/resources/db/migration/<project-name>` e `src/test/resources/db/migration/<project-name>`.
|
|
48
|
+
- **BE-21.** Em hosts, Panache é livre e recomendado para os repositórios.
|
|
49
|
+
- **BE-23.** Toda entidade JPA estende uma base de `br.com.seedgrid.commons.persistence` (traz `id`, `publicId`, datas e usuário de criação/alteração): `BaseEntityPanache` (estende `PanacheEntityBase`, sem `active`) em hosts que usam Panache (BE-21), ou `BaseEntity` (JPA puro, inclui `active`) quando o projeto não usa Panache. Os relacionamentos usam o `id`; o `publicId` é só para busca externa.
|
|
54
50
|
|
|
55
51
|
## API REST
|
|
56
52
|
|
|
57
|
-
- **BE-30.** **Nunca** exponha `id`; exponha sempre `publicId`.
|
|
58
53
|
- **BE-31.** Os paths ficam centralizados em uma classe `RestControllerPath` no pacote `controllers` (`final`, construtor privado), usada na API **e** nos testes de integração. Padrão: constante do nome do parâmetro (`PUBLIC_ID_PARAM = "publicId"`), uma seção por recurso com a base (`USERS = "/users"`), os sub-paths (`USERS_BY_PUBLIC_ID = "/{" + PUBLIC_ID_PARAM + "}"`) e os caminhos completos com sufixo `_FULL` (`USERS_BY_PUBLIC_ID_FULL = USERS + USERS_BY_PUBLIC_ID`). O controller usa a base e os sub-paths; o teste usa os `_FULL`.
|
|
59
|
-
- **BE-32.** Filtros de busca textual usam `LIKE` por prefixo (`term + "%"`), nunca `"%" + term + "%"`.
|
|
60
54
|
|
|
61
55
|
## Testes
|
|
62
56
|
|
|
63
|
-
- **BE-40.** Todo projeto tem testes unitários e testes de integração com Testcontainers + PostgreSQL. Código sem teste não é considerado pronto.
|
|
64
57
|
- **BE-41.** Teste com mais de um `assert` agrupa-os com `assertAll`.
|
|
65
58
|
|
|
66
|
-
##
|
|
59
|
+
## LGPD e auditoria em Java
|
|
67
60
|
|
|
68
|
-
- **BE-
|
|
69
|
-
- **BE-
|
|
70
|
-
- **BE-
|
|
71
|
-
- **BE-
|
|
72
|
-
- **BE-
|
|
73
|
-
- **BE-65.** Endpoints protegidos com as anotações de segurança do Quarkus (`@Authenticated`, `@RolesAllowed`, `@PermissionsAllowed`) e permissões registradas conforme a extension `security`; a UI esconder um botão não substitui a checagem no back.
|
|
61
|
+
- **BE-61.** Dado pessoal usa o `seedgrid-privacy`: campo `String` com `@Convert(converter = EncryptedFieldAttributeConverter.class)` e `@EncryptedField`, coluna `length = 512`; se a busca por igualdade for necessária, `@EncryptedField(searchField = "<campo>Hash", normalize = ...)` com a coluna irmã `<campo>_hash` (`length = 64`) e a consulta feita pelo hash (`EncryptedFieldSearch#hashForSearch`, com a **mesma** normalização da anotação). Entidade com campo cifrado leva `@EntityListeners(EncryptedFieldListener.class)`.
|
|
62
|
+
- **BE-62.** O host liga `seedgrid.privacy.encryption.enabled=true` e fornece `seedgrid.privacy.crypto.key` e `seedgrid.privacy.search.key` (Base64, 32 bytes) por segredo/variável de ambiente, nunca em arquivo versionado.
|
|
63
|
+
- **BE-63.** Use `@PersonalData`/`@MaskRule` para mascarar dado pessoal em auditoria, log, exportação e resposta de erro (e `remove = true` para senha e segredos).
|
|
64
|
+
- **BE-64.** Criação, alteração e exclusão de entidades de negócio usam `@Audit` (`entityFqcn`, `operation`, `description`) no método de serviço, dentro de `@Transactional`.
|
|
65
|
+
- **BE-65.** Endpoints protegidos com as anotações de segurança do Quarkus (`@Authenticated`, `@RolesAllowed`, `@PermissionsAllowed`) e permissões registradas conforme a extension `security`.
|
|
74
66
|
- **BE-66.** Cadastros novos seguem a skill `sg-crud-back`.
|
|
75
|
-
|
|
76
|
-
## Ao terminar
|
|
77
|
-
|
|
78
|
-
- **BE-50.** Revise se não sobrou nada (classes e arquivos que deveriam ser removidos) e liste os TODO que ficaram no projeto.
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: "Padrões obrigatórios de qualquer back-end SeedGrid, em qualquer linguagem: dados e API (publicId, busca por prefixo), erros tipados, testes (Testcontainers, testes-guardiões), uso das extensions/crates, LGPD e auditoria. Leia antes de criar ou alterar código de back-end."
|
|
3
|
+
---
|
|
4
|
+
# Padrões comuns do back-end SeedGrid
|
|
5
|
+
|
|
6
|
+
Regras **obrigatórias** para quem usa o SeedGrid num back-end, seja qual for a linguagem. Cada regra tem um id (`BE-nn`) para citar em revisões (`sg-review`). Esta rule diz **o quê**; a rule da linguagem diz **como**: em Java, `backend-java-seedgrid.md`. Os ids são os mesmos nas duas: esta traz a regra, e a da linguagem acrescenta o que só vale nela.
|
|
7
|
+
|
|
8
|
+
Para as extensions (propriedades, enums, exemplos), consulte a KB: comece por `.ai/brain/SeedGrid/Extensions/Indice.md`. A coluna "Rust" do índice indica o crate equivalente.
|
|
9
|
+
|
|
10
|
+
## Dados
|
|
11
|
+
|
|
12
|
+
- **BE-22.** Chave primária no PostgreSQL: `id BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY`.
|
|
13
|
+
- **BE-24.** Índice único para o `publicId`: `CREATE UNIQUE INDEX idx_<table>_public_id ON <table>(public_id);`.
|
|
14
|
+
- **BE-25.** Proibido `UPDATE` em massa por JPQL ou SQL direto: quebra a auditoria e ignora regras de negócio.
|
|
15
|
+
|
|
16
|
+
## API
|
|
17
|
+
|
|
18
|
+
- **BE-30.** **Nunca** exponha `id`; exponha sempre `publicId`.
|
|
19
|
+
- **BE-32.** Filtros de busca textual usam `LIKE` por prefixo (`term + "%"`), nunca `"%" + term + "%"`.
|
|
20
|
+
|
|
21
|
+
## Erros
|
|
22
|
+
|
|
23
|
+
- **BE-11.** Exceptions/erros **tipados** que reflitam o objetivo; nunca lance um erro genérico (`RuntimeException` em Java; em Rust, tipos de erro próprios e sem `unwrap`/`expect` em caminho de requisição). Detalhes por linguagem na rule da linguagem.
|
|
24
|
+
|
|
25
|
+
## Testes
|
|
26
|
+
|
|
27
|
+
- **BE-40.** Todo projeto tem testes unitários e testes de integração com Testcontainers + PostgreSQL. Código sem teste não é considerado pronto.
|
|
28
|
+
- **BE-42.** **Testes-guardiões** protegem uma invariante crítica de negócio ou segurança cuja violação causa dano irrecuperável (exemplo: toda empresa/tenant mantém ao menos um usuário ativo com a role ADMIN; sem isso o cliente perde o acesso administrativo para sempre). Convenção:
|
|
29
|
+
- Nome da classe termina em `GuardianIT` (integração, Testcontainers + PostgreSQL) ou `GuardianTest` (unitário), por exemplo `LastAdminGuardianIT`. O sufixo `Guardian` sozinho **não roda**: o surefire/failsafe (Maven) só executa classes que casam o padrão `*Test`/`*IT`. Em outras linguagens, use o nome que o runner do projeto executa e mantenha o `Guardian` no nome.
|
|
30
|
+
- Comentário/Javadoc no topo da classe com: o que a invariante protege, por que existe, o dano se for quebrada e quais caminhos cobre, mais o aviso: "TESTE-GUARDIÃO: NÃO ALTERAR, ENFRAQUECER, DESABILITAR (@Disabled), REMOVER ASSERTS nem relaxar expectativas sem decisão EXPLÍCITA do dono do projeto."
|
|
31
|
+
- Cobre **todos** os caminhos que podem violar a invariante (endpoints, services, fluxos de host, desativação por conta etc.), não só o caminho feliz.
|
|
32
|
+
- Se um guardião falhar, o defeito está no código de produção, não no teste. Nunca ajuste o teste para passar; se parecer que o teste está errado, pare e pergunte ao dono. Alterar um guardião só com autorização explícita do dono, registrada na mensagem do commit.
|
|
33
|
+
|
|
34
|
+
## Extensions/crates SeedGrid, LGPD e auditoria
|
|
35
|
+
|
|
36
|
+
- **BE-60.** Use as extensions (Java) ou os crates (Rust) SeedGrid antes de escrever código próprio de autenticação/permissões (`security`), auditoria (`audit`), notificação, billing, cache, storage, rate limit etc. Consulte `.ai/brain/SeedGrid/Extensions/Indice.md` e configure pelas propriedades documentadas. Código próprio só quando nenhum cobre, com a justificativa na entrega.
|
|
37
|
+
- **BE-61.** Dado pessoal (CPF, telefone, e-mail, endereço, data de nascimento, nome quando identifica a pessoa) usa o `privacy` do SeedGrid: cifrado em repouso e, se a busca por igualdade for necessária, consultado por hash. Anotações e colunas na rule da linguagem.
|
|
38
|
+
- **BE-62.** A cifra de campo é opt-in: o projeto liga a cifra e fornece as chaves por segredo/variável de ambiente, nunca em arquivo versionado.
|
|
39
|
+
- **BE-63.** Dado pessoal **não** vai em claro para auditoria, log, exportação ou resposta de erro: use o mascaramento do `privacy` (e remoção total para senha e segredos).
|
|
40
|
+
- **BE-64.** Criação, alteração e exclusão de entidades de negócio são auditadas pela extension/crate `audit`.
|
|
41
|
+
- **BE-65.** Endpoints protegidos pelo mecanismo de segurança da extension `security`; a UI esconder um botão não substitui a checagem no back.
|
|
42
|
+
|
|
43
|
+
## Ao terminar
|
|
44
|
+
|
|
45
|
+
- **BE-50.** Revise se não sobrou nada (classes e arquivos que deveriam ser removidos) e liste os TODO que ficaram no projeto.
|
|
@@ -7,15 +7,15 @@ metadata:
|
|
|
7
7
|
|
|
8
8
|
# CRUD de back-end SeedGrid
|
|
9
9
|
|
|
10
|
-
Monta um cadastro completo
|
|
10
|
+
Monta um cadastro completo nos padrões `.ai/rules/backend-seedgrid.md` e `.ai/rules/backend-java-seedgrid.md` (regras `BE-nn`), reaproveitando as extensions SeedGrid. Antes de começar, leia essa rule e, para cada extension usada, só a nota do grupo na KB (`.ai/brain/SeedGrid/Extensions/Indice.md` → `privacy`, `audit`, `commons`, `security`). Não invente propriedades nem anotações: confirme na KB ou no código.
|
|
11
11
|
|
|
12
12
|
## Passos
|
|
13
13
|
|
|
14
14
|
1. **Levantar.** Entidade, campos, quais são **dados pessoais** (CPF, telefone, e-mail, endereço, nascimento), quais precisam de **busca por igualdade**, permissões e se há relacionamentos. Leia um cadastro existente do projeto e copie as convenções dele. Dúvida de regra de negócio: pergunte.
|
|
15
|
-
2. **Entidade** (`entities/`): estenda a base do `seedgrid-commons` (BE-23). **
|
|
15
|
+
2. **Entidade** (`entities/`): estenda a base do `seedgrid-commons` (BE-23). **Com Panache** (recomendado em hosts, BE-21): `BaseEntityPanache` (`id`, `publicId`, datas, usuário de criação/alteração; sem `active`). **JPA puro:** `BaseEntity` (as mesmas colunas mais `active`). Se o projeto já tem cadastros, siga a base que eles usam. Relacionamentos usam o `id`; o `publicId` é só para fora (BE-30).
|
|
16
16
|
3. **Campos pessoais** (BE-61): para cada um, `@Convert(converter = EncryptedFieldAttributeConverter.class)` + `@EncryptedField`, coluna `length = 512`. Com busca: `@EncryptedField(searchField = "cpfHash", normalize = SearchNormalization.CANONICAL)` (e-mail: `EMAIL`) e o campo irmão `cpfHash` (`length = 64`). Adicione `@EntityListeners(EncryptedFieldListener.class)` na entidade. Marque os mesmos campos com `@PersonalData` para o mascaramento na auditoria (BE-63).
|
|
17
17
|
4. **Migration Flyway** (BE-20, BE-22, BE-24): tabela com `id BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY`, as colunas da base escolhida (`public_id`, `created_at`, `updated_at` como `timestamptz`, `create_user_public_id`, `update_user_public_id`, e `active` só no `BaseEntity`; a lib não traz migrations), colunas cifradas com `VARCHAR(512)` e de hash com `VARCHAR(64)`, e `CREATE UNIQUE INDEX idx_<tabela>_public_id ON <tabela>(public_id)`. A pasta segue `db/migration/<projeto>`.
|
|
18
|
-
5. **Repository** (`repositories
|
|
18
|
+
5. **Repository** (`repositories/`; Panache é livre e recomendado em hosts, BE-21). Busca por campo cifrado usa o hash: `CryptoProvider.getSecureSearch().hashForSearch(valor, <mesma normalização>)`.
|
|
19
19
|
6. **Service** (`services/`, injeção por construtor, BE-10): regras de negócio e exceptions tipadas (BE-11). Criar, alterar e excluir com `@Transactional` e `@Audit(entityFqcn = "...", operation = AuditOperationEnum.CREATE|UPDATE|DELETE, description = "...")` (BE-64). Para UPDATE/DELETE, o repository precisa expor `findByIdOptional` (é por ele que o `@Audit` captura o "antes").
|
|
20
20
|
7. **DTOs** (`dtos/`, BE-05): `...DTOReq` só com o necessário e relacionamentos apenas pela chave estrangeira (`cidadePublicId`); `...DTORes` plano, com `publicId` e **sem** `id`, e `publicId`+descrição de cada relacionamento (`cidadePublicId`, `cidadeDescricao`, `paisPublicId`...). Nada de dado pessoal em claro em respostas de erro ou log.
|
|
21
21
|
8. **Controller** (`controllers/`, BE-03, BE-31): primeiro acrescente a seção do recurso em `RestControllerPath` (base, `..._BY_PUBLIC_ID`, `..._FULL`; o controller usa base e sub-paths, o teste usa os `_FULL`); `GET` paginado (`page`, `size`, `sortField`, `sortOrder`, com `LIKE` por prefixo, BE-32), `GET` por `publicId`, `POST`, `PUT`, `DELETE`. Proteja com `@PermissionsAllowed("<ENTIDADE>_READ|CREATE|EDIT|DELETE")` (ou `@RolesAllowed`), conforme a extension `security` (BE-65), e registre as permissões como o projeto faz.
|
|
@@ -12,17 +12,17 @@ Confere o código contra as regras do toolkit e devolve uma lista objetiva de vi
|
|
|
12
12
|
## Escopo
|
|
13
13
|
|
|
14
14
|
- `front`: revisa só o front-end (regras `FE-nn`, arquivo `.ai/rules/frontend-seedgrid.md`).
|
|
15
|
-
- `back`: revisa só o back-end Java (regras `BE-nn`,
|
|
15
|
+
- `back`: revisa só o back-end Java (regras `BE-nn`, arquivos `.ai/rules/backend-seedgrid.md` e `.ai/rules/backend-java-seedgrid.md`).
|
|
16
16
|
- Sem argumento: revisa os dois. Se o projeto só tiver um lado (sem `pom.xml`/`*.java` ou sem `package.json`/`*.tsx`), diga isso e revise apenas o que existe.
|
|
17
17
|
|
|
18
18
|
Alvo: por padrão, os arquivos alterados (`git diff --name-only <base>...HEAD` mais os não commitados). Se o usuário pedir "o projeto inteiro" ou não houver diff, varra `src/` (back) e `app/`, `components/` (front).
|
|
19
19
|
|
|
20
20
|
## Passos
|
|
21
21
|
|
|
22
|
-
1. Leia **apenas** a rule do escopo (`.ai/rules/frontend-seedgrid.md` e/ou `.ai/rules/backend-java-seedgrid.md`). Para dúvida sobre um componente ou extension, abra pelo índice da KB (`.ai/brain/SeedGrid/SeedGrid-components/Indice.md`, `.ai/brain/SeedGrid/Extensions/Indice.md`) e só a nota do grupo; nunca varra `.ai/brain/` inteira.
|
|
22
|
+
1. Leia **apenas** a rule do escopo (`.ai/rules/frontend-seedgrid.md` e/ou `.ai/rules/backend-seedgrid.md` com `.ai/rules/backend-java-seedgrid.md`). Para dúvida sobre um componente ou extension, abra pelo índice da KB (`.ai/brain/SeedGrid/SeedGrid-components/Indice.md`, `.ai/brain/SeedGrid/Extensions/Indice.md`) e só a nota do grupo; nunca varra `.ai/brain/` inteira.
|
|
23
23
|
2. Faça primeiro as buscas mecânicas, sem abrir arquivo por arquivo. Exemplos:
|
|
24
24
|
- Front: `<input`, `<button`, `<select`, `<textarea`, `<table` em `*.tsx`; `window.confirm`, `alert(`; `SgInputText` em campo cujo nome/label indique telefone, whatsapp, cpf, cnpj, e-mail, cep, senha, valor, data (FE-10 a FE-19).
|
|
25
|
-
- Back: `@Inject` em atributo; `throw new RuntimeException`; `Resource` no nome de classe; `UPDATE ` em JPQL/SQL de código;
|
|
25
|
+
- Back: `@Inject` em atributo; `throw new RuntimeException`; `Resource` no nome de classe; `UPDATE ` em JPQL/SQL de código; endpoint que devolve `id` em vez de `publicId`; `"%" +` em `LIKE`; pacote no singular.
|
|
26
26
|
3. Abra só os arquivos com suspeita e confirme no contexto. Descarte falsos positivos (por exemplo, `<input>` dentro do próprio pacote de componentes, ou comentário que justifica a exceção da FE-01).
|
|
27
27
|
4. Para regras que exigem julgamento (FE-02, BE-05, BE-11, BE-40), reporte só o que você consegue sustentar com o trecho de código. Diga o que **não** conseguiu verificar.
|
|
28
28
|
|
package/seedgridKB/manifest.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": 2,
|
|
3
|
-
"contentVersion": "0.3.
|
|
3
|
+
"contentVersion": "0.3.4",
|
|
4
4
|
"toolkitBase": "SeedGrid/Toolkit",
|
|
5
5
|
"components": [
|
|
6
6
|
{
|
|
@@ -24,6 +24,7 @@
|
|
|
24
24
|
"rules/documentos.md",
|
|
25
25
|
"rules/personalizacao-local.md",
|
|
26
26
|
"rules/frontend-seedgrid.md",
|
|
27
|
+
"rules/backend-seedgrid.md",
|
|
27
28
|
"rules/backend-java-seedgrid.md"
|
|
28
29
|
]
|
|
29
30
|
},
|