@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,214 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Testes para DeliverableValidator v6.1
|
|
3
|
-
*
|
|
4
|
-
* Cobre os cenários críticos de validação de entregáveis de fase:
|
|
5
|
-
* - PRD vazio → bloqueado
|
|
6
|
-
* - PRD completo → aprovado
|
|
7
|
-
* - Placeholders → penalizado
|
|
8
|
-
* - Gate checklist → score aumenta quando evidenciado
|
|
9
|
-
* - Fases de código (Frontend/Backend) → tratamento especial
|
|
10
|
-
*/
|
|
11
|
-
import { describe, it, expect } from 'vitest';
|
|
12
|
-
import { DeliverableValidator } from '../core/validation/layers/DeliverableValidator.js';
|
|
13
|
-
const validator = new DeliverableValidator();
|
|
14
|
-
// ─── Helpers ───────────────────────────────────────────────────────────────
|
|
15
|
-
function makeContext(nomeFase, gateChecklist = []) {
|
|
16
|
-
return {
|
|
17
|
-
projectPath: '/test/project',
|
|
18
|
-
nomeFase,
|
|
19
|
-
gateChecklist,
|
|
20
|
-
tier: 'base',
|
|
21
|
-
};
|
|
22
|
-
}
|
|
23
|
-
const PRD_VAZIO = '';
|
|
24
|
-
const PRD_CURTO = '# PRD\n\nAlgum texto.';
|
|
25
|
-
const PRD_PLACEHOLDER = `# PRD do Produto
|
|
26
|
-
|
|
27
|
-
## Problema
|
|
28
|
-
Lorem ipsum dolor sit amet.
|
|
29
|
-
|
|
30
|
-
## Objetivo
|
|
31
|
-
TODO: definir objetivo
|
|
32
|
-
|
|
33
|
-
## Persona
|
|
34
|
-
[inserir persona aqui]
|
|
35
|
-
|
|
36
|
-
## MVP
|
|
37
|
-
- Feature A
|
|
38
|
-
- Feature B
|
|
39
|
-
|
|
40
|
-
## Funcionalidades
|
|
41
|
-
FIXME: listar funcionalidades
|
|
42
|
-
`;
|
|
43
|
-
const PRD_COMPLETO = `# PRD — Sistema de Gestão de Pedidos
|
|
44
|
-
|
|
45
|
-
## Problema
|
|
46
|
-
Restaurantes perdem pedidos por falta de sistema centralizado. O processo manual gera erros e atrasos.
|
|
47
|
-
|
|
48
|
-
## Objetivo
|
|
49
|
-
Criar um sistema digital que centralize pedidos, reduza erros em 80% e aumente a satisfação dos clientes.
|
|
50
|
-
|
|
51
|
-
## Persona
|
|
52
|
-
**João, Gerente de Restaurante** — 35 anos, usa smartphone, precisa de visibilidade em tempo real dos pedidos.
|
|
53
|
-
|
|
54
|
-
## MVP
|
|
55
|
-
O MVP inclui: cadastro de produtos, recebimento de pedidos via tablet, notificação para cozinha, e relatório diário.
|
|
56
|
-
|
|
57
|
-
## Funcionalidades Principais
|
|
58
|
-
1. Cadastro de cardápio com categorias e preços
|
|
59
|
-
2. Interface de pedido para garçons (tablet)
|
|
60
|
-
3. Painel da cozinha com fila de pedidos
|
|
61
|
-
4. Relatório de vendas por período
|
|
62
|
-
5. Integração com sistema de pagamento
|
|
63
|
-
|
|
64
|
-
## Critérios de Sucesso
|
|
65
|
-
- Redução de 80% nos erros de pedido
|
|
66
|
-
- Tempo de atendimento < 2 minutos
|
|
67
|
-
- Satisfação do cliente ≥ 4.5/5
|
|
68
|
-
`;
|
|
69
|
-
const REQUISITOS_COMPLETO = `# Requisitos do Sistema
|
|
70
|
-
|
|
71
|
-
## RF-001 — Cadastro de Produto
|
|
72
|
-
O sistema deve permitir cadastrar produtos com nome, preço e categoria.
|
|
73
|
-
**Critério de aceite:** Produto salvo aparece no cardápio em < 1s.
|
|
74
|
-
|
|
75
|
-
## RF-002 — Pedido via Tablet
|
|
76
|
-
O garçom deve conseguir registrar pedidos pelo tablet.
|
|
77
|
-
**Critério de aceite:** Pedido enviado para cozinha em < 3s.
|
|
78
|
-
|
|
79
|
-
## RNF-001 — Performance
|
|
80
|
-
O sistema deve responder em < 500ms para 95% das requisições.
|
|
81
|
-
|
|
82
|
-
## RNF-002 — Disponibilidade
|
|
83
|
-
O sistema deve ter uptime de 99.9%.
|
|
84
|
-
|
|
85
|
-
## Critérios de Aceite Gerais
|
|
86
|
-
Todos os RFs devem ter testes automatizados com cobertura > 80%.
|
|
87
|
-
`;
|
|
88
|
-
// ─── Testes ────────────────────────────────────────────────────────────────
|
|
89
|
-
describe('DeliverableValidator: Fase Produto (PRD)', () => {
|
|
90
|
-
it('deve BLOQUEAR entregável vazio', async () => {
|
|
91
|
-
const result = await validator.validate(PRD_VAZIO, makeContext('Produto'));
|
|
92
|
-
expect(result.passed).toBe(false);
|
|
93
|
-
expect(result.score).toBeLessThan(70);
|
|
94
|
-
});
|
|
95
|
-
it('deve BLOQUEAR entregável muito curto', async () => {
|
|
96
|
-
const result = await validator.validate(PRD_CURTO, makeContext('Produto'));
|
|
97
|
-
expect(result.passed).toBe(false);
|
|
98
|
-
expect(result.issues.some(i => i.type === 'content-too-short')).toBe(true);
|
|
99
|
-
});
|
|
100
|
-
it('deve PENALIZAR entregável com placeholders', async () => {
|
|
101
|
-
const result = await validator.validate(PRD_PLACEHOLDER, makeContext('Produto'));
|
|
102
|
-
expect(result.issues.some(i => i.type === 'placeholder-content')).toBe(true);
|
|
103
|
-
// Score deve ser menor que um PRD sem placeholders
|
|
104
|
-
const resultSemPlaceholder = await validator.validate(PRD_COMPLETO, makeContext('Produto'));
|
|
105
|
-
expect(result.score).toBeLessThan(resultSemPlaceholder.score);
|
|
106
|
-
});
|
|
107
|
-
it('deve APROVAR PRD completo com todas as seções', async () => {
|
|
108
|
-
const result = await validator.validate(PRD_COMPLETO, makeContext('Produto'));
|
|
109
|
-
expect(result.passed).toBe(true);
|
|
110
|
-
expect(result.score).toBeGreaterThanOrEqual(70);
|
|
111
|
-
});
|
|
112
|
-
it('deve ter score maior quando gate checklist é evidenciado', async () => {
|
|
113
|
-
const gate = ['problema', 'persona', 'funcionalidades'];
|
|
114
|
-
const resultSemGate = await validator.validate(PRD_COMPLETO, makeContext('Produto', []));
|
|
115
|
-
const resultComGate = await validator.validate(PRD_COMPLETO, makeContext('Produto', gate));
|
|
116
|
-
// Com gate evidenciado, score deve ser igual ou maior (bônus)
|
|
117
|
-
expect(resultComGate.score).toBeGreaterThanOrEqual(resultSemGate.score);
|
|
118
|
-
});
|
|
119
|
-
it('deve PENALIZAR quando gate checklist não é evidenciado', async () => {
|
|
120
|
-
const gate = ['análise competitiva detalhada', 'projeção financeira de 5 anos', 'pesquisa com 1000 usuários'];
|
|
121
|
-
const result = await validator.validate(PRD_COMPLETO, makeContext('Produto', gate));
|
|
122
|
-
// Gate items muito específicos não estarão no PRD → penalidade
|
|
123
|
-
expect(result.issues.some(i => i.type === 'gate-checklist-incomplete')).toBe(true);
|
|
124
|
-
});
|
|
125
|
-
});
|
|
126
|
-
describe('DeliverableValidator: Fase Requisitos', () => {
|
|
127
|
-
it('deve APROVAR requisitos completos com RF, RNF e critérios', async () => {
|
|
128
|
-
const result = await validator.validate(REQUISITOS_COMPLETO, makeContext('Requisitos'));
|
|
129
|
-
expect(result.passed).toBe(true);
|
|
130
|
-
expect(result.score).toBeGreaterThanOrEqual(70);
|
|
131
|
-
});
|
|
132
|
-
it('deve detectar ausência de critérios de aceite', async () => {
|
|
133
|
-
const semCriterios = `# Requisitos\n\n## RF-001\nO sistema deve fazer X.\n\n## RNF-001\nPerformance adequada.\n`;
|
|
134
|
-
const result = await validator.validate(semCriterios, makeContext('Requisitos'));
|
|
135
|
-
// 'aceite' está nos termos obrigatórios — deve detectar ausência
|
|
136
|
-
const missingIssue = result.issues.find(i => i.type === 'missing-sections');
|
|
137
|
-
expect(missingIssue).toBeDefined();
|
|
138
|
-
});
|
|
139
|
-
});
|
|
140
|
-
describe('DeliverableValidator: Qualidade do Markdown', () => {
|
|
141
|
-
it('deve detectar documento sem headings', async () => {
|
|
142
|
-
const semHeadings = 'Apenas texto sem nenhum heading markdown. '.repeat(50);
|
|
143
|
-
const result = await validator.validate(semHeadings, makeContext('Produto'));
|
|
144
|
-
expect(result.issues.some(i => i.type === 'no-headings')).toBe(true);
|
|
145
|
-
});
|
|
146
|
-
it('deve detectar documento apenas com bullets', async () => {
|
|
147
|
-
const apenasBullets = Array(20).fill('- Item de lista sem contexto').join('\n');
|
|
148
|
-
const result = await validator.validate(apenasBullets, makeContext('Produto'));
|
|
149
|
-
expect(result.issues.some(i => i.type === 'only-bullets')).toBe(true);
|
|
150
|
-
});
|
|
151
|
-
});
|
|
152
|
-
describe('DeliverableValidator: Fases de Código (Frontend/Backend)', () => {
|
|
153
|
-
const codigoFrontend = `
|
|
154
|
-
import React, { useState } from 'react';
|
|
155
|
-
import { useNavigate } from 'react-router-dom';
|
|
156
|
-
|
|
157
|
-
// Componente de lista de pedidos
|
|
158
|
-
export function OrderList() {
|
|
159
|
-
const [orders, setOrders] = useState([]);
|
|
160
|
-
const navigate = useNavigate();
|
|
161
|
-
|
|
162
|
-
// Estado de carregamento
|
|
163
|
-
const [loading, setLoading] = useState(false);
|
|
164
|
-
|
|
165
|
-
return (
|
|
166
|
-
<div className="order-list">
|
|
167
|
-
{orders.map(order => (
|
|
168
|
-
<div key={order.id}>{order.name}</div>
|
|
169
|
-
))}
|
|
170
|
-
</div>
|
|
171
|
-
);
|
|
172
|
-
}
|
|
173
|
-
|
|
174
|
-
// Rota principal
|
|
175
|
-
export default OrderList;
|
|
176
|
-
`;
|
|
177
|
-
it('deve detectar entregável de código para fase Frontend', async () => {
|
|
178
|
-
const result = await validator.validate(codigoFrontend, makeContext('Frontend'));
|
|
179
|
-
// Para código, não deve exigir headings Markdown
|
|
180
|
-
const noHeadingsIssue = result.issues.find(i => i.type === 'no-headings');
|
|
181
|
-
// Código legítimo não deve ser bloqueado por falta de headings Markdown
|
|
182
|
-
// (o validator deve detectar que é código e não Markdown)
|
|
183
|
-
expect(result.score).toBeGreaterThan(0); // Não deve dar score 0 para código válido
|
|
184
|
-
});
|
|
185
|
-
it('deve ter tamanho mínimo menor para fases de código', async () => {
|
|
186
|
-
// Fases de código têm tamanho mínimo de 300 chars (menor que PRD com 800)
|
|
187
|
-
const codigoCurto = `export function hello() { return 'world'; }`;
|
|
188
|
-
const result = await validator.validate(codigoCurto, makeContext('Frontend'));
|
|
189
|
-
// Código curto pode falhar por tamanho, mas não por ausência de headings
|
|
190
|
-
const noHeadingsIssue = result.issues.find(i => i.type === 'no-headings');
|
|
191
|
-
// Para código, não deve ter issue de headings
|
|
192
|
-
expect(noHeadingsIssue).toBeUndefined();
|
|
193
|
-
});
|
|
194
|
-
});
|
|
195
|
-
describe('DeliverableValidator: Score e Threshold', () => {
|
|
196
|
-
it('score deve ser 100 para documento perfeito sem issues', async () => {
|
|
197
|
-
// Fase sem seções obrigatórias definidas → sem penalidades de seção
|
|
198
|
-
const conteudoPerfeito = `# Documento Perfeito\n\n${'Conteúdo detalhado e completo. '.repeat(30)}`;
|
|
199
|
-
const result = await validator.validate(conteudoPerfeito, makeContext('Desconhecida'));
|
|
200
|
-
expect(result.score).toBeGreaterThanOrEqual(90); // Sem penalidades → score alto
|
|
201
|
-
});
|
|
202
|
-
it('threshold de aprovação deve ser 70', async () => {
|
|
203
|
-
// Verificar que o threshold é 70 (não 60 nem 80)
|
|
204
|
-
const result = await validator.validate(PRD_COMPLETO, makeContext('Produto'));
|
|
205
|
-
// PRD completo deve passar com score ≥ 70
|
|
206
|
-
if (result.score >= 70) {
|
|
207
|
-
expect(result.passed).toBe(true);
|
|
208
|
-
}
|
|
209
|
-
else {
|
|
210
|
-
expect(result.passed).toBe(false);
|
|
211
|
-
}
|
|
212
|
-
});
|
|
213
|
-
});
|
|
214
|
-
//# sourceMappingURL=deliverable-validator.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"deliverable-validator.test.js","sourceRoot":"","sources":["../../src/tests/deliverable-validator.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"flow-engine.test.d.ts","sourceRoot":"","sources":["../../src/tests/flow-engine.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,85 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
2
|
-
import { getNextStep, getFlowState, isInOnboarding } from '../services/flow-engine.js';
|
|
3
|
-
// Mock dependencies
|
|
4
|
-
vi.mock('../services/specialist.service.js', () => ({
|
|
5
|
-
getSpecialistPersona: vi.fn().mockReturnValue({ role: 'Especialista Mock', context: 'Contexto mock' })
|
|
6
|
-
}));
|
|
7
|
-
vi.mock('../flows/types.js', () => ({
|
|
8
|
-
getFaseComStitch: vi.fn().mockReturnValue({ nome: 'Requisitos', entregavel_esperado: 'requisitos.md' })
|
|
9
|
-
}));
|
|
10
|
-
describe('Flow Engine', () => {
|
|
11
|
-
beforeEach(() => {
|
|
12
|
-
vi.clearAllMocks();
|
|
13
|
-
});
|
|
14
|
-
describe('Smart Auto-Flow (V6 Sprint 6)', () => {
|
|
15
|
-
let baseState;
|
|
16
|
-
beforeEach(() => {
|
|
17
|
-
baseState = {
|
|
18
|
-
projeto_id: '123',
|
|
19
|
-
fase_atual: 2,
|
|
20
|
-
total_fases: 10,
|
|
21
|
-
config: { setup: { completed: true }, mode: 'balanced' },
|
|
22
|
-
gates_validados: [1],
|
|
23
|
-
nivel: 'medio',
|
|
24
|
-
usar_stitch: false
|
|
25
|
-
// flow_phase_type definido no teste
|
|
26
|
-
};
|
|
27
|
-
});
|
|
28
|
-
it('deve manter requires_user_input=true para fases do tipo input_required', () => {
|
|
29
|
-
baseState.flow_phase_type = 'input_required';
|
|
30
|
-
const nextStep = getNextStep(baseState, '/test');
|
|
31
|
-
// Fases normais de transição de "fase_ativa" para "gerar_entregavel" requerem input humano
|
|
32
|
-
expect(nextStep.tool).toBe('executar');
|
|
33
|
-
expect(nextStep.requires_user_input).toBe(true);
|
|
34
|
-
});
|
|
35
|
-
it('deve sobrescrever requires_user_input=false para fases do tipo derived (Auto-Flow)', () => {
|
|
36
|
-
baseState.flow_phase_type = 'derived';
|
|
37
|
-
const nextStep = getNextStep(baseState, '/test');
|
|
38
|
-
// Fases derivadas podem avançar silenciosamente sem input
|
|
39
|
-
expect(nextStep.tool).toBe('executar');
|
|
40
|
-
expect(nextStep.requires_user_input).toBe(false);
|
|
41
|
-
});
|
|
42
|
-
it('deve sobrescrever requires_user_input=false para fases do tipo technical (Auto-Flow)', () => {
|
|
43
|
-
baseState.flow_phase_type = 'technical';
|
|
44
|
-
const nextStep = getNextStep(baseState, '/test');
|
|
45
|
-
expect(nextStep.tool).toBe('executar');
|
|
46
|
-
expect(nextStep.requires_user_input).toBe(false);
|
|
47
|
-
});
|
|
48
|
-
it('deve manter requires_user_input=true para fases do tipo correction_loop', () => {
|
|
49
|
-
baseState.flow_phase_type = 'correction_loop';
|
|
50
|
-
const nextStep = getNextStep(baseState, '/test');
|
|
51
|
-
expect(nextStep.tool).toBe('executar');
|
|
52
|
-
expect(nextStep.requires_user_input).toBe(true); // transição padrão exige input se for fallback
|
|
53
|
-
});
|
|
54
|
-
});
|
|
55
|
-
describe('Fluxos de Estado (getFlowState & isInOnboarding)', () => {
|
|
56
|
-
it('deve reconhecer corretamente se está em onboarding (specialist_active)', () => {
|
|
57
|
-
const estadoOnboarding = {
|
|
58
|
-
projeto_id: '123',
|
|
59
|
-
onboarding: {
|
|
60
|
-
phase: 'running',
|
|
61
|
-
specialistPhase: { status: 'active' }
|
|
62
|
-
}
|
|
63
|
-
};
|
|
64
|
-
expect(isInOnboarding(estadoOnboarding)).toBe(true);
|
|
65
|
-
const fs = getFlowState(estadoOnboarding, '/test');
|
|
66
|
-
expect(fs.currentPhase).toBe('specialist_active');
|
|
67
|
-
});
|
|
68
|
-
it('não deve marcar como onboarding se phase for completed sem specialistPhase', () => {
|
|
69
|
-
const estadoDesenvolvimento = {
|
|
70
|
-
projeto_id: '123',
|
|
71
|
-
fase_atual: 2,
|
|
72
|
-
total_fases: 10,
|
|
73
|
-
gates_validados: [1],
|
|
74
|
-
onboarding: {
|
|
75
|
-
phase: 'completed',
|
|
76
|
-
specialistPhase: null
|
|
77
|
-
}
|
|
78
|
-
};
|
|
79
|
-
expect(isInOnboarding(estadoDesenvolvimento)).toBe(false);
|
|
80
|
-
const fs = getFlowState(estadoDesenvolvimento, '/test');
|
|
81
|
-
expect(fs.currentPhase).toBe('fase_ativa');
|
|
82
|
-
});
|
|
83
|
-
});
|
|
84
|
-
});
|
|
85
|
-
//# sourceMappingURL=flow-engine.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"flow-engine.test.js","sourceRoot":"","sources":["../../src/tests/flow-engine.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"gate-orientation.test.d.ts","sourceRoot":"","sources":["../../src/tests/gate-orientation.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
import { vi, describe, it, expect, beforeEach } from 'vitest';
|
|
2
|
-
import { generateGateOrientationDoc } from '../utils/gate-orientation.js';
|
|
3
|
-
import * as fsPromises from 'fs/promises';
|
|
4
|
-
// Mocks
|
|
5
|
-
vi.mock('fs/promises', () => ({
|
|
6
|
-
writeFile: vi.fn().mockResolvedValue(undefined),
|
|
7
|
-
mkdir: vi.fn().mockResolvedValue(undefined)
|
|
8
|
-
}));
|
|
9
|
-
vi.mock('../services/skill-loader.service.js', () => ({
|
|
10
|
-
SkillLoaderService: class {
|
|
11
|
-
async loadChecklist(faseNome) {
|
|
12
|
-
if (faseNome === 'Produto')
|
|
13
|
-
return '- Critério A\n- Critério B';
|
|
14
|
-
return null;
|
|
15
|
-
}
|
|
16
|
-
}
|
|
17
|
-
}));
|
|
18
|
-
vi.mock('../utils/prompt-mapper.js', () => ({
|
|
19
|
-
getSkillParaFase: vi.fn().mockReturnValue('skill-gestao-produto')
|
|
20
|
-
}));
|
|
21
|
-
vi.mock('../utils/ide-paths.js', () => ({
|
|
22
|
-
getSkillFilePath: vi.fn().mockReturnValue('.agent/skills/skill-gestao-produto/'),
|
|
23
|
-
detectIDE: vi.fn().mockReturnValue('cursor')
|
|
24
|
-
}));
|
|
25
|
-
describe('GateOrientation', () => {
|
|
26
|
-
beforeEach(() => {
|
|
27
|
-
vi.clearAllMocks();
|
|
28
|
-
});
|
|
29
|
-
it('deve gerar o documento descritivo de gate e salvar no disco', async () => {
|
|
30
|
-
const result = await generateGateOrientationDoc('/test/dir', 'Produto', 1);
|
|
31
|
-
expect(result).not.toBeNull();
|
|
32
|
-
expect(fsPromises.mkdir).toHaveBeenCalled();
|
|
33
|
-
expect(fsPromises.writeFile).toHaveBeenCalled();
|
|
34
|
-
// Verificar o path correto gerado
|
|
35
|
-
const expectedPathPart = 'fase-01'; // Verifica normalização
|
|
36
|
-
expect(result).toContain(expectedPathPart);
|
|
37
|
-
expect(result).toContain('.orientacoes-gate.md');
|
|
38
|
-
// Checar parte do conteúdo escrito
|
|
39
|
-
const writeCallArgs = vi.mocked(fsPromises.writeFile).mock.calls[0];
|
|
40
|
-
const contentWritten = writeCallArgs[1];
|
|
41
|
-
expect(contentWritten).toContain('Critérios do Gate — Fase 1: Produto');
|
|
42
|
-
expect(contentWritten).toContain('skill-gestao-produto');
|
|
43
|
-
expect(contentWritten).toContain('- Critério A\n- Critério B');
|
|
44
|
-
});
|
|
45
|
-
it('deve retornar null se o checklist da fase não for encontrado na skill', async () => {
|
|
46
|
-
// Mocka uma fase não registrada
|
|
47
|
-
const result = await generateGateOrientationDoc('/test/dir', 'FaseInvalida', 99);
|
|
48
|
-
// Se não houver checklist, o orientador aborta e não gera nada
|
|
49
|
-
expect(result).toBeNull();
|
|
50
|
-
expect(fsPromises.writeFile).not.toHaveBeenCalled();
|
|
51
|
-
});
|
|
52
|
-
it('deve lidar corretamente com erros do filesystem durante a gravação', async () => {
|
|
53
|
-
// Redefinir mock especificamente para este caso causar erro
|
|
54
|
-
vi.mocked(fsPromises.mkdir).mockRejectedValueOnce(new Error('Permission denied'));
|
|
55
|
-
const result = await generateGateOrientationDoc('/test/dir', 'Produto', 1);
|
|
56
|
-
expect(result).toBeNull();
|
|
57
|
-
});
|
|
58
|
-
});
|
|
59
|
-
//# sourceMappingURL=gate-orientation.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"gate-orientation.test.js","sourceRoot":"","sources":["../../src/tests/gate-orientation.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"middleware.test.d.ts","sourceRoot":"","sources":["../../src/tests/middleware.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|