@maestro-ai/mcp-server 5.4.5 → 5.5.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/README.md +68 -83
- package/dist/content/rules/RULES.md +14 -0
- package/dist/core/metrics/MetricsCollector.d.ts +28 -12
- package/dist/core/metrics/MetricsCollector.d.ts.map +1 -1
- package/dist/core/metrics/MetricsCollector.js +151 -12
- package/dist/core/metrics/MetricsCollector.js.map +1 -1
- package/dist/core/validation/ValidationPipeline.d.ts +24 -2
- package/dist/core/validation/ValidationPipeline.d.ts.map +1 -1
- package/dist/core/validation/ValidationPipeline.js +46 -2
- package/dist/core/validation/ValidationPipeline.js.map +1 -1
- package/dist/core/validation/layers/DeliverableValidator.d.ts +13 -0
- package/dist/core/validation/layers/DeliverableValidator.d.ts.map +1 -0
- package/dist/core/validation/layers/DeliverableValidator.js +276 -0
- package/dist/core/validation/layers/DeliverableValidator.js.map +1 -0
- package/dist/gates/contextual-recommender.d.ts.map +1 -1
- package/dist/gates/contextual-recommender.js +260 -1
- package/dist/gates/contextual-recommender.js.map +1 -1
- package/dist/gates/validator.d.ts +5 -6
- package/dist/gates/validator.d.ts.map +1 -1
- package/dist/gates/validator.js +9 -6
- package/dist/gates/validator.js.map +1 -1
- package/dist/middleware/adr-generation.middleware.d.ts +5 -0
- package/dist/middleware/adr-generation.middleware.d.ts.map +1 -0
- package/dist/middleware/adr-generation.middleware.js +214 -0
- package/dist/middleware/adr-generation.middleware.js.map +1 -0
- package/dist/middleware/flow-engine.middleware.d.ts +5 -3
- package/dist/middleware/flow-engine.middleware.d.ts.map +1 -1
- package/dist/middleware/flow-engine.middleware.js +18 -10
- package/dist/middleware/flow-engine.middleware.js.map +1 -1
- package/dist/middleware/index.d.ts +18 -11
- package/dist/middleware/index.d.ts.map +1 -1
- package/dist/middleware/index.js +24 -11
- package/dist/middleware/index.js.map +1 -1
- package/dist/middleware/orchestration-pipeline.middleware.d.ts +42 -0
- package/dist/middleware/orchestration-pipeline.middleware.d.ts.map +1 -0
- package/dist/middleware/orchestration-pipeline.middleware.js +57 -0
- package/dist/middleware/orchestration-pipeline.middleware.js.map +1 -0
- package/dist/middleware/skill-injection.middleware.js +1 -1
- package/dist/middleware/skill-injection.middleware.js.map +1 -1
- package/dist/middleware/validation.middleware.d.ts +11 -0
- package/dist/middleware/validation.middleware.d.ts.map +1 -1
- package/dist/middleware/validation.middleware.js +54 -0
- package/dist/middleware/validation.middleware.js.map +1 -1
- package/dist/router.d.ts.map +1 -1
- package/dist/router.js +20 -14
- package/dist/router.js.map +1 -1
- package/dist/services/flow-engine.d.ts +1 -0
- package/dist/services/flow-engine.d.ts.map +1 -1
- package/dist/services/flow-engine.js +14 -2
- package/dist/services/flow-engine.js.map +1 -1
- package/dist/services/watcher.service.d.ts +45 -0
- package/dist/services/watcher.service.d.ts.map +1 -0
- package/dist/services/watcher.service.js +106 -0
- package/dist/services/watcher.service.js.map +1 -0
- package/dist/state/context.d.ts +15 -4
- package/dist/state/context.d.ts.map +1 -1
- package/dist/state/context.js +36 -9
- package/dist/state/context.js.map +1 -1
- package/dist/state/storage.d.ts.map +1 -1
- package/dist/state/storage.js +6 -0
- package/dist/state/storage.js.map +1 -1
- package/dist/tests/aprovar-gate.test.d.ts +2 -0
- package/dist/tests/aprovar-gate.test.d.ts.map +1 -0
- package/dist/tests/aprovar-gate.test.js +113 -0
- package/dist/tests/aprovar-gate.test.js.map +1 -0
- package/dist/tests/deliverable-validator.test.d.ts +12 -0
- package/dist/tests/deliverable-validator.test.d.ts.map +1 -0
- package/dist/tests/deliverable-validator.test.js +214 -0
- package/dist/tests/deliverable-validator.test.js.map +1 -0
- package/dist/tests/flow-engine.test.d.ts +2 -0
- package/dist/tests/flow-engine.test.d.ts.map +1 -0
- package/dist/tests/flow-engine.test.js +85 -0
- package/dist/tests/flow-engine.test.js.map +1 -0
- package/dist/tests/gate-orientation.test.d.ts +2 -0
- package/dist/tests/gate-orientation.test.d.ts.map +1 -0
- package/dist/tests/gate-orientation.test.js +59 -0
- package/dist/tests/gate-orientation.test.js.map +1 -0
- package/dist/tests/middleware.test.js +30 -4
- package/dist/tests/middleware.test.js.map +1 -1
- package/dist/tests/watcher.service.test.d.ts +2 -0
- package/dist/tests/watcher.service.test.d.ts.map +1 -0
- package/dist/tests/watcher.service.test.js +119 -0
- package/dist/tests/watcher.service.test.js.map +1 -0
- package/dist/tools/aprovar-gate.d.ts.map +1 -1
- package/dist/tools/aprovar-gate.js +4 -0
- package/dist/tools/aprovar-gate.js.map +1 -1
- package/dist/tools/contexto.d.ts.map +1 -1
- package/dist/tools/contexto.js +41 -0
- package/dist/tools/contexto.js.map +1 -1
- package/dist/tools/proximo.d.ts.map +1 -1
- package/dist/tools/proximo.js +224 -54
- package/dist/tools/proximo.js.map +1 -1
- package/dist/tools/status.d.ts.map +1 -1
- package/dist/tools/status.js +27 -0
- package/dist/tools/status.js.map +1 -1
- package/dist/tools/validar-gate.d.ts +8 -1
- package/dist/tools/validar-gate.d.ts.map +1 -1
- package/dist/tools/validar-gate.js +147 -99
- package/dist/tools/validar-gate.js.map +1 -1
- package/dist/types/config.d.ts +2 -0
- package/dist/types/config.d.ts.map +1 -1
- package/dist/types/config.js +2 -0
- package/dist/types/config.js.map +1 -1
- package/dist/types/index.d.ts +6 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js.map +1 -1
- package/dist/utils/gate-orientation.d.ts +11 -0
- package/dist/utils/gate-orientation.d.ts.map +1 -0
- package/dist/utils/gate-orientation.js +64 -0
- package/dist/utils/gate-orientation.js.map +1 -0
- package/dist/utils/ide-paths.d.ts +11 -0
- package/dist/utils/ide-paths.d.ts.map +1 -1
- package/dist/utils/ide-paths.js +27 -0
- package/dist/utils/ide-paths.js.map +1 -1
- package/dist/utils/instructions.d.ts +6 -1
- package/dist/utils/instructions.d.ts.map +1 -1
- package/dist/utils/instructions.js +32 -1
- package/dist/utils/instructions.js.map +1 -1
- package/package.json +2 -1
- package/dist/gates/compatibility-wrapper.d.ts +0 -139
- package/dist/gates/compatibility-wrapper.d.ts.map +0 -1
- package/dist/gates/compatibility-wrapper.js +0 -362
- package/dist/gates/compatibility-wrapper.js.map +0 -1
- package/dist/gates/unified-validator.d.ts +0 -67
- package/dist/gates/unified-validator.d.ts.map +0 -1
- package/dist/gates/unified-validator.js +0 -234
- package/dist/gates/unified-validator.js.map +0 -1
|
@@ -0,0 +1,214 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deliverable-validator.test.js","sourceRoot":"","sources":["../../src/tests/deliverable-validator.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flow-engine.test.d.ts","sourceRoot":"","sources":["../../src/tests/flow-engine.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,85 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flow-engine.test.js","sourceRoot":"","sources":["../../src/tests/flow-engine.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gate-orientation.test.d.ts","sourceRoot":"","sources":["../../src/tests/gate-orientation.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,59 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gate-orientation.test.js","sourceRoot":"","sources":["../../src/tests/gate-orientation.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,7 +6,7 @@ import { withStateLoad } from '../middleware/state-loader.middleware.js';
|
|
|
6
6
|
import { withPersistence } from '../middleware/persistence.middleware.js';
|
|
7
7
|
import { withFlowEngine } from '../middleware/flow-engine.middleware.js';
|
|
8
8
|
import { withSkillInjection } from '../middleware/skill-injection.middleware.js';
|
|
9
|
-
import { applyMiddlewares, applyLightMiddlewares } from '../middleware/index.js';
|
|
9
|
+
import { applyMiddlewares, applyLightMiddlewares, applyOrchestrationPipeline } from '../middleware/index.js';
|
|
10
10
|
// Mock state service
|
|
11
11
|
vi.mock('../services/state.service.js', () => ({
|
|
12
12
|
createStateService: vi.fn((dir) => ({
|
|
@@ -162,16 +162,20 @@ describe('Middleware: withFlowEngine', () => {
|
|
|
162
162
|
expect(result.next_action?.tool).toBe('proximo');
|
|
163
163
|
expect(result.progress).toBeDefined();
|
|
164
164
|
});
|
|
165
|
-
|
|
165
|
+
// v6.0: FlowEngine SEMPRE sobrescreve next_action (comportamento forçado)
|
|
166
|
+
it('deve SEMPRE sobrescrever next_action, mesmo quando já presente (v6.0)', async () => {
|
|
166
167
|
const existingAction = { tool: 'validar_gate', description: 'Validar', args_template: {}, requires_user_input: false };
|
|
167
168
|
const handler = vi.fn().mockResolvedValue({
|
|
168
169
|
content: [{ type: 'text', text: 'ok' }],
|
|
169
|
-
estado_atualizado: JSON.stringify({ nome: 'Test' }),
|
|
170
|
+
estado_atualizado: JSON.stringify({ nome: 'Test', nivel: 'medio', fase_atual: 2, total_fases: 8 }),
|
|
170
171
|
next_action: existingAction,
|
|
171
172
|
});
|
|
172
173
|
const wrapped = withFlowEngine(handler);
|
|
173
174
|
const result = await wrapped({ diretorio: '/test/project' });
|
|
174
|
-
|
|
175
|
+
// v6.0: FlowEngine FORÇA sobrescrita — next_action deve ser do FlowEngine, não da tool
|
|
176
|
+
expect(result.next_action?.tool).toBe('proximo'); // FlowEngine define 'proximo'
|
|
177
|
+
// O next_action original ('validar_gate') deve ter sido sobrescrito
|
|
178
|
+
expect(result.next_action?.tool).not.toBe('validar_gate');
|
|
175
179
|
});
|
|
176
180
|
it('não deve calcular next_action quando isError', async () => {
|
|
177
181
|
const handler = vi.fn().mockResolvedValue({
|
|
@@ -225,4 +229,26 @@ describe('Pipeline: applyLightMiddlewares', () => {
|
|
|
225
229
|
expect(result.content[0].text).toBe('Light OK');
|
|
226
230
|
});
|
|
227
231
|
});
|
|
232
|
+
describe('Pipeline: applyOrchestrationPipeline (v6.0)', () => {
|
|
233
|
+
it('deve compor todos os middlewares na ordem correta', async () => {
|
|
234
|
+
const handler = vi.fn().mockResolvedValue({
|
|
235
|
+
content: [{ type: 'text', text: 'Orchestration OK' }],
|
|
236
|
+
});
|
|
237
|
+
const wrapped = applyOrchestrationPipeline('test-tool', handler);
|
|
238
|
+
expect(typeof wrapped).toBe('function');
|
|
239
|
+
const result = await wrapped({ diretorio: '/test/project' });
|
|
240
|
+
expect(result.content[0].text).toContain('Orchestration OK');
|
|
241
|
+
});
|
|
242
|
+
it('deve calcular next_action via FlowEngine', async () => {
|
|
243
|
+
const handler = vi.fn().mockResolvedValue({
|
|
244
|
+
content: [{ type: 'text', text: 'ok' }],
|
|
245
|
+
estado_atualizado: JSON.stringify({ nome: 'Test', nivel: 'medio', fase_atual: 2, total_fases: 8 }),
|
|
246
|
+
});
|
|
247
|
+
const wrapped = applyOrchestrationPipeline('test-tool', handler);
|
|
248
|
+
const result = await wrapped({ diretorio: '/test/project' });
|
|
249
|
+
// FlowEngine deve ter calculado next_action
|
|
250
|
+
expect(result.next_action).toBeDefined();
|
|
251
|
+
expect(result.next_action?.tool).toBe('proximo');
|
|
252
|
+
});
|
|
253
|
+
});
|
|
228
254
|
//# sourceMappingURL=middleware.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"middleware.test.js","sourceRoot":"","sources":["../../src/tests/middleware.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"middleware.test.js","sourceRoot":"","sources":["../../src/tests/middleware.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"watcher.service.test.d.ts","sourceRoot":"","sources":["../../src/tests/watcher.service.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import { vi, describe, it, expect, beforeEach, afterEach } from 'vitest';
|
|
2
|
+
import { startFileWatcher, stopFileWatcher, getActiveWatcherCount } from '../services/watcher.service.js';
|
|
3
|
+
// Mock chokidar
|
|
4
|
+
vi.mock('chokidar', () => {
|
|
5
|
+
const watchers = new Map();
|
|
6
|
+
return {
|
|
7
|
+
default: {
|
|
8
|
+
watch: vi.fn((filePath) => {
|
|
9
|
+
const watcher = {
|
|
10
|
+
on: vi.fn((event, cb) => {
|
|
11
|
+
if (!watchers.has(filePath))
|
|
12
|
+
watchers.set(filePath, {});
|
|
13
|
+
watchers.get(filePath)[event] = cb;
|
|
14
|
+
return watcher;
|
|
15
|
+
}),
|
|
16
|
+
close: vi.fn(),
|
|
17
|
+
// Helper para simular eventos nos testes
|
|
18
|
+
__emit: (event, ...args) => {
|
|
19
|
+
if (watchers.get(filePath)?.[event]) {
|
|
20
|
+
watchers.get(filePath)[event](...args);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
// Salvar o watcher instanciado para acesso no teste
|
|
25
|
+
watchers.set(filePath + '_instance', watcher);
|
|
26
|
+
return watcher;
|
|
27
|
+
}),
|
|
28
|
+
__getWatchers: () => watchers
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
});
|
|
32
|
+
// Mock fs/promises
|
|
33
|
+
vi.mock('fs/promises', () => ({
|
|
34
|
+
readFile: vi.fn().mockResolvedValue('# Produto\n\nMocked PRD content for testing.')
|
|
35
|
+
}));
|
|
36
|
+
// Mock ValidationPipeline
|
|
37
|
+
vi.mock('../core/validation/ValidationPipeline.js', () => {
|
|
38
|
+
return {
|
|
39
|
+
ValidationPipeline: class {
|
|
40
|
+
async validateDeliverable() {
|
|
41
|
+
return {
|
|
42
|
+
overallScore: 85,
|
|
43
|
+
recommendations: ['Sugestão mockada']
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
});
|
|
49
|
+
describe('WatcherService', () => {
|
|
50
|
+
beforeEach(() => {
|
|
51
|
+
vi.useFakeTimers();
|
|
52
|
+
// Limpar watchers residuais
|
|
53
|
+
stopFileWatcher('/test/dir');
|
|
54
|
+
});
|
|
55
|
+
afterEach(() => {
|
|
56
|
+
vi.useRealTimers();
|
|
57
|
+
vi.clearAllMocks();
|
|
58
|
+
});
|
|
59
|
+
it('deve registrar um novo watcher e gerenciar contagem', async () => {
|
|
60
|
+
const onValidationResult = vi.fn();
|
|
61
|
+
await startFileWatcher({
|
|
62
|
+
filePath: '/test/dir/PRD.md',
|
|
63
|
+
diretorio: '/test/dir',
|
|
64
|
+
faseNome: 'Produto',
|
|
65
|
+
onValidationResult
|
|
66
|
+
});
|
|
67
|
+
expect(getActiveWatcherCount()).toBe(1);
|
|
68
|
+
stopFileWatcher('/test/dir');
|
|
69
|
+
expect(getActiveWatcherCount()).toBe(0);
|
|
70
|
+
});
|
|
71
|
+
it('deve disparar a validação quando o arquivo mudar respeitando debounce', async () => {
|
|
72
|
+
let resolveValidation;
|
|
73
|
+
const validationPromise = new Promise(r => resolveValidation = r);
|
|
74
|
+
const onValidationResult = vi.fn().mockImplementation(() => {
|
|
75
|
+
resolveValidation();
|
|
76
|
+
});
|
|
77
|
+
await startFileWatcher({
|
|
78
|
+
filePath: '/test/dir/PRD.md',
|
|
79
|
+
diretorio: '/test/dir',
|
|
80
|
+
faseNome: 'Produto',
|
|
81
|
+
onValidationResult
|
|
82
|
+
});
|
|
83
|
+
const chokidar = await import('chokidar');
|
|
84
|
+
const watchersMap = chokidar.default.__getWatchers();
|
|
85
|
+
const watcherInstance = watchersMap.get('/test/dir/PRD.md_instance');
|
|
86
|
+
// Simular 3 eventos de change muito rápidos
|
|
87
|
+
watcherInstance.__emit('change');
|
|
88
|
+
watcherInstance.__emit('change');
|
|
89
|
+
watcherInstance.__emit('change');
|
|
90
|
+
// Avançar o tempo apenas 200ms (antes do debounce de 500ms)
|
|
91
|
+
await vi.advanceTimersByTimeAsync(200);
|
|
92
|
+
expect(onValidationResult).not.toHaveBeenCalled();
|
|
93
|
+
// Avançar o tempo além dos 500ms
|
|
94
|
+
await vi.advanceTimersByTimeAsync(350);
|
|
95
|
+
// Aguarda toda a cadeia async (resolve readFile, etc)
|
|
96
|
+
await validationPromise;
|
|
97
|
+
// Deve ter chamado a validação apenas 1 vez debido ao debounce
|
|
98
|
+
expect(onValidationResult).toHaveBeenCalledTimes(1);
|
|
99
|
+
expect(onValidationResult).toHaveBeenCalledWith(85, 'Score: 85/100\nSugestão mockada', '/test/dir/PRD.md');
|
|
100
|
+
});
|
|
101
|
+
it('não deve acumular múltiplos watchers para o mesmo diretório', async () => {
|
|
102
|
+
const onValidationResult = vi.fn();
|
|
103
|
+
await startFileWatcher({
|
|
104
|
+
filePath: '/test/dir/PRD.md',
|
|
105
|
+
diretorio: '/test/dir',
|
|
106
|
+
faseNome: 'Produto',
|
|
107
|
+
onValidationResult
|
|
108
|
+
});
|
|
109
|
+
// Chamar novamente para o mesmo diretório
|
|
110
|
+
await startFileWatcher({
|
|
111
|
+
filePath: '/test/dir/PRD.md',
|
|
112
|
+
diretorio: '/test/dir',
|
|
113
|
+
faseNome: 'Produto',
|
|
114
|
+
onValidationResult
|
|
115
|
+
});
|
|
116
|
+
expect(getActiveWatcherCount()).toBe(1);
|
|
117
|
+
});
|
|
118
|
+
});
|
|
119
|
+
//# sourceMappingURL=watcher.service.test.js.map
|