@semacode/cli 1.5.16 → 1.5.18
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 +272 -0
- package/LICENSE +22 -0
- package/README.md +104 -112
- package/SEMA_BRIEF.curto.txt +9 -0
- package/SEMA_BRIEF.md +63 -0
- package/SEMA_BRIEF.micro.txt +7 -0
- package/SEMA_INDEX.json +783 -0
- package/dist/angular-consumer-standalone.d.ts +6 -0
- package/dist/angular-consumer-standalone.js.map +1 -0
- package/dist/cpp-symbols.d.ts +10 -0
- package/dist/cpp-symbols.js.map +1 -0
- package/dist/docs.d.ts +56 -0
- package/dist/docs.js.map +1 -0
- package/dist/dotnet-http.d.ts +23 -0
- package/dist/dotnet-http.js.map +1 -0
- package/dist/drift.d.ts +225 -0
- package/dist/drift.js +5 -111
- package/dist/drift.js.map +1 -0
- package/dist/go-http.d.ts +23 -0
- package/dist/go-http.js.map +1 -0
- package/dist/importador.d.ts +31 -0
- package/dist/importador.js +1 -200
- package/dist/importador.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +59 -479
- package/dist/index.js.map +1 -0
- package/dist/java-http.d.ts +23 -0
- package/dist/java-http.js.map +1 -0
- package/dist/lua-symbols.d.ts +10 -0
- package/dist/lua-symbols.js.map +1 -0
- package/dist/php-symbols.d.ts +24 -0
- package/dist/php-symbols.js.map +1 -0
- package/dist/projeto.d.ts +53 -0
- package/dist/projeto.js +0 -20
- package/dist/projeto.js.map +1 -0
- package/dist/python-http.d.ts +23 -0
- package/dist/python-http.js.map +1 -0
- package/dist/rust-http.d.ts +23 -0
- package/dist/rust-http.js.map +1 -0
- package/dist/tipos.d.ts +3 -0
- package/dist/tipos.js.map +1 -0
- package/dist/typescript-http.d.ts +35 -0
- package/dist/typescript-http.js.map +1 -0
- package/docs/AGENT_STARTER.md +103 -0
- package/docs/cli.md +106 -0
- package/docs/como-ensinar-a-sema-para-ia.md +149 -0
- package/docs/deploy.md +70 -0
- package/docs/documentacao.md +63 -0
- package/docs/env.md +56 -0
- package/docs/extensao-vscode.md +45 -0
- package/docs/fluxo-pratico-ia-sema.md +181 -0
- package/docs/instalacao-e-primeiro-uso.md +112 -0
- package/docs/integracao-com-ia.md +103 -0
- package/docs/mcp.md +51 -0
- package/docs/pagamento-ponta-a-ponta.md +165 -0
- package/docs/persistencia-vendor-first.md +145 -0
- package/docs/prompt-base-ia-sema.md +105 -0
- package/docs/rollback.md +47 -0
- package/docs/sintaxe.md +212 -0
- package/exemplos/agendamento.sema +105 -0
- package/exemplos/assinatura.sema +133 -0
- package/exemplos/auditoria.sema +89 -0
- package/exemplos/autenticacao.sema +125 -0
- package/exemplos/automacao.sema +107 -0
- package/exemplos/cadastro_usuario.sema +54 -0
- package/exemplos/calculadora.sema +78 -0
- package/exemplos/crud_simples.sema +89 -0
- package/exemplos/estoque.sema +127 -0
- package/exemplos/exportacao.sema +94 -0
- package/exemplos/fila.sema +130 -0
- package/exemplos/integracao_externa.sema +94 -0
- package/exemplos/multi_tenant.sema +140 -0
- package/exemplos/notificacao.sema +149 -0
- package/exemplos/operacao_estrategia.sema +633 -0
- package/exemplos/pagamento.sema +434 -0
- package/exemplos/pagamento_dominio.sema +35 -0
- package/exemplos/pedido.sema +255 -0
- package/exemplos/permissao.sema +121 -0
- package/exemplos/persistencia_vendor_first.sema +86 -0
- package/exemplos/relatorio.sema +93 -0
- package/exemplos/replica_analitica_erp.sema +160 -0
- package/exemplos/testes_embutidos.sema +45 -0
- package/exemplos/tratamento_erro.sema +157 -0
- package/exemplos/upload_arquivo.sema +93 -0
- package/exemplos/webhook.sema +94 -0
- package/llms-full.txt +34 -0
- package/llms.txt +17 -0
- package/node_modules/@sema/gerador-css/dist/index.d.ts +3 -0
- package/node_modules/@sema/gerador-css/dist/index.js +592 -0
- package/node_modules/@sema/gerador-css/dist/index.js.map +1 -0
- package/node_modules/@sema/gerador-css/package.json +7 -0
- package/node_modules/@sema/gerador-dart/dist/index.d.ts +3 -0
- package/node_modules/@sema/gerador-dart/dist/index.js +44 -0
- package/node_modules/@sema/gerador-dart/dist/index.js.map +1 -0
- package/node_modules/@sema/gerador-dart/package.json +7 -0
- package/node_modules/@sema/gerador-html/dist/index.d.ts +3 -0
- package/node_modules/@sema/gerador-html/dist/index.js +163 -0
- package/node_modules/@sema/gerador-html/dist/index.js.map +1 -0
- package/node_modules/@sema/gerador-html/package.json +7 -0
- package/node_modules/@sema/gerador-javascript/dist/index.d.ts +3 -0
- package/node_modules/@sema/gerador-javascript/dist/index.js +421 -0
- package/node_modules/@sema/gerador-javascript/dist/index.js.map +1 -0
- package/node_modules/@sema/gerador-javascript/package.json +7 -0
- package/node_modules/@sema/gerador-lua/dist/index.d.ts +3 -0
- package/node_modules/@sema/gerador-lua/dist/index.js +328 -0
- package/node_modules/@sema/gerador-lua/dist/index.js.map +1 -0
- package/node_modules/@sema/gerador-lua/package.json +7 -0
- package/node_modules/@sema/gerador-python/dist/index.d.ts +6 -0
- package/node_modules/@sema/gerador-python/dist/index.js +729 -0
- package/node_modules/@sema/gerador-python/dist/index.js.map +1 -0
- package/node_modules/@sema/gerador-python/package.json +7 -0
- package/node_modules/@sema/gerador-typescript/dist/index.d.ts +6 -0
- package/node_modules/@sema/gerador-typescript/dist/index.js +793 -0
- package/node_modules/@sema/gerador-typescript/dist/index.js.map +1 -0
- package/node_modules/@sema/gerador-typescript/package.json +7 -0
- package/node_modules/@sema/nucleo/dist/ast/tipos.d.ts +123 -0
- package/node_modules/@sema/nucleo/dist/ast/tipos.js +2 -0
- package/node_modules/@sema/nucleo/dist/ast/tipos.js.map +1 -0
- package/node_modules/@sema/nucleo/dist/diagnosticos/index.d.ts +21 -0
- package/node_modules/@sema/nucleo/dist/diagnosticos/index.js +12 -0
- package/node_modules/@sema/nucleo/dist/diagnosticos/index.js.map +1 -0
- package/node_modules/@sema/nucleo/dist/formatador/index.d.ts +9 -0
- package/node_modules/@sema/nucleo/dist/formatador/index.js +460 -0
- package/node_modules/@sema/nucleo/dist/formatador/index.js.map +1 -0
- package/node_modules/@sema/nucleo/dist/index.d.ts +35 -0
- package/node_modules/@sema/nucleo/dist/index.js +96 -0
- package/node_modules/@sema/nucleo/dist/index.js.map +1 -0
- package/node_modules/@sema/nucleo/dist/ir/conversor.d.ts +5 -0
- package/node_modules/@sema/nucleo/dist/ir/conversor.js +877 -0
- package/node_modules/@sema/nucleo/dist/ir/conversor.js.map +1 -0
- package/node_modules/@sema/nucleo/dist/ir/modelos.d.ts +345 -0
- package/node_modules/@sema/nucleo/dist/ir/modelos.js +2 -0
- package/node_modules/@sema/nucleo/dist/ir/modelos.js.map +1 -0
- package/node_modules/@sema/nucleo/dist/lexer/lexer.d.ts +7 -0
- package/node_modules/@sema/nucleo/dist/lexer/lexer.js +122 -0
- package/node_modules/@sema/nucleo/dist/lexer/lexer.js.map +1 -0
- package/node_modules/@sema/nucleo/dist/lexer/tokens.d.ts +8 -0
- package/node_modules/@sema/nucleo/dist/lexer/tokens.js +61 -0
- package/node_modules/@sema/nucleo/dist/lexer/tokens.js.map +1 -0
- package/node_modules/@sema/nucleo/dist/parser/parser.d.ts +9 -0
- package/node_modules/@sema/nucleo/dist/parser/parser.js +767 -0
- package/node_modules/@sema/nucleo/dist/parser/parser.js.map +1 -0
- package/node_modules/@sema/nucleo/dist/persistencia/contratos.d.ts +39 -0
- package/node_modules/@sema/nucleo/dist/persistencia/contratos.js +294 -0
- package/node_modules/@sema/nucleo/dist/persistencia/contratos.js.map +1 -0
- package/node_modules/@sema/nucleo/dist/semantico/analisador.d.ts +59 -0
- package/node_modules/@sema/nucleo/dist/semantico/analisador.js +1681 -0
- package/node_modules/@sema/nucleo/dist/semantico/analisador.js.map +1 -0
- package/node_modules/@sema/nucleo/dist/semantico/estruturas.d.ts +106 -0
- package/node_modules/@sema/nucleo/dist/semantico/estruturas.js +475 -0
- package/node_modules/@sema/nucleo/dist/semantico/estruturas.js.map +1 -0
- package/node_modules/@sema/nucleo/dist/semantico/seguranca.d.ts +91 -0
- package/node_modules/@sema/nucleo/dist/semantico/seguranca.js +258 -0
- package/node_modules/@sema/nucleo/dist/semantico/seguranca.js.map +1 -0
- package/node_modules/@sema/nucleo/dist/util/arquivos.d.ts +2 -0
- package/node_modules/@sema/nucleo/dist/util/arquivos.js +25 -0
- package/node_modules/@sema/nucleo/dist/util/arquivos.js.map +1 -0
- package/node_modules/@sema/nucleo/package.json +7 -0
- package/node_modules/@sema/padroes/dist/index.d.ts +25 -0
- package/node_modules/@sema/padroes/dist/index.js +316 -0
- package/node_modules/@sema/padroes/dist/index.js.map +1 -0
- package/node_modules/@sema/padroes/package.json +7 -0
- package/package.json +32 -23
- package/semacode-cli-1.3.1.tgz +0 -0
- package/src/angular-consumer-standalone.ts +0 -312
- package/src/cpp-symbols.ts +0 -82
- package/src/docs.ts +0 -535
- package/src/dotnet-http.ts +0 -355
- package/src/drift.ts +0 -4933
- package/src/go-http.ts +0 -118
- package/src/importador.ts +0 -3891
- package/src/index.ts +0 -5641
- package/src/java-http.ts +0 -247
- package/src/lua-symbols.ts +0 -114
- package/src/php-symbols.ts +0 -462
- package/src/projeto.ts +0 -862
- package/src/python-http.ts +0 -258
- package/src/rust-http.ts +0 -125
- package/src/tipos.ts +0 -24
- package/src/typescript-http.ts +0 -1076
- package/tsconfig.json +0 -20
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
module exemplos.permissao {
|
|
2
|
+
docs {
|
|
3
|
+
resumo: "Controle de acesso baseado em papeis e permissoes granulares."
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
entity Papel {
|
|
7
|
+
fields {
|
|
8
|
+
id: Id
|
|
9
|
+
nome: Texto
|
|
10
|
+
descricao: Texto
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
entity Permissao {
|
|
15
|
+
fields {
|
|
16
|
+
id: Id
|
|
17
|
+
recurso: Texto
|
|
18
|
+
acao: Texto
|
|
19
|
+
descricao: Texto
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
task atribuir_papel {
|
|
24
|
+
input {
|
|
25
|
+
usuario_id: Id required
|
|
26
|
+
papel_id: Id required
|
|
27
|
+
}
|
|
28
|
+
output {
|
|
29
|
+
atribuicao_id: Id
|
|
30
|
+
}
|
|
31
|
+
rules {
|
|
32
|
+
usuario_id deve_ser valido
|
|
33
|
+
papel_id deve_ser valido
|
|
34
|
+
}
|
|
35
|
+
effects {
|
|
36
|
+
consulta Usuario por usuario_id
|
|
37
|
+
consulta Papel por papel_id
|
|
38
|
+
persistencia AtribuicaoPapel
|
|
39
|
+
evento papel_atribuido criticidade = media
|
|
40
|
+
auditoria atribuicao_papel criticidade = alta
|
|
41
|
+
}
|
|
42
|
+
guarantees {
|
|
43
|
+
atribuicao_id existe
|
|
44
|
+
}
|
|
45
|
+
error {
|
|
46
|
+
usuario_nao_encontrado: "Usuario nao localizado."
|
|
47
|
+
papel_nao_encontrado: "Papel nao localizado."
|
|
48
|
+
atribuicao_duplicada: "Usuario ja possui este papel."
|
|
49
|
+
}
|
|
50
|
+
tests {
|
|
51
|
+
caso "atribui papel admin" {
|
|
52
|
+
given { usuario_id: "usr_1" papel_id: "papel_admin" }
|
|
53
|
+
expect { sucesso: verdadeiro }
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
task verificar_permissao {
|
|
59
|
+
input {
|
|
60
|
+
usuario_id: Id required
|
|
61
|
+
recurso: Texto required
|
|
62
|
+
acao: Texto required
|
|
63
|
+
}
|
|
64
|
+
output {
|
|
65
|
+
autorizado: Booleano
|
|
66
|
+
}
|
|
67
|
+
rules {
|
|
68
|
+
usuario_id deve_ser valido
|
|
69
|
+
recurso deve_ser preenchido
|
|
70
|
+
acao deve_ser preenchida
|
|
71
|
+
}
|
|
72
|
+
effects {
|
|
73
|
+
consulta AtribuicaoPapel por usuario_id
|
|
74
|
+
consulta PermissaoPapel por papel_id
|
|
75
|
+
auditoria verificacao_permissao
|
|
76
|
+
}
|
|
77
|
+
guarantees {
|
|
78
|
+
autorizado existe
|
|
79
|
+
}
|
|
80
|
+
tests {
|
|
81
|
+
caso "usuario autorizado" {
|
|
82
|
+
given { usuario_id: "usr_admin" recurso: "relatorios" acao: "exportar" }
|
|
83
|
+
expect { sucesso: verdadeiro }
|
|
84
|
+
}
|
|
85
|
+
caso "usuario sem permissao" {
|
|
86
|
+
given { usuario_id: "usr_basico" recurso: "admin" acao: "deletar" }
|
|
87
|
+
expect { sucesso: verdadeiro }
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
task revogar_papel {
|
|
93
|
+
input {
|
|
94
|
+
usuario_id: Id required
|
|
95
|
+
papel_id: Id required
|
|
96
|
+
motivo: Texto required
|
|
97
|
+
}
|
|
98
|
+
output {
|
|
99
|
+
protocolo: Id
|
|
100
|
+
}
|
|
101
|
+
rules {
|
|
102
|
+
usuario_id deve_ser valido
|
|
103
|
+
papel_id deve_ser valido
|
|
104
|
+
motivo deve_ser preenchido
|
|
105
|
+
}
|
|
106
|
+
effects {
|
|
107
|
+
persistencia AtribuicaoPapel
|
|
108
|
+
evento papel_revogado criticidade = alta
|
|
109
|
+
auditoria revogacao_papel criticidade = alta
|
|
110
|
+
}
|
|
111
|
+
guarantees {
|
|
112
|
+
protocolo existe
|
|
113
|
+
}
|
|
114
|
+
tests {
|
|
115
|
+
caso "revoga papel" {
|
|
116
|
+
given { usuario_id: "usr_1" papel_id: "papel_admin" motivo: "Saida da equipe" }
|
|
117
|
+
expect { sucesso: verdadeiro }
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
module exemplos.persistencia.vendor_first {
|
|
2
|
+
database principal_postgres {
|
|
3
|
+
engine: postgres
|
|
4
|
+
schema: public
|
|
5
|
+
consistency: forte
|
|
6
|
+
durability: alta
|
|
7
|
+
transaction_model: mvcc
|
|
8
|
+
query_model: sql
|
|
9
|
+
capabilities {
|
|
10
|
+
joins
|
|
11
|
+
views
|
|
12
|
+
}
|
|
13
|
+
table pedidos {
|
|
14
|
+
entity: Pedido
|
|
15
|
+
}
|
|
16
|
+
relationship pedido_cliente {
|
|
17
|
+
from: Pedido
|
|
18
|
+
to: Cliente
|
|
19
|
+
}
|
|
20
|
+
query buscar_pedidos {
|
|
21
|
+
mode: sql
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
database principal_mysql {
|
|
26
|
+
engine: mysql
|
|
27
|
+
consistency: forte
|
|
28
|
+
durability: alta
|
|
29
|
+
transaction_model: bloqueio
|
|
30
|
+
query_model: sql
|
|
31
|
+
table faturamento {
|
|
32
|
+
table: faturamento
|
|
33
|
+
}
|
|
34
|
+
query buscar_faturas {
|
|
35
|
+
mode: sql
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
database principal_sqlite {
|
|
40
|
+
engine: sqlite
|
|
41
|
+
consistency: snapshot
|
|
42
|
+
durability: media
|
|
43
|
+
transaction_model: single_thread
|
|
44
|
+
query_model: sql
|
|
45
|
+
table cache_local {
|
|
46
|
+
table: cache_local
|
|
47
|
+
}
|
|
48
|
+
retention limpeza_local {
|
|
49
|
+
retention: 7d
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
database principal_mongodb {
|
|
54
|
+
engine: mongodb
|
|
55
|
+
consistency: eventual
|
|
56
|
+
durability: alta
|
|
57
|
+
transaction_model: documento
|
|
58
|
+
query_model: documento
|
|
59
|
+
collection pedidos {
|
|
60
|
+
collection: pedidos
|
|
61
|
+
}
|
|
62
|
+
document pedido_snapshot {
|
|
63
|
+
entity: PedidoSnapshot
|
|
64
|
+
}
|
|
65
|
+
query pipeline_pedido {
|
|
66
|
+
mode: pipeline
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
database principal_redis {
|
|
71
|
+
engine: redis
|
|
72
|
+
consistency: eventual
|
|
73
|
+
durability: media
|
|
74
|
+
transaction_model: single_thread
|
|
75
|
+
query_model: chave_valor
|
|
76
|
+
keyspace cache_pedidos {
|
|
77
|
+
ttl: 300s
|
|
78
|
+
}
|
|
79
|
+
stream eventos_pedido {
|
|
80
|
+
surface: fila
|
|
81
|
+
}
|
|
82
|
+
retention expurgo_cache {
|
|
83
|
+
retention: 300s
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
@@ -0,0 +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
|
+
}
|
|
@@ -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
|
+
}
|
|
@@ -0,0 +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
|
+
}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
module exemplos.tratamento.erro {
|
|
2
|
+
task executar_operacao_sensivel {
|
|
3
|
+
input {
|
|
4
|
+
chave: Texto required
|
|
5
|
+
}
|
|
6
|
+
output {
|
|
7
|
+
protocolo: Id
|
|
8
|
+
}
|
|
9
|
+
rules {
|
|
10
|
+
chave existe e chave deve_ser preenchida
|
|
11
|
+
}
|
|
12
|
+
effects {
|
|
13
|
+
consulta cofre
|
|
14
|
+
auditoria falha_operacao_sensivel
|
|
15
|
+
}
|
|
16
|
+
guarantees {
|
|
17
|
+
protocolo existe
|
|
18
|
+
}
|
|
19
|
+
error {
|
|
20
|
+
acesso_negado: "A chave informada nao tem permissao."
|
|
21
|
+
recurso_indisponivel: "O servico esta temporariamente indisponivel."
|
|
22
|
+
auditoria_obrigatoria: "Toda falha precisa ser registrada."
|
|
23
|
+
}
|
|
24
|
+
tests {
|
|
25
|
+
caso "falha por acesso negado" {
|
|
26
|
+
given {
|
|
27
|
+
chave: "sem_permissao"
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
expect {
|
|
31
|
+
sucesso: falso
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
error {
|
|
35
|
+
tipo: "acesso_negado"
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
task responder_acesso_negado {
|
|
42
|
+
input {
|
|
43
|
+
chave: Texto required
|
|
44
|
+
}
|
|
45
|
+
output {
|
|
46
|
+
protocolo_resposta: Id
|
|
47
|
+
}
|
|
48
|
+
effects {
|
|
49
|
+
notificacao cliente acesso_negado
|
|
50
|
+
auditoria acesso_negado
|
|
51
|
+
}
|
|
52
|
+
guarantees {
|
|
53
|
+
protocolo_resposta existe
|
|
54
|
+
}
|
|
55
|
+
tests {
|
|
56
|
+
caso "responde acesso negado" {
|
|
57
|
+
given {
|
|
58
|
+
chave: "sem_permissao"
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
expect {
|
|
62
|
+
sucesso: verdadeiro
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
task responder_retentativa {
|
|
69
|
+
input {
|
|
70
|
+
chave: Texto required
|
|
71
|
+
}
|
|
72
|
+
output {
|
|
73
|
+
protocolo_resposta: Id
|
|
74
|
+
}
|
|
75
|
+
effects {
|
|
76
|
+
notificacao cliente retentativa_programada
|
|
77
|
+
auditoria retentativa
|
|
78
|
+
}
|
|
79
|
+
guarantees {
|
|
80
|
+
protocolo_resposta existe
|
|
81
|
+
}
|
|
82
|
+
tests {
|
|
83
|
+
caso "agenda retentativa" {
|
|
84
|
+
given {
|
|
85
|
+
chave: "instavel"
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
expect {
|
|
89
|
+
sucesso: verdadeiro
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
task registrar_auditoria_falha {
|
|
96
|
+
input {
|
|
97
|
+
chave: Texto required
|
|
98
|
+
}
|
|
99
|
+
output {
|
|
100
|
+
auditoria_id: Id
|
|
101
|
+
}
|
|
102
|
+
effects {
|
|
103
|
+
auditoria falha_operacional
|
|
104
|
+
persistencia auditoria_falha
|
|
105
|
+
}
|
|
106
|
+
guarantees {
|
|
107
|
+
auditoria_id existe
|
|
108
|
+
}
|
|
109
|
+
tests {
|
|
110
|
+
caso "audita falha" {
|
|
111
|
+
given {
|
|
112
|
+
chave: "sem_permissao"
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
expect {
|
|
116
|
+
sucesso: verdadeiro
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
task registrar_sucesso {
|
|
123
|
+
input {
|
|
124
|
+
protocolo: Id required
|
|
125
|
+
}
|
|
126
|
+
output {
|
|
127
|
+
registro_id: Id
|
|
128
|
+
}
|
|
129
|
+
effects {
|
|
130
|
+
auditoria operacao_concluida
|
|
131
|
+
evento operacao_sensivel_concluida
|
|
132
|
+
}
|
|
133
|
+
guarantees {
|
|
134
|
+
registro_id existe
|
|
135
|
+
}
|
|
136
|
+
tests {
|
|
137
|
+
caso "registra sucesso" {
|
|
138
|
+
given {
|
|
139
|
+
protocolo: "prot_1"
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
expect {
|
|
143
|
+
sucesso: verdadeiro
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
flow resposta_segura {
|
|
150
|
+
chave: Texto
|
|
151
|
+
etapa tentar usa executar_operacao_sensivel com chave = chave em_sucesso concluir em_erro registrar_falha por_erro acesso_negado = tratar_acesso_negado, recurso_indisponivel = agendar_retentativa
|
|
152
|
+
etapa tratar_acesso_negado usa responder_acesso_negado com chave = chave depende_de tentar
|
|
153
|
+
etapa agendar_retentativa usa responder_retentativa com chave = chave depende_de tentar
|
|
154
|
+
etapa registrar_falha usa registrar_auditoria_falha com chave = chave depende_de tentar
|
|
155
|
+
etapa concluir usa registrar_sucesso com protocolo = tentar.protocolo depende_de tentar
|
|
156
|
+
}
|
|
157
|
+
}
|