@semacode/cli 1.5.17 → 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 (66) hide show
  1. package/README.md +104 -112
  2. package/SEMA_BRIEF.curto.txt +6 -6
  3. package/SEMA_BRIEF.md +17 -24
  4. package/SEMA_BRIEF.micro.txt +5 -5
  5. package/SEMA_INDEX.json +86 -224
  6. package/dist/drift.d.ts +3 -3
  7. package/dist/drift.js +5 -111
  8. package/dist/drift.js.map +1 -1
  9. package/dist/importador.d.ts +1 -1
  10. package/dist/importador.js +1 -200
  11. package/dist/importador.js.map +1 -1
  12. package/dist/index.js +59 -479
  13. package/dist/index.js.map +1 -1
  14. package/dist/projeto.js +0 -20
  15. package/dist/projeto.js.map +1 -1
  16. package/dist/tipos.d.ts +1 -1
  17. package/docs/AGENT_STARTER.md +9 -8
  18. package/docs/cli.md +106 -119
  19. package/docs/como-ensinar-a-sema-para-ia.md +4 -4
  20. package/docs/env.md +56 -56
  21. package/docs/fluxo-pratico-ia-sema.md +171 -167
  22. package/docs/integracao-com-ia.md +98 -96
  23. package/docs/mcp.md +51 -53
  24. package/docs/pagamento-ponta-a-ponta.md +11 -1
  25. package/docs/persistencia-vendor-first.md +1 -1
  26. package/docs/prompt-base-ia-sema.md +6 -5
  27. package/docs/rollback.md +1 -1
  28. package/docs/sintaxe.md +196 -394
  29. package/exemplos/agendamento.sema +0 -1
  30. package/exemplos/assinatura.sema +0 -3
  31. package/exemplos/auditoria.sema +2 -1
  32. package/exemplos/estoque.sema +2 -1
  33. package/exemplos/fila.sema +2 -3
  34. package/exemplos/multi_tenant.sema +2 -2
  35. package/exemplos/notificacao.sema +53 -2
  36. package/exemplos/operacao_estrategia.sema +231 -0
  37. package/exemplos/pagamento.sema +214 -2
  38. package/exemplos/pedido.sema +156 -20
  39. package/exemplos/replica_analitica_erp.sema +160 -0
  40. package/exemplos/webhook.sema +2 -4
  41. package/node_modules/@sema/gerador-css/package.json +1 -1
  42. package/node_modules/@sema/gerador-dart/package.json +1 -1
  43. package/node_modules/@sema/gerador-html/package.json +1 -1
  44. package/node_modules/@sema/gerador-javascript/package.json +1 -1
  45. package/node_modules/@sema/gerador-lua/package.json +1 -1
  46. package/node_modules/@sema/gerador-python/package.json +1 -1
  47. package/node_modules/@sema/gerador-typescript/package.json +1 -1
  48. package/node_modules/@sema/nucleo/dist/ast/tipos.d.ts +2 -4
  49. package/node_modules/@sema/nucleo/dist/formatador/index.js +14 -42
  50. package/node_modules/@sema/nucleo/dist/formatador/index.js.map +1 -1
  51. package/node_modules/@sema/nucleo/dist/ir/conversor.js +9 -204
  52. package/node_modules/@sema/nucleo/dist/ir/conversor.js.map +1 -1
  53. package/node_modules/@sema/nucleo/dist/ir/modelos.d.ts +3 -35
  54. package/node_modules/@sema/nucleo/dist/lexer/tokens.js +0 -21
  55. package/node_modules/@sema/nucleo/dist/lexer/tokens.js.map +1 -1
  56. package/node_modules/@sema/nucleo/dist/parser/parser.js +0 -40
  57. package/node_modules/@sema/nucleo/dist/parser/parser.js.map +1 -1
  58. package/node_modules/@sema/nucleo/dist/semantico/analisador.d.ts +6 -5
  59. package/node_modules/@sema/nucleo/dist/semantico/analisador.js +76 -307
  60. package/node_modules/@sema/nucleo/dist/semantico/analisador.js.map +1 -1
  61. package/node_modules/@sema/nucleo/dist/semantico/estruturas.d.ts +2 -0
  62. package/node_modules/@sema/nucleo/dist/semantico/estruturas.js +32 -2
  63. package/node_modules/@sema/nucleo/dist/semantico/estruturas.js.map +1 -1
  64. package/node_modules/@sema/nucleo/package.json +1 -1
  65. package/node_modules/@sema/padroes/package.json +1 -1
  66. package/package.json +14 -14
