@semacode/cli 1.5.30 → 1.5.32

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 (176) hide show
  1. package/AGENTS.md +294 -0
  2. package/AGENT_CONTEXT_PACK.json +164 -0
  3. package/LICENSE +22 -0
  4. package/README.md +85 -144
  5. package/SEMA_BRIEF.curto.txt +11 -0
  6. package/SEMA_BRIEF.md +616 -0
  7. package/SEMA_BRIEF.micro.txt +9 -0
  8. package/SEMA_INDEX.json +9393 -0
  9. package/dist/billing/index.d.ts +46 -0
  10. package/dist/billing/index.js +143 -0
  11. package/dist/billing/index.js.map +1 -0
  12. package/dist/comandos.js +33 -0
  13. package/dist/comandos.js.map +1 -1
  14. package/dist/controleComercialSupabase.d.ts +7 -0
  15. package/dist/controleComercialSupabase.js +6 -0
  16. package/dist/controleComercialSupabase.js.map +1 -0
  17. package/dist/controleComercialSupabaseAdmin.d.ts +7 -0
  18. package/dist/controleComercialSupabaseAdmin.js +138 -0
  19. package/dist/controleComercialSupabaseAdmin.js.map +1 -0
  20. package/dist/controleComercialSupabaseCadastro.d.ts +4 -0
  21. package/dist/controleComercialSupabaseCadastro.js +85 -0
  22. package/dist/controleComercialSupabaseCadastro.js.map +1 -0
  23. package/dist/controleComercialSupabaseConstantes.d.ts +28 -0
  24. package/dist/controleComercialSupabaseConstantes.js +44 -0
  25. package/dist/controleComercialSupabaseConstantes.js.map +1 -0
  26. package/dist/controleComercialSupabaseConsumo.d.ts +2 -0
  27. package/dist/controleComercialSupabaseConsumo.js +77 -0
  28. package/dist/controleComercialSupabaseConsumo.js.map +1 -0
  29. package/dist/controleComercialSupabaseConta.d.ts +11 -0
  30. package/dist/controleComercialSupabaseConta.js +157 -0
  31. package/dist/controleComercialSupabaseConta.js.map +1 -0
  32. package/dist/controleComercialSupabaseProfiles.d.ts +4 -0
  33. package/dist/controleComercialSupabaseProfiles.js +55 -0
  34. package/dist/controleComercialSupabaseProfiles.js.map +1 -0
  35. package/dist/controleComercialSupabaseTipos.d.ts +3 -0
  36. package/dist/controleComercialSupabaseTipos.js +2 -0
  37. package/dist/controleComercialSupabaseTipos.js.map +1 -0
  38. package/dist/controleComercialSupabaseTiposAdmin.d.ts +152 -0
  39. package/dist/controleComercialSupabaseTiposAdmin.js +2 -0
  40. package/dist/controleComercialSupabaseTiposAdmin.js.map +1 -0
  41. package/dist/controleComercialSupabaseTiposBase.d.ts +169 -0
  42. package/dist/controleComercialSupabaseTiposBase.js +2 -0
  43. package/dist/controleComercialSupabaseTiposBase.js.map +1 -0
  44. package/dist/controleComercialSupabaseTiposConta.d.ts +220 -0
  45. package/dist/controleComercialSupabaseTiposConta.js +2 -0
  46. package/dist/controleComercialSupabaseTiposConta.js.map +1 -0
  47. package/dist/dev/index.d.ts +18 -0
  48. package/dist/dev/index.js +143 -0
  49. package/dist/dev/index.js.map +1 -0
  50. package/dist/index.js +222 -46
  51. package/dist/index.js.map +1 -1
  52. package/dist/init/index.d.ts +23 -0
  53. package/dist/init/index.js +112 -0
  54. package/dist/init/index.js.map +1 -0
  55. package/dist/init/templates.d.ts +11 -0
  56. package/dist/init/templates.js +660 -0
  57. package/dist/init/templates.js.map +1 -0
  58. package/dist/runnerValidacaoRemota.d.ts +9 -0
  59. package/dist/runnerValidacaoRemota.js +9 -0
  60. package/dist/runnerValidacaoRemota.js.map +1 -0
  61. package/dist/runnerValidacaoRemotaBateria.d.ts +10 -0
  62. package/dist/runnerValidacaoRemotaBateria.js +115 -0
  63. package/dist/runnerValidacaoRemotaBateria.js.map +1 -0
  64. package/dist/runnerValidacaoRemotaCli.d.ts +4 -0
  65. package/dist/runnerValidacaoRemotaCli.js +86 -0
  66. package/dist/runnerValidacaoRemotaCli.js.map +1 -0
  67. package/dist/runnerValidacaoRemotaComandos.d.ts +7 -0
  68. package/dist/runnerValidacaoRemotaComandos.js +123 -0
  69. package/dist/runnerValidacaoRemotaComandos.js.map +1 -0
  70. package/dist/runnerValidacaoRemotaEscopo.d.ts +4 -0
  71. package/dist/runnerValidacaoRemotaEscopo.js +79 -0
  72. package/dist/runnerValidacaoRemotaEscopo.js.map +1 -0
  73. package/dist/runnerValidacaoRemotaExecucao.d.ts +2 -0
  74. package/dist/runnerValidacaoRemotaExecucao.js +102 -0
  75. package/dist/runnerValidacaoRemotaExecucao.js.map +1 -0
  76. package/dist/runnerValidacaoRemotaRelatorio.d.ts +3 -0
  77. package/dist/runnerValidacaoRemotaRelatorio.js +93 -0
  78. package/dist/runnerValidacaoRemotaRelatorio.js.map +1 -0
  79. package/dist/runnerValidacaoRemotaServidor.d.ts +3 -0
  80. package/dist/runnerValidacaoRemotaServidor.js +157 -0
  81. package/dist/runnerValidacaoRemotaServidor.js.map +1 -0
  82. package/dist/runnerValidacaoRemotaSnapshot.d.ts +10 -0
  83. package/dist/runnerValidacaoRemotaSnapshot.js +217 -0
  84. package/dist/runnerValidacaoRemotaSnapshot.js.map +1 -0
  85. package/dist/runnerValidacaoRemotaTipos.d.ts +158 -0
  86. package/dist/runnerValidacaoRemotaTipos.js +35 -0
  87. package/dist/runnerValidacaoRemotaTipos.js.map +1 -0
  88. package/dist/runnerValidacaoRemotaUtil.d.ts +3 -0
  89. package/dist/runnerValidacaoRemotaUtil.js +18 -0
  90. package/dist/runnerValidacaoRemotaUtil.js.map +1 -0
  91. package/dist/runnerValidacaoRemotaWorkspace.d.ts +2 -0
  92. package/dist/runnerValidacaoRemotaWorkspace.js +110 -0
  93. package/dist/runnerValidacaoRemotaWorkspace.js.map +1 -0
  94. package/dist/sync/index.d.ts +24 -0
  95. package/dist/sync/index.js +174 -0
  96. package/dist/sync/index.js.map +1 -0
  97. package/docs/AGENT_STARTER.md +109 -0
  98. package/docs/api.md +82 -0
  99. package/docs/cli.md +93 -0
  100. package/docs/como-ensinar-a-sema-para-ia.md +30 -0
  101. package/docs/deploy.md +45 -0
  102. package/docs/documentacao.md +88 -0
  103. package/docs/env.md +115 -0
  104. package/docs/extensao-vscode.md +42 -0
  105. package/docs/fluxo-pratico-ia-sema.md +187 -0
  106. package/docs/instalacao-e-primeiro-uso.md +48 -0
  107. package/docs/integracao-com-ia.md +24 -0
  108. package/docs/mcp.md +48 -0
  109. package/docs/pagamento-ponta-a-ponta.md +171 -0
  110. package/docs/persistencia-vendor-first.md +151 -0
  111. package/docs/prompt-base-ia-sema.md +111 -0
  112. package/docs/repositories.md +69 -0
  113. package/docs/rollback.md +24 -0
  114. package/docs/seguranca.md +126 -0
  115. package/docs/sintaxe.md +218 -0
  116. package/exemplos/profile_conversas.sema +165 -0
  117. package/llms-full.txt +35 -0
  118. package/llms.txt +18 -0
  119. package/node_modules/@sema/gerador-css/package.json +7 -14
  120. package/node_modules/@sema/gerador-dart/package.json +7 -14
  121. package/node_modules/@sema/gerador-html/package.json +7 -14
  122. package/node_modules/@sema/gerador-javascript/package.json +7 -14
  123. package/node_modules/@sema/gerador-lua/package.json +7 -14
  124. package/node_modules/@sema/gerador-python/package.json +7 -14
  125. package/node_modules/@sema/gerador-typescript/package.json +7 -14
  126. package/node_modules/@sema/nucleo/dist/diagnosticos/melhorador.d.ts +22 -0
  127. package/node_modules/@sema/nucleo/dist/diagnosticos/melhorador.js +97 -0
  128. package/node_modules/@sema/nucleo/dist/diagnosticos/melhorador.js.map +1 -0
  129. package/node_modules/@sema/nucleo/dist/index.d.ts +1 -0
  130. package/node_modules/@sema/nucleo/dist/index.js +1 -0
  131. package/node_modules/@sema/nucleo/dist/index.js.map +1 -1
  132. package/node_modules/@sema/nucleo/package.json +7 -10
  133. package/node_modules/@sema/padroes/package.json +7 -10
  134. package/package.json +75 -74
  135. package/exemplos/.prepack-generated +0 -1
  136. package/node_modules/@sema/gerador-css/src/index.ts +0 -605
  137. package/node_modules/@sema/gerador-css/tsconfig.json +0 -13
  138. package/node_modules/@sema/gerador-css/tsconfig.tsbuildinfo +0 -1
  139. package/node_modules/@sema/gerador-dart/src/index.ts +0 -52
  140. package/node_modules/@sema/gerador-dart/tsconfig.json +0 -13
  141. package/node_modules/@sema/gerador-dart/tsconfig.tsbuildinfo +0 -1
  142. package/node_modules/@sema/gerador-html/src/index.ts +0 -185
  143. package/node_modules/@sema/gerador-html/tsconfig.json +0 -13
  144. package/node_modules/@sema/gerador-html/tsconfig.tsbuildinfo +0 -1
  145. package/node_modules/@sema/gerador-javascript/src/index.ts +0 -461
  146. package/node_modules/@sema/gerador-javascript/tsconfig.json +0 -13
  147. package/node_modules/@sema/gerador-javascript/tsconfig.tsbuildinfo +0 -1
  148. package/node_modules/@sema/gerador-lua/src/index.ts +0 -359
  149. package/node_modules/@sema/gerador-lua/tsconfig.json +0 -13
  150. package/node_modules/@sema/gerador-lua/tsconfig.tsbuildinfo +0 -1
  151. package/node_modules/@sema/gerador-python/src/index.ts +0 -850
  152. package/node_modules/@sema/gerador-python/tsconfig.json +0 -13
  153. package/node_modules/@sema/gerador-python/tsconfig.tsbuildinfo +0 -1
  154. package/node_modules/@sema/gerador-typescript/src/index.ts +0 -876
  155. package/node_modules/@sema/gerador-typescript/tsconfig.json +0 -13
  156. package/node_modules/@sema/gerador-typescript/tsconfig.tsbuildinfo +0 -1
  157. package/node_modules/@sema/nucleo/src/ast/tipos.ts +0 -207
  158. package/node_modules/@sema/nucleo/src/diagnosticos/index.ts +0 -43
  159. package/node_modules/@sema/nucleo/src/formatador/index.ts +0 -530
  160. package/node_modules/@sema/nucleo/src/index.ts +0 -183
  161. package/node_modules/@sema/nucleo/src/ir/conversor.ts +0 -1037
  162. package/node_modules/@sema/nucleo/src/ir/modelos.ts +0 -403
  163. package/node_modules/@sema/nucleo/src/lexer/lexer.ts +0 -166
  164. package/node_modules/@sema/nucleo/src/lexer/tokens.ts +0 -79
  165. package/node_modules/@sema/nucleo/src/parser/gramatica.ebnf +0 -41
  166. package/node_modules/@sema/nucleo/src/parser/parser.ts +0 -936
  167. package/node_modules/@sema/nucleo/src/persistencia/contratos.ts +0 -379
  168. package/node_modules/@sema/nucleo/src/semantico/analisador.ts +0 -3126
  169. package/node_modules/@sema/nucleo/src/semantico/estruturas.ts +0 -665
  170. package/node_modules/@sema/nucleo/src/semantico/seguranca.ts +0 -362
  171. package/node_modules/@sema/nucleo/src/util/arquivos.ts +0 -28
  172. package/node_modules/@sema/nucleo/tsconfig.json +0 -9
  173. package/node_modules/@sema/nucleo/tsconfig.tsbuildinfo +0 -1
  174. package/node_modules/@sema/padroes/src/index.ts +0 -382
  175. package/node_modules/@sema/padroes/tsconfig.json +0 -9
  176. package/node_modules/@sema/padroes/tsconfig.tsbuildinfo +0 -1
