@semacode/cli 1.5.28 → 1.5.30

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 (125) hide show
  1. package/README.md +144 -144
  2. package/dist/bridge.d.ts +52 -0
  3. package/dist/bridge.js +318 -0
  4. package/dist/bridge.js.map +1 -0
  5. package/dist/comandos.d.ts +11 -0
  6. package/dist/comandos.js +146 -0
  7. package/dist/comandos.js.map +1 -0
  8. package/dist/contexto.d.ts +34 -0
  9. package/dist/contexto.js +197 -0
  10. package/dist/contexto.js.map +1 -0
  11. package/dist/drift.d.ts +1 -1
  12. package/dist/drift.js +32 -5
  13. package/dist/drift.js.map +1 -1
  14. package/dist/guard.d.ts +35 -0
  15. package/dist/guard.js +164 -0
  16. package/dist/guard.js.map +1 -0
  17. package/dist/index.js +391 -64
  18. package/dist/index.js.map +1 -1
  19. package/dist/lua-symbols.d.ts +0 -6
  20. package/dist/lua-symbols.js +11 -78
  21. package/dist/lua-symbols.js.map +1 -1
  22. package/dist/projeto.js +6 -0
  23. package/dist/projeto.js.map +1 -1
  24. package/dist/tipos.d.ts +1 -1
  25. package/exemplos/.prepack-generated +1 -0
  26. package/exemplos/author_obra_comum.sema +294 -294
  27. package/exemplos/author_tema_sensivel.sema +264 -264
  28. package/exemplos/profile_game.sema +114 -114
  29. package/exemplos/profile_legal.sema +105 -105
  30. package/exemplos/profile_ops.sema +110 -110
  31. package/exemplos/profile_research.sema +104 -104
  32. package/exemplos/profile_software.sema +123 -123
  33. package/exemplos/profile_workflow_n8n.sema +99 -99
  34. package/node_modules/@sema/gerador-css/package.json +14 -7
  35. package/node_modules/@sema/gerador-css/src/index.ts +605 -0
  36. package/node_modules/@sema/gerador-css/tsconfig.json +13 -0
  37. package/node_modules/@sema/gerador-css/tsconfig.tsbuildinfo +1 -0
  38. package/node_modules/@sema/gerador-dart/package.json +14 -7
  39. package/node_modules/@sema/gerador-dart/src/index.ts +52 -0
  40. package/node_modules/@sema/gerador-dart/tsconfig.json +13 -0
  41. package/node_modules/@sema/gerador-dart/tsconfig.tsbuildinfo +1 -0
  42. package/node_modules/@sema/gerador-html/package.json +14 -7
  43. package/node_modules/@sema/gerador-html/src/index.ts +185 -0
  44. package/node_modules/@sema/gerador-html/tsconfig.json +13 -0
  45. package/node_modules/@sema/gerador-html/tsconfig.tsbuildinfo +1 -0
  46. package/node_modules/@sema/gerador-javascript/package.json +14 -7
  47. package/node_modules/@sema/gerador-javascript/src/index.ts +461 -0
  48. package/node_modules/@sema/gerador-javascript/tsconfig.json +13 -0
  49. package/node_modules/@sema/gerador-javascript/tsconfig.tsbuildinfo +1 -0
  50. package/node_modules/@sema/gerador-lua/package.json +14 -7
  51. package/node_modules/@sema/gerador-lua/src/index.ts +359 -0
  52. package/node_modules/@sema/gerador-lua/tsconfig.json +13 -0
  53. package/node_modules/@sema/gerador-lua/tsconfig.tsbuildinfo +1 -0
  54. package/node_modules/@sema/gerador-python/package.json +14 -7
  55. package/node_modules/@sema/gerador-python/src/index.ts +850 -0
  56. package/node_modules/@sema/gerador-python/tsconfig.json +13 -0
  57. package/node_modules/@sema/gerador-python/tsconfig.tsbuildinfo +1 -0
  58. package/node_modules/@sema/gerador-typescript/package.json +14 -7
  59. package/node_modules/@sema/gerador-typescript/src/index.ts +876 -0
  60. package/node_modules/@sema/gerador-typescript/tsconfig.json +13 -0
  61. package/node_modules/@sema/gerador-typescript/tsconfig.tsbuildinfo +1 -0
  62. package/node_modules/@sema/nucleo/dist/ast/tipos.d.ts +1 -1
  63. package/node_modules/@sema/nucleo/dist/index.d.ts +17 -0
  64. package/node_modules/@sema/nucleo/dist/index.js +28 -0
  65. package/node_modules/@sema/nucleo/dist/index.js.map +1 -1
  66. package/node_modules/@sema/nucleo/dist/ir/conversor.js +4 -0
  67. package/node_modules/@sema/nucleo/dist/ir/conversor.js.map +1 -1
  68. package/node_modules/@sema/nucleo/dist/ir/modelos.d.ts +3 -3
  69. package/node_modules/@sema/nucleo/dist/parser/parser.js +2 -0
  70. package/node_modules/@sema/nucleo/dist/parser/parser.js.map +1 -1
  71. package/node_modules/@sema/nucleo/dist/semantico/analisador.d.ts +2 -2
  72. package/node_modules/@sema/nucleo/dist/semantico/analisador.js +3 -1
  73. package/node_modules/@sema/nucleo/dist/semantico/analisador.js.map +1 -1
  74. package/node_modules/@sema/nucleo/package.json +10 -7
  75. package/node_modules/@sema/nucleo/src/ast/tipos.ts +207 -0
  76. package/node_modules/@sema/nucleo/src/diagnosticos/index.ts +43 -0
  77. package/node_modules/@sema/nucleo/src/formatador/index.ts +530 -0
  78. package/node_modules/@sema/nucleo/src/index.ts +183 -0
  79. package/node_modules/@sema/nucleo/src/ir/conversor.ts +1037 -0
  80. package/node_modules/@sema/nucleo/src/ir/modelos.ts +403 -0
  81. package/node_modules/@sema/nucleo/src/lexer/lexer.ts +166 -0
  82. package/node_modules/@sema/nucleo/src/lexer/tokens.ts +79 -0
  83. package/node_modules/@sema/nucleo/src/parser/gramatica.ebnf +41 -0
  84. package/node_modules/@sema/nucleo/src/parser/parser.ts +936 -0
  85. package/node_modules/@sema/nucleo/src/persistencia/contratos.ts +379 -0
  86. package/node_modules/@sema/nucleo/src/semantico/analisador.ts +3126 -0
  87. package/node_modules/@sema/nucleo/src/semantico/estruturas.ts +665 -0
  88. package/node_modules/@sema/nucleo/src/semantico/seguranca.ts +362 -0
  89. package/node_modules/@sema/nucleo/src/util/arquivos.ts +28 -0
  90. package/node_modules/@sema/nucleo/tsconfig.json +9 -0
  91. package/node_modules/@sema/nucleo/tsconfig.tsbuildinfo +1 -0
  92. package/node_modules/@sema/padroes/package.json +10 -7
  93. package/node_modules/@sema/padroes/src/index.ts +382 -0
  94. package/node_modules/@sema/padroes/tsconfig.json +9 -0
  95. package/node_modules/@sema/padroes/tsconfig.tsbuildinfo +1 -0
  96. package/package.json +74 -74
  97. package/AGENTS.md +0 -280
  98. package/LICENSE +0 -22
  99. package/SEMA_BRIEF.curto.txt +0 -11
  100. package/SEMA_BRIEF.md +0 -112
  101. package/SEMA_BRIEF.micro.txt +0 -9
  102. package/SEMA_INDEX.json +0 -1534
  103. package/dist/php-symbols.d.ts +0 -24
  104. package/dist/php-symbols.js +0 -375
  105. package/dist/php-symbols.js.map +0 -1
  106. package/docs/AGENT_STARTER.md +0 -109
  107. package/docs/cli.md +0 -175
  108. package/docs/como-ensinar-a-sema-para-ia.md +0 -155
  109. package/docs/deploy.md +0 -93
  110. package/docs/documentacao.md +0 -88
  111. package/docs/env.md +0 -105
  112. package/docs/extensao-vscode.md +0 -53
  113. package/docs/fluxo-pratico-ia-sema.md +0 -187
  114. package/docs/instalacao-e-primeiro-uso.md +0 -134
  115. package/docs/integracao-com-ia.md +0 -110
  116. package/docs/mcp.md +0 -292
  117. package/docs/pagamento-ponta-a-ponta.md +0 -171
  118. package/docs/persistencia-vendor-first.md +0 -151
  119. package/docs/prompt-base-ia-sema.md +0 -111
  120. package/docs/repositories.md +0 -54
  121. package/docs/rollback.md +0 -49
  122. package/docs/seguranca.md +0 -126
  123. package/docs/sintaxe.md +0 -218
  124. package/llms-full.txt +0 -34
  125. package/llms.txt +0 -17
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Registro de comandos da CLI Sema.
3
+ *
4
+ * Cada comando é um módulo separado com seu contrato .sema.
5
+ * Este arquivo é o dispatcher — o index.ts só importa daqui.
6
+ *
7
+ * NOVOS COMANDOS: adicione aqui, nunca no index.ts.
8
+ * O index.ts é só `principal()` com um switch fino que delega pra cá.
9
+ */
10
+ export type HandlerComando = (posicionais: string[], args: string[], emJson: boolean) => Promise<number>;
11
+ export declare const REGISTRO_COMANDOS: Record<string, HandlerComando>;
@@ -0,0 +1,146 @@
1
+ /**
2
+ * Registro de comandos da CLI Sema.
3
+ *
4
+ * Cada comando é um módulo separado com seu contrato .sema.
5
+ * Este arquivo é o dispatcher — o index.ts só importa daqui.
6
+ *
7
+ * NOVOS COMANDOS: adicione aqui, nunca no index.ts.
8
+ * O index.ts é só `principal()` com um switch fino que delega pra cá.
9
+ */
10
+ import { operarBridgeCliParaMcp, configurarBridgeLocal, obterTokenMcpAmbiente, } from "./bridge.js";
11
+ import { gerarPacoteContextoChat, } from "./contexto.js";
12
+ // ---------------------------------------------------------------------------
13
+ // Handlers dos novos comandos (modulares, com contrato .sema)
14
+ // ---------------------------------------------------------------------------
15
+ async function comandoMcpClient(posicionais, args, emJson) {
16
+ const { token, endpoint } = obterTokenMcpAmbiente();
17
+ const intencao = posicionais[0] ?? "validar projeto";
18
+ const contratos = posicionais.slice(1);
19
+ if (!token) {
20
+ console.error("Token MCP nao configurado. Use 'sema mcp-instalar-chave --stdin' primeiro.");
21
+ return 1;
22
+ }
23
+ const entrada = {
24
+ contratos: contratos.length > 0 ? contratos : ["."],
25
+ intencao,
26
+ endpointMcp: endpoint,
27
+ token,
28
+ modo: "CLI_LOCAL",
29
+ };
30
+ const resultado = await operarBridgeCliParaMcp(entrada);
31
+ if (emJson) {
32
+ console.log(JSON.stringify(resultado, null, 2));
33
+ return resultado.erro ? 1 : 0;
34
+ }
35
+ console.log(`Bridge CLI → MCP: ${resultado.sessao.status}`);
36
+ console.log(`Perfis: ${resultado.perfisAplicaveis.join(", ") || "nenhum"}`);
37
+ console.log(`Próximo passo: ${resultado.proximoPasso}`);
38
+ if (resultado.erro) {
39
+ console.error(`Erro: ${resultado.erro}`);
40
+ }
41
+ return resultado.erro ? 1 : 0;
42
+ }
43
+ async function comandoBridgeConfig(_posicionais, args, emJson) {
44
+ const { token, endpoint } = obterTokenMcpAmbiente();
45
+ if (!token) {
46
+ console.error("Token MCP nao configurado. Use 'sema mcp-instalar-chave --stdin' primeiro.");
47
+ return 1;
48
+ }
49
+ const resultado = await configurarBridgeLocal({
50
+ endpointMcp: endpoint,
51
+ token,
52
+ persistir: true,
53
+ });
54
+ if (emJson) {
55
+ console.log(JSON.stringify(resultado, null, 2));
56
+ return resultado.configurado ? 0 : 1;
57
+ }
58
+ if (resultado.configurado) {
59
+ console.log(`Bridge configurada: ${resultado.status}`);
60
+ console.log(`Endpoint: ${endpoint}`);
61
+ }
62
+ else {
63
+ console.error(`Falha: ${resultado.erro ?? "desconhecido"}`);
64
+ }
65
+ return resultado.configurado ? 0 : 1;
66
+ }
67
+ async function comandoContextoChat(posicionais, args, emJson) {
68
+ const contratos = posicionais;
69
+ const formato = emJson ? "inline" : "ambos";
70
+ if (contratos.length === 0) {
71
+ console.error("Uso: sema contexto-chat <contrato1.sema> [contrato2.sema] ...");
72
+ return 1;
73
+ }
74
+ const entrada = {
75
+ contratos,
76
+ formatoSaida: formato,
77
+ };
78
+ const resultado = await gerarPacoteContextoChat(entrada);
79
+ if (emJson) {
80
+ console.log(JSON.stringify({
81
+ comando: "contexto-chat",
82
+ pacote: resultado.pacote,
83
+ prontoParaChat: resultado.prontoParaChat,
84
+ tamanhoBytes: resultado.tamanhoBytes,
85
+ arquivosGerados: resultado.arquivosGerados,
86
+ }, null, 2));
87
+ return resultado.prontoParaChat ? 0 : 1;
88
+ }
89
+ if (resultado.inlineTexto) {
90
+ console.log(resultado.inlineTexto);
91
+ }
92
+ if (resultado.arquivosGerados.length > 0) {
93
+ console.error(`\nArquivos gerados: ${resultado.arquivosGerados.join(", ")}`);
94
+ }
95
+ if (!resultado.prontoParaChat) {
96
+ console.error(`\n⚠️ Pacote excede o limite de ${resultado.tamanhoBytes} bytes para chat inline.`);
97
+ console.error("Use --json e copie o arquivo gerado.");
98
+ return 1;
99
+ }
100
+ return 0;
101
+ }
102
+ // ---------------------------------------------------------------------------
103
+ // Guarda de governança
104
+ // ---------------------------------------------------------------------------
105
+ async function comandoGuard(posicionais, _args, emJson) {
106
+ const { ativarGuarda, desativarGuarda, statusGuarda } = await import("./guard.js");
107
+ const baseProjeto = process.cwd();
108
+ const subcomando = posicionais[0] ?? "status";
109
+ let resultado;
110
+ switch (subcomando) {
111
+ case "on":
112
+ resultado = await ativarGuarda(baseProjeto);
113
+ break;
114
+ case "off":
115
+ resultado = await desativarGuarda(baseProjeto);
116
+ break;
117
+ case "status":
118
+ default:
119
+ resultado = await statusGuarda(baseProjeto);
120
+ break;
121
+ }
122
+ if (emJson) {
123
+ console.log(JSON.stringify(resultado, null, 2));
124
+ }
125
+ else {
126
+ console.log(resultado.mensagem ?? `Guarda: ${resultado.sucesso ? "ok" : "falha"}`);
127
+ if (resultado.estado) {
128
+ console.log(` Ativo: ${resultado.estado.ativo ? "sim" : "nao"}`);
129
+ console.log(` Docs-impacto: ${resultado.estado.docsImpactoChamado ? "chamado" : "pendente"}`);
130
+ if (resultado.estado.intencao) {
131
+ console.log(` Intencao: ${resultado.estado.intencao}`);
132
+ }
133
+ }
134
+ }
135
+ return resultado.sucesso ? 0 : 1;
136
+ }
137
+ // ---------------------------------------------------------------------------
138
+ // Registro
139
+ // ---------------------------------------------------------------------------
140
+ export const REGISTRO_COMANDOS = {
141
+ "mcp-client": comandoMcpClient,
142
+ "bridge-config": comandoBridgeConfig,
143
+ "contexto-chat": comandoContextoChat,
144
+ "guard": comandoGuard,
145
+ };
146
+ //# sourceMappingURL=comandos.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"comandos.js","sourceRoot":"","sources":["../src/comandos.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Gerador de pacote de contexto para chats web (ChatGPT, Lovable, etc.).
3
+ *
4
+ * A CLI lê contratos e código selecionado do disco local e gera um pacote
5
+ * compacto que o usuário cola no chat. Isso elimina o sync manual — a CLI
6
+ * faz o trabalho pesado de I/O local e entrega um payload pronto.
7
+ *
8
+ * Contrato: contratos/sema/mcp_client_bridge.sema — task gerar_pacote_contexto_para_chat
9
+ */
10
+ export type FormatoSaidaContexto = "inline" | "arquivo" | "ambos";
11
+ export interface PacoteContextoChat {
12
+ contratos: string[];
13
+ resumo: string;
14
+ irResumida: string;
15
+ driftResumido: string;
16
+ impactMap: string[];
17
+ docsRelevantes: string[];
18
+ checksum: string;
19
+ }
20
+ export interface ContextoChatEntrada {
21
+ contratos: string[];
22
+ codigoSelecionado?: string[];
23
+ incluirDrift?: boolean;
24
+ incluirImpacto?: boolean;
25
+ formatoSaida: FormatoSaidaContexto;
26
+ }
27
+ export interface ContextoChatResultado {
28
+ pacote: PacoteContextoChat;
29
+ prontoParaChat: boolean;
30
+ tamanhoBytes: number;
31
+ arquivosGerados: string[];
32
+ inlineTexto?: string;
33
+ }
34
+ export declare function gerarPacoteContextoChat(entrada: ContextoChatEntrada, cwd?: string): Promise<ContextoChatResultado>;
@@ -0,0 +1,197 @@
1
+ /**
2
+ * Gerador de pacote de contexto para chats web (ChatGPT, Lovable, etc.).
3
+ *
4
+ * A CLI lê contratos e código selecionado do disco local e gera um pacote
5
+ * compacto que o usuário cola no chat. Isso elimina o sync manual — a CLI
6
+ * faz o trabalho pesado de I/O local e entrega um payload pronto.
7
+ *
8
+ * Contrato: contratos/sema/mcp_client_bridge.sema — task gerar_pacote_contexto_para_chat
9
+ */
10
+ import { readFile, mkdir, writeFile } from "node:fs/promises";
11
+ import path from "node:path";
12
+ // ---------------------------------------------------------------------------
13
+ // Constantes
14
+ // ---------------------------------------------------------------------------
15
+ const LIMITE_TAMANHO_INLINE = 100_000; // 100KB
16
+ const PADROES_SEGREDO = [
17
+ /(?:api[_-]?key|secret|token|password|senha)\s*[:=]\s*["']?[A-Za-z0-9_\-]{16,}/gi,
18
+ /\bsk-[A-Za-z0-9_\-]{20,}\b/g,
19
+ /\beyJ[A-Za-z0-9_\-]+\.[A-Za-z0-9_\-]+\.[A-Za-z0-9_\-]+\b/g,
20
+ ];
21
+ // ---------------------------------------------------------------------------
22
+ // Gerar pacote de contexto para chat
23
+ // ---------------------------------------------------------------------------
24
+ export async function gerarPacoteContextoChat(entrada, cwd = process.cwd()) {
25
+ if (!entrada.contratos || entrada.contratos.length === 0) {
26
+ throw new Error("Nenhum contrato informado. Use --contratos <arquivo1.sema> <arquivo2.sema>");
27
+ }
28
+ // Ler contratos
29
+ const contratosConteudo = [];
30
+ for (const contrato of entrada.contratos) {
31
+ const absoluto = path.resolve(cwd, contrato);
32
+ const conteudo = await readFile(absoluto, "utf8");
33
+ contratosConteudo.push({ caminho: contrato, conteudo });
34
+ }
35
+ // Ler código selecionado (se houver)
36
+ const codigoConteudo = [];
37
+ if (entrada.codigoSelecionado) {
38
+ for (const arquivo of entrada.codigoSelecionado) {
39
+ try {
40
+ const absoluto = path.resolve(cwd, arquivo);
41
+ let conteudo = await readFile(absoluto, "utf8");
42
+ conteudo = sanitizarConteudo(conteudo);
43
+ codigoConteudo.push({ caminho: arquivo, conteudo });
44
+ }
45
+ catch {
46
+ // Arquivo não existe — ignora silenciosamente
47
+ }
48
+ }
49
+ }
50
+ // Montar resumo
51
+ const modulos = contratosConteudo.map((c) => extrairModulo(c.conteudo)).filter(Boolean);
52
+ const tarefas = contratosConteudo.flatMap((c) => extrairTarefas(c.conteudo));
53
+ const rotas = contratosConteudo.flatMap((c) => extrairRotas(c.conteudo));
54
+ const resumo = [
55
+ `# Contexto Sema para Chat`,
56
+ ``,
57
+ `**Módulos:** ${modulos.join(", ") || "nenhum"}`,
58
+ `**Tarefas:** ${tarefas.length}`,
59
+ `**Rotas:** ${rotas.length}`,
60
+ `**Arquivos de código:** ${codigoConteudo.length}`,
61
+ ``,
62
+ `## Contratos`,
63
+ ...contratosConteudo.map((c) => `### ${c.caminho}\n\`\`\`sema\n${c.conteudo}\n\`\`\``),
64
+ ``,
65
+ ].join("\n");
66
+ // Código selecionado (resumido)
67
+ const codigoResumido = codigoConteudo.length > 0
68
+ ? [
69
+ `## Código Selecionado`,
70
+ ...codigoConteudo.map((c) => {
71
+ const ext = path.extname(c.caminho).slice(1) || "txt";
72
+ return `### ${c.caminho}\n\`\`\`${ext}\n${c.conteudo}\n\`\`\``;
73
+ }),
74
+ ``,
75
+ ].join("\n")
76
+ : "";
77
+ // IR resumida
78
+ const irResumida = [
79
+ `## IR Resumida`,
80
+ `- Módulos: ${modulos.join(", ") || "nenhum"}`,
81
+ `- Tarefas: ${tarefas.map((t) => `\`${t}\``).join(", ") || "nenhuma"}`,
82
+ `- Rotas: ${rotas.map((r) => `\`${r}\``).join(", ") || "nenhuma"}`,
83
+ ``,
84
+ ].join("\n");
85
+ // Drift resumido (placeholder — a CLI faz drift real via `sema drift`)
86
+ const driftResumido = entrada.incluirDrift
87
+ ? [
88
+ `## Drift`,
89
+ `⚠️ Drift real requer \`sema drift\` CLI.`,
90
+ `Este pacote contém contratos e código para o MCP executar drift remoto.`,
91
+ ``,
92
+ ].join("\n")
93
+ : `## Drift\nNão incluído (use --drift para incluir).\n`;
94
+ // Impact map (placeholder)
95
+ const impactMap = entrada.incluirImpacto
96
+ ? tarefas.map((t) => `- \`${t}\`: contratos/${t}.sema → implementação`)
97
+ : [];
98
+ // Docs relevantes
99
+ const docsRelevantes = [
100
+ "AGENTS.md",
101
+ "docs/mcp.md",
102
+ "docs/cli.md",
103
+ "docs/sintaxe.md",
104
+ ];
105
+ // Checksum simples
106
+ const conteudoTotal = contratosConteudo.map((c) => c.conteudo).join("");
107
+ const checksum = checksumSimples(conteudoTotal);
108
+ const pacote = {
109
+ contratos: entrada.contratos,
110
+ resumo,
111
+ irResumida,
112
+ driftResumido,
113
+ impactMap,
114
+ docsRelevantes,
115
+ checksum,
116
+ };
117
+ // Montar texto inline completo
118
+ const inlineTexto = [
119
+ `<!-- SEMA_CONTEXT_PACK v1 checksum=${checksum} -->`,
120
+ resumo,
121
+ codigoResumido,
122
+ irResumida,
123
+ driftResumido,
124
+ impactMap.length > 0 ? `## Impact Map\n${impactMap.join("\n")}\n` : "",
125
+ `## Docs Relevantes`,
126
+ `Leia estes arquivos antes de agir:`,
127
+ ...docsRelevantes.map((d) => `- \`${d}\``),
128
+ ``,
129
+ `## Instruções para o Agente`,
130
+ `1. Leia os contratos acima — eles são a fonte da verdade`,
131
+ `2. Código selecionado é contexto adicional, não substitui o contrato`,
132
+ `3. Antes de qualquer ação: crie, edite ou remova o .sema aplicável`,
133
+ `4. Use \`sema_docs_impacto\` com sua intenção declarada`,
134
+ `5. Finalize com \`sema_finalizar_mudanca\``,
135
+ ].join("\n");
136
+ const tamanhoBytes = Buffer.byteLength(inlineTexto, "utf8");
137
+ const prontoParaChat = tamanhoBytes <= LIMITE_TAMANHO_INLINE;
138
+ // Gerar arquivos se solicitado
139
+ const arquivosGerados = [];
140
+ if (entrada.formatoSaida === "arquivo" || entrada.formatoSaida === "ambos") {
141
+ const pastaSaida = path.resolve(cwd, ".tmp", "sema-contexto-chat");
142
+ await mkdir(pastaSaida, { recursive: true });
143
+ const arquivoContexto = path.join(pastaSaida, "SEMA_CONTEXT_CHAT.md");
144
+ await writeFile(arquivoContexto, inlineTexto, "utf8");
145
+ arquivosGerados.push(arquivoContexto);
146
+ // Também gerar JSON estruturado
147
+ const arquivoJson = path.join(pastaSaida, "contexto-chat.json");
148
+ await writeFile(arquivoJson, JSON.stringify({ pacote, tamanhoBytes, prontoParaChat }, null, 2), "utf8");
149
+ arquivosGerados.push(arquivoJson);
150
+ }
151
+ return {
152
+ pacote,
153
+ prontoParaChat,
154
+ tamanhoBytes,
155
+ arquivosGerados,
156
+ inlineTexto: entrada.formatoSaida === "inline" || entrada.formatoSaida === "ambos" ? inlineTexto : undefined,
157
+ };
158
+ }
159
+ // ---------------------------------------------------------------------------
160
+ // Helpers de extração
161
+ // ---------------------------------------------------------------------------
162
+ function extrairModulo(conteudo) {
163
+ const match = conteudo.match(/^module\s+([\w.]+)\s*\{/m);
164
+ return match ? match[1] : null;
165
+ }
166
+ function extrairTarefas(conteudo) {
167
+ const tarefas = [];
168
+ const regex = /^\s*task\s+(\w+)\s*\{/gm;
169
+ let match;
170
+ while ((match = regex.exec(conteudo)) !== null) {
171
+ tarefas.push(match[1]);
172
+ }
173
+ return tarefas;
174
+ }
175
+ function extrairRotas(conteudo) {
176
+ const rotas = [];
177
+ const regex = /^\s*route\s+(\w+)\s*\{/gm;
178
+ let match;
179
+ while ((match = regex.exec(conteudo)) !== null) {
180
+ rotas.push(match[1]);
181
+ }
182
+ return rotas;
183
+ }
184
+ function sanitizarConteudo(conteudo) {
185
+ for (const padrao of PADROES_SEGREDO) {
186
+ conteudo = conteudo.replace(padrao, "[REDACTED]");
187
+ }
188
+ return conteudo;
189
+ }
190
+ function checksumSimples(texto) {
191
+ let hash = 0;
192
+ for (let i = 0; i < texto.length; i++) {
193
+ hash = ((hash << 5) - hash + texto.charCodeAt(i)) | 0;
194
+ }
195
+ return Math.abs(hash).toString(16).padStart(8, "0");
196
+ }
197
+ //# sourceMappingURL=contexto.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contexto.js","sourceRoot":"","sources":["../src/contexto.ts"],"names":[],"mappings":"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"}
package/dist/drift.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import type { EngineBanco, NivelConfiancaSemantica, NivelRiscoSemantico, TipoRecursoPersistencia } from "@sema/nucleo";
2
2
  import type { ContextoProjetoCarregado } from "./projeto.js";
3
- type OrigemCodigoDrift = "ts" | "py" | "dart" | "cs" | "java" | "go" | "rust" | "cpp";
3
+ type OrigemCodigoDrift = "ts" | "py" | "dart" | "lua" | "cs" | "java" | "go" | "rust" | "cpp";
4
4
  type OrigemSimboloDrift = OrigemCodigoDrift | "sql";
5
5
  interface SimboloResolvido {
6
6
  origem: OrigemSimboloDrift;
package/dist/drift.js CHANGED
@@ -6,6 +6,7 @@ import { extrairSimbolosCpp } from "./cpp-symbols.js";
6
6
  import { extrairRotasDotnet, extrairSimbolosDotnet } from "./dotnet-http.js";
7
7
  import { extrairRotasGo, extrairSimbolosGo } from "./go-http.js";
8
8
  import { extrairRotasJava, extrairSimbolosJava } from "./java-http.js";
9
+ import { extrairSimbolosLua } from "./lua-symbols.js";
9
10
  import { contarIndentacaoPython, extrairRotasFlaskDecoradas, normalizarCaminhoFlask } from "./python-http.js";
10
11
  import { extrairRotasRust, extrairSimbolosRust } from "./rust-http.js";
11
12
  import { extrairRotasTypeScriptHttp } from "./typescript-http.js";
@@ -762,7 +763,7 @@ function extrairRecursosArquivoLocal(arquivo, codigo) {
762
763
  const nomeBase = path.basename(literal, path.extname(literal));
763
764
  registrarRecursoDrift(recursos, "arquivo", "arquivo_local", nomeBase, arquivo);
764
765
  }
765
- const nomeArquivo = path.basename(arquivo).replace(/\.(?:ts|tsx|js|jsx|mjs|cjs|py|dart|cs|java|go|rs|cpp|cc|cxx|hpp|h)$/i, "");
766
+ const nomeArquivo = path.basename(arquivo).replace(/\.(?:ts|tsx|js|jsx|mjs|cjs|py|dart|lua|cs|java|go|rs|cpp|cc|cxx|hpp|h)$/i, "");
766
767
  const nomeStore = nomeArquivo
767
768
  .replace(/(?:[_.-]?(?:repository|repositories|repo|store|storage|persistencia|persistence))$/i, "")
768
769
  .trim();
@@ -1123,7 +1124,7 @@ async function listarArquivosRecursivos(diretorio, extensoes) {
1123
1124
  }
1124
1125
  const EXTENSOES_ARQUIVOS_RASTREAVEIS_DRIFT = [
1125
1126
  ".ts", ".tsx", ".js", ".jsx", ".mjs", ".cjs",
1126
- ".py", ".dart", ".cs", ".java", ".go", ".rs",
1127
+ ".py", ".dart", ".lua", ".cs", ".java", ".go", ".rs",
1127
1128
  ".cpp", ".cc", ".cxx", ".hpp", ".h",
1128
1129
  ".sql", ".psql", ".ddl", ".prisma",
1129
1130
  ".md", ".mdx", ".txt", ".json", ".jsonl",
@@ -2136,6 +2137,28 @@ async function indexarCpp(diretorios) {
2136
2137
  recursos: [...recursos.values()],
2137
2138
  };
2138
2139
  }
2140
+ async function indexarLua(diretorios) {
2141
+ const simbolos = new Map();
2142
+ const recursos = new Map();
2143
+ for (const diretorio of diretorios) {
2144
+ const arquivos = (await listarArquivosRecursivos(diretorio, [".lua"]))
2145
+ .filter((arquivo) => !/(^|[\\/])(vendor|build|dist|generated|tests?)([\\/]|$)/i.test(arquivo));
2146
+ for (const arquivo of arquivos) {
2147
+ const codigo = await readFile(arquivo, "utf8");
2148
+ const basesSimbolicas = caminhosSimbolicos(diretorio, arquivo);
2149
+ for (const recurso of extrairRecursosPersistenciaCodigoVivo(arquivo, codigo)) {
2150
+ registrarRecursoDrift(recursos, recurso.origem, recurso.tipo, recurso.nome, recurso.arquivo, recurso.simbolo);
2151
+ }
2152
+ for (const simbolo of extrairSimbolosLua(codigo)) {
2153
+ registrarSimboloGenerico(simbolos, "lua", basesSimbolicas, arquivo, simbolo.simbolo);
2154
+ }
2155
+ }
2156
+ }
2157
+ return {
2158
+ simbolos: [...simbolos.values()],
2159
+ recursos: [...recursos.values()],
2160
+ };
2161
+ }
2139
2162
  async function indexarPersistenciaDeclarativa(diretorios) {
2140
2163
  const recursos = new Map();
2141
2164
  const simbolos = new Map();
@@ -2143,7 +2166,7 @@ async function indexarPersistenciaDeclarativa(diretorios) {
2143
2166
  const arquivos = await listarArquivosRecursivos(diretorio, [
2144
2167
  ".sql", ".psql", ".ddl", ".prisma",
2145
2168
  ".ts", ".tsx", ".js", ".jsx", ".mjs", ".cjs",
2146
- ".py", ".dart", ".cs", ".java", ".go", ".rs", ".cpp", ".cc", ".cxx", ".hpp", ".h",
2169
+ ".py", ".dart", ".lua", ".cs", ".java", ".go", ".rs", ".cpp", ".cc", ".cxx", ".hpp", ".h",
2147
2170
  ]);
2148
2171
  for (const arquivo of arquivos) {
2149
2172
  const codigo = await readFile(arquivo, "utf8");
@@ -2350,7 +2373,7 @@ async function indexarPersistenciaDetalhada(diretorios) {
2350
2373
  for (const diretorio of diretorios) {
2351
2374
  const arquivos = await listarArquivosRecursivos(diretorio, [
2352
2375
  ".ts", ".tsx", ".js", ".jsx", ".mjs", ".cjs",
2353
- ".py", ".dart", ".cs", ".java", ".go", ".rs", ".cpp", ".cc", ".cxx", ".hpp", ".h",
2376
+ ".py", ".dart", ".lua", ".cs", ".java", ".go", ".rs", ".cpp", ".cc", ".cxx", ".hpp", ".h",
2354
2377
  ".sql", ".psql", ".ddl", ".prisma",
2355
2378
  ]);
2356
2379
  for (const arquivo of arquivos) {
@@ -2943,6 +2966,7 @@ export async function analisarDriftLegado(contexto, opcoes) {
2943
2966
  const indexJava = await indexarJava(diretoriosCodigoAtivos);
2944
2967
  const indexGo = await indexarGo(diretoriosCodigoAtivos);
2945
2968
  const indexRust = await indexarRust(diretoriosCodigoAtivos);
2969
+ const indexLua = await indexarLua(diretoriosCodigoAtivos);
2946
2970
  const indexPersistencia = await indexarPersistenciaDeclarativa(diretoriosCodigoAtivos);
2947
2971
  const detalhesPersistencia = await indexarPersistenciaDetalhada(diretoriosCodigoAtivos);
2948
2972
  const indexCpp = await indexarCpp(diretoriosCodigoAtivos);
@@ -2955,6 +2979,7 @@ export async function analisarDriftLegado(contexto, opcoes) {
2955
2979
  ...indexJava.simbolos,
2956
2980
  ...indexGo.simbolos,
2957
2981
  ...indexRust.simbolos,
2982
+ ...indexLua.simbolos,
2958
2983
  ...indexCpp.simbolos,
2959
2984
  ...indexPersistencia.simbolos,
2960
2985
  ];
@@ -2966,6 +2991,7 @@ export async function analisarDriftLegado(contexto, opcoes) {
2966
2991
  ...indexJava.simbolos.map((item) => [item.caminho, item]),
2967
2992
  ...indexGo.simbolos.map((item) => [item.caminho, item]),
2968
2993
  ...indexRust.simbolos.map((item) => [item.caminho, item]),
2994
+ ...indexLua.simbolos.map((item) => [item.caminho, item]),
2969
2995
  ...indexCpp.simbolos.map((item) => [item.caminho, item]),
2970
2996
  ]);
2971
2997
  const todosRecursos = [
@@ -2976,6 +3002,7 @@ export async function analisarDriftLegado(contexto, opcoes) {
2976
3002
  ...indexJava.recursos,
2977
3003
  ...indexGo.recursos,
2978
3004
  ...indexRust.recursos,
3005
+ ...indexLua.recursos,
2979
3006
  ...indexCpp.recursos,
2980
3007
  ...indexPersistencia.recursos,
2981
3008
  ];
@@ -3617,7 +3644,7 @@ export async function analisarDriftLegado(contexto, opcoes) {
3617
3644
  const EXTENSOES_BUSCA_IMPACTO = [
3618
3645
  ".sema",
3619
3646
  ".ts", ".tsx", ".js", ".jsx", ".mjs", ".cjs",
3620
- ".py", ".dart", ".cs", ".java", ".go", ".rs", ".cpp", ".cc", ".cxx", ".hpp", ".h",
3647
+ ".py", ".dart", ".lua", ".cs", ".java", ".go", ".rs", ".cpp", ".cc", ".cxx", ".hpp", ".h",
3621
3648
  ".sql", ".psql", ".ddl", ".prisma", ".json",
3622
3649
  ];
3623
3650
  function construirVariantesSemanticas(valor) {