@semacode/cli 3.12.2 → 4.0.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 (90) hide show
  1. package/dist/agentEntryPoints.js +9 -9
  2. package/dist/cliGrammar.js +17 -5
  3. package/dist/cliHelpTexto.js +5 -4
  4. package/dist/contextPack.d.ts +75 -0
  5. package/dist/contextPack.js +130 -0
  6. package/dist/drift.contrato.d.ts +1 -0
  7. package/dist/drift.contrato.js +1 -0
  8. package/dist/drift.part01.d.ts +4 -2
  9. package/dist/drift.part11.js +12 -1
  10. package/dist/drift.part14.d.ts +3 -0
  11. package/dist/drift.part14.js +108 -10
  12. package/dist/driftEscopo.d.ts +1 -0
  13. package/dist/driftEscopo.js +6 -0
  14. package/dist/driftPack.d.ts +65 -0
  15. package/dist/driftPack.js +96 -0
  16. package/dist/entrypointPack.d.ts +47 -0
  17. package/dist/entrypointPack.js +79 -0
  18. package/dist/index.part03.d.ts +2 -0
  19. package/dist/index.part03.js +6 -0
  20. package/dist/index.part05.js +14 -1
  21. package/dist/index.part06.js +51 -0
  22. package/dist/index.part07.d.ts +1 -1
  23. package/dist/index.part07.js +16 -2
  24. package/dist/index.part08.js +1 -1
  25. package/dist/indexPack.d.ts +54 -0
  26. package/dist/indexPack.js +140 -0
  27. package/dist/init/templates.part01.js +393 -393
  28. package/dist/init/templates.part02.js +189 -189
  29. package/dist/initCommand.js +38 -2
  30. package/dist/initTemplatesBackend.js +73 -73
  31. package/dist/initTemplatesFlutter.js +137 -137
  32. package/dist/initTemplatesRuntime.js +350 -350
  33. package/dist/initTemplatesWeb.js +309 -309
  34. package/dist/sync/index.js +35 -35
  35. package/docs/ai-workflow.md +1 -1
  36. package/docs/auth.md +26 -26
  37. package/docs/commands.md +3 -3
  38. package/docs/database.md +15 -15
  39. package/docs/env.md +16 -16
  40. package/docs/frontend.md +41 -41
  41. package/docs/i18n.md +15 -15
  42. package/exemplos/agendamento.sema +1 -1
  43. package/exemplos/assinatura.sema +1 -1
  44. package/exemplos/auditoria.sema +1 -1
  45. package/exemplos/autenticacao.sema +1 -1
  46. package/exemplos/author_obra_comum.sema +1 -1
  47. package/exemplos/author_tema_sensivel.sema +1 -1
  48. package/exemplos/automacao.sema +1 -1
  49. package/exemplos/cadastro_usuario.sema +1 -1
  50. package/exemplos/calculadora.sema +1 -1
  51. package/exemplos/crud_simples.sema +1 -1
  52. package/exemplos/estoque.sema +1 -1
  53. package/exemplos/exportacao.sema +1 -1
  54. package/exemplos/fila.sema +1 -1
  55. package/exemplos/integracao_externa.sema +1 -1
  56. package/exemplos/multi_tenant.sema +1 -1
  57. package/exemplos/notificacao.sema +1 -1
  58. package/exemplos/operacao_estrategia.sema +132 -132
  59. package/exemplos/operacao_estrategia_discovery.sema +220 -220
  60. package/exemplos/operacao_estrategia_fluxo.sema +114 -114
  61. package/exemplos/operacao_estrategia_gates.sema +106 -106
  62. package/exemplos/operacao_estrategia_quarentena.sema +133 -133
  63. package/exemplos/operacao_estrategia_rollout.sema +124 -124
  64. package/exemplos/pagamento.sema +1 -1
  65. package/exemplos/pagamento_dominio.sema +1 -1
  66. package/exemplos/pedido.sema +1 -1
  67. package/exemplos/permissao.sema +1 -1
  68. package/exemplos/persistencia_vendor_first.sema +1 -1
  69. package/exemplos/php_crud.sema +170 -170
  70. package/exemplos/profile_conversas.sema +165 -165
  71. package/exemplos/profile_game.sema +1 -1
  72. package/exemplos/profile_legal.sema +1 -1
  73. package/exemplos/profile_ops.sema +1 -1
  74. package/exemplos/profile_research.sema +1 -1
  75. package/exemplos/profile_software.sema +1 -1
  76. package/exemplos/profile_workflow_n8n.sema +1 -1
  77. package/exemplos/relatorio.sema +1 -1
  78. package/exemplos/replica_analitica_erp.sema +1 -1
  79. package/exemplos/testes_embutidos.sema +1 -1
  80. package/exemplos/tratamento_erro.sema +1 -1
  81. package/exemplos/upload_arquivo.sema +1 -1
  82. package/exemplos/webhook.sema +1 -1
  83. package/node_modules/@sema/gerador-cpp/dist/index.js +176 -176
  84. package/node_modules/@sema/gerador-css/dist/index.part01.js +10 -10
  85. package/node_modules/@sema/gerador-dotnet/dist/index.js +169 -169
  86. package/node_modules/@sema/gerador-html/dist/index.js +17 -17
  87. package/node_modules/@sema/gerador-python/dist/index.part02.js +3 -3
  88. package/node_modules/@sema/gerador-typescript/dist/index.part02.js +11 -11
  89. package/node_modules/@sema/nucleo/dist/diagnosticos/melhorador.js +42 -42
  90. package/package.json +1 -1