@@ -0,0 +1,115 @@
1
+ import { mkdir, readdir } from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { TIMEOUT_COMANDO_PADRAO_MS } from "./runnerValidacaoRemotaTipos.js";
4
+ import { dedupe } from "./runnerValidacaoRemotaSnapshot.js";
5
+ import { executarComandoProjeto, executarComandoSema, extrairScoreSemantico, encontrarAvisosAltaSeveridade, lerJsonDeStdout } from "./runnerValidacaoRemotaComandos.js";
6
+ import { contratoEntrada, criarEscopoEvidenciaRemota } from "./runnerValidacaoRemotaEscopo.js";
7
+ import { hashArquivo } from "./runnerValidacaoRemotaUtil.js";
8
+ async function listarArtefatos(pasta) {
9
+ const artefatos = [];
10
+ async function visitar(diretorio) {
11
+ let entradas;
12
+ try {
13
+ entradas = await readdir(diretorio, { withFileTypes: true });
14
+ }
15
+ catch {
16
+ return;
17
+ }
18
+ for (const entrada of entradas) {
19
+ const caminho = path.join(diretorio, entrada.name);
20
+ if (entrada.isDirectory()) {
21
+ await visitar(caminho);
22
+ continue;
23
+ }
24
+ const relativo = path.relative(pasta, caminho).replace(/\\/g, "/");
25
+ artefatos.push({
26
+ nome: relativo,
27
+ tipo: path.extname(entrada.name).replace(/^\./, "") || "txt",
28
+ caminho,
29
+ hash: await hashArquivo(caminho),
30
+ publico: false,
31
+ });
32
+ }
33
+ }
34
+ await visitar(pasta);
35
+ return artefatos.sort((a, b) => a.nome.localeCompare(b.nome, "pt-BR"));
36
+ }
37
+ export function resumirRelatorio(status, modo, diagnosticos, escopo) {
38
+ const base = `Runner remoto Sema finalizou com status ${status} no modo ${modo}. ` +
39
+ `Escopo: origem=${escopo.origem_snapshot}; tenant=${escopo.tenant}; workspace=${escopo.workspace_id}; ` +
40
+ `entrada=${escopo.entrada_sema}; drift=${escopo.escopo_drift}; fontes=${escopo.fontes_conclusao.join("+")}.`;
41
+ if (!escopo.codigo_verificado) {
42
+ return `${base} Código vivo não foi verificado neste resultado. ${escopo.ressalva_escopo}`;
43
+ }
44
+ if (!escopo.testes_projeto_executados) {
45
+ return `${base} Testes do projeto não foram executados neste resultado. ${escopo.ressalva_escopo}`;
46
+ }
47
+ if (diagnosticos.length === 0 && escopo.conclusao_limpa_autorizada) {
48
+ return `${base} Sem bloqueios neste escopo. ${escopo.ressalva_escopo}`;
49
+ }
50
+ return `${base} Bloqueios/diagnósticos: ${diagnosticos.slice(0, 5).join(", ")}. ${escopo.ressalva_escopo}`;
51
+ }
52
+ export async function executarBateriaVerificacaoRemota(workspace, snapshot, pastaArtefatos, timeoutMs = TIMEOUT_COMANDO_PADRAO_MS) {
53
+ await mkdir(pastaArtefatos, { recursive: true });
54
+ const pastaComandos = path.join(pastaArtefatos, "comandos");
55
+ const entrada = contratoEntrada(snapshot);
56
+ const comandos = [];
57
+ let ordem = 1;
58
+ comandos.push(await executarComandoSema(workspace, pastaComandos, ordem++, "validar", ["validar", entrada, "--json"], timeoutMs));
59
+ comandos.push(await executarComandoSema(workspace, pastaComandos, ordem++, "drift", ["drift", entrada, "--escopo", "projeto", "--json"], timeoutMs));
60
+ comandos.push(await executarComandoSema(workspace, pastaComandos, ordem++, "compilar", ["compilar", entrada, "--alvo", "typescript", "--saida", path.join(pastaArtefatos, "typescript"), "--estrutura", "modulos", "--framework", "base"], timeoutMs));
61
+ comandos.push(await executarComandoSema(workspace, pastaComandos, ordem++, "verificar", ["verificar", entrada, "--saida", path.join(pastaArtefatos, "verificar"), "--json"], timeoutMs));
62
+ if (snapshot.modo !== "CONTRATOS_APENAS") {
63
+ for (const comandoProjeto of snapshot.comandos_projeto) {
64
+ comandos.push(await executarComandoProjeto(workspace, pastaComandos, ordem++, comandoProjeto, timeoutMs));
65
+ }
66
+ }
67
+ const driftJson = await lerJsonDeStdout(comandos.find((comando) => comando.nome === "drift"));
68
+ const jsons = await Promise.all(comandos.map((comando) => lerJsonDeStdout(comando)));
69
+ const avisosAlta = dedupe(jsons.flatMap((json) => encontrarAvisosAltaSeveridade(json)));
70
+ const diagnosticos = [];
71
+ if (snapshot.modo === "CONTRATOS_APENAS") {
72
+ diagnosticos.push("codigo_nao_verificado_neste_modo");
73
+ }
74
+ if (snapshot.modo !== "CONTRATOS_APENAS" && snapshot.comandos_projeto.length === 0) {
75
+ diagnosticos.push("testes_projeto_nao_fornecidos");
76
+ }
77
+ for (const comando of comandos) {
78
+ if (!comando.sucesso) {
79
+ diagnosticos.push(`comando_falhou:${comando.nome}`);
80
+ }
81
+ }
82
+ if (avisosAlta.length > 0) {
83
+ diagnosticos.push("warning_alta_severidade");
84
+ }
85
+ const status = comandos.some((comando) => !comando.sucesso)
86
+ ? "FALHOU"
87
+ : diagnosticos.length > 0
88
+ ? "BLOQUEADO"
89
+ : "APROVADO";
90
+ const score = extrairScoreSemantico(driftJson, comandos);
91
+ const artefatos = await listarArtefatos(pastaArtefatos);
92
+ const diagnosticosUnicos = dedupe(diagnosticos);
93
+ const escopoEvidencia = criarEscopoEvidenciaRemota(workspace, snapshot, entrada, status, diagnosticosUnicos, comandos);
94
+ const relatorio = {
95
+ job_id: workspace.id,
96
+ modo: snapshot.modo,
97
+ status,
98
+ score_semantico: score,
99
+ diagnosticos: diagnosticosUnicos,
100
+ avisos_alta_severidade: avisosAlta,
101
+ comandos_executados: comandos,
102
+ artefatos,
103
+ escopo_evidencia: escopoEvidencia,
104
+ resumo_ia: resumirRelatorio(status, snapshot.modo, diagnosticosUnicos, escopoEvidencia),
105
+ };
106
+ return {
107
+ relatorio,
108
+ status,
109
+ score_semantico: score,
110
+ artefatos,
111
+ diagnosticos: relatorio.diagnosticos,
112
+ avisos_alta_severidade: avisosAlta,
113
+ };
114
+ }
115
+ //# sourceMappingURL=runnerValidacaoRemotaBateria.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runnerValidacaoRemotaBateria.js","sourceRoot":"","sources":["../src/runnerValidacaoRemotaBateria.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export declare function obterOpcaoLocal(args: string[], nome: string, padrao?: string): string | undefined;
2
+ export declare function possuiFlagLocal(args: string[], nome: string): boolean;
3
+ export declare function ajudaRunnerValidacaoRemota(): string;
4
+ export declare function comandoRunnerValidacaoRemota(args: string[], cwd?: string): Promise<number>;
@@ -0,0 +1,86 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { executarValidacaoRemota } from "./runnerValidacaoRemotaExecucao.js";
4
+ import { lerJsonSeguro } from "./runnerValidacaoRemotaComandos.js";
5
+ import { normalizarModo } from "./runnerValidacaoRemotaSnapshot.js";
6
+ async function lerStdin() {
7
+ const chunks = [];
8
+ for await (const chunk of process.stdin) {
9
+ chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));
10
+ }
11
+ return Buffer.concat(chunks).toString("utf8");
12
+ }
13
+ export function obterOpcaoLocal(args, nome, padrao) {
14
+ const indice = args.findIndex((arg) => arg === nome);
15
+ if (indice === -1) {
16
+ return padrao;
17
+ }
18
+ return args[indice + 1] ?? padrao;
19
+ }
20
+ export function possuiFlagLocal(args, nome) {
21
+ return args.includes(nome);
22
+ }
23
+ export function ajudaRunnerValidacaoRemota() {
24
+ return [
25
+ "Uso:",
26
+ " sema runner validar-remoto --snapshot <arquivo.json|-> --saida <diretorio> [--modo <CONTRATOS_APENAS|CODIGO_SELECIONADO|CODIGO_COMPLETO>] [--contrato <arquivo.sema>] [--manter-workspace] [--json]",
27
+ " sema runner servidor --porta <porta> --saida <diretorio> [--host <host>] [--token <bearer>] [--json]",
28
+ "",
29
+ "Executa validacao remota real: recebe snapshot tipado, cria workspace efemero, roda validar/drift/compilar/verificar com a CLI interna e publica relatorio auditavel.",
30
+ "No modo servidor, a VPS recebe GET /healthz e POST /validacoes; o cliente remoto nao precisa ter CLI local.",
31
+ ].join("\n");
32
+ }
33
+ export async function comandoRunnerValidacaoRemota(args, cwd = process.cwd()) {
34
+ if (possuiFlagLocal(args, "--help") || possuiFlagLocal(args, "-h")) {
35
+ console.log(ajudaRunnerValidacaoRemota());
36
+ return 0;
37
+ }
38
+ const snapshotArquivo = obterOpcaoLocal(args, "--snapshot") ?? obterOpcaoLocal(args, "--entrada");
39
+ const json = possuiFlagLocal(args, "--json");
40
+ if (!snapshotArquivo) {
41
+ const erro = "Uso: sema runner validar-remoto --snapshot <arquivo.json|-> --saida <diretorio> --json";
42
+ if (json) {
43
+ console.log(JSON.stringify({ comando: "runner validar-remoto", sucesso: false, erro }, null, 2));
44
+ }
45
+ else {
46
+ console.error(erro);
47
+ }
48
+ return 1;
49
+ }
50
+ const conteudo = snapshotArquivo === "-"
51
+ ? await lerStdin()
52
+ : await readFile(path.resolve(cwd, snapshotArquivo), "utf8");
53
+ const entrada = lerJsonSeguro(conteudo);
54
+ if (!entrada || typeof entrada !== "object" || Array.isArray(entrada)) {
55
+ const erro = "Snapshot remoto precisa ser um objeto JSON.";
56
+ if (json) {
57
+ console.log(JSON.stringify({ comando: "runner validar-remoto", sucesso: false, erro }, null, 2));
58
+ }
59
+ else {
60
+ console.error(erro);
61
+ }
62
+ return 1;
63
+ }
64
+ const modoCli = obterOpcaoLocal(args, "--modo");
65
+ const resultado = await executarValidacaoRemota(entrada, {
66
+ cwd,
67
+ saida: obterOpcaoLocal(args, "--saida", "./.tmp/runner-validacao-remota"),
68
+ manterWorkspace: possuiFlagLocal(args, "--manter-workspace"),
69
+ modoOverride: modoCli ? normalizarModo(modoCli) : undefined,
70
+ contratoAlvo: obterOpcaoLocal(args, "--contrato"),
71
+ });
72
+ if (json) {
73
+ console.log(JSON.stringify(resultado, null, 2));
74
+ }
75
+ else {
76
+ console.log(`Runner remoto Sema: ${resultado.status}`);
77
+ console.log(`Modo: ${resultado.modo}`);
78
+ console.log(`Pode liberar: ${resultado.podeLiberar ? "sim" : "nao"}`);
79
+ console.log(`Relatorio: ${resultado.relatorioArquivo}`);
80
+ if (resultado.relatorio.diagnosticos.length > 0) {
81
+ console.log(`Diagnosticos: ${resultado.relatorio.diagnosticos.join(", ")}`);
82
+ }
83
+ }
84
+ return resultado.podeLiberar ? 0 : 1;
85
+ }
86
+ //# sourceMappingURL=runnerValidacaoRemotaCli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runnerValidacaoRemotaCli.js","sourceRoot":"","sources":["../src/runnerValidacaoRemotaCli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { ComandoExecutadoRunner, ComandoProjetoRemoto, WorkspaceRunner } from "./runnerValidacaoRemotaTipos.js";
2
+ export declare function executarComandoSema(workspace: WorkspaceRunner, pastaComandos: string, ordem: number, nome: string, args: string[], timeoutMs: number): Promise<ComandoExecutadoRunner>;
3
+ export declare function executarComandoProjeto(workspace: WorkspaceRunner, pastaComandos: string, ordem: number, comandoProjeto: ComandoProjetoRemoto, timeoutMs: number): Promise<ComandoExecutadoRunner>;
4
+ export declare function lerJsonSeguro(texto: string): unknown;
5
+ export declare function lerJsonDeStdout(comando: ComandoExecutadoRunner): Promise<unknown>;
6
+ export declare function encontrarAvisosAltaSeveridade(valor: unknown, caminho?: string): string[];
7
+ export declare function extrairScoreSemantico(driftJson: unknown, comandos: ComandoExecutadoRunner[]): number;
@@ -0,0 +1,123 @@
1
+ import { spawnSync } from "node:child_process";
2
+ import { mkdir, readFile, writeFile } from "node:fs/promises";
3
+ import path from "node:path";
4
+ import { fileURLToPath } from "node:url";
5
+ import { redigirTexto } from "./runnerValidacaoRemotaSnapshot.js";
6
+ function caminhoCliAtual() {
7
+ return fileURLToPath(new URL("./index.js", import.meta.url));
8
+ }
9
+ async function escreverSaidaComando(pastaComandos, ordem, nome, stdout, stderr) {
10
+ await mkdir(pastaComandos, { recursive: true });
11
+ const prefixo = `${String(ordem).padStart(2, "0")}-${nome.replace(/[^a-z0-9_-]+/gi, "-").toLowerCase()}`;
12
+ const stdoutArquivo = path.join(pastaComandos, `${prefixo}.stdout.txt`);
13
+ const stderrArquivo = path.join(pastaComandos, `${prefixo}.stderr.txt`);
14
+ await writeFile(stdoutArquivo, redigirTexto(stdout), "utf8");
15
+ await writeFile(stderrArquivo, redigirTexto(stderr), "utf8");
16
+ return { stdoutArquivo, stderrArquivo };
17
+ }
18
+ export async function executarComandoSema(workspace, pastaComandos, ordem, nome, args, timeoutMs) {
19
+ const inicio = Date.now();
20
+ const execucao = spawnSync(process.execPath, [caminhoCliAtual(), ...args], {
21
+ cwd: workspace.caminho,
22
+ stdio: "pipe",
23
+ encoding: "utf8",
24
+ timeout: timeoutMs,
25
+ windowsHide: true,
26
+ env: {
27
+ ...process.env,
28
+ SEMA_RUNNER_REMOTO: "1",
29
+ },
30
+ });
31
+ const stdout = typeof execucao.stdout === "string" ? execucao.stdout : "";
32
+ const stderr = typeof execucao.stderr === "string" ? execucao.stderr : "";
33
+ const saidas = await escreverSaidaComando(pastaComandos, ordem, nome, stdout, stderr);
34
+ const codigoSaida = execucao.status ?? (execucao.signal ? 1 : 0);
35
+ return {
36
+ nome,
37
+ args,
38
+ codigoSaida,
39
+ stdoutArquivo: saidas.stdoutArquivo,
40
+ stderrArquivo: saidas.stderrArquivo,
41
+ duracaoMs: Date.now() - inicio,
42
+ sucesso: !execucao.error && !execucao.signal && codigoSaida === 0,
43
+ };
44
+ }
45
+ export async function executarComandoProjeto(workspace, pastaComandos, ordem, comandoProjeto, timeoutMs) {
46
+ const inicio = Date.now();
47
+ const execucao = spawnSync(comandoProjeto.comando, comandoProjeto.args ?? [], {
48
+ cwd: workspace.caminho,
49
+ stdio: "pipe",
50
+ encoding: "utf8",
51
+ timeout: timeoutMs,
52
+ windowsHide: true,
53
+ shell: process.platform === "win32",
54
+ env: {
55
+ ...process.env,
56
+ SEMA_RUNNER_REMOTO: "1",
57
+ },
58
+ });
59
+ const stdout = typeof execucao.stdout === "string" ? execucao.stdout : "";
60
+ const stderr = typeof execucao.stderr === "string" ? execucao.stderr : "";
61
+ const saidas = await escreverSaidaComando(pastaComandos, ordem, `projeto-${comandoProjeto.comando}`, stdout, stderr);
62
+ const codigoSaida = execucao.status ?? (execucao.signal ? 1 : 0);
63
+ return {
64
+ nome: `projeto:${comandoProjeto.comando}`,
65
+ args: comandoProjeto.args ?? [],
66
+ codigoSaida,
67
+ stdoutArquivo: saidas.stdoutArquivo,
68
+ stderrArquivo: saidas.stderrArquivo,
69
+ duracaoMs: Date.now() - inicio,
70
+ sucesso: !execucao.error && !execucao.signal && codigoSaida === 0,
71
+ };
72
+ }
73
+ export function lerJsonSeguro(texto) {
74
+ try {
75
+ return JSON.parse(texto.replace(/^\uFEFF/, ""));
76
+ }
77
+ catch {
78
+ return null;
79
+ }
80
+ }
81
+ export async function lerJsonDeStdout(comando) {
82
+ const texto = await readFile(comando.stdoutArquivo, "utf8");
83
+ return lerJsonSeguro(texto);
84
+ }
85
+ export function encontrarAvisosAltaSeveridade(valor, caminho = "root") {
86
+ if (!valor || typeof valor !== "object") {
87
+ return [];
88
+ }
89
+ const avisos = [];
90
+ if (Array.isArray(valor)) {
91
+ valor.forEach((item, indice) => avisos.push(...encontrarAvisosAltaSeveridade(item, `${caminho}.${indice}`)));
92
+ return avisos;
93
+ }
94
+ const objeto = valor;
95
+ const severidade = objeto["severidade"] ?? objeto["severity"];
96
+ const severidadeAlta = (typeof severidade === "number" && severidade >= 4)
97
+ || (typeof severidade === "string" && /^(4|5|alta|high|critical|critica|crítica)$/i.test(severidade));
98
+ if (severidadeAlta) {
99
+ const id = typeof objeto["id"] === "string" ? objeto["id"] : caminho;
100
+ const mensagem = typeof objeto["mensagem"] === "string" ? objeto["mensagem"] : typeof objeto["message"] === "string" ? objeto["message"] : "";
101
+ avisos.push(mensagem ? `${id}:${mensagem}` : id);
102
+ }
103
+ for (const [chave, item] of Object.entries(objeto)) {
104
+ if (item && typeof item === "object") {
105
+ avisos.push(...encontrarAvisosAltaSeveridade(item, `${caminho}.${chave}`));
106
+ }
107
+ }
108
+ return avisos;
109
+ }
110
+ export function extrairScoreSemantico(driftJson, comandos) {
111
+ if (driftJson && typeof driftJson === "object" && !Array.isArray(driftJson)) {
112
+ const objeto = driftJson;
113
+ const resumo = objeto["resumo_operacional"];
114
+ if (resumo && typeof resumo === "object" && !Array.isArray(resumo)) {
115
+ const score = resumo["scoreMedio"];
116
+ if (typeof score === "number") {
117
+ return score;
118
+ }
119
+ }
120
+ }
121
+ return comandos.every((comando) => comando.sucesso) ? 90 : 0;
122
+ }
123
+ //# sourceMappingURL=runnerValidacaoRemotaComandos.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runnerValidacaoRemotaComandos.js","sourceRoot":"","sources":["../src/runnerValidacaoRemotaComandos.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { ComandoExecutadoRunner, EscopoEvidenciaRemota, ResultadoRecebimentoSnapshot, SnapshotProjetoRemoto, StatusJobVerificacao, WorkspaceRunner } from "./runnerValidacaoRemotaTipos.js";
2
+ export declare function contratoEntrada(snapshot: SnapshotProjetoRemoto): string;
3
+ export declare function criarEscopoEvidenciaRemota(workspace: WorkspaceRunner, snapshot: SnapshotProjetoRemoto, entrada: string, status: StatusJobVerificacao, diagnosticos: string[], comandos: ComandoExecutadoRunner[]): EscopoEvidenciaRemota;
4
+ export declare function criarEscopoEvidenciaAntesDoWorkspace(recebimento: ResultadoRecebimentoSnapshot): EscopoEvidenciaRemota;
@@ -0,0 +1,79 @@
1
+ import { dedupe, normalizarCaminhoRelativo } from "./runnerValidacaoRemotaSnapshot.js";
2
+ export function contratoEntrada(snapshot) {
3
+ if (snapshot.contrato_alvo) {
4
+ const normalizado = normalizarCaminhoRelativo(snapshot.contrato_alvo);
5
+ if (normalizado.caminho) {
6
+ return normalizado.caminho;
7
+ }
8
+ }
9
+ return ".";
10
+ }
11
+ function fontesConclusaoDoSnapshot(snapshot) {
12
+ const fontes = ["contrato", "indice", "comandos_sema"];
13
+ if (snapshot.documentacao.length > 0) {
14
+ fontes.push("documentacao");
15
+ }
16
+ if (snapshot.modo !== "CONTRATOS_APENAS" && snapshot.codigo.length > 0) {
17
+ fontes.push("codigo");
18
+ }
19
+ if (snapshot.comandos_projeto.length > 0) {
20
+ fontes.push("testes_projeto");
21
+ }
22
+ return dedupe(fontes);
23
+ }
24
+ function comandoSemaLegivel(args) {
25
+ return ["sema", ...args].join(" ");
26
+ }
27
+ function ressalvaEscopo(snapshot, entrada) {
28
+ const base = `Resultado limitado ao snapshot ${snapshot.origem} do tenant ${snapshot.tenant}, no modo ${snapshot.modo}.`;
29
+ if (entrada === ".") {
30
+ return `${base} A entrada Sema foi o projeto do snapshot inteiro; não generalize para outro projeto, outro mirror remoto ou /srv/sema/projetos/Sema sem nova verificação.`;
31
+ }
32
+ return `${base} A entrada Sema foi ${entrada}; não generalize para outro contrato, outro projeto, outro mirror remoto ou /srv/sema/projetos/Sema sem nova verificação.`;
33
+ }
34
+ export function criarEscopoEvidenciaRemota(workspace, snapshot, entrada, status, diagnosticos, comandos) {
35
+ const comandoDrift = comandos.find((comando) => comando.nome === "drift");
36
+ const codigoVerificado = snapshot.modo !== "CONTRATOS_APENAS" && snapshot.codigo.length > 0 && Boolean(comandoDrift?.sucesso);
37
+ const testesProjetoExecutados = comandos.some((comando) => comando.nome.startsWith("projeto:") && comando.sucesso);
38
+ const conclusaoLimpaAutorizada = status === "APROVADO" &&
39
+ diagnosticos.length === 0 &&
40
+ comandos.every((comando) => comando.sucesso) &&
41
+ codigoVerificado &&
42
+ testesProjetoExecutados;
43
+ return {
44
+ origem_snapshot: snapshot.origem,
45
+ tenant: snapshot.tenant,
46
+ workspace_id: workspace.id,
47
+ workspace_caminho: workspace.caminho,
48
+ modo_verificacao: snapshot.modo,
49
+ contrato_alvo: snapshot.contrato_alvo ?? null,
50
+ entrada_sema: entrada,
51
+ escopo_drift: "projeto",
52
+ fontes_conclusao: fontesConclusaoDoSnapshot(snapshot),
53
+ codigo_verificado: codigoVerificado,
54
+ testes_projeto_executados: testesProjetoExecutados,
55
+ comando_drift: comandoSemaLegivel(["drift", entrada, "--escopo", "projeto", "--json"]),
56
+ conclusao_limpa_autorizada: conclusaoLimpaAutorizada,
57
+ ressalva_escopo: ressalvaEscopo(snapshot, entrada),
58
+ };
59
+ }
60
+ export function criarEscopoEvidenciaAntesDoWorkspace(recebimento) {
61
+ const entrada = contratoEntrada(recebimento.snapshot);
62
+ return {
63
+ origem_snapshot: recebimento.snapshot.origem,
64
+ tenant: recebimento.snapshot.tenant,
65
+ workspace_id: "nao_provisionado",
66
+ workspace_caminho: "nao_provisionado",
67
+ modo_verificacao: recebimento.modo_verificacao,
68
+ contrato_alvo: recebimento.snapshot.contrato_alvo ?? null,
69
+ entrada_sema: entrada,
70
+ escopo_drift: "nao_executado",
71
+ fontes_conclusao: fontesConclusaoDoSnapshot(recebimento.snapshot),
72
+ codigo_verificado: false,
73
+ testes_projeto_executados: false,
74
+ comando_drift: "nao_executado",
75
+ conclusao_limpa_autorizada: false,
76
+ ressalva_escopo: `Snapshot recusado antes de criar workspace. Nenhum drift foi executado; não trate este resultado como validação de código, projeto ou /srv/sema/projetos/Sema.`,
77
+ };
78
+ }
79
+ //# sourceMappingURL=runnerValidacaoRemotaEscopo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runnerValidacaoRemotaEscopo.js","sourceRoot":"","sources":["../src/runnerValidacaoRemotaEscopo.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { type EntradaSnapshotRemoto, type OpcoesRunnerValidacaoRemota, type ResultadoRunnerValidacaoRemota } from "./runnerValidacaoRemotaTipos.js";
2
+ export declare function executarValidacaoRemota(entrada: EntradaSnapshotRemoto, opcoes: OpcoesRunnerValidacaoRemota): Promise<ResultadoRunnerValidacaoRemota>;
@@ -0,0 +1,102 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { mkdir, rm } from "node:fs/promises";
3
+ import os from "node:os";
4
+ import path from "node:path";
5
+ import { PREFIXO_WORKSPACE, TIMEOUT_COMANDO_PADRAO_MS } from "./runnerValidacaoRemotaTipos.js";
6
+ import { receberSnapshotProjetoRemoto } from "./runnerValidacaoRemotaSnapshot.js";
7
+ import { provisionarWorkspaceRunner } from "./runnerValidacaoRemotaWorkspace.js";
8
+ import { executarBateriaVerificacaoRemota, resumirRelatorio } from "./runnerValidacaoRemotaBateria.js";
9
+ import { fecharJobVerificacaoRemota, publicarRelatorioVerificacaoRemota } from "./runnerValidacaoRemotaRelatorio.js";
10
+ import { criarEscopoEvidenciaAntesDoWorkspace } from "./runnerValidacaoRemotaEscopo.js";
11
+ async function removerWorkspaceSeguro(workspace) {
12
+ if (!workspace) {
13
+ return false;
14
+ }
15
+ const caminho = path.resolve(workspace.caminho);
16
+ const tmp = path.resolve(os.tmpdir());
17
+ const relativo = path.relative(tmp, caminho);
18
+ if (relativo.startsWith("..") || path.isAbsolute(relativo) || !path.basename(caminho).startsWith(PREFIXO_WORKSPACE)) {
19
+ return false;
20
+ }
21
+ await rm(caminho, { recursive: true, force: true });
22
+ return true;
23
+ }
24
+ async function relatorioBloqueadoAntesDoWorkspace(recebimento, saida) {
25
+ await mkdir(saida, { recursive: true });
26
+ const jobId = randomUUID();
27
+ const escopoEvidencia = criarEscopoEvidenciaAntesDoWorkspace(recebimento);
28
+ const relatorio = {
29
+ job_id: jobId,
30
+ modo: recebimento.modo_verificacao,
31
+ status: "BLOQUEADO",
32
+ score_semantico: 0,
33
+ diagnosticos: recebimento.bloqueios,
34
+ avisos_alta_severidade: [],
35
+ comandos_executados: [],
36
+ artefatos: [],
37
+ escopo_evidencia: escopoEvidencia,
38
+ resumo_ia: resumirRelatorio("BLOQUEADO", recebimento.modo_verificacao, recebimento.bloqueios, escopoEvidencia),
39
+ };
40
+ const publicacao = await publicarRelatorioVerificacaoRemota(relatorio, [], saida);
41
+ const fechamento = fecharJobVerificacaoRemota(relatorio);
42
+ return {
43
+ comando: "runner validar-remoto",
44
+ sucesso: false,
45
+ status: "BLOQUEADO",
46
+ podeLiberar: false,
47
+ jobId,
48
+ modo: recebimento.modo_verificacao,
49
+ snapshot: {
50
+ origem: recebimento.snapshot.origem,
51
+ tenant: recebimento.snapshot.tenant,
52
+ contratos: recebimento.snapshot.contratos.length,
53
+ codigo: recebimento.snapshot.codigo.length,
54
+ documentacao: recebimento.snapshot.documentacao.length,
55
+ },
56
+ workspace: null,
57
+ workspaceRemovido: false,
58
+ relatorio,
59
+ publicacao,
60
+ fechamento,
61
+ relatorioArquivo: publicacao.url_relatorio,
62
+ };
63
+ }
64
+ export async function executarValidacaoRemota(entrada, opcoes) {
65
+ const saida = path.resolve(opcoes.cwd, opcoes.saida);
66
+ const recebimento = receberSnapshotProjetoRemoto(entrada, {
67
+ modoOverride: opcoes.modoOverride,
68
+ contratoAlvo: opcoes.contratoAlvo,
69
+ });
70
+ if (!recebimento.pronto_para_workspace) {
71
+ return relatorioBloqueadoAntesDoWorkspace(recebimento, saida);
72
+ }
73
+ await mkdir(saida, { recursive: true });
74
+ const provisionamento = await provisionarWorkspaceRunner(recebimento.snapshot);
75
+ const pastaArtefatos = path.join(saida, "artefatos", provisionamento.workspace.id);
76
+ const bateria = await executarBateriaVerificacaoRemota(provisionamento.workspace, recebimento.snapshot, pastaArtefatos, opcoes.timeoutMs ?? TIMEOUT_COMANDO_PADRAO_MS);
77
+ const publicacao = await publicarRelatorioVerificacaoRemota(bateria.relatorio, bateria.artefatos, saida);
78
+ const fechamento = fecharJobVerificacaoRemota(bateria.relatorio);
79
+ const workspaceRemovido = opcoes.manterWorkspace ? false : await removerWorkspaceSeguro(provisionamento.workspace);
80
+ return {
81
+ comando: "runner validar-remoto",
82
+ sucesso: fechamento.pode_liberar,
83
+ status: bateria.status,
84
+ podeLiberar: fechamento.pode_liberar,
85
+ jobId: bateria.relatorio.job_id,
86
+ modo: recebimento.modo_verificacao,
87
+ snapshot: {
88
+ origem: recebimento.snapshot.origem,
89
+ tenant: recebimento.snapshot.tenant,
90
+ contratos: recebimento.snapshot.contratos.length,
91
+ codigo: recebimento.snapshot.codigo.length,
92
+ documentacao: recebimento.snapshot.documentacao.length,
93
+ },
94
+ workspace: provisionamento.workspace,
95
+ workspaceRemovido,
96
+ relatorio: bateria.relatorio,
97
+ publicacao,
98
+ fechamento,
99
+ relatorioArquivo: publicacao.url_relatorio,
100
+ };
101
+ }
102
+ //# sourceMappingURL=runnerValidacaoRemotaExecucao.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runnerValidacaoRemotaExecucao.js","sourceRoot":"","sources":["../src/runnerValidacaoRemotaExecucao.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { ArtefatoVerificacaoRemota, RelatorioVerificacaoRemota, ResultadoFechamentoJob, ResultadoPublicacaoRelatorio } from "./runnerValidacaoRemotaTipos.js";
2
+ export declare function publicarRelatorioVerificacaoRemota(relatorio: RelatorioVerificacaoRemota, artefatos: ArtefatoVerificacaoRemota[], destino: string): Promise<ResultadoPublicacaoRelatorio>;
3
+ export declare function fecharJobVerificacaoRemota(relatorio: RelatorioVerificacaoRemota, justificativas?: string[]): ResultadoFechamentoJob;