@semacode/cli 1.3.6 → 1.4.0

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 (129) hide show
  1. package/AGENTS.md +272 -0
  2. package/LICENSE +22 -0
  3. package/README.md +93 -0
  4. package/SEMA_BRIEF.curto.txt +9 -0
  5. package/SEMA_BRIEF.md +49 -0
  6. package/SEMA_BRIEF.micro.txt +7 -0
  7. package/SEMA_INDEX.json +546 -0
  8. package/dist/drift.d.ts +5 -3
  9. package/dist/drift.js +532 -27
  10. package/dist/drift.js.map +1 -1
  11. package/dist/importador.d.ts +2 -0
  12. package/dist/importador.js +166 -7
  13. package/dist/importador.js.map +1 -1
  14. package/dist/index.js +2 -0
  15. package/dist/index.js.map +1 -1
  16. package/dist/projeto.d.ts +6 -1
  17. package/dist/projeto.js +1 -3
  18. package/dist/projeto.js.map +1 -1
  19. package/dist/typescript-http.js +1 -1
  20. package/dist/typescript-http.js.map +1 -1
  21. package/docs/AGENT_STARTER.md +102 -0
  22. package/docs/cli.md +101 -0
  23. package/docs/como-ensinar-a-sema-para-ia.md +149 -0
  24. package/docs/fluxo-pratico-ia-sema.md +177 -0
  25. package/docs/instalacao-e-primeiro-uso.md +108 -0
  26. package/docs/integracao-com-ia.md +71 -0
  27. package/docs/pagamento-ponta-a-ponta.md +155 -0
  28. package/docs/persistencia-vendor-first.md +145 -0
  29. package/docs/prompt-base-ia-sema.md +104 -0
  30. package/docs/sintaxe.md +177 -0
  31. package/exemplos/agendamento.sema +106 -0
  32. package/exemplos/assinatura.sema +136 -0
  33. package/exemplos/auditoria.sema +88 -0
  34. package/exemplos/autenticacao.sema +125 -0
  35. package/exemplos/automacao.sema +107 -0
  36. package/exemplos/cadastro_usuario.sema +54 -0
  37. package/exemplos/calculadora.sema +78 -0
  38. package/exemplos/crud_simples.sema +89 -0
  39. package/exemplos/estoque.sema +126 -0
  40. package/exemplos/exportacao.sema +94 -0
  41. package/exemplos/fila.sema +131 -0
  42. package/exemplos/integracao_externa.sema +94 -0
  43. package/exemplos/multi_tenant.sema +140 -0
  44. package/exemplos/notificacao.sema +98 -0
  45. package/exemplos/operacao_estrategia.sema +402 -0
  46. package/exemplos/pagamento.sema +222 -0
  47. package/exemplos/pagamento_dominio.sema +35 -0
  48. package/exemplos/pedido.sema +119 -0
  49. package/exemplos/permissao.sema +121 -0
  50. package/exemplos/persistencia_vendor_first.sema +86 -0
  51. package/exemplos/relatorio.sema +93 -0
  52. package/exemplos/testes_embutidos.sema +45 -0
  53. package/exemplos/tratamento_erro.sema +157 -0
  54. package/exemplos/upload_arquivo.sema +93 -0
  55. package/exemplos/webhook.sema +96 -0
  56. package/llms-full.txt +34 -0
  57. package/llms.txt +17 -0
  58. package/logo.png +0 -0
  59. package/node_modules/@sema/gerador-css/package.json +3 -10
  60. package/node_modules/@sema/gerador-dart/package.json +3 -10
  61. package/node_modules/@sema/gerador-html/package.json +3 -10
  62. package/node_modules/@sema/gerador-javascript/package.json +3 -10
  63. package/node_modules/@sema/gerador-lua/package.json +3 -10
  64. package/node_modules/@sema/gerador-python/package.json +3 -10
  65. package/node_modules/@sema/gerador-typescript/package.json +3 -10
  66. package/node_modules/@sema/nucleo/dist/ast/tipos.d.ts +2 -1
  67. package/node_modules/@sema/nucleo/dist/formatador/index.js +32 -17
  68. package/node_modules/@sema/nucleo/dist/formatador/index.js.map +1 -1
  69. package/node_modules/@sema/nucleo/dist/index.d.ts +1 -0
  70. package/node_modules/@sema/nucleo/dist/index.js +1 -0
  71. package/node_modules/@sema/nucleo/dist/index.js.map +1 -1
  72. package/node_modules/@sema/nucleo/dist/ir/conversor.js +94 -0
  73. package/node_modules/@sema/nucleo/dist/ir/conversor.js.map +1 -1
  74. package/node_modules/@sema/nucleo/dist/ir/modelos.d.ts +60 -0
  75. package/node_modules/@sema/nucleo/dist/lexer/tokens.js +15 -0
  76. package/node_modules/@sema/nucleo/dist/lexer/tokens.js.map +1 -1
  77. package/node_modules/@sema/nucleo/dist/parser/parser.js +98 -3
  78. package/node_modules/@sema/nucleo/dist/parser/parser.js.map +1 -1
  79. package/node_modules/@sema/nucleo/dist/persistencia/contratos.d.ts +39 -0
  80. package/node_modules/@sema/nucleo/dist/persistencia/contratos.js +294 -0
  81. package/node_modules/@sema/nucleo/dist/persistencia/contratos.js.map +1 -0
  82. package/node_modules/@sema/nucleo/dist/semantico/analisador.d.ts +1 -1
  83. package/node_modules/@sema/nucleo/dist/semantico/analisador.js +118 -2
  84. package/node_modules/@sema/nucleo/dist/semantico/analisador.js.map +1 -1
  85. package/node_modules/@sema/nucleo/package.json +3 -6
  86. package/node_modules/@sema/padroes/package.json +3 -6
  87. package/package.json +33 -21
  88. package/node_modules/@sema/gerador-css/src/index.ts +0 -605
  89. package/node_modules/@sema/gerador-css/tsconfig.json +0 -13
  90. package/node_modules/@sema/gerador-css/tsconfig.tsbuildinfo +0 -1
  91. package/node_modules/@sema/gerador-dart/src/index.ts +0 -52
  92. package/node_modules/@sema/gerador-dart/tsconfig.json +0 -13
  93. package/node_modules/@sema/gerador-dart/tsconfig.tsbuildinfo +0 -1
  94. package/node_modules/@sema/gerador-html/src/index.ts +0 -185
  95. package/node_modules/@sema/gerador-html/tsconfig.json +0 -13
  96. package/node_modules/@sema/gerador-html/tsconfig.tsbuildinfo +0 -1
  97. package/node_modules/@sema/gerador-javascript/src/index.ts +0 -461
  98. package/node_modules/@sema/gerador-javascript/tsconfig.json +0 -13
  99. package/node_modules/@sema/gerador-javascript/tsconfig.tsbuildinfo +0 -1
  100. package/node_modules/@sema/gerador-lua/src/index.d.ts +0 -3
  101. package/node_modules/@sema/gerador-lua/src/index.js.map +0 -1
  102. package/node_modules/@sema/gerador-lua/src/index.ts +0 -359
  103. package/node_modules/@sema/gerador-lua/tsconfig.json +0 -13
  104. package/node_modules/@sema/gerador-lua/tsconfig.tsbuildinfo +0 -1
  105. package/node_modules/@sema/gerador-python/src/index.ts +0 -706
  106. package/node_modules/@sema/gerador-python/tsconfig.json +0 -13
  107. package/node_modules/@sema/gerador-python/tsconfig.tsbuildinfo +0 -1
  108. package/node_modules/@sema/gerador-typescript/src/index.ts +0 -728
  109. package/node_modules/@sema/gerador-typescript/tsconfig.json +0 -13
  110. package/node_modules/@sema/gerador-typescript/tsconfig.tsbuildinfo +0 -1
  111. package/node_modules/@sema/nucleo/src/ast/tipos.ts +0 -191
  112. package/node_modules/@sema/nucleo/src/diagnosticos/index.ts +0 -43
  113. package/node_modules/@sema/nucleo/src/formatador/index.ts +0 -507
  114. package/node_modules/@sema/nucleo/src/index.ts +0 -133
  115. package/node_modules/@sema/nucleo/src/ir/conversor.ts +0 -912
  116. package/node_modules/@sema/nucleo/src/ir/modelos.ts +0 -331
  117. package/node_modules/@sema/nucleo/src/lexer/lexer.ts +0 -166
  118. package/node_modules/@sema/nucleo/src/lexer/tokens.ts +0 -64
  119. package/node_modules/@sema/nucleo/src/parser/gramatica.ebnf +0 -39
  120. package/node_modules/@sema/nucleo/src/parser/parser.ts +0 -790
  121. package/node_modules/@sema/nucleo/src/semantico/analisador.ts +0 -2692
  122. package/node_modules/@sema/nucleo/src/semantico/estruturas.ts +0 -632
  123. package/node_modules/@sema/nucleo/src/semantico/seguranca.ts +0 -362
  124. package/node_modules/@sema/nucleo/src/util/arquivos.ts +0 -28
  125. package/node_modules/@sema/nucleo/tsconfig.json +0 -9
  126. package/node_modules/@sema/nucleo/tsconfig.tsbuildinfo +0 -1
  127. package/node_modules/@sema/padroes/src/index.ts +0 -251
  128. package/node_modules/@sema/padroes/tsconfig.json +0 -9
  129. package/node_modules/@sema/padroes/tsconfig.tsbuildinfo +0 -1
