@maestro-ai/mcp-server 5.6.3 → 5.6.5
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/flows/types.d.ts.map +1 -1
- package/dist/flows/types.js +57 -27
- package/dist/flows/types.js.map +1 -1
- package/dist/handlers/code-phase-handler.d.ts +35 -0
- package/dist/handlers/code-phase-handler.d.ts.map +1 -0
- package/dist/handlers/code-phase-handler.js +581 -0
- package/dist/handlers/code-phase-handler.js.map +1 -0
- package/dist/handlers/shared-prompt-handler.js +2 -2
- package/dist/handlers/shared-prompt-handler.js.map +1 -1
- package/dist/handlers/specialist-formatters.d.ts +1 -1
- package/dist/handlers/specialist-formatters.d.ts.map +1 -1
- package/dist/handlers/specialist-formatters.js +103 -3
- package/dist/handlers/specialist-formatters.js.map +1 -1
- package/dist/handlers/specialist-phase-handler.js +2 -2
- package/dist/handlers/specialist-phase-handler.js.map +1 -1
- package/dist/middleware/skill-injection.middleware.d.ts +8 -5
- package/dist/middleware/skill-injection.middleware.d.ts.map +1 -1
- package/dist/middleware/skill-injection.middleware.js +12 -9
- package/dist/middleware/skill-injection.middleware.js.map +1 -1
- package/dist/services/task-decomposer.service.d.ts +17 -0
- package/dist/services/task-decomposer.service.d.ts.map +1 -1
- package/dist/services/task-decomposer.service.js +344 -0
- package/dist/services/task-decomposer.service.js.map +1 -1
- package/dist/tools/consolidated/avancar.d.ts.map +1 -1
- package/dist/tools/consolidated/avancar.js +20 -2
- package/dist/tools/consolidated/avancar.js.map +1 -1
- package/dist/tools/iniciar-projeto.js +1 -1
- package/dist/tools/iniciar-projeto.js.map +1 -1
- package/dist/tools/maestro-tool.js +1 -1
- package/dist/tools/maestro-tool.js.map +1 -1
- package/dist/tools/proximo.d.ts.map +1 -1
- package/dist/tools/proximo.js +117 -15
- package/dist/tools/proximo.js.map +1 -1
- package/dist/types/code-manifest.d.ts +47 -0
- package/dist/types/code-manifest.d.ts.map +1 -0
- package/dist/types/code-manifest.js +12 -0
- package/dist/types/code-manifest.js.map +1 -0
- package/dist/utils/gate-synonyms.d.ts +23 -0
- package/dist/utils/gate-synonyms.d.ts.map +1 -0
- package/dist/utils/gate-synonyms.js +161 -0
- package/dist/utils/gate-synonyms.js.map +1 -0
- package/dist/utils/ide-paths.d.ts +12 -1
- package/dist/utils/ide-paths.d.ts.map +1 -1
- package/dist/utils/ide-paths.js +21 -9
- package/dist/utils/ide-paths.js.map +1 -1
- package/dist/utils/instructions.d.ts +11 -2
- package/dist/utils/instructions.d.ts.map +1 -1
- package/dist/utils/instructions.js +33 -5
- package/dist/utils/instructions.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,581 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Code Phase Handler (v8.0)
|
|
3
|
+
*
|
|
4
|
+
* Handler dedicado para fases de desenvolvimento de código (Frontend, Backend, Integração, Deploy).
|
|
5
|
+
*
|
|
6
|
+
* Responsabilidades:
|
|
7
|
+
* 1. Detectar que é fase de código e interceptar antes do proximo.ts
|
|
8
|
+
* 2. Ler backlog, OpenAPI, arquitetura do disco (via menções)
|
|
9
|
+
* 3. Gerar tasks baseadas no Backlog (não da arquitetura)
|
|
10
|
+
* 4. Apresentar tasks task-by-task com contexto dos docs anteriores
|
|
11
|
+
* 5. Validar existência real de arquivos (não keywords)
|
|
12
|
+
* 6. Gerar manifest ao completar todas tasks
|
|
13
|
+
*
|
|
14
|
+
* State machine: SETUP → WORKING → GATE → COMPLETED
|
|
15
|
+
*
|
|
16
|
+
* @since v8.0
|
|
17
|
+
*/
|
|
18
|
+
import { existsSync } from "fs";
|
|
19
|
+
import { readFile } from "fs/promises";
|
|
20
|
+
import { join } from "path";
|
|
21
|
+
import { serializarEstado } from "../state/storage.js";
|
|
22
|
+
import { saveFile } from "../utils/persistence.js";
|
|
23
|
+
import { getFaseComStitch } from "../flows/types.js";
|
|
24
|
+
import { decomposeBacklogToTasks, getNextTask, getTaskProgress } from "../services/task-decomposer.service.js";
|
|
25
|
+
import { formatMention, detectIDE } from "../utils/ide-paths.js";
|
|
26
|
+
import { getFaseDirName } from "../utils/entregavel-path.js";
|
|
27
|
+
/** Nomes de fases que são de código */
|
|
28
|
+
const CODE_PHASE_NAMES = ['Frontend', 'Backend', 'Integração', 'Deploy Final'];
|
|
29
|
+
/**
|
|
30
|
+
* Verifica se uma fase é de código.
|
|
31
|
+
*/
|
|
32
|
+
export function isCodePhase(faseNome) {
|
|
33
|
+
if (!faseNome)
|
|
34
|
+
return false;
|
|
35
|
+
return CODE_PHASE_NAMES.some(k => faseNome.includes(k));
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Entry point do Code Phase Handler.
|
|
39
|
+
* Detecta o estado atual e delega para o handler correto.
|
|
40
|
+
*/
|
|
41
|
+
export async function handleCodePhase(args) {
|
|
42
|
+
const { estado, diretorio } = args;
|
|
43
|
+
const faseInfo = getFaseComStitch(estado.nivel, estado.fase_atual, estado.usar_stitch);
|
|
44
|
+
if (!faseInfo) {
|
|
45
|
+
return {
|
|
46
|
+
content: [{ type: "text", text: `❌ Fase ${estado.fase_atual} não encontrada no fluxo.` }],
|
|
47
|
+
isError: true,
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
// Carregar ou inicializar estado da fase de código
|
|
51
|
+
let codeState = loadCodePhaseState(estado, estado.fase_atual, faseInfo.nome);
|
|
52
|
+
// State machine
|
|
53
|
+
switch (codeState.status) {
|
|
54
|
+
case 'setup':
|
|
55
|
+
return handleSetup(args, codeState, faseInfo);
|
|
56
|
+
case 'working':
|
|
57
|
+
return handleWorking(args, codeState, faseInfo);
|
|
58
|
+
case 'gate':
|
|
59
|
+
return handleGate(args, codeState, faseInfo);
|
|
60
|
+
case 'completed':
|
|
61
|
+
// Já completou — delegar para proximo.ts para avançar
|
|
62
|
+
return delegateToProximo(args);
|
|
63
|
+
default:
|
|
64
|
+
return handleSetup(args, codeState, faseInfo);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Handler: SETUP — Primeira vez na fase de código.
|
|
69
|
+
* Lê backlog + OpenAPI + arquitetura, gera tasks, apresenta visão geral.
|
|
70
|
+
*/
|
|
71
|
+
async function handleSetup(args, codeState, faseInfo) {
|
|
72
|
+
const { estado, diretorio } = args;
|
|
73
|
+
const ide = (estado.ide || detectIDE(diretorio) || 'windsurf');
|
|
74
|
+
// Ler entregáveis anteriores do disco
|
|
75
|
+
const backlogContent = await readEntregavel(estado, diretorio, 'backlog');
|
|
76
|
+
const openApiContent = await readEntregavel(estado, diretorio, 'openapi');
|
|
77
|
+
const arquiteturaContent = await readEntregavel(estado, diretorio, 'arquitetura');
|
|
78
|
+
// Gerar tasks a partir do backlog (se disponível)
|
|
79
|
+
if (!codeState.tasksGenerated && backlogContent) {
|
|
80
|
+
try {
|
|
81
|
+
const newTasks = decomposeBacklogToTasks(backlogContent, openApiContent, estado.fase_atual, faseInfo.nome);
|
|
82
|
+
if (newTasks.length > 0) {
|
|
83
|
+
// Limpar tasks antigas da mesma fase
|
|
84
|
+
estado.tasks = [
|
|
85
|
+
...(estado.tasks || []).filter(t => t.phase !== estado.fase_atual),
|
|
86
|
+
...newTasks,
|
|
87
|
+
];
|
|
88
|
+
codeState.tasksGenerated = true;
|
|
89
|
+
console.log(`[code-phase] v8.0: ${newTasks.length} tasks geradas do Backlog para fase ${estado.fase_atual} (${faseInfo.nome})`);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
catch (err) {
|
|
93
|
+
console.warn('[code-phase] v8.0: Falha ao gerar tasks do backlog:', err);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
// Calcular progresso
|
|
97
|
+
const progress = getTaskProgress(estado.tasks || [], estado.fase_atual);
|
|
98
|
+
const nextTask = getNextTask((estado.tasks || []).filter(t => t.phase === estado.fase_atual));
|
|
99
|
+
// Extrair stack da arquitetura (parsing simplificado)
|
|
100
|
+
const stackInfo = extractStackInfo(arquiteturaContent, faseInfo.nome);
|
|
101
|
+
// Extrair user stories relevantes do backlog
|
|
102
|
+
const relevantStories = extractRelevantStoriesSummary(backlogContent, faseInfo.nome);
|
|
103
|
+
// Extrair endpoints do OpenAPI
|
|
104
|
+
const endpointsSummary = extractEndpointsSummary(openApiContent, faseInfo.nome);
|
|
105
|
+
// Gerar menções aos documentos relevantes
|
|
106
|
+
const mencoes = buildRelevantMentions(estado, diretorio, faseInfo.nome, ide);
|
|
107
|
+
// Atualizar estado
|
|
108
|
+
codeState.status = nextTask ? 'working' : 'setup';
|
|
109
|
+
saveCodePhaseState(estado, codeState);
|
|
110
|
+
await persistState(estado, diretorio);
|
|
111
|
+
const taskInfo = nextTask
|
|
112
|
+
? `\n## ⚡ Task Atual: 1/${progress.total} — ${nextTask.title}\n${nextTask.description}\n`
|
|
113
|
+
: '\n> ⚠️ Nenhuma task gerada. Verifique se o backlog existe.\n';
|
|
114
|
+
return {
|
|
115
|
+
content: [{
|
|
116
|
+
type: "text",
|
|
117
|
+
text: `# 🚀 Fase ${estado.fase_atual}: ${faseInfo.nome} — Setup
|
|
118
|
+
|
|
119
|
+
## 👤 Especialista: ${faseInfo.especialista}
|
|
120
|
+
|
|
121
|
+
${stackInfo}
|
|
122
|
+
|
|
123
|
+
${relevantStories}
|
|
124
|
+
|
|
125
|
+
${endpointsSummary}
|
|
126
|
+
|
|
127
|
+
## 📎 Leia antes de começar
|
|
128
|
+
${mencoes}
|
|
129
|
+
${taskInfo}
|
|
130
|
+
## 📊 Progresso: ${progress.done}/${progress.total} tasks (${progress.percentage}%)
|
|
131
|
+
|
|
132
|
+
## Gate de Saída
|
|
133
|
+
${faseInfo.gate_checklist.map(item => `- [ ] ${item}`).join('\n')}
|
|
134
|
+
|
|
135
|
+
---
|
|
136
|
+
|
|
137
|
+
### 🤖 Instruções para a IA
|
|
138
|
+
|
|
139
|
+
1. **Leia os documentos mencionados** acima para entender o contexto completo
|
|
140
|
+
2. **Implemente a task atual** seguindo a stack definida na Arquitetura
|
|
141
|
+
3. **Após concluir**, marque como feita chamando:
|
|
142
|
+
|
|
143
|
+
\`\`\`json
|
|
144
|
+
executar({
|
|
145
|
+
"diretorio": "${diretorio}",
|
|
146
|
+
"acao": "avancar",
|
|
147
|
+
"respostas": { "task_done": true }
|
|
148
|
+
})
|
|
149
|
+
\`\`\`
|
|
150
|
+
|
|
151
|
+
> ⚠️ Implemente UMA task por vez. Não tente fazer tudo de uma vez.
|
|
152
|
+
`,
|
|
153
|
+
}],
|
|
154
|
+
estado_atualizado: serializarEstado(estado).content,
|
|
155
|
+
specialist_persona: {
|
|
156
|
+
name: faseInfo.especialista,
|
|
157
|
+
tone: "Técnico e prático",
|
|
158
|
+
expertise: getExpertiseForPhase(faseInfo.nome),
|
|
159
|
+
instructions: `Você é o especialista de ${faseInfo.nome}. Implemente task por task seguindo a stack definida na Arquitetura. Use os docs de referência para contexto.`,
|
|
160
|
+
},
|
|
161
|
+
progress: {
|
|
162
|
+
current_phase: faseInfo.nome,
|
|
163
|
+
total_phases: estado.total_fases,
|
|
164
|
+
completed_phases: estado.gates_validados?.length || 0,
|
|
165
|
+
percentage: Math.round(((estado.gates_validados?.length || 0) / estado.total_fases) * 100),
|
|
166
|
+
},
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Handler: WORKING — Task por task.
|
|
171
|
+
* Recebe indicação de task concluída, marca done, apresenta próxima.
|
|
172
|
+
*/
|
|
173
|
+
async function handleWorking(args, codeState, faseInfo) {
|
|
174
|
+
const { estado, diretorio, respostas } = args;
|
|
175
|
+
const ide = (estado.ide || detectIDE(diretorio) || 'windsurf');
|
|
176
|
+
const phaseTasks = (estado.tasks || []).filter(t => t.phase === estado.fase_atual);
|
|
177
|
+
// Se respostas indica task concluída
|
|
178
|
+
if (respostas?.task_done === true || respostas?.task_done === 'true') {
|
|
179
|
+
// Encontrar task atual (primeira todo ou in_progress)
|
|
180
|
+
const currentTask = phaseTasks.find(t => (t.type === 'task' || t.type === 'subtask') &&
|
|
181
|
+
(t.status === 'in_progress' || t.status === 'todo') &&
|
|
182
|
+
t.dependencies.every(dep => phaseTasks.some(pt => pt.id === dep && pt.status === 'done')));
|
|
183
|
+
if (currentTask) {
|
|
184
|
+
currentTask.status = 'done';
|
|
185
|
+
currentTask.updated_at = new Date().toISOString();
|
|
186
|
+
console.log(`[code-phase] Task marcada como done: ${currentTask.title}`);
|
|
187
|
+
// Verificar se o parent (story) está completo
|
|
188
|
+
if (currentTask.parent_id) {
|
|
189
|
+
const parent = phaseTasks.find(t => t.id === currentTask.parent_id);
|
|
190
|
+
if (parent) {
|
|
191
|
+
const allChildrenDone = parent.children_ids.every(cid => phaseTasks.some(t => t.id === cid && t.status === 'done'));
|
|
192
|
+
if (allChildrenDone) {
|
|
193
|
+
parent.status = 'done';
|
|
194
|
+
parent.updated_at = new Date().toISOString();
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
// Registrar arquivos criados (se informados nas respostas)
|
|
200
|
+
if (respostas?.arquivos_criados && Array.isArray(respostas.arquivos_criados)) {
|
|
201
|
+
if (!codeState.manifest) {
|
|
202
|
+
codeState.manifest = createEmptyManifest(estado.fase_atual, faseInfo.nome);
|
|
203
|
+
}
|
|
204
|
+
codeState.manifest.arquivos_criados.push(...respostas.arquivos_criados);
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
// Calcular progresso atualizado
|
|
208
|
+
const progress = getTaskProgress(phaseTasks, estado.fase_atual);
|
|
209
|
+
const nextTask = getNextTask(phaseTasks);
|
|
210
|
+
// Se todas as tasks estão done → ir para GATE
|
|
211
|
+
if (!nextTask && progress.total > 0 && progress.done === progress.total) {
|
|
212
|
+
codeState.status = 'gate';
|
|
213
|
+
saveCodePhaseState(estado, codeState);
|
|
214
|
+
await persistState(estado, diretorio);
|
|
215
|
+
return handleGate(args, codeState, faseInfo);
|
|
216
|
+
}
|
|
217
|
+
// Marcar próxima task como in_progress
|
|
218
|
+
if (nextTask && nextTask.status === 'todo') {
|
|
219
|
+
nextTask.status = 'in_progress';
|
|
220
|
+
nextTask.updated_at = new Date().toISOString();
|
|
221
|
+
}
|
|
222
|
+
codeState.currentTaskIndex = progress.done;
|
|
223
|
+
codeState.updatedAt = new Date().toISOString();
|
|
224
|
+
saveCodePhaseState(estado, codeState);
|
|
225
|
+
await persistState(estado, diretorio);
|
|
226
|
+
const taskNum = progress.done + 1;
|
|
227
|
+
const mencoes = buildRelevantMentions(estado, diretorio, faseInfo.nome, ide);
|
|
228
|
+
return {
|
|
229
|
+
content: [{
|
|
230
|
+
type: "text",
|
|
231
|
+
text: `# ${progress.done > 0 ? '✅ Task Anterior Concluída!' : ''} Task ${taskNum}/${progress.total}
|
|
232
|
+
|
|
233
|
+
## 📊 Progresso: ${progress.done}/${progress.total} (${progress.percentage}%)
|
|
234
|
+
${'█'.repeat(Math.floor(progress.percentage / 5))}${'░'.repeat(20 - Math.floor(progress.percentage / 5))} ${progress.percentage}%
|
|
235
|
+
|
|
236
|
+
${nextTask ? `## 📌 Task Atual: ${nextTask.title}
|
|
237
|
+
${nextTask.description}
|
|
238
|
+
|
|
239
|
+
${nextTask.metadata?.acceptance_criteria ? `### Critérios de Aceite\n${nextTask.metadata.acceptance_criteria.map(c => `- [ ] ${c}`).join('\n')}` : ''}
|
|
240
|
+
|
|
241
|
+
${nextTask.metadata?.files ? `### Arquivos Esperados\n${nextTask.metadata.files.map(f => `- \`${f}\``).join('\n')}` : ''}
|
|
242
|
+
` : '> Nenhuma task pendente.'}
|
|
243
|
+
|
|
244
|
+
## 📎 Referência
|
|
245
|
+
${mencoes}
|
|
246
|
+
|
|
247
|
+
---
|
|
248
|
+
|
|
249
|
+
### 🤖 Após implementar esta task:
|
|
250
|
+
|
|
251
|
+
\`\`\`json
|
|
252
|
+
executar({
|
|
253
|
+
"diretorio": "${diretorio}",
|
|
254
|
+
"acao": "avancar",
|
|
255
|
+
"respostas": { "task_done": true }
|
|
256
|
+
})
|
|
257
|
+
\`\`\`
|
|
258
|
+
`,
|
|
259
|
+
}],
|
|
260
|
+
estado_atualizado: serializarEstado(estado).content,
|
|
261
|
+
next_action: {
|
|
262
|
+
tool: "executar",
|
|
263
|
+
description: `Concluir task ${taskNum}/${progress.total}: ${nextTask?.title || 'próxima'}`,
|
|
264
|
+
args_template: { diretorio, acao: "avancar", respostas: { task_done: true } },
|
|
265
|
+
requires_user_input: false,
|
|
266
|
+
},
|
|
267
|
+
};
|
|
268
|
+
}
|
|
269
|
+
/**
|
|
270
|
+
* Handler: GATE — Todas tasks done. Gerar manifest e validar.
|
|
271
|
+
*/
|
|
272
|
+
async function handleGate(args, codeState, faseInfo) {
|
|
273
|
+
const { estado, diretorio } = args;
|
|
274
|
+
const progress = getTaskProgress(estado.tasks || [], estado.fase_atual);
|
|
275
|
+
// Gerar manifest
|
|
276
|
+
const manifest = codeState.manifest || createEmptyManifest(estado.fase_atual, faseInfo.nome);
|
|
277
|
+
manifest.tasks_total = progress.total;
|
|
278
|
+
manifest.tasks_done = progress.done;
|
|
279
|
+
manifest.timestamp = new Date().toISOString();
|
|
280
|
+
// Escanear arquivos criados no diretório do projeto
|
|
281
|
+
const scannedFiles = scanProjectFiles(diretorio, faseInfo.nome);
|
|
282
|
+
manifest.arquivos_criados = [...new Set([...manifest.arquivos_criados, ...scannedFiles])];
|
|
283
|
+
// Salvar manifest
|
|
284
|
+
const faseDirName = getFaseDirName(estado.fase_atual, faseInfo.nome);
|
|
285
|
+
const manifestPath = join(diretorio, 'docs', faseDirName, 'manifest.json');
|
|
286
|
+
const summaryPath = join(diretorio, 'docs', faseDirName, `${faseInfo.nome.toLowerCase()}-summary.md`);
|
|
287
|
+
try {
|
|
288
|
+
await saveFile(manifestPath, JSON.stringify(manifest, null, 2));
|
|
289
|
+
// Gerar resumo markdown
|
|
290
|
+
const summaryContent = generateSummaryMarkdown(manifest, faseInfo, progress);
|
|
291
|
+
await saveFile(summaryPath, summaryContent);
|
|
292
|
+
// Registrar como entregável no estado
|
|
293
|
+
estado.entregaveis[`fase_${estado.fase_atual}`] = summaryPath;
|
|
294
|
+
}
|
|
295
|
+
catch (err) {
|
|
296
|
+
console.warn('[code-phase] Falha ao salvar manifest:', err);
|
|
297
|
+
}
|
|
298
|
+
// Marcar como completed
|
|
299
|
+
codeState.status = 'completed';
|
|
300
|
+
codeState.manifest = manifest;
|
|
301
|
+
saveCodePhaseState(estado, codeState);
|
|
302
|
+
await persistState(estado, diretorio);
|
|
303
|
+
// Delegar para proximo.ts para validar gate e avançar
|
|
304
|
+
return delegateToProximo(args);
|
|
305
|
+
}
|
|
306
|
+
// === HELPER FUNCTIONS ===
|
|
307
|
+
/**
|
|
308
|
+
* Carrega ou inicializa o estado da fase de código.
|
|
309
|
+
*/
|
|
310
|
+
function loadCodePhaseState(estado, faseNumero, faseNome) {
|
|
311
|
+
const existing = estado.codePhaseState;
|
|
312
|
+
if (existing && existing.faseNumero === faseNumero) {
|
|
313
|
+
return existing;
|
|
314
|
+
}
|
|
315
|
+
return {
|
|
316
|
+
status: 'setup',
|
|
317
|
+
faseNumero,
|
|
318
|
+
faseNome,
|
|
319
|
+
tasksGenerated: false,
|
|
320
|
+
currentTaskIndex: 0,
|
|
321
|
+
startedAt: new Date().toISOString(),
|
|
322
|
+
updatedAt: new Date().toISOString(),
|
|
323
|
+
};
|
|
324
|
+
}
|
|
325
|
+
function saveCodePhaseState(estado, codeState) {
|
|
326
|
+
estado.codePhaseState = codeState;
|
|
327
|
+
}
|
|
328
|
+
async function persistState(estado, diretorio) {
|
|
329
|
+
estado.atualizado_em = new Date().toISOString();
|
|
330
|
+
const estadoFile = serializarEstado(estado);
|
|
331
|
+
try {
|
|
332
|
+
await saveFile(`${diretorio}/${estadoFile.path}`, estadoFile.content);
|
|
333
|
+
}
|
|
334
|
+
catch (err) {
|
|
335
|
+
console.error('[code-phase] Erro ao salvar estado:', err);
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
/**
|
|
339
|
+
* Lê um entregável anterior do disco.
|
|
340
|
+
*/
|
|
341
|
+
async function readEntregavel(estado, diretorio, tipo) {
|
|
342
|
+
const entregaveis = estado.entregaveis || {};
|
|
343
|
+
// Buscar no estado por chave parcial
|
|
344
|
+
for (const [key, path] of Object.entries(entregaveis)) {
|
|
345
|
+
const keyLower = key.toLowerCase();
|
|
346
|
+
const pathLower = path.toLowerCase();
|
|
347
|
+
const match = (tipo === 'backlog' && (keyLower.includes('backlog') || pathLower.includes('backlog'))) ||
|
|
348
|
+
(tipo === 'openapi' && (keyLower.includes('api') || pathLower.includes('openapi') || pathLower.includes('.yaml'))) ||
|
|
349
|
+
(tipo === 'arquitetura' && (keyLower.includes('arquitetura') || pathLower.includes('arquitetura')) && !pathLower.includes('avancada')) ||
|
|
350
|
+
(tipo === 'design' && (keyLower.includes('design') || pathLower.includes('design-doc'))) ||
|
|
351
|
+
(tipo === 'banco' && (keyLower.includes('banco') || pathLower.includes('design-banco')));
|
|
352
|
+
if (match) {
|
|
353
|
+
try {
|
|
354
|
+
const content = await readFile(path, 'utf-8');
|
|
355
|
+
if (content && content.trim().length > 50)
|
|
356
|
+
return content;
|
|
357
|
+
}
|
|
358
|
+
catch { /* ignore */ }
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
// Fallback: tentar paths convencionais
|
|
362
|
+
const fallbackPaths = {
|
|
363
|
+
backlog: ['docs/12-backlog/backlog.md', 'docs/fase-12-backlog/backlog.md'],
|
|
364
|
+
openapi: ['docs/13-api/openapi.yaml', 'docs/fase-13-contrato-api/openapi.yaml'],
|
|
365
|
+
arquitetura: ['docs/06-arquitetura/arquitetura.md', 'docs/fase-06-arquitetura/arquitetura.md'],
|
|
366
|
+
design: ['docs/03-ux-design/design-doc.md', 'docs/fase-03-ux-design/design-doc.md'],
|
|
367
|
+
banco: ['docs/fase-05-banco/design-banco.md', 'docs/fase-05-banco-de-dados/design-banco.md'],
|
|
368
|
+
};
|
|
369
|
+
for (const relPath of (fallbackPaths[tipo] || [])) {
|
|
370
|
+
const fullPath = join(diretorio, relPath);
|
|
371
|
+
if (existsSync(fullPath)) {
|
|
372
|
+
try {
|
|
373
|
+
return await readFile(fullPath, 'utf-8');
|
|
374
|
+
}
|
|
375
|
+
catch { /* ignore */ }
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
return null;
|
|
379
|
+
}
|
|
380
|
+
/**
|
|
381
|
+
* Extrai informações de stack da arquitetura.
|
|
382
|
+
*/
|
|
383
|
+
function extractStackInfo(arquiteturaContent, faseNome) {
|
|
384
|
+
if (!arquiteturaContent)
|
|
385
|
+
return '## Stack\n> ⚠️ Documento de Arquitetura não encontrado. Consulte o especialista.';
|
|
386
|
+
const fase = faseNome.toLowerCase();
|
|
387
|
+
const lines = arquiteturaContent.split('\n');
|
|
388
|
+
const stackLines = [];
|
|
389
|
+
let inStackSection = false;
|
|
390
|
+
for (const line of lines) {
|
|
391
|
+
if (line.match(/stack\s+tecnol[oó]gica/i) || line.match(/## \d+\.\s*Stack/i)) {
|
|
392
|
+
inStackSection = true;
|
|
393
|
+
continue;
|
|
394
|
+
}
|
|
395
|
+
if (inStackSection) {
|
|
396
|
+
if (line.match(/^##\s/) && !line.match(/stack/i))
|
|
397
|
+
break;
|
|
398
|
+
if (line.trim().startsWith('-') || line.trim().startsWith('*')) {
|
|
399
|
+
const lower = line.toLowerCase();
|
|
400
|
+
if (fase.includes('frontend') && (lower.includes('frontend') || lower.includes('next') || lower.includes('react') || lower.includes('tailwind'))) {
|
|
401
|
+
stackLines.push(line.trim());
|
|
402
|
+
}
|
|
403
|
+
else if (fase.includes('backend') && (lower.includes('backend') || lower.includes('node') || lower.includes('express') || lower.includes('prisma'))) {
|
|
404
|
+
stackLines.push(line.trim());
|
|
405
|
+
}
|
|
406
|
+
else if (!fase.includes('frontend') && !fase.includes('backend')) {
|
|
407
|
+
stackLines.push(line.trim());
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
if (stackLines.length === 0) {
|
|
413
|
+
// Fallback: buscar menções genéricas de stack
|
|
414
|
+
return `## Stack Definida (Arquitetura)\n> Consulte o documento de Arquitetura para a stack completa.`;
|
|
415
|
+
}
|
|
416
|
+
return `## Stack Definida (Arquitetura)\n${stackLines.join('\n')}`;
|
|
417
|
+
}
|
|
418
|
+
/**
|
|
419
|
+
* Extrai resumo de user stories relevantes do backlog.
|
|
420
|
+
*/
|
|
421
|
+
function extractRelevantStoriesSummary(backlogContent, faseNome) {
|
|
422
|
+
if (!backlogContent)
|
|
423
|
+
return '## 📋 User Stories\n> ⚠️ Backlog não encontrado.';
|
|
424
|
+
const lines = backlogContent.split('\n');
|
|
425
|
+
const stories = [];
|
|
426
|
+
const fase = faseNome.toLowerCase();
|
|
427
|
+
for (const line of lines) {
|
|
428
|
+
const match = line.match(/\|\s*(US-\d+)\s*\|\s*(.+?)\s*\|\s*(\S+)\s*\|\s*\S*\s*\|\s*(\d+)\s*pts?\s*\|/);
|
|
429
|
+
if (match) {
|
|
430
|
+
const [, id, desc, tipo, pts] = match;
|
|
431
|
+
const tipoLower = tipo.toLowerCase();
|
|
432
|
+
const isRelevant = (fase.includes('frontend') && tipoLower.includes('fe')) ||
|
|
433
|
+
(fase.includes('backend') && tipoLower.includes('be')) ||
|
|
434
|
+
(fase.includes('integra') && (tipoLower.includes('integra') || tipoLower.includes('fe+be'))) ||
|
|
435
|
+
(!fase.includes('frontend') && !fase.includes('backend') && !fase.includes('integra'));
|
|
436
|
+
if (isRelevant) {
|
|
437
|
+
stories.push(`| ${id} | ${desc.trim().substring(0, 60)} | ${tipo} | ${pts}pts |`);
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
if (stories.length === 0)
|
|
442
|
+
return '## 📋 User Stories\n> Nenhuma US específica encontrada para esta fase.';
|
|
443
|
+
return `## 📋 User Stories para ${faseNome}\n\n| ID | Descrição | Tipo | Pts |\n|---|---|---|---|\n${stories.join('\n')}`;
|
|
444
|
+
}
|
|
445
|
+
/**
|
|
446
|
+
* Extrai resumo de endpoints do OpenAPI.
|
|
447
|
+
*/
|
|
448
|
+
function extractEndpointsSummary(openApiContent, faseNome) {
|
|
449
|
+
if (!openApiContent)
|
|
450
|
+
return '';
|
|
451
|
+
const fase = faseNome.toLowerCase();
|
|
452
|
+
const lines = openApiContent.split('\n');
|
|
453
|
+
const endpoints = [];
|
|
454
|
+
let currentPath = '';
|
|
455
|
+
for (const line of lines) {
|
|
456
|
+
const pathMatch = line.match(/^ (\/\S+):$/);
|
|
457
|
+
if (pathMatch) {
|
|
458
|
+
currentPath = pathMatch[1];
|
|
459
|
+
continue;
|
|
460
|
+
}
|
|
461
|
+
const methodMatch = line.match(/^\s{4}(get|post|put|delete|patch):$/);
|
|
462
|
+
if (methodMatch && currentPath) {
|
|
463
|
+
endpoints.push(`\`${methodMatch[1].toUpperCase()} ${currentPath}\``);
|
|
464
|
+
}
|
|
465
|
+
}
|
|
466
|
+
if (endpoints.length === 0)
|
|
467
|
+
return '';
|
|
468
|
+
const verb = fase.includes('frontend') ? 'consumir' : fase.includes('backend') ? 'implementar' : 'integrar';
|
|
469
|
+
return `## 🔗 Endpoints para ${verb}\n${endpoints.join(' · ')}`;
|
|
470
|
+
}
|
|
471
|
+
/**
|
|
472
|
+
* Gera menções de arquivo para documentos relevantes à fase.
|
|
473
|
+
*/
|
|
474
|
+
function buildRelevantMentions(estado, diretorio, faseNome, ide) {
|
|
475
|
+
const mencoes = [];
|
|
476
|
+
const entregaveis = estado.entregaveis || {};
|
|
477
|
+
const fase = faseNome.toLowerCase();
|
|
478
|
+
// Documentos sempre relevantes para código
|
|
479
|
+
const relevantKeys = ['backlog', 'api', 'contrato', 'arquitetura'];
|
|
480
|
+
if (fase.includes('frontend'))
|
|
481
|
+
relevantKeys.push('design', 'ux');
|
|
482
|
+
if (fase.includes('backend'))
|
|
483
|
+
relevantKeys.push('banco', 'dominio', 'modelo', 'seguranca');
|
|
484
|
+
if (fase.includes('integra'))
|
|
485
|
+
relevantKeys.push('testes');
|
|
486
|
+
for (const [key, absPath] of Object.entries(entregaveis)) {
|
|
487
|
+
const kl = key.toLowerCase();
|
|
488
|
+
const pl = absPath.toLowerCase();
|
|
489
|
+
if (relevantKeys.some(rk => kl.includes(rk) || pl.includes(rk))) {
|
|
490
|
+
const relPath = absPath
|
|
491
|
+
.replace(diretorio.replace(/\\/g, '/'), '')
|
|
492
|
+
.replace(diretorio, '')
|
|
493
|
+
.replace(/^[\\/]+/, '');
|
|
494
|
+
mencoes.push(`- ${formatMention(relPath.replace(/\\/g, '/'), ide)}`);
|
|
495
|
+
}
|
|
496
|
+
}
|
|
497
|
+
return mencoes.length > 0 ? mencoes.join('\n') : '> Nenhum documento de referência encontrado.';
|
|
498
|
+
}
|
|
499
|
+
/**
|
|
500
|
+
* Escaneia arquivos de código criados no projeto.
|
|
501
|
+
*/
|
|
502
|
+
function scanProjectFiles(diretorio, faseNome) {
|
|
503
|
+
const fase = faseNome.toLowerCase();
|
|
504
|
+
const files = [];
|
|
505
|
+
const dirsToScan = [];
|
|
506
|
+
if (fase.includes('frontend'))
|
|
507
|
+
dirsToScan.push('frontend', 'src', 'app', 'pages', 'components');
|
|
508
|
+
if (fase.includes('backend'))
|
|
509
|
+
dirsToScan.push('backend', 'server', 'api', 'src');
|
|
510
|
+
if (fase.includes('integra'))
|
|
511
|
+
dirsToScan.push('tests', 'e2e', '__tests__');
|
|
512
|
+
for (const dir of dirsToScan) {
|
|
513
|
+
const fullPath = join(diretorio, dir);
|
|
514
|
+
if (existsSync(fullPath)) {
|
|
515
|
+
files.push(dir + '/');
|
|
516
|
+
}
|
|
517
|
+
}
|
|
518
|
+
return files;
|
|
519
|
+
}
|
|
520
|
+
function createEmptyManifest(fase, nome) {
|
|
521
|
+
return {
|
|
522
|
+
fase,
|
|
523
|
+
nome,
|
|
524
|
+
stack: { framework: '', language: 'TypeScript' },
|
|
525
|
+
user_stories: [],
|
|
526
|
+
tasks_total: 0,
|
|
527
|
+
tasks_done: 0,
|
|
528
|
+
arquivos_criados: [],
|
|
529
|
+
timestamp: new Date().toISOString(),
|
|
530
|
+
};
|
|
531
|
+
}
|
|
532
|
+
function generateSummaryMarkdown(manifest, faseInfo, progress) {
|
|
533
|
+
return `# ${faseInfo.nome} — Resumo de Implementação
|
|
534
|
+
|
|
535
|
+
## Progresso
|
|
536
|
+
- **Tasks:** ${progress.done}/${progress.total} (${progress.percentage}%)
|
|
537
|
+
- **Arquivos criados:** ${manifest.arquivos_criados.length}
|
|
538
|
+
|
|
539
|
+
## User Stories
|
|
540
|
+
${manifest.user_stories.map(s => `- ${s.status === 'done' ? '✅' : '⏳'} **${s.id}**: ${s.titulo}`).join('\n') || '(geradas via TaskDecomposer)'}
|
|
541
|
+
|
|
542
|
+
## Arquivos Criados
|
|
543
|
+
${manifest.arquivos_criados.map(f => `- \`${f}\``).join('\n') || '(nenhum registrado)'}
|
|
544
|
+
|
|
545
|
+
## Timestamp
|
|
546
|
+
${manifest.timestamp}
|
|
547
|
+
`;
|
|
548
|
+
}
|
|
549
|
+
function getExpertiseForPhase(faseNome) {
|
|
550
|
+
const fase = faseNome.toLowerCase();
|
|
551
|
+
if (fase.includes('frontend'))
|
|
552
|
+
return ['React', 'Next.js', 'TypeScript', 'componentes', 'responsividade', 'acessibilidade'];
|
|
553
|
+
if (fase.includes('backend'))
|
|
554
|
+
return ['Node.js', 'Express', 'REST API', 'banco de dados', 'autenticação', 'testes'];
|
|
555
|
+
if (fase.includes('integra'))
|
|
556
|
+
return ['E2E testing', 'CORS', 'CI/CD', 'Docker', 'monitoramento'];
|
|
557
|
+
if (fase.includes('deploy'))
|
|
558
|
+
return ['DevOps', 'CI/CD', 'AWS', 'Docker', 'monitoramento', 'deploy'];
|
|
559
|
+
return ['desenvolvimento', 'arquitetura', 'testes'];
|
|
560
|
+
}
|
|
561
|
+
/**
|
|
562
|
+
* Delega para proximo.ts para validar gate e avançar fase.
|
|
563
|
+
* Gera um entregável textual resumido a partir do manifest.
|
|
564
|
+
*/
|
|
565
|
+
async function delegateToProximo(args) {
|
|
566
|
+
const { estado, diretorio } = args;
|
|
567
|
+
const codeState = estado.codePhaseState;
|
|
568
|
+
const manifest = codeState?.manifest;
|
|
569
|
+
// Gerar entregável textual a partir do manifest para o proximo.ts validar
|
|
570
|
+
const entregavelTexto = manifest
|
|
571
|
+
? generateSummaryMarkdown(manifest, { nome: codeState?.faseNome || '' }, getTaskProgress(estado.tasks || [], estado.fase_atual))
|
|
572
|
+
: 'Fase de código concluída. Manifest não gerado.';
|
|
573
|
+
// Importar proximo.ts e delegar
|
|
574
|
+
const { proximo } = await import("../tools/proximo.js");
|
|
575
|
+
return proximo({
|
|
576
|
+
diretorio,
|
|
577
|
+
estado_json: serializarEstado(estado).content,
|
|
578
|
+
entregavel: entregavelTexto,
|
|
579
|
+
});
|
|
580
|
+
}
|
|
581
|
+
//# sourceMappingURL=code-phase-handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"code-phase-handler.js","sourceRoot":"","sources":["../../src/handlers/code-phase-handler.ts"],"names":[],"mappings":"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"}
|
|
@@ -119,7 +119,7 @@ async function buildSpecialistPrompt(diretorio) {
|
|
|
119
119
|
const skillName = getSkillParaFase(faseInfo.nome);
|
|
120
120
|
if (skillName) {
|
|
121
121
|
const ide = estado.ide || detectIDE(diretorio) || 'windsurf';
|
|
122
|
-
const hydrationCommand = formatSkillHydrationCommand(skillName, ide);
|
|
122
|
+
const hydrationCommand = formatSkillHydrationCommand(skillName, ide, diretorio);
|
|
123
123
|
const specialist = getSpecialistPersona(faseInfo.nome);
|
|
124
124
|
return {
|
|
125
125
|
description: `Especialista: ${specialist?.name || faseInfo.nome} — Fase ${estado.fase_atual}/${estado.total_fases}`,
|
|
@@ -372,7 +372,7 @@ ${toolsList}`,
|
|
|
372
372
|
const skillName = getSkillParaFase(faseInfo.nome);
|
|
373
373
|
if (skillName) {
|
|
374
374
|
const ide = estado.ide || detectIDE(diretorio) || 'windsurf';
|
|
375
|
-
const hydrationCommand = formatSkillHydrationCommand(skillName, ide);
|
|
375
|
+
const hydrationCommand = formatSkillHydrationCommand(skillName, ide, diretorio);
|
|
376
376
|
sessionContent += `## 📚 Skill da Fase\n\n${hydrationCommand}\n\n`;
|
|
377
377
|
}
|
|
378
378
|
}
|