@@ -73,7 +73,6 @@ module exemplos.agendamento {
73
73
  }
74
74
  rules {
75
75
  agendamento_id deve_ser valido
76
- agendamento.ativo == verdadeiro
77
76
  }
78
77
  effects {
79
78
  consulta Agendamento por agendamento_id
@@ -71,7 +71,6 @@ module exemplos.assinatura {
71
71
  }
72
72
  rules {
73
73
  assinatura_id deve_ser valido
74
- assinatura.status == ATIVA
75
74
  motivo deve_ser preenchido
76
75
  }
77
76
  effects {
@@ -110,8 +109,6 @@ module exemplos.assinatura {
110
109
  }
111
110
  rules {
112
111
  assinatura_id deve_ser valido
113
- assinatura.status == ATIVA
114
- assinatura.proximo_vencimento <= hoje
115
112
  }
116
113
  effects {
117
114
  consulta gateway_pagamento criticidade = alta
@@ -31,6 +31,7 @@ module exemplos.auditoria {
31
31
  }
32
32
  output {
33
33
  auditoria_id: Id
34
+ imutavel: Booleano
34
35
  }
35
36
  rules {
36
37
  acao deve_ser preenchida
@@ -42,7 +43,7 @@ module exemplos.auditoria {
42
43
  }
43
44
  guarantees {
44
45
  auditoria_id existe
45
- RegistroAuditoria.imutavel == verdadeiro
46
+ imutavel == verdadeiro
46
47
  }
47
48
  error {
48
49
  falha_persistencia: "Nao foi possivel registrar a auditoria — operacao bloqueada."
@@ -32,6 +32,7 @@ module exemplos.estoque {
32
32
  }
33
33
  output {
34
34
  reserva_id: Id
35
+ quantidade_reservada: Inteiro
35
36
  }
36
37
  rules {
37
38
  quantidade > 0
@@ -46,7 +47,7 @@ module exemplos.estoque {
46
47
  }
47
48
  guarantees {
48
49
  reserva_id existe
49
- ItemEstoque.quantidade_reservada >= quantidade
50
+ quantidade_reservada existe
50
51
  }
51
52
  error {
52
53
  estoque_insuficiente: "Quantidade solicitada indisponivel em estoque."
@@ -50,7 +50,7 @@ module exemplos.fila {
50
50
  }
51
51
  tests {
52
52
  caso "enfileira job valido" {
53
- given { tipo: "envio_email" payload: {destinatario: "a@b.com"} }
53
+ given { tipo: "envio_email" payload: "destinatario:a@b.com" }
54
54
  expect { sucesso: verdadeiro }
55
55
  }
56
56
  }
@@ -65,7 +65,6 @@ module exemplos.fila {
65
65
  }
66
66
  rules {
67
67
  job_id deve_ser valido
68
- job.status == PENDENTE
69
68
  }
70
69
  effects {
71
70
  persistencia Job
@@ -105,7 +104,7 @@ module exemplos.fila {
105
104
  }
106
105
  rules {
107
106
  job_id deve_ser valido
108
- job.tentativas >= job.max_tentativas
107
+ motivo deve_ser preenchido
109
108
  }
110
109
  effects {
111
110
  persistencia Job
@@ -106,11 +106,11 @@ module exemplos.multi.tenant {
106
106
  }
107
107
  output {
108
108
  protocolo: Id
109
+ tenant_ativo: Booleano
109
110
  }
110
111
  rules {
111
112
  tenant_id deve_ser valido
112
113
  motivo deve_ser preenchido
113
- tenant.ativo == verdadeiro
114
114
  }
115
115
  effects {
116
116
  persistencia Tenant
@@ -125,7 +125,7 @@ module exemplos.multi.tenant {
125
125
  }
126
126
  guarantees {
127
127
  protocolo existe
128
- tenant.ativo == falso
128
+ tenant_ativo == falso
129
129
  }
130
130
  error {
131
131
  tenant_ja_suspenso: "Tenant ja esta suspenso."
@@ -85,14 +85,65 @@ module exemplos.notificacao {
85
85
  }
86
86
  }
87
87
 
88
+ task registrar_falha_notificacao {
89
+ input {
90
+ canal: Texto required
91
+ }
92
+ output {
93
+ protocolo_falha: Id
94
+ }
95
+ rules {
96
+ canal deve_ser preenchido
97
+ }
98
+ effects {
99
+ auditoria falha_notificacao
100
+ persistencia Notificacao
101
+ }
102
+ guarantees {
103
+ protocolo_falha existe
104
+ }
105
+ tests {
106
+ caso "registra falha de canal" {
107
+ given { canal: "email" }
108
+ expect { sucesso: verdadeiro }
109
+ }
110
+ }
111
+ }
112
+
113
+ task confirmar_notificacao {
114
+ input {
115
+ destinatario_id: Id required
116
+ }
117
+ output {
118
+ protocolo: Id
119
+ }
120
+ rules {
121
+ destinatario_id deve_ser valido
122
+ }
123
+ effects {
124
+ auditoria notificacao_concluida
125
+ }
126
+ guarantees {
127
+ protocolo existe
128
+ }
129
+ tests {
130
+ caso "confirma notificacao multicanal" {
131
+ given { destinatario_id: "usr_1" }
132
+ expect { sucesso: verdadeiro }
133
+ }
134
+ }
135
+ }
136
+
88
137
  flow notificar_multicanal {
89
138
  destinatario_id: Id
90
139
  titulo: Texto
91
140
  corpo: Texto
141
+ canal_email: Texto
142
+ canal_push: Texto
92
143
  etapa email usa enviar_email com destinatario = destinatario_id, titulo = titulo, corpo = corpo em_sucesso concluir em_erro registrar_falha_email
93
144
  etapa push usa enviar_push com device_token = destinatario_id, titulo = titulo, corpo = corpo em_sucesso concluir em_erro registrar_falha_push
94
- etapa registrar_falha_email usa registrar_falha_notificacao com canal = "email" depende_de email
95
- etapa registrar_falha_push usa registrar_falha_notificacao com canal = "push" depende_de push
145
+ etapa registrar_falha_email usa registrar_falha_notificacao com canal = canal_email depende_de email
146
+ etapa registrar_falha_push usa registrar_falha_notificacao com canal = canal_push depende_de push
96
147
  etapa concluir usa confirmar_notificacao com destinatario_id = destinatario_id depende_de email
97
148
  }
98
149
  }
@@ -142,6 +142,35 @@ module exemplos.operacao_estrategia {
142
142
  janela: JanelaDiscovery
143
143
  discovery_registrada: Booleano
144
144
  }
145
+ authz {
146
+ escopo: strategy.discovery.operar
147
+ tenant: obrigatorio
148
+ }
149
+ dados {
150
+ classificacao_padrao: interno
151
+ redacao_log: obrigatoria
152
+ input {
153
+ strategy_id: interno
154
+ semana_referencia: interno
155
+ versao_modelo_candidata: interno
156
+ }
157
+ output {
158
+ janela: interno
159
+ discovery_registrada: interno
160
+ }
161
+ }
162
+ audit {
163
+ evento: strategy.discovery.aberta
164
+ ator: sistema.strategy
165
+ correlacao: request_id
166
+ retencao: "180d"
167
+ motivo: obrigatorio
168
+ }
169
+ forbidden {
170
+ shell.exec
171
+ log.segredo
172
+ retorno.credencial
173
+ }
145
174
  rules {
146
175
  strategy_id existe
147
176
  semana_referencia existe
@@ -152,6 +181,18 @@ module exemplos.operacao_estrategia {
152
181
  auditoria strategy criticidade = alta
153
182
  evento discovery_aberta criticidade = media
154
183
  }
184
+ vinculos {
185
+ tabela: discovery_semanal
186
+ recurso: strategy_registry
187
+ evento: discovery_aberta
188
+ }
189
+ execucao {
190
+ idempotencia: verdadeiro
191
+ timeout: "10s"
192
+ retry: "nenhum"
193
+ compensacao: "fechar_janela_discovery_inconsistente"
194
+ criticidade_operacional: alta
195
+ }
155
196
  guarantees {
156
197
  janela existe
157
198
  discovery_registrada == verdadeiro
@@ -166,6 +207,8 @@ module exemplos.operacao_estrategia {
166
207
 
167
208
  expect {
168
209
  sucesso: verdadeiro
210
+ discovery_registrada: verdadeiro
211
+ janela: "janela_strategy_alpha_2026_13"
169
212
  }
170
213
  }
171
214
  }
@@ -187,6 +230,38 @@ module exemplos.operacao_estrategia {
187
230
  slice_status: StatusSlice
188
231
  motivo_operacional: Texto
189
232
  }
233
+ authz {
234
+ escopo: strategy.slice.avaliar
235
+ tenant: obrigatorio
236
+ }
237
+ dados {
238
+ classificacao_padrao: interno
239
+ redacao_log: obrigatoria
240
+ input {
241
+ strategy_id: interno
242
+ slice_id: interno
243
+ precision_observada: interno
244
+ precision_minima: interno
245
+ risco_operacional: interno
246
+ }
247
+ output {
248
+ gate_slice: interno
249
+ slice_status: interno
250
+ motivo_operacional: interno
251
+ }
252
+ }
253
+ audit {
254
+ evento: strategy.slice.avaliado
255
+ ator: sistema.strategy
256
+ correlacao: request_id
257
+ retencao: "180d"
258
+ motivo: obrigatorio
259
+ }
260
+ forbidden {
261
+ shell.exec
262
+ log.segredo
263
+ retorno.credencial
264
+ }
190
265
  rules {
191
266
  strategy_id existe
192
267
  slice_id existe
@@ -199,6 +274,18 @@ module exemplos.operacao_estrategia {
199
274
  auditoria discovery_slice criticidade = alta
200
275
  notificacao operacao criticidade = media
201
276
  }
277
+ vinculos {
278
+ tabela: slice
279
+ recurso: strategy_registry
280
+ evento: discovery_slice_avaliado
281
+ }
282
+ execucao {
283
+ idempotencia: verdadeiro
284
+ timeout: "10s"
285
+ retry: "nenhum"
286
+ compensacao: "manter_gate_slice_fechado_ate_reavaliacao"
287
+ criticidade_operacional: alta
288
+ }
202
289
  guarantees {
203
290
  gate_slice existe
204
291
  slice_status existe
@@ -216,6 +303,9 @@ module exemplos.operacao_estrategia {
216
303
 
217
304
  expect {
218
305
  sucesso: verdadeiro
306
+ gate_slice: "FECHADO"
307
+ slice_status: "QUARENTENA"
308
+ motivo_operacional: "drawdown_excessivo"
219
309
  }
220
310
  }
221
311
  }
@@ -237,6 +327,38 @@ module exemplos.operacao_estrategia {
237
327
  gate_slice: StatusGate
238
328
  contexto: ContextoQuarentena
239
329
  }
330
+ authz {
331
+ escopo: strategy.slice.quarentena
332
+ tenant: obrigatorio
333
+ }
334
+ dados {
335
+ classificacao_padrao: interno
336
+ redacao_log: obrigatoria
337
+ input {
338
+ strategy_id: interno
339
+ slice_id: interno
340
+ motivo: interno
341
+ origem: interno
342
+ data_referencia: interno
343
+ }
344
+ output {
345
+ slice_status: interno
346
+ gate_slice: interno
347
+ contexto: interno
348
+ }
349
+ }
350
+ audit {
351
+ evento: strategy.slice.quarentena
352
+ ator: sistema.strategy
353
+ correlacao: request_id
354
+ retencao: "180d"
355
+ motivo: obrigatorio
356
+ }
357
+ forbidden {
358
+ shell.exec
359
+ log.segredo
360
+ retorno.credencial
361
+ }
240
362
  rules {
241
363
  strategy_id existe
242
364
  slice_id existe
@@ -250,6 +372,19 @@ module exemplos.operacao_estrategia {
250
372
  notificacao operacao criticidade = alta
251
373
  auditoria quarentena criticidade = alta
252
374
  }
375
+ vinculos {
376
+ tabela: slice
377
+ tabela: quarentena
378
+ recurso: strategy_registry
379
+ evento: slice_quarentena
380
+ }
381
+ execucao {
382
+ idempotencia: verdadeiro
383
+ timeout: "10s"
384
+ retry: "nenhum"
385
+ compensacao: "reabrir_slice_por_revisao_manual"
386
+ criticidade_operacional: alta
387
+ }
253
388
  state governanca_estrategia {
254
389
  transitions {
255
390
  ATIVA -> QUARENTENA
@@ -272,6 +407,9 @@ module exemplos.operacao_estrategia {
272
407
 
273
408
  expect {
274
409
  sucesso: verdadeiro
410
+ slice_status: "QUARENTENA"
411
+ gate_slice: "FECHADO"
412
+ contexto: "ctx_quarentena"
275
413
  }
276
414
  }
277
415
  }
@@ -291,6 +429,36 @@ module exemplos.operacao_estrategia {
291
429
  gate_global: StatusGate
292
430
  versao_modelo_ativa: Texto
293
431
  }
432
+ authz {
433
+ escopo: strategy.gate.fechar
434
+ tenant: obrigatorio
435
+ }
436
+ dados {
437
+ classificacao_padrao: interno
438
+ redacao_log: obrigatoria
439
+ input {
440
+ strategy_id: interno
441
+ motivo_operacional: interno
442
+ versao_modelo_ativa: interno
443
+ }
444
+ output {
445
+ strategy_status: interno
446
+ gate_global: interno
447
+ versao_modelo_ativa: interno
448
+ }
449
+ }
450
+ audit {
451
+ evento: strategy.gate_global.fechado
452
+ ator: sistema.strategy
453
+ correlacao: request_id
454
+ retencao: "180d"
455
+ motivo: obrigatorio
456
+ }
457
+ forbidden {
458
+ shell.exec
459
+ log.segredo
460
+ retorno.credencial
461
+ }
294
462
  rules {
295
463
  strategy_id existe
296
464
  motivo_operacional existe
@@ -301,6 +469,18 @@ module exemplos.operacao_estrategia {
301
469
  notificacao operacao criticidade = alta
302
470
  auditoria gate_global criticidade = alta
303
471
  }
472
+ vinculos {
473
+ tabela: strategy
474
+ recurso: strategy_registry
475
+ evento: gate_global_fechado
476
+ }
477
+ execucao {
478
+ idempotencia: verdadeiro
479
+ timeout: "10s"
480
+ retry: "nenhum"
481
+ compensacao: "manter_strategy_em_quarentena"
482
+ criticidade_operacional: alta
483
+ }
304
484
  guarantees {
305
485
  strategy_status == QUARENTENA
306
486
  gate_global == FECHADO
@@ -316,6 +496,9 @@ module exemplos.operacao_estrategia {
316
496
 
317
497
  expect {
318
498
  sucesso: verdadeiro
499
+ strategy_status: "QUARENTENA"
500
+ gate_global: "FECHADO"
501
+ versao_modelo_ativa: "modelo_2026_12"
319
502
  }
320
503
  }
321
504
  }
@@ -338,6 +521,39 @@ module exemplos.operacao_estrategia {
338
521
  gate_global: StatusGate
339
522
  versao_modelo_ativa: Texto
340
523
  }
524
+ authz {
525
+ escopo: strategy.rollout.ativar
526
+ tenant: obrigatorio
527
+ }
528
+ dados {
529
+ classificacao_padrao: interno
530
+ redacao_log: obrigatoria
531
+ input {
532
+ strategy_id: interno
533
+ versao_modelo_ativa: interno
534
+ versao_modelo_candidata: interno
535
+ strategy_status_atual: interno
536
+ gate_global_atual: interno
537
+ aprovacao_manual: interno
538
+ }
539
+ output {
540
+ strategy_status: interno
541
+ gate_global: interno
542
+ versao_modelo_ativa: interno
543
+ }
544
+ }
545
+ audit {
546
+ evento: strategy.rollout.ativado
547
+ ator: sistema.strategy
548
+ correlacao: request_id
549
+ retencao: "180d"
550
+ motivo: obrigatorio
551
+ }
552
+ forbidden {
553
+ shell.exec
554
+ log.segredo
555
+ retorno.credencial
556
+ }
341
557
  rules {
342
558
  strategy_id existe
343
559
  versao_modelo_ativa existe
@@ -351,6 +567,18 @@ module exemplos.operacao_estrategia {
351
567
  evento strategy_ativada criticidade = alta
352
568
  auditoria rollout criticidade = alta
353
569
  }
570
+ vinculos {
571
+ tabela: strategy
572
+ recurso: model_registry
573
+ evento: strategy_ativada
574
+ }
575
+ execucao {
576
+ idempotencia: verdadeiro
577
+ timeout: "15s"
578
+ retry: "nenhum"
579
+ compensacao: "reverter_para_versao_modelo_ativa_anterior"
580
+ criticidade_operacional: alta
581
+ }
354
582
  state governanca_estrategia {
355
583
  transitions {
356
584
  QUARENTENA -> ATIVA
@@ -375,6 +603,9 @@ module exemplos.operacao_estrategia {
375
603
 
376
604
  expect {
377
605
  sucesso: verdadeiro
606
+ strategy_status: "ATIVA"
607
+ gate_global: "ABERTO"
608
+ versao_modelo_ativa: "modelo_2026_13"
378
609
  }
379
610
  }
380
611
  }