@semacode/cli 1.5.8 → 1.5.10
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/AGENTS.md +1 -1
- package/README.md +7 -0
- package/SEMA_BRIEF.curto.txt +2 -2
- package/SEMA_BRIEF.md +4 -4
- package/SEMA_BRIEF.micro.txt +1 -1
- package/SEMA_INDEX.json +28 -18
- package/dist/docs.d.ts +56 -0
- package/dist/docs.js +407 -0
- package/dist/docs.js.map +1 -0
- package/dist/drift.d.ts +3 -3
- package/dist/drift.js +47 -4
- package/dist/drift.js.map +1 -1
- package/dist/importador.d.ts +1 -1
- package/dist/importador.js +56 -0
- package/dist/importador.js.map +1 -1
- package/dist/index.js +117 -5
- package/dist/index.js.map +1 -1
- package/dist/lua-symbols.d.ts +6 -4
- package/dist/lua-symbols.js +74 -54
- package/dist/lua-symbols.js.map +1 -1
- package/dist/projeto.js +6 -0
- package/dist/projeto.js.map +1 -1
- package/dist/tipos.d.ts +1 -1
- package/docs/AGENT_STARTER.md +3 -3
- package/docs/cli.md +7 -0
- package/docs/deploy.md +70 -0
- package/docs/documentacao.md +63 -0
- package/docs/env.md +56 -0
- package/docs/extensao-vscode.md +45 -0
- package/docs/fluxo-pratico-ia-sema.md +1 -1
- package/docs/instalacao-e-primeiro-uso.md +3 -0
- package/docs/integracao-com-ia.md +24 -0
- package/docs/mcp.md +53 -0
- package/docs/rollback.md +47 -0
- package/docs/sintaxe.md +39 -0
- package/node_modules/@sema/gerador-css/package.json +1 -1
- package/node_modules/@sema/gerador-dart/package.json +1 -1
- package/node_modules/@sema/gerador-html/package.json +1 -1
- package/node_modules/@sema/gerador-javascript/package.json +1 -1
- package/node_modules/@sema/gerador-lua/package.json +1 -1
- 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/package.json +1 -1
- package/package.json +10 -10
package/dist/index.js
CHANGED
|
@@ -17,6 +17,7 @@ import { gerarCss } from "@sema/gerador-css";
|
|
|
17
17
|
import { carregarConfiguracaoProjeto, carregarProjeto, resolverAlvoPadrao, resolverAlvosVerificacao, resolverEstruturaSaidaPadrao, resolverFrameworkPadrao, resolverSaidaPadrao, } from "./projeto.js";
|
|
18
18
|
import { importarProjetoLegado, resumoImportacao } from "./importador.js";
|
|
19
19
|
import { analisarDriftLegado, assistirRenomeacaoSemantica, gerarMapaImpactoSemantico, } from "./drift.js";
|
|
20
|
+
import { resolverDocumentacaoObrigatoria, verificarDocumentacaoMudanca, } from "./docs.js";
|
|
20
21
|
const STARTER_IA = `Voce esta trabalhando com Sema, um Protocolo de Governanca de Intencao para IA sobre software vivo em backend e front consumer.
|
|
21
22
|
|
|
22
23
|
Importante:
|
|
@@ -25,7 +26,7 @@ Importante:
|
|
|
25
26
|
- leitura humana e bonus toleravel, nao objetivo de produto
|
|
26
27
|
- a Sema nao e gerador magico que deveria fazer tudo
|
|
27
28
|
- a Sema modela contratos, estados, fluxos, erros, efeitos, garantias, vinculos e execucao
|
|
28
|
-
- a Sema gera codigo e scaffolding real para TypeScript, Python e
|
|
29
|
+
- a Sema gera codigo e scaffolding real para TypeScript, Python, Dart e Lua
|
|
29
30
|
- a Sema usa \`importar\` para bootstrap revisavel, nao para contrato final automatico
|
|
30
31
|
- a Sema usa \`impl\` para ligar task a simbolo real do runtime
|
|
31
32
|
- a Sema usa \`vinculos\` para ligar contrato a arquivo, simbolo, recurso e superficie real
|
|
@@ -63,7 +64,7 @@ Comandos essenciais:
|
|
|
63
64
|
- validacao: \`sema validar <arquivo.sema> --json\`
|
|
64
65
|
- diagnosticos: \`sema diagnosticos <arquivo.sema> --json\`
|
|
65
66
|
- formatacao: \`sema formatar <arquivo.sema>\`
|
|
66
|
-
- 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>\`
|
|
67
|
+
- 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>\`
|
|
67
68
|
- exemplos oficiais no projeto: \`sema instalar-exemplos\`
|
|
68
69
|
- geracao de codigo: \`sema compilar <arquivo-ou-pasta> --alvo <typescript|python|dart|lua> --saida <diretorio>\`
|
|
69
70
|
- verificacao final: \`sema verificar <arquivo-ou-pasta> [--json]\`
|
|
@@ -340,6 +341,12 @@ const DOCUMENTOS_SUPORTE_IA = [
|
|
|
340
341
|
"docs/persistencia-vendor-first.md",
|
|
341
342
|
"docs/sintaxe.md",
|
|
342
343
|
"docs/cli.md",
|
|
344
|
+
"docs/mcp.md",
|
|
345
|
+
"docs/documentacao.md",
|
|
346
|
+
"docs/deploy.md",
|
|
347
|
+
"docs/env.md",
|
|
348
|
+
"docs/rollback.md",
|
|
349
|
+
"docs/extensao-vscode.md",
|
|
343
350
|
];
|
|
344
351
|
function resolverImportadorNodeOpcional(especificador) {
|
|
345
352
|
try {
|
|
@@ -449,6 +456,7 @@ function ajuda() {
|
|
|
449
456
|
"sema resumo <arquivo-ou-pasta> --micro --para mudanca",
|
|
450
457
|
"sema drift <arquivo-ou-pasta> --escopo modulo --json",
|
|
451
458
|
"sema impacto <arquivo-ou-pasta> --alvo <token> --mudanca <descricao> --json",
|
|
459
|
+
"sema docs-impacto --intencao \"fazer deploy\" --criar-ausentes --json",
|
|
452
460
|
"sema contexto-ia <arquivo.sema> --saida ./.tmp/contexto --json",
|
|
453
461
|
"",
|
|
454
462
|
"[3] Adotar Sema em projeto que ainda nao usa",
|
|
@@ -469,7 +477,7 @@ function ajuda() {
|
|
|
469
477
|
"auditoria: sema drift <arquivo-ou-pasta> [--escopo <arquivo|modulo|projeto>] [--incluir-worktrees] [--incluir-consumidores-laterais] [--json]",
|
|
470
478
|
"impacto: sema impacto <arquivo-ou-pasta> --alvo <token> [--mudanca <descricao>] [--escopo <arquivo|modulo|projeto>] [--json]",
|
|
471
479
|
"renomeacao: sema renomear-semantico <arquivo-ou-pasta> --de <nome-atual> --para <nome-novo> [--escopo <arquivo|modulo|projeto>] [--json]",
|
|
472
|
-
"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]",
|
|
480
|
+
"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]",
|
|
473
481
|
"validacao: sema validar <arquivo-ou-pasta> [--json]",
|
|
474
482
|
"diagnostico: sema diagnosticos <arquivo.sema> [--json]",
|
|
475
483
|
"geracao: sema compilar <arquivo-ou-pasta> --alvo <python|typescript|dart|lua> --saida <diretorio> [--estrutura <flat|modulos|backend>] [--framework <base|nestjs|fastapi>]",
|
|
@@ -491,6 +499,8 @@ function ajuda() {
|
|
|
491
499
|
"sema contexto-ia <arquivo.sema> [--saida <diretorio>] [--json]",
|
|
492
500
|
"sema sync-ai-entrypoints [--json]",
|
|
493
501
|
"sema instalar-exemplos [--json]",
|
|
502
|
+
"sema docs-impacto --intencao <acao> [--arquivo <caminho>] [--criar-ausentes] [--json]",
|
|
503
|
+
"sema finalizar-mudanca --intencao <acao> [--arquivo <caminho>] [--doc-lida <caminho>] [--json]",
|
|
494
504
|
]),
|
|
495
505
|
"",
|
|
496
506
|
renderizarSecaoAscii("Operacional", [
|
|
@@ -522,6 +532,16 @@ function obterOpcao(args, nome, padrao) {
|
|
|
522
532
|
function possuiFlag(args, nome) {
|
|
523
533
|
return args.includes(nome);
|
|
524
534
|
}
|
|
535
|
+
function obterOpcoesRepetidas(args, nome) {
|
|
536
|
+
const valores = [];
|
|
537
|
+
for (let indice = 0; indice < args.length; indice += 1) {
|
|
538
|
+
if (args[indice] === nome && args[indice + 1]) {
|
|
539
|
+
valores.push(args[indice + 1]);
|
|
540
|
+
indice += 1;
|
|
541
|
+
}
|
|
542
|
+
}
|
|
543
|
+
return valores;
|
|
544
|
+
}
|
|
525
545
|
const OPCOES_COM_VALOR = new Set([
|
|
526
546
|
"--template",
|
|
527
547
|
"--alvo", "-a",
|
|
@@ -533,6 +553,9 @@ const OPCOES_COM_VALOR = new Set([
|
|
|
533
553
|
"--mudanca",
|
|
534
554
|
"--de",
|
|
535
555
|
"--para",
|
|
556
|
+
"--intencao",
|
|
557
|
+
"--arquivo",
|
|
558
|
+
"--doc-lida",
|
|
536
559
|
]);
|
|
537
560
|
const ALIAS_OPCOES = {
|
|
538
561
|
"-a": "--alvo",
|
|
@@ -818,6 +841,9 @@ function normalizarFonteImportacao(valor) {
|
|
|
818
841
|
if (valor === "cpp" || valor === "cxx" || valor === "cc" || valor === "c++") {
|
|
819
842
|
return "cpp";
|
|
820
843
|
}
|
|
844
|
+
if (valor === "lua") {
|
|
845
|
+
return "lua";
|
|
846
|
+
}
|
|
821
847
|
if (valor === "nestjs"
|
|
822
848
|
|| valor === "fastapi"
|
|
823
849
|
|| valor === "flask"
|
|
@@ -834,7 +860,8 @@ function normalizarFonteImportacao(valor) {
|
|
|
834
860
|
|| valor === "cpp"
|
|
835
861
|
|| valor === "typescript"
|
|
836
862
|
|| valor === "python"
|
|
837
|
-
|| valor === "dart"
|
|
863
|
+
|| valor === "dart"
|
|
864
|
+
|| valor === "lua") {
|
|
838
865
|
return valor;
|
|
839
866
|
}
|
|
840
867
|
return undefined;
|
|
@@ -3268,6 +3295,83 @@ async function comandoInstalarExemplos(emJson) {
|
|
|
3268
3295
|
console.log(`- Preservados: ${resultado.preservados.length}`);
|
|
3269
3296
|
return 0;
|
|
3270
3297
|
}
|
|
3298
|
+
function resolverEntradaDocs(posicionais, args) {
|
|
3299
|
+
const intencao = obterOpcao(args, "--intencao") ?? posicionais[0] ?? "";
|
|
3300
|
+
const arquivosPorFlag = obterOpcoesRepetidas(args, "--arquivo");
|
|
3301
|
+
const arquivosPosicionais = obterOpcao(args, "--intencao") ? posicionais : posicionais.slice(1);
|
|
3302
|
+
return {
|
|
3303
|
+
intencao,
|
|
3304
|
+
arquivosAlvo: [...new Set([...arquivosPorFlag, ...arquivosPosicionais])],
|
|
3305
|
+
};
|
|
3306
|
+
}
|
|
3307
|
+
async function comandoDocsImpacto(posicionais, args, emJson) {
|
|
3308
|
+
const { intencao, arquivosAlvo } = resolverEntradaDocs(posicionais, args);
|
|
3309
|
+
if (!intencao.trim()) {
|
|
3310
|
+
console.error("Uso: sema docs-impacto --intencao <acao> [--arquivo <caminho>] [--criar-ausentes] [--json]");
|
|
3311
|
+
return 1;
|
|
3312
|
+
}
|
|
3313
|
+
const resultado = await resolverDocumentacaoObrigatoria({
|
|
3314
|
+
baseProjeto: process.cwd(),
|
|
3315
|
+
intencao,
|
|
3316
|
+
arquivosAlvo,
|
|
3317
|
+
criarAusentes: possuiFlag(args, "--criar-ausentes"),
|
|
3318
|
+
});
|
|
3319
|
+
const payload = {
|
|
3320
|
+
comando: "docs-impacto",
|
|
3321
|
+
...resultado,
|
|
3322
|
+
};
|
|
3323
|
+
if (emJson) {
|
|
3324
|
+
console.log(JSON.stringify(payload, null, 2));
|
|
3325
|
+
return resultado.sucesso ? 0 : 1;
|
|
3326
|
+
}
|
|
3327
|
+
console.log("Documentacao obrigatoria da mudanca");
|
|
3328
|
+
console.log(`- Intencao: ${resultado.intencao}`);
|
|
3329
|
+
console.log(`- Categorias: ${resumirListaTexto(resultado.categorias, 8)}`);
|
|
3330
|
+
console.log(`- Leitura obrigatoria: ${resultado.leituraObrigatoria.length}`);
|
|
3331
|
+
for (const doc of resultado.leituraObrigatoria) {
|
|
3332
|
+
console.log(` - ${doc.relativo} (${doc.existe ? "ok" : "ausente"}) - ${doc.motivo}`);
|
|
3333
|
+
}
|
|
3334
|
+
if (resultado.docsCriadas.length > 0) {
|
|
3335
|
+
console.log(`- Docs criadas: ${resultado.docsCriadas.map((doc) => doc.relativo).join(", ")}`);
|
|
3336
|
+
}
|
|
3337
|
+
if (resultado.bloqueios.length > 0) {
|
|
3338
|
+
console.error("Bloqueios:");
|
|
3339
|
+
for (const bloqueio of resultado.bloqueios) {
|
|
3340
|
+
console.error(`- [SEM DOC ${bloqueio.severidade}] ${bloqueio.mensagem}`);
|
|
3341
|
+
}
|
|
3342
|
+
}
|
|
3343
|
+
return resultado.sucesso ? 0 : 1;
|
|
3344
|
+
}
|
|
3345
|
+
async function comandoFinalizarMudanca(posicionais, args, emJson) {
|
|
3346
|
+
const { intencao, arquivosAlvo } = resolverEntradaDocs(posicionais, args);
|
|
3347
|
+
if (!intencao.trim()) {
|
|
3348
|
+
console.error("Uso: sema finalizar-mudanca --intencao <acao> [--arquivo <caminho>] [--doc-lida <caminho>] [--json]");
|
|
3349
|
+
return 1;
|
|
3350
|
+
}
|
|
3351
|
+
const resultado = await verificarDocumentacaoMudanca({
|
|
3352
|
+
baseProjeto: process.cwd(),
|
|
3353
|
+
intencao,
|
|
3354
|
+
arquivosAlvo,
|
|
3355
|
+
docsLidas: obterOpcoesRepetidas(args, "--doc-lida"),
|
|
3356
|
+
});
|
|
3357
|
+
const payload = {
|
|
3358
|
+
comando: "finalizar-mudanca",
|
|
3359
|
+
...resultado,
|
|
3360
|
+
};
|
|
3361
|
+
if (emJson) {
|
|
3362
|
+
console.log(JSON.stringify(payload, null, 2));
|
|
3363
|
+
return resultado.sucesso ? 0 : 1;
|
|
3364
|
+
}
|
|
3365
|
+
if (resultado.sucesso) {
|
|
3366
|
+
console.log("Leitura documental comprovada para a mudanca.");
|
|
3367
|
+
return 0;
|
|
3368
|
+
}
|
|
3369
|
+
console.error("Mudanca bloqueada por documentacao obrigatoria:");
|
|
3370
|
+
for (const diagnostico of resultado.diagnosticos) {
|
|
3371
|
+
console.error(`- [severidade ${diagnostico.severidade}] ${diagnostico.mensagem}`);
|
|
3372
|
+
}
|
|
3373
|
+
return 1;
|
|
3374
|
+
}
|
|
3271
3375
|
async function comandoValidar(entrada) {
|
|
3272
3376
|
const modulos = await carregarModulos(entrada);
|
|
3273
3377
|
const diagnosticos = modulos.flatMap((item) => item.resultado.diagnosticos);
|
|
@@ -3803,6 +3907,8 @@ async function comandoAjudaIa() {
|
|
|
3803
3907
|
"Use `sema exemplos-prompt-ia` para pegar modelos prontos de prompt.",
|
|
3804
3908
|
"Use `sema inspecionar` para descobrir base, codigo vivo e fontes legado.",
|
|
3805
3909
|
"Use `sema drift` para medir impls, vinculos, rotas, score e lacunas.",
|
|
3910
|
+
"Use `sema docs-impacto --intencao <acao>` para ler ou criar docs obrigatorias antes de agir.",
|
|
3911
|
+
"Use `sema finalizar-mudanca --intencao <acao>` para bloquear conclusao sem leitura documental comprovada.",
|
|
3806
3912
|
"Use `sema contexto-ia <arquivo.sema>` para gerar AST, IR, drift, `briefing.json` e `briefing.min.json`.",
|
|
3807
3913
|
"Use `sema compilar <arquivo-ou-pasta> --alvo <typescript|python|dart|lua> --saida <diretorio>` quando a tarefa pedir codigo derivado.",
|
|
3808
3914
|
]));
|
|
@@ -4286,7 +4392,7 @@ async function principal() {
|
|
|
4286
4392
|
{
|
|
4287
4393
|
const fonte = normalizarFonteImportacao(posicionais[0]);
|
|
4288
4394
|
if (!fonte || !posicionais[1]) {
|
|
4289
|
-
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|lua> <diretorio> [--saida <diretorio>] [--namespace <base>] [--json]");
|
|
4290
4396
|
codigoSaida = 1;
|
|
4291
4397
|
break;
|
|
4292
4398
|
}
|
|
@@ -4311,6 +4417,12 @@ async function principal() {
|
|
|
4311
4417
|
case "instalar-exemplos":
|
|
4312
4418
|
codigoSaida = await comandoInstalarExemplos(possuiFlag(resto, "--json"));
|
|
4313
4419
|
break;
|
|
4420
|
+
case "docs-impacto":
|
|
4421
|
+
codigoSaida = await comandoDocsImpacto(posicionais, resto, possuiFlag(resto, "--json"));
|
|
4422
|
+
break;
|
|
4423
|
+
case "finalizar-mudanca":
|
|
4424
|
+
codigoSaida = await comandoFinalizarMudanca(posicionais, resto, possuiFlag(resto, "--json"));
|
|
4425
|
+
break;
|
|
4314
4426
|
case "resumo":
|
|
4315
4427
|
codigoSaida = await comandoResumo(posicionais[0], resto, possuiFlag(resto, "--json"));
|
|
4316
4428
|
break;
|