@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.
Files changed (67) hide show
  1. package/README.md +3 -3
  2. package/dist/adapters/shared.js +12 -7
  3. package/dist/cli.js +1 -1
  4. package/dist/commands/review.js +2 -2
  5. package/dist/core/plan.js +5 -0
  6. package/docs/arquitetura.md +2 -2
  7. package/docs/compatibilidade.md +1 -1
  8. package/docs/formato.md +4 -4
  9. package/package.json +1 -1
  10. package/seedgridKB/SeedGrid/Extensions/Catalogo-de-propriedades.md +3 -2
  11. package/seedgridKB/SeedGrid/Extensions/Indice.md +1 -0
  12. package/seedgridKB/SeedGrid/Extensions/ai-pricing/Configuracao.md +11 -18
  13. package/seedgridKB/SeedGrid/Extensions/ai-pricing/Exemplos.md +2 -2
  14. package/seedgridKB/SeedGrid/Extensions/ai-pricing/Visao-geral.md +2 -2
  15. package/seedgridKB/SeedGrid/Extensions/business-days/Configuracao.md +36 -0
  16. package/seedgridKB/SeedGrid/Extensions/business-days/Exemplos.md +37 -0
  17. package/seedgridKB/SeedGrid/Extensions/business-days/Visao-geral.md +48 -0
  18. package/seedgridKB/SeedGrid/Extensions/exchange/Configuracao.md +10 -16
  19. package/seedgridKB/SeedGrid/Extensions/exchange/Exemplos.md +2 -2
  20. package/seedgridKB/SeedGrid/Extensions/exchange/Visao-geral.md +2 -2
  21. package/seedgridKB/SeedGrid/Extensions/login-tenancy/Configuracao.md +4 -5
  22. package/seedgridKB/SeedGrid/Extensions/login-tenancy/Visao-geral.md +1 -1
  23. package/seedgridKB/SeedGrid/Extensions/subdomain-tenancy/Configuracao.md +3 -2
  24. package/seedgridKB/SeedGrid/Extensions/subdomain-tenancy/Visao-geral.md +2 -2
  25. package/seedgridKB/SeedGrid/Mapa-dos-repositorios.md +9 -0
  26. package/seedgridKB/SeedGrid/Produtos/Pulse/Autenticacao-e-chaves.md +89 -0
  27. package/seedgridKB/SeedGrid/Produtos/Pulse/Exemplos.md +44 -0
  28. package/seedgridKB/SeedGrid/Produtos/Pulse/Protocolo-e-API.md +191 -0
  29. package/seedgridKB/SeedGrid/Produtos/Pulse/SDKs.md +287 -0
  30. package/seedgridKB/SeedGrid/Produtos/Pulse/Servidor/Configuracao.md +128 -0
  31. package/seedgridKB/SeedGrid/Produtos/Pulse/Servidor/Instalacao.md +105 -0
  32. package/seedgridKB/SeedGrid/Produtos/Pulse/Servidor/Operacao.md +86 -0
  33. package/seedgridKB/SeedGrid/Produtos/Pulse/Servidor/Providers.md +121 -0
  34. package/seedgridKB/SeedGrid/Produtos/Pulse/UI/Configuracao.md +61 -0
  35. package/seedgridKB/SeedGrid/Produtos/Pulse/UI/Visao-geral.md +74 -0
  36. package/seedgridKB/SeedGrid/Produtos/Pulse/Visao-geral.md +96 -0
  37. package/seedgridKB/SeedGrid/Toolkit/agents/arquiteto.md +1 -1
  38. package/seedgridKB/SeedGrid/Toolkit/agents/backend-java.md +2 -2
  39. package/seedgridKB/SeedGrid/Toolkit/agents/backend-rust.md +1 -1
  40. package/seedgridKB/SeedGrid/Toolkit/agents/frontend-react.md +1 -1
  41. package/seedgridKB/SeedGrid/Toolkit/agents/qa.md +2 -2
  42. package/seedgridKB/SeedGrid/Toolkit/agents/revisor.md +2 -2
  43. package/seedgridKB/SeedGrid/Toolkit/references/fluxo-de-trabalho.md +3 -3
  44. package/seedgridKB/SeedGrid/Toolkit/rules/backend-java-seedgrid.md +27 -3
  45. package/seedgridKB/SeedGrid/Toolkit/rules/coordenacao.md +1 -1
  46. package/seedgridKB/SeedGrid/Toolkit/rules/documentos.md +26 -0
  47. package/seedgridKB/SeedGrid/Toolkit/rules/frontend-seedgrid.md +2 -2
  48. package/seedgridKB/SeedGrid/Toolkit/skills/{seedgrid-bump → sg-bump}/SKILL.md +1 -1
  49. package/seedgridKB/SeedGrid/Toolkit/skills/{revisar-codigo → sg-code-review}/SKILL.md +2 -2
  50. package/seedgridKB/SeedGrid/Toolkit/skills/{seedgrid-backend-crud → sg-crud-back}/SKILL.md +4 -4
  51. package/seedgridKB/SeedGrid/Toolkit/skills/{seedgrid-crud → sg-crud-front}/SKILL.md +5 -5
  52. package/seedgridKB/SeedGrid/Toolkit/skills/{seedgrid-crud → sg-crud-front}/agents/openai.yaml +1 -1
  53. package/seedgridKB/SeedGrid/Toolkit/skills/{seedgrid-crud/references/routing.md → sg-crud-front/references/crud-front-routing.md} +1 -1
  54. package/seedgridKB/SeedGrid/Toolkit/skills/{seedgrid-new-screen → sg-new-screen}/SKILL.md +3 -3
  55. package/seedgridKB/SeedGrid/Toolkit/skills/sg-new-screen/agents/openai.yaml +4 -0
  56. package/seedgridKB/SeedGrid/Toolkit/skills/sg-new-skill/SKILL.md +50 -0
  57. package/seedgridKB/SeedGrid/Toolkit/skills/{planejar-mudanca → sg-plan-change}/SKILL.md +1 -1
  58. package/seedgridKB/SeedGrid/Toolkit/skills/{seedgrid-review → sg-review}/SKILL.md +1 -1
  59. package/seedgridKB/SeedGrid/Toolkit/skills/{validar-mudanca → sg-validate-change}/SKILL.md +1 -1
  60. package/seedgridKB/SeedGrid/Visao-geral.md +7 -0
  61. package/seedgridKB/manifest.json +32 -23
  62. package/seedgridKB/SeedGrid/Toolkit/skills/seedgrid-new-screen/agents/openai.yaml +0 -4
  63. /package/seedgridKB/SeedGrid/Toolkit/skills/{revisar-codigo/references/checklist.md → sg-code-review/references/code-review-checklist.md} +0 -0
  64. /package/seedgridKB/SeedGrid/Toolkit/skills/{seedgrid-crud/references/checklist.md → sg-crud-front/references/crud-front-checklist.md} +0 -0
  65. /package/seedgridKB/SeedGrid/Toolkit/skills/{seedgrid-crud/references/patterns.md → sg-crud-front/references/crud-front-patterns.md} +0 -0
  66. /package/seedgridKB/SeedGrid/Toolkit/skills/{seedgrid-new-screen/references/checklist.md → sg-new-screen/references/new-screen-checklist.md} +0 -0
  67. /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: `planejar-mudanca`, `revisar-codigo`, `validar-mudanca` (genéricas) e `seedgrid-crud`, `seedgrid-new-screen`, `seedgrid-review` (padrões SeedGrid). Toda instalação recebe todas as 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 `seedgrid-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.
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 `seedgrid-review` (`update` leva as skills novas a projetos já instalados).
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
 
@@ -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, targets) {
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 que não são do toolkit não aparecem aqui.',
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)} | ${dirs.map((d) => `\`${d}/${k.name}/SKILL.md\``).join(' ou ')} |`),
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
- files.push({ path: SKILLS_INDEX_FILE, content: renderSkillsIndex(bundle, targets), component: 'skills-index' });
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 === 'seedgrid-review')
110
- ? ' Para conferir se o código segue o padrão, use a skill `seedgrid-review`.'
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 seedgrid-review no Claude Code ou no Codex
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:
@@ -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 = 'seedgrid-review';
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 seedgrid-review na ferramenta de IA instalada (Claude Code ou Codex).
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
  }
@@ -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 `seedgrid-review` via `claude -p` ou `codex exec`, somente leitura) |
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
 
@@ -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 `seedgrid-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.
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.1",
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:planejar-mudanca",
68
+ "id": "skill:sg-plan-change",
69
69
  "type": "skill",
