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.
Files changed (68) hide show
  1. package/README.md +459 -72
  2. package/dist/cli/expx.d.ts +2 -0
  3. package/dist/cli/expx.js +55 -6
  4. package/dist/cli/expx.js.map +1 -1
  5. package/dist/cli/init.js +6 -2
  6. package/dist/cli/init.js.map +1 -1
  7. package/dist/cli/perguntar.d.ts +37 -0
  8. package/dist/cli/perguntar.js +76 -0
  9. package/dist/cli/perguntar.js.map +1 -0
  10. package/dist/cli/wizard.d.ts +21 -0
  11. package/dist/cli/wizard.js +101 -0
  12. package/dist/cli/wizard.js.map +1 -0
  13. package/dist/doctor/verificadores.js +97 -1
  14. package/dist/doctor/verificadores.js.map +1 -1
  15. package/dist/harness/hooks.d.ts +27 -0
  16. package/dist/harness/hooks.js +36 -0
  17. package/dist/harness/hooks.js.map +1 -0
  18. package/dist/harness/settings.d.ts +2 -1
  19. package/dist/harness/settings.js +40 -2
  20. package/dist/harness/settings.js.map +1 -1
  21. package/dist/nucleo/caminhos.d.ts +1 -1
  22. package/dist/nucleo/catalogo.d.ts +1 -1
  23. package/dist/nucleo/catalogo.js +7 -1
  24. package/dist/nucleo/catalogo.js.map +1 -1
  25. package/dist/nucleo/layout.d.ts +3 -2
  26. package/dist/nucleo/layout.js +37 -1
  27. package/dist/nucleo/layout.js.map +1 -1
  28. package/dist/nucleo/versao.d.ts +1 -1
  29. package/dist/parser/conformidade/regras.d.ts +1 -0
  30. package/dist/parser/conformidade/regras.js +24 -0
  31. package/dist/parser/conformidade/regras.js.map +1 -1
  32. package/dist/parser/esquema/enums.d.ts +19 -0
  33. package/dist/parser/esquema/enums.js +18 -0
  34. package/dist/parser/esquema/enums.js.map +1 -1
  35. package/dist/parser/esquema/evento.d.ts +123 -0
  36. package/dist/parser/esquema/evento.js +141 -0
  37. package/dist/parser/esquema/evento.js.map +1 -0
  38. package/dist/parser/leitura/rejeicao.d.ts +9 -0
  39. package/dist/parser/leitura/rejeicao.js +56 -0
  40. package/dist/parser/leitura/rejeicao.js.map +1 -1
  41. package/dist/parser/memoria/ler.d.ts +38 -0
  42. package/dist/parser/memoria/ler.js +46 -0
  43. package/dist/parser/memoria/ler.js.map +1 -0
  44. package/dist/parser/memoria/projetar.d.ts +3 -0
  45. package/dist/parser/memoria/projetar.js +132 -0
  46. package/dist/parser/memoria/projetar.js.map +1 -0
  47. package/dist/parser/memoria/tipos.d.ts +155 -0
  48. package/dist/parser/memoria/tipos.js +97 -0
  49. package/dist/parser/memoria/tipos.js.map +1 -0
  50. package/dist/parser/projeto/montar.d.ts +17 -0
  51. package/dist/parser/projeto/montar.js +17 -0
  52. package/dist/parser/projeto/montar.js.map +1 -1
  53. package/dist/plugin/montagem.d.ts +7 -0
  54. package/dist/plugin/montagem.js +22 -2
  55. package/dist/plugin/montagem.js.map +1 -1
  56. package/dist/servidor/http.js +5 -0
  57. package/dist/servidor/http.js.map +1 -1
  58. package/dist/servidor/observador.js +5 -1
  59. package/dist/servidor/observador.js.map +1 -1
  60. package/dist/teste/repo-fixture.d.ts +7 -0
  61. package/dist/teste/repo-fixture.js +18 -0
  62. package/dist/teste/repo-fixture.js.map +1 -1
  63. package/nucleo/README.md +79 -0
  64. package/nucleo/hooks/expx-rastro.sh +261 -0
  65. package/package.json +2 -1
  66. package/ui/dist/assets/index-BNE_RJrV.js +15 -0
  67. package/ui/dist/index.html +1 -1
  68. 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":"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"}
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;AAgCX;;;;;;;GAOG;AACH,MAAM,iBAAiB,GAA6C;IAClE,0EAA0E;IAC1E,2EAA2E;IAC3E,6DAA6D;IAC7D,YAAY,EAAE,CAAC,SAAS,EAAE,iBAAiB,CAAC;IAC5C,MAAM,EAAE,CAAC,gBAAgB,EAAE,OAAO,EAAE,QAAQ,CAAC;IAC7C,SAAS,EAAE,CAAC,WAAW,CAAC;IACxB,QAAQ,EAAE,CAAC,UAAU,CAAC;CACvB,CAAC;AAEF,6EAA6E;AAC7E,MAAM,gBAAgB,GAA6C;IACjE,KAAK,EAAE,CAAC,kBAAkB,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,YAAY,CAAC;IAC/E,KAAK,EAAE,CAAC,gBAAgB,EAAE,cAAc,EAAE,OAAO,CAAC;CACnD,CAAC;AAEF,gEAAgE;AAChE,MAAM,aAAa,GAAkC;IACnD,KAAK,EAAE,OAAO;IACd,KAAK,EAAE,OAAO;CACf,CAAC;AAEF,SAAS,cAAc,CAAC,IAAU,EAAE,GAAY;IAC9C,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI;QAAE,OAAO,EAAE,CAAC;IACvD,MAAM,IAAI,GAAG,GAA8B,CAAC;IAC5C,MAAM,IAAI,GAAa,EAAE,CAAC;IAE1B,KAAK,MAAM,KAAK,IAAI,iBAAiB,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;QAClD,sEAAsE;QACtE,IAAI,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC;YAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACzC,CAAC;IAED,MAAM,SAAS,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;IACtC,MAAM,YAAY,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;IAC5C,IAAI,SAAS,IAAI,YAAY,EAAE,CAAC;QAC9B,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC;QAC9B,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACzB,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE;gBACxB,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI;oBAAE,OAAO;gBACtD,MAAM,CAAC,GAAG,IAA+B,CAAC;gBAC1C,KAAK,MAAM,KAAK,IAAI,YAAY,EAAE,CAAC;oBACjC,IAAI,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;wBAAE,IAAI,CAAC,IAAI,CAAC,GAAG,SAAS,IAAI,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC;gBAC7D,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,QAAQ,CACf,OAAe,EACf,MAAsB,EACtB,OAAe,EACf,QAAuB,IAAI;IAE3B,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;AAChE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,OAAe,EAAE,QAAgB;IAC3D,IAAI,OAAO,CAAC;IACZ,IAAI,CAAC;QACH,OAAO,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;IACrC,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,2EAA2E;QAC3E,OAAO,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IACzE,CAAC;IAED,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC;QAChB,MAAM,MAAM,GACV,OAAO,CAAC,IAAI,KAAK,iBAAiB;YAChC,CAAC,CAAC,cAAc,CAAC,cAAc;YAC/B,CAAC,CAAC,cAAc,CAAC,YAAY,CAAC;QAClC,OAAO,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;IAClE,CAAC;IAED,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACxC,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QACpB,OAAO,QAAQ,CACb,OAAO,EACP,cAAc,CAAC,aAAa,EAC5B,mCAAmC,EACnC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,IAAI,CAC1C,CAAC;IACJ,CAAC;IACD,IAAI,MAAM,GAAG,gBAAgB,EAAE,CAAC;QAC9B,OAAO,QAAQ,CACb,OAAO,EACP,cAAc,CAAC,YAAY,EAC3B,6BAA6B,MAAM,0BAA0B,gBAAgB,sBAAsB,EACnG,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,IAAI,CAC1C,CAAC;IACJ,CAAC;IAED,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACpC,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;QAClB,MAAM,KAAK,GAAI,OAAO,CAAC,KAAiC,EAAE,CAAC,MAAM,CAAC,CAAC;QACnE,OAAO,QAAQ,CACb,OAAO,EACP,cAAc,CAAC,gBAAgB,EAC/B,QAAQ,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,yBAAyB,EACtD,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,IAAI,CACnC,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACvD,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;QACf,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACnC,MAAM,OAAO,GAAG,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;QAC/C,OAAO,QAAQ,CACb,OAAO,EACP,cAAc,CAAC,iBAAiB,EAChC,GAAG,OAAO,CAAC,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,QAAQ,EAAE,OAAO,IAAI,oBAAoB,EAAE,EAC9E,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,IAAI,CAClE,CAAC;IACJ,CAAC;IAED,OAAO;QACL,IAAI,EAAE,QAAQ;QACd,OAAO;QACP,IAAI;QACJ,KAAK,EAAE,CAAC,CAAC,IAA+B;QACxC,QAAQ,EAAE,cAAc,CAAC,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC;QAC7C,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAC;AACJ,CAAC"}
@@ -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,3 @@
1
+ import type { IndiceCru } from "./ler.js";
2
+ import type { Memoria } from "./tipos.js";
3
+ export declare function projetar(indice: IndiceCru): Memoria;
@@ -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>;