@semacode/cli 1.5.14 → 1.5.16

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 (177) hide show
  1. package/README.md +2 -1
  2. package/dist/index.js +76 -43
  3. package/package.json +26 -35
  4. package/semacode-cli-1.3.1.tgz +0 -0
  5. package/src/angular-consumer-standalone.ts +312 -0
  6. package/src/cpp-symbols.ts +82 -0
  7. package/src/docs.ts +535 -0
  8. package/src/dotnet-http.ts +355 -0
  9. package/src/drift.ts +4933 -0
  10. package/src/go-http.ts +118 -0
  11. package/src/importador.ts +3891 -0
  12. package/src/index.ts +5641 -0
  13. package/src/java-http.ts +247 -0
  14. package/src/lua-symbols.ts +114 -0
  15. package/src/php-symbols.ts +462 -0
  16. package/src/projeto.ts +862 -0
  17. package/src/python-http.ts +258 -0
  18. package/src/rust-http.ts +125 -0
  19. package/src/tipos.ts +24 -0
  20. package/src/typescript-http.ts +1076 -0
  21. package/tsconfig.json +20 -0
  22. package/AGENTS.md +0 -272
  23. package/LICENSE +0 -22
  24. package/SEMA_BRIEF.curto.txt +0 -9
  25. package/SEMA_BRIEF.md +0 -63
  26. package/SEMA_BRIEF.micro.txt +0 -7
  27. package/SEMA_INDEX.json +0 -799
  28. package/dist/angular-consumer-standalone.d.ts +0 -6
  29. package/dist/angular-consumer-standalone.js.map +0 -1
  30. package/dist/cpp-symbols.d.ts +0 -10
  31. package/dist/cpp-symbols.js.map +0 -1
  32. package/dist/docs.d.ts +0 -56
  33. package/dist/docs.js.map +0 -1
  34. package/dist/dotnet-http.d.ts +0 -23
  35. package/dist/dotnet-http.js.map +0 -1
  36. package/dist/drift.d.ts +0 -225
  37. package/dist/drift.js.map +0 -1
  38. package/dist/go-http.d.ts +0 -23
  39. package/dist/go-http.js.map +0 -1
  40. package/dist/importador.d.ts +0 -31
  41. package/dist/importador.js.map +0 -1
  42. package/dist/index.d.ts +0 -2
  43. package/dist/index.js.map +0 -1
  44. package/dist/java-http.d.ts +0 -23
  45. package/dist/java-http.js.map +0 -1
  46. package/dist/lua-symbols.d.ts +0 -10
  47. package/dist/lua-symbols.js.map +0 -1
  48. package/dist/php-symbols.d.ts +0 -24
  49. package/dist/php-symbols.js.map +0 -1
  50. package/dist/projeto.d.ts +0 -53
  51. package/dist/projeto.js.map +0 -1
  52. package/dist/python-http.d.ts +0 -23
  53. package/dist/python-http.js.map +0 -1
  54. package/dist/rust-http.d.ts +0 -23
  55. package/dist/rust-http.js.map +0 -1
  56. package/dist/tipos.d.ts +0 -3
  57. package/dist/tipos.js.map +0 -1
  58. package/dist/typescript-http.d.ts +0 -35
  59. package/dist/typescript-http.js.map +0 -1
  60. package/docs/AGENT_STARTER.md +0 -102
  61. package/docs/cli.md +0 -117
  62. package/docs/como-ensinar-a-sema-para-ia.md +0 -149
  63. package/docs/deploy.md +0 -70
  64. package/docs/documentacao.md +0 -63
  65. package/docs/env.md +0 -56
  66. package/docs/extensao-vscode.md +0 -45
  67. package/docs/fluxo-pratico-ia-sema.md +0 -177
  68. package/docs/instalacao-e-primeiro-uso.md +0 -112
  69. package/docs/integracao-com-ia.md +0 -101
  70. package/docs/mcp.md +0 -53
  71. package/docs/pagamento-ponta-a-ponta.md +0 -155
  72. package/docs/persistencia-vendor-first.md +0 -145
  73. package/docs/prompt-base-ia-sema.md +0 -104
  74. package/docs/rollback.md +0 -47
  75. package/docs/sintaxe.md +0 -410
  76. package/exemplos/agendamento.sema +0 -106
  77. package/exemplos/assinatura.sema +0 -136
  78. package/exemplos/auditoria.sema +0 -88
  79. package/exemplos/autenticacao.sema +0 -125
  80. package/exemplos/automacao.sema +0 -107
  81. package/exemplos/cadastro_usuario.sema +0 -54
  82. package/exemplos/calculadora.sema +0 -78
  83. package/exemplos/crud_simples.sema +0 -89
  84. package/exemplos/estoque.sema +0 -126
  85. package/exemplos/exportacao.sema +0 -94
  86. package/exemplos/fila.sema +0 -131
  87. package/exemplos/integracao_externa.sema +0 -94
  88. package/exemplos/multi_tenant.sema +0 -140
  89. package/exemplos/notificacao.sema +0 -98
  90. package/exemplos/operacao_estrategia.sema +0 -402
  91. package/exemplos/pagamento.sema +0 -222
  92. package/exemplos/pagamento_dominio.sema +0 -35
  93. package/exemplos/pedido.sema +0 -119
  94. package/exemplos/permissao.sema +0 -121
  95. package/exemplos/persistencia_vendor_first.sema +0 -86
  96. package/exemplos/relatorio.sema +0 -93
  97. package/exemplos/testes_embutidos.sema +0 -45
  98. package/exemplos/tratamento_erro.sema +0 -157
  99. package/exemplos/upload_arquivo.sema +0 -93
  100. package/exemplos/webhook.sema +0 -96
  101. package/llms-full.txt +0 -34
  102. package/llms.txt +0 -17
  103. package/node_modules/@sema/gerador-css/dist/index.d.ts +0 -3
  104. package/node_modules/@sema/gerador-css/dist/index.js +0 -592
  105. package/node_modules/@sema/gerador-css/dist/index.js.map +0 -1
  106. package/node_modules/@sema/gerador-css/package.json +0 -7
  107. package/node_modules/@sema/gerador-dart/dist/index.d.ts +0 -3
  108. package/node_modules/@sema/gerador-dart/dist/index.js +0 -44
  109. package/node_modules/@sema/gerador-dart/dist/index.js.map +0 -1
  110. package/node_modules/@sema/gerador-dart/package.json +0 -7
  111. package/node_modules/@sema/gerador-html/dist/index.d.ts +0 -3
  112. package/node_modules/@sema/gerador-html/dist/index.js +0 -163
  113. package/node_modules/@sema/gerador-html/dist/index.js.map +0 -1
  114. package/node_modules/@sema/gerador-html/package.json +0 -7
  115. package/node_modules/@sema/gerador-javascript/dist/index.d.ts +0 -3
  116. package/node_modules/@sema/gerador-javascript/dist/index.js +0 -421
  117. package/node_modules/@sema/gerador-javascript/dist/index.js.map +0 -1
  118. package/node_modules/@sema/gerador-javascript/package.json +0 -7
  119. package/node_modules/@sema/gerador-lua/dist/index.d.ts +0 -3
  120. package/node_modules/@sema/gerador-lua/dist/index.js +0 -328
  121. package/node_modules/@sema/gerador-lua/dist/index.js.map +0 -1
  122. package/node_modules/@sema/gerador-lua/package.json +0 -7
  123. package/node_modules/@sema/gerador-python/dist/index.d.ts +0 -6
  124. package/node_modules/@sema/gerador-python/dist/index.js +0 -729
  125. package/node_modules/@sema/gerador-python/dist/index.js.map +0 -1
  126. package/node_modules/@sema/gerador-python/package.json +0 -7
  127. package/node_modules/@sema/gerador-typescript/dist/index.d.ts +0 -6
  128. package/node_modules/@sema/gerador-typescript/dist/index.js +0 -793
  129. package/node_modules/@sema/gerador-typescript/dist/index.js.map +0 -1
  130. package/node_modules/@sema/gerador-typescript/package.json +0 -7
  131. package/node_modules/@sema/nucleo/dist/ast/tipos.d.ts +0 -125
  132. package/node_modules/@sema/nucleo/dist/ast/tipos.js +0 -2
  133. package/node_modules/@sema/nucleo/dist/ast/tipos.js.map +0 -1
  134. package/node_modules/@sema/nucleo/dist/diagnosticos/index.d.ts +0 -21
  135. package/node_modules/@sema/nucleo/dist/diagnosticos/index.js +0 -12
  136. package/node_modules/@sema/nucleo/dist/diagnosticos/index.js.map +0 -1
  137. package/node_modules/@sema/nucleo/dist/formatador/index.d.ts +0 -9
  138. package/node_modules/@sema/nucleo/dist/formatador/index.js +0 -487
  139. package/node_modules/@sema/nucleo/dist/formatador/index.js.map +0 -1
  140. package/node_modules/@sema/nucleo/dist/index.d.ts +0 -35
  141. package/node_modules/@sema/nucleo/dist/index.js +0 -96
  142. package/node_modules/@sema/nucleo/dist/index.js.map +0 -1
  143. package/node_modules/@sema/nucleo/dist/ir/conversor.d.ts +0 -5
  144. package/node_modules/@sema/nucleo/dist/ir/conversor.js +0 -1058
  145. package/node_modules/@sema/nucleo/dist/ir/conversor.js.map +0 -1
  146. package/node_modules/@sema/nucleo/dist/ir/modelos.d.ts +0 -377
  147. package/node_modules/@sema/nucleo/dist/ir/modelos.js +0 -2
  148. package/node_modules/@sema/nucleo/dist/ir/modelos.js.map +0 -1
  149. package/node_modules/@sema/nucleo/dist/lexer/lexer.d.ts +0 -7
  150. package/node_modules/@sema/nucleo/dist/lexer/lexer.js +0 -122
  151. package/node_modules/@sema/nucleo/dist/lexer/lexer.js.map +0 -1
  152. package/node_modules/@sema/nucleo/dist/lexer/tokens.d.ts +0 -8
  153. package/node_modules/@sema/nucleo/dist/lexer/tokens.js +0 -82
  154. package/node_modules/@sema/nucleo/dist/lexer/tokens.js.map +0 -1
  155. package/node_modules/@sema/nucleo/dist/parser/parser.d.ts +0 -9
  156. package/node_modules/@sema/nucleo/dist/parser/parser.js +0 -807
  157. package/node_modules/@sema/nucleo/dist/parser/parser.js.map +0 -1
  158. package/node_modules/@sema/nucleo/dist/persistencia/contratos.d.ts +0 -39
  159. package/node_modules/@sema/nucleo/dist/persistencia/contratos.js +0 -294
  160. package/node_modules/@sema/nucleo/dist/persistencia/contratos.js.map +0 -1
  161. package/node_modules/@sema/nucleo/dist/semantico/analisador.d.ts +0 -58
  162. package/node_modules/@sema/nucleo/dist/semantico/analisador.js +0 -1912
  163. package/node_modules/@sema/nucleo/dist/semantico/analisador.js.map +0 -1
  164. package/node_modules/@sema/nucleo/dist/semantico/estruturas.d.ts +0 -104
  165. package/node_modules/@sema/nucleo/dist/semantico/estruturas.js +0 -445
  166. package/node_modules/@sema/nucleo/dist/semantico/estruturas.js.map +0 -1
  167. package/node_modules/@sema/nucleo/dist/semantico/seguranca.d.ts +0 -91
  168. package/node_modules/@sema/nucleo/dist/semantico/seguranca.js +0 -258
  169. package/node_modules/@sema/nucleo/dist/semantico/seguranca.js.map +0 -1
  170. package/node_modules/@sema/nucleo/dist/util/arquivos.d.ts +0 -2
  171. package/node_modules/@sema/nucleo/dist/util/arquivos.js +0 -25
  172. package/node_modules/@sema/nucleo/dist/util/arquivos.js.map +0 -1
  173. package/node_modules/@sema/nucleo/package.json +0 -7
  174. package/node_modules/@sema/padroes/dist/index.d.ts +0 -25
  175. package/node_modules/@sema/padroes/dist/index.js +0 -316
  176. package/node_modules/@sema/padroes/dist/index.js.map +0 -1
  177. package/node_modules/@sema/padroes/package.json +0 -7
