@semacode/cli 1.5.11 → 1.5.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (177) hide show
  1. package/README.md +6 -1
  2. package/dist/index.js +446 -32
  3. package/package.json +23 -32
  4. package/semacode-cli-1.3.1.tgz +0 -0
  5. package/src/angular-consumer-standalone.ts +312 -0
  6. package/src/cpp-symbols.ts +82 -0
  7. package/src/docs.ts +535 -0
  8. package/src/dotnet-http.ts +355 -0
  9. package/src/drift.ts +4933 -0
  10. package/src/go-http.ts +118 -0
  11. package/src/importador.ts +3891 -0
  12. package/src/index.ts +5641 -0
  13. package/src/java-http.ts +247 -0
  14. package/src/lua-symbols.ts +114 -0
  15. package/src/php-symbols.ts +462 -0
  16. package/src/projeto.ts +862 -0
  17. package/src/python-http.ts +258 -0
  18. package/src/rust-http.ts +125 -0
  19. package/src/tipos.ts +24 -0
  20. package/src/typescript-http.ts +1076 -0
  21. package/tsconfig.json +20 -0
  22. package/AGENTS.md +0 -272
  23. package/LICENSE +0 -22
  24. package/SEMA_BRIEF.curto.txt +0 -9
  25. package/SEMA_BRIEF.md +0 -63
  26. package/SEMA_BRIEF.micro.txt +0 -7
  27. package/SEMA_INDEX.json +0 -799
  28. package/dist/angular-consumer-standalone.d.ts +0 -6
  29. package/dist/angular-consumer-standalone.js.map +0 -1
  30. package/dist/cpp-symbols.d.ts +0 -10
  31. package/dist/cpp-symbols.js.map +0 -1
  32. package/dist/docs.d.ts +0 -56
  33. package/dist/docs.js.map +0 -1
  34. package/dist/dotnet-http.d.ts +0 -23
  35. package/dist/dotnet-http.js.map +0 -1
  36. package/dist/drift.d.ts +0 -225
  37. package/dist/drift.js.map +0 -1
  38. package/dist/go-http.d.ts +0 -23
  39. package/dist/go-http.js.map +0 -1
  40. package/dist/importador.d.ts +0 -31
  41. package/dist/importador.js.map +0 -1
  42. package/dist/index.d.ts +0 -2
  43. package/dist/index.js.map +0 -1
  44. package/dist/java-http.d.ts +0 -23
  45. package/dist/java-http.js.map +0 -1
  46. package/dist/lua-symbols.d.ts +0 -10
  47. package/dist/lua-symbols.js.map +0 -1
  48. package/dist/php-symbols.d.ts +0 -24
  49. package/dist/php-symbols.js.map +0 -1
  50. package/dist/projeto.d.ts +0 -53
  51. package/dist/projeto.js.map +0 -1
  52. package/dist/python-http.d.ts +0 -23
  53. package/dist/python-http.js.map +0 -1
  54. package/dist/rust-http.d.ts +0 -23
  55. package/dist/rust-http.js.map +0 -1
  56. package/dist/tipos.d.ts +0 -3
  57. package/dist/tipos.js.map +0 -1
  58. package/dist/typescript-http.d.ts +0 -35
  59. package/dist/typescript-http.js.map +0 -1
  60. package/docs/AGENT_STARTER.md +0 -102
  61. package/docs/cli.md +0 -110
  62. package/docs/como-ensinar-a-sema-para-ia.md +0 -149
  63. package/docs/deploy.md +0 -70
  64. package/docs/documentacao.md +0 -63
  65. package/docs/env.md +0 -56
  66. package/docs/extensao-vscode.md +0 -45
  67. package/docs/fluxo-pratico-ia-sema.md +0 -177
  68. package/docs/instalacao-e-primeiro-uso.md +0 -112
  69. package/docs/integracao-com-ia.md +0 -101
  70. package/docs/mcp.md +0 -53
  71. package/docs/pagamento-ponta-a-ponta.md +0 -155
  72. package/docs/persistencia-vendor-first.md +0 -145
  73. package/docs/prompt-base-ia-sema.md +0 -104
  74. package/docs/rollback.md +0 -47
  75. package/docs/sintaxe.md +0 -244
  76. package/exemplos/agendamento.sema +0 -106
  77. package/exemplos/assinatura.sema +0 -136
  78. package/exemplos/auditoria.sema +0 -88
  79. package/exemplos/autenticacao.sema +0 -125
  80. package/exemplos/automacao.sema +0 -107
  81. package/exemplos/cadastro_usuario.sema +0 -54
  82. package/exemplos/calculadora.sema +0 -78
  83. package/exemplos/crud_simples.sema +0 -89
  84. package/exemplos/estoque.sema +0 -126
  85. package/exemplos/exportacao.sema +0 -94
  86. package/exemplos/fila.sema +0 -131
  87. package/exemplos/integracao_externa.sema +0 -94
  88. package/exemplos/multi_tenant.sema +0 -140
  89. package/exemplos/notificacao.sema +0 -98
  90. package/exemplos/operacao_estrategia.sema +0 -402
  91. package/exemplos/pagamento.sema +0 -222
  92. package/exemplos/pagamento_dominio.sema +0 -35
  93. package/exemplos/pedido.sema +0 -119
  94. package/exemplos/permissao.sema +0 -121
  95. package/exemplos/persistencia_vendor_first.sema +0 -86
  96. package/exemplos/relatorio.sema +0 -93
  97. package/exemplos/testes_embutidos.sema +0 -45
  98. package/exemplos/tratamento_erro.sema +0 -157
  99. package/exemplos/upload_arquivo.sema +0 -93
  100. package/exemplos/webhook.sema +0 -96
  101. package/llms-full.txt +0 -34
  102. package/llms.txt +0 -17
  103. package/node_modules/@sema/gerador-css/dist/index.d.ts +0 -3
  104. package/node_modules/@sema/gerador-css/dist/index.js +0 -592
  105. package/node_modules/@sema/gerador-css/dist/index.js.map +0 -1
  106. package/node_modules/@sema/gerador-css/package.json +0 -7
  107. package/node_modules/@sema/gerador-dart/dist/index.d.ts +0 -3
  108. package/node_modules/@sema/gerador-dart/dist/index.js +0 -44
  109. package/node_modules/@sema/gerador-dart/dist/index.js.map +0 -1
  110. package/node_modules/@sema/gerador-dart/package.json +0 -7
  111. package/node_modules/@sema/gerador-html/dist/index.d.ts +0 -3
  112. package/node_modules/@sema/gerador-html/dist/index.js +0 -163
  113. package/node_modules/@sema/gerador-html/dist/index.js.map +0 -1
  114. package/node_modules/@sema/gerador-html/package.json +0 -7
  115. package/node_modules/@sema/gerador-javascript/dist/index.d.ts +0 -3
  116. package/node_modules/@sema/gerador-javascript/dist/index.js +0 -421
  117. package/node_modules/@sema/gerador-javascript/dist/index.js.map +0 -1
  118. package/node_modules/@sema/gerador-javascript/package.json +0 -7
  119. package/node_modules/@sema/gerador-lua/dist/index.d.ts +0 -3
  120. package/node_modules/@sema/gerador-lua/dist/index.js +0 -328
  121. package/node_modules/@sema/gerador-lua/dist/index.js.map +0 -1
  122. package/node_modules/@sema/gerador-lua/package.json +0 -7
  123. package/node_modules/@sema/gerador-python/dist/index.d.ts +0 -6
  124. package/node_modules/@sema/gerador-python/dist/index.js +0 -729
  125. package/node_modules/@sema/gerador-python/dist/index.js.map +0 -1
  126. package/node_modules/@sema/gerador-python/package.json +0 -7
  127. package/node_modules/@sema/gerador-typescript/dist/index.d.ts +0 -6
  128. package/node_modules/@sema/gerador-typescript/dist/index.js +0 -793
  129. package/node_modules/@sema/gerador-typescript/dist/index.js.map +0 -1
  130. package/node_modules/@sema/gerador-typescript/package.json +0 -7
  131. package/node_modules/@sema/nucleo/dist/ast/tipos.d.ts +0 -123
  132. package/node_modules/@sema/nucleo/dist/ast/tipos.js +0 -2
  133. package/node_modules/@sema/nucleo/dist/ast/tipos.js.map +0 -1
  134. package/node_modules/@sema/nucleo/dist/diagnosticos/index.d.ts +0 -21
  135. package/node_modules/@sema/nucleo/dist/diagnosticos/index.js +0 -12
  136. package/node_modules/@sema/nucleo/dist/diagnosticos/index.js.map +0 -1
  137. package/node_modules/@sema/nucleo/dist/formatador/index.d.ts +0 -9
  138. package/node_modules/@sema/nucleo/dist/formatador/index.js +0 -460
  139. package/node_modules/@sema/nucleo/dist/formatador/index.js.map +0 -1
  140. package/node_modules/@sema/nucleo/dist/index.d.ts +0 -35
  141. package/node_modules/@sema/nucleo/dist/index.js +0 -96
  142. package/node_modules/@sema/nucleo/dist/index.js.map +0 -1
  143. package/node_modules/@sema/nucleo/dist/ir/conversor.d.ts +0 -5
  144. package/node_modules/@sema/nucleo/dist/ir/conversor.js +0 -883
  145. package/node_modules/@sema/nucleo/dist/ir/conversor.js.map +0 -1
  146. package/node_modules/@sema/nucleo/dist/ir/modelos.d.ts +0 -345
  147. package/node_modules/@sema/nucleo/dist/ir/modelos.js +0 -2
  148. package/node_modules/@sema/nucleo/dist/ir/modelos.js.map +0 -1
  149. package/node_modules/@sema/nucleo/dist/lexer/lexer.d.ts +0 -7
  150. package/node_modules/@sema/nucleo/dist/lexer/lexer.js +0 -122
  151. package/node_modules/@sema/nucleo/dist/lexer/lexer.js.map +0 -1
  152. package/node_modules/@sema/nucleo/dist/lexer/tokens.d.ts +0 -8
  153. package/node_modules/@sema/nucleo/dist/lexer/tokens.js +0 -61
  154. package/node_modules/@sema/nucleo/dist/lexer/tokens.js.map +0 -1
  155. package/node_modules/@sema/nucleo/dist/parser/parser.d.ts +0 -9
  156. package/node_modules/@sema/nucleo/dist/parser/parser.js +0 -771
  157. package/node_modules/@sema/nucleo/dist/parser/parser.js.map +0 -1
  158. package/node_modules/@sema/nucleo/dist/persistencia/contratos.d.ts +0 -39
  159. package/node_modules/@sema/nucleo/dist/persistencia/contratos.js +0 -294
  160. package/node_modules/@sema/nucleo/dist/persistencia/contratos.js.map +0 -1
  161. package/node_modules/@sema/nucleo/dist/semantico/analisador.d.ts +0 -57
  162. package/node_modules/@sema/nucleo/dist/semantico/analisador.js +0 -1617
  163. package/node_modules/@sema/nucleo/dist/semantico/analisador.js.map +0 -1
  164. package/node_modules/@sema/nucleo/dist/semantico/estruturas.d.ts +0 -104
  165. package/node_modules/@sema/nucleo/dist/semantico/estruturas.js +0 -445
  166. package/node_modules/@sema/nucleo/dist/semantico/estruturas.js.map +0 -1
  167. package/node_modules/@sema/nucleo/dist/semantico/seguranca.d.ts +0 -91
  168. package/node_modules/@sema/nucleo/dist/semantico/seguranca.js +0 -258
  169. package/node_modules/@sema/nucleo/dist/semantico/seguranca.js.map +0 -1
  170. package/node_modules/@sema/nucleo/dist/util/arquivos.d.ts +0 -2
  171. package/node_modules/@sema/nucleo/dist/util/arquivos.js +0 -25
  172. package/node_modules/@sema/nucleo/dist/util/arquivos.js.map +0 -1
  173. package/node_modules/@sema/nucleo/package.json +0 -7
  174. package/node_modules/@sema/padroes/dist/index.d.ts +0 -25
  175. package/node_modules/@sema/padroes/dist/index.js +0 -316
  176. package/node_modules/@sema/padroes/dist/index.js.map +0 -1
  177. package/node_modules/@sema/padroes/package.json +0 -7
