@semacode/cli 1.5.17 → 1.5.19
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/AGENTS.md +268 -260
- package/LICENSE +22 -22
- package/README.md +93 -61
- package/SEMA_BRIEF.curto.txt +8 -6
- package/SEMA_BRIEF.md +71 -22
- package/SEMA_BRIEF.micro.txt +7 -5
- package/SEMA_INDEX.json +931 -193
- package/dist/controleComercialSupabase.d.ts +326 -0
- package/dist/controleComercialSupabase.js +310 -0
- package/dist/controleComercialSupabase.js.map +1 -0
- package/dist/docs.js +48 -20
- package/dist/docs.js.map +1 -1
- package/dist/drift.d.ts +5 -3
- package/dist/drift.js +119 -116
- package/dist/drift.js.map +1 -1
- package/dist/importador.d.ts +1 -1
- package/dist/importador.js +1 -200
- package/dist/importador.js.map +1 -1
- package/dist/index.js +1924 -493
- package/dist/index.js.map +1 -1
- package/dist/mcpRemoto.d.ts +32 -0
- package/dist/mcpRemoto.js +61 -0
- package/dist/mcpRemoto.js.map +1 -0
- package/dist/projeto.js +3 -21
- package/dist/projeto.js.map +1 -1
- package/dist/tipos.d.ts +1 -1
- package/docs/AGENT_STARTER.md +109 -102
- package/docs/cli.md +89 -33
- package/docs/como-ensinar-a-sema-para-ia.md +42 -36
- package/docs/deploy.md +231 -43
- package/docs/documentacao.md +61 -36
- package/docs/env.md +63 -14
- package/docs/extensao-vscode.md +12 -4
- package/docs/fluxo-pratico-ia-sema.md +45 -35
- package/docs/instalacao-e-primeiro-uso.md +52 -30
- package/docs/integracao-com-ia.md +44 -35
- package/docs/mcp.md +270 -31
- package/docs/pagamento-ponta-a-ponta.md +40 -24
- package/docs/persistencia-vendor-first.md +11 -5
- package/docs/prompt-base-ia-sema.md +18 -11
- package/docs/rollback.md +17 -15
- package/docs/sintaxe.md +37 -229
- package/exemplos/agendamento.sema +105 -106
- package/exemplos/assinatura.sema +133 -136
- package/exemplos/auditoria.sema +89 -88
- package/exemplos/autenticacao.sema +125 -125
- package/exemplos/author_obra_comum.sema +294 -0
- package/exemplos/author_tema_sensivel.sema +264 -0
- package/exemplos/automacao.sema +107 -107
- package/exemplos/cadastro_usuario.sema +54 -54
- package/exemplos/calculadora.sema +78 -78
- package/exemplos/crud_simples.sema +89 -89
- package/exemplos/estoque.sema +127 -126
- package/exemplos/exportacao.sema +94 -94
- package/exemplos/fila.sema +130 -131
- package/exemplos/integracao_externa.sema +94 -94
- package/exemplos/multi_tenant.sema +140 -140
- package/exemplos/notificacao.sema +149 -98
- package/exemplos/operacao_estrategia.sema +633 -402
- package/exemplos/pagamento.sema +434 -222
- package/exemplos/pagamento_dominio.sema +35 -35
- package/exemplos/pedido.sema +255 -119
- package/exemplos/permissao.sema +121 -121
- package/exemplos/persistencia_vendor_first.sema +86 -86
- package/exemplos/profile_game.sema +114 -0
- package/exemplos/profile_legal.sema +105 -0
- package/exemplos/profile_ops.sema +110 -0
- package/exemplos/profile_research.sema +104 -0
- package/exemplos/profile_software.sema +123 -0
- package/exemplos/profile_workflow_n8n.sema +99 -0
- package/exemplos/relatorio.sema +93 -93
- package/exemplos/replica_analitica_erp.sema +160 -0
- package/exemplos/testes_embutidos.sema +45 -45
- package/exemplos/tratamento_erro.sema +157 -157
- package/exemplos/upload_arquivo.sema +93 -93
- package/exemplos/webhook.sema +94 -96
- package/llms-full.txt +34 -34
- package/llms.txt +17 -17
- package/node_modules/@sema/gerador-css/dist/index.js +563 -563
- package/node_modules/@sema/gerador-css/package.json +1 -1
- package/node_modules/@sema/gerador-dart/package.json +1 -1
- package/node_modules/@sema/gerador-html/dist/index.js +90 -90
- package/node_modules/@sema/gerador-html/package.json +1 -1
- package/node_modules/@sema/gerador-javascript/dist/index.js +92 -92
- package/node_modules/@sema/gerador-javascript/package.json +1 -1
- package/node_modules/@sema/gerador-lua/dist/index.js +53 -53
- package/node_modules/@sema/gerador-lua/package.json +1 -1
- package/node_modules/@sema/gerador-python/dist/index.js +122 -96
- package/node_modules/@sema/gerador-python/dist/index.js.map +1 -1
- package/node_modules/@sema/gerador-python/package.json +1 -1
- package/node_modules/@sema/gerador-typescript/dist/index.js +153 -153
- package/node_modules/@sema/gerador-typescript/package.json +1 -1
- package/node_modules/@sema/nucleo/dist/ast/tipos.d.ts +2 -4
- package/node_modules/@sema/nucleo/dist/formatador/index.js +26 -46
- package/node_modules/@sema/nucleo/dist/formatador/index.js.map +1 -1
- package/node_modules/@sema/nucleo/dist/ir/conversor.js +9 -204
- package/node_modules/@sema/nucleo/dist/ir/conversor.js.map +1 -1
- package/node_modules/@sema/nucleo/dist/ir/modelos.d.ts +3 -35
- package/node_modules/@sema/nucleo/dist/lexer/tokens.js +0 -21
- package/node_modules/@sema/nucleo/dist/lexer/tokens.js.map +1 -1
- package/node_modules/@sema/nucleo/dist/parser/parser.js +0 -40
- package/node_modules/@sema/nucleo/dist/parser/parser.js.map +1 -1
- package/node_modules/@sema/nucleo/dist/semantico/analisador.d.ts +6 -5
- package/node_modules/@sema/nucleo/dist/semantico/analisador.js +76 -307
- package/node_modules/@sema/nucleo/dist/semantico/analisador.js.map +1 -1
- package/node_modules/@sema/nucleo/dist/semantico/estruturas.d.ts +2 -0
- package/node_modules/@sema/nucleo/dist/semantico/estruturas.js +32 -2
- package/node_modules/@sema/nucleo/dist/semantico/estruturas.js.map +1 -1
- package/node_modules/@sema/nucleo/package.json +1 -1
- package/node_modules/@sema/padroes/package.json +1 -1
- package/package.json +15 -15
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
module exemplos.profile.software {
|
|
2
|
+
docs {
|
|
3
|
+
resumo: "Starter do Profile Software: contrato primeiro. Criar, editar ou remover contrato antes de qualquer acao; depois codigo vivo, drift, impacto, vinculos rastreaveis, arquivo, simbolo, validar, verificar, checks e testes."
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
type MudancaSoftware {
|
|
7
|
+
fields {
|
|
8
|
+
contrato: Texto
|
|
9
|
+
codigo_vivo: Texto
|
|
10
|
+
drift: Texto
|
|
11
|
+
impacto: Texto
|
|
12
|
+
checks: Lista
|
|
13
|
+
}
|
|
14
|
+
invariants {
|
|
15
|
+
contrato existe
|
|
16
|
+
codigo_vivo existe
|
|
17
|
+
drift existe
|
|
18
|
+
impacto existe
|
|
19
|
+
checks existe
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
task declarar_mudanca_contract_first {
|
|
24
|
+
input {
|
|
25
|
+
contrato: Texto required
|
|
26
|
+
codigo_vivo: Texto required
|
|
27
|
+
arquivo: Texto required
|
|
28
|
+
simbolo: Texto required
|
|
29
|
+
vinculos: Texto
|
|
30
|
+
impl: Texto
|
|
31
|
+
}
|
|
32
|
+
output {
|
|
33
|
+
mudanca: MudancaSoftware
|
|
34
|
+
pode_editar: Booleano
|
|
35
|
+
}
|
|
36
|
+
rules {
|
|
37
|
+
contrato deve_ser preenchido
|
|
38
|
+
codigo_vivo deve_ser declarado
|
|
39
|
+
arquivo deve_ser rastreavel
|
|
40
|
+
simbolo deve_ser rastreavel
|
|
41
|
+
vinculos deve_ser explicitos
|
|
42
|
+
impl deve_ser coerente
|
|
43
|
+
}
|
|
44
|
+
effects {
|
|
45
|
+
auditoria profile_software_mudanca criticidade = media
|
|
46
|
+
}
|
|
47
|
+
forbidden {
|
|
48
|
+
codigo_sem_contrato
|
|
49
|
+
editar_sem_drift
|
|
50
|
+
finalizar_sem_checks
|
|
51
|
+
}
|
|
52
|
+
execucao {
|
|
53
|
+
idempotencia: verdadeiro
|
|
54
|
+
timeout: "10s"
|
|
55
|
+
criticidade_operacional: media
|
|
56
|
+
}
|
|
57
|
+
guarantees {
|
|
58
|
+
mudanca existe
|
|
59
|
+
pode_editar == verdadeiro
|
|
60
|
+
}
|
|
61
|
+
tests {
|
|
62
|
+
caso "mudanca pronta para codigo" {
|
|
63
|
+
given {
|
|
64
|
+
contrato: "contrato validado"
|
|
65
|
+
codigo_vivo: "implementacao existente"
|
|
66
|
+
arquivo: "src/pedidos.ts"
|
|
67
|
+
simbolo: "criarPedido"
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
expect {
|
|
71
|
+
sucesso: verdadeiro
|
|
72
|
+
pode_editar: verdadeiro
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
task fechar_mudanca_com_verificacao {
|
|
79
|
+
input {
|
|
80
|
+
drift: Texto required
|
|
81
|
+
impacto: Texto required
|
|
82
|
+
validar: Texto required
|
|
83
|
+
verificar: Texto required
|
|
84
|
+
testes: Lista required
|
|
85
|
+
checks: Lista
|
|
86
|
+
}
|
|
87
|
+
output {
|
|
88
|
+
concluida: Booleano
|
|
89
|
+
bloqueios: Lista
|
|
90
|
+
}
|
|
91
|
+
rules {
|
|
92
|
+
drift deve_ser executado
|
|
93
|
+
impacto deve_ser mapeado
|
|
94
|
+
validar deve_ser executado
|
|
95
|
+
verificar deve_ser executado
|
|
96
|
+
testes deve_ser nao_vazio
|
|
97
|
+
checks deve_ser completos
|
|
98
|
+
}
|
|
99
|
+
effects {
|
|
100
|
+
auditoria profile_software_fechamento criticidade = media
|
|
101
|
+
}
|
|
102
|
+
guarantees {
|
|
103
|
+
concluida existe
|
|
104
|
+
bloqueios existe
|
|
105
|
+
}
|
|
106
|
+
tests {
|
|
107
|
+
caso "fecha com checks completos" {
|
|
108
|
+
given {
|
|
109
|
+
drift: "sem divergencia"
|
|
110
|
+
impacto: "mapa calculado"
|
|
111
|
+
validar: "sema validar"
|
|
112
|
+
verificar: "sema verificar"
|
|
113
|
+
testes: "npm test"
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
expect {
|
|
117
|
+
sucesso: verdadeiro
|
|
118
|
+
concluida: verdadeiro
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
module exemplos.profile.workflow_n8n {
|
|
2
|
+
docs {
|
|
3
|
+
resumo: "Starter do Profile Workflow para n8n: contrato primeiro. Criar, editar ou remover contrato antes de qualquer acao; depois runtime workflow como alvo de compatibilidade, adapter adaptado, scorecard parcial, webhook, cron, HTTP, branching, transformacao, authz, audit, compensacao e guarantees."
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
type RuntimeN8n {
|
|
7
|
+
fields {
|
|
8
|
+
runtime: Texto
|
|
9
|
+
adapter: Texto
|
|
10
|
+
compatibilidade: Texto
|
|
11
|
+
scorecard: Texto
|
|
12
|
+
lacunas: Lista
|
|
13
|
+
}
|
|
14
|
+
invariants {
|
|
15
|
+
runtime existe
|
|
16
|
+
adapter existe
|
|
17
|
+
compatibilidade existe
|
|
18
|
+
scorecard existe
|
|
19
|
+
lacunas existe
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
task validar_workflow_n8n {
|
|
24
|
+
input {
|
|
25
|
+
runtime: Texto required
|
|
26
|
+
adapter: Texto required
|
|
27
|
+
scorecard: Texto required
|
|
28
|
+
compatibilidade: Texto
|
|
29
|
+
webhook: Texto
|
|
30
|
+
cron: Texto
|
|
31
|
+
http: Texto
|
|
32
|
+
branching: Texto
|
|
33
|
+
transformacao: Texto
|
|
34
|
+
authz: Texto
|
|
35
|
+
audit: Texto
|
|
36
|
+
compensacao: Texto
|
|
37
|
+
guarantees: Texto
|
|
38
|
+
}
|
|
39
|
+
output {
|
|
40
|
+
runtime_validado: RuntimeN8n
|
|
41
|
+
aprovado: Booleano
|
|
42
|
+
}
|
|
43
|
+
rules {
|
|
44
|
+
runtime deve_ser workflow
|
|
45
|
+
adapter deve_ser n8n
|
|
46
|
+
compatibilidade deve_ser parcial
|
|
47
|
+
scorecard deve_ser calculado
|
|
48
|
+
webhook deve_ser mapeado
|
|
49
|
+
cron deve_ser mapeado
|
|
50
|
+
http deve_ser mapeado
|
|
51
|
+
branching deve_ser mapeado
|
|
52
|
+
transformacao deve_ser mapeada
|
|
53
|
+
authz deve_ser declarado
|
|
54
|
+
audit deve_ser declarado
|
|
55
|
+
compensacao deve_ser declarada
|
|
56
|
+
guarantees deve_ser declaradas
|
|
57
|
+
}
|
|
58
|
+
effects {
|
|
59
|
+
auditoria workflow_n8n_scorecard criticidade = media
|
|
60
|
+
}
|
|
61
|
+
forbidden {
|
|
62
|
+
equivalencia_total_falsa
|
|
63
|
+
n8n_como_linguagem_canonica
|
|
64
|
+
node_sem_contrato
|
|
65
|
+
}
|
|
66
|
+
execucao {
|
|
67
|
+
idempotencia: verdadeiro
|
|
68
|
+
timeout: "10s"
|
|
69
|
+
compensacao: "bloquear_publicacao_do_workflow"
|
|
70
|
+
criticidade_operacional: media
|
|
71
|
+
}
|
|
72
|
+
guarantees {
|
|
73
|
+
runtime_validado existe
|
|
74
|
+
aprovado existe
|
|
75
|
+
}
|
|
76
|
+
tests {
|
|
77
|
+
caso "n8n e adapter honesto" {
|
|
78
|
+
given {
|
|
79
|
+
runtime: "workflow n8n"
|
|
80
|
+
adapter: "adapter adaptado"
|
|
81
|
+
scorecard: "webhook cron HTTP branching transformacao nativos; authz audit compensacao guarantees parciais"
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
expect {
|
|
85
|
+
sucesso: verdadeiro
|
|
86
|
+
aprovado: verdadeiro
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
flow onboarding_por_n8n {
|
|
93
|
+
lead_id: Id
|
|
94
|
+
email: Email
|
|
95
|
+
etapa receber usa validar_workflow_n8n com runtime = "workflow n8n", adapter = "n8n", scorecard = "webhook cron HTTP branching transformacao com lacunas authz audit compensacao guarantees" em_sucesso concluir em_erro bloquear
|
|
96
|
+
etapa concluir usa validar_workflow_n8n com runtime = "workflow n8n", adapter = "n8n", scorecard = "compatibilidade parcial" depende_de receber
|
|
97
|
+
etapa bloquear usa validar_workflow_n8n com runtime = "workflow n8n", adapter = "n8n", scorecard = "bloqueio por lacuna" depende_de receber
|
|
98
|
+
}
|
|
99
|
+
}
|
package/exemplos/relatorio.sema
CHANGED
|
@@ -1,93 +1,93 @@
|
|
|
1
|
-
module exemplos.relatorio {
|
|
2
|
-
docs {
|
|
3
|
-
resumo: "Geracao assincrona de relatorios com download e notificacao."
|
|
4
|
-
}
|
|
5
|
-
|
|
6
|
-
entity Relatorio {
|
|
7
|
-
fields {
|
|
8
|
-
id: Id
|
|
9
|
-
tipo: Texto
|
|
10
|
-
parametros: Objeto
|
|
11
|
-
status: Texto
|
|
12
|
-
url_download: Texto
|
|
13
|
-
solicitado_por: Id
|
|
14
|
-
criado_em: Timestamp
|
|
15
|
-
concluido_em: Timestamp
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
task solicitar_relatorio {
|
|
20
|
-
input {
|
|
21
|
-
tipo: Texto required
|
|
22
|
-
data_inicio: Data required
|
|
23
|
-
data_fim: Data required
|
|
24
|
-
formato: Texto
|
|
25
|
-
}
|
|
26
|
-
output {
|
|
27
|
-
relatorio_id: Id
|
|
28
|
-
}
|
|
29
|
-
rules {
|
|
30
|
-
tipo em [VENDAS, ESTOQUE, USUARIOS, FINANCEIRO]
|
|
31
|
-
data_inicio deve_ser anterior_a data_fim
|
|
32
|
-
formato em [PDF, CSV, XLSX]
|
|
33
|
-
}
|
|
34
|
-
effects {
|
|
35
|
-
persistencia Relatorio
|
|
36
|
-
evento relatorio_solicitado criticidade = baixa
|
|
37
|
-
auditoria solicitacao_relatorio
|
|
38
|
-
}
|
|
39
|
-
state ciclo_relatorio {
|
|
40
|
-
transitions {
|
|
41
|
-
PENDENTE -> EM_PROCESSAMENTO
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
guarantees {
|
|
45
|
-
relatorio_id existe
|
|
46
|
-
}
|
|
47
|
-
error {
|
|
48
|
-
tipo_invalido: "Tipo de relatorio nao suportado."
|
|
49
|
-
periodo_invalido: "Data de inicio deve ser anterior a data de fim."
|
|
50
|
-
limite_periodo: "Periodo maximo e de 12 meses."
|
|
51
|
-
}
|
|
52
|
-
tests {
|
|
53
|
-
caso "solicita relatorio de vendas" {
|
|
54
|
-
given { tipo: "VENDAS" data_inicio: "2025-01-01" data_fim: "2025-03-31" formato: "PDF" }
|
|
55
|
-
expect { sucesso: verdadeiro }
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
task concluir_relatorio {
|
|
61
|
-
input {
|
|
62
|
-
relatorio_id: Id required
|
|
63
|
-
url_download: Texto required
|
|
64
|
-
}
|
|
65
|
-
output {
|
|
66
|
-
protocolo: Id
|
|
67
|
-
}
|
|
68
|
-
rules {
|
|
69
|
-
relatorio_id deve_ser valido
|
|
70
|
-
url_download deve_ser preenchida
|
|
71
|
-
}
|
|
72
|
-
effects {
|
|
73
|
-
persistencia Relatorio
|
|
74
|
-
notificacao usuario relatorio_pronto criticidade = media
|
|
75
|
-
evento relatorio_concluido
|
|
76
|
-
auditoria conclusao_relatorio
|
|
77
|
-
}
|
|
78
|
-
state ciclo_relatorio {
|
|
79
|
-
transitions {
|
|
80
|
-
EM_PROCESSAMENTO -> CONCLUIDO
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
guarantees {
|
|
84
|
-
protocolo existe
|
|
85
|
-
}
|
|
86
|
-
tests {
|
|
87
|
-
caso "conclui relatorio" {
|
|
88
|
-
given { relatorio_id: "rel_1" url_download: "https://storage/rel_1.pdf" }
|
|
89
|
-
expect { sucesso: verdadeiro }
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
}
|
|
1
|
+
module exemplos.relatorio {
|
|
2
|
+
docs {
|
|
3
|
+
resumo: "Geracao assincrona de relatorios com download e notificacao."
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
entity Relatorio {
|
|
7
|
+
fields {
|
|
8
|
+
id: Id
|
|
9
|
+
tipo: Texto
|
|
10
|
+
parametros: Objeto
|
|
11
|
+
status: Texto
|
|
12
|
+
url_download: Texto
|
|
13
|
+
solicitado_por: Id
|
|
14
|
+
criado_em: Timestamp
|
|
15
|
+
concluido_em: Timestamp
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
task solicitar_relatorio {
|
|
20
|
+
input {
|
|
21
|
+
tipo: Texto required
|
|
22
|
+
data_inicio: Data required
|
|
23
|
+
data_fim: Data required
|
|
24
|
+
formato: Texto
|
|
25
|
+
}
|
|
26
|
+
output {
|
|
27
|
+
relatorio_id: Id
|
|
28
|
+
}
|
|
29
|
+
rules {
|
|
30
|
+
tipo em [VENDAS, ESTOQUE, USUARIOS, FINANCEIRO]
|
|
31
|
+
data_inicio deve_ser anterior_a data_fim
|
|
32
|
+
formato em [PDF, CSV, XLSX]
|
|
33
|
+
}
|
|
34
|
+
effects {
|
|
35
|
+
persistencia Relatorio
|
|
36
|
+
evento relatorio_solicitado criticidade = baixa
|
|
37
|
+
auditoria solicitacao_relatorio
|
|
38
|
+
}
|
|
39
|
+
state ciclo_relatorio {
|
|
40
|
+
transitions {
|
|
41
|
+
PENDENTE -> EM_PROCESSAMENTO
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
guarantees {
|
|
45
|
+
relatorio_id existe
|
|
46
|
+
}
|
|
47
|
+
error {
|
|
48
|
+
tipo_invalido: "Tipo de relatorio nao suportado."
|
|
49
|
+
periodo_invalido: "Data de inicio deve ser anterior a data de fim."
|
|
50
|
+
limite_periodo: "Periodo maximo e de 12 meses."
|
|
51
|
+
}
|
|
52
|
+
tests {
|
|
53
|
+
caso "solicita relatorio de vendas" {
|
|
54
|
+
given { tipo: "VENDAS" data_inicio: "2025-01-01" data_fim: "2025-03-31" formato: "PDF" }
|
|
55
|
+
expect { sucesso: verdadeiro }
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
task concluir_relatorio {
|
|
61
|
+
input {
|
|
62
|
+
relatorio_id: Id required
|
|
63
|
+
url_download: Texto required
|
|
64
|
+
}
|
|
65
|
+
output {
|
|
66
|
+
protocolo: Id
|
|
67
|
+
}
|
|
68
|
+
rules {
|
|
69
|
+
relatorio_id deve_ser valido
|
|
70
|
+
url_download deve_ser preenchida
|
|
71
|
+
}
|
|
72
|
+
effects {
|
|
73
|
+
persistencia Relatorio
|
|
74
|
+
notificacao usuario relatorio_pronto criticidade = media
|
|
75
|
+
evento relatorio_concluido
|
|
76
|
+
auditoria conclusao_relatorio
|
|
77
|
+
}
|
|
78
|
+
state ciclo_relatorio {
|
|
79
|
+
transitions {
|
|
80
|
+
EM_PROCESSAMENTO -> CONCLUIDO
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
guarantees {
|
|
84
|
+
protocolo existe
|
|
85
|
+
}
|
|
86
|
+
tests {
|
|
87
|
+
caso "conclui relatorio" {
|
|
88
|
+
given { relatorio_id: "rel_1" url_download: "https://storage/rel_1.pdf" }
|
|
89
|
+
expect { sucesso: verdadeiro }
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
module exemplos.replica.analitica_erp {
|
|
2
|
+
docs {
|
|
3
|
+
resumo: "Exemplo publico neutro de replica analitica ERP para banco analytics: agente pode consultar a origem operacional em modo leitura e persistir apenas no destino analitico."
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
database erp_origem_mariadb {
|
|
7
|
+
engine: mysql
|
|
8
|
+
consistency: forte
|
|
9
|
+
durability: alta
|
|
10
|
+
transaction_model: bloqueio
|
|
11
|
+
query_model: sql
|
|
12
|
+
capabilities {
|
|
13
|
+
read_only
|
|
14
|
+
views
|
|
15
|
+
}
|
|
16
|
+
table vendas_operacionais {
|
|
17
|
+
entity: VendaOperacional
|
|
18
|
+
}
|
|
19
|
+
query extrair_vendas {
|
|
20
|
+
mode: sql
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
database analytics_postgres {
|
|
25
|
+
engine: postgres
|
|
26
|
+
schema: public
|
|
27
|
+
consistency: eventual
|
|
28
|
+
durability: alta
|
|
29
|
+
transaction_model: mvcc
|
|
30
|
+
query_model: sql
|
|
31
|
+
capabilities {
|
|
32
|
+
upsert
|
|
33
|
+
views
|
|
34
|
+
}
|
|
35
|
+
table vendas_analytics {
|
|
36
|
+
entity: VendaAnalitica
|
|
37
|
+
}
|
|
38
|
+
query carregar_vendas_analytics {
|
|
39
|
+
mode: sql
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
entity VendaOperacional {
|
|
44
|
+
fields {
|
|
45
|
+
id: Id
|
|
46
|
+
loja_id: Id
|
|
47
|
+
data_venda: Data
|
|
48
|
+
valor_total: Decimal
|
|
49
|
+
payload_origem: Objeto
|
|
50
|
+
}
|
|
51
|
+
invariants {
|
|
52
|
+
id existe
|
|
53
|
+
loja_id existe
|
|
54
|
+
data_venda existe
|
|
55
|
+
valor_total >= 0
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
entity VendaAnalitica {
|
|
60
|
+
fields {
|
|
61
|
+
id: Id
|
|
62
|
+
loja_id: Id
|
|
63
|
+
data_venda: Data
|
|
64
|
+
valor_total: Decimal
|
|
65
|
+
sincronizado_em: Timestamp
|
|
66
|
+
}
|
|
67
|
+
invariants {
|
|
68
|
+
id existe
|
|
69
|
+
loja_id existe
|
|
70
|
+
data_venda existe
|
|
71
|
+
valor_total >= 0
|
|
72
|
+
sincronizado_em existe
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
task sincronizar_vendas_erp_para_analytics {
|
|
77
|
+
input {
|
|
78
|
+
loja_id: Id required
|
|
79
|
+
periodo_inicio: Data required
|
|
80
|
+
periodo_fim: Data required
|
|
81
|
+
}
|
|
82
|
+
output {
|
|
83
|
+
registros_sincronizados: Inteiro
|
|
84
|
+
banco_producao_modificado: Booleano
|
|
85
|
+
sincronizado_em: Timestamp
|
|
86
|
+
}
|
|
87
|
+
authz {
|
|
88
|
+
escopo: analytics.replica.sincronizar
|
|
89
|
+
tenant: obrigatorio
|
|
90
|
+
}
|
|
91
|
+
dados {
|
|
92
|
+
classificacao_padrao: interno
|
|
93
|
+
redacao_log: obrigatoria
|
|
94
|
+
input {
|
|
95
|
+
loja_id: interno
|
|
96
|
+
periodo_inicio: interno
|
|
97
|
+
periodo_fim: interno
|
|
98
|
+
}
|
|
99
|
+
output {
|
|
100
|
+
registros_sincronizados: interno
|
|
101
|
+
banco_producao_modificado: interno
|
|
102
|
+
sincronizado_em: interno
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
audit {
|
|
106
|
+
evento: analytics.replica.erp_sincronizada
|
|
107
|
+
ator: sistema.analytics
|
|
108
|
+
correlacao: request_id
|
|
109
|
+
retencao: "180d"
|
|
110
|
+
motivo: obrigatorio
|
|
111
|
+
}
|
|
112
|
+
forbidden {
|
|
113
|
+
shell.exec
|
|
114
|
+
log.segredo
|
|
115
|
+
retorno.credencial
|
|
116
|
+
}
|
|
117
|
+
rules {
|
|
118
|
+
loja_id deve_ser valido
|
|
119
|
+
periodo_inicio deve_ser anterior_a periodo_fim
|
|
120
|
+
}
|
|
121
|
+
effects {
|
|
122
|
+
consulta erp_origem_mariadb criticidade = alta
|
|
123
|
+
persistencia analytics_postgres criticidade = media
|
|
124
|
+
auditoria sincronizacao_vendas criticidade = alta
|
|
125
|
+
}
|
|
126
|
+
vinculos {
|
|
127
|
+
recurso: erp_origem_mariadb
|
|
128
|
+
recurso: analytics_postgres
|
|
129
|
+
tabela: vendas_operacionais
|
|
130
|
+
tabela: vendas_analytics
|
|
131
|
+
}
|
|
132
|
+
execucao {
|
|
133
|
+
idempotencia: verdadeiro
|
|
134
|
+
timeout: "60s"
|
|
135
|
+
retry: "3x exponencial"
|
|
136
|
+
compensacao: "reexecutar_janela_analitica"
|
|
137
|
+
criticidade_operacional: alta
|
|
138
|
+
}
|
|
139
|
+
guarantees {
|
|
140
|
+
registros_sincronizados >= 0
|
|
141
|
+
banco_producao_modificado == falso
|
|
142
|
+
sincronizado_em existe
|
|
143
|
+
}
|
|
144
|
+
tests {
|
|
145
|
+
caso "sincroniza janela sem escrever na origem" {
|
|
146
|
+
given {
|
|
147
|
+
loja_id: "loja_001"
|
|
148
|
+
periodo_inicio: "2026-05-01"
|
|
149
|
+
periodo_fim: "2026-05-15"
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
expect {
|
|
153
|
+
sucesso: verdadeiro
|
|
154
|
+
registros_sincronizados: 42
|
|
155
|
+
banco_producao_modificado: falso
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
}
|
|
@@ -1,45 +1,45 @@
|
|
|
1
|
-
module exemplos.testes.embutidos {
|
|
2
|
-
task validar_documento {
|
|
3
|
-
input {
|
|
4
|
-
documento: Texto required
|
|
5
|
-
}
|
|
6
|
-
output {
|
|
7
|
-
valido: Booleano
|
|
8
|
-
motivo: Texto
|
|
9
|
-
}
|
|
10
|
-
rules {
|
|
11
|
-
documento deve_ser preenchido
|
|
12
|
-
}
|
|
13
|
-
effects {
|
|
14
|
-
auditoria validacao_documento
|
|
15
|
-
}
|
|
16
|
-
guarantees {
|
|
17
|
-
valido existe
|
|
18
|
-
motivo existe
|
|
19
|
-
}
|
|
20
|
-
tests {
|
|
21
|
-
caso "documento valido" {
|
|
22
|
-
given {
|
|
23
|
-
documento: 12345678900
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
expect {
|
|
27
|
-
sucesso: verdadeiro
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
caso "documento vazio" {
|
|
31
|
-
given {
|
|
32
|
-
documento: ""
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
expect {
|
|
36
|
-
sucesso: falso
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
error {
|
|
40
|
-
tipo: "entrada_invalida"
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
}
|
|
1
|
+
module exemplos.testes.embutidos {
|
|
2
|
+
task validar_documento {
|
|
3
|
+
input {
|
|
4
|
+
documento: Texto required
|
|
5
|
+
}
|
|
6
|
+
output {
|
|
7
|
+
valido: Booleano
|
|
8
|
+
motivo: Texto
|
|
9
|
+
}
|
|
10
|
+
rules {
|
|
11
|
+
documento deve_ser preenchido
|
|
12
|
+
}
|
|
13
|
+
effects {
|
|
14
|
+
auditoria validacao_documento
|
|
15
|
+
}
|
|
16
|
+
guarantees {
|
|
17
|
+
valido existe
|
|
18
|
+
motivo existe
|
|
19
|
+
}
|
|
20
|
+
tests {
|
|
21
|
+
caso "documento valido" {
|
|
22
|
+
given {
|
|
23
|
+
documento: 12345678900
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
expect {
|
|
27
|
+
sucesso: verdadeiro
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
caso "documento vazio" {
|
|
31
|
+
given {
|
|
32
|
+
documento: ""
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
expect {
|
|
36
|
+
sucesso: falso
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
error {
|
|
40
|
+
tipo: "entrada_invalida"
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|