@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.
- package/README.md +144 -144
- package/dist/bridge.d.ts +52 -0
- package/dist/bridge.js +318 -0
- package/dist/bridge.js.map +1 -0
- package/dist/comandos.d.ts +11 -0
- package/dist/comandos.js +146 -0
- package/dist/comandos.js.map +1 -0
- package/dist/contexto.d.ts +34 -0
- package/dist/contexto.js +197 -0
- package/dist/contexto.js.map +1 -0
- package/dist/drift.d.ts +1 -1
- package/dist/drift.js +32 -5
- package/dist/drift.js.map +1 -1
- package/dist/guard.d.ts +35 -0
- package/dist/guard.js +164 -0
- package/dist/guard.js.map +1 -0
- package/dist/index.js +391 -64
- package/dist/index.js.map +1 -1
- package/dist/lua-symbols.d.ts +0 -6
- package/dist/lua-symbols.js +11 -78
- 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/exemplos/.prepack-generated +1 -0
- package/exemplos/author_obra_comum.sema +294 -294
- package/exemplos/author_tema_sensivel.sema +264 -264
- package/exemplos/profile_game.sema +114 -114
- package/exemplos/profile_legal.sema +105 -105
- package/exemplos/profile_ops.sema +110 -110
- package/exemplos/profile_research.sema +104 -104
- package/exemplos/profile_software.sema +123 -123
- package/exemplos/profile_workflow_n8n.sema +99 -99
- package/node_modules/@sema/gerador-css/package.json +14 -7
- package/node_modules/@sema/gerador-css/src/index.ts +605 -0
- package/node_modules/@sema/gerador-css/tsconfig.json +13 -0
- package/node_modules/@sema/gerador-css/tsconfig.tsbuildinfo +1 -0
- package/node_modules/@sema/gerador-dart/package.json +14 -7
- package/node_modules/@sema/gerador-dart/src/index.ts +52 -0
- package/node_modules/@sema/gerador-dart/tsconfig.json +13 -0
- package/node_modules/@sema/gerador-dart/tsconfig.tsbuildinfo +1 -0
- package/node_modules/@sema/gerador-html/package.json +14 -7
- package/node_modules/@sema/gerador-html/src/index.ts +185 -0
- package/node_modules/@sema/gerador-html/tsconfig.json +13 -0
- package/node_modules/@sema/gerador-html/tsconfig.tsbuildinfo +1 -0
- package/node_modules/@sema/gerador-javascript/package.json +14 -7
- package/node_modules/@sema/gerador-javascript/src/index.ts +461 -0
- package/node_modules/@sema/gerador-javascript/tsconfig.json +13 -0
- package/node_modules/@sema/gerador-javascript/tsconfig.tsbuildinfo +1 -0
- package/node_modules/@sema/gerador-lua/package.json +14 -7
- package/node_modules/@sema/gerador-lua/src/index.ts +359 -0
- package/node_modules/@sema/gerador-lua/tsconfig.json +13 -0
- package/node_modules/@sema/gerador-lua/tsconfig.tsbuildinfo +1 -0
- package/node_modules/@sema/gerador-python/package.json +14 -7
- package/node_modules/@sema/gerador-python/src/index.ts +850 -0
- package/node_modules/@sema/gerador-python/tsconfig.json +13 -0
- package/node_modules/@sema/gerador-python/tsconfig.tsbuildinfo +1 -0
- package/node_modules/@sema/gerador-typescript/package.json +14 -7
- package/node_modules/@sema/gerador-typescript/src/index.ts +876 -0
- package/node_modules/@sema/gerador-typescript/tsconfig.json +13 -0
- package/node_modules/@sema/gerador-typescript/tsconfig.tsbuildinfo +1 -0
- package/node_modules/@sema/nucleo/dist/ast/tipos.d.ts +1 -1
- package/node_modules/@sema/nucleo/dist/index.d.ts +17 -0
- package/node_modules/@sema/nucleo/dist/index.js +28 -0
- package/node_modules/@sema/nucleo/dist/index.js.map +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 +10 -7
- package/node_modules/@sema/nucleo/src/ast/tipos.ts +207 -0
- package/node_modules/@sema/nucleo/src/diagnosticos/index.ts +43 -0
- package/node_modules/@sema/nucleo/src/formatador/index.ts +530 -0
- package/node_modules/@sema/nucleo/src/index.ts +183 -0
- package/node_modules/@sema/nucleo/src/ir/conversor.ts +1037 -0
- package/node_modules/@sema/nucleo/src/ir/modelos.ts +403 -0
- package/node_modules/@sema/nucleo/src/lexer/lexer.ts +166 -0
- package/node_modules/@sema/nucleo/src/lexer/tokens.ts +79 -0
- package/node_modules/@sema/nucleo/src/parser/gramatica.ebnf +41 -0
- package/node_modules/@sema/nucleo/src/parser/parser.ts +936 -0
- package/node_modules/@sema/nucleo/src/persistencia/contratos.ts +379 -0
- package/node_modules/@sema/nucleo/src/semantico/analisador.ts +3126 -0
- package/node_modules/@sema/nucleo/src/semantico/estruturas.ts +665 -0
- package/node_modules/@sema/nucleo/src/semantico/seguranca.ts +362 -0
- package/node_modules/@sema/nucleo/src/util/arquivos.ts +28 -0
- package/node_modules/@sema/nucleo/tsconfig.json +9 -0
- package/node_modules/@sema/nucleo/tsconfig.tsbuildinfo +1 -0
- package/node_modules/@sema/padroes/package.json +10 -7
- package/node_modules/@sema/padroes/src/index.ts +382 -0
- package/node_modules/@sema/padroes/tsconfig.json +9 -0
- package/node_modules/@sema/padroes/tsconfig.tsbuildinfo +1 -0
- package/package.json +74 -74
- package/AGENTS.md +0 -280
- package/LICENSE +0 -22
- package/SEMA_BRIEF.curto.txt +0 -11
- package/SEMA_BRIEF.md +0 -112
- package/SEMA_BRIEF.micro.txt +0 -9
- package/SEMA_INDEX.json +0 -1534
- package/dist/php-symbols.d.ts +0 -24
- package/dist/php-symbols.js +0 -375
- package/dist/php-symbols.js.map +0 -1
- package/docs/AGENT_STARTER.md +0 -109
- package/docs/cli.md +0 -175
- package/docs/como-ensinar-a-sema-para-ia.md +0 -155
- package/docs/deploy.md +0 -93
- package/docs/documentacao.md +0 -88
- package/docs/env.md +0 -105
- package/docs/extensao-vscode.md +0 -53
- package/docs/fluxo-pratico-ia-sema.md +0 -187
- package/docs/instalacao-e-primeiro-uso.md +0 -134
- package/docs/integracao-com-ia.md +0 -110
- package/docs/mcp.md +0 -292
- package/docs/pagamento-ponta-a-ponta.md +0 -171
- package/docs/persistencia-vendor-first.md +0 -151
- package/docs/prompt-base-ia-sema.md +0 -111
- package/docs/repositories.md +0 -54
- package/docs/rollback.md +0 -49
- package/docs/seguranca.md +0 -126
- package/docs/sintaxe.md +0 -218
- package/llms-full.txt +0 -34
- 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>;
|
package/dist/comandos.js
ADDED
|
@@ -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>;
|
package/dist/contexto.js
ADDED
|
@@ -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) {
|