@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.
- package/README.md +2 -2
- package/SEMA_BRIEF.curto.txt +3 -3
- package/SEMA_BRIEF.md +3 -3
- package/SEMA_BRIEF.micro.txt +2 -2
- package/SEMA_INDEX.json +56 -11
- package/dist/drift.d.ts +2 -2
- package/dist/drift.js +20 -0
- package/dist/drift.js.map +1 -1
- package/dist/importador.d.ts +1 -1
- package/dist/importador.js +60 -0
- package/dist/importador.js.map +1 -1
- package/dist/index.js +86 -14
- package/dist/index.js.map +1 -1
- package/dist/lua-symbols.d.ts +8 -0
- package/dist/lua-symbols.js +68 -0
- package/dist/lua-symbols.js.map +1 -0
- package/dist/projeto.js +7 -1
- package/dist/projeto.js.map +1 -1
- package/dist/tipos.d.ts +1 -1
- package/docs/AGENT_STARTER.md +5 -3
- package/docs/instalacao-e-primeiro-uso.md +4 -2
- package/node_modules/@sema/gerador-dart/package.json +1 -1
- package/node_modules/@sema/gerador-lua/dist/index.d.ts +3 -0
- package/node_modules/@sema/gerador-lua/dist/index.js +360 -0
- package/node_modules/@sema/gerador-lua/dist/index.js.map +1 -0
- package/node_modules/@sema/gerador-lua/package.json +7 -0
- package/node_modules/@sema/gerador-python/package.json +1 -1
- package/node_modules/@sema/gerador-typescript/package.json +1 -1
- package/node_modules/@sema/nucleo/dist/ast/tipos.d.ts +1 -1
- package/node_modules/@sema/nucleo/dist/ir/conversor.js +4 -0
- package/node_modules/@sema/nucleo/dist/ir/conversor.js.map +1 -1
- package/node_modules/@sema/nucleo/dist/ir/modelos.d.ts +3 -3
- package/node_modules/@sema/nucleo/dist/parser/parser.js +2 -0
- package/node_modules/@sema/nucleo/dist/parser/parser.js.map +1 -1
- package/node_modules/@sema/nucleo/dist/semantico/analisador.d.ts +2 -2
- package/node_modules/@sema/nucleo/dist/semantico/analisador.js +3 -1
- package/node_modules/@sema/nucleo/dist/semantico/analisador.js.map +1 -1
- package/node_modules/@sema/nucleo/package.json +1 -1
- package/node_modules/@sema/padroes/dist/index.d.ts +2 -1
- package/node_modules/@sema/padroes/dist/index.js +17 -0
- package/node_modules/@sema/padroes/dist/index.js.map +1 -1
- package/node_modules/@sema/padroes/package.json +1 -1
- 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
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
}
|