@semacode/cli 1.3.1 → 1.3.5

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.
package/dist/index.js CHANGED
@@ -60,8 +60,8 @@ Comandos essenciais:
60
60
  - validacao: \`sema validar <arquivo.sema> --json\`
61
61
  - diagnosticos: \`sema diagnosticos <arquivo.sema> --json\`
62
62
  - formatacao: \`sema formatar <arquivo.sema>\`
63
- - importacao assistida de legado: \`sema importar <nestjs|fastapi|flask|nextjs|nextjs-consumer|react-vite-consumer|angular-consumer|flutter-consumer|firebase|dotnet|java|go|rust|cpp|typescript|python|dart> <diretorio> --saida <diretorio>\`
64
- - geracao de codigo: \`sema compilar <arquivo-ou-pasta> --alvo <typescript|python|dart|lua> --saida <diretorio>\`
63
+ - importacao assistida de legado: \`sema importar <nestjs|fastapi|flask|nextjs|nextjs-consumer|react-vite-consumer|angular-consumer|flutter-consumer|firebase|dotnet|java|go|rust|cpp|typescript|python|dart> <diretorio> --saida <diretorio>\`
64
+ - geracao de codigo: \`sema compilar <arquivo-ou-pasta> --alvo <typescript|python|dart|lua> --saida <diretorio>\`
65
65
  - verificacao final: \`sema verificar <arquivo-ou-pasta> [--json]\`
66
66
 
67
67
  Antes de editar:
@@ -100,24 +100,24 @@ Superficies que a IA deve enxergar como first-class:
100
100
 
101
101
  Nao improvise quando faltar contexto.
102
102
  `;
103
- const PROMPT_BASE_IA = `Voce esta trabalhando com Sema, um Protocolo de Governanca de Intencao orientado a contrato, desenhado para operacao por IA.
104
-
105
- Trate a Sema como camada semantica e linguagem de especificacao executavel feita para IA, nao para leitura humana confortavel. Nao invente sintaxe, palavras-chave ou blocos fora da gramatica e dos exemplos oficiais.
106
-
107
- Fontes de verdade, em ordem:
108
- 1. se o projeto expuser \`SEMA_CONTEXT.md\`, comece por ele
109
- 2. \`SEMA_BRIEF.md\`
110
- 3. \`SEMA_INDEX.json\`
111
- 4. README do projeto
112
- 5. gramatica e documentacao de sintaxe da Sema
113
- 6. especificacao semantica da linguagem
114
- 7. exemplos oficiais, com prioridade para o vertical de pagamento
115
- 8. \`sema resumo\` e \`briefing.min.json\` quando a IA for pequena
116
- 9. AST, IR e diagnosticos exportados pela CLI em JSON quando a capacidade aguentar
117
-
118
- Regras de operacao:
119
- - preserve o significado semantico
120
- - use o formatador oficial da Sema como fonte unica de estilo
103
+ const PROMPT_BASE_IA = `Voce esta trabalhando com Sema, um Protocolo de Governanca de Intencao orientado a contrato, desenhado para operacao por IA.
104
+
105
+ Trate a Sema como camada semantica e linguagem de especificacao executavel feita para IA, nao para leitura humana confortavel. Nao invente sintaxe, palavras-chave ou blocos fora da gramatica e dos exemplos oficiais.
106
+
107
+ Fontes de verdade, em ordem:
108
+ 1. se o projeto expuser \`SEMA_CONTEXT.md\`, comece por ele
109
+ 2. \`SEMA_BRIEF.md\`
110
+ 3. \`SEMA_INDEX.json\`
111
+ 4. README do projeto
112
+ 5. gramatica e documentacao de sintaxe da Sema
113
+ 6. especificacao semantica da linguagem
114
+ 7. exemplos oficiais, com prioridade para o vertical de pagamento
115
+ 8. \`sema resumo\` e \`briefing.min.json\` quando a IA for pequena
116
+ 9. AST, IR e diagnosticos exportados pela CLI em JSON quando a capacidade aguentar
117
+
118
+ Regras de operacao:
119
+ - preserve o significado semantico
120
+ - use o formatador oficial da Sema como fonte unica de estilo
121
121
  - use diagnosticos estruturados como contrato de correcao
122
122
  - use a IR como fonte de verdade semantica quando houver duvida
123
123
  - nao conclua uma alteracao sem validar e verificar o modulo
@@ -432,29 +432,35 @@ async function escreverArquivos(base, arquivos) {
432
432
  }
433
433
  }
434
434
  function obterOpcao(args, nome, padrao) {
435
- const indice = args.findIndex((arg) => arg === nome);
436
- if (indice === -1) {
437
- return padrao;
435
+ const nomes = [nome, ...Object.entries(ALIAS_OPCOES).filter(([, v]) => v === nome).map(([k]) => k)];
436
+ for (const n of nomes) {
437
+ const indice = args.findIndex((arg) => arg === n);
438
+ if (indice !== -1)
439
+ return args[indice + 1] ?? padrao;
438
440
  }
439
- return args[indice + 1] ?? padrao;
441
+ return padrao;
440
442
  }
441
443
  function possuiFlag(args, nome) {
442
444
  return args.includes(nome);
443
445
  }
444
446
  const OPCOES_COM_VALOR = new Set([
445
447
  "--template",
446
- "--alvo",
447
- "--saida",
448
+ "--alvo", "-a",
449
+ "--saida", "-s",
448
450
  "--estrutura",
449
451
  "--framework",
450
452
  "--namespace",
451
453
  "--para",
452
454
  ]);
455
+ const ALIAS_OPCOES = {
456
+ "-a": "--alvo",
457
+ "-s": "--saida",
458
+ };
453
459
  function obterPosicionais(args) {
454
460
  const posicionais = [];
455
461
  for (let indice = 0; indice < args.length; indice += 1) {
456
462
  const atual = args[indice];
457
- if (atual.startsWith("--")) {
463
+ if (atual.startsWith("-")) {
458
464
  if (OPCOES_COM_VALOR.has(atual)) {
459
465
  indice += 1;
460
466
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@semacode/cli",
3
- "version": "1.3.1",
3
+ "version": "1.3.5",
4
4
  "type": "module",
5
5
  "description": "CLI da Sema para validar contratos, medir drift e governar a navegacao operacional de agentes sobre software vivo em backend e front consumer.",
6
6
  "license": "MIT",
@@ -37,15 +37,15 @@
37
37
  "build": "tsc -p tsconfig.json"
38
38
  },
39
39
  "dependencies": {
40
- "@sema/nucleo": "1.3.1",
41
- "@sema/gerador-dart": "1.3.1",
42
- "@sema/gerador-lua": "1.3.1",
43
- "@sema/gerador-python": "1.3.1",
44
- "@sema/gerador-typescript": "1.3.1",
45
- "@sema/gerador-javascript": "1.3.1",
46
- "@sema/gerador-html": "1.3.1",
47
- "@sema/gerador-css": "1.3.1",
48
- "@sema/padroes": "1.3.1",
40
+ "@sema/nucleo": "file:../nucleo",
41
+ "@sema/gerador-dart": "file:../gerador-dart",
42
+ "@sema/gerador-lua": "file:../gerador-lua",
43
+ "@sema/gerador-python": "file:../gerador-python",
44
+ "@sema/gerador-typescript": "file:../gerador-typescript",
45
+ "@sema/gerador-javascript": "file:../gerador-javascript",
46
+ "@sema/gerador-html": "file:../gerador-html",
47
+ "@sema/gerador-css": "file:../gerador-css",
48
+ "@sema/padroes": "file:../padroes",
49
49
  "typescript": "^5.8.3"
50
50
  },
51
51
  "bundleDependencies": [
Binary file
package/src/index.ts CHANGED
@@ -12,14 +12,14 @@ import {
12
12
  temErros,
13
13
  type IrModulo,
14
14
  } from "@sema/nucleo";
15
- import { descreverEstruturaModulo, type AlvoGeracao, type FrameworkGeracao } from "@sema/padroes";
16
- import { gerarDart } from "@sema/gerador-dart";
17
- import { gerarLua } from "@sema/gerador-lua";
18
- import { gerarPython } from "@sema/gerador-python";
19
- import { gerarTypeScript } from "@sema/gerador-typescript";
20
- import { gerarJavaScript } from "@sema/gerador-javascript";
21
- import { gerarHtml } from "@sema/gerador-html";
22
- import { gerarCss } from "@sema/gerador-css";
15
+ import { descreverEstruturaModulo, type AlvoGeracao, type FrameworkGeracao } from "@sema/padroes";
16
+ import { gerarDart } from "@sema/gerador-dart";
17
+ import { gerarLua } from "@sema/gerador-lua";
18
+ import { gerarPython } from "@sema/gerador-python";
19
+ import { gerarTypeScript } from "@sema/gerador-typescript";
20
+ import { gerarJavaScript } from "@sema/gerador-javascript";
21
+ import { gerarHtml } from "@sema/gerador-html";
22
+ import { gerarCss } from "@sema/gerador-css";
23
23
  import {
24
24
  carregarConfiguracaoProjeto,
25
25
  carregarProjeto,
@@ -80,16 +80,16 @@ interface ResultadoExecucaoTestes {
80
80
  quantidadeTestes: number;
81
81
  }
82
82
 
83
- interface ResumoAlvoVerificacao {
84
- alvo: AlvoGeracao;
85
- arquivosGerados: number;
86
- quantidadeTestes: number;
87
- pastaSaida: string;
88
- sucesso: boolean;
89
- framework: FrameworkGeracao;
90
- estrutura: EstruturaSaida;
91
- testesExecutados: boolean;
92
- }
83
+ interface ResumoAlvoVerificacao {
84
+ alvo: AlvoGeracao;
85
+ arquivosGerados: number;
86
+ quantidadeTestes: number;
87
+ pastaSaida: string;
88
+ sucesso: boolean;
89
+ framework: FrameworkGeracao;
90
+ estrutura: EstruturaSaida;
91
+ testesExecutados: boolean;
92
+ }
93
93
 
94
94
  interface ResumoModuloVerificacao {
95
95
  modulo: string;
@@ -266,8 +266,8 @@ Comandos essenciais:
266
266
  - validacao: \`sema validar <arquivo.sema> --json\`
267
267
  - diagnosticos: \`sema diagnosticos <arquivo.sema> --json\`
268
268
  - formatacao: \`sema formatar <arquivo.sema>\`
269
- - importacao assistida de legado: \`sema importar <nestjs|fastapi|flask|nextjs|nextjs-consumer|react-vite-consumer|angular-consumer|flutter-consumer|firebase|dotnet|java|go|rust|cpp|typescript|python|dart> <diretorio> --saida <diretorio>\`
270
- - geracao de codigo: \`sema compilar <arquivo-ou-pasta> --alvo <typescript|python|dart|lua> --saida <diretorio>\`
269
+ - importacao assistida de legado: \`sema importar <nestjs|fastapi|flask|nextjs|nextjs-consumer|react-vite-consumer|angular-consumer|flutter-consumer|firebase|dotnet|java|go|rust|cpp|typescript|python|dart> <diretorio> --saida <diretorio>\`
270
+ - geracao de codigo: \`sema compilar <arquivo-ou-pasta> --alvo <typescript|python|dart|lua> --saida <diretorio>\`
271
271
  - verificacao final: \`sema verificar <arquivo-ou-pasta> [--json]\`
272
272
 
273
273
  Antes de editar:
@@ -307,24 +307,24 @@ Superficies que a IA deve enxergar como first-class:
307
307
  Nao improvise quando faltar contexto.
308
308
  `;