70
- "name": "planejar-mudanca",
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: [validar-mudanca]
114
+ preferred_skills: [sg-validate-change]
115
115
  ---
116
116
  ```
117
117
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@seedgrid/ai-toolkit",
3
- "version": "0.3.1",
3
+ "version": "0.3.3",
4
4
  "description": "Instala agentes, skills, regras, templates e referências versionados em projetos locais para Claude Code e Codex.",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -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.migration.enabled` | Propriedades de outros prefixos seedgrid.* lidas pela login-tenancy | `boolean` | `false` | Runtime | Roda classpath:db/migration/ai-pricing com flyway_schema_history_ai_pricing | [[SeedGrid/Extensions/login-tenancy/Configuracao\|login-tenancy/Configuracao]] |
253
- | `seedgrid.exchange.migration.enabled` | Propriedades de outros prefixos seedgrid.* lidas pela login-tenancy | `boolean` | `false` | Runtime | Roda classpath:db/migration/exchange com flyway_schema_history_exchange | [[SeedGrid/Extensions/login-tenancy/Configuracao\|login-tenancy/Configuracao]] |
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 Propriedades de outras extensions que governam o ai-pricing
50
+ ### 2.3 Toggle do módulo
51
51
 
52
- | Propriedade | Dona | Padrão | Efeito |
53
- |---|---|---|---|
54
- | `seedgrid.ai-pricing.migration.enabled` | login-tenancy (`LoginTenancyMigrationService`) e subdomain-tenancy (`flyway/MigrationService`) | `false` | Roda `classpath:db/migration/ai-pricing` com a tabela `flyway_schema_history_ai_pricing`. **Não** é lida por esta extension. |
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` sobrescreve `quarkus.flyway.migrate-at-start=false` via `QuarkusTestProfile`.
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. No login-tenancy:
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
- # (tenancies) aplicar as migrations V900-V903. Default false.
108
- seedgrid.ai-pricing.migration.enabled=true
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: aplicar V900–V903
94
- seedgrid.ai-pricing.migration.enabled=true
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.14` (parent `seedgrid-parent:2026.07.02`) |
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
- Nos tenancies, o runner aplica essa location só quando `seedgrid.ai-pricing.migration.enabled=true` (default `false`, declarado em login-tenancy e subdomain-tenancy). Ver [[SeedGrid/Extensions/ai-pricing/Configuracao|Configuração]].
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 Propriedades de outras extensions que governam o exchange
54
+ ### 2.3 Toggle do módulo
55
55
 
