vetra 0.1.0.pre.alpha.4
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.
- checksums.yaml +7 -0
- data/LICENSE +21 -0
- data/README.md +196 -0
- data/bin/vetra +6 -0
- data/docs/ir/v0.1.schema.json +941 -0
- data/docs/ir/v0.2.schema.json +951 -0
- data/docs/ir/v0.3.schema.json +961 -0
- data/lib/vetra/cli.rb +64 -0
- data/lib/vetra/graph/analysis.rb +94 -0
- data/lib/vetra/graph/canonical.rb +52 -0
- data/lib/vetra/graph/capabilities.rb +22 -0
- data/lib/vetra/graph/compiler.rb +119 -0
- data/lib/vetra/graph/currency.rb +28 -0
- data/lib/vetra/graph/data.rb +48 -0
- data/lib/vetra/graph/declaration_loader.rb +62 -0
- data/lib/vetra/graph/diagnostic.rb +23 -0
- data/lib/vetra/graph/diff.rb +412 -0
- data/lib/vetra/graph/diff_source.rb +51 -0
- data/lib/vetra/graph/dsl.rb +444 -0
- data/lib/vetra/graph/linked_graph.rb +26 -0
- data/lib/vetra/graph/linker.rb +95 -0
- data/lib/vetra/graph/live_dependencies.rb +48 -0
- data/lib/vetra/graph/manifest.rb +78 -0
- data/lib/vetra/graph/normalizer.rb +689 -0
- data/lib/vetra/graph/registry.rb +50 -0
- data/lib/vetra/graph/schema.rb +78 -0
- data/lib/vetra/graph/validator.rb +600 -0
- data/lib/vetra/version.rb +3 -0
- data/lib/vetra.rb +29 -0
- metadata +141 -0
checksums.yaml
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
SHA256:
|
|
3
|
+
metadata.gz: b86b8c6c0b5d01eaa87aef9034e0237fbb29bf0e154fe44fecd5adb3b3101890
|
|
4
|
+
data.tar.gz: '0880a89f19a9ad570a34b38b2434de8e2c979b1607bc5709c685be932faeac63'
|
|
5
|
+
SHA512:
|
|
6
|
+
metadata.gz: a26b289cefeed49b0aadd23d0016e7b51adff2fbfad8c7d3d818ecf3a3bb8d7e3e9d0196e60d4b4aa2bae8d2df48784b5b4bce6aaf7fa521a1ac4aa038f7337d
|
|
7
|
+
data.tar.gz: 280011e13348cf28bfdaf77aff685b9ad004ad3571a379ab9a804bb5bb3d6bce104506148d5fcceccdd9a216243f498ff05ee72fe1512c769176a3f22e43bfbb
|
data/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Denilson Silva
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
data/README.md
ADDED
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
<p align="center">
|
|
2
|
+
<picture>
|
|
3
|
+
<source media="(prefers-color-scheme: dark)" srcset="logo/vetra-logo-dark.svg">
|
|
4
|
+
<img src="logo/vetra-logo.svg" alt="Vetra" width="360">
|
|
5
|
+
</picture>
|
|
6
|
+
</p>
|
|
7
|
+
|
|
8
|
+
<p align="center">
|
|
9
|
+
Aplicações Ruby descritas como um grafo verificável.
|
|
10
|
+
</p>
|
|
11
|
+
|
|
12
|
+
O **Vetra** é um framework web em desenvolvimento para **Ruby 4 e PostgreSQL**. Entidades, comandos,
|
|
13
|
+
consultas, permissões e eventos formam um modelo explícito da aplicação: o **Grafo da Aplicação**.
|
|
14
|
+
|
|
15
|
+
Esse modelo permite conferir contratos, dependências e regras declarativas, identificar inconsistências
|
|
16
|
+
e revisar mudanças de arquitetura junto com o código.
|
|
17
|
+
|
|
18
|
+
> **Estado atual: protótipo da fase 0.** O repositório entrega um compilador experimental, ferramentas de
|
|
19
|
+
> validação, diff e vinculação de implementações. A execução dos comandos de negócio, o servidor web e a
|
|
20
|
+
> persistência ainda não existem. Veja a [situação do projeto](docs/situacao-do-projeto.md) para acompanhar
|
|
21
|
+
> entregas, pendências e evidências.
|
|
22
|
+
|
|
23
|
+
## O que já funciona
|
|
24
|
+
|
|
25
|
+
O compilador transforma declarações Ruby em uma **representação intermediária (IR) versionada**, gravada em
|
|
26
|
+
`.vetra/graph.json`. O artefato usa JSON canônico, inclui hashes dos fontes e faz parte da revisão no Git.
|
|
27
|
+
|
|
28
|
+
```mermaid
|
|
29
|
+
flowchart LR
|
|
30
|
+
A["DSL Ruby"] --> B["IR 0.3 validada"]
|
|
31
|
+
B --> C["Diff arquitetural"]
|
|
32
|
+
B --> D["Vinculação Ruby"]
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
| Área | Disponível no protótipo |
|
|
36
|
+
|---|---|
|
|
37
|
+
| Modelo de dados | Entidades com `created_at` implícito, tipos, `money` com escala por moeda, relações, índices e chaves compostas por tenant |
|
|
38
|
+
| Operações | Contratos CRUD, consultas com registros, coleções e saídas compostas, comandos, eventos e handlers no grafo |
|
|
39
|
+
| Autorização declarativa | Papéis e políticas com escopo por autor, dono ou vínculo, com validação das referências e dependências |
|
|
40
|
+
| Consultas live | Declaração de modo e dependências de dados e autorização; assinaturas e entrega ainda pendentes |
|
|
41
|
+
| Exposições | Declarações de HTTP, CLI, job e webhook, com conferência de rotas, destinos e idempotência exigida |
|
|
42
|
+
| Revisão | Diff de contratos, permissões, capacidades, privacidade, transições e metadados |
|
|
43
|
+
| Vinculação | Conferência do artefato, dos fontes e dos blocos Ruby, sem executar operações |
|
|
44
|
+
|
|
45
|
+
O [guia da fase 0](docs/fase-0.md) detalha o DSL suportado e o alcance da análise estática dos blocos Ruby.
|
|
46
|
+
|
|
47
|
+
## Experimente o compilador
|
|
48
|
+
|
|
49
|
+
Use **Ruby 4.0.9**, conforme [.ruby-version](.ruby-version), e Bundler. A compilação dos exemplos e a suíte
|
|
50
|
+
do compilador funcionam sem um banco de dados. As sondas de PostgreSQL têm requisitos próprios, descritos nos
|
|
51
|
+
[ADRs](docs/adr/README.md#sondas).
|
|
52
|
+
|
|
53
|
+
Na raiz do repositório:
|
|
54
|
+
|
|
55
|
+
```sh
|
|
56
|
+
bundle install
|
|
57
|
+
bundle exec bin/vetra graph:build --root examples/blog
|
|
58
|
+
bundle exec bin/vetra graph:check --root examples/blog
|
|
59
|
+
bundle exec bin/vetra graph:validate --root examples/blog --sources
|
|
60
|
+
bundle exec bin/vetra graph:link --root examples/blog
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
O build grava [examples/blog/.vetra/graph.json](examples/blog/.vetra/graph.json). O check compara esse
|
|
64
|
+
arquivo com os fontes; o link confere o pacote e associa as implementações aos blocos declarados. Essas
|
|
65
|
+
etapas não iniciam um servidor nem executam o comando `publish_post`.
|
|
66
|
+
|
|
67
|
+
Para comparar o grafo atual com o que está no último commit:
|
|
68
|
+
|
|
69
|
+
```sh
|
|
70
|
+
bundle exec bin/vetra graph:diff git:HEAD examples/blog/.vetra/graph.json --root examples/blog
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
| Comando | Finalidade |
|
|
74
|
+
|---|---|
|
|
75
|
+
| `graph:build` | Compilar, validar e gravar o grafo |
|
|
76
|
+
| `graph:check` | Detectar artefato ausente, editado ou desatualizado, sem regravá-lo |
|
|
77
|
+
| `graph:validate` | Validar uma IR; com `--sources`, também conferir o manifesto e os hashes dos fontes |
|
|
78
|
+
| `graph:diff` | Comparar arquivos ou revisões Git e destacar mudanças que exigem revisão |
|
|
79
|
+
| `graph:link` | Vincular o código ao artefato validado e verificar sua correspondência |
|
|
80
|
+
|
|
81
|
+
## Um comando em Ruby
|
|
82
|
+
|
|
83
|
+
Este é o comando de publicação do [exemplo de blog](examples/blog). Sua entidade e suas políticas estão em
|
|
84
|
+
[post.rb](examples/blog/app/domains/blog/post.rb) e [roles.rb](examples/blog/app/domains/blog/roles.rb).
|
|
85
|
+
|
|
86
|
+
```ruby
|
|
87
|
+
# app/domains/blog/publish_post.rb
|
|
88
|
+
command :publish_post do
|
|
89
|
+
input :post_id, :id
|
|
90
|
+
returns :post
|
|
91
|
+
authorize :update, :post, record: :post_id
|
|
92
|
+
uses :posts, :clock
|
|
93
|
+
emits "blog.post.published", with: %i[id]
|
|
94
|
+
|
|
95
|
+
call do |input, posts, clock|
|
|
96
|
+
post = posts.lock!(input.post_id)
|
|
97
|
+
fail! :status, "só rascunhos podem ser publicados" unless post.status == "draft"
|
|
98
|
+
posts.update!(post, status: "published", published_at: clock.now)
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
expose http: "POST /posts/:post_id/publish"
|
|
102
|
+
end
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
`uses` declara as capacidades recebidas pelo bloco. `returns` identifica o contrato de saída; `authorize`
|
|
106
|
+
registra a ação e o registro a autorizar; `emits` declara o evento. A exposição HTTP aponta para essa mesma
|
|
107
|
+
operação. O compilador registra e verifica essas relações; a execução depende do futuro motor de operações.
|
|
108
|
+
|
|
109
|
+
## Exemplos disponíveis
|
|
110
|
+
|
|
111
|
+
| Diretório | O que demonstra hoje |
|
|
112
|
+
|---|---|
|
|
113
|
+
| [examples/blog](examples/blog) | Aplicação sem tenant, escopo do autor, publicação e campos protegidos |
|
|
114
|
+
| [examples/mini_crm](examples/mini_crm) | Tenant, `money`, transição, evento, handler e quatro superfícies de exposição |
|
|
115
|
+
| [examples/mini_crm_revendas](examples/mini_crm_revendas) | Revendas, vendedores e papéis com escopo por vínculo |
|
|
116
|
+
| [examples/chat](examples/chat) | Salas, consultas tipadas, declaração live com dependências de autorização, membros por ID e inclusão por e-mail interna |
|
|
117
|
+
|
|
118
|
+
Os diretórios contêm recortes compiláveis da fase 0. Autenticação, telas, persistência e entrega em tempo
|
|
119
|
+
real continuam pendentes. Troque `--root examples/blog` pelo diretório desejado para inspecionar outro exemplo.
|
|
120
|
+
|
|
121
|
+
As árvores **“Estrutura em Vetra”** dos PDFs descrevem a organização prevista para as aplicações, com pastas
|
|
122
|
+
resumidas e alguns componentes gerados omitidos. Elas incluem funcionalidades futuras; o conteúdo disponível
|
|
123
|
+
para compilar hoje está nos diretórios acima.
|
|
124
|
+
|
|
125
|
+
## Direção do projeto
|
|
126
|
+
|
|
127
|
+
A base definida nos ADRs reúne quatro componentes:
|
|
128
|
+
|
|
129
|
+
1. **Grafo da Aplicação:** modelo compilado e versionado, implementado parcialmente nesta fase.
|
|
130
|
+
2. **Motor de operações:** comandos e consultas com contratos, autorização e adaptadores para cada superfície.
|
|
131
|
+
3. **Motor de autorização:** execução das políticas e dos escopos declarados no grafo.
|
|
132
|
+
4. **Vetra Data:** persistência com Sequel e PostgreSQL, isolamento de linhas (RLS) e contexto assinado.
|
|
133
|
+
|
|
134
|
+
Sobre essa base, o projeto prevê consultas reativas, workflows duráveis, recursos de privacidade e auditoria,
|
|
135
|
+
UI e operações MCP com identidade delegada. A adoção planejada começa em aplicações Rails existentes, um
|
|
136
|
+
domínio por vez. A integração com Rails também está pendente. Ruby::Box e execução com Ractors são extensões
|
|
137
|
+
opcionais; o compilador atual funciona sem elas.
|
|
138
|
+
|
|
139
|
+
O próximo trabalho está detalhado na [situação do projeto](docs/situacao-do-projeto.md#7-próximos-passos-propostos).
|
|
140
|
+
A [matriz de aceitação da fase 0](docs/fase-0-criterios.md) registra as evidências e os critérios ainda parciais.
|
|
141
|
+
|
|
142
|
+
## Testes e contribuição
|
|
143
|
+
|
|
144
|
+
Execute a suíte completa com a verificação de cobertura dos códigos de diagnóstico:
|
|
145
|
+
|
|
146
|
+
```sh
|
|
147
|
+
bundle exec rake test:diagnostics
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
Essa também é a tarefa padrão de `bundle exec rake`. A [CI](.github/workflows/ci.yml) verifica os testes,
|
|
151
|
+
os artefatos dos exemplos, a vinculação e o diff arquitetural em PRs e pushes na `main`, além das sondas de
|
|
152
|
+
banco no PostgreSQL 17 e 18. As mudanças entram direto na `main`, sem PR; o [fluxo de integração](docs/graph-diff.md#fluxo-de-integração-e-ci)
|
|
153
|
+
descreve o gate que roda antes do push e o registro de quebras intencionais por digest.
|
|
154
|
+
|
|
155
|
+
Ao alterar o modelo de um exemplo, reconstrua seu grafo com `graph:build`, revise o `graph:diff` e inclua
|
|
156
|
+
o artefato atualizado na mudança. Acrescente casos de erro às novas regras e mantenha a documentação e a
|
|
157
|
+
situação do projeto coerentes com o código. O [guia da fase 0](docs/fase-0.md) explica o DSL suportado e os
|
|
158
|
+
limites da análise.
|
|
159
|
+
|
|
160
|
+
## Documentação
|
|
161
|
+
|
|
162
|
+
| Documento | Conteúdo |
|
|
163
|
+
|---|---|
|
|
164
|
+
| [Situação do projeto](docs/situacao-do-projeto.md) | Entregas, pendências e estado atual |
|
|
165
|
+
| [Guia da fase 0](docs/fase-0.md) | Execução, DSL implementado e limites do protótipo |
|
|
166
|
+
| [Critérios da fase 0](docs/fase-0-criterios.md) | Cobertura e evidências de aceitação |
|
|
167
|
+
| [Diff arquitetural](docs/graph-diff.md) | Contratos, permissões, referências Git e relatório JSON |
|
|
168
|
+
| [Vinculação de implementações](docs/graph-link.md) | Integridade do pacote, registro Ruby e dados compartilháveis |
|
|
169
|
+
| [IR 0.1, 0.2 e 0.3](docs/ir/README.md) | Schemas, exemplos documentais e compatibilidade |
|
|
170
|
+
| [Índice de ADRs](docs/adr/README.md) | Decisões de arquitetura, resoluções e status de cada proposta |
|
|
171
|
+
|
|
172
|
+
O [ADR-001](docs/adr/001-grafo-da-aplicacao-e-ir.md) define o contrato do grafo, e o
|
|
173
|
+
[ADR-016](docs/adr/016-ciclo-de-vida-da-operacao.md) define o ciclo de vida das operações.
|
|
174
|
+
|
|
175
|
+
Os PDFs preservam a proposta e suas revisões; os ADRs registram as decisões posteriores:
|
|
176
|
+
|
|
177
|
+
- [Proposta técnica](docs/proposta-tecnica.pdf).
|
|
178
|
+
- Comparações com Rails: [Mini CRM](docs/exemplos/01-mini-crm.pdf), [Blog](docs/exemplos/02-blog.pdf) e
|
|
179
|
+
[Chat](docs/exemplos/03-chat.pdf).
|
|
180
|
+
- [Histórico de revisões](docs/revisoes.pdf) e [pendências da rodada 7](docs/pendencias-rodada-7.pdf).
|
|
181
|
+
|
|
182
|
+
## Mapa do repositório
|
|
183
|
+
|
|
184
|
+
| Caminho | Conteúdo |
|
|
185
|
+
|---|---|
|
|
186
|
+
| [bin/vetra](bin/vetra) | Entrada da CLI |
|
|
187
|
+
| [lib/vetra/](lib/vetra) | DSL, compilador, validador, diff e vinculação |
|
|
188
|
+
| [examples/](examples) | Modelos compiláveis e seus artefatos versionados |
|
|
189
|
+
| [test/](test) | Testes do compilador, da CLI e dos exemplos |
|
|
190
|
+
| [script/](script) | Sondas dos ADRs e simulação do gate da CI |
|
|
191
|
+
| [docs/](docs) | Guias, ADRs, schema e documentos da proposta |
|
|
192
|
+
| [logo/](logo) | Identidade visual |
|
|
193
|
+
|
|
194
|
+
## Licença
|
|
195
|
+
|
|
196
|
+
[MIT](LICENSE). A governança do projeto ainda está em aberto (veja as questões em aberto na proposta).
|