expxdev 0.1.0 → 0.2.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 +580 -81
- package/dist/cli/init.js +6 -2
- package/dist/cli/init.js.map +1 -1
- package/dist/cli/subcomandos.js +1 -1
- 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 +6 -4
- 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
|
@@ -11,11 +11,30 @@ import { z } from "zod";
|
|
|
11
11
|
* - `status` de task usa o vocabulário feminino (`concluida`, `bloqueada`);
|
|
12
12
|
* status de trabalho, sprint e fase usa o masculino (`concluido`, `bloqueado`).
|
|
13
13
|
*/
|
|
14
|
+
/**
|
|
15
|
+
* `expx_tool` — quem ESCREVEU um artefato de estado. Só a sprintx e a runx
|
|
16
|
+
* escrevem frontmatter `expx-schema`; as demais skills do método não têm kind
|
|
17
|
+
* próprio nesse contrato.
|
|
18
|
+
*
|
|
19
|
+
* Não confundir com `ferramenta`, do rastro de eventos (`Ferramenta`, abaixo),
|
|
20
|
+
* que aceita as seis. Tratar os dois como o mesmo enum rejeita o rastro de
|
|
21
|
+
* quatro skills.
|
|
22
|
+
*/
|
|
14
23
|
export declare const ExpxTool: z.ZodEnum<{
|
|
15
24
|
sprintx: "sprintx";
|
|
16
25
|
runx: "runx";
|
|
17
26
|
}>;
|
|
18
27
|
export type ExpxTool = z.infer<typeof ExpxTool>;
|
|
28
|
+
/** `ferramenta` — quem EMITIU um evento no rastro. Todas as skills emitem. */
|
|
29
|
+
export declare const Ferramenta: z.ZodEnum<{
|
|
30
|
+
sprintx: "sprintx";
|
|
31
|
+
runx: "runx";
|
|
32
|
+
mergex: "mergex";
|
|
33
|
+
legadox: "legadox";
|
|
34
|
+
stackx: "stackx";
|
|
35
|
+
memox: "memox";
|
|
36
|
+
}>;
|
|
37
|
+
export type Ferramenta = z.infer<typeof Ferramenta>;
|
|
19
38
|
export declare const TipoTrabalho: z.ZodEnum<{
|
|
20
39
|
feature: "feature";
|
|
21
40
|
ocorrencia: "ocorrencia";
|
|
@@ -11,7 +11,25 @@ import { z } from "zod";
|
|
|
11
11
|
* - `status` de task usa o vocabulário feminino (`concluida`, `bloqueada`);
|
|
12
12
|
* status de trabalho, sprint e fase usa o masculino (`concluido`, `bloqueado`).
|
|
13
13
|
*/
|
|
14
|
+
/**
|
|
15
|
+
* `expx_tool` — quem ESCREVEU um artefato de estado. Só a sprintx e a runx
|
|
16
|
+
* escrevem frontmatter `expx-schema`; as demais skills do método não têm kind
|
|
17
|
+
* próprio nesse contrato.
|
|
18
|
+
*
|
|
19
|
+
* Não confundir com `ferramenta`, do rastro de eventos (`Ferramenta`, abaixo),
|
|
20
|
+
* que aceita as seis. Tratar os dois como o mesmo enum rejeita o rastro de
|
|
21
|
+
* quatro skills.
|
|
22
|
+
*/
|
|
14
23
|
export const ExpxTool = z.enum(["sprintx", "runx"]);
|
|
24
|
+
/** `ferramenta` — quem EMITIU um evento no rastro. Todas as skills emitem. */
|
|
25
|
+
export const Ferramenta = z.enum([
|
|
26
|
+
"sprintx",
|
|
27
|
+
"runx",
|
|
28
|
+
"mergex",
|
|
29
|
+
"legadox",
|
|
30
|
+
"stackx",
|
|
31
|
+
"memox",
|
|
32
|
+
]);
|
|
15
33
|
export const TipoTrabalho = z.enum(["feature", "ocorrencia"]);
|
|
16
34
|
export const TipoOcorrencia = z.enum([
|
|
17
35
|
"bug",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"enums.js","sourceRoot":"","sources":["../../../src/parser/esquema/enums.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"enums.js","sourceRoot":"","sources":["../../../src/parser/esquema/enums.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
/**
|
|
3
|
+
* Contrato `expx-eventos` v1 — a linha do rastro.
|
|
4
|
+
*
|
|
5
|
+
* Fonte única da regra das doze chaves. Ela já esteve escrita à mão em dois
|
|
6
|
+
* lugares (`runx/hooks/testes/testar.sh` e `stackx/hooks/stackx/_rastro.py`),
|
|
7
|
+
* e as duas listas divergiram do que as skills realmente gravam.
|
|
8
|
+
*/
|
|
9
|
+
/** As doze chaves obrigatórias, na ordem do contrato. */
|
|
10
|
+
export declare const CHAVES_EVENTO: readonly ["ts", "expx_eventos", "trabalho_id", "ferramenta", "origem", "evento", "fase", "task", "agente", "resultado", "detalhe", "arquivos"];
|
|
11
|
+
/**
|
|
12
|
+
* Chaves extras que o contrato declara, por skill. Extras existem porque a
|
|
13
|
+
* alternativa — espremer a informação em `detalhe` — perde o dado para sempre.
|
|
14
|
+
*/
|
|
15
|
+
export declare const EXTRAS_EVENTO: readonly ["hook", "faixa"];
|
|
16
|
+
export declare const Origem: z.ZodEnum<{
|
|
17
|
+
agente: "agente";
|
|
18
|
+
hook: "hook";
|
|
19
|
+
skill: "skill";
|
|
20
|
+
}>;
|
|
21
|
+
export declare const EventoNome: z.ZodEnum<{
|
|
22
|
+
fase_iniciada: "fase_iniciada";
|
|
23
|
+
fase_concluida: "fase_concluida";
|
|
24
|
+
task_iniciada: "task_iniciada";
|
|
25
|
+
task_concluida: "task_concluida";
|
|
26
|
+
task_bloqueada: "task_bloqueada";
|
|
27
|
+
suite_executada: "suite_executada";
|
|
28
|
+
arquivo_alterado: "arquivo_alterado";
|
|
29
|
+
regra_violada: "regra_violada";
|
|
30
|
+
acao_bloqueada: "acao_bloqueada";
|
|
31
|
+
agente_iniciado: "agente_iniciado";
|
|
32
|
+
agente_concluido: "agente_concluido";
|
|
33
|
+
veredito_emitido: "veredito_emitido";
|
|
34
|
+
commit_criado: "commit_criado";
|
|
35
|
+
pr_aberto: "pr_aberto";
|
|
36
|
+
}>;
|
|
37
|
+
export declare const Agente: z.ZodEnum<{
|
|
38
|
+
qa: "qa";
|
|
39
|
+
principal: "principal";
|
|
40
|
+
"auditor-plano": "auditor-plano";
|
|
41
|
+
"revisor-testes": "revisor-testes";
|
|
42
|
+
investigador: "investigador";
|
|
43
|
+
cartografo: "cartografo";
|
|
44
|
+
"revisor-diff": "revisor-diff";
|
|
45
|
+
"analista-de-conflito": "analista-de-conflito";
|
|
46
|
+
"avaliador-de-raio": "avaliador-de-raio";
|
|
47
|
+
}>;
|
|
48
|
+
/** Timestamp do rastro: ISO-8601 em UTC, com `Z` (R4). */
|
|
49
|
+
export declare const TimestampUtc: z.ZodString;
|
|
50
|
+
export declare const LinhaEvento: z.ZodObject<{
|
|
51
|
+
ts: z.ZodString;
|
|
52
|
+
expx_eventos: z.ZodLiteral<1>;
|
|
53
|
+
trabalho_id: z.ZodString;
|
|
54
|
+
ferramenta: z.ZodEnum<{
|
|
55
|
+
sprintx: "sprintx";
|
|
56
|
+
runx: "runx";
|
|
57
|
+
mergex: "mergex";
|
|
58
|
+
legadox: "legadox";
|
|
59
|
+
stackx: "stackx";
|
|
60
|
+
memox: "memox";
|
|
61
|
+
}>;
|
|
62
|
+
origem: z.ZodEnum<{
|
|
63
|
+
agente: "agente";
|
|
64
|
+
hook: "hook";
|
|
65
|
+
skill: "skill";
|
|
66
|
+
}>;
|
|
67
|
+
evento: z.ZodEnum<{
|
|
68
|
+
fase_iniciada: "fase_iniciada";
|
|
69
|
+
fase_concluida: "fase_concluida";
|
|
70
|
+
task_iniciada: "task_iniciada";
|
|
71
|
+
task_concluida: "task_concluida";
|
|
72
|
+
task_bloqueada: "task_bloqueada";
|
|
73
|
+
suite_executada: "suite_executada";
|
|
74
|
+
arquivo_alterado: "arquivo_alterado";
|
|
75
|
+
regra_violada: "regra_violada";
|
|
76
|
+
acao_bloqueada: "acao_bloqueada";
|
|
77
|
+
agente_iniciado: "agente_iniciado";
|
|
78
|
+
agente_concluido: "agente_concluido";
|
|
79
|
+
veredito_emitido: "veredito_emitido";
|
|
80
|
+
commit_criado: "commit_criado";
|
|
81
|
+
pr_aberto: "pr_aberto";
|
|
82
|
+
}>;
|
|
83
|
+
fase: z.ZodNullable<z.ZodString>;
|
|
84
|
+
task: z.ZodNullable<z.ZodString>;
|
|
85
|
+
agente: z.ZodEnum<{
|
|
86
|
+
qa: "qa";
|
|
87
|
+
principal: "principal";
|
|
88
|
+
"auditor-plano": "auditor-plano";
|
|
89
|
+
"revisor-testes": "revisor-testes";
|
|
90
|
+
investigador: "investigador";
|
|
91
|
+
cartografo: "cartografo";
|
|
92
|
+
"revisor-diff": "revisor-diff";
|
|
93
|
+
"analista-de-conflito": "analista-de-conflito";
|
|
94
|
+
"avaliador-de-raio": "avaliador-de-raio";
|
|
95
|
+
}>;
|
|
96
|
+
resultado: z.ZodString;
|
|
97
|
+
detalhe: z.ZodString;
|
|
98
|
+
arquivos: z.ZodArray<z.ZodString>;
|
|
99
|
+
hook: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
100
|
+
faixa: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
101
|
+
}, z.core.$loose>;
|
|
102
|
+
export type LinhaEvento = z.infer<typeof LinhaEvento>;
|
|
103
|
+
export type DefeitoEvento = {
|
|
104
|
+
linha: number;
|
|
105
|
+
motivo: string;
|
|
106
|
+
};
|
|
107
|
+
/**
|
|
108
|
+
* As doze chaves estão CONTIDAS na linha?
|
|
109
|
+
*
|
|
110
|
+
* Contenção, nunca igualdade de conjunto: um validador estrito reprova as
|
|
111
|
+
* skills que usam extras legítimas — foi assim que a verificação da runx
|
|
112
|
+
* passou a reprovar toda linha da mergex e da legadox.
|
|
113
|
+
*/
|
|
114
|
+
export declare function chavesFaltando(obj: Record<string, unknown>): string[];
|
|
115
|
+
/** Chaves presentes que o contrato não declara — aviso, não erro. */
|
|
116
|
+
export declare function chavesDesconhecidas(obj: Record<string, unknown>): string[];
|
|
117
|
+
export type ResultadoRastro = {
|
|
118
|
+
linhas: number;
|
|
119
|
+
defeitos: DefeitoEvento[];
|
|
120
|
+
desconhecidas: string[];
|
|
121
|
+
};
|
|
122
|
+
/** Valida um arquivo `.jsonl` inteiro. Linha em branco é ignorada. */
|
|
123
|
+
export declare function validarRastro(conteudo: string): ResultadoRastro;
|
|
@@ -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"}
|