@semacode/cli 1.1.0 → 1.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 (43) hide show
  1. package/README.md +2 -2
  2. package/SEMA_BRIEF.curto.txt +3 -3
  3. package/SEMA_BRIEF.md +3 -3
  4. package/SEMA_BRIEF.micro.txt +2 -2
  5. package/SEMA_INDEX.json +56 -11
  6. package/dist/drift.d.ts +2 -2
  7. package/dist/drift.js +20 -0
  8. package/dist/drift.js.map +1 -1
  9. package/dist/importador.d.ts +1 -1
  10. package/dist/importador.js +60 -0
  11. package/dist/importador.js.map +1 -1
  12. package/dist/index.js +86 -14
  13. package/dist/index.js.map +1 -1
  14. package/dist/lua-symbols.d.ts +8 -0
  15. package/dist/lua-symbols.js +68 -0
  16. package/dist/lua-symbols.js.map +1 -0
  17. package/dist/projeto.js +7 -1
  18. package/dist/projeto.js.map +1 -1
  19. package/dist/tipos.d.ts +1 -1
  20. package/docs/AGENT_STARTER.md +5 -3
  21. package/docs/instalacao-e-primeiro-uso.md +4 -2
  22. package/node_modules/@sema/gerador-dart/package.json +1 -1
  23. package/node_modules/@sema/gerador-lua/dist/index.d.ts +3 -0
  24. package/node_modules/@sema/gerador-lua/dist/index.js +360 -0
  25. package/node_modules/@sema/gerador-lua/dist/index.js.map +1 -0
  26. package/node_modules/@sema/gerador-lua/package.json +7 -0
  27. package/node_modules/@sema/gerador-python/package.json +1 -1
  28. package/node_modules/@sema/gerador-typescript/package.json +1 -1
  29. package/node_modules/@sema/nucleo/dist/ast/tipos.d.ts +1 -1
  30. package/node_modules/@sema/nucleo/dist/ir/conversor.js +4 -0
  31. package/node_modules/@sema/nucleo/dist/ir/conversor.js.map +1 -1
  32. package/node_modules/@sema/nucleo/dist/ir/modelos.d.ts +3 -3
  33. package/node_modules/@sema/nucleo/dist/parser/parser.js +2 -0
  34. package/node_modules/@sema/nucleo/dist/parser/parser.js.map +1 -1
  35. package/node_modules/@sema/nucleo/dist/semantico/analisador.d.ts +2 -2
  36. package/node_modules/@sema/nucleo/dist/semantico/analisador.js +3 -1
  37. package/node_modules/@sema/nucleo/dist/semantico/analisador.js.map +1 -1
  38. package/node_modules/@sema/nucleo/package.json +1 -1
  39. package/node_modules/@sema/padroes/dist/index.d.ts +2 -1
  40. package/node_modules/@sema/padroes/dist/index.js +17 -0
  41. package/node_modules/@sema/padroes/dist/index.js.map +1 -1
  42. package/node_modules/@sema/padroes/package.json +1 -1
  43. package/package.json +9 -7
package/dist/index.js CHANGED
@@ -7,6 +7,7 @@ import pacoteCli from "../package.json" with { type: "json" };
7
7
  import { compilarCodigo, formatarCodigo, formatarDiagnosticos, lerArquivoTexto, temErros, } from "@sema/nucleo";
8
8
  import { descreverEstruturaModulo } from "@sema/padroes";
9
9
  import { gerarDart } from "@sema/gerador-dart";
10
+ import { gerarLua } from "@sema/gerador-lua";
10
11
  import { gerarPython } from "@sema/gerador-python";
11
12
  import { gerarTypeScript } from "@sema/gerador-typescript";
12
13
  import { carregarConfiguracaoProjeto, carregarProjeto, resolverAlvoPadrao, resolverAlvosVerificacao, resolverEstruturaSaidaPadrao, resolverFrameworkPadrao, resolverSaidaPadrao, } from "./projeto.js";
@@ -20,7 +21,7 @@ Importante:
20
21
  - leitura humana e bonus toleravel, nao objetivo de produto
21
22
  - a Sema nao e gerador magico que deveria fazer tudo
22
23
  - a Sema modela contratos, estados, fluxos, erros, efeitos, garantias, vinculos e execucao
