@semacode/cli 1.5.18 → 1.5.19

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 (93) hide show
  1. package/AGENTS.md +268 -260
  2. package/LICENSE +22 -22
  3. package/README.md +144 -104
  4. package/SEMA_BRIEF.curto.txt +7 -5
  5. package/SEMA_BRIEF.md +60 -4
  6. package/SEMA_BRIEF.micro.txt +6 -4
  7. package/SEMA_INDEX.json +917 -41
  8. package/dist/controleComercialSupabase.d.ts +326 -0
  9. package/dist/controleComercialSupabase.js +310 -0
  10. package/dist/controleComercialSupabase.js.map +1 -0
  11. package/dist/docs.js +48 -20
  12. package/dist/docs.js.map +1 -1
  13. package/dist/drift.d.ts +5 -3
  14. package/dist/drift.js +123 -14
  15. package/dist/drift.js.map +1 -1
  16. package/dist/index.js +1889 -38
  17. package/dist/index.js.map +1 -1
  18. package/dist/mcpRemoto.d.ts +32 -0
  19. package/dist/mcpRemoto.js +61 -0
  20. package/dist/mcpRemoto.js.map +1 -0
  21. package/dist/projeto.js +3 -1
  22. package/dist/projeto.js.map +1 -1
  23. package/docs/AGENT_STARTER.md +103 -97
  24. package/docs/cli.md +175 -106
  25. package/docs/como-ensinar-a-sema-para-ia.md +41 -35
  26. package/docs/deploy.md +231 -43
  27. package/docs/documentacao.md +61 -36
  28. package/docs/env.md +105 -56
  29. package/docs/extensao-vscode.md +12 -4
  30. package/docs/fluxo-pratico-ia-sema.md +182 -176
  31. package/docs/instalacao-e-primeiro-uso.md +52 -30
  32. package/docs/integracao-com-ia.md +108 -101
  33. package/docs/mcp.md +292 -51
  34. package/docs/pagamento-ponta-a-ponta.md +34 -28
  35. package/docs/persistencia-vendor-first.md +11 -5
  36. package/docs/prompt-base-ia-sema.md +13 -7
  37. package/docs/rollback.md +17 -15
  38. package/docs/sintaxe.md +180 -174
  39. package/exemplos/agendamento.sema +105 -105
  40. package/exemplos/assinatura.sema +133 -133
  41. package/exemplos/auditoria.sema +89 -89
  42. package/exemplos/autenticacao.sema +125 -125
  43. package/exemplos/author_obra_comum.sema +294 -0
  44. package/exemplos/author_tema_sensivel.sema +264 -0
  45. package/exemplos/automacao.sema +107 -107
  46. package/exemplos/cadastro_usuario.sema +54 -54
  47. package/exemplos/calculadora.sema +78 -78
  48. package/exemplos/crud_simples.sema +89 -89
  49. package/exemplos/estoque.sema +127 -127
  50. package/exemplos/exportacao.sema +94 -94
  51. package/exemplos/fila.sema +130 -130
  52. package/exemplos/integracao_externa.sema +94 -94
  53. package/exemplos/multi_tenant.sema +140 -140
  54. package/exemplos/notificacao.sema +149 -149
  55. package/exemplos/operacao_estrategia.sema +633 -633
  56. package/exemplos/pagamento.sema +434 -434
  57. package/exemplos/pagamento_dominio.sema +35 -35
  58. package/exemplos/pedido.sema +255 -255
  59. package/exemplos/permissao.sema +121 -121
  60. package/exemplos/persistencia_vendor_first.sema +86 -86
  61. package/exemplos/profile_game.sema +114 -0
  62. package/exemplos/profile_legal.sema +105 -0
  63. package/exemplos/profile_ops.sema +110 -0
  64. package/exemplos/profile_research.sema +104 -0
  65. package/exemplos/profile_software.sema +123 -0
  66. package/exemplos/profile_workflow_n8n.sema +99 -0
  67. package/exemplos/relatorio.sema +93 -93
  68. package/exemplos/replica_analitica_erp.sema +160 -160
  69. package/exemplos/testes_embutidos.sema +45 -45
  70. package/exemplos/tratamento_erro.sema +157 -157
  71. package/exemplos/upload_arquivo.sema +93 -93
  72. package/exemplos/webhook.sema +94 -94
  73. package/llms-full.txt +34 -34
  74. package/llms.txt +17 -17
  75. package/node_modules/@sema/gerador-css/dist/index.js +563 -563
  76. package/node_modules/@sema/gerador-css/package.json +1 -1
  77. package/node_modules/@sema/gerador-dart/package.json +1 -1
  78. package/node_modules/@sema/gerador-html/dist/index.js +90 -90
  79. package/node_modules/@sema/gerador-html/package.json +1 -1
  80. package/node_modules/@sema/gerador-javascript/dist/index.js +92 -92
  81. package/node_modules/@sema/gerador-javascript/package.json +1 -1
  82. package/node_modules/@sema/gerador-lua/dist/index.js +53 -53
  83. package/node_modules/@sema/gerador-lua/package.json +1 -1
  84. package/node_modules/@sema/gerador-python/dist/index.js +122 -96
  85. package/node_modules/@sema/gerador-python/dist/index.js.map +1 -1
  86. package/node_modules/@sema/gerador-python/package.json +1 -1
  87. package/node_modules/@sema/gerador-typescript/dist/index.js +153 -153
  88. package/node_modules/@sema/gerador-typescript/package.json +1 -1
  89. package/node_modules/@sema/nucleo/dist/formatador/index.js +12 -4
  90. package/node_modules/@sema/nucleo/dist/formatador/index.js.map +1 -1
  91. package/node_modules/@sema/nucleo/package.json +1 -1
  92. package/node_modules/@sema/padroes/package.json +1 -1
  93. package/package.json +11 -11