@@ -2,7 +2,7 @@
2
2
  // Descricao: analisa modulos selecionados no drift; consulte contratos/sema/governanca_ia_contexto.sema antes de editar.
3
3
  import path from "node:path";
4
4
  import { escolherArquivoPorVinculo, escolherSimboloPorVinculo } from "./drift.part03.js";
5
- import { calcularRiscoOperacional, encontrarAncoraSuperficie } from "./drift.part04.js";
5
+ import { calcularRiscoOperacional, chaveCaminhoCanonicoDrift, encontrarAncoraSuperficie } from "./drift.part04.js";
6
6
  import { resolverPersistenciaLocalPorTask } from "./drift.part08.js";
7
7
  import { escolherRotasEsperadas, normalizarCaminhoRota, ordenarCandidatos, sugerirCandidatosParaImpl, sugerirCandidatosParaTaskSemImpl } from "./drift.part09.js";
8
8
  import { coletarVinculosIr, extrairRecursosEsperados, resolverRecursoEsperado } from "./drift.part10.js";
@@ -30,8 +30,61 @@ function redigirCaminhoDeclaradoExterno(baseProjeto, valor) {
30
30
  const nome = path.basename(path.normalize(valor)) || "arquivo";
31
31
  return `[fora_do_workspace]/${nome}`;
32
32
  }
33
+ function caminhoDeclaradoTentadoVinculo(vinculo) {
34
+ const arquivoDeclarado = vinculo.arquivo ?? (vinculo.tipo === "arquivo" ? vinculo.valor : undefined);
35
+ if (arquivoDeclarado) {
36
+ return arquivoDeclarado;
37
+ }
38
+ const recursoDeclarado = vinculo.recurso ?? (["recurso", "tabela", "fila", "cache", "storage"].includes(vinculo.tipo) ? vinculo.valor : undefined);
39
+ if (recursoDeclarado) {
40
+ return undefined;
41
+ }
42
+ const superficieDeclarada = vinculo.superficie ?? (["superficie", "rota", "worker", "cron", "webhook", "evento", "policy", "fila", "cache", "storage"].includes(vinculo.tipo) ? vinculo.valor : undefined);
43
+ return superficieDeclarada ?? vinculo.valor;
44
+ }
45
+ function sugerirDiretorioCodigoDrift(baseProjeto, caminhoAbsoluto) {
46
+ const diretorioRelativo = path.relative(path.resolve(baseProjeto), path.dirname(path.resolve(caminhoAbsoluto))).replace(/\\/g, "/");
47
+ return `./${diretorioRelativo || "."}`;
48
+ }
49
+ function arquivoDentroDoEscopoCodigo(contexto, caminhoAbsoluto) {
50
+ return contexto.diretoriosCodigo.some((diretorio) => {
51
+ const relativo = path.relative(path.resolve(diretorio), path.resolve(caminhoAbsoluto));
52
+ return relativo === "" || (!relativo.startsWith("..") && !path.isAbsolute(relativo));
53
+ });
54
+ }
55
+ // Simbolo declarado cujo dono ancora codigo em arquivo existente fora dos
56
+ // diretoriosCodigo: casa o caminho do simbolo com o diretorio do arquivo.
57
+ function escolherAncoraForaDoEscopoPorSimbolo(caminhos, baseProjeto, simbolo) {
58
+ const simboloComoCaminho = simbolo.toLowerCase().replaceAll(".", "/");
59
+ const porPrefixo = caminhos.find((caminho) => {
60
+ const diretorioRelativo = path.relative(path.resolve(baseProjeto), path.dirname(path.resolve(caminho))).replace(/\\/g, "/").toLowerCase();
61
+ return diretorioRelativo !== "" && simboloComoCaminho.startsWith(`${diretorioRelativo}/`);
62
+ });
63
+ if (porPrefixo) {
64
+ return porPrefixo;
65
+ }
66
+ return caminhos.length === 1 ? caminhos[0] : undefined;
67
+ }
68
+ // O analisador de modulos e sincrono: a existencia em disco dos caminhos
69
+ // declarados em vinculos e sondada antes, pelo chamador, e injetada no estado.
70
+ export function coletarCaminhosDeclaradosVinculosDrift(contexto) {
71
+ const caminhos = [];
72
+ for (const item of contexto.modulosSelecionados) {
73
+ const ir = item.resultado.ir;
74
+ if (!ir) {
75
+ continue;
76
+ }
77
+ for (const itemVinculo of coletarVinculosIr(ir)) {
78
+ const declarado = caminhoDeclaradoTentadoVinculo(itemVinculo.vinculo);
79
+ if (declarado) {
80
+ caminhos.push(path.resolve(contexto.baseProjeto, declarado));
81
+ }
82
+ }
83
+ }
84
+ return caminhos;
85
+ }
33
86
  export function analisarModulosSelecionadosDrift(estado) {
34
- const { contexto, mapaImpl, todosSimbolos, mapaRecursos, todosRecursos, todasRotasIndexadas, todosArquivosConhecidos, implsValidos, implsQuebrados, vinculosValidos, vinculosQuebrados, rotasDivergentes, recursosValidos, recursosDivergentes, diagnosticos, tasksResumo, taskPorChave, guardrailsPorTask, resumoVinculosPorTask, arquivosAncoraHerdadosPorTask, } = estado;
87
+ const { contexto, mapaImpl, todosSimbolos, mapaRecursos, todosRecursos, todasRotasIndexadas, todosArquivosConhecidos, implsValidos, implsQuebrados, vinculosValidos, vinculosQuebrados, vinculosForaDoEscopo, arquivosDeclaradosExistentes, rotasDivergentes, recursosValidos, recursosDivergentes, diagnosticos, tasksResumo, taskPorChave, guardrailsPorTask, resumoVinculosPorTask, arquivosAncoraHerdadosPorTask, } = estado;
35
88
  for (const item of contexto.modulosSelecionados) {
36
89
  const ir = item.resultado.ir;
37
90
  if (!ir) {
@@ -309,6 +362,23 @@ export function analisarModulosSelecionadosDrift(estado) {
309
362
  });
310
363
  }
311
364
  }
