@semacode/cli 3.0.0 → 3.8.0
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/dist/agentEntryPoints.js +78 -64
- package/dist/cliGrammar.js +5 -5
- package/dist/cliHelpTexto.js +6 -6
- package/dist/docs.part01.d.ts +4 -1
- package/dist/docs.part01.js +8 -0
- package/dist/docs.part02.js +9 -1
- package/dist/drift.part01.d.ts +8 -2
- package/dist/drift.part04.d.ts +14 -2
- package/dist/drift.part04.js +35 -2
- package/dist/drift.part05.d.ts +6 -0
- package/dist/drift.part05.js +68 -0
- package/dist/drift.part06.js +60 -3
- package/dist/drift.part09.d.ts +2 -2
- package/dist/drift.part09.js +13 -3
- package/dist/drift.part11.js +24 -3
- package/dist/drift.part14.js +4 -0
- package/dist/exemplosOficiais.d.ts +2 -1
- package/dist/exemplosOficiais.js +9 -3
- package/dist/geracaoCore.d.ts +1 -0
- package/dist/geracaoCore.js +5 -0
- package/dist/importador.part01.d.ts +1 -1
- package/dist/importador.part04.d.ts +5 -1
- package/dist/importador.part04.js +40 -2
- package/dist/importador.part06.d.ts +2 -0
- package/dist/importador.part06.js +97 -1
- package/dist/importador.part09.js +17 -2
- package/dist/index.part04.js +13 -6
- package/dist/index.part07.d.ts +8 -2
- package/dist/index.part07.js +146 -4
- package/dist/index.part08.js +3 -3
- package/dist/initCommand.d.ts +1 -0
- package/dist/initCommand.js +15 -3
- package/dist/initTemplatesBase.js +78 -78
- package/dist/projetoConfig.js +5 -0
- package/dist/projetoLegado.js +40 -0
- package/dist/tipos.d.ts +1 -1
- package/dist/typescript-http-body.js +9 -0
- package/dist/typescript-http-modelos.d.ts +1 -1
- package/dist/typescript-http-rotas.d.ts +1 -0
- package/dist/typescript-http-rotas.js +198 -0
- package/dist/typescript-http-semantica.d.ts +3 -3
- package/dist/typescript-http-semantica.js +65 -7
- package/dist/typescript-http.d.ts +1 -1
- package/dist/typescript-http.js +1 -1
- package/dist/verificacaoCache.d.ts +25 -0
- package/dist/verificacaoCache.js +80 -0
- package/docs/syntax.md +14 -0
- package/exemplos/express_crud.sema +139 -0
- package/exemplos/fastify_crud.sema +146 -0
- package/exemplos/koa_crud.sema +95 -0
- package/node_modules/@sema/nucleo/dist/ir/conversor.part01.js +37 -38
- package/node_modules/@sema/nucleo/dist/ir/modelos.d.ts +1 -0
- package/node_modules/@sema/nucleo/dist/semantico/analisador.part01.d.ts +7 -0
- package/node_modules/@sema/nucleo/dist/semantico/analisador.part01.js +33 -10
- package/package.json +1 -1
package/dist/index.part04.js
CHANGED
|
@@ -5,7 +5,7 @@ import path from "node:path";
|
|
|
5
5
|
import { formatarDiagnosticos, gerarRespostaValidacao, temErros, } from "@sema/nucleo";
|
|
6
6
|
import { carregarProjeto, } from "./projeto.js";
|
|
7
7
|
import { analisarDriftLegado, } from "./drift.js";
|
|
8
|
-
import { resolverDocumentacaoObrigatoria, verificarDocumentacaoMudanca, } from "./docs.js";
|
|
8
|
+
import { compactarDocumentoObrigatorio, resolverDocumentacaoObrigatoria, verificarDocumentacaoMudanca, } from "./docs.js";
|
|
9
9
|
import { LIMITE_AVISO_LINHAS_CODIGO_GOVERNADO, LIMITE_AVISO_LINHAS_CONTRATO_SEMA, LIMITE_BLOQUEIO_LINHAS_CODIGO_GOVERNADO, LIMITE_BLOQUEIO_LINHAS_CONTRATO_SEMA, } from "./driftOrcamento.js";
|
|
10
10
|
import { ARQUIVO_AGENT_CONTEXT_PACK, ARQUIVO_DOC_AGENTES_CAPACIDADE, ARQUIVO_SEMA_BOOT, ARQUIVO_SEMA_SMALL_MODEL, } from './agentContextTipos.js';
|
|
11
11
|
import { criarGuiaCapacidadeIa, LIMITE_CARACTERES_PAYLOAD_INLINE } from './agentContextPack.js';
|
|
@@ -319,7 +319,7 @@ Antes de escolher arquivo de código, leia \`${ARQUIVO_SEMA_BOOT}\` e \`agent-co
|
|
|
319
319
|
|
|
320
320
|
- Timeout local do agente não é falha do Sema.
|
|
321
321
|
- Se uma chamada Sema estourar, aumente o timeout e tente de novo.
|
|
322
|
-
- Se o projeto inteiro for lento, escopar para \`sema resumo "${contexto.arquivo}" --micro --para mudanca --drift none\`.
|
|
322
|
+
- Se o projeto inteiro for lento, escopar para \`sema resumo "${contexto.arquivo}" --micro --para mudanca --drift none\`.
|
|
323
323
|
- Se o ambiente impedir continuar, pare bloqueado e não avance com código sem Sema.
|
|
324
324
|
|
|
325
325
|
## Fechamento
|
|
@@ -327,13 +327,13 @@ Antes de escolher arquivo de código, leia \`${ARQUIVO_SEMA_BOOT}\` e \`agent-co
|
|
|
327
327
|
1. Editar o arquivo \`.sema\`.
|
|
328
328
|
2. Rodar \`sema formatar "${contexto.arquivo}"\`.
|
|
329
329
|
3. Rodar \`sema validar "${contexto.arquivo}" --json\`.
|
|
330
|
-
4. Rodar \`sema drift "${contexto.arquivo}" --cache fresh --json\`.
|
|
330
|
+
4. Rodar \`sema drift "${contexto.arquivo}" --cache fresh --json\`.
|
|
331
331
|
5. Fechar com \`sema verificar <arquivo-ou-pasta> --json --saida ./.tmp/verificacao-ia\`.
|
|
332
332
|
|
|
333
333
|
## Textos base para onboarding do agente
|
|
334
334
|
|
|
335
335
|
- \`sema starter-ia\`
|
|
336
|
-
- \`sema resumo "${contexto.arquivo}" --micro --para onboarding --drift none\`
|
|
336
|
+
- \`sema resumo "${contexto.arquivo}" --micro --para onboarding --drift none\`
|
|
337
337
|
- \`sema prompt-curto "${contexto.arquivo}" --para mudanca\`
|
|
338
338
|
- \`sema prompt-ia\`
|
|
339
339
|
`;
|
|
@@ -372,7 +372,7 @@ export function resolverEntradaDocs(posicionais, args) {
|
|
|
372
372
|
export async function comandoDocsImpacto(posicionais, args, emJson) {
|
|
373
373
|
const { intencao, arquivosAlvo } = resolverEntradaDocs(posicionais, args);
|
|
374
374
|
if (!intencao.trim()) {
|
|
375
|
-
console.error("Uso: sema docs-impacto --intencao <acao> [--arquivo <caminho>] [--criar-ausentes] [--json]");
|
|
375
|
+
console.error("Uso: sema docs-impacto --intencao <acao> [--arquivo <caminho>] [--criar-ausentes] [--completo] [--json]");
|
|
376
376
|
return 1;
|
|
377
377
|
}
|
|
378
378
|
const resultado = await resolverDocumentacaoObrigatoria({
|
|
@@ -381,9 +381,16 @@ export async function comandoDocsImpacto(posicionais, args, emJson) {
|
|
|
381
381
|
arquivosAlvo,
|
|
382
382
|
criarAusentes: possuiFlag(args, "--criar-ausentes"),
|
|
383
383
|
});
|
|
384
|
+
const completo = possuiFlag(args, "--completo");
|
|
384
385
|
const payload = {
|
|
385
386
|
comando: "docs-impacto",
|
|
386
|
-
...resultado
|
|
387
|
+
...(completo ? resultado : {
|
|
388
|
+
...resultado,
|
|
389
|
+
leituraObrigatoria: resultado.leituraObrigatoria.map(compactarDocumentoObrigatorio),
|
|
390
|
+
docsAusentes: resultado.docsAusentes.map(compactarDocumentoObrigatorio),
|
|
391
|
+
docsCriadas: resultado.docsCriadas.map(compactarDocumentoObrigatorio),
|
|
392
|
+
modoDocumentos: "compacto",
|
|
393
|
+
}),
|
|
387
394
|
};
|
|
388
395
|
if (emJson) {
|
|
389
396
|
console.log(JSON.stringify(payload, null, 2));
|
package/dist/index.part07.d.ts
CHANGED
|
@@ -1,9 +1,15 @@
|
|
|
1
1
|
import { type AlvoGeracao, type FrameworkGeracao } from "@sema/padroes";
|
|
2
2
|
import type { EstruturaSaida } from "./tipos.js";
|
|
3
|
+
export interface OpcoesVerificar {
|
|
4
|
+
alvo?: string;
|
|
5
|
+
semCache?: boolean;
|
|
6
|
+
}
|
|
7
|
+
export declare function alvosSuportadosPelaStack(fontesLegado: string[] | undefined): AlvoGeracao[] | undefined;
|
|
8
|
+
export declare function avisoEscopoStackVerificacao(fontesLegado: string[] | undefined, alvosEfetivos: AlvoGeracao[]): string | undefined;
|
|
3
9
|
import { type ResumoModuloVerificacao } from './geracaoCore.js';
|
|
4
10
|
export declare function comandoPromptCurto(entrada: string | undefined, args: string[], emJson: boolean): Promise<number>;
|
|
5
11
|
export declare function comandoContextoIa(arquivo: string, pastaSaida: string | undefined, emJson: boolean): Promise<number>;
|
|
6
12
|
export declare function comandoTestar(arquivo: string, alvo: AlvoGeracao, saida: string, estrutura: EstruturaSaida, framework: FrameworkGeracao): Promise<number>;
|
|
7
13
|
export declare function imprimirResumoVerificacao(resumos: ResumoModuloVerificacao[]): void;
|
|
8
|
-
export declare function comandoVerificar(entrada: string | undefined, baseSaida: string, cwd?: string): Promise<number>;
|
|
9
|
-
export declare function comandoVerificarJson(entrada: string | undefined, baseSaida: string, cwd?: string): Promise<number>;
|
|
14
|
+
export declare function comandoVerificar(entrada: string | undefined, baseSaida: string, cwd?: string, opcoes?: OpcoesVerificar): Promise<number>;
|
|
15
|
+
export declare function comandoVerificarJson(entrada: string | undefined, baseSaida: string, cwd?: string, opcoes?: OpcoesVerificar): Promise<number>;
|
package/dist/index.part07.js
CHANGED
|
@@ -2,8 +2,55 @@
|
|
|
2
2
|
// Descrição: preserva modos explícitos nas superfícies auxiliares de contexto.
|
|
3
3
|
import { readFile } from "node:fs/promises";
|
|
4
4
|
import path from "node:path";
|
|
5
|
+
import pacoteCli from "../package.json" with { type: "json" };
|
|
5
6
|
import { compilarCodigo, formatarDiagnosticos, lerArquivoTexto, temErros, } from "@sema/nucleo";
|
|
6
7
|
import { carregarProjeto, resolverAlvosVerificacao, } from "./projeto.js";
|
|
8
|
+
import { SCHEMA_CACHE_VERIFICACAO, calcularChaveVerificacao, carregarCacheVerificacao, gravarCacheVerificacao, } from "./verificacaoCache.js";
|
|
9
|
+
const FONTES_POR_ALVO_SUPORTADO = {
|
|
10
|
+
typescript: ["typescript", "javascript"],
|
|
11
|
+
javascript: ["typescript", "javascript"],
|
|
12
|
+
nestjs: ["typescript", "javascript"],
|
|
13
|
+
express: ["typescript", "javascript"],
|
|
14
|
+
fastify: ["typescript", "javascript"],
|
|
15
|
+
nextjs: ["typescript", "javascript"],
|
|
16
|
+
"nextjs-consumer": ["typescript", "javascript"],
|
|
17
|
+
"react-vite-consumer": ["typescript", "javascript"],
|
|
18
|
+
"angular-consumer": ["typescript", "javascript"],
|
|
19
|
+
firebase: ["typescript", "javascript"],
|
|
20
|
+
python: ["python"],
|
|
21
|
+
fastapi: ["python"],
|
|
22
|
+
flask: ["python"],
|
|
23
|
+
dart: ["dart"],
|
|
24
|
+
"flutter-consumer": ["dart"],
|
|
25
|
+
dotnet: ["dotnet"],
|
|
26
|
+
java: ["javascript"],
|
|
27
|
+
lua: ["lua"],
|
|
28
|
+
php: ["php"],
|
|
29
|
+
cpp: ["cpp"],
|
|
30
|
+
};
|
|
31
|
+
export function alvosSuportadosPelaStack(fontesLegado) {
|
|
32
|
+
if (!fontesLegado?.length) {
|
|
33
|
+
return undefined;
|
|
34
|
+
}
|
|
35
|
+
const suportados = new Set();
|
|
36
|
+
for (const fonte of fontesLegado) {
|
|
37
|
+
for (const alvo of FONTES_POR_ALVO_SUPORTADO[fonte] ?? []) {
|
|
38
|
+
suportados.add(alvo);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
return suportados.size > 0 ? [...suportados] : undefined;
|
|
42
|
+
}
|
|
43
|
+
export function avisoEscopoStackVerificacao(fontesLegado, alvosEfetivos) {
|
|
44
|
+
const suportados = alvosSuportadosPelaStack(fontesLegado);
|
|
45
|
+
if (!suportados) {
|
|
46
|
+
return undefined;
|
|
47
|
+
}
|
|
48
|
+
const foraDaStack = alvosEfetivos.filter((alvo) => alvo !== "html" && alvo !== "css" && !suportados.includes(alvo));
|
|
49
|
+
if (foraDaStack.length === 0) {
|
|
50
|
+
return undefined;
|
|
51
|
+
}
|
|
52
|
+
return `Alvos fora da stack detectada (${(fontesLegado ?? []).join(", ")}): ${foraDaStack.join(", ")}. Considere reduzir "alvos" no sema.config.json, remover "fontesLegado" auto-declaradas ou usar --alvo unico.`;
|
|
53
|
+
}
|
|
7
54
|
import { escreverArquivos, formatarAvisoArtefatosGeradosAcimaDoLimite, } from './fsGovernado.js';
|
|
8
55
|
import { obterOpcao } from './cliArgs.js';
|
|
9
56
|
import { avaliarDependenciasVerificacao, imprimirFalhaDependenciasVerificacao } from './doctorCommand.js';
|
|
@@ -154,7 +201,7 @@ export function imprimirResumoVerificacao(resumos) {
|
|
|
154
201
|
}
|
|
155
202
|
console.log(`Totais: modulos=${resumos.length} alvos=${totalAlvos} arquivos=${totalArquivos} testes=${totalTestes}`);
|
|
156
203
|
}
|
|
157
|
-
export async function comandoVerificar(entrada, baseSaida, cwd = process.cwd()) {
|
|
204
|
+
export async function comandoVerificar(entrada, baseSaida, cwd = process.cwd(), opcoes = {}) {
|
|
158
205
|
const contextoProjeto = await carregarProjeto(entrada, cwd);
|
|
159
206
|
const modulos = contextoProjeto.modulosSelecionados;
|
|
160
207
|
const diagnosticos = modulos.flatMap((item) => item.resultado.diagnosticos);
|
|
@@ -162,7 +209,13 @@ export async function comandoVerificar(entrada, baseSaida, cwd = process.cwd())
|
|
|
162
209
|
console.error(formatarDiagnosticos(diagnosticos));
|
|
163
210
|
return 1;
|
|
164
211
|
}
|
|
165
|
-
const alvos =
|
|
212
|
+
const alvos = opcoes.alvo
|
|
213
|
+
? [opcoes.alvo]
|
|
214
|
+
: resolverAlvosVerificacao(contextoProjeto.configCarregada);
|
|
215
|
+
const avisoEscopo = avisoEscopoStackVerificacao(contextoProjeto.configCarregada?.config.fontesLegado, alvos);
|
|
216
|
+
if (avisoEscopo) {
|
|
217
|
+
console.warn(avisoEscopo);
|
|
218
|
+
}
|
|
166
219
|
const configuracoesAlvo = alvos.map((alvo) => ({
|
|
167
220
|
alvo,
|
|
168
221
|
...resolverConfiguracaoVerificacaoPorAlvo(alvo, contextoProjeto.configCarregada),
|
|
@@ -187,13 +240,55 @@ export async function comandoVerificar(entrada, baseSaida, cwd = process.cwd())
|
|
|
187
240
|
arquivoFonte: modulo.caminho,
|
|
188
241
|
alvos: [],
|
|
189
242
|
};
|
|
243
|
+
const conteudoContrato = await readFile(modulo.caminho, "utf8").catch(() => "");
|
|
190
244
|
for (const configuracaoAlvo of configuracoesAlvo) {
|
|
191
245
|
const { alvo, framework, estrutura } = configuracaoAlvo;
|
|
192
246
|
const pastaAlvo = path.join(baseSaida, alvo, nomeSubpastaModulo(modulo.caminho));
|
|
247
|
+
const chave = calcularChaveVerificacao({
|
|
248
|
+
versaoCli: pacoteCli.version,
|
|
249
|
+
versaoNode: process.versions.node ?? "",
|
|
250
|
+
modulo: ir.nome,
|
|
251
|
+
alvo,
|
|
252
|
+
framework: framework ?? "",
|
|
253
|
+
estrutura,
|
|
254
|
+
conteudoContrato,
|
|
255
|
+
});
|
|
256
|
+
const emCache = opcoes.semCache ? undefined : await carregarCacheVerificacao(chave, pastaAlvo);
|
|
257
|
+
if (emCache) {
|
|
258
|
+
resumoModulo.alvos.push({
|
|
259
|
+
alvo,
|
|
260
|
+
arquivosGerados: emCache.arquivosGerados.length,
|
|
261
|
+
quantidadeTestes: emCache.quantidadeTestes,
|
|
262
|
+
pastaSaida: pastaAlvo,
|
|
263
|
+
sucesso: emCache.sucesso,
|
|
264
|
+
framework,
|
|
265
|
+
estrutura,
|
|
266
|
+
testesExecutados: false,
|
|
267
|
+
origem: "cache",
|
|
268
|
+
});
|
|
269
|
+
if (!emCache.sucesso) {
|
|
270
|
+
imprimirResumoVerificacao([...resumos, resumoModulo]);
|
|
271
|
+
console.error(`Falha registrada em cache na verificacao do modulo ${modulo.caminho} para o alvo ${alvo}.`);
|
|
272
|
+
return 1;
|
|
273
|
+
}
|
|
274
|
+
continue;
|
|
275
|
+
}
|
|
193
276
|
const arquivos = aplicarEstruturaSaida(gerarArquivosPorAlvo(ir, alvo, framework), ir, estrutura);
|
|
194
277
|
const escrita = await escreverArquivos(pastaAlvo, arquivos, { artefatoGerado: true });
|
|
195
278
|
artefatosGeradosAcimaDoLimite.push(...escrita.artefatosGeradosAcimaDoLimite);
|
|
196
279
|
const { execucao, testesExecutados } = executarTestesParaVerificacao(alvo, pastaAlvo, arquivos, framework);
|
|
280
|
+
await gravarCacheVerificacao({
|
|
281
|
+
schemaVersion: SCHEMA_CACHE_VERIFICACAO,
|
|
282
|
+
chave,
|
|
283
|
+
versaoCli: pacoteCli.version,
|
|
284
|
+
alvo,
|
|
285
|
+
modulo: ir.nome,
|
|
286
|
+
sucesso: execucao.codigoSaida === 0,
|
|
287
|
+
quantidadeTestes: execucao.quantidadeTestes,
|
|
288
|
+
testesExecutados,
|
|
289
|
+
arquivosGerados: arquivos.map((arquivo) => arquivo.caminhoRelativo),
|
|
290
|
+
geradoEm: new Date().toISOString(),
|
|
291
|
+
});
|
|
197
292
|
resumoModulo.alvos.push({
|
|
198
293
|
alvo,
|
|
199
294
|
arquivosGerados: arquivos.length,
|
|
@@ -203,6 +298,7 @@ export async function comandoVerificar(entrada, baseSaida, cwd = process.cwd())
|
|
|
203
298
|
framework,
|
|
204
299
|
estrutura,
|
|
205
300
|
testesExecutados,
|
|
301
|
+
origem: "executado",
|
|
206
302
|
});
|
|
207
303
|
if (execucao.codigoSaida !== 0) {
|
|
208
304
|
imprimirResumoVerificacao([...resumos, resumoModulo]);
|
|
@@ -220,7 +316,7 @@ export async function comandoVerificar(entrada, baseSaida, cwd = process.cwd())
|
|
|
220
316
|
console.log("Verificacao completa concluida com sucesso.");
|
|
221
317
|
return 0;
|
|
222
318
|
}
|
|
223
|
-
export async function comandoVerificarJson(entrada, baseSaida, cwd = process.cwd()) {
|
|
319
|
+
export async function comandoVerificarJson(entrada, baseSaida, cwd = process.cwd(), opcoes = {}) {
|
|
224
320
|
const contextoProjeto = await carregarProjeto(entrada, cwd);
|
|
225
321
|
const modulos = contextoProjeto.modulosSelecionados;
|
|
226
322
|
const diagnosticos = modulos.flatMap((item) => item.resultado.diagnosticos);
|
|
@@ -234,7 +330,10 @@ export async function comandoVerificarJson(entrada, baseSaida, cwd = process.cwd
|
|
|
234
330
|
}, null, 2));
|
|
235
331
|
return 1;
|
|
236
332
|
}
|
|
237
|
-
const alvos =
|
|
333
|
+
const alvos = opcoes.alvo
|
|
334
|
+
? [opcoes.alvo]
|
|
335
|
+
: resolverAlvosVerificacao(contextoProjeto.configCarregada);
|
|
336
|
+
const avisoEscopo = avisoEscopoStackVerificacao(contextoProjeto.configCarregada?.config.fontesLegado, alvos);
|
|
238
337
|
const configuracoesAlvo = alvos.map((alvo) => ({
|
|
239
338
|
alvo,
|
|
240
339
|
...resolverConfiguracaoVerificacaoPorAlvo(alvo, contextoProjeto.configCarregada),
|
|
@@ -273,13 +372,54 @@ export async function comandoVerificarJson(entrada, baseSaida, cwd = process.cwd
|
|
|
273
372
|
alvos: [],
|
|
274
373
|
saidaTestes: [],
|
|
275
374
|
};
|
|
375
|
+
const conteudoContrato = await readFile(modulo.caminho, "utf8").catch(() => "");
|
|
276
376
|
for (const configuracaoAlvo of configuracoesAlvo) {
|
|
277
377
|
const { alvo, framework, estrutura } = configuracaoAlvo;
|
|
278
378
|
const pastaAlvo = path.join(baseSaida, alvo, nomeSubpastaModulo(modulo.caminho));
|
|
379
|
+
const chave = calcularChaveVerificacao({
|
|
380
|
+
versaoCli: pacoteCli.version,
|
|
381
|
+
versaoNode: process.versions.node ?? "",
|
|
382
|
+
modulo: ir.nome,
|
|
383
|
+
alvo,
|
|
384
|
+
framework: framework ?? "",
|
|
385
|
+
estrutura,
|
|
386
|
+
conteudoContrato,
|
|
387
|
+
});
|
|
388
|
+
const emCache = opcoes.semCache ? undefined : await carregarCacheVerificacao(chave, pastaAlvo);
|
|
389
|
+
if (emCache) {
|
|
390
|
+
resumoModulo.alvos.push({
|
|
391
|
+
alvo,
|
|
392
|
+
arquivosGerados: emCache.arquivosGerados.length,
|
|
393
|
+
quantidadeTestes: emCache.quantidadeTestes,
|
|
394
|
+
pastaSaida: pastaAlvo,
|
|
395
|
+
sucesso: emCache.sucesso,
|
|
396
|
+
framework,
|
|
397
|
+
estrutura,
|
|
398
|
+
testesExecutados: false,
|
|
399
|
+
origem: "cache",
|
|
400
|
+
});
|
|
401
|
+
resumoModulo.saidaTestes.push({ alvo, stdout: "", stderr: `resultado reutilizado do cache de verificacao (chave ${chave.slice(0, 12)})` });
|
|
402
|
+
if (!emCache.sucesso) {
|
|
403
|
+
codigoSaida = 1;
|
|
404
|
+
}
|
|
405
|
+
continue;
|
|
406
|
+
}
|
|
279
407
|
const arquivos = aplicarEstruturaSaida(gerarArquivosPorAlvo(ir, alvo, framework), ir, estrutura);
|
|
280
408
|
const escrita = await escreverArquivos(pastaAlvo, arquivos, { artefatoGerado: true });
|
|
281
409
|
artefatosGeradosAcimaDoLimite.push(...escrita.artefatosGeradosAcimaDoLimite);
|
|
282
410
|
const { execucao, testesExecutados } = executarTestesParaVerificacao(alvo, pastaAlvo, arquivos, framework, true);
|
|
411
|
+
await gravarCacheVerificacao({
|
|
412
|
+
schemaVersion: SCHEMA_CACHE_VERIFICACAO,
|
|
413
|
+
chave,
|
|
414
|
+
versaoCli: pacoteCli.version,
|
|
415
|
+
alvo,
|
|
416
|
+
modulo: ir.nome,
|
|
417
|
+
sucesso: execucao.codigoSaida === 0,
|
|
418
|
+
quantidadeTestes: execucao.quantidadeTestes,
|
|
419
|
+
testesExecutados,
|
|
420
|
+
arquivosGerados: arquivos.map((arquivo) => arquivo.caminhoRelativo),
|
|
421
|
+
geradoEm: new Date().toISOString(),
|
|
422
|
+
});
|
|
283
423
|
resumoModulo.alvos.push({
|
|
284
424
|
alvo,
|
|
285
425
|
arquivosGerados: arquivos.length,
|
|
@@ -289,6 +429,7 @@ export async function comandoVerificarJson(entrada, baseSaida, cwd = process.cwd
|
|
|
289
429
|
framework,
|
|
290
430
|
estrutura,
|
|
291
431
|
testesExecutados,
|
|
432
|
+
origem: "executado",
|
|
292
433
|
});
|
|
293
434
|
resumoModulo.saidaTestes.push({ alvo, stdout: execucao.saidaPadrao, stderr: execucao.saidaErro });
|
|
294
435
|
if (execucao.codigoSaida !== 0) {
|
|
@@ -306,6 +447,7 @@ export async function comandoVerificarJson(entrada, baseSaida, cwd = process.cwd
|
|
|
306
447
|
console.log(JSON.stringify({
|
|
307
448
|
comando: "verificar",
|
|
308
449
|
sucesso: codigoSaida === 0,
|
|
450
|
+
avisoEscopo,
|
|
309
451
|
modulos: resumos,
|
|
310
452
|
totais,
|
|
311
453
|
artefatosGeradosAcimaDoLimite,
|
package/dist/index.part08.js
CHANGED
|
@@ -34,7 +34,7 @@ export async function principal() {
|
|
|
34
34
|
let codigoSaida = 0;
|
|
35
35
|
switch (comando) {
|
|
36
36
|
case "iniciar":
|
|
37
|
-
codigoSaida = await comandoIniciar(cwd, normalizarTemplateIniciar(obterOpcao(resto, "--template")), { force: possuiFlag(resto, "--force") });
|
|
37
|
+
codigoSaida = await comandoIniciar(cwd, normalizarTemplateIniciar(obterOpcao(resto, "--template")), { force: possuiFlag(resto, "--force"), exemplosCompletos: possuiFlag(resto, "--com-exemplos") });
|
|
38
38
|
break;
|
|
39
39
|
case "author":
|
|
40
40
|
codigoSaida = await comandoAuthor(posicionais, resto, possuiFlag(resto, "--json"));
|
|
@@ -100,8 +100,8 @@ export async function principal() {
|
|
|
100
100
|
break;
|
|
101
101
|
case "verificar":
|
|
102
102
|
codigoSaida = possuiFlag(resto, "--json")
|
|
103
|
-
? await comandoVerificarJson(posicionais[0], resolverSaidaPadrao(obterOpcao(resto, "--saida", "./.tmp/sema-verificar"), "typescript", await carregarConfiguracaoProjeto(posicionais[0] ? path.resolve(cwd, posicionais[0]) : cwd)), cwd)
|
|
104
|
-
: await comandoVerificar(posicionais[0], resolverSaidaPadrao(obterOpcao(resto, "--saida", "./.tmp/sema-verificar"), "typescript", await carregarConfiguracaoProjeto(posicionais[0] ? path.resolve(cwd, posicionais[0]) : cwd)), cwd);
|
|
103
|
+
? await comandoVerificarJson(posicionais[0], resolverSaidaPadrao(obterOpcao(resto, "--saida", "./.tmp/sema-verificar"), "typescript", await carregarConfiguracaoProjeto(posicionais[0] ? path.resolve(cwd, posicionais[0]) : cwd)), cwd, { alvo: obterOpcao(resto, "--alvo"), semCache: possuiFlag(resto, "--sem-cache") })
|
|
104
|
+
: await comandoVerificar(posicionais[0], resolverSaidaPadrao(obterOpcao(resto, "--saida", "./.tmp/sema-verificar"), "typescript", await carregarConfiguracaoProjeto(posicionais[0] ? path.resolve(cwd, posicionais[0]) : cwd)), cwd, { alvo: obterOpcao(resto, "--alvo"), semCache: possuiFlag(resto, "--sem-cache") });
|
|
105
105
|
break;
|
|
106
106
|
case "inspecionar":
|
|
107
107
|
codigoSaida = await comandoInspecionar(posicionais[0], possuiFlag(resto, "--json"), cwd, resto);
|
package/dist/initCommand.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { type TemplateIniciar } from "./initTemplatesBase.js";
|
|
2
2
|
export declare function comandoIniciar(cwd: string, template: TemplateIniciar, opcoes?: {
|
|
3
3
|
force?: boolean;
|
|
4
|
+
exemplosCompletos?: boolean;
|
|
4
5
|
}): Promise<number>;
|
|
5
6
|
export declare function comandoInstalarExemplos(emJson: boolean): Promise<number>;
|
package/dist/initCommand.js
CHANGED
|
@@ -4,7 +4,7 @@ import * as fs from "node:fs";
|
|
|
4
4
|
import path from "node:path";
|
|
5
5
|
import { escreverArquivos } from "./fsGovernado.js";
|
|
6
6
|
import { arquivosTemplateIniciar } from "./initTemplatesBase.js";
|
|
7
|
-
import { materializarExemplosOficiais, planejarExemplosOficiais } from "./exemplosOficiais.js";
|
|
7
|
+
import { materializarExemplosOficiais, normalizarCaminhoExemplo, planejarExemplosOficiais } from "./exemplosOficiais.js";
|
|
8
8
|
import { validarDestinosEscritaWorkspace } from "./workspaceWrite.js";
|
|
9
9
|
async function sincronizarKitIaInicial(cwd) {
|
|
10
10
|
const [{ gerarResumoProjetoIa }, { sincronizarEntrypointCodex }] = await Promise.all([
|
|
@@ -26,6 +26,12 @@ async function sincronizarKitIaInicial(cwd) {
|
|
|
26
26
|
codex,
|
|
27
27
|
};
|
|
28
28
|
}
|
|
29
|
+
const EXEMPLOS_STARTER_INICIAR = new Set([
|
|
30
|
+
"exemplos/crud_simples.sema",
|
|
31
|
+
"exemplos/cadastro_usuario.sema",
|
|
32
|
+
"exemplos/pedido.sema",
|
|
33
|
+
"exemplos/autenticacao.sema",
|
|
34
|
+
]);
|
|
29
35
|
export async function comandoIniciar(cwd, template, opcoes = {}) {
|
|
30
36
|
const arquivos = arquivosTemplateIniciar(template);
|
|
31
37
|
const planoExemplos = await planejarExemplosOficiais();
|
|
@@ -33,6 +39,9 @@ export async function comandoIniciar(cwd, template, opcoes = {}) {
|
|
|
33
39
|
console.error("Diretorio de exemplos oficiais nao foi encontrado no pacote da CLI.");
|
|
34
40
|
return 1;
|
|
35
41
|
}
|
|
42
|
+
const exemplosIniciar = opcoes.exemplosCompletos
|
|
43
|
+
? planoExemplos.arquivos
|
|
44
|
+
: planoExemplos.arquivos.filter((arquivo) => EXEMPLOS_STARTER_INICIAR.has(normalizarCaminhoExemplo(arquivo.caminhoRelativo)));
|
|
36
45
|
const [{ ARQUIVOS_RESUMO_PROJETO_IA }, { listarDestinosEntrypointCodex }] = await Promise.all([
|
|
37
46
|
import("./index.part04.js"),
|
|
38
47
|
import("./agentEntryPoints.js"),
|
|
@@ -40,7 +49,7 @@ export async function comandoIniciar(cwd, template, opcoes = {}) {
|
|
|
40
49
|
const caminhosTemplate = new Set(arquivos.map((arquivo) => arquivo.caminhoRelativo));
|
|
41
50
|
const destinos = await validarDestinosEscritaWorkspace(cwd, [
|
|
42
51
|
...caminhosTemplate,
|
|
43
|
-
...
|
|
52
|
+
...exemplosIniciar.map((arquivo) => arquivo.caminhoRelativo),
|
|
44
53
|
...ARQUIVOS_RESUMO_PROJETO_IA,
|
|
45
54
|
...listarDestinosEntrypointCodex("AGENTS.md"),
|
|
46
55
|
]);
|
|
@@ -51,7 +60,7 @@ export async function comandoIniciar(cwd, template, opcoes = {}) {
|
|
|
51
60
|
? arquivos
|
|
52
61
|
: arquivos.filter((arquivo) => !existentes.has(arquivo.caminhoRelativo));
|
|
53
62
|
await escreverArquivos(cwd, arquivosParaEscrever, { inserirCabecalhoGovernado: true });
|
|
54
|
-
const exemplos = await materializarExemplosOficiais(cwd, true);
|
|
63
|
+
const exemplos = await materializarExemplosOficiais(cwd, true, opcoes.exemplosCompletos ? undefined : EXEMPLOS_STARTER_INICIAR);
|
|
55
64
|
if (!exemplos.sucesso) {
|
|
56
65
|
console.error(exemplos.erro);
|
|
57
66
|
return 1;
|
|
@@ -67,6 +76,9 @@ export async function comandoIniciar(cwd, template, opcoes = {}) {
|
|
|
67
76
|
console.log(`Projeto Sema inicializado com template ${template}.`);
|
|
68
77
|
console.log(`Arquivos do projeto: ${arquivosParaEscrever.length} escritos, ${opcoes.force ? 0 : existentes.size} preservados.`);
|
|
69
78
|
console.log(`Exemplos oficiais sincronizados em ${exemplos.destino} (${exemplos.criados.length} criados, ${exemplos.preservados.length} preservados).`);
|
|
79
|
+
if (!opcoes.exemplosCompletos) {
|
|
80
|
+
console.log("Starter de exemplos instalado; rode sema instalar-exemplos ou sema iniciar --com-exemplos para o pacote completo.");
|
|
81
|
+
}
|
|
70
82
|
console.log(`Kit IA Codex-native sincronizado (${kitIa.artefatos.length} artefatos; entrypoint ${kitIa.codex.entrypointCodex}; ${kitIa.codex.criados.length} criados, ${kitIa.codex.atualizados.length} atualizados, ${kitIa.codex.preservados.length} preservados).`);
|
|
71
83
|
return 0;
|
|
72
84
|
}
|
|
@@ -8,54 +8,54 @@ export function arquivosBaseIniciar() {
|
|
|
8
8
|
return [
|
|
9
9
|
{
|
|
10
10
|
caminhoRelativo: "contratos/pedidos.sema",
|
|
11
|
-
conteudo: `module app.pedidos {
|
|
12
|
-
entity Pedido {
|
|
13
|
-
fields {
|
|
14
|
-
id: Id
|
|
15
|
-
status: Texto
|
|
16
|
-
total: Decimal
|
|
17
|
-
}
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
task criar_pedido {
|
|
21
|
-
input {
|
|
22
|
-
cliente_id: Id required
|
|
23
|
-
total: Decimal required
|
|
24
|
-
}
|
|
25
|
-
output {
|
|
26
|
-
pedido_id: Id
|
|
27
|
-
status: Texto
|
|
28
|
-
}
|
|
29
|
-
rules {
|
|
30
|
-
total > 0
|
|
31
|
-
}
|
|
32
|
-
effects {
|
|
33
|
-
persistencia Pedido criticidade=alta
|
|
34
|
-
auditoria pedidos
|
|
35
|
-
}
|
|
36
|
-
guarantees {
|
|
37
|
-
pedido_id existe
|
|
38
|
-
status existe
|
|
39
|
-
}
|
|
40
|
-
tests {
|
|
41
|
-
caso "pedido valido" {
|
|
42
|
-
given {
|
|
43
|
-
cliente_id: "cli-1"
|
|
44
|
-
total: 10
|
|
45
|
-
}
|
|
46
|
-
expect {
|
|
47
|
-
sucesso: verdadeiro
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
route criar_pedido_publico {
|
|
54
|
-
metodo: POST
|
|
55
|
-
caminho: /pedidos
|
|
56
|
-
task: criar_pedido
|
|
57
|
-
}
|
|
58
|
-
}
|
|
11
|
+
conteudo: `module app.pedidos {
|
|
12
|
+
entity Pedido {
|
|
13
|
+
fields {
|
|
14
|
+
id: Id
|
|
15
|
+
status: Texto
|
|
16
|
+
total: Decimal
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
task criar_pedido {
|
|
21
|
+
input {
|
|
22
|
+
cliente_id: Id required
|
|
23
|
+
total: Decimal required
|
|
24
|
+
}
|
|
25
|
+
output {
|
|
26
|
+
pedido_id: Id
|
|
27
|
+
status: Texto
|
|
28
|
+
}
|
|
29
|
+
rules {
|
|
30
|
+
total > 0
|
|
31
|
+
}
|
|
32
|
+
effects {
|
|
33
|
+
persistencia Pedido criticidade=alta
|
|
34
|
+
auditoria pedidos
|
|
35
|
+
}
|
|
36
|
+
guarantees {
|
|
37
|
+
pedido_id existe
|
|
38
|
+
status existe
|
|
39
|
+
}
|
|
40
|
+
tests {
|
|
41
|
+
caso "pedido valido" {
|
|
42
|
+
given {
|
|
43
|
+
cliente_id: "cli-1"
|
|
44
|
+
total: 10
|
|
45
|
+
}
|
|
46
|
+
expect {
|
|
47
|
+
sucesso: verdadeiro
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
route criar_pedido_publico {
|
|
54
|
+
metodo: POST
|
|
55
|
+
caminho: /pedidos
|
|
56
|
+
task: criar_pedido
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
59
|
`,
|
|
60
60
|
},
|
|
61
61
|
];
|
|
@@ -64,41 +64,41 @@ function arquivosApoioIaIniciar() {
|
|
|
64
64
|
return [
|
|
65
65
|
{
|
|
66
66
|
caminhoRelativo: "README.md",
|
|
67
|
-
conteudo: `# Projeto Sema
|
|
68
|
-
|
|
69
|
-
Este projeto foi inicializado com Sema.
|
|
70
|
-
|
|
71
|
-
## Entrada oficial do Codex
|
|
72
|
-
|
|
73
|
-
Antes de alterar codigo, contrato ou documentacao:
|
|
74
|
-
|
|
75
|
-
1. leia \`AGENTS.md\`;
|
|
67
|
+
conteudo: `# Projeto Sema
|
|
68
|
+
|
|
69
|
+
Este projeto foi inicializado com Sema.
|
|
70
|
+
|
|
71
|
+
## Entrada oficial do Codex
|
|
72
|
+
|
|
73
|
+
Antes de alterar codigo, contrato ou documentacao:
|
|
74
|
+
|
|
75
|
+
1. leia \`AGENTS.md\`;
|
|
76
76
|
2. rode \`sema --version\`; se o shell não localizar o comando, use \`$HOME/.sema/bin/sema\` no macOS/Linux; no Windows, PowerShell usa \`sema.ps1\` no PATH, cmd.exe usa \`sema.cmd\`, e o fallback absoluto é \`& "$env:SystemRoot\\System32\\WindowsPowerShell\\v1.0\\powershell.exe" -NoLogo -NoProfile -NonInteractive -ExecutionPolicy Bypass -File "$HOME\\.sema\\bin\\sema-managed.ps1" --version\`;
|
|
77
77
|
3. rode \`sema resumo --drift none\` para contexto contratual; score, confiança e implementação ficam não avaliados;
|
|
78
78
|
4. rode \`sema docs-impacto --intencao "<acao>" --json\`;
|
|
79
|
-
5. leia \`docs/commands.md\` antes de escolher comando ou interpretar \`--saida\`;
|
|
80
|
-
6. use \`sema descobrir recomendar --intencao "<objetivo>" --json\` quando não souber qual capacidade ou pipeline aplicar;
|
|
79
|
+
5. leia \`docs/commands.md\` antes de escolher comando ou interpretar \`--saida\`;
|
|
80
|
+
6. use \`sema descobrir recomendar --intencao "<objetivo>" --json\` quando não souber qual capacidade ou pipeline aplicar;
|
|
81
81
|
7. use \`exemplos/\` e \`docs/syntax.md\` antes de criar ou corrigir \`.sema\`.
|
|
82
82
|
|
|
83
83
|
Quando precisar comprovar o código vivo, rode \`sema drift <contrato.sema> --escopo modulo --cache fresh --json\`. Cache acelera navegação, mas não é prova final de fechamento.
|
|
84
|
-
|
|
85
|
-
## Estrutura criada
|
|
86
|
-
|
|
87
|
-
- \`contratos/\`: contratos semanticamente governados.
|
|
88
|
-
- \`AGENTS.md\`: entrypoint oficial do Codex.
|
|
89
|
-
- \`exemplos/\`: exemplos oficiais da DSL Sema.
|
|
90
|
-
- \`docs/commands.md\`: catalogo de comandos, pipelines, gates e regra de \`--saida\`.
|
|
91
|
-
- \`docs/syntax.md\`: referencia curta para escrever \`.sema\`.
|
|
92
|
-
- \`docs/ai-workflow.md\`: fluxo minimo para agentes.
|
|
93
|
-
- \`SEMA_BOOT.md\`, \`SEMA_SMALL_MODEL.md\`, \`AGENT_CONTEXT_PACK.json\` e \`SEMA_INDEX.json\`: contexto IA-first.
|
|
94
|
-
|
|
95
|
-
## Geracao
|
|
96
|
-
|
|
97
|
-
O template base ja declara alvo JavaScript. Exemplo:
|
|
98
|
-
|
|
99
|
-
\`\`\`bash
|
|
100
|
-
sema compilar contratos/pedidos.sema --alvo javascript --saida ./generated/javascript
|
|
101
|
-
\`\`\`
|
|
84
|
+
|
|
85
|
+
## Estrutura criada
|
|
86
|
+
|
|
87
|
+
- \`contratos/\`: contratos semanticamente governados.
|
|
88
|
+
- \`AGENTS.md\`: entrypoint oficial do Codex.
|
|
89
|
+
- \`exemplos/\`: exemplos oficiais da DSL Sema.
|
|
90
|
+
- \`docs/commands.md\`: catalogo de comandos, pipelines, gates e regra de \`--saida\`.
|
|
91
|
+
- \`docs/syntax.md\`: referencia curta para escrever \`.sema\`.
|
|
92
|
+
- \`docs/ai-workflow.md\`: fluxo minimo para agentes.
|
|
93
|
+
- \`SEMA_BOOT.md\`, \`SEMA_SMALL_MODEL.md\`, \`AGENT_CONTEXT_PACK.json\` e \`SEMA_INDEX.json\`: contexto IA-first.
|
|
94
|
+
|
|
95
|
+
## Geracao
|
|
96
|
+
|
|
97
|
+
O template base ja declara alvo JavaScript. Exemplo:
|
|
98
|
+
|
|
99
|
+
\`\`\`bash
|
|
100
|
+
sema compilar contratos/pedidos.sema --alvo javascript --saida ./generated/javascript
|
|
101
|
+
\`\`\`
|
|
102
102
|
`,
|
|
103
103
|
},
|
|
104
104
|
];
|
|
@@ -119,7 +119,7 @@ export function arquivosTemplateIniciar(template) {
|
|
|
119
119
|
?? [
|
|
120
120
|
{
|
|
121
121
|
caminhoRelativo: "sema.config.json",
|
|
122
|
-
conteudo: "{\n \"origens\": [\"./contratos\"],\n \"saida\": \"./generated\",\n \"alvos\": [\"typescript\", \"javascript\"
|
|
122
|
+
conteudo: "{\n \"origens\": [\"./contratos\"],\n \"saida\": \"./generated\",\n \"alvos\": [\"typescript\", \"javascript\"],\n \"alvoPadrao\": \"typescript\",\n \"estruturaSaida\": \"modulos\",\n \"framework\": \"base\",\n \"modoEstrito\": true,\n \"diretoriosSaidaPorAlvo\": {\n \"typescript\": \"./generated/typescript\",\n \"javascript\": \"./generated/javascript\",\n \"python\": \"./generated/python\",\n \"php\": \"./generated/php\",\n \"dart\": \"./generated/dart\",\n \"lua\": \"./generated/lua\",\n \"html\": \"./generated/html\",\n \"css\": \"./generated/css\",\n \"dotnet\": \"./generated/dotnet\",\n \"cpp\": \"./generated/cpp\"\n },\n \"convencoesGeracaoPorProjeto\": \"base\"\n}\n",
|
|
123
123
|
},
|
|
124
124
|
...arquivosBase,
|
|
125
125
|
];
|
package/dist/projetoConfig.js
CHANGED
|
@@ -74,6 +74,9 @@ export function normalizarFonteLegado(valor) {
|
|
|
74
74
|
return "typescript";
|
|
75
75
|
}
|
|
76
76
|
if (valor === "nestjs"
|
|
77
|
+
|| valor === "express"
|
|
78
|
+
|| valor === "fastify"
|
|
79
|
+
|| valor === "koa"
|
|
77
80
|
|| valor === "fastapi"
|
|
78
81
|
|| valor === "flask"
|
|
79
82
|
|| valor === "nextjs"
|
|
@@ -81,6 +84,8 @@ export function normalizarFonteLegado(valor) {
|
|
|
81
84
|
|| valor === "react-vite-consumer"
|
|
82
85
|
|| valor === "angular-consumer"
|
|
83
86
|
|| valor === "flutter-consumer"
|
|
87
|
+
|| valor === "sveltekit-consumer"
|
|
88
|
+
|| valor === "nuxt-consumer"
|
|
84
89
|
|| valor === "firebase"
|
|
85
90
|
|| valor === "typescript"
|
|
86
91
|
|| valor === "javascript"
|