@@ -0,0 +1,145 @@
1
+ # Persistencia Vendor-First
2
+
3
+ Sema 1.4.0 trata banco como superficie semantica de primeira classe. Isso significa assumir diferencas reais entre engines e coloca-las no contrato, no semantico, no IR, no drift e na extensao.
4
+
5
+ ## Engines publicas
6
+
7
+ - `postgres`
8
+ - `mysql`
9
+ - `sqlite`
10
+ - `mongodb`
11
+ - `redis`
12
+
13
+ ## Exemplo PostgreSQL
14
+
15
+ ```sema
16
+ database principal_postgres {
17
+ engine: postgres
18
+ schema: public
19
+ consistency: forte
20
+ durability: alta
21
+ transaction_model: mvcc
22
+ query_model: sql
23
+ capabilities {
24
+ joins
25
+ views
26
+ foreign_keys
27
+ }
28
+ table pedidos {
29
+ entity: Pedido
30
+ }
31
+ relationship pedido_cliente {
32
+ from: Pedido
33
+ to: Cliente
34
+ }
35
+ query buscar_pedidos {
36
+ mode: sql
37
+ }
38
+ }
39
+ ```
40
+
41
+ ## Exemplo MySQL
42
+
43
+ ```sema
44
+ database principal_mysql {
45
+ engine: mysql
46
+ consistency: forte
47
+ durability: alta
48
+ transaction_model: bloqueio
49
+ query_model: sql
50
+ table faturamento {
51
+ table: faturamento
52
+ }
53
+ index faturamento_status {
54
+ table: faturamento
55
+ }
56
+ query buscar_faturas {
57
+ mode: sql
58
+ }
59
+ }
60
+ ```
61
+
62
+ ## Exemplo SQLite
63
+
64
+ ```sema
65
+ database principal_sqlite {
66
+ engine: sqlite
67
+ consistency: snapshot
68
+ durability: media
69
+ transaction_model: single_thread
70
+ query_model: sql
71
+ table cache_local {
72
+ table: cache_local
73
+ }
74
+ retention limpeza_local {
75
+ retention: "7d"
76
+ }
77
+ }
78
+ ```
79
+
80
+ ## Exemplo MongoDB
81
+
82
+ ```sema
83
+ database principal_mongodb {
84
+ engine: mongodb
85
+ consistency: eventual
86
+ durability: alta
87
+ transaction_model: documento
88
+ query_model: documento
89
+ collection pedidos {
90
+ collection: pedidos
91
+ }
92
+ document pedido_snapshot {
93
+ entity: PedidoSnapshot
94
+ }
95
+ query pipeline_pedido {
96
+ mode: pipeline
97
+ }
98
+ }
99
+ ```
100
+
101
+ ## Exemplo Redis
102
+
103
+ ```sema
104
+ database principal_redis {
105
+ engine: redis
106
+ consistency: eventual
107
+ durability: media
108
+ transaction_model: single_thread
109
+ query_model: chave_valor
110
+ keyspace cache_pedidos {
111
+ ttl: "300s"
112
+ }
113
+ stream eventos_pedido {
114
+ surface: fila
115
+ }
116
+ retention expurgo_cache {
117
+ retention: "300s"
118
+ }
119
+ }
120
+ ```
121
+
122
+ ## Compatibilidade calculada
123
+
124
+ Cada recurso recebe compatibilidade por engine:
125
+
126
+ - `nativo`
127
+ - `adaptado`
128
+ - `parcial`
129
+ - `invalido`
130
+
131
+ Isso deixa explicito quando o contrato esta pedindo portabilidade falsa, por exemplo:
132
+
133
+ - `table` em `redis`
134
+ - `foreign_keys` em engine sem suporte equivalente
135
+ - transacao multi-documento tratada como universal
136
+
137
+ ## Onde isso aparece
138
+
139
+ - parser e AST
140
+ - IR canonica
141
+ - analisador semantico
142
+ - formatador
143
+ - `sema drift`
144
+ - `sema importar`
145
+ - extensao VS Code
@@ -0,0 +1,104 @@
1
+ # Prompt-Base Oficial para IA Trabalhar com Sema
2
+
3
+ Este arquivo serve como prompt-base oficial para qualquer IA que precise ler, escrever, revisar ou transformar arquivos `.sema`.
4
+
5
+ O objetivo nao e fazer a IA "improvisar bonito". O objetivo e fazer a IA operar a linguagem com previsibilidade. A Sema nao foi desenhada para ergonomia humana como prioridade; ela foi desenhada para IA.
6
+
7
+ ## Prompt-base
8
+
9
+ Use o texto abaixo como base:
10
+
11
+ ```text
12
+ Voce esta trabalhando com Sema, um Protocolo de Governanca de Intencao para IA e backend vivo.
13
+
14
+ Tecnicamente, a Sema funciona como linguagem de intencao orientada a contrato. Operacionalmente, ela existe para governar semantica acima da stack e reduzir ambiguidade para IA, nao para substituir arquitetura, design ou curadoria humana.
15
+
16
+ Trate a Sema como linguagem de especificacao executavel e protocolo de governanca semantica. Nao invente sintaxe, palavras-chave ou blocos fora da gramatica e dos exemplos oficiais.
17
+
18
+ Fontes de verdade, em ordem:
19
+ 1. se o projeto expuser `SEMA_CONTEXT.md`, comece por ele
20
+ 2. `SEMA_BRIEF.md`
21
+ 3. `SEMA_INDEX.json`
22
+ 4. README do projeto
23
+ 5. gramatica e documentacao de sintaxe da Sema
24
+ 6. especificacao semantica da linguagem
25
+ 7. exemplos oficiais, com prioridade para o vertical de pagamento
26
+ 8. `sema resumo` e `briefing.min.json` quando a IA for pequena
27
+ 9. AST, IR e diagnosticos exportados pela CLI em JSON quando a capacidade aguentar
28
+
29
+ Regras de operacao:
30
+ - preserve o significado semantico
31
+ - use o formatador oficial da Sema como fonte unica de estilo
32
+ - use diagnosticos estruturados como contrato de correcao
33
+ - use a IR como fonte de verdade semantica quando houver duvida
34
+ - nao conclua uma alteracao sem validar e verificar o modulo
35
+ - trate `importar` como bootstrap revisavel, nao como contrato final automatico
36
+ - trate `drift` como medicao de verdade contra codigo vivo
37
+ - trate `impl` como ponte entre task e simbolo real
38
+ - nao invente regra de negocio que o contrato e o codigo nao sustentem
39
+
40
+ Antes de editar `.sema`, entenda:
41
+ - o module alvo
42
+ - os contratos de task, route, error, effects, guarantees, state e flow
43
+ - os exemplos oficiais relacionados
44
+
45
+ Depois de editar `.sema`, execute este fluxo:
46
+ 1. formatar
47
+ 2. validar
48
+ 3. diagnosticar, se houver falha
49
+ 4. verificar
50
+
51
+ Se houver conflito entre texto livre e IR/diagnosticos, priorize a IR e os diagnosticos da CLI.
52
+
53
+ Se algo nao estiver claro, siga a forma ja usada nos exemplos oficiais. Nao improvise sem base.
54
+ ```
55
+
56
+ ## Variacao curta
57
+
58
+ Se voce quiser um prompt menor para uso frequente:
59
+
60
+ ```text
61
+ Trabalhe com Sema como DSL semantica orientada a contrato. Nao invente sintaxe. Use os exemplos oficiais e a gramatica como referencia de escrita. Use `ir --json` como fonte de verdade semantica, `diagnosticos --json` como fonte de correcao e `sema formatar` como fonte unica de estilo. Antes de encerrar, rode validacao e verificacao.
62
+ ```
63
+
64
+ Se voce quiser um prompt ainda mais curto e pronto para colar, use:
65
+
66
+ ```bash
67
+ sema prompt-curto caminho/arquivo.sema --curto --para mudanca
68
+ ```
69
+
70
+ ## Variacao para revisao
71
+
72
+ Use esta versao quando a IA for revisar `.sema` em vez de criar:
73
+
74
+ ```text
75
+ Revise este modulo Sema como contrato semantico executavel. Procure incoerencias entre input, output, rules, effects, guarantees, state, flow, route e error. Considere a IR e os diagnosticos da CLI como fonte de verdade. Nao critique estilo fora do que o formatador oficial resolveria automaticamente.
76
+ ```
77
+
78
+ ## Variacao para geracao
79
+
80
+ Use esta versao quando a IA for escrever modulo novo:
81
+
82
+ ```text
83
+ Gere um modulo Sema seguindo a gramatica oficial, os exemplos do projeto e o estilo do formatador canonico. Estruture o modulo como contrato semantico executavel, com blocos explicitos para entrada, saida, regras, efeitos, garantias, erros, estado, fluxo e testes quando fizer sentido. Nao use sintaxe fora do repertorio ja suportado pela linguagem.
84
+ ```
85
+
86
+ ## Variacao para correcao guiada por diagnostico
87
+
88
+ Use esta versao quando a IA ja tiver erro concreto para corrigir:
89
+
90
+ ```text
91
+ Corrija este modulo Sema a partir dos diagnosticos estruturados da CLI. Preserve a intencao do contrato e altere apenas o necessario para eliminar as falhas. Depois da correcao, aplique o formatador oficial e revalide.
92
+ ```
93
+
94
+ ## O que sempre anexar junto do prompt
95
+
96
+ Idealmente, acompanhe o prompt com:
97
+
98
+ - o arquivo `.sema` alvo
99
+ - o resultado de `sema ast --json`
100
+ - o resultado de `sema ir --json`
101
+ - o resultado de `sema diagnosticos --json`, se houver erro
102
+ - um exemplo oficial parecido
103
+
104
+ Sem isso, a IA pode ate acertar. Com isso, ela trabalha direito.
@@ -0,0 +1,177 @@
1
+ # Sintaxe Canonica
2
+
3
+ A Sema usa blocos declarativos previsiveis para reduzir ambiguidade no parser, na IR, no drift e no 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
+ - blocos declarativos podem aparecer aninhados quando o contrato exigir
11
+ - `tests` usa blocos `caso`
12
+
13
+ ## Blocos de primeira classe
14
+
15
+ - `module`
16
+ - `use`
17
+ - `database`
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 comuns
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
+ ```sema
64
+ input {
65
+ ids: Lista<Id> required
66
+ metadata: Mapa<Texto, Texto>
67
+ responsavel: Opcional<Usuario>
68
+ chave_publica: Texto|Id
69
+ }
70
+ ```
71
+
72
+ Formas suportadas:
73
+
74
+ - `Lista<T>`
75
+ - `Mapa<K, V>`
76
+ - `Opcional<T>`
77
+ - `T1|T2`
78
+ - `T?`
79
+
80
+ ## Persistencia vendor-first
81
+
82
+ O bloco `database` modela banco e recursos persistidos sem apagar as diferencas entre engines.
83
+
84
+ Estrutura base:
85
+
86
+ ```sema
87
+ database principal_postgres {
88
+ engine: postgres
89
+ consistency: forte
90
+ durability: alta
91
+ transaction_model: mvcc
92
+ query_model: sql
93
+ }
94
+ ```
95
+
96
+ Recursos canonicamente suportados:
97
+
98
+ - `table`
99
+ - `index`
100
+ - `relationship`
101
+ - `query`
102
+ - `retention`
103
+ - `lock`
104
+ - `replication`
105
+ - `collection`
106
+ - `document`
107
+ - `keyspace`
108
+ - `stream`
109
+ - `capabilities`
110
+
111
+ Exemplo relacional:
112
+
113
+ ```sema
114
+ database principal_postgres {
115
+ engine: postgres
116
+ schema: public
117
+ capabilities {
118
+ joins
119
+ views
120
+ foreign_keys
121
+ }
122
+ table pedidos {
123
+ entity: Pedido
124
+ }
125
+ relationship pedido_cliente {
126
+ from: Pedido
127
+ to: Cliente
128
+ }
129
+ query buscar_pedidos {
130
+ mode: sql
131
+ }
132
+ }
133
+ ```
134
+
135
+ Exemplo documental:
136
+
137
+ ```sema
138
+ database principal_mongodb {
139
+ engine: mongodb
140
+ query_model: documento
141
+ collection pedidos {
142
+ collection: pedidos
143
+ }
144
+ document pedido_snapshot {
145
+ entity: PedidoSnapshot
146
+ }
147
+ query pipeline_pedido {
148
+ mode: pipeline
149
+ }
150
+ }
151
+ ```
152
+
153
+ Exemplo key-value:
154
+
155
+ ```sema
156
+ database principal_redis {
157
+ engine: redis
158
+ query_model: chave_valor
159
+ keyspace cache_pedidos {
160
+ ttl: "300s"
161
+ }
162
+ stream eventos_pedido {
163
+ surface: fila
164
+ }
165
+ }
166
+ ```
167
+
168
+ ## Compatibilidade declarada
169
+
170
+ O IR de persistencia calcula compatibilidade por recurso com quatro estados:
171
+
172
+ - `nativo`
173
+ - `adaptado`
174
+ - `parcial`
175
+ - `invalido`
176
+
177
+ Isso existe para deixar explicito quando um contrato esta pedindo de um banco algo que ele nao entrega do mesmo jeito.
@@ -0,0 +1,106 @@
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
+ }
@@ -0,0 +1,136 @@
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
+ }