@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.
Files changed (181) hide show
  1. package/AGENTS.md +272 -0
  2. package/LICENSE +22 -0
  3. package/README.md +104 -112
  4. package/SEMA_BRIEF.curto.txt +9 -0
  5. package/SEMA_BRIEF.md +63 -0
  6. package/SEMA_BRIEF.micro.txt +7 -0
  7. package/SEMA_INDEX.json +783 -0
  8. package/dist/angular-consumer-standalone.d.ts +6 -0
  9. package/dist/angular-consumer-standalone.js.map +1 -0
  10. package/dist/cpp-symbols.d.ts +10 -0
  11. package/dist/cpp-symbols.js.map +1 -0
  12. package/dist/docs.d.ts +56 -0
  13. package/dist/docs.js.map +1 -0
  14. package/dist/dotnet-http.d.ts +23 -0
  15. package/dist/dotnet-http.js.map +1 -0
  16. package/dist/drift.d.ts +225 -0
  17. package/dist/drift.js +5 -111
  18. package/dist/drift.js.map +1 -0
  19. package/dist/go-http.d.ts +23 -0
  20. package/dist/go-http.js.map +1 -0
  21. package/dist/importador.d.ts +31 -0
  22. package/dist/importador.js +1 -200
  23. package/dist/importador.js.map +1 -0
  24. package/dist/index.d.ts +2 -0
  25. package/dist/index.js +59 -479
  26. package/dist/index.js.map +1 -0
  27. package/dist/java-http.d.ts +23 -0
  28. package/dist/java-http.js.map +1 -0
  29. package/dist/lua-symbols.d.ts +10 -0
  30. package/dist/lua-symbols.js.map +1 -0
  31. package/dist/php-symbols.d.ts +24 -0
  32. package/dist/php-symbols.js.map +1 -0
  33. package/dist/projeto.d.ts +53 -0
  34. package/dist/projeto.js +0 -20
  35. package/dist/projeto.js.map +1 -0
  36. package/dist/python-http.d.ts +23 -0
  37. package/dist/python-http.js.map +1 -0
  38. package/dist/rust-http.d.ts +23 -0
  39. package/dist/rust-http.js.map +1 -0
  40. package/dist/tipos.d.ts +3 -0
  41. package/dist/tipos.js.map +1 -0
  42. package/dist/typescript-http.d.ts +35 -0
  43. package/dist/typescript-http.js.map +1 -0
  44. package/docs/AGENT_STARTER.md +103 -0
  45. package/docs/cli.md +106 -0
  46. package/docs/como-ensinar-a-sema-para-ia.md +149 -0
  47. package/docs/deploy.md +70 -0
  48. package/docs/documentacao.md +63 -0
  49. package/docs/env.md +56 -0
  50. package/docs/extensao-vscode.md +45 -0
  51. package/docs/fluxo-pratico-ia-sema.md +181 -0
  52. package/docs/instalacao-e-primeiro-uso.md +112 -0
  53. package/docs/integracao-com-ia.md +103 -0
  54. package/docs/mcp.md +51 -0
  55. package/docs/pagamento-ponta-a-ponta.md +165 -0
  56. package/docs/persistencia-vendor-first.md +145 -0
  57. package/docs/prompt-base-ia-sema.md +105 -0
  58. package/docs/rollback.md +47 -0
  59. package/docs/sintaxe.md +212 -0
  60. package/exemplos/agendamento.sema +105 -0
  61. package/exemplos/assinatura.sema +133 -0
  62. package/exemplos/auditoria.sema +89 -0
  63. package/exemplos/autenticacao.sema +125 -0
  64. package/exemplos/automacao.sema +107 -0
  65. package/exemplos/cadastro_usuario.sema +54 -0
  66. package/exemplos/calculadora.sema +78 -0
  67. package/exemplos/crud_simples.sema +89 -0
  68. package/exemplos/estoque.sema +127 -0
  69. package/exemplos/exportacao.sema +94 -0
  70. package/exemplos/fila.sema +130 -0
  71. package/exemplos/integracao_externa.sema +94 -0
  72. package/exemplos/multi_tenant.sema +140 -0
  73. package/exemplos/notificacao.sema +149 -0
  74. package/exemplos/operacao_estrategia.sema +633 -0
  75. package/exemplos/pagamento.sema +434 -0
  76. package/exemplos/pagamento_dominio.sema +35 -0
  77. package/exemplos/pedido.sema +255 -0
  78. package/exemplos/permissao.sema +121 -0
  79. package/exemplos/persistencia_vendor_first.sema +86 -0
  80. package/exemplos/relatorio.sema +93 -0
  81. package/exemplos/replica_analitica_erp.sema +160 -0
  82. package/exemplos/testes_embutidos.sema +45 -0
  83. package/exemplos/tratamento_erro.sema +157 -0
  84. package/exemplos/upload_arquivo.sema +93 -0
  85. package/exemplos/webhook.sema +94 -0
  86. package/llms-full.txt +34 -0
  87. package/llms.txt +17 -0
  88. package/node_modules/@sema/gerador-css/dist/index.d.ts +3 -0
  89. package/node_modules/@sema/gerador-css/dist/index.js +592 -0
  90. package/node_modules/@sema/gerador-css/dist/index.js.map +1 -0
  91. package/node_modules/@sema/gerador-css/package.json +7 -0
  92. package/node_modules/@sema/gerador-dart/dist/index.d.ts +3 -0
  93. package/node_modules/@sema/gerador-dart/dist/index.js +44 -0
  94. package/node_modules/@sema/gerador-dart/dist/index.js.map +1 -0
  95. package/node_modules/@sema/gerador-dart/package.json +7 -0
  96. package/node_modules/@sema/gerador-html/dist/index.d.ts +3 -0
  97. package/node_modules/@sema/gerador-html/dist/index.js +163 -0
  98. package/node_modules/@sema/gerador-html/dist/index.js.map +1 -0
  99. package/node_modules/@sema/gerador-html/package.json +7 -0
  100. package/node_modules/@sema/gerador-javascript/dist/index.d.ts +3 -0
  101. package/node_modules/@sema/gerador-javascript/dist/index.js +421 -0
  102. package/node_modules/@sema/gerador-javascript/dist/index.js.map +1 -0
  103. package/node_modules/@sema/gerador-javascript/package.json +7 -0
  104. package/node_modules/@sema/gerador-lua/dist/index.d.ts +3 -0
  105. package/node_modules/@sema/gerador-lua/dist/index.js +328 -0
  106. package/node_modules/@sema/gerador-lua/dist/index.js.map +1 -0
  107. package/node_modules/@sema/gerador-lua/package.json +7 -0
  108. package/node_modules/@sema/gerador-python/dist/index.d.ts +6 -0
  109. package/node_modules/@sema/gerador-python/dist/index.js +729 -0
  110. package/node_modules/@sema/gerador-python/dist/index.js.map +1 -0
  111. package/node_modules/@sema/gerador-python/package.json +7 -0
  112. package/node_modules/@sema/gerador-typescript/dist/index.d.ts +6 -0
  113. package/node_modules/@sema/gerador-typescript/dist/index.js +793 -0
  114. package/node_modules/@sema/gerador-typescript/dist/index.js.map +1 -0
  115. package/node_modules/@sema/gerador-typescript/package.json +7 -0
  116. package/node_modules/@sema/nucleo/dist/ast/tipos.d.ts +123 -0
  117. package/node_modules/@sema/nucleo/dist/ast/tipos.js +2 -0
  118. package/node_modules/@sema/nucleo/dist/ast/tipos.js.map +1 -0
  119. package/node_modules/@sema/nucleo/dist/diagnosticos/index.d.ts +21 -0
  120. package/node_modules/@sema/nucleo/dist/diagnosticos/index.js +12 -0
  121. package/node_modules/@sema/nucleo/dist/diagnosticos/index.js.map +1 -0
  122. package/node_modules/@sema/nucleo/dist/formatador/index.d.ts +9 -0
  123. package/node_modules/@sema/nucleo/dist/formatador/index.js +460 -0
  124. package/node_modules/@sema/nucleo/dist/formatador/index.js.map +1 -0
  125. package/node_modules/@sema/nucleo/dist/index.d.ts +35 -0
  126. package/node_modules/@sema/nucleo/dist/index.js +96 -0
  127. package/node_modules/@sema/nucleo/dist/index.js.map +1 -0
  128. package/node_modules/@sema/nucleo/dist/ir/conversor.d.ts +5 -0
  129. package/node_modules/@sema/nucleo/dist/ir/conversor.js +877 -0
  130. package/node_modules/@sema/nucleo/dist/ir/conversor.js.map +1 -0
  131. package/node_modules/@sema/nucleo/dist/ir/modelos.d.ts +345 -0
  132. package/node_modules/@sema/nucleo/dist/ir/modelos.js +2 -0
  133. package/node_modules/@sema/nucleo/dist/ir/modelos.js.map +1 -0
  134. package/node_modules/@sema/nucleo/dist/lexer/lexer.d.ts +7 -0
  135. package/node_modules/@sema/nucleo/dist/lexer/lexer.js +122 -0
  136. package/node_modules/@sema/nucleo/dist/lexer/lexer.js.map +1 -0
  137. package/node_modules/@sema/nucleo/dist/lexer/tokens.d.ts +8 -0
  138. package/node_modules/@sema/nucleo/dist/lexer/tokens.js +61 -0
  139. package/node_modules/@sema/nucleo/dist/lexer/tokens.js.map +1 -0
  140. package/node_modules/@sema/nucleo/dist/parser/parser.d.ts +9 -0
  141. package/node_modules/@sema/nucleo/dist/parser/parser.js +767 -0
  142. package/node_modules/@sema/nucleo/dist/parser/parser.js.map +1 -0
  143. package/node_modules/@sema/nucleo/dist/persistencia/contratos.d.ts +39 -0
  144. package/node_modules/@sema/nucleo/dist/persistencia/contratos.js +294 -0
  145. package/node_modules/@sema/nucleo/dist/persistencia/contratos.js.map +1 -0
  146. package/node_modules/@sema/nucleo/dist/semantico/analisador.d.ts +59 -0
  147. package/node_modules/@sema/nucleo/dist/semantico/analisador.js +1681 -0
  148. package/node_modules/@sema/nucleo/dist/semantico/analisador.js.map +1 -0
  149. package/node_modules/@sema/nucleo/dist/semantico/estruturas.d.ts +106 -0
  150. package/node_modules/@sema/nucleo/dist/semantico/estruturas.js +475 -0
  151. package/node_modules/@sema/nucleo/dist/semantico/estruturas.js.map +1 -0
  152. package/node_modules/@sema/nucleo/dist/semantico/seguranca.d.ts +91 -0
  153. package/node_modules/@sema/nucleo/dist/semantico/seguranca.js +258 -0
  154. package/node_modules/@sema/nucleo/dist/semantico/seguranca.js.map +1 -0
  155. package/node_modules/@sema/nucleo/dist/util/arquivos.d.ts +2 -0
  156. package/node_modules/@sema/nucleo/dist/util/arquivos.js +25 -0
  157. package/node_modules/@sema/nucleo/dist/util/arquivos.js.map +1 -0
  158. package/node_modules/@sema/nucleo/package.json +7 -0
  159. package/node_modules/@sema/padroes/dist/index.d.ts +25 -0
  160. package/node_modules/@sema/padroes/dist/index.js +316 -0
  161. package/node_modules/@sema/padroes/dist/index.js.map +1 -0
  162. package/node_modules/@sema/padroes/package.json +7 -0
  163. package/package.json +32 -23
  164. package/semacode-cli-1.3.1.tgz +0 -0
  165. package/src/angular-consumer-standalone.ts +0 -312
  166. package/src/cpp-symbols.ts +0 -82
  167. package/src/docs.ts +0 -535
  168. package/src/dotnet-http.ts +0 -355
  169. package/src/drift.ts +0 -4933
  170. package/src/go-http.ts +0 -118
  171. package/src/importador.ts +0 -3891
  172. package/src/index.ts +0 -5641
  173. package/src/java-http.ts +0 -247
  174. package/src/lua-symbols.ts +0 -114
  175. package/src/php-symbols.ts +0 -462
  176. package/src/projeto.ts +0 -862
  177. package/src/python-http.ts +0 -258
  178. package/src/rust-http.ts +0 -125
  179. package/src/tipos.ts +0 -24
  180. package/src/typescript-http.ts +0 -1076
  181. package/tsconfig.json +0 -20
