@semacode/cli 2.0.1 → 2.2.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.
Files changed (134) hide show
  1. package/LICENSE +39 -39
  2. package/README.md +141 -121
  3. package/dist/agentEntryPoints.js +499 -499
  4. package/dist/comandos.js +2 -0
  5. package/dist/doctorCommand.js +28 -0
  6. package/dist/execucoesExternas.js +19 -5
  7. package/dist/geracaoCore.js +97 -1
  8. package/dist/iaPrompts.d.ts +1 -1
  9. package/dist/iaPrompts.js +307 -307
  10. package/dist/index.d.ts +1 -0
  11. package/dist/index.js +1 -0
  12. package/dist/index.part01.d.ts +1 -1
  13. package/dist/index.part01.js +14 -4
  14. package/dist/index.part02.js +21 -21
  15. package/dist/index.part04.js +96 -96
  16. package/dist/index.part06.js +1 -1
  17. package/dist/index.part07.js +35 -24
  18. package/dist/init/templates.part01.js +393 -393
  19. package/dist/init/templates.part02.js +189 -189
  20. package/dist/initTemplatesBackend.js +73 -73
  21. package/dist/initTemplatesBase.js +81 -81
  22. package/dist/initTemplatesFlutter.js +137 -137
  23. package/dist/initTemplatesRuntime.js +350 -350
  24. package/dist/initTemplatesWeb.js +309 -309
  25. package/dist/nativeToolchains.d.ts +15 -0
  26. package/dist/nativeToolchains.js +132 -0
  27. package/dist/pipelineConteudo/adapters.d.ts +84 -0
  28. package/dist/pipelineConteudo/adapters.js +449 -0
  29. package/dist/pipelineConteudo/canonical.d.ts +18 -0
  30. package/dist/pipelineConteudo/canonical.js +107 -0
  31. package/dist/pipelineConteudo/command.d.ts +3 -0
  32. package/dist/pipelineConteudo/command.js +572 -0
  33. package/dist/pipelineConteudo/index.d.ts +9 -0
  34. package/dist/pipelineConteudo/index.js +12 -0
  35. package/dist/pipelineConteudo/ledger.d.ts +68 -0
  36. package/dist/pipelineConteudo/ledger.js +732 -0
  37. package/dist/pipelineConteudo/planner.d.ts +12 -0
  38. package/dist/pipelineConteudo/planner.js +366 -0
  39. package/dist/pipelineConteudo/projection.d.ts +16 -0
  40. package/dist/pipelineConteudo/projection.js +57 -0
  41. package/dist/pipelineConteudo/state.d.ts +23 -0
  42. package/dist/pipelineConteudo/state.js +615 -0
  43. package/dist/pipelineConteudo/trust.d.ts +17 -0
  44. package/dist/pipelineConteudo/trust.js +750 -0
  45. package/dist/pipelineConteudo/types.d.ts +331 -0
  46. package/dist/pipelineConteudo/types.js +4 -0
  47. package/dist/projetoConfig.js +7 -1
  48. package/dist/projetoResolucao.js +21 -6
  49. package/dist/sync/index.js +35 -35
  50. package/docs/README.md +28 -25
  51. package/docs/ai-onboarding.md +62 -62
  52. package/docs/ai-workflow.md +1 -1
  53. package/docs/auth.md +26 -26
  54. package/docs/cli.md +79 -72
  55. package/docs/commands.md +1 -1
  56. package/docs/database.md +15 -15
  57. package/docs/deploy.md +41 -36
  58. package/docs/documentation.md +39 -39
  59. package/docs/env.md +16 -16
  60. package/docs/frontend.md +41 -41
  61. package/docs/getting-started.md +57 -57
  62. package/docs/i18n.md +15 -15
  63. package/docs/pipeline-conteudo.md +246 -0
  64. package/docs/profiles.md +45 -43
  65. package/docs/repositories.md +43 -43
  66. package/docs/rollback.md +31 -31
  67. package/docs/security.md +32 -32
  68. package/docs/support.md +8 -8
  69. package/docs/syntax.md +1 -1
  70. package/docs/testing.md +35 -28
  71. package/docs/vocabulary.md +29 -29
  72. package/exemplos/agendamento.sema +1 -1
  73. package/exemplos/assinatura.sema +1 -1
  74. package/exemplos/auditoria.sema +1 -1
  75. package/exemplos/autenticacao.sema +1 -1
  76. package/exemplos/author_obra_comum.sema +1 -1
  77. package/exemplos/author_tema_sensivel.sema +1 -1
  78. package/exemplos/automacao.sema +1 -1
  79. package/exemplos/cadastro_usuario.sema +1 -1
  80. package/exemplos/calculadora.sema +1 -1
  81. package/exemplos/crud_simples.sema +1 -1
  82. package/exemplos/estoque.sema +1 -1
  83. package/exemplos/exportacao.sema +1 -1
  84. package/exemplos/fila.sema +1 -1
  85. package/exemplos/integracao_externa.sema +1 -1
  86. package/exemplos/multi_tenant.sema +1 -1
  87. package/exemplos/notificacao.sema +1 -1
  88. package/exemplos/operacao_estrategia.sema +132 -132
  89. package/exemplos/operacao_estrategia_discovery.sema +220 -220
  90. package/exemplos/operacao_estrategia_fluxo.sema +114 -114
  91. package/exemplos/operacao_estrategia_gates.sema +106 -106
  92. package/exemplos/operacao_estrategia_quarentena.sema +133 -133
  93. package/exemplos/operacao_estrategia_rollout.sema +124 -124
  94. package/exemplos/pagamento.sema +1 -1
  95. package/exemplos/pagamento_dominio.sema +1 -1
  96. package/exemplos/pedido.sema +1 -1
  97. package/exemplos/permissao.sema +1 -1
  98. package/exemplos/persistencia_vendor_first.sema +1 -1
  99. package/exemplos/pipeline-conteudo/README.md +44 -0
  100. package/exemplos/pipeline-conteudo/alvos.json +23 -0
  101. package/exemplos/pipeline-conteudo/definicao.json +136 -0
  102. package/exemplos/profile_conversas.sema +165 -165
  103. package/exemplos/profile_game.sema +1 -1
  104. package/exemplos/profile_legal.sema +1 -1
  105. package/exemplos/profile_ops.sema +1 -1
  106. package/exemplos/profile_research.sema +1 -1
  107. package/exemplos/profile_software.sema +1 -1
  108. package/exemplos/profile_workflow_n8n.sema +1 -1
  109. package/exemplos/relatorio.sema +1 -1
  110. package/exemplos/replica_analitica_erp.sema +1 -1
  111. package/exemplos/testes_embutidos.sema +1 -1
  112. package/exemplos/tratamento_erro.sema +1 -1
  113. package/exemplos/upload_arquivo.sema +1 -1
  114. package/exemplos/webhook.sema +1 -1
  115. package/node_modules/@sema/gerador-cpp/dist/index.d.ts +3 -0
  116. package/node_modules/@sema/gerador-cpp/dist/index.js +859 -0
  117. package/node_modules/@sema/gerador-cpp/dist/index.js.map +1 -0
  118. package/node_modules/@sema/gerador-cpp/package.json +7 -0
  119. package/node_modules/@sema/gerador-css/dist/index.part01.js +10 -10
  120. package/node_modules/@sema/gerador-css/dist/index.part02.js +460 -460
  121. package/node_modules/@sema/gerador-dotnet/dist/index.d.ts +3 -0
  122. package/node_modules/@sema/gerador-dotnet/dist/index.js +828 -0
  123. package/node_modules/@sema/gerador-dotnet/dist/index.js.map +1 -0
  124. package/node_modules/@sema/gerador-dotnet/package.json +7 -0
  125. package/node_modules/@sema/gerador-html/dist/index.js +17 -17
  126. package/node_modules/@sema/gerador-lua/dist/index.js +53 -8
  127. package/node_modules/@sema/gerador-lua/dist/index.js.map +1 -1
  128. package/node_modules/@sema/gerador-php/dist/index.js +121 -113
  129. package/node_modules/@sema/gerador-php/dist/index.js.map +1 -1
  130. package/node_modules/@sema/gerador-python/dist/index.part02.js +3 -3
  131. package/node_modules/@sema/gerador-typescript/dist/index.part02.js +11 -11
  132. package/node_modules/@sema/nucleo/dist/diagnosticos/melhorador.js +42 -42
  133. package/node_modules/@sema/padroes/dist/index.d.ts +1 -1
  134. package/package.json +12 -1
