@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
package/README.md
CHANGED
|
@@ -37,7 +37,7 @@ Cada pasta de `.ai/` (`rules`, `agents`, `skills`, `templates`, `references`) te
|
|
|
37
37
|
| `.claude/agents/<id>.md` | Somente `--mode native`: subagentes do Claude Code |
|
|
38
38
|
| `.codex/agents/<id>.toml` | Somente `--mode native`: agentes personalizados do Codex |
|
|
39
39
|
|
|
40
|
-
Skills: `
|
|
40
|
+
Skills: `sg-plan-change`, `sg-code-review`, `sg-validate-change` (genéricas) e `sg-crud-front`, `sg-new-screen`, `sg-review` (padrões SeedGrid). Toda instalação recebe todas as skills.
|
|
41
41
|
|
|
42
42
|
## A base de conhecimento (seedgridKB)
|
|
43
43
|
|
|
@@ -101,14 +101,14 @@ seedgrid-ai review back --tool codex # só o back-end, usando o Code
|
|
|
101
101
|
|
|
102
102
|
### `seedgrid-ai review`
|
|
103
103
|
|
|
104
|
-
Executa a skill `
|
|
104
|
+
Executa a skill `sg-review` na ferramenta de IA instalada, em modo não interativo e somente leitura (Claude Code: `claude -p` com ferramentas de leitura; Codex: `codex exec --sandbox read-only`). A skill confere o código contra as regras `FE-nn` e `BE-nn` (`.ai/rules/frontend-seedgrid.md` e `backend-java-seedgrid.md`) e o CLI mostra o relatório e devolve o código de saída.
|
|
105
105
|
|
|
106
106
|
- **Escopo:** `front`, `back` ou nenhum (os dois). Por padrão revisa os arquivos alterados (diff); `--full` revisa o projeto inteiro.
|
|
107
107
|
- **Ferramenta:** `--tool claude|codex`. Sem a opção, usa a primeira disponível nesta ordem: Claude Code, Codex. Considera só os targets instalados no projeto que tenham a skill e o executável no `PATH`. O CLI não detecta em qual ferramenta você está trabalhando.
|
|
108
108
|
- **Custo e login:** chama o modelo com o seu login na ferramenta e **consome tokens**. É o único comando que faz isso. Nenhum token é lido nem gravado pelo CLI.
|
|
109
109
|
- **Resultado não determinístico:** a revisão é feita por um modelo; execuções repetidas podem apontar itens um pouco diferentes (nos testes, as duas ferramentas acharam as violações óbvias e divergiram nos itens de julgamento). Trate o resultado como revisão, não como prova.
|
|
110
110
|
- **Saída estruturada:** a skill termina com um bloco `seedgrid-review-json`. Se a ferramenta falhar, esgotar o tempo (15 min) ou responder sem o bloco, o comando sai com `1` e mostra o texto bruto; nunca conta como "sem violações".
|
|
111
|
-
- Exige o toolkit instalado (`init`) com a skill `
|
|
111
|
+
- Exige o toolkit instalado (`init`) com a skill `sg-review` (`update` leva as skills novas a projetos já instalados).
|
|
112
112
|
|
|
113
113
|
Depois de instalar ou atualizar, **abra uma nova sessão** do Claude Code ou do Codex. Não há recarga garantida em todas as ferramentas.
|
|
114
114
|
|
package/dist/adapters/shared.js
CHANGED
|
@@ -53,19 +53,18 @@ export function renderFolderIndex(bundle, type) {
|
|
|
53
53
|
}
|
|
54
54
|
export const SKILLS_INDEX_FILE = '.ai/skills/index.md';
|
|
55
55
|
/** Índice das skills do toolkit, gerado das descrições para o AGENTS.md não crescer a cada skill nova. */
|
|
56
|
-
export function renderSkillsIndex(bundle
|
|
56
|
+
export function renderSkillsIndex(bundle) {
|
|
57
57
|
const cell = (t) => t.replace(/\|/g, '\\|').replace(/\s*\n\s*/g, ' ').trim();
|
|
58
|
-
const dirs = [targets.includes('claude') ? '.claude/skills' : null, targets.includes('codex') ? '.agents/skills' : null].filter((d) => d !== null);
|
|
59
58
|
const lines = [
|
|
60
59
|
'# Índice de skills',
|
|
61
60
|
'',
|
|
62
61
|
`<!-- ${GENERATED_NOTICE} a partir do frontmatter de cada SKILL.md (conteúdo ${bundle.contentVersion}). Não edite. -->`,
|
|
63
62
|
'',
|
|
64
|
-
'Skills instaladas pelo SeedGrid AI Toolkit. Antes de uma tarefa que combine com a descrição, leia o `SKILL.md` indicado e siga-o. Skills do próprio projeto
|
|
63
|
+
'Skills instaladas pelo SeedGrid AI Toolkit. Antes de uma tarefa que combine com a descrição, leia o `SKILL.md` indicado e siga-o. Skills do próprio projeto não aparecem aqui: se existir `projeto.md` nesta pasta, ele as lista.',
|
|
65
64
|
'',
|
|
66
65
|
'| Skill | O que faz e quando usar | Arquivo |',
|
|
67
66
|
'| --- | --- | --- |',
|
|
68
|
-
...bundle.skills.map((k) => `| \`${k.name}\` | ${cell(k.description)} | ${
|
|
67
|
+
...bundle.skills.map((k) => `| \`${k.name}\` | ${cell(k.description)} | [${k.name}/SKILL.md](${k.name}/SKILL.md) |`),
|
|
69
68
|
'',
|
|
70
69
|
];
|
|
71
70
|
return lines.join('\n');
|
|
@@ -80,7 +79,12 @@ export function sharedFiles(bundle, targets) {
|
|
|
80
79
|
for (const type of ['rules', 'templates', 'references']) {
|
|
81
80
|
files.push({ path: sharedDest(`${type}/index.md`), content: renderFolderIndex(bundle, type), component: type });
|
|
82
81
|
}
|
|
83
|
-
|
|
82
|
+
// Cópia canônica em .ai/skills (o AGENTS.md aponta para ela); as cópias nativas das ferramentas vêm dos adapters.
|
|
83
|
+
for (const k of bundle.skills) {
|
|
84
|
+
for (const f of k.files)
|
|
85
|
+
files.push({ path: `.ai/skills/${k.name}/${f.path}`, content: f.content, component: `skill:${k.name}` });
|
|
86
|
+
}
|
|
87
|
+
files.push({ path: SKILLS_INDEX_FILE, content: renderSkillsIndex(bundle), component: 'skills-index' });
|
|
84
88
|
return files;
|
|
85
89
|
}
|
|
86
90
|
/** Instruções de consulta à base de conhecimento SeedGrid (.ai/brain/), quando o conteúdo a inclui. */
|
|
@@ -106,8 +110,8 @@ function standardsLines(bundle) {
|
|
|
106
110
|
const present = STANDARD_RULES.filter(([p]) => bundle.shared.some((s) => s.path === p));
|
|
107
111
|
if (present.length === 0)
|
|
108
112
|
return [];
|
|
109
|
-
const review = bundle.skills.some((k) => k.name === '
|
|
110
|
-
? ' Para conferir se o código segue o padrão, use a skill `
|
|
113
|
+
const review = bundle.skills.some((k) => k.name === 'sg-review')
|
|
114
|
+
? ' Para conferir se o código segue o padrão, use a skill `sg-review`.'
|
|
111
115
|
: '';
|
|
112
116
|
const list = present.map(([p, label]) => `\`.ai/${p}\` (${label})`).join(' e ');
|
|
113
117
|
return [`- **Padrões SeedGrid obrigatórios:** ao implementar ou alterar código, siga ${list}.${review}`];
|
|
@@ -130,6 +134,7 @@ export function agentsMdBlock(bundle, targets, mode) {
|
|
|
130
134
|
'Cada pasta de `.ai/` tem um `index.md` com o que há nela: comece por ele e leia só o que a tarefa pedir.',
|
|
131
135
|
'',
|
|
132
136
|
'- Regras: `.ai/rules/`. Antes de tarefas não triviais, leia `coordenacao.md`.',
|
|
137
|
+
'- **Documentos que você gerar** (planos, handoff, decisões, especificações, relatórios) são salvos em `.ai/docs/<tipo>/`, por exemplo `.ai/docs/plans/` e `.ai/docs/handoff/`; veja `.ai/rules/documentos.md`.',
|
|
133
138
|
...standardsLines(bundle),
|
|
134
139
|
'- Papéis: `.ai/agents/`.',
|
|
135
140
|
`- Skills: \`.ai/skills/\` (${bundle.skills.length}). Antes de uma tarefa que combine com a descrição, leia o \`SKILL.md\` indicado no índice.`,
|
package/dist/cli.js
CHANGED
|
@@ -25,7 +25,7 @@ Comandos:
|
|
|
25
25
|
doctor Diagnostica sintaxe, consistência e limitações; --probe confirma a descoberta real no Codex
|
|
26
26
|
remove Remove só o que o toolkit instalou e continua intacto
|
|
27
27
|
validate Valida uma fonte de conteúdo (manifesto, papéis, skills, KB) sem tocar em projetos
|
|
28
|
-
review Confere o código contra os padrões SeedGrid, chamando a skill
|
|
28
|
+
review Confere o código contra os padrões SeedGrid, chamando a skill sg-review no Claude Code ou no Codex
|
|
29
29
|
help Mostra esta ajuda
|
|
30
30
|
|
|
31
31
|
Uso:
|
package/dist/commands/review.js
CHANGED
|
@@ -6,7 +6,7 @@ import { readLock } from '../core/lock.js';
|
|
|
6
6
|
import { detectTool, runReviewCommand } from '../core/tools.js';
|
|
7
7
|
import { ALL_TARGETS, ToolkitError } from '../core/types.js';
|
|
8
8
|
import { EXIT_ERROR, EXIT_OK, EXIT_VIOLATIONS } from './common.js';
|
|
9
|
-
export const REVIEW_SKILL = '
|
|
9
|
+
export const REVIEW_SKILL = 'sg-review';
|
|
10
10
|
export const REVIEW_SCOPES = ['front', 'back', 'both'];
|
|
11
11
|
const SCOPE_TEXT = { front: 'front', back: 'back', both: 'front e back' };
|
|
12
12
|
export function parseScope(value) {
|
|
@@ -60,7 +60,7 @@ async function skillInstalled(projectRoot, target) {
|
|
|
60
60
|
}
|
|
61
61
|
/**
|
|
62
62
|
* Revisa o código do projeto contra os padrões SeedGrid chamando, em modo somente leitura,
|
|
63
|
-
* a skill
|
|
63
|
+
* a skill sg-review na ferramenta de IA instalada (Claude Code ou Codex).
|
|
64
64
|
* Usa o login do usuário na ferramenta e consome tokens; nenhum outro comando chama o modelo.
|
|
65
65
|
*/
|
|
66
66
|
export async function reviewCommand(opts) {
|
package/dist/core/plan.js
CHANGED
|
@@ -116,6 +116,11 @@ export async function planInstall(projectRoot, desired, lockState, meta) {
|
|
|
116
116
|
else if (prev) {
|
|
117
117
|
conflicts.push({ path: d.path, reason: 'modificado localmente desde a última instalação' });
|
|
118
118
|
}
|
|
119
|
+
else if (d.component.startsWith('skill:')) {
|
|
120
|
+
// Padronização: a skill do toolkit prevalece sobre uma skill de projeto com o mesmo nome (o original vai para o backup).
|
|
121
|
+
fileOps.push({ path: d.path, action: 'update', reason: 'skill do toolkit substitui arquivo existente de mesmo nome', content: d.content, expectedHash: cur.hash });
|
|
122
|
+
warnings.push(`${d.path}: substituído pela skill do toolkit; o original fica no backup da operação`);
|
|
123
|
+
}
|
|
119
124
|
else {
|
|
120
125
|
conflicts.push({ path: d.path, reason: 'arquivo existente não gerenciado pelo toolkit, com conteúdo diferente' });
|
|
121
126
|
}
|
package/docs/arquitetura.md
CHANGED
|
@@ -22,7 +22,7 @@ Cada etapa é pura até `applyPlan`: carregar, validar e planejar só leem o dis
|
|
|
22
22
|
| Caminho | Responsabilidade |
|
|
23
23
|
| --- | --- |
|
|
24
24
|
| `src/cli.ts` | Parsing de argumentos (`node:util.parseArgs`), saída texto/JSON, códigos de saída |
|
|
25
|
-
| `src/commands/` | `init`, `update` (fluxo comum em `install.ts`), `status`, `doctor`, `remove`, `validate`, `review` (única que chama o modelo: executa a skill `
|
|
25
|
+
| `src/commands/` | `init`, `update` (fluxo comum em `install.ts`), `status`, `doctor`, `remove`, `validate`, `review` (única que chama o modelo: executa a skill `sg-review` via `claude -p` ou `codex exec`, somente leitura) |
|
|
26
26
|
| `src/core/content.ts` | Leitura do manifesto (vault) e validação de schema, nomes, IDs, arquivos, links, referências e da KB (wikilinks, caminhos locais, segredos) |
|
|
27
27
|
| `src/core/plan.ts` | Comparação entre estado desejado, lock e disco; classifica cada item e detecta conflitos |
|
|
28
28
|
| `src/core/apply.ts` | Revalidação, backup, escrita via temporário + renomeação, rollback, limpeza de pastas vazias |
|
|
@@ -47,7 +47,7 @@ Para cada arquivo desejado:
|
|
|
47
47
|
| igual ao desejado | presente / ausente | sem mudança / adotar |
|
|
48
48
|
| igual ao hash do lock | presente | atualizar |
|
|
49
49
|
| diferente de ambos | presente | **conflito** (modificado localmente) |
|
|
50
|
-
| diferente do desejado | ausente | **conflito** (arquivo não gerenciado) |
|
|
50
|
+
| diferente do desejado | ausente | **conflito** (arquivo não gerenciado; exceção: arquivos de skill do toolkit são substituídos, com backup) |
|
|
51
51
|
|
|
52
52
|
Arquivos no lock que saíram do estado desejado (troca de target/modo, item removido do conteúdo) são apagados se intactos; se modificados, geram conflito.
|
|
53
53
|
|
package/docs/compatibilidade.md
CHANGED
|
@@ -31,7 +31,7 @@ Fontes consultadas: [Claude Code skills](https://code.claude.com/docs/en/skills)
|
|
|
31
31
|
|
|
32
32
|
- **Base de conhecimento** (Claude Code 2.1.299, `claude -p`, projeto vazio com `.ai/brain/` instalada): perguntado pelo valor padrão, tipo e classe de `seedgrid.app.ai-pricing.timezone`, respondeu `America/Sao_Paulo`, `String`, `AiPricingScheduler`, citando as notas consultadas; perguntado por uma propriedade inexistente, respondeu que não a encontrou e se recusou a inventar o padrão.
|
|
33
33
|
|
|
34
|
-
- **`seedgrid-ai review`** (Claude Code 2.1.300 via `claude -p`; Codex 0.160.1 via `codex exec --sandbox read-only`): em projeto descartável com violações plantadas (telefone e CPF em `SgInputText`, `<input>` cru, `window.confirm`, `@Inject` em atributo, `RuntimeException`, pacote no singular), as duas ferramentas executaram a skill `
|
|
34
|
+
- **`seedgrid-ai review`** (Claude Code 2.1.300 via `claude -p`; Codex 0.160.1 via `codex exec --sandbox read-only`): em projeto descartável com violações plantadas (telefone e CPF em `SgInputText`, `<input>` cru, `window.confirm`, `@Inject` em atributo, `RuntimeException`, pacote no singular), as duas ferramentas executaram a skill `sg-review`, apontaram essas violações com arquivo e linha e fecharam com o bloco `seedgrid-review-json`; o CLI saiu com código 3. Tempos: cerca de 27 s (Claude Code) e 80 s (Codex). Os itens de julgamento divergiram entre as duas ferramentas.
|
|
35
35
|
|
|
36
36
|
Nenhuma tarefa publicou ou modificou serviços externos.
|
|
37
37
|
|
package/docs/formato.md
CHANGED
|
@@ -57,7 +57,7 @@ Arquivos e pastas que começam com ponto são ignorados.
|
|
|
57
57
|
```json
|
|
58
58
|
{
|
|
59
59
|
"schemaVersion": 2,
|
|
60
|
-
"contentVersion": "0.3.
|
|
60
|
+
"contentVersion": "0.3.3",
|
|
61
61
|
"toolkitBase": "SeedGrid/Toolkit",
|
|
62
62
|
"components": [
|
|
63
63
|
{ "id": "agents", "type": "agents", "files": ["agents/arquiteto.md"] },
|
|
@@ -65,9 +65,9 @@ Arquivos e pastas que começam com ponto são ignorados.
|
|
|
65
65
|
{ "id": "templates", "type": "templates", "files": ["templates/especificacao-tarefa.md"] },
|
|
66
66
|
{ "id": "references", "type": "references", "files": ["references/glossario.md"] },
|
|
67
67
|
{
|
|
68
|
-
"id": "skill:
|
|
68
|
+
"id": "skill:sg-plan-change",
|
|
69
69
|
"type": "skill",
|
|
70
|
-
"name": "
|
|
70
|
+
"name": "sg-plan-change",
|
|
71
71
|
"files": [
|
|
72
72
|
"SKILL.md",
|
|
73
73
|
{ "path": "assets/especificacao-tarefa.md", "from": "templates/especificacao-tarefa.md" }
|
|
@@ -111,7 +111,7 @@ Schema próprio do toolkit, em frontmatter YAML:
|
|
|
111
111
|
id: backend-java
|
|
112
112
|
description: Implementa APIs Java e persistência quando a tarefa altera o backend.
|
|
113
113
|
capabilities: [read-files, edit-files, run-checks]
|
|
114
|
-
preferred_skills: [
|
|
114
|
+
preferred_skills: [sg-validate-change]
|
|
115
115
|
---
|
|
116
116
|
```
|
|
117
117
|
|
package/package.json
CHANGED
|
@@ -249,8 +249,9 @@ Tabela geral de **todas as propriedades públicas** de configuração documentad
|
|
|
249
249
|
| `seedgrid.login-tenancy.modules.filemanagement.enabled` | Ativação lógica dos módulos | `boolean` | `true` | Runtime | Só afeta activeModules (status/log); filemanagement não tem migrations no baseline | [[SeedGrid/Extensions/login-tenancy/Configuracao\|login-tenancy/Configuracao]] |
|
|
250
250
|
| `seedgrid.audit.mongodb.database` | Propriedades de outros prefixos seedgrid.* lidas pela login-tenancy | `Optional<String>` | — (deriva `<app.code>_audit_db`, ou `audit_db`) | audit]]) | Override do banco Mongo de auditoria produzido pela foundation (banco único) | [[SeedGrid/Extensions/login-tenancy/Configuracao\|login-tenancy/Configuracao]] |
|
|
251
251
|
| `seedgrid.audit.persistence.strategy` | Propriedades de outros prefixos seedgrid.* lidas pela login-tenancy | `Optional<String>` | — | Runtime | Decide se as migrations db/migration/audit rodam | [[SeedGrid/Extensions/login-tenancy/Configuracao\|login-tenancy/Configuracao]] |
|
|
252
|
-
| `seedgrid.ai-pricing.
|
|
253
|
-
| `seedgrid.exchange.
|
|
252
|
+
| `seedgrid.login-tenancy.modules.ai-pricing.enabled` | Ativação lógica dos módulos | `boolean` | `true` | Runtime | false: não migra o ai-pricing e as rotas respondem 404 | [[SeedGrid/Extensions/login-tenancy/Configuracao\|login-tenancy/Configuracao]] |
|
|
253
|
+
| `seedgrid.login-tenancy.modules.exchange.enabled` | Ativação lógica dos módulos | `boolean` | `true` | Runtime | false: não migra o exchange e as rotas respondem 404 | [[SeedGrid/Extensions/login-tenancy/Configuracao\|login-tenancy/Configuracao]] |
|
|
254
|
+
| `seedgrid.login-tenancy.modules.business-days.enabled` | Ativação lógica dos módulos | `boolean` | `true` | Runtime | false: não migra o business-days e as rotas respondem 404 | [[SeedGrid/Extensions/login-tenancy/Configuracao\|login-tenancy/Configuracao]] |
|
|
254
255
|
| `seedgrid.security.first-admin-user.email` | Propriedades de outros prefixos seedgrid.* lidas pela login-tenancy | `Optional<String>` | — | security]] | Só lida para decidir logs/WARN e firstAdminConfigured no status | [[SeedGrid/Extensions/login-tenancy/Configuracao\|login-tenancy/Configuracao]] |
|
|
255
256
|
| `seedgrid.security.jwt.issuer` | Propriedades de outros prefixos seedgrid.* lidas pela login-tenancy | `Optional<String>` | — | Runtime | Exibido em security.jwtIssuer no status | [[SeedGrid/Extensions/login-tenancy/Configuracao\|login-tenancy/Configuracao]] |
|
|
256
257
|
| `seedgrid.show-dev-message` | Propriedades de outros prefixos seedgrid.* lidas pela login-tenancy | `boolean` | `false` | Runtime | Inclui devMessage nos problem+json das exceções da login-tenancy | [[SeedGrid/Extensions/login-tenancy/Configuracao\|login-tenancy/Configuracao]] |
|
|
@@ -25,6 +25,7 @@ Contagens de propriedades por extension e plataforma: [[SeedGrid/Extensions/Cata
|
|
|
25
25
|
| billing | Assinaturas: planos, uso, checkout, portal, webhooks; provider Stripe. | [[SeedGrid/Extensions/billing/Visao-geral\|Visão geral]] · [[SeedGrid/Extensions/billing/Configuracao\|Config]] · [[SeedGrid/Extensions/billing/Exemplos\|Exemplos]] · [[SeedGrid/Extensions/billing/Enums|Enums]] | [[SeedGrid/Extensions/billing/Rust\|Rust]] · [[SeedGrid/Extensions/billing/Configuracao-Rust\|Config]] |
|
|
26
26
|
| ai-pricing | Catálogo de modelos LLM e histórico de preços por 1M tokens; robô agendado propõe mudanças com aprovação humana (só Java). | [[SeedGrid/Extensions/ai-pricing/Visao-geral\|Visão geral]] · [[SeedGrid/Extensions/ai-pricing/Configuracao\|Config]] · [[SeedGrid/Extensions/ai-pricing/Exemplos\|Exemplos]] · [[SeedGrid/Extensions/ai-pricing/Enums|Enums]] | — |
|
|
27
27
|
| exchange | Moedas e cotações diárias com histórico; fontes configuráveis por cadastro, retry; seed USD-BRL PTAX (só Java). | [[SeedGrid/Extensions/exchange/Visao-geral\|Visão geral]] · [[SeedGrid/Extensions/exchange/Configuracao\|Config]] · [[SeedGrid/Extensions/exchange/Exemplos\|Exemplos]] · [[SeedGrid/Extensions/exchange/Enums|Enums]] | — |
|
|
28
|
+
| business-days | Calendário de dias úteis: feriados (recorrentes ou de um ano), semana de trabalho (peso 0/0,5/1) e cálculo de dias úteis; escopo por empresa (JPA puro). | [[SeedGrid/Extensions/business-days/Visao-geral\|Visão geral]] · [[SeedGrid/Extensions/business-days/Configuracao\|Configuração]] · [[SeedGrid/Extensions/business-days/Exemplos\|Exemplos]] |
|
|
28
29
|
|
|
29
30
|
## Dados, auditoria e compliance
|
|
30
31
|
|
|
@@ -47,11 +47,14 @@ Variáveis de ambiente pela regra MP, sem ambiguidade:
|
|
|
47
47
|
|
|
48
48
|
Origem: `rt/entities/AiPricingConfigEntity.java`, `runtime/src/main/resources/db/migration/ai-pricing/V902__seed_ai_models_and_pricing_config.sql`, `rt/controllers/AdminAiPriceApprovalResource#saveConfig`.
|
|
49
49
|
|
|
50
|
-
### 2.3
|
|
50
|
+
### 2.3 Toggle do módulo
|
|
51
51
|
|
|
52
|
-
| Propriedade |
|
|
53
|
-
|
|
54
|
-
| `seedgrid.ai-pricing.
|
|
52
|
+
| Propriedade | Padrão | Efeito |
|
|
53
|
+
|---|---|---|
|
|
54
|
+
| `seedgrid.ai-pricing.enabled` | `true` | `false`: sem migrations, sem robô e as rotas `/admin/ai/**` respondem 404. Nas tenancy o default vem de `seedgrid.<tenancy>.modules.ai-pricing.enabled`. |
|
|
55
|
+
| `seedgrid.migrations.host-managed` | `false` | `true` (definido pelas tenancy): o runner da extension não age; a tenancy migra cada banco. |
|
|
56
|
+
|
|
57
|
+
A extension **sempre migra** o datasource default na subida (`AiPricingMigrationRunner`, histórico `flyway_schema_history_ai_pricing`). Não existe mais `seedgrid.ai-pricing.migration.enabled`.
|
|
55
58
|
|
|
56
59
|
## 3. Propriedades de frameworks
|
|
57
60
|
|
|
@@ -59,8 +62,6 @@ A extension não define nenhuma propriedade de framework: não há `microprofile
|
|
|
59
62
|
|
|
60
63
|
| Propriedade | Recomendação |
|
|
61
64
|
|---|---|
|
|
62
|
-
| `quarkus.flyway.locations` | Incluir `db/migration/ai-pricing` no Flyway nativo, ou ligar `seedgrid.ai-pricing.migration.enabled` nos tenancies. |
|
|
63
|
-
| `quarkus.flyway.table` | Os testes usam `flyway_schema_history_ai_pricing` (o mesmo nome do runner dos tenancies). |
|
|
64
65
|
| `quarkus.hibernate-orm.physical-naming-strategy` | `org.hibernate.boot.model.naming.CamelCaseToUnderscoresNamingStrategy` (as entidades são camelCase e as colunas snake_case). |
|
|
65
66
|
| `quarkus.hibernate-orm.<pu>.packages` | Mapear `br.com.seedgrid.aipricing.entities` na PU configurada. No subdomain-tenancy, só em master (README). |
|
|
66
67
|
|
|
@@ -68,26 +69,18 @@ A extension não define nenhuma propriedade de framework: não há `microprofile
|
|
|
68
69
|
|
|
69
70
|
Arquivo `integration-tests/src/test/resources/application.properties`:
|
|
70
71
|
- `quarkus.devservices.enabled=false`
|
|
71
|
-
- `quarkus.flyway.migrate-at-start=true`
|
|
72
|
-
- `quarkus.flyway.locations=db/migration/ai-pricing`
|
|
73
|
-
- `quarkus.flyway.table=flyway_schema_history_ai_pricing`
|
|
74
|
-
- `quarkus.flyway.baseline-on-migrate=true`
|
|
75
72
|
- naming strategy
|
|
76
73
|
- `quarkus.hibernate-orm.schema-management.strategy=none`
|
|
77
74
|
- `quarkus.scheduler.enabled=false`
|
|
78
75
|
- `quarkus.http.test-port=0`
|
|
79
76
|
|
|
80
|
-
O `ModuloDesligadoTest`
|
|
77
|
+
Sem Flyway nativo: a própria extension migra. O `ModuloDesligadoTest` usa `seedgrid.ai-pricing.enabled=false` via `QuarkusTestProfile`.
|
|
81
78
|
|
|
82
79
|
## 5. Aliases, obsoletas e renomeações
|
|
83
80
|
Não encontradas. O prefixo duplo (`seedgrid.ai-pricing` contra `seedgrid.app.ai-pricing`) é uma inconsistência, não um alias.
|
|
84
81
|
|
|
85
82
|
## 6. Configuração mínima
|
|
86
|
-
Nenhuma propriedade é obrigatória
|
|
87
|
-
|
|
88
|
-
```properties
|
|
89
|
-
seedgrid.ai-pricing.migration.enabled=true
|
|
90
|
-
```
|
|
83
|
+
Nenhuma propriedade é obrigatória: colocou a extension, ela migra.
|
|
91
84
|
|
|
92
85
|
O robô só funciona com um bean `AiPriceExtractor` do host (ver [[SeedGrid/Extensions/ai-pricing/Exemplos|Exemplos]]).
|
|
93
86
|
|
|
@@ -104,8 +97,8 @@ seedgrid.app.ai-pricing.timezone=America/Sao_Paulo
|
|
|
104
97
|
# Default https://developers.openai.com/api/docs/pricing
|
|
105
98
|
#seedgrid.app.ai-pricing.source-url=https://<pagina-de-precos>
|
|
106
99
|
|
|
107
|
-
#
|
|
108
|
-
seedgrid.ai-pricing.
|
|
100
|
+
# Liga/desliga o módulo (migrations, robô e rotas). Default true.
|
|
101
|
+
#seedgrid.ai-pricing.enabled=true
|
|
109
102
|
```
|
|
110
103
|
|
|
111
104
|
## 8. Receitas
|
|
@@ -90,8 +90,8 @@ Para cadastrar um modelo, `POST /admin/ai/models` recebe `{ "provider": "openai"
|
|
|
90
90
|
## 5. Configuração por tenancy
|
|
91
91
|
|
|
92
92
|
```properties
|
|
93
|
-
# login-tenancy / subdomain-tenancy:
|
|
94
|
-
seedgrid.ai-pricing.
|
|
93
|
+
# login-tenancy / subdomain-tenancy: a tenancy migra (V900–V903); o toggle é do módulo, default true
|
|
94
|
+
#seedgrid.login-tenancy.modules.ai-pricing.enabled=true
|
|
95
95
|
# subdomain-tenancy já define:
|
|
96
96
|
# seedgrid.ai-pricing.persistence-unit=master
|
|
97
97
|
```
|
|
@@ -18,7 +18,7 @@ Mantém o catálogo de modelos de LLM e o histórico de preços por 1M de tokens
|
|
|
18
18
|
|
|
19
19
|
| Módulo | Artefato |
|
|
20
20
|
|---|---|
|
|
21
|
-
| parent | `br.com.seedgrid:seedgrid-ai-pricing-parent:2026.10.
|
|
21
|
+
| parent | `br.com.seedgrid:seedgrid-ai-pricing-parent:2026.10.16` (parent `seedgrid-parent:2026.07.02`) |
|
|
22
22
|
| runtime | `br.com.seedgrid:seedgrid-ai-pricing` |
|
|
23
23
|
| deployment | `br.com.seedgrid:seedgrid-ai-pricing-deployment` |
|
|
24
24
|
| integration-tests | não publicado |
|
|
@@ -94,7 +94,7 @@ Declarados em `AiPricingNotificationCatalog`:
|
|
|
94
94
|
| V902 | seed de modelos OpenAI (`gpt-4.1-nano`, `gpt-4.1-mini`, `gpt-5.1`) e da config do robô (ligado, cron `0 0 6 * * ?`, `source_url` = página de preços da OpenAI) |
|
|
95
95
|
| V903 | coluna `active` |
|
|
96
96
|
|
|
97
|
-
|
|
97
|
+
A extension migra sozinha o datasource default na subida (sem flag). Nas tenancy, quem migra é a tenancy (master do subdomain-tenancy; banco único do login-tenancy), com o toggle `modules.ai-pricing.enabled` (default `true`). Ver [[SeedGrid/Extensions/ai-pricing/Configuracao|Configuração]].
|
|
98
98
|
|
|
99
99
|
## Testes (não executados)
|
|
100
100
|
- `runtime/src/test`:
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
---
|
|
2
|
+
tags: [seedgrid, extension, business-days, quarkus]
|
|
3
|
+
fonte: java/seedgrid-quarkus-ext-business-days
|
|
4
|
+
branch: (repositório ainda não criado)
|
|
5
|
+
commit: —
|
|
6
|
+
analisado-em: 2026-10-16
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Business days: configuração
|
|
10
|
+
|
|
11
|
+
| Propriedade | Padrão | Efeito |
|
|
12
|
+
|---|---|---|
|
|
13
|
+
| `seedgrid.business-days.enabled` | `true` (env `SEEDGRID_BUSINESS_DAYS_ENABLED`) | Liga/desliga o módulo: desligado = sem migrations e rotas 404 (e fora do OpenAPI). |
|
|
14
|
+
| `seedgrid.business-days.persistence-unit` | PU default | PU das tabelas. Vazio ou `<default>` = default. |
|
|
15
|
+
| `seedgrid.business-days.max-range-days` | `36600` (env `SEEDGRID_BUSINESS_DAYS_MAX_RANGE_DAYS`) | Teto de dias nas consultas de intervalo. |
|
|
16
|
+
| `seedgrid.migrations.host-managed` | `false` | Definido pelas tenancy: o runner da extension não age, a tenancy migra cada banco. |
|
|
17
|
+
|
|
18
|
+
Mapear `br.com.seedgrid.businessdays.entities` na PU configurada (no subdomain-tenancy, na PU default; sem `packages` explícito o Quarkus já indexa).
|
|
19
|
+
|
|
20
|
+
## Nas tenancy
|
|
21
|
+
|
|
22
|
+
| Host | Toggle | Onde migra |
|
|
23
|
+
|---|---|---|
|
|
24
|
+
| login-tenancy | `seedgrid.login-tenancy.modules.business-days.enabled` (default `true`) | banco único, depois do security |
|
|
25
|
+
| subdomain-tenancy | `seedgrid.subdomain-tenancy.modules.business-days.enabled` (default `true`) | master e cada tenant. Tenants já `READY`: mudar `migration.target-version` para aplicar o schema novo |
|
|
26
|
+
|
|
27
|
+
Host que mantém calendário próprio (ex.: seedgrid-report) desliga: `seedgrid.login-tenancy.modules.business-days.enabled=false`.
|
|
28
|
+
|
|
29
|
+
## Mínima
|
|
30
|
+
|
|
31
|
+
Nenhuma propriedade é obrigatória: colocou a extension, ela migra.
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
## Veja também
|
|
35
|
+
|
|
36
|
+
[[SeedGrid/Extensions/business-days/Visao-geral|Visão geral]] · [[SeedGrid/Extensions/Catalogo-de-propriedades|Catálogo de propriedades]] · [[SeedGrid/Extensions/Indice|Índice das extensions]]
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
---
|
|
2
|
+
tags: [seedgrid, extension, business-days, quarkus]
|
|
3
|
+
fonte: java/seedgrid-quarkus-ext-business-days
|
|
4
|
+
branch: (repositório ainda não criado)
|
|
5
|
+
commit: —
|
|
6
|
+
analisado-em: 2026-10-16
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Business days: exemplos
|
|
10
|
+
|
|
11
|
+
## Usar o cálculo em código
|
|
12
|
+
|
|
13
|
+
```java
|
|
14
|
+
@Inject BusinessDayService service;
|
|
15
|
+
|
|
16
|
+
boolean util = service.isBusinessDay(LocalDate.of(2026, 12, 25));
|
|
17
|
+
LocalDate vencimento = service.addBusinessDays(LocalDate.of(2026, 10, 1), 5);
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
`BusinessCalendar` (pacote `utils`) é imutável e sem CDI/JPA: dá para montá-lo e testar sem Quarkus.
|
|
21
|
+
|
|
22
|
+
## Cadastrar um feriado da empresa
|
|
23
|
+
|
|
24
|
+
`POST /business-days/holidays` com `{ "name": "Aniversário da cidade", "month": 3, "day": 19, "year": null, "active": true }`. Com `year` preenchido o feriado vale só naquele ano (ex.: ponte).
|
|
25
|
+
|
|
26
|
+
## Semana de trabalho
|
|
27
|
+
|
|
28
|
+
`PUT /business-days/week-profile` com os sete dias, peso `1`, `0.5` ou `0`. `DELETE` volta ao padrão herdado (global ou segunda a sexta).
|
|
29
|
+
|
|
30
|
+
## Host sem tenancy
|
|
31
|
+
|
|
32
|
+
Basta a dependência `br.com.seedgrid:seedgrid-business-days`; a extension migra o datasource default e expõe as rotas.
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
## Veja também
|
|
36
|
+
|
|
37
|
+
[[SeedGrid/Extensions/business-days/Visao-geral|Visão geral]] · [[SeedGrid/Extensions/Catalogo-de-propriedades|Catálogo de propriedades]] · [[SeedGrid/Extensions/Indice|Índice das extensions]]
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
---
|
|
2
|
+
tags: [seedgrid, extension, business-days, quarkus]
|
|
3
|
+
fonte: java/seedgrid-quarkus-ext-business-days
|
|
4
|
+
branch: (repositório ainda não criado)
|
|
5
|
+
commit: —
|
|
6
|
+
analisado-em: 2026-10-16
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Business days (Quarkus): visão geral
|
|
10
|
+
|
|
11
|
+
Calendário de dias úteis para hosts Quarkus: **feriados** (recorrentes ou de um ano específico), **semana de trabalho** (peso 0 / 0,5 / 1 por dia da semana) e cálculo de dias úteis (é dia útil?, contar, somar pesos, andar N dias úteis). Tabelas próprias (`business_day_*`), JPA puro (sem Panache).
|
|
12
|
+
|
|
13
|
+
- Configuração: [[SeedGrid/Extensions/business-days/Configuracao|Configuração do business-days]]
|
|
14
|
+
- Exemplos: [[SeedGrid/Extensions/business-days/Exemplos|Exemplos do business-days]]
|
|
15
|
+
|
|
16
|
+
## Módulos e coordenadas
|
|
17
|
+
|
|
18
|
+
| Módulo | Artefato |
|
|
19
|
+
|---|---|
|
|
20
|
+
| parent | `br.com.seedgrid:seedgrid-business-days-parent:2026.10.15` (parent `seedgrid-parent:2026.07.02`) |
|
|
21
|
+
| runtime | `br.com.seedgrid:seedgrid-business-days` |
|
|
22
|
+
| deployment | `br.com.seedgrid:seedgrid-business-days-deployment` |
|
|
23
|
+
| integration-tests | não publicado (Testcontainers Postgres) |
|
|
24
|
+
|
|
25
|
+
`seedgrid-security` é dependência **`provided`**: a extension funciona sozinha. Com a security no classpath o escopo é a **empresa corrente do token** (`SecurityBusinessDaysScopeProvider`, registrado pelo deployment só nesse caso); sem ela vale um calendário **global** (`GlobalBusinessDaysScopeProvider`). Para outro escopo, o host fornece a sua `BusinessDaysScopeProvider`.
|
|
26
|
+
|
|
27
|
+
## Modelo
|
|
28
|
+
|
|
29
|
+
- Dia útil = peso do dia da semana > 0 e não ser feriado (feriado zera o dia).
|
|
30
|
+
- Feriado com `year` nulo repete todo ano; com `year` vale só naquele ano.
|
|
31
|
+
- `company_id` nulo = feriado/perfil **global** (não é FK, a extension não depende da security). A empresa vê globais + os dela, mas só altera os dela.
|
|
32
|
+
- Perfil da semana: COMPANY > GLOBAL > DEFAULT (segunda a sexta).
|
|
33
|
+
|
|
34
|
+
## Migrations
|
|
35
|
+
|
|
36
|
+
Faixa V1100–V1199, location `db/migration/business-days`, histórico `flyway_schema_history_business_days`.
|
|
37
|
+
|
|
38
|
+
- **Sozinha no host**: colocou a dependência, ela migra o datasource default na subida (`BusinessDaysMigrationRunner`). Sem flag.
|
|
39
|
+
- **Com login-tenancy / subdomain-tenancy**: a tenancy migra (`seedgrid.migrations.host-managed=true` faz o runner não agir). login-tenancy: banco único. subdomain-tenancy: **master e cada tenant**, cada um com o seu calendário (a PU default aponta para o master no domínio do admin e para o tenant nos demais).
|
|
40
|
+
- Toggle: `seedgrid.business-days.enabled` (default `true`); nas tenancy vem de `modules.business-days.enabled`. Desligado = não migra e `/business-days/**` responde 404.
|
|
41
|
+
|
|
42
|
+
## API
|
|
43
|
+
|
|
44
|
+
`/business-days/holidays` (CRUD), `/business-days/week-profile` (GET/PUT/DELETE), `/business-days/calendar?year&month`, `/check?date`, `/count?from&to`, `/add?from&days`. Permissões `BUSINESS_DAY_READ/CREATE/UPDATE/DELETE` (sem audience, vinculadas ao ADMIN pela V1101).
|
|
45
|
+
|
|
46
|
+
## Front nos boilerplates
|
|
47
|
+
|
|
48
|
+
Menu **Dias úteis** (`/dias-uteis/*`): feriados (lista e edição), semana de trabalho e calendário; proxy em `app/api/business-days/[...path]`.
|
|
@@ -51,11 +51,14 @@ Variáveis de ambiente pela regra MP, sem ambiguidade:
|
|
|
51
51
|
|
|
52
52
|
Origem: `rt/entities/CurrencyEntity.java`, `rt/dtos/CurrencyUpsertRequest.java`, `runtime/src/main/resources/db/migration/exchange/V802__seed_currencies.sql`. A seed V802 cria `USD-BRL` com a fonte PTAX/BCB, `cotacaoVenda`, cron às 7h e fuso `America/Sao_Paulo`.
|
|
53
53
|
|
|
54
|
-
### 2.3
|
|
54
|
+
### 2.3 Toggle do módulo
|
|
55
55
|
|
|
56
|
-
| Propriedade |
|
|
57
|
-
|
|
58
|
-
| `seedgrid.exchange.
|
|
56
|
+
| Propriedade | Padrão | Efeito |
|
|
57
|
+
|---|---|---|
|
|
58
|
+
| `seedgrid.exchange.enabled` | `true` | `false`: sem migrations, sem scheduler e as rotas `/admin/exchange-rate`, `/admin/currencies` e `/admin/currency-exchange-rates` respondem 404. Nas tenancy o default vem de `seedgrid.<tenancy>.modules.exchange.enabled`. |
|
|
59
|
+
| `seedgrid.migrations.host-managed` | `false` | `true` (definido pelas tenancy): o runner da extension não age; a tenancy migra cada banco. |
|
|
60
|
+
|
|
61
|
+
A extension **sempre migra** o datasource default na subida (`ExchangeMigrationRunner`, histórico `flyway_schema_history_exchange`). Não existe mais `seedgrid.exchange.migration.enabled`.
|
|
59
62
|
|
|
60
63
|
## 3. Propriedades de frameworks
|
|
61
64
|
|
|
@@ -63,7 +66,6 @@ A extension não define nenhuma. Recomendações extraídas do `integration-test
|
|
|
63
66
|
|
|
64
67
|
| Propriedade | Recomendação |
|
|
65
68
|
|---|---|
|
|
66
|
-
| `quarkus.flyway.locations` / `quarkus.flyway.table` | `db/migration/exchange` / `flyway_schema_history_exchange` (Flyway nativo). Nos tenancies, use `seedgrid.exchange.migration.enabled`. |
|
|
67
69
|
| `quarkus.hibernate-orm.physical-naming-strategy` | `org.hibernate.boot.model.naming.CamelCaseToUnderscoresNamingStrategy` |
|
|
68
70
|
| `quarkus.hibernate-orm.<pu>.packages` | Incluir `br.com.seedgrid.exchange.entities` na PU configurada (no subdomain-tenancy, só master). |
|
|
69
71
|
| `quarkus.scheduler.enabled` | Os testes usam `false` para controlar os disparos. Em produção, deixe ligado. |
|
|
@@ -72,10 +74,6 @@ A extension não define nenhuma. Recomendações extraídas do `integration-test
|
|
|
72
74
|
|
|
73
75
|
Arquivo `integration-tests/src/test/resources/application.properties`:
|
|
74
76
|
- `quarkus.devservices.enabled=false`
|
|
75
|
-
- `quarkus.flyway.migrate-at-start=true`
|
|
76
|
-
- `quarkus.flyway.locations=db/migration/exchange,db/migration/exchange-test`
|
|
77
|
-
- `quarkus.flyway.table=flyway_schema_history_exchange`
|
|
78
|
-
- `quarkus.flyway.baseline-on-migrate=true`
|
|
79
77
|
- naming strategy
|
|
80
78
|
- `quarkus.hibernate-orm.schema-management.strategy=none`
|
|
81
79
|
- `quarkus.scheduler.enabled=false`
|
|
@@ -86,11 +84,7 @@ Arquivo `integration-tests/src/test/resources/application.properties`:
|
|
|
86
84
|
Não encontradas. Atenção: `seedgrid.app.business-timezone` é diferente de `seedgrid.billing.business-timezone` (ver [[SeedGrid/Extensions/billing/Configuracao|Configuração do billing]]).
|
|
87
85
|
|
|
88
86
|
## 6. Configuração mínima
|
|
89
|
-
Nenhuma propriedade é obrigatória
|
|
90
|
-
|
|
91
|
-
```properties
|
|
92
|
-
seedgrid.exchange.migration.enabled=true
|
|
93
|
-
```
|
|
87
|
+
Nenhuma propriedade é obrigatória: colocou a extension, ela migra.
|
|
94
88
|
|
|
95
89
|
## 7. Configuração completa comentada
|
|
96
90
|
|
|
@@ -102,8 +96,8 @@ seedgrid.exchange.migration.enabled=true
|
|
|
102
96
|
# Default America/Sao_Paulo.
|
|
103
97
|
seedgrid.app.business-timezone=America/Sao_Paulo
|
|
104
98
|
|
|
105
|
-
# (
|
|
106
|
-
seedgrid.exchange.
|
|
99
|
+
# Liga/desliga o módulo (migrations, scheduler e rotas). Default true.
|
|
100
|
+
#seedgrid.exchange.enabled=true
|
|
107
101
|
```
|
|
108
102
|
|
|
109
103
|
## 8. Receitas
|
|
@@ -22,7 +22,7 @@ Fonte: README.
|
|
|
22
22
|
</dependency>
|
|
23
23
|
```
|
|
24
24
|
|
|
25
|
-
Security e audit-core vêm do host.
|
|
25
|
+
Security e audit-core vêm do host. A extension migra sozinha; nas tenancy o toggle é `modules.exchange.enabled` (default `true`).
|
|
26
26
|
|
|
27
27
|
## 2. Cadastrar uma moeda com fonte PTAX
|
|
28
28
|
|
|
@@ -76,7 +76,7 @@ POST /admin/currency-exchange-rates/{publicId}/retry
|
|
|
76
76
|
## 5. Configuração (properties)
|
|
77
77
|
|
|
78
78
|
```properties
|
|
79
|
-
seedgrid.exchange.
|
|
79
|
+
#seedgrid.login-tenancy.modules.exchange.enabled=true # tenancies (default true)
|
|
80
80
|
#seedgrid.exchange.persistence-unit=master # subdomain-tenancy já define
|
|
81
81
|
seedgrid.app.business-timezone=America/Sao_Paulo # fuso dos avisos
|
|
82
82
|
```
|
|
@@ -18,7 +18,7 @@ Câmbio para hosts Quarkus. Mantém moedas e cotações diárias, com histórico
|
|
|
18
18
|
|
|
19
19
|
| Módulo | Artefato |
|
|
20
20
|
|---|---|
|
|
21
|
-
| parent | `br.com.seedgrid:seedgrid-exchange-parent:2026.10.
|
|
21
|
+
| parent | `br.com.seedgrid:seedgrid-exchange-parent:2026.10.16` (parent `seedgrid-parent:2026.07.02`) |
|
|
22
22
|
| runtime | `br.com.seedgrid:seedgrid-exchange` |
|
|
23
23
|
| deployment | `br.com.seedgrid:seedgrid-exchange-deployment` |
|
|
24
24
|
| integration-tests | não publicado |
|
|
@@ -106,7 +106,7 @@ Os `{id}` são `publicId`. **Confirmado** nos resources.
|
|
|
106
106
|
| V803 | histórico PTAX sem `$select` |
|
|
107
107
|
| V804 | `currency_exchange_rates.active` |
|
|
108
108
|
|
|
109
|
-
|
|
109
|
+
A extension migra sozinha o datasource default na subida (sem flag). Nas tenancy, quem migra é a tenancy (master do subdomain-tenancy; banco único do login-tenancy), com o toggle `modules.exchange.enabled` (default `true`).
|
|
110
110
|
|
|
111
111
|
## Testes (não executados)
|
|
112
112
|
- `runtime/src/test`: `CurrencyRateNotificationTest`, `CurrencySourceResolverTest` e `ExchangeNotificationCatalogTest`.
|
|
@@ -70,8 +70,6 @@ Total `seedgrid.login-tenancy.*`: **13 propriedades**.
|
|
|
70
70
|
|---|---|---|---|---|---|---|---|---|---|
|
|
71
71
|
| `seedgrid.audit.mongodb.database` | `Optional<String>` | nome de banco Mongo | — (deriva `<app.code>_audit_db`, ou `audit_db`) | Não | Override do banco Mongo de auditoria produzido pela foundation (banco único). | Audit MongoDB | Só existe bean se o Mongo estiver no classpath; conexão via `seedgrid.audit.mongodb.connection-string` (módulo audit — ver [[SeedGrid/Extensions/audit/Configuracao|audit]]) | Runtime | `LoginTenancyMongoAuditDatabaseProducer#auditDatabase` |
|
|
72
72
|
| `seedgrid.audit.persistence.strategy` | `Optional<String>` | `jpa` (case-insensitive) habilita | — | Condicional (sem `jpa`, a migration de audit é pulada) | Decide se as migrations `db/migration/audit` rodam. | Orquestração | Chave do módulo audit | Runtime | `LoginTenancyMigrationService#isAuditJpa` |
|
|
73
|
-
| `seedgrid.ai-pricing.migration.enabled` | `boolean` | `true`/`false` | `false` | Não | Roda `classpath:db/migration/ai-pricing` com `flyway_schema_history_ai_pricing`. | Hosts com ai-pricing | Mesma chave lida pelo `MigrationService` do subdomain-tenancy | Runtime | `LoginTenancyMigrationService#aiPricingMigrationsEnabled` |
|
|
74
|
-
| `seedgrid.exchange.migration.enabled` | `boolean` | `true`/`false` | `false` | Não | Roda `classpath:db/migration/exchange` com `flyway_schema_history_exchange`. | Hosts com exchange | Idem | Runtime | `LoginTenancyMigrationService#exchangeMigrationsEnabled` |
|
|
75
73
|
| `seedgrid.security.first-admin-user.email` | `Optional<String>` | e-mail | — | Não | Só lida para decidir logs/WARN e `firstAdminConfigured` no status. | Coordenação | Ver [[SeedGrid/Extensions/security/Configuracao|security]] | Runtime | `LoginTenancyBootstrapService`, `LoginTenancySecurityBridge` |
|
|
76
74
|
| `seedgrid.security.jwt.issuer` | `Optional<String>` | URL/issuer | — | Não | Exibido em `security.jwtIssuer` no status. | Informativo | security | Runtime | `LoginTenancySecurityBridge` |
|
|
77
75
|
| `seedgrid.show-dev-message` | `boolean` | `true`/`false` | `false` | Não | Inclui `devMessage` nos problem+json das exceções da login-tenancy. | Depuração | Mesma chave usada por security e billing | Runtime | `LoginTenancyApiExceptionExtension` (construtor) |
|
|
@@ -171,9 +169,10 @@ seedgrid.login-tenancy.modules.billing.enabled=true
|
|
|
171
169
|
seedgrid.login-tenancy.modules.apikeys.enabled=true
|
|
172
170
|
seedgrid.login-tenancy.modules.backup.enabled=true
|
|
173
171
|
seedgrid.login-tenancy.modules.filemanagement.enabled=true
|
|
174
|
-
#
|
|
175
|
-
seedgrid.ai-pricing.
|
|
176
|
-
seedgrid.exchange.
|
|
172
|
+
# Modulos de produto (default true): desligado = nao migra e as rotas respondem 404
|
|
173
|
+
seedgrid.login-tenancy.modules.ai-pricing.enabled=true
|
|
174
|
+
seedgrid.login-tenancy.modules.exchange.enabled=true
|
|
175
|
+
seedgrid.login-tenancy.modules.business-days.enabled=true
|
|
177
176
|
# Auditoria
|
|
178
177
|
seedgrid.audit.persistence.strategy=jpa
|
|
179
178
|
#seedgrid.audit.mongodb.database=<banco-de-auditoria>
|
|
@@ -66,7 +66,7 @@ flowchart LR
|
|
|
66
66
|
BI -- on --> BL[billing] --> AK
|
|
67
67
|
BI -- off --> AK{modules.apikeys}
|
|
68
68
|
AK -- on --> AP[apikeys] --> X
|
|
69
|
-
AK -- off --> X{ai-pricing / exchange<br/>
|
|
69
|
+
AK -- off --> X{ai-pricing / exchange / business-days<br/>modules.*.enabled}
|
|
70
70
|
X --> LT[login-tenancy<br/>V700-V703] --> APP["app (database.locations)<br/>flyway_schema_history"]
|
|
71
71
|
```
|
|
72
72
|
|
|
@@ -176,8 +176,9 @@ As chaves têm efeito via ponte do `MPC` para o mailer nomeado `quarkus.mailer."
|
|
|
176
176
|
| Propriedade | Padrão no consumo | Efeito aqui | Origem |
|
|
177
177
|
|---|---|---|---|
|
|
178
178
|
| `seedgrid.audit.persistence.strategy` | `—` | Só com `jpa` (case-insensitive) roda `db/migration/audit` no master e nos tenants | `RT/flyway/Migrations#migrateAuditSchema` |
|
|
179
|
-
| `seedgrid.ai-pricing.
|
|
180
|
-
| `seedgrid.exchange.
|
|
179
|
+
| `seedgrid.subdomain-tenancy.modules.ai-pricing.enabled` | `true` | Migra `db/migration/ai-pricing` no master; desligado = não migra e as rotas respondem 404 | `RT/flyway/Migrations` |
|
|
180
|
+
| `seedgrid.subdomain-tenancy.modules.exchange.enabled` | `true` | Idem para `db/migration/exchange` (master) | `RT/flyway/Migrations` |
|
|
181
|
+
| `seedgrid.subdomain-tenancy.modules.business-days.enabled` | `true` | Migra `db/migration/business-days` no master **e em cada tenant** (cada um com o seu calendário) | `RT/flyway/Migrations` |
|
|
181
182
|
| `quarkus.mongodb.database` | `default_db` | Sufixo dos bancos Mongo por tenant no `MongoTenantResolverImpl` | `RT/mongodb/MongoTenantResolverImpl` |
|
|
182
183
|
| `seedgrid.ratelimit.{tenant-signup\|tenant-validate-email\|tenant-resend-email}.{permits\|window\|enabled}` | anotação: 100/1 min, 10/1 min, 5/1 h; `enabled=true` | Overrides do `@SeedGridRateLimit` nos endpoints públicos (resilience) | `RT/controllers/TenantSignupController`; `java/seedgrid-quarkus-ext-resilience/.../SeedGridRateLimit.java` (Javadoc) |
|
|
183
184
|
| `seedgrid.security.frontend.base-url` | (do security) | Base dos links de e-mail; `TenantSecurityLinks` insere `<tenant>.` no host em contexto de tenant | `RT/security/TenantSecurityLinks` (via `SecurityFrontendConfig`) |
|