365
+ const arquivosForaDoEscopoPorDono = new Map();
366
+ for (const itemVinculoDono of coletarVinculosIr(ir)) {
367
+ const declarado = itemVinculoDono.vinculo.arquivo
368
+ ?? (itemVinculoDono.vinculo.tipo === "arquivo" ? itemVinculoDono.vinculo.valor : undefined);
369
+ if (!declarado) {
370
+ continue;
371
+ }
372
+ const absoluto = path.resolve(contexto.baseProjeto, declarado);
373
+ if (arquivosDeclaradosExistentes.get(chaveCaminhoCanonicoDrift(absoluto)) !== true
374
+ || arquivoDentroDoEscopoCodigo(contexto, absoluto)) {
375
+ continue;
376
+ }
377
+ const chaveDono = `${itemVinculoDono.donoTipo}:${itemVinculoDono.dono}`;
378
+ const lista = arquivosForaDoEscopoPorDono.get(chaveDono) ?? [];
379
+ lista.push(absoluto);
380
+ arquivosForaDoEscopoPorDono.set(chaveDono, lista);
381
+ }
312
382
  for (const itemVinculo of coletarVinculosIr(ir)) {
313
383
  const registro = {
314
384
  modulo: ir.nome,
@@ -385,13 +455,41 @@ export function analisarModulosSelecionadosDrift(estado) {
385
455
  }
386
456
  }
387
457
  if (registro.status === "nao_encontrado") {
388
- vinculosQuebrados.push(registro);
389
- diagnosticos.push({
390
- tipo: "vinculo_quebrado",
391
- modulo: ir.nome,
392
- mensagem: `Vinculo ${registro.tipo}="${registro.valor}" de ${registro.donoTipo} "${registro.dono}" nao foi resolvido no codigo vivo.`,
393
- ...(itemVinculo.donoTipo === "task" ? { task: itemVinculo.dono } : itemVinculo.donoTipo === "route" ? { route: itemVinculo.dono } : {}),
394
- });
458
+ const caminhoTentado = caminhoDeclaradoTentadoVinculo(itemVinculo.vinculo);
459
+ const caminhoAbsoluto = caminhoTentado ? path.resolve(contexto.baseProjeto, caminhoTentado) : undefined;
460
+ const existeNoDisco = caminhoAbsoluto !== undefined
461
+ && arquivosDeclaradosExistentes.get(chaveCaminhoCanonicoDrift(caminhoAbsoluto)) === true;
462
+ // Arquivo proprio declarado fora do escopo, ou simbolo que herda a ancora
463
+ // de arquivo declarado do mesmo dono existente fora dos diretoriosCodigo.
464
+ const alvoForaDoEscopo = existeNoDisco && caminhoAbsoluto !== undefined && !arquivoDentroDoEscopoCodigo(contexto, caminhoAbsoluto)
465
+ ? caminhoAbsoluto
466
+ : simboloDeclarado
467
+ ? escolherAncoraForaDoEscopoPorSimbolo(arquivosForaDoEscopoPorDono.get(`${itemVinculo.donoTipo}:${itemVinculo.dono}`) ?? [], contexto.baseProjeto, simboloDeclarado)
468
+ : undefined;
469
+ if (alvoForaDoEscopo) {
470
+ const diretorioSugerido = sugerirDiretorioCodigoDrift(contexto.baseProjeto, alvoForaDoEscopo);
471
+ registro.status = "fora_do_escopo";
472
+ registro.confianca = "baixa";
473
+ registro.arquivo = alvoForaDoEscopo;
474
+ registro.diretorioSugerido = diretorioSugerido;
475
+ vinculosForaDoEscopo.push(registro);
476
+ diagnosticos.push({
477
+ tipo: "vinculo_fora_do_escopo",
478
+ modulo: ir.nome,
479
+ severidade: "aviso",
480
+ mensagem: `Vinculo ${registro.tipo}="${registro.valor}" de ${itemVinculo.donoTipo} "${itemVinculo.dono}": o codigo existe no workspace mas esta fora dos diretoriosCodigo do sema.config.json; adicione "${diretorioSugerido}" a diretoriosCodigo para o drift verificar este vinculo.`,
481
+ ...(itemVinculo.donoTipo === "task" ? { task: itemVinculo.dono } : itemVinculo.donoTipo === "route" ? { route: itemVinculo.dono } : {}),
482
+ });
483
+ }
484
+ else {
485
+ vinculosQuebrados.push(registro);
486
+ diagnosticos.push({
487
+ tipo: "vinculo_quebrado",
488
+ modulo: ir.nome,
489
+ mensagem: `Vinculo ${registro.tipo}="${registro.valor}" de ${itemVinculo.donoTipo} "${itemVinculo.dono}" nao foi resolvido no codigo vivo.`,
490
+ ...(itemVinculo.donoTipo === "task" ? { task: itemVinculo.dono } : itemVinculo.donoTipo === "route" ? { route: itemVinculo.dono } : {}),
491
+ });
492
+ }
395
493
  }
396
494
  else {
397
495
  vinculosValidos.push(registro);
@@ -429,7 +527,7 @@ export function analisarModulosSelecionadosDrift(estado) {
429
527
  if (registro.status === "nao_encontrado") {
430
528
  resumo.quebrados += 1;
431
529
  }
432
- else {
530
+ else if (registro.status !== "fora_do_escopo") {
433
531
  resumo.validos += 1;
434
532
  }
435
533
  if (registro.arquivo) {
@@ -18,5 +18,6 @@ export interface PlanoEscopoDrift {
18
18
  bloqueios: string[];
19
19
  dependencias: Record<string, string[]>;
20
20
  }
21
+ export declare function sondarCaminhosDeclaradosExistentes(caminhos: readonly string[], baseProjeto: string): Promise<Map<string, boolean>>;
21
22
  export declare function planejarEscopoDrift(contexto: ContextoProjetoCarregado, configuracao: ConfiguracaoEscopoDriftAplicada): Promise<PlanoEscopoDrift>;
22
23
  export declare function expandirDependenciasPlanoDrift(contexto: ContextoProjetoCarregado, plano: PlanoEscopoDrift, catalogo: CatalogoDrift): Promise<PlanoEscopoDrift>;
@@ -84,6 +84,12 @@ async function sondarArquivosRegularesContidos(caminhos, raizReal) {
84
84
  const resultados = await mapearComLimite(unicos, CONCORRENCIA_SONDAGENS_DRIFT, async ([chave, caminho]) => [chave, await arquivoRegularContido(caminho, raizReal)]);
85
85
  return new Map(resultados);
86
86
  }
87
+ // Sonda arquivos declarados em vinculos contra o workspace real: alimenta a
88
+ // distincao entre "arquivo nao existe" e "existe fora dos diretoriosCodigo".
89
+ export async function sondarCaminhosDeclaradosExistentes(caminhos, baseProjeto) {
90
+ const raizReal = await realpath(baseProjeto);
91
+ return sondarArquivosRegularesContidos(caminhos, raizReal);
92
+ }
87
93
  function vinculosModulo(ir) {
88
94
  return [
89
95
  ...ir.vinculos,
@@ -0,0 +1,65 @@
1
+ import type { ResultadoDrift } from "./drift.part01.js";
2
+ export type DriftPack = {
3
+ schema: "sema.ai.drift-pack/v1";
4
+ selection: "deterministic_evidence_compaction";
5
+ source: {
6
+ command: "drift";
7
+ scope: string;
8
+ cache: string;
9
+ targetModule: string | null;
10
+ };
11
+ status: {
12
+ success: boolean;
13
+ score: number;
14
+ confidence: string;
15
+ belowFloor: boolean;
16
+ belowTarget: boolean;
17
+ blocks: string[];
18
+ };
19
+ counts: {
20
+ modules: number;
21
+ tasks: number;
22
+ validImplementations: number;
23
+ brokenImplementations: number;
24
+ validLinks: number;
25
+ brokenLinks: number;
26
+ outOfScopeLinks: number;
27
+ divergentRoutes: number;
28
+ validResources: number;
29
+ divergentResources: number;
30
+ realPersistence: number;
31
+ };
32
+ blockers: {
33
+ implementations: Array<Record<string, unknown>>;
34
+ links: Array<Record<string, unknown>>;
35
+ routes: Array<Record<string, unknown>>;
36
+ resources: Array<Record<string, unknown>>;
37
+ diagnostics: Array<Record<string, unknown>>;
38
+ tasksWithoutImplementation: Array<Record<string, unknown>>;
39
+ };
40
+ guidance: {
41
+ touchFirst: string[];
42
+ validate: string[];
43
+ loose: string[];
44
+ inferred: string[];
45
+ risks: string[];
46
+ };
47
+ authority: {
48
+ semaRemainsAuthority: true;
49
+ rawDriftForwarded: false;
50
+ freshValidationRequired: true;
51
+ omitted: string[];
52
+ };
53
+ telemetry: {
54
+ packChars: number;
55
+ packEstimatedTokens: number;
56
+ estimateMethod: "chars_div_4";
57
+ rawDriftEstimatedTokens: number;
58
+ reductionPercent: number;
59
+ selectedFields: string[];
60
+ };
61
+ };
62
+ export declare function criarDriftPack(resultado: ResultadoDrift, options?: {
63
+ targetModule?: string;
64
+ rawDriftChars?: number;
65
+ }): DriftPack;
@@ -0,0 +1,96 @@
1
+ function estimarTokens(chars) {
2
+ return Math.ceil(chars / 4);
3
+ }
4
+ function compactarRegistro(registro, campos) {
5
+ return Object.fromEntries(campos
6
+ .filter((campo) => registro[campo] !== undefined && registro[campo] !== null)
7
+ .map((campo) => [campo, registro[campo]]));
8
+ }
9
+ export function criarDriftPack(resultado, options = {}) {
10
+ const targetModule = options.targetModule ?? null;
11
+ const tarefas = resultado.tasks
12
+ .filter((task) => !targetModule || task.modulo === targetModule)
13
+ .filter((task) => task.semImplementacao || task.implsQuebrados > 0 || task.lacunas.length > 0)
14
+ .map((task) => compactarRegistro(task, [
15
+ "modulo", "task", "impls", "implsValidos", "implsQuebrados", "semImplementacao", "scoreSemantico",
16
+ "confiancaVinculo", "riscoOperacional", "lacunas", "arquivosProvaveisEditar", "checksSugeridos",
17
+ ]));
18
+ const base = {
19
+ schema: "sema.ai.drift-pack/v1",
20
+ selection: "deterministic_evidence_compaction",
21
+ source: {
22
+ command: "drift",
23
+ scope: resultado.escopo_aplicado.escopo,
24
+ cache: resultado.escopo_aplicado.cache?.modo ?? "unknown",
25
+ targetModule,
26
+ },
27
+ status: {
28
+ success: resultado.sucesso,
29
+ score: resultado.resumo_operacional.scoreMedio,
30
+ confidence: resultado.resumo_operacional.confiancaGeral,
31
+ belowFloor: resultado.resumo_operacional.pontuacaoAbaixoDoPiso,
32
+ belowTarget: resultado.resumo_operacional.pontuacaoAbaixoDoAlvo,
33
+ blocks: resultado.resumo_operacional.travasPontuacao,
34
+ },
35
+ counts: {
36
+ modules: resultado.modulos.length,
37
+ tasks: resultado.tasks.length,
38
+ validImplementations: resultado.impls_validos.length,
39
+ brokenImplementations: resultado.impls_quebrados.length,
40
+ validLinks: resultado.vinculos_validos.length,
41
+ brokenLinks: resultado.vinculos_quebrados.length,
42
+ outOfScopeLinks: resultado.vinculos_fora_do_escopo.length,
43
+ divergentRoutes: resultado.rotas_divergentes.length,
44
+ validResources: resultado.recursos_validos.length,
45
+ divergentResources: resultado.recursos_divergentes.length,
46
+ realPersistence: resultado.persistencia_real.length,
47
+ },
48
+ blockers: {
49
+ implementations: resultado.impls_quebrados.map((item) => compactarRegistro(item, ["modulo", "task", "origem", "caminho", "arquivo", "simbolo", "caminhoResolvido", "candidatos"])),
50
+ links: resultado.vinculos_quebrados.map((item) => compactarRegistro(item, ["modulo", "donoTipo", "dono", "tipo", "valor", "arquivo", "simbolo", "status", "confianca"])),
51
+ routes: resultado.rotas_divergentes.map((item) => compactarRegistro(item, ["modulo", "route", "metodo", "caminho", "motivo"])),
52
+ resources: resultado.recursos_divergentes.map((item) => compactarRegistro(item, ["modulo", "task", "categoria", "alvo", "arquivo", "origem", "tipo", "status"])),
53
+ diagnostics: resultado.diagnosticos.map((item) => compactarRegistro(item, ["tipo", "modulo", "task", "route", "arquivo", "severidade", "mensagem"])),
54
+ tasksWithoutImplementation: tarefas,
55
+ },
56
+ guidance: {
57
+ touchFirst: resultado.resumo_operacional.oQueTocar,
58
+ validate: resultado.resumo_operacional.oQueValidar,
59
+ loose: resultado.resumo_operacional.oQueEstaFrouxo,
60
+ inferred: resultado.resumo_operacional.oQueFoiInferido,
61
+ risks: resultado.resumo_operacional.riscosPrincipais,
62
+ },
63
+ authority: {
64
+ semaRemainsAuthority: true,
65
+ rawDriftForwarded: false,
66
+ freshValidationRequired: true,
67
+ omitted: [
68
+ "implementações válidas detalhadas",
69
+ "vínculos válidos detalhados",
70
+ "catálogo de arquivos e bytes lidos",
71
+ "cache interno e candidatos não bloqueantes",
72
+ ],
73
+ },
74
+ };
75
+ const packChars = JSON.stringify(base).length;
76
+ const rawDriftChars = options.rawDriftChars ?? 0;
77
+ return {
78
+ ...base,
79
+ telemetry: {
80
+ packChars,
81
+ packEstimatedTokens: estimarTokens(packChars),
82
+ estimateMethod: "chars_div_4",
83
+ rawDriftEstimatedTokens: estimarTokens(rawDriftChars),
84
+ reductionPercent: rawDriftChars === 0 ? 0 : Math.round((1 - packChars / rawDriftChars) * 10000) / 100,
85
+ selectedFields: [
86
+ "source",
87
+ "status",
88
+ "counts",
89
+ "blockers",
90
+ "guidance",
91
+ "authority",
92
+ ],
93
+ },
94
+ };
95
+ }
96
+ //# sourceMappingURL=driftPack.js.map
@@ -0,0 +1,47 @@
1
+ import type { AgentContextPack, CapacidadeIa } from "./agentContextTipos.js";
2
+ export type EntrypointPack = {
3
+ schema: "sema.ai.entrypoint-pack/v1";
4
+ selection: "deterministic_capacity_allowlist";
5
+ capacity: CapacidadeIa;
6
+ source: {
7
+ command: "contexto-ia";
8
+ entrypoint: string;
9
+ version: number;
10
+ };
11
+ context: {
12
+ objective: string;
13
+ readingOrder: string[];
14
+ capacityGuide: string[];
15
+ mandatoryRules: string[];
16
+ prohibitions: string[];
17
+ priorities: string[];
18
+ failClosed: string[];
19
+ policies: {
20
+ language: string;
21
+ governedCode: string;
22
+ timeout: string;
23
+ platform: string;
24
+ design: string;
25
+ };
26
+ onDemand: string[];
27
+ };
28
+ authority: {
29
+ semaRemainsAuthority: true;
30
+ rawAgentContextForwarded: false;
31
+ freshValidationRequired: true;
32
+ omitted: string[];
33
+ };
34
+ telemetry: {
35
+ packChars: number;
36
+ packEstimatedTokens: number;
37
+ estimateMethod: "chars_div_4";
38
+ rawAgentContextEstimatedTokens: number;
39
+ reductionPercent: number;
40
+ selectedFields: string[];
41
+ };
42
+ };
43
+ export declare function criarEntrypointPack(input: {
44
+ agentContextPack: AgentContextPack;
45
+ capacity: CapacidadeIa;
46
+ rawAgentContextChars?: number;
47
+ }): EntrypointPack;
@@ -0,0 +1,79 @@
1
+ function estimarTokens(chars) {
2
+ return Math.ceil(chars / 4);
3
+ }
4
+ export function criarEntrypointPack(input) {
5
+ const source = input.agentContextPack;
6
+ const base = {
7
+ schema: "sema.ai.entrypoint-pack/v1",
8
+ selection: "deterministic_capacity_allowlist",
9
+ capacity: input.capacity,
10
+ source: {
11
+ command: "contexto-ia",
12
+ entrypoint: source.entrypointCodex,
13
+ version: source.versao,
14
+ },
15
+ context: {
16
+ objective: source.objetivo,
17
+ readingOrder: source.ordemLeitura,
18
+ capacityGuide: source.guiaPorCapacidade[input.capacity],
19
+ mandatoryRules: source.regrasObrigatorias,
20
+ prohibitions: source.proibicoes,
21
+ priorities: source.prioridades,
22
+ failClosed: source.failClosed,
23
+ policies: {
24
+ language: source.politicaIdioma.regra,
25
+ governedCode: source.politicaCodigoGovernado.porCapacidade[input.capacity],
26
+ timeout: source.politicaTimeoutResumo.porCapacidade[input.capacity],
27
+ platform: source.politicaPlataforma.porCapacidade[input.capacity],
28
+ design: source.politicaDesignVisual.porCapacidade[input.capacity],
29
+ },
30
+ onDemand: [
31
+ "AGENTS.md",
32
+ "SEMA_BOOT.md",
33
+ "AGENT_CONTEXT_PACK.json",
34
+ "SEMA_INDEX.json",
35
+ "exemplos/",
36
+ "contratos/",
37
+ ],
38
+ },
39
+ authority: {
40
+ semaRemainsAuthority: true,
41
+ rawAgentContextForwarded: false,
42
+ freshValidationRequired: true,
43
+ omitted: [
44
+ "fontes e descoberta completas",
45
+ "exemplos oficiais completos",
46
+ "texto bruto sob demanda",
47
+ "guias e aliases de outras capacidades",
48
+ "políticas duplicadas fora da capacidade selecionada",
49
+ ],
50
+ },
51
+ };
52
+ const packChars = JSON.stringify(base).length;
53
+ const rawAgentContextChars = input.rawAgentContextChars ?? 0;
54
+ return {
55
+ ...base,
56
+ telemetry: {
57
+ packChars,
58
+ packEstimatedTokens: estimarTokens(packChars),
59
+ estimateMethod: "chars_div_4",
60
+ rawAgentContextEstimatedTokens: estimarTokens(rawAgentContextChars),
61
+ reductionPercent: rawAgentContextChars === 0 ? 0 : Math.round((1 - packChars / rawAgentContextChars) * 10000) / 100,
62
+ selectedFields: [
63
+ "capacity",
64
+ "source",
65
+ "context.objective",
66
+ "context.readingOrder",
67
+ "context.capacityGuide",
68
+ "context.mandatoryRules",
69
+ "context.prohibitions",
70
+ "context.priorities",
71
+ "context.failClosed",
72
+ "context.policies",
73
+ "context.onDemand",
74
+ "authority",
75
+ ],
76
+ },
77
+ };
78
+ }
79
+ //# sourceMappingURL=entrypointPack.js.map
@@ -13,6 +13,7 @@ export declare function resumirDriftPorModulo(modulo: string | null, caminho: st
13
13
  implsQuebrados: number;
14
14
  vinculosValidos: number;
15
15
  vinculosQuebrados: number;
16
+ vinculosForaDoEscopo: number;
16
17
  recursosValidos: number;
17
18
  recursosDivergentesCount: number;
18
19
  tasksSemImplementacao: number;
@@ -31,6 +32,7 @@ export declare function resumirDriftPorModulo(modulo: string | null, caminho: st
31
32
  rotasDivergentes: import("./drift.part01.js").RegistroRotaDivergente[];
32
33
  recursosDivergentes: import("./drift.part01.js").RegistroRecursoDrift[];
33
34
  vinculosQuebradosDetalhes: import("./drift.part01.js").RegistroVinculoDrift[];
35
+ vinculosForaDoEscopoDetalhes: import("./drift.part01.js").RegistroVinculoDrift[];
34
36
  };
35
37
  export declare function criarBriefingAgente(arquivo: string, modulo: string, ir: IrModulo | null, resumoDrift: ReturnType<typeof resumirDriftPorModulo>, resultadoDrift: Awaited<ReturnType<typeof analisarDriftLegado>>): {
36
38
  arquivo: string;
@@ -112,6 +112,9 @@ export function resumirDriftPorModulo(modulo, caminho, resultadoDrift) {
112
112
  const vinculosQuebrados = modulo
113
113
  ? resultadoDrift.vinculos_quebrados.filter((vinculo) => vinculo.modulo === modulo)
114
114
  : [];
115
+ const vinculosForaDoEscopo = modulo
116
+ ? resultadoDrift.vinculos_fora_do_escopo.filter((vinculo) => vinculo.modulo === modulo)
117
+ : [];
115
118
  const rotasDivergentes = modulo
116
119
  ? resultadoDrift.rotas_divergentes.filter((rota) => rota.modulo === modulo)
117
120
  : [];
@@ -136,6 +139,7 @@ export function resumirDriftPorModulo(modulo, caminho, resultadoDrift) {
136
139
  ...implsValidos.map((impl) => impl.arquivo).filter((item) => Boolean(item)),
137
140
  ...implsQuebrados.flatMap((impl) => impl.candidatos?.map((candidato) => candidato.arquivo) ?? []),
138
141
  ...vinculosValidos.map((vinculo) => vinculo.arquivo).filter((item) => Boolean(item)),
142
+ ...vinculosForaDoEscopo.map((vinculo) => vinculo.arquivo).filter((item) => Boolean(item)),
139
143
  ...recursosValidos.map((recurso) => recurso.arquivo).filter(Boolean),
140
144
  ...recursosDivergentes.map((recurso) => recurso.arquivo).filter(Boolean),
141
145
  ])].sort((a, b) => a.localeCompare(b, "pt-BR"));
@@ -176,6 +180,7 @@ export function resumirDriftPorModulo(modulo, caminho, resultadoDrift) {
176
180
  implsQuebrados: implsQuebrados.length,
177
181
  vinculosValidos: vinculosValidos.length,
178
182
  vinculosQuebrados: vinculosQuebrados.length,
183
+ vinculosForaDoEscopo: vinculosForaDoEscopo.length,
179
184
  recursosValidos: recursosValidos.length,
180
185
  recursosDivergentesCount: recursosDivergentes.length,
181
186
  tasksSemImplementacao: tasks.filter((task) => task.semImplementacao).length,
@@ -198,6 +203,7 @@ export function resumirDriftPorModulo(modulo, caminho, resultadoDrift) {
198
203
  rotasDivergentes,
199
204
  recursosDivergentes,
200
205
  vinculosQuebradosDetalhes: vinculosQuebrados,
206
+ vinculosForaDoEscopoDetalhes: vinculosForaDoEscopo,
201
207
  };
202
208
  }
203
209
  export function criarBriefingAgente(arquivo, modulo, ir, resumoDrift, resultadoDrift) {
@@ -8,9 +8,10 @@ import { importarProjetoLegado, resumoImportacao } from "./importador.js";
8
8
  import { analisarDriftLegado, assistirRenomeacaoSemantica, gerarMapaImpactoSemantico, } from "./drift.js";
9
9
  import { escreverArquivos, formatarAvisoArtefatosGeradosAcimaDoLimite, } from './fsGovernado.js';
10
10
  import { carregarModulos } from './carregarModulos.js';
11
- import { obterOpcao } from './cliArgs.js';
11
+ import { obterOpcao, possuiFlag } from './cliArgs.js';
12
12
  import { resumirDriftPorModulo } from "./index.part03.js";
13
13
  import { resolverAnaliseDriftConsultaCli, resolverOpcoesDriftCli } from "./index.part01.js";
14
+ import { criarDriftPack } from "./driftPack.js";
14
15
  export async function comandoInspecionar(entrada, emJson, cwd = process.cwd(), args = []) {
15
16
  const analiseDrift = resolverAnaliseDriftConsultaCli(args, "inspecionar");
16
17
  const alvo = entrada ? path.resolve(cwd, entrada) : cwd;
@@ -135,6 +136,11 @@ export async function comandoDrift(entrada, args, emJson, cwd = process.cwd()) {
135
136
  adiarDescobertaCodigo: opcoes.escopo !== "projeto",
136
137
  });
137
138
  const resultado = await analisarDriftLegado(contextoProjeto, opcoes);
139
+ if (possuiFlag(args, "--pacote")) {
140
+ const pacote = criarDriftPack(resultado, { rawDriftChars: JSON.stringify(resultado).length });
141
+ console.log(JSON.stringify(pacote, null, 2));
142
+ return resultado.sucesso ? 0 : 1;
143
+ }
138
144
  if (emJson) {
139
145
  console.log(JSON.stringify(resultado, null, 2));
140
146
  return resultado.sucesso ? 0 : 1;
@@ -173,6 +179,7 @@ export async function comandoDrift(entrada, args, emJson, cwd = process.cwd()) {
173
179
  console.log(`- Impl quebrados: ${resultado.impls_quebrados.length}`);
174
180
  console.log(`- Vinculos validos: ${resultado.vinculos_validos.length}`);
175
181
  console.log(`- Vinculos quebrados: ${resultado.vinculos_quebrados.length}`);
182
+ console.log(`- Vinculos fora do escopo (informativo): ${resultado.vinculos_fora_do_escopo.length}`);
176
183
  console.log(`- Rotas divergentes: ${resultado.rotas_divergentes.length}`);
177
184
  console.log(`- Recursos vivos validos: ${resultado.recursos_validos.length}`);
178
185
  console.log(`- Recursos vivos divergentes: ${resultado.recursos_divergentes.length}`);
@@ -229,6 +236,12 @@ export async function comandoDrift(entrada, args, emJson, cwd = process.cwd()) {
229
236
  console.log(` - ${vinculo.modulo}.${vinculo.dono} :: ${vinculo.tipo}=${vinculo.valor}`);
230
237
  }
231
238
  }
239
+ if (resultado.vinculos_fora_do_escopo.length > 0) {
240
+ console.log("- Vinculos fora do escopo (arquivo existe fora dos diretoriosCodigo; informativo):");
241
+ for (const vinculo of resultado.vinculos_fora_do_escopo) {
242
+ console.log(` - ${vinculo.modulo}.${vinculo.dono} :: ${vinculo.tipo}=${vinculo.valor} :: adicione "${vinculo.diretorioSugerido ?? "./"}" a diretoriosCodigo`);
243
+ }
244
+ }
232
245
  if (resultado.resumo_operacional.oQueTocar.length > 0) {
233
246
  console.log("- O que tocar primeiro:");
234
247
  for (const alvo of resultado.resumo_operacional.oQueTocar.slice(0, 8)) {