56
- | Propriedade | Dona | Padrão | Efeito |
57
- |---|---|---|---|
58
- | `seedgrid.exchange.migration.enabled` | login-tenancy (`LoginTenancyMigrationService`) e subdomain-tenancy (`flyway/MigrationService`) | `false` | Aplica `classpath:db/migration/exchange` com a tabela `flyway_schema_history_exchange`. Não é lida pela extension. |
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. Nos tenancies:
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
- # (tenancies) aplicar V800-V804. Default false.
106
- seedgrid.exchange.migration.enabled=true
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. Nos tenancies, ligue também `seedgrid.exchange.migration.enabled=true`.
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.migration.enabled=true # tenancies
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.14` (parent `seedgrid-parent:2026.07.02`) |
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
- Nos tenancies, o runner só aplica essas migrations com `seedgrid.exchange.migration.enabled=true` (default `false`).
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
- # Migrations opcionais de produto
175
- seedgrid.ai-pricing.migration.enabled=false
176
- seedgrid.exchange.migration.enabled=false
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/>migration.enabled}
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.migration.enabled` | `false` | Roda `db/migration/ai-pricing` no master | `RT/flyway/MigrationService` |
180
- | `seedgrid.exchange.migration.enabled` | `false` | Roda `db/migration/exchange` no master | `RT/flyway/MigrationService` |
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`) |