@@ -0,0 +1,110 @@
1
+ module exemplos.profile.ops {
2
+ docs {
3
+ resumo: "Starter do Profile Ops: contrato primeiro. Criar, editar ou remover contrato antes de qualquer acao; depois runbook, rollback, recuperacao, healthcheck, metricas, logs, traces, observabilidade, incidente, severidade, responsavel, oncall, segredos, acesso e authz."
4
+ }
5
+
6
+ type RunbookOperacional {
7
+ fields {
8
+ runbook: Texto
9
+ rollback: Texto
10
+ healthcheck: Texto
11
+ responsavel: Texto
12
+ severidade: Texto
13
+ }
14
+ invariants {
15
+ runbook existe
16
+ rollback existe
17
+ healthcheck existe
18
+ responsavel existe
19
+ severidade existe
20
+ }
21
+ }
22
+
23
+ task validar_operacao_deploy {
24
+ input {
25
+ runbook: Texto required
26
+ rollback: Texto required
27
+ healthcheck: Texto required
28
+ responsavel: Texto required
29
+ recuperacao: Texto
30
+ metricas: Texto
31
+ logs: Texto
32
+ traces: Texto
33
+ observabilidade: Texto
34
+ incidente: Texto
35
+ severidade: Texto
36
+ segredos: Texto
37
+ acesso: Texto
38
+ authz: Texto
39
+ }
40
+ output {
41
+ operavel: Booleano
42
+ bloqueios: Lista
43
+ }
44
+ rules {
45
+ runbook deve_ser preenchido
46
+ rollback deve_ser testado
47
+ recuperacao deve_ser declarada
48
+ healthcheck deve_ser verificavel
49
+ metricas deve_ser declaradas
50
+ logs deve_ser preservados
51
+ traces deve_ser opcionais
52
+ observabilidade deve_ser suficiente
53
+ incidente deve_ser classificado
54
+ severidade deve_ser definida
55
+ responsavel deve_ser oncall
56
+ segredos deve_ser protegidos
57
+ acesso deve_ser limitado
58
+ authz deve_ser revisado
59
+ }
60
+ effects {
61
+ auditoria ops_deploy criticidade = media
62
+ }
63
+ authz {
64
+ escopo: ops.validar_deploy
65
+ tenant: opcional
66
+ }
67
+ dados {
68
+ classificacao_padrao: interno
69
+ redacao_log: obrigatoria
70
+ }
71
+ audit {
72
+ evento: exemplos.ops.deploy.validado
73
+ ator: operador
74
+ correlacao: request_id
75
+ retencao: "90d"
76
+ motivo: obrigatorio
77
+ }
78
+ forbidden {
79
+ deploy_sem_rollback
80
+ secret_em_log
81
+ incidente_sem_responsavel
82
+ }
83
+ execucao {
84
+ idempotencia: verdadeiro
85
+ timeout: "15s"
86
+ retry: "nenhum"
87
+ compensacao: "rollback"
88
+ criticidade_operacional: media
89
+ }
90
+ guarantees {
91
+ operavel existe
92
+ bloqueios existe
93
+ }
94
+ tests {
95
+ caso "deploy operavel" {
96
+ given {
97
+ runbook: "runbook de incidente com severidade"
98
+ rollback: "rollback testado"
99
+ healthcheck: "healthcheck metricas logs traces"
100
+ responsavel: "oncall"
101
+ }
102
+
103
+ expect {
104
+ sucesso: verdadeiro
105
+ operavel: verdadeiro
106
+ }
107
+ }
108
+ }
109
+ }
110
+ }
@@ -0,0 +1,104 @@
1
+ module exemplos.profile.research {
2
+ docs {
3
+ resumo: "Starter do Profile Research: contrato primeiro. Criar, editar ou remover contrato antes de qualquer acao; depois pergunta, hipotese, metodo, metodologia, fonte, citacao, referencia, evidencia, confianca, qualidade, incerteza, lacuna, limite, conclusao, protocolo, dataset, dados, reprodutibilidade e replicacao."
4
+ }
5
+
6
+ type PlanoPesquisa {
7
+ fields {
8
+ pergunta: Texto
9
+ metodologia: Texto
10
+ fontes: Lista
11
+ evidencias: Lista
12
+ limites: Lista
13
+ }
14
+ invariants {
15
+ pergunta existe
16
+ metodologia existe
17
+ fontes existe
18
+ evidencias existe
19
+ limites existe
20
+ }
21
+ }
22
+
23
+ task validar_plano_pesquisa {
24
+ input {
25
+ pergunta: Texto required
26
+ metodologia: Texto required
27
+ fonte: Texto required
28
+ evidencia: Texto required
29
+ hipotese: Texto
30
+ metodo: Texto
31
+ citacao: Texto
32
+ referencia: Texto
33
+ confianca: Texto
34
+ qualidade: Texto
35
+ incerteza: Texto
36
+ lacuna: Texto
37
+ limite: Texto
38
+ conclusao: Texto
39
+ protocolo: Texto
40
+ dataset: Texto
41
+ dados: Texto
42
+ reprodutibilidade: Texto
43
+ replicacao: Texto
44
+ }
45
+ output {
46
+ aprovado: Booleano
47
+ lacunas: Lista
48
+ }
49
+ rules {
50
+ pergunta deve_ser especifica
51
+ hipotese deve_ser declarada
52
+ metodo deve_ser reproduzivel
53
+ metodologia deve_ser explicita
54
+ fonte deve_ser citavel
55
+ citacao deve_ser verificavel
56
+ referencia deve_ser preservada
57
+ evidencia deve_ser qualificada
58
+ confianca deve_ser estimada
59
+ qualidade deve_ser avaliada
60
+ incerteza deve_ser declarada
61
+ lacuna deve_ser registrada
62
+ limite deve_ser declarado
63
+ conclusao deve_ser sustentada
64
+ protocolo deve_ser versionado
65
+ dataset deve_ser identificado
66
+ dados deve_ser preservados
67
+ reprodutibilidade deve_ser possivel
68
+ replicacao deve_ser planejada
69
+ }
70
+ effects {
71
+ auditoria research_plano criticidade = media
72
+ }
73
+ forbidden {
74
+ conclusao_sem_evidencia
75
+ citacao_inventada
76
+ incerteza_oculta
77
+ }
78
+ execucao {
79
+ idempotencia: verdadeiro
80
+ timeout: "15s"
81
+ retry: "nenhum"
82
+ criticidade_operacional: media
83
+ }
84
+ guarantees {
85
+ aprovado existe
86
+ lacunas existe
87
+ }
88
+ tests {
89
+ caso "pesquisa tem metodo e evidencia" {
90
+ given {
91
+ pergunta: "qual adapter reduz drift em workflow"
92
+ metodologia: "comparacao controlada"
93
+ fonte: "referencia primaria com citacao"
94
+ evidencia: "dataset com dados e confianca"
95
+ }
96
+
97
+ expect {
98
+ sucesso: verdadeiro
99
+ aprovado: verdadeiro
100
+ }
101
+ }
102
+ }
103
+ }
104
+ }
@@ -0,0 +1,123 @@
1
+ module exemplos.profile.software {
2
+ docs {
3
+ resumo: "Starter do Profile Software: contrato primeiro. Criar, editar ou remover contrato antes de qualquer acao; depois codigo vivo, drift, impacto, vinculos rastreaveis, arquivo, simbolo, validar, verificar, checks e testes."
4
+ }
5
+
6
+ type MudancaSoftware {
7
+ fields {
8
+ contrato: Texto
9
+ codigo_vivo: Texto
10
+ drift: Texto
11
+ impacto: Texto
12
+ checks: Lista
13
+ }
14
+ invariants {
15
+ contrato existe
16
+ codigo_vivo existe
17
+ drift existe
18
+ impacto existe
19
+ checks existe
20
+ }
21
+ }
22
+
23
+ task declarar_mudanca_contract_first {
24
+ input {
25
+ contrato: Texto required
26
+ codigo_vivo: Texto required
27
+ arquivo: Texto required
28
+ simbolo: Texto required
29
+ vinculos: Texto
30
+ impl: Texto
31
+ }
32
+ output {
33
+ mudanca: MudancaSoftware
34
+ pode_editar: Booleano
35
+ }
36
+ rules {
37
+ contrato deve_ser preenchido
38
+ codigo_vivo deve_ser declarado
39
+ arquivo deve_ser rastreavel
40
+ simbolo deve_ser rastreavel
41
+ vinculos deve_ser explicitos
42
+ impl deve_ser coerente
43
+ }
44
+ effects {
45
+ auditoria profile_software_mudanca criticidade = media
46
+ }
47
+ forbidden {
48
+ codigo_sem_contrato
49
+ editar_sem_drift
50
+ finalizar_sem_checks
51
+ }
52
+ execucao {
53
+ idempotencia: verdadeiro
54
+ timeout: "10s"
55
+ criticidade_operacional: media
56
+ }
57
+ guarantees {
58
+ mudanca existe
59
+ pode_editar == verdadeiro
60
+ }
61
+ tests {
62
+ caso "mudanca pronta para codigo" {
63
+ given {
64
+ contrato: "contrato validado"
65
+ codigo_vivo: "implementacao existente"
66
+ arquivo: "src/pedidos.ts"
67
+ simbolo: "criarPedido"
68
+ }
69
+
70
+ expect {
71
+ sucesso: verdadeiro
72
+ pode_editar: verdadeiro
73
+ }
74
+ }
75
+ }
76
+ }
77
+
78
+ task fechar_mudanca_com_verificacao {
79
+ input {
80
+ drift: Texto required
81
+ impacto: Texto required
82
+ validar: Texto required
83
+ verificar: Texto required
84
+ testes: Lista required
85
+ checks: Lista
86
+ }
87
+ output {
88
+ concluida: Booleano
89
+ bloqueios: Lista
90
+ }
91
+ rules {
92
+ drift deve_ser executado
93
+ impacto deve_ser mapeado
94
+ validar deve_ser executado
95
+ verificar deve_ser executado
96
+ testes deve_ser nao_vazio
97
+ checks deve_ser completos
98
+ }
99
+ effects {
100
+ auditoria profile_software_fechamento criticidade = media
101
+ }
102
+ guarantees {
103
+ concluida existe
104
+ bloqueios existe
105
+ }
106
+ tests {
107
+ caso "fecha com checks completos" {
108
+ given {
109
+ drift: "sem divergencia"
110
+ impacto: "mapa calculado"
111
+ validar: "sema validar"
112
+ verificar: "sema verificar"
113
+ testes: "npm test"
114
+ }
115
+
116
+ expect {
117
+ sucesso: verdadeiro
118
+ concluida: verdadeiro
119
+ }
120
+ }
121
+ }
122
+ }
123
+ }
@@ -0,0 +1,99 @@
1
+ module exemplos.profile.workflow_n8n {
2
+ docs {
3
+ resumo: "Starter do Profile Workflow para n8n: contrato primeiro. Criar, editar ou remover contrato antes de qualquer acao; depois runtime workflow como alvo de compatibilidade, adapter adaptado, scorecard parcial, webhook, cron, HTTP, branching, transformacao, authz, audit, compensacao e guarantees."
4
+ }
5
+
6
+ type RuntimeN8n {
7
+ fields {
8
+ runtime: Texto
9
+ adapter: Texto
10
+ compatibilidade: Texto
11
+ scorecard: Texto
12
+ lacunas: Lista
13
+ }
14
+ invariants {
15
+ runtime existe
16
+ adapter existe
17
+ compatibilidade existe
18
+ scorecard existe
19
+ lacunas existe
20
+ }
21
+ }
22
+
23
+ task validar_workflow_n8n {
24
+ input {
25
+ runtime: Texto required
26
+ adapter: Texto required
27
+ scorecard: Texto required
28
+ compatibilidade: Texto
29
+ webhook: Texto
30
+ cron: Texto
31
+ http: Texto
32
+ branching: Texto
33
+ transformacao: Texto
34
+ authz: Texto
35
+ audit: Texto
36
+ compensacao: Texto
37
+ guarantees: Texto
38
+ }
39
+ output {
40
+ runtime_validado: RuntimeN8n
41
+ aprovado: Booleano
42
+ }
43
+ rules {
44
+ runtime deve_ser workflow
45
+ adapter deve_ser n8n
46
+ compatibilidade deve_ser parcial
47
+ scorecard deve_ser calculado
48
+ webhook deve_ser mapeado
49
+ cron deve_ser mapeado
50
+ http deve_ser mapeado
51
+ branching deve_ser mapeado
52
+ transformacao deve_ser mapeada
53
+ authz deve_ser declarado
54
+ audit deve_ser declarado
55
+ compensacao deve_ser declarada
56
+ guarantees deve_ser declaradas
57
+ }
58
+ effects {
59
+ auditoria workflow_n8n_scorecard criticidade = media
60
+ }
61
+ forbidden {
62
+ equivalencia_total_falsa
63
+ n8n_como_linguagem_canonica
64
+ node_sem_contrato
65
+ }
66
+ execucao {
67
+ idempotencia: verdadeiro
68
+ timeout: "10s"
69
+ compensacao: "bloquear_publicacao_do_workflow"
70
+ criticidade_operacional: media
71
+ }
72
+ guarantees {
73
+ runtime_validado existe
74
+ aprovado existe
75
+ }
76
+ tests {
77
+ caso "n8n e adapter honesto" {
78
+ given {
79
+ runtime: "workflow n8n"
80
+ adapter: "adapter adaptado"
81
+ scorecard: "webhook cron HTTP branching transformacao nativos; authz audit compensacao guarantees parciais"
82
+ }
83
+
84
+ expect {
85
+ sucesso: verdadeiro
86
+ aprovado: verdadeiro
87
+ }
88
+ }
89
+ }
90
+ }
91
+
92
+ flow onboarding_por_n8n {
93
+ lead_id: Id
94
+ email: Email
95
+ etapa receber usa validar_workflow_n8n com runtime = "workflow n8n", adapter = "n8n", scorecard = "webhook cron HTTP branching transformacao com lacunas authz audit compensacao guarantees" em_sucesso concluir em_erro bloquear
96
+ etapa concluir usa validar_workflow_n8n com runtime = "workflow n8n", adapter = "n8n", scorecard = "compatibilidade parcial" depende_de receber
97
+ etapa bloquear usa validar_workflow_n8n com runtime = "workflow n8n", adapter = "n8n", scorecard = "bloqueio por lacuna" depende_de receber
98
+ }
99
+ }
@@ -1,93 +1,93 @@
1
- module exemplos.relatorio {
2
- docs {
3
- resumo: "Geracao assincrona de relatorios com download e notificacao."
4
- }
5
-
6
- entity Relatorio {
7
- fields {
8
- id: Id
9
- tipo: Texto
10
- parametros: Objeto
11
- status: Texto
12
- url_download: Texto
13
- solicitado_por: Id
14
- criado_em: Timestamp
15
- concluido_em: Timestamp
16
- }
17
- }
18
-
19
- task solicitar_relatorio {
20
- input {
21
- tipo: Texto required
22
- data_inicio: Data required
23
- data_fim: Data required
24
- formato: Texto
25
- }
26
- output {
27
- relatorio_id: Id
28
- }
29
- rules {
30
- tipo em [VENDAS, ESTOQUE, USUARIOS, FINANCEIRO]
31
- data_inicio deve_ser anterior_a data_fim
32
- formato em [PDF, CSV, XLSX]
33
- }
34
- effects {
35
- persistencia Relatorio
36
- evento relatorio_solicitado criticidade = baixa
37
- auditoria solicitacao_relatorio
38
- }
39
- state ciclo_relatorio {
40
- transitions {
41
- PENDENTE -> EM_PROCESSAMENTO
42
- }
43
- }
44
- guarantees {
45
- relatorio_id existe
46
- }
47
- error {
48
- tipo_invalido: "Tipo de relatorio nao suportado."
49
- periodo_invalido: "Data de inicio deve ser anterior a data de fim."
50
- limite_periodo: "Periodo maximo e de 12 meses."
51
- }
52
- tests {
53
- caso "solicita relatorio de vendas" {
54
- given { tipo: "VENDAS" data_inicio: "2025-01-01" data_fim: "2025-03-31" formato: "PDF" }
55
- expect { sucesso: verdadeiro }
56
- }
57
- }
58
- }
59
-
60
- task concluir_relatorio {
61
- input {
62
- relatorio_id: Id required
63
- url_download: Texto required
64
- }
65
- output {
66
- protocolo: Id
67
- }
68
- rules {
69
- relatorio_id deve_ser valido
70
- url_download deve_ser preenchida
71
- }
72
- effects {
73
- persistencia Relatorio
74
- notificacao usuario relatorio_pronto criticidade = media
75
- evento relatorio_concluido
76
- auditoria conclusao_relatorio
77
- }
78
- state ciclo_relatorio {
79
- transitions {
80
- EM_PROCESSAMENTO -> CONCLUIDO
81
- }
82
- }
83
- guarantees {
84
- protocolo existe
85
- }
86
- tests {
87
- caso "conclui relatorio" {
88
- given { relatorio_id: "rel_1" url_download: "https://storage/rel_1.pdf" }
89
- expect { sucesso: verdadeiro }
90
- }
91
- }
92
- }
93
- }
1
+ module exemplos.relatorio {
2
+ docs {
3
+ resumo: "Geracao assincrona de relatorios com download e notificacao."
4
+ }
5
+
6
+ entity Relatorio {
7
+ fields {
8
+ id: Id
9
+ tipo: Texto
10
+ parametros: Objeto
11
+ status: Texto
12
+ url_download: Texto
13
+ solicitado_por: Id
14
+ criado_em: Timestamp
15
+ concluido_em: Timestamp
16
+ }
17
+ }
18
+
19
+ task solicitar_relatorio {
20
+ input {
21
+ tipo: Texto required
22
+ data_inicio: Data required
23
+ data_fim: Data required
24
+ formato: Texto
25
+ }
26
+ output {
27
+ relatorio_id: Id
28
+ }
29
+ rules {
30
+ tipo em [VENDAS, ESTOQUE, USUARIOS, FINANCEIRO]
31
+ data_inicio deve_ser anterior_a data_fim
32
+ formato em [PDF, CSV, XLSX]
33
+ }
34
+ effects {
35
+ persistencia Relatorio
36
+ evento relatorio_solicitado criticidade = baixa
37
+ auditoria solicitacao_relatorio
38
+ }
39
+ state ciclo_relatorio {
40
+ transitions {
41
+ PENDENTE -> EM_PROCESSAMENTO
42
+ }
43
+ }
44
+ guarantees {
45
+ relatorio_id existe
46
+ }
47
+ error {
48
+ tipo_invalido: "Tipo de relatorio nao suportado."
49
+ periodo_invalido: "Data de inicio deve ser anterior a data de fim."
50
+ limite_periodo: "Periodo maximo e de 12 meses."
51
+ }
52
+ tests {
53
+ caso "solicita relatorio de vendas" {
54
+ given { tipo: "VENDAS" data_inicio: "2025-01-01" data_fim: "2025-03-31" formato: "PDF" }
55
+ expect { sucesso: verdadeiro }
56
+ }
57
+ }
58
+ }
59
+
60
+ task concluir_relatorio {
61
+ input {
62
+ relatorio_id: Id required
63
+ url_download: Texto required
64
+ }
65
+ output {
66
+ protocolo: Id
67
+ }
68
+ rules {
69
+ relatorio_id deve_ser valido
70
+ url_download deve_ser preenchida
71
+ }
72
+ effects {
73
+ persistencia Relatorio
74
+ notificacao usuario relatorio_pronto criticidade = media
75
+ evento relatorio_concluido
76
+ auditoria conclusao_relatorio
77
+ }
78
+ state ciclo_relatorio {
79
+ transitions {
80
+ EM_PROCESSAMENTO -> CONCLUIDO
81
+ }
82
+ }
83
+ guarantees {
84
+ protocolo existe
85
+ }
86
+ tests {
87
+ caso "conclui relatorio" {
88
+ given { relatorio_id: "rel_1" url_download: "https://storage/rel_1.pdf" }
89
+ expect { sucesso: verdadeiro }
90
+ }
91
+ }
92
+ }
93
+ }