@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.
Files changed (54) hide show
  1. package/AGENTS.md +1 -1
  2. package/README.md +7 -0
  3. package/SEMA_BRIEF.curto.txt +2 -2
  4. package/SEMA_BRIEF.md +4 -4
  5. package/SEMA_BRIEF.micro.txt +1 -1
  6. package/SEMA_INDEX.json +28 -18
  7. package/dist/docs.d.ts +56 -0
  8. package/dist/docs.js +407 -0
  9. package/dist/docs.js.map +1 -0
  10. package/dist/drift.d.ts +3 -3
  11. package/dist/drift.js +47 -4
  12. package/dist/drift.js.map +1 -1
  13. package/dist/importador.d.ts +1 -1
  14. package/dist/importador.js +56 -0
  15. package/dist/importador.js.map +1 -1
  16. package/dist/index.js +117 -5
  17. package/dist/index.js.map +1 -1
  18. package/dist/lua-symbols.d.ts +6 -4
  19. package/dist/lua-symbols.js +74 -54
  20. package/dist/lua-symbols.js.map +1 -1
  21. package/dist/projeto.js +6 -0
  22. package/dist/projeto.js.map +1 -1
  23. package/dist/tipos.d.ts +1 -1
  24. package/docs/AGENT_STARTER.md +3 -3
  25. package/docs/cli.md +7 -0
  26. package/docs/deploy.md +70 -0
  27. package/docs/documentacao.md +63 -0
  28. package/docs/env.md +56 -0
  29. package/docs/extensao-vscode.md +45 -0
  30. package/docs/fluxo-pratico-ia-sema.md +1 -1
  31. package/docs/instalacao-e-primeiro-uso.md +3 -0
  32. package/docs/integracao-com-ia.md +24 -0
  33. package/docs/mcp.md +53 -0
  34. package/docs/rollback.md +47 -0
  35. package/docs/sintaxe.md +39 -0
  36. package/node_modules/@sema/gerador-css/package.json +1 -1
  37. package/node_modules/@sema/gerador-dart/package.json +1 -1
  38. package/node_modules/@sema/gerador-html/package.json +1 -1
  39. package/node_modules/@sema/gerador-javascript/package.json +1 -1
  40. package/node_modules/@sema/gerador-lua/package.json +1 -1
  41. package/node_modules/@sema/gerador-python/package.json +1 -1
  42. package/node_modules/@sema/gerador-typescript/package.json +1 -1
  43. package/node_modules/@sema/nucleo/dist/ast/tipos.d.ts +1 -1
  44. package/node_modules/@sema/nucleo/dist/ir/conversor.js +4 -0
  45. package/node_modules/@sema/nucleo/dist/ir/conversor.js.map +1 -1
  46. package/node_modules/@sema/nucleo/dist/ir/modelos.d.ts +3 -3
  47. package/node_modules/@sema/nucleo/dist/parser/parser.js +2 -0
  48. package/node_modules/@sema/nucleo/dist/parser/parser.js.map +1 -1
  49. package/node_modules/@sema/nucleo/dist/semantico/analisador.d.ts +2 -2
  50. package/node_modules/@sema/nucleo/dist/semantico/analisador.js +3 -1
  51. package/node_modules/@sema/nucleo/dist/semantico/analisador.js.map +1 -1
  52. package/node_modules/@sema/nucleo/package.json +1 -1
  53. package/node_modules/@sema/padroes/package.json +1 -1
  54. 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 Dart
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;