@seedgrid/ai-toolkit 0.3.2 → 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/Extensions/Catalogo-de-propriedades.md +3 -2
- package/seedgridKB/SeedGrid/Extensions/Indice.md +1 -0
- package/seedgridKB/SeedGrid/Extensions/ai-pricing/Configuracao.md +11 -18
- package/seedgridKB/SeedGrid/Extensions/ai-pricing/Exemplos.md +2 -2
- package/seedgridKB/SeedGrid/Extensions/ai-pricing/Visao-geral.md +2 -2
- package/seedgridKB/SeedGrid/Extensions/business-days/Configuracao.md +36 -0
- package/seedgridKB/SeedGrid/Extensions/business-days/Exemplos.md +37 -0
- package/seedgridKB/SeedGrid/Extensions/business-days/Visao-geral.md +48 -0
- package/seedgridKB/SeedGrid/Extensions/exchange/Configuracao.md +10 -16
- package/seedgridKB/SeedGrid/Extensions/exchange/Exemplos.md +2 -2
- package/seedgridKB/SeedGrid/Extensions/exchange/Visao-geral.md +2 -2
- package/seedgridKB/SeedGrid/Extensions/login-tenancy/Configuracao.md +4 -5
- package/seedgridKB/SeedGrid/Extensions/login-tenancy/Visao-geral.md +1 -1
- package/seedgridKB/SeedGrid/Extensions/subdomain-tenancy/Configuracao.md +3 -2
- package/seedgridKB/SeedGrid/Extensions/subdomain-tenancy/Visao-geral.md +2 -2
- package/seedgridKB/SeedGrid/Mapa-dos-repositorios.md +9 -0
- package/seedgridKB/SeedGrid/Produtos/Pulse/Autenticacao-e-chaves.md +89 -0
- package/seedgridKB/SeedGrid/Produtos/Pulse/Exemplos.md +44 -0
- package/seedgridKB/SeedGrid/Produtos/Pulse/Protocolo-e-API.md +191 -0
- package/seedgridKB/SeedGrid/Produtos/Pulse/SDKs.md +287 -0
- package/seedgridKB/SeedGrid/Produtos/Pulse/Servidor/Configuracao.md +128 -0
- package/seedgridKB/SeedGrid/Produtos/Pulse/Servidor/Instalacao.md +105 -0
- package/seedgridKB/SeedGrid/Produtos/Pulse/Servidor/Operacao.md +86 -0
- package/seedgridKB/SeedGrid/Produtos/Pulse/Servidor/Providers.md +121 -0
- package/seedgridKB/SeedGrid/Produtos/Pulse/UI/Configuracao.md +61 -0
- package/seedgridKB/SeedGrid/Produtos/Pulse/UI/Visao-geral.md +74 -0
- package/seedgridKB/SeedGrid/Produtos/Pulse/Visao-geral.md +96 -0
- 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 +38 -26
- package/seedgridKB/SeedGrid/Toolkit/rules/backend-seedgrid.md +45 -0
- package/seedgridKB/SeedGrid/Toolkit/skills/sg-code-review/SKILL.md +1 -1
- package/seedgridKB/SeedGrid/Toolkit/skills/sg-crud-back/SKILL.md +4 -4
- package/seedgridKB/SeedGrid/Toolkit/skills/sg-crud-front/SKILL.md +3 -3
- package/seedgridKB/SeedGrid/Toolkit/skills/sg-new-screen/SKILL.md +2 -2
- package/seedgridKB/SeedGrid/Toolkit/skills/sg-new-skill/SKILL.md +20 -5
- package/seedgridKB/SeedGrid/Toolkit/skills/sg-review/SKILL.md +3 -3
- package/seedgridKB/SeedGrid/Visao-geral.md +7 -0
- package/seedgridKB/manifest.json +8 -7
- /package/seedgridKB/SeedGrid/Toolkit/skills/sg-code-review/references/{checklist.md → code-review-checklist.md} +0 -0
- /package/seedgridKB/SeedGrid/Toolkit/skills/sg-crud-front/references/{checklist.md → crud-front-checklist.md} +0 -0
- /package/seedgridKB/SeedGrid/Toolkit/skills/sg-crud-front/references/{patterns.md → crud-front-patterns.md} +0 -0
- /package/seedgridKB/SeedGrid/Toolkit/skills/sg-crud-front/references/{routing.md → crud-front-routing.md} +0 -0
- /package/seedgridKB/SeedGrid/Toolkit/skills/sg-new-screen/references/{checklist.md → new-screen-checklist.md} +0 -0
- /package/seedgridKB/SeedGrid/Toolkit/skills/sg-new-screen/references/{steps.md → new-screen-steps.md} +0 -0
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
---
|
|
2
|
+
tags: [seedgrid, produto, pulse, realtime]
|
|
3
|
+
fonte: seedgrid-products/seedgrid-pulse
|
|
4
|
+
branch: main
|
|
5
|
+
commit: 9dcbdad
|
|
6
|
+
analisado-em: 2026-10-16
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# SeedGrid Pulse — visão geral
|
|
10
|
+
|
|
11
|
+
Hub **realtime** da plataforma SeedGrid: um produto (servidor Rust + UI Next.js + SDKs) que qualquer sistema SeedGrid usa para **publicar** eventos/comandos por HTTP e **entregar** a clientes conectados por WebSocket, sem reimplementar WebSocket, replay, retry, presença, backlog e isolamento de destino.
|
|
12
|
+
|
|
13
|
+
> O Pulse é um **produto** (`seedgrid-products/seedgrid-pulse`), não uma extension de `seedgrid-platform`. Ele *consome* crates da plataforma (security, login-tenancy, audit, apikeys); ver [[SeedGrid/Visao-geral|visão geral da plataforma]].
|
|
14
|
+
|
|
15
|
+
## O que o Pulse resolve
|
|
16
|
+
|
|
17
|
+
| Necessidade | Como o Pulse atende |
|
|
18
|
+
|---|---|
|
|
19
|
+
| Backend precisa avisar usuário/grupo/conta inteira em tempo real | `POST /api/v1/messages` com a chave `project` |
|
|
20
|
+
| Navegador/app precisa receber, sem segredo no cliente | **token curto** (`pct_…`) emitido pelo backend do produto |
|
|
21
|
+
| Agente instalado na máquina do cliente precisa ficar conectado | chave `client` + WebSocket com reconexão e **replay** |
|
|
22
|
+
| Confirmar recebimento e execução | `ack` (recebimento) e `result` (execução, com retry e DLQ) |
|
|
23
|
+
| Operar: ver conexões, backlog, falhas, apagar com segurança | UI operacional, métricas Prometheus, lixeira e audit |
|
|
24
|
+
|
|
25
|
+
## Duas funções: mensagens e tarefas
|
|
26
|
+
|
|
27
|
+
O Pulse faz dois trabalhos diferentes com o mesmo caminho `publisher → Pulse → subscriber`. Quem publica escolhe o trabalho com o `deliveryMode`:
|
|
28
|
+
|
|
29
|
+
| | **Mensagem** (envio simples) | **Tarefa** (execução) |
|
|
30
|
+
|---|---|---|
|
|
31
|
+
| Para que serve | avisar, notificar, atualizar tela: "o pedido mudou" | mandar alguém **fazer** algo e saber se deu certo: "renderize este relatório" |
|
|
32
|
+
| `deliveryMode` | `notification` (padrão) ou `acknowledged` | `processed` |
|
|
33
|
+
| O que o subscriber devolve | nada (`notification`) ou só o `ack` de recebimento (`acknowledged`) | `ack` e depois o `result`: `success`, `retryable` ou `permanent` |
|
|
34
|
+
| Se a execução falhar | não existe execução: não há o que falhar | retry automático e, esgotado o retry, **DLQ**; se o consumidor travar, o prazo de execução (`resultTimeoutSeconds`, Pulse 0.3.0) conta como falha |
|
|
35
|
+
| Termina quando | o servidor escreve no socket (`notification`) ou o `ack` chega (`acknowledged`) | `result: success` |
|
|
36
|
+
| Pode ir à DLQ | **nunca** | **sim**, e só ela |
|
|
37
|
+
|
|
38
|
+
Regra prática: se você só precisa que a informação **chegue**, use mensagem. Se precisa que algo seja **executado** e quer ser avisado (e poder reprocessar) quando falhar, use tarefa. Detalhes: [[SeedGrid/Produtos/Pulse/Protocolo-e-API#Delivery modes|Delivery modes]] e [[SeedGrid/Produtos/Pulse/Protocolo-e-API#DLQ: quando uma mensagem vai para lá|DLQ]].
|
|
39
|
+
|
|
40
|
+
## Peças
|
|
41
|
+
|
|
42
|
+
| Peça | Onde (no repo) | Tecnologia |
|
|
43
|
+
|---|---|---|
|
|
44
|
+
| Servidor | `backend/` | Rust, Axum, Postgres, Redis opcional |
|
|
45
|
+
| UI operacional | `frontend/seedgrid-pulse-ui/` | Next.js + `@seedgrid/fe-components` |
|
|
46
|
+
| SDKs publisher | `components/publishers/` | Java, Next, Dart, PHP, Rust, Delphi |
|
|
47
|
+
| SDKs subscriber | `components/subscribers/` | React, Angular, Flutter, Rust, Delphi |
|
|
48
|
+
| Exemplos prontos | `examples/` | Delphi VCL, Flutter, React (e Angular) |
|
|
49
|
+
| Harness de integração | `integration/seedgrid-pulse-sdk-it/` | contra Pulse real |
|
|
50
|
+
|
|
51
|
+
Versão do servidor e da UI na análise: **0.3.0** (Confirmado — `backend/Cargo.toml`, `frontend/seedgrid-pulse-ui/package.json`).
|
|
52
|
+
|
|
53
|
+
## Modelo mental (3 minutos)
|
|
54
|
+
|
|
55
|
+
```
|
|
56
|
+
backend do produto ──(chave project)──▶ POST /api/v1/messages ─┐
|
|
57
|
+
▼
|
|
58
|
+
navegador/app ◀──WebSocket── Pulse ◀── conta (fronteira de isolamento)
|
|
59
|
+
(token curto) │ └─ canal › grupo › usuário › evento
|
|
60
|
+
agente instalado ◀────────── │
|
|
61
|
+
(chave client) └─ pendente? fica guardado e é reentregue (replay)
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
- **Conta** é a fronteira: entrega e replay nunca cruzam contas.
|
|
65
|
+
- **Credenciais têm papéis distintos** e nunca se substituem — ver [[SeedGrid/Produtos/Pulse/Autenticacao-e-chaves|Autenticação e chaves]].
|
|
66
|
+
- **Delivery mode** escolhe o ciclo de vida: `notification` (padrão), `acknowledged`, `processed` — ver [[SeedGrid/Produtos/Pulse/Protocolo-e-API|Protocolo e API]].
|
|
67
|
+
|
|
68
|
+
## Mapa desta documentação
|
|
69
|
+
|
|
70
|
+
**Pulse (servidor)** — o backend Rust, com variáveis próprias:
|
|
71
|
+
- [[SeedGrid/Produtos/Pulse/Servidor/Instalacao|Instalação e execução]]
|
|
72
|
+
- [[SeedGrid/Produtos/Pulse/Servidor/Configuracao|Variáveis de ambiente do servidor]]
|
|
73
|
+
- [[SeedGrid/Produtos/Pulse/Servidor/Providers|Providers: Redis, Valkey, Dragonfly, NATS, RabbitMQ, Postgres]]
|
|
74
|
+
- [[SeedGrid/Produtos/Pulse/Servidor/Operacao|Operação: lixeira, retenção, auditoria, métricas, escala]]
|
|
75
|
+
|
|
76
|
+
**Pulse UI** — o painel Next.js, com variáveis próprias:
|
|
77
|
+
- [[SeedGrid/Produtos/Pulse/UI/Visao-geral|Visão geral, instalação e deploy]]
|
|
78
|
+
- [[SeedGrid/Produtos/Pulse/UI/Configuracao|Variáveis de ambiente da UI]]
|
|
79
|
+
|
|
80
|
+
**Transversal:**
|
|
81
|
+
- [[SeedGrid/Produtos/Pulse/Autenticacao-e-chaves|Autenticação, chaves, token curto e permissions]]
|
|
82
|
+
- [[SeedGrid/Produtos/Pulse/Protocolo-e-API|Protocolo realtime e API HTTP]]
|
|
83
|
+
- [[SeedGrid/Produtos/Pulse/SDKs|SDKs (publisher e subscriber por linguagem)]]
|
|
84
|
+
- [[SeedGrid/Produtos/Pulse/Exemplos|Exemplos executáveis (Delphi, Flutter, React, Angular)]]
|
|
85
|
+
|
|
86
|
+
## Como usar o Pulse em um projeto SeedGrid (receita curta)
|
|
87
|
+
|
|
88
|
+
1. Peça à operação do Pulse uma **conta** para o seu produto e as chaves: uma `project` (backend) e, se houver agentes, `client`.
|
|
89
|
+
2. Guarde a chave `project` **só no backend** (env/secret). Nunca em código de navegador/mobile.
|
|
90
|
+
3. No backend, instale o SDK **publisher** da sua linguagem e publique.
|
|
91
|
+
4. Se o cliente é navegador/app: crie uma rota autenticada no backend que chama `issueConnectToken` com o `subject` **da sessão**; o front usa o SDK **subscriber** com `getToken`.
|
|
92
|
+
5. Defina `channel`/`event` por convenção do produto (ex.: `orders` / `order.updated`) e use o `publicId` do usuário, nunca e-mail.
|
|
93
|
+
|
|
94
|
+
## Confiabilidade das informações
|
|
95
|
+
|
|
96
|
+
Conteúdo extraído de `README.md`, `backend/README.md`, `backend/env.md`, `backend/PROTOCOL.md`, `backend/docs/LIXEIRA-mensagens-e-contas.md`, `backend/src/config.rs`, `backend/migrations/` e dos READMEs dos SDKs. Quando algo vem só de documentação (não relido no código nesta análise), a nota diz.
|
|
@@ -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,54 +1,66 @@
|
|
|
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.
|
|
14
|
-
- **BE-05.** DTOs: sufixo `
|
|
15
|
-
- **
|
|
14
|
+
- **BE-05.** DTOs: sufixo `DTOReq` para entrada (request) e `DTORes` para saída (response): `ClienteDTOReq`, `ClienteDTORes`.
|
|
15
|
+
- O **Req** leva só as propriedades necessárias (um update não precisa do `id`) e, para relacionamentos, **somente a chave estrangeira** pelo `publicId` (`cidadePublicId`), nunca campos nem objeto da entidade relacionada. Validações (`@NotNull`, `@Size`...) ficam no próprio record; para exigir os obrigatórios só no POST/PUT, use um grupo `Full extends Default` dentro do record.
|
|
16
|
+
- O **Res** é **plano** ("plain"): tudo no mesmo nível, sem objetos aninhados. Traz o `publicId` (nunca o `id` interno) e, para cada relacionamento, o `publicId` e a descrição (`cidadePublicId`, `cidadeDescricao`), inclusive os de mais de um nível (`paisPublicId`, `paisDescricao`). Pode existir mais de um Res para a mesma entidade, com menos campos, conforme o uso (por exemplo uma listagem enxuta).
|
|
17
|
+
- Records Java, na pasta `dtos/` (BE-01).
|
|
18
|
+
|
|
19
|
+
```java
|
|
20
|
+
public record ClienteDTOReq(
|
|
21
|
+
@NotNull(groups = ClienteDTOReq.Full.class, message = "Informe o nome.")
|
|
22
|
+
@Pattern(regexp = ".*\\S.*", message = "Informe o nome.")
|
|
23
|
+
@Size(max = 255) String nome,
|
|
24
|
+
@NotNull(groups = ClienteDTOReq.Full.class) String cidadePublicId,
|
|
25
|
+
@NotNull(groups = ClienteDTOReq.Full.class) String categoriaPublicId
|
|
26
|
+
) {
|
|
27
|
+
/** Grupo do POST/PUT: exige os obrigatórios. Estende Default para manter @Size e @Pattern. */
|
|
28
|
+
public interface Full extends Default {}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
public record ClienteDTORes(
|
|
32
|
+
String publicId,
|
|
33
|
+
String nome,
|
|
34
|
+
String cidadePublicId, String cidadeDescricao,
|
|
35
|
+
String paisPublicId, String paisDescricao,
|
|
36
|
+
String categoriaPublicId, String categoriaDescricao
|
|
37
|
+
) {}
|
|
38
|
+
```
|
|
16
39
|
|
|
17
40
|
## Injeção e exceptions
|
|
18
41
|
|
|
19
42
|
- **BE-10.** Injeção **somente por construtor**, dependências `private final`. Nunca `@Inject` em atributo (só é permitido quando houver mais de um construtor).
|
|
20
|
-
- **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.
|
|
21
44
|
|
|
22
45
|
## Persistência
|
|
23
46
|
|
|
24
|
-
- **BE-20.** Flyway, com migrations separadas por projeto: `src/main/resources/db/migration/<project-name>` e `src/test/resources/db/migration/<project-name>`.
|
|
25
|
-
- **BE-21.**
|
|
26
|
-
- **BE-
|
|
27
|
-
- **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.
|
|
28
|
-
- **BE-24.** Índice único para o `publicId`: `CREATE UNIQUE INDEX idx_<table>_public_id ON <table>(public_id);`.
|
|
29
|
-
- **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.
|
|
30
50
|
|
|
31
51
|
## API REST
|
|
32
52
|
|
|
33
|
-
- **BE-30.** **Nunca** exponha `id`; exponha sempre `publicId`.
|
|
34
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`.
|
|
35
|
-
- **BE-32.** Filtros de busca textual usam `LIKE` por prefixo (`term + "%"`), nunca `"%" + term + "%"`.
|
|
36
54
|
|
|
37
55
|
## Testes
|
|
38
56
|
|
|
39
|
-
- **BE-40.** Todo projeto tem testes unitários e testes de integração com Testcontainers + PostgreSQL. Código sem teste não é considerado pronto.
|
|
40
57
|
- **BE-41.** Teste com mais de um `assert` agrupa-os com `assertAll`.
|
|
41
58
|
|
|
42
|
-
##
|
|
59
|
+
## LGPD e auditoria em Java
|
|
43
60
|
|
|
44
|
-
- **BE-
|
|
45
|
-
- **BE-
|
|
46
|
-
- **BE-
|
|
47
|
-
- **BE-
|
|
48
|
-
- **BE-
|
|
49
|
-
- **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`.
|
|
50
66
|
- **BE-66.** Cadastros novos seguem a skill `sg-crud-back`.
|
|
51
|
-
|
|
52
|
-
## Ao terminar
|
|
53
|
-
|
|
54
|
-
- **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.
|
|
@@ -13,7 +13,7 @@ Encontre problemas reais e verificáveis; evite comentários de estilo sem impac
|
|
|
13
13
|
|
|
14
14
|
1. **Escopo.** Obtenha o diff (por exemplo, `git diff` ou `git diff <base>...HEAD`) e o objetivo da mudança. Sem diff disponível, peça a lista de arquivos alterados.
|
|
15
15
|
2. **Contexto.** Leia o código ao redor de cada trecho alterado e os pontos que o chamam.
|
|
16
|
-
3. **Análise.** Percorra o [checklist](references/checklist.md). Para cada suspeita, construa um cenário concreto: entrada/estado → comportamento errado.
|
|
16
|
+
3. **Análise.** Percorra o [checklist](references/code-review-checklist.md). Para cada suspeita, construa um cenário concreto: entrada/estado → comportamento errado.
|
|
17
17
|
4. **Filtro.** Descarte suspeitas que não sustentam um cenário concreto. Não reporte preferências pessoais como defeitos.
|
|
18
18
|
5. **Verificações somente leitura.** Se útil, rode testes ou lint existentes para confirmar um achado. Não altere arquivos.
|
|
19
19
|
|
|
@@ -7,17 +7,17 @@ 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
|
-
7. **DTOs** (`dtos/`, BE-05): `...
|
|
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.
|
|
22
22
|
9. **Testes** (BE-40, BE-41): unitário do service e de integração do controller com Testcontainers + PostgreSQL, cobrindo CRUD, validação, permissão negada, **dado pessoal gravado cifrado** (consulta direta na coluna), busca pelo hash e registro de auditoria sem dado pessoal em claro. Vários asserts: `assertAll`.
|
|
23
23
|
10. **Fechar** (BE-50): rode build e testes, remova o que sobrou e liste os TODO.
|
|
@@ -31,10 +31,10 @@ To register the menu item, icon and permission of a new screen, use the `sg-new-
|
|
|
31
31
|
|
|
32
32
|
## Required Patterns
|
|
33
33
|
|
|
34
|
-
- Use the list/edit split described in `references/patterns.md`.
|
|
35
|
-
- Use `publicId` routing and proxy conventions from `references/routing.md`.
|
|
34
|
+
- Use the list/edit split described in `references/crud-front-patterns.md`.
|
|
35
|
+
- Use `publicId` routing and proxy conventions from `references/crud-front-routing.md`.
|
|
36
36
|
- Use `SgInputTextSearch` as the standard remote-search input.
|
|
37
|
-
- Use the checklist in `references/checklist.md` before closing the task.
|
|
37
|
+
- Use the checklist in `references/crud-front-checklist.md` before closing the task.
|
|
38
38
|
|
|
39
39
|
## Required UI Components
|
|
40
40
|
|
|
@@ -19,7 +19,7 @@ Nao executar sem o usuario pedir.)
|
|
|
19
19
|
|
|
20
20
|
## Passo a passo
|
|
21
21
|
|
|
22
|
-
Detalhes e exemplos de codigo de cada passo em `references/steps.md`.
|
|
22
|
+
Detalhes e exemplos de codigo de cada passo em `references/new-screen-steps.md`.
|
|
23
23
|
|
|
24
24
|
1. **Permissao (backend)** - migration nova em `backend/src/main/resources/db/migration/app/`
|
|
25
25
|
(`V3xxx__<assunto>.sql`, nunca editar uma ja aplicada): `insert into permissions` com o `audience` certo,
|
|
@@ -43,7 +43,7 @@ Detalhes e exemplos de codigo de cada passo em `references/steps.md`.
|
|
|
43
43
|
|
|
44
44
|
## Verificacao
|
|
45
45
|
|
|
46
|
-
Rodar o checklist de `references/checklist.md` antes de encerrar. No minimo:
|
|
46
|
+
Rodar o checklist de `references/new-screen-checklist.md` antes de encerrar. No minimo:
|
|
47
47
|
|
|
48
48
|
```bash
|
|
49
49
|
# os dois catalogos do cliente iguais (ignorando fim de linha)
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: sg-new-skill
|
|
3
|
-
description: Cria uma skill
|
|
3
|
+
description: Cria ou altera uma skill do projeto - pergunta nome, descrição, quando usar e passos, grava o SKILL.md em .ai/skills e sincroniza as pastas nativas do Claude Code e do Codex, atualizando o índice. Use SEMPRE que pedirem para criar, adicionar, escrever, editar, ajustar, renomear ou remover uma skill, ou para transformar um procedimento repetido em skill.
|
|
4
4
|
metadata:
|
|
5
5
|
toolkit: seedgrid-ai
|
|
6
6
|
---
|
|
7
7
|
|
|
8
|
-
# Criar uma skill
|
|
8
|
+
# Criar ou alterar uma skill
|
|
9
9
|
|
|
10
|
-
Toda skill nova do projeto nasce por aqui, para ficar completa e nos lugares certos. Não crie skill escrevendo arquivos soltos.
|
|
10
|
+
Toda skill nova do projeto nasce por aqui, e toda alteração passa por aqui, para ficar completa e nos lugares certos. Não crie nem edite skill escrevendo arquivos soltos. Para **alterar** uma skill existente, vá direto à seção [Alterar uma skill existente](#alterar-uma-skill-existente); os passos abaixo são de **criação**.
|
|
11
11
|
|
|
12
|
-
## Passos
|
|
12
|
+
## Passos (criar)
|
|
13
13
|
|
|
14
14
|
1. **Levantar os dados.** Pergunte o que faltar (junte as perguntas numa só mensagem e não pergunte o que o pedido já respondeu):
|
|
15
15
|
- **Nome:** minúsculas, números e hífens (`^[a-z0-9]+(-[a-z0-9]+)*$`), curto e específico (`gerar-relatorio-mensal`). Verbo ou tarefa, não "ajuda".
|
|
@@ -27,9 +27,24 @@ Toda skill nova do projeto nasce por aqui, para ficar completa e nos lugares cer
|
|
|
27
27
|
6. **Conferir.** Releia o `SKILL.md` gravado, confirme que as cópias são idênticas à de `.ai/skills/`, que nenhum link relativo está quebrado e que o `name` bate com a pasta.
|
|
28
28
|
7. **Entregar.** Liste os arquivos criados e diga como usar: pelo nome (`/<nome>` no Claude Code, `$<nome>` no Codex) ou pedindo a tarefa com as palavras da descrição. Avise que uma sessão nova da ferramenta é necessária para listar a skill no menu.
|
|
29
29
|
|
|
30
|
+
## Alterar uma skill existente
|
|
31
|
+
|
|
32
|
+
Vale para editar o conteúdo, ajustar a descrição, renomear ou remover.
|
|
33
|
+
|
|
34
|
+
1. **Localizar.** Confirme o nome em `.ai/skills/`. Se não existir, ofereça criar (passos acima). Leia a `.ai/skills/<nome>/` inteira (`SKILL.md` e `references/`).
|
|
35
|
+
2. **Verificar o dono.** Se o nome começa com `sg-`, ela é do toolkit: o `seedgrid-ai update` a sobrescreve e a edição local se perde. Avise e ofereça duas saídas: (a) alterar no conteúdo do `seedgrid-ai` (fonte e manifesto) para valer para todos; (b) criar uma skill do projeto com outro nome, sem `sg-`, que estenda ou substitua o comportamento. Só edite a cópia local de uma `sg-*` se o usuário insistir, e deixe claro que é temporário.
|
|
36
|
+
3. **Comparar as cópias.** Veja se `.claude/skills/<nome>/` e `.agents/skills/<nome>/` (as que existirem) estão iguais a `.ai/skills/<nome>/`. Se divergirem, mostre a diferença e pergunte qual vale antes de editar.
|
|
37
|
+
4. **Combinar a mudança.** Resuma o que vai mudar (antes e depois) e confirme se for uma mudança grande. Respeite as regras do passo 3 de criação: frontmatter só com `name` e `description`, corpo curto, detalhes em `references/`.
|
|
38
|
+
5. **Editar em `.ai/skills/<nome>/`** e só depois replicar o resultado, com o mesmo conteúdo, nas pastas nativas que o projeto usa.
|
|
39
|
+
- **Renomear:** mude a pasta e o `name` do frontmatter, nas três pastas e nos links relativos. Procure referências ao nome antigo em outras skills, em `.ai/rules/` e no `projeto.md`.
|
|
40
|
+
- **Remover:** só com pedido explícito. Apague a pasta nas três e a linha do `projeto.md`.
|
|
41
|
+
6. **Atualizar o índice.** Se a descrição, o nome ou a existência mudou, ajuste a linha em `.ai/skills/projeto.md`. Não edite `.ai/skills/index.md`.
|
|
42
|
+
7. **Conferir.** Releia o `SKILL.md` gravado, confirme que as cópias são idênticas, que nenhum link relativo está quebrado e que o `name` bate com a pasta.
|
|
43
|
+
8. **Entregar.** Liste os arquivos alterados, resuma a mudança e avise que uma sessão nova da ferramenta é necessária para o menu refletir nome ou descrição novos.
|
|
44
|
+
|
|
30
45
|
## Cuidados
|
|
31
46
|
|
|
32
47
|
- Skills do projeto (inclusive o `projeto.md`) não entram no lock do toolkit: o `seedgrid-ai update` atualiza o conteúdo do toolkit e não as altera nem as remove. Para virarem parte do toolkit, precisam ser adicionadas ao conteúdo do `seedgrid-ai` (fonte e manifesto).
|
|
33
48
|
- Uma skill, uma finalidade. Se a descrição precisa de "e também", provavelmente são duas skills.
|
|
34
49
|
- Não duplique regras que já estão em `.ai/rules/`: cite o arquivo.
|
|
35
|
-
-
|
|
50
|
+
- Nunca deixe as cópias divergirem: toda edição termina com as três pastas idênticas.
|
|
@@ -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
|
|
|
@@ -16,10 +16,17 @@ Base de documentação técnica do ecossistema SeedGrid, gerada a partir do cód
|
|
|
16
16
|
| Crates Rust | `rust/` | Portes 1:1 das extensions para servidores Axum (Java é a fonte da verdade), mais `broker` (mensageria) e `runtime`/`macros` (auto-wiring estilo CDI). |
|
|
17
17
|
| Front-end | `front/seedgrid-fe-components` | Biblioteca React `@seedgrid/fe-components` (componentes `Sg*`), tema, core de módulos, playground e módulos de tela `@seedgrid/fe-*` que consomem as APIs das extensions. |
|
|
18
18
|
|
|
19
|
+
## Produtos
|
|
20
|
+
|
|
21
|
+
| Produto | O que é | Documentação |
|
|
22
|
+
|---|---|---|
|
|
23
|
+
| **SeedGrid Pulse** | Hub realtime (REST + WebSocket, replay, retry, DLQ, presença) com SDKs publisher/subscriber em várias linguagens. Pode ser usado por qualquer sistema SeedGrid. | [[SeedGrid/Produtos/Pulse/Visao-geral\|Pulse]] · [[SeedGrid/Produtos/Pulse/Servidor/Instalacao\|servidor]] · [[SeedGrid/Produtos/Pulse/UI/Visao-geral\|UI]] · [[SeedGrid/Produtos/Pulse/SDKs\|SDKs]] |
|
|
24
|
+
|
|
19
25
|
## Por onde começar
|
|
20
26
|
|
|
21
27
|
- **Esqueci o nome de uma propriedade** → [[SeedGrid/Extensions/Catalogo-de-propriedades|Catálogo de propriedades]] (busque com `Ctrl+F` ou pela busca do Obsidian).
|
|
22
28
|
- **Quais valores um enum aceita / o que cada valor faz** → [[SeedGrid/Extensions/Catalogo-de-enums|Catálogo de enums]].
|
|
29
|
+
- **Quero usar o Pulse (realtime, notificações, WebSocket)** → [[SeedGrid/Produtos/Pulse/Visao-geral|Pulse]].
|
|
23
30
|
- **Quero entender uma extension** → [[SeedGrid/Extensions/Indice|Índice das extensions]].
|
|
24
31
|
- **Quero usar um componente React** → [[SeedGrid/SeedGrid-components/Indice|Índice dos componentes]].
|
|
25
32
|
- **Quero saber o que depende do quê** → [[SeedGrid/Mapa-dos-repositorios|Mapa dos repositórios]].
|
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
|
},
|
|
@@ -63,7 +64,7 @@
|
|
|
63
64
|
"name": "sg-code-review",
|
|
64
65
|
"files": [
|
|
65
66
|
"SKILL.md",
|
|
66
|
-
"references/checklist.md"
|
|
67
|
+
"references/code-review-checklist.md"
|
|
67
68
|
]
|
|
68
69
|
},
|
|
69
70
|
{
|
|
@@ -92,9 +93,9 @@
|
|
|
92
93
|
"name": "sg-crud-front",
|
|
93
94
|
"files": [
|
|
94
95
|
"SKILL.md",
|
|
95
|
-
"references/patterns.md",
|
|
96
|
-
"references/routing.md",
|
|
97
|
-
"references/checklist.md",
|
|
96
|
+
"references/crud-front-patterns.md",
|
|
97
|
+
"references/crud-front-routing.md",
|
|
98
|
+
"references/crud-front-checklist.md",
|
|
98
99
|
"agents/openai.yaml"
|
|
99
100
|
]
|
|
100
101
|
},
|
|
@@ -104,8 +105,8 @@
|
|
|
104
105
|
"name": "sg-new-screen",
|
|
105
106
|
"files": [
|
|
106
107
|
"SKILL.md",
|
|
107
|
-
"references/steps.md",
|
|
108
|
-
"references/checklist.md",
|
|
108
|
+
"references/new-screen-steps.md",
|
|
109
|
+
"references/new-screen-checklist.md",
|
|
109
110
|
"agents/openai.yaml"
|
|
110
111
|
]
|
|
111
112
|
},
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|