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