@seedgrid/ai-toolkit 0.3.1 → 0.3.3
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 +3 -3
- package/dist/adapters/shared.js +12 -7
- package/dist/cli.js +1 -1
- package/dist/commands/review.js +2 -2
- package/dist/core/plan.js +5 -0
- package/docs/arquitetura.md +2 -2
- package/docs/compatibilidade.md +1 -1
- package/docs/formato.md +4 -4
- 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/arquiteto.md +1 -1
- package/seedgridKB/SeedGrid/Toolkit/agents/backend-java.md +2 -2
- package/seedgridKB/SeedGrid/Toolkit/agents/backend-rust.md +1 -1
- package/seedgridKB/SeedGrid/Toolkit/agents/frontend-react.md +1 -1
- package/seedgridKB/SeedGrid/Toolkit/agents/qa.md +2 -2
- package/seedgridKB/SeedGrid/Toolkit/agents/revisor.md +2 -2
- package/seedgridKB/SeedGrid/Toolkit/references/fluxo-de-trabalho.md +3 -3
- package/seedgridKB/SeedGrid/Toolkit/rules/backend-java-seedgrid.md +27 -3
- package/seedgridKB/SeedGrid/Toolkit/rules/coordenacao.md +1 -1
- package/seedgridKB/SeedGrid/Toolkit/rules/documentos.md +26 -0
- package/seedgridKB/SeedGrid/Toolkit/rules/frontend-seedgrid.md +2 -2
- package/seedgridKB/SeedGrid/Toolkit/skills/{seedgrid-bump → sg-bump}/SKILL.md +1 -1
- package/seedgridKB/SeedGrid/Toolkit/skills/{revisar-codigo → sg-code-review}/SKILL.md +2 -2
- package/seedgridKB/SeedGrid/Toolkit/skills/{seedgrid-backend-crud → sg-crud-back}/SKILL.md +4 -4
- package/seedgridKB/SeedGrid/Toolkit/skills/{seedgrid-crud → sg-crud-front}/SKILL.md +5 -5
- package/seedgridKB/SeedGrid/Toolkit/skills/{seedgrid-crud → sg-crud-front}/agents/openai.yaml +1 -1
- package/seedgridKB/SeedGrid/Toolkit/skills/{seedgrid-crud/references/routing.md → sg-crud-front/references/crud-front-routing.md} +1 -1
- package/seedgridKB/SeedGrid/Toolkit/skills/{seedgrid-new-screen → sg-new-screen}/SKILL.md +3 -3
- package/seedgridKB/SeedGrid/Toolkit/skills/sg-new-screen/agents/openai.yaml +4 -0
- package/seedgridKB/SeedGrid/Toolkit/skills/sg-new-skill/SKILL.md +50 -0
- package/seedgridKB/SeedGrid/Toolkit/skills/{planejar-mudanca → sg-plan-change}/SKILL.md +1 -1
- package/seedgridKB/SeedGrid/Toolkit/skills/{seedgrid-review → sg-review}/SKILL.md +1 -1
- package/seedgridKB/SeedGrid/Toolkit/skills/{validar-mudanca → sg-validate-change}/SKILL.md +1 -1
- package/seedgridKB/SeedGrid/Visao-geral.md +7 -0
- package/seedgridKB/manifest.json +32 -23
- package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-new-screen/agents/openai.yaml +0 -4
- /package/seedgridKB/SeedGrid/Toolkit/skills/{revisar-codigo/references/checklist.md → sg-code-review/references/code-review-checklist.md} +0 -0
- /package/seedgridKB/SeedGrid/Toolkit/skills/{seedgrid-crud/references/checklist.md → sg-crud-front/references/crud-front-checklist.md} +0 -0
- /package/seedgridKB/SeedGrid/Toolkit/skills/{seedgrid-crud/references/patterns.md → sg-crud-front/references/crud-front-patterns.md} +0 -0
- /package/seedgridKB/SeedGrid/Toolkit/skills/{seedgrid-new-screen/references/checklist.md → sg-new-screen/references/new-screen-checklist.md} +0 -0
- /package/seedgridKB/SeedGrid/Toolkit/skills/{seedgrid-new-screen/references/steps.md → sg-new-screen/references/new-screen-steps.md} +0 -0
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
---
|
|
2
|
+
tags: [seedgrid, produto, pulse, servidor, broker, redis, valkey, dragonfly, nats, rabbitmq, postgres]
|
|
3
|
+
fonte: seedgrid-products/seedgrid-pulse/backend (src/config.rs, src/broker.rs, tests/) + seedgrid-platform/rust/seedgrid-rust-crate-broker
|
|
4
|
+
branch: main
|
|
5
|
+
commit: 9dcbdad
|
|
6
|
+
analisado-em: 2026-10-16
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Pulse (servidor) — providers: broker, presença e store
|
|
10
|
+
|
|
11
|
+
O Pulse separa três responsabilidades, cada uma com seu provider. Voltar: [[SeedGrid/Produtos/Pulse/Servidor/Configuracao|Configuração do servidor]] · [[SeedGrid/Produtos/Pulse/Servidor/Instalacao|Instalação]].
|
|
12
|
+
|
|
13
|
+
| Responsabilidade | Variável | Opções | Para quê |
|
|
14
|
+
|---|---|---|---|
|
|
15
|
+
| **Broker** (pub/sub entre instâncias) | `BROKER_PROVIDER` | `memory`, `redis`, `nats`, `rabbitmq` | levar uma publicação a **todas** as instâncias, para a que tem o WebSocket entregar; e propagar revogação de credencial |
|
|
16
|
+
| **Presença** (quem está conectado em quê) | `PRESENCE_BACKEND` | `memory`, `redis` | presença por canal/grupo compartilhada entre instâncias |
|
|
17
|
+
| **Store de entregas** (mensagens, estados, DLQ) | `DELIVERY_STORE_BACKEND` | `memory`, `postgres` | durabilidade, replay, histórico |
|
|
18
|
+
|
|
19
|
+
## Quando precisa de quê
|
|
20
|
+
|
|
21
|
+
| Cenário | Broker | Presença | Store |
|
|
22
|
+
|---|---|---|---|
|
|
23
|
+
| Desenvolvimento / uma instância sem persistência | `memory` | `memory` | `memory` |
|
|
24
|
+
| **Uma instância em produção** | `memory` | `memory` | `postgres` |
|
|
25
|
+
| **Várias réplicas (escala)** | `redis` \| `nats` \| `rabbitmq` | **`redis`** | `postgres` |
|
|
26
|
+
|
|
27
|
+
- Sem broker compartilhado, uma réplica não entrega o que outra publicou (ver [[SeedGrid/Produtos/Pulse/Servidor/Operacao|Operação — diagnóstico]]).
|
|
28
|
+
- **A presença só tem `memory` e `redis`.** Com NATS ou RabbitMQ como broker em várias réplicas, ainda é preciso um servidor Redis-compatível para `PRESENCE_BACKEND=redis` (Confirmado — `config.rs`).
|
|
29
|
+
- O estado de entrega vive no **Postgres**; o broker é só o barramento. Por isso um broker sem persistência (NATS core) não perde mensagem do Pulse: o replay a recupera do banco.
|
|
30
|
+
|
|
31
|
+
## Redis e compatíveis (Valkey, Dragonfly, KeyDB…)
|
|
32
|
+
|
|
33
|
+
Usa pub/sub do protocolo Redis. Variáveis:
|
|
34
|
+
|
|
35
|
+
| Variável | Padrão | Descrição |
|
|
36
|
+
|---|---|---|
|
|
37
|
+
| `BROKER_PROVIDER=redis` | | |
|
|
38
|
+
| `BROKER_REDIS_URL` (fallback `REDIS_URL`) | — | `redis://host:6379/0`; use `rediss://` para TLS. 🔒 |
|
|
39
|
+
| `BROKER_REDIS_CHANNEL` (fallback `REDIS_PUBSUB_CHANNEL`) | `seedgrid:pulse:events` | canal pub/sub |
|
|
40
|
+
| `PRESENCE_BACKEND=redis` | | usa a mesma `BROKER_REDIS_URL` |
|
|
41
|
+
|
|
42
|
+
Como o Pulse só fala o protocolo Redis (cliente `redis` 0.32), qualquer servidor compatível serve — **basta apontar a URL**. Verificado em 2026-10-16 rodando a suíte `redis_integration` (broker pub/sub, presença com expiração/heartbeat e revogação entre instâncias) contra:
|
|
43
|
+
|
|
44
|
+
| Servidor | Imagem testada | Resultado |
|
|
45
|
+
|---|---|---|
|
|
46
|
+
| Redis | `redis:7.2.4` | 5/5 ✅ |
|
|
47
|
+
| Valkey | `valkey/valkey:8` | 5/5 ✅ |
|
|
48
|
+
| Dragonfly | `docker.dragonflydb.io/dragonflydb/dragonfly:latest` | 5/5 ✅ |
|
|
49
|
+
|
|
50
|
+
KeyDB e serviços gerenciados (ElastiCache, Memorystore, Upstash…) **não foram testados** aqui; devem funcionar por falarem o mesmo protocolo (Inferência) — rode a suíte antes de adotar.
|
|
51
|
+
|
|
52
|
+
Para validar outro servidor:
|
|
53
|
+
|
|
54
|
+
```bash
|
|
55
|
+
SG_PULSE_TEST_REDIS_IMAGE=<imagem>:<tag> \
|
|
56
|
+
DOCKER_HOST='npipe:////./pipe/podman-machine-default' TESTCONTAINERS_RYUK_DISABLED=true \
|
|
57
|
+
cargo test --test redis_integration -- --ignored --test-threads=1
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
Exemplo de troca (compose): no serviço `redis`, use a imagem `valkey/valkey:8` (ou Dragonfly) e mantenha `BROKER_REDIS_URL=redis://redis:6379/0`; nenhuma outra variável muda.
|
|
61
|
+
|
|
62
|
+
## NATS
|
|
63
|
+
|
|
64
|
+
Pub/sub **core** do NATS em um `subject`; cada instância assina o mesmo subject e recebe tudo (fan-out).
|
|
65
|
+
|
|
66
|
+
| Variável | Padrão | Descrição |
|
|
67
|
+
|---|---|---|
|
|
68
|
+
| `BROKER_PROVIDER=nats` | | |
|
|
69
|
+
| `BROKER_NATS_URL` (fallback `NATS_URL`) | — | `nats://host:4222`. **Obrigatória.** 🔒 |
|
|
70
|
+
| `BROKER_NATS_SUBJECT` | `seedgrid.pulse.events` | sem espaços nem curingas `*`/`>` |
|
|
71
|
+
| `PRESENCE_BACKEND` | `memory` | `redis` em multi-réplica |
|
|
72
|
+
|
|
73
|
+
- Entrega **at-most-once**, sem persistência (NATS core). Aceitável porque o estado de entrega está no Postgres e volta pelo replay.
|
|
74
|
+
- Sem reconexão automática do stream do broker (igual ao Redis): se a conexão cair, o stream termina com `warn`. Mantenha supervisão/restart do serviço.
|
|
75
|
+
|
|
76
|
+
Exemplo:
|
|
77
|
+
|
|
78
|
+
```env
|
|
79
|
+
BROKER_PROVIDER=nats
|
|
80
|
+
BROKER_NATS_URL=nats://nats:4222
|
|
81
|
+
PRESENCE_BACKEND=redis
|
|
82
|
+
BROKER_REDIS_URL=redis://redis:6379/0
|
|
83
|
+
DELIVERY_STORE_BACKEND=postgres
|
|
84
|
+
POSTGRES_URL=postgres://<user>:<senha>@<host>:5432/<db>
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
## RabbitMQ
|
|
88
|
+
|
|
89
|
+
Exchange **fanout** durável declarada no boot; cada instância cria a **própria fila exclusiva e auto-delete**, ligada ao exchange (fan-out entre instâncias).
|
|
90
|
+
|
|
91
|
+
| Variável | Padrão | Descrição |
|
|
92
|
+
|---|---|---|
|
|
93
|
+
| `BROKER_PROVIDER=rabbitmq` | | |
|
|
94
|
+
| `BROKER_RABBITMQ_URL` (fallbacks `RABBITMQ_URL`, `AMQP_URL`) | — | `amqp://user:senha@host:5672/%2f` (vhost codificado). **Obrigatória.** 🔒 |
|
|
95
|
+
| `BROKER_RABBITMQ_EXCHANGE` | `seedgrid.pulse.events` | nome do exchange fanout |
|
|
96
|
+
| `PRESENCE_BACKEND` | `memory` | `redis` em multi-réplica |
|
|
97
|
+
|
|
98
|
+
- `amqps://` (TLS) está habilitado na crate mas **não foi testado**.
|
|
99
|
+
- Sem reconexão automática do broker; filas exclusivas somem quando a instância cai (comportamento desejado no fan-out).
|
|
100
|
+
|
|
101
|
+
## Memória
|
|
102
|
+
|
|
103
|
+
`BROKER_PROVIDER=memory` (padrão; valor desconhecido também cai nele): barramento em processo. Só serve para **uma instância**.
|
|
104
|
+
|
|
105
|
+
## Readiness
|
|
106
|
+
|
|
107
|
+
`GET /ready` testa store, broker e presença e responde 200 `READY` ou 503 `NOT_READY` com o detalhe por componente. Para NATS e RabbitMQ a sonda é um `ping` com timeout de 5 s.
|
|
108
|
+
|
|
109
|
+
## Postgres (store de entregas e plataforma)
|
|
110
|
+
|
|
111
|
+
`POSTGRES_URL` é o interruptor da plataforma (login, audit, apikeys) e `DELIVERY_STORE_BACKEND=postgres` liga a persistência de entregas. As migrations rodam no boot (`POSTGRES_RUN_MIGRATIONS=true`); cada módulo usa a própria tabela de histórico (`_sqlx_migrations_*`). Qualquer Postgres gerenciado serve. Banco único, separação lógica por `company_id`.
|
|
112
|
+
|
|
113
|
+
## Como foi verificado
|
|
114
|
+
|
|
115
|
+
| Item | Evidência |
|
|
116
|
+
|---|---|
|
|
117
|
+
| Redis / Valkey / Dragonfly | `tests/redis_integration.rs`, 5/5 por servidor (Podman, testcontainers) |
|
|
118
|
+
| NATS e RabbitMQ | testes de container nas crates `seedgrid-broker-nats`/`-rabbitmq` (fan-out para 3 subscribers em 2 instâncias, payload malformado sem derrubar o stream, `ping`) e `tests/broker_providers_integration.rs` no Pulse (`build_broker` entrega a todos; `/ready` UP) |
|
|
119
|
+
| Postgres | `tests/postgres_integration.rs` |
|
|
120
|
+
|
|
121
|
+
Código-fonte dos brokers: `seedgrid-platform/rust/seedgrid-rust-crate-broker` (crates `-spi`, `-memory`, `-redis`, `-nats`, `-rabbitmq`); README da crate descreve o contrato `Broker` (`publish`/`subscribe`).
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
---
|
|
2
|
+
tags: [seedgrid, produto, pulse, ui, configuracao, variaveis]
|
|
3
|
+
fonte: seedgrid-products/seedgrid-pulse/frontend/seedgrid-pulse-ui (.env.example, src/app/layout.tsx)
|
|
4
|
+
branch: main
|
|
5
|
+
commit: 9dcbdad
|
|
6
|
+
analisado-em: 2026-10-16
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Pulse UI — variáveis de ambiente
|
|
10
|
+
|
|
11
|
+
Variáveis da **UI**. As do servidor estão em [[SeedGrid/Produtos/Pulse/Servidor/Configuracao|Configuração do servidor]]. Lidas em **runtime** (layout `force-dynamic`): no EasyPanel são env do container, sem rebuild. Visão geral: [[SeedGrid/Produtos/Pulse/UI/Visao-geral|Pulse UI]].
|
|
12
|
+
|
|
13
|
+
## Conexão com o Pulse
|
|
14
|
+
|
|
15
|
+
| Variável | Padrão | Descrição |
|
|
16
|
+
|---|---|---|
|
|
17
|
+
| `SEEDGRID_PULSE_SERVER_BASE_URL` | `http://127.0.0.1:18080` (exemplo do `.env.example`) | Base URL da API Pulse **alcançável pelo navegador**. Única informação de conexão entregue ao client. Fallback legado: `NEXT_PUBLIC_PULSE_BASE_URL`. |
|
|
18
|
+
| `SEEDGRID_PULSE_INTERNAL_BASE_URL` | = a anterior | Base URL usada pelo **servidor da UI** nos proxies (`/api/security/*`, `/api/pulse/messages`). Só precisa quando difere (containers na mesma rede, ex.: `http://seedgrid-pulse:8080`). |
|
|
19
|
+
|
|
20
|
+
Não existe credencial aqui: nem usuário/senha nem chave. As telas autenticam com o JWT do operador logado.
|
|
21
|
+
|
|
22
|
+
## Aparência e idioma
|
|
23
|
+
|
|
24
|
+
| Variável | Padrão | Descrição |
|
|
25
|
+
|---|---|---|
|
|
26
|
+
| `SEEDGRID_PULSE_DEFAULT_THEME_SEED` | `#16803D` | Cor semente do tema. Legado: `NEXT_PUBLIC_DEFAULT_THEME_SEED`. |
|
|
27
|
+
| `SEEDGRID_PULSE_DEFAULT_THEME_MODE` | `light` | `light` ou `dark`. Legado: `NEXT_PUBLIC_DEFAULT_THEME_MODE`. |
|
|
28
|
+
| `SEEDGRID_PULSE_UI_DEFAULT_LOCALE` | `pt-BR` | Idioma padrão: `en`, `pt-BR`, `pt-PT`, `fr`, `es`. Legado: `NEXT_PUBLIC_PULSE_UI_DEFAULT_LOCALE`. |
|
|
29
|
+
|
|
30
|
+
Os nomes `NEXT_PUBLIC_*` antigos seguem aceitos como fallback para imagens antigas; prefira os `SEEDGRID_PULSE_*`.
|
|
31
|
+
|
|
32
|
+
## Auto-refresh (polling, em segundos)
|
|
33
|
+
|
|
34
|
+
Padrão de todos: **30**.
|
|
35
|
+
|
|
36
|
+
| Variável | Tela |
|
|
37
|
+
|---|---|
|
|
38
|
+
| `NEXT_PUBLIC_DASHBOARD_REFRESH_SECONDS` | dashboard |
|
|
39
|
+
| `NEXT_PUBLIC_CONNECTIONS_REFRESH_SECONDS` | conexões |
|
|
40
|
+
| `NEXT_PUBLIC_MESSAGES_REFRESH_SECONDS` | mensagens |
|
|
41
|
+
| `NEXT_PUBLIC_BACKLOG_REFRESH_SECONDS` | backlog |
|
|
42
|
+
| `NEXT_PUBLIC_DELIVERIES_REFRESH_SECONDS` | entregas |
|
|
43
|
+
| `NEXT_PUBLIC_DLQ_REFRESH_SECONDS` | DLQ |
|
|
44
|
+
|
|
45
|
+
> **Não confirmado se mudar estes valores tem efeito.** A UI lê cada uma com `process.env[nome]` dinâmico (`src/lib/ui-refresh.ts`); em componente client o Next só substitui acessos estáticos (`process.env.NEXT_PUBLIC_X`) no build. Se o intervalo não mudar após definir a variável, o padrão de 30 s está valendo. Tratar como pendência a verificar antes de contar com este ajuste.
|
|
46
|
+
|
|
47
|
+
## Exemplo mínimo de produção
|
|
48
|
+
|
|
49
|
+
```env
|
|
50
|
+
SEEDGRID_PULSE_SERVER_BASE_URL=https://pulse.<seu-dominio>
|
|
51
|
+
SEEDGRID_PULSE_INTERNAL_BASE_URL=http://seedgrid-pulse:8080
|
|
52
|
+
SEEDGRID_PULSE_UI_DEFAULT_LOCALE=pt-BR
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
No servidor correspondente: `CORS_ALLOWED_ORIGINS=https://pulse-ui.<seu-dominio>`.
|
|
56
|
+
|
|
57
|
+
## O que NÃO colocar na UI
|
|
58
|
+
|
|
59
|
+
- `SEEDGRID_PULSE_SERVER_KEY` (chave de servidor) — a UI não a usa e ela não publica.
|
|
60
|
+
- Qualquer chave `project` ou `client`.
|
|
61
|
+
- Usuário/senha de operador em ENV (removido; o login é pela tela).
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
---
|
|
2
|
+
tags: [seedgrid, produto, pulse, ui, nextjs]
|
|
3
|
+
fonte: seedgrid-products/seedgrid-pulse/frontend/seedgrid-pulse-ui
|
|
4
|
+
branch: main
|
|
5
|
+
commit: 9dcbdad
|
|
6
|
+
analisado-em: 2026-10-16
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Pulse UI — visão geral, instalação e execução
|
|
10
|
+
|
|
11
|
+
Painel web **operacional/administrativo** do Pulse (Next.js + React + `@seedgrid/fe-components`). É um componente separado do servidor: tem imagem, deploy e variáveis próprios. Variáveis: [[SeedGrid/Produtos/Pulse/UI/Configuracao|Configuração da UI]]. Servidor: [[SeedGrid/Produtos/Pulse/Servidor/Instalacao|Pulse (servidor)]].
|
|
12
|
+
|
|
13
|
+
Voltar: [[SeedGrid/Produtos/Pulse/Visao-geral|Visão geral do Pulse]]
|
|
14
|
+
|
|
15
|
+
## O que a UI faz
|
|
16
|
+
|
|
17
|
+
| Área | Telas |
|
|
18
|
+
|---|---|
|
|
19
|
+
| Visão operacional | dashboard, conexões ativas, métricas e agregados |
|
|
20
|
+
| Mensagens | listagem (mais recente primeiro), detalhe (entregas por destinatário e tentativas, com o motivo `result_timeout` traduzido), publicação manual (inclui o campo opcional "Prazo de execução (s)"), **lixeira** (filtro "Na lixeira") |
|
|
21
|
+
| Pendências | backlog, descarte |
|
|
22
|
+
| Falhas | DLQ (reprocessar, limpar), lixeira da DLQ |
|
|
23
|
+
| Entregas | entregas por destinatário |
|
|
24
|
+
| Contas | contas, chaves (criar, rotacionar, revogar), **lixeira de contas** |
|
|
25
|
+
| Segurança | usuários, perfis/permissions, auditoria |
|
|
26
|
+
| Configurações | ajustes de entrega em runtime (retry, TTL, retenção, lixeira) |
|
|
27
|
+
|
|
28
|
+
Idiomas: en, pt-BR, pt-PT, fr, es.
|
|
29
|
+
|
|
30
|
+
## Como ela autentica
|
|
31
|
+
|
|
32
|
+
A UI **não guarda credencial de conexão**. As telas usam o **JWT do operador logado** (login do `security`) e cada ação exige a **permission** correspondente (RBAC) — ver [[SeedGrid/Produtos/Pulse/Autenticacao-e-chaves|Autenticação e chaves]]. Antes existiam `NEXT_PUBLIC_PULSE_BASIC_USER/_PASSWORD`; foram removidas porque o Next as embutia no bundle e elas ficavam legíveis no HTML. A tela de publicação publica **como o operador** (`PULSE_MESSAGE_PUBLISH`), não com a chave de servidor.
|
|
33
|
+
|
|
34
|
+
## Instalação e execução
|
|
35
|
+
|
|
36
|
+
Requisitos: Node 22 (a imagem usa `node:22-bookworm-slim`; Next 16, React 19).
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
cd frontend/seedgrid-pulse-ui
|
|
40
|
+
npm install
|
|
41
|
+
npm run dev # http://127.0.0.1:3000
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
Variáveis em `.env` (copie de `.env.example`). Com o `podman-compose`/`docker compose` da pasta, a UI sobe em `http://127.0.0.1:13000` junto de Pulse, Postgres e Redis.
|
|
45
|
+
|
|
46
|
+
Qualidade e testes:
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
npm run lint
|
|
50
|
+
npm run build
|
|
51
|
+
npm test # unitários (vitest)
|
|
52
|
+
npm run test:integration # sobe um mock do Pulse com testcontainers
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
## Imagem e deploy
|
|
56
|
+
|
|
57
|
+
- Imagem no GHCR: `ghcr.io/seedgrid/seedgrid-pulse-ui` (Confirmado — `.github/workflows/deploy.yml`).
|
|
58
|
+
- `push` em `main` com mudança em `frontend/**` publica a imagem e chama o webhook do EasyPanel (secret `EASYPANEL_DEPLOY_URL_PULSE_UI`).
|
|
59
|
+
- As variáveis são lidas em **runtime** pelo layout (`force-dynamic`): troca-se de ambiente mudando o env do container, **sem rebuild**.
|
|
60
|
+
|
|
61
|
+
## Rede: dois endereços do mesmo servidor
|
|
62
|
+
|
|
63
|
+
| Quem acessa | Variável | Exemplo |
|
|
64
|
+
|---|---|---|
|
|
65
|
+
| **Navegador** do operador | `SEEDGRID_PULSE_SERVER_BASE_URL` | `https://pulse.exemplo.com` |
|
|
66
|
+
| **Servidor da UI** (proxies `/api/security/*`, `/api/pulse/messages`) | `SEEDGRID_PULSE_INTERNAL_BASE_URL` | `http://seedgrid-pulse:8080` (mesma rede de containers) |
|
|
67
|
+
|
|
68
|
+
Se a UI e o servidor estão em containers na mesma rede, defina os dois; o interno é opcional e, ausente, usa o primeiro.
|
|
69
|
+
|
|
70
|
+
## Atenção
|
|
71
|
+
|
|
72
|
+
- A UI não deve receber `SEEDGRID_PULSE_SERVER_KEY`: a chave de servidor não publica e não pertence ao serviço da UI.
|
|
73
|
+
- O servidor precisa de `CORS_ALLOWED_ORIGINS` com a origem da UI.
|
|
74
|
+
- Papel `ADMIN` herda as permissions de lixeira (`PULSE_MESSAGE_DELETE/PURGE`, `PULSE_ACCOUNT_DELETE/PURGE`); outros perfis precisam recebê-las para ver os botões.
|
|
@@ -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.
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
id: arquiteto
|
|
3
3
|
description: Porta de entrada de toda tarefa não trivial - classifica (feature, bug, hotfix, refactor), faz as perguntas que tirem as dúvidas e entrega o plano com tarefas, paralelismo e critérios de aceite.
|
|
4
4
|
capabilities: [read-files]
|
|
5
|
-
preferred_skills: [
|
|
5
|
+
preferred_skills: [sg-plan-change]
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
# Arquiteto
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
id: backend-java
|
|
3
3
|
description: Implementa APIs Java, regras de negócio e persistência quando a tarefa altera o backend.
|
|
4
4
|
capabilities: [read-files, edit-files, run-checks]
|
|
5
|
-
preferred_skills: [
|
|
5
|
+
preferred_skills: [sg-crud-back, sg-validate-change]
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
# Backend Java
|
|
@@ -26,7 +26,7 @@ Implementar mudanças no backend Java com código coerente com o projeto, testes
|
|
|
26
26
|
|
|
27
27
|
- Seguir `.ai/rules/backend-java-seedgrid.md` (estrutura, injeção por construtor, `BaseEntity`/`publicId`, Flyway, testes).
|
|
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
|
-
- **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 `
|
|
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`).
|
|
31
31
|
- Seguir o framework, a estrutura de pacotes e as convenções já usadas no projeto; descobri-las lendo o código.
|
|
32
32
|
- Manter compatibilidade de contratos públicos, salvo decisão explícita em contrário.
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
id: backend-rust
|
|
3
3
|
description: Implementa APIs, regras de negócio e persistência em Rust com os crates SeedGrid (portes das extensions Java) quando a tarefa altera um backend Rust.
|
|
4
4
|
capabilities: [read-files, edit-files, run-checks]
|
|
5
|
-
preferred_skills: [
|
|
5
|
+
preferred_skills: [sg-validate-change]
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
# Backend Rust
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
id: frontend-react
|
|
3
3
|
description: Implementa telas, componentes e integração com APIs em React quando a tarefa altera o frontend.
|
|
4
4
|
capabilities: [read-files, edit-files, run-checks]
|
|
5
|
-
preferred_skills: [
|
|
5
|
+
preferred_skills: [sg-crud-front, sg-new-screen, sg-validate-change]
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
# Frontend React
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
id: qa
|
|
3
3
|
description: Garante a qualidade da entrega - cria e executa testes (unitários, integração, regressão) a partir dos critérios de aceite e valida cada critério com evidência executada.
|
|
4
4
|
capabilities: [read-files, edit-files, run-checks]
|
|
5
|
-
preferred_skills: [
|
|
5
|
+
preferred_skills: [sg-validate-change]
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
# QA
|
|
@@ -31,7 +31,7 @@ Provar, com testes escritos e executados, que a mudança atende aos critérios d
|
|
|
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.
|
|
34
|
-
- Conferir que o código segue o padrão SeedGrid quando a tarefa pedir (skill `
|
|
34
|
+
- Conferir que o código segue o padrão SeedGrid quando a tarefa pedir (skill `sg-review`).
|
|
35
35
|
|
|
36
36
|
## Limites
|
|
37
37
|
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
id: revisor
|
|
3
3
|
description: Revisa mudanças de código procurando defeitos, riscos de segurança e desvios das convenções antes da entrega.
|
|
4
4
|
capabilities: [read-files, run-checks]
|
|
5
|
-
preferred_skills: [
|
|
5
|
+
preferred_skills: [sg-code-review, sg-review]
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
# Revisor
|
|
@@ -28,7 +28,7 @@ Encontrar problemas reais na mudança antes que ela seja entregue, com achados v
|
|
|
28
28
|
- Procurar defeitos de lógica, casos de borda, tratamento de erro, segurança, concorrência, compatibilidade e testes ausentes.
|
|
29
29
|
- Classificar cada achado (bloqueante, importante, sugestão) com arquivo, linha e cenário concreto de falha.
|
|
30
30
|
- Descartar achados que não consegue sustentar com um cenário concreto.
|
|
31
|
-
- Conferir o padrão SeedGrid do que foi alterado (skill `
|
|
31
|
+
- Conferir o padrão SeedGrid do que foi alterado (skill `sg-review`): componentes e regras `FE-nn`, `BE-nn`.
|
|
32
32
|
|
|
33
33
|
## Limites
|
|
34
34
|
|
|
@@ -69,10 +69,10 @@ flowchart TD
|
|
|
69
69
|
|
|
70
70
|
## Manutenção (chore)
|
|
71
71
|
|
|
72
|
-
Bump de versão do projeto, atualização de configuração e tarefas parecidas vão direto para a skill adequada (por exemplo `
|
|
72
|
+
Bump de versão do projeto, atualização de configuração e tarefas parecidas vão direto para a skill adequada (por exemplo `sg-bump`), sem plano; o `qa` confere build e testes ao final.
|
|
73
73
|
|
|
74
74
|
## Skills que os papéis usam
|
|
75
75
|
|
|
76
|
-
- `
|
|
77
|
-
- `
|
|
76
|
+
- `sg-plan-change` (arquiteto), `sg-validate-change` (qa), `sg-code-review` e `sg-review` (revisor).
|
|
77
|
+
- `sg-crud-back` (backend-java), `sg-crud-front` e `sg-new-screen` (frontend-react), `sg-bump` (versão do projeto).
|
|
78
78
|
- A lista completa, com o que cada skill faz, está em `.ai/skills/index.md`.
|
|
@@ -3,7 +3,7 @@ description: "Padrões obrigatórios do back-end Java SeedGrid: estrutura de pas
|
|
|
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 (`
|
|
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`.
|
|
7
7
|
|
|
8
8
|
## Estrutura e nomes
|
|
9
9
|
|
|
@@ -11,7 +11,31 @@ Regras **obrigatórias** para novos projetos e bibliotecas SeedGrid. Cada regra
|
|
|
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 `
|
|
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
|
+
```
|
|
15
39
|
- **BE-06.** Todo SPI criado é indexado com o `jandex-maven-plugin` (goal `jandex`).
|
|
16
40
|
|
|
17
41
|
## Injeção e exceptions
|
|
@@ -47,7 +71,7 @@ Regras **obrigatórias** para novos projetos e bibliotecas SeedGrid. Cada regra
|
|
|
47
71
|
- **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
72
|
- **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
73
|
- **BE-65.** Endpoints protegidos com as anotações de segurança do Quarkus (`@Authenticated`, `@RolesAllowed`, `@PermissionsAllowed`) e permissões registradas conforme a extension `security`; a UI esconder um botão não substitui a checagem no back.
|
|
50
|
-
- **BE-66.** Cadastros novos seguem a skill `
|
|
74
|
+
- **BE-66.** Cadastros novos seguem a skill `sg-crud-back`.
|
|
51
75
|
|
|
52
76
|
## Ao terminar
|
|
53
77
|
|
|
@@ -36,4 +36,4 @@ Se o projeto exigir um fluxo obrigatório (por exemplo, revisão antes de todo c
|
|
|
36
36
|
|
|
37
37
|
## Artefatos
|
|
38
38
|
|
|
39
|
-
Os templates em `.ai/templates/` são modelos distribuídos pelo toolkit.
|
|
39
|
+
Os templates em `.ai/templates/` são modelos distribuídos pelo toolkit. Planos, handoffs, decisões, especificações e relatórios produzidos em tarefas reais são salvos em `.ai/docs/<tipo>/`, conforme [documentos](documentos.md), nunca dentro de `.ai/templates/`, `.ai/agents/` ou `.ai/rules/`, que são gerenciados e podem ser atualizados.
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: "Onde salvar os documentos que a IA gera (planos, handoff, decisões, relatórios, especificações): sempre em .ai/docs/<tipo>/. Leia antes de criar qualquer arquivo .md de trabalho."
|
|
3
|
+
---
|
|
4
|
+
# Documentos gerados pela IA
|
|
5
|
+
|
|
6
|
+
Todo documento de trabalho que a IA produzir (plano, handoff, decisão, especificação, relatório, análise, anotações de sessão) é salvo em **`.ai/docs/<tipo>/`**, nunca na raiz do projeto, em `docs/` do projeto ou dentro de `.ai/rules/`, `.ai/agents/`, `.ai/templates/` e `.ai/skills/`, que o toolkit gerencia e reescreve no `update`.
|
|
7
|
+
|
|
8
|
+
## Pastas por tipo
|
|
9
|
+
|
|
10
|
+
| Tipo | Pasta | Quando |
|
|
11
|
+
| --- | --- | --- |
|
|
12
|
+
| Plano | `.ai/docs/plans/` | Plano de uma mudança, aprovado ou não, antes de implementar |
|
|
13
|
+
| Handoff | `.ai/docs/handoff/` | Estado e próximos passos para outra sessão, papel ou pessoa continuar |
|
|
14
|
+
| Decisão | `.ai/docs/decisions/` | Decisão de arquitetura e o porquê (modelo: `decisao-arquitetura.md`) |
|
|
15
|
+
| Especificação | `.ai/docs/specs/` | Especificação de tarefa (modelo: `especificacao-tarefa.md`) |
|
|
16
|
+
| Validação | `.ai/docs/reports/` | Relatórios de validação, revisão e testes (modelo: `relatorio-validacao.md`) |
|
|
17
|
+
| Outros | `.ai/docs/<assunto>/` | Qualquer outro documento; crie a pasta com um nome curto no plural |
|
|
18
|
+
|
|
19
|
+
## Convenções
|
|
20
|
+
|
|
21
|
+
- Crie a pasta quando precisar. O toolkit não a cria nem a altera: o conteúdo é do projeto e sobrevive ao `update` e ao `remove`.
|
|
22
|
+
- Nome do arquivo: `AAAA-MM-DD-assunto-curto.md` (minúsculas, hífens, sem acentos), por exemplo `2026-10-15-crud-clientes.md`.
|
|
23
|
+
- Comece com um título e uma linha de contexto (tarefa, autor/papel, data). Não grave segredos, tokens nem dados pessoais.
|
|
24
|
+
- Antes de criar, veja se já existe documento do mesmo assunto na pasta e atualize-o em vez de duplicar.
|
|
25
|
+
- Ao citar um documento em outro, use caminho relativo.
|
|
26
|
+
- Versionar ou não é decisão do projeto: se o time não quiser versionar, ele ignora `.ai/docs/` no Git.
|
|
@@ -3,7 +3,7 @@ description: "Padrões obrigatórios do front-end SeedGrid: usar sempre os compo
|
|
|
3
3
|
---
|
|
4
4
|
# Padrões do front-end SeedGrid
|
|
5
5
|
|
|
6
|
-
Regras **obrigatórias** para telas React que usam `@seedgrid/fe-components`. Cada regra tem um id (`FE-nn`) para citar em revisões (`
|
|
6
|
+
Regras **obrigatórias** para telas React que usam `@seedgrid/fe-components`. Cada regra tem um id (`FE-nn`) para citar em revisões (`sg-review`). Para detalhes de props e exemplos, consulte a KB: comece por `.ai/brain/SeedGrid/SeedGrid-components/Indice.md` e abra só a nota do grupo necessário.
|
|
7
7
|
|
|
8
8
|
## Componentes SeedGrid primeiro
|
|
9
9
|
|
|
@@ -44,4 +44,4 @@ Nunca use `SgInputText` (nem `<input>` com máscara própria) para um dado que t
|
|
|
44
44
|
|
|
45
45
|
## CRUDs
|
|
46
46
|
|
|
47
|
-
Telas de cadastro seguem a skill `
|
|
47
|
+
Telas de cadastro seguem a skill `sg-crud-front` (páginas `*_list` e `*_edit`, `publicId` nas URLs, proxy em `app/api/...`). Nunca exponha o `id` numérico ao navegador quando houver `publicId`.
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
---
|
|
2
|
-
name:
|
|
2
|
+
name: sg-bump
|
|
3
3
|
description: Sobe a versão do projeto inteiro de uma vez, mantendo a mesma versão no back (pom.xml) e em todos os apps de front (package.json), e no que mais a exibir. Use quando pedirem bump, nova versão ou release do projeto (patch, minor, major ou uma versão informada). Não altera dependências.
|
|
4
4
|
metadata:
|
|
5
5
|
toolkit: seedgrid-ai
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
---
|
|
2
|
-
name:
|
|
2
|
+
name: sg-code-review
|
|
3
3
|
description: Revisa um diff ou conjunto de arquivos alterados procurando defeitos de lógica, segurança, tratamento de erros, compatibilidade e testes ausentes, com achados priorizados e cenário concreto de falha. Use após implementar uma mudança substancial ou quando pedirem revisão de código.
|
|
4
4
|
metadata:
|
|
5
5
|
toolkit: seedgrid-ai
|
|
@@ -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
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
---
|
|
2
|
-
name:
|
|
2
|
+
name: sg-crud-back
|
|
3
3
|
description: Cria ou padroniza um CRUD de back-end Java com as extensions SeedGrid - entidade com BaseEntity e publicId, migration Flyway, campos pessoais cifrados com seedgrid-privacy (LGPD), auditoria com @Audit, permissões, controller com RestControllerPath, DTOs e testes. Use ao criar uma entidade nova com API, ou ao adicionar campo pessoal, auditoria ou permissão a um cadastro existente.
|
|
4
4
|
metadata:
|
|
5
5
|
toolkit: seedgrid-ai
|
|
@@ -17,7 +17,7 @@ Monta um cadastro completo no padrão `.ai/rules/backend-java-seedgrid.md` (regr
|
|
|
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
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>)`.
|
|
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.
|
|
@@ -25,5 +25,5 @@ Monta um cadastro completo no padrão `.ai/rules/backend-java-seedgrid.md` (regr
|
|
|
25
25
|
## Cuidados
|
|
26
26
|
|
|
27
27
|
- Cifra de campo é opt-in: exige `seedgrid.privacy.encryption.enabled=true`, `seedgrid.privacy.crypto.key` e `seedgrid.privacy.search.key` fornecidos por variável de ambiente ou segredo, nunca versionados (BE-62). Sem a chave configurada, a leitura de valor já cifrado falha.
|
|
28
|
-
- A tela correspondente segue a skill `
|
|
29
|
-
- Para conferir o resultado contra o padrão, use `
|
|
28
|
+
- A tela correspondente segue a skill `sg-crud-front`; menu e permissão da tela, a `sg-new-screen`.
|
|
29
|
+
- Para conferir o resultado contra o padrão, use `sg-review back`.
|