309
309
 
310
- const PROMPT_BASE_IA = `Voce esta trabalhando com Sema, um Protocolo de Governanca de Intencao orientado a contrato, desenhado para operacao por IA.
311
-
312
- Trate a Sema como camada semantica e linguagem de especificacao executavel feita para IA, nao para leitura humana confortavel. Nao invente sintaxe, palavras-chave ou blocos fora da gramatica e dos exemplos oficiais.
313
-
314
- Fontes de verdade, em ordem:
315
- 1. se o projeto expuser \`SEMA_CONTEXT.md\`, comece por ele
316
- 2. \`SEMA_BRIEF.md\`
317
- 3. \`SEMA_INDEX.json\`
318
- 4. README do projeto
319
- 5. gramatica e documentacao de sintaxe da Sema
320
- 6. especificacao semantica da linguagem
321
- 7. exemplos oficiais, com prioridade para o vertical de pagamento
322
- 8. \`sema resumo\` e \`briefing.min.json\` quando a IA for pequena
323
- 9. AST, IR e diagnosticos exportados pela CLI em JSON quando a capacidade aguentar
324
-
325
- Regras de operacao:
326
- - preserve o significado semantico
327
- - use o formatador oficial da Sema como fonte unica de estilo
310
+ const PROMPT_BASE_IA = `Voce esta trabalhando com Sema, um Protocolo de Governanca de Intencao orientado a contrato, desenhado para operacao por IA.
311
+
312
+ Trate a Sema como camada semantica e linguagem de especificacao executavel feita para IA, nao para leitura humana confortavel. Nao invente sintaxe, palavras-chave ou blocos fora da gramatica e dos exemplos oficiais.
313
+
314
+ Fontes de verdade, em ordem:
315
+ 1. se o projeto expuser \`SEMA_CONTEXT.md\`, comece por ele
316
+ 2. \`SEMA_BRIEF.md\`
317
+ 3. \`SEMA_INDEX.json\`
318
+ 4. README do projeto
319
+ 5. gramatica e documentacao de sintaxe da Sema
320
+ 6. especificacao semantica da linguagem
321
+ 7. exemplos oficiais, com prioridade para o vertical de pagamento
322
+ 8. \`sema resumo\` e \`briefing.min.json\` quando a IA for pequena
323
+ 9. AST, IR e diagnosticos exportados pela CLI em JSON quando a capacidade aguentar
324
+
325
+ Regras de operacao:
326
+ - preserve o significado semantico
327
+ - use o formatador oficial da Sema como fonte unica de estilo
328
328
  - use diagnosticos estruturados como contrato de correcao
329
329
  - use a IR como fonte de verdade semantica quando houver duvida
330
330
  - nao conclua uma alteracao sem validar e verificar o modulo
@@ -582,7 +582,7 @@ function ajuda(): string {
582
582
  "[1] Projeto novo / producao inicial",
583
583
  "sema iniciar --template <base|nestjs|fastapi|nextjs-api|nextjs-consumer|react-vite-consumer|angular-consumer|flutter-consumer>",
584
584
  "sema validar contratos/<modulo>.sema --json",
585
- "sema compilar <arquivo-ou-pasta> --alvo <typescript|python|dart|lua> --saida <diretorio>",
585
+ "sema compilar <arquivo-ou-pasta> --alvo <typescript|python|dart|lua> --saida <diretorio>",
586
586
  "sema verificar <arquivo-ou-pasta> --json",
587
587
  "",
588
588
  "[2] Editar projeto que ja usa Sema",
@@ -607,11 +607,11 @@ function ajuda(): string {
607
607
  renderizarSecaoAscii("Comandos principais", [
608
608
  "descoberta: sema inspecionar [arquivo-ou-pasta] [--json]",
609
609
  "auditoria: sema drift <arquivo-ou-pasta> [--json]",
610
- "importacao: sema importar <nestjs|fastapi|flask|nextjs|nextjs-consumer|react-vite-consumer|angular-consumer|flutter-consumer|firebase|dotnet|java|go|rust|cpp|typescript|python|dart> <diretorio> [--saida <diretorio>] [--namespace <base>] [--json]",
610
+ "importacao: sema importar <nestjs|fastapi|flask|nextjs|nextjs-consumer|react-vite-consumer|angular-consumer|flutter-consumer|firebase|dotnet|java|go|rust|cpp|typescript|python|dart> <diretorio> [--saida <diretorio>] [--namespace <base>] [--json]",
611
611
  "validacao: sema validar <arquivo-ou-pasta> [--json]",
612
612
  "diagnostico: sema diagnosticos <arquivo.sema> [--json]",
613
- "geracao: sema compilar <arquivo-ou-pasta> --alvo <python|typescript|dart|lua> --saida <diretorio> [--estrutura <flat|modulos|backend>] [--framework <base|nestjs|fastapi>]",
614
- "teste local: sema testar <arquivo.sema> --alvo <python|typescript|dart|lua> --saida <diretorio-temporario> [--estrutura <flat|modulos|backend>] [--framework <base|nestjs|fastapi>]",
613
+ "geracao: sema compilar <arquivo-ou-pasta> --alvo <python|typescript|dart|lua> --saida <diretorio> [--estrutura <flat|modulos|backend>] [--framework <base|nestjs|fastapi>]",
614
+ "teste local: sema testar <arquivo.sema> --alvo <python|typescript|dart|lua> --saida <diretorio-temporario> [--estrutura <flat|modulos|backend>] [--framework <base|nestjs|fastapi>]",
615
615
  "verificacao final: sema verificar <arquivo-ou-pasta> [--saida <diretorio-base>] [--json]",
616
616
  "formatacao: sema formatar <arquivo-ou-pasta> [--check] [--json]",
617
617
  ]),
@@ -651,11 +651,12 @@ async function escreverArquivos(base: string, arquivos: Array<{ caminhoRelativo:
651
651
  }
652
652
 
653
653
  function obterOpcao(args: string[], nome: string, padrao?: string): string | undefined {
654
- const indice = args.findIndex((arg) => arg === nome);
655
- if (indice === -1) {
656
- return padrao;
654
+ const nomes = [nome, ...Object.entries(ALIAS_OPCOES).filter(([, v]) => v === nome).map(([k]) => k)];
655
+ for (const n of nomes) {
656
+ const indice = args.findIndex((arg) => arg === n);
657
+ if (indice !== -1) return args[indice + 1] ?? padrao;
657
658
  }
658
- return args[indice + 1] ?? padrao;
659
+ return padrao;
659
660
  }
660
661
 
661
662
  function possuiFlag(args: string[], nome: string): boolean {
@@ -664,19 +665,24 @@ function possuiFlag(args: string[], nome: string): boolean {
664
665
 
665
666
  const OPCOES_COM_VALOR = new Set([
666
667
  "--template",
667
- "--alvo",
668
- "--saida",
668
+ "--alvo", "-a",
669
+ "--saida", "-s",
669
670
  "--estrutura",
670
671
  "--framework",
671
672
  "--namespace",
672
673
  "--para",
673
674
  ]);
674
675
 
676
+ const ALIAS_OPCOES: Record<string, string> = {
677
+ "-a": "--alvo",
678
+ "-s": "--saida",
679
+ };
680
+
675
681
  function obterPosicionais(args: string[]): string[] {
676
682
  const posicionais: string[] = [];
677
683
  for (let indice = 0; indice < args.length; indice += 1) {
678
684
  const atual = args[indice]!;
679
- if (atual.startsWith("--")) {
685
+ if (atual.startsWith("-")) {
680
686
  if (OPCOES_COM_VALOR.has(atual)) {
681
687
  indice += 1;
682
688
  }
@@ -754,11 +760,11 @@ function validarCompatibilidadeFramework(alvo: AlvoGeracao, framework: Framework
754
760
  if (framework === "fastapi" && alvo !== "python") {
755
761
  return `Framework "${framework}" so pode ser usado com o alvo python.`;
756
762
  }
757
- if (alvo === "dart" || alvo === "lua" || alvo === "javascript" || alvo === "html" || alvo === "css") {
758
- return `Framework "${framework}" nao e suportado para o alvo ${alvo}.`;
759
- }
760
- return undefined;
761
- }
763
+ if (alvo === "dart" || alvo === "lua" || alvo === "javascript" || alvo === "html" || alvo === "css") {
764
+ return `Framework "${framework}" nao e suportado para o alvo ${alvo}.`;
765
+ }
766
+ return undefined;
767
+ }
762
768
 
763
769
  function normalizarFonteImportacao(valor: string | undefined): FonteImportacao | undefined {
764
770
  if (!valor) {
@@ -826,10 +832,10 @@ function normalizarFonteImportacao(valor: string | undefined): FonteImportacao |
826
832
  || valor === "cpp"
827
833
  || valor === "typescript"
828
834
  || valor === "python"
829
- || valor === "dart"
830
- ) {
831
- return valor;
832
- }
835
+ || valor === "dart"
836
+ ) {
837
+ return valor;
838
+ }
833
839
  return undefined;
834
840
  }
835
841
 
@@ -861,27 +867,27 @@ function garantirIr(resultado: ReturnType<typeof compilarCodigo>, caminho: strin
861
867
  return resultado.ir;
862
868
  }
863
869
 
864
- function gerarArquivosPorAlvo(ir: IrModulo, alvo: AlvoGeracao, framework: FrameworkGeracao) {
865
- if (alvo === "python") {
866
- return gerarPython(ir, { framework });
867
- }
868
- if (alvo === "dart") {
869
- return gerarDart(ir);
870
- }
871
- if (alvo === "lua") {
872
- return gerarLua(ir);
873
- }
874
- if (alvo === "javascript") {
875
- return gerarJavaScript(ir);
876
- }
877
- if (alvo === "html") {
878
- return gerarHtml(ir);
879
- }
880
- if (alvo === "css") {
881
- return gerarCss(ir);
882
- }
883
- return gerarTypeScript(ir, { framework });
884
- }
870
+ function gerarArquivosPorAlvo(ir: IrModulo, alvo: AlvoGeracao, framework: FrameworkGeracao) {
871
+ if (alvo === "python") {
872
+ return gerarPython(ir, { framework });
873
+ }
874
+ if (alvo === "dart") {
875
+ return gerarDart(ir);
876
+ }
877
+ if (alvo === "lua") {
878
+ return gerarLua(ir);
879
+ }
880
+ if (alvo === "javascript") {
881
+ return gerarJavaScript(ir);
882
+ }
883
+ if (alvo === "html") {
884
+ return gerarHtml(ir);
885
+ }
886
+ if (alvo === "css") {
887
+ return gerarCss(ir);
888
+ }
889
+ return gerarTypeScript(ir, { framework });
890
+ }
885
891
 
886
892
  function aplicarEstruturaSaida(
887
893
  arquivos: Array<{ caminhoRelativo: string; conteudo: string }>,
@@ -912,23 +918,23 @@ function aplicarEstruturaSaida(
912
918
  } else if (basename === `test_${nomeBaseAntigo}.py`) {
913
919
  novoBasename = `test_${nomeArquivo}.py`;
914
920
  conteudo = conteudo.replace(`from ${nomeBaseAntigo} import *`, `from ${nomeArquivo} import *`);
915
- } else if (basename === `${nomeBaseAntigo}.dart`) {
916
- novoBasename = `${nomeArquivo}.dart`;
917
- } else if (basename === `${nomeBaseAntigo}.lua`) {
918
- novoBasename = `${nomeArquivo}.lua`;
919
- } else if (basename === `test_${nomeBaseAntigo}.lua`) {
920
- novoBasename = `test_${nomeArquivo}.lua`;
921
- conteudo = conteudo.replace(`${nomeBaseAntigo}.lua`, `${nomeArquivo}.lua`);
922
- } else if (basename === `${nomeBaseAntigo}.js`) {
923
- novoBasename = `${nomeArquivo}.js`;
924
- } else if (basename === `${nomeBaseAntigo}.test.js`) {
925
- novoBasename = `${nomeArquivo}.test.js`;
926
- conteudo = conteudo.replace(`./${nomeBaseAntigo}.js`, `./${nomeArquivo}.js`);
927
- } else if (basename === `${nomeBaseAntigo}.html`) {
928
- novoBasename = `${nomeArquivo}.html`;
929
- } else if (basename === `${nomeBaseAntigo}.css`) {
930
- novoBasename = `${nomeArquivo}.css`;
931
- }
921
+ } else if (basename === `${nomeBaseAntigo}.dart`) {
922
+ novoBasename = `${nomeArquivo}.dart`;
923
+ } else if (basename === `${nomeBaseAntigo}.lua`) {
924
+ novoBasename = `${nomeArquivo}.lua`;
925
+ } else if (basename === `test_${nomeBaseAntigo}.lua`) {
926
+ novoBasename = `test_${nomeArquivo}.lua`;
927
+ conteudo = conteudo.replace(`${nomeBaseAntigo}.lua`, `${nomeArquivo}.lua`);
928
+ } else if (basename === `${nomeBaseAntigo}.js`) {
929
+ novoBasename = `${nomeArquivo}.js`;
930
+ } else if (basename === `${nomeBaseAntigo}.test.js`) {
931
+ novoBasename = `${nomeArquivo}.test.js`;
932
+ conteudo = conteudo.replace(`./${nomeBaseAntigo}.js`, `./${nomeArquivo}.js`);
933
+ } else if (basename === `${nomeBaseAntigo}.html`) {
934
+ novoBasename = `${nomeArquivo}.html`;
935
+ } else if (basename === `${nomeBaseAntigo}.css`) {
936
+ novoBasename = `${nomeArquivo}.css`;
937
+ }
932
938
 
933
939
  return {
934
940
  caminhoRelativo: pastaModulo ? path.join(pastaModulo, novoBasename) : novoBasename,
@@ -937,32 +943,32 @@ function aplicarEstruturaSaida(
937
943
  });
938
944
  }
939
945
 
940
- function contarCasosDeTesteGerados(alvo: AlvoGeracao, arquivos: Array<{ caminhoRelativo: string; conteudo: string }>): number {
941
- if (alvo === "dart" || alvo === "html" || alvo === "css") {
942
- return 0;
943
- }
944
- if (alvo === "lua") {
945
- const arquivoTeste = arquivos.find((item) => path.basename(item.caminhoRelativo).startsWith("test_") && item.caminhoRelativo.endsWith(".lua"));
946
- if (!arquivoTeste) {
947
- return 0;
948
- }
949
- return (arquivoTeste.conteudo.match(/\blocal function test_/g) ?? []).length;
950
- }
951
-
952
- if (alvo === "typescript") {
946
+ function contarCasosDeTesteGerados(alvo: AlvoGeracao, arquivos: Array<{ caminhoRelativo: string; conteudo: string }>): number {
947
+ if (alvo === "dart" || alvo === "html" || alvo === "css") {
948
+ return 0;
949
+ }
950
+ if (alvo === "lua") {
951
+ const arquivoTeste = arquivos.find((item) => path.basename(item.caminhoRelativo).startsWith("test_") && item.caminhoRelativo.endsWith(".lua"));
952
+ if (!arquivoTeste) {
953
+ return 0;
954
+ }
955
+ return (arquivoTeste.conteudo.match(/\blocal function test_/g) ?? []).length;
956
+ }
957
+
958
+ if (alvo === "typescript") {
953
959
  const arquivoTeste = arquivos.find((item) => item.caminhoRelativo.endsWith(".test.ts"));
954
960
  if (!arquivoTeste) {
955
961
  return 0;
956
962
  }
957
963
  return (arquivoTeste.conteudo.match(/\btest\(/g) ?? []).length;
958
- }
959
-
960
- if (alvo === "javascript") {
961
- const arquivoTeste = arquivos.find((item) => item.caminhoRelativo.endsWith(".test.js"));
962
- if (!arquivoTeste) {
963
- return 0;
964
- }
965
- return (arquivoTeste.conteudo.match(/\btest\(/g) ?? []).length;
964
+ }
965
+
966
+ if (alvo === "javascript") {
967
+ const arquivoTeste = arquivos.find((item) => item.caminhoRelativo.endsWith(".test.js"));
968
+ if (!arquivoTeste) {
969
+ return 0;
970
+ }
971
+ return (arquivoTeste.conteudo.match(/\btest\(/g) ?? []).length;
966
972
  }
967
973
 
968
974
  const arquivoTeste = arquivos.find((item) => path.basename(item.caminhoRelativo).startsWith("test_"));
@@ -972,24 +978,24 @@ function contarCasosDeTesteGerados(alvo: AlvoGeracao, arquivos: Array<{ caminhoR
972
978
  return (arquivoTeste.conteudo.match(/\bdef test_/g) ?? []).length;
973
979
  }
974
980
 
975
- function executarTestesGerados(
976
- alvo: AlvoGeracao,
977
- baseSaida: string,
978
- arquivos: Array<{ caminhoRelativo: string; conteudo: string }>,
981
+ function executarTestesGerados(
982
+ alvo: AlvoGeracao,
983
+ baseSaida: string,
984
+ arquivos: Array<{ caminhoRelativo: string; conteudo: string }>,
979
985
  silencioso = false,
980
986
  ): SaidaTesteCapturada {
981
- const quantidadeTestes = contarCasosDeTesteGerados(alvo, arquivos);
982
- if (quantidadeTestes === 0) {
983
- if (!silencioso) {
984
- const nomesAlvo: Record<AlvoGeracao, string> = { typescript: "TypeScript", python: "Python", lua: "Lua", dart: "Dart", javascript: "JavaScript", html: "HTML", css: "CSS" };
985
- console.log(`Nenhum teste ${nomesAlvo[alvo] ?? alvo} foi gerado.`);
986
- }
987
- return { codigoSaida: 0, quantidadeTestes, saidaPadrao: "", saidaErro: "" };
988
- }
989
-
990
- if (alvo === "html" || alvo === "css") {
991
- return { codigoSaida: 0, quantidadeTestes: 0, saidaPadrao: "", saidaErro: "" };
992
- }
987
+ const quantidadeTestes = contarCasosDeTesteGerados(alvo, arquivos);
988
+ if (quantidadeTestes === 0) {
989
+ if (!silencioso) {
990
+ const nomesAlvo: Record<AlvoGeracao, string> = { typescript: "TypeScript", python: "Python", lua: "Lua", dart: "Dart", javascript: "JavaScript", html: "HTML", css: "CSS" };
991
+ console.log(`Nenhum teste ${nomesAlvo[alvo] ?? alvo} foi gerado.`);
992
+ }
993
+ return { codigoSaida: 0, quantidadeTestes, saidaPadrao: "", saidaErro: "" };
994
+ }
995
+
996
+ if (alvo === "html" || alvo === "css") {
997
+ return { codigoSaida: 0, quantidadeTestes: 0, saidaPadrao: "", saidaErro: "" };
998
+ }
993
999
 
994
1000
  if (alvo === "typescript") {
995
1001
  const arquivoTeste = arquivos.find((item) => item.caminhoRelativo.endsWith(".test.ts"))?.caminhoRelativo;
@@ -1009,52 +1015,52 @@ function executarTestesGerados(
1009
1015
  saidaPadrao: typeof execucao.stdout === "string" ? execucao.stdout : "",
1010
1016
  saidaErro: typeof execucao.stderr === "string" ? execucao.stderr : "",
1011
1017
  };
1012
- }
1013
-
1014
- if (alvo === "javascript") {
1015
- const arquivoTeste = arquivos.find((item) => item.caminhoRelativo.endsWith(".test.js"))?.caminhoRelativo;
1016
- if (!arquivoTeste) {
1017
- if (!silencioso) {
1018
- console.log("Nenhum teste JavaScript foi gerado.");
1019
- }
1020
- return { codigoSaida: 0, quantidadeTestes, saidaPadrao: "", saidaErro: "" };
1021
- }
1022
- const execucao = spawnSync("node", ["--test", path.join(baseSaida, arquivoTeste)], {
1023
- stdio: silencioso ? "pipe" : "inherit",
1024
- encoding: silencioso ? "utf8" : undefined,
1025
- });
1026
- return {
1027
- codigoSaida: execucao.status ?? 1,
1028
- quantidadeTestes,
1029
- saidaPadrao: typeof execucao.stdout === "string" ? execucao.stdout : "",
1030
- saidaErro: typeof execucao.stderr === "string" ? execucao.stderr : "",
1031
- };
1032
- }
1033
-
1034
- if (alvo === "lua") {
1035
- const arquivoTeste = arquivos.find((item) => path.basename(item.caminhoRelativo).startsWith("test_") && item.caminhoRelativo.endsWith(".lua"))?.caminhoRelativo;
1036
- if (!arquivoTeste) {
1037
- if (!silencioso) {
1038
- console.log("Nenhum teste Lua foi gerado.");
1039
- }
1040
- return { codigoSaida: 0, quantidadeTestes, saidaPadrao: "", saidaErro: "" };
1041
- }
1042
- const execucao = spawnSync("lua", [arquivoTeste], {
1043
- stdio: silencioso ? "pipe" : "inherit",
1044
- cwd: baseSaida,
1045
- encoding: silencioso ? "utf8" : undefined,
1046
- shell: process.platform === "win32",
1047
- });
1048
- return {
1049
- codigoSaida: execucao.status ?? 1,
1050
- quantidadeTestes,
1051
- saidaPadrao: typeof execucao.stdout === "string" ? execucao.stdout : "",
1052
- saidaErro: typeof execucao.stderr === "string" ? execucao.stderr : "",
1053
- };
1054
- }
1055
-
1056
- const arquivoTeste = arquivos.find((item) => path.basename(item.caminhoRelativo).startsWith("test_"))?.caminhoRelativo;
1057
- if (!arquivoTeste) {
1018
+ }
1019
+
1020
+ if (alvo === "javascript") {
1021
+ const arquivoTeste = arquivos.find((item) => item.caminhoRelativo.endsWith(".test.js"))?.caminhoRelativo;
1022
+ if (!arquivoTeste) {
1023
+ if (!silencioso) {
1024
+ console.log("Nenhum teste JavaScript foi gerado.");
1025
+ }
1026
+ return { codigoSaida: 0, quantidadeTestes, saidaPadrao: "", saidaErro: "" };
1027
+ }
1028
+ const execucao = spawnSync("node", ["--test", path.join(baseSaida, arquivoTeste)], {
1029
+ stdio: silencioso ? "pipe" : "inherit",
1030
+ encoding: silencioso ? "utf8" : undefined,
1031
+ });
1032
+ return {
1033
+ codigoSaida: execucao.status ?? 1,
1034
+ quantidadeTestes,
1035
+ saidaPadrao: typeof execucao.stdout === "string" ? execucao.stdout : "",
1036
+ saidaErro: typeof execucao.stderr === "string" ? execucao.stderr : "",
1037
+ };
1038
+ }
1039
+
1040
+ if (alvo === "lua") {
1041
+ const arquivoTeste = arquivos.find((item) => path.basename(item.caminhoRelativo).startsWith("test_") && item.caminhoRelativo.endsWith(".lua"))?.caminhoRelativo;
1042
+ if (!arquivoTeste) {
1043
+ if (!silencioso) {
1044
+ console.log("Nenhum teste Lua foi gerado.");
1045
+ }
1046
+ return { codigoSaida: 0, quantidadeTestes, saidaPadrao: "", saidaErro: "" };
1047
+ }
1048
+ const execucao = spawnSync("lua", [arquivoTeste], {
1049
+ stdio: silencioso ? "pipe" : "inherit",
1050
+ cwd: baseSaida,
1051
+ encoding: silencioso ? "utf8" : undefined,
1052
+ shell: process.platform === "win32",
1053
+ });
1054
+ return {
1055
+ codigoSaida: execucao.status ?? 1,
1056
+ quantidadeTestes,
1057
+ saidaPadrao: typeof execucao.stdout === "string" ? execucao.stdout : "",
1058
+ saidaErro: typeof execucao.stderr === "string" ? execucao.stderr : "",
1059
+ };
1060
+ }
1061
+
1062
+ const arquivoTeste = arquivos.find((item) => path.basename(item.caminhoRelativo).startsWith("test_"))?.caminhoRelativo;
1063
+ if (!arquivoTeste) {
1058
1064
  if (!silencioso) {
1059
1065
  console.log("Nenhum teste Python foi gerado.");
1060
1066
  }
@@ -1065,60 +1071,60 @@ function executarTestesGerados(
1065
1071
  cwd: baseSaida,
1066
1072
  encoding: silencioso ? "utf8" : undefined,
1067
1073
  });
1068
- return {
1069
- codigoSaida: execucao.status ?? 1,
1070
- quantidadeTestes,
1071
- saidaPadrao: typeof execucao.stdout === "string" ? execucao.stdout : "",
1072
- saidaErro: typeof execucao.stderr === "string" ? execucao.stderr : "",
1073
- };
1074
- }
1075
-
1076
- function resolverConfiguracaoVerificacaoPorAlvo(
1077
- alvo: AlvoGeracao,
1078
- configCarregada?: Awaited<ReturnType<typeof carregarConfiguracaoProjeto>>,
1079
- ): {
1080
- framework: FrameworkGeracao;
1081
- estrutura: EstruturaSaida;
1082
- incompatibilidade?: string;
1083
- } {
1084
- const framework = resolverFrameworkPadrao(undefined, configCarregada);
1085
- const incompatibilidade = validarCompatibilidadeFramework(alvo, framework);
1086
- const estrutura = resolverEstruturaSaidaPadrao(undefined, framework, configCarregada);
1087
-
1088
- return {
1089
- framework,
1090
- estrutura,
1091
- incompatibilidade,
1092
- };
1093
- }
1094
-
1095
- function executarTestesParaVerificacao(
1096
- alvo: AlvoGeracao,
1097
- baseSaida: string,
1098
- arquivos: Array<{ caminhoRelativo: string; conteudo: string }>,
1099
- framework: FrameworkGeracao,
1100
- silencioso = false,
1101
- ): {
1102
- execucao: SaidaTesteCapturada;
1103
- testesExecutados: boolean;
1104
- } {
1105
- if (framework !== "base") {
1106
- return {
1107
- execucao: {
1108
- codigoSaida: 0,
1109
- quantidadeTestes: 0,
1110
- saidaPadrao: "",
1111
- saidaErro: "",
1112
- },
1113
- testesExecutados: false,
1114
- };
1115
- }
1116
-
1117
- return {
1118
- execucao: executarTestesGerados(alvo, baseSaida, arquivos, silencioso),
1119
- testesExecutados: true,
1120
- };
1121
- }
1074
+ return {
1075
+ codigoSaida: execucao.status ?? 1,
1076
+ quantidadeTestes,
1077
+ saidaPadrao: typeof execucao.stdout === "string" ? execucao.stdout : "",
1078
+ saidaErro: typeof execucao.stderr === "string" ? execucao.stderr : "",
1079
+ };
1080
+ }
1081
+
1082
+ function resolverConfiguracaoVerificacaoPorAlvo(
1083
+ alvo: AlvoGeracao,
1084
+ configCarregada?: Awaited<ReturnType<typeof carregarConfiguracaoProjeto>>,
1085
+ ): {
1086
+ framework: FrameworkGeracao;
1087
+ estrutura: EstruturaSaida;
1088
+ incompatibilidade?: string;
1089
+ } {
1090
+ const framework = resolverFrameworkPadrao(undefined, configCarregada);
1091
+ const incompatibilidade = validarCompatibilidadeFramework(alvo, framework);
1092
+ const estrutura = resolverEstruturaSaidaPadrao(undefined, framework, configCarregada);
1093
+
1094
+ return {
1095
+ framework,
1096
+ estrutura,
1097
+ incompatibilidade,
1098
+ };
1099
+ }
1100
+
1101
+ function executarTestesParaVerificacao(
1102
+ alvo: AlvoGeracao,
1103
+ baseSaida: string,
1104
+ arquivos: Array<{ caminhoRelativo: string; conteudo: string }>,
1105
+ framework: FrameworkGeracao,
1106
+ silencioso = false,
1107
+ ): {
1108
+ execucao: SaidaTesteCapturada;
1109
+ testesExecutados: boolean;
1110
+ } {
1111
+ if (framework !== "base") {
1112
+ return {
1113
+ execucao: {
1114
+ codigoSaida: 0,
1115
+ quantidadeTestes: 0,
1116
+ saidaPadrao: "",
1117
+ saidaErro: "",
1118
+ },
1119
+ testesExecutados: false,
1120
+ };
1121
+ }
1122
+
1123
+ return {
1124
+ execucao: executarTestesGerados(alvo, baseSaida, arquivos, silencioso),
1125
+ testesExecutados: true,
1126
+ };
1127
+ }
1122
1128
 
1123
1129
  function nomeSubpastaModulo(caminhoArquivo: string): string {
1124
1130
  return path.basename(caminhoArquivo, ".sema");
@@ -3847,7 +3853,7 @@ async function comandoAjudaIa(): Promise<number> {
3847
3853
  "Use `sema inspecionar` para descobrir base, codigo vivo e fontes legado.",
3848
3854
  "Use `sema drift` para medir impls, vinculos, rotas, score e lacunas.",
3849
3855
  "Use `sema contexto-ia <arquivo.sema>` para gerar AST, IR, drift, `briefing.json` e `briefing.min.json`.",
3850
- "Use `sema compilar <arquivo-ou-pasta> --alvo <typescript|python|dart|lua> --saida <diretorio>` quando a tarefa pedir codigo derivado.",
3856
+ "Use `sema compilar <arquivo-ou-pasta> --alvo <typescript|python|dart|lua> --saida <diretorio>` quando a tarefa pedir codigo derivado.",
3851
3857
  ]));
3852
3858
  console.log("");
3853
3859
  console.log(renderizarSecaoAscii("Regras praticas", [
@@ -4125,14 +4131,14 @@ function imprimirResumoVerificacao(resumos: ResumoModuloVerificacao[]): void {
4125
4131
  for (const resumo of resumos) {
4126
4132
  console.log(`- Modulo ${resumo.modulo} (${resumo.arquivoFonte})`);
4127
4133
  for (const alvo of resumo.alvos) {
4128
- totalArquivos += alvo.arquivosGerados;
4129
- totalTestes += alvo.quantidadeTestes;
4130
- totalAlvos += 1;
4131
- console.log(
4132
- ` alvo=${alvo.alvo} framework=${alvo.framework} estrutura=${alvo.estrutura} status=${alvo.sucesso ? "ok" : "falhou"} arquivos=${alvo.arquivosGerados} testes=${alvo.quantidadeTestes}${alvo.testesExecutados ? "" : " (skip)"} saida=${alvo.pastaSaida}`,
4133
- );
4134
- }
4135
- }
4134
+ totalArquivos += alvo.arquivosGerados;
4135
+ totalTestes += alvo.quantidadeTestes;
4136
+ totalAlvos += 1;
4137
+ console.log(
4138
+ ` alvo=${alvo.alvo} framework=${alvo.framework} estrutura=${alvo.estrutura} status=${alvo.sucesso ? "ok" : "falhou"} arquivos=${alvo.arquivosGerados} testes=${alvo.quantidadeTestes}${alvo.testesExecutados ? "" : " (skip)"} saida=${alvo.pastaSaida}`,
4139
+ );
4140
+ }
4141
+ }
4136
4142
 
4137
4143
  console.log(`Totais: modulos=${resumos.length} alvos=${totalAlvos} arquivos=${totalArquivos} testes=${totalTestes}`);
4138
4144
  }
@@ -4148,47 +4154,47 @@ async function comandoVerificar(
4148
4154
  if (temErros(diagnosticos)) {
4149
4155
  console.error(formatarDiagnosticos(diagnosticos));
4150
4156
  return 1;
4151
- }
4152
-
4153
- const alvos = resolverAlvosVerificacao(contextoProjeto.configCarregada);
4154
- const configuracoesAlvo = alvos.map((alvo) => ({
4155
- alvo,
4156
- ...resolverConfiguracaoVerificacaoPorAlvo(alvo, contextoProjeto.configCarregada),
4157
- }));
4158
- const incompatibilidade = configuracoesAlvo.find((item) => item.incompatibilidade);
4159
- if (incompatibilidade?.incompatibilidade) {
4160
- console.error(incompatibilidade.incompatibilidade);
4161
- return 1;
4162
- }
4163
-
4164
- const resumos: ResumoModuloVerificacao[] = [];
4165
- for (const modulo of modulos) {
4166
- const ir = garantirIr(modulo.resultado, modulo.caminho);
4167
- console.log(`Verificando modulo ${modulo.caminho}`);
4157
+ }
4158
+
4159
+ const alvos = resolverAlvosVerificacao(contextoProjeto.configCarregada);
4160
+ const configuracoesAlvo = alvos.map((alvo) => ({
4161
+ alvo,
4162
+ ...resolverConfiguracaoVerificacaoPorAlvo(alvo, contextoProjeto.configCarregada),
4163
+ }));
4164
+ const incompatibilidade = configuracoesAlvo.find((item) => item.incompatibilidade);
4165
+ if (incompatibilidade?.incompatibilidade) {
4166
+ console.error(incompatibilidade.incompatibilidade);
4167
+ return 1;
4168
+ }
4169
+
4170
+ const resumos: ResumoModuloVerificacao[] = [];
4171
+ for (const modulo of modulos) {
4172
+ const ir = garantirIr(modulo.resultado, modulo.caminho);
4173
+ console.log(`Verificando modulo ${modulo.caminho}`);
4168
4174
  const resumoModulo: ResumoModuloVerificacao = {
4169
4175
  modulo: ir.nome,
4170
- arquivoFonte: modulo.caminho,
4171
- alvos: [],
4172
- };
4173
- for (const configuracaoAlvo of configuracoesAlvo) {
4174
- const { alvo, framework, estrutura } = configuracaoAlvo;
4175
- const pastaAlvo = path.join(baseSaida, alvo, nomeSubpastaModulo(modulo.caminho));
4176
- const arquivos = aplicarEstruturaSaida(gerarArquivosPorAlvo(ir, alvo, framework), ir, estrutura);
4177
- await escreverArquivos(pastaAlvo, arquivos);
4178
- const { execucao, testesExecutados } = executarTestesParaVerificacao(alvo, pastaAlvo, arquivos, framework);
4179
- resumoModulo.alvos.push({
4180
- alvo,
4181
- arquivosGerados: arquivos.length,
4182
- quantidadeTestes: execucao.quantidadeTestes,
4183
- pastaSaida: pastaAlvo,
4184
- sucesso: execucao.codigoSaida === 0,
4185
- framework,
4186
- estrutura,
4187
- testesExecutados,
4188
- });
4189
- if (execucao.codigoSaida !== 0) {
4190
- imprimirResumoVerificacao([...resumos, resumoModulo]);
4191
- console.error(`Falha na verificacao do modulo ${modulo.caminho} para o alvo ${alvo}.`);
4176
+ arquivoFonte: modulo.caminho,
4177
+ alvos: [],
4178
+ };
4179
+ for (const configuracaoAlvo of configuracoesAlvo) {
4180
+ const { alvo, framework, estrutura } = configuracaoAlvo;
4181
+ const pastaAlvo = path.join(baseSaida, alvo, nomeSubpastaModulo(modulo.caminho));
4182
+ const arquivos = aplicarEstruturaSaida(gerarArquivosPorAlvo(ir, alvo, framework), ir, estrutura);
4183
+ await escreverArquivos(pastaAlvo, arquivos);
4184
+ const { execucao, testesExecutados } = executarTestesParaVerificacao(alvo, pastaAlvo, arquivos, framework);
4185
+ resumoModulo.alvos.push({
4186
+ alvo,
4187
+ arquivosGerados: arquivos.length,
4188
+ quantidadeTestes: execucao.quantidadeTestes,
4189
+ pastaSaida: pastaAlvo,
4190
+ sucesso: execucao.codigoSaida === 0,
4191
+ framework,
4192
+ estrutura,
4193
+ testesExecutados,
4194
+ });
4195
+ if (execucao.codigoSaida !== 0) {
4196
+ imprimirResumoVerificacao([...resumos, resumoModulo]);
4197
+ console.error(`Falha na verificacao do modulo ${modulo.caminho} para o alvo ${alvo}.`);
4192
4198
  return execucao.codigoSaida;
4193
4199
  }
4194
4200
  }
@@ -4217,27 +4223,27 @@ async function comandoVerificarJson(
4217
4223
  totais: { modulos: 0, alvos: 0, arquivos: 0, testes: 0 },
4218
4224
  }, null, 2));
4219
4225
  return 1;
4220
- }
4221
-
4222
- const alvos = resolverAlvosVerificacao(contextoProjeto.configCarregada);
4223
- const configuracoesAlvo = alvos.map((alvo) => ({
4224
- alvo,
4225
- ...resolverConfiguracaoVerificacaoPorAlvo(alvo, contextoProjeto.configCarregada),
4226
- }));
4227
- const incompatibilidade = configuracoesAlvo.find((item) => item.incompatibilidade);
4228
- if (incompatibilidade?.incompatibilidade) {
4229
- console.log(JSON.stringify({
4230
- comando: "verificar",
4231
- sucesso: false,
4232
- erro: incompatibilidade.incompatibilidade,
4233
- modulos: [],
4234
- totais: { modulos: 0, alvos: 0, arquivos: 0, testes: 0 },
4235
- }, null, 2));
4236
- return 1;
4237
- }
4238
-
4239
- const resumos: Array<ResumoModuloVerificacao & { saidaTestes?: Array<{ alvo: string; stdout: string; stderr: string }> }> = [];
4240
- let codigoSaida = 0;
4226
+ }
4227
+
4228
+ const alvos = resolverAlvosVerificacao(contextoProjeto.configCarregada);
4229
+ const configuracoesAlvo = alvos.map((alvo) => ({
4230
+ alvo,
4231
+ ...resolverConfiguracaoVerificacaoPorAlvo(alvo, contextoProjeto.configCarregada),
4232
+ }));
4233
+ const incompatibilidade = configuracoesAlvo.find((item) => item.incompatibilidade);
4234
+ if (incompatibilidade?.incompatibilidade) {
4235
+ console.log(JSON.stringify({
4236
+ comando: "verificar",
4237
+ sucesso: false,
4238
+ erro: incompatibilidade.incompatibilidade,
4239
+ modulos: [],
4240
+ totais: { modulos: 0, alvos: 0, arquivos: 0, testes: 0 },
4241
+ }, null, 2));
4242
+ return 1;
4243
+ }
4244
+
4245
+ const resumos: Array<ResumoModuloVerificacao & { saidaTestes?: Array<{ alvo: string; stdout: string; stderr: string }> }> = [];
4246
+ let codigoSaida = 0;
4241
4247
 
4242
4248
  for (const modulo of modulos) {
4243
4249
  const ir = garantirIr(modulo.resultado, modulo.caminho);
@@ -4245,29 +4251,29 @@ async function comandoVerificarJson(
4245
4251
  modulo: ir.nome,
4246
4252
  arquivoFonte: modulo.caminho,
4247
4253
  alvos: [],
4248
- saidaTestes: [],
4249
- };
4250
-
4251
- for (const configuracaoAlvo of configuracoesAlvo) {
4252
- const { alvo, framework, estrutura } = configuracaoAlvo;
4253
- const pastaAlvo = path.join(baseSaida, alvo, nomeSubpastaModulo(modulo.caminho));
4254
- const arquivos = aplicarEstruturaSaida(gerarArquivosPorAlvo(ir, alvo, framework), ir, estrutura);
4255
- await escreverArquivos(pastaAlvo, arquivos);
4256
- const { execucao, testesExecutados } = executarTestesParaVerificacao(alvo, pastaAlvo, arquivos, framework, true);
4257
- resumoModulo.alvos.push({
4258
- alvo,
4259
- arquivosGerados: arquivos.length,
4260
- quantidadeTestes: execucao.quantidadeTestes,
4261
- pastaSaida: pastaAlvo,
4262
- sucesso: execucao.codigoSaida === 0,
4263
- framework,
4264
- estrutura,
4265
- testesExecutados,
4266
- });
4267
- resumoModulo.saidaTestes.push({ alvo, stdout: execucao.saidaPadrao, stderr: execucao.saidaErro });
4268
- if (execucao.codigoSaida !== 0) {
4269
- codigoSaida = execucao.codigoSaida;
4270
- }
4254
+ saidaTestes: [],
4255
+ };
4256
+
4257
+ for (const configuracaoAlvo of configuracoesAlvo) {
4258
+ const { alvo, framework, estrutura } = configuracaoAlvo;
4259
+ const pastaAlvo = path.join(baseSaida, alvo, nomeSubpastaModulo(modulo.caminho));
4260
+ const arquivos = aplicarEstruturaSaida(gerarArquivosPorAlvo(ir, alvo, framework), ir, estrutura);
4261
+ await escreverArquivos(pastaAlvo, arquivos);
4262
+ const { execucao, testesExecutados } = executarTestesParaVerificacao(alvo, pastaAlvo, arquivos, framework, true);
4263
+ resumoModulo.alvos.push({
4264
+ alvo,
4265
+ arquivosGerados: arquivos.length,
4266
+ quantidadeTestes: execucao.quantidadeTestes,
4267
+ pastaSaida: pastaAlvo,
4268
+ sucesso: execucao.codigoSaida === 0,
4269
+ framework,
4270
+ estrutura,
4271
+ testesExecutados,
4272
+ });
4273
+ resumoModulo.saidaTestes.push({ alvo, stdout: execucao.saidaPadrao, stderr: execucao.saidaErro });
4274
+ if (execucao.codigoSaida !== 0) {
4275
+ codigoSaida = execucao.codigoSaida;
4276
+ }
4271
4277
  }
4272
4278
 
4273
4279
  resumos.push(resumoModulo);
@@ -4386,7 +4392,7 @@ async function principal(): Promise<void> {
4386
4392
  {
4387
4393
  const fonte = normalizarFonteImportacao(posicionais[0]);
4388
4394
  if (!fonte || !posicionais[1]) {
4389
- console.error("Uso: sema importar <nestjs|fastapi|flask|nextjs|nextjs-consumer|react-vite-consumer|angular-consumer|flutter-consumer|firebase|dotnet|java|go|rust|cpp|typescript|python|dart> <diretorio> [--saida <diretorio>] [--namespace <base>] [--json]");
4395
+ console.error("Uso: sema importar <nestjs|fastapi|flask|nextjs|nextjs-consumer|react-vite-consumer|angular-consumer|flutter-consumer|firebase|dotnet|java|go|rust|cpp|typescript|python|dart> <diretorio> [--saida <diretorio>] [--namespace <base>] [--json]");
4390
4396
  codigoSaida = 1;
4391
4397
  break;
4392
4398
  }