Como orquestrar tasks paralelas em waves usando WaveExecutor
Skill para executar múltiplas tasks em paralelo, respeitando dependências.
cli/src/orchestration/WaveExecutor.ts - WaveExecutor
São tasks independentes?
├─ NÃO → Executar sequencialmente
└─ SIM → Podem ser decompostas em domínios claros?
├─ NÃO → Executar sequencialmente
└─ SIM → 2+ problemas independentes?
├─ NÃO → Single task
└─ SIM → ✅ WAVE CODING
import { WaveTask } from '../orchestration/wave-types.js';
const tasks: WaveTask[] = [
// Wave 1 - Sem dependências (paralelo)
{
id: 'create-module-a',
name: 'Create Module A',
description: 'Implement feature A',
execute: async () => { /* implementation */ },
},
{
id: 'create-module-b',
name: 'Create Module B',
description: 'Implement feature B',
execute: async () => { /* implementation */ },
},
// Wave 2 - Depende de Wave 1
{
id: 'integration-tests',
name: 'Integration Tests',
description: 'Test A and B together',
dependsOn: ['create-module-a', 'create-module-b'],
execute: async () => { /* tests */ },
},
];
import { createWaveExecutor } from '../orchestration/WaveExecutor.js';
const executor = createWaveExecutor({
maxConcurrent: 3, // Max tasks paralelas
stopOnFirstFailure: true, // Para se qualquer falhar
});
const result = await executor.execute(tasks);
if (result.success) {
console.log(`Completed in ${result.totalDuration}ms`);
} else {
console.log('Failed tasks:', result.failedTasks);
}
O executor agrupa automaticamente:
Wave 1: [A, B] ← Sem dependências, paralelo
Wave 2: [C] ← Depende de A e B
Wave 3: [D, E] ← Dependem de C, paralelo
| Opção | Default | Descrição |
|---|---|---|
maxConcurrent | 5 | Máximo de tasks paralelas |
stopOnFirstFailure | true | Para execução se alguma falhar |
const skillTasks: WaveTask[] = [
// Wave 1 - Paralelo
{ id: 'handoff-skill', name: 'Handoff Skill', execute: createHandoffSkill },
{ id: 'wave-coding-skill', name: 'Wave Coding Skill', execute: createWaveCodingSkill },
// Wave 2 - Depende de Wave 1
{
id: 'update-activation-map',
name: 'Update SKILL_ACTIVATION_MAP',
dependsOn: ['handoff-skill', 'wave-coding-skill'],
execute: updateActivationMap,
},
];
❌ NUNCA:
stopOnFirstFailure para tasks críticasmaxConcurrent muito alto (esgota recursos)O WaveExecutor emite ThoughtEvents:
reasoning: Início de cada wavetool_call: Início de cada tasktool_result: Conclusão de cada taskdecision: Resultado final