@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.
Files changed (55) hide show
  1. package/dist/agentEntryPoints.js +78 -64
  2. package/dist/cliGrammar.js +5 -5
  3. package/dist/cliHelpTexto.js +6 -6
  4. package/dist/docs.part01.d.ts +4 -1
  5. package/dist/docs.part01.js +8 -0
  6. package/dist/docs.part02.js +9 -1
  7. package/dist/drift.part01.d.ts +8 -2
  8. package/dist/drift.part04.d.ts +14 -2
  9. package/dist/drift.part04.js +35 -2
  10. package/dist/drift.part05.d.ts +6 -0
  11. package/dist/drift.part05.js +68 -0
  12. package/dist/drift.part06.js +60 -3
  13. package/dist/drift.part09.d.ts +2 -2
  14. package/dist/drift.part09.js +13 -3
  15. package/dist/drift.part11.js +24 -3
  16. package/dist/drift.part14.js +4 -0
  17. package/dist/exemplosOficiais.d.ts +2 -1
  18. package/dist/exemplosOficiais.js +9 -3
  19. package/dist/geracaoCore.d.ts +1 -0
  20. package/dist/geracaoCore.js +5 -0
  21. package/dist/importador.part01.d.ts +1 -1
  22. package/dist/importador.part04.d.ts +5 -1
  23. package/dist/importador.part04.js +40 -2
  24. package/dist/importador.part06.d.ts +2 -0
  25. package/dist/importador.part06.js +97 -1
  26. package/dist/importador.part09.js +17 -2
  27. package/dist/index.part04.js +13 -6
  28. package/dist/index.part07.d.ts +8 -2
  29. package/dist/index.part07.js +146 -4
  30. package/dist/index.part08.js +3 -3
  31. package/dist/initCommand.d.ts +1 -0
  32. package/dist/initCommand.js +15 -3
  33. package/dist/initTemplatesBase.js +78 -78
  34. package/dist/projetoConfig.js +5 -0
  35. package/dist/projetoLegado.js +40 -0
  36. package/dist/tipos.d.ts +1 -1
  37. package/dist/typescript-http-body.js +9 -0
  38. package/dist/typescript-http-modelos.d.ts +1 -1
  39. package/dist/typescript-http-rotas.d.ts +1 -0
  40. package/dist/typescript-http-rotas.js +198 -0
  41. package/dist/typescript-http-semantica.d.ts +3 -3
  42. package/dist/typescript-http-semantica.js +65 -7
  43. package/dist/typescript-http.d.ts +1 -1
  44. package/dist/typescript-http.js +1 -1
  45. package/dist/verificacaoCache.d.ts +25 -0
  46. package/dist/verificacaoCache.js +80 -0
  47. package/docs/syntax.md +14 -0
  48. package/exemplos/express_crud.sema +139 -0
  49. package/exemplos/fastify_crud.sema +146 -0
  50. package/exemplos/koa_crud.sema +95 -0
  51. package/node_modules/@sema/nucleo/dist/ir/conversor.part01.js +37 -38
  52. package/node_modules/@sema/nucleo/dist/ir/modelos.d.ts +1 -0
  53. package/node_modules/@sema/nucleo/dist/semantico/analisador.part01.d.ts +7 -0
  54. package/node_modules/@sema/nucleo/dist/semantico/analisador.part01.js +33 -10
  55. package/package.json +1 -1
@@ -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));
@@ -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>;
@@ -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 = resolverAlvosVerificacao(contextoProjeto.configCarregada);
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 = resolverAlvosVerificacao(contextoProjeto.configCarregada);
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,
@@ -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);
@@ -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>;
@@ -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
- ...planoExemplos.arquivos.map((arquivo) => arquivo.caminhoRelativo),
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\", \"python\", \"php\", \"dart\", \"lua\", \"html\", \"css\"],\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",
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
  ];
@@ -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"