@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.
Files changed (50) hide show
  1. package/README.md +2 -2
  2. package/dist/adapters/shared.js +1 -0
  3. package/docs/formato.md +1 -1
  4. package/package.json +1 -1
  5. package/seedgridKB/SeedGrid/Extensions/Catalogo-de-propriedades.md +3 -2
  6. package/seedgridKB/SeedGrid/Extensions/Indice.md +1 -0
  7. package/seedgridKB/SeedGrid/Extensions/ai-pricing/Configuracao.md +11 -18
  8. package/seedgridKB/SeedGrid/Extensions/ai-pricing/Exemplos.md +2 -2
  9. package/seedgridKB/SeedGrid/Extensions/ai-pricing/Visao-geral.md +2 -2
  10. package/seedgridKB/SeedGrid/Extensions/business-days/Configuracao.md +36 -0
  11. package/seedgridKB/SeedGrid/Extensions/business-days/Exemplos.md +37 -0
  12. package/seedgridKB/SeedGrid/Extensions/business-days/Visao-geral.md +48 -0
  13. package/seedgridKB/SeedGrid/Extensions/exchange/Configuracao.md +10 -16
  14. package/seedgridKB/SeedGrid/Extensions/exchange/Exemplos.md +2 -2
  15. package/seedgridKB/SeedGrid/Extensions/exchange/Visao-geral.md +2 -2
  16. package/seedgridKB/SeedGrid/Extensions/login-tenancy/Configuracao.md +4 -5
  17. package/seedgridKB/SeedGrid/Extensions/login-tenancy/Visao-geral.md +1 -1
  18. package/seedgridKB/SeedGrid/Extensions/subdomain-tenancy/Configuracao.md +3 -2
  19. package/seedgridKB/SeedGrid/Extensions/subdomain-tenancy/Visao-geral.md +2 -2
  20. package/seedgridKB/SeedGrid/Mapa-dos-repositorios.md +9 -0
  21. package/seedgridKB/SeedGrid/Produtos/Pulse/Autenticacao-e-chaves.md +89 -0
  22. package/seedgridKB/SeedGrid/Produtos/Pulse/Exemplos.md +44 -0
  23. package/seedgridKB/SeedGrid/Produtos/Pulse/Protocolo-e-API.md +191 -0
  24. package/seedgridKB/SeedGrid/Produtos/Pulse/SDKs.md +287 -0
  25. package/seedgridKB/SeedGrid/Produtos/Pulse/Servidor/Configuracao.md +128 -0
  26. package/seedgridKB/SeedGrid/Produtos/Pulse/Servidor/Instalacao.md +105 -0
  27. package/seedgridKB/SeedGrid/Produtos/Pulse/Servidor/Operacao.md +86 -0
  28. package/seedgridKB/SeedGrid/Produtos/Pulse/Servidor/Providers.md +121 -0
  29. package/seedgridKB/SeedGrid/Produtos/Pulse/UI/Configuracao.md +61 -0
  30. package/seedgridKB/SeedGrid/Produtos/Pulse/UI/Visao-geral.md +74 -0
  31. package/seedgridKB/SeedGrid/Produtos/Pulse/Visao-geral.md +96 -0
  32. package/seedgridKB/SeedGrid/Toolkit/agents/backend-java.md +1 -1
  33. package/seedgridKB/SeedGrid/Toolkit/agents/backend-rust.md +1 -1
  34. package/seedgridKB/SeedGrid/Toolkit/agents/qa.md +1 -1
  35. package/seedgridKB/SeedGrid/Toolkit/rules/backend-java-seedgrid.md +38 -26
  36. package/seedgridKB/SeedGrid/Toolkit/rules/backend-seedgrid.md +45 -0
  37. package/seedgridKB/SeedGrid/Toolkit/skills/sg-code-review/SKILL.md +1 -1
  38. package/seedgridKB/SeedGrid/Toolkit/skills/sg-crud-back/SKILL.md +4 -4
  39. package/seedgridKB/SeedGrid/Toolkit/skills/sg-crud-front/SKILL.md +3 -3
  40. package/seedgridKB/SeedGrid/Toolkit/skills/sg-new-screen/SKILL.md +2 -2
  41. package/seedgridKB/SeedGrid/Toolkit/skills/sg-new-skill/SKILL.md +20 -5
  42. package/seedgridKB/SeedGrid/Toolkit/skills/sg-review/SKILL.md +3 -3
  43. package/seedgridKB/SeedGrid/Visao-geral.md +7 -0
  44. package/seedgridKB/manifest.json +8 -7
  45. /package/seedgridKB/SeedGrid/Toolkit/skills/sg-code-review/references/{checklist.md → code-review-checklist.md} +0 -0
  46. /package/seedgridKB/SeedGrid/Toolkit/skills/sg-crud-front/references/{checklist.md → crud-front-checklist.md} +0 -0
  47. /package/seedgridKB/SeedGrid/Toolkit/skills/sg-crud-front/references/{patterns.md → crud-front-patterns.md} +0 -0
  48. /package/seedgridKB/SeedGrid/Toolkit/skills/sg-crud-front/references/{routing.md → crud-front-routing.md} +0 -0
  49. /package/seedgridKB/SeedGrid/Toolkit/skills/sg-new-screen/references/{checklist.md → new-screen-checklist.md} +0 -0
  50. /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`/`publicId`, Flyway, testes).
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. Não há, no toolkit, um conjunto de regras `BE-nn` próprio para Rust; siga o padrão do projeto e informe divergências.
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-java-seedgrid.md`) e de regressão. Vários asserts no mesmo teste ficam em `assertAll`.
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, JPA puro em libs, BaseEntity/publicId, RestControllerPath, DTOs, testes, uso das extensions SeedGrid, LGPD (privacy) e auditoria. Leia antes de criar ou alterar código Java."
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 novos projetos e bibliotecas SeedGrid. Cada regra tem um id (`BE-nn`) para citar em revisões (`sg-review`). Para as extensions existentes (propriedades, enums, exemplos), consulte a KB: comece por `.ai/brain/SeedGrid/Extensions/Indice.md`.
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/` (JPA puro), `services/`, `utils/` (com parcimônia) e `spis/`. Não crie pasta sem propósito claro.
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 `Request` para entrada e `Response` para saída; se o mesmo DTO serve aos dois, sufixo `DTO`. O Request tem só as propriedades necessárias (um update não precisa do `id`). O Response é "raso": ids e descrições em vez de objetos aninhados (`categoriaId`, `categoriaDescricao`).
15
- - **BE-06.** Todo SPI criado é indexado com o `jandex-maven-plugin` (goal `jandex`).
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. Em libs, o tratamento é por `ExceptionMapper`, filtro ou handler global; para a exception nova, crie uma `ApiExceptionExtension` que devolve `ProblemDetails`.
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>`. Em libs, combine o número `Vxxx__` previamente para não colidir com outras libs.
25
- - **BE-21.** **Proibido Panache em libs** (JPA puro). Em hosts, Panache é livre.
26
- - **BE-22.** Chave primária no PostgreSQL: `id BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY`.
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
- ## Extensions SeedGrid, LGPD e auditoria
59
+ ## LGPD e auditoria em Java
43
60
 
