@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.
- package/dist/index.js +33 -27
- package/dist/index.js.map +1 -1
- package/node_modules/@sema/gerador-css/package.json +10 -3
- package/node_modules/@sema/gerador-css/src/index.ts +605 -0
- package/node_modules/@sema/gerador-css/tsconfig.json +13 -0
- package/node_modules/@sema/gerador-css/tsconfig.tsbuildinfo +1 -0
- package/node_modules/@sema/gerador-dart/package.json +10 -3
- package/node_modules/@sema/gerador-dart/src/index.ts +52 -0
- package/node_modules/@sema/gerador-dart/tsconfig.json +13 -0
- package/node_modules/@sema/gerador-dart/tsconfig.tsbuildinfo +1 -0
- package/node_modules/@sema/gerador-html/package.json +10 -3
- package/node_modules/@sema/gerador-html/src/index.ts +185 -0
- package/node_modules/@sema/gerador-html/tsconfig.json +13 -0
- package/node_modules/@sema/gerador-html/tsconfig.tsbuildinfo +1 -0
- package/node_modules/@sema/gerador-javascript/package.json +10 -3
- package/node_modules/@sema/gerador-javascript/src/index.ts +461 -0
- package/node_modules/@sema/gerador-javascript/tsconfig.json +13 -0
- package/node_modules/@sema/gerador-javascript/tsconfig.tsbuildinfo +1 -0
- package/node_modules/@sema/gerador-lua/package.json +10 -3
- package/node_modules/@sema/gerador-lua/src/index.d.ts +3 -0
- package/node_modules/@sema/gerador-lua/src/index.js.map +1 -0
- package/node_modules/@sema/gerador-lua/src/index.ts +359 -0
- package/node_modules/@sema/gerador-lua/tsconfig.json +13 -0
- package/node_modules/@sema/gerador-lua/tsconfig.tsbuildinfo +1 -0
- package/node_modules/@sema/gerador-python/package.json +10 -3
- package/node_modules/@sema/gerador-python/src/index.ts +706 -0
- package/node_modules/@sema/gerador-python/tsconfig.json +13 -0
- package/node_modules/@sema/gerador-python/tsconfig.tsbuildinfo +1 -0
- package/node_modules/@sema/gerador-typescript/package.json +10 -3
- package/node_modules/@sema/gerador-typescript/src/index.ts +728 -0
- package/node_modules/@sema/gerador-typescript/tsconfig.json +13 -0
- package/node_modules/@sema/gerador-typescript/tsconfig.tsbuildinfo +1 -0
- package/node_modules/@sema/nucleo/package.json +6 -3
- package/node_modules/@sema/nucleo/src/ast/tipos.ts +191 -0
- package/node_modules/@sema/nucleo/src/diagnosticos/index.ts +43 -0
- package/node_modules/@sema/nucleo/src/formatador/index.ts +507 -0
- package/node_modules/@sema/nucleo/src/index.ts +133 -0
- package/node_modules/@sema/nucleo/src/ir/conversor.ts +912 -0
- package/node_modules/@sema/nucleo/src/ir/modelos.ts +331 -0
- package/node_modules/@sema/nucleo/src/lexer/lexer.ts +166 -0
- package/node_modules/@sema/nucleo/src/lexer/tokens.ts +64 -0
- package/node_modules/@sema/nucleo/src/parser/gramatica.ebnf +39 -0
- package/node_modules/@sema/nucleo/src/parser/parser.ts +790 -0
- package/node_modules/@sema/nucleo/src/semantico/analisador.ts +2692 -0
- package/node_modules/@sema/nucleo/src/semantico/estruturas.ts +632 -0
- package/node_modules/@sema/nucleo/src/semantico/seguranca.ts +362 -0
- package/node_modules/@sema/nucleo/src/util/arquivos.ts +28 -0
- package/node_modules/@sema/nucleo/tsconfig.json +9 -0
- package/node_modules/@sema/nucleo/tsconfig.tsbuildinfo +1 -0
- package/node_modules/@sema/padroes/package.json +6 -3
- package/node_modules/@sema/padroes/src/index.ts +251 -0
- package/node_modules/@sema/padroes/tsconfig.json +9 -0
- package/node_modules/@sema/padroes/tsconfig.tsbuildinfo +1 -0
- package/package.json +21 -33
- package/AGENTS.md +0 -272
- package/LICENSE +0 -22
- package/README.md +0 -73
- package/SEMA_BRIEF.curto.txt +0 -9
- package/SEMA_BRIEF.md +0 -49
- package/SEMA_BRIEF.micro.txt +0 -7
- package/SEMA_INDEX.json +0 -546
- package/docs/AGENT_STARTER.md +0 -102
- package/docs/como-ensinar-a-sema-para-ia.md +0 -149
- package/docs/fluxo-pratico-ia-sema.md +0 -177
- package/docs/instalacao-e-primeiro-uso.md +0 -196
- package/docs/integracao-com-ia.md +0 -228
- package/docs/pagamento-ponta-a-ponta.md +0 -155
- package/docs/prompt-base-ia-sema.md +0 -104
- package/docs/sintaxe.md +0 -361
- package/exemplos/agendamento.sema +0 -106
- package/exemplos/assinatura.sema +0 -136
- package/exemplos/auditoria.sema +0 -88
- package/exemplos/autenticacao.sema +0 -125
- package/exemplos/automacao.sema +0 -107
- package/exemplos/cadastro_usuario.sema +0 -54
- package/exemplos/calculadora.sema +0 -78
- package/exemplos/crud_simples.sema +0 -89
- package/exemplos/estoque.sema +0 -126
- package/exemplos/exportacao.sema +0 -94
- package/exemplos/fila.sema +0 -131
- package/exemplos/integracao_externa.sema +0 -94
- package/exemplos/multi_tenant.sema +0 -140
- package/exemplos/notificacao.sema +0 -98
- package/exemplos/operacao_estrategia.sema +0 -402
- package/exemplos/pagamento.sema +0 -222
- package/exemplos/pagamento_dominio.sema +0 -35
- package/exemplos/pedido.sema +0 -119
- package/exemplos/permissao.sema +0 -121
- package/exemplos/relatorio.sema +0 -93
- package/exemplos/testes_embutidos.sema +0 -45
- package/exemplos/tratamento_erro.sema +0 -157
- package/exemplos/upload_arquivo.sema +0 -93
- package/exemplos/webhook.sema +0 -96
- package/llms-full.txt +0 -34
- package/llms.txt +0 -17
- 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
|
-
}
|
package/exemplos/assinatura.sema
DELETED
|
@@ -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
|
-
}
|
package/exemplos/auditoria.sema
DELETED
|
@@ -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
|
-
}
|