expxdev 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (156) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +137 -0
  3. package/dist/cli/argumentos.d.ts +22 -0
  4. package/dist/cli/argumentos.js +85 -0
  5. package/dist/cli/argumentos.js.map +1 -0
  6. package/dist/cli/expx-bin.d.ts +2 -0
  7. package/dist/cli/expx-bin.js +40 -0
  8. package/dist/cli/expx-bin.js.map +1 -0
  9. package/dist/cli/expx.d.ts +13 -0
  10. package/dist/cli/expx.js +123 -0
  11. package/dist/cli/expx.js.map +1 -0
  12. package/dist/cli/init-flags.d.ts +34 -0
  13. package/dist/cli/init-flags.js +83 -0
  14. package/dist/cli/init-flags.js.map +1 -0
  15. package/dist/cli/init.d.ts +34 -0
  16. package/dist/cli/init.js +103 -0
  17. package/dist/cli/init.js.map +1 -0
  18. package/dist/cli/principal.d.ts +2 -0
  19. package/dist/cli/principal.js +107 -0
  20. package/dist/cli/principal.js.map +1 -0
  21. package/dist/cli/projeto.d.ts +19 -0
  22. package/dist/cli/projeto.js +28 -0
  23. package/dist/cli/projeto.js.map +1 -0
  24. package/dist/cli/selecao.d.ts +19 -0
  25. package/dist/cli/selecao.js +28 -0
  26. package/dist/cli/selecao.js.map +1 -0
  27. package/dist/cli/selecionar.d.ts +23 -0
  28. package/dist/cli/selecionar.js +45 -0
  29. package/dist/cli/selecionar.js.map +1 -0
  30. package/dist/cli/subcomandos.d.ts +25 -0
  31. package/dist/cli/subcomandos.js +43 -0
  32. package/dist/cli/subcomandos.js.map +1 -0
  33. package/dist/doctor/efeito.d.ts +17 -0
  34. package/dist/doctor/efeito.js +18 -0
  35. package/dist/doctor/efeito.js.map +1 -0
  36. package/dist/doctor/verificadores.d.ts +21 -0
  37. package/dist/doctor/verificadores.js +158 -0
  38. package/dist/doctor/verificadores.js.map +1 -0
  39. package/dist/harness/backup.d.ts +15 -0
  40. package/dist/harness/backup.js +29 -0
  41. package/dist/harness/backup.js.map +1 -0
  42. package/dist/harness/instalar.d.ts +31 -0
  43. package/dist/harness/instalar.js +43 -0
  44. package/dist/harness/instalar.js.map +1 -0
  45. package/dist/harness/opencode.d.ts +18 -0
  46. package/dist/harness/opencode.js +32 -0
  47. package/dist/harness/opencode.js.map +1 -0
  48. package/dist/harness/settings.d.ts +36 -0
  49. package/dist/harness/settings.js +66 -0
  50. package/dist/harness/settings.js.map +1 -0
  51. package/dist/index.d.ts +8 -0
  52. package/dist/index.js +9 -0
  53. package/dist/index.js.map +1 -0
  54. package/dist/nucleo/busca.d.ts +28 -0
  55. package/dist/nucleo/busca.js +29 -0
  56. package/dist/nucleo/busca.js.map +1 -0
  57. package/dist/nucleo/caminhos.d.ts +21 -0
  58. package/dist/nucleo/caminhos.js +64 -0
  59. package/dist/nucleo/caminhos.js.map +1 -0
  60. package/dist/nucleo/catalogo.d.ts +20 -0
  61. package/dist/nucleo/catalogo.js +50 -0
  62. package/dist/nucleo/catalogo.js.map +1 -0
  63. package/dist/nucleo/integridade.d.ts +20 -0
  64. package/dist/nucleo/integridade.js +75 -0
  65. package/dist/nucleo/integridade.js.map +1 -0
  66. package/dist/nucleo/layout.d.ts +23 -0
  67. package/dist/nucleo/layout.js +73 -0
  68. package/dist/nucleo/layout.js.map +1 -0
  69. package/dist/nucleo/lock.d.ts +61 -0
  70. package/dist/nucleo/lock.js +96 -0
  71. package/dist/nucleo/lock.js.map +1 -0
  72. package/dist/nucleo/versao.d.ts +35 -0
  73. package/dist/nucleo/versao.js +63 -0
  74. package/dist/nucleo/versao.js.map +1 -0
  75. package/dist/parser/conformidade/regras.d.ts +41 -0
  76. package/dist/parser/conformidade/regras.js +209 -0
  77. package/dist/parser/conformidade/regras.js.map +1 -0
  78. package/dist/parser/descoberta/trabalhos.d.ts +35 -0
  79. package/dist/parser/descoberta/trabalhos.js +28 -0
  80. package/dist/parser/descoberta/trabalhos.js.map +1 -0
  81. package/dist/parser/descoberta/varredura.d.ts +4 -0
  82. package/dist/parser/descoberta/varredura.js +79 -0
  83. package/dist/parser/descoberta/varredura.js.map +1 -0
  84. package/dist/parser/esquema/cabecalho.d.ts +60 -0
  85. package/dist/parser/esquema/cabecalho.js +57 -0
  86. package/dist/parser/esquema/cabecalho.js.map +1 -0
  87. package/dist/parser/esquema/enums.d.ts +114 -0
  88. package/dist/parser/esquema/enums.js +64 -0
  89. package/dist/parser/esquema/enums.js.map +1 -0
  90. package/dist/parser/esquema/kinds.d.ts +768 -0
  91. package/dist/parser/esquema/kinds.js +231 -0
  92. package/dist/parser/esquema/kinds.js.map +1 -0
  93. package/dist/parser/leitura/arquivo.d.ts +9 -0
  94. package/dist/parser/leitura/arquivo.js +25 -0
  95. package/dist/parser/leitura/arquivo.js.map +1 -0
  96. package/dist/parser/leitura/frontmatter.d.ts +31 -0
  97. package/dist/parser/leitura/frontmatter.js +77 -0
  98. package/dist/parser/leitura/frontmatter.js.map +1 -0
  99. package/dist/parser/leitura/rejeicao.d.ts +43 -0
  100. package/dist/parser/leitura/rejeicao.js +73 -0
  101. package/dist/parser/leitura/rejeicao.js.map +1 -0
  102. package/dist/parser/projeto/montar.d.ts +62 -0
  103. package/dist/parser/projeto/montar.js +149 -0
  104. package/dist/parser/projeto/montar.js.map +1 -0
  105. package/dist/plugin/atomico.d.ts +13 -0
  106. package/dist/plugin/atomico.js +42 -0
  107. package/dist/plugin/atomico.js.map +1 -0
  108. package/dist/plugin/manifestos.d.ts +38 -0
  109. package/dist/plugin/manifestos.js +57 -0
  110. package/dist/plugin/manifestos.js.map +1 -0
  111. package/dist/plugin/montagem.d.ts +22 -0
  112. package/dist/plugin/montagem.js +30 -0
  113. package/dist/plugin/montagem.js.map +1 -0
  114. package/dist/relatorio/markdown.d.ts +22 -0
  115. package/dist/relatorio/markdown.js +0 -0
  116. package/dist/relatorio/markdown.js.map +1 -0
  117. package/dist/relatorio/pagina.d.ts +22 -0
  118. package/dist/relatorio/pagina.js +338 -0
  119. package/dist/relatorio/pagina.js.map +1 -0
  120. package/dist/servidor/estado.d.ts +16 -0
  121. package/dist/servidor/estado.js +16 -0
  122. package/dist/servidor/estado.js.map +1 -0
  123. package/dist/servidor/http.d.ts +22 -0
  124. package/dist/servidor/http.js +164 -0
  125. package/dist/servidor/http.js.map +1 -0
  126. package/dist/servidor/observador.d.ts +12 -0
  127. package/dist/servidor/observador.js +37 -0
  128. package/dist/servidor/observador.js.map +1 -0
  129. package/dist/servidor/painel.d.ts +24 -0
  130. package/dist/servidor/painel.js +49 -0
  131. package/dist/servidor/painel.js.map +1 -0
  132. package/dist/teste/layouts-fixture.d.ts +16 -0
  133. package/dist/teste/layouts-fixture.js +9 -0
  134. package/dist/teste/layouts-fixture.js.map +1 -0
  135. package/dist/teste/projeto-temporario.d.ts +14 -0
  136. package/dist/teste/projeto-temporario.js +16 -0
  137. package/dist/teste/projeto-temporario.js.map +1 -0
  138. package/dist/teste/repo-fixture.d.ts +27 -0
  139. package/dist/teste/repo-fixture.js +49 -0
  140. package/dist/teste/repo-fixture.js.map +1 -0
  141. package/dist/update/comparar.d.ts +33 -0
  142. package/dist/update/comparar.js +67 -0
  143. package/dist/update/comparar.js.map +1 -0
  144. package/dist/update/compatibilidade.d.ts +19 -0
  145. package/dist/update/compatibilidade.js +36 -0
  146. package/dist/update/compatibilidade.js.map +1 -0
  147. package/dist/update/flags.d.ts +47 -0
  148. package/dist/update/flags.js +123 -0
  149. package/dist/update/flags.js.map +1 -0
  150. package/dist/update/modificacao.d.ts +23 -0
  151. package/dist/update/modificacao.js +36 -0
  152. package/dist/update/modificacao.js.map +1 -0
  153. package/package.json +73 -0
  154. package/ui/dist/assets/index-BmDTogQZ.js +14 -0
  155. package/ui/dist/assets/index-DUzbt2M7.css +1 -0
  156. package/ui/dist/index.html +13 -0