@@ -0,0 +1,12 @@
1
+ import type { AlvoConteudo, DefinicaoPipelineConteudo, PlanoPipelineConteudo } from "./types.js";
2
+ export interface ResultadoValidacaoDefinicaoPipelineConteudo {
3
+ readonly valida: boolean;
4
+ readonly definitionDigest: string;
5
+ readonly bloqueios: readonly string[];
6
+ }
7
+ export interface ResultadoPlanejamentoPipelineConteudo {
8
+ readonly plano: PlanoPipelineConteudo;
9
+ readonly bloqueios: readonly string[];
10
+ }
11
+ export declare function validarDefinicaoPipelineConteudo(definicao: DefinicaoPipelineConteudo): ResultadoValidacaoDefinicaoPipelineConteudo;
12
+ export declare function planejarPipelineConteudo(definicao: DefinicaoPipelineConteudo, alvos: readonly AlvoConteudo[]): ResultadoPlanejamentoPipelineConteudo;
@@ -0,0 +1,366 @@
1
+ // SEMA-GOVERNED: sema.produto.pipeline_conteudo
2
+ // Descricao: validacao do DAG e planejamento declarativo, sem executar runner ou ferramentas.
3
+ import { digestJsonCanonico } from "./canonical.js";
4
+ import { planejarAlvosConteudo, validarAdaptadorConteudo, } from "./adapters.js";
5
+ const VERSOES_FLUTUANTES = new Set(["*", "current", "latest", "stable"]);
6
+ const ESCOPOS_ETAPA = new Set(["GLOBAL", "POR_ALVO"]);
7
+ const MODOS_AVALIACAO = new Set(["DETERMINISTICA", "IA_ESPECIALIZADA", "HIBRIDA"]);
8
+ const POLITICAS_ADAPTER = new Set(["NONE", "CONSTRAINTS", "CONFIRMATION"]);
9
+ function textoOpaco(valor) {
10
+ return typeof valor === "string" && valor.length > 0 && valor === valor.trim() && !/[\s\u0000-\u001f\u007f]/u.test(valor);
11
+ }
12
+ function listaTextoUnica(valores, permitirVazia) {
13
+ return (permitirVazia || valores.length > 0)
14
+ && valores.every(textoOpaco)
15
+ && new Set(valores).size === valores.length;
16
+ }
17
+ function adicionarUnico(bloqueios, codigo) {
18
+ if (!bloqueios.includes(codigo))
19
+ bloqueios.push(codigo);
20
+ }
21
+ function validarGate(gate, bloqueios) {
22
+ if (!textoOpaco(gate.gateId))
23
+ adicionarUnico(bloqueios, "gate_id_invalido");
24
+ if (!textoOpaco(gate.stageId))
25
+ adicionarUnico(bloqueios, `gate_stage_id_invalido:${gate.gateId || "<sem-id>"}`);
26
+ if (!ESCOPOS_ETAPA.has(gate.scope)) {
27
+ adicionarUnico(bloqueios, `gate_scope_invalido:${gate.gateId}`);
28
+ }
29
+ if (!MODOS_AVALIACAO.has(gate.evaluationMode)) {
30
+ adicionarUnico(bloqueios, `gate_evaluation_mode_invalido:${gate.gateId}`);
31
+ }
32
+ if (!listaTextoUnica(gate.requiredEvidence, true)) {
33
+ adicionarUnico(bloqueios, `gate_required_evidence_invalido:${gate.gateId}`);
34
+ }
35
+ if ((gate.evaluationMode === "DETERMINISTICA" || gate.evaluationMode === "HIBRIDA") &&
36
+ gate.requiredEvidence.length === 0) {
37
+ adicionarUnico(bloqueios, `gate_required_evidence_ausente:${gate.gateId}`);
38
+ }
39
+ if (!listaTextoUnica(gate.evaluatorCapabilities, true)) {
40
+ adicionarUnico(bloqueios, `gate_evaluator_capabilities_invalidas:${gate.gateId}`);
41
+ }
42
+ if (!Number.isInteger(gate.minAttestationsPerEvidence) || gate.minAttestationsPerEvidence < 1) {
43
+ adicionarUnico(bloqueios, `gate_min_attestations_invalido:${gate.gateId}`);
44
+ }
45
+ if (!Number.isInteger(gate.minDistinctAttesterControlDomains) ||
46
+ gate.minDistinctAttesterControlDomains < 1) {
47
+ adicionarUnico(bloqueios, `gate_min_attester_control_domains_invalido:${gate.gateId}`);
48
+ }
49
+ if (gate.minDistinctAttesterControlDomains > gate.minAttestationsPerEvidence) {
50
+ adicionarUnico(bloqueios, `gate_quorum_atestadores_impossivel:${gate.gateId}`);
51
+ }
52
+ if ((gate.evaluationMode === "IA_ESPECIALIZADA" || gate.evaluationMode === "HIBRIDA") &&
53
+ gate.evaluatorCapabilities.length === 0) {
54
+ adicionarUnico(bloqueios, `gate_evaluator_capabilities_ausentes:${gate.gateId}`);
55
+ }
56
+ if (!Number.isInteger(gate.minApprovals) || gate.minApprovals < 1) {
57
+ adicionarUnico(bloqueios, `gate_min_approvals_invalido:${gate.gateId}`);
58
+ }
59
+ if (!Number.isInteger(gate.minDistinctControlDomains) || gate.minDistinctControlDomains < 1) {
60
+ adicionarUnico(bloqueios, `gate_min_control_domains_invalido:${gate.gateId}`);
61
+ }
62
+ if (gate.minDistinctControlDomains > gate.minApprovals) {
63
+ adicionarUnico(bloqueios, `gate_quorum_impossivel:${gate.gateId}`);
64
+ }
65
+ if (!textoOpaco(gate.rubricDigest)) {
66
+ adicionarUnico(bloqueios, `gate_rubric_digest_invalido:${gate.gateId}`);
67
+ }
68
+ if (typeof gate.producerDisjoint !== "boolean") {
69
+ adicionarUnico(bloqueios, `gate_producer_disjoint_invalido:${gate.gateId}`);
70
+ }
71
+ if (typeof gate.rejectionIsBinding !== "boolean") {
72
+ adicionarUnico(bloqueios, `gate_rejection_binding_invalido:${gate.gateId}`);
73
+ }
74
+ }
75
+ function detectarCiclo(stages) {
76
+ const porId = new Map(stages.map((stage) => [stage.stageId, stage]));
77
+ const estado = new Map();
78
+ const pilha = [];
79
+ const visitar = (stageId) => {
80
+ if (estado.get(stageId) === "visitado")
81
+ return [];
82
+ const inicioCiclo = pilha.indexOf(stageId);
83
+ if (estado.get(stageId) === "visitando") {
84
+ return inicioCiclo >= 0 ? [...pilha.slice(inicioCiclo), stageId] : [stageId, stageId];
85
+ }
86
+ estado.set(stageId, "visitando");
87
+ pilha.push(stageId);
88
+ for (const dependencia of porId.get(stageId)?.dependsOn ?? []) {
89
+ if (!porId.has(dependencia))
90
+ continue;
91
+ const ciclo = visitar(dependencia);
92
+ if (ciclo.length > 0)
93
+ return ciclo;
94
+ }
95
+ pilha.pop();
96
+ estado.set(stageId, "visitado");
97
+ return [];
98
+ };
99
+ for (const stage of stages) {
100
+ const ciclo = visitar(stage.stageId);
101
+ if (ciclo.length > 0)
102
+ return ciclo;
103
+ }
104
+ return [];
105
+ }
106
+ function ordenarStages(stages) {
107
+ const indiceDeclarado = new Map(stages.map((stage, indice) => [stage.stageId, indice]));
108
+ const porId = new Map(stages.map((stage) => [stage.stageId, stage]));
109
+ const grauEntrada = new Map(stages.map((stage) => [stage.stageId, stage.dependsOn.length]));
110
+ const dependentes = new Map();
111
+ for (const stage of stages) {
112
+ for (const dependencia of stage.dependsOn) {
113
+ const itens = dependentes.get(dependencia) ?? [];
114
+ itens.push(stage.stageId);
115
+ dependentes.set(dependencia, itens);
116
+ }
117
+ }
118
+ const prontos = stages
119
+ .filter((stage) => (grauEntrada.get(stage.stageId) ?? 0) === 0)
120
+ .map((stage) => stage.stageId);
121
+ const ordenados = [];
122
+ while (prontos.length > 0) {
123
+ prontos.sort((a, b) => (indiceDeclarado.get(a) ?? 0) - (indiceDeclarado.get(b) ?? 0));
124
+ const stageId = prontos.shift();
125
+ const stage = porId.get(stageId);
126
+ if (stage)
127
+ ordenados.push(stage);
128
+ for (const dependente of dependentes.get(stageId) ?? []) {
129
+ const restante = (grauEntrada.get(dependente) ?? 0) - 1;
130
+ grauEntrada.set(dependente, restante);
131
+ if (restante === 0)
132
+ prontos.push(dependente);
133
+ }
134
+ }
135
+ return ordenados;
136
+ }
137
+ function segmentoId(valor) {
138
+ return encodeURIComponent(valor);
139
+ }
140
+ function idInstanciaStage(stage, targetId) {
141
+ if (stage.scope === "GLOBAL")
142
+ return `stage/${segmentoId(stage.stageId)}/global`;
143
+ return `stage/${segmentoId(stage.stageId)}/target/${segmentoId(targetId ?? "")}`;
144
+ }
145
+ function idInstanciaGate(gateId, stageInstanceId) {
146
+ return `gate/${segmentoId(gateId)}/${stageInstanceId}`;
147
+ }
148
+ function idSlotArtefato(artifactType, stageInstanceId) {
149
+ return `artifact/${segmentoId(artifactType)}/${stageInstanceId}`;
150
+ }
151
+ function dependenciasDaInstancia(stage, targetId, stagesPorId, targetIds) {
152
+ const dependencias = [];
153
+ for (const dependenciaId of stage.dependsOn) {
154
+ const dependencia = stagesPorId.get(dependenciaId);
155
+ if (dependencia.scope === "GLOBAL") {
156
+ dependencias.push(idInstanciaStage(dependencia));
157
+ }
158
+ else if (stage.scope === "POR_ALVO") {
159
+ dependencias.push(idInstanciaStage(dependencia, targetId));
160
+ }
161
+ else {
162
+ for (const target of targetIds)
163
+ dependencias.push(idInstanciaStage(dependencia, target));
164
+ }
165
+ }
166
+ return dependencias;
167
+ }
168
+ function planoVazio(pipelineId, definitionDigest, targetIds) {
169
+ return {
170
+ pipelineId,
171
+ definitionDigest,
172
+ targetIds,
173
+ stageInstances: [],
174
+ artifactSlots: [],
175
+ gateInstances: [],
176
+ nextActions: [],
177
+ };
178
+ }
179
+ export function validarDefinicaoPipelineConteudo(definicao) {
180
+ const bloqueios = [];
181
+ let definitionDigest;
182
+ try {
183
+ definitionDigest = digestJsonCanonico(definicao);
184
+ }
185
+ catch (erro) {
186
+ definitionDigest = digestJsonCanonico({ definicaoInvalida: true });
187
+ adicionarUnico(bloqueios, `definicao_nao_canonica:${erro instanceof Error ? erro.message : "erro_desconhecido"}`);
188
+ }
189
+ if (!textoOpaco(definicao.schemaVersion))
190
+ adicionarUnico(bloqueios, "schema_version_invalida");
191
+ if (!textoOpaco(definicao.pipelineId))
192
+ adicionarUnico(bloqueios, "pipeline_id_invalido");
193
+ if (!textoOpaco(definicao.version) || VERSOES_FLUTUANTES.has(definicao.version.toLowerCase())) {
194
+ adicionarUnico(bloqueios, "pipeline_version_nao_fixada");
195
+ }
196
+ if (definicao.stages.length === 0)
197
+ adicionarUnico(bloqueios, "stages_ausentes");
198
+ if (definicao.adapters.length === 0)
199
+ adicionarUnico(bloqueios, "adapters_ausentes");
200
+ const stageIds = new Set();
201
+ for (const stage of definicao.stages) {
202
+ if (!textoOpaco(stage.stageId))
203
+ adicionarUnico(bloqueios, "stage_id_invalido");
204
+ if (stageIds.has(stage.stageId))
205
+ adicionarUnico(bloqueios, `stage_id_duplicado:${stage.stageId}`);
206
+ stageIds.add(stage.stageId);
207
+ if (!textoOpaco(stage.capability))
208
+ adicionarUnico(bloqueios, `stage_capability_invalida:${stage.stageId}`);
209
+ if (!ESCOPOS_ETAPA.has(stage.scope))
210
+ adicionarUnico(bloqueios, `stage_scope_invalido:${stage.stageId}`);
211
+ if (!POLITICAS_ADAPTER.has(stage.adapterPolicy))
212
+ adicionarUnico(bloqueios, `stage_adapter_policy_invalida:${stage.stageId}`);
213
+ if (stage.scope === "GLOBAL" && stage.adapterPolicy !== "NONE") {
214
+ adicionarUnico(bloqueios, `stage_global_nao_pode_usar_adapter_policy:${stage.stageId}`);
215
+ }
216
+ if (stage.adapterPolicy !== "NONE" && stage.gateIds.length === 0) {
217
+ adicionarUnico(bloqueios, `stage_adapter_policy_sem_gate:${stage.stageId}`);
218
+ }
219
+ if (stage.capability === "content.target.adapt" && stage.adapterPolicy !== "CONSTRAINTS") {
220
+ adicionarUnico(bloqueios, `stage_target_adapt_exige_constraints:${stage.stageId}`);
221
+ }
222
+ if (stage.capability === "content.target.deliver" && stage.adapterPolicy !== "CONFIRMATION") {
223
+ adicionarUnico(bloqueios, `stage_target_deliver_exige_confirmation:${stage.stageId}`);
224
+ }
225
+ if (!listaTextoUnica(stage.dependsOn, true))
226
+ adicionarUnico(bloqueios, `stage_dependencies_invalidas:${stage.stageId}`);
227
+ if (!listaTextoUnica(stage.produces, false))
228
+ adicionarUnico(bloqueios, `stage_produces_invalido:${stage.stageId}`);
229
+ if (stage.produces.length !== 1)
230
+ adicionarUnico(bloqueios, `stage_output_ambiguo:${stage.stageId}`);
231
+ if (!listaTextoUnica(stage.gateIds, true))
232
+ adicionarUnico(bloqueios, `stage_gate_ids_invalidos:${stage.stageId}`);
233
+ }
234
+ const gateIds = new Set();
235
+ const gatesPorId = new Map();
236
+ for (const gate of definicao.gates) {
237
+ validarGate(gate, bloqueios);
238
+ if (gateIds.has(gate.gateId))
239
+ adicionarUnico(bloqueios, `gate_id_duplicado:${gate.gateId}`);
240
+ gateIds.add(gate.gateId);
241
+ gatesPorId.set(gate.gateId, gate);
242
+ if (!stageIds.has(gate.stageId))
243
+ adicionarUnico(bloqueios, `gate_stage_nao_encontrado:${gate.gateId}:${gate.stageId}`);
244
+ }
245
+ const stagesPorId = new Map(definicao.stages.map((stage) => [stage.stageId, stage]));
246
+ for (const stage of definicao.stages) {
247
+ for (const dependencia of stage.dependsOn) {
248
+ if (!stageIds.has(dependencia)) {
249
+ adicionarUnico(bloqueios, `stage_dependency_nao_encontrada:${stage.stageId}:${dependencia}`);
250
+ }
251
+ }
252
+ for (const gateId of stage.gateIds) {
253
+ const gate = gatesPorId.get(gateId);
254
+ if (!gate) {
255
+ adicionarUnico(bloqueios, `stage_gate_nao_encontrado:${stage.stageId}:${gateId}`);
256
+ }
257
+ else {
258
+ if (gate.stageId !== stage.stageId)
259
+ adicionarUnico(bloqueios, `stage_gate_ligacao_divergente:${stage.stageId}:${gateId}`);
260
+ if (gate.scope !== stage.scope) {
261
+ adicionarUnico(bloqueios, `stage_gate_scope_divergente:${stage.stageId}:${gateId}`);
262
+ }
263
+ }
264
+ }
265
+ }
266
+ for (const gate of definicao.gates) {
267
+ const stage = stagesPorId.get(gate.stageId);
268
+ if (stage && !stage.gateIds.includes(gate.gateId)) {
269
+ adicionarUnico(bloqueios, `gate_nao_ligado_pela_etapa:${gate.gateId}:${gate.stageId}`);
270
+ }
271
+ }
272
+ if (!listaTextoUnica(definicao.requiredCompletionGates, false)) {
273
+ adicionarUnico(bloqueios, "required_completion_gates_invalidos");
274
+ }
275
+ for (const gateId of definicao.requiredCompletionGates) {
276
+ if (!gateIds.has(gateId))
277
+ adicionarUnico(bloqueios, `completion_gate_nao_encontrado:${gateId}`);
278
+ else if (gatesPorId.get(gateId)?.producerDisjoint !== true) {
279
+ adicionarUnico(bloqueios, `completion_gate_exige_produtor_disjunto:${gateId}`);
280
+ }
281
+ }
282
+ const adaptersVersionados = new Set();
283
+ for (const adapter of definicao.adapters) {
284
+ const resultado = validarAdaptadorConteudo(adapter);
285
+ for (const bloqueio of resultado.bloqueios) {
286
+ adicionarUnico(bloqueios, `adapter_invalido:${adapter.adapterId || "<sem-id>"}:${bloqueio}`);
287
+ }
288
+ const chave = `${adapter.adapterId}\u0000${adapter.version}`;
289
+ if (adaptersVersionados.has(chave)) {
290
+ adicionarUnico(bloqueios, `adapter_id_version_duplicado:${adapter.adapterId}:${adapter.version}`);
291
+ }
292
+ adaptersVersionados.add(chave);
293
+ }
294
+ const ciclo = detectarCiclo(definicao.stages);
295
+ if (ciclo.length > 0)
296
+ adicionarUnico(bloqueios, `stage_graph_ciclico:${ciclo.join("->")}`);
297
+ return { valida: bloqueios.length === 0, definitionDigest, bloqueios };
298
+ }
299
+ export function planejarPipelineConteudo(definicao, alvos) {
300
+ const validacao = validarDefinicaoPipelineConteudo(definicao);
301
+ const targetIds = [...alvos.map((alvo) => alvo.targetId)].sort((a, b) => a.localeCompare(b));
302
+ const bloqueios = [...validacao.bloqueios];
303
+ const planejamentoAlvos = planejarAlvosConteudo(alvos, definicao.adapters, []);
304
+ for (const bloqueio of planejamentoAlvos.bloqueiosPorAlvo) {
305
+ adicionarUnico(bloqueios, `target_invalido:${bloqueio.targetId}:${bloqueio.codigo}`);
306
+ }
307
+ if (bloqueios.length > 0) {
308
+ return {
309
+ plano: planoVazio(definicao.pipelineId, validacao.definitionDigest, targetIds),
310
+ bloqueios,
311
+ };
312
+ }
313
+ const stagesOrdenados = ordenarStages(definicao.stages);
314
+ const stagesPorId = new Map(definicao.stages.map((stage) => [stage.stageId, stage]));
315
+ const stageInstances = [];
316
+ for (const stage of stagesOrdenados) {
317
+ const targetsDaEtapa = stage.scope === "GLOBAL" ? [undefined] : targetIds;
318
+ for (const targetId of targetsDaEtapa) {
319
+ stageInstances.push({
320
+ stageInstanceId: idInstanciaStage(stage, targetId),
321
+ stageId: stage.stageId,
322
+ ...(targetId === undefined ? {} : { targetId }),
323
+ capability: stage.capability,
324
+ dependsOn: dependenciasDaInstancia(stage, targetId, stagesPorId, targetIds),
325
+ produces: [...stage.produces],
326
+ gateIds: [...stage.gateIds],
327
+ });
328
+ }
329
+ }
330
+ const artifactSlots = [];
331
+ const gateInstances = [];
332
+ for (const stageInstance of stageInstances) {
333
+ for (const artifactType of stageInstance.produces) {
334
+ artifactSlots.push({
335
+ slotId: idSlotArtefato(artifactType, stageInstance.stageInstanceId),
336
+ stageInstanceId: stageInstance.stageInstanceId,
337
+ artifactType,
338
+ ...(stageInstance.targetId === undefined ? {} : { targetId: stageInstance.targetId }),
339
+ });
340
+ }
341
+ for (const gateId of stageInstance.gateIds) {
342
+ gateInstances.push({
343
+ gateInstanceId: idInstanciaGate(gateId, stageInstance.stageInstanceId),
344
+ gateId,
345
+ stageInstanceId: stageInstance.stageInstanceId,
346
+ ...(stageInstance.targetId === undefined ? {} : { targetId: stageInstance.targetId }),
347
+ });
348
+ }
349
+ }
350
+ const nextActions = stageInstances
351
+ .filter((stage) => stage.dependsOn.length === 0)
352
+ .map((stage) => `runner_externo.executar_etapa:${stage.stageInstanceId}`);
353
+ return {
354
+ plano: {
355
+ pipelineId: definicao.pipelineId,
356
+ definitionDigest: validacao.definitionDigest,
357
+ targetIds,
358
+ stageInstances,
359
+ artifactSlots,
360
+ gateInstances,
361
+ nextActions,
362
+ },
363
+ bloqueios,
364
+ };
365
+ }
366
+ //# sourceMappingURL=planner.js.map
@@ -0,0 +1,16 @@
1
+ import type { ConfiguracaoConfiancaConteudo, DefinicaoPipelineConteudo, EnvelopeAssinadoConteudo, EventoLedgerConteudo, EventoPayloadConteudo, PoliticaConfiancaConteudo, ProjecaoPipelineConteudo } from "./types.js";
2
+ export interface EntradaProjetarManifestoPipelineConteudo {
3
+ readonly eventos: readonly EventoLedgerConteudo<EventoPayloadConteudo>[];
4
+ readonly envelopePolitica: EnvelopeAssinadoConteudo<PoliticaConfiancaConteudo>;
5
+ readonly definicao: DefinicaoPipelineConteudo;
6
+ readonly configuracaoConfianca: ConfiguracaoConfiancaConteudo;
7
+ readonly trustRootDigestEsperado: string;
8
+ readonly revocationDigestEsperado: string;
9
+ readonly expectedHead: string;
10
+ readonly generatedAt?: string | Date;
11
+ }
12
+ /**
13
+ * Gera uma leitura descartavel. Nao recebe manifesto anterior e, portanto,
14
+ * campos editados manualmente (inclusive `concluido`) nunca voltam ao estado.
15
+ */
16
+ export declare function projetarManifestoPipelineConteudo(entrada: EntradaProjetarManifestoPipelineConteudo): ProjecaoPipelineConteudo;
@@ -0,0 +1,57 @@
1
+ // SEMA-GOVERNED: sema.produto.pipeline_conteudo.estado
2
+ // Descricao: projecao regeneravel e explicitamente nao autoritativa do ledger canonico de conteudo.
3
+ import { hashCanonicoConteudo } from "./canonical.js";
4
+ import { validarLedgerConteudo } from "./ledger.js";
5
+ import { derivarEstadoPipelineConteudo } from "./state.js";
6
+ function instanteIso(valor) {
7
+ const data = valor instanceof Date ? valor : new Date(valor ?? Date.now());
8
+ if (!Number.isFinite(data.getTime()))
9
+ throw new TypeError("generated_at_invalido");
10
+ return data.toISOString();
11
+ }
12
+ /**
13
+ * Gera uma leitura descartavel. Nao recebe manifesto anterior e, portanto,
14
+ * campos editados manualmente (inclusive `concluido`) nunca voltam ao estado.
15
+ */
16
+ export function projetarManifestoPipelineConteudo(entrada) {
17
+ const politica = entrada.envelopePolitica.payload;
18
+ const validacao = validarLedgerConteudo({
19
+ eventos: entrada.eventos,
20
+ envelopePolitica: entrada.envelopePolitica,
21
+ ledgerId: politica.ledgerId,
22
+ expectedHead: entrada.expectedHead,
23
+ principals: entrada.configuracaoConfianca.principals,
24
+ trustRootDigestEsperado: entrada.trustRootDigestEsperado,
25
+ revocationDigestEsperado: entrada.revocationDigestEsperado,
26
+ configuracaoConfianca: entrada.configuracaoConfianca,
27
+ contextoEsperado: {
28
+ runId: politica.runId,
29
+ trustDomainId: politica.trustDomainId,
30
+ trustRootDigest: entrada.trustRootDigestEsperado,
31
+ ledgerId: politica.ledgerId,
32
+ policyDigest: hashCanonicoConteudo(politica),
33
+ definitionDigest: politica.definitionDigest,
34
+ },
35
+ });
36
+ if (!validacao.valido) {
37
+ throw new Error(`ledger_invalido:${validacao.bloqueios.join(",")}`);
38
+ }
39
+ const estado = derivarEstadoPipelineConteudo(entrada);
40
+ if (!estado.valido) {
41
+ throw new Error(`estado_canonico_indisponivel:${estado.nextActions.join(",")}`);
42
+ }
43
+ const inicio = entrada.eventos.find((evento) => evento.envelope.payload.kind === "RUN_STARTED" && evento.envelope.payload.runId === estado.runId);
44
+ const targets = inicio?.envelope.payload.kind === "RUN_STARTED" ? inicio.envelope.payload.targets : [];
45
+ return {
46
+ authoritative: false,
47
+ ledgerId: politica.ledgerId,
48
+ ledgerHead: validacao.head,
49
+ runId: estado.runId,
50
+ generatedAt: instanteIso(entrada.generatedAt),
51
+ gates: estado.estadosGate,
52
+ targets: [...targets],
53
+ artifacts: [...estado.artifactsAceitos],
54
+ nextActions: estado.nextActions,
55
+ };
56
+ }
57
+ //# sourceMappingURL=projection.js.map
@@ -0,0 +1,23 @@
1
+ import type { ArtefatoConteudo, ConfiguracaoConfiancaConteudo, DefinicaoPipelineConteudo, EnvelopeAssinadoConteudo, EstadoGateConteudo, EventoLedgerConteudo, EventoPayloadConteudo, PoliticaConfiancaConteudo } from "./types.js";
2
+ export interface EntradaDerivarEstadoPipelineConteudo {
3
+ readonly eventos: readonly EventoLedgerConteudo<EventoPayloadConteudo>[];
4
+ readonly envelopePolitica: EnvelopeAssinadoConteudo<PoliticaConfiancaConteudo>;
5
+ readonly definicao: DefinicaoPipelineConteudo;
6
+ readonly configuracaoConfianca: ConfiguracaoConfiancaConteudo;
7
+ readonly trustRootDigestEsperado: string;
8
+ readonly revocationDigestEsperado: string;
9
+ readonly expectedHead: string;
10
+ }
11
+ export interface ResultadoEstadoPipelineConteudo {
12
+ readonly valido: boolean;
13
+ readonly runId: string;
14
+ readonly estadosGate: readonly EstadoGateConteudo[];
15
+ readonly concluido: boolean;
16
+ readonly nextActions: readonly string[];
17
+ readonly artifactsAceitos: readonly ArtefatoConteudo[];
18
+ }
19
+ /**
20
+ * O estado nasce exclusivamente do replay. Campos como `concluido` presentes
21
+ * em JSON externo ou manifestos nao participam desta funcao.
22
+ */
23
+ export declare function derivarEstadoPipelineConteudo(entrada: EntradaDerivarEstadoPipelineConteudo): ResultadoEstadoPipelineConteudo;