@semacode/cli 4.0.0 → 4.1.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/cliGrammar.js +1 -2
- package/dist/cliHelpTexto.js +2 -2
- package/dist/contextPack.d.ts +1 -1
- package/dist/contextPack.js +4 -1
- package/dist/index.part06.js +36 -56
- package/dist/indexPack.d.ts +1 -1
- package/dist/indexPack.js +23 -17
- package/package.json +1 -1
package/dist/cliGrammar.js
CHANGED
|
@@ -428,11 +428,10 @@ function validarResumo(args, promptCurto) {
|
|
|
428
428
|
const pacote = parsed.flags.has("--pacote");
|
|
429
429
|
const somentePacote = parsed.flags.has("--somente-pacote");
|
|
430
430
|
const pedido = valorOpcao(parsed, "--pedido");
|
|
431
|
-
const combinacaoPacoteValida = pacote === Boolean(pedido);
|
|
432
431
|
return tamanhos.length <= 1
|
|
433
432
|
&& (!modo || MODOS_RESUMO.has(modo))
|
|
434
433
|
&& (promptCurto || validarModoCache(parsed, "--drift"))
|
|
435
|
-
&& (promptCurto ? !pacote && !pedido && !somentePacote :
|
|
434
|
+
&& (promptCurto ? !pacote && !pedido && !somentePacote : true);
|
|
436
435
|
}
|
|
437
436
|
function validarComandoBasico(comando, args) {
|
|
438
437
|
const aliasesGeracao = { "-a": "--alvo", "-s": "--saida" };
|
package/dist/cliHelpTexto.js
CHANGED
|
@@ -102,7 +102,7 @@ export function criarAjudaRaiz(versao) {
|
|
|
102
102
|
"fraca: sema resumo <arquivo> --micro --drift none --json (contrato compacto; implementação não avaliada)",
|
|
103
103
|
"média: sema resumo <arquivo> --curto --drift none --json + sema drift <arquivo> --cache fresh --json",
|
|
104
104
|
"forte: sema contexto-ia <arquivo.sema> --saida <diretorio> --json",
|
|
105
|
-
"context-pack: sema resumo <arquivo.sema> --micro --para mudanca --drift none --
|
|
105
|
+
"context-pack: sema resumo <arquivo.sema> --micro --para mudanca --drift none --json (compactação determinística automática; use --pedido para focar a seleção)",
|
|
106
106
|
]),
|
|
107
107
|
"",
|
|
108
108
|
renderizarSecaoAscii("Comandos principais", [
|
|
@@ -134,7 +134,7 @@ export function criarAjudaRaiz(versao) {
|
|
|
134
134
|
renderizarSecaoAscii("Ajuda IA-first", [
|
|
135
135
|
"sema ajuda-ia",
|
|
136
136
|
"sema starter-ia",
|
|
137
|
-
"sema resumo <arquivo-ou-pasta> [--micro|--curto|--medio] [--para <resumo|onboarding|review|mudanca|bug|arquitetura>] [--drift <none|cache|fresh>] [--saida <diretorio>] [--raiz] [--
|
|
137
|
+
"sema resumo <arquivo-ou-pasta> [--micro|--curto|--medio] [--para <resumo|onboarding|review|mudanca|bug|arquitetura>] [--drift <none|cache|fresh>] [--saida <diretorio>] [--raiz] [--pedido <intencao>] [--somente-pacote] [--json]",
|
|
138
138
|
"sema prompt-curto <arquivo-ou-pasta> [--micro|--curto|--medio] [--para <resumo|onboarding|review|mudanca|bug|arquitetura>] [--json]",
|
|
139
139
|
"sema prompt-ia",
|
|
140
140
|
"sema prompt-ia-ui",
|
package/dist/contextPack.d.ts
CHANGED
|
@@ -65,7 +65,7 @@ export type ContextPackResult = {
|
|
|
65
65
|
export declare function selecionarContexto(payload: ContextPackPayload, request: string): ContextPackResult;
|
|
66
66
|
export declare function criarContextPackAPartirDoResumo(input: {
|
|
67
67
|
resumo: ResumoSemanticoModuloIa;
|
|
68
|
-
pedido
|
|
68
|
+
pedido?: string;
|
|
69
69
|
modo: string;
|
|
70
70
|
tamanho: TamanhoResumoIa;
|
|
71
71
|
analiseDrift: ContextPackPayload["analiseDrift"];
|
package/dist/contextPack.js
CHANGED
|
@@ -15,6 +15,8 @@ function normalizedTokens(value) {
|
|
|
15
15
|
.filter((token) => token.length >= 4);
|
|
16
16
|
}
|
|
17
17
|
function selectRelevantTasks(tasks, request) {
|
|
18
|
+
if (request.startsWith("resumo:"))
|
|
19
|
+
return tasks.slice(0, 8);
|
|
18
20
|
const requestTokens = new Set(normalizedTokens(request));
|
|
19
21
|
const intentRoots = ["cancel", "notific", "export", "reagend", "registr", "consult"];
|
|
20
22
|
const rootedMatches = intentRoots
|
|
@@ -115,6 +117,7 @@ export function selecionarContexto(payload, request) {
|
|
|
115
117
|
};
|
|
116
118
|
}
|
|
117
119
|
export function criarContextPackAPartirDoResumo(input) {
|
|
120
|
+
const pedido = input.pedido?.trim() || `resumo:${input.tamanho}`;
|
|
118
121
|
return selecionarContexto({
|
|
119
122
|
geradoEm: input.resumo.geradoEm,
|
|
120
123
|
arquivo: input.resumo.arquivo,
|
|
@@ -125,6 +128,6 @@ export function criarContextPackAPartirDoResumo(input) {
|
|
|
125
128
|
guiaPorCapacidade: input.guiaPorCapacidade,
|
|
126
129
|
texto: input.texto,
|
|
127
130
|
resumo: input.resumo,
|
|
128
|
-
},
|
|
131
|
+
}, pedido);
|
|
129
132
|
}
|
|
130
133
|
//# sourceMappingURL=contextPack.js.map
|
package/dist/index.part06.js
CHANGED
|
@@ -202,8 +202,8 @@ export async function comandoAjudaIa() {
|
|
|
202
202
|
]));
|
|
203
203
|
console.log("");
|
|
204
204
|
console.log(renderizarSecaoAscii("Capacidade de IA", [
|
|
205
|
-
"fraca: `sema resumo <arquivo> --micro --drift none --json`
|
|
206
|
-
"média: `sema resumo <arquivo> --curto --drift none --json`
|
|
205
|
+
"fraca: `sema resumo <arquivo> --micro --drift none --json` já devolve o context-pack compacto sem inventar evidência de implementação",
|
|
206
|
+
"média: `sema resumo <arquivo> --curto --drift none --json` já compacta o resumo; use `sema drift <arquivo> --cache fresh --json` quando precisar de evidência do código",
|
|
207
207
|
"forte: `sema contexto-ia <arquivo.sema> --saida <diretorio> --json` materializa o pacote completo",
|
|
208
208
|
]));
|
|
209
209
|
console.log("");
|
|
@@ -214,7 +214,7 @@ export async function comandoAjudaIa() {
|
|
|
214
214
|
"Use `sema interativo pipelines --json` para jogos, simulações e híbridos 3D, 2D, retro, texto, XR ou headless.",
|
|
215
215
|
"Use `sema sync-codex` para regenerar o contexto governado do Codex na raiz.",
|
|
216
216
|
"Use `sema instalar-exemplos` para materializar `exemplos/` oficiais sem sobrescrever arquivos locais.",
|
|
217
|
-
"Use `sema resumo <arquivo> --micro --para onboarding --drift none --json` para IA fraca; o
|
|
217
|
+
"Use `sema resumo <arquivo> --micro --para onboarding --drift none --json` para IA fraca; o context-pack é automático e campos derivados ficam não avaliados.",
|
|
218
218
|
"Se `sema resumo` ou outro gate estourar timeout local, aumente o timeout e tente de novo; timeout do agente nao e falha do Sema.",
|
|
219
219
|
"Use `sema prompt-curto <arquivo> --curto --para mudanca` para colar contexto em modelo gratuito.",
|
|
220
220
|
"Use `sema prompt-ia`, `sema prompt-ia-ui`, `sema prompt-ia-react` e `sema prompt-ia-sema-primeiro` conforme a tarefa.",
|
|
@@ -290,8 +290,8 @@ export async function comandoResumo(entrada, args, emJson) {
|
|
|
290
290
|
const tamanho = normalizarTamanhoResumo(args);
|
|
291
291
|
const modo = normalizarModoResumo(obterOpcao(args, "--para"));
|
|
292
292
|
const pedido = obterOpcao(args, "--pedido");
|
|
293
|
-
const pacoteSolicitado = possuiFlag(args, "--pacote");
|
|
294
293
|
const somentePacote = possuiFlag(args, "--somente-pacote");
|
|
294
|
+
const pedidoExplícito = obterOpcao(args, "--pedido")?.trim();
|
|
295
295
|
const pastaSaida = obterOpcao(args, "--saida");
|
|
296
296
|
const escreverNaRaiz = possuiFlag(args, "--raiz");
|
|
297
297
|
const alvo = entrada ? path.resolve(process.cwd(), entrada) : process.cwd();
|
|
@@ -304,22 +304,20 @@ export async function comandoResumo(entrada, args, emJson) {
|
|
|
304
304
|
const texto = tamanho === "medio"
|
|
305
305
|
? renderizarResumoModuloMarkdown(resumoSemantico, modo, guiaPorCapacidade)
|
|
306
306
|
: renderizarResumoModuloTexto(resumoSemantico, tamanho, modo);
|
|
307
|
-
const contextPack =
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
})
|
|
322
|
-
: null;
|
|
307
|
+
const contextPack = criarContextPackAPartirDoResumo({
|
|
308
|
+
resumo: resumoSemantico,
|
|
309
|
+
pedido: pedidoExplícito,
|
|
310
|
+
modo,
|
|
311
|
+
tamanho,
|
|
312
|
+
analiseDrift: {
|
|
313
|
+
modo: contexto.drift.modo,
|
|
314
|
+
executada: contexto.drift.executada,
|
|
315
|
+
sucesso: contexto.drift.sucesso,
|
|
316
|
+
aviso: contexto.drift.aviso,
|
|
317
|
+
},
|
|
318
|
+
guiaPorCapacidade,
|
|
319
|
+
texto,
|
|
320
|
+
});
|
|
323
321
|
let pastaResumo;
|
|
324
322
|
let artefatosCompactos = [];
|
|
325
323
|
if (pastaSaida) {
|
|
@@ -333,6 +331,10 @@ export async function comandoResumo(entrada, args, emJson) {
|
|
|
333
331
|
console.log(JSON.stringify(contextPack, null, 2));
|
|
334
332
|
return contexto.drift.sucesso === false ? 1 : 0;
|
|
335
333
|
}
|
|
334
|
+
if (somentePacote) {
|
|
335
|
+
console.log(JSON.stringify(contextPack, null, 2));
|
|
336
|
+
return contexto.drift.sucesso === false ? 1 : 0;
|
|
337
|
+
}
|
|
336
338
|
console.log(JSON.stringify({
|
|
337
339
|
comando: "resumo",
|
|
338
340
|
modo,
|
|
@@ -350,10 +352,7 @@ export async function comandoResumo(entrada, args, emJson) {
|
|
|
350
352
|
avisos: analiseDrift.avisos,
|
|
351
353
|
cache: contexto.drift.drift?.escopo_aplicado.cache ?? null,
|
|
352
354
|
},
|
|
353
|
-
|
|
354
|
-
resumo: resumoSemantico,
|
|
355
|
-
texto,
|
|
356
|
-
...(contextPack ? { contextPack } : {}),
|
|
355
|
+
contextPack,
|
|
357
356
|
}, null, 2));
|
|
358
357
|
return contexto.drift.sucesso === false ? 1 : 0;
|
|
359
358
|
}
|
|
@@ -361,34 +360,22 @@ export async function comandoResumo(entrada, args, emJson) {
|
|
|
361
360
|
console.log(`Resumo IA-first gerado em ${pastaResumo}`);
|
|
362
361
|
console.log("");
|
|
363
362
|
}
|
|
364
|
-
|
|
365
|
-
console.log(JSON.stringify(contextPack, null, 2));
|
|
366
|
-
return contexto.drift.sucesso === false ? 1 : 0;
|
|
367
|
-
}
|
|
368
|
-
console.log(texto);
|
|
363
|
+
console.log(JSON.stringify(contextPack, null, 2));
|
|
369
364
|
return contexto.drift.sucesso === false ? 1 : 0;
|
|
370
365
|
}
|
|
371
366
|
const resumoProjeto = await gerarResumoProjetoIa(alvo, pastaSaida, escreverNaRaiz, analiseDrift);
|
|
372
|
-
const arquivoResumo = tamanho === "micro"
|
|
373
|
-
? "SEMA_BRIEF.micro.txt"
|
|
374
|
-
: tamanho === "curto"
|
|
375
|
-
? "SEMA_BRIEF.curto.txt"
|
|
376
|
-
: "SEMA_BRIEF.md";
|
|
377
|
-
const texto = await readFile(path.join(resumoProjeto.pastaSaida, arquivoResumo), "utf8");
|
|
378
367
|
const indexTexto = await readFile(path.join(resumoProjeto.pastaSaida, "SEMA_INDEX.json"), "utf8").catch(() => "");
|
|
379
|
-
const indexPack =
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
})
|
|
389
|
-
: null;
|
|
368
|
+
const indexPack = selecionarIndiceContexto({
|
|
369
|
+
modulos: resumoProjeto.modulos,
|
|
370
|
+
request: pedidoExplícito ?? `resumo:${tamanho}`,
|
|
371
|
+
baseProject: resumoProjeto.baseProjeto,
|
|
372
|
+
generatedAt: resumoProjeto.geradoEm,
|
|
373
|
+
mode: modo,
|
|
374
|
+
drift: resumoProjeto.analiseDrift.modo,
|
|
375
|
+
sourceIndexChars: indexTexto.length,
|
|
376
|
+
});
|
|
390
377
|
if (emJson) {
|
|
391
|
-
if (somentePacote
|
|
378
|
+
if (somentePacote) {
|
|
392
379
|
console.log(JSON.stringify(indexPack, null, 2));
|
|
393
380
|
return resumoProjeto.analiseDrift.sucesso === false ? 1 : 0;
|
|
394
381
|
}
|
|
@@ -404,20 +391,13 @@ export async function comandoResumo(entrada, args, emJson) {
|
|
|
404
391
|
...resumoProjeto.analiseDrift,
|
|
405
392
|
avisos: analiseDrift.avisos,
|
|
406
393
|
},
|
|
407
|
-
|
|
408
|
-
modulos: resumoProjeto.modulos,
|
|
409
|
-
texto,
|
|
410
|
-
...(indexPack ? { indexPack } : {}),
|
|
394
|
+
indexPack,
|
|
411
395
|
}, null, 2));
|
|
412
396
|
return resumoProjeto.analiseDrift.sucesso === false ? 1 : 0;
|
|
413
397
|
}
|
|
414
398
|
console.log(`Resumo IA-first do projeto gerado em ${resumoProjeto.pastaSaida}`);
|
|
415
399
|
console.log("");
|
|
416
|
-
|
|
417
|
-
console.log(JSON.stringify(indexPack, null, 2));
|
|
418
|
-
return resumoProjeto.analiseDrift.sucesso === false ? 1 : 0;
|
|
419
|
-
}
|
|
420
|
-
console.log(texto);
|
|
400
|
+
console.log(JSON.stringify(indexPack, null, 2));
|
|
421
401
|
return resumoProjeto.analiseDrift.sucesso === false ? 1 : 0;
|
|
422
402
|
}
|
|
423
403
|
//# sourceMappingURL=index.part06.js.map
|
package/dist/indexPack.d.ts
CHANGED
|
@@ -2,7 +2,7 @@ import type { ResumoSemanticoModuloIa } from "./index.part01.js";
|
|
|
2
2
|
type EntradaIndice = Pick<ResumoSemanticoModuloIa, "arquivo" | "modulo" | "faz" | "tarefasPrincipais" | "regrasCriticas" | "efeitos" | "riscosPrincipais" | "lacunas" | "arquivosProvaveis" | "checksSugeridos" | "testesMinimos" | "arquivosProvaveisEditar">;
|
|
3
3
|
export type IndexPack = {
|
|
4
4
|
schema: "sema.ai.index-pack/v1";
|
|
5
|
-
selection: "deterministic_weighted_match";
|
|
5
|
+
selection: "deterministic_weighted_match" | "deterministic_summary_projection";
|
|
6
6
|
request: string;
|
|
7
7
|
source: {
|
|
8
8
|
command: "resumo-projeto";
|
package/dist/indexPack.js
CHANGED
|
@@ -17,7 +17,9 @@ function tokens(value) {
|
|
|
17
17
|
function correspondeToken(campo, pedido) {
|
|
18
18
|
return tokens(campo).some((token) => [...pedido].some((alvo) => token.startsWith(alvo) || alvo.startsWith(token)));
|
|
19
19
|
}
|
|
20
|
-
function selecionarValores(values, requestTokens, maximo) {
|
|
20
|
+
function selecionarValores(values, requestTokens, maximo, projetarResumoInteiro) {
|
|
21
|
+
if (projetarResumoInteiro)
|
|
22
|
+
return values.slice(0, maximo);
|
|
21
23
|
return values
|
|
22
24
|
.map((value, index) => ({
|
|
23
25
|
value,
|
|
@@ -32,7 +34,7 @@ function selecionarValores(values, requestTokens, maximo) {
|
|
|
32
34
|
function estimarTokens(chars) {
|
|
33
35
|
return Math.ceil(chars / 4);
|
|
34
36
|
}
|
|
35
|
-
function compactarModulo(modulo, requestTokens) {
|
|
37
|
+
function compactarModulo(modulo, requestTokens, projetarResumoInteiro) {
|
|
36
38
|
const tarefas = lista(modulo.tarefasPrincipais);
|
|
37
39
|
const regras = lista(modulo.regrasCriticas);
|
|
38
40
|
const efeitos = lista(modulo.efeitos);
|
|
@@ -52,36 +54,40 @@ function compactarModulo(modulo, requestTokens) {
|
|
|
52
54
|
["lacunas", lacunas, 1],
|
|
53
55
|
["arquivos", [...arquivos, ...arquivosEditar], 1],
|
|
54
56
|
];
|
|
55
|
-
const relevanceScore = camposComPeso.reduce((total, [, values, weight]) => total + values.reduce((subtotal, value) => subtotal + (correspondeToken(value, requestTokens) ? weight : 0), 0), 0);
|
|
56
|
-
if (relevanceScore === 0)
|
|
57
|
+
const relevanceScore = projetarResumoInteiro ? 1 : camposComPeso.reduce((total, [, values, weight]) => total + values.reduce((subtotal, value) => subtotal + (correspondeToken(value, requestTokens) ? weight : 0), 0), 0);
|
|
58
|
+
if (!projetarResumoInteiro && relevanceScore === 0)
|
|
57
59
|
return null;
|
|
58
60
|
return {
|
|
59
61
|
module: texto(modulo.modulo),
|
|
60
62
|
contract: texto(modulo.arquivo),
|
|
61
63
|
relevanceScore,
|
|
62
64
|
purpose: texto(modulo.faz),
|
|
63
|
-
relevantTasks: selecionarValores(tarefas, requestTokens, 8),
|
|
64
|
-
criticalRules: selecionarValores(regras, requestTokens, 8),
|
|
65
|
-
effects: selecionarValores(efeitos, requestTokens, 6),
|
|
66
|
-
risks: selecionarValores(riscos, requestTokens, 6),
|
|
67
|
-
knownGaps: selecionarValores(lacunas, requestTokens, 6),
|
|
68
|
-
likelyFiles: selecionarValores(arquivos, requestTokens, 8),
|
|
69
|
-
filesToEdit: selecionarValores(arquivosEditar, requestTokens, 8),
|
|
70
|
-
requiredChecks: selecionarValores(checks, requestTokens, 6),
|
|
71
|
-
minimumTests: selecionarValores(testes, requestTokens, 6),
|
|
65
|
+
relevantTasks: selecionarValores(tarefas, requestTokens, 8, projetarResumoInteiro),
|
|
66
|
+
criticalRules: selecionarValores(regras, requestTokens, 8, projetarResumoInteiro),
|
|
67
|
+
effects: selecionarValores(efeitos, requestTokens, 6, projetarResumoInteiro),
|
|
68
|
+
risks: selecionarValores(riscos, requestTokens, 6, projetarResumoInteiro),
|
|
69
|
+
knownGaps: selecionarValores(lacunas, requestTokens, 6, projetarResumoInteiro),
|
|
70
|
+
likelyFiles: selecionarValores(arquivos, requestTokens, 8, projetarResumoInteiro),
|
|
71
|
+
filesToEdit: selecionarValores(arquivosEditar, requestTokens, 8, projetarResumoInteiro),
|
|
72
|
+
requiredChecks: selecionarValores(checks, requestTokens, 6, projetarResumoInteiro),
|
|
73
|
+
minimumTests: selecionarValores(testes, requestTokens, 6, projetarResumoInteiro),
|
|
72
74
|
};
|
|
73
75
|
}
|
|
74
76
|
export function selecionarIndiceContexto(input) {
|
|
75
77
|
const request = input.request.trim();
|
|
76
78
|
const requestTokens = new Set(tokens(request));
|
|
79
|
+
const projetarResumoInteiro = request.length === 0 || request.startsWith("resumo:");
|
|
80
|
+
const selection = projetarResumoInteiro
|
|
81
|
+
? "deterministic_summary_projection"
|
|
82
|
+
: "deterministic_weighted_match";
|
|
77
83
|
const matches = input.modulos
|
|
78
|
-
.map((modulo) => compactarModulo(modulo, requestTokens))
|
|
84
|
+
.map((modulo) => compactarModulo(modulo, requestTokens, projetarResumoInteiro))
|
|
79
85
|
.filter((item) => item !== null)
|
|
80
86
|
.sort((a, b) => b.relevanceScore - a.relevanceScore || a.module.localeCompare(b.module, "pt-BR"))
|
|
81
|
-
.slice(0, 8);
|
|
87
|
+
.slice(0, projetarResumoInteiro ? input.modulos.length : 8);
|
|
82
88
|
const base = {
|
|
83
89
|
schema: "sema.ai.index-pack/v1",
|
|
84
|
-
selection
|
|
90
|
+
selection,
|
|
85
91
|
request,
|
|
86
92
|
source: {
|
|
87
93
|
command: "resumo-projeto",
|
|
@@ -99,7 +105,7 @@ export function selecionarIndiceContexto(input) {
|
|
|
99
105
|
omitted: [
|
|
100
106
|
"SEMA_INDEX.json completo",
|
|
101
107
|
"agentContextPack duplicado",
|
|
102
|
-
"módulos
|
|
108
|
+
"módulos e campos fora do orçamento da projeção compacta",
|
|
103
109
|
"catálogo e arquivos não relacionados ao pedido",
|
|
104
110
|
],
|
|
105
111
|
},
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@semacode/cli",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.1.0",
|
|
4
4
|
"description": "Local-first semantic governance CLI for AI agents, proven with Claude, Codex, zCode (GLM) and Kimi: contracts, drift, impact, docs gates, and code generation.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"icon": "logo.png",
|