@@ -1,89 +0,0 @@
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
- }
@@ -1,126 +0,0 @@
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
- }
36
- rules {
37
- quantidade > 0
38
- produto_id deve_ser valido
39
- }
40
- effects {
41
- consulta ItemEstoque por produto_id criticidade = alta
42
- persistencia ItemEstoque
43
- persistencia MovimentacaoEstoque
44
- evento estoque_reservado criticidade = media
45
- auditoria reserva_estoque
46
- }
47
- guarantees {
48
- reserva_id existe
49
- ItemEstoque.quantidade_reservada >= quantidade
50
- }
51
- error {
52
- estoque_insuficiente: "Quantidade solicitada indisponivel em estoque."
53
- produto_nao_encontrado: "Produto nao localizado no estoque."
54
- }
55
- tests {
56
- caso "reserva com estoque disponivel" {
57
- given { produto_id: "prod_1" quantidade: 5 pedido_id: "ped_1" }
58
- expect { sucesso: verdadeiro }
59
- }
60
- caso "reserva sem estoque" {
61
- given { produto_id: "prod_sem" quantidade: 999 pedido_id: "ped_2" }
62
- expect { sucesso: falso }
63
- error { tipo: "estoque_insuficiente" }
64
- }
65
- }
66
- }
67
-
68
- task registrar_entrada {
69
- input {
70
- produto_id: Id required
71
- quantidade: Inteiro required
72
- motivo: Texto required
73
- }
74
- output {
75
- movimentacao_id: Id
76
- }
77
- rules {
78
- quantidade > 0
79
- motivo deve_ser preenchido
80
- }
81
- effects {
82
- persistencia ItemEstoque
83
- persistencia MovimentacaoEstoque
84
- evento estoque_reposto
85
- auditoria entrada_estoque
86
- }
87
- guarantees {
88
- movimentacao_id existe
89
- }
90
- tests {
91
- caso "entrada valida" {
92
- given { produto_id: "prod_1" quantidade: 100 motivo: "Reposicao mensal" }
93
- expect { sucesso: verdadeiro }
94
- }
95
- }
96
- }
97
-
98
- task liberar_reserva {
99
- input {
100
- reserva_id: Id required
101
- motivo: Texto required
102
- }
103
- output {
104
- protocolo: Id
105
- }
106
- rules {
107
- reserva_id deve_ser valido
108
- motivo deve_ser preenchido
109
- }
110
- effects {
111
- persistencia ItemEstoque
112
- persistencia MovimentacaoEstoque
113
- evento reserva_liberada
114
- auditoria liberacao_reserva
115
- }
116
- guarantees {
117
- protocolo existe
118
- }
119
- tests {
120
- caso "libera reserva existente" {
121
- given { reserva_id: "res_1" motivo: "Pedido cancelado" }
122
- expect { sucesso: verdadeiro }
123
- }
124
- }
125
- }
126
- }
@@ -1,94 +0,0 @@
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
- }
@@ -1,131 +0,0 @@
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
- job.status == PENDENTE
69
- }
70
- effects {
71
- persistencia Job
72
- evento job_processado criticidade = baixa
73
- auditoria processamento_job
74
- }
75
- state ciclo_job {
76
- transitions {
77
- PENDENTE -> EM_EXECUCAO
78
- EM_EXECUCAO -> CONCLUIDO
79
- EM_EXECUCAO -> FALHOU
80
- }
81
- }
82
- guarantees {
83
- resultado existe
84
- }
85
- error {
86
- job_nao_encontrado: "Job nao localizado na fila."
87
- job_ja_processado: "Este job ja foi executado."
88
- execucao_falhou: "Falha durante a execucao do job."
89
- }
90
- tests {
91
- caso "processa job pendente" {
92
- given { job_id: "job_1" }
93
- expect { sucesso: verdadeiro }
94
- }
95
- }
96
- }
97
-
98
- task mover_para_dead_letter {
99
- input {
100
- job_id: Id required
101
- motivo: Texto required
102
- }
103
- output {
104
- protocolo: Id
105
- }
106
- rules {
107
- job_id deve_ser valido
108
- job.tentativas >= job.max_tentativas
109
- }
110
- effects {
111
- persistencia Job
112
- evento job_dead_letter criticidade = alta
113
- notificacao operacao falha_critica_job criticidade = alta
114
- auditoria dead_letter criticidade = alta
115
- }
116
- state ciclo_job {
117
- transitions {
118
- FALHOU -> DEAD_LETTER
119
- }
120
- }
121
- guarantees {
122
- protocolo existe
123
- }
124
- tests {
125
- caso "move job esgotado" {
126
- given { job_id: "job_esgotado" motivo: "Timeout repetido" }
127
- expect { sucesso: verdadeiro }
128
- }
129
- }
130
- }
131
- }
@@ -1,94 +0,0 @@
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
- }
@@ -1,140 +0,0 @@
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
- }
110
- rules {
111
- tenant_id deve_ser valido
112
- motivo deve_ser preenchido
113
- tenant.ativo == verdadeiro
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
- }