package/docs/rollback.md DELETED
@@ -1,47 +0,0 @@
1
- # Rollback
2
-
3
- Rollback de release publica da Sema deve preservar rastreabilidade. NPM nao deve ser tratado como pasta temporaria: apagar versao publicada e medida extrema e limitada.
4
-
5
- ## Quando aplicar
6
-
7
- - CLI ou MCP publicados quebram instalacao basica.
8
- - VSIX publicada nao inicia ou quebra o Language Server.
9
- - Instaladores baixam asset errado.
10
- - Release notes ou checksums apontam para artefato invalido.
11
-
12
- ## Primeira resposta
13
-
14
- 1. Marque o problema no GitHub Release.
15
- 2. Reponte `latest` no NPM para a ultima versao boa, quando necessario:
16
-
17
- ```bash
18
- npm dist-tag add @semacode/cli@<versao-boa> latest
19
- npm dist-tag add @semacode/mcp@<versao-boa> latest
20
- ```
21
-
22
- 3. Se o problema for so VSIX ou asset de release, substitua o asset no GitHub Release ou publique uma release patch.
23
- 4. Prefira publicar patch corretivo (`1.5.10`, por exemplo) quando o pacote ja saiu para usuarios.
24
-
25
- ## Validacao de rollback
26
-
27
- ```bash
28
- npm view @semacode/cli dist-tags --json
29
- npm view @semacode/mcp dist-tags --json
30
- npm install -g @semacode/cli@latest
31
- npm install -g @semacode/mcp@latest
32
- sema --version
33
- sema-mcp --help
34
- ```
35
-
36
- ## Git
37
-
38
- Se o commit foi empurrado mas a release falhou antes de publicar NPM, corrija com novo commit. Evite reescrever `main` depois de push publico.
39
-
40
- Se o tag foi criado errado e ainda nao existe release consumida:
41
-
42
- ```bash
43
- git tag -d v<versao>
44
- git push origin :refs/tags/v<versao>
45
- ```
46
-
47
- Use isso somente antes de usuarios consumirem o tag.
package/docs/sintaxe.md DELETED
@@ -1,244 +0,0 @@
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.
178
-
179
- O mesmo principio vale para runtime de orquestracao. Superficies como `webhook`, `cron`, `worker`, `evento` e `fila` podem ser medidas contra familias como `n8n`, mas o contrato continua canonicamente modelado em Sema, sem rebaixar a linguagem para a sintaxe do adapter alvo.
180
-
181
- ## Interop e implementacao externa
182
-
183
- `use` e `impl` aceitam origens de codigo vivo quando o contrato precisa rastrear runtime real. As origens semanticas suportadas sao:
184
-
185
- - `ts`
186
- - `py`
187
- - `dart`
188
- - `lua`
189
- - `php`
190
- - `cs`
191
- - `java`
192
- - `go`
193
- - `rust`
194
- - `cpp`
195
-
196
- Exemplo com Lua:
197
-
198
- ```sema
199
- module app.runtime {
200
- use lua src.runtime
201
-
202
- task processar_snapshot {
203
- input {
204
- payload: Json required
205
- }
206
- output {
207
- resultado: Json
208
- }
209
- impl {
210
- lua: src.runtime.RuntimeBridge.processSnapshot
211
- }
212
- guarantees {
213
- resultado existe
214
- }
215
- }
216
- }
217
- ```
218
-
219
- Para Lua, o `drift` resolve funcoes declaradas como `function nome(...)`, `local function nome(...)`, `function Tabela.metodo(...)`, `function Tabela:metodo(...)` e atribuicoes `Tabela.metodo = function(...)`. A forma com `:` e normalizada para ponto no contrato.
220
-
221
- Exemplo com PHP:
222
-
223
- ```sema
224
- module app.php {
225
- use php App.Http.Controllers.UserController
226
-
227
- task criar_usuario {
228
- input {
229
- payload: Json required
230
- }
231
- output {
232
- resultado: Json
233
- }
234
- impl {
235
- php: App.Http.Controllers.UserController.store
236
- }
237
- guarantees {
238
- resultado existe
239
- }
240
- }
241
- }
242
- ```
243
-
244
- Para PHP, o `drift` resolve namespaces, classes, traits, interfaces, enums, metodos, funcoes, closures atribuidas, rotas Laravel/Slim (`Route::get`, `Route::post`, `$app->get`) e atributos HTTP no estilo Symfony/PHP 8 (`#[Route]`, `#[Get]`, `#[Post]`). `Route::resource` e `Route::apiResource` sao expandidos para acoes REST canonicas.
@@ -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
- }