@maestro-ai/mcp-server 2.4.2 → 2.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/flows/onboarding-orchestrator.d.ts +41 -0
- package/dist/flows/onboarding-orchestrator.d.ts.map +1 -0
- package/dist/flows/onboarding-orchestrator.js +399 -0
- package/dist/flows/onboarding-orchestrator.js.map +1 -0
- package/dist/flows/types.d.ts.map +1 -1
- package/dist/flows/types.js +7 -0
- package/dist/flows/types.js.map +1 -1
- package/dist/gates/adaptive-scoring.d.ts +133 -0
- package/dist/gates/adaptive-scoring.d.ts.map +1 -0
- package/dist/gates/adaptive-scoring.js +404 -0
- package/dist/gates/adaptive-scoring.js.map +1 -0
- package/dist/gates/compatibility-wrapper.d.ts +139 -0
- package/dist/gates/compatibility-wrapper.d.ts.map +1 -0
- package/dist/gates/compatibility-wrapper.js +362 -0
- package/dist/gates/compatibility-wrapper.js.map +1 -0
- package/dist/gates/contextual-recommender.d.ts +128 -0
- package/dist/gates/contextual-recommender.d.ts.map +1 -0
- package/dist/gates/contextual-recommender.js +446 -0
- package/dist/gates/contextual-recommender.js.map +1 -0
- package/dist/gates/intelligent-gate-engine.d.ts +158 -0
- package/dist/gates/intelligent-gate-engine.d.ts.map +1 -0
- package/dist/gates/intelligent-gate-engine.js +429 -0
- package/dist/gates/intelligent-gate-engine.js.map +1 -0
- package/dist/gates/intelligent-validator.d.ts +164 -0
- package/dist/gates/intelligent-validator.d.ts.map +1 -0
- package/dist/gates/intelligent-validator.js +347 -0
- package/dist/gates/intelligent-validator.js.map +1 -0
- package/dist/gates/maturity-levels.d.ts +119 -0
- package/dist/gates/maturity-levels.d.ts.map +1 -0
- package/dist/gates/maturity-levels.js +455 -0
- package/dist/gates/maturity-levels.js.map +1 -0
- package/dist/state/storage.d.ts.map +1 -1
- package/dist/state/storage.js +1 -0
- package/dist/state/storage.js.map +1 -1
- package/dist/tests/brainstorm-prd.test.d.ts +5 -0
- package/dist/tests/brainstorm-prd.test.d.ts.map +1 -0
- package/dist/tests/brainstorm-prd.test.js +291 -0
- package/dist/tests/brainstorm-prd.test.js.map +1 -0
- package/dist/tests/migracao-skills.test.d.ts +2 -0
- package/dist/tests/migracao-skills.test.d.ts.map +1 -0
- package/dist/tests/migracao-skills.test.js +208 -0
- package/dist/tests/migracao-skills.test.js.map +1 -0
- package/dist/tests/onboarding-flow.test.d.ts +5 -0
- package/dist/tests/onboarding-flow.test.d.ts.map +1 -0
- package/dist/tests/onboarding-flow.test.js +231 -0
- package/dist/tests/onboarding-flow.test.js.map +1 -0
- package/dist/tests/readiness-dashboard.test.d.ts +5 -0
- package/dist/tests/readiness-dashboard.test.d.ts.map +1 -0
- package/dist/tests/readiness-dashboard.test.js +252 -0
- package/dist/tests/readiness-dashboard.test.js.map +1 -0
- package/dist/tools/brainstorm.d.ts +41 -0
- package/dist/tools/brainstorm.d.ts.map +1 -0
- package/dist/tools/brainstorm.js +429 -0
- package/dist/tools/brainstorm.js.map +1 -0
- package/dist/tools/carregar-projeto.js +1 -1
- package/dist/tools/carregar-projeto.js.map +1 -1
- package/dist/tools/confirmar-stitch.js +1 -1
- package/dist/tools/confirmar-stitch.js.map +1 -1
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +65 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/iniciar-projeto.d.ts +2 -2
- package/dist/tools/iniciar-projeto.d.ts.map +1 -1
- package/dist/tools/iniciar-projeto.js +53 -96
- package/dist/tools/iniciar-projeto.js.map +1 -1
- package/dist/tools/next-steps-dashboard.d.ts +30 -0
- package/dist/tools/next-steps-dashboard.d.ts.map +1 -0
- package/dist/tools/next-steps-dashboard.js +248 -0
- package/dist/tools/next-steps-dashboard.js.map +1 -0
- package/dist/tools/prd-writer.d.ts +36 -0
- package/dist/tools/prd-writer.d.ts.map +1 -0
- package/dist/tools/prd-writer.js +377 -0
- package/dist/tools/prd-writer.js.map +1 -0
- package/dist/tools/proximo.d.ts.map +1 -1
- package/dist/tools/proximo.js +147 -22
- package/dist/tools/proximo.js.map +1 -1
- package/dist/tools/setup-inicial.d.ts +48 -0
- package/dist/tools/setup-inicial.d.ts.map +1 -0
- package/dist/tools/setup-inicial.js +84 -0
- package/dist/tools/setup-inicial.js.map +1 -0
- package/dist/tools/validar-gate.d.ts.map +1 -1
- package/dist/tools/validar-gate.js +28 -28
- package/dist/tools/validar-gate.js.map +1 -1
- package/dist/types/index.d.ts +24 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js.map +1 -1
- package/dist/types/onboarding.d.ts +124 -0
- package/dist/types/onboarding.d.ts.map +1 -0
- package/dist/types/onboarding.js +5 -0
- package/dist/types/onboarding.js.map +1 -0
- package/dist/utils/config.d.ts +16 -0
- package/dist/utils/config.d.ts.map +1 -0
- package/dist/utils/config.js +26 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/content-injector.d.ts +1 -0
- package/dist/utils/content-injector.d.ts.map +1 -1
- package/dist/utils/content-injector.js +5 -0
- package/dist/utils/content-injector.js.map +1 -1
- package/dist/utils/discovery-adapter.d.ts +33 -0
- package/dist/utils/discovery-adapter.d.ts.map +1 -0
- package/dist/utils/discovery-adapter.js +392 -0
- package/dist/utils/discovery-adapter.js.map +1 -0
- package/dist/utils/files.d.ts +1 -0
- package/dist/utils/files.d.ts.map +1 -1
- package/dist/utils/files.js +97 -7
- package/dist/utils/files.js.map +1 -1
- package/dist/utils/ide-paths.d.ts.map +1 -1
- package/dist/utils/ide-paths.js +7 -8
- package/dist/utils/ide-paths.js.map +1 -1
- package/dist/utils/inferencia-contextual.d.ts +3 -0
- package/dist/utils/inferencia-contextual.d.ts.map +1 -0
- package/dist/utils/inferencia-contextual.js +93 -0
- package/dist/utils/inferencia-contextual.js.map +1 -0
- package/dist/utils/instructions.d.ts +8 -3
- package/dist/utils/instructions.d.ts.map +1 -1
- package/dist/utils/instructions.js +72 -25
- package/dist/utils/instructions.js.map +1 -1
- package/dist/utils/readiness-checker.d.ts +27 -0
- package/dist/utils/readiness-checker.d.ts.map +1 -0
- package/dist/utils/readiness-checker.js +226 -0
- package/dist/utils/readiness-checker.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,377 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tool: PRD Writer
|
|
3
|
+
* Consolida brainstorm e discovery em um PRD estruturado e validado
|
|
4
|
+
*/
|
|
5
|
+
import { parsearEstado, serializarEstado } from "../state/storage.js";
|
|
6
|
+
import { setCurrentDirectory } from "../state/context.js";
|
|
7
|
+
import { resolveProjectPath } from "../utils/files.js";
|
|
8
|
+
import { calcularQualidade } from "../gates/quality-scorer.js";
|
|
9
|
+
/**
|
|
10
|
+
* Gera PRD estruturado a partir do brainstorm e discovery
|
|
11
|
+
*/
|
|
12
|
+
function gerarPRDConteudo(onboarding, nomeProjetoDiretorio) {
|
|
13
|
+
const linhas = [];
|
|
14
|
+
// Cabeçalho
|
|
15
|
+
linhas.push(`# PRD - ${onboarding.discoveryResponses.nome_projeto || 'Projeto'}`);
|
|
16
|
+
linhas.push(`\n**Data:** ${new Date().toLocaleDateString('pt-BR')}`);
|
|
17
|
+
linhas.push(`**Versão:** 1.0 (Draft)`);
|
|
18
|
+
linhas.push(`**Status:** Em Validação\n`);
|
|
19
|
+
// Sumário Executivo
|
|
20
|
+
linhas.push('---\n');
|
|
21
|
+
linhas.push('## 1. Sumário Executivo\n');
|
|
22
|
+
const problemaSecao = onboarding.brainstormSections.find((s) => s.id === 'problema-oportunidade');
|
|
23
|
+
if (problemaSecao?.response) {
|
|
24
|
+
linhas.push('### Problema e Oportunidade\n');
|
|
25
|
+
linhas.push(problemaSecao.response);
|
|
26
|
+
linhas.push('\n');
|
|
27
|
+
}
|
|
28
|
+
// Personas
|
|
29
|
+
linhas.push('---\n');
|
|
30
|
+
linhas.push('## 2. Personas e Jobs to Be Done\n');
|
|
31
|
+
const personasSecao = onboarding.brainstormSections.find((s) => s.id === 'personas-jtbd');
|
|
32
|
+
if (personasSecao?.response) {
|
|
33
|
+
linhas.push(personasSecao.response);
|
|
34
|
+
linhas.push('\n');
|
|
35
|
+
}
|
|
36
|
+
// MVP e Funcionalidades
|
|
37
|
+
linhas.push('---\n');
|
|
38
|
+
linhas.push('## 3. MVP e Funcionalidades Priorizadas\n');
|
|
39
|
+
const mvpSecao = onboarding.brainstormSections.find((s) => s.id === 'mvp-funcionalidades');
|
|
40
|
+
if (mvpSecao?.response) {
|
|
41
|
+
linhas.push(mvpSecao.response);
|
|
42
|
+
linhas.push('\n');
|
|
43
|
+
}
|
|
44
|
+
// Métricas
|
|
45
|
+
linhas.push('---\n');
|
|
46
|
+
linhas.push('## 4. Métricas de Sucesso\n');
|
|
47
|
+
const metricasSecao = onboarding.brainstormSections.find((s) => s.id === 'metricas-sucesso');
|
|
48
|
+
if (metricasSecao?.response) {
|
|
49
|
+
linhas.push(metricasSecao.response);
|
|
50
|
+
linhas.push('\n');
|
|
51
|
+
}
|
|
52
|
+
// Riscos
|
|
53
|
+
linhas.push('---\n');
|
|
54
|
+
linhas.push('## 5. Riscos e Planos de Mitigação\n');
|
|
55
|
+
const riscosSecao = onboarding.brainstormSections.find((s) => s.id === 'riscos-mitigacoes');
|
|
56
|
+
if (riscosSecao?.response) {
|
|
57
|
+
linhas.push(riscosSecao.response);
|
|
58
|
+
linhas.push('\n');
|
|
59
|
+
}
|
|
60
|
+
// Contexto Técnico
|
|
61
|
+
linhas.push('---\n');
|
|
62
|
+
linhas.push('## 6. Contexto Técnico\n');
|
|
63
|
+
linhas.push('### Stack Preferida\n');
|
|
64
|
+
linhas.push(`${onboarding.discoveryResponses.stack_preferida || 'A sugerir baseado em requisitos'}\n`);
|
|
65
|
+
linhas.push('### Plataformas\n');
|
|
66
|
+
const plataformas = Array.isArray(onboarding.discoveryResponses.plataformas)
|
|
67
|
+
? onboarding.discoveryResponses.plataformas.join(', ')
|
|
68
|
+
: onboarding.discoveryResponses.plataformas || 'A definir';
|
|
69
|
+
linhas.push(`${plataformas}\n`);
|
|
70
|
+
if (onboarding.discoveryResponses.integracoes_externas) {
|
|
71
|
+
linhas.push('### Integrações Externas\n');
|
|
72
|
+
linhas.push(`${onboarding.discoveryResponses.integracoes_externas}\n`);
|
|
73
|
+
}
|
|
74
|
+
// Timeline
|
|
75
|
+
linhas.push('---\n');
|
|
76
|
+
linhas.push('## 7. Timeline e Recursos\n');
|
|
77
|
+
linhas.push(`### Cronograma Desejado\n`);
|
|
78
|
+
linhas.push(`${onboarding.discoveryResponses.cronograma || 'A definir'}\n`);
|
|
79
|
+
if (onboarding.discoveryResponses.tamanho_time) {
|
|
80
|
+
linhas.push(`### Tamanho do Time\n`);
|
|
81
|
+
linhas.push(`${onboarding.discoveryResponses.tamanho_time}\n`);
|
|
82
|
+
}
|
|
83
|
+
if (onboarding.discoveryResponses.experiencia_time) {
|
|
84
|
+
linhas.push(`### Experiência do Time\n`);
|
|
85
|
+
linhas.push(`${onboarding.discoveryResponses.experiencia_time}\n`);
|
|
86
|
+
}
|
|
87
|
+
// Requisitos Críticos
|
|
88
|
+
linhas.push('---\n');
|
|
89
|
+
linhas.push('## 8. Requisitos Críticos\n');
|
|
90
|
+
if (onboarding.discoveryResponses.performance_esperada) {
|
|
91
|
+
linhas.push(`### Performance\n`);
|
|
92
|
+
linhas.push(`${onboarding.discoveryResponses.performance_esperada}\n`);
|
|
93
|
+
}
|
|
94
|
+
if (onboarding.discoveryResponses.seguranca_compliance && onboarding.discoveryResponses.seguranca_compliance.length > 0) {
|
|
95
|
+
linhas.push(`### Compliance\n`);
|
|
96
|
+
const compliance = Array.isArray(onboarding.discoveryResponses.seguranca_compliance)
|
|
97
|
+
? onboarding.discoveryResponses.seguranca_compliance.join(', ')
|
|
98
|
+
: onboarding.discoveryResponses.seguranca_compliance;
|
|
99
|
+
linhas.push(`${compliance}\n`);
|
|
100
|
+
}
|
|
101
|
+
if (onboarding.discoveryResponses.escalabilidade) {
|
|
102
|
+
linhas.push(`### Escalabilidade\n`);
|
|
103
|
+
linhas.push(`${onboarding.discoveryResponses.escalabilidade}\n`);
|
|
104
|
+
}
|
|
105
|
+
// Metadata
|
|
106
|
+
linhas.push('---\n');
|
|
107
|
+
linhas.push('## Metadata\n');
|
|
108
|
+
linhas.push(`- **Modo:** ${onboarding.mode.toUpperCase()}`);
|
|
109
|
+
linhas.push(`- **Criado em:** ${new Date().toISOString()}`);
|
|
110
|
+
linhas.push(`- **Total de interações:** ${onboarding.totalInteractions}`);
|
|
111
|
+
return linhas.join('\n');
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Tool: prd_writer
|
|
115
|
+
* Gera, valida e consolida PRD
|
|
116
|
+
*/
|
|
117
|
+
export async function prdWriter(args) {
|
|
118
|
+
if (!args.estado_json) {
|
|
119
|
+
return {
|
|
120
|
+
content: [{
|
|
121
|
+
type: "text",
|
|
122
|
+
text: "❌ **Erro**: Parâmetro `estado_json` é obrigatório.",
|
|
123
|
+
}],
|
|
124
|
+
isError: true,
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
if (!args.diretorio) {
|
|
128
|
+
return {
|
|
129
|
+
content: [{
|
|
130
|
+
type: "text",
|
|
131
|
+
text: "❌ **Erro**: Parâmetro `diretorio` é obrigatório.",
|
|
132
|
+
}],
|
|
133
|
+
isError: true,
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
const estado = parsearEstado(args.estado_json);
|
|
137
|
+
if (!estado) {
|
|
138
|
+
return {
|
|
139
|
+
content: [{
|
|
140
|
+
type: "text",
|
|
141
|
+
text: "❌ **Erro**: Não foi possível parsear o estado JSON.",
|
|
142
|
+
}],
|
|
143
|
+
isError: true,
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
const diretorio = resolveProjectPath(args.diretorio);
|
|
147
|
+
setCurrentDirectory(diretorio);
|
|
148
|
+
const acao = args.acao || 'gerar';
|
|
149
|
+
// Obter estado de onboarding
|
|
150
|
+
const onboarding = estado.onboarding;
|
|
151
|
+
if (!onboarding) {
|
|
152
|
+
return {
|
|
153
|
+
content: [{
|
|
154
|
+
type: "text",
|
|
155
|
+
text: "❌ **Erro**: Nenhum estado de onboarding encontrado.",
|
|
156
|
+
}],
|
|
157
|
+
isError: true,
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
if (acao === 'gerar') {
|
|
161
|
+
return handleGerarPRD(onboarding, estado, diretorio);
|
|
162
|
+
}
|
|
163
|
+
else if (acao === 'validar') {
|
|
164
|
+
return handleValidarPRD(onboarding, estado, diretorio);
|
|
165
|
+
}
|
|
166
|
+
else if (acao === 'status') {
|
|
167
|
+
return handleStatusPRD(onboarding);
|
|
168
|
+
}
|
|
169
|
+
return {
|
|
170
|
+
content: [{
|
|
171
|
+
type: "text",
|
|
172
|
+
text: `❌ **Erro**: Ação desconhecida: ${acao}`,
|
|
173
|
+
}],
|
|
174
|
+
isError: true,
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Handler: gerar PRD
|
|
179
|
+
*/
|
|
180
|
+
function handleGerarPRD(onboarding, estado, diretorio) {
|
|
181
|
+
if (onboarding.brainstormStatus !== 'completed') {
|
|
182
|
+
return {
|
|
183
|
+
content: [{
|
|
184
|
+
type: "text",
|
|
185
|
+
text: "❌ **Erro**: Brainstorm não foi concluído. Complete o brainstorm antes de gerar o PRD.",
|
|
186
|
+
}],
|
|
187
|
+
isError: true,
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
// Gerar conteúdo do PRD
|
|
191
|
+
const prdConteudo = gerarPRDConteudo(onboarding, estado.nome);
|
|
192
|
+
// Atualizar estado
|
|
193
|
+
onboarding.prdStatus = 'draft';
|
|
194
|
+
onboarding.phase = 'prd_draft';
|
|
195
|
+
onboarding.totalInteractions++;
|
|
196
|
+
onboarding.lastInteractionAt = new Date().toISOString();
|
|
197
|
+
const estadoAtualizado = {
|
|
198
|
+
...estado,
|
|
199
|
+
onboarding,
|
|
200
|
+
atualizado_em: new Date().toISOString(),
|
|
201
|
+
};
|
|
202
|
+
const estadoFile = serializarEstado(estadoAtualizado);
|
|
203
|
+
const resposta = `# ✅ PRD Draft Gerado!
|
|
204
|
+
|
|
205
|
+
O PRD foi consolidado a partir do discovery e brainstorm.
|
|
206
|
+
|
|
207
|
+
---
|
|
208
|
+
|
|
209
|
+
## 📄 Conteúdo do PRD
|
|
210
|
+
|
|
211
|
+
\`\`\`markdown
|
|
212
|
+
${prdConteudo.substring(0, 500)}...
|
|
213
|
+
\`\`\`
|
|
214
|
+
|
|
215
|
+
---
|
|
216
|
+
|
|
217
|
+
## 🔍 Próximos Passos
|
|
218
|
+
|
|
219
|
+
1. **Revisar PRD:** Verifique se todos os detalhes estão corretos
|
|
220
|
+
2. **Validar Completude:** Use \`prd_writer(estado_json: "...", diretorio: "...", acao: "validar")\`
|
|
221
|
+
3. **Ajustar se necessário:** Refine seções que precisam de melhorias
|
|
222
|
+
4. **Avançar para Fase 1:** Quando validado, o PRD estará pronto para a próxima fase
|
|
223
|
+
|
|
224
|
+
---
|
|
225
|
+
|
|
226
|
+
## ⚡ AÇÃO OBRIGATÓRIA - Atualizar Estado
|
|
227
|
+
|
|
228
|
+
**Caminho:** \`${estadoFile.path}\`
|
|
229
|
+
|
|
230
|
+
\`\`\`json
|
|
231
|
+
${estadoFile.content}
|
|
232
|
+
\`\`\`
|
|
233
|
+
|
|
234
|
+
**Arquivo PRD:** \`docs/01-produto/PRD.md\`
|
|
235
|
+
|
|
236
|
+
\`\`\`markdown
|
|
237
|
+
${prdConteudo}
|
|
238
|
+
\`\`\`
|
|
239
|
+
`;
|
|
240
|
+
return {
|
|
241
|
+
content: [{ type: "text", text: resposta }],
|
|
242
|
+
files: [
|
|
243
|
+
{
|
|
244
|
+
path: `${diretorio}/${estadoFile.path}`,
|
|
245
|
+
content: estadoFile.content,
|
|
246
|
+
},
|
|
247
|
+
{
|
|
248
|
+
path: `${diretorio}/docs/01-produto/PRD.md`,
|
|
249
|
+
content: prdConteudo,
|
|
250
|
+
},
|
|
251
|
+
],
|
|
252
|
+
estado_atualizado: estadoFile.content,
|
|
253
|
+
};
|
|
254
|
+
}
|
|
255
|
+
/**
|
|
256
|
+
* Handler: validar PRD
|
|
257
|
+
*/
|
|
258
|
+
function handleValidarPRD(onboarding, estado, diretorio) {
|
|
259
|
+
if (onboarding.prdStatus !== 'draft') {
|
|
260
|
+
return {
|
|
261
|
+
content: [{
|
|
262
|
+
type: "text",
|
|
263
|
+
text: "❌ **Erro**: PRD não está em draft. Gere o PRD primeiro.",
|
|
264
|
+
}],
|
|
265
|
+
isError: true,
|
|
266
|
+
};
|
|
267
|
+
}
|
|
268
|
+
// Gerar conteúdo do PRD para validação
|
|
269
|
+
const prdConteudo = gerarPRDConteudo(onboarding, estado.nome);
|
|
270
|
+
// Validar completude
|
|
271
|
+
const checklist = {
|
|
272
|
+
'Sumário Executivo': prdConteudo.includes('Problema e Oportunidade'),
|
|
273
|
+
'Personas e JTBD': prdConteudo.includes('Personas e Jobs to Be Done'),
|
|
274
|
+
'MVP e Funcionalidades': prdConteudo.includes('MVP e Funcionalidades Priorizadas'),
|
|
275
|
+
'Métricas de Sucesso': prdConteudo.includes('Métricas de Sucesso'),
|
|
276
|
+
'Riscos e Mitigações': prdConteudo.includes('Riscos e Planos de Mitigação'),
|
|
277
|
+
'Contexto Técnico': prdConteudo.includes('Contexto Técnico'),
|
|
278
|
+
'Timeline e Recursos': prdConteudo.includes('Timeline e Recursos'),
|
|
279
|
+
'Requisitos Críticos': prdConteudo.includes('Requisitos Críticos'),
|
|
280
|
+
};
|
|
281
|
+
const itemsValidados = Object.values(checklist).filter((v) => v).length;
|
|
282
|
+
const totalItems = Object.keys(checklist).length;
|
|
283
|
+
const score = Math.round((itemsValidados / totalItems) * 100);
|
|
284
|
+
// Calcular qualidade
|
|
285
|
+
const qualidade = calcularQualidade(prdConteudo, {
|
|
286
|
+
camposObrigatorios: Object.keys(checklist),
|
|
287
|
+
secoes: Object.keys(checklist),
|
|
288
|
+
});
|
|
289
|
+
onboarding.prdScore = qualidade.overall;
|
|
290
|
+
onboarding.prdStatus = score >= 70 ? 'validated' : 'draft';
|
|
291
|
+
const linhas = [];
|
|
292
|
+
linhas.push('# 📊 Validação do PRD\n');
|
|
293
|
+
linhas.push(`**Score de Completude:** ${score}/100`);
|
|
294
|
+
linhas.push(`**Score de Qualidade:** ${qualidade.overall}/100\n`);
|
|
295
|
+
linhas.push('## Checklist de Completude\n');
|
|
296
|
+
Object.entries(checklist).forEach(([item, valido]) => {
|
|
297
|
+
const icon = valido ? '✅' : '❌';
|
|
298
|
+
linhas.push(`${icon} ${item}`);
|
|
299
|
+
});
|
|
300
|
+
linhas.push(`\n**Total:** ${itemsValidados}/${totalItems} itens validados\n`);
|
|
301
|
+
if (score >= 70) {
|
|
302
|
+
linhas.push('✅ **PRD VALIDADO!** Score ≥ 70\n');
|
|
303
|
+
linhas.push('Próximo passo: Avançar para Fase 1 (Produto)');
|
|
304
|
+
}
|
|
305
|
+
else {
|
|
306
|
+
linhas.push(`⚠️ **PRD INCOMPLETO** Score: ${score}/100\n`);
|
|
307
|
+
linhas.push('Recomendações:');
|
|
308
|
+
Object.entries(checklist).forEach(([item, valido]) => {
|
|
309
|
+
if (!valido) {
|
|
310
|
+
linhas.push(`- Adicionar: ${item}`);
|
|
311
|
+
}
|
|
312
|
+
});
|
|
313
|
+
}
|
|
314
|
+
return {
|
|
315
|
+
content: [{
|
|
316
|
+
type: "text",
|
|
317
|
+
text: linhas.join('\n'),
|
|
318
|
+
}],
|
|
319
|
+
};
|
|
320
|
+
}
|
|
321
|
+
/**
|
|
322
|
+
* Handler: status do PRD
|
|
323
|
+
*/
|
|
324
|
+
function handleStatusPRD(onboarding) {
|
|
325
|
+
const linhas = [];
|
|
326
|
+
linhas.push('# 📄 Status do PRD\n');
|
|
327
|
+
linhas.push(`**Status:** ${onboarding.prdStatus}`);
|
|
328
|
+
linhas.push(`**Score:** ${onboarding.prdScore}/100`);
|
|
329
|
+
linhas.push(`**Fase:** ${onboarding.phase}\n`);
|
|
330
|
+
if (onboarding.prdValidationReport) {
|
|
331
|
+
linhas.push('## Relatório de Validação\n');
|
|
332
|
+
linhas.push(`**Score:** ${onboarding.prdValidationReport.score}/100\n`);
|
|
333
|
+
linhas.push('### Checklist\n');
|
|
334
|
+
Object.entries(onboarding.prdValidationReport.checklist).forEach(([item, valido]) => {
|
|
335
|
+
const icon = valido ? '✅' : '❌';
|
|
336
|
+
linhas.push(`${icon} ${item}`);
|
|
337
|
+
});
|
|
338
|
+
if (onboarding.prdValidationReport.gaps.length > 0) {
|
|
339
|
+
linhas.push('\n### Lacunas\n');
|
|
340
|
+
onboarding.prdValidationReport.gaps.forEach((gap) => {
|
|
341
|
+
linhas.push(`- ${gap}`);
|
|
342
|
+
});
|
|
343
|
+
}
|
|
344
|
+
if (onboarding.prdValidationReport.suggestions.length > 0) {
|
|
345
|
+
linhas.push('\n### Sugestões\n');
|
|
346
|
+
onboarding.prdValidationReport.suggestions.forEach((sugestao) => {
|
|
347
|
+
linhas.push(`- ${sugestao}`);
|
|
348
|
+
});
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
return {
|
|
352
|
+
content: [{
|
|
353
|
+
type: "text",
|
|
354
|
+
text: linhas.join('\n'),
|
|
355
|
+
}],
|
|
356
|
+
};
|
|
357
|
+
}
|
|
358
|
+
export const prdWriterSchema = {
|
|
359
|
+
type: "object",
|
|
360
|
+
properties: {
|
|
361
|
+
estado_json: {
|
|
362
|
+
type: "string",
|
|
363
|
+
description: "Conteúdo do arquivo .maestro/estado.json",
|
|
364
|
+
},
|
|
365
|
+
diretorio: {
|
|
366
|
+
type: "string",
|
|
367
|
+
description: "Diretório absoluto do projeto",
|
|
368
|
+
},
|
|
369
|
+
acao: {
|
|
370
|
+
type: "string",
|
|
371
|
+
enum: ["gerar", "validar", "status"],
|
|
372
|
+
description: "Ação a executar",
|
|
373
|
+
},
|
|
374
|
+
},
|
|
375
|
+
required: ["estado_json", "diretorio"],
|
|
376
|
+
};
|
|
377
|
+
//# sourceMappingURL=prd-writer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prd-writer.js","sourceRoot":"","sources":["../../src/tools/prd-writer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACtE,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAQ/D;;GAEG;AACH,SAAS,gBAAgB,CAAC,UAA2B,EAAE,oBAA4B;IACjF,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,YAAY;IACZ,MAAM,CAAC,IAAI,CAAC,WAAW,UAAU,CAAC,kBAAkB,CAAC,YAAY,IAAI,SAAS,EAAE,CAAC,CAAC;IAClF,MAAM,CAAC,IAAI,CAAC,eAAe,IAAI,IAAI,EAAE,CAAC,kBAAkB,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACrE,MAAM,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;IACvC,MAAM,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;IAE1C,oBAAoB;IACpB,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACrB,MAAM,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;IAEzC,MAAM,aAAa,GAAG,UAAU,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,uBAAuB,CAAC,CAAC;IAClG,IAAI,aAAa,EAAE,QAAQ,EAAE,CAAC;QAC5B,MAAM,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;QAC7C,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QACpC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpB,CAAC;IAED,WAAW;IACX,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACrB,MAAM,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;IAElD,MAAM,aAAa,GAAG,UAAU,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,eAAe,CAAC,CAAC;IAC1F,IAAI,aAAa,EAAE,QAAQ,EAAE,CAAC;QAC5B,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QACpC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpB,CAAC;IAED,wBAAwB;IACxB,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACrB,MAAM,CAAC,IAAI,CAAC,2CAA2C,CAAC,CAAC;IAEzD,MAAM,QAAQ,GAAG,UAAU,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,qBAAqB,CAAC,CAAC;IAC3F,IAAI,QAAQ,EAAE,QAAQ,EAAE,CAAC;QACvB,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAC/B,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpB,CAAC;IAED,WAAW;IACX,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACrB,MAAM,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;IAE3C,MAAM,aAAa,GAAG,UAAU,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,kBAAkB,CAAC,CAAC;IAC7F,IAAI,aAAa,EAAE,QAAQ,EAAE,CAAC;QAC5B,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QACpC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpB,CAAC;IAED,SAAS;IACT,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACrB,MAAM,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC;IAEpD,MAAM,WAAW,GAAG,UAAU,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,mBAAmB,CAAC,CAAC;IAC5F,IAAI,WAAW,EAAE,QAAQ,EAAE,CAAC;QAC1B,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;QAClC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpB,CAAC;IAED,mBAAmB;IACnB,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACrB,MAAM,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;IAExC,MAAM,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;IACrC,MAAM,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,kBAAkB,CAAC,eAAe,IAAI,iCAAiC,IAAI,CAAC,CAAC;IAEvG,MAAM,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;IACjC,MAAM,WAAW,GAAG,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,kBAAkB,CAAC,WAAW,CAAC;QAC1E,CAAC,CAAC,UAAU,CAAC,kBAAkB,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC;QACtD,CAAC,CAAC,UAAU,CAAC,kBAAkB,CAAC,WAAW,IAAI,WAAW,CAAC;IAC7D,MAAM,CAAC,IAAI,CAAC,GAAG,WAAW,IAAI,CAAC,CAAC;IAEhC,IAAI,UAAU,CAAC,kBAAkB,CAAC,oBAAoB,EAAE,CAAC;QACvD,MAAM,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;QAC1C,MAAM,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,kBAAkB,CAAC,oBAAoB,IAAI,CAAC,CAAC;IACzE,CAAC;IAED,WAAW;IACX,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACrB,MAAM,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;IAE3C,MAAM,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;IACzC,MAAM,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,kBAAkB,CAAC,UAAU,IAAI,WAAW,IAAI,CAAC,CAAC;IAE5E,IAAI,UAAU,CAAC,kBAAkB,CAAC,YAAY,EAAE,CAAC;QAC/C,MAAM,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;QACrC,MAAM,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,kBAAkB,CAAC,YAAY,IAAI,CAAC,CAAC;IACjE,CAAC;IAED,IAAI,UAAU,CAAC,kBAAkB,CAAC,gBAAgB,EAAE,CAAC;QACnD,MAAM,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;QACzC,MAAM,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,kBAAkB,CAAC,gBAAgB,IAAI,CAAC,CAAC;IACrE,CAAC;IAED,sBAAsB;IACtB,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACrB,MAAM,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;IAE3C,IAAI,UAAU,CAAC,kBAAkB,CAAC,oBAAoB,EAAE,CAAC;QACvD,MAAM,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;QACjC,MAAM,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,kBAAkB,CAAC,oBAAoB,IAAI,CAAC,CAAC;IACzE,CAAC;IAED,IAAI,UAAU,CAAC,kBAAkB,CAAC,oBAAoB,IAAI,UAAU,CAAC,kBAAkB,CAAC,oBAAoB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxH,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QAChC,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,kBAAkB,CAAC,oBAAoB,CAAC;YAClF,CAAC,CAAC,UAAU,CAAC,kBAAkB,CAAC,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC;YAC/D,CAAC,CAAC,UAAU,CAAC,kBAAkB,CAAC,oBAAoB,CAAC;QACvD,MAAM,CAAC,IAAI,CAAC,GAAG,UAAU,IAAI,CAAC,CAAC;IACjC,CAAC;IAED,IAAI,UAAU,CAAC,kBAAkB,CAAC,cAAc,EAAE,CAAC;QACjD,MAAM,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;QACpC,MAAM,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,kBAAkB,CAAC,cAAc,IAAI,CAAC,CAAC;IACnE,CAAC;IAED,WAAW;IACX,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACrB,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IAC7B,MAAM,CAAC,IAAI,CAAC,eAAe,UAAU,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;IAC5D,MAAM,CAAC,IAAI,CAAC,oBAAoB,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;IAC5D,MAAM,CAAC,IAAI,CAAC,8BAA8B,UAAU,CAAC,iBAAiB,EAAE,CAAC,CAAC;IAE1E,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC3B,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,IAAmB;IACjD,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;QACtB,OAAO;YACL,OAAO,EAAE,CAAC;oBACR,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,oDAAoD;iBAC3D,CAAC;YACF,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;QACpB,OAAO;YACL,OAAO,EAAE,CAAC;oBACR,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,kDAAkD;iBACzD,CAAC;YACF,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAC/C,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO;YACL,OAAO,EAAE,CAAC;oBACR,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,qDAAqD;iBAC5D,CAAC;YACF,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;IAED,MAAM,SAAS,GAAG,kBAAkB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACrD,mBAAmB,CAAC,SAAS,CAAC,CAAC;IAE/B,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,OAAO,CAAC;IAElC,6BAA6B;IAC7B,MAAM,UAAU,GAAI,MAAc,CAAC,UAAyC,CAAC;IAC7E,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO;YACL,OAAO,EAAE,CAAC;oBACR,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,qDAAqD;iBAC5D,CAAC;YACF,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;IAED,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;QACrB,OAAO,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;IACvD,CAAC;SAAM,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QAC9B,OAAO,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;IACzD,CAAC;SAAM,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC7B,OAAO,eAAe,CAAC,UAAU,CAAC,CAAC;IACrC,CAAC;IAED,OAAO;QACL,OAAO,EAAE,CAAC;gBACR,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,kCAAkC,IAAI,EAAE;aAC/C,CAAC;QACF,OAAO,EAAE,IAAI;KACd,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,cAAc,CACrB,UAA2B,EAC3B,MAAW,EACX,SAAiB;IAEjB,IAAI,UAAU,CAAC,gBAAgB,KAAK,WAAW,EAAE,CAAC;QAChD,OAAO;YACL,OAAO,EAAE,CAAC;oBACR,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,uFAAuF;iBAC9F,CAAC;YACF,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;IAED,wBAAwB;IACxB,MAAM,WAAW,GAAG,gBAAgB,CAAC,UAAU,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;IAE9D,mBAAmB;IACnB,UAAU,CAAC,SAAS,GAAG,OAAO,CAAC;IAC/B,UAAU,CAAC,KAAK,GAAG,WAAW,CAAC;IAC/B,UAAU,CAAC,iBAAiB,EAAE,CAAC;IAC/B,UAAU,CAAC,iBAAiB,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAExD,MAAM,gBAAgB,GAAG;QACvB,GAAG,MAAM;QACT,UAAU;QACV,aAAa,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACxC,CAAC;IAEF,MAAM,UAAU,GAAG,gBAAgB,CAAC,gBAAgB,CAAC,CAAC;IAEtD,MAAM,QAAQ,GAAG;;;;;;;;;EASjB,WAAW,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC;;;;;;;;;;;;;;;;iBAgBd,UAAU,CAAC,IAAI;;;EAG9B,UAAU,CAAC,OAAO;;;;;;EAMlB,WAAW;;CAEZ,CAAC;IAEA,OAAO;QACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;QAC3C,KAAK,EAAE;YACL;gBACE,IAAI,EAAE,GAAG,SAAS,IAAI,UAAU,CAAC,IAAI,EAAE;gBACvC,OAAO,EAAE,UAAU,CAAC,OAAO;aAC5B;YACD;gBACE,IAAI,EAAE,GAAG,SAAS,yBAAyB;gBAC3C,OAAO,EAAE,WAAW;aACrB;SACF;QACD,iBAAiB,EAAE,UAAU,CAAC,OAAO;KACtC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,gBAAgB,CACvB,UAA2B,EAC3B,MAAW,EACX,SAAiB;IAEjB,IAAI,UAAU,CAAC,SAAS,KAAK,OAAO,EAAE,CAAC;QACrC,OAAO;YACL,OAAO,EAAE,CAAC;oBACR,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,yDAAyD;iBAChE,CAAC;YACF,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;IAED,uCAAuC;IACvC,MAAM,WAAW,GAAG,gBAAgB,CAAC,UAAU,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;IAE9D,qBAAqB;IACrB,MAAM,SAAS,GAAG;QAChB,mBAAmB,EAAE,WAAW,CAAC,QAAQ,CAAC,yBAAyB,CAAC;QACpE,iBAAiB,EAAE,WAAW,CAAC,QAAQ,CAAC,4BAA4B,CAAC;QACrE,uBAAuB,EAAE,WAAW,CAAC,QAAQ,CAAC,mCAAmC,CAAC;QAClF,qBAAqB,EAAE,WAAW,CAAC,QAAQ,CAAC,qBAAqB,CAAC;QAClE,qBAAqB,EAAE,WAAW,CAAC,QAAQ,CAAC,8BAA8B,CAAC;QAC3E,kBAAkB,EAAE,WAAW,CAAC,QAAQ,CAAC,kBAAkB,CAAC;QAC5D,qBAAqB,EAAE,WAAW,CAAC,QAAQ,CAAC,qBAAqB,CAAC;QAClE,qBAAqB,EAAE,WAAW,CAAC,QAAQ,CAAC,qBAAqB,CAAC;KACnE,CAAC;IAEF,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IACxE,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC;IACjD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,cAAc,GAAG,UAAU,CAAC,GAAG,GAAG,CAAC,CAAC;IAE9D,qBAAqB;IACrB,MAAM,SAAS,GAAG,iBAAiB,CAAC,WAAW,EAAE;QAC/C,kBAAkB,EAAE,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC;QAC1C,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC;KACxB,CAAC,CAAC;IAEV,UAAU,CAAC,QAAQ,GAAG,SAAS,CAAC,OAAO,CAAC;IACxC,UAAU,CAAC,SAAS,GAAG,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC;IAE3D,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,MAAM,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;IACvC,MAAM,CAAC,IAAI,CAAC,4BAA4B,KAAK,MAAM,CAAC,CAAC;IACrD,MAAM,CAAC,IAAI,CAAC,2BAA2B,SAAS,CAAC,OAAO,QAAQ,CAAC,CAAC;IAElE,MAAM,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;IAC5C,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,EAAE;QACnD,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;QAChC,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC;IACjC,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,IAAI,CAAC,gBAAgB,cAAc,IAAI,UAAU,oBAAoB,CAAC,CAAC;IAE9E,IAAI,KAAK,IAAI,EAAE,EAAE,CAAC;QAChB,MAAM,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;QAChD,MAAM,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAC;IAC9D,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,IAAI,CAAC,gCAAgC,KAAK,QAAQ,CAAC,CAAC;QAC3D,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAC9B,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,EAAE;YACnD,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,MAAM,CAAC,IAAI,CAAC,gBAAgB,IAAI,EAAE,CAAC,CAAC;YACtC,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED,OAAO;QACL,OAAO,EAAE,CAAC;gBACR,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;aACxB,CAAC;KACH,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,eAAe,CAAC,UAA2B;IAClD,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,MAAM,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;IACpC,MAAM,CAAC,IAAI,CAAC,eAAe,UAAU,CAAC,SAAS,EAAE,CAAC,CAAC;IACnD,MAAM,CAAC,IAAI,CAAC,cAAc,UAAU,CAAC,QAAQ,MAAM,CAAC,CAAC;IACrD,MAAM,CAAC,IAAI,CAAC,aAAa,UAAU,CAAC,KAAK,IAAI,CAAC,CAAC;IAE/C,IAAI,UAAU,CAAC,mBAAmB,EAAE,CAAC;QACnC,MAAM,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;QAC3C,MAAM,CAAC,IAAI,CAAC,cAAc,UAAU,CAAC,mBAAmB,CAAC,KAAK,QAAQ,CAAC,CAAC;QAExE,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAC/B,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,EAAE;YAClF,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;YAChC,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC;QACjC,CAAC,CAAC,CAAC;QAEH,IAAI,UAAU,CAAC,mBAAmB,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACnD,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;YAC/B,UAAU,CAAC,mBAAmB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;gBAClD,MAAM,CAAC,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC;YAC1B,CAAC,CAAC,CAAC;QACL,CAAC;QAED,IAAI,UAAU,CAAC,mBAAmB,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1D,MAAM,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;YACjC,UAAU,CAAC,mBAAmB,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE;gBAC9D,MAAM,CAAC,IAAI,CAAC,KAAK,QAAQ,EAAE,CAAC,CAAC;YAC/B,CAAC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO;QACL,OAAO,EAAE,CAAC;gBACR,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;aACxB,CAAC;KACH,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,IAAI,EAAE,QAAQ;IACd,UAAU,EAAE;QACV,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,WAAW,EAAE,0CAA0C;SACxD;QACD,SAAS,EAAE;YACT,IAAI,EAAE,QAAQ;YACd,WAAW,EAAE,+BAA+B;SAC7C;QACD,IAAI,EAAE;YACJ,IAAI,EAAE,QAAQ;YACd,IAAI,EAAE,CAAC,OAAO,EAAE,SAAS,EAAE,QAAQ,CAAC;YACpC,WAAW,EAAE,iBAAiB;SAC/B;KACF;IACD,QAAQ,EAAE,CAAC,aAAa,EAAE,WAAW,CAAC;CACvC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"proximo.d.ts","sourceRoot":"","sources":["../../src/tools/proximo.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAiB,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"proximo.d.ts","sourceRoot":"","sources":["../../src/tools/proximo.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAiB,MAAM,mBAAmB,CAAC;AAkBnE,UAAU,WAAW;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;CACrB;AAuBD;;;;GAIG;AACH,wBAAsB,OAAO,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CAwrBpE;AAED;;GAEG;AACH,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;CAyBzB,CAAC"}
|
package/dist/tools/proximo.js
CHANGED
|
@@ -2,15 +2,17 @@ import { existsSync } from "fs";
|
|
|
2
2
|
import { parsearEstado, serializarEstado } from "../state/storage.js";
|
|
3
3
|
import { getFaseComStitch, getFluxoComStitch } from "../flows/types.js";
|
|
4
4
|
import { classificarPRD, descreverNivel } from "../flows/classifier.js";
|
|
5
|
-
import { validarGate } from "../gates/validator.js";
|
|
5
|
+
import { validarGate, validarGateComTemplate } from "../gates/validator.js";
|
|
6
6
|
import { setCurrentDirectory } from "../state/context.js";
|
|
7
7
|
import { parsearResumo, serializarResumo, criarResumoInicial, extrairResumoEntregavel } from "../state/memory.js";
|
|
8
8
|
import { logEvent, EventTypes } from "../utils/history.js";
|
|
9
9
|
import { gerarSystemMd } from "../utils/system-md.js";
|
|
10
10
|
import { getSkillParaFase, getSkillResourcePath } from "../utils/prompt-mapper.js";
|
|
11
11
|
import { validarEstrutura } from "../gates/estrutura.js";
|
|
12
|
-
import { resolveProjectPath } from "../utils/files.js";
|
|
12
|
+
import { resolveProjectPath, getServerContentRoot } from "../utils/files.js";
|
|
13
13
|
import { formatSkillMessage, detectIDE, getSkillResourcePath as getIDESkillResourcePath } from "../utils/ide-paths.js";
|
|
14
|
+
import { inferirContextoBalanceado } from "../utils/inferencia-contextual.js";
|
|
15
|
+
import { verificarSkillCarregada } from "../utils/content-injector.js";
|
|
14
16
|
/**
|
|
15
17
|
* Calcula score de qualidade
|
|
16
18
|
*/
|
|
@@ -84,6 +86,28 @@ proximo(
|
|
|
84
86
|
// Validar tamanho mínimo do entregável
|
|
85
87
|
const TAMANHO_MINIMO_ENTREGAVEL = 200;
|
|
86
88
|
if (!args.entregavel || args.entregavel.trim().length < TAMANHO_MINIMO_ENTREGAVEL) {
|
|
89
|
+
// Obter skill e IDE para instruções corretas
|
|
90
|
+
const ideDetectada = detectIDE(diretorio) || 'windsurf';
|
|
91
|
+
const skillNome = faseAtualInfo ? getSkillParaFase(faseAtualInfo.nome) : null;
|
|
92
|
+
let instrucoesSkill = "";
|
|
93
|
+
if (skillNome) {
|
|
94
|
+
const skillPath = getIDESkillResourcePath(skillNome, 'reference', ideDetectada);
|
|
95
|
+
const templatesPath = getIDESkillResourcePath(skillNome, 'templates', ideDetectada);
|
|
96
|
+
instrucoesSkill = `
|
|
97
|
+
### 📚 Recursos da Skill
|
|
98
|
+
|
|
99
|
+
Abra os seguintes arquivos no seu IDE:
|
|
100
|
+
|
|
101
|
+
1. **SKILL.md** (instruções do especialista):
|
|
102
|
+
\`${getIDESkillResourcePath(skillNome, 'reference', ideDetectada)}SKILL.md\`
|
|
103
|
+
|
|
104
|
+
2. **Templates** (estrutura do entregável):
|
|
105
|
+
\`${templatesPath}\`
|
|
106
|
+
|
|
107
|
+
3. **Checklists** (validação):
|
|
108
|
+
\`${getIDESkillResourcePath(skillNome, 'checklists', ideDetectada)}\`
|
|
109
|
+
`;
|
|
110
|
+
}
|
|
87
111
|
return {
|
|
88
112
|
content: [{
|
|
89
113
|
type: "text",
|
|
@@ -101,21 +125,17 @@ O entregável está vazio ou muito curto.
|
|
|
101
125
|
## ⚡ AÇÃO OBRIGATÓRIA
|
|
102
126
|
|
|
103
127
|
Você **DEVE** desenvolver o entregável corretamente:
|
|
128
|
+
${instrucoesSkill}
|
|
104
129
|
|
|
105
|
-
|
|
106
|
-
\`\`\`
|
|
107
|
-
read_resource("maestro://especialista/${faseAtualInfo?.especialista || "..."}")
|
|
108
|
-
\`\`\`
|
|
130
|
+
### Fluxo Obrigatório
|
|
109
131
|
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
5. Apresentar ao usuário para aprovação
|
|
118
|
-
6. Só então chamar \`proximo()\`
|
|
132
|
+
1. Leia a **SKILL.md** → Siga as instruções e perguntas do especialista
|
|
133
|
+
2. Consulte os **Templates** → Use como base estrutural
|
|
134
|
+
3. Faça perguntas ao usuário → Conforme indicado na SKILL
|
|
135
|
+
4. Gere o entregável → Seguindo TODAS as seções do template
|
|
136
|
+
5. Valide com o **Checklist** → Antes de avançar
|
|
137
|
+
6. Apresente ao usuário → Para aprovação
|
|
138
|
+
7. Só então chame \`proximo()\`
|
|
119
139
|
|
|
120
140
|
> ⛔ **NÃO TENTE AVANÇAR** com entregáveis vazios ou incompletos!
|
|
121
141
|
`,
|
|
@@ -149,6 +169,52 @@ O **usuário humano** deve decidir:
|
|
|
149
169
|
}],
|
|
150
170
|
};
|
|
151
171
|
}
|
|
172
|
+
// Fluxo PRD-first: se ainda aguardando PRD, analisar e sugerir em um único passo
|
|
173
|
+
if (estado.status === "aguardando_prd" && estado.fase_atual === 1) {
|
|
174
|
+
const analise = classificarPRD(args.entregavel);
|
|
175
|
+
estado.classificacao_sugerida = analise;
|
|
176
|
+
estado.aguardando_classificacao = true;
|
|
177
|
+
estado.classificacao_pos_prd_confirmada = false;
|
|
178
|
+
estado.status = "ativo";
|
|
179
|
+
// Inferência balanceada (não assume críticos) + perguntas agrupadas
|
|
180
|
+
estado.inferencia_contextual = inferirContextoBalanceado(`${estado.nome} ${args.entregavel}`);
|
|
181
|
+
const estadoFile = serializarEstado(estado);
|
|
182
|
+
const perguntas = estado.inferencia_contextual?.perguntas_prioritarias || [];
|
|
183
|
+
const perguntasMarkdown = perguntas.length
|
|
184
|
+
? perguntas.map((p) => `- (${p.prioridade}) ${p.pergunta}${p.valor_inferido ? `
|
|
185
|
+
- Inferido: ${p.valor_inferido} (confiança ${((p.confianca_inferencia ?? 0) * 100).toFixed(0)}%)` : ""}`).join("\n")
|
|
186
|
+
: "- Informe domínio, stack preferida e integrações em um único prompt.";
|
|
187
|
+
return {
|
|
188
|
+
content: [{
|
|
189
|
+
type: "text",
|
|
190
|
+
text: `# 🔍 PRD Analisado (PRD-first)
|
|
191
|
+
|
|
192
|
+
| Campo | Valor |
|
|
193
|
+
|-------|-------|
|
|
194
|
+
| Nível sugerido | ${analise.nivel.toUpperCase()} |
|
|
195
|
+
| Pontuação | ${analise.pontuacao} |
|
|
196
|
+
| Critérios | ${analise.criterios.join(", ")} |
|
|
197
|
+
|
|
198
|
+
## Ação obrigatória (responder em UM ÚNICO PROMPT)
|
|
199
|
+
1) Confirme ou ajuste a classificação:
|
|
200
|
+
\`\`\`
|
|
201
|
+
confirmar_classificacao({
|
|
202
|
+
estado_json: "...",
|
|
203
|
+
diretorio: "${diretorio}",
|
|
204
|
+
nivel: "${analise.nivel}" // opcional, ajuste se necessário
|
|
205
|
+
})
|
|
206
|
+
\`\`\`
|
|
207
|
+
2) Responda também às perguntas abaixo no MESMO prompt (evita múltiplos prompts):
|
|
208
|
+
${perguntasMarkdown}
|
|
209
|
+
|
|
210
|
+
> ⚠️ Não prossiga para outras fases antes de confirmar a classificação.
|
|
211
|
+
> Consulte SKILL e templates em: ${getIDESkillResourcePath(getSkillParaFase(faseAtualInfo?.nome || "Produto") || "specialist-gestao-produto", 'templates', detectIDE(diretorio) || 'windsurf')}
|
|
212
|
+
`,
|
|
213
|
+
}],
|
|
214
|
+
files: [{ path: `${diretorio}/${estadoFile.path}`, content: estadoFile.content }],
|
|
215
|
+
estado_atualizado: estadoFile.content,
|
|
216
|
+
};
|
|
217
|
+
}
|
|
152
218
|
// Verificar se há bloqueio de confirmação de classificação (Pós-PRD)
|
|
153
219
|
if (estado.aguardando_classificacao) {
|
|
154
220
|
let msgSugestao = "";
|
|
@@ -170,7 +236,7 @@ Antes de prosseguir, você precisa confirmar a classificação do projeto.
|
|
|
170
236
|
|
|
171
237
|
${msgSugestao}
|
|
172
238
|
|
|
173
|
-
## 🔐 Ação Necessária
|
|
239
|
+
## 🔐 Ação Necessária (responder em UM ÚNICO PROMPT)
|
|
174
240
|
|
|
175
241
|
Use a tool \`confirmar_classificacao\` para validar ou ajustar a complexidade.
|
|
176
242
|
|
|
@@ -181,6 +247,8 @@ confirmar_classificacao(
|
|
|
181
247
|
)
|
|
182
248
|
\`\`\`
|
|
183
249
|
|
|
250
|
+
Inclua no MESMO prompt qualquer ajuste de domínio/stack ou integrações críticas para evitar prompts adicionais.
|
|
251
|
+
|
|
184
252
|
> ⚠️ **IMPORTANTE**: Você DEVE chamar esta tool antes de continuar.
|
|
185
253
|
`,
|
|
186
254
|
}],
|
|
@@ -196,12 +264,69 @@ confirmar_classificacao(
|
|
|
196
264
|
isError: true,
|
|
197
265
|
};
|
|
198
266
|
}
|
|
199
|
-
//
|
|
200
|
-
const
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
267
|
+
// Enforcement de skill + template + checklist antes de avançar
|
|
268
|
+
const ideDetectada = detectIDE(diretorio) || 'windsurf';
|
|
269
|
+
const skillObrigatoria = getSkillParaFase(faseAtual.nome);
|
|
270
|
+
if (skillObrigatoria) {
|
|
271
|
+
const skillOk = await verificarSkillCarregada(diretorio, skillObrigatoria, ideDetectada).catch(() => false);
|
|
272
|
+
if (!skillOk) {
|
|
273
|
+
return {
|
|
274
|
+
content: [{
|
|
275
|
+
type: "text",
|
|
276
|
+
text: `# ⛔ Skill Obrigatória Não Carregada
|
|
277
|
+
|
|
278
|
+
Fase: **${faseAtual.nome}**
|
|
279
|
+
Skill necessária: \`${skillObrigatoria}\`
|
|
280
|
+
|
|
281
|
+
Carregue e leia a skill antes de gerar o entregável:
|
|
282
|
+
1) Ler SKILL: \`${getIDESkillResourcePath(skillObrigatoria, 'reference', ideDetectada)}SKILL.md\`
|
|
283
|
+
2) Templates: \`${getIDESkillResourcePath(skillObrigatoria, 'templates', ideDetectada)}\`
|
|
284
|
+
3) Checklist: \`${getIDESkillResourcePath(skillObrigatoria, 'checklists', ideDetectada)}\`
|
|
285
|
+
|
|
286
|
+
> Gere o entregável seguindo o template e valide com o checklist antes de chamar \`proximo\`.`,
|
|
287
|
+
}],
|
|
288
|
+
isError: true,
|
|
289
|
+
};
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
// Tentar validação com template (novo sistema inteligente)
|
|
293
|
+
const diretorioContent = getServerContentRoot();
|
|
294
|
+
const tier = estado.tier_gate || "base";
|
|
295
|
+
const validacaoTemplate = validarGateComTemplate(faseAtual, args.entregavel, tier, diretorioContent);
|
|
296
|
+
let qualityScore;
|
|
297
|
+
let gateResultado;
|
|
298
|
+
let estruturaResult;
|
|
299
|
+
let usouTemplate = false;
|
|
300
|
+
if (validacaoTemplate.sucesso && validacaoTemplate.resultado) {
|
|
301
|
+
// Usar validação baseada em template (enforcement)
|
|
302
|
+
usouTemplate = true;
|
|
303
|
+
const resultado = validacaoTemplate.resultado;
|
|
304
|
+
// Converter resultado do template para formato legado para compatibilidade
|
|
305
|
+
qualityScore = resultado.qualidade?.scoreGeral || resultado.score || 0;
|
|
306
|
+
// Criar estrutura compatível para gateResultado
|
|
307
|
+
gateResultado = {
|
|
308
|
+
valido: resultado.valido,
|
|
309
|
+
itens_validados: resultado.checkboxes?.preenchidos.map((c) => c.texto) || [],
|
|
310
|
+
itens_pendentes: resultado.checkboxes?.faltando.map((c) => c.texto) || [],
|
|
311
|
+
sugestoes: resultado.sugestoes || [],
|
|
312
|
+
};
|
|
313
|
+
// Criar estrutura compatível para estruturaResult
|
|
314
|
+
estruturaResult = {
|
|
315
|
+
valido: resultado.estrutura?.valida || false,
|
|
316
|
+
score: resultado.estrutura?.score || 0,
|
|
317
|
+
secoes_encontradas: resultado.estrutura?.secoesEncontradas || [],
|
|
318
|
+
secoes_faltando: resultado.estrutura?.secoesFaltando || [],
|
|
319
|
+
tamanho_ok: true,
|
|
320
|
+
feedback: resultado.feedback || [],
|
|
321
|
+
};
|
|
322
|
+
}
|
|
323
|
+
else {
|
|
324
|
+
// Fallback para sistema legado
|
|
325
|
+
usouTemplate = false;
|
|
326
|
+
estruturaResult = validarEstrutura(estado.fase_atual, args.entregavel);
|
|
327
|
+
gateResultado = validarGate(faseAtual, args.entregavel);
|
|
328
|
+
qualityScore = calcularQualityScore(estruturaResult, gateResultado);
|
|
329
|
+
}
|
|
205
330
|
// Score < 50: BLOQUEAR
|
|
206
331
|
if (qualityScore < 50) {
|
|
207
332
|
return {
|