44
- - **BE-60.** Use as extensions 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 nenhuma extension cobre, com a justificativa na entrega.
45
- - **BE-61.** Dado pessoal (CPF, telefone, e-mail, endereço, data de nascimento, nome quando identifica a pessoa) 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)`.
46
- - **BE-62.** A cifra de campo é opt-in: 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.
47
- - **BE-63.** Dado pessoal **não** vai em claro para auditoria, log, exportação ou resposta de erro: use `@PersonalData`/`@MaskRule` (e `remove = true` para senha e segredos).
48
- - **BE-64.** Criação, alteração e exclusão de entidades de negócio são auditadas com `@Audit` (`entityFqcn`, `operation`, `description`) no método de serviço, dentro de `@Transactional`.
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 no padrão `.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.
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). **Host com Panache:** `BaseEntityPanache` (`id`, `publicId`, datas, usuário de criação/alteração; sem `active`). **Lib** (JPA puro, sem Panache, BE-21): `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).
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/`, JPA puro em libs; Panache só em hosts, BE-21). Busca por campo cifrado usa o hash: `CryptoProvider.getSecureSearch().hashForSearch(valor, <mesma normalização>)`.
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): `...Request` só com o necessário, `...Response` raso, com `publicId` e **sem** `id`. Nada de dado pessoal em claro em respostas de erro ou log.
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 nova no projeto - pergunta nome, descrição, quando usar e passos, e grava o SKILL.md em .ai/skills e nas pastas nativas do Claude Code e do Codex, atualizando o índice. Use SEMPRE que pedirem para criar, adicionar ou escrever uma skill, ou para transformar um procedimento repetido em 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
- - Para alterar uma skill existente do projeto, edite as três cópias e mantenha-as iguais.
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`, arquivo `.ai/rules/backend-java-seedgrid.md`).
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; Panache em módulo de lib; endpoint que devolve `id` em vez de `publicId`; `"%" +` em `LIKE`; pacote no singular.
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]].
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "schemaVersion": 2,
3
- "contentVersion": "0.3.2",
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
  },