@semacode/cli 1.5.28 → 1.5.29
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 +279 -265
- package/AGENT_CONTEXT_PACK.json +164 -0
- package/README.md +144 -144
- package/SEMA_BRIEF.curto.txt +7 -7
- package/SEMA_BRIEF.md +464 -65
- package/SEMA_BRIEF.micro.txt +6 -6
- package/SEMA_INDEX.json +6723 -669
- 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 +110 -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/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/docs/AGENT_STARTER.md +109 -109
- package/docs/api.md +82 -0
- package/docs/cli.md +175 -175
- package/docs/como-ensinar-a-sema-para-ia.md +155 -155
- package/docs/deploy.md +93 -93
- package/docs/documentacao.md +88 -88
- package/docs/env.md +105 -105
- package/docs/extensao-vscode.md +53 -53
- package/docs/fluxo-pratico-ia-sema.md +187 -187
- package/docs/instalacao-e-primeiro-uso.md +134 -134
- package/docs/integracao-com-ia.md +110 -110
- package/docs/mcp.md +292 -292
- package/docs/pagamento-ponta-a-ponta.md +171 -171
- package/docs/persistencia-vendor-first.md +151 -151
- package/docs/prompt-base-ia-sema.md +111 -111
- package/docs/repositories.md +54 -54
- package/docs/rollback.md +49 -49
- package/docs/seguranca.md +126 -126
- package/docs/sintaxe.md +218 -218
- 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/llms-full.txt +10 -9
- package/llms.txt +8 -7
- 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/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 +1 -1
- package/node_modules/@sema/padroes/package.json +1 -1
- package/package.json +11 -10
- package/dist/php-symbols.d.ts +0 -24
- package/dist/php-symbols.js +0 -375
- package/dist/php-symbols.js.map +0 -1
package/dist/bridge.d.ts
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bridge CLI local -> MCP remoto.
|
|
3
|
+
*
|
|
4
|
+
* Transporte inteligente: a CLI pública lê disco local, o MCP remoto privado
|
|
5
|
+
* governa profiles e pipelines credit-gated. Mesmo endpoint atende CLI local
|
|
6
|
+
* (HTTP autenticado) e chats web (sync inline).
|
|
7
|
+
*
|
|
8
|
+
* Contrato: contratos/sema/mcp_client_bridge.sema
|
|
9
|
+
*/
|
|
10
|
+
export type ModoTransporte = "CLI_LOCAL" | "CHAT_WEB" | "API_DIRETA";
|
|
11
|
+
export type StatusBridge = "NAO_CONFIGURADO" | "AUTENTICADO" | "CREDITOS_INSUFICIENTES" | "OPERACIONAL" | "BLOQUEADO";
|
|
12
|
+
export interface SessaoBridge {
|
|
13
|
+
id: string;
|
|
14
|
+
endpointMcp: string;
|
|
15
|
+
modo: ModoTransporte;
|
|
16
|
+
status: StatusBridge;
|
|
17
|
+
creditosRestantes: number;
|
|
18
|
+
ultimoPing: string;
|
|
19
|
+
}
|
|
20
|
+
export interface ConfigBridgeLocal {
|
|
21
|
+
endpointMcp: string;
|
|
22
|
+
token: string;
|
|
23
|
+
persistir: boolean;
|
|
24
|
+
}
|
|
25
|
+
export interface BridgeEntrada {
|
|
26
|
+
contratos: string[];
|
|
27
|
+
codigoSelecionado?: string[];
|
|
28
|
+
intencao: string;
|
|
29
|
+
endpointMcp: string;
|
|
30
|
+
token: string;
|
|
31
|
+
modo: ModoTransporte;
|
|
32
|
+
}
|
|
33
|
+
export interface BridgeResultado {
|
|
34
|
+
sessao: SessaoBridge;
|
|
35
|
+
diagnosticosRemotos: unknown[];
|
|
36
|
+
perfisAplicaveis: string[];
|
|
37
|
+
proximoPasso: string;
|
|
38
|
+
creditosConsumidos: number;
|
|
39
|
+
erro?: string;
|
|
40
|
+
}
|
|
41
|
+
export interface BridgeConfigResultado {
|
|
42
|
+
configurado: boolean;
|
|
43
|
+
sessaoTeste: SessaoBridge;
|
|
44
|
+
status: StatusBridge;
|
|
45
|
+
erro?: string;
|
|
46
|
+
}
|
|
47
|
+
export declare function operarBridgeCliParaMcp(entrada: BridgeEntrada): Promise<BridgeResultado>;
|
|
48
|
+
export declare function configurarBridgeLocal(config: ConfigBridgeLocal): Promise<BridgeConfigResultado>;
|
|
49
|
+
export declare function obterTokenMcpAmbiente(): {
|
|
50
|
+
token: string;
|
|
51
|
+
endpoint: string;
|
|
52
|
+
};
|
package/dist/bridge.js
ADDED
|
@@ -0,0 +1,318 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bridge CLI local -> MCP remoto.
|
|
3
|
+
*
|
|
4
|
+
* Transporte inteligente: a CLI pública lê disco local, o MCP remoto privado
|
|
5
|
+
* governa profiles e pipelines credit-gated. Mesmo endpoint atende CLI local
|
|
6
|
+
* (HTTP autenticado) e chats web (sync inline).
|
|
7
|
+
*
|
|
8
|
+
* Contrato: contratos/sema/mcp_client_bridge.sema
|
|
9
|
+
*/
|
|
10
|
+
import { sincronizarContratosRemotos, } from "./mcpRemoto.js";
|
|
11
|
+
// ---------------------------------------------------------------------------
|
|
12
|
+
// Constantes
|
|
13
|
+
// ---------------------------------------------------------------------------
|
|
14
|
+
const MCP_TOKEN_ENV = "SEMA_MCP_AUTH_TOKEN";
|
|
15
|
+
const MCP_ENDPOINT_ENV = "SEMA_MCP_ENDPOINT";
|
|
16
|
+
const MCP_ENDPOINT_PADRAO = "https://sema.otimitare.online/mcp";
|
|
17
|
+
const TIMEOUT_MCP_MS = 30_000;
|
|
18
|
+
// ---------------------------------------------------------------------------
|
|
19
|
+
// Helpers
|
|
20
|
+
// ---------------------------------------------------------------------------
|
|
21
|
+
function prefixoSeguroToken(token) {
|
|
22
|
+
return token.slice(0, Math.min(14, token.length));
|
|
23
|
+
}
|
|
24
|
+
function gerarIdSessao() {
|
|
25
|
+
return `sema-bridge-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 8)}`;
|
|
26
|
+
}
|
|
27
|
+
function tokenEhValido(token) {
|
|
28
|
+
return /^sema_mcp_[A-Za-z0-9_-]{16,}$/.test(token) || token.length >= 20;
|
|
29
|
+
}
|
|
30
|
+
function endpointEhValido(endpoint) {
|
|
31
|
+
try {
|
|
32
|
+
const url = new URL(endpoint);
|
|
33
|
+
return url.protocol === "https:";
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
return false;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
// ---------------------------------------------------------------------------
|
|
40
|
+
// Filtro de segredos (reutiliza padrões do mcpRemoto.ts)
|
|
41
|
+
// ---------------------------------------------------------------------------
|
|
42
|
+
const PADROES_CONTEUDO_SENSIVEL_BRIDGE = [
|
|
43
|
+
/\b(?:api[_-]?key|secret|token|password|senha)\s*[:=]\s*["']?[A-Za-z0-9_\-]{16,}/i,
|
|
44
|
+
/\bsk-[A-Za-z0-9_\-]{20,}\b/,
|
|
45
|
+
/\beyJ[A-Za-z0-9_\-]+\.[A-Za-z0-9_\-]+\.[A-Za-z0-9_\-]+\b/,
|
|
46
|
+
];
|
|
47
|
+
const PADROES_CAMINHO_SENSIVEL_BRIDGE = [
|
|
48
|
+
/(^|[\\/])\.env(?:\.|$)/i,
|
|
49
|
+
/(^|[\\/])node_modules([\\/]|$)/i,
|
|
50
|
+
/(^|[\\/])(?:secrets?|credentials?|tokens?)(?:[\\/]|\.|$)/i,
|
|
51
|
+
];
|
|
52
|
+
function conteudoTemSegredo(conteudo) {
|
|
53
|
+
return PADROES_CONTEUDO_SENSIVEL_BRIDGE.some((p) => p.test(conteudo));
|
|
54
|
+
}
|
|
55
|
+
function caminhoEhSensivel(caminho) {
|
|
56
|
+
return PADROES_CAMINHO_SENSIVEL_BRIDGE.some((p) => p.test(caminho));
|
|
57
|
+
}
|
|
58
|
+
// ---------------------------------------------------------------------------
|
|
59
|
+
// Operar bridge CLI -> MCP
|
|
60
|
+
// ---------------------------------------------------------------------------
|
|
61
|
+
export async function operarBridgeCliParaMcp(entrada) {
|
|
62
|
+
const inicio = Date.now();
|
|
63
|
+
const id = gerarIdSessao();
|
|
64
|
+
// Validações básicas
|
|
65
|
+
if (!entrada.contratos || entrada.contratos.length === 0) {
|
|
66
|
+
return {
|
|
67
|
+
sessao: criarSessaoVazia(id, entrada),
|
|
68
|
+
diagnosticosRemotos: [],
|
|
69
|
+
perfisAplicaveis: [],
|
|
70
|
+
proximoPasso: "fornecer_contratos",
|
|
71
|
+
creditosConsumidos: 0,
|
|
72
|
+
erro: "Nenhum contrato informado.",
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
if (!endpointEhValido(entrada.endpointMcp)) {
|
|
76
|
+
return {
|
|
77
|
+
sessao: criarSessaoVazia(id, entrada),
|
|
78
|
+
diagnosticosRemotos: [],
|
|
79
|
+
perfisAplicaveis: [],
|
|
80
|
+
proximoPasso: "corrigir_endpoint",
|
|
81
|
+
creditosConsumidos: 0,
|
|
82
|
+
erro: "Endpoint MCP inválido. Use HTTPS.",
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
if (!tokenEhValido(entrada.token)) {
|
|
86
|
+
return {
|
|
87
|
+
sessao: criarSessaoVazia(id, entrada),
|
|
88
|
+
diagnosticosRemotos: [],
|
|
89
|
+
perfisAplicaveis: [],
|
|
90
|
+
proximoPasso: "corrigir_token",
|
|
91
|
+
creditosConsumidos: 0,
|
|
92
|
+
erro: "Token MCP inválido.",
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
// Filtrar segredos do código selecionado
|
|
96
|
+
const codigoFiltrado = (entrada.codigoSelecionado ?? []).filter((c) => {
|
|
97
|
+
if (caminhoEhSensivel(c))
|
|
98
|
+
return false;
|
|
99
|
+
return true;
|
|
100
|
+
});
|
|
101
|
+
if (codigoFiltrado.length < (entrada.codigoSelecionado ?? []).length) {
|
|
102
|
+
return {
|
|
103
|
+
sessao: criarSessaoVazia(id, entrada),
|
|
104
|
+
diagnosticosRemotos: [],
|
|
105
|
+
perfisAplicaveis: [],
|
|
106
|
+
proximoPasso: "remover_segredos",
|
|
107
|
+
creditosConsumidos: 0,
|
|
108
|
+
erro: "segredo_detectado: Snapshot contém arquivo sensível. Remova antes de enviar.",
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
// Construir snapshot para o MCP remoto
|
|
112
|
+
const snapshot = {
|
|
113
|
+
contratos: entrada.contratos.map((c) => ({ caminho: c })),
|
|
114
|
+
arquivosCodigo: codigoFiltrado.map((c) => ({ caminho: c })),
|
|
115
|
+
};
|
|
116
|
+
// Validar snapshot localmente antes de enviar
|
|
117
|
+
const validacaoLocal = sincronizarContratosRemotos(snapshot);
|
|
118
|
+
if (validacaoLocal.recusas.length > 0) {
|
|
119
|
+
return {
|
|
120
|
+
sessao: criarSessaoVazia(id, entrada),
|
|
121
|
+
diagnosticosRemotos: [],
|
|
122
|
+
perfisAplicaveis: [],
|
|
123
|
+
proximoPasso: "remover_segredos",
|
|
124
|
+
creditosConsumidos: 0,
|
|
125
|
+
erro: `segredo_detectado: ${validacaoLocal.recusas.join(", ")}`,
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
// Enviar ao MCP remoto
|
|
129
|
+
try {
|
|
130
|
+
const resposta = await fetch(entrada.endpointMcp, {
|
|
131
|
+
method: "POST",
|
|
132
|
+
headers: {
|
|
133
|
+
"Content-Type": "application/json",
|
|
134
|
+
Authorization: `Bearer ${entrada.token}`,
|
|
135
|
+
"x-sema-bridge-intent": entrada.intencao,
|
|
136
|
+
"x-sema-bridge-mode": entrada.modo,
|
|
137
|
+
},
|
|
138
|
+
body: JSON.stringify({
|
|
139
|
+
metodo: "tools/call",
|
|
140
|
+
params: {
|
|
141
|
+
name: "sema_contratos_sincronizar",
|
|
142
|
+
arguments: {
|
|
143
|
+
projeto_id: `bridge-${id}`,
|
|
144
|
+
nome_projeto: "bridge-cli-local",
|
|
145
|
+
contratos: entrada.contratos.map((c) => ({ caminho: c, acao: "salvar" })),
|
|
146
|
+
arquivos_codigo: codigoFiltrado.map((c) => ({ caminho: c, acao: "salvar" })),
|
|
147
|
+
validar: true,
|
|
148
|
+
},
|
|
149
|
+
},
|
|
150
|
+
}),
|
|
151
|
+
signal: AbortSignal.timeout(TIMEOUT_MCP_MS),
|
|
152
|
+
});
|
|
153
|
+
if (!resposta.ok) {
|
|
154
|
+
if (resposta.status === 401 || resposta.status === 403) {
|
|
155
|
+
return {
|
|
156
|
+
sessao: criarSessao(id, entrada, "BLOQUEADO"),
|
|
157
|
+
diagnosticosRemotos: [],
|
|
158
|
+
perfisAplicaveis: [],
|
|
159
|
+
proximoPasso: "verificar_token",
|
|
160
|
+
creditosConsumidos: 0,
|
|
161
|
+
erro: "token_invalido: Token MCP inválido ou expirado.",
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
if (resposta.status === 402) {
|
|
165
|
+
return {
|
|
166
|
+
sessao: criarSessao(id, entrada, "CREDITOS_INSUFICIENTES"),
|
|
167
|
+
diagnosticosRemotos: [],
|
|
168
|
+
perfisAplicaveis: [],
|
|
169
|
+
proximoPasso: "recarregar_creditos",
|
|
170
|
+
creditosConsumidos: 0,
|
|
171
|
+
erro: "sem_creditos: Créditos Sema insuficientes.",
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
const payload = (await resposta.json());
|
|
176
|
+
return {
|
|
177
|
+
sessao: criarSessao(id, entrada, "OPERACIONAL"),
|
|
178
|
+
diagnosticosRemotos: payload.validacoes ?? [],
|
|
179
|
+
perfisAplicaveis: extrairPerfis(payload),
|
|
180
|
+
proximoPasso: "pode_chamar_profile_ou_ir",
|
|
181
|
+
creditosConsumidos: 1,
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
catch (erro) {
|
|
185
|
+
const mensagem = erro instanceof Error ? erro.message : String(erro);
|
|
186
|
+
return {
|
|
187
|
+
sessao: criarSessao(id, entrada, "BLOQUEADO"),
|
|
188
|
+
diagnosticosRemotos: [],
|
|
189
|
+
perfisAplicaveis: [],
|
|
190
|
+
proximoPasso: "verificar_conectividade",
|
|
191
|
+
creditosConsumidos: 0,
|
|
192
|
+
erro: `endpoint_indisponivel: ${mensagem}`,
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
// ---------------------------------------------------------------------------
|
|
197
|
+
// Configurar bridge local
|
|
198
|
+
// ---------------------------------------------------------------------------
|
|
199
|
+
export async function configurarBridgeLocal(config) {
|
|
200
|
+
if (!endpointEhValido(config.endpointMcp)) {
|
|
201
|
+
return {
|
|
202
|
+
configurado: false,
|
|
203
|
+
sessaoTeste: criarSessaoConfig("NAO_CONFIGURADO"),
|
|
204
|
+
status: "NAO_CONFIGURADO",
|
|
205
|
+
erro: "conexao_recusada: Endpoint MCP inválido.",
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
if (!tokenEhValido(config.token)) {
|
|
209
|
+
return {
|
|
210
|
+
configurado: false,
|
|
211
|
+
sessaoTeste: criarSessaoConfig("NAO_CONFIGURADO"),
|
|
212
|
+
status: "NAO_CONFIGURADO",
|
|
213
|
+
erro: "token_invalido: Token rejeitado.",
|
|
214
|
+
};
|
|
215
|
+
}
|
|
216
|
+
// Testar conexão com ping ao MCP
|
|
217
|
+
try {
|
|
218
|
+
const resposta = await fetch(`${config.endpointMcp.replace(/\/mcp$/, "")}/healthz`, {
|
|
219
|
+
headers: { Authorization: `Bearer ${config.token}` },
|
|
220
|
+
signal: AbortSignal.timeout(10_000),
|
|
221
|
+
});
|
|
222
|
+
if (!resposta.ok) {
|
|
223
|
+
return {
|
|
224
|
+
configurado: false,
|
|
225
|
+
sessaoTeste: criarSessaoConfig("BLOQUEADO"),
|
|
226
|
+
status: "BLOQUEADO",
|
|
227
|
+
erro: `token_invalido: MCP respondeu ${resposta.status}.`,
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
// Persistir config se solicitado
|
|
231
|
+
if (config.persistir && process.env.SEMA_MCP_AUTH_TOKEN === undefined) {
|
|
232
|
+
// Apenas logging — a persistência real usa `sema mcp-instalar-chave`
|
|
233
|
+
console.error(`[sema-bridge] Token prefixo ${prefixoSeguroToken(config.token)} validado. ` +
|
|
234
|
+
`Use 'sema mcp-instalar-chave --stdin' para persistir.`);
|
|
235
|
+
}
|
|
236
|
+
return {
|
|
237
|
+
configurado: true,
|
|
238
|
+
sessaoTeste: criarSessaoConfig("OPERACIONAL"),
|
|
239
|
+
status: "OPERACIONAL",
|
|
240
|
+
};
|
|
241
|
+
}
|
|
242
|
+
catch (erro) {
|
|
243
|
+
const mensagem = erro instanceof Error ? erro.message : String(erro);
|
|
244
|
+
return {
|
|
245
|
+
configurado: false,
|
|
246
|
+
sessaoTeste: criarSessaoConfig("BLOQUEADO"),
|
|
247
|
+
status: "BLOQUEADO",
|
|
248
|
+
erro: `conexao_recusada: ${mensagem}`,
|
|
249
|
+
};
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
// ---------------------------------------------------------------------------
|
|
253
|
+
// Helpers internos
|
|
254
|
+
// ---------------------------------------------------------------------------
|
|
255
|
+
function criarSessaoVazia(id, entrada) {
|
|
256
|
+
return {
|
|
257
|
+
id,
|
|
258
|
+
endpointMcp: entrada.endpointMcp,
|
|
259
|
+
modo: entrada.modo,
|
|
260
|
+
status: "NAO_CONFIGURADO",
|
|
261
|
+
creditosRestantes: 0,
|
|
262
|
+
ultimoPing: new Date().toISOString(),
|
|
263
|
+
};
|
|
264
|
+
}
|
|
265
|
+
function criarSessao(id, entrada, status) {
|
|
266
|
+
return {
|
|
267
|
+
id,
|
|
268
|
+
endpointMcp: entrada.endpointMcp,
|
|
269
|
+
modo: entrada.modo,
|
|
270
|
+
status,
|
|
271
|
+
creditosRestantes: status === "OPERACIONAL" ? 99 : 0,
|
|
272
|
+
ultimoPing: new Date().toISOString(),
|
|
273
|
+
};
|
|
274
|
+
}
|
|
275
|
+
function criarSessaoConfig(status) {
|
|
276
|
+
return {
|
|
277
|
+
id: gerarIdSessao(),
|
|
278
|
+
endpointMcp: MCP_ENDPOINT_PADRAO,
|
|
279
|
+
modo: "CLI_LOCAL",
|
|
280
|
+
status,
|
|
281
|
+
creditosRestantes: 0,
|
|
282
|
+
ultimoPing: new Date().toISOString(),
|
|
283
|
+
};
|
|
284
|
+
}
|
|
285
|
+
function extrairPerfis(payload) {
|
|
286
|
+
const perfis = [];
|
|
287
|
+
const validacoes = payload.validacoes;
|
|
288
|
+
if (validacoes) {
|
|
289
|
+
for (const v of validacoes) {
|
|
290
|
+
const saida = v.saida;
|
|
291
|
+
if (saida) {
|
|
292
|
+
try {
|
|
293
|
+
const parsed = JSON.parse(saida);
|
|
294
|
+
if (parsed.resultados) {
|
|
295
|
+
for (const r of parsed.resultados) {
|
|
296
|
+
if (r.modulo)
|
|
297
|
+
perfis.push(r.modulo);
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
catch {
|
|
302
|
+
// ignora parse
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
return [...new Set(perfis)];
|
|
308
|
+
}
|
|
309
|
+
// ---------------------------------------------------------------------------
|
|
310
|
+
// Obter token do ambiente
|
|
311
|
+
// ---------------------------------------------------------------------------
|
|
312
|
+
export function obterTokenMcpAmbiente() {
|
|
313
|
+
return {
|
|
314
|
+
token: process.env[MCP_TOKEN_ENV] ?? "",
|
|
315
|
+
endpoint: process.env[MCP_ENDPOINT_ENV] ?? MCP_ENDPOINT_PADRAO,
|
|
316
|
+
};
|
|
317
|
+
}
|
|
318
|
+
//# sourceMappingURL=bridge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bridge.js","sourceRoot":"","sources":["../src/bridge.ts"],"names":[],"mappings":"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"}
|
|
@@ -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,110 @@
|
|
|
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
|
+
// Registro
|
|
104
|
+
// ---------------------------------------------------------------------------
|
|
105
|
+
export const REGISTRO_COMANDOS = {
|
|
106
|
+
"mcp-client": comandoMcpClient,
|
|
107
|
+
"bridge-config": comandoBridgeConfig,
|
|
108
|
+
"contexto-chat": comandoContextoChat,
|
|
109
|
+
};
|
|
110
|
+
//# 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>;
|