@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.
- package/dist/agentEntryPoints.js +9 -9
- package/dist/cliGrammar.js +17 -5
- package/dist/cliHelpTexto.js +5 -4
- package/dist/contextPack.d.ts +75 -0
- package/dist/contextPack.js +130 -0
- package/dist/drift.contrato.d.ts +1 -0
- package/dist/drift.contrato.js +1 -0
- package/dist/drift.part01.d.ts +4 -2
- package/dist/drift.part11.js +12 -1
- package/dist/drift.part14.d.ts +3 -0
- package/dist/drift.part14.js +108 -10
- package/dist/driftEscopo.d.ts +1 -0
- package/dist/driftEscopo.js +6 -0
- package/dist/driftPack.d.ts +65 -0
- package/dist/driftPack.js +96 -0
- package/dist/entrypointPack.d.ts +47 -0
- package/dist/entrypointPack.js +79 -0
- package/dist/index.part03.d.ts +2 -0
- package/dist/index.part03.js +6 -0
- package/dist/index.part05.js +14 -1
- package/dist/index.part06.js +51 -0
- package/dist/index.part07.d.ts +1 -1
- package/dist/index.part07.js +16 -2
- package/dist/index.part08.js +1 -1
- package/dist/indexPack.d.ts +54 -0
- package/dist/indexPack.js +140 -0
- package/dist/init/templates.part01.js +393 -393
- package/dist/init/templates.part02.js +189 -189
- package/dist/initCommand.js +38 -2
- package/dist/initTemplatesBackend.js +73 -73
- package/dist/initTemplatesFlutter.js +137 -137
- package/dist/initTemplatesRuntime.js +350 -350
- package/dist/initTemplatesWeb.js +309 -309
- package/dist/sync/index.js +35 -35
- package/docs/ai-workflow.md +1 -1
- package/docs/auth.md +26 -26
- package/docs/commands.md +3 -3
- package/docs/database.md +15 -15
- package/docs/env.md +16 -16
- package/docs/frontend.md +41 -41
- package/docs/i18n.md +15 -15
- package/exemplos/agendamento.sema +1 -1
- package/exemplos/assinatura.sema +1 -1
- package/exemplos/auditoria.sema +1 -1
- package/exemplos/autenticacao.sema +1 -1
- package/exemplos/author_obra_comum.sema +1 -1
- package/exemplos/author_tema_sensivel.sema +1 -1
- package/exemplos/automacao.sema +1 -1
- package/exemplos/cadastro_usuario.sema +1 -1
- package/exemplos/calculadora.sema +1 -1
- package/exemplos/crud_simples.sema +1 -1
- package/exemplos/estoque.sema +1 -1
- package/exemplos/exportacao.sema +1 -1
- package/exemplos/fila.sema +1 -1
- package/exemplos/integracao_externa.sema +1 -1
- package/exemplos/multi_tenant.sema +1 -1
- package/exemplos/notificacao.sema +1 -1
- package/exemplos/operacao_estrategia.sema +132 -132
- package/exemplos/operacao_estrategia_discovery.sema +220 -220
- package/exemplos/operacao_estrategia_fluxo.sema +114 -114
- package/exemplos/operacao_estrategia_gates.sema +106 -106
- package/exemplos/operacao_estrategia_quarentena.sema +133 -133
- package/exemplos/operacao_estrategia_rollout.sema +124 -124
- package/exemplos/pagamento.sema +1 -1
- package/exemplos/pagamento_dominio.sema +1 -1
- package/exemplos/pedido.sema +1 -1
- package/exemplos/permissao.sema +1 -1
- package/exemplos/persistencia_vendor_first.sema +1 -1
- package/exemplos/php_crud.sema +170 -170
- package/exemplos/profile_conversas.sema +165 -165
- package/exemplos/profile_game.sema +1 -1
- package/exemplos/profile_legal.sema +1 -1
- package/exemplos/profile_ops.sema +1 -1
- package/exemplos/profile_research.sema +1 -1
- package/exemplos/profile_software.sema +1 -1
- package/exemplos/profile_workflow_n8n.sema +1 -1
- package/exemplos/relatorio.sema +1 -1
- package/exemplos/replica_analitica_erp.sema +1 -1
- package/exemplos/testes_embutidos.sema +1 -1
- package/exemplos/tratamento_erro.sema +1 -1
- package/exemplos/upload_arquivo.sema +1 -1
- package/exemplos/webhook.sema +1 -1
- package/node_modules/@sema/gerador-cpp/dist/index.js +176 -176
- package/node_modules/@sema/gerador-css/dist/index.part01.js +10 -10
- package/node_modules/@sema/gerador-dotnet/dist/index.js +169 -169
- package/node_modules/@sema/gerador-html/dist/index.js +17 -17
- package/node_modules/@sema/gerador-python/dist/index.part02.js +3 -3
- package/node_modules/@sema/gerador-typescript/dist/index.part02.js +11 -11
- package/node_modules/@sema/nucleo/dist/diagnosticos/melhorador.js +42 -42
- package/package.json +1 -1
package/dist/drift.part14.js
CHANGED
|
@@ -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
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
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) {
|
package/dist/driftEscopo.d.ts
CHANGED
|
@@ -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>;
|
package/dist/driftEscopo.js
CHANGED
|
@@ -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
|
package/dist/index.part03.d.ts
CHANGED
|
@@ -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;
|
package/dist/index.part03.js
CHANGED
|
@@ -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) {
|
package/dist/index.part05.js
CHANGED
|
@@ -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)) {
|