@maestro-ai/mcp-server 5.5.3 → 5.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/constants.d.ts +1 -1
- package/dist/constants.js +1 -1
- package/dist/errors/index.js +2 -2
- package/dist/errors/index.js.map +1 -1
- package/dist/flows/onboarding-orchestrator.js +1 -1
- package/dist/flows/onboarding-orchestrator.js.map +1 -1
- package/dist/handlers/field-normalizer.d.ts +31 -0
- package/dist/handlers/field-normalizer.d.ts.map +1 -0
- package/dist/handlers/field-normalizer.js +70 -0
- package/dist/handlers/field-normalizer.js.map +1 -0
- package/dist/handlers/prd-scorer.d.ts +60 -0
- package/dist/handlers/prd-scorer.d.ts.map +1 -0
- package/dist/handlers/prd-scorer.js +157 -0
- package/dist/handlers/prd-scorer.js.map +1 -0
- package/dist/handlers/prototype-phase-handler.js.map +1 -1
- package/dist/handlers/shared-prompt-handler.js.map +1 -1
- package/dist/handlers/specialist-formatters.d.ts +42 -0
- package/dist/handlers/specialist-formatters.d.ts.map +1 -0
- package/dist/handlers/specialist-formatters.js +272 -0
- package/dist/handlers/specialist-formatters.js.map +1 -0
- package/dist/handlers/specialist-phase-handler.d.ts +1 -10
- package/dist/handlers/specialist-phase-handler.d.ts.map +1 -1
- package/dist/handlers/specialist-phase-handler.js +11 -501
- package/dist/handlers/specialist-phase-handler.js.map +1 -1
- package/dist/legacy-tools.d.ts +21 -0
- package/dist/legacy-tools.d.ts.map +1 -0
- package/dist/legacy-tools.js +377 -0
- package/dist/legacy-tools.js.map +1 -0
- package/dist/router.d.ts +2 -2
- package/dist/router.d.ts.map +1 -1
- package/dist/router.js +6 -378
- package/dist/router.js.map +1 -1
- package/dist/server.d.ts +18 -4
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +70 -1
- package/dist/server.js.map +1 -1
- package/dist/services/flow-engine.d.ts.map +1 -1
- package/dist/services/flow-engine.js +1 -2
- package/dist/services/flow-engine.js.map +1 -1
- package/dist/services/onboarding.service.js.map +1 -1
- package/dist/services/scoring-config.d.ts +47 -0
- package/dist/services/scoring-config.d.ts.map +1 -0
- package/dist/services/scoring-config.js +88 -0
- package/dist/services/scoring-config.js.map +1 -0
- package/dist/services/state.service.d.ts.map +1 -1
- package/dist/services/state.service.js +3 -9
- package/dist/services/state.service.js.map +1 -1
- package/dist/services/static-validator.service.d.ts +28 -0
- package/dist/services/static-validator.service.d.ts.map +1 -0
- package/dist/services/static-validator.service.js +55 -0
- package/dist/services/static-validator.service.js.map +1 -0
- package/dist/services/task-decomposer.service.d.ts +59 -0
- package/dist/services/task-decomposer.service.d.ts.map +1 -0
- package/dist/services/task-decomposer.service.js +162 -0
- package/dist/services/task-decomposer.service.js.map +1 -0
- package/dist/services/test-stub-generator.service.d.ts +32 -0
- package/dist/services/test-stub-generator.service.d.ts.map +1 -0
- package/dist/services/test-stub-generator.service.js +71 -0
- package/dist/services/test-stub-generator.service.js.map +1 -0
- package/dist/stdio.js +7 -71
- package/dist/stdio.js.map +1 -1
- package/dist/tools/brainstorm.js.map +1 -1
- package/dist/tools/consolidated/avancar.d.ts.map +1 -1
- package/dist/tools/consolidated/avancar.js +27 -19
- package/dist/tools/consolidated/avancar.js.map +1 -1
- package/dist/tools/discovery.js.map +1 -1
- package/dist/tools/iniciar-projeto.js.map +1 -1
- package/dist/tools/maestro-tool.d.ts.map +1 -1
- package/dist/tools/maestro-tool.js +23 -14
- package/dist/tools/maestro-tool.js.map +1 -1
- package/dist/tools/next-steps-dashboard.js.map +1 -1
- package/dist/tools/prd-writer.js.map +1 -1
- package/dist/tools/proximo.d.ts.map +1 -1
- package/dist/tools/proximo.js +26 -6
- package/dist/tools/proximo.js.map +1 -1
- package/dist/types/index.d.ts +1 -1
- package/dist/types/index.d.ts.map +1 -1
- package/package.json +3 -2
- package/dist/gates/tiers.test.d.ts +0 -2
- package/dist/gates/tiers.test.d.ts.map +0 -1
- package/dist/gates/tiers.test.js +0 -86
- package/dist/gates/tiers.test.js.map +0 -1
- package/dist/index.d.ts +0 -3
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -343
- package/dist/index.js.map +0 -1
- package/dist/tests/aprovar-gate.test.d.ts +0 -2
- package/dist/tests/aprovar-gate.test.d.ts.map +0 -1
- package/dist/tests/aprovar-gate.test.js +0 -113
- package/dist/tests/aprovar-gate.test.js.map +0 -1
- package/dist/tests/brainstorm-prd.test.d.ts +0 -5
- package/dist/tests/brainstorm-prd.test.d.ts.map +0 -1
- package/dist/tests/brainstorm-prd.test.js +0 -291
- package/dist/tests/brainstorm-prd.test.js.map +0 -1
- package/dist/tests/classificacao-progressiva.test.d.ts +0 -5
- package/dist/tests/classificacao-progressiva.test.d.ts.map +0 -1
- package/dist/tests/classificacao-progressiva.test.js +0 -372
- package/dist/tests/classificacao-progressiva.test.js.map +0 -1
- package/dist/tests/content-resolver.test.d.ts +0 -5
- package/dist/tests/content-resolver.test.d.ts.map +0 -1
- package/dist/tests/content-resolver.test.js +0 -157
- package/dist/tests/content-resolver.test.js.map +0 -1
- package/dist/tests/deliverable-validator.test.d.ts +0 -12
- package/dist/tests/deliverable-validator.test.d.ts.map +0 -1
- package/dist/tests/deliverable-validator.test.js +0 -214
- package/dist/tests/deliverable-validator.test.js.map +0 -1
- package/dist/tests/flow-engine.test.d.ts +0 -2
- package/dist/tests/flow-engine.test.d.ts.map +0 -1
- package/dist/tests/flow-engine.test.js +0 -85
- package/dist/tests/flow-engine.test.js.map +0 -1
- package/dist/tests/gate-orientation.test.d.ts +0 -2
- package/dist/tests/gate-orientation.test.d.ts.map +0 -1
- package/dist/tests/gate-orientation.test.js +0 -59
- package/dist/tests/gate-orientation.test.js.map +0 -1
- package/dist/tests/middleware.test.d.ts +0 -5
- package/dist/tests/middleware.test.d.ts.map +0 -1
- package/dist/tests/middleware.test.js +0 -254
- package/dist/tests/middleware.test.js.map +0 -1
- package/dist/tests/migracao-skills.test.d.ts +0 -2
- package/dist/tests/migracao-skills.test.d.ts.map +0 -1
- package/dist/tests/migracao-skills.test.js +0 -208
- package/dist/tests/migracao-skills.test.js.map +0 -1
- package/dist/tests/onboarding-flow.test.d.ts +0 -5
- package/dist/tests/onboarding-flow.test.d.ts.map +0 -1
- package/dist/tests/onboarding-flow.test.js +0 -231
- package/dist/tests/onboarding-flow.test.js.map +0 -1
- package/dist/tests/prd-validation.test.d.ts +0 -6
- package/dist/tests/prd-validation.test.d.ts.map +0 -1
- package/dist/tests/prd-validation.test.js +0 -164
- package/dist/tests/prd-validation.test.js.map +0 -1
- package/dist/tests/readiness-dashboard.test.d.ts +0 -5
- package/dist/tests/readiness-dashboard.test.d.ts.map +0 -1
- package/dist/tests/readiness-dashboard.test.js +0 -252
- package/dist/tests/readiness-dashboard.test.js.map +0 -1
- package/dist/tests/skill-loader.test.d.ts +0 -5
- package/dist/tests/skill-loader.test.d.ts.map +0 -1
- package/dist/tests/skill-loader.test.js +0 -244
- package/dist/tests/skill-loader.test.js.map +0 -1
- package/dist/tests/v52-integration.test.d.ts +0 -14
- package/dist/tests/v52-integration.test.d.ts.map +0 -1
- package/dist/tests/v52-integration.test.js +0 -225
- package/dist/tests/v52-integration.test.js.map +0 -1
- package/dist/tests/watcher.service.test.d.ts +0 -2
- package/dist/tests/watcher.service.test.d.ts.map +0 -1
- package/dist/tests/watcher.service.test.js +0 -119
- package/dist/tests/watcher.service.test.js.map +0 -1
- package/dist/utils/__tests__/prompt-mapper.test.d.ts +0 -2
- package/dist/utils/__tests__/prompt-mapper.test.d.ts.map +0 -1
- package/dist/utils/__tests__/prompt-mapper.test.js +0 -184
- package/dist/utils/__tests__/prompt-mapper.test.js.map +0 -1
|
@@ -1,231 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Testes para o fluxo de onboarding otimizado
|
|
3
|
-
*/
|
|
4
|
-
import { describe, it, expect, beforeEach } from 'vitest';
|
|
5
|
-
import { gerarBlocosDiscovery, calcularProgressoDiscovery, validarBlocoCompleto, extrairRespostasDiscovery, gerarResumoDiscovery, } from '../utils/discovery-adapter.js';
|
|
6
|
-
describe('Discovery Adapter', () => {
|
|
7
|
-
describe('gerarBlocosDiscovery', () => {
|
|
8
|
-
it('deve gerar blocos básicos para modo economy', () => {
|
|
9
|
-
const blocos = gerarBlocosDiscovery({
|
|
10
|
-
mode: 'economy',
|
|
11
|
-
skipCompletedBlocks: false,
|
|
12
|
-
prioritizeByMode: true,
|
|
13
|
-
allowBatchInput: true,
|
|
14
|
-
});
|
|
15
|
-
expect(blocos.length).toBe(3); // projeto-basico, escopo-mvp, tecnico
|
|
16
|
-
expect(blocos[0].id).toBe('projeto-basico');
|
|
17
|
-
expect(blocos[0].required).toBe(true);
|
|
18
|
-
});
|
|
19
|
-
it('deve gerar mais blocos para modo balanced', () => {
|
|
20
|
-
const blocos = gerarBlocosDiscovery({
|
|
21
|
-
mode: 'balanced',
|
|
22
|
-
skipCompletedBlocks: false,
|
|
23
|
-
prioritizeByMode: true,
|
|
24
|
-
allowBatchInput: true,
|
|
25
|
-
});
|
|
26
|
-
expect(blocos.length).toBe(5); // adiciona time-infraestrutura e requisitos-criticos
|
|
27
|
-
expect(blocos.some((b) => b.id === 'time-infraestrutura')).toBe(true);
|
|
28
|
-
});
|
|
29
|
-
it('deve gerar todos os blocos para modo quality', () => {
|
|
30
|
-
const blocos = gerarBlocosDiscovery({
|
|
31
|
-
mode: 'quality',
|
|
32
|
-
skipCompletedBlocks: false,
|
|
33
|
-
prioritizeByMode: true,
|
|
34
|
-
allowBatchInput: true,
|
|
35
|
-
});
|
|
36
|
-
expect(blocos.length).toBe(8); // adiciona dados-analytics, ux-design, orcamento-restricoes
|
|
37
|
-
expect(blocos.some((b) => b.id === 'dados-analytics')).toBe(true);
|
|
38
|
-
expect(blocos.some((b) => b.id === 'ux-design')).toBe(true);
|
|
39
|
-
expect(blocos.some((b) => b.id === 'orcamento-restricoes')).toBe(true);
|
|
40
|
-
});
|
|
41
|
-
it('deve pré-preencher campos com dados existentes', () => {
|
|
42
|
-
const blocos = gerarBlocosDiscovery({
|
|
43
|
-
mode: 'economy',
|
|
44
|
-
skipCompletedBlocks: false,
|
|
45
|
-
prioritizeByMode: true,
|
|
46
|
-
allowBatchInput: true,
|
|
47
|
-
existingData: {
|
|
48
|
-
nome_projeto: 'PulseTrack',
|
|
49
|
-
problema: 'Monitorar saúde ocupacional',
|
|
50
|
-
},
|
|
51
|
-
});
|
|
52
|
-
const blocoBasico = blocos[0];
|
|
53
|
-
const nomeField = blocoBasico.fields.find((f) => f.id === 'nome_projeto');
|
|
54
|
-
const problemaField = blocoBasico.fields.find((f) => f.id === 'problema');
|
|
55
|
-
expect(nomeField?.value).toBe('PulseTrack');
|
|
56
|
-
expect(nomeField?.filled).toBe(true);
|
|
57
|
-
expect(problemaField?.value).toBe('Monitorar saúde ocupacional');
|
|
58
|
-
expect(problemaField?.filled).toBe(true);
|
|
59
|
-
});
|
|
60
|
-
});
|
|
61
|
-
describe('calcularProgressoDiscovery', () => {
|
|
62
|
-
it('deve calcular progresso corretamente', () => {
|
|
63
|
-
const blocos = gerarBlocosDiscovery({
|
|
64
|
-
mode: 'economy',
|
|
65
|
-
skipCompletedBlocks: false,
|
|
66
|
-
prioritizeByMode: true,
|
|
67
|
-
allowBatchInput: true,
|
|
68
|
-
});
|
|
69
|
-
// Marcar primeiro bloco como completo
|
|
70
|
-
blocos[0].status = 'completed';
|
|
71
|
-
const progresso = calcularProgressoDiscovery(blocos);
|
|
72
|
-
expect(progresso.completados).toBe(1);
|
|
73
|
-
expect(progresso.total).toBe(3);
|
|
74
|
-
expect(progresso.percentual).toBe(33);
|
|
75
|
-
expect(progresso.proximoBloco?.id).toBe('escopo-mvp');
|
|
76
|
-
});
|
|
77
|
-
it('deve retornar undefined para proximoBloco quando todos estão completos', () => {
|
|
78
|
-
const blocos = gerarBlocosDiscovery({
|
|
79
|
-
mode: 'economy',
|
|
80
|
-
skipCompletedBlocks: false,
|
|
81
|
-
prioritizeByMode: true,
|
|
82
|
-
allowBatchInput: true,
|
|
83
|
-
});
|
|
84
|
-
blocos.forEach((b) => (b.status = 'completed'));
|
|
85
|
-
const progresso = calcularProgressoDiscovery(blocos);
|
|
86
|
-
expect(progresso.completados).toBe(3);
|
|
87
|
-
expect(progresso.percentual).toBe(100);
|
|
88
|
-
expect(progresso.proximoBloco).toBeUndefined();
|
|
89
|
-
});
|
|
90
|
-
});
|
|
91
|
-
describe('validarBlocoCompleto', () => {
|
|
92
|
-
it('deve validar bloco com todos os campos obrigatórios preenchidos', () => {
|
|
93
|
-
const blocos = gerarBlocosDiscovery({
|
|
94
|
-
mode: 'economy',
|
|
95
|
-
skipCompletedBlocks: false,
|
|
96
|
-
prioritizeByMode: true,
|
|
97
|
-
allowBatchInput: true,
|
|
98
|
-
});
|
|
99
|
-
const bloco = blocos[0];
|
|
100
|
-
bloco.fields.forEach((f) => {
|
|
101
|
-
if (f.required) {
|
|
102
|
-
f.filled = true;
|
|
103
|
-
f.value = 'valor_teste';
|
|
104
|
-
}
|
|
105
|
-
});
|
|
106
|
-
const validacao = validarBlocoCompleto(bloco);
|
|
107
|
-
expect(validacao.valido).toBe(true);
|
|
108
|
-
expect(validacao.camposFaltantes.length).toBe(0);
|
|
109
|
-
});
|
|
110
|
-
it('deve detectar campos obrigatórios faltando', () => {
|
|
111
|
-
const blocos = gerarBlocosDiscovery({
|
|
112
|
-
mode: 'economy',
|
|
113
|
-
skipCompletedBlocks: false,
|
|
114
|
-
prioritizeByMode: true,
|
|
115
|
-
allowBatchInput: true,
|
|
116
|
-
});
|
|
117
|
-
const bloco = blocos[0];
|
|
118
|
-
// Não preencher nenhum campo
|
|
119
|
-
const validacao = validarBlocoCompleto(bloco);
|
|
120
|
-
expect(validacao.valido).toBe(false);
|
|
121
|
-
expect(validacao.camposFaltantes.length).toBeGreaterThan(0);
|
|
122
|
-
expect(validacao.camposFaltantes).toContain('Nome do projeto');
|
|
123
|
-
});
|
|
124
|
-
});
|
|
125
|
-
describe('extrairRespostasDiscovery', () => {
|
|
126
|
-
it('deve extrair respostas dos blocos preenchidos', () => {
|
|
127
|
-
const blocos = gerarBlocosDiscovery({
|
|
128
|
-
mode: 'economy',
|
|
129
|
-
skipCompletedBlocks: false,
|
|
130
|
-
prioritizeByMode: true,
|
|
131
|
-
allowBatchInput: true,
|
|
132
|
-
});
|
|
133
|
-
blocos[0].fields[0].filled = true;
|
|
134
|
-
blocos[0].fields[0].value = 'PulseTrack';
|
|
135
|
-
blocos[0].fields[1].filled = true;
|
|
136
|
-
blocos[0].fields[1].value = 'Monitorar saúde ocupacional';
|
|
137
|
-
const respostas = extrairRespostasDiscovery(blocos);
|
|
138
|
-
expect(respostas.nome_projeto).toBe('PulseTrack');
|
|
139
|
-
expect(respostas.problema).toBe('Monitorar saúde ocupacional');
|
|
140
|
-
});
|
|
141
|
-
it('deve ignorar campos não preenchidos', () => {
|
|
142
|
-
const blocos = gerarBlocosDiscovery({
|
|
143
|
-
mode: 'economy',
|
|
144
|
-
skipCompletedBlocks: false,
|
|
145
|
-
prioritizeByMode: true,
|
|
146
|
-
allowBatchInput: true,
|
|
147
|
-
});
|
|
148
|
-
blocos[0].fields[0].filled = true;
|
|
149
|
-
blocos[0].fields[0].value = 'PulseTrack';
|
|
150
|
-
// Não preencher o segundo campo
|
|
151
|
-
const respostas = extrairRespostasDiscovery(blocos);
|
|
152
|
-
expect(respostas.nome_projeto).toBe('PulseTrack');
|
|
153
|
-
expect(respostas.problema).toBeUndefined();
|
|
154
|
-
});
|
|
155
|
-
});
|
|
156
|
-
describe('gerarResumoDiscovery', () => {
|
|
157
|
-
it('deve gerar resumo formatado com respostas', () => {
|
|
158
|
-
const respostas = {
|
|
159
|
-
nome_projeto: 'PulseTrack',
|
|
160
|
-
problema: 'Monitorar saúde ocupacional',
|
|
161
|
-
publico_alvo: 'Empresas e profissionais de saúde',
|
|
162
|
-
funcionalidades_principais: ['Dashboard', 'Alertas', 'Relatórios'],
|
|
163
|
-
plataformas: ['Web', 'Mobile'],
|
|
164
|
-
cronograma: '6 meses',
|
|
165
|
-
stack_preferida: 'React + Node.js',
|
|
166
|
-
};
|
|
167
|
-
const resumo = gerarResumoDiscovery(respostas);
|
|
168
|
-
expect(resumo).toContain('PulseTrack');
|
|
169
|
-
expect(resumo).toContain('Monitorar saúde ocupacional');
|
|
170
|
-
expect(resumo).toContain('Dashboard, Alertas, Relatórios');
|
|
171
|
-
expect(resumo).toContain('Web, Mobile');
|
|
172
|
-
expect(resumo).toContain('React + Node.js');
|
|
173
|
-
});
|
|
174
|
-
it('deve gerar resumo mesmo com respostas parciais', () => {
|
|
175
|
-
const respostas = {
|
|
176
|
-
nome_projeto: 'PulseTrack',
|
|
177
|
-
problema: 'Monitorar saúde ocupacional',
|
|
178
|
-
};
|
|
179
|
-
const resumo = gerarResumoDiscovery(respostas);
|
|
180
|
-
expect(resumo).toContain('PulseTrack');
|
|
181
|
-
expect(resumo).toContain('Monitorar saúde ocupacional');
|
|
182
|
-
expect(resumo.length).toBeGreaterThan(0);
|
|
183
|
-
});
|
|
184
|
-
});
|
|
185
|
-
});
|
|
186
|
-
describe('OnboardingState', () => {
|
|
187
|
-
let onboarding;
|
|
188
|
-
beforeEach(() => {
|
|
189
|
-
onboarding = {
|
|
190
|
-
projectId: 'test-project-123',
|
|
191
|
-
phase: 'discovery',
|
|
192
|
-
discoveryStatus: 'in_progress',
|
|
193
|
-
discoveryBlocks: gerarBlocosDiscovery({
|
|
194
|
-
mode: 'balanced',
|
|
195
|
-
skipCompletedBlocks: false,
|
|
196
|
-
prioritizeByMode: true,
|
|
197
|
-
allowBatchInput: true,
|
|
198
|
-
}),
|
|
199
|
-
discoveryResponses: {},
|
|
200
|
-
brainstormStatus: 'pending',
|
|
201
|
-
brainstormSections: [],
|
|
202
|
-
prdStatus: 'pending',
|
|
203
|
-
prdScore: 0,
|
|
204
|
-
mode: 'balanced',
|
|
205
|
-
totalInteractions: 0,
|
|
206
|
-
};
|
|
207
|
-
});
|
|
208
|
-
it('deve inicializar com estado correto', () => {
|
|
209
|
-
expect(onboarding.phase).toBe('discovery');
|
|
210
|
-
expect(onboarding.discoveryStatus).toBe('in_progress');
|
|
211
|
-
expect(onboarding.discoveryBlocks.length).toBe(5);
|
|
212
|
-
expect(onboarding.totalInteractions).toBe(0);
|
|
213
|
-
});
|
|
214
|
-
it('deve rastrear progresso do discovery', () => {
|
|
215
|
-
onboarding.discoveryBlocks[0].status = 'completed';
|
|
216
|
-
onboarding.totalInteractions++;
|
|
217
|
-
const progresso = calcularProgressoDiscovery(onboarding.discoveryBlocks);
|
|
218
|
-
expect(progresso.completados).toBe(1);
|
|
219
|
-
expect(onboarding.totalInteractions).toBe(1);
|
|
220
|
-
});
|
|
221
|
-
it('deve marcar discovery como completo quando todos os blocos obrigatórios estão completos', () => {
|
|
222
|
-
onboarding.discoveryBlocks
|
|
223
|
-
.filter((b) => b.required)
|
|
224
|
-
.forEach((b) => (b.status = 'completed'));
|
|
225
|
-
const todosObrigatoriosCompletos = onboarding.discoveryBlocks
|
|
226
|
-
.filter((b) => b.required)
|
|
227
|
-
.every((b) => b.status === 'completed');
|
|
228
|
-
expect(todosObrigatoriosCompletos).toBe(true);
|
|
229
|
-
});
|
|
230
|
-
});
|
|
231
|
-
//# sourceMappingURL=onboarding-flow.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"onboarding-flow.test.js","sourceRoot":"","sources":["../../src/tests/onboarding-flow.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"prd-validation.test.d.ts","sourceRoot":"","sources":["../../src/tests/prd-validation.test.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
|
|
@@ -1,164 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Testes de validação do PRD — verifica que PRDs reais passam nos 3 validadores
|
|
3
|
-
* Criado para garantir que regex/keywords expandidas funcionam corretamente.
|
|
4
|
-
*/
|
|
5
|
-
import { describe, it, expect } from 'vitest';
|
|
6
|
-
import { validarEstrutura } from '../gates/estrutura.js';
|
|
7
|
-
import { validarGate } from '../gates/validator.js';
|
|
8
|
-
// PRD real do SubsTrack (caso de teste que falhava com score 67/100)
|
|
9
|
-
const PRD_SUBSTRACK = `# SubsTrack - PRD Completo e Evoluído
|
|
10
|
-
|
|
11
|
-
## PROBLEMA
|
|
12
|
-
Fadiga de assinaturas: pessoas perdem dinheiro com serviços não utilizados, esquecem períodos de teste e não visualizam impacto total dos gastos recorrentes no orçamento mensal. Causa raiz: proliferação de modelos de assinatura e falta de ferramentas centralizadas.
|
|
13
|
-
|
|
14
|
-
## USUÁRIOS/PERSONAS
|
|
15
|
-
**Ana Silva (B2C)**: 32 anos, profissional de marketing, 8+ assinaturas (streaming, fitness, produtividade). Objetivo: controlar gastos e evitar surpresas. Dores: esquece cancelamentos, perde dinheiro.
|
|
16
|
-
|
|
17
|
-
**Carlos Oliveira (B2B)**: 28 anos, freelancer designer, 5+ ferramentas SaaS. Objetivo: otimizar custos operacionais com orçamento apertado. Dores: perde controle dos custos SaaS.
|
|
18
|
-
|
|
19
|
-
## FUNCIONALIDADES/MVP
|
|
20
|
-
1. **Varredura Automática**: Integração com e-mail/Open Banking para identificar cobranças recorrentes
|
|
21
|
-
2. **Alertas de Renovação**: Notificação 3 dias antes de cobranças/fim de testes gratuitos
|
|
22
|
-
3. **Cancelamento em Um Clique**: Automatização via IA agents ou e-mails jurídicos automáticos
|
|
23
|
-
4. **Dashboard de Gastos**: Visualização clara do "Custo de Vida Digital" mensal/anual
|
|
24
|
-
|
|
25
|
-
## MÉTRICAS DE SUCESSO
|
|
26
|
-
**North Star**: Economia Média por Usuário (valor em R$ economizado nos primeiros 90 dias, meta: R$50)
|
|
27
|
-
|
|
28
|
-
**KPIs Secundários**:
|
|
29
|
-
- Taxa de ativação: 60% em 7 dias
|
|
30
|
-
- Assinaturas identificadas: 8+ por usuário
|
|
31
|
-
- Retenção mensal: 85%
|
|
32
|
-
- NPS: 50+
|
|
33
|
-
- LTV: R$240 (12 meses x R$19,90)
|
|
34
|
-
- CAC: R$50 (marketing digital)
|
|
35
|
-
- Payback: 3 meses
|
|
36
|
-
- Churn Rate: <5% mensal
|
|
37
|
-
|
|
38
|
-
## STAKEHOLDERS
|
|
39
|
-
- Sponsor: João Silva (CEO, ex-nubank, 10 anos fintech)
|
|
40
|
-
- Product Manager: Maria Santos (ex-picpay, specialist em produtos financeiros)
|
|
41
|
-
- Tech Lead: Pedro Costa (8 anos experiência em Open Banking e IA)
|
|
42
|
-
- Design Lead: Ana Lima (UX sênior, especialista em produtos financeiros)
|
|
43
|
-
|
|
44
|
-
## ANÁLISE COMPETITIVA
|
|
45
|
-
| Concorrente | Modelo | Diferencial | Fraqueza |
|
|
46
|
-
|-------------|--------|-------------|----------|
|
|
47
|
-
| Mobills | Controle financeiro | Controle completo | Sem cancelamento automatizado |
|
|
48
|
-
| Organizze | Planejamento | Educação financeira | Manual, sem IA |
|
|
49
|
-
| GuiaBolso | Agregador | Conexão bancária | Foco em controle, não em cancelamento |
|
|
50
|
-
|
|
51
|
-
**Posicionamento**: Único com Auto-Pilot de Cancelamento via IA e especialização em recorrência
|
|
52
|
-
|
|
53
|
-
## TIMELINE MVP
|
|
54
|
-
10 semanas: 4 semanas integração APIs, 4 semanas interface/alertas, 2 semanas beta fechado com 50 usuários.
|
|
55
|
-
|
|
56
|
-
## PLANO DE APRENDIZADO
|
|
57
|
-
- **Experimento 1**: Beta fechado 50 usuários, >95% precisão identificação, 2 semanas
|
|
58
|
-
- **Experimento 2**: Teste A/B cancelamento (100 usuários), >60% taxa cancelamento automatizado vs 20% manual, 2 semanas`;
|
|
59
|
-
const fasePRD = {
|
|
60
|
-
numero: 1,
|
|
61
|
-
nome: "Produto",
|
|
62
|
-
especialista: "Gestor de Produto",
|
|
63
|
-
template: "PRD.md",
|
|
64
|
-
entregavel_esperado: "PRD",
|
|
65
|
-
gate_checklist: [
|
|
66
|
-
"Problema claramente definido",
|
|
67
|
-
"Personas ou usuários identificados",
|
|
68
|
-
"Funcionalidades MVP listadas",
|
|
69
|
-
"Métricas de sucesso definidas",
|
|
70
|
-
],
|
|
71
|
-
};
|
|
72
|
-
describe('Validação do PRD — estrutura.ts', () => {
|
|
73
|
-
it('deve encontrar 4/4 seções obrigatórias no PRD do SubsTrack', () => {
|
|
74
|
-
const result = validarEstrutura(1, PRD_SUBSTRACK, 'base');
|
|
75
|
-
expect(result.secoes_encontradas).toHaveLength(4);
|
|
76
|
-
expect(result.secoes_faltando).toHaveLength(0);
|
|
77
|
-
expect(result.valido).toBe(true);
|
|
78
|
-
expect(result.score).toBeGreaterThanOrEqual(80);
|
|
79
|
-
});
|
|
80
|
-
it('deve aceitar headers com ### (h3)', () => {
|
|
81
|
-
const prd = `### Problema\nDescrição do problema aqui.\n\n### Usuários\nDescrição dos usuários.\n\n### MVP\nFuncionalidades do MVP.\n\n### Métricas\nMétricas de sucesso.`;
|
|
82
|
-
const result = validarEstrutura(1, prd, 'base');
|
|
83
|
-
expect(result.secoes_encontradas.length).toBeGreaterThanOrEqual(3);
|
|
84
|
-
});
|
|
85
|
-
it('deve aceitar headers numerados (## 1. Problema)', () => {
|
|
86
|
-
const prd = `## 1. Problema\nDescrição.\n\n## 2. Personas\nDescrição.\n\n## 3. Funcionalidades\nDescrição.\n\n## 4. Métricas\nDescrição.`;
|
|
87
|
-
const result = validarEstrutura(1, prd, 'base');
|
|
88
|
-
expect(result.secoes_encontradas.length).toBeGreaterThanOrEqual(3);
|
|
89
|
-
});
|
|
90
|
-
it('deve aceitar variações com acento (USUÁRIOS, MÉTRICAS)', () => {
|
|
91
|
-
const prd = `## PROBLEMA\nDescrição.\n\n## USUÁRIOS\nDescrição.\n\n## FUNCIONALIDADES\nDescrição.\n\n## MÉTRICAS DE SUCESSO\nDescrição.`;
|
|
92
|
-
const result = validarEstrutura(1, prd, 'base');
|
|
93
|
-
expect(result.secoes_encontradas).toHaveLength(4);
|
|
94
|
-
});
|
|
95
|
-
it('deve aceitar "USUÁRIOS/PERSONAS" com barra', () => {
|
|
96
|
-
const prd = `## PROBLEMA\nDescrição.\n\n## USUÁRIOS/PERSONAS\nDescrição.\n\n## FUNCIONALIDADES/MVP\nDescrição.\n\n## MÉTRICAS DE SUCESSO\nDescrição.`;
|
|
97
|
-
const result = validarEstrutura(1, prd, 'base');
|
|
98
|
-
expect(result.secoes_encontradas).toHaveLength(4);
|
|
99
|
-
});
|
|
100
|
-
it('deve aceitar sinônimos (Público-alvo, Solução, KPIs)', () => {
|
|
101
|
-
const prd = `## Dor do Cliente\nDescrição.\n\n## Público-alvo\nDescrição.\n\n## Solução Proposta\nDescrição.\n\n## KPIs\nDescrição.`;
|
|
102
|
-
const result = validarEstrutura(1, prd, 'base');
|
|
103
|
-
expect(result.secoes_encontradas).toHaveLength(4);
|
|
104
|
-
});
|
|
105
|
-
});
|
|
106
|
-
describe('Validação do PRD — validator.ts (checklist)', () => {
|
|
107
|
-
it('deve validar 4/4 itens do checklist no PRD do SubsTrack', () => {
|
|
108
|
-
const result = validarGate(fasePRD, PRD_SUBSTRACK);
|
|
109
|
-
expect(result.itens_validados).toHaveLength(4);
|
|
110
|
-
expect(result.itens_pendentes).toHaveLength(0);
|
|
111
|
-
expect(result.valido).toBe(true);
|
|
112
|
-
});
|
|
113
|
-
it('deve reconhecer "problema" via sinônimos', () => {
|
|
114
|
-
const prd = 'A dor principal é a falta de controle financeiro sobre assinaturas.';
|
|
115
|
-
const result = validarGate(fasePRD, prd);
|
|
116
|
-
// Pelo menos o item "Problema claramente definido" deve passar (sinônimo "dor")
|
|
117
|
-
expect(result.itens_validados.some(i => i.toLowerCase().includes('problema'))).toBe(true);
|
|
118
|
-
});
|
|
119
|
-
it('deve reconhecer "personas" via sinônimos', () => {
|
|
120
|
-
const prd = 'O público-alvo são jovens profissionais de 25-35 anos.';
|
|
121
|
-
const result = validarGate(fasePRD, prd);
|
|
122
|
-
expect(result.itens_validados.some(i => i.toLowerCase().includes('persona') || i.toLowerCase().includes('usuário'))).toBe(true);
|
|
123
|
-
});
|
|
124
|
-
it('deve reconhecer "funcionalidades" via sinônimos', () => {
|
|
125
|
-
const prd = 'O MVP inclui dashboard, alertas e cancelamento automático.';
|
|
126
|
-
const result = validarGate(fasePRD, prd);
|
|
127
|
-
expect(result.itens_validados.some(i => i.toLowerCase().includes('funcionalidade') || i.toLowerCase().includes('mvp'))).toBe(true);
|
|
128
|
-
});
|
|
129
|
-
it('deve reconhecer "métricas" via sinônimos', () => {
|
|
130
|
-
const prd = 'Os KPIs incluem taxa de ativação, retenção e NPS.';
|
|
131
|
-
const result = validarGate(fasePRD, prd);
|
|
132
|
-
expect(result.itens_validados.some(i => i.toLowerCase().includes('métrica') || i.toLowerCase().includes('sucesso'))).toBe(true);
|
|
133
|
-
});
|
|
134
|
-
});
|
|
135
|
-
describe('Score combinado (calcularQualityScore simulado)', () => {
|
|
136
|
-
it('PRD do SubsTrack deve atingir score >= 70', () => {
|
|
137
|
-
const estruturaResult = validarEstrutura(1, PRD_SUBSTRACK, 'base');
|
|
138
|
-
const gateResult = validarGate(fasePRD, PRD_SUBSTRACK);
|
|
139
|
-
const totalChecklist = gateResult.itens_validados.length + gateResult.itens_pendentes.length;
|
|
140
|
-
const checklistScore = totalChecklist > 0
|
|
141
|
-
? (gateResult.itens_validados.length / totalChecklist) * 100
|
|
142
|
-
: 100;
|
|
143
|
-
const tamanhoScore = estruturaResult.tamanho_ok ? 100 : 50;
|
|
144
|
-
const qualityScore = Math.round((estruturaResult.score * 0.30) +
|
|
145
|
-
(checklistScore * 0.50) +
|
|
146
|
-
(tamanhoScore * 0.20));
|
|
147
|
-
expect(qualityScore).toBeGreaterThanOrEqual(70);
|
|
148
|
-
});
|
|
149
|
-
it('PRD mínimo com 4 seções deve atingir score >= 70', () => {
|
|
150
|
-
const prdMinimo = `## Problema\nDescrição do problema com detalhes suficientes para validação.\n\n## Personas\nUsuários identificados com perfis detalhados.\n\n## Funcionalidades MVP\nLista de funcionalidades do MVP com descrições.\n\n## Métricas de Sucesso\nKPIs e métricas definidas com metas claras.`;
|
|
151
|
-
const estruturaResult = validarEstrutura(1, prdMinimo, 'base');
|
|
152
|
-
const gateResult = validarGate(fasePRD, prdMinimo);
|
|
153
|
-
const totalChecklist = gateResult.itens_validados.length + gateResult.itens_pendentes.length;
|
|
154
|
-
const checklistScore = totalChecklist > 0
|
|
155
|
-
? (gateResult.itens_validados.length / totalChecklist) * 100
|
|
156
|
-
: 100;
|
|
157
|
-
const tamanhoScore = estruturaResult.tamanho_ok ? 100 : 50;
|
|
158
|
-
const qualityScore = Math.round((estruturaResult.score * 0.30) +
|
|
159
|
-
(checklistScore * 0.50) +
|
|
160
|
-
(tamanhoScore * 0.20));
|
|
161
|
-
expect(qualityScore).toBeGreaterThanOrEqual(70);
|
|
162
|
-
});
|
|
163
|
-
});
|
|
164
|
-
//# sourceMappingURL=prd-validation.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"prd-validation.test.js","sourceRoot":"","sources":["../../src/tests/prd-validation.test.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAGpD,qEAAqE;AACrE,MAAM,aAAa,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;yHAiDmG,CAAC;AAE1H,MAAM,OAAO,GAAS;IAClB,MAAM,EAAE,CAAC;IACT,IAAI,EAAE,SAAS;IACf,YAAY,EAAE,mBAAmB;IACjC,QAAQ,EAAE,QAAQ;IAClB,mBAAmB,EAAE,KAAK;IAC1B,cAAc,EAAE;QACZ,8BAA8B;QAC9B,oCAAoC;QACpC,8BAA8B;QAC9B,+BAA+B;KAClC;CACJ,CAAC;AAEF,QAAQ,CAAC,iCAAiC,EAAE,GAAG,EAAE;IAC7C,EAAE,CAAC,4DAA4D,EAAE,GAAG,EAAE;QAClE,MAAM,MAAM,GAAG,gBAAgB,CAAC,CAAC,EAAE,aAAa,EAAE,MAAM,CAAC,CAAC;QAC1D,MAAM,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAClD,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAC/C,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,sBAAsB,CAAC,EAAE,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QACzC,MAAM,GAAG,GAAG,8JAA8J,CAAC;QAC3K,MAAM,MAAM,GAAG,gBAAgB,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;QAChD,MAAM,CAAC,MAAM,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;IACvE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACvD,MAAM,GAAG,GAAG,6HAA6H,CAAC;QAC1I,MAAM,MAAM,GAAG,gBAAgB,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;QAChD,MAAM,CAAC,MAAM,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;IACvE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;QAC9D,MAAM,GAAG,GAAG,4HAA4H,CAAC;QACzI,MAAM,MAAM,GAAG,gBAAgB,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;QAChD,MAAM,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QAClD,MAAM,GAAG,GAAG,yIAAyI,CAAC;QACtJ,MAAM,MAAM,GAAG,gBAAgB,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;QAChD,MAAM,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;QAC5D,MAAM,GAAG,GAAG,wHAAwH,CAAC;QACrI,MAAM,MAAM,GAAG,gBAAgB,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;QAChD,MAAM,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,6CAA6C,EAAE,GAAG,EAAE;IACzD,EAAE,CAAC,yDAAyD,EAAE,GAAG,EAAE;QAC/D,MAAM,MAAM,GAAG,WAAW,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;QACnD,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAC/C,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAC/C,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAChD,MAAM,GAAG,GAAG,qEAAqE,CAAC;QAClF,MAAM,MAAM,GAAG,WAAW,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QACzC,gFAAgF;QAChF,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC9F,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAChD,MAAM,GAAG,GAAG,wDAAwD,CAAC;QACrE,MAAM,MAAM,GAAG,WAAW,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QACzC,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpI,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACvD,MAAM,GAAG,GAAG,4DAA4D,CAAC;QACzE,MAAM,MAAM,GAAG,WAAW,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QACzC,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACvI,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAChD,MAAM,GAAG,GAAG,mDAAmD,CAAC;QAChE,MAAM,MAAM,GAAG,WAAW,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QACzC,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpI,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,iDAAiD,EAAE,GAAG,EAAE;IAC7D,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACjD,MAAM,eAAe,GAAG,gBAAgB,CAAC,CAAC,EAAE,aAAa,EAAE,MAAM,CAAC,CAAC;QACnE,MAAM,UAAU,GAAG,WAAW,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;QAEvD,MAAM,cAAc,GAAG,UAAU,CAAC,eAAe,CAAC,MAAM,GAAG,UAAU,CAAC,eAAe,CAAC,MAAM,CAAC;QAC7F,MAAM,cAAc,GAAG,cAAc,GAAG,CAAC;YACrC,CAAC,CAAC,CAAC,UAAU,CAAC,eAAe,CAAC,MAAM,GAAG,cAAc,CAAC,GAAG,GAAG;YAC5D,CAAC,CAAC,GAAG,CAAC;QACV,MAAM,YAAY,GAAG,eAAe,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QAE3D,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAC3B,CAAC,eAAe,CAAC,KAAK,GAAG,IAAI,CAAC;YAC9B,CAAC,cAAc,GAAG,IAAI,CAAC;YACvB,CAAC,YAAY,GAAG,IAAI,CAAC,CACxB,CAAC;QAEF,MAAM,CAAC,YAAY,CAAC,CAAC,sBAAsB,CAAC,EAAE,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;QACxD,MAAM,SAAS,GAAG,6RAA6R,CAAC;QAEhT,MAAM,eAAe,GAAG,gBAAgB,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;QAC/D,MAAM,UAAU,GAAG,WAAW,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QAEnD,MAAM,cAAc,GAAG,UAAU,CAAC,eAAe,CAAC,MAAM,GAAG,UAAU,CAAC,eAAe,CAAC,MAAM,CAAC;QAC7F,MAAM,cAAc,GAAG,cAAc,GAAG,CAAC;YACrC,CAAC,CAAC,CAAC,UAAU,CAAC,eAAe,CAAC,MAAM,GAAG,cAAc,CAAC,GAAG,GAAG;YAC5D,CAAC,CAAC,GAAG,CAAC;QACV,MAAM,YAAY,GAAG,eAAe,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QAE3D,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAC3B,CAAC,eAAe,CAAC,KAAK,GAAG,IAAI,CAAC;YAC9B,CAAC,cAAc,GAAG,IAAI,CAAC;YACvB,CAAC,YAAY,GAAG,IAAI,CAAC,CACxB,CAAC;QAEF,MAAM,CAAC,YAAY,CAAC,CAAC,sBAAsB,CAAC,EAAE,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"readiness-dashboard.test.d.ts","sourceRoot":"","sources":["../../src/tests/readiness-dashboard.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|