@@ -0,0 +1,89 @@
1
+ module exemplos.crud.simples {
2
+ entity Produto {
3
+ fields {
4
+ id: Id
5
+ nome: Texto
6
+ preco: Decimal
7
+ ativo: Booleano
8
+ }
9
+ }
10
+
11
+ task criar_produto {
12
+ input {
13
+ nome: Texto required
14
+ preco: Decimal required
15
+ }
16
+ output {
17
+ produto: Produto
18
+ }
19
+ rules {
20
+ nome deve_ser preenchido
21
+ preco deve_ser positivo
22
+ }
23
+ effects {
24
+ persistencia Produto
25
+ auditoria produto_criado
26
+ }
27
+ guarantees {
28
+ produto existe
29
+ }
30
+ tests {
31
+ caso "cria produto" {
32
+ given {
33
+ nome: "Caneca"
34
+ preco: 39.9
35
+ }
36
+
37
+ expect {
38
+ sucesso: verdadeiro
39
+ }
40
+ }
41
+ }
42
+ }
43
+
44
+ task atualizar_produto {
45
+ input {
46
+ id: Id required
47
+ nome: Texto
48
+ preco: Decimal
49
+ }
50
+ output {
51
+ produto: Produto
52
+ }
53
+ rules {
54
+ id deve_ser valido
55
+ }
56
+ effects {
57
+ persistencia Produto
58
+ auditoria produto_atualizado
59
+ }
60
+ guarantees {
61
+ produto existe
62
+ }
63
+ tests {
64
+ caso "atualiza produto" {
65
+ given {
66
+ id: "prod_1"
67
+ }
68
+
69
+ expect {
70
+ sucesso: verdadeiro
71
+ }
72
+ }
73
+ }
74
+ }
75
+
76
+ route produtos {
77
+ metodo: POST
78
+ caminho: /produtos
79
+ task: criar_produto
80
+ finalidade: cadastro_produto
81
+ input {
82
+ nome: Texto
83
+ preco: Decimal
84
+ }
85
+ output {
86
+ produto: Produto
87
+ }
88
+ }
89
+ }
@@ -0,0 +1,127 @@
1
+ module exemplos.estoque {
2
+ docs {
3
+ resumo: "Controle de estoque com reserva, entrada e saida de produtos."
4
+ }
5
+
6
+ entity ItemEstoque {
7
+ fields {
8
+ id: Id
9
+ produto_id: Id
10
+ quantidade: Inteiro
11
+ quantidade_reservada: Inteiro
12
+ localizacao: Texto
13
+ }
14
+ }
15
+
16
+ entity MovimentacaoEstoque {
17
+ fields {
18
+ id: Id
19
+ produto_id: Id
20
+ tipo: Texto
21
+ quantidade: Inteiro
22
+ motivo: Texto
23
+ realizada_em: Timestamp
24
+ }
25
+ }
26
+
27
+ task reservar_estoque {
28
+ input {
29
+ produto_id: Id required
30
+ quantidade: Inteiro required
31
+ pedido_id: Id required
32
+ }
33
+ output {
34
+ reserva_id: Id
35
+ quantidade_reservada: Inteiro
36
+ }
37
+ rules {
38
+ quantidade > 0
39
+ produto_id deve_ser valido
40
+ }
41
+ effects {
42
+ consulta ItemEstoque por produto_id criticidade = alta
43
+ persistencia ItemEstoque
44
+ persistencia MovimentacaoEstoque
45
+ evento estoque_reservado criticidade = media
46
+ auditoria reserva_estoque
47
+ }
48
+ guarantees {
49
+ reserva_id existe
50
+ quantidade_reservada existe
51
+ }
52
+ error {
53
+ estoque_insuficiente: "Quantidade solicitada indisponivel em estoque."
54
+ produto_nao_encontrado: "Produto nao localizado no estoque."
55
+ }
56
+ tests {
57
+ caso "reserva com estoque disponivel" {
58
+ given { produto_id: "prod_1" quantidade: 5 pedido_id: "ped_1" }
59
+ expect { sucesso: verdadeiro }
60
+ }
61
+ caso "reserva sem estoque" {
62
+ given { produto_id: "prod_sem" quantidade: 999 pedido_id: "ped_2" }
63
+ expect { sucesso: falso }
64
+ error { tipo: "estoque_insuficiente" }
65
+ }
66
+ }
67
+ }
68
+
69
+ task registrar_entrada {
70
+ input {
71
+ produto_id: Id required
72
+ quantidade: Inteiro required
73
+ motivo: Texto required
74
+ }
75
+ output {
76
+ movimentacao_id: Id
77
+ }
78
+ rules {
79
+ quantidade > 0
80
+ motivo deve_ser preenchido
81
+ }
82
+ effects {
83
+ persistencia ItemEstoque
84
+ persistencia MovimentacaoEstoque
85
+ evento estoque_reposto
86
+ auditoria entrada_estoque
87
+ }
88
+ guarantees {
89
+ movimentacao_id existe
90
+ }
91
+ tests {
92
+ caso "entrada valida" {
93
+ given { produto_id: "prod_1" quantidade: 100 motivo: "Reposicao mensal" }
94
+ expect { sucesso: verdadeiro }
95
+ }
96
+ }
97
+ }
98
+
99
+ task liberar_reserva {
100
+ input {
101
+ reserva_id: Id required
102
+ motivo: Texto required
103
+ }
104
+ output {
105
+ protocolo: Id
106
+ }
107
+ rules {
108
+ reserva_id deve_ser valido
109
+ motivo deve_ser preenchido
110
+ }
111
+ effects {
112
+ persistencia ItemEstoque
113
+ persistencia MovimentacaoEstoque
114
+ evento reserva_liberada
115
+ auditoria liberacao_reserva
116
+ }
117
+ guarantees {
118
+ protocolo existe
119
+ }
120
+ tests {
121
+ caso "libera reserva existente" {
122
+ given { reserva_id: "res_1" motivo: "Pedido cancelado" }
123
+ expect { sucesso: verdadeiro }
124
+ }
125
+ }
126
+ }
127
+ }
@@ -0,0 +1,94 @@
1
+ module exemplos.exportacao {
2
+ docs {
3
+ resumo: "Exportacao de dados em multiplos formatos com controle de acesso e rastreamento."
4
+ }
5
+
6
+ entity ExportacaoDados {
7
+ fields {
8
+ id: Id
9
+ tipo: Texto
10
+ formato: Texto
11
+ filtros: Objeto
12
+ total_registros: Inteiro
13
+ url_arquivo: Texto
14
+ status: Texto
15
+ solicitado_por: Id
16
+ expira_em: Timestamp
17
+ }
18
+ }
19
+
20
+ task solicitar_exportacao {
21
+ input {
22
+ tipo: Texto required
23
+ formato: Texto required
24
+ filtros: Objeto
25
+ }
26
+ output {
27
+ exportacao_id: Id
28
+ }
29
+ rules {
30
+ tipo em [USUARIOS, PEDIDOS, FINANCEIRO, ESTOQUE]
31
+ formato em [CSV, XLSX, JSON]
32
+ }
33
+ effects {
34
+ persistencia ExportacaoDados
35
+ evento exportacao_solicitada criticidade = media
36
+ auditoria solicitacao_exportacao criticidade = media
37
+ }
38
+ state ciclo_exportacao {
39
+ transitions {
40
+ PENDENTE -> EM_PROCESSAMENTO
41
+ }
42
+ }
43
+ guarantees {
44
+ exportacao_id existe
45
+ }
46
+ error {
47
+ tipo_invalido: "Tipo de exportacao nao suportado."
48
+ formato_invalido: "Formato de arquivo nao suportado."
49
+ permissao_negada: "Sem permissao para exportar este tipo de dado."
50
+ }
51
+ tests {
52
+ caso "solicita exportacao de usuarios em csv" {
53
+ given { tipo: "USUARIOS" formato: "CSV" }
54
+ expect { sucesso: verdadeiro }
55
+ }
56
+ }
57
+ }
58
+
59
+ task concluir_exportacao {
60
+ input {
61
+ exportacao_id: Id required
62
+ url_arquivo: Texto required
63
+ total_registros: Inteiro required
64
+ }
65
+ output {
66
+ protocolo: Id
67
+ }
68
+ rules {
69
+ exportacao_id deve_ser valido
70
+ url_arquivo deve_ser preenchida
71
+ total_registros >= 0
72
+ }
73
+ effects {
74
+ persistencia ExportacaoDados
75
+ notificacao usuario exportacao_pronta criticidade = media
76
+ evento exportacao_concluida
77
+ auditoria conclusao_exportacao
78
+ }
79
+ state ciclo_exportacao {
80
+ transitions {
81
+ EM_PROCESSAMENTO -> DISPONIVEL
82
+ }
83
+ }
84
+ guarantees {
85
+ protocolo existe
86
+ }
87
+ tests {
88
+ caso "conclui exportacao" {
89
+ given { exportacao_id: "exp_1" url_arquivo: "https://storage/exp_1.csv" total_registros: 1500 }
90
+ expect { sucesso: verdadeiro }
91
+ }
92
+ }
93
+ }
94
+ }
@@ -0,0 +1,130 @@
1
+ module exemplos.fila {
2
+ docs {
3
+ resumo: "Processamento de jobs em fila com retentativa e dead letter."
4
+ }
5
+
6
+ entity Job {
7
+ fields {
8
+ id: Id
9
+ tipo: Texto
10
+ payload: Objeto
11
+ status: Texto
12
+ tentativas: Inteiro
13
+ max_tentativas: Inteiro
14
+ agendado_para: Timestamp
15
+ processado_em: Timestamp
16
+ erro: Texto
17
+ }
18
+ }
19
+
20
+ task enfileirar_job {
21
+ input {
22
+ tipo: Texto required
23
+ payload: Objeto required
24
+ agendado_para: Timestamp
25
+ max_tentativas: Inteiro
26
+ }
27
+ output {
28
+ job_id: Id
29
+ }
30
+ rules {
31
+ tipo deve_ser preenchido
32
+ max_tentativas <= 10
33
+ }
34
+ effects {
35
+ persistencia Job
36
+ evento job_enfileirado criticidade = baixa
37
+ auditoria enfileiramento_job
38
+ }
39
+ state ciclo_job {
40
+ transitions {
41
+ CRIADO -> PENDENTE
42
+ }
43
+ }
44
+ guarantees {
45
+ job_id existe
46
+ }
47
+ error {
48
+ tipo_invalido: "Tipo de job nao registrado."
49
+ fila_cheia: "Fila atingiu capacidade maxima."
50
+ }
51
+ tests {
52
+ caso "enfileira job valido" {
53
+ given { tipo: "envio_email" payload: "destinatario:a@b.com" }
54
+ expect { sucesso: verdadeiro }
55
+ }
56
+ }
57
+ }
58
+
59
+ task processar_job {
60
+ input {
61
+ job_id: Id required
62
+ }
63
+ output {
64
+ resultado: Objeto
65
+ }
66
+ rules {
67
+ job_id deve_ser valido
68
+ }
69
+ effects {
70
+ persistencia Job
71
+ evento job_processado criticidade = baixa
72
+ auditoria processamento_job
73
+ }
74
+ state ciclo_job {
75
+ transitions {
76
+ PENDENTE -> EM_EXECUCAO
77
+ EM_EXECUCAO -> CONCLUIDO
78
+ EM_EXECUCAO -> FALHOU
79
+ }
80
+ }
81
+ guarantees {
82
+ resultado existe
83
+ }
84
+ error {
85
+ job_nao_encontrado: "Job nao localizado na fila."
86
+ job_ja_processado: "Este job ja foi executado."
87
+ execucao_falhou: "Falha durante a execucao do job."
88
+ }
89
+ tests {
90
+ caso "processa job pendente" {
91
+ given { job_id: "job_1" }
92
+ expect { sucesso: verdadeiro }
93
+ }
94
+ }
95
+ }
96
+
97
+ task mover_para_dead_letter {
98
+ input {
99
+ job_id: Id required
100
+ motivo: Texto required
101
+ }
102
+ output {
103
+ protocolo: Id
104
+ }
105
+ rules {
106
+ job_id deve_ser valido
107
+ motivo deve_ser preenchido
108
+ }
109
+ effects {
110
+ persistencia Job
111
+ evento job_dead_letter criticidade = alta
112
+ notificacao operacao falha_critica_job criticidade = alta
113
+ auditoria dead_letter criticidade = alta
114
+ }
115
+ state ciclo_job {
116
+ transitions {
117
+ FALHOU -> DEAD_LETTER
118
+ }
119
+ }
120
+ guarantees {
121
+ protocolo existe
122
+ }
123
+ tests {
124
+ caso "move job esgotado" {
125
+ given { job_id: "job_esgotado" motivo: "Timeout repetido" }
126
+ expect { sucesso: verdadeiro }
127
+ }
128
+ }
129
+ }
130
+ }
@@ -0,0 +1,94 @@
1
+ module exemplos.integracao.externa {
2
+ docs {
3
+ resumo: "Integracao com API externa com circuit breaker e fallback."
4
+ }
5
+
6
+ entity ChamadaExterna {
7
+ fields {
8
+ id: Id
9
+ servico: Texto
10
+ endpoint: Texto
11
+ metodo: Texto
12
+ status_http: Inteiro
13
+ duracao_ms: Inteiro
14
+ sucesso: Booleano
15
+ realizada_em: Timestamp
16
+ }
17
+ }
18
+
19
+ task consultar_cep {
20
+ input {
21
+ cep: Texto required
22
+ }
23
+ output {
24
+ logradouro: Texto
25
+ bairro: Texto
26
+ cidade: Texto
27
+ estado: Texto
28
+ }
29
+ rules {
30
+ cep deve_ser formato_cep_valido
31
+ }
32
+ effects {
33
+ consulta api_cep criticidade = media
34
+ persistencia ChamadaExterna
35
+ auditoria consulta_cep
36
+ }
37
+ guarantees {
38
+ logradouro existe
39
+ cidade existe
40
+ estado existe
41
+ }
42
+ error {
43
+ cep_nao_encontrado: "CEP nao localizado."
44
+ servico_indisponivel: "API de CEP temporariamente indisponivel."
45
+ formato_invalido: "CEP deve ter 8 digitos numericos."
46
+ }
47
+ tests {
48
+ caso "consulta cep valido" {
49
+ given { cep: "01310100" }
50
+ expect { sucesso: verdadeiro }
51
+ }
52
+ caso "rejeita cep invalido" {
53
+ given { cep: "00000000" }
54
+ expect { sucesso: falso }
55
+ error { tipo: "cep_nao_encontrado" }
56
+ }
57
+ }
58
+ }
59
+
60
+ task consultar_cnpj {
61
+ input {
62
+ cnpj: Texto required
63
+ }
64
+ output {
65
+ razao_social: Texto
66
+ situacao: Texto
67
+ atividade_principal: Texto
68
+ }
69
+ rules {
70
+ cnpj deve_ser formato_cnpj_valido
71
+ cnpj deve_ser digitos_validos
72
+ }
73
+ effects {
74
+ consulta api_receita criticidade = media
75
+ persistencia ChamadaExterna
76
+ auditoria consulta_cnpj
77
+ }
78
+ guarantees {
79
+ razao_social existe
80
+ situacao existe
81
+ }
82
+ error {
83
+ cnpj_nao_encontrado: "CNPJ nao localizado na Receita Federal."
84
+ servico_indisponivel: "Servico da Receita Federal indisponivel."
85
+ formato_invalido: "CNPJ invalido."
86
+ }
87
+ tests {
88
+ caso "consulta cnpj valido" {
89
+ given { cnpj: "11222333000181" }
90
+ expect { sucesso: verdadeiro }
91
+ }
92
+ }
93
+ }
94
+ }
@@ -0,0 +1,140 @@
1
+ module exemplos.multi.tenant {
2
+ docs {
3
+ resumo: "Isolamento de dados por tenant com provisionamento e controle de limites."
4
+ }
5
+
6
+ entity Tenant {
7
+ fields {
8
+ id: Id
9
+ nome: Texto
10
+ slug: Texto
11
+ plano: Texto
12
+ ativo: Booleano
13
+ criado_em: Timestamp
14
+ }
15
+ }
16
+
17
+ entity LimiteTenant {
18
+ fields {
19
+ tenant_id: Id
20
+ recurso: Texto
21
+ limite: Inteiro
22
+ utilizado: Inteiro
23
+ }
24
+ }
25
+
26
+ task provisionar_tenant {
27
+ input {
28
+ nome: Texto required
29
+ slug: Texto required
30
+ plano: Texto required
31
+ email_admin: Email required
32
+ }
33
+ output {
34
+ tenant: Tenant
35
+ }
36
+ rules {
37
+ slug deve_ser unico em Tenant.slug
38
+ slug deve_ser formato_slug_valido
39
+ plano em [FREE, PRO, ENTERPRISE]
40
+ email_admin deve_ser email_valido
41
+ }
42
+ effects {
43
+ persistencia Tenant
44
+ persistencia LimiteTenant
45
+ persistencia Usuario
46
+ evento tenant_provisionado criticidade = alta
47
+ notificacao admin boas_vindas criticidade = media
48
+ auditoria provisionamento_tenant criticidade = alta
49
+ }
50
+ guarantees {
51
+ tenant existe
52
+ tenant.ativo == verdadeiro
53
+ }
54
+ error {
55
+ slug_duplicado: "Este slug ja esta em uso."
56
+ plano_invalido: "Plano selecionado nao existe."
57
+ email_invalido: "Email do administrador invalido."
58
+ }
59
+ tests {
60
+ caso "provisiona tenant pro" {
61
+ given { nome: "Empresa X" slug: "empresa-x" plano: "PRO" email_admin: "admin@x.com" }
62
+ expect { sucesso: verdadeiro }
63
+ }
64
+ }
65
+ }
66
+
67
+ task verificar_limite {
68
+ input {
69
+ tenant_id: Id required
70
+ recurso: Texto required
71
+ quantidade: Inteiro required
72
+ }
73
+ output {
74
+ permitido: Booleano
75
+ utilizado: Inteiro
76
+ limite: Inteiro
77
+ }
78
+ rules {
79
+ tenant_id deve_ser valido
80
+ recurso deve_ser preenchido
81
+ quantidade > 0
82
+ }
83
+ effects {
84
+ consulta LimiteTenant por tenant_id e recurso
85
+ auditoria verificacao_limite
86
+ }
87
+ guarantees {
88
+ permitido existe
89
+ }
90
+ error {
91
+ tenant_nao_encontrado: "Tenant nao localizado."
92
+ recurso_desconhecido: "Recurso nao rastreado para este tenant."
93
+ }
94
+ tests {
95
+ caso "dentro do limite" {
96
+ given { tenant_id: "ten_1" recurso: "usuarios" quantidade: 5 }
97
+ expect { sucesso: verdadeiro }
98
+ }
99
+ }
100
+ }
101
+
102
+ task suspender_tenant {
103
+ input {
104
+ tenant_id: Id required
105
+ motivo: Texto required
106
+ }
107
+ output {
108
+ protocolo: Id
109
+ tenant_ativo: Booleano
110
+ }
111
+ rules {
112
+ tenant_id deve_ser valido
113
+ motivo deve_ser preenchido
114
+ }
115
+ effects {
116
+ persistencia Tenant
117
+ evento tenant_suspenso criticidade = alta
118
+ notificacao admin suspensao_tenant criticidade = alta
119
+ auditoria suspensao_tenant criticidade = alta
120
+ }
121
+ state ciclo_tenant {
122
+ transitions {
123
+ ATIVO -> SUSPENSO
124
+ }
125
+ }
126
+ guarantees {
127
+ protocolo existe
128
+ tenant_ativo == falso
129
+ }
130
+ error {
131
+ tenant_ja_suspenso: "Tenant ja esta suspenso."
132
+ }
133
+ tests {
134
+ caso "suspende tenant ativo" {
135
+ given { tenant_id: "ten_1" motivo: "Inadimplencia" }
136
+ expect { sucesso: verdadeiro }
137
+ }
138
+ }
139
+ }
140
+ }