23
- - a Sema gera codigo e scaffolding real para TypeScript, Python e Dart
24
+ - a Sema gera codigo e scaffolding real para TypeScript, Python, Dart e Lua
24
25
  - a Sema usa \`importar\` para bootstrap revisavel, nao para contrato final automatico
25
26
  - a Sema usa \`impl\` para ligar task a simbolo real do runtime
26
27
  - a Sema usa \`vinculos\` para ligar contrato a arquivo, simbolo, recurso e superficie real
@@ -56,8 +57,8 @@ Comandos essenciais:
56
57
  - validacao: \`sema validar <arquivo.sema> --json\`
57
58
  - diagnosticos: \`sema diagnosticos <arquivo.sema> --json\`
58
59
  - formatacao: \`sema formatar <arquivo.sema>\`
59
- - 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>\`
60
- - geracao de codigo: \`sema compilar <arquivo-ou-pasta> --alvo <typescript|python|dart> --saida <diretorio>\`
60
+ - 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|lua> <diretorio> --saida <diretorio>\`
61
+ - geracao de codigo: \`sema compilar <arquivo-ou-pasta> --alvo <typescript|python|dart|lua> --saida <diretorio>\`
61
62
  - verificacao final: \`sema verificar <arquivo-ou-pasta> [--json]\`
62
63
 
63
64
  Antes de editar:
@@ -359,7 +360,7 @@ function ajuda() {
359
360
  "[1] Projeto novo / producao inicial",
360
361
  "sema iniciar --template <base|nestjs|fastapi|nextjs-api|nextjs-consumer|react-vite-consumer|angular-consumer|flutter-consumer>",
361
362
  "sema validar contratos/<modulo>.sema --json",
362
- "sema compilar <arquivo-ou-pasta> --alvo <typescript|python|dart> --saida <diretorio>",
363
+ "sema compilar <arquivo-ou-pasta> --alvo <typescript|python|dart|lua> --saida <diretorio>",
363
364
  "sema verificar <arquivo-ou-pasta> --json",
364
365
  "",
365
366
  "[2] Editar projeto que ja usa Sema",
@@ -384,11 +385,11 @@ function ajuda() {
384
385
  renderizarSecaoAscii("Comandos principais", [
385
386
  "descoberta: sema inspecionar [arquivo-ou-pasta] [--json]",
386
387
  "auditoria: sema drift <arquivo-ou-pasta> [--json]",
387
- "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]",
388
+ "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|lua> <diretorio> [--saida <diretorio>] [--namespace <base>] [--json]",
388
389
  "validacao: sema validar <arquivo-ou-pasta> [--json]",
389
390
  "diagnostico: sema diagnosticos <arquivo.sema> [--json]",
390
- "geracao: sema compilar <arquivo-ou-pasta> --alvo <python|typescript|dart> --saida <diretorio> [--estrutura <flat|modulos|backend>] [--framework <base|nestjs|fastapi>]",
391
- "teste local: sema testar <arquivo.sema> --alvo <python|typescript|dart> --saida <diretorio-temporario> [--estrutura <flat|modulos|backend>] [--framework <base|nestjs|fastapi>]",
391
+ "geracao: sema compilar <arquivo-ou-pasta> --alvo <python|typescript|dart|lua> --saida <diretorio> [--estrutura <flat|modulos|backend>] [--framework <base|nestjs|fastapi>]",
392
+ "teste local: sema testar <arquivo.sema> --alvo <python|typescript|dart|lua> --saida <diretorio-temporario> [--estrutura <flat|modulos|backend>] [--framework <base|nestjs|fastapi>]",
392
393
  "verificacao final: sema verificar <arquivo-ou-pasta> [--saida <diretorio-base>] [--json]",
393
394
  "formatacao: sema formatar <arquivo-ou-pasta> [--check] [--json]",
394
395
  ]),
@@ -483,11 +484,22 @@ function comandoDisponivel(comando, argumentos = ["--version"]) {
483
484
  const execucao = spawnSync(comando, argumentos, { stdio: "ignore", shell: process.platform === "win32" });
484
485
  return (execucao.status ?? 1) === 0;
485
486
  }
487
+ function resolverComandoLua() {
488
+ if (comandoDisponivel("lua", ["-v"])) {
489
+ return "lua";
490
+ }
491
+ if (comandoDisponivel("luajit", ["-v"])) {
492
+ return "luajit";
493
+ }
494
+ return undefined;
495
+ }
486
496
  async function comandoDoctor() {
497
+ const comandoLua = resolverComandoLua();
487
498
  const checks = [
488
499
  { nome: "node", ok: comandoDisponivel("node") },
489
500
  { nome: "npm", ok: comandoDisponivel("npm") },
490
501
  { nome: "python", ok: comandoDisponivel("python") || comandoDisponivel("py") },
502
+ { nome: "lua", ok: comandoLua !== undefined },
491
503
  { nome: "dotnet", ok: comandoDisponivel("dotnet") },
492
504
  { nome: "go", ok: comandoDisponivel("go") },
493
505
  { nome: "cargo", ok: comandoDisponivel("cargo") },
@@ -514,8 +526,8 @@ function validarCompatibilidadeFramework(alvo, framework) {
514
526
  if (framework === "fastapi" && alvo !== "python") {
515
527
  return `Framework "${framework}" so pode ser usado com o alvo python.`;
516
528
  }
517
- if (alvo === "dart") {
518
- return `Framework "${framework}" nao e suportado para o alvo dart.`;
529
+ if (alvo === "dart" || alvo === "lua") {
530
+ return `Framework "${framework}" nao e suportado para o alvo ${alvo}.`;
519
531
  }
520
532
  return undefined;
521
533
  }
@@ -565,6 +577,9 @@ function normalizarFonteImportacao(valor) {
565
577
  if (valor === "rust" || valor === "rs") {
566
578
  return "rust";
567
579
  }
580
+ if (valor === "lua" || valor === "luajit") {
581
+ return "lua";
582
+ }
568
583
  if (valor === "cpp" || valor === "cxx" || valor === "cc" || valor === "c++") {
569
584
  return "cpp";
570
585
  }
@@ -584,7 +599,8 @@ function normalizarFonteImportacao(valor) {
584
599
  || valor === "cpp"
585
600
  || valor === "typescript"
586
601
  || valor === "python"
587
- || valor === "dart") {
602
+ || valor === "dart"
603
+ || valor === "lua") {
588
604
  return valor;
589
605
  }
590
606
  return undefined;
@@ -620,6 +636,9 @@ function gerarArquivosPorAlvo(ir, alvo, framework) {
620
636
  if (alvo === "dart") {
621
637
  return gerarDart(ir);
622
638
  }
639
+ if (alvo === "lua") {
640
+ return gerarLua(ir);
641
+ }
623
642
  return gerarTypeScript(ir, { framework });
624
643
  }
625
644
  function aplicarEstruturaSaida(arquivos, ir, estrutura) {
@@ -651,6 +670,12 @@ function aplicarEstruturaSaida(arquivos, ir, estrutura) {
651
670
  else if (basename === `${nomeBaseAntigo}.dart`) {
652
671
  novoBasename = `${nomeArquivo}.dart`;
653
672
  }
673
+ else if (basename === `${nomeBaseAntigo}.lua`) {
674
+ novoBasename = `${nomeArquivo}.lua`;
675
+ }
676
+ else if (basename === `test_${nomeBaseAntigo}.lua`) {
677
+ novoBasename = `test_${nomeArquivo}.lua`;
678
+ }
654
679
  return {
655
680
  caminhoRelativo: pastaModulo ? path.join(pastaModulo, novoBasename) : novoBasename,
656
681
  conteudo,
@@ -668,6 +693,13 @@ function contarCasosDeTesteGerados(alvo, arquivos) {
668
693
  }
669
694
  return (arquivoTeste.conteudo.match(/\btest\(/g) ?? []).length;
670
695
  }
696
+ if (alvo === "lua") {
697
+ const arquivoTeste = arquivos.find((item) => path.basename(item.caminhoRelativo).startsWith("test_") && item.caminhoRelativo.endsWith(".lua"));
698
+ if (!arquivoTeste) {
699
+ return 0;
700
+ }
701
+ return (arquivoTeste.conteudo.match(/\blocal function test_/g) ?? []).length;
702
+ }
671
703
  const arquivoTeste = arquivos.find((item) => path.basename(item.caminhoRelativo).startsWith("test_"));
672
704
  if (!arquivoTeste) {
673
705
  return 0;
@@ -678,7 +710,8 @@ function executarTestesGerados(alvo, baseSaida, arquivos, silencioso = false) {
678
710
  const quantidadeTestes = contarCasosDeTesteGerados(alvo, arquivos);
679
711
  if (quantidadeTestes === 0) {
680
712
  if (!silencioso) {
681
- console.log(`Nenhum teste ${alvo === "typescript" ? "TypeScript" : "Python"} foi gerado.`);
713
+ const rotulo = alvo === "typescript" ? "TypeScript" : alvo === "python" ? "Python" : alvo === "dart" ? "Dart" : "Lua";
714
+ console.log(`Nenhum teste ${rotulo} foi gerado.`);
682
715
  }
683
716
  return { codigoSaida: 0, quantidadeTestes, saidaPadrao: "", saidaErro: "" };
684
717
  }
@@ -701,6 +734,36 @@ function executarTestesGerados(alvo, baseSaida, arquivos, silencioso = false) {
701
734
  saidaErro: typeof execucao.stderr === "string" ? execucao.stderr : "",
702
735
  };
703
736
  }
737
+ if (alvo === "lua") {
738
+ const arquivoTeste = arquivos.find((item) => path.basename(item.caminhoRelativo).startsWith("test_") && item.caminhoRelativo.endsWith(".lua"))?.caminhoRelativo;
739
+ if (!arquivoTeste) {
740
+ if (!silencioso) {
741
+ console.log("Nenhum teste Lua foi gerado.");
742
+ }
743
+ return { codigoSaida: 0, quantidadeTestes, saidaPadrao: "", saidaErro: "" };
744
+ }
745
+ const comandoLua = resolverComandoLua();
746
+ if (!comandoLua) {
747
+ return {
748
+ codigoSaida: 1,
749
+ quantidadeTestes,
750
+ saidaPadrao: "",
751
+ saidaErro: "Interpretador Lua nao encontrado. Instale `lua` ou `luajit` para rodar testes gerados.",
752
+ };
753
+ }
754
+ const execucao = spawnSync(comandoLua, [arquivoTeste], {
755
+ stdio: silencioso ? "pipe" : "inherit",
756
+ cwd: baseSaida,
757
+ encoding: silencioso ? "utf8" : undefined,
758
+ shell: process.platform === "win32",
759
+ });
760
+ return {
761
+ codigoSaida: execucao.status ?? 1,
762
+ quantidadeTestes,
763
+ saidaPadrao: typeof execucao.stdout === "string" ? execucao.stdout : "",
764
+ saidaErro: typeof execucao.stderr === "string" ? execucao.stderr : "",
765
+ };
766
+ }
704
767
  const arquivoTeste = arquivos.find((item) => path.basename(item.caminhoRelativo).startsWith("test_"))?.caminhoRelativo;
705
768
  if (!arquivoTeste) {
706
769
  if (!silencioso) {
@@ -3270,7 +3333,7 @@ async function comandoAjudaIa() {
3270
3333
  "Use `sema inspecionar` para descobrir base, codigo vivo e fontes legado.",
3271
3334
  "Use `sema drift` para medir impls, vinculos, rotas, score e lacunas.",
3272
3335
  "Use `sema contexto-ia <arquivo.sema>` para gerar AST, IR, drift, `briefing.json` e `briefing.min.json`.",
3273
- "Use `sema compilar <arquivo-ou-pasta> --alvo <typescript|python|dart> --saida <diretorio>` quando a tarefa pedir codigo derivado.",
3336
+ "Use `sema compilar <arquivo-ou-pasta> --alvo <typescript|python|dart|lua> --saida <diretorio>` quando a tarefa pedir codigo derivado.",
3274
3337
  ]));
3275
3338
  console.log("");
3276
3339
  console.log(renderizarSecaoAscii("Regras praticas", [
@@ -3498,7 +3561,16 @@ async function comandoTestar(arquivo, alvo, saida, estrutura, framework) {
3498
3561
  console.log(`Scaffold ${framework} gerado em ${saida}. A execucao automatica de testes continua focada no framework base da Sema.`);
3499
3562
  return 0;
3500
3563
  }
3501
- return executarTestesGerados(alvo, saida, arquivos).codigoSaida;
3564
+ const execucao = executarTestesGerados(alvo, saida, arquivos);
3565
+ if (execucao.codigoSaida !== 0) {
3566
+ if (execucao.saidaPadrao) {
3567
+ console.log(execucao.saidaPadrao);
3568
+ }
3569
+ if (execucao.saidaErro) {
3570
+ console.error(execucao.saidaErro);
3571
+ }
3572
+ }
3573
+ return execucao.codigoSaida;
3502
3574
  }
3503
3575
  function imprimirResumoVerificacao(resumos) {
3504
3576
  console.log("\nResumo da verificacao:");
@@ -3698,7 +3770,7 @@ async function principal() {
3698
3770
  {
3699
3771
  const fonte = normalizarFonteImportacao(posicionais[0]);
3700
3772
  if (!fonte || !posicionais[1]) {
3701
- 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]");
3773
+ 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|lua> <diretorio> [--saida <diretorio>] [--namespace <base>] [--json]");
3702
3774
  codigoSaida = 1;
3703
3775
  break;
3704
3776
  }