expxdev 0.1.1 → 0.3.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/README.md +459 -72
- package/dist/cli/expx.d.ts +2 -0
- package/dist/cli/expx.js +55 -6
- package/dist/cli/expx.js.map +1 -1
- package/dist/cli/init.js +6 -2
- package/dist/cli/init.js.map +1 -1
- package/dist/cli/perguntar.d.ts +37 -0
- package/dist/cli/perguntar.js +76 -0
- package/dist/cli/perguntar.js.map +1 -0
- package/dist/cli/wizard.d.ts +21 -0
- package/dist/cli/wizard.js +101 -0
- package/dist/cli/wizard.js.map +1 -0
- package/dist/doctor/verificadores.js +97 -1
- package/dist/doctor/verificadores.js.map +1 -1
- package/dist/harness/hooks.d.ts +27 -0
- package/dist/harness/hooks.js +36 -0
- package/dist/harness/hooks.js.map +1 -0
- package/dist/harness/settings.d.ts +2 -1
- package/dist/harness/settings.js +40 -2
- package/dist/harness/settings.js.map +1 -1
- package/dist/nucleo/caminhos.d.ts +1 -1
- package/dist/nucleo/catalogo.d.ts +1 -1
- package/dist/nucleo/catalogo.js +7 -1
- package/dist/nucleo/catalogo.js.map +1 -1
- package/dist/nucleo/layout.d.ts +3 -2
- package/dist/nucleo/layout.js +37 -1
- package/dist/nucleo/layout.js.map +1 -1
- package/dist/nucleo/versao.d.ts +1 -1
- package/dist/parser/conformidade/regras.d.ts +1 -0
- package/dist/parser/conformidade/regras.js +24 -0
- package/dist/parser/conformidade/regras.js.map +1 -1
- package/dist/parser/esquema/enums.d.ts +19 -0
- package/dist/parser/esquema/enums.js +18 -0
- package/dist/parser/esquema/enums.js.map +1 -1
- package/dist/parser/esquema/evento.d.ts +123 -0
- package/dist/parser/esquema/evento.js +141 -0
- package/dist/parser/esquema/evento.js.map +1 -0
- package/dist/parser/leitura/rejeicao.d.ts +9 -0
- package/dist/parser/leitura/rejeicao.js +56 -0
- package/dist/parser/leitura/rejeicao.js.map +1 -1
- package/dist/parser/memoria/ler.d.ts +38 -0
- package/dist/parser/memoria/ler.js +46 -0
- package/dist/parser/memoria/ler.js.map +1 -0
- package/dist/parser/memoria/projetar.d.ts +3 -0
- package/dist/parser/memoria/projetar.js +132 -0
- package/dist/parser/memoria/projetar.js.map +1 -0
- package/dist/parser/memoria/tipos.d.ts +155 -0
- package/dist/parser/memoria/tipos.js +97 -0
- package/dist/parser/memoria/tipos.js.map +1 -0
- package/dist/parser/projeto/montar.d.ts +17 -0
- package/dist/parser/projeto/montar.js +17 -0
- package/dist/parser/projeto/montar.js.map +1 -1
- package/dist/plugin/montagem.d.ts +7 -0
- package/dist/plugin/montagem.js +22 -2
- package/dist/plugin/montagem.js.map +1 -1
- package/dist/servidor/http.js +5 -0
- package/dist/servidor/http.js.map +1 -1
- package/dist/servidor/observador.js +5 -1
- package/dist/servidor/observador.js.map +1 -1
- package/dist/teste/repo-fixture.d.ts +7 -0
- package/dist/teste/repo-fixture.js +18 -0
- package/dist/teste/repo-fixture.js.map +1 -1
- package/nucleo/README.md +79 -0
- package/nucleo/hooks/expx-rastro.sh +261 -0
- package/package.json +2 -1
- package/ui/dist/assets/index-BNE_RJrV.js +15 -0
- package/ui/dist/index.html +1 -1
- package/ui/dist/assets/index-BmDTogQZ.js +0 -14
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { Ferramenta } from "./enums.js";
|
|
3
|
+
/**
|
|
4
|
+
* Contrato `expx-eventos` v1 — a linha do rastro.
|
|
5
|
+
*
|
|
6
|
+
* Fonte única da regra das doze chaves. Ela já esteve escrita à mão em dois
|
|
7
|
+
* lugares (`runx/hooks/testes/testar.sh` e `stackx/hooks/stackx/_rastro.py`),
|
|
8
|
+
* e as duas listas divergiram do que as skills realmente gravam.
|
|
9
|
+
*/
|
|
10
|
+
/** As doze chaves obrigatórias, na ordem do contrato. */
|
|
11
|
+
export const CHAVES_EVENTO = [
|
|
12
|
+
"ts",
|
|
13
|
+
"expx_eventos",
|
|
14
|
+
"trabalho_id",
|
|
15
|
+
"ferramenta",
|
|
16
|
+
"origem",
|
|
17
|
+
"evento",
|
|
18
|
+
"fase",
|
|
19
|
+
"task",
|
|
20
|
+
"agente",
|
|
21
|
+
"resultado",
|
|
22
|
+
"detalhe",
|
|
23
|
+
"arquivos",
|
|
24
|
+
];
|
|
25
|
+
/**
|
|
26
|
+
* Chaves extras que o contrato declara, por skill. Extras existem porque a
|
|
27
|
+
* alternativa — espremer a informação em `detalhe` — perde o dado para sempre.
|
|
28
|
+
*/
|
|
29
|
+
export const EXTRAS_EVENTO = ["hook", "faixa"];
|
|
30
|
+
export const Origem = z.enum(["hook", "skill", "agente"]);
|
|
31
|
+
export const EventoNome = z.enum([
|
|
32
|
+
"fase_iniciada",
|
|
33
|
+
"fase_concluida",
|
|
34
|
+
"task_iniciada",
|
|
35
|
+
"task_concluida",
|
|
36
|
+
"task_bloqueada",
|
|
37
|
+
"suite_executada",
|
|
38
|
+
"arquivo_alterado",
|
|
39
|
+
"regra_violada",
|
|
40
|
+
"acao_bloqueada",
|
|
41
|
+
"agente_iniciado",
|
|
42
|
+
"agente_concluido",
|
|
43
|
+
"veredito_emitido",
|
|
44
|
+
"commit_criado",
|
|
45
|
+
"pr_aberto",
|
|
46
|
+
]);
|
|
47
|
+
export const Agente = z.enum([
|
|
48
|
+
"principal",
|
|
49
|
+
"auditor-plano",
|
|
50
|
+
"revisor-testes",
|
|
51
|
+
"qa",
|
|
52
|
+
"investigador",
|
|
53
|
+
"cartografo",
|
|
54
|
+
"revisor-diff",
|
|
55
|
+
"analista-de-conflito",
|
|
56
|
+
"avaliador-de-raio",
|
|
57
|
+
]);
|
|
58
|
+
/** Timestamp do rastro: ISO-8601 em UTC, com `Z` (R4). */
|
|
59
|
+
export const TimestampUtc = z
|
|
60
|
+
.string()
|
|
61
|
+
.regex(/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}Z$/, "ts deve ser AAAA-MM-DDTHH:MM:SSZ");
|
|
62
|
+
export const LinhaEvento = z
|
|
63
|
+
.object({
|
|
64
|
+
ts: TimestampUtc,
|
|
65
|
+
expx_eventos: z.literal(1),
|
|
66
|
+
trabalho_id: z.string().min(1),
|
|
67
|
+
ferramenta: Ferramenta,
|
|
68
|
+
origem: Origem,
|
|
69
|
+
evento: EventoNome,
|
|
70
|
+
fase: z.string().nullable(),
|
|
71
|
+
task: z.string().nullable(),
|
|
72
|
+
agente: Agente,
|
|
73
|
+
resultado: z.string().min(1),
|
|
74
|
+
detalhe: z.string(),
|
|
75
|
+
arquivos: z.array(z.string()),
|
|
76
|
+
hook: z.string().nullable().optional(),
|
|
77
|
+
faixa: z.string().nullable().optional(),
|
|
78
|
+
})
|
|
79
|
+
// Extras declaradas passam; o que não é declarado é reportado por
|
|
80
|
+
// `chavesDesconhecidas`, não rejeitado — o rastro nunca trava trabalho.
|
|
81
|
+
.passthrough();
|
|
82
|
+
/**
|
|
83
|
+
* As doze chaves estão CONTIDAS na linha?
|
|
84
|
+
*
|
|
85
|
+
* Contenção, nunca igualdade de conjunto: um validador estrito reprova as
|
|
86
|
+
* skills que usam extras legítimas — foi assim que a verificação da runx
|
|
87
|
+
* passou a reprovar toda linha da mergex e da legadox.
|
|
88
|
+
*/
|
|
89
|
+
export function chavesFaltando(obj) {
|
|
90
|
+
return CHAVES_EVENTO.filter((c) => !(c in obj));
|
|
91
|
+
}
|
|
92
|
+
/** Chaves presentes que o contrato não declara — aviso, não erro. */
|
|
93
|
+
export function chavesDesconhecidas(obj) {
|
|
94
|
+
const conhecidas = new Set([...CHAVES_EVENTO, ...EXTRAS_EVENTO]);
|
|
95
|
+
return Object.keys(obj).filter((k) => !conhecidas.has(k));
|
|
96
|
+
}
|
|
97
|
+
/** Valida um arquivo `.jsonl` inteiro. Linha em branco é ignorada. */
|
|
98
|
+
export function validarRastro(conteudo) {
|
|
99
|
+
const defeitos = [];
|
|
100
|
+
const desconhecidas = new Set();
|
|
101
|
+
let linhas = 0;
|
|
102
|
+
conteudo.split("\n").forEach((bruta, i) => {
|
|
103
|
+
if (!bruta.trim())
|
|
104
|
+
return;
|
|
105
|
+
linhas += 1;
|
|
106
|
+
const n = i + 1;
|
|
107
|
+
let obj;
|
|
108
|
+
try {
|
|
109
|
+
obj = JSON.parse(bruta);
|
|
110
|
+
}
|
|
111
|
+
catch {
|
|
112
|
+
defeitos.push({ linha: n, motivo: "JSON invalido" });
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
if (typeof obj !== "object" || obj === null || Array.isArray(obj)) {
|
|
116
|
+
defeitos.push({ linha: n, motivo: "a linha nao e um objeto JSON" });
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
const mapa = obj;
|
|
120
|
+
const faltando = chavesFaltando(mapa);
|
|
121
|
+
if (faltando.length > 0) {
|
|
122
|
+
defeitos.push({
|
|
123
|
+
linha: n,
|
|
124
|
+
motivo: `chave omitida: ${faltando.join(", ")} (use null; R6)`,
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
for (const k of chavesDesconhecidas(mapa))
|
|
128
|
+
desconhecidas.add(k);
|
|
129
|
+
const r = LinhaEvento.safeParse(mapa);
|
|
130
|
+
if (!r.success && faltando.length === 0) {
|
|
131
|
+
const p = r.error.issues[0];
|
|
132
|
+
const caminho = p?.path.join(".") ?? "";
|
|
133
|
+
defeitos.push({
|
|
134
|
+
linha: n,
|
|
135
|
+
motivo: `${caminho ? caminho + ": " : ""}${p?.message ?? "estrutura invalida"}`,
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
});
|
|
139
|
+
return { linhas, defeitos, desconhecidas: [...desconhecidas].sort() };
|
|
140
|
+
}
|
|
141
|
+
//# sourceMappingURL=evento.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evento.js","sourceRoot":"","sources":["../../../src/parser/esquema/evento.ts"],"names":[],"mappings":"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"}
|
|
@@ -34,6 +34,15 @@ export type Aceito = {
|
|
|
34
34
|
dados: Record<string, unknown>;
|
|
35
35
|
corpo: string;
|
|
36
36
|
linhas: Map<string, number>;
|
|
37
|
+
/**
|
|
38
|
+
* Chaves que o esquema aceita mas que NÃO estavam no arquivo (R6).
|
|
39
|
+
*
|
|
40
|
+
* O parse normaliza — `.optional()` some, `.default([])` inventa `[]` — e
|
|
41
|
+
* depois dele não dá mais para distinguir "veio null" de "nem veio". Quem
|
|
42
|
+
* quiser cobrar a R6 precisa desta lista, colhida enquanto o dado cru ainda
|
|
43
|
+
* existe. Caminho no formato do `linhas`: `tasks.0.criterio_aceite`.
|
|
44
|
+
*/
|
|
45
|
+
omitidas: string[];
|
|
37
46
|
};
|
|
38
47
|
export type Resultado = Aceito | Rejeicao;
|
|
39
48
|
/**
|
|
@@ -21,6 +21,61 @@ export const MotivoRejeicao = {
|
|
|
21
21
|
VersaoAusente: "expx_schema ausente ou nao numerico",
|
|
22
22
|
EstruturaInvalida: "estrutura incompativel com o kind",
|
|
23
23
|
};
|
|
24
|
+
/**
|
|
25
|
+
* Chaves que a R6 exige presentes mesmo quando o valor é `null`.
|
|
26
|
+
*
|
|
27
|
+
* São exatamente as que o esquema afrouxa com `.optional()` ou `.default([])`
|
|
28
|
+
* — o afrouxamento existe para o arquivo ser ACEITO (D-04), e esta lista existe
|
|
29
|
+
* para o defeito ainda assim aparecer. Campo que o esquema já exige não entra
|
|
30
|
+
* aqui: a ausência dele nem chega a este ponto.
|
|
31
|
+
*/
|
|
32
|
+
const EXIGIDAS_POR_KIND = {
|
|
33
|
+
// `tasks` e `fases` não entram aqui: nesses dois kinds os campos cobrados
|
|
34
|
+
// vivem DENTRO de cada item da lista, e são cobrados por EXIGIDAS_EM_ITEM.
|
|
35
|
+
// Cobrá-los também na raiz acusa toda task correta do mundo.
|
|
36
|
+
orquestrador: ["sprints", "caminho_critico"],
|
|
37
|
+
sprint: ["criterio_saida", "fases", "riscos"],
|
|
38
|
+
bloqueios: ["bloqueios"],
|
|
39
|
+
decisoes: ["decisoes"],
|
|
40
|
+
};
|
|
41
|
+
/** As chaves de item que a R6 cobra dentro de cada elemento de uma lista. */
|
|
42
|
+
const EXIGIDAS_EM_ITEM = {
|
|
43
|
+
tasks: ["teste_integracao", "teste_funcional", "criterio_aceite", "depende_de"],
|
|
44
|
+
fases: ["criterio_saida", "paralela_com", "tasks"],
|
|
45
|
+
};
|
|
46
|
+
/** A lista que carrega os itens de cada kind, quando há uma. */
|
|
47
|
+
const LISTA_DO_KIND = {
|
|
48
|
+
tasks: "tasks",
|
|
49
|
+
fases: "fases",
|
|
50
|
+
};
|
|
51
|
+
function colherOmitidas(kind, cru) {
|
|
52
|
+
if (typeof cru !== "object" || cru === null)
|
|
53
|
+
return [];
|
|
54
|
+
const raiz = cru;
|
|
55
|
+
const fora = [];
|
|
56
|
+
for (const chave of EXIGIDAS_POR_KIND[kind] ?? []) {
|
|
57
|
+
// `in` distingue ausência de `null` — que é justamente o ponto da R6.
|
|
58
|
+
if (!(chave in raiz))
|
|
59
|
+
fora.push(chave);
|
|
60
|
+
}
|
|
61
|
+
const nomeLista = LISTA_DO_KIND[kind];
|
|
62
|
+
const exigidasItem = EXIGIDAS_EM_ITEM[kind];
|
|
63
|
+
if (nomeLista && exigidasItem) {
|
|
64
|
+
const itens = raiz[nomeLista];
|
|
65
|
+
if (Array.isArray(itens)) {
|
|
66
|
+
itens.forEach((item, i) => {
|
|
67
|
+
if (typeof item !== "object" || item === null)
|
|
68
|
+
return;
|
|
69
|
+
const m = item;
|
|
70
|
+
for (const chave of exigidasItem) {
|
|
71
|
+
if (!(chave in m))
|
|
72
|
+
fora.push(`${nomeLista}.${i}.${chave}`);
|
|
73
|
+
}
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
return fora;
|
|
78
|
+
}
|
|
24
79
|
function rejeitar(arquivo, motivo, detalhe, linha = null) {
|
|
25
80
|
return { tipo: "rejeitado", arquivo, motivo, detalhe, linha };
|
|
26
81
|
}
|
|
@@ -66,6 +121,7 @@ export function classificar(arquivo, conteudo) {
|
|
|
66
121
|
arquivo,
|
|
67
122
|
kind,
|
|
68
123
|
dados: r.data,
|
|
124
|
+
omitidas: colherOmitidas(kind, leitura.dados),
|
|
69
125
|
corpo: leitura.corpo,
|
|
70
126
|
linhas: leitura.linhas,
|
|
71
127
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rejeicao.js","sourceRoot":"","sources":["../../../src/parser/leitura/rejeicao.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAErF;;;;;;;;;;;GAWG;AAEH,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,cAAc,EAAE,wBAAwB;IACxC,YAAY,EAAE,eAAe;IAC7B,gBAAgB,EAAE,mBAAmB;IACrC,YAAY,EAAE,yBAAyB;IACvC,aAAa,EAAE,qCAAqC;IACpD,iBAAiB,EAAE,mCAAmC;CAC9C,CAAC;
|
|
1
|
+
{"version":3,"file":"rejeicao.js","sourceRoot":"","sources":["../../../src/parser/leitura/rejeicao.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lê o índice que o memox grava. O painel NUNCA invoca o motor (decisão D-01):
|
|
3
|
+
* o motor é Python, roda fora daqui, e o painel é somente leitura.
|
|
4
|
+
*
|
|
5
|
+
* A leitura falha ABERTA — devolve `null` em vez de lançar — e cada motivo é
|
|
6
|
+
* um caso real, não defesa hipotética:
|
|
7
|
+
*
|
|
8
|
+
* arquivo ausente o índice é local e o próprio motor acrescenta
|
|
9
|
+
* `.expx/memoria/` ao `.gitignore`. Quem clonou o
|
|
10
|
+
* repositório não tem índice, e isso é o normal.
|
|
11
|
+
* JSON inválido o motor reescreve o arquivo inteiro a cada
|
|
12
|
+
* reconstrução; ler no instante da gravação devolve
|
|
13
|
+
* JSON truncado — o mesmo risco que o observador já
|
|
14
|
+
* documenta para `tasks.md`.
|
|
15
|
+
* versão desconhecida um índice gravado por versão futura pode ter outro
|
|
16
|
+
* formato, e adivinhar seria pior que não mostrar.
|
|
17
|
+
*
|
|
18
|
+
* A doutrina do painel inteiro é degradar mostrando, nunca quebrar (D-05).
|
|
19
|
+
*/
|
|
20
|
+
/** A versão do formato que este leitor entende. */
|
|
21
|
+
export declare const VERSAO_SUPORTADA = 1;
|
|
22
|
+
/** O índice cru, como está no disco. A projeção enxuta é feita em `projetar.ts`. */
|
|
23
|
+
export type IndiceCru = {
|
|
24
|
+
versao: number;
|
|
25
|
+
gerado_em?: string;
|
|
26
|
+
totais?: Record<string, number>;
|
|
27
|
+
por_arquivo?: Record<string, unknown[]>;
|
|
28
|
+
por_modulo?: Record<string, unknown[]>;
|
|
29
|
+
sinais?: {
|
|
30
|
+
arquivo?: Record<string, unknown>;
|
|
31
|
+
modulo?: Record<string, unknown>;
|
|
32
|
+
};
|
|
33
|
+
regressoes?: unknown[];
|
|
34
|
+
coincidencias_arquivo?: unknown[];
|
|
35
|
+
artefatos_contaminados?: Record<string, string[]>;
|
|
36
|
+
};
|
|
37
|
+
export declare function caminhoDoIndice(raiz: string): string;
|
|
38
|
+
export declare function lerIndice(raiz: string): IndiceCru | null;
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
/**
|
|
4
|
+
* Lê o índice que o memox grava. O painel NUNCA invoca o motor (decisão D-01):
|
|
5
|
+
* o motor é Python, roda fora daqui, e o painel é somente leitura.
|
|
6
|
+
*
|
|
7
|
+
* A leitura falha ABERTA — devolve `null` em vez de lançar — e cada motivo é
|
|
8
|
+
* um caso real, não defesa hipotética:
|
|
9
|
+
*
|
|
10
|
+
* arquivo ausente o índice é local e o próprio motor acrescenta
|
|
11
|
+
* `.expx/memoria/` ao `.gitignore`. Quem clonou o
|
|
12
|
+
* repositório não tem índice, e isso é o normal.
|
|
13
|
+
* JSON inválido o motor reescreve o arquivo inteiro a cada
|
|
14
|
+
* reconstrução; ler no instante da gravação devolve
|
|
15
|
+
* JSON truncado — o mesmo risco que o observador já
|
|
16
|
+
* documenta para `tasks.md`.
|
|
17
|
+
* versão desconhecida um índice gravado por versão futura pode ter outro
|
|
18
|
+
* formato, e adivinhar seria pior que não mostrar.
|
|
19
|
+
*
|
|
20
|
+
* A doutrina do painel inteiro é degradar mostrando, nunca quebrar (D-05).
|
|
21
|
+
*/
|
|
22
|
+
/** A versão do formato que este leitor entende. */
|
|
23
|
+
export const VERSAO_SUPORTADA = 1;
|
|
24
|
+
export function caminhoDoIndice(raiz) {
|
|
25
|
+
return join(raiz, ".expx", "memoria", "indice.json");
|
|
26
|
+
}
|
|
27
|
+
export function lerIndice(raiz) {
|
|
28
|
+
const caminho = caminhoDoIndice(raiz);
|
|
29
|
+
if (!existsSync(caminho))
|
|
30
|
+
return null;
|
|
31
|
+
let cru;
|
|
32
|
+
try {
|
|
33
|
+
cru = JSON.parse(readFileSync(caminho, "utf8"));
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
// JSON truncado pela gravação em curso: na próxima releitura vem inteiro
|
|
37
|
+
return null;
|
|
38
|
+
}
|
|
39
|
+
if (typeof cru !== "object" || cru === null || Array.isArray(cru))
|
|
40
|
+
return null;
|
|
41
|
+
const indice = cru;
|
|
42
|
+
if (indice.versao !== VERSAO_SUPORTADA)
|
|
43
|
+
return null;
|
|
44
|
+
return indice;
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=ler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ler.js","sourceRoot":"","sources":["../../../src/parser/memoria/ler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC;;;;;;;;;;;;;;;;;;GAkBG;AAEH,mDAAmD;AACnD,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC;AAelC,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,OAAO,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,aAAa,CAAC,CAAC;AACvD,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,IAAY;IACpC,MAAM,OAAO,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;IACtC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;QAAE,OAAO,IAAI,CAAC;IAEtC,IAAI,GAAY,CAAC;IACjB,IAAI,CAAC;QACH,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;IAClD,CAAC;IAAC,MAAM,CAAC;QACP,yEAAyE;QACzE,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAC/E,MAAM,MAAM,GAAG,GAAgB,CAAC;IAChC,IAAI,MAAM,CAAC,MAAM,KAAK,gBAAgB;QAAE,OAAO,IAAI,CAAC;IACpD,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reduz o índice cru à projeção que o painel serve.
|
|
3
|
+
*
|
|
4
|
+
* Duas chaves do índice NÃO entram (decisão D-04):
|
|
5
|
+
*
|
|
6
|
+
* `por_termo` índice invertido para a busca textual do motor. O painel
|
|
7
|
+
* difunde o estado inteiro a cada mudança de arquivo (D-28),
|
|
8
|
+
* então carregá-lo multiplicaria cada difusão sem ganho.
|
|
9
|
+
* `trabalhos` o registro completo de cada trabalho, que o painel já monta
|
|
10
|
+
* por conta própria varrendo `docs/relatorios/`.
|
|
11
|
+
*
|
|
12
|
+
* Toda derivação — ordenar, contar, classificar — acontece AQUI e não na tela:
|
|
13
|
+
* `ui/src/tipos.ts` declara que a UI não recalcula nada (D-09).
|
|
14
|
+
*/
|
|
15
|
+
function texto(v) {
|
|
16
|
+
return typeof v === "string" && v !== "" ? v : null;
|
|
17
|
+
}
|
|
18
|
+
function numero(v) {
|
|
19
|
+
return typeof v === "number" && Number.isFinite(v) ? v : 0;
|
|
20
|
+
}
|
|
21
|
+
function entradasDe(lista) {
|
|
22
|
+
if (!Array.isArray(lista))
|
|
23
|
+
return [];
|
|
24
|
+
return lista.map((e) => {
|
|
25
|
+
const o = (e ?? {});
|
|
26
|
+
return {
|
|
27
|
+
trabalho_id: texto(o["trabalho_id"]) ?? "",
|
|
28
|
+
titulo: texto(o["titulo"]),
|
|
29
|
+
data: texto(o["data"]),
|
|
30
|
+
tipo: texto(o["tipo"]),
|
|
31
|
+
ferramenta: texto(o["ferramenta"]),
|
|
32
|
+
causa: texto(o["causa"]),
|
|
33
|
+
papel: texto(o["papel"]) ?? "",
|
|
34
|
+
artefato: texto(o["artefato"]) ?? "",
|
|
35
|
+
};
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
function regressoesDe(lista) {
|
|
39
|
+
if (!Array.isArray(lista))
|
|
40
|
+
return [];
|
|
41
|
+
return lista.map((r) => {
|
|
42
|
+
const o = (r ?? {});
|
|
43
|
+
return {
|
|
44
|
+
arquivos: Array.isArray(o["arquivos"]) ? o["arquivos"] : [],
|
|
45
|
+
trabalho_anterior: texto(o["trabalho_anterior"]) ?? "",
|
|
46
|
+
data_anterior: texto(o["data_anterior"]),
|
|
47
|
+
trabalho_posterior: texto(o["trabalho_posterior"]) ?? "",
|
|
48
|
+
data_posterior: texto(o["data_posterior"]),
|
|
49
|
+
evidencia: texto(o["evidencia"]) ?? "",
|
|
50
|
+
origem_causa: texto(o["origem_causa"]),
|
|
51
|
+
origem_alteracao: texto(o["origem_alteracao"]),
|
|
52
|
+
};
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Ordena por RISCO, não por movimento (decisão D-10).
|
|
57
|
+
*
|
|
58
|
+
* A ordem é: regressões, depois reprovações de QA, depois número de trabalhos.
|
|
59
|
+
* Ordenar só por contagem de trabalhos colocaria o arquivo central no topo —
|
|
60
|
+
* ele é tocado por dezenas de trabalhos sem nunca ter falhado, e enterraria
|
|
61
|
+
* embaixo dele o arquivo que já quebrou duas vezes.
|
|
62
|
+
*/
|
|
63
|
+
function compararRisco(a, b) {
|
|
64
|
+
if (a.regressoes !== b.regressoes)
|
|
65
|
+
return b.regressoes - a.regressoes;
|
|
66
|
+
if (a.reprovacoes_qa !== b.reprovacoes_qa)
|
|
67
|
+
return b.reprovacoes_qa - a.reprovacoes_qa;
|
|
68
|
+
if (a.trabalhos !== b.trabalhos)
|
|
69
|
+
return b.trabalhos - a.trabalhos;
|
|
70
|
+
return a.arquivo.localeCompare(b.arquivo);
|
|
71
|
+
}
|
|
72
|
+
export function projetar(indice) {
|
|
73
|
+
const sinaisArquivo = (indice.sinais?.arquivo ?? {});
|
|
74
|
+
const sinaisModulo = (indice.sinais?.modulo ?? {});
|
|
75
|
+
const porArquivo = indice.por_arquivo ?? {};
|
|
76
|
+
const arquivos_de_risco = Object.entries(sinaisArquivo).map(([arquivo, s]) => {
|
|
77
|
+
const zona = s["zona_de_risco"];
|
|
78
|
+
const divida = s["divida"];
|
|
79
|
+
return {
|
|
80
|
+
arquivo,
|
|
81
|
+
trabalhos: numero(s["trabalhos"]),
|
|
82
|
+
ultimo_trabalho_em: texto(s["ultimo_trabalho_em"]),
|
|
83
|
+
reprovacoes_qa: numero(s["reprovacoes_qa"]),
|
|
84
|
+
regressoes: Array.isArray(s["regressoes"]) ? s["regressoes"].length : 0,
|
|
85
|
+
zona_de_risco: zona ? texto(zona["motivo"]) : null,
|
|
86
|
+
divida: divida ? texto(divida["descricao"]) : null,
|
|
87
|
+
risco_divida: divida ? texto(divida["risco"]) : null,
|
|
88
|
+
faixa_atencao: texto(s["faixa_atencao_frequente"]),
|
|
89
|
+
entradas: entradasDe(porArquivo[arquivo]),
|
|
90
|
+
};
|
|
91
|
+
});
|
|
92
|
+
arquivos_de_risco.sort(compararRisco);
|
|
93
|
+
const modulos = Object.entries(sinaisModulo).map(([modulo, s]) => ({
|
|
94
|
+
modulo,
|
|
95
|
+
trabalhos: numero(s["trabalhos"]),
|
|
96
|
+
ultimo_trabalho_em: texto(s["ultimo_trabalho_em"]),
|
|
97
|
+
reprovacoes_qa: numero(s["reprovacoes_qa"]),
|
|
98
|
+
regressoes: Array.isArray(s["regressoes"]) ? s["regressoes"].length : 0,
|
|
99
|
+
arquivos: Array.isArray(s["arquivos"]) ? s["arquivos"] : [],
|
|
100
|
+
}));
|
|
101
|
+
modulos.sort((a, b) => b.regressoes - a.regressoes || a.modulo.localeCompare(b.modulo));
|
|
102
|
+
const coincidencias = Array.isArray(indice.coincidencias_arquivo)
|
|
103
|
+
? indice.coincidencias_arquivo.map((c) => {
|
|
104
|
+
const o = (c ?? {});
|
|
105
|
+
return {
|
|
106
|
+
arquivos: Array.isArray(o["arquivos"]) ? o["arquivos"] : [],
|
|
107
|
+
trabalhos: Array.isArray(o["trabalhos"]) ? o["trabalhos"] : [],
|
|
108
|
+
motivo: texto(o["motivo"]) ?? "",
|
|
109
|
+
};
|
|
110
|
+
})
|
|
111
|
+
: [];
|
|
112
|
+
const contaminados = Object.entries(indice.artefatos_contaminados ?? {}).map(([artefato, tipos]) => ({ artefato, tipos: Array.isArray(tipos) ? tipos : [] }));
|
|
113
|
+
const t = indice.totais ?? {};
|
|
114
|
+
return {
|
|
115
|
+
gerado_em: texto(indice.gerado_em) ?? "",
|
|
116
|
+
versao: indice.versao,
|
|
117
|
+
totais: {
|
|
118
|
+
trabalhos: numero(t["trabalhos"]),
|
|
119
|
+
arquivos: numero(t["arquivos"]),
|
|
120
|
+
modulos: numero(t["modulos"]),
|
|
121
|
+
regressoes: numero(t["regressoes"]),
|
|
122
|
+
coincidencias: numero(t["coincidencias"]),
|
|
123
|
+
artefatos_contaminados: numero(t["artefatos_contaminados"]),
|
|
124
|
+
},
|
|
125
|
+
arquivos_de_risco,
|
|
126
|
+
regressoes: regressoesDe(indice.regressoes),
|
|
127
|
+
coincidencias,
|
|
128
|
+
contaminados,
|
|
129
|
+
modulos,
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=projetar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"projetar.js","sourceRoot":"","sources":["../../../src/parser/memoria/projetar.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
/**
|
|
3
|
+
* A projeção enxuta do índice do memox.
|
|
4
|
+
*
|
|
5
|
+
* O painel NÃO serve o `indice.json` como veio do disco (decisão D-04). Duas
|
|
6
|
+
* chaves do índice ficam de fora de propósito:
|
|
7
|
+
*
|
|
8
|
+
* `por_termo` — índice invertido para a busca textual do motor. Na tela é
|
|
9
|
+
* peso morto, e o painel difunde o estado INTEIRO a cada
|
|
10
|
+
* mudança de arquivo (decisão D-28), então carregá-lo
|
|
11
|
+
* multiplicaria cada difusão sem ganho nenhum.
|
|
12
|
+
* `trabalhos` — o registro completo de cada trabalho, que o painel já monta
|
|
13
|
+
* por conta própria a partir de `docs/relatorios/`.
|
|
14
|
+
*
|
|
15
|
+
* O schema existe para validar em RUNTIME. Não é preciosismo: `tsconfig.json`
|
|
16
|
+
* exclui `**\/*.test.ts` e o vitest não faz typecheck, e a fixture da UI usa
|
|
17
|
+
* `as unknown as Estado` — nenhum dos dois acusaria um formato errado.
|
|
18
|
+
*/
|
|
19
|
+
/** Uma entrada do índice: um trabalho que tocou um arquivo ou um módulo. */
|
|
20
|
+
export declare const EntradaSchema: z.ZodObject<{
|
|
21
|
+
trabalho_id: z.ZodString;
|
|
22
|
+
titulo: z.ZodNullable<z.ZodString>;
|
|
23
|
+
data: z.ZodNullable<z.ZodString>;
|
|
24
|
+
tipo: z.ZodNullable<z.ZodString>;
|
|
25
|
+
ferramenta: z.ZodNullable<z.ZodString>;
|
|
26
|
+
causa: z.ZodNullable<z.ZodString>;
|
|
27
|
+
papel: z.ZodString;
|
|
28
|
+
artefato: z.ZodString;
|
|
29
|
+
}, z.core.$strip>;
|
|
30
|
+
export type Entrada = z.infer<typeof EntradaSchema>;
|
|
31
|
+
/**
|
|
32
|
+
* Uma regressão comprovada. Os dois caminhos de origem são o que torna a
|
|
33
|
+
* afirmação conferível: quem recebe o sinal pode abrir os dois e julgar.
|
|
34
|
+
*/
|
|
35
|
+
export declare const RegressaoSchema: z.ZodObject<{
|
|
36
|
+
arquivos: z.ZodArray<z.ZodString>;
|
|
37
|
+
trabalho_anterior: z.ZodString;
|
|
38
|
+
data_anterior: z.ZodNullable<z.ZodString>;
|
|
39
|
+
trabalho_posterior: z.ZodString;
|
|
40
|
+
data_posterior: z.ZodNullable<z.ZodString>;
|
|
41
|
+
evidencia: z.ZodString;
|
|
42
|
+
origem_causa: z.ZodNullable<z.ZodString>;
|
|
43
|
+
origem_alteracao: z.ZodNullable<z.ZodString>;
|
|
44
|
+
}, z.core.$strip>;
|
|
45
|
+
export type Regressao = z.infer<typeof RegressaoSchema>;
|
|
46
|
+
/**
|
|
47
|
+
* Um vínculo que NÃO virou regressão, com o motivo. Isso não é sobra: é a
|
|
48
|
+
* prova de que o índice não inventa relação. Dois trabalhos tocando o mesmo
|
|
49
|
+
* arquivo é um fato; dizer que um causou o outro é uma afirmação.
|
|
50
|
+
*/
|
|
51
|
+
export declare const CoincidenciaSchema: z.ZodObject<{
|
|
52
|
+
arquivos: z.ZodArray<z.ZodString>;
|
|
53
|
+
trabalhos: z.ZodArray<z.ZodString>;
|
|
54
|
+
motivo: z.ZodString;
|
|
55
|
+
}, z.core.$strip>;
|
|
56
|
+
export type Coincidencia = z.infer<typeof CoincidenciaSchema>;
|
|
57
|
+
/** Um arquivo com os sinais que o índice derivou sobre ele. */
|
|
58
|
+
export declare const ArquivoDeRiscoSchema: z.ZodObject<{
|
|
59
|
+
arquivo: z.ZodString;
|
|
60
|
+
trabalhos: z.ZodNumber;
|
|
61
|
+
ultimo_trabalho_em: z.ZodNullable<z.ZodString>;
|
|
62
|
+
reprovacoes_qa: z.ZodNumber;
|
|
63
|
+
regressoes: z.ZodNumber;
|
|
64
|
+
zona_de_risco: z.ZodNullable<z.ZodString>;
|
|
65
|
+
divida: z.ZodNullable<z.ZodString>;
|
|
66
|
+
risco_divida: z.ZodNullable<z.ZodString>;
|
|
67
|
+
faixa_atencao: z.ZodNullable<z.ZodString>;
|
|
68
|
+
entradas: z.ZodArray<z.ZodObject<{
|
|
69
|
+
trabalho_id: z.ZodString;
|
|
70
|
+
titulo: z.ZodNullable<z.ZodString>;
|
|
71
|
+
data: z.ZodNullable<z.ZodString>;
|
|
72
|
+
tipo: z.ZodNullable<z.ZodString>;
|
|
73
|
+
ferramenta: z.ZodNullable<z.ZodString>;
|
|
74
|
+
causa: z.ZodNullable<z.ZodString>;
|
|
75
|
+
papel: z.ZodString;
|
|
76
|
+
artefato: z.ZodString;
|
|
77
|
+
}, z.core.$strip>>;
|
|
78
|
+
}, z.core.$strip>;
|
|
79
|
+
export type ArquivoDeRisco = z.infer<typeof ArquivoDeRiscoSchema>;
|
|
80
|
+
export declare const ModuloSchema: z.ZodObject<{
|
|
81
|
+
modulo: z.ZodString;
|
|
82
|
+
trabalhos: z.ZodNumber;
|
|
83
|
+
ultimo_trabalho_em: z.ZodNullable<z.ZodString>;
|
|
84
|
+
reprovacoes_qa: z.ZodNumber;
|
|
85
|
+
regressoes: z.ZodNumber;
|
|
86
|
+
arquivos: z.ZodArray<z.ZodString>;
|
|
87
|
+
}, z.core.$strip>;
|
|
88
|
+
export type Modulo = z.infer<typeof ModuloSchema>;
|
|
89
|
+
/** Artefato onde o memox detectou segredo. O valor já foi redigido na origem. */
|
|
90
|
+
export declare const ContaminadoSchema: z.ZodObject<{
|
|
91
|
+
artefato: z.ZodString;
|
|
92
|
+
tipos: z.ZodArray<z.ZodString>;
|
|
93
|
+
}, z.core.$strip>;
|
|
94
|
+
export type Contaminado = z.infer<typeof ContaminadoSchema>;
|
|
95
|
+
export declare const MemoriaSchema: z.ZodObject<{
|
|
96
|
+
gerado_em: z.ZodString;
|
|
97
|
+
versao: z.ZodNumber;
|
|
98
|
+
totais: z.ZodObject<{
|
|
99
|
+
trabalhos: z.ZodNumber;
|
|
100
|
+
arquivos: z.ZodNumber;
|
|
101
|
+
modulos: z.ZodNumber;
|
|
102
|
+
regressoes: z.ZodNumber;
|
|
103
|
+
coincidencias: z.ZodNumber;
|
|
104
|
+
artefatos_contaminados: z.ZodNumber;
|
|
105
|
+
}, z.core.$strip>;
|
|
106
|
+
arquivos_de_risco: z.ZodArray<z.ZodObject<{
|
|
107
|
+
arquivo: z.ZodString;
|
|
108
|
+
trabalhos: z.ZodNumber;
|
|
109
|
+
ultimo_trabalho_em: z.ZodNullable<z.ZodString>;
|
|
110
|
+
reprovacoes_qa: z.ZodNumber;
|
|
111
|
+
regressoes: z.ZodNumber;
|
|
112
|
+
zona_de_risco: z.ZodNullable<z.ZodString>;
|
|
113
|
+
divida: z.ZodNullable<z.ZodString>;
|
|
114
|
+
risco_divida: z.ZodNullable<z.ZodString>;
|
|
115
|
+
faixa_atencao: z.ZodNullable<z.ZodString>;
|
|
116
|
+
entradas: z.ZodArray<z.ZodObject<{
|
|
117
|
+
trabalho_id: z.ZodString;
|
|
118
|
+
titulo: z.ZodNullable<z.ZodString>;
|
|
119
|
+
data: z.ZodNullable<z.ZodString>;
|
|
120
|
+
tipo: z.ZodNullable<z.ZodString>;
|
|
121
|
+
ferramenta: z.ZodNullable<z.ZodString>;
|
|
122
|
+
causa: z.ZodNullable<z.ZodString>;
|
|
123
|
+
papel: z.ZodString;
|
|
124
|
+
artefato: z.ZodString;
|
|
125
|
+
}, z.core.$strip>>;
|
|
126
|
+
}, z.core.$strip>>;
|
|
127
|
+
regressoes: z.ZodArray<z.ZodObject<{
|
|
128
|
+
arquivos: z.ZodArray<z.ZodString>;
|
|
129
|
+
trabalho_anterior: z.ZodString;
|
|
130
|
+
data_anterior: z.ZodNullable<z.ZodString>;
|
|
131
|
+
trabalho_posterior: z.ZodString;
|
|
132
|
+
data_posterior: z.ZodNullable<z.ZodString>;
|
|
133
|
+
evidencia: z.ZodString;
|
|
134
|
+
origem_causa: z.ZodNullable<z.ZodString>;
|
|
135
|
+
origem_alteracao: z.ZodNullable<z.ZodString>;
|
|
136
|
+
}, z.core.$strip>>;
|
|
137
|
+
coincidencias: z.ZodArray<z.ZodObject<{
|
|
138
|
+
arquivos: z.ZodArray<z.ZodString>;
|
|
139
|
+
trabalhos: z.ZodArray<z.ZodString>;
|
|
140
|
+
motivo: z.ZodString;
|
|
141
|
+
}, z.core.$strip>>;
|
|
142
|
+
contaminados: z.ZodArray<z.ZodObject<{
|
|
143
|
+
artefato: z.ZodString;
|
|
144
|
+
tipos: z.ZodArray<z.ZodString>;
|
|
145
|
+
}, z.core.$strip>>;
|
|
146
|
+
modulos: z.ZodArray<z.ZodObject<{
|
|
147
|
+
modulo: z.ZodString;
|
|
148
|
+
trabalhos: z.ZodNumber;
|
|
149
|
+
ultimo_trabalho_em: z.ZodNullable<z.ZodString>;
|
|
150
|
+
reprovacoes_qa: z.ZodNumber;
|
|
151
|
+
regressoes: z.ZodNumber;
|
|
152
|
+
arquivos: z.ZodArray<z.ZodString>;
|
|
153
|
+
}, z.core.$strip>>;
|
|
154
|
+
}, z.core.$strip>;
|
|
155
|
+
export type Memoria = z.infer<typeof MemoriaSchema>;
|