omgkit 2.2.0 → 2.3.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/package.json +1 -1
- package/plugin/skills/databases/mongodb/SKILL.md +60 -776
- package/plugin/skills/databases/prisma/SKILL.md +53 -744
- package/plugin/skills/databases/redis/SKILL.md +53 -860
- package/plugin/skills/devops/aws/SKILL.md +68 -672
- package/plugin/skills/devops/github-actions/SKILL.md +54 -657
- package/plugin/skills/devops/kubernetes/SKILL.md +67 -602
- package/plugin/skills/devops/performance-profiling/SKILL.md +59 -863
- package/plugin/skills/frameworks/django/SKILL.md +87 -853
- package/plugin/skills/frameworks/express/SKILL.md +95 -1301
- package/plugin/skills/frameworks/fastapi/SKILL.md +90 -1198
- package/plugin/skills/frameworks/laravel/SKILL.md +87 -1187
- package/plugin/skills/frameworks/nestjs/SKILL.md +106 -973
- package/plugin/skills/frameworks/react/SKILL.md +94 -962
- package/plugin/skills/frameworks/vue/SKILL.md +95 -1242
- package/plugin/skills/frontend/accessibility/SKILL.md +91 -1056
- package/plugin/skills/frontend/frontend-design/SKILL.md +69 -1262
- package/plugin/skills/frontend/responsive/SKILL.md +76 -799
- package/plugin/skills/frontend/shadcn-ui/SKILL.md +73 -921
- package/plugin/skills/frontend/tailwindcss/SKILL.md +60 -788
- package/plugin/skills/frontend/threejs/SKILL.md +72 -1266
- package/plugin/skills/languages/javascript/SKILL.md +106 -849
- package/plugin/skills/methodology/brainstorming/SKILL.md +70 -576
- package/plugin/skills/methodology/defense-in-depth/SKILL.md +79 -831
- package/plugin/skills/methodology/dispatching-parallel-agents/SKILL.md +81 -654
- package/plugin/skills/methodology/executing-plans/SKILL.md +86 -529
- package/plugin/skills/methodology/finishing-development-branch/SKILL.md +95 -586
- package/plugin/skills/methodology/problem-solving/SKILL.md +67 -681
- package/plugin/skills/methodology/receiving-code-review/SKILL.md +70 -533
- package/plugin/skills/methodology/requesting-code-review/SKILL.md +70 -610
- package/plugin/skills/methodology/root-cause-tracing/SKILL.md +70 -646
- package/plugin/skills/methodology/sequential-thinking/SKILL.md +70 -478
- package/plugin/skills/methodology/systematic-debugging/SKILL.md +66 -559
- package/plugin/skills/methodology/test-driven-development/SKILL.md +91 -752
- package/plugin/skills/methodology/testing-anti-patterns/SKILL.md +78 -687
- package/plugin/skills/methodology/token-optimization/SKILL.md +72 -602
- package/plugin/skills/methodology/verification-before-completion/SKILL.md +108 -529
- package/plugin/skills/methodology/writing-plans/SKILL.md +79 -566
- package/plugin/skills/omega/omega-architecture/SKILL.md +91 -752
- package/plugin/skills/omega/omega-coding/SKILL.md +161 -552
- package/plugin/skills/omega/omega-sprint/SKILL.md +132 -777
- package/plugin/skills/omega/omega-testing/SKILL.md +157 -845
- package/plugin/skills/omega/omega-thinking/SKILL.md +165 -606
- package/plugin/skills/security/better-auth/SKILL.md +46 -1034
- package/plugin/skills/security/oauth/SKILL.md +80 -934
- package/plugin/skills/security/owasp/SKILL.md +78 -862
- package/plugin/skills/testing/playwright/SKILL.md +77 -700
- package/plugin/skills/testing/pytest/SKILL.md +73 -811
- package/plugin/skills/testing/vitest/SKILL.md +60 -920
- package/plugin/skills/tools/document-processing/SKILL.md +111 -838
- package/plugin/skills/tools/image-processing/SKILL.md +126 -659
- package/plugin/skills/tools/mcp-development/SKILL.md +85 -758
- package/plugin/skills/tools/media-processing/SKILL.md +118 -735
- package/plugin/stdrules/SKILL_STANDARDS.md +490 -0
- package/plugin/skills/SKILL_STANDARDS.md +0 -743
|
@@ -1,677 +1,104 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: dispatching-parallel-agents
|
|
3
|
-
description:
|
|
4
|
-
category: methodology
|
|
5
|
-
triggers:
|
|
6
|
-
- parallel agents
|
|
7
|
-
- concurrent execution
|
|
8
|
-
- agent orchestration
|
|
9
|
-
- spawn agents
|
|
10
|
-
- parallel tasks
|
|
11
|
-
- multi-agent
|
|
12
|
-
- task parallelization
|
|
3
|
+
description: AI agent orchestrates parallel task execution through concurrent specialized agents for maximum efficiency. Use when tasks can run independently, multi-concern reviews, or parallel exploration.
|
|
13
4
|
---
|
|
14
5
|
|
|
15
6
|
# Dispatching Parallel Agents
|
|
16
7
|
|
|
17
|
-
|
|
8
|
+
## Quick Start
|
|
18
9
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
-
|
|
24
|
-
-
|
|
25
|
-
- Reduce total execution time significantly
|
|
26
|
-
- Maintain coordination between parallel tasks
|
|
27
|
-
- Aggregate results from multiple agents
|
|
28
|
-
- Handle failures gracefully in parallel execution
|
|
29
|
-
- Balance parallelism with resource constraints
|
|
10
|
+
1. **Analyze** - Identify independent vs dependent tasks
|
|
11
|
+
2. **Group** - Create parallel groups with no shared dependencies
|
|
12
|
+
3. **Specialize** - Assign agents by expertise (explorer, implementer, reviewer)
|
|
13
|
+
4. **Dispatch** - Fan-out tasks with timeouts and concurrency limits
|
|
14
|
+
5. **Aggregate** - Combine results using merge, consensus, or priority
|
|
15
|
+
6. **Handle Errors** - Retry failed, continue with partial, or fail-fast
|
|
30
16
|
|
|
31
17
|
## Features
|
|
32
18
|
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
│ │
|
|
42
|
-
│ ┌─────────────────────┐ │
|
|
43
|
-
│ │ Main Agent │ │
|
|
44
|
-
│ │ (Orchestrator) │ │
|
|
45
|
-
│ └──────────┬──────────┘ │
|
|
46
|
-
│ │ │
|
|
47
|
-
│ ┌──────────┴──────────┐ │
|
|
48
|
-
│ │ Task Analysis │ │
|
|
49
|
-
│ │ & Distribution │ │
|
|
50
|
-
│ └──────────┬──────────┘ │
|
|
51
|
-
│ │ │
|
|
52
|
-
│ ┌─────────────────────┼─────────────────────┐ │
|
|
53
|
-
│ │ │ │ │
|
|
54
|
-
│ ▼ ▼ ▼ │
|
|
55
|
-
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
|
|
56
|
-
│ │ Agent A │ │ Agent B │ │ Agent C │ │
|
|
57
|
-
│ │ (Task 1)│ │ (Task 2)│ │ (Task 3)│ │
|
|
58
|
-
│ └────┬────┘ └────┬────┘ └────┬────┘ │
|
|
59
|
-
│ │ │ │ │
|
|
60
|
-
│ │ Result A │ Result B │ Result C │
|
|
61
|
-
│ │ │ │ │
|
|
62
|
-
│ └─────────────────────┼─────────────────────┘ │
|
|
63
|
-
│ │ │
|
|
64
|
-
│ ┌──────────┴──────────┐ │
|
|
65
|
-
│ │ Aggregation & │ │
|
|
66
|
-
│ │ Integration │ │
|
|
67
|
-
│ └──────────┬──────────┘ │
|
|
68
|
-
│ │ │
|
|
69
|
-
│ ┌──────────┴──────────┐ │
|
|
70
|
-
│ │ Final Response │ │
|
|
71
|
-
│ └─────────────────────┘ │
|
|
72
|
-
│ │
|
|
73
|
-
│ TIMING COMPARISON: │
|
|
74
|
-
│ Sequential: ████████████████████████████ (Task1 + Task2 + Task3) │
|
|
75
|
-
│ Parallel: ████████████ (max(Task1, Task2, Task3)) │
|
|
76
|
-
│ │
|
|
77
|
-
└─────────────────────────────────────────────────────────────────────────┘
|
|
78
|
-
```
|
|
79
|
-
|
|
80
|
-
### 2. Task Parallelization Analysis
|
|
81
|
-
|
|
82
|
-
```typescript
|
|
83
|
-
/**
|
|
84
|
-
* Determine which tasks can run in parallel
|
|
85
|
-
*/
|
|
86
|
-
|
|
87
|
-
interface Task {
|
|
88
|
-
id: string;
|
|
89
|
-
description: string;
|
|
90
|
-
dependencies: string[];
|
|
91
|
-
resources: string[];
|
|
92
|
-
estimatedDuration: number;
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
interface ParallelizationAnalysis {
|
|
96
|
-
canParallelize: boolean;
|
|
97
|
-
reason: string;
|
|
98
|
-
suggestedGroups: Task[][];
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
function analyzeParallelization(tasks: Task[]): ParallelizationAnalysis {
|
|
102
|
-
// Build dependency graph
|
|
103
|
-
const dependencyGraph = buildDependencyGraph(tasks);
|
|
19
|
+
| Feature | Description | Guide |
|
|
20
|
+
|---------|-------------|-------|
|
|
21
|
+
| Task Analysis | Identify parallelizable work | No data deps, no shared files, no state |
|
|
22
|
+
| Agent Specialization | Match agent type to task | Explorer, implementer, tester, reviewer |
|
|
23
|
+
| Fan-Out/Fan-In | Parallel dispatch and aggregation | Promise.all for dispatch, merge results |
|
|
24
|
+
| Concurrency Limits | Control parallel agent count | Prevent resource exhaustion |
|
|
25
|
+
| Timeout Handling | Bound execution time per agent | Race with timeout, handle gracefully |
|
|
26
|
+
| Error Strategies | Handle partial failures | Retry, continue, or fail-fast |
|
|
104
27
|
|
|
105
|
-
|
|
106
|
-
const groups = findIndependentGroups(dependencyGraph);
|
|
28
|
+
## Common Patterns
|
|
107
29
|
|
|
108
|
-
// Check for resource conflicts
|
|
109
|
-
const resourceConflicts = findResourceConflicts(tasks);
|
|
110
|
-
|
|
111
|
-
if (groups.length === 1 && groups[0].length === tasks.length) {
|
|
112
|
-
return {
|
|
113
|
-
canParallelize: false,
|
|
114
|
-
reason: 'All tasks have sequential dependencies',
|
|
115
|
-
suggestedGroups: [tasks]
|
|
116
|
-
};
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
return {
|
|
120
|
-
canParallelize: true,
|
|
121
|
-
reason: `Found ${groups.length} independent task groups`,
|
|
122
|
-
suggestedGroups: groups
|
|
123
|
-
};
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
// Parallelization criteria
|
|
127
|
-
const parallelizationCriteria = {
|
|
128
|
-
canParallelize: [
|
|
129
|
-
'Independent code changes (different files)',
|
|
130
|
-
'Research tasks on different topics',
|
|
131
|
-
'Tests for different modules',
|
|
132
|
-
'Documentation for different features',
|
|
133
|
-
'Analysis of separate concerns'
|
|
134
|
-
],
|
|
135
|
-
|
|
136
|
-
cannotParallelize: [
|
|
137
|
-
'Tasks with data dependencies',
|
|
138
|
-
'Sequential workflow steps',
|
|
139
|
-
'Tasks modifying same files',
|
|
140
|
-
'Tasks sharing mutable state',
|
|
141
|
-
'Order-dependent operations'
|
|
142
|
-
],
|
|
143
|
-
|
|
144
|
-
requiresCoordination: [
|
|
145
|
-
'Shared configuration files',
|
|
146
|
-
'Database schema changes',
|
|
147
|
-
'API contract changes',
|
|
148
|
-
'Merge operations'
|
|
149
|
-
]
|
|
150
|
-
};
|
|
151
30
|
```
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
return aggregator(results);
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
// Example: Parallel code review
|
|
176
|
-
const codeReviewResult = await fanOutFanIn(
|
|
177
|
-
['security', 'performance', 'style'],
|
|
178
|
-
async (concern) => {
|
|
179
|
-
const agent = await spawnAgent({
|
|
180
|
-
type: 'code-reviewer',
|
|
181
|
-
focus: concern,
|
|
182
|
-
files: changedFiles
|
|
183
|
-
});
|
|
184
|
-
return agent.getResults();
|
|
185
|
-
},
|
|
186
|
-
(reviews) => combineReviews(reviews)
|
|
187
|
-
);
|
|
188
|
-
|
|
189
|
-
// Pattern 2: Parallel with timeout
|
|
190
|
-
async function parallelWithTimeout<T>(
|
|
191
|
-
tasks: Array<() => Promise<T>>,
|
|
192
|
-
timeoutMs: number
|
|
193
|
-
): Promise<SettledResult<T>[]> {
|
|
194
|
-
const wrappedTasks = tasks.map(task =>
|
|
195
|
-
Promise.race([
|
|
196
|
-
task().then(value => ({ status: 'fulfilled', value })),
|
|
197
|
-
timeout(timeoutMs).then(() => ({
|
|
198
|
-
status: 'rejected',
|
|
199
|
-
reason: 'Timeout exceeded'
|
|
200
|
-
}))
|
|
201
|
-
])
|
|
202
|
-
);
|
|
203
|
-
|
|
204
|
-
return Promise.all(wrappedTasks);
|
|
205
|
-
}
|
|
206
|
-
|
|
207
|
-
// Pattern 3: Parallel with concurrency limit
|
|
208
|
-
async function parallelWithLimit<T, R>(
|
|
209
|
-
items: T[],
|
|
210
|
-
processor: (item: T) => Promise<R>,
|
|
211
|
-
concurrencyLimit: number
|
|
212
|
-
): Promise<R[]> {
|
|
213
|
-
const results: R[] = [];
|
|
214
|
-
const executing: Promise<void>[] = [];
|
|
215
|
-
|
|
216
|
-
for (const item of items) {
|
|
217
|
-
const promise = processor(item).then(result => {
|
|
218
|
-
results.push(result);
|
|
219
|
-
});
|
|
220
|
-
|
|
221
|
-
executing.push(promise);
|
|
222
|
-
|
|
223
|
-
if (executing.length >= concurrencyLimit) {
|
|
224
|
-
await Promise.race(executing);
|
|
225
|
-
// Remove completed promises
|
|
226
|
-
executing.splice(
|
|
227
|
-
executing.findIndex(p => p === promise),
|
|
228
|
-
1
|
|
229
|
-
);
|
|
230
|
-
}
|
|
231
|
-
}
|
|
232
|
-
|
|
233
|
-
await Promise.all(executing);
|
|
234
|
-
return results;
|
|
235
|
-
}
|
|
236
|
-
|
|
237
|
-
// Pattern 4: Dependent parallel groups
|
|
238
|
-
async function executeInWaves(taskGroups: Task[][]): Promise<void> {
|
|
239
|
-
for (const group of taskGroups) {
|
|
240
|
-
// Execute all tasks in this wave in parallel
|
|
241
|
-
await Promise.all(
|
|
242
|
-
group.map(task => executeTask(task))
|
|
243
|
-
);
|
|
244
|
-
// Next wave depends on this wave completing
|
|
245
|
-
}
|
|
246
|
-
}
|
|
247
|
-
```
|
|
248
|
-
|
|
249
|
-
### 4. Agent Specialization
|
|
250
|
-
|
|
251
|
-
```typescript
|
|
252
|
-
/**
|
|
253
|
-
* Dispatch specialized agents for different concerns
|
|
254
|
-
*/
|
|
255
|
-
|
|
256
|
-
type AgentType =
|
|
257
|
-
| 'explorer' // Codebase exploration
|
|
258
|
-
| 'implementer' // Code writing
|
|
259
|
-
| 'tester' // Test creation
|
|
260
|
-
| 'reviewer' // Code review
|
|
261
|
-
| 'documenter' // Documentation
|
|
262
|
-
| 'debugger' // Bug investigation
|
|
263
|
-
| 'researcher'; // Information gathering
|
|
264
|
-
|
|
265
|
-
interface AgentConfig {
|
|
266
|
-
type: AgentType;
|
|
267
|
-
prompt: string;
|
|
268
|
-
context?: string;
|
|
269
|
-
timeout?: number;
|
|
270
|
-
priority?: 'high' | 'normal' | 'low';
|
|
271
|
-
}
|
|
272
|
-
|
|
273
|
-
// Agent specialization examples
|
|
274
|
-
const agentSpecializations = {
|
|
275
|
-
explorer: {
|
|
276
|
-
strengths: [
|
|
277
|
-
'Understanding codebase structure',
|
|
278
|
-
'Finding relevant files',
|
|
279
|
-
'Mapping dependencies'
|
|
280
|
-
],
|
|
281
|
-
bestFor: [
|
|
282
|
-
'Initial project exploration',
|
|
283
|
-
'Finding implementation locations',
|
|
284
|
-
'Understanding patterns'
|
|
285
|
-
],
|
|
286
|
-
prompt_template: `
|
|
287
|
-
Explore the codebase to answer: {question}
|
|
288
|
-
Focus on: {focus_areas}
|
|
289
|
-
Return: File paths, key functions, relationships
|
|
290
|
-
`
|
|
291
|
-
},
|
|
292
|
-
|
|
293
|
-
implementer: {
|
|
294
|
-
strengths: [
|
|
295
|
-
'Writing production code',
|
|
296
|
-
'Following patterns',
|
|
297
|
-
'Complete implementations'
|
|
298
|
-
],
|
|
299
|
-
bestFor: [
|
|
300
|
-
'Feature implementation',
|
|
301
|
-
'Bug fixes',
|
|
302
|
-
'Refactoring'
|
|
303
|
-
],
|
|
304
|
-
prompt_template: `
|
|
305
|
-
Implement: {feature_description}
|
|
306
|
-
Context: {existing_code}
|
|
307
|
-
Requirements: {requirements}
|
|
308
|
-
Return: Complete, tested code
|
|
309
|
-
`
|
|
310
|
-
},
|
|
311
|
-
|
|
312
|
-
tester: {
|
|
313
|
-
strengths: [
|
|
314
|
-
'Test case design',
|
|
315
|
-
'Edge case identification',
|
|
316
|
-
'Coverage analysis'
|
|
317
|
-
],
|
|
318
|
-
bestFor: [
|
|
319
|
-
'Unit test creation',
|
|
320
|
-
'Integration test design',
|
|
321
|
-
'Test strategy planning'
|
|
322
|
-
],
|
|
323
|
-
prompt_template: `
|
|
324
|
-
Create tests for: {code_under_test}
|
|
325
|
-
Coverage requirements: {coverage_target}
|
|
326
|
-
Focus on: {critical_paths}
|
|
327
|
-
Return: Test files with assertions
|
|
328
|
-
`
|
|
329
|
-
},
|
|
330
|
-
|
|
331
|
-
reviewer: {
|
|
332
|
-
strengths: [
|
|
333
|
-
'Issue identification',
|
|
334
|
-
'Best practice enforcement',
|
|
335
|
-
'Security analysis'
|
|
336
|
-
],
|
|
337
|
-
bestFor: [
|
|
338
|
-
'Code review',
|
|
339
|
-
'Security audit',
|
|
340
|
-
'Performance review'
|
|
341
|
-
],
|
|
342
|
-
prompt_template: `
|
|
343
|
-
Review this code for: {review_focus}
|
|
344
|
-
Standards: {coding_standards}
|
|
345
|
-
Return: Issues with severity and fixes
|
|
346
|
-
`
|
|
347
|
-
}
|
|
348
|
-
};
|
|
349
|
-
```
|
|
350
|
-
|
|
351
|
-
### 5. Result Aggregation
|
|
352
|
-
|
|
353
|
-
```typescript
|
|
354
|
-
/**
|
|
355
|
-
* Aggregate results from parallel agents
|
|
356
|
-
*/
|
|
357
|
-
|
|
358
|
-
interface AgentResult {
|
|
359
|
-
agentId: string;
|
|
360
|
-
agentType: AgentType;
|
|
361
|
-
status: 'success' | 'partial' | 'failed';
|
|
362
|
-
data: unknown;
|
|
363
|
-
duration: number;
|
|
364
|
-
tokensUsed: number;
|
|
365
|
-
}
|
|
366
|
-
|
|
367
|
-
class ResultAggregator {
|
|
368
|
-
private results: AgentResult[] = [];
|
|
369
|
-
|
|
370
|
-
addResult(result: AgentResult): void {
|
|
371
|
-
this.results.push(result);
|
|
372
|
-
}
|
|
373
|
-
|
|
374
|
-
// Aggregation strategies
|
|
375
|
-
aggregateByMerge(): MergedResult {
|
|
376
|
-
// Combine all results into one
|
|
377
|
-
return {
|
|
378
|
-
allIssues: this.results.flatMap(r => r.data.issues || []),
|
|
379
|
-
allSuggestions: this.results.flatMap(r => r.data.suggestions || []),
|
|
380
|
-
summary: this.generateSummary()
|
|
381
|
-
};
|
|
382
|
-
}
|
|
383
|
-
|
|
384
|
-
aggregateByConsensus<T>(extractor: (r: AgentResult) => T): T | null {
|
|
385
|
-
// Find consensus among agents
|
|
386
|
-
const values = this.results.map(extractor);
|
|
387
|
-
const counts = new Map<string, number>();
|
|
388
|
-
|
|
389
|
-
for (const value of values) {
|
|
390
|
-
const key = JSON.stringify(value);
|
|
391
|
-
counts.set(key, (counts.get(key) || 0) + 1);
|
|
392
|
-
}
|
|
393
|
-
|
|
394
|
-
// Return most common result
|
|
395
|
-
let maxCount = 0;
|
|
396
|
-
let consensus: T | null = null;
|
|
397
|
-
|
|
398
|
-
for (const [key, count] of counts) {
|
|
399
|
-
if (count > maxCount) {
|
|
400
|
-
maxCount = count;
|
|
401
|
-
consensus = JSON.parse(key);
|
|
402
|
-
}
|
|
403
|
-
}
|
|
404
|
-
|
|
405
|
-
return consensus;
|
|
406
|
-
}
|
|
407
|
-
|
|
408
|
-
aggregateByPriority(): PrioritizedResult {
|
|
409
|
-
// Sort results by agent priority/expertise
|
|
410
|
-
const sorted = this.results.sort((a, b) =>
|
|
411
|
-
getAgentPriority(a.agentType) - getAgentPriority(b.agentType)
|
|
412
|
-
);
|
|
413
|
-
|
|
414
|
-
return {
|
|
415
|
-
primary: sorted[0].data,
|
|
416
|
-
supporting: sorted.slice(1).map(r => r.data)
|
|
417
|
-
};
|
|
418
|
-
}
|
|
419
|
-
|
|
420
|
-
generateSummary(): string {
|
|
421
|
-
const successCount = this.results.filter(r => r.status === 'success').length;
|
|
422
|
-
const totalDuration = this.results.reduce((sum, r) => sum + r.duration, 0);
|
|
423
|
-
const totalTokens = this.results.reduce((sum, r) => sum + r.tokensUsed, 0);
|
|
424
|
-
|
|
425
|
-
return `
|
|
426
|
-
Agents: ${this.results.length}
|
|
427
|
-
Successful: ${successCount}
|
|
428
|
-
Total duration: ${totalDuration}ms
|
|
429
|
-
Total tokens: ${totalTokens}
|
|
430
|
-
`;
|
|
431
|
-
}
|
|
432
|
-
}
|
|
31
|
+
# Parallel Execution Model
|
|
32
|
+
[Main Agent (Orchestrator)]
|
|
33
|
+
|
|
|
34
|
+
[Task Analysis & Distribution]
|
|
35
|
+
|
|
|
36
|
+
+---------------+---------------+
|
|
37
|
+
| | |
|
|
38
|
+
[Agent A] [Agent B] [Agent C]
|
|
39
|
+
(Task 1) (Task 2) (Task 3)
|
|
40
|
+
| | |
|
|
41
|
+
+-------+-------+-------+-------+
|
|
42
|
+
|
|
|
43
|
+
[Aggregation & Integration]
|
|
44
|
+
|
|
|
45
|
+
[Final Response]
|
|
46
|
+
|
|
47
|
+
TIMING:
|
|
48
|
+
Sequential: ████████████████████████████
|
|
49
|
+
Parallel: ████████████ (max of tasks)
|
|
433
50
|
```
|
|
434
51
|
|
|
435
|
-
### 6. Error Handling in Parallel
|
|
436
|
-
|
|
437
52
|
```typescript
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
try {
|
|
459
|
-
return {
|
|
460
|
-
results: await Promise.all(tasks.map(t => t())),
|
|
461
|
-
errors: [],
|
|
462
|
-
status: 'complete'
|
|
463
|
-
};
|
|
464
|
-
} catch (error) {
|
|
465
|
-
return {
|
|
466
|
-
results: [],
|
|
467
|
-
errors: [error as Error],
|
|
468
|
-
status: 'failed'
|
|
469
|
-
};
|
|
470
|
-
}
|
|
471
|
-
}
|
|
472
|
-
|
|
473
|
-
// Use Promise.allSettled - collects all results
|
|
474
|
-
const settled = await Promise.allSettled(tasks.map(t => t()));
|
|
475
|
-
|
|
476
|
-
for (const result of settled) {
|
|
477
|
-
if (result.status === 'fulfilled') {
|
|
478
|
-
results.push(result.value);
|
|
479
|
-
} else {
|
|
480
|
-
errors.push(result.reason);
|
|
481
|
-
}
|
|
482
|
-
}
|
|
483
|
-
|
|
484
|
-
// Retry failed tasks if configured
|
|
485
|
-
if (options.retryFailed && errors.length > 0) {
|
|
486
|
-
const failedIndices = settled
|
|
487
|
-
.map((r, i) => r.status === 'rejected' ? i : -1)
|
|
488
|
-
.filter(i => i >= 0);
|
|
489
|
-
|
|
490
|
-
for (let attempt = 0; attempt < options.maxRetries; attempt++) {
|
|
491
|
-
const retryResults = await Promise.allSettled(
|
|
492
|
-
failedIndices.map(i => tasks[i]())
|
|
493
|
-
);
|
|
494
|
-
|
|
495
|
-
retryResults.forEach((r, idx) => {
|
|
496
|
-
if (r.status === 'fulfilled') {
|
|
497
|
-
results.push(r.value);
|
|
498
|
-
errors.splice(idx, 1);
|
|
499
|
-
}
|
|
500
|
-
});
|
|
501
|
-
|
|
502
|
-
if (errors.length === 0) break;
|
|
503
|
-
}
|
|
504
|
-
}
|
|
505
|
-
|
|
506
|
-
return {
|
|
507
|
-
results,
|
|
508
|
-
errors,
|
|
509
|
-
status: errors.length === 0 ? 'complete' : 'partial'
|
|
510
|
-
};
|
|
511
|
-
}
|
|
53
|
+
// Fan-out/Fan-in Pattern
|
|
54
|
+
const [security, performance, style] = await Promise.all([
|
|
55
|
+
spawnAgent({ type: 'reviewer', focus: 'security' }),
|
|
56
|
+
spawnAgent({ type: 'reviewer', focus: 'performance' }),
|
|
57
|
+
spawnAgent({ type: 'reviewer', focus: 'style' }),
|
|
58
|
+
]);
|
|
59
|
+
return combineReviews([security, performance, style]);
|
|
60
|
+
|
|
61
|
+
// Parallelization Criteria
|
|
62
|
+
CAN PARALLELIZE:
|
|
63
|
+
- Independent code changes (different files)
|
|
64
|
+
- Research on different topics
|
|
65
|
+
- Tests for different modules
|
|
66
|
+
- Multi-concern code reviews
|
|
67
|
+
|
|
68
|
+
CANNOT PARALLELIZE:
|
|
69
|
+
- Tasks with data dependencies
|
|
70
|
+
- Sequential workflow steps
|
|
71
|
+
- Tasks modifying same files
|
|
72
|
+
- Tasks sharing mutable state
|
|
512
73
|
```
|
|
513
74
|
|
|
514
|
-
## Use Cases
|
|
515
|
-
|
|
516
|
-
### Feature Implementation with Parallel Agents
|
|
517
|
-
|
|
518
|
-
```typescript
|
|
519
|
-
/**
|
|
520
|
-
* Implement a feature using multiple specialized agents
|
|
521
|
-
*/
|
|
522
|
-
|
|
523
|
-
async function implementFeatureWithParallelAgents(
|
|
524
|
-
feature: FeatureSpec
|
|
525
|
-
): Promise<Implementation> {
|
|
526
|
-
// Phase 1: Parallel exploration
|
|
527
|
-
const [
|
|
528
|
-
existingPatterns,
|
|
529
|
-
relatedCode,
|
|
530
|
-
testPatterns
|
|
531
|
-
] = await Promise.all([
|
|
532
|
-
spawnAgent({
|
|
533
|
-
type: 'explorer',
|
|
534
|
-
prompt: `Find similar features in the codebase`
|
|
535
|
-
}),
|
|
536
|
-
spawnAgent({
|
|
537
|
-
type: 'explorer',
|
|
538
|
-
prompt: `Find code that will be affected by ${feature.name}`
|
|
539
|
-
}),
|
|
540
|
-
spawnAgent({
|
|
541
|
-
type: 'explorer',
|
|
542
|
-
prompt: `Find test patterns for similar features`
|
|
543
|
-
})
|
|
544
|
-
]);
|
|
545
|
-
|
|
546
|
-
// Phase 2: Parallel implementation (after exploration complete)
|
|
547
|
-
const [
|
|
548
|
-
featureCode,
|
|
549
|
-
tests,
|
|
550
|
-
documentation
|
|
551
|
-
] = await Promise.all([
|
|
552
|
-
spawnAgent({
|
|
553
|
-
type: 'implementer',
|
|
554
|
-
prompt: `Implement ${feature.name}`,
|
|
555
|
-
context: existingPatterns
|
|
556
|
-
}),
|
|
557
|
-
spawnAgent({
|
|
558
|
-
type: 'tester',
|
|
559
|
-
prompt: `Create tests for ${feature.name}`,
|
|
560
|
-
context: testPatterns
|
|
561
|
-
}),
|
|
562
|
-
spawnAgent({
|
|
563
|
-
type: 'documenter',
|
|
564
|
-
prompt: `Document ${feature.name}`,
|
|
565
|
-
context: feature.spec
|
|
566
|
-
})
|
|
567
|
-
]);
|
|
568
|
-
|
|
569
|
-
// Phase 3: Parallel review
|
|
570
|
-
const [
|
|
571
|
-
codeReview,
|
|
572
|
-
testReview
|
|
573
|
-
] = await Promise.all([
|
|
574
|
-
spawnAgent({
|
|
575
|
-
type: 'reviewer',
|
|
576
|
-
prompt: 'Review implementation for issues',
|
|
577
|
-
context: featureCode
|
|
578
|
-
}),
|
|
579
|
-
spawnAgent({
|
|
580
|
-
type: 'reviewer',
|
|
581
|
-
prompt: 'Review tests for coverage and quality',
|
|
582
|
-
context: tests
|
|
583
|
-
})
|
|
584
|
-
]);
|
|
585
|
-
|
|
586
|
-
return aggregateResults({
|
|
587
|
-
featureCode,
|
|
588
|
-
tests,
|
|
589
|
-
documentation,
|
|
590
|
-
reviews: [codeReview, testReview]
|
|
591
|
-
});
|
|
592
|
-
}
|
|
593
75
|
```
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
async function multiConcernReview(
|
|
603
|
-
files: string[]
|
|
604
|
-
): Promise<ComprehensiveReview> {
|
|
605
|
-
const [
|
|
606
|
-
securityReview,
|
|
607
|
-
performanceReview,
|
|
608
|
-
styleReview,
|
|
609
|
-
accessibilityReview
|
|
610
|
-
] = await Promise.all([
|
|
611
|
-
spawnAgent({
|
|
612
|
-
type: 'reviewer',
|
|
613
|
-
prompt: `Security review: check for vulnerabilities, injection, auth issues`,
|
|
614
|
-
files
|
|
615
|
-
}),
|
|
616
|
-
spawnAgent({
|
|
617
|
-
type: 'reviewer',
|
|
618
|
-
prompt: `Performance review: check for N+1, memory leaks, inefficiencies`,
|
|
619
|
-
files
|
|
620
|
-
}),
|
|
621
|
-
spawnAgent({
|
|
622
|
-
type: 'reviewer',
|
|
623
|
-
prompt: `Style review: check for conventions, naming, structure`,
|
|
624
|
-
files
|
|
625
|
-
}),
|
|
626
|
-
spawnAgent({
|
|
627
|
-
type: 'reviewer',
|
|
628
|
-
prompt: `Accessibility review: check for a11y issues in UI code`,
|
|
629
|
-
files
|
|
630
|
-
})
|
|
631
|
-
]);
|
|
632
|
-
|
|
633
|
-
return {
|
|
634
|
-
security: securityReview,
|
|
635
|
-
performance: performanceReview,
|
|
636
|
-
style: styleReview,
|
|
637
|
-
accessibility: accessibilityReview,
|
|
638
|
-
summary: generateReviewSummary([
|
|
639
|
-
securityReview,
|
|
640
|
-
performanceReview,
|
|
641
|
-
styleReview,
|
|
642
|
-
accessibilityReview
|
|
643
|
-
])
|
|
644
|
-
};
|
|
645
|
-
}
|
|
76
|
+
# Agent Specialization
|
|
77
|
+
| Type | Strengths | Best For |
|
|
78
|
+
|------|-----------|----------|
|
|
79
|
+
| explorer | Finding files, patterns | Initial exploration |
|
|
80
|
+
| implementer | Writing production code | Features, bug fixes |
|
|
81
|
+
| tester | Test design, edge cases | Unit/integration tests |
|
|
82
|
+
| reviewer | Issue identification | Code review, security |
|
|
83
|
+
| documenter | Clear explanations | Docs, comments |
|
|
646
84
|
```
|
|
647
85
|
|
|
648
86
|
## Best Practices
|
|
649
87
|
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
-
|
|
664
|
-
-
|
|
665
|
-
-
|
|
666
|
-
-
|
|
667
|
-
- Don't parallelize tiny tasks (overhead exceeds benefit)
|
|
668
|
-
- Don't forget to clean up agent resources
|
|
669
|
-
- Don't skip the aggregation step
|
|
670
|
-
- Don't parallelize without clear benefit
|
|
671
|
-
|
|
672
|
-
## References
|
|
673
|
-
|
|
674
|
-
- [Concurrency Patterns](https://www.oreilly.com/library/view/concurrency-in-go/9781491941294/)
|
|
675
|
-
- [Parallel Programming](https://en.wikipedia.org/wiki/Parallel_computing)
|
|
676
|
-
- [Actor Model](https://en.wikipedia.org/wiki/Actor_model)
|
|
677
|
-
- [MapReduce Pattern](https://en.wikipedia.org/wiki/MapReduce)
|
|
88
|
+
| Do | Avoid |
|
|
89
|
+
|----|-------|
|
|
90
|
+
| Identify truly independent tasks first | Parallelizing tasks that share state |
|
|
91
|
+
| Use specialized agents for concerns | One agent doing everything |
|
|
92
|
+
| Set appropriate timeouts per agent | Unbounded execution time |
|
|
93
|
+
| Handle partial failures gracefully | Ignoring failed agent results |
|
|
94
|
+
| Use concurrency limits | Spawning unlimited agents |
|
|
95
|
+
| Aggregate results meaningfully | Skipping result combination |
|
|
96
|
+
| Document dependencies between tasks | Assuming order of completion |
|
|
97
|
+
| Clean up agent resources | Resource leaks from agents |
|
|
98
|
+
|
|
99
|
+
## Related Skills
|
|
100
|
+
|
|
101
|
+
- `optimizing-tokens` - Efficient context per agent
|
|
102
|
+
- `thinking-sequentially` - Order dependent tasks
|
|
103
|
+
- `writing-plans` - Plan parallel execution phases
|
|
104
|
+
- `executing-plans` - Execute with parallel steps
|