@@ -0,0 +1,209 @@
1
+ import { estagioCoerenteCom } from "../esquema/enums.js";
2
+ /**
3
+ * Violações do método — arquivos que o painel LEU e cujo conteúdo desobedece
4
+ * uma regra. Distinto de rejeição, que é falha de leitura (decisão D-03).
5
+ *
6
+ * Cada regra aqui tem um escopo estreito de propósito. A definição de pronto
7
+ * proíbe violação falsa, e todos os caminhos conhecidos para produzir uma
8
+ * nascem de aplicar uma regra a quem ela não se destina:
9
+ *
10
+ * - regressão cobrada de trabalho sprintx, ou de runx que não é bug;
11
+ * - critério de saída exigido de fase que não o declara por não existir;
12
+ * - dependência inexistente acusada sem olhar o escopo do trabalho.
13
+ */
14
+ export const TipoViolacao = {
15
+ TesteAusente: "teste_ausente",
16
+ RegressaoAusente: "regressao_ausente",
17
+ ConcluidaSemVerde: "concluida_sem_verde",
18
+ ParalelaComDependencia: "paralela_com_dependencia",
19
+ SemCriterioSaida: "sem_criterio_saida",
20
+ BloqueioAntigo: "bloqueio_antigo",
21
+ DependenciaInexistente: "dependencia_inexistente",
22
+ CicloDependencia: "ciclo_dependencia",
23
+ EstagioIncoerente: "estagio_incoerente",
24
+ };
25
+ const vazio = (v) => v === null || v === undefined || (typeof v === "string" && v.trim() === "");
26
+ function diasEntre(inicio, fim) {
27
+ const a = Date.parse(`${inicio}T00:00:00Z`);
28
+ if (Number.isNaN(a))
29
+ return 0;
30
+ const b = Date.UTC(fim.getUTCFullYear(), fim.getUTCMonth(), fim.getUTCDate());
31
+ return Math.floor((b - a) / 86_400_000);
32
+ }
33
+ /** Todas as tasks de um trabalho, achatadas. */
34
+ function tasksDe(t) {
35
+ return t.sprints.flatMap((s) => s.tasks);
36
+ }
37
+ function regrasDeTask(t, saida) {
38
+ const tasks = tasksDe(t);
39
+ for (const task of tasks) {
40
+ const base = {
41
+ trabalho_id: t.trabalho_id,
42
+ alvo: task.id,
43
+ arquivo: task.arquivo,
44
+ linha: task.linha,
45
+ };
46
+ // 1. teste obrigatório ausente, null, ou string vazia/só espaços
47
+ for (const campo of ["teste_integracao", "teste_funcional"]) {
48
+ if (vazio(task[campo])) {
49
+ saida.push({
50
+ ...base,
51
+ tipo: TipoViolacao.TesteAusente,
52
+ detalhe: `${campo} esta ausente ou vazio`,
53
+ });
54
+ }
55
+ }
56
+ // 2. task concluída com suíte diferente de verde
57
+ if (task.status === "concluida" && task.suite !== "verde") {
58
+ saida.push({
59
+ ...base,
60
+ tipo: TipoViolacao.ConcluidaSemVerde,
61
+ detalhe: `task concluida com suite ${task.suite}`,
62
+ });
63
+ }
64
+ // 3. paralelizável com dependência declarada
65
+ if (task.paralelizavel && task.depende_de.length > 0) {
66
+ saida.push({
67
+ ...base,
68
+ tipo: TipoViolacao.ParalelaComDependencia,
69
+ detalhe: `paralelizavel: true com depende_de ${task.depende_de.join(", ")}`,
70
+ });
71
+ }
72
+ }
73
+ /**
74
+ * 4. bug sem teste de regressão na primeira task.
75
+ *
76
+ * ESCOPO ESTREITO DE PROPÓSITO: só trabalho runx com tipo_ocorrencia bug.
77
+ * O campo teste_regressao nem existe no contrato de task da sprintx, então
78
+ * cobrá-lo de um trabalho sprintx seria violação falsa (decisão D-07).
79
+ */
80
+ if (t.expx_tool === "runx" && t.tipo_ocorrencia === "bug" && tasks.length > 0) {
81
+ // "primeira task" = menor id na ordem natural (decisão D-08), estável
82
+ // independentemente de como a skill serializou a lista.
83
+ const primeira = [...tasks].sort((a, b) => a.id.localeCompare(b.id))[0];
84
+ if (primeira && vazio(primeira.teste_regressao)) {
85
+ saida.push({
86
+ tipo: TipoViolacao.RegressaoAusente,
87
+ trabalho_id: t.trabalho_id,
88
+ alvo: primeira.id,
89
+ arquivo: primeira.arquivo,
90
+ linha: primeira.linha,
91
+ detalhe: "primeira task de um bug sem teste_regressao",
92
+ });
93
+ }
94
+ }
95
+ }
96
+ function regrasDeEstrutura(t, saida, op) {
97
+ for (const s of t.sprints) {
98
+ if (vazio(s.criterio_saida)) {
99
+ saida.push({
100
+ tipo: TipoViolacao.SemCriterioSaida,
101
+ trabalho_id: t.trabalho_id,
102
+ alvo: s.sprint_id,
103
+ arquivo: s.arquivo ?? t.arquivo,
104
+ linha: s.linha,
105
+ detalhe: "sprint sem criterio_saida",
106
+ });
107
+ }
108
+ for (const f of s.fases) {
109
+ if (vazio(f.criterio_saida)) {
110
+ saida.push({
111
+ tipo: TipoViolacao.SemCriterioSaida,
112
+ trabalho_id: t.trabalho_id,
113
+ alvo: f.id,
114
+ arquivo: f.arquivo,
115
+ linha: f.linha,
116
+ detalhe: "fase sem criterio_saida",
117
+ });
118
+ }
119
+ }
120
+ }
121
+ for (const b of t.bloqueios) {
122
+ if (!b.aberto)
123
+ continue;
124
+ const dias = diasEntre(b.aberto_em, op.hoje);
125
+ if (dias > op.diasBloqueio) {
126
+ saida.push({
127
+ tipo: TipoViolacao.BloqueioAntigo,
128
+ trabalho_id: t.trabalho_id,
129
+ alvo: b.id,
130
+ arquivo: b.arquivo,
131
+ linha: b.linha,
132
+ detalhe: `aberto ha ${dias} dias (limite ${op.diasBloqueio})`,
133
+ });
134
+ }
135
+ }
136
+ }
137
+ function regrasDeReferencia(t, saida) {
138
+ const tasks = tasksDe(t);
139
+ const ids = new Set(tasks.map((x) => x.id));
140
+ for (const task of tasks) {
141
+ for (const dep of task.depende_de) {
142
+ if (!ids.has(dep)) {
143
+ saida.push({
144
+ tipo: TipoViolacao.DependenciaInexistente,
145
+ trabalho_id: t.trabalho_id,
146
+ alvo: task.id,
147
+ arquivo: task.arquivo,
148
+ linha: task.linha,
149
+ detalhe: `depende_de aponta ${dep}, que nao existe neste trabalho`,
150
+ });
151
+ }
152
+ }
153
+ }
154
+ // ciclo: busca em profundidade com marcação de cor, sem recursão infinita
155
+ const porId = new Map(tasks.map((x) => [x.id, x]));
156
+ const cor = new Map();
157
+ const emCiclo = new Set();
158
+ function visita(id, pilha) {
159
+ cor.set(id, 1);
160
+ for (const dep of porId.get(id)?.depende_de ?? []) {
161
+ if (!porId.has(dep))
162
+ continue;
163
+ if (cor.get(dep) === 1) {
164
+ for (const x of [...pilha.slice(pilha.indexOf(dep)), dep])
165
+ emCiclo.add(x);
166
+ continue;
167
+ }
168
+ if ((cor.get(dep) ?? 0) === 0)
169
+ visita(dep, [...pilha, dep]);
170
+ }
171
+ cor.set(id, 2);
172
+ }
173
+ for (const id of porId.keys()) {
174
+ if ((cor.get(id) ?? 0) === 0)
175
+ visita(id, [id]);
176
+ }
177
+ for (const id of [...emCiclo].sort()) {
178
+ const task = porId.get(id);
179
+ saida.push({
180
+ tipo: TipoViolacao.CicloDependencia,
181
+ trabalho_id: t.trabalho_id,
182
+ alvo: id,
183
+ arquivo: task?.arquivo ?? t.arquivo,
184
+ linha: task?.linha ?? null,
185
+ detalhe: "task participa de um ciclo de dependencias",
186
+ });
187
+ }
188
+ // estágio coerente com a ferramenta que gravou (decisão D-10)
189
+ if (!estagioCoerenteCom(t.expx_tool, t.estagio)) {
190
+ saida.push({
191
+ tipo: TipoViolacao.EstagioIncoerente,
192
+ trabalho_id: t.trabalho_id,
193
+ alvo: t.trabalho_id,
194
+ arquivo: t.arquivo,
195
+ linha: t.linhas.get("estagio") ?? null,
196
+ detalhe: `expx_tool ${t.expx_tool} com estagio ${t.estagio}`,
197
+ });
198
+ }
199
+ }
200
+ export function verificarConformidade(projeto, op) {
201
+ const saida = [];
202
+ for (const t of projeto.trabalhos) {
203
+ regrasDeTask(t, saida);
204
+ regrasDeEstrutura(t, saida, op);
205
+ regrasDeReferencia(t, saida);
206
+ }
207
+ return saida;
208
+ }
209
+ //# sourceMappingURL=regras.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"regras.js","sourceRoot":"","sources":["../../../src/parser/conformidade/regras.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ import type { Rejeicao, Aceito } from "../leitura/rejeicao.js";
2
+ import type { ExpxTool, Estagio, StatusTrabalho, TipoTrabalho, TipoOcorrencia } from "../esquema/enums.js";
3
+ /**
4
+ * Um trabalho é qualquer pasta com um `ORQUESTRADOR.md` de frontmatter válido.
5
+ * A regra é sobre o CONTEÚDO, não sobre o caminho: o layout `docs/<slug>/` e
6
+ * `docs/manutencao/<id>-<slug>/` descreve onde as skills gravam, não uma
7
+ * restrição de busca.
8
+ *
9
+ * Pasta sem ORQUESTRADOR é ignorada em silêncio (decisão D-12): `docs/` tem
10
+ * pastas legítimas que não são trabalho.
11
+ */
12
+ export type Trabalho = {
13
+ trabalho_id: string;
14
+ titulo: string;
15
+ pasta: string;
16
+ arquivo: string;
17
+ expx_tool: ExpxTool;
18
+ tipo_trabalho: TipoTrabalho;
19
+ tipo_ocorrencia: TipoOcorrencia | null;
20
+ estagio: Estagio;
21
+ status: StatusTrabalho;
22
+ criado_em: string;
23
+ atualizado_em: string;
24
+ concluido_em: string | null;
25
+ sprints: string[];
26
+ caminho_critico: string[];
27
+ linhas: Map<string, number>;
28
+ };
29
+ export type Descoberta = {
30
+ trabalhos: Trabalho[];
31
+ rejeicoes: Rejeicao[];
32
+ /** Todos os arquivos aceitos, para as etapas seguintes não relerem o disco. */
33
+ aceitos: Aceito[];
34
+ };
35
+ export declare function descobrirTrabalhos(raiz: string): Descoberta;
@@ -0,0 +1,28 @@
1
+ import { basename, dirname } from "node:path";
2
+ import { varrerCandidatos } from "./varredura.js";
3
+ import { lerArquivoDeEstado } from "../leitura/arquivo.js";
4
+ export function descobrirTrabalhos(raiz) {
5
+ const trabalhos = [];
6
+ const rejeicoes = [];
7
+ const aceitos = [];
8
+ for (const caminho of varrerCandidatos(raiz)) {
9
+ const r = lerArquivoDeEstado(caminho);
10
+ if (r.tipo === "rejeitado") {
11
+ rejeicoes.push(r);
12
+ continue;
13
+ }
14
+ aceitos.push(r);
15
+ if (r.kind !== "orquestrador" || basename(caminho) !== "ORQUESTRADOR.md")
16
+ continue;
17
+ const d = r.dados;
18
+ trabalhos.push({
19
+ ...d,
20
+ pasta: dirname(caminho),
21
+ arquivo: caminho,
22
+ linhas: r.linhas,
23
+ });
24
+ }
25
+ trabalhos.sort((a, b) => a.trabalho_id.localeCompare(b.trabalho_id));
26
+ return { trabalhos, rejeicoes, aceitos };
27
+ }
28
+ //# sourceMappingURL=trabalhos.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trabalhos.js","sourceRoot":"","sources":["../../../src/parser/descoberta/trabalhos.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAuC3D,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,MAAM,SAAS,GAAe,EAAE,CAAC;IACjC,MAAM,SAAS,GAAe,EAAE,CAAC;IACjC,MAAM,OAAO,GAAa,EAAE,CAAC;IAE7B,KAAK,MAAM,OAAO,IAAI,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC;QAC7C,MAAM,CAAC,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;QACtC,IAAI,CAAC,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YAC3B,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,SAAS;QACX,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAEhB,IAAI,CAAC,CAAC,IAAI,KAAK,cAAc,IAAI,QAAQ,CAAC,OAAO,CAAC,KAAK,iBAAiB;YAAE,SAAS;QAEnF,MAAM,CAAC,GAAG,CAAC,CAAC,KAAkE,CAAC;QAC/E,SAAS,CAAC,IAAI,CAAC;YACb,GAAG,CAAC;YACJ,KAAK,EAAE,OAAO,CAAC,OAAO,CAAC;YACvB,OAAO,EAAE,OAAO;YAChB,MAAM,EAAE,CAAC,CAAC,MAAM;SACjB,CAAC,CAAC;IACL,CAAC;IAED,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC;IACrE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC;AAC3C,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { sep } from "node:path";
2
+ export declare function ehCandidato(caminho: string): boolean;
3
+ export declare function varrerCandidatos(raiz: string, profundidadeMax?: number): string[];
4
+ export { sep };
@@ -0,0 +1,79 @@
1
+ import { readdirSync, statSync } from "node:fs";
2
+ import { basename, join, sep } from "node:path";
3
+ /**
4
+ * Quais arquivos são candidatos a arquivo de estado (decisão D-11).
5
+ *
6
+ * Isto é o que impede a tela "fora do schema" de virar ruído: as skills
7
+ * declaram explicitamente que os arquivos de recurso da base, o `00-LACUNAS.md`
8
+ * e o `00-AUDITORIA.md` NÃO levam frontmatter. Um projeto real tem dezenas
9
+ * deles. Varrer todo `.md` e reportar os sem frontmatter encheria a tela de
10
+ * falsos — exatamente o que a definição de pronto proíbe.
11
+ *
12
+ * Por isso a varredura é por nome conhecido, não por extensão.
13
+ */
14
+ const NOMES_EXATOS = new Set([
15
+ "ORQUESTRADOR.md",
16
+ "00-BLOQUEIOS.md",
17
+ "BLOQUEIOS.md",
18
+ "00-DECISOES.md",
19
+ "00-OCORRENCIA.md",
20
+ "01-CAUSA-RAIZ.md",
21
+ "QA.md",
22
+ "sprint.md",
23
+ "fases.md",
24
+ "tasks.md",
25
+ "INDICE.md",
26
+ "tecnico.md",
27
+ "uso.md",
28
+ // so conta dentro de base/ — ver ehCandidato
29
+ "00-INDICE.md",
30
+ ]);
31
+ const PASTAS_IGNORADAS = new Set(["node_modules", ".git", "dist", ".next", "coverage"]);
32
+ export function ehCandidato(caminho) {
33
+ const partes = caminho.split(/[\\/]/);
34
+ if (partes.some((p) => PASTAS_IGNORADAS.has(p)))
35
+ return false;
36
+ const nome = basename(caminho);
37
+ if (!NOMES_EXATOS.has(nome))
38
+ return false;
39
+ // 00-INDICE.md só conta dentro de base/
40
+ if (nome === "00-INDICE.md") {
41
+ return partes[partes.length - 2] === "base";
42
+ }
43
+ // 00-LACUNAS.md e 00-AUDITORIA.md nunca são candidatos: sem frontmatter por contrato
44
+ return true;
45
+ }
46
+ export function varrerCandidatos(raiz, profundidadeMax = 12) {
47
+ const saida = [];
48
+ function desce(dir, nivel) {
49
+ if (nivel > profundidadeMax)
50
+ return;
51
+ let entradas;
52
+ try {
53
+ entradas = readdirSync(dir);
54
+ }
55
+ catch {
56
+ return; // pasta sumiu ou sem permissão: ignora, nunca derruba
57
+ }
58
+ for (const nome of entradas) {
59
+ if (PASTAS_IGNORADAS.has(nome))
60
+ continue;
61
+ const caminho = join(dir, nome);
62
+ let info;
63
+ try {
64
+ info = statSync(caminho);
65
+ }
66
+ catch {
67
+ continue;
68
+ }
69
+ if (info.isDirectory())
70
+ desce(caminho, nivel + 1);
71
+ else if (ehCandidato(caminho))
72
+ saida.push(caminho);
73
+ }
74
+ }
75
+ desce(raiz, 0);
76
+ return saida.sort();
77
+ }
78
+ export { sep };
79
+ //# sourceMappingURL=varredura.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"varredura.js","sourceRoot":"","sources":["../../../src/parser/descoberta/varredura.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAEhD;;;;;;;;;;GAUG;AAEH,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC;IAC3B,iBAAiB;IACjB,iBAAiB;IACjB,cAAc;IACd,gBAAgB;IAChB,kBAAkB;IAClB,kBAAkB;IAClB,OAAO;IACP,WAAW;IACX,UAAU;IACV,UAAU;IACV,WAAW;IACX,YAAY;IACZ,QAAQ;IACR,6CAA6C;IAC7C,cAAc;CACf,CAAC,CAAC;AAEH,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC,CAAC,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC;AAExF,MAAM,UAAU,WAAW,CAAC,OAAe;IACzC,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACtC,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IAE9D,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC/B,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IAE1C,wCAAwC;IACxC,IAAI,IAAI,KAAK,cAAc,EAAE,CAAC;QAC5B,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,MAAM,CAAC;IAC9C,CAAC;IACD,qFAAqF;IACrF,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,IAAY,EAAE,eAAe,GAAG,EAAE;IACjE,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,SAAS,KAAK,CAAC,GAAW,EAAE,KAAa;QACvC,IAAI,KAAK,GAAG,eAAe;YAAE,OAAO;QACpC,IAAI,QAAkB,CAAC;QACvB,IAAI,CAAC;YACH,QAAQ,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;QAC9B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,sDAAsD;QAChE,CAAC;QACD,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;YAC5B,IAAI,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC;gBAAE,SAAS;YACzC,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YAChC,IAAI,IAAI,CAAC;YACT,IAAI,CAAC;gBACH,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;YAC3B,CAAC;YAAC,MAAM,CAAC;gBACP,SAAS;YACX,CAAC;YACD,IAAI,IAAI,CAAC,WAAW,EAAE;gBAAE,KAAK,CAAC,OAAO,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;iBAC7C,IAAI,WAAW,CAAC,OAAO,CAAC;gBAAE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACrD,CAAC;IACH,CAAC;IAED,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IACf,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC;AACtB,CAAC;AAED,OAAO,EAAE,GAAG,EAAE,CAAC"}
@@ -0,0 +1,60 @@
1
+ import { z } from "zod";
2
+ /** Versão do contrato que este painel sabe ler (decisão D-09). */
3
+ export declare const VERSAO_SUPORTADA = 1;
4
+ /** Os treze kinds que o painel reconhece. */
5
+ export declare const KINDS: readonly ["orquestrador", "sprint", "fases", "tasks", "bloqueios", "decisoes", "ocorrencia", "causa_raiz", "qa", "base_indice", "relatorio_tecnico", "relatorio_uso", "relatorios_indice"];
6
+ export declare const Kind: z.ZodEnum<{
7
+ ocorrencia: "ocorrencia";
8
+ causa_raiz: "causa_raiz";
9
+ orquestrador: "orquestrador";
10
+ sprint: "sprint";
11
+ fases: "fases";
12
+ tasks: "tasks";
13
+ bloqueios: "bloqueios";
14
+ decisoes: "decisoes";
15
+ qa: "qa";
16
+ base_indice: "base_indice";
17
+ relatorio_tecnico: "relatorio_tecnico";
18
+ relatorio_uso: "relatorio_uso";
19
+ relatorios_indice: "relatorios_indice";
20
+ }>;
21
+ export type Kind = z.infer<typeof Kind>;
22
+ /**
23
+ * `relatorios_indice` é o único kind sem `trabalho_id`: o índice é do sistema
24
+ * inteiro, não de um trabalho. Exigir as quatro chaves cegamente rejeitaria
25
+ * justamente a fonte da linha do tempo do histórico.
26
+ */
27
+ export declare const KINDS_SEM_TRABALHO_ID: readonly Kind[];
28
+ /**
29
+ * O cabeçalho comum. `expx_schema` é validado como número; a rejeição por
30
+ * versão futura é tratada à parte, com motivo próprio, para dar a mensagem
31
+ * que o pedido exige em vez de um erro genérico de esquema.
32
+ */
33
+ export declare const Cabecalho: z.ZodObject<{
34
+ expx_schema: z.ZodNumber;
35
+ expx_tool: z.ZodEnum<{
36
+ sprintx: "sprintx";
37
+ runx: "runx";
38
+ }>;
39
+ kind: z.ZodEnum<{
40
+ ocorrencia: "ocorrencia";
41
+ causa_raiz: "causa_raiz";
42
+ orquestrador: "orquestrador";
43
+ sprint: "sprint";
44
+ fases: "fases";
45
+ tasks: "tasks";
46
+ bloqueios: "bloqueios";
47
+ decisoes: "decisoes";
48
+ qa: "qa";
49
+ base_indice: "base_indice";
50
+ relatorio_tecnico: "relatorio_tecnico";
51
+ relatorio_uso: "relatorio_uso";
52
+ relatorios_indice: "relatorios_indice";
53
+ }>;
54
+ trabalho_id: z.ZodOptional<z.ZodString>;
55
+ }, z.core.$loose>;
56
+ export type Cabecalho = z.infer<typeof Cabecalho>;
57
+ /** O `kind` deste frontmatter, sem validar o resto — usado para rotear o esquema. */
58
+ export declare function lerKind(dados: unknown): Kind | null;
59
+ /** A versão declarada, ou null quando ausente/não numérica. */
60
+ export declare function lerVersao(dados: unknown): number | null;
@@ -0,0 +1,57 @@
1
+ import { z } from "zod";
2
+ import { ExpxTool } from "./enums.js";
3
+ /** Versão do contrato que este painel sabe ler (decisão D-09). */
4
+ export const VERSAO_SUPORTADA = 1;
5
+ /** Os treze kinds que o painel reconhece. */
6
+ export const KINDS = [
7
+ "orquestrador",
8
+ "sprint",
9
+ "fases",
10
+ "tasks",
11
+ "bloqueios",
12
+ "decisoes",
13
+ "ocorrencia",
14
+ "causa_raiz",
15
+ "qa",
16
+ "base_indice",
17
+ "relatorio_tecnico",
18
+ "relatorio_uso",
19
+ "relatorios_indice",
20
+ ];
21
+ export const Kind = z.enum(KINDS);
22
+ /**
23
+ * `relatorios_indice` é o único kind sem `trabalho_id`: o índice é do sistema
24
+ * inteiro, não de um trabalho. Exigir as quatro chaves cegamente rejeitaria
25
+ * justamente a fonte da linha do tempo do histórico.
26
+ */
27
+ export const KINDS_SEM_TRABALHO_ID = ["relatorios_indice"];
28
+ /**
29
+ * O cabeçalho comum. `expx_schema` é validado como número; a rejeição por
30
+ * versão futura é tratada à parte, com motivo próprio, para dar a mensagem
31
+ * que o pedido exige em vez de um erro genérico de esquema.
32
+ */
33
+ export const Cabecalho = z
34
+ .object({
35
+ expx_schema: z.number().int(),
36
+ expx_tool: ExpxTool,
37
+ kind: Kind,
38
+ trabalho_id: z.string().trim().min(1).optional(),
39
+ })
40
+ .passthrough()
41
+ .refine((d) => KINDS_SEM_TRABALHO_ID.includes(d.kind) || typeof d.trabalho_id === "string", { message: "trabalho_id e obrigatorio neste kind", path: ["trabalho_id"] });
42
+ /** O `kind` deste frontmatter, sem validar o resto — usado para rotear o esquema. */
43
+ export function lerKind(dados) {
44
+ if (typeof dados !== "object" || dados === null)
45
+ return null;
46
+ const k = dados["kind"];
47
+ const r = Kind.safeParse(k);
48
+ return r.success ? r.data : null;
49
+ }
50
+ /** A versão declarada, ou null quando ausente/não numérica. */
51
+ export function lerVersao(dados) {
52
+ if (typeof dados !== "object" || dados === null)
53
+ return null;
54
+ const v = dados["expx_schema"];
55
+ return typeof v === "number" && Number.isInteger(v) ? v : null;
56
+ }
57
+ //# sourceMappingURL=cabecalho.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cabecalho.js","sourceRoot":"","sources":["../../../src/parser/esquema/cabecalho.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC,kEAAkE;AAClE,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC;AAElC,6CAA6C;AAC7C,MAAM,CAAC,MAAM,KAAK,GAAG;IACnB,cAAc;IACd,QAAQ;IACR,OAAO;IACP,OAAO;IACP,WAAW;IACX,UAAU;IACV,YAAY;IACZ,YAAY;IACZ,IAAI;IACJ,aAAa;IACb,mBAAmB;IACnB,eAAe;IACf,mBAAmB;CACX,CAAC;AAEX,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAGlC;;;;GAIG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAoB,CAAC,mBAAmB,CAAC,CAAC;AAE5E;;;;GAIG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC;KACvB,MAAM,CAAC;IACN,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE;IAC7B,SAAS,EAAE,QAAQ;IACnB,IAAI,EAAE,IAAI;IACV,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;CACjD,CAAC;KACD,WAAW,EAAE;KACb,MAAM,CACL,CAAC,CAAC,EAAE,EAAE,CAAC,qBAAqB,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,CAAC,WAAW,KAAK,QAAQ,EAClF,EAAE,OAAO,EAAE,sCAAsC,EAAE,IAAI,EAAE,CAAC,aAAa,CAAC,EAAE,CAC3E,CAAC;AAIJ,qFAAqF;AACrF,MAAM,UAAU,OAAO,CAAC,KAAc;IACpC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAC7D,MAAM,CAAC,GAAI,KAAiC,CAAC,MAAM,CAAC,CAAC;IACrD,MAAM,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IAC5B,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;AACnC,CAAC;AAED,+DAA+D;AAC/D,MAAM,UAAU,SAAS,CAAC,KAAc;IACtC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAC7D,MAAM,CAAC,GAAI,KAAiC,CAAC,aAAa,CAAC,CAAC;IAC5D,OAAO,OAAO,CAAC,KAAK,QAAQ,IAAI,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AACjE,CAAC"}
@@ -0,0 +1,114 @@
1
+ import { z } from "zod";
2
+ /**
3
+ * Enums do contrato expx-schema v1.
4
+ *
5
+ * Regra 3 do contrato: todo valor de enum é minúsculo e sem acento.
6
+ * Duas distinções que o painel trata como coisas diferentes, e que um enum
7
+ * único apagaria em silêncio:
8
+ *
9
+ * - `estagio` (f1..f6, e1..e5) é a máquina de estados do método. Não confundir
10
+ * com o id de FASE do plano (`F-NN.M`), que vive em outro namespace.
11
+ * - `status` de task usa o vocabulário feminino (`concluida`, `bloqueada`);
12
+ * status de trabalho, sprint e fase usa o masculino (`concluido`, `bloqueado`).
13
+ */
14
+ export declare const ExpxTool: z.ZodEnum<{
15
+ sprintx: "sprintx";
16
+ runx: "runx";
17
+ }>;
18
+ export type ExpxTool = z.infer<typeof ExpxTool>;
19
+ export declare const TipoTrabalho: z.ZodEnum<{
20
+ feature: "feature";
21
+ ocorrencia: "ocorrencia";
22
+ }>;
23
+ export type TipoTrabalho = z.infer<typeof TipoTrabalho>;
24
+ export declare const TipoOcorrencia: z.ZodEnum<{
25
+ bug: "bug";
26
+ "melhoria-ui": "melhoria-ui";
27
+ "melhoria-ux": "melhoria-ux";
28
+ "novo-relatorio": "novo-relatorio";
29
+ "regra-de-calculo": "regra-de-calculo";
30
+ "campo-novo": "campo-novo";
31
+ outro: "outro";
32
+ }>;
33
+ export type TipoOcorrencia = z.infer<typeof TipoOcorrencia>;
34
+ /** Estágios da sprintx: F1 ingestão → F6 execução. */
35
+ export declare const ESTAGIOS_SPRINTX: readonly ["f1", "f2", "f3", "f4", "f5", "f6"];
36
+ /** Estágios da runx: E1 investigação → E5 relatório. */
37
+ export declare const ESTAGIOS_RUNX: readonly ["e1", "e2", "e3", "e4", "e5"];
38
+ export declare const Estagio: z.ZodEnum<{
39
+ f1: "f1";
40
+ f2: "f2";
41
+ f3: "f3";
42
+ f4: "f4";
43
+ f5: "f5";
44
+ f6: "f6";
45
+ e1: "e1";
46
+ e2: "e2";
47
+ e3: "e3";
48
+ e4: "e4";
49
+ e5: "e5";
50
+ }>;
51
+ export type Estagio = z.infer<typeof Estagio>;
52
+ /** Status de trabalho, sprint e fase — vocabulário masculino. */
53
+ export declare const StatusTrabalho: z.ZodEnum<{
54
+ nao_iniciado: "nao_iniciado";
55
+ em_andamento: "em_andamento";
56
+ bloqueado: "bloqueado";
57
+ concluido: "concluido";
58
+ }>;
59
+ export type StatusTrabalho = z.infer<typeof StatusTrabalho>;
60
+ /** Status de task — vocabulário feminino. */
61
+ export declare const StatusTask: z.ZodEnum<{
62
+ em_andamento: "em_andamento";
63
+ pendente: "pendente";
64
+ concluida: "concluida";
65
+ bloqueada: "bloqueada";
66
+ }>;
67
+ export type StatusTask = z.infer<typeof StatusTask>;
68
+ /** Status de decisão — vocabulário próprio (kind `decisoes`, só sprintx). */
69
+ export declare const StatusDecisao: z.ZodEnum<{
70
+ pendente: "pendente";
71
+ fechada: "fechada";
72
+ }>;
73
+ export type StatusDecisao = z.infer<typeof StatusDecisao>;
74
+ export declare const Suite: z.ZodEnum<{
75
+ verde: "verde";
76
+ vermelha: "vermelha";
77
+ nao_executada: "nao_executada";
78
+ }>;
79
+ export type Suite = z.infer<typeof Suite>;
80
+ export declare const Veredito: z.ZodEnum<{
81
+ aprovado: "aprovado";
82
+ reprovado: "reprovado";
83
+ }>;
84
+ export type Veredito = z.infer<typeof Veredito>;
85
+ export declare const Severidade: z.ZodEnum<{
86
+ alta: "alta";
87
+ media: "media";
88
+ baixa: "baixa";
89
+ }>;
90
+ export type Severidade = z.infer<typeof Severidade>;
91
+ export declare const ModoCausaRaiz: z.ZodEnum<{
92
+ causa_raiz: "causa_raiz";
93
+ analise_impacto: "analise_impacto";
94
+ }>;
95
+ export type ModoCausaRaiz = z.infer<typeof ModoCausaRaiz>;
96
+ export declare const Evidencia: z.ZodEnum<{
97
+ teste_falho: "teste_falho";
98
+ log: "log";
99
+ codigo: "codigo";
100
+ }>;
101
+ export type Evidencia = z.infer<typeof Evidencia>;
102
+ /**
103
+ * Data ISO `AAAA-MM-DD` (regra 4 do contrato).
104
+ *
105
+ * O js-yaml (dentro do gray-matter) resolve um escalar `2026-08-20` como
106
+ * objeto Date, não como string — então o parser recebe as duas formas
107
+ * dependendo de o valor estar ou não entre aspas no arquivo. Normalizamos
108
+ * para a string ISO, que é o que o contrato define e o painel exibe.
109
+ */
110
+ export declare const DataIso: z.ZodUnion<readonly [z.ZodString, z.ZodPipe<z.ZodDate, z.ZodTransform<string, Date>>]>;
111
+ /** Texto de uma linha, não vazio (regra 8 do contrato). */
112
+ export declare const TextoUmaLinha: z.ZodString;
113
+ /** Um estágio pertence à ferramenta que gravou o arquivo? (decisão D-10) */
114
+ export declare function estagioCoerenteCom(tool: ExpxTool, estagio: Estagio): boolean;