@semacode/cli 1.5.18 → 1.5.25

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 +61 -5
  6. package/SEMA_BRIEF.micro.txt +6 -4
  7. package/SEMA_INDEX.json +991 -47
  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
@@ -1,105 +1,105 @@
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
- }
77
- effects {
78
- consulta Agendamento por agendamento_id
79
- persistencia ExecucaoAgendamento
80
- persistencia Agendamento
81
- evento agendamento_executado criticidade = baixa
82
- auditoria execucao_agendamento
83
- }
84
- state ciclo_execucao {
85
- transitions {
86
- PENDENTE -> EM_EXECUCAO
87
- EM_EXECUCAO -> CONCLUIDO
88
- EM_EXECUCAO -> FALHOU
89
- }
90
- }
91
- guarantees {
92
- execucao_id existe
93
- }
94
- error {
95
- agendamento_inativo: "Agendamento esta desativado."
96
- execucao_em_andamento: "Ja existe uma execucao em andamento para este agendamento."
97
- }
98
- tests {
99
- caso "executa agendamento ativo" {
100
- given { agendamento_id: "agd_1" }
101
- expect { sucesso: verdadeiro }
102
- }
103
- }
104
- }
105
- }
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
+ }
77
+ effects {
78
+ consulta Agendamento por agendamento_id
79
+ persistencia ExecucaoAgendamento
80
+ persistencia Agendamento
81
+ evento agendamento_executado criticidade = baixa
82
+ auditoria execucao_agendamento
83
+ }
84
+ state ciclo_execucao {
85
+ transitions {
86
+ PENDENTE -> EM_EXECUCAO
87
+ EM_EXECUCAO -> CONCLUIDO
88
+ EM_EXECUCAO -> FALHOU
89
+ }
90
+ }
91
+ guarantees {
92
+ execucao_id existe
93
+ }
94
+ error {
95
+ agendamento_inativo: "Agendamento esta desativado."
96
+ execucao_em_andamento: "Ja existe uma execucao em andamento para este agendamento."
97
+ }
98
+ tests {
99
+ caso "executa agendamento ativo" {
100
+ given { agendamento_id: "agd_1" }
101
+ expect { sucesso: verdadeiro }
102
+ }
103
+ }
104
+ }
105
+ }
@@ -1,133 +1,133 @@
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
- motivo deve_ser preenchido
75
- }
76
- effects {
77
- persistencia Assinatura
78
- consulta gateway_pagamento criticidade = alta
79
- evento assinatura_cancelada criticidade = alta
80
- notificacao cliente confirmacao_cancelamento criticidade = media
81
- auditoria cancelamento_assinatura criticidade = alta
82
- }
83
- state ciclo_assinatura {
84
- transitions {
85
- ATIVA -> CANCELADA
86
- ATIVA -> PENDENTE_CANCELAMENTO
87
- }
88
- }
89
- guarantees {
90
- protocolo existe
91
- }
92
- error {
93
- assinatura_ja_cancelada: "Assinatura ja foi cancelada."
94
- }
95
- tests {
96
- caso "cancela assinatura ativa" {
97
- given { assinatura_id: "asn_1" motivo: "Nao preciso mais" imediato: falso }
98
- expect { sucesso: verdadeiro }
99
- }
100
- }
101
- }
102
-
103
- task renovar_assinatura {
104
- input {
105
- assinatura_id: Id required
106
- }
107
- output {
108
- protocolo_cobranca: Id
109
- }
110
- rules {
111
- assinatura_id deve_ser valido
112
- }
113
- effects {
114
- consulta gateway_pagamento criticidade = alta
115
- persistencia Assinatura
116
- evento assinatura_renovada criticidade = media
117
- auditoria renovacao_assinatura criticidade = alta
118
- }
119
- guarantees {
120
- protocolo_cobranca existe
121
- }
122
- error {
123
- pagamento_recusado: "Cobranca de renovacao recusada — assinatura sera suspensa."
124
- assinatura_cancelada: "Nao e possivel renovar assinatura cancelada."
125
- }
126
- tests {
127
- caso "renova assinatura no vencimento" {
128
- given { assinatura_id: "asn_1" }
129
- expect { sucesso: verdadeiro }
130
- }
131
- }
132
- }
133
- }
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
+ motivo deve_ser preenchido
75
+ }
76
+ effects {
77
+ persistencia Assinatura
78
+ consulta gateway_pagamento criticidade = alta
79
+ evento assinatura_cancelada criticidade = alta
80
+ notificacao cliente confirmacao_cancelamento criticidade = media
81
+ auditoria cancelamento_assinatura criticidade = alta
82
+ }
83
+ state ciclo_assinatura {
84
+ transitions {
85
+ ATIVA -> CANCELADA
86
+ ATIVA -> PENDENTE_CANCELAMENTO
87
+ }
88
+ }
89
+ guarantees {
90
+ protocolo existe
91
+ }
92
+ error {
93
+ assinatura_ja_cancelada: "Assinatura ja foi cancelada."
94
+ }
95
+ tests {
96
+ caso "cancela assinatura ativa" {
97
+ given { assinatura_id: "asn_1" motivo: "Nao preciso mais" imediato: falso }
98
+ expect { sucesso: verdadeiro }
99
+ }
100
+ }
101
+ }
102
+
103
+ task renovar_assinatura {
104
+ input {
105
+ assinatura_id: Id required
106
+ }
107
+ output {
108
+ protocolo_cobranca: Id
109
+ }
110
+ rules {
111
+ assinatura_id deve_ser valido
112
+ }
113
+ effects {
114
+ consulta gateway_pagamento criticidade = alta
115
+ persistencia Assinatura
116
+ evento assinatura_renovada criticidade = media
117
+ auditoria renovacao_assinatura criticidade = alta
118
+ }
119
+ guarantees {
120
+ protocolo_cobranca existe
121
+ }
122
+ error {
123
+ pagamento_recusado: "Cobranca de renovacao recusada — assinatura sera suspensa."
124
+ assinatura_cancelada: "Nao e possivel renovar assinatura cancelada."
125
+ }
126
+ tests {
127
+ caso "renova assinatura no vencimento" {
128
+ given { assinatura_id: "asn_1" }
129
+ expect { sucesso: verdadeiro }
130
+ }
131
+ }
132
+ }
133
+ }
@@ -1,89 +1,89 @@
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
- imutavel: Booleano
35
- }
36
- rules {
37
- acao deve_ser preenchida
38
- recurso deve_ser preenchido
39
- ator_id deve_ser valido
40
- }
41
- effects {
42
- persistencia RegistroAuditoria criticidade = alta
43
- }
44
- guarantees {
45
- auditoria_id existe
46
- imutavel == verdadeiro
47
- }
48
- error {
49
- falha_persistencia: "Nao foi possivel registrar a auditoria — operacao bloqueada."
50
- }
51
- tests {
52
- caso "registra acao critica" {
53
- given { ator_id: "usr_1" acao: "deletar_usuario" recurso: "Usuario" recurso_id: "usr_2" }
54
- expect { sucesso: verdadeiro }
55
- }
56
- }
57
- }
58
-
59
- task consultar_historico {
60
- input {
61
- recurso: Texto required
62
- recurso_id: Id required
63
- data_inicio: Data
64
- data_fim: Data
65
- }
66
- output {
67
- registros: Lista
68
- total: Inteiro
69
- }
70
- rules {
71
- recurso deve_ser preenchido
72
- recurso_id deve_ser valido
73
- }
74
- effects {
75
- consulta RegistroAuditoria por recurso e recurso_id
76
- auditoria consulta_historico
77
- }
78
- guarantees {
79
- registros existe
80
- total >= 0
81
- }
82
- tests {
83
- caso "consulta historico de usuario" {
84
- given { recurso: "Usuario" recurso_id: "usr_1" }
85
- expect { sucesso: verdadeiro }
86
- }
87
- }
88
- }
89
- }
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
+ imutavel: Booleano
35
+ }
36
+ rules {
37
+ acao deve_ser preenchida
38
+ recurso deve_ser preenchido
39
+ ator_id deve_ser valido
40
+ }
41
+ effects {
42
+ persistencia RegistroAuditoria criticidade = alta
43
+ }
44
+ guarantees {
45
+ auditoria_id existe
46
+ imutavel == verdadeiro
47
+ }
48
+ error {
49
+ falha_persistencia: "Nao foi possivel registrar a auditoria — operacao bloqueada."
50
+ }
51
+ tests {
52
+ caso "registra acao critica" {
53
+ given { ator_id: "usr_1" acao: "deletar_usuario" recurso: "Usuario" recurso_id: "usr_2" }
54
+ expect { sucesso: verdadeiro }
55
+ }
56
+ }
57
+ }
58
+
59
+ task consultar_historico {
60
+ input {
61
+ recurso: Texto required
62
+ recurso_id: Id required
63
+ data_inicio: Data
64
+ data_fim: Data
65
+ }
66
+ output {
67
+ registros: Lista
68
+ total: Inteiro
69
+ }
70
+ rules {
71
+ recurso deve_ser preenchido
72
+ recurso_id deve_ser valido
73
+ }
74
+ effects {
75
+ consulta RegistroAuditoria por recurso e recurso_id
76
+ auditoria consulta_historico
77
+ }
78
+ guarantees {
79
+ registros existe
80
+ total >= 0
81
+ }
82
+ tests {
83
+ caso "consulta historico de usuario" {
84
+ given { recurso: "Usuario" recurso_id: "usr_1" }
85
+ expect { sucesso: verdadeiro }
86
+ }
87
+ }
88
+ }
89
+ }