@maestro-ai/mcp-server 2.3.0 → 2.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/content/skills/specialist-dados-analytics-ia/SKILL.md +4 -2
- package/dist/content/skills/specialist-devops-infra/SKILL.md +3 -1
- package/dist/content/skills/specialist-exploracao-codebase/SKILL.md +5 -1
- package/dist/gates/quality-scorer.d.ts +25 -0
- package/dist/gates/quality-scorer.d.ts.map +1 -0
- package/dist/gates/quality-scorer.js +233 -0
- package/dist/gates/quality-scorer.js.map +1 -0
- package/dist/gates/template-parser.d.ts +60 -0
- package/dist/gates/template-parser.d.ts.map +1 -0
- package/dist/gates/template-parser.js +221 -0
- package/dist/gates/template-parser.js.map +1 -0
- package/dist/gates/template-validator.d.ts +31 -0
- package/dist/gates/template-validator.d.ts.map +1 -0
- package/dist/gates/template-validator.js +252 -0
- package/dist/gates/template-validator.js.map +1 -0
- package/dist/gates/validator.d.ts +14 -1
- package/dist/gates/validator.d.ts.map +1 -1
- package/dist/gates/validator.js +66 -1
- package/dist/gates/validator.js.map +1 -1
- package/dist/tools/validar-gate.d.ts.map +1 -1
- package/dist/tools/validar-gate.js +56 -25
- package/dist/tools/validar-gate.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
---
|
|
2
|
-
|
|
3
|
-
description: "Engenharia de dados, pipelines ETL e dashboards inteligentes"
|
|
2
|
+
name: specialist-dados-analytics-ia
|
|
3
|
+
description: "Engenharia de dados, pipelines ETL e dashboards inteligentes."
|
|
4
|
+
allowed-tools: Read, Write, Edit, Glob, Grep
|
|
4
5
|
version: "2.0"
|
|
6
|
+
framework: progressive-disclosure
|
|
5
7
|
type: "specialist"
|
|
6
8
|
domain: "analytics"
|
|
7
9
|
priority: "high"
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
---
|
|
2
|
-
|
|
2
|
+
name: specialist-devops-infra
|
|
3
3
|
description: "Engenharia DevOps para automação, CI/CD e infraestrutura como código"
|
|
4
|
+
allowed-tools: Read, Write, Edit, Glob, Grep
|
|
4
5
|
version: "2.0"
|
|
6
|
+
framework: progressive-disclosure
|
|
5
7
|
type: "specialist"
|
|
6
8
|
domain: "devops"
|
|
7
9
|
priority: "high"
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
---
|
|
2
|
-
name:
|
|
2
|
+
name: specialist-exploracao-codebase
|
|
3
|
+
description: "Exploração sistemática de codebase para mapear estrutura, dívida técnica e oportunidades de refatoração."
|
|
4
|
+
allowed-tools: Read, Write, Edit, Glob, Grep
|
|
3
5
|
version: "1.0.0"
|
|
6
|
+
framework: progressive-disclosure
|
|
4
7
|
type: "specialist"
|
|
5
8
|
category: "complementar"
|
|
6
9
|
complexity: "media"
|
|
@@ -8,6 +11,7 @@ estimated_time: "90 minutos"
|
|
|
8
11
|
score_minimo: 75
|
|
9
12
|
tags: ["codebase", "exploration", "technical-debt", "refactoring", "documentation", "analysis"]
|
|
10
13
|
dependencies: ["Codebase existente", "Debugging e Troubleshooting", "Documentação Técnica"]
|
|
14
|
+
slug: exploracao-codebase
|
|
11
15
|
---
|
|
12
16
|
|
|
13
17
|
# Especialista: Exploração de Codebase
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { TierGate } from "../types/index.js";
|
|
2
|
+
import type { TemplateStructure } from "./template-parser.js";
|
|
3
|
+
export interface QualityMetrics {
|
|
4
|
+
densidadeInformacao: number;
|
|
5
|
+
ausenciaPlaceholders: number;
|
|
6
|
+
presencaDadosConcretos: number;
|
|
7
|
+
checklistQualidade: number;
|
|
8
|
+
overall: number;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Calcula métricas de qualidade do entregável
|
|
12
|
+
*/
|
|
13
|
+
export declare function calcularQualidade(entregavel: string, template: TemplateStructure, tier?: TierGate): QualityMetrics;
|
|
14
|
+
/**
|
|
15
|
+
* Gera relatório de qualidade detalhado
|
|
16
|
+
*/
|
|
17
|
+
export declare function gerarRelatorioQualidade(metricas: QualityMetrics, tier: TierGate): string;
|
|
18
|
+
/**
|
|
19
|
+
* Compara qualidade com tier esperado
|
|
20
|
+
*/
|
|
21
|
+
export declare function compararComTier(metricas: QualityMetrics, tier: TierGate): {
|
|
22
|
+
adequado: boolean;
|
|
23
|
+
mensagem: string;
|
|
24
|
+
};
|
|
25
|
+
//# sourceMappingURL=quality-scorer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quality-scorer.d.ts","sourceRoot":"","sources":["../../src/gates/quality-scorer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAE9D,MAAM,WAAW,cAAc;IAC3B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,sBAAsB,EAAE,MAAM,CAAC;IAC/B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC7B,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,iBAAiB,EAC3B,IAAI,GAAE,QAAiB,GACxB,cAAc,CAoBhB;AA+GD;;GAEG;AACH,wBAAgB,uBAAuB,CACnC,QAAQ,EAAE,cAAc,EACxB,IAAI,EAAE,QAAQ,GACf,MAAM,CA6BR;AA0FD;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,cAAc,EAAE,IAAI,EAAE,QAAQ,GAAG;IACvE,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;CACpB,CAmBA"}
|
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Calcula métricas de qualidade do entregável
|
|
3
|
+
*/
|
|
4
|
+
export function calcularQualidade(entregavel, template, tier = "base") {
|
|
5
|
+
const densidadeInformacao = calcularDensidadeInformacao(entregavel);
|
|
6
|
+
const ausenciaPlaceholders = calcularAusenciaPlaceholders(entregavel, template);
|
|
7
|
+
const presencaDadosConcretos = calcularPresencaDadosConcretos(entregavel);
|
|
8
|
+
const checklistQualidade = calcularChecklistQualidade(entregavel, template);
|
|
9
|
+
const overall = Math.round((densidadeInformacao * 0.3) +
|
|
10
|
+
(ausenciaPlaceholders * 0.3) +
|
|
11
|
+
(presencaDadosConcretos * 0.2) +
|
|
12
|
+
(checklistQualidade * 0.2));
|
|
13
|
+
return {
|
|
14
|
+
densidadeInformacao,
|
|
15
|
+
ausenciaPlaceholders,
|
|
16
|
+
presencaDadosConcretos,
|
|
17
|
+
checklistQualidade,
|
|
18
|
+
overall,
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Calcula densidade de informação (chars úteis / seção)
|
|
23
|
+
*/
|
|
24
|
+
function calcularDensidadeInformacao(entregavel) {
|
|
25
|
+
const linhas = entregavel.split("\n");
|
|
26
|
+
let charsUteis = 0;
|
|
27
|
+
let totalLinhas = 0;
|
|
28
|
+
for (const linha of linhas) {
|
|
29
|
+
const linhaTrimmed = linha.trim();
|
|
30
|
+
// Ignora linhas vazias, headers, separadores
|
|
31
|
+
if (linhaTrimmed.length === 0 ||
|
|
32
|
+
linhaTrimmed.match(/^#{1,6}\s/) ||
|
|
33
|
+
linhaTrimmed.match(/^-{3,}$/) ||
|
|
34
|
+
linhaTrimmed.match(/^={3,}$/)) {
|
|
35
|
+
continue;
|
|
36
|
+
}
|
|
37
|
+
charsUteis += linhaTrimmed.length;
|
|
38
|
+
totalLinhas++;
|
|
39
|
+
}
|
|
40
|
+
const mediaPorLinha = totalLinhas > 0 ? charsUteis / totalLinhas : 0;
|
|
41
|
+
// Score baseado em média de 50 chars/linha como ideal
|
|
42
|
+
const score = Math.min((mediaPorLinha / 50) * 100, 100);
|
|
43
|
+
return Math.round(score);
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Calcula score de ausência de placeholders
|
|
47
|
+
*/
|
|
48
|
+
function calcularAusenciaPlaceholders(entregavel, template) {
|
|
49
|
+
if (template.camposObrigatorios.length === 0) {
|
|
50
|
+
return 100;
|
|
51
|
+
}
|
|
52
|
+
let placeholdersEncontrados = 0;
|
|
53
|
+
for (const campo of template.camposObrigatorios) {
|
|
54
|
+
const regex = new RegExp(`\\[${campo}\\]`, "i");
|
|
55
|
+
if (regex.test(entregavel)) {
|
|
56
|
+
placeholdersEncontrados++;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
const score = ((template.camposObrigatorios.length - placeholdersEncontrados) / template.camposObrigatorios.length) * 100;
|
|
60
|
+
return Math.round(score);
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Calcula presença de dados concretos (números, datas, URLs, etc)
|
|
64
|
+
*/
|
|
65
|
+
function calcularPresencaDadosConcretos(entregavel) {
|
|
66
|
+
const indicadores = [
|
|
67
|
+
/\d{1,3}%/g, // Percentuais
|
|
68
|
+
/\d+\s*(usuários|users|clientes)/gi, // Números de usuários
|
|
69
|
+
/\d{4}-\d{2}-\d{2}/g, // Datas ISO
|
|
70
|
+
/\d{1,2}\/\d{1,2}\/\d{2,4}/g, // Datas BR/US
|
|
71
|
+
/https?:\/\/[^\s]+/g, // URLs
|
|
72
|
+
/\$\d+/g, // Valores monetários
|
|
73
|
+
/\d+\s*(ms|seg|min|hora)/gi, // Tempos
|
|
74
|
+
/\d+\s*(MB|GB|KB)/gi, // Tamanhos
|
|
75
|
+
];
|
|
76
|
+
let totalIndicadores = 0;
|
|
77
|
+
for (const regex of indicadores) {
|
|
78
|
+
const matches = entregavel.match(regex);
|
|
79
|
+
if (matches) {
|
|
80
|
+
totalIndicadores += matches.length;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
// Score baseado em pelo menos 10 dados concretos
|
|
84
|
+
const score = Math.min((totalIndicadores / 10) * 100, 100);
|
|
85
|
+
return Math.round(score);
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Calcula score do checklist de qualidade
|
|
89
|
+
*/
|
|
90
|
+
function calcularChecklistQualidade(entregavel, template) {
|
|
91
|
+
if (template.checklistQualidade.length === 0) {
|
|
92
|
+
return 100;
|
|
93
|
+
}
|
|
94
|
+
let itensPreenchidos = 0;
|
|
95
|
+
for (const item of template.checklistQualidade) {
|
|
96
|
+
const textoLimpo = item
|
|
97
|
+
.toLowerCase()
|
|
98
|
+
.replace(/[^a-z0-9\s]/g, "")
|
|
99
|
+
.slice(0, 30);
|
|
100
|
+
const regex = new RegExp(`\\[x\\].*?${textoLimpo}`, "i");
|
|
101
|
+
if (regex.test(entregavel)) {
|
|
102
|
+
itensPreenchidos++;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
const score = (itensPreenchidos / template.checklistQualidade.length) * 100;
|
|
106
|
+
return Math.round(score);
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Gera relatório de qualidade detalhado
|
|
110
|
+
*/
|
|
111
|
+
export function gerarRelatorioQualidade(metricas, tier) {
|
|
112
|
+
let relatorio = `## 📈 Relatório de Qualidade\n\n`;
|
|
113
|
+
relatorio += `**Score Geral:** ${metricas.overall}/100\n\n`;
|
|
114
|
+
relatorio += `### Métricas Detalhadas\n\n`;
|
|
115
|
+
relatorio += `- **Densidade de Informação:** ${metricas.densidadeInformacao}/100\n`;
|
|
116
|
+
relatorio += ` ${getStatusEmoji(metricas.densidadeInformacao)} ${getStatusTexto(metricas.densidadeInformacao, "densidade")}\n\n`;
|
|
117
|
+
relatorio += `- **Ausência de Placeholders:** ${metricas.ausenciaPlaceholders}/100\n`;
|
|
118
|
+
relatorio += ` ${getStatusEmoji(metricas.ausenciaPlaceholders)} ${getStatusTexto(metricas.ausenciaPlaceholders, "placeholders")}\n\n`;
|
|
119
|
+
relatorio += `- **Presença de Dados Concretos:** ${metricas.presencaDadosConcretos}/100\n`;
|
|
120
|
+
relatorio += ` ${getStatusEmoji(metricas.presencaDadosConcretos)} ${getStatusTexto(metricas.presencaDadosConcretos, "dados")}\n\n`;
|
|
121
|
+
relatorio += `- **Checklist de Qualidade:** ${metricas.checklistQualidade}/100\n`;
|
|
122
|
+
relatorio += ` ${getStatusEmoji(metricas.checklistQualidade)} ${getStatusTexto(metricas.checklistQualidade, "checklist")}\n\n`;
|
|
123
|
+
// Sugestões baseadas em tier
|
|
124
|
+
const sugestoes = gerarSugestoesQualidade(metricas, tier);
|
|
125
|
+
if (sugestoes.length > 0) {
|
|
126
|
+
relatorio += `### 💡 Sugestões de Melhoria\n\n`;
|
|
127
|
+
sugestoes.forEach(s => {
|
|
128
|
+
relatorio += `- ${s}\n`;
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
return relatorio;
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Retorna emoji baseado no score
|
|
135
|
+
*/
|
|
136
|
+
function getStatusEmoji(score) {
|
|
137
|
+
if (score >= 80)
|
|
138
|
+
return "✅";
|
|
139
|
+
if (score >= 60)
|
|
140
|
+
return "⚠️";
|
|
141
|
+
return "❌";
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Retorna texto de status baseado no score e tipo
|
|
145
|
+
*/
|
|
146
|
+
function getStatusTexto(score, tipo) {
|
|
147
|
+
if (score >= 80) {
|
|
148
|
+
switch (tipo) {
|
|
149
|
+
case "densidade":
|
|
150
|
+
return "Conteúdo bem detalhado";
|
|
151
|
+
case "placeholders":
|
|
152
|
+
return "Todos os campos preenchidos";
|
|
153
|
+
case "dados":
|
|
154
|
+
return "Dados concretos presentes";
|
|
155
|
+
case "checklist":
|
|
156
|
+
return "Checklist completo";
|
|
157
|
+
default:
|
|
158
|
+
return "Excelente";
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
if (score >= 60) {
|
|
162
|
+
switch (tipo) {
|
|
163
|
+
case "densidade":
|
|
164
|
+
return "Conteúdo pode ser mais detalhado";
|
|
165
|
+
case "placeholders":
|
|
166
|
+
return "Alguns campos ainda não preenchidos";
|
|
167
|
+
case "dados":
|
|
168
|
+
return "Adicione mais dados concretos";
|
|
169
|
+
case "checklist":
|
|
170
|
+
return "Complete o checklist";
|
|
171
|
+
default:
|
|
172
|
+
return "Bom, mas pode melhorar";
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
switch (tipo) {
|
|
176
|
+
case "densidade":
|
|
177
|
+
return "Conteúdo muito superficial";
|
|
178
|
+
case "placeholders":
|
|
179
|
+
return "Muitos campos não preenchidos";
|
|
180
|
+
case "dados":
|
|
181
|
+
return "Faltam dados concretos";
|
|
182
|
+
case "checklist":
|
|
183
|
+
return "Checklist incompleto";
|
|
184
|
+
default:
|
|
185
|
+
return "Precisa melhorar";
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Gera sugestões de melhoria baseadas nas métricas
|
|
190
|
+
*/
|
|
191
|
+
function gerarSugestoesQualidade(metricas, tier) {
|
|
192
|
+
const sugestoes = [];
|
|
193
|
+
if (metricas.densidadeInformacao < 70) {
|
|
194
|
+
sugestoes.push("Adicione mais detalhes e contexto em cada seção");
|
|
195
|
+
sugestoes.push("Expanda as descrições com exemplos práticos");
|
|
196
|
+
}
|
|
197
|
+
if (metricas.ausenciaPlaceholders < 80) {
|
|
198
|
+
sugestoes.push("Substitua todos os placeholders [Campo] por valores reais");
|
|
199
|
+
}
|
|
200
|
+
if (metricas.presencaDadosConcretos < 60) {
|
|
201
|
+
sugestoes.push("Inclua dados concretos: números, percentuais, datas, URLs");
|
|
202
|
+
sugestoes.push("Adicione métricas mensuráveis e objetivos quantificáveis");
|
|
203
|
+
}
|
|
204
|
+
if (metricas.checklistQualidade < 70 && tier !== "essencial") {
|
|
205
|
+
sugestoes.push("Complete o checklist de qualidade no final do documento");
|
|
206
|
+
}
|
|
207
|
+
if (metricas.overall < 60) {
|
|
208
|
+
sugestoes.push("Revise o template da skill para garantir completude");
|
|
209
|
+
}
|
|
210
|
+
return sugestoes;
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Compara qualidade com tier esperado
|
|
214
|
+
*/
|
|
215
|
+
export function compararComTier(metricas, tier) {
|
|
216
|
+
const requisitos = {
|
|
217
|
+
essencial: 50,
|
|
218
|
+
base: 70,
|
|
219
|
+
avancado: 85,
|
|
220
|
+
};
|
|
221
|
+
const scoreMinimo = requisitos[tier];
|
|
222
|
+
const adequado = metricas.overall >= scoreMinimo;
|
|
223
|
+
let mensagem = "";
|
|
224
|
+
if (adequado) {
|
|
225
|
+
mensagem = `✅ Qualidade adequada para tier ${tier} (mínimo: ${scoreMinimo})`;
|
|
226
|
+
}
|
|
227
|
+
else {
|
|
228
|
+
const diferenca = scoreMinimo - metricas.overall;
|
|
229
|
+
mensagem = `⚠️ Qualidade abaixo do tier ${tier}. Faltam ${diferenca} pontos para atingir o mínimo de ${scoreMinimo}`;
|
|
230
|
+
}
|
|
231
|
+
return { adequado, mensagem };
|
|
232
|
+
}
|
|
233
|
+
//# sourceMappingURL=quality-scorer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quality-scorer.js","sourceRoot":"","sources":["../../src/gates/quality-scorer.ts"],"names":[],"mappings":"AAWA;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAC7B,UAAkB,EAClB,QAA2B,EAC3B,OAAiB,MAAM;IAEvB,MAAM,mBAAmB,GAAG,2BAA2B,CAAC,UAAU,CAAC,CAAC;IACpE,MAAM,oBAAoB,GAAG,4BAA4B,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;IAChF,MAAM,sBAAsB,GAAG,8BAA8B,CAAC,UAAU,CAAC,CAAC;IAC1E,MAAM,kBAAkB,GAAG,0BAA0B,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;IAE5E,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CACtB,CAAC,mBAAmB,GAAG,GAAG,CAAC;QAC3B,CAAC,oBAAoB,GAAG,GAAG,CAAC;QAC5B,CAAC,sBAAsB,GAAG,GAAG,CAAC;QAC9B,CAAC,kBAAkB,GAAG,GAAG,CAAC,CAC7B,CAAC;IAEF,OAAO;QACH,mBAAmB;QACnB,oBAAoB;QACpB,sBAAsB;QACtB,kBAAkB;QAClB,OAAO;KACV,CAAC;AACN,CAAC;AAED;;GAEG;AACH,SAAS,2BAA2B,CAAC,UAAkB;IACnD,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACtC,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,IAAI,WAAW,GAAG,CAAC,CAAC;IAEpB,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QACzB,MAAM,YAAY,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;QAElC,6CAA6C;QAC7C,IACI,YAAY,CAAC,MAAM,KAAK,CAAC;YACzB,YAAY,CAAC,KAAK,CAAC,WAAW,CAAC;YAC/B,YAAY,CAAC,KAAK,CAAC,SAAS,CAAC;YAC7B,YAAY,CAAC,KAAK,CAAC,SAAS,CAAC,EAC/B,CAAC;YACC,SAAS;QACb,CAAC;QAED,UAAU,IAAI,YAAY,CAAC,MAAM,CAAC;QAClC,WAAW,EAAE,CAAC;IAClB,CAAC;IAED,MAAM,aAAa,GAAG,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;IAErE,sDAAsD;IACtD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,aAAa,GAAG,EAAE,CAAC,GAAG,GAAG,EAAE,GAAG,CAAC,CAAC;IACxD,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;AAC7B,CAAC;AAED;;GAEG;AACH,SAAS,4BAA4B,CAAC,UAAkB,EAAE,QAA2B;IACjF,IAAI,QAAQ,CAAC,kBAAkB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3C,OAAO,GAAG,CAAC;IACf,CAAC;IAED,IAAI,uBAAuB,GAAG,CAAC,CAAC;IAEhC,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,kBAAkB,EAAE,CAAC;QAC9C,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,MAAM,KAAK,KAAK,EAAE,GAAG,CAAC,CAAC;QAChD,IAAI,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;YACzB,uBAAuB,EAAE,CAAC;QAC9B,CAAC;IACL,CAAC;IAED,MAAM,KAAK,GAAG,CAAC,CAAC,QAAQ,CAAC,kBAAkB,CAAC,MAAM,GAAG,uBAAuB,CAAC,GAAG,QAAQ,CAAC,kBAAkB,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC;IAC1H,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;AAC7B,CAAC;AAED;;GAEG;AACH,SAAS,8BAA8B,CAAC,UAAkB;IACtD,MAAM,WAAW,GAAG;QAChB,WAAW,EAAqB,cAAc;QAC9C,mCAAmC,EAAE,sBAAsB;QAC3D,oBAAoB,EAAY,YAAY;QAC5C,4BAA4B,EAAI,cAAc;QAC9C,oBAAoB,EAAY,OAAO;QACvC,QAAQ,EAAwB,qBAAqB;QACrD,2BAA2B,EAAK,SAAS;QACzC,oBAAoB,EAAY,WAAW;KAC9C,CAAC;IAEF,IAAI,gBAAgB,GAAG,CAAC,CAAC;IAEzB,KAAK,MAAM,KAAK,IAAI,WAAW,EAAE,CAAC;QAC9B,MAAM,OAAO,GAAG,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACxC,IAAI,OAAO,EAAE,CAAC;YACV,gBAAgB,IAAI,OAAO,CAAC,MAAM,CAAC;QACvC,CAAC;IACL,CAAC;IAED,iDAAiD;IACjD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,gBAAgB,GAAG,EAAE,CAAC,GAAG,GAAG,EAAE,GAAG,CAAC,CAAC;IAC3D,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;AAC7B,CAAC;AAED;;GAEG;AACH,SAAS,0BAA0B,CAAC,UAAkB,EAAE,QAA2B;IAC/E,IAAI,QAAQ,CAAC,kBAAkB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3C,OAAO,GAAG,CAAC;IACf,CAAC;IAED,IAAI,gBAAgB,GAAG,CAAC,CAAC;IAEzB,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,kBAAkB,EAAE,CAAC;QAC7C,MAAM,UAAU,GAAG,IAAI;aAClB,WAAW,EAAE;aACb,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC;aAC3B,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAElB,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,aAAa,UAAU,EAAE,EAAE,GAAG,CAAC,CAAC;QAEzD,IAAI,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;YACzB,gBAAgB,EAAE,CAAC;QACvB,CAAC;IACL,CAAC;IAED,MAAM,KAAK,GAAG,CAAC,gBAAgB,GAAG,QAAQ,CAAC,kBAAkB,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC;IAC5E,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;AAC7B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,uBAAuB,CACnC,QAAwB,EACxB,IAAc;IAEd,IAAI,SAAS,GAAG,kCAAkC,CAAC;IAEnD,SAAS,IAAI,oBAAoB,QAAQ,CAAC,OAAO,UAAU,CAAC;IAE5D,SAAS,IAAI,6BAA6B,CAAC;IAE3C,SAAS,IAAI,kCAAkC,QAAQ,CAAC,mBAAmB,QAAQ,CAAC;IACpF,SAAS,IAAI,KAAK,cAAc,CAAC,QAAQ,CAAC,mBAAmB,CAAC,IAAI,cAAc,CAAC,QAAQ,CAAC,mBAAmB,EAAE,WAAW,CAAC,MAAM,CAAC;IAElI,SAAS,IAAI,mCAAmC,QAAQ,CAAC,oBAAoB,QAAQ,CAAC;IACtF,SAAS,IAAI,KAAK,cAAc,CAAC,QAAQ,CAAC,oBAAoB,CAAC,IAAI,cAAc,CAAC,QAAQ,CAAC,oBAAoB,EAAE,cAAc,CAAC,MAAM,CAAC;IAEvI,SAAS,IAAI,sCAAsC,QAAQ,CAAC,sBAAsB,QAAQ,CAAC;IAC3F,SAAS,IAAI,KAAK,cAAc,CAAC,QAAQ,CAAC,sBAAsB,CAAC,IAAI,cAAc,CAAC,QAAQ,CAAC,sBAAsB,EAAE,OAAO,CAAC,MAAM,CAAC;IAEpI,SAAS,IAAI,iCAAiC,QAAQ,CAAC,kBAAkB,QAAQ,CAAC;IAClF,SAAS,IAAI,KAAK,cAAc,CAAC,QAAQ,CAAC,kBAAkB,CAAC,IAAI,cAAc,CAAC,QAAQ,CAAC,kBAAkB,EAAE,WAAW,CAAC,MAAM,CAAC;IAEhI,6BAA6B;IAC7B,MAAM,SAAS,GAAG,uBAAuB,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IAC1D,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,SAAS,IAAI,kCAAkC,CAAC;QAChD,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;YAClB,SAAS,IAAI,KAAK,CAAC,IAAI,CAAC;QAC5B,CAAC,CAAC,CAAC;IACP,CAAC;IAED,OAAO,SAAS,CAAC;AACrB,CAAC;AAED;;GAEG;AACH,SAAS,cAAc,CAAC,KAAa;IACjC,IAAI,KAAK,IAAI,EAAE;QAAE,OAAO,GAAG,CAAC;IAC5B,IAAI,KAAK,IAAI,EAAE;QAAE,OAAO,IAAI,CAAC;IAC7B,OAAO,GAAG,CAAC;AACf,CAAC;AAED;;GAEG;AACH,SAAS,cAAc,CAAC,KAAa,EAAE,IAAY;IAC/C,IAAI,KAAK,IAAI,EAAE,EAAE,CAAC;QACd,QAAQ,IAAI,EAAE,CAAC;YACX,KAAK,WAAW;gBACZ,OAAO,wBAAwB,CAAC;YACpC,KAAK,cAAc;gBACf,OAAO,6BAA6B,CAAC;YACzC,KAAK,OAAO;gBACR,OAAO,2BAA2B,CAAC;YACvC,KAAK,WAAW;gBACZ,OAAO,oBAAoB,CAAC;YAChC;gBACI,OAAO,WAAW,CAAC;QAC3B,CAAC;IACL,CAAC;IAED,IAAI,KAAK,IAAI,EAAE,EAAE,CAAC;QACd,QAAQ,IAAI,EAAE,CAAC;YACX,KAAK,WAAW;gBACZ,OAAO,kCAAkC,CAAC;YAC9C,KAAK,cAAc;gBACf,OAAO,qCAAqC,CAAC;YACjD,KAAK,OAAO;gBACR,OAAO,+BAA+B,CAAC;YAC3C,KAAK,WAAW;gBACZ,OAAO,sBAAsB,CAAC;YAClC;gBACI,OAAO,wBAAwB,CAAC;QACxC,CAAC;IACL,CAAC;IAED,QAAQ,IAAI,EAAE,CAAC;QACX,KAAK,WAAW;YACZ,OAAO,4BAA4B,CAAC;QACxC,KAAK,cAAc;YACf,OAAO,+BAA+B,CAAC;QAC3C,KAAK,OAAO;YACR,OAAO,wBAAwB,CAAC;QACpC,KAAK,WAAW;YACZ,OAAO,sBAAsB,CAAC;QAClC;YACI,OAAO,kBAAkB,CAAC;IAClC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,SAAS,uBAAuB,CAAC,QAAwB,EAAE,IAAc;IACrE,MAAM,SAAS,GAAa,EAAE,CAAC;IAE/B,IAAI,QAAQ,CAAC,mBAAmB,GAAG,EAAE,EAAE,CAAC;QACpC,SAAS,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAC;QAClE,SAAS,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;IAClE,CAAC;IAED,IAAI,QAAQ,CAAC,oBAAoB,GAAG,EAAE,EAAE,CAAC;QACrC,SAAS,CAAC,IAAI,CAAC,2DAA2D,CAAC,CAAC;IAChF,CAAC;IAED,IAAI,QAAQ,CAAC,sBAAsB,GAAG,EAAE,EAAE,CAAC;QACvC,SAAS,CAAC,IAAI,CAAC,2DAA2D,CAAC,CAAC;QAC5E,SAAS,CAAC,IAAI,CAAC,0DAA0D,CAAC,CAAC;IAC/E,CAAC;IAED,IAAI,QAAQ,CAAC,kBAAkB,GAAG,EAAE,IAAI,IAAI,KAAK,WAAW,EAAE,CAAC;QAC3D,SAAS,CAAC,IAAI,CAAC,yDAAyD,CAAC,CAAC;IAC9E,CAAC;IAED,IAAI,QAAQ,CAAC,OAAO,GAAG,EAAE,EAAE,CAAC;QACxB,SAAS,CAAC,IAAI,CAAC,qDAAqD,CAAC,CAAC;IAC1E,CAAC;IAED,OAAO,SAAS,CAAC;AACrB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,QAAwB,EAAE,IAAc;IAIpE,MAAM,UAAU,GAA6B;QACzC,SAAS,EAAE,EAAE;QACb,IAAI,EAAE,EAAE;QACR,QAAQ,EAAE,EAAE;KACf,CAAC;IAEF,MAAM,WAAW,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;IACrC,MAAM,QAAQ,GAAG,QAAQ,CAAC,OAAO,IAAI,WAAW,CAAC;IAEjD,IAAI,QAAQ,GAAG,EAAE,CAAC;IAClB,IAAI,QAAQ,EAAE,CAAC;QACX,QAAQ,GAAG,kCAAkC,IAAI,aAAa,WAAW,GAAG,CAAC;IACjF,CAAC;SAAM,CAAC;QACJ,MAAM,SAAS,GAAG,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC;QACjD,QAAQ,GAAG,+BAA+B,IAAI,YAAY,SAAS,oCAAoC,WAAW,EAAE,CAAC;IACzH,CAAC;IAED,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;AAClC,CAAC"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import type { TierGate } from "../types/index.js";
|
|
2
|
+
export interface TemplateMetadata {
|
|
3
|
+
fase: string;
|
|
4
|
+
skill: string;
|
|
5
|
+
versao?: string;
|
|
6
|
+
autor?: string;
|
|
7
|
+
}
|
|
8
|
+
export interface TemplateCheckbox {
|
|
9
|
+
secao: string;
|
|
10
|
+
texto: string;
|
|
11
|
+
obrigatorio: boolean;
|
|
12
|
+
tierMinimo: TierGate;
|
|
13
|
+
linha: number;
|
|
14
|
+
}
|
|
15
|
+
export interface TemplateSection {
|
|
16
|
+
nivel: number;
|
|
17
|
+
titulo: string;
|
|
18
|
+
tituloCompleto: string;
|
|
19
|
+
obrigatorio: boolean;
|
|
20
|
+
tierMinimo: TierGate;
|
|
21
|
+
subsecoes: TemplateSection[];
|
|
22
|
+
checkboxes: TemplateCheckbox[];
|
|
23
|
+
conteudo: string;
|
|
24
|
+
linha: number;
|
|
25
|
+
}
|
|
26
|
+
export interface TemplateStructure {
|
|
27
|
+
secoes: TemplateSection[];
|
|
28
|
+
checkboxes: TemplateCheckbox[];
|
|
29
|
+
camposObrigatorios: string[];
|
|
30
|
+
checklistQualidade: string[];
|
|
31
|
+
metadata: TemplateMetadata;
|
|
32
|
+
conteudoCompleto: string;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Parseia um template markdown e extrai sua estrutura
|
|
36
|
+
*/
|
|
37
|
+
export declare function parseTemplate(templatePath: string): TemplateStructure | null;
|
|
38
|
+
/**
|
|
39
|
+
* Conta checkboxes por tier
|
|
40
|
+
*/
|
|
41
|
+
export declare function contarCheckboxesPorTier(estrutura: TemplateStructure, tier: TierGate): number;
|
|
42
|
+
/**
|
|
43
|
+
* Obtém seções obrigatórias por tier
|
|
44
|
+
*/
|
|
45
|
+
export declare function getSecoesObrigatoriasPorTier(estrutura: TemplateStructure, tier: TierGate): TemplateSection[];
|
|
46
|
+
/**
|
|
47
|
+
* Gera regex para encontrar seção no entregável
|
|
48
|
+
*/
|
|
49
|
+
export declare function gerarRegexSecao(secao: TemplateSection): RegExp;
|
|
50
|
+
/**
|
|
51
|
+
* Extrai estatísticas do template
|
|
52
|
+
*/
|
|
53
|
+
export declare function getEstatisticasTemplate(estrutura: TemplateStructure): {
|
|
54
|
+
totalSecoes: number;
|
|
55
|
+
totalCheckboxes: number;
|
|
56
|
+
totalCamposObrigatorios: number;
|
|
57
|
+
totalChecklistQualidade: number;
|
|
58
|
+
profundidadeMaxima: number;
|
|
59
|
+
};
|
|
60
|
+
//# sourceMappingURL=template-parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"template-parser.d.ts","sourceRoot":"","sources":["../../src/gates/template-parser.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAElD,MAAM,WAAW,gBAAgB;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,gBAAgB;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,OAAO,CAAC;IACrB,UAAU,EAAE,QAAQ,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,eAAe;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,OAAO,CAAC;IACrB,UAAU,EAAE,QAAQ,CAAC;IACrB,SAAS,EAAE,eAAe,EAAE,CAAC;IAC7B,UAAU,EAAE,gBAAgB,EAAE,CAAC;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,iBAAiB;IAC9B,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,UAAU,EAAE,gBAAgB,EAAE,CAAC;IAC/B,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,gBAAgB,EAAE,MAAM,CAAC;CAC5B;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,YAAY,EAAE,MAAM,GAAG,iBAAiB,GAAG,IAAI,CAsH5E;AAsDD;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,SAAS,EAAE,iBAAiB,EAAE,IAAI,EAAE,QAAQ,GAAG,MAAM,CAQ5F;AAED;;GAEG;AACH,wBAAgB,4BAA4B,CACxC,SAAS,EAAE,iBAAiB,EAC5B,IAAI,EAAE,QAAQ,GACf,eAAe,EAAE,CAgBnB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,eAAe,GAAG,MAAM,CAO9D;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,SAAS,EAAE,iBAAiB,GAAG;IACnE,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,uBAAuB,EAAE,MAAM,CAAC;IAChC,uBAAuB,EAAE,MAAM,CAAC;IAChC,kBAAkB,EAAE,MAAM,CAAC;CAC9B,CAqBA"}
|
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
import { readFileSync, existsSync } from "fs";
|
|
2
|
+
/**
|
|
3
|
+
* Parseia um template markdown e extrai sua estrutura
|
|
4
|
+
*/
|
|
5
|
+
export function parseTemplate(templatePath) {
|
|
6
|
+
if (!existsSync(templatePath)) {
|
|
7
|
+
return null;
|
|
8
|
+
}
|
|
9
|
+
const conteudo = readFileSync(templatePath, "utf-8");
|
|
10
|
+
const linhas = conteudo.split("\n");
|
|
11
|
+
const secoes = [];
|
|
12
|
+
const checkboxes = [];
|
|
13
|
+
const camposObrigatorios = [];
|
|
14
|
+
const checklistQualidade = [];
|
|
15
|
+
let secaoAtual = null;
|
|
16
|
+
let pilhaSecoes = [];
|
|
17
|
+
let dentroChecklistQualidade = false;
|
|
18
|
+
for (let i = 0; i < linhas.length; i++) {
|
|
19
|
+
const linha = linhas[i];
|
|
20
|
+
const numeroLinha = i + 1;
|
|
21
|
+
// Detectar checklist de qualidade
|
|
22
|
+
if (linha.match(/^#{1,3}\s*checklist\s+(de\s+)?qualidade/i)) {
|
|
23
|
+
dentroChecklistQualidade = true;
|
|
24
|
+
continue;
|
|
25
|
+
}
|
|
26
|
+
// Extrair itens do checklist de qualidade
|
|
27
|
+
if (dentroChecklistQualidade && linha.match(/^-\s*\[\s*\]/)) {
|
|
28
|
+
const match = linha.match(/^-\s*\[\s*\]\s*\*?\*?(.+?)\*?\*?$/);
|
|
29
|
+
if (match) {
|
|
30
|
+
checklistQualidade.push(match[1].trim());
|
|
31
|
+
}
|
|
32
|
+
continue;
|
|
33
|
+
}
|
|
34
|
+
// Detectar headers (seções)
|
|
35
|
+
const headerMatch = linha.match(/^(#{1,6})\s+(.+)$/);
|
|
36
|
+
if (headerMatch) {
|
|
37
|
+
dentroChecklistQualidade = false;
|
|
38
|
+
const nivel = headerMatch[1].length;
|
|
39
|
+
const titulo = headerMatch[2].trim();
|
|
40
|
+
const secao = {
|
|
41
|
+
nivel,
|
|
42
|
+
titulo: limparTitulo(titulo),
|
|
43
|
+
tituloCompleto: titulo,
|
|
44
|
+
obrigatorio: true,
|
|
45
|
+
tierMinimo: "base",
|
|
46
|
+
subsecoes: [],
|
|
47
|
+
checkboxes: [],
|
|
48
|
+
conteudo: "",
|
|
49
|
+
linha: numeroLinha,
|
|
50
|
+
};
|
|
51
|
+
// Ajustar hierarquia de seções
|
|
52
|
+
while (pilhaSecoes.length > 0 && pilhaSecoes[pilhaSecoes.length - 1].nivel >= nivel) {
|
|
53
|
+
pilhaSecoes.pop();
|
|
54
|
+
}
|
|
55
|
+
if (pilhaSecoes.length === 0) {
|
|
56
|
+
secoes.push(secao);
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
pilhaSecoes[pilhaSecoes.length - 1].subsecoes.push(secao);
|
|
60
|
+
}
|
|
61
|
+
pilhaSecoes.push(secao);
|
|
62
|
+
secaoAtual = secao;
|
|
63
|
+
continue;
|
|
64
|
+
}
|
|
65
|
+
// Detectar checkboxes
|
|
66
|
+
const checkboxMatch = linha.match(/^-?\s*\[\s*\]\s*\*?\*?(.+?):?\*?\*?\s*(.*)$/);
|
|
67
|
+
if (checkboxMatch && secaoAtual) {
|
|
68
|
+
const textoCheckbox = checkboxMatch[1].trim();
|
|
69
|
+
const descricao = checkboxMatch[2].trim();
|
|
70
|
+
const checkbox = {
|
|
71
|
+
secao: secaoAtual.titulo,
|
|
72
|
+
texto: textoCheckbox + (descricao ? ": " + descricao : ""),
|
|
73
|
+
obrigatorio: true,
|
|
74
|
+
tierMinimo: "base",
|
|
75
|
+
linha: numeroLinha,
|
|
76
|
+
};
|
|
77
|
+
secaoAtual.checkboxes.push(checkbox);
|
|
78
|
+
checkboxes.push(checkbox);
|
|
79
|
+
continue;
|
|
80
|
+
}
|
|
81
|
+
// Detectar campos obrigatórios (placeholders)
|
|
82
|
+
const placeholderMatches = linha.matchAll(/\[([^\]]+)\]/g);
|
|
83
|
+
for (const match of placeholderMatches) {
|
|
84
|
+
const campo = match[1];
|
|
85
|
+
if (!campo.includes("http") && !campo.includes("Data") && campo.length > 3) {
|
|
86
|
+
if (!camposObrigatorios.includes(campo)) {
|
|
87
|
+
camposObrigatorios.push(campo);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
// Adicionar conteúdo à seção atual
|
|
92
|
+
if (secaoAtual) {
|
|
93
|
+
secaoAtual.conteudo += linha + "\n";
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
// Extrair metadata do conteúdo
|
|
97
|
+
const metadata = extrairMetadata(conteudo, templatePath);
|
|
98
|
+
return {
|
|
99
|
+
secoes,
|
|
100
|
+
checkboxes,
|
|
101
|
+
camposObrigatorios,
|
|
102
|
+
checklistQualidade,
|
|
103
|
+
metadata,
|
|
104
|
+
conteudoCompleto: conteudo,
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Limpa título de seção removendo marcadores e formatação
|
|
109
|
+
*/
|
|
110
|
+
function limparTitulo(titulo) {
|
|
111
|
+
return titulo
|
|
112
|
+
.replace(/^\d+\.\s*/, "")
|
|
113
|
+
.replace(/\*\*/g, "")
|
|
114
|
+
.replace(/\[.*?\]/g, "")
|
|
115
|
+
.trim();
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Extrai metadata do template
|
|
119
|
+
*/
|
|
120
|
+
function extrairMetadata(conteudo, templatePath) {
|
|
121
|
+
const linhas = conteudo.split("\n");
|
|
122
|
+
let fase = "";
|
|
123
|
+
let skill = "";
|
|
124
|
+
let versao = "";
|
|
125
|
+
let autor = "";
|
|
126
|
+
// Extrair do path
|
|
127
|
+
const pathParts = templatePath.split(/[/\\]/);
|
|
128
|
+
const skillIndex = pathParts.findIndex(p => p === "skills");
|
|
129
|
+
if (skillIndex >= 0 && skillIndex + 1 < pathParts.length) {
|
|
130
|
+
skill = pathParts[skillIndex + 1];
|
|
131
|
+
}
|
|
132
|
+
// Extrair do conteúdo
|
|
133
|
+
for (const linha of linhas.slice(0, 20)) {
|
|
134
|
+
if (linha.match(/\*\*versão:\*\*/i)) {
|
|
135
|
+
const match = linha.match(/\*\*versão:\*\*\s*(.+)/i);
|
|
136
|
+
if (match)
|
|
137
|
+
versao = match[1].trim();
|
|
138
|
+
}
|
|
139
|
+
if (linha.match(/\*\*autor:\*\*/i)) {
|
|
140
|
+
const match = linha.match(/\*\*autor:\*\*\s*(.+)/i);
|
|
141
|
+
if (match)
|
|
142
|
+
autor = match[1].trim();
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
// Inferir fase do primeiro header
|
|
146
|
+
if (linhas.length > 0) {
|
|
147
|
+
const primeiroHeader = linhas.find(l => l.match(/^#\s+/));
|
|
148
|
+
if (primeiroHeader) {
|
|
149
|
+
fase = primeiroHeader.replace(/^#\s+/, "").trim();
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
return { fase, skill, versao, autor };
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Conta checkboxes por tier
|
|
156
|
+
*/
|
|
157
|
+
export function contarCheckboxesPorTier(estrutura, tier) {
|
|
158
|
+
const tierOrder = { essencial: 0, base: 1, avancado: 2 };
|
|
159
|
+
const tierAtual = tierOrder[tier];
|
|
160
|
+
return estrutura.checkboxes.filter(cb => {
|
|
161
|
+
const tierMinimo = tierOrder[cb.tierMinimo];
|
|
162
|
+
return tierAtual >= tierMinimo;
|
|
163
|
+
}).length;
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Obtém seções obrigatórias por tier
|
|
167
|
+
*/
|
|
168
|
+
export function getSecoesObrigatoriasPorTier(estrutura, tier) {
|
|
169
|
+
const tierOrder = { essencial: 0, base: 1, avancado: 2 };
|
|
170
|
+
const tierAtual = tierOrder[tier];
|
|
171
|
+
const secoesObrigatorias = [];
|
|
172
|
+
function processarSecao(secao) {
|
|
173
|
+
const tierMinimo = tierOrder[secao.tierMinimo];
|
|
174
|
+
if (secao.obrigatorio && tierAtual >= tierMinimo) {
|
|
175
|
+
secoesObrigatorias.push(secao);
|
|
176
|
+
}
|
|
177
|
+
secao.subsecoes.forEach(processarSecao);
|
|
178
|
+
}
|
|
179
|
+
estrutura.secoes.forEach(processarSecao);
|
|
180
|
+
return secoesObrigatorias;
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Gera regex para encontrar seção no entregável
|
|
184
|
+
*/
|
|
185
|
+
export function gerarRegexSecao(secao) {
|
|
186
|
+
const tituloLimpo = secao.titulo
|
|
187
|
+
.toLowerCase()
|
|
188
|
+
.replace(/[^a-z0-9\s]/g, "")
|
|
189
|
+
.replace(/\s+/g, "\\s+");
|
|
190
|
+
return new RegExp(`^#{1,${secao.nivel + 1}}\\s+.*?${tituloLimpo}`, "im");
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Extrai estatísticas do template
|
|
194
|
+
*/
|
|
195
|
+
export function getEstatisticasTemplate(estrutura) {
|
|
196
|
+
let profundidadeMaxima = 0;
|
|
197
|
+
function calcularProfundidade(secoes, nivel = 1) {
|
|
198
|
+
for (const secao of secoes) {
|
|
199
|
+
profundidadeMaxima = Math.max(profundidadeMaxima, nivel);
|
|
200
|
+
if (secao.subsecoes.length > 0) {
|
|
201
|
+
calcularProfundidade(secao.subsecoes, nivel + 1);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
calcularProfundidade(estrutura.secoes);
|
|
206
|
+
return {
|
|
207
|
+
totalSecoes: contarSecoes(estrutura.secoes),
|
|
208
|
+
totalCheckboxes: estrutura.checkboxes.length,
|
|
209
|
+
totalCamposObrigatorios: estrutura.camposObrigatorios.length,
|
|
210
|
+
totalChecklistQualidade: estrutura.checklistQualidade.length,
|
|
211
|
+
profundidadeMaxima,
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
function contarSecoes(secoes) {
|
|
215
|
+
let total = secoes.length;
|
|
216
|
+
for (const secao of secoes) {
|
|
217
|
+
total += contarSecoes(secao.subsecoes);
|
|
218
|
+
}
|
|
219
|
+
return total;
|
|
220
|
+
}
|
|
221
|
+
//# sourceMappingURL=template-parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"template-parser.js","sourceRoot":"","sources":["../../src/gates/template-parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { TierGate } from "../types/index.js";
|
|
2
|
+
import type { TemplateStructure } from "./template-parser.js";
|
|
3
|
+
export interface ValidationResult {
|
|
4
|
+
valido: boolean;
|
|
5
|
+
score: number;
|
|
6
|
+
scoreDetalhado: ScoreDetalhado;
|
|
7
|
+
secoesEncontradas: string[];
|
|
8
|
+
secoesFaltando: string[];
|
|
9
|
+
checkboxesPreenchidos: number;
|
|
10
|
+
checkboxesTotal: number;
|
|
11
|
+
placeholdersNaoSubstituidos: string[];
|
|
12
|
+
camposFaltando: string[];
|
|
13
|
+
feedback: string[];
|
|
14
|
+
sugestoes: string[];
|
|
15
|
+
}
|
|
16
|
+
export interface ScoreDetalhado {
|
|
17
|
+
estrutura: number;
|
|
18
|
+
conteudo: number;
|
|
19
|
+
checkboxes: number;
|
|
20
|
+
qualidade: number;
|
|
21
|
+
total: number;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Valida um entregável contra um template
|
|
25
|
+
*/
|
|
26
|
+
export declare function validarContraTemplate(entregavel: string, template: TemplateStructure, tier?: TierGate): ValidationResult;
|
|
27
|
+
/**
|
|
28
|
+
* Formata resultado de validação para exibição
|
|
29
|
+
*/
|
|
30
|
+
export declare function formatarResultadoValidacao(resultado: ValidationResult, tier: TierGate): string;
|
|
31
|
+
//# sourceMappingURL=template-validator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"template-validator.d.ts","sourceRoot":"","sources":["../../src/gates/template-validator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,KAAK,EAAE,iBAAiB,EAAqC,MAAM,sBAAsB,CAAC;AAGjG,MAAM,WAAW,gBAAgB;IAC7B,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,EAAE,cAAc,CAAC;IAC/B,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,qBAAqB,EAAE,MAAM,CAAC;IAC9B,eAAe,EAAE,MAAM,CAAC;IACxB,2BAA2B,EAAE,MAAM,EAAE,CAAC;IACtC,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,SAAS,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,cAAc;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACjC,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,iBAAiB,EAC3B,IAAI,GAAE,QAAiB,GACxB,gBAAgB,CAmFlB;AAuND;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,SAAS,EAAE,gBAAgB,EAAE,IAAI,EAAE,QAAQ,GAAG,MAAM,CAsD9F"}
|
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
import { getSecoesObrigatoriasPorTier, gerarRegexSecao } from "./template-parser.js";
|
|
2
|
+
/**
|
|
3
|
+
* Valida um entregável contra um template
|
|
4
|
+
*/
|
|
5
|
+
export function validarContraTemplate(entregavel, template, tier = "base") {
|
|
6
|
+
const secoesObrigatorias = getSecoesObrigatoriasPorTier(template, tier);
|
|
7
|
+
const secoesEncontradas = [];
|
|
8
|
+
const secoesFaltando = [];
|
|
9
|
+
const feedback = [];
|
|
10
|
+
const sugestoes = [];
|
|
11
|
+
// 1. Validar estrutura de seções
|
|
12
|
+
for (const secao of secoesObrigatorias) {
|
|
13
|
+
const regex = gerarRegexSecao(secao);
|
|
14
|
+
const encontrada = regex.test(entregavel);
|
|
15
|
+
if (encontrada) {
|
|
16
|
+
secoesEncontradas.push(secao.titulo);
|
|
17
|
+
}
|
|
18
|
+
else {
|
|
19
|
+
secoesFaltando.push(secao.titulo);
|
|
20
|
+
feedback.push(`❌ Seção obrigatória faltando: **${secao.titulo}**`);
|
|
21
|
+
sugestoes.push(`Adicione a seção "${secao.titulo}" seguindo o template`);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
// 2. Validar checkboxes
|
|
25
|
+
const { checkboxesPreenchidos, checkboxesTotal } = validarCheckboxes(entregavel, template, tier, feedback, sugestoes);
|
|
26
|
+
// 3. Validar placeholders
|
|
27
|
+
const placeholdersNaoSubstituidos = detectarPlaceholders(entregavel, template.camposObrigatorios);
|
|
28
|
+
if (placeholdersNaoSubstituidos.length > 0) {
|
|
29
|
+
feedback.push(`⚠️ ${placeholdersNaoSubstituidos.length} placeholder(s) não substituído(s)`);
|
|
30
|
+
placeholdersNaoSubstituidos.slice(0, 3).forEach(p => {
|
|
31
|
+
sugestoes.push(`Substitua o placeholder: [${p}]`);
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
// 4. Validar campos obrigatórios
|
|
35
|
+
const camposFaltando = validarCamposObrigatorios(entregavel, template, feedback);
|
|
36
|
+
// 5. Validar checklist de qualidade
|
|
37
|
+
const checklistQualidadeScore = validarChecklistQualidade(entregavel, template.checklistQualidade, feedback);
|
|
38
|
+
// 6. Calcular scores
|
|
39
|
+
const scoreDetalhado = calcularScores(secoesEncontradas.length, secoesObrigatorias.length, checkboxesPreenchidos, checkboxesTotal, placeholdersNaoSubstituidos.length, template.camposObrigatorios.length, checklistQualidadeScore, entregavel.length);
|
|
40
|
+
// 7. Determinar se é válido
|
|
41
|
+
const valido = determinarValidade(secoesFaltando.length, checkboxesPreenchidos, checkboxesTotal, tier, scoreDetalhado.total);
|
|
42
|
+
return {
|
|
43
|
+
valido,
|
|
44
|
+
score: scoreDetalhado.total,
|
|
45
|
+
scoreDetalhado,
|
|
46
|
+
secoesEncontradas,
|
|
47
|
+
secoesFaltando,
|
|
48
|
+
checkboxesPreenchidos,
|
|
49
|
+
checkboxesTotal,
|
|
50
|
+
placeholdersNaoSubstituidos,
|
|
51
|
+
camposFaltando,
|
|
52
|
+
feedback,
|
|
53
|
+
sugestoes,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Valida checkboxes preenchidos no entregável
|
|
58
|
+
*/
|
|
59
|
+
function validarCheckboxes(entregavel, template, tier, feedback, sugestoes) {
|
|
60
|
+
const tierOrder = { essencial: 0, base: 1, avancado: 2 };
|
|
61
|
+
const tierAtual = tierOrder[tier];
|
|
62
|
+
const checkboxesRelevantes = template.checkboxes.filter(cb => {
|
|
63
|
+
const tierMinimo = tierOrder[cb.tierMinimo];
|
|
64
|
+
return tierAtual >= tierMinimo;
|
|
65
|
+
});
|
|
66
|
+
let checkboxesPreenchidos = 0;
|
|
67
|
+
const checkboxesNaoPreenchidos = [];
|
|
68
|
+
for (const checkbox of checkboxesRelevantes) {
|
|
69
|
+
const textoLimpo = checkbox.texto
|
|
70
|
+
.toLowerCase()
|
|
71
|
+
.replace(/[^a-z0-9\s]/g, "")
|
|
72
|
+
.slice(0, 30);
|
|
73
|
+
const regexPreenchido = new RegExp(`\\[x\\].*?${textoLimpo}`, "i");
|
|
74
|
+
if (regexPreenchido.test(entregavel)) {
|
|
75
|
+
checkboxesPreenchidos++;
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
checkboxesNaoPreenchidos.push(checkbox);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
const percentualPreenchido = checkboxesRelevantes.length > 0
|
|
82
|
+
? (checkboxesPreenchidos / checkboxesRelevantes.length) * 100
|
|
83
|
+
: 100;
|
|
84
|
+
if (percentualPreenchido < 50) {
|
|
85
|
+
feedback.push(`⚠️ Apenas ${Math.round(percentualPreenchido)}% dos checkboxes preenchidos`);
|
|
86
|
+
}
|
|
87
|
+
if (checkboxesNaoPreenchidos.length > 0 && checkboxesNaoPreenchidos.length <= 5) {
|
|
88
|
+
feedback.push(`📋 Checkboxes pendentes:`);
|
|
89
|
+
checkboxesNaoPreenchidos.slice(0, 5).forEach(cb => {
|
|
90
|
+
sugestoes.push(`Preencher: ${cb.texto.slice(0, 60)}`);
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
return {
|
|
94
|
+
checkboxesPreenchidos,
|
|
95
|
+
checkboxesTotal: checkboxesRelevantes.length,
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Detecta placeholders não substituídos
|
|
100
|
+
*/
|
|
101
|
+
function detectarPlaceholders(entregavel, camposObrigatorios) {
|
|
102
|
+
const placeholdersEncontrados = [];
|
|
103
|
+
for (const campo of camposObrigatorios) {
|
|
104
|
+
const regex = new RegExp(`\\[${campo}\\]`, "i");
|
|
105
|
+
if (regex.test(entregavel)) {
|
|
106
|
+
placeholdersEncontrados.push(campo);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
return placeholdersEncontrados;
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Valida campos obrigatórios preenchidos
|
|
113
|
+
*/
|
|
114
|
+
function validarCamposObrigatorios(entregavel, template, feedback) {
|
|
115
|
+
const camposFaltando = [];
|
|
116
|
+
for (const campo of template.camposObrigatorios.slice(0, 10)) {
|
|
117
|
+
const regex = new RegExp(`\\[${campo}\\]`, "i");
|
|
118
|
+
if (regex.test(entregavel)) {
|
|
119
|
+
camposFaltando.push(campo);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
if (camposFaltando.length > 0) {
|
|
123
|
+
feedback.push(`⚠️ ${camposFaltando.length} campo(s) obrigatório(s) não preenchido(s)`);
|
|
124
|
+
}
|
|
125
|
+
return camposFaltando;
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Valida checklist de qualidade
|
|
129
|
+
*/
|
|
130
|
+
function validarChecklistQualidade(entregavel, checklistQualidade, feedback) {
|
|
131
|
+
if (checklistQualidade.length === 0) {
|
|
132
|
+
return 100;
|
|
133
|
+
}
|
|
134
|
+
let itensEncontrados = 0;
|
|
135
|
+
for (const item of checklistQualidade) {
|
|
136
|
+
const textoLimpo = item
|
|
137
|
+
.toLowerCase()
|
|
138
|
+
.replace(/[^a-z0-9\s]/g, "")
|
|
139
|
+
.slice(0, 30);
|
|
140
|
+
const regexItem = new RegExp(`\\[x\\].*?${textoLimpo}`, "i");
|
|
141
|
+
if (regexItem.test(entregavel)) {
|
|
142
|
+
itensEncontrados++;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
const percentual = (itensEncontrados / checklistQualidade.length) * 100;
|
|
146
|
+
if (percentual < 70) {
|
|
147
|
+
feedback.push(`⚠️ Checklist de qualidade: ${Math.round(percentual)}% completo`);
|
|
148
|
+
}
|
|
149
|
+
return percentual;
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Calcula scores detalhados
|
|
153
|
+
*/
|
|
154
|
+
function calcularScores(secoesEncontradas, secoesTotal, checkboxesPreenchidos, checkboxesTotal, placeholdersNaoSubstituidos, totalPlaceholders, checklistQualidadeScore, tamanhoEntregavel) {
|
|
155
|
+
// Score de estrutura (30%)
|
|
156
|
+
const scoreEstrutura = secoesTotal > 0
|
|
157
|
+
? (secoesEncontradas / secoesTotal) * 100
|
|
158
|
+
: 100;
|
|
159
|
+
// Score de conteúdo (40%)
|
|
160
|
+
const placeholdersSubstituidos = totalPlaceholders > 0
|
|
161
|
+
? ((totalPlaceholders - placeholdersNaoSubstituidos) / totalPlaceholders) * 100
|
|
162
|
+
: 100;
|
|
163
|
+
const densidadeScore = Math.min((tamanhoEntregavel / 1000) * 100, 100);
|
|
164
|
+
const scoreConteudo = (placeholdersSubstituidos * 0.7) + (densidadeScore * 0.3);
|
|
165
|
+
// Score de checkboxes (20%)
|
|
166
|
+
const scoreCheckboxes = checkboxesTotal > 0
|
|
167
|
+
? (checkboxesPreenchidos / checkboxesTotal) * 100
|
|
168
|
+
: 100;
|
|
169
|
+
// Score de qualidade (10%)
|
|
170
|
+
const scoreQualidade = checklistQualidadeScore;
|
|
171
|
+
// Score total
|
|
172
|
+
const scoreTotal = Math.round((scoreEstrutura * 0.3) +
|
|
173
|
+
(scoreConteudo * 0.4) +
|
|
174
|
+
(scoreCheckboxes * 0.2) +
|
|
175
|
+
(scoreQualidade * 0.1));
|
|
176
|
+
return {
|
|
177
|
+
estrutura: Math.round(scoreEstrutura),
|
|
178
|
+
conteudo: Math.round(scoreConteudo),
|
|
179
|
+
checkboxes: Math.round(scoreCheckboxes),
|
|
180
|
+
qualidade: Math.round(scoreQualidade),
|
|
181
|
+
total: scoreTotal,
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Determina se o entregável é válido
|
|
186
|
+
*/
|
|
187
|
+
function determinarValidade(secoesFaltando, checkboxesPreenchidos, checkboxesTotal, tier, scoreTotal) {
|
|
188
|
+
// Critérios por tier
|
|
189
|
+
const criterios = {
|
|
190
|
+
essencial: { minScore: 50, minCheckboxes: 0.5 },
|
|
191
|
+
base: { minScore: 70, minCheckboxes: 0.7 },
|
|
192
|
+
avancado: { minScore: 85, minCheckboxes: 0.9 },
|
|
193
|
+
};
|
|
194
|
+
const criterio = criterios[tier];
|
|
195
|
+
const percentualCheckboxes = checkboxesTotal > 0
|
|
196
|
+
? checkboxesPreenchidos / checkboxesTotal
|
|
197
|
+
: 1;
|
|
198
|
+
return (secoesFaltando === 0 &&
|
|
199
|
+
scoreTotal >= criterio.minScore &&
|
|
200
|
+
percentualCheckboxes >= criterio.minCheckboxes);
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Formata resultado de validação para exibição
|
|
204
|
+
*/
|
|
205
|
+
export function formatarResultadoValidacao(resultado, tier) {
|
|
206
|
+
const { valido, score, scoreDetalhado, feedback, sugestoes } = resultado;
|
|
207
|
+
let output = "";
|
|
208
|
+
// Status geral
|
|
209
|
+
if (valido) {
|
|
210
|
+
output += `✅ **Validação aprovada!** Score: ${score}/100\n\n`;
|
|
211
|
+
}
|
|
212
|
+
else {
|
|
213
|
+
output += `⚠️ **Validação pendente** Score: ${score}/100\n\n`;
|
|
214
|
+
}
|
|
215
|
+
// Score detalhado
|
|
216
|
+
output += `### 📊 Score Detalhado\n\n`;
|
|
217
|
+
output += `- **Estrutura (30%):** ${scoreDetalhado.estrutura}/100\n`;
|
|
218
|
+
output += `- **Conteúdo (40%):** ${scoreDetalhado.conteudo}/100\n`;
|
|
219
|
+
output += `- **Checkboxes (20%):** ${scoreDetalhado.checkboxes}/100\n`;
|
|
220
|
+
output += `- **Qualidade (10%):** ${scoreDetalhado.qualidade}/100\n\n`;
|
|
221
|
+
// Progresso de checkboxes
|
|
222
|
+
const percentualCheckboxes = resultado.checkboxesTotal > 0
|
|
223
|
+
? Math.round((resultado.checkboxesPreenchidos / resultado.checkboxesTotal) * 100)
|
|
224
|
+
: 100;
|
|
225
|
+
output += `### ✅ Checkboxes: ${resultado.checkboxesPreenchidos}/${resultado.checkboxesTotal} (${percentualCheckboxes}%)\n\n`;
|
|
226
|
+
// Seções
|
|
227
|
+
if (resultado.secoesFaltando.length > 0) {
|
|
228
|
+
output += `### ❌ Seções Faltando (${resultado.secoesFaltando.length})\n\n`;
|
|
229
|
+
resultado.secoesFaltando.slice(0, 5).forEach(s => {
|
|
230
|
+
output += `- ${s}\n`;
|
|
231
|
+
});
|
|
232
|
+
output += `\n`;
|
|
233
|
+
}
|
|
234
|
+
// Feedback
|
|
235
|
+
if (feedback.length > 0) {
|
|
236
|
+
output += `### 💬 Feedback\n\n`;
|
|
237
|
+
feedback.slice(0, 8).forEach(f => {
|
|
238
|
+
output += `${f}\n`;
|
|
239
|
+
});
|
|
240
|
+
output += `\n`;
|
|
241
|
+
}
|
|
242
|
+
// Sugestões
|
|
243
|
+
if (sugestoes.length > 0 && !valido) {
|
|
244
|
+
output += `### 💡 Sugestões de Melhoria\n\n`;
|
|
245
|
+
sugestoes.slice(0, 5).forEach(s => {
|
|
246
|
+
output += `- ${s}\n`;
|
|
247
|
+
});
|
|
248
|
+
output += `\n`;
|
|
249
|
+
}
|
|
250
|
+
return output;
|
|
251
|
+
}
|
|
252
|
+
//# sourceMappingURL=template-validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"template-validator.js","sourceRoot":"","sources":["../../src/gates/template-validator.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,7 +5,20 @@ import type { GateResultado, Fase, TierGate } from "../types/index.js";
|
|
|
5
5
|
*/
|
|
6
6
|
export declare const GATE_CHECKLISTS: Record<number, string[]>;
|
|
7
7
|
/**
|
|
8
|
-
* Valida gate
|
|
8
|
+
* Valida gate usando template da skill (novo sistema)
|
|
9
|
+
* @param fase - Fase a validar
|
|
10
|
+
* @param entregavel - Conteúdo do entregável
|
|
11
|
+
* @param tier - Tier de validação
|
|
12
|
+
* @param diretorioContent - Diretório base do content (ex: d:/Sistemas/Maestro/content)
|
|
13
|
+
*/
|
|
14
|
+
export declare function validarGateComTemplate(fase: Fase, entregavel: string, tier?: TierGate, diretorioContent?: string): {
|
|
15
|
+
sucesso: boolean;
|
|
16
|
+
resultado?: any;
|
|
17
|
+
resultadoLegacy?: GateResultado;
|
|
18
|
+
erro?: string;
|
|
19
|
+
};
|
|
20
|
+
/**
|
|
21
|
+
* Valida gate de uma fase com suporte a tier (legado)
|
|
9
22
|
* @param fase - Fase a validar
|
|
10
23
|
* @param entregavel - Conteúdo do entregável
|
|
11
24
|
* @param tier - Tier de validação (default: usa checklist da fase, que é tier 'base')
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validator.d.ts","sourceRoot":"","sources":["../../src/gates/validator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"validator.d.ts","sourceRoot":"","sources":["../../src/gates/validator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AASvE;;;GAGG;AACH,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CA0DpD,CAAC;AAEF;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CAClC,IAAI,EAAE,IAAI,EACV,UAAU,EAAE,MAAM,EAClB,IAAI,GAAE,QAAiB,EACvB,gBAAgB,CAAC,EAAE,MAAM,GAC1B;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,SAAS,CAAC,EAAE,GAAG,CAAC;IAAC,eAAe,CAAC,EAAE,aAAa,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,CAoCvF;AA6BD;;;;;GAKG;AACH,wBAAgB,WAAW,CACvB,IAAI,EAAE,IAAI,EACV,UAAU,EAAE,MAAM,EAClB,IAAI,CAAC,EAAE,QAAQ,GAChB,aAAa,CAyBf;AAwDD;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,aAAa,GAAG,MAAM,CA6BtE"}
|
package/dist/gates/validator.js
CHANGED
|
@@ -1,4 +1,10 @@
|
|
|
1
1
|
import { getChecklistPorTier } from "./tiers.js";
|
|
2
|
+
import { parseTemplate } from "./template-parser.js";
|
|
3
|
+
import { validarContraTemplate } from "./template-validator.js";
|
|
4
|
+
import { calcularQualidade } from "./quality-scorer.js";
|
|
5
|
+
import { getSkillParaFase } from "../utils/prompt-mapper.js";
|
|
6
|
+
import { existsSync } from "fs";
|
|
7
|
+
import { join } from "path";
|
|
2
8
|
/**
|
|
3
9
|
* Checklists de validação por fase (legado - mantido para compatibilidade)
|
|
4
10
|
* @deprecated Use getChecklistPorTier() para validação adaptativa
|
|
@@ -63,7 +69,66 @@ export const GATE_CHECKLISTS = {
|
|
|
63
69
|
],
|
|
64
70
|
};
|
|
65
71
|
/**
|
|
66
|
-
* Valida gate
|
|
72
|
+
* Valida gate usando template da skill (novo sistema)
|
|
73
|
+
* @param fase - Fase a validar
|
|
74
|
+
* @param entregavel - Conteúdo do entregável
|
|
75
|
+
* @param tier - Tier de validação
|
|
76
|
+
* @param diretorioContent - Diretório base do content (ex: d:/Sistemas/Maestro/content)
|
|
77
|
+
*/
|
|
78
|
+
export function validarGateComTemplate(fase, entregavel, tier = "base", diretorioContent) {
|
|
79
|
+
const skillNome = getSkillParaFase(fase.nome);
|
|
80
|
+
if (!skillNome || !diretorioContent) {
|
|
81
|
+
return { sucesso: false, erro: "Skill não encontrada ou diretório não especificado" };
|
|
82
|
+
}
|
|
83
|
+
// Tentar encontrar template principal da fase
|
|
84
|
+
const templatePath = resolverTemplatePath(skillNome, fase.nome, diretorioContent);
|
|
85
|
+
if (!templatePath || !existsSync(templatePath)) {
|
|
86
|
+
return { sucesso: false, erro: "Template não encontrado" };
|
|
87
|
+
}
|
|
88
|
+
// Parsear template
|
|
89
|
+
const templateStructure = parseTemplate(templatePath);
|
|
90
|
+
if (!templateStructure) {
|
|
91
|
+
return { sucesso: false, erro: "Erro ao parsear template" };
|
|
92
|
+
}
|
|
93
|
+
// Validar contra template
|
|
94
|
+
const resultado = validarContraTemplate(entregavel, templateStructure, tier);
|
|
95
|
+
// Calcular qualidade
|
|
96
|
+
const qualidade = calcularQualidade(entregavel, templateStructure, tier);
|
|
97
|
+
return {
|
|
98
|
+
sucesso: true,
|
|
99
|
+
resultado: {
|
|
100
|
+
...resultado,
|
|
101
|
+
qualidade,
|
|
102
|
+
templateUsado: templatePath,
|
|
103
|
+
skillNome,
|
|
104
|
+
},
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Resolve caminho do template baseado na skill e fase
|
|
109
|
+
*/
|
|
110
|
+
function resolverTemplatePath(skillNome, faseNome, diretorioContent) {
|
|
111
|
+
const basePath = join(diretorioContent, "skills", skillNome, "resources", "templates");
|
|
112
|
+
// Mapeamento de fase para arquivo de template
|
|
113
|
+
const templateMap = {
|
|
114
|
+
"Produto": "PRD.md",
|
|
115
|
+
"Requisitos": "requisitos.md",
|
|
116
|
+
"UX Design": "design-doc.md",
|
|
117
|
+
"Modelo de Domínio": "modelo-dominio.md",
|
|
118
|
+
"Banco de Dados": "design-banco.md",
|
|
119
|
+
"Arquitetura": "arquitetura.md",
|
|
120
|
+
"Segurança": "checklist-seguranca.md",
|
|
121
|
+
"Backlog": "backlog.md",
|
|
122
|
+
"Contrato API": "contrato-api.md",
|
|
123
|
+
};
|
|
124
|
+
const templateFile = templateMap[faseNome];
|
|
125
|
+
if (!templateFile) {
|
|
126
|
+
return null;
|
|
127
|
+
}
|
|
128
|
+
return join(basePath, templateFile);
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Valida gate de uma fase com suporte a tier (legado)
|
|
67
132
|
* @param fase - Fase a validar
|
|
68
133
|
* @param entregavel - Conteúdo do entregável
|
|
69
134
|
* @param tier - Tier de validação (default: usa checklist da fase, que é tier 'base')
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validator.js","sourceRoot":"","sources":["../../src/gates/validator.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"validator.js","sourceRoot":"","sources":["../../src/gates/validator.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validar-gate.d.ts","sourceRoot":"","sources":["../../src/tools/validar-gate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAiB,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"validar-gate.d.ts","sourceRoot":"","sources":["../../src/tools/validar-gate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAiB,MAAM,mBAAmB,CAAC;AAYnE,UAAU,eAAe;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACrB;AAED;;;GAGG;AACH,wBAAsB,WAAW,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,UAAU,CAAC,CA8J5E;AAED;;GAEG;AACH,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;CAqB7B,CAAC"}
|
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
import { parsearEstado } from "../state/storage.js";
|
|
2
2
|
import { getFase } from "../flows/types.js";
|
|
3
|
-
import { validarGate as validarGateCore, formatarResultadoGate } from "../gates/validator.js";
|
|
3
|
+
import { validarGate as validarGateCore, formatarResultadoGate, validarGateComTemplate } from "../gates/validator.js";
|
|
4
|
+
import { formatarResultadoValidacao } from "../gates/template-validator.js";
|
|
5
|
+
import { gerarRelatorioQualidade, compararComTier } from "../gates/quality-scorer.js";
|
|
4
6
|
import { resolveProjectPath } from "../utils/files.js";
|
|
5
7
|
import { setCurrentDirectory } from "../state/context.js";
|
|
8
|
+
import { resolve, dirname } from "path";
|
|
6
9
|
import { getSkillParaFase } from "../utils/prompt-mapper.js";
|
|
7
10
|
import { getSkillResourcePath, detectIDE } from "../utils/ide-paths.js";
|
|
8
11
|
/**
|
|
@@ -89,32 +92,60 @@ validar_gate(
|
|
|
89
92
|
content: [{ type: "text", text: resposta }],
|
|
90
93
|
};
|
|
91
94
|
}
|
|
92
|
-
//
|
|
93
|
-
const
|
|
94
|
-
const
|
|
95
|
-
const
|
|
95
|
+
// Tentar validação com template (novo sistema)
|
|
96
|
+
const diretorioMaestro = dirname(dirname(dirname(__dirname)));
|
|
97
|
+
const diretorioContent = resolve(diretorioMaestro, "content");
|
|
98
|
+
const tier = estado.tier_gate || "base";
|
|
99
|
+
const validacaoTemplate = validarGateComTemplate(fase, args.entregavel, tier, diretorioContent);
|
|
100
|
+
let resposta = "";
|
|
101
|
+
if (validacaoTemplate.sucesso && validacaoTemplate.resultado) {
|
|
102
|
+
// Usar novo sistema baseado em template
|
|
103
|
+
const resultado = validacaoTemplate.resultado;
|
|
104
|
+
resposta = `# Gate da Fase ${numeroFase}: ${fase.nome}
|
|
96
105
|
|
|
97
|
-
${resultadoFormatado}
|
|
98
|
-
|
|
99
|
-
${(() => {
|
|
100
|
-
const skillAtual = getSkillParaFase(fase.nome);
|
|
101
|
-
if (!skillAtual)
|
|
102
|
-
return "";
|
|
103
|
-
const ide = estado.ide || detectIDE(args.diretorio) || 'windsurf';
|
|
104
|
-
const checklistPath = getSkillResourcePath(skillAtual, 'checklists', ide);
|
|
105
|
-
return `
|
|
106
|
-
## 📋 Checklist da Skill
|
|
107
|
-
|
|
108
|
-
**Localização:** \`${checklistPath}\`
|
|
109
|
-
|
|
110
|
-
> 💡 Consulte o checklist completo da skill para validação detalhada.
|
|
111
|
-
`;
|
|
112
|
-
})()}
|
|
113
|
-
|
|
114
|
-
${resultado.valido
|
|
115
|
-
? "✅ **Você pode avançar!** Use `proximo(entregavel: \"...\", estado_json: \"...\")` para ir para a próxima fase."
|
|
116
|
-
: "⚠️ **Complete os itens pendentes** ou use `proximo(entregavel: \"...\", estado_json: \"...\", confirmar_usuario: true)` para forçar avanço."}
|
|
117
106
|
`;
|
|
107
|
+
resposta += `## 🎯 Validação Baseada em Template\n\n`;
|
|
108
|
+
resposta += `**Template:** \`${resultado.skillNome}\`\n`;
|
|
109
|
+
resposta += `**Tier:** ${tier}\n\n`;
|
|
110
|
+
resposta += formatarResultadoValidacao(resultado, tier);
|
|
111
|
+
// Relatório de qualidade
|
|
112
|
+
if (resultado.qualidade) {
|
|
113
|
+
resposta += "\n" + gerarRelatorioQualidade(resultado.qualidade, tier);
|
|
114
|
+
const comparacao = compararComTier(resultado.qualidade, tier);
|
|
115
|
+
resposta += "\n" + comparacao.mensagem + "\n\n";
|
|
116
|
+
}
|
|
117
|
+
// Link para template
|
|
118
|
+
const skillAtual = getSkillParaFase(fase.nome);
|
|
119
|
+
if (skillAtual) {
|
|
120
|
+
const ide = estado.ide || detectIDE(args.diretorio) || 'windsurf';
|
|
121
|
+
const templatesPath = getSkillResourcePath(skillAtual, 'templates', ide);
|
|
122
|
+
resposta += `## 📄 Template de Referência\n\n`;
|
|
123
|
+
resposta += `**Localização:** \`${templatesPath}\`\n\n`;
|
|
124
|
+
resposta += `> 💡 Consulte o template para ver a estrutura completa esperada.\n\n`;
|
|
125
|
+
}
|
|
126
|
+
resposta += resultado.valido
|
|
127
|
+
? "✅ **Você pode avançar!** Use `proximo(entregavel: \"...\", estado_json: \"...\")` para ir para a próxima fase."
|
|
128
|
+
: "⚠️ **Complete os itens pendentes** ou use `proximo(entregavel: \"...\", estado_json: \"...\", confirmar_usuario: true)` para forçar avanço.";
|
|
129
|
+
}
|
|
130
|
+
else {
|
|
131
|
+
// Fallback para sistema legado
|
|
132
|
+
const resultado = validarGateCore(fase, args.entregavel);
|
|
133
|
+
const resultadoFormatado = formatarResultadoGate(resultado);
|
|
134
|
+
resposta = `# Gate da Fase ${numeroFase}: ${fase.nome}\n\n`;
|
|
135
|
+
resposta += `## ⚠️ Validação Legada (Template não disponível)\n\n`;
|
|
136
|
+
resposta += resultadoFormatado + "\n\n";
|
|
137
|
+
const skillAtual = getSkillParaFase(fase.nome);
|
|
138
|
+
if (skillAtual) {
|
|
139
|
+
const ide = estado.ide || detectIDE(args.diretorio) || 'windsurf';
|
|
140
|
+
const checklistPath = getSkillResourcePath(skillAtual, 'checklists', ide);
|
|
141
|
+
resposta += `## 📋 Checklist da Skill\n\n`;
|
|
142
|
+
resposta += `**Localização:** \`${checklistPath}\`\n\n`;
|
|
143
|
+
resposta += `> 💡 Consulte o checklist completo da skill para validação detalhada.\n\n`;
|
|
144
|
+
}
|
|
145
|
+
resposta += resultado.valido
|
|
146
|
+
? "✅ **Você pode avançar!** Use `proximo(entregavel: \"...\", estado_json: \"...\")` para ir para a próxima fase."
|
|
147
|
+
: "⚠️ **Complete os itens pendentes** ou use `proximo(entregavel: \"...\", estado_json: \"...\", confirmar_usuario: true)` para forçar avanço.";
|
|
148
|
+
}
|
|
118
149
|
return {
|
|
119
150
|
content: [{ type: "text", text: resposta }],
|
|
120
151
|
estado_atualizado: args.estado_json,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validar-gate.js","sourceRoot":"","sources":["../../src/tools/validar-gate.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAC5C,OAAO,EAAE,WAAW,IAAI,eAAe,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"validar-gate.js","sourceRoot":"","sources":["../../src/tools/validar-gate.ts"],"names":[],"mappings":"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"}
|