@semacode/cli 1.3.2 → 1.3.6

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 (96) hide show
  1. package/dist/index.js +33 -27
  2. package/dist/index.js.map +1 -1
  3. package/node_modules/@sema/gerador-css/package.json +10 -3
  4. package/node_modules/@sema/gerador-css/src/index.ts +605 -0
  5. package/node_modules/@sema/gerador-css/tsconfig.json +13 -0
  6. package/node_modules/@sema/gerador-css/tsconfig.tsbuildinfo +1 -0
  7. package/node_modules/@sema/gerador-dart/package.json +10 -3
  8. package/node_modules/@sema/gerador-dart/src/index.ts +52 -0
  9. package/node_modules/@sema/gerador-dart/tsconfig.json +13 -0
  10. package/node_modules/@sema/gerador-dart/tsconfig.tsbuildinfo +1 -0
  11. package/node_modules/@sema/gerador-html/package.json +10 -3
  12. package/node_modules/@sema/gerador-html/src/index.ts +185 -0
  13. package/node_modules/@sema/gerador-html/tsconfig.json +13 -0
  14. package/node_modules/@sema/gerador-html/tsconfig.tsbuildinfo +1 -0
  15. package/node_modules/@sema/gerador-javascript/package.json +10 -3
  16. package/node_modules/@sema/gerador-javascript/src/index.ts +461 -0
  17. package/node_modules/@sema/gerador-javascript/tsconfig.json +13 -0
  18. package/node_modules/@sema/gerador-javascript/tsconfig.tsbuildinfo +1 -0
  19. package/node_modules/@sema/gerador-lua/package.json +10 -3
  20. package/node_modules/@sema/gerador-lua/src/index.d.ts +3 -0
  21. package/node_modules/@sema/gerador-lua/src/index.js.map +1 -0
  22. package/node_modules/@sema/gerador-lua/src/index.ts +359 -0
  23. package/node_modules/@sema/gerador-lua/tsconfig.json +13 -0
  24. package/node_modules/@sema/gerador-lua/tsconfig.tsbuildinfo +1 -0
  25. package/node_modules/@sema/gerador-python/package.json +10 -3
  26. package/node_modules/@sema/gerador-python/src/index.ts +706 -0
  27. package/node_modules/@sema/gerador-python/tsconfig.json +13 -0
  28. package/node_modules/@sema/gerador-python/tsconfig.tsbuildinfo +1 -0
  29. package/node_modules/@sema/gerador-typescript/package.json +10 -3
  30. package/node_modules/@sema/gerador-typescript/src/index.ts +728 -0
  31. package/node_modules/@sema/gerador-typescript/tsconfig.json +13 -0
  32. package/node_modules/@sema/gerador-typescript/tsconfig.tsbuildinfo +1 -0
  33. package/node_modules/@sema/nucleo/package.json +6 -3
  34. package/node_modules/@sema/nucleo/src/ast/tipos.ts +191 -0
  35. package/node_modules/@sema/nucleo/src/diagnosticos/index.ts +43 -0
  36. package/node_modules/@sema/nucleo/src/formatador/index.ts +507 -0
  37. package/node_modules/@sema/nucleo/src/index.ts +133 -0
  38. package/node_modules/@sema/nucleo/src/ir/conversor.ts +912 -0
  39. package/node_modules/@sema/nucleo/src/ir/modelos.ts +331 -0
  40. package/node_modules/@sema/nucleo/src/lexer/lexer.ts +166 -0
  41. package/node_modules/@sema/nucleo/src/lexer/tokens.ts +64 -0
  42. package/node_modules/@sema/nucleo/src/parser/gramatica.ebnf +39 -0
  43. package/node_modules/@sema/nucleo/src/parser/parser.ts +790 -0
  44. package/node_modules/@sema/nucleo/src/semantico/analisador.ts +2692 -0
  45. package/node_modules/@sema/nucleo/src/semantico/estruturas.ts +632 -0
  46. package/node_modules/@sema/nucleo/src/semantico/seguranca.ts +362 -0
  47. package/node_modules/@sema/nucleo/src/util/arquivos.ts +28 -0
  48. package/node_modules/@sema/nucleo/tsconfig.json +9 -0
  49. package/node_modules/@sema/nucleo/tsconfig.tsbuildinfo +1 -0
  50. package/node_modules/@sema/padroes/package.json +6 -3
  51. package/node_modules/@sema/padroes/src/index.ts +251 -0
  52. package/node_modules/@sema/padroes/tsconfig.json +9 -0
  53. package/node_modules/@sema/padroes/tsconfig.tsbuildinfo +1 -0
  54. package/package.json +21 -33
  55. package/AGENTS.md +0 -272
  56. package/LICENSE +0 -22
  57. package/README.md +0 -73
  58. package/SEMA_BRIEF.curto.txt +0 -9
  59. package/SEMA_BRIEF.md +0 -49
  60. package/SEMA_BRIEF.micro.txt +0 -7
  61. package/SEMA_INDEX.json +0 -546
  62. package/docs/AGENT_STARTER.md +0 -102
  63. package/docs/como-ensinar-a-sema-para-ia.md +0 -149
  64. package/docs/fluxo-pratico-ia-sema.md +0 -177
  65. package/docs/instalacao-e-primeiro-uso.md +0 -196
  66. package/docs/integracao-com-ia.md +0 -228
  67. package/docs/pagamento-ponta-a-ponta.md +0 -155
  68. package/docs/prompt-base-ia-sema.md +0 -104
  69. package/docs/sintaxe.md +0 -361
  70. package/exemplos/agendamento.sema +0 -106
  71. package/exemplos/assinatura.sema +0 -136
  72. package/exemplos/auditoria.sema +0 -88
  73. package/exemplos/autenticacao.sema +0 -125
  74. package/exemplos/automacao.sema +0 -107
  75. package/exemplos/cadastro_usuario.sema +0 -54
  76. package/exemplos/calculadora.sema +0 -78
  77. package/exemplos/crud_simples.sema +0 -89
  78. package/exemplos/estoque.sema +0 -126
  79. package/exemplos/exportacao.sema +0 -94
  80. package/exemplos/fila.sema +0 -131
  81. package/exemplos/integracao_externa.sema +0 -94
  82. package/exemplos/multi_tenant.sema +0 -140
  83. package/exemplos/notificacao.sema +0 -98
  84. package/exemplos/operacao_estrategia.sema +0 -402
  85. package/exemplos/pagamento.sema +0 -222
  86. package/exemplos/pagamento_dominio.sema +0 -35
  87. package/exemplos/pedido.sema +0 -119
  88. package/exemplos/permissao.sema +0 -121
  89. package/exemplos/relatorio.sema +0 -93
  90. package/exemplos/testes_embutidos.sema +0 -45
  91. package/exemplos/tratamento_erro.sema +0 -157
  92. package/exemplos/upload_arquivo.sema +0 -93
  93. package/exemplos/webhook.sema +0 -96
  94. package/llms-full.txt +0 -34
  95. package/llms.txt +0 -17
  96. package/logo.png +0 -0
