@seedgrid/ai-toolkit 0.0.0-stage → 0.3.0
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/LICENSE +21 -0
- package/README.md +151 -2
- package/dist/adapters/claude.js +114 -0
- package/dist/adapters/codex.js +108 -0
- package/dist/adapters/index.js +17 -0
- package/dist/adapters/shared.js +142 -0
- package/dist/adapters/types.js +1 -0
- package/dist/cli.js +203 -0
- package/dist/commands/common.js +98 -0
- package/dist/commands/doctor.js +290 -0
- package/dist/commands/init.js +9 -0
- package/dist/commands/install.js +107 -0
- package/dist/commands/remove.js +54 -0
- package/dist/commands/review.js +127 -0
- package/dist/commands/status.js +73 -0
- package/dist/commands/update.js +8 -0
- package/dist/commands/validate.js +27 -0
- package/dist/core/apply.js +181 -0
- package/dist/core/blocks.js +64 -0
- package/dist/core/content.js +528 -0
- package/dist/core/env.js +40 -0
- package/dist/core/frontmatter.js +29 -0
- package/dist/core/hash.js +14 -0
- package/dist/core/inspect.js +51 -0
- package/dist/core/lock.js +124 -0
- package/dist/core/paths.js +65 -0
- package/dist/core/plan.js +242 -0
- package/dist/core/tools.js +62 -0
- package/dist/core/types.js +11 -0
- package/dist/core/updates.js +121 -0
- package/docs/arquitetura.md +80 -0
- package/docs/compatibilidade.md +50 -0
- package/docs/formato.md +155 -0
- package/docs/instalacao.md +105 -0
- package/docs/manutencao.md +115 -0
- package/package.json +43 -4
- package/seedgridKB/SeedGrid/Extensions/Catalogo-de-enums.md +161 -0
- package/seedgridKB/SeedGrid/Extensions/Catalogo-de-propriedades.md +971 -0
- package/seedgridKB/SeedGrid/Extensions/Indice.md +63 -0
- package/seedgridKB/SeedGrid/Extensions/ai-pricing/Configuracao.md +124 -0
- package/seedgridKB/SeedGrid/Extensions/ai-pricing/Enums.md +40 -0
- package/seedgridKB/SeedGrid/Extensions/ai-pricing/Exemplos.md +97 -0
- package/seedgridKB/SeedGrid/Extensions/ai-pricing/Visao-geral.md +114 -0
- package/seedgridKB/SeedGrid/Extensions/apikeys/Configuracao-Rust.md +69 -0
- package/seedgridKB/SeedGrid/Extensions/apikeys/Configuracao.md +88 -0
- package/seedgridKB/SeedGrid/Extensions/apikeys/Enums.md +33 -0
- package/seedgridKB/SeedGrid/Extensions/apikeys/Exemplos.md +121 -0
- package/seedgridKB/SeedGrid/Extensions/apikeys/Rust.md +126 -0
- package/seedgridKB/SeedGrid/Extensions/apikeys/Visao-geral.md +111 -0
- package/seedgridKB/SeedGrid/Extensions/audit/Configuracao-Rust.md +93 -0
- package/seedgridKB/SeedGrid/Extensions/audit/Configuracao.md +127 -0
- package/seedgridKB/SeedGrid/Extensions/audit/Enums.md +66 -0
- package/seedgridKB/SeedGrid/Extensions/audit/Exemplos.md +151 -0
- package/seedgridKB/SeedGrid/Extensions/audit/Rust.md +120 -0
- package/seedgridKB/SeedGrid/Extensions/audit/Visao-geral.md +114 -0
- package/seedgridKB/SeedGrid/Extensions/backup/Configuracao-Rust.md +136 -0
- package/seedgridKB/SeedGrid/Extensions/backup/Configuracao.md +319 -0
- package/seedgridKB/SeedGrid/Extensions/backup/Enums.md +131 -0
- package/seedgridKB/SeedGrid/Extensions/backup/Exemplos.md +210 -0
- package/seedgridKB/SeedGrid/Extensions/backup/Rust.md +135 -0
- package/seedgridKB/SeedGrid/Extensions/backup/Visao-geral.md +150 -0
- package/seedgridKB/SeedGrid/Extensions/billing/Configuracao-Rust.md +86 -0
- package/seedgridKB/SeedGrid/Extensions/billing/Configuracao.md +243 -0
- package/seedgridKB/SeedGrid/Extensions/billing/Enums.md +165 -0
- package/seedgridKB/SeedGrid/Extensions/billing/Exemplos.md +205 -0
- package/seedgridKB/SeedGrid/Extensions/billing/Rust.md +109 -0
- package/seedgridKB/SeedGrid/Extensions/billing/Visao-geral.md +181 -0
- package/seedgridKB/SeedGrid/Extensions/broker/Configuracao-Rust.md +40 -0
- package/seedgridKB/SeedGrid/Extensions/broker/Visao-geral.md +114 -0
- package/seedgridKB/SeedGrid/Extensions/cache/Configuracao-Rust.md +73 -0
- package/seedgridKB/SeedGrid/Extensions/cache/Configuracao.md +112 -0
- package/seedgridKB/SeedGrid/Extensions/cache/Enums.md +36 -0
- package/seedgridKB/SeedGrid/Extensions/cache/Exemplos.md +149 -0
- package/seedgridKB/SeedGrid/Extensions/cache/Rust.md +81 -0
- package/seedgridKB/SeedGrid/Extensions/cache/Visao-geral.md +90 -0
- package/seedgridKB/SeedGrid/Extensions/commons/Configuracao.md +107 -0
- package/seedgridKB/SeedGrid/Extensions/commons/Enums.md +105 -0
- package/seedgridKB/SeedGrid/Extensions/commons/Exemplos.md +141 -0
- package/seedgridKB/SeedGrid/Extensions/commons/Visao-geral.md +99 -0
- package/seedgridKB/SeedGrid/Extensions/exchange/Configuracao.md +122 -0
- package/seedgridKB/SeedGrid/Extensions/exchange/Enums.md +29 -0
- package/seedgridKB/SeedGrid/Extensions/exchange/Exemplos.md +82 -0
- package/seedgridKB/SeedGrid/Extensions/exchange/Visao-geral.md +118 -0
- package/seedgridKB/SeedGrid/Extensions/filemanagement/Configuracao-Rust.md +110 -0
- package/seedgridKB/SeedGrid/Extensions/filemanagement/Configuracao.md +157 -0
- package/seedgridKB/SeedGrid/Extensions/filemanagement/Exemplos.md +157 -0
- package/seedgridKB/SeedGrid/Extensions/filemanagement/Rust.md +70 -0
- package/seedgridKB/SeedGrid/Extensions/filemanagement/Visao-geral.md +88 -0
- package/seedgridKB/SeedGrid/Extensions/login-tenancy/Configuracao-Rust.md +124 -0
- package/seedgridKB/SeedGrid/Extensions/login-tenancy/Configuracao.md +195 -0
- package/seedgridKB/SeedGrid/Extensions/login-tenancy/Enums.md +71 -0
- package/seedgridKB/SeedGrid/Extensions/login-tenancy/Exemplos.md +149 -0
- package/seedgridKB/SeedGrid/Extensions/login-tenancy/Rust.md +139 -0
- package/seedgridKB/SeedGrid/Extensions/login-tenancy/Visao-geral.md +130 -0
- package/seedgridKB/SeedGrid/Extensions/notification/Configuracao.md +141 -0
- package/seedgridKB/SeedGrid/Extensions/notification/Enums.md +52 -0
- package/seedgridKB/SeedGrid/Extensions/notification/Exemplos.md +141 -0
- package/seedgridKB/SeedGrid/Extensions/notification/Visao-geral.md +113 -0
- package/seedgridKB/SeedGrid/Extensions/privacy/Configuracao-Rust.md +67 -0
- package/seedgridKB/SeedGrid/Extensions/privacy/Configuracao.md +94 -0
- package/seedgridKB/SeedGrid/Extensions/privacy/Enums.md +79 -0
- package/seedgridKB/SeedGrid/Extensions/privacy/Exemplos.md +172 -0
- package/seedgridKB/SeedGrid/Extensions/privacy/Rust.md +107 -0
- package/seedgridKB/SeedGrid/Extensions/privacy/Visao-geral.md +90 -0
- package/seedgridKB/SeedGrid/Extensions/realtime/Configuracao-Rust.md +72 -0
- package/seedgridKB/SeedGrid/Extensions/realtime/Configuracao.md +104 -0
- package/seedgridKB/SeedGrid/Extensions/realtime/Exemplos.md +104 -0
- package/seedgridKB/SeedGrid/Extensions/realtime/Rust.md +69 -0
- package/seedgridKB/SeedGrid/Extensions/realtime/Visao-geral.md +105 -0
- package/seedgridKB/SeedGrid/Extensions/resilience/Configuracao-Rust.md +68 -0
- package/seedgridKB/SeedGrid/Extensions/resilience/Configuracao.md +186 -0
- package/seedgridKB/SeedGrid/Extensions/resilience/Enums.md +96 -0
- package/seedgridKB/SeedGrid/Extensions/resilience/Exemplos.md +229 -0
- package/seedgridKB/SeedGrid/Extensions/resilience/Rust.md +80 -0
- package/seedgridKB/SeedGrid/Extensions/resilience/Visao-geral.md +112 -0
- package/seedgridKB/SeedGrid/Extensions/runtime/Configuracao-Rust.md +90 -0
- package/seedgridKB/SeedGrid/Extensions/runtime/Visao-geral.md +114 -0
- package/seedgridKB/SeedGrid/Extensions/security/Configuracao-Rust.md +327 -0
- package/seedgridKB/SeedGrid/Extensions/security/Configuracao.md +510 -0
- package/seedgridKB/SeedGrid/Extensions/security/Enums.md +95 -0
- package/seedgridKB/SeedGrid/Extensions/security/Exemplos.md +218 -0
- package/seedgridKB/SeedGrid/Extensions/security/Rust.md +203 -0
- package/seedgridKB/SeedGrid/Extensions/security/Visao-geral.md +131 -0
- package/seedgridKB/SeedGrid/Extensions/subdomain-tenancy/Configuracao-Rust.md +188 -0
- package/seedgridKB/SeedGrid/Extensions/subdomain-tenancy/Configuracao.md +345 -0
- package/seedgridKB/SeedGrid/Extensions/subdomain-tenancy/Enums.md +117 -0
- package/seedgridKB/SeedGrid/Extensions/subdomain-tenancy/Exemplos.md +205 -0
- package/seedgridKB/SeedGrid/Extensions/subdomain-tenancy/Rust.md +161 -0
- package/seedgridKB/SeedGrid/Extensions/subdomain-tenancy/Visao-geral.md +142 -0
- package/seedgridKB/SeedGrid/Extensions/whatsapp/Configuracao-Rust.md +75 -0
- package/seedgridKB/SeedGrid/Extensions/whatsapp/Configuracao.md +152 -0
- package/seedgridKB/SeedGrid/Extensions/whatsapp/Enums.md +198 -0
- package/seedgridKB/SeedGrid/Extensions/whatsapp/Exemplos.md +173 -0
- package/seedgridKB/SeedGrid/Extensions/whatsapp/Rust.md +83 -0
- package/seedgridKB/SeedGrid/Extensions/whatsapp/Visao-geral.md +99 -0
- package/seedgridKB/SeedGrid/Mapa-dos-repositorios.md +112 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/Indice.md +323 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/buttons/API.md +257 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/buttons/Exemplos.md +307 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/buttons/Visao-geral.md +51 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/datatable/API.md +174 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/datatable/Exemplos.md +236 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/datatable/Visao-geral.md +76 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/digits/API.md +339 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/digits/Exemplos.md +311 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/digits/Visao-geral.md +57 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/editor/API.md +125 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/editor/Exemplos.md +116 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/editor/Visao-geral.md +86 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/feedback-e-exibicao/API.md +490 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/feedback-e-exibicao/Exemplos.md +544 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/feedback-e-exibicao/Visao-geral.md +69 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/fundamentos/API.md +113 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/fundamentos/Exemplos.md +159 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/fundamentos/Visao-geral.md +92 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/gadgets/API.md +516 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/gadgets/Exemplos.md +629 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/gadgets/Visao-geral.md +80 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/inputs-selecao/API.md +615 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/inputs-selecao/Exemplos.md +384 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/inputs-selecao/Visao-geral.md +111 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/inputs-texto/API.md +661 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/inputs-texto/Exemplos.md +312 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/inputs-texto/Visao-geral.md +123 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/layout/API.md +1090 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/layout/Exemplos.md +1172 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/layout/Visao-geral.md +98 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/modulos/Visao-geral.md +98 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/modulos/fe-apikeys.md +118 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/modulos/fe-audit.md +88 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/modulos/fe-backup.md +131 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/modulos/fe-billing-platform.md +132 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/modulos/fe-billing-user.md +120 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/modulos/fe-login-tenancy.md +119 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/modulos/fe-security.md +427 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/modulos/fe-self-enter.md +104 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/modulos/fe-subdomain-tenancy.md +110 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/navegacao-e-overlay/API.md +490 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/navegacao-e-overlay/Exemplos.md +561 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/navegacao-e-overlay/Visao-geral.md +82 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/pacotes/Visao-geral.md +68 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/pacotes/fe-commons.md +61 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/pacotes/fe-core.md +140 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/pacotes/fe-playground.md +112 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/pacotes/fe-theme.md +97 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/providers/API.md +177 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/providers/Exemplos.md +332 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/providers/Visao-geral.md +106 -0
- package/seedgridKB/SeedGrid/SeedGrid-components/showcase.md +70 -0
- package/seedgridKB/SeedGrid/Toolkit/agents/arquiteto.md +53 -0
- package/seedgridKB/SeedGrid/Toolkit/agents/backend-java.md +45 -0
- package/seedgridKB/SeedGrid/Toolkit/agents/backend-rust.md +43 -0
- package/seedgridKB/SeedGrid/Toolkit/agents/frontend-react.md +41 -0
- package/seedgridKB/SeedGrid/Toolkit/agents/qa.md +44 -0
- package/seedgridKB/SeedGrid/Toolkit/agents/revisor.md +40 -0
- package/seedgridKB/SeedGrid/Toolkit/references/fluxo-de-trabalho.md +78 -0
- package/seedgridKB/SeedGrid/Toolkit/references/glossario.md +15 -0
- package/seedgridKB/SeedGrid/Toolkit/references/modos-shared-native.md +27 -0
- package/seedgridKB/SeedGrid/Toolkit/rules/backend-java-seedgrid.md +54 -0
- package/seedgridKB/SeedGrid/Toolkit/rules/coordenacao.md +39 -0
- package/seedgridKB/SeedGrid/Toolkit/rules/formato-entrega.md +29 -0
- package/seedgridKB/SeedGrid/Toolkit/rules/frontend-seedgrid.md +47 -0
- package/seedgridKB/SeedGrid/Toolkit/rules/personalizacao-local.md +22 -0
- package/seedgridKB/SeedGrid/Toolkit/skills/planejar-mudanca/SKILL.md +38 -0
- package/seedgridKB/SeedGrid/Toolkit/skills/revisar-codigo/SKILL.md +33 -0
- package/seedgridKB/SeedGrid/Toolkit/skills/revisar-codigo/references/checklist.md +25 -0
- package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-backend-crud/SKILL.md +29 -0
- package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-bump/SKILL.md +26 -0
- package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-crud/SKILL.md +221 -0
- package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-crud/agents/openai.yaml +4 -0
- package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-crud/references/checklist.md +31 -0
- package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-crud/references/patterns.md +185 -0
- package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-crud/references/routing.md +66 -0
- package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-new-screen/SKILL.md +56 -0
- package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-new-screen/agents/openai.yaml +4 -0
- package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-new-screen/references/checklist.md +32 -0
- package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-new-screen/references/steps.md +114 -0
- package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-review/SKILL.md +61 -0
- package/seedgridKB/SeedGrid/Toolkit/skills/validar-mudanca/SKILL.md +29 -0
- package/seedgridKB/SeedGrid/Toolkit/templates/decisao-arquitetura.md +29 -0
- package/seedgridKB/SeedGrid/Toolkit/templates/especificacao-tarefa.md +32 -0
- package/seedgridKB/SeedGrid/Toolkit/templates/relatorio-validacao.md +30 -0
- package/seedgridKB/SeedGrid/Versoes.md +64 -0
- package/seedgridKB/SeedGrid/Visao-geral.md +35 -0
- package/seedgridKB/manifest.json +142 -0
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
# CRUD Page Pattern
|
|
2
|
+
|
|
3
|
+
Use this structure for every entity CRUD.
|
|
4
|
+
|
|
5
|
+
## 1. List Page
|
|
6
|
+
|
|
7
|
+
File pattern:
|
|
8
|
+
|
|
9
|
+
- `app/<module>/<entity>/<entity>_list/page.tsx`
|
|
10
|
+
|
|
11
|
+
Responsibilities:
|
|
12
|
+
|
|
13
|
+
- Load paginated server-side data through `/api/<module>/<entity>`
|
|
14
|
+
- Render `SgDatatable`
|
|
15
|
+
- Render `SgInputTextSearch`
|
|
16
|
+
- Show `ListLoadError` (with retry) instead of the table when the load fails
|
|
17
|
+
- Support sort, page, and empty states
|
|
18
|
+
- Navigate to `<entity>_edit`
|
|
19
|
+
- Gate actions by permission
|
|
20
|
+
|
|
21
|
+
Expected behavior:
|
|
22
|
+
|
|
23
|
+
- `Novo` button opens `<entity>_edit`
|
|
24
|
+
- edit action opens `<entity>_edit?publicId=...`
|
|
25
|
+
- delete action opens an `SgConfirmationDialog` (never `window.confirm`); only on
|
|
26
|
+
confirm does it call `/api/<module>/<entity>/{publicId}`
|
|
27
|
+
- success returns to the list with a query flag such as `?saved=created`
|
|
28
|
+
|
|
29
|
+
Toolbar layout:
|
|
30
|
+
|
|
31
|
+
- Use `SgStack direction="row" align="end" gap={12} wrap`, not a 50/50 `SgGrid`
|
|
32
|
+
- `SgInputTextSearch` grows inside `<div style={{ flex: 1, minWidth: 240 }}>`
|
|
33
|
+
- `Novo` button stays compact (`label="Novo"`, `size="md"`) and is height-matched
|
|
34
|
+
to the input with `style={{ height: 44 }}` (input is `h-11`, button `md` is
|
|
35
|
+
`h-10`)
|
|
36
|
+
|
|
37
|
+
Recommended state shape:
|
|
38
|
+
|
|
39
|
+
```ts
|
|
40
|
+
type QueryState = {
|
|
41
|
+
page: number;
|
|
42
|
+
rows: number;
|
|
43
|
+
search: string;
|
|
44
|
+
sortField: string;
|
|
45
|
+
sortOrder: "asc" | "desc";
|
|
46
|
+
};
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
## 2. Edit Page
|
|
50
|
+
|
|
51
|
+
File pattern:
|
|
52
|
+
|
|
53
|
+
- `app/<module>/<entity>/<entity>_edit/page.tsx`
|
|
54
|
+
|
|
55
|
+
Responsibilities:
|
|
56
|
+
|
|
57
|
+
- Read `publicId` from `searchParams`
|
|
58
|
+
- If `publicId` exists, load the entity through `/api/<module>/<entity>/{publicId}`
|
|
59
|
+
- If absent, open in create mode
|
|
60
|
+
- Save through `POST` or `PUT`
|
|
61
|
+
- Redirect back to `<entity>_list`
|
|
62
|
+
|
|
63
|
+
Expected behavior:
|
|
64
|
+
|
|
65
|
+
- Dedicated page only, never inline edit inside the list
|
|
66
|
+
- Use SeedGrid form controls
|
|
67
|
+
- Show skeleton while loading existing data
|
|
68
|
+
- Show user-facing save errors (`extractApiErrorMessage` with a generic fallback)
|
|
69
|
+
- On success, go back to the list with `?saved=created` / `?saved=updated`; the list shows the toast (`useSavedToast`)
|
|
70
|
+
|
|
71
|
+
### Input type by data type
|
|
72
|
+
|
|
73
|
+
Match the input to the field's data type. Do **not** use `SgInputText` for
|
|
74
|
+
numbers or money: it accepts letters and only fails at submit.
|
|
75
|
+
|
|
76
|
+
| Field kind | Component | Key props | Parse on submit |
|
|
77
|
+
| --- | --- | --- | --- |
|
|
78
|
+
| Money (price, fee, overage, balance) | `SgInputCurrency` | `currency="BRL"`, `decimals={2}`, `minValue={0}` | `parseDecimalInput` |
|
|
79
|
+
| Integer count (requests, users, qty, billing day) | `SgInputNumber` | `decimals={0}`, `minValue={...}` | `Number.parseInt(v, 10)` |
|
|
80
|
+
| Decimal non-money (rate, factor) | `SgInputNumber` | `decimals={2}` | `parseDecimalInput` |
|
|
81
|
+
| Date | `SgInputDate` | — | ISO on submit |
|
|
82
|
+
| Free text | `SgInputText` | — | trim |
|
|
83
|
+
|
|
84
|
+
Both numeric inputs are controlled via `inputProps={{ value }}` and emit a string
|
|
85
|
+
through `onChange`. Keep form state as the raw string; convert only on submit.
|
|
86
|
+
|
|
87
|
+
```tsx
|
|
88
|
+
// money
|
|
89
|
+
<SgInputCurrency
|
|
90
|
+
id="<entity>-price"
|
|
91
|
+
label="Preco mensal"
|
|
92
|
+
currency="BRL"
|
|
93
|
+
decimals={2}
|
|
94
|
+
minValue={0}
|
|
95
|
+
inputProps={{ value: form.price }}
|
|
96
|
+
onChange={(price) => setForm((f) => ({ ...f, price }))}
|
|
97
|
+
/>
|
|
98
|
+
|
|
99
|
+
// integer count
|
|
100
|
+
<SgInputNumber
|
|
101
|
+
id="<entity>-requests"
|
|
102
|
+
label="Requests/mes"
|
|
103
|
+
decimals={0}
|
|
104
|
+
minValue={1}
|
|
105
|
+
inputProps={{ value: form.requests }}
|
|
106
|
+
onChange={(requests) => setForm((f) => ({ ...f, requests }))}
|
|
107
|
+
/>
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
## 3. Shell Copy
|
|
111
|
+
|
|
112
|
+
Use business language, not implementation language.
|
|
113
|
+
|
|
114
|
+
Good:
|
|
115
|
+
|
|
116
|
+
- `Consulte os planos disponiveis`
|
|
117
|
+
- `Atualize as informacoes do usuario`
|
|
118
|
+
|
|
119
|
+
Bad:
|
|
120
|
+
|
|
121
|
+
- `listagem administrativa paginada no servidor`
|
|
122
|
+
- `debounce, distinct e cancelamento`
|
|
123
|
+
- `pagina dedicada`
|
|
124
|
+
|
|
125
|
+
## 4. Skeleton Pattern
|
|
126
|
+
|
|
127
|
+
The table loading state must read as a table, not a single grey rectangle. Use a
|
|
128
|
+
table-shaped skeleton: one header row plus several body rows of `shape="text"`
|
|
129
|
+
skeletons, so the placeholder suggests multiple columns and fields.
|
|
130
|
+
|
|
131
|
+
Prefer the shared `DatatableSkeleton` helper (in `app/components`) and match the
|
|
132
|
+
real column count and page size:
|
|
133
|
+
|
|
134
|
+
```tsx
|
|
135
|
+
{loading ? (
|
|
136
|
+
<DatatableSkeleton columns={columns.length} rows={Math.min(queryState.rows, 8)} />
|
|
137
|
+
) : (
|
|
138
|
+
<SgDatatable ... />
|
|
139
|
+
)}
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
Underlying structure the helper renders (replicate if a shared helper is not
|
|
143
|
+
available):
|
|
144
|
+
|
|
145
|
+
```tsx
|
|
146
|
+
<div className="overflow-hidden rounded-lg border border-border">
|
|
147
|
+
<div className="grid gap-3 border-b border-border p-3" style={{ gridTemplateColumns }}>
|
|
148
|
+
{/* one text skeleton per column = header */}
|
|
149
|
+
</div>
|
|
150
|
+
{/* N rows, each with one text skeleton per column, last:border-b-0 */}
|
|
151
|
+
</div>
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
Do not use a single `<SgSkeleton shape="rectangle" />` for table loading. Cap the
|
|
155
|
+
row count (e.g. `Math.min(pageSize, 8)`) so large page sizes do not render dozens
|
|
156
|
+
of skeleton rows.
|
|
157
|
+
|
|
158
|
+
Form/edit pages may still use a single rectangular `SgSkeleton` while loading the
|
|
159
|
+
entity.
|
|
160
|
+
|
|
161
|
+
## 5. Status Badge Colors (boolean columns)
|
|
162
|
+
|
|
163
|
+
Boolean state columns (active, 2FA, integration, etc.) must read at a glance with
|
|
164
|
+
strong semantic colors — never a washed-out `secondary` grey for the "off" state.
|
|
165
|
+
Use `StatusBadge` with an explicit `severity`:
|
|
166
|
+
|
|
167
|
+
- The neutral/desirable state is `success` (green).
|
|
168
|
+
- The opposite state is `danger` (red).
|
|
169
|
+
- Do not use `secondary` or `info` for these two-state columns.
|
|
170
|
+
|
|
171
|
+
```tsx
|
|
172
|
+
// active / enabled
|
|
173
|
+
<StatusBadge severity={row.active ? "success" : "danger"} value={row.active ? "ATIVO" : "INATIVO"} />
|
|
174
|
+
|
|
175
|
+
// 2FA
|
|
176
|
+
<StatusBadge severity={row.twoFactorEnabled ? "success" : "danger"} value={row.twoFactorEnabled ? "ATIVO" : "DESATIVADO"} />
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
Pick which boolean value is green by meaning, not by `true`/`false`. For example a
|
|
180
|
+
role's "for integration" flag is the exception: a non-integration role is the safe
|
|
181
|
+
default (`success`/green) and an integration role is flagged (`danger`/red):
|
|
182
|
+
|
|
183
|
+
```tsx
|
|
184
|
+
<StatusBadge severity={row.forIntegration ? "danger" : "success"} value={row.forIntegration ? "SIM" : "NAO"} />
|
|
185
|
+
```
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
# Routing And Proxy Standard
|
|
2
|
+
|
|
3
|
+
## Public URLs
|
|
4
|
+
|
|
5
|
+
Always prefer `publicId` in URLs:
|
|
6
|
+
|
|
7
|
+
- list action to edit:
|
|
8
|
+
- `/<module>/<entity>/<entity>_edit?publicId=<uuid>`
|
|
9
|
+
- proxy detail route:
|
|
10
|
+
- `/api/<module>/<entity>/{publicId}`
|
|
11
|
+
|
|
12
|
+
Do not expose the numeric database `id` in the route when a `publicId` exists.
|
|
13
|
+
|
|
14
|
+
## Pages
|
|
15
|
+
|
|
16
|
+
- `app/<module>/<entity>/page.tsx`: only `redirect("/<module>/<entity>/<entity>_list")`
|
|
17
|
+
- `app/<module>/<entity>/<entity>_list/page.tsx`
|
|
18
|
+
- `app/<module>/<entity>/<entity>_edit/page.tsx`
|
|
19
|
+
|
|
20
|
+
## Next Route Convention
|
|
21
|
+
|
|
22
|
+
Use Next API routes as server-side proxies:
|
|
23
|
+
|
|
24
|
+
- `app/api/<module>/<entity>/route.ts` (`GET` list, `POST` create)
|
|
25
|
+
- `app/api/<module>/<entity>/[id]/route.ts` (`GET`, `PUT`, `DELETE`; the `[id]` segment carries the
|
|
26
|
+
`publicId`)
|
|
27
|
+
|
|
28
|
+
What they do:
|
|
29
|
+
|
|
30
|
+
- forward the session to the backend through the project's session-aware fetch helper
|
|
31
|
+
- keep the backend paths in one place (a `*Paths` helper in `lib/`), not scattered as strings
|
|
32
|
+
- return the backend response untouched on writes (passthrough helper)
|
|
33
|
+
- on reads, turn failures into `problem+json` with the **real status** (`problemResponse`); a session
|
|
34
|
+
that expired or a backend that is down must never become an empty `200` page
|
|
35
|
+
|
|
36
|
+
```ts
|
|
37
|
+
export async function GET(request: Request) {
|
|
38
|
+
const params = new URLSearchParams(new URL(request.url).searchParams);
|
|
39
|
+
const suffix = params.toString() ? `?${params.toString()}` : "";
|
|
40
|
+
try {
|
|
41
|
+
return NextResponse.json(await apiFetch<PaginatedResult<Entity>>(`${Paths.entity.base}${suffix}`));
|
|
42
|
+
} catch (error) {
|
|
43
|
+
return problemResponse(error);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
The client calls these routes with the project's HTTP client (`adminProxyClient` in the boilerplate)
|
|
49
|
+
and reads errors with `extractApiErrorMessage`.
|
|
50
|
+
|
|
51
|
+
## Backend Convention
|
|
52
|
+
|
|
53
|
+
Resources behind a CRUD should:
|
|
54
|
+
|
|
55
|
+
- return both `id` and `publicId` in payloads when useful
|
|
56
|
+
- resolve detail/update/delete by `publicId`
|
|
57
|
+
- keep numeric `id` only for internal persistence and joins
|
|
58
|
+
- paginate server-side (`page` 0-based, `size`, `sortField`, `sortOrder`) and answer
|
|
59
|
+
`{ items, totalRecords, page, size, sortField, sortOrder, query }`
|
|
60
|
+
|
|
61
|
+
## Breadcrumb And Menu
|
|
62
|
+
|
|
63
|
+
- Menu item should point to the real list route
|
|
64
|
+
- Breadcrumb items must use valid `href` values
|
|
65
|
+
- Parent sections like `/security` must resolve to a real child route if there is no standalone page
|
|
66
|
+
- Registering the menu item, icon and permission is covered by the `seedgrid-new-screen` skill
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: seedgrid-new-screen
|
|
3
|
+
description: Registrar uma tela, menu ou permissao nova no boilerplate SeedGrid (app do cliente `frontend/` ou admin da plataforma `admin/`) sem esquecer nenhum dos lugares que precisam ficar sincronizados - migration da permissao, item de menu, icone, item ativo, catalogo do editor de perfis e, se for vendavel por plano, o treeview de features do admin e o `@RequiresPlanFeature`. Use ao criar tela nova, acao nova numa tela existente, permissao nova, ou ao mover/renomear item de menu.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Tela nova no SeedGrid (menu + permissoes)
|
|
7
|
+
|
|
8
|
+
Hoje menu e catalogo de permissoes sao mantidos **a mao, em varios lugares**. Esta skill existe para nenhum ser
|
|
9
|
+
esquecido. (Plano futuro para centralizar: `seedgrid-quarkus-ext-security/docs/refactor-permission-catalog.md`.
|
|
10
|
+
Nao executar sem o usuario pedir.)
|
|
11
|
+
|
|
12
|
+
## Antes de comecar, responda
|
|
13
|
+
|
|
14
|
+
1. **Qual app?** `frontend/` (cliente final, audience `client`) ou `admin/` (plataforma, audience `platform`).
|
|
15
|
+
2. **Quais permissoes?** A de abrir a tela (`XXX_READ`) e uma por acao relevante (`XXX_CREATE`, `XXX_DELETE`...).
|
|
16
|
+
Uma tela pode ter varias.
|
|
17
|
+
3. **Onde no menu?** Grupo (pai) e posicao. Ou "nao aparece no menu" (permissao sem tela).
|
|
18
|
+
4. **So' no app do cliente: e' vendavel por plano?** Se o plano pode ligar/desligar a funcionalidade.
|
|
19
|
+
|
|
20
|
+
## Passo a passo
|
|
21
|
+
|
|
22
|
+
Detalhes e exemplos de codigo de cada passo em `references/steps.md`.
|
|
23
|
+
|
|
24
|
+
1. **Permissao (backend)** - migration nova em `backend/src/main/resources/db/migration/app/`
|
|
25
|
+
(`V3xxx__<assunto>.sql`, nunca editar uma ja aplicada): `insert into permissions` com o `audience` certo,
|
|
26
|
+
vinculo ao perfil `ADMIN`, e - se vendavel - vinculo aos terms dos planos que a liberam.
|
|
27
|
+
2. **Endpoint (backend)** - `@PermissionsAllowed("XXX_READ")` (e por acao). Se vendavel:
|
|
28
|
+
`@RequiresPlanFeature("XXX_READ")`.
|
|
29
|
+
3. **Menu** - item em `<app>/app/data.ts` (`navItems`) com `href`, `label` e `permission`.
|
|
30
|
+
4. **Icone** - entrada no `iconByHref` de `<app>/app/components/Shell.tsx` (sem ela o item fica sem icone).
|
|
31
|
+
5. **Item ativo** - se a tela tem sub-rotas (ex.: `_edit`), regra em `normalizeMenuPath` do mesmo `Shell.tsx`.
|
|
32
|
+
6. **Editor de perfis** - a tela e as acoes no catalogo do app:
|
|
33
|
+
- cliente: `frontend/lib/client-permission-tree.ts`;
|
|
34
|
+
- admin: `admin/lib/permission-tree.ts`.
|
|
35
|
+
Permissao fora do catalogo **nao aparece** no editor de perfis do cliente (some em silencio).
|
|
36
|
+
7. **Se vendavel (so' cliente)** - copiar a mesma entrada para `admin/lib/client-permission-tree.ts` (os dois
|
|
37
|
+
`client-permission-tree.ts` sao **identicos**). Se o grupo novo NAO for vendavel, incluir o id dele em
|
|
38
|
+
`NOT_SELLABLE_GROUPS` (`admin/app/plans/plan_terms/page.tsx`).
|
|
39
|
+
8. **Na pagina** - botoes de acao checam a propria permissao (`hasPermission("XXX_DELETE")`). O catalogo so'
|
|
40
|
+
declara a acao para o editor de perfis; nao esconde botao.
|
|
41
|
+
9. **Os dois boilerplates** - `login-tenancy` e `subdomain-tenancy` tem os mesmos arquivos. Se a tela e' do
|
|
42
|
+
boilerplate (nao de um produto derivado), repetir nos dois.
|
|
43
|
+
|
|
44
|
+
## Verificacao
|
|
45
|
+
|
|
46
|
+
Rodar o checklist de `references/checklist.md` antes de encerrar. No minimo:
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
# os dois catalogos do cliente iguais (ignorando fim de linha)
|
|
50
|
+
diff <(tr -d '\r' < frontend/lib/client-permission-tree.ts) <(tr -d '\r' < admin/lib/client-permission-tree.ts)
|
|
51
|
+
# typecheck dos dois apps
|
|
52
|
+
(cd frontend && npx tsc --noEmit -p .) && (cd admin && npx tsc --noEmit -p .)
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
E na tela: o item aparece no menu para quem tem a permissao e some para quem nao tem; o editor de perfis mostra
|
|
56
|
+
a tela com as acoes; se vendavel, o treeview "features liberadas neste plano" mostra a tela.
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
interface:
|
|
2
|
+
display_name: "SeedGrid tela nova"
|
|
3
|
+
short_description: "Tela, menu e permissoes sincronizados"
|
|
4
|
+
default_prompt: "Use $seedgrid-new-screen to add a new screen with its permissions, menu item, icon, profile-editor catalog and, if sellable, the plan feature tree."
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# Checklist - tela nova
|
|
2
|
+
|
|
3
|
+
## Backend
|
|
4
|
+
|
|
5
|
+
- [ ] Migration NOVA (nao editar uma aplicada) com as permissoes, `audience` certo (`client` | `platform`), nome
|
|
6
|
+
com ate 30 caracteres.
|
|
7
|
+
- [ ] Permissoes vinculadas ao perfil `ADMIN`.
|
|
8
|
+
- [ ] Endpoints com `@PermissionsAllowed` por acao.
|
|
9
|
+
- [ ] Vendavel: `@RequiresPlanFeature` no endpoint + vinculo aos terms (trial e planos) na migration.
|
|
10
|
+
|
|
11
|
+
## Front (`frontend/` ou `admin/`)
|
|
12
|
+
|
|
13
|
+
- [ ] Item em `app/data.ts` com `permission`.
|
|
14
|
+
- [ ] Icone em `iconByHref` (`app/components/Shell.tsx`).
|
|
15
|
+
- [ ] Sub-rotas em `normalizeMenuPath` (mesmo arquivo), se houver.
|
|
16
|
+
- [ ] Tela e acoes no catalogo: `frontend/lib/client-permission-tree.ts` ou `admin/lib/permission-tree.ts`.
|
|
17
|
+
- [ ] Botoes da pagina checam a propria permissao.
|
|
18
|
+
- [ ] Vendavel: `admin/lib/client-permission-tree.ts` identico ao do frontend; grupo nao vendavel em
|
|
19
|
+
`NOT_SELLABLE_GROUPS`.
|
|
20
|
+
|
|
21
|
+
## Boilerplates
|
|
22
|
+
|
|
23
|
+
- [ ] Repetido em `login-tenancy` e `subdomain-tenancy` (se a tela for do boilerplate).
|
|
24
|
+
|
|
25
|
+
## Verificacao
|
|
26
|
+
|
|
27
|
+
- [ ] `diff` dos dois `client-permission-tree.ts` vazio (ignorando `\r`).
|
|
28
|
+
- [ ] `npx tsc --noEmit -p .` no `frontend/` e no `admin/`.
|
|
29
|
+
- [ ] Banco recriado (ou migration aplicada) e backend reiniciado.
|
|
30
|
+
- [ ] Usuario COM a permissao ve o item; usuario SEM nao ve.
|
|
31
|
+
- [ ] Editor de perfis mostra a tela e as acoes; o "olhinho" da lista de perfis lista as permissoes da tela.
|
|
32
|
+
- [ ] Vendavel: o treeview do plano mostra a tela; plano sem a feature -> 402 `FEATURE_NOT_IN_PLAN`.
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
# Passos detalhados
|
|
2
|
+
|
|
3
|
+
Exemplo usado em todos os passos: tela **Relatorios** no app do cliente, com abrir, gerar e excluir, vendavel
|
|
4
|
+
por plano.
|
|
5
|
+
|
|
6
|
+
## 1. Permissao (migration)
|
|
7
|
+
|
|
8
|
+
`backend/src/main/resources/db/migration/app/V3010__reports_permissions.sql`:
|
|
9
|
+
|
|
10
|
+
```sql
|
|
11
|
+
-- Audience: 'client' = app do cliente (frontend/); 'platform' = admin da plataforma (admin/).
|
|
12
|
+
insert into permissions (name, description, public_id, audience) values
|
|
13
|
+
('REPORT_READ', 'Relatorios', gen_random_uuid()::text, 'client'),
|
|
14
|
+
('REPORT_GENERATE', 'Gerar relatorio', gen_random_uuid()::text, 'client'),
|
|
15
|
+
('REPORT_DELETE', 'Excluir relatorio', gen_random_uuid()::text, 'client')
|
|
16
|
+
on conflict (name) do update
|
|
17
|
+
set description = excluded.description,
|
|
18
|
+
audience = excluded.audience;
|
|
19
|
+
|
|
20
|
+
-- O ADMIN tem todas as permissoes (o responsavel pela conta entra com ADMIN no cadastro).
|
|
21
|
+
insert into role_permissions (role_id, permission_id)
|
|
22
|
+
select r.id, p.id from roles r cross join permissions p
|
|
23
|
+
where r.name = 'ADMIN' and p.name in ('REPORT_READ', 'REPORT_GENERATE', 'REPORT_DELETE')
|
|
24
|
+
on conflict do nothing;
|
|
25
|
+
|
|
26
|
+
-- SO' SE VENDAVEL: os planos que liberam a feature (o trial tem public_id fixo ...0000a2).
|
|
27
|
+
-- Sem billing (modulo desligado) as tabelas de plano nao existem: o bloco so' pula.
|
|
28
|
+
do $$
|
|
29
|
+
begin
|
|
30
|
+
if to_regclass('plan_term_permissions') is null then
|
|
31
|
+
return;
|
|
32
|
+
end if;
|
|
33
|
+
insert into plan_term_permissions (plan_term_id, permission_id)
|
|
34
|
+
select t.id, p.id
|
|
35
|
+
from plan_terms t join plans pl on pl.id = t.plan_id cross join permissions p
|
|
36
|
+
where p.name = 'REPORT_READ'
|
|
37
|
+
and (t.public_id = '00000000-0000-0000-0000-0000000000a2' or pl.code in ('PRO'))
|
|
38
|
+
on conflict do nothing;
|
|
39
|
+
end $$;
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
- `name` tem no maximo 30 caracteres.
|
|
43
|
+
- No subdomain-tenancy as migrations de `db/migration/app` rodam no banco **master**.
|
|
44
|
+
- Referencia viva: `V3002__usage_demo_permission.sql`.
|
|
45
|
+
|
|
46
|
+
## 2. Endpoint
|
|
47
|
+
|
|
48
|
+
```java
|
|
49
|
+
@POST
|
|
50
|
+
@Path("/reports")
|
|
51
|
+
@PermissionsAllowed("REPORT_GENERATE")
|
|
52
|
+
@RequiresPlanFeature("REPORT_READ") // so' se vendavel: 402 FEATURE_NOT_IN_PLAN quando o plano nao libera
|
|
53
|
+
public Report generate(...) { ... }
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
## 3. Menu (`<app>/app/data.ts`)
|
|
57
|
+
|
|
58
|
+
```ts
|
|
59
|
+
{ href: "/reports/report_list", label: "Relatorios", permission: "REPORT_READ" },
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
- Grupo = item com `children`; aparece se tiver ao menos um filho visivel.
|
|
63
|
+
- Regra implicita do `Shell`: folha **sem** `permission` aparece **so' para ADMIN**. Prefira sempre declarar a
|
|
64
|
+
permissao.
|
|
65
|
+
|
|
66
|
+
## 4. Icone (`<app>/app/components/Shell.tsx`)
|
|
67
|
+
|
|
68
|
+
```ts
|
|
69
|
+
const iconByHref = {
|
|
70
|
+
...
|
|
71
|
+
"/reports/report_list": <FileText size={16} />, // import { FileText } from "lucide-react"
|
|
72
|
+
} as const;
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
## 5. Item ativo nas sub-rotas (`normalizeMenuPath`, mesmo arquivo)
|
|
76
|
+
|
|
77
|
+
```ts
|
|
78
|
+
if (pathname.startsWith("/reports/")) {
|
|
79
|
+
return "/reports/report_list";
|
|
80
|
+
}
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
## 6. Editor de perfis
|
|
84
|
+
|
|
85
|
+
Cliente - `frontend/lib/client-permission-tree.ts` (admin: `admin/lib/permission-tree.ts`, mesmo formato):
|
|
86
|
+
|
|
87
|
+
```ts
|
|
88
|
+
{
|
|
89
|
+
id: "relatorios", // id do grupo (usado em NOT_SELLABLE_GROUPS)
|
|
90
|
+
label: "Relatorios",
|
|
91
|
+
screens: [
|
|
92
|
+
{
|
|
93
|
+
id: "relatorios/relatorios",
|
|
94
|
+
label: "Relatorios",
|
|
95
|
+
actions: [
|
|
96
|
+
{ permission: "REPORT_READ", label: "Abrir a tela" }, // a PRIMEIRA e' sempre a de abrir
|
|
97
|
+
{ permission: "REPORT_GENERATE", label: "Gerar relatorio" },
|
|
98
|
+
{ permission: "REPORT_DELETE", label: "Excluir relatorio" },
|
|
99
|
+
],
|
|
100
|
+
},
|
|
101
|
+
],
|
|
102
|
+
},
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
- A ordem dos grupos segue o menu.
|
|
106
|
+
- Cada permissao aparece **uma vez** no catalogo (a arvore usa o publicId como id da folha).
|
|
107
|
+
|
|
108
|
+
## 7. Vendavel (so' cliente)
|
|
109
|
+
|
|
110
|
+
- Copiar o arquivo inteiro: `frontend/lib/client-permission-tree.ts` -> `admin/lib/client-permission-tree.ts`.
|
|
111
|
+
- O treeview "features liberadas neste plano" mostra todos os grupos do catalogo **menos** os de
|
|
112
|
+
`NOT_SELLABLE_GROUPS` (`admin/app/plans/plan_terms/page.tsx`): hoje `seguranca`, `menu-usuario`.
|
|
113
|
+
Grupo novo nao vendavel -> acrescentar o id ali.
|
|
114
|
+
- Sem o `@RequiresPlanFeature` no endpoint, liberar ou nao no plano nao muda nada.
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: seedgrid-review
|
|
3
|
+
description: Verifica se o código-fonte de um projeto segue os padrões SeedGrid (front React com @seedgrid/fe-components e back Java), citando cada violação por id de regra, arquivo e linha. Use quando pedirem para revisar, auditar ou conferir o padrão SeedGrid, depois de implementar uma tela ou serviço, ou antes de abrir um PR. Aceita o escopo "front", "back" ou nenhum (os dois).
|
|
4
|
+
metadata:
|
|
5
|
+
toolkit: seedgrid-ai
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Revisar o padrão SeedGrid
|
|
9
|
+
|
|
10
|
+
Confere o código contra as regras do toolkit e devolve uma lista objetiva de violações. **Somente leitura**: não edite arquivos, a menos que o usuário peça as correções depois.
|
|
11
|
+
|
|
12
|
+
## Escopo
|
|
13
|
+
|
|
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`).
|
|
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
|
+
|
|
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
|
+
|
|
20
|
+
## Passos
|
|
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.
|
|
23
|
+
2. Faça primeiro as buscas mecânicas, sem abrir arquivo por arquivo. Exemplos:
|
|
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.
|
|
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
|
+
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
|
+
|
|
29
|
+
## Saída
|
|
30
|
+
|
|
31
|
+
```markdown
|
|
32
|
+
## Padrão SeedGrid: <front|back|front e back>
|
|
33
|
+
Escopo revisado: <arquivos ou pastas>
|
|
34
|
+
|
|
35
|
+
### Violações
|
|
36
|
+
| Regra | Local | Problema | Correção |
|
|
37
|
+
| --- | --- | --- | --- |
|
|
38
|
+
| FE-10 | app/clientes/cliente_edit/page.tsx:84 | telefone com SgInputText | trocar por SgInputPhone |
|
|
39
|
+
|
|
40
|
+
### Não verificado
|
|
41
|
+
- itens que dependem de execução ou de contexto que você não tinha
|
|
42
|
+
|
|
43
|
+
### Resumo
|
|
44
|
+
N violações (X bloqueantes). Conformes: <regras checadas sem achados>.
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
Classifique como **bloqueante** o que afeta segurança ou contrato (BE-10, BE-25, BE-30, FE-32) e como **ajuste** o resto. Sem violações, diga isso e liste o que foi checado, sem inventar achados.
|
|
48
|
+
|
|
49
|
+
## Bloco final para automação
|
|
50
|
+
|
|
51
|
+
O `seedgrid-ai review` lê o resultado desta skill. Por isso, **termine sempre a resposta** com exatamente um bloco assim (JSON válido, sem comentários), depois do relatório:
|
|
52
|
+
|
|
53
|
+
````markdown
|
|
54
|
+
```seedgrid-review-json
|
|
55
|
+
{"scope": "front", "violations": 1, "blocking": 0, "notVerified": 0}
|
|
56
|
+
```
|
|
57
|
+
````
|
|
58
|
+
|
|
59
|
+
- `scope`: `front`, `back` ou `both`.
|
|
60
|
+
- `violations`: total de violações do relatório; `blocking`: quantas são bloqueantes.
|
|
61
|
+
- `notVerified`: quantos itens ficaram em "Não verificado".
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: validar-mudanca
|
|
3
|
+
description: Valida uma mudança de código executando build, testes e verificações ligadas aos critérios de aceite, e registra evidências em um relatório. Use antes de declarar uma tarefa concluída ou após correções de revisão.
|
|
4
|
+
metadata:
|
|
5
|
+
toolkit: seedgrid-ai
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Validar mudança
|
|
9
|
+
|
|
10
|
+
Comprove com evidências executadas que a mudança funciona; não declare sucesso sem verificar.
|
|
11
|
+
|
|
12
|
+
## Passos
|
|
13
|
+
|
|
14
|
+
1. **Critérios.** Liste os critérios de aceite. Se não existirem, derive-os do objetivo e informe isso.
|
|
15
|
+
2. **Comandos do projeto.** Descubra como compilar, testar e executar: consulte `.ai/local/` (se existir), README, scripts de build (`package.json`, `pom.xml`, `build.gradle`, `Makefile` etc.). Não invente comandos.
|
|
16
|
+
3. **Mapeamento.** Associe cada critério a uma verificação concreta (teste automatizado, comando, inspeção do comportamento).
|
|
17
|
+
4. **Execução.** Rode, nesta ordem quando aplicável: verificação de tipos/compilação, lint, testes afetados, suíte relevante, build. Exercite o comportamento alterado quando possível.
|
|
18
|
+
5. **Registro.** Preencha o modelo [assets/relatorio-validacao.md](assets/relatorio-validacao.md) com comandos, resultados e evidências resumidas.
|
|
19
|
+
|
|
20
|
+
## Regras
|
|
21
|
+
|
|
22
|
+
- Diferencie "passou", "falhou" e "não executado (motivo)". Nunca converta um "não executado" em "passou".
|
|
23
|
+
- Não execute ações que publiquem ou alterem serviços externos (deploy, envio de e-mail, pagamentos, push) sem autorização explícita.
|
|
24
|
+
- Se uma verificação falhar, devolva a evidência ao implementador em vez de corrigir por conta própria, salvo instrução contrária.
|
|
25
|
+
- Testes instáveis: repita uma vez e relate a instabilidade, sem ocultá-la.
|
|
26
|
+
|
|
27
|
+
## Saída
|
|
28
|
+
|
|
29
|
+
O relatório de validação preenchido, com conclusão "Aprovado", "Reprovado" ou "Aprovado com ressalvas".
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: "Modelo de registro de decisão de arquitetura (ADR): contexto, alternativas, decisão e consequências."
|
|
3
|
+
---
|
|
4
|
+
# Decisão de arquitetura: <título>
|
|
5
|
+
|
|
6
|
+
> Modelo do SeedGrid AI Toolkit. Copie para o local de documentação do projeto antes de preencher; não edite o modelo.
|
|
7
|
+
|
|
8
|
+
- **Status:** proposta | aceita | substituída por <link>
|
|
9
|
+
- **Data:** AAAA-MM-DD
|
|
10
|
+
- **Responsáveis:** <pessoas ou papéis>
|
|
11
|
+
|
|
12
|
+
## Contexto
|
|
13
|
+
Problema, forças em jogo e restrições.
|
|
14
|
+
|
|
15
|
+
## Decisão
|
|
16
|
+
O que foi decidido, em termos objetivos.
|
|
17
|
+
|
|
18
|
+
## Alternativas consideradas
|
|
19
|
+
| Alternativa | Prós | Contras | Motivo da rejeição |
|
|
20
|
+
| --- | --- | --- | --- |
|
|
21
|
+
| | | | |
|
|
22
|
+
|
|
23
|
+
## Consequências
|
|
24
|
+
- Positivas:
|
|
25
|
+
- Negativas e riscos:
|
|
26
|
+
- Trabalho decorrente:
|
|
27
|
+
|
|
28
|
+
## Validação
|
|
29
|
+
Como saberemos que a decisão funcionou (métricas, testes, critérios).
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: "Modelo de especificação de tarefa: objetivo, escopo, critérios de aceite e riscos, para planejar antes de implementar."
|
|
3
|
+
---
|
|
4
|
+
# Especificação de tarefa: <título curto>
|
|
5
|
+
|
|
6
|
+
> Modelo do SeedGrid AI Toolkit. Copie para o local de documentação do projeto antes de preencher; não edite o modelo.
|
|
7
|
+
|
|
8
|
+
## Objetivo
|
|
9
|
+
O que deve estar verdadeiro quando a tarefa terminar.
|
|
10
|
+
|
|
11
|
+
## Contexto
|
|
12
|
+
Por que a mudança é necessária; decisões e entregas anteriores relevantes.
|
|
13
|
+
|
|
14
|
+
## Papel responsável
|
|
15
|
+
`<id do papel>` (ver catálogo de papéis).
|
|
16
|
+
|
|
17
|
+
## Arquivos e áreas envolvidos
|
|
18
|
+
- caminho/ou/módulo — motivo
|
|
19
|
+
|
|
20
|
+
## Limites
|
|
21
|
+
- O que não deve ser alterado.
|
|
22
|
+
- Arquivos que outro papel está alterando em paralelo.
|
|
23
|
+
|
|
24
|
+
## Critérios de aceite
|
|
25
|
+
- [ ] Critério verificável 1
|
|
26
|
+
- [ ] Critério verificável 2
|
|
27
|
+
|
|
28
|
+
## Verificações esperadas
|
|
29
|
+
Comandos ou inspeções que comprovam os critérios.
|
|
30
|
+
|
|
31
|
+
## Resultado esperado
|
|
32
|
+
Entrega no formato padrão (resultado, arquivos alterados, verificações, pendências, contexto para a próxima etapa).
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: "Modelo de relatório de validação: o que foi verificado, como, resultado e pendências."
|
|
3
|
+
---
|
|
4
|
+
# Relatório de validação: <tarefa>
|
|
5
|
+
|
|
6
|
+
> Modelo do SeedGrid AI Toolkit. Copie para o local de documentação do projeto antes de preencher; não edite o modelo.
|
|
7
|
+
|
|
8
|
+
- **Data:** AAAA-MM-DD
|
|
9
|
+
- **Versão/commit avaliado:** <identificador>
|
|
10
|
+
- **Ambiente:** <SO, runtime, banco etc.>
|
|
11
|
+
|
|
12
|
+
## Critérios de aceite
|
|
13
|
+
| Critério | Verificação | Resultado | Evidência |
|
|
14
|
+
| --- | --- | --- | --- |
|
|
15
|
+
| | comando ou inspeção | passou / falhou / não executado | saída resumida ou caminho do log |
|
|
16
|
+
|
|
17
|
+
## Comandos executados
|
|
18
|
+
```text
|
|
19
|
+
<comando>
|
|
20
|
+
<resultado resumido>
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## Regressões verificadas
|
|
24
|
+
- Área — como foi verificada — resultado
|
|
25
|
+
|
|
26
|
+
## Não verificado
|
|
27
|
+
- Item — motivo
|
|
28
|
+
|
|
29
|
+
## Conclusão
|
|
30
|
+
Aprovado | Reprovado | Aprovado com ressalvas — justificativa em uma frase.
|