expxdev 0.1.1 → 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.
Files changed (59) hide show
  1. package/README.md +459 -72
  2. package/dist/cli/init.js +6 -2
  3. package/dist/cli/init.js.map +1 -1
  4. package/dist/doctor/verificadores.js +97 -1
  5. package/dist/doctor/verificadores.js.map +1 -1
  6. package/dist/harness/hooks.d.ts +27 -0
  7. package/dist/harness/hooks.js +36 -0
  8. package/dist/harness/hooks.js.map +1 -0
  9. package/dist/harness/settings.d.ts +2 -1
  10. package/dist/harness/settings.js +40 -2
  11. package/dist/harness/settings.js.map +1 -1
  12. package/dist/nucleo/caminhos.d.ts +1 -1
  13. package/dist/nucleo/catalogo.d.ts +1 -1
  14. package/dist/nucleo/catalogo.js +7 -1
  15. package/dist/nucleo/catalogo.js.map +1 -1
  16. package/dist/nucleo/layout.d.ts +3 -2
  17. package/dist/nucleo/layout.js +37 -1
  18. package/dist/nucleo/layout.js.map +1 -1
  19. package/dist/nucleo/versao.d.ts +1 -1
  20. package/dist/parser/conformidade/regras.d.ts +1 -0
  21. package/dist/parser/conformidade/regras.js +24 -0
  22. package/dist/parser/conformidade/regras.js.map +1 -1
  23. package/dist/parser/esquema/enums.d.ts +19 -0
  24. package/dist/parser/esquema/enums.js +18 -0
  25. package/dist/parser/esquema/enums.js.map +1 -1
  26. package/dist/parser/esquema/evento.d.ts +123 -0
  27. package/dist/parser/esquema/evento.js +141 -0
  28. package/dist/parser/esquema/evento.js.map +1 -0
  29. package/dist/parser/leitura/rejeicao.d.ts +9 -0
  30. package/dist/parser/leitura/rejeicao.js +56 -0
  31. package/dist/parser/leitura/rejeicao.js.map +1 -1
  32. package/dist/parser/memoria/ler.d.ts +38 -0
  33. package/dist/parser/memoria/ler.js +46 -0
  34. package/dist/parser/memoria/ler.js.map +1 -0
  35. package/dist/parser/memoria/projetar.d.ts +3 -0
  36. package/dist/parser/memoria/projetar.js +132 -0
  37. package/dist/parser/memoria/projetar.js.map +1 -0
  38. package/dist/parser/memoria/tipos.d.ts +155 -0
  39. package/dist/parser/memoria/tipos.js +97 -0
  40. package/dist/parser/memoria/tipos.js.map +1 -0
  41. package/dist/parser/projeto/montar.d.ts +17 -0
  42. package/dist/parser/projeto/montar.js +17 -0
  43. package/dist/parser/projeto/montar.js.map +1 -1
  44. package/dist/plugin/montagem.d.ts +7 -0
  45. package/dist/plugin/montagem.js +22 -2
  46. package/dist/plugin/montagem.js.map +1 -1
  47. package/dist/servidor/http.js +5 -0
  48. package/dist/servidor/http.js.map +1 -1
  49. package/dist/servidor/observador.js +5 -1
  50. package/dist/servidor/observador.js.map +1 -1
  51. package/dist/teste/repo-fixture.d.ts +7 -0
  52. package/dist/teste/repo-fixture.js +18 -0
  53. package/dist/teste/repo-fixture.js.map +1 -1
  54. package/nucleo/README.md +79 -0
  55. package/nucleo/hooks/expx-rastro.sh +261 -0
  56. package/package.json +2 -1
  57. package/ui/dist/assets/index-BNE_RJrV.js +15 -0
  58. package/ui/dist/index.html +1 -1
  59. 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":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;;;;;;;;;;GAWG;AAEH;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC;AAGpD,8EAA8E;AAC9E,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,CAAC,IAAI,CAAC;IAC/B,SAAS;IACT,MAAM;IACN,QAAQ;IACR,SAAS;IACT,QAAQ;IACR,OAAO;CACR,CAAC,CAAC;AAGH,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC,CAAC;AAG9D,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAC,IAAI,CAAC;IACnC,KAAK;IACL,aAAa;IACb,aAAa;IACb,gBAAgB;IAChB,kBAAkB;IAClB,YAAY;IACZ,OAAO;CACR,CAAC,CAAC;AAGH,sDAAsD;AACtD,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAU,CAAC;AAE9E,wDAAwD;AACxD,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAU,CAAC;AAErE,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,gBAAgB,EAAE,GAAG,aAAa,CAAC,CAAC,CAAC;AAGvE,iEAAiE;AACjE,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,cAAc,EAAE,cAAc,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC,CAAC;AAGjG,6CAA6C;AAC7C,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,cAAc,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC,CAAC;AAGzF,6EAA6E;AAC7E,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC;AAG7D,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,UAAU,EAAE,eAAe,CAAC,CAAC,CAAC;AAGpE,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC,CAAC;AAG1D,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;AAG7D,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,YAAY,EAAE,iBAAiB,CAAC,CAAC,CAAC;AAGvE,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,aAAa,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC;AAGlE;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC;KACrB,KAAK,CAAC;IACL,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,qBAAqB,EAAE,0BAA0B,CAAC;IACnE,CAAC,CAAC,IAAI,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;CACxD,CAAC,CAAC;AAEL,2DAA2D;AAC3D,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;IACrF,OAAO,EAAE,uCAAuC;CACjD,CAAC,CAAC;AAEH,4EAA4E;AAC5E,MAAM,UAAU,kBAAkB,CAAC,IAAc,EAAE,OAAgB;IACjE,OAAO,IAAI,KAAK,SAAS;QACvB,CAAC,CAAE,gBAAsC,CAAC,QAAQ,CAAC,OAAO,CAAC;QAC3D,CAAC,CAAE,aAAmC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;AAC7D,CAAC"}
@@ -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":"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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;