package/docs/sintaxe.md DELETED
@@ -1,361 +0,0 @@
1
- # Sintaxe Canonica
2
-
3
- A Sema usa blocos declarativos com chaves e forma previsivel. A regra aqui nao e "ficar bonitinho para humano"; e reduzir ambiguidade para parser, IR, drift e contexto de IA.
4
-
5
- ## Regras basicas
6
-
7
- - um arquivo `.sema` contem um `module` principal
8
- - cada bloco abre com palavra-chave e fecha com `}`
9
- - campos usam `nome: valor`
10
- - linhas declarativas continuam validas para regra, efeito, garantia, transicao e etapa de flow
11
- - `tests` contem blocos `caso`
12
- - quando uma palavra reservada aparece seguida de `:`, ela continua sendo campo, nao bloco
13
-
14
- ## Blocos de primeira classe
15
-
16
- - `module`
17
- - `use`
18
- - `type`
19
- - `entity`
20
- - `enum`
21
- - `state`
22
- - `task`
23
- - `flow`
24
- - `route`
25
- - `worker`
26
- - `evento`
27
- - `fila`
28
- - `cron`
29
- - `webhook`
30
- - `cache`
31
- - `storage`
32
- - `policy`
33
- - `tests`
34
- - `docs`
35
- - `comments`
36
-
37
- ## Subblocos mais usados
38
-
39
- - `input`
40
- - `output`
41
- - `rules`
42
- - `effects`
43
- - `auth`
44
- - `authz`
45
- - `dados`
46
- - `audit`
47
- - `segredos`
48
- - `forbidden`
49
- - `impl`
50
- - `vinculos`
51
- - `execucao`
52
- - `guarantees`
53
- - `error`
54
- - `fields`
55
- - `invariants`
56
- - `transitions`
57
- - `given`
58
- - `when`
59
- - `expect`
60
-
61
- ## Tipos compostos
62
-
63
- A Sema agora aceita formas canonicas para payload mais denso sem empurrar tudo para `Json`.
64
-
65
- ```sema
66
- input {
67
- ids: Lista<Id> required
68
- metadata: Mapa<Texto, Texto>
69
- responsavel: Opcional<Usuario>
70
- chave_publica: Texto|Id
71
- }
72
- ```
73
-
74
- Formas suportadas:
75
-
76
- - `Lista<T>`
77
- - `Mapa<K, V>`
78
- - `Opcional<T>`
79
- - `T1|T2`
80
- - `T?`
81
-
82
- ## Task com contrato operacional
83
-
84
- ```sema
85
- task processar_pedido {
86
- input {
87
- pedido_id: Id required
88
- itens: Lista<Texto> required
89
- }
90
- output {
91
- protocolo: Id
92
- status: Texto
93
- }
94
- impl {
95
- ts: app.pedidos.processar
96
- }
97
- vinculos {
98
- arquivo: "src/pedidos/processar.ts"
99
- simbolo: app.pedidos.processar
100
- fila: pedidos_processamento
101
- }
102
- execucao {
103
- idempotencia: verdadeiro
104
- timeout: "30s"
105
- retry: "3x exponencial"
106
- compensacao: "reverter_reserva"
107
- criticidade_operacional: alta
108
- }
109
- effects {
110
- persistencia pedidos criticidade = alta
111
- auditoria pedidos criticidade = media
112
- }
113
- guarantees {
114
- protocolo existe
115
- status existe
116
- }
117
- error {
118
- pedido_invalido {
119
- mensagem: "payload invalido"
120
- categoria: dominio
121
- recuperabilidade: permanente
122
- acao_chamador: corrigir_input
123
- impacta_estado: falso
124
- requer_compensacao: falso
125
- }
126
- }
127
- tests {
128
- caso "processa pedido valido" {
129
- given {
130
- pedido_id: "ped_1"
131
- }
132
- expect {
133
- sucesso: verdadeiro
134
- }
135
- }
136
- }
137
- }
138
- ```
139
-
140
- ## `impl`
141
-
142
- `impl` liga a task ou a superficie ao simbolo real do runtime.
143
-
144
- ```sema
145
- impl {
146
- ts: app.pedidos.processar
147
- py: services.orders.processar
148
- cs: Pedidos.Api.Controllers.PedidosController.Processar
149
- }
150
- ```
151
-
152
- Regras:
153
-
154
- - cada origem aparece no maximo uma vez por bloco
155
- - o caminho aponta para simbolo, nao para chamada com `()`
156
- - `ts|typescript`, `py|python`, `dart`, `cs|csharp|dotnet`, `java`, `go|golang`, `rust|rs`, `cpp|cxx|cc|c++` sao origens validas
157
-
158
- ## `vinculos`
159
-
160
- `vinculos` nao substitui `impl`. Ele complementa o contrato com rastros operacionais que ajudam IA e drift a mapear o sistema vivo.
161
-
162
- Campos comuns:
163
-
164
- - `arquivo`
165
- - `simbolo`
166
- - `rota`
167
- - `superficie`
168
- - `recurso`
169
- - `tabela`
170
- - `fila`
171
- - `worker`
172
- - `evento`
173
- - `cron`
174
- - `webhook`
175
- - `cache`
176
- - `storage`
177
- - `policy`
178
-
179
- Exemplo:
180
-
181
- ```sema
182
- vinculos {
183
- arquivo: "pacotes/cli/src/index.ts"
184
- simbolo: cli.src.index.gerarContextoIa
185
- webhook: "/interno/contexto-ia"
186
- }
187
- ```
188
-
189
- ## `execucao`
190
-
191
- `execucao` explicita comportamento operacional em vez de deixar isso espalhado pelo codigo ou pela cabeca da IA.
192
-
193
- ```sema
194
- execucao {
195
- idempotencia: verdadeiro
196
- timeout: "15s"
197
- retry: "fila"
198
- compensacao: "nenhuma"
199
- criticidade_operacional: media
200
- }
201
- ```
202
-
203
- Campos canonicos:
204
-
205
- - `idempotencia`
206
- - `timeout`
207
- - `retry`
208
- - `compensacao`
209
- - `criticidade_operacional`
210
-
211
- ## Seguranca semantica
212
-
213
- Em `task`, `route` e superficies modernas, a Sema agora aceita contratos de seguranca explicitos para reduzir adivinhacao em producao.
214
-
215
- - `auth`: como a chamada autentica, com `modo`, `estrategia`, `principal` e `origem`
216
- - `authz`: quem pode executar, com `papel`, `escopo`, `politica` e `tenant`
217
- - `dados`: classificacao de input/output, `redacao_log` e `retencao`
218
- - `audit`: trilha obrigatoria com `evento`, `ator`, `correlacao`, `retencao` e `motivo`
219
- - `segredos`: origem, escopo, rotacao e protecoes de segredo
220
- - `forbidden`: proibicoes explicitas como `shell.exec`, `network.egress`, `log.segredo` e `retorno.credencial`
221
-
222
- Exemplo:
223
-
224
- ```sema
225
- task processar_pagamento {
226
- input {
227
- cliente_id: Id required
228
- token_gateway: Texto required
229
- }
230
- output {
231
- protocolo: Id
232
- status: Texto
233
- }
234
- effects {
235
- db.write Pagamento criticidade=alta privilegio=escrita isolamento=tenant
236
- secret.read gateway_api_key criticidade=media privilegio=leitura isolamento=processo
237
- }
238
- auth {
239
- modo: interno
240
- estrategia: jwt
241
- principal: servico
242
- origem: worker
243
- }
244
- authz {
245
- papel: pagamentos_admin
246
- escopo: pagamentos.processar
247
- tenant: isolado
248
- }
249
- dados {
250
- classificacao_padrao: interno
251
- redacao_log: obrigatoria
252
- retencao: "90d"
253
- input {
254
- cliente_id: pii
255
- token_gateway: credencial
256
- }
257
- output {
258
- protocolo: interno
259
- status: interno
260
- }
261
- }
262
- audit {
263
- evento: pagamentos.processado
264
- ator: auth.servico
265
- correlacao: request_id
266
- retencao: "180d"
267
- motivo: obrigatorio
268
- }
269
- segredos {
270
- gateway_api_key {
271
- origem: vault
272
- escopo: runtime
273
- acesso: gateway_pagamento
274
- rotacao: "30d"
275
- nao_logar: verdadeiro
276
- nao_retornar: verdadeiro
277
- mascarar: verdadeiro
278
- }
279
- }
280
- forbidden {
281
- shell.exec
282
- retorno.credencial
283
- log.segredo
284
- }
285
- guarantees {
286
- protocolo existe
287
- status existe
288
- }
289
- }
290
- ```
291
-
292
- Esses blocos nao tentam implementar seguranca magica. Eles tornam a intencao auditavel por parser, IR, `drift`, `contexto-ia` e verificacao semantica.
293
-
294
- ## Superficies modernas
295
-
296
- A Sema nao fica presa em HTTP. As bordas abaixo sao blocos irmaos de `route`, com shape minimo compativel com `task`, `impl`, `vinculos`, `execucao` e `effects`.
297
-
298
- ```sema
299
- worker preparar_briefing {
300
- task: medir_drift
301
- vinculos {
302
- arquivo: "pacotes/cli/src/index.ts"
303
- worker: contexto_ia
304
- }
305
- execucao {
306
- retry: "fila_contexto"
307
- criticidade_operacional: alta
308
- }
309
- }
310
-
311
- webhook confirmar_contexto {
312
- task: mapear_projeto
313
- vinculos {
314
- webhook: "/interno/contexto-ia"
315
- }
316
- execucao {
317
- timeout: "15s"
318
- criticidade_operacional: media
319
- }
320
- }
321
- ```
322
-
323
- ## Flow com dependencia explicita
324
-
325
- ```sema
326
- flow operar_contexto_ia {
327
- entrada: Texto
328
- etapa mapear usa mapear_projeto com entrada = entrada
329
- etapa drift usa medir_drift com contrato = entrada depende_de mapear
330
- etapa briefing usa preparar_briefing com entrada = entrada depende_de drift
331
- effects {
332
- auditoria contexto_ia criticidade = alta
333
- }
334
- vinculos {
335
- simbolo: cli.src.index.comandoContextoIa
336
- }
337
- }
338
- ```
339
-
340
- ## Forma canonica
341
-
342
- O formatador passa a preferir:
343
-
344
- - `vinculos` com `arquivo` antes de `simbolo`
345
- - `auth` com `modo`, `estrategia`, `principal` e `origem`
346
- - `authz` com `papel|papeis`, `escopo|escopos`, `politica` e `tenant`
347
- - `dados` com `classificacao_padrao`, `redacao_log` e `retencao`
348
- - `audit` com `evento`, `ator`, `correlacao`, `retencao` e `motivo`
349
- - `execucao` com `idempotencia`, `timeout`, `retry`, `compensacao` e `criticidade_operacional`
350
- - strings operacionais como `arquivo`, `timeout`, `retry`, `compensacao`, `retencao` e `rotacao` com aspas
351
- - tipos compostos sem espacos quebrados em `Lista<T>` e `Mapa<K, V>`
352
-
353
- ## Resumo pratico
354
-
355
- Se a duvida for "isso vai ajudar a IA a editar com menos chute?", a sintaxe nova aponta para quatro coisas:
356
-
357
- - contrato rico
358
- - seguranca semantica explicita
359
- - vinculo rastreavel
360
- - execucao explicita
361
- - superficie moderna de primeira classe
@@ -1,106 +0,0 @@
1
- module exemplos.agendamento {
2
- docs {
3
- resumo: "Agendamento de tarefas recorrentes e unicas com controle de execucao."
4
- }
5
-
6
- entity Agendamento {
7
- fields {
8
- id: Id
9
- nome: Texto
10
- tipo: Texto
11
- expressao_cron: Texto
12
- payload: Objeto
13
- ativo: Booleano
14
- ultima_execucao: Timestamp
15
- proxima_execucao: Timestamp
16
- }
17
- }
18
-
19
- entity ExecucaoAgendamento {
20
- fields {
21
- id: Id
22
- agendamento_id: Id
23
- status: Texto
24
- iniciado_em: Timestamp
25
- concluido_em: Timestamp
26
- erro: Texto
27
- }
28
- }
29
-
30
- task criar_agendamento {
31
- input {
32
- nome: Texto required
33
- tipo: Texto required
34
- expressao_cron: Texto required
35
- payload: Objeto
36
- }
37
- output {
38
- agendamento: Agendamento
39
- }
40
- rules {
41
- nome deve_ser preenchido
42
- expressao_cron deve_ser valida
43
- tipo deve_ser registrado
44
- }
45
- effects {
46
- persistencia Agendamento
47
- evento agendamento_criado criticidade = baixa
48
- auditoria criacao_agendamento
49
- }
50
- guarantees {
51
- agendamento existe
52
- agendamento.ativo == verdadeiro
53
- }
54
- error {
55
- cron_invalido: "Expressao cron invalida."
56
- tipo_nao_registrado: "Tipo de agendamento nao existe."
57
- nome_duplicado: "Ja existe agendamento com este nome."
58
- }
59
- tests {
60
- caso "cria agendamento diario" {
61
- given { nome: "relatorio_diario" tipo: "gerar_relatorio" expressao_cron: "0 8 * * *" }
62
- expect { sucesso: verdadeiro }
63
- }
64
- }
65
- }
66
-
67
- task executar_agendamento {
68
- input {
69
- agendamento_id: Id required
70
- }
71
- output {
72
- execucao_id: Id
73
- }
74
- rules {
75
- agendamento_id deve_ser valido
76
- agendamento.ativo == verdadeiro
77
- }
78
- effects {
79
- consulta Agendamento por agendamento_id
80
- persistencia ExecucaoAgendamento
81
- persistencia Agendamento
82
- evento agendamento_executado criticidade = baixa
83
- auditoria execucao_agendamento
84
- }
85
- state ciclo_execucao {
86
- transitions {
87
- PENDENTE -> EM_EXECUCAO
88
- EM_EXECUCAO -> CONCLUIDO
89
- EM_EXECUCAO -> FALHOU
90
- }
91
- }
92
- guarantees {
93
- execucao_id existe
94
- }
95
- error {
96
- agendamento_inativo: "Agendamento esta desativado."
97
- execucao_em_andamento: "Ja existe uma execucao em andamento para este agendamento."
98
- }
99
- tests {
100
- caso "executa agendamento ativo" {
101
- given { agendamento_id: "agd_1" }
102
- expect { sucesso: verdadeiro }
103
- }
104
- }
105
- }
106
- }
@@ -1,136 +0,0 @@
1
- module exemplos.assinatura {
2
- docs {
3
- resumo: "Gestao de assinaturas recorrentes com upgrade, downgrade e cancelamento."
4
- }
5
-
6
- entity Assinatura {
7
- fields {
8
- id: Id
9
- cliente_id: Id
10
- plano_id: Id
11
- status: Texto
12
- inicio_em: Timestamp
13
- proximo_vencimento: Timestamp
14
- cancelada_em: Timestamp
15
- }
16
- }
17
-
18
- task criar_assinatura {
19
- input {
20
- cliente_id: Id required
21
- plano_id: Id required
22
- token_pagamento: Texto required
23
- }
24
- output {
25
- assinatura: Assinatura
26
- }
27
- rules {
28
- cliente_id deve_ser valido
29
- plano_id deve_ser valido
30
- token_pagamento deve_ser valido
31
- }
32
- effects {
33
- consulta Cliente por cliente_id
34
- consulta Plano por plano_id
35
- consulta gateway_pagamento criticidade = alta
36
- persistencia Assinatura
37
- evento assinatura_criada criticidade = alta
38
- notificacao cliente confirmacao_assinatura criticidade = media
39
- auditoria criacao_assinatura criticidade = alta
40
- }
41
- state ciclo_assinatura {
42
- transitions {
43
- PENDENTE -> ATIVA
44
- }
45
- }
46
- guarantees {
47
- assinatura existe
48
- assinatura.status == ATIVA
49
- }
50
- error {
51
- pagamento_recusado: "Pagamento inicial recusado."
52
- cliente_ja_assina: "Cliente ja possui assinatura ativa."
53
- plano_invalido: "Plano nao disponivel para assinatura."
54
- }
55
- tests {
56
- caso "cria assinatura pro" {
57
- given { cliente_id: "cli_1" plano_id: "plano_pro" token_pagamento: "tok_ok" }
58
- expect { sucesso: verdadeiro }
59
- }
60
- }
61
- }
62
-
63
- task cancelar_assinatura {
64
- input {
65
- assinatura_id: Id required
66
- motivo: Texto required
67
- imediato: Booleano
68
- }
69
- output {
70
- protocolo: Id
71
- }
72
- rules {
73
- assinatura_id deve_ser valido
74
- assinatura.status == ATIVA
75
- motivo deve_ser preenchido
76
- }
77
- effects {
78
- persistencia Assinatura
79
- consulta gateway_pagamento criticidade = alta
80
- evento assinatura_cancelada criticidade = alta
81
- notificacao cliente confirmacao_cancelamento criticidade = media
82
- auditoria cancelamento_assinatura criticidade = alta
83
- }
84
- state ciclo_assinatura {
85
- transitions {
86
- ATIVA -> CANCELADA
87
- ATIVA -> PENDENTE_CANCELAMENTO
88
- }
89
- }
90
- guarantees {
91
- protocolo existe
92
- }
93
- error {
94
- assinatura_ja_cancelada: "Assinatura ja foi cancelada."
95
- }
96
- tests {
97
- caso "cancela assinatura ativa" {
98
- given { assinatura_id: "asn_1" motivo: "Nao preciso mais" imediato: falso }
99
- expect { sucesso: verdadeiro }
100
- }
101
- }
102
- }
103
-
104
- task renovar_assinatura {
105
- input {
106
- assinatura_id: Id required
107
- }
108
- output {
109
- protocolo_cobranca: Id
110
- }
111
- rules {
112
- assinatura_id deve_ser valido
113
- assinatura.status == ATIVA
114
- assinatura.proximo_vencimento <= hoje
115
- }
116
- effects {
117
- consulta gateway_pagamento criticidade = alta
118
- persistencia Assinatura
119
- evento assinatura_renovada criticidade = media
120
- auditoria renovacao_assinatura criticidade = alta
121
- }
122
- guarantees {
123
- protocolo_cobranca existe
124
- }
125
- error {
126
- pagamento_recusado: "Cobranca de renovacao recusada — assinatura sera suspensa."
127
- assinatura_cancelada: "Nao e possivel renovar assinatura cancelada."
128
- }
129
- tests {
130
- caso "renova assinatura no vencimento" {
131
- given { assinatura_id: "asn_1" }
132
- expect { sucesso: verdadeiro }
133
- }
134
- }
135
- }
136
- }
@@ -1,88 +0,0 @@
1
- module exemplos.auditoria {
2
- docs {
3
- resumo: "Registro imutavel de acoes criticas com rastreabilidade completa."
4
- }
5
-
6
- entity RegistroAuditoria {
7
- fields {
8
- id: Id
9
- ator_id: Id
10
- ator_tipo: Texto
11
- acao: Texto
12
- recurso: Texto
13
- recurso_id: Id
14
- dados_antes: Objeto
15
- dados_depois: Objeto
16
- ip_origem: Texto
17
- timestamp: Timestamp
18
- contexto: Objeto
19
- }
20
- }
21
-
22
- task registrar_acao {
23
- input {
24
- ator_id: Id required
25
- acao: Texto required
26
- recurso: Texto required
27
- recurso_id: Id required
28
- dados_antes: Objeto
29
- dados_depois: Objeto
30
- ip_origem: Texto
31
- }
32
- output {
33
- auditoria_id: Id
34
- }
35
- rules {
36
- acao deve_ser preenchida
37
- recurso deve_ser preenchido
38
- ator_id deve_ser valido
39
- }
40
- effects {
41
- persistencia RegistroAuditoria criticidade = alta
42
- }
43
- guarantees {
44
- auditoria_id existe
45
- RegistroAuditoria.imutavel == verdadeiro
46
- }
47
- error {
48
- falha_persistencia: "Nao foi possivel registrar a auditoria — operacao bloqueada."
49
- }
50
- tests {
51
- caso "registra acao critica" {
52
- given { ator_id: "usr_1" acao: "deletar_usuario" recurso: "Usuario" recurso_id: "usr_2" }
53
- expect { sucesso: verdadeiro }
54
- }
55
- }
56
- }
57
-
58
- task consultar_historico {
59
- input {
60
- recurso: Texto required
61
- recurso_id: Id required
62
- data_inicio: Data
63
- data_fim: Data
64
- }
65
- output {
66
- registros: Lista
67
- total: Inteiro
68
- }
69
- rules {
70
- recurso deve_ser preenchido
71
- recurso_id deve_ser valido
72
- }
73
- effects {
74
- consulta RegistroAuditoria por recurso e recurso_id
75
- auditoria consulta_historico
76
- }
77
- guarantees {
78
- registros existe
79
- total >= 0
80
- }
81
- tests {
82
- caso "consulta historico de usuario" {
83
- given { recurso: "Usuario" recurso_id: "usr_1" }
84
- expect { sucesso: verdadeiro }
85
- }
86